pax_global_header00006660000000000000000000000064132002746270014515gustar00rootroot0000000000000052 comment=f2ea05ca69b8a324d28660c3a0942497985a4187 hashcat-4.0.1/000077500000000000000000000000001320027462700131325ustar00rootroot00000000000000hashcat-4.0.1/.appveyor.yml000066400000000000000000000047401320027462700156050ustar00rootroot00000000000000environment: CYG_MIRROR: http://cygwin.mirror.constant.com CYG_PACKAGES: make,gcc-core,libiconv-devel DOCUMENT_FOLDER: /share/doc/hashcat matrix: - CYG_ROOT: C:\cygwin64 CYG_CACHE: C:\cygwin64\var\cache\setup CYG_SETUP: setup-x86_64.exe BASH: C:\cygwin64\bin\bash CC: gcc - CYG_ROOT: C:\cygwin CYG_CACHE: C:\cygwin\var\cache\setup CYG_SETUP: setup-x86.exe BASH: C:\cygwin\bin\bash CC: gcc - MSYSTEM: MINGW64 MSYS_CACHE: C:\msys64\var\cache\pacman\pkg KERNEL_CACHE: C:\msys64\usr\local\bin\OpenCL\ BASH: C:\msys64\usr\bin\bash CC: gcc - MSYSTEM: MINGW32 MSYS_CACHE: C:\msys64\var\cache\pacman\pkg KERNEL_CACHE: C:\msys64\usr\local\bin\OpenCL\ BASH: C:\msys64\usr\bin\bash CC: gcc # if we have too many commits at the same time, we might need to download more than just the last commit for appveyor to succeed # otherwise we get the error: "fatal: reference is not a tree " clone_depth: 15 init: # Don't try to convert line endings to Win32 CRLF - git config --global core.autocrlf input install: - ps: if (Test-Path Env:\CYG_ROOT) { Start-FileDownload "http://cygwin.com/$env:CYG_SETUP" -FileName "$env:CYG_SETUP" } - if defined CYG_ROOT (%CYG_SETUP% --quiet-mode --no-shortcuts --only-site --root "%CYG_ROOT%" --site "%CYG_MIRROR%" --local-package-dir "%CYG_CACHE%" --packages "%CYG_PACKAGES%" --upgrade-also) - if defined MSYSTEM (%BASH% -lc "pacman -Suuy --noconfirm") # the following line is not a duplicate line: # it is necessary to upgrade the MSYS base files and after that all the packages # the 2 separate commands/lines are required because a new shell is necessary for each step - if defined MSYSTEM (%BASH% -lc "pacman -Suuy --noconfirm") build_script: - if defined BASH (%BASH% -lc "cd $(cygpath ${APPVEYOR_BUILD_FOLDER}) && git submodule update --init && make install") test_script: # some file globbing tests # 1. hash file should not exist and therefore hashcat should complain (if it does not there might be a problem) # 2. hash file should expand to example0.hash and succeed - ps: >- if (Test-Path Env:\MSYSTEM) { mkdir $env:KERNEL_CACHE 2>&1 | out-null } & $env:BASH -lc "hashcat.exe -m 0 --show $env:DOCUMENT_FOLDER/*file_not_found.hash" 2>&1 | out-null if ($LastExitCode -eq 0) { throw "test failed" } & $env:BASH -lc "hashcat.exe -m 0 --show $env:DOCUMENT_FOLDER/*ple0.hash" hashcat-4.0.1/.editorconfig000066400000000000000000000004601320027462700156070ustar00rootroot00000000000000# top-most EditorConfig file, enforcing some of the code style # # See http://editorconfig.org for a plugin to your editor! # root = true [*] charset = utf-8 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true indent_style = space indent_size = 2 [Makefile] indent_style = tab hashcat-4.0.1/.gitattributes000066400000000000000000000000321320027462700160200ustar00rootroot00000000000000src/Makefile export-subst hashcat-4.0.1/.gitignore000066400000000000000000000002661320027462700151260ustar00rootroot00000000000000*.exe *.bin *.app hashcat hashcat.exe libhashcat.so hashcat.dll *.potfile *.restore *.dictstat2 *.pot *.pid *.log *.out *.dSYM kernels/** lib/*.a obj/*.o obj/lzma_sdk/*.o include/CL hashcat-4.0.1/.gitmodules000066400000000000000000000001761320027462700153130ustar00rootroot00000000000000[submodule "deps/OpenCL-Headers/CL"] path = deps/OpenCL-Headers/CL url = https://github.com/KhronosGroup/OpenCL-Headers.git hashcat-4.0.1/.travis.yml000066400000000000000000000001171320027462700152420ustar00rootroot00000000000000os: - linux - osx language: c compiler: - clang - gcc script: - make hashcat-4.0.1/BUILD.md000066400000000000000000000012521320027462700143130ustar00rootroot00000000000000hashcat build documentation = # Revision: * 1.3 # Author: see docs/credits.txt # Building hashcat for Linux and macOS Get a copy of the **hashcat** repository ```sh $ git clone https://github.com/hashcat/hashcat.git ``` Get a copy of the **OpenCL Headers** repository ```sh $ git submodule update --init ``` Run "make" ```sh $ make ``` # Install hashcat for Linux The install target is linux FHS compatible and can be used like this: ```sh $ make install ``` If you install it, cached kernels, session files, restore- and pot-files etc. will go to $HOME/.hashcat/ # Building hashcat for Windows ```sh $ make win32 win64 ``` = Enjoy your fresh **hashcat** binaries ;) hashcat-4.0.1/Makefile000066400000000000000000000000251320027462700145670ustar00rootroot00000000000000include src/Makefile hashcat-4.0.1/OpenCL/000077500000000000000000000000001320027462700142525ustar00rootroot00000000000000hashcat-4.0.1/OpenCL/amp_a0.cl000066400000000000000000000012371320027462700157320ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_hash_constants.h" #include "inc_vendor.cl" #include "inc_types.cl" #include "inc_rp.h" #include "inc_rp.cl" __kernel void amp (__global pw_t *pws, __global pw_t *pws_amp, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; if (rules_buf[0].cmds[0] == RULE_OP_MANGLE_NOOP && rules_buf[0].cmds[1] == 0) return; pw_t pw = pws[gid]; pw.pw_len = apply_rules (rules_buf[0].cmds, pw.i, pw.pw_len); pws_amp[gid] = pw; } hashcat-4.0.1/OpenCL/amp_a1.cl000066400000000000000000000016141320027462700157320ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_types.cl" #include "inc_common.cl" __kernel void amp (__global pw_t *pws, __global pw_t *pws_amp, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; pw_t pw = pws[gid]; pw_t comb = combs_buf[0]; const u32 pw_len = pw.pw_len; const u32 comb_len = comb.pw_len; if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_1x64_le_S (comb.i, pw_len); } if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) { switch_buffer_by_offset_1x64_le_S (pw.i, comb_len); } #pragma unroll for (int i = 0; i < 64; i++) { pw.i[i] |= comb.i[i]; } pw.pw_len = pw_len + comb_len; pws_amp[gid] = pw; } hashcat-4.0.1/OpenCL/amp_a3.cl000066400000000000000000000007551320027462700157410ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_hash_constants.h" #include "inc_vendor.cl" #include "inc_types.cl" __kernel void amp (__global pw_t *pws, __global pw_t *pws_amp, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const bf_t *bfs_buf, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u32 w0r = bfs_buf[0].i; pws_amp[gid].i[0] |= w0r; } hashcat-4.0.1/OpenCL/inc_cipher_aes.cl000066400000000000000000001455311320027462700175360ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ __constant u32a 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 u32a 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 u32a 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 u32a 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 u32a 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 u32a 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 u32a 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 u32a 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 u32a 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 u32a 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 u32a rcon[] = { 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x1b000000, 0x36000000, }; // 128 bit key void aes128_ExpandKey (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { ks[0] = ukey[0]; ks[1] = ukey[1]; ks[2] = ukey[2]; ks[3] = ukey[3]; for (u32 i = 0, j = 0; i < 10; i += 1, j += 4) { u32 temp = ks[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); ks[j + 4] = ks[j + 0] ^ temp ^ rcon[i]; ks[j + 5] = ks[j + 1] ^ ks[j + 4]; ks[j + 6] = ks[j + 2] ^ ks[j + 5]; ks[j + 7] = ks[j + 3] ^ ks[j + 6]; } } void aes128_InvertKey (u32 *ks, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { for (u32 i = 0, j = 40; 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 < 10; i += 1, j += 4) { ks[j + 0] = s_td0[s_te1[(ks[j + 0] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[j + 0] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[j + 0] >> 8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[j + 0] >> 0) & 0xff] & 0xff]; ks[j + 1] = s_td0[s_te1[(ks[j + 1] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[j + 1] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[j + 1] >> 8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[j + 1] >> 0) & 0xff] & 0xff]; ks[j + 2] = s_td0[s_te1[(ks[j + 2] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[j + 2] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[j + 2] >> 8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[j + 2] >> 0) & 0xff] & 0xff]; ks[j + 3] = s_td0[s_te1[(ks[j + 3] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[j + 3] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[j + 3] >> 8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[j + 3] >> 0) & 0xff] & 0xff]; } } void aes128_set_encrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { u32 ukey_s[4]; ukey_s[0] = swap32_S (ukey[0]); ukey_s[1] = swap32_S (ukey[1]); ukey_s[2] = swap32_S (ukey[2]); ukey_s[3] = swap32_S (ukey[3]); aes128_ExpandKey (ks, ukey_s, s_te0, s_te1, s_te2, s_te3, s_te4); } void aes128_set_decrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 ukey_s[4]; ukey_s[0] = swap32_S (ukey[0]); ukey_s[1] = swap32_S (ukey[1]); ukey_s[2] = swap32_S (ukey[2]); ukey_s[3] = swap32_S (ukey[3]); aes128_ExpandKey (ks, ukey_s, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_InvertKey (ks, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } void aes128_encrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { const u32 in_s0 = swap32_S (in[0]); const u32 in_s1 = swap32_S (in[1]); const u32 in_s2 = swap32_S (in[2]); const u32 in_s3 = swap32_S (in[3]); u32 t0 = in_s0 ^ ks[0]; u32 t1 = in_s1 ^ ks[1]; u32 t2 = in_s2 ^ ks[2]; u32 t3 = in_s3 ^ ks[3]; #ifdef _unroll #pragma unroll #endif for (int i = 4; i < 40; i += 4) { const uchar4 x0 = as_uchar4 (t0); const uchar4 x1 = as_uchar4 (t1); const uchar4 x2 = as_uchar4 (t2); const uchar4 x3 = as_uchar4 (t3); t0 = s_te0[x0.s3] ^ s_te1[x1.s2] ^ s_te2[x2.s1] ^ s_te3[x3.s0] ^ ks[i + 0]; t1 = s_te0[x1.s3] ^ s_te1[x2.s2] ^ s_te2[x3.s1] ^ s_te3[x0.s0] ^ ks[i + 1]; t2 = s_te0[x2.s3] ^ s_te1[x3.s2] ^ s_te2[x0.s1] ^ s_te3[x1.s0] ^ ks[i + 2]; t3 = s_te0[x3.s3] ^ s_te1[x0.s2] ^ s_te2[x1.s1] ^ s_te3[x2.s0] ^ ks[i + 3]; } const uchar4 x0 = as_uchar4 (t0); const uchar4 x1 = as_uchar4 (t1); const uchar4 x2 = as_uchar4 (t2); const uchar4 x3 = as_uchar4 (t3); out[0] = (s_te4[x0.s3] & 0xff000000) ^ (s_te4[x1.s2] & 0x00ff0000) ^ (s_te4[x2.s1] & 0x0000ff00) ^ (s_te4[x3.s0] & 0x000000ff) ^ ks[40]; out[1] = (s_te4[x1.s3] & 0xff000000) ^ (s_te4[x2.s2] & 0x00ff0000) ^ (s_te4[x3.s1] & 0x0000ff00) ^ (s_te4[x0.s0] & 0x000000ff) ^ ks[41]; out[2] = (s_te4[x2.s3] & 0xff000000) ^ (s_te4[x3.s2] & 0x00ff0000) ^ (s_te4[x0.s1] & 0x0000ff00) ^ (s_te4[x1.s0] & 0x000000ff) ^ ks[42]; out[3] = (s_te4[x3.s3] & 0xff000000) ^ (s_te4[x0.s2] & 0x00ff0000) ^ (s_te4[x1.s1] & 0x0000ff00) ^ (s_te4[x2.s0] & 0x000000ff) ^ ks[43]; out[0] = swap32_S (out[0]); out[1] = swap32_S (out[1]); out[2] = swap32_S (out[2]); out[3] = swap32_S (out[3]); } void aes128_decrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { const u32 in_s0 = swap32_S (in[0]); const u32 in_s1 = swap32_S (in[1]); const u32 in_s2 = swap32_S (in[2]); const u32 in_s3 = swap32_S (in[3]); u32 t0 = in_s0 ^ ks[0]; u32 t1 = in_s1 ^ ks[1]; u32 t2 = in_s2 ^ ks[2]; u32 t3 = in_s3 ^ ks[3]; #ifdef _unroll #pragma unroll #endif for (int i = 4; i < 40; i += 4) { const uchar4 x0 = as_uchar4 (t0); const uchar4 x1 = as_uchar4 (t1); const uchar4 x2 = as_uchar4 (t2); const uchar4 x3 = as_uchar4 (t3); t0 = s_td0[x0.s3] ^ s_td1[x3.s2] ^ s_td2[x2.s1] ^ s_td3[x1.s0] ^ ks[i + 0]; t1 = s_td0[x1.s3] ^ s_td1[x0.s2] ^ s_td2[x3.s1] ^ s_td3[x2.s0] ^ ks[i + 1]; t2 = s_td0[x2.s3] ^ s_td1[x1.s2] ^ s_td2[x0.s1] ^ s_td3[x3.s0] ^ ks[i + 2]; t3 = s_td0[x3.s3] ^ s_td1[x2.s2] ^ s_td2[x1.s1] ^ s_td3[x0.s0] ^ ks[i + 3]; } const uchar4 x0 = as_uchar4 (t0); const uchar4 x1 = as_uchar4 (t1); const uchar4 x2 = as_uchar4 (t2); const uchar4 x3 = as_uchar4 (t3); out[0] = (s_td4[x0.s3] & 0xff000000) ^ (s_td4[x3.s2] & 0x00ff0000) ^ (s_td4[x2.s1] & 0x0000ff00) ^ (s_td4[x1.s0] & 0x000000ff) ^ ks[40]; out[1] = (s_td4[x1.s3] & 0xff000000) ^ (s_td4[x0.s2] & 0x00ff0000) ^ (s_td4[x3.s1] & 0x0000ff00) ^ (s_td4[x2.s0] & 0x000000ff) ^ ks[41]; out[2] = (s_td4[x2.s3] & 0xff000000) ^ (s_td4[x1.s2] & 0x00ff0000) ^ (s_td4[x0.s1] & 0x0000ff00) ^ (s_td4[x3.s0] & 0x000000ff) ^ ks[42]; out[3] = (s_td4[x3.s3] & 0xff000000) ^ (s_td4[x2.s2] & 0x00ff0000) ^ (s_td4[x1.s1] & 0x0000ff00) ^ (s_td4[x0.s0] & 0x000000ff) ^ ks[43]; out[0] = swap32_S (out[0]); out[1] = swap32_S (out[1]); out[2] = swap32_S (out[2]); out[3] = swap32_S (out[3]); } // 256 bit key void aes256_ExpandKey (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { 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; for (int i = 0, j = 0; i < 7; i += 1, j += 8) { const u32 temp1 = ks[j + 7]; ks[j + 8] = ks[j + 0] ^ (s_te2[(temp1 >> 16) & 0xff] & 0xff000000) ^ (s_te3[(temp1 >> 8) & 0xff] & 0x00ff0000) ^ (s_te0[(temp1 >> 0) & 0xff] & 0x0000ff00) ^ (s_te1[(temp1 >> 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 == 6) break; const u32 temp2 = ks[j + 11]; ks[j + 12] = ks[j + 4] ^ (s_te2[(temp2 >> 24) & 0xff] & 0xff000000) ^ (s_te3[(temp2 >> 16) & 0xff] & 0x00ff0000) ^ (s_te0[(temp2 >> 8) & 0xff] & 0x0000ff00) ^ (s_te1[(temp2 >> 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]; } } void aes256_InvertKey (u32 *ks, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { 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] = s_td0[s_te1[(ks[j + 0] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[j + 0] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[j + 0] >> 8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[j + 0] >> 0) & 0xff] & 0xff]; ks[j + 1] = s_td0[s_te1[(ks[j + 1] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[j + 1] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[j + 1] >> 8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[j + 1] >> 0) & 0xff] & 0xff]; ks[j + 2] = s_td0[s_te1[(ks[j + 2] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[j + 2] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[j + 2] >> 8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[j + 2] >> 0) & 0xff] & 0xff]; ks[j + 3] = s_td0[s_te1[(ks[j + 3] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[j + 3] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[j + 3] >> 8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[j + 3] >> 0) & 0xff] & 0xff]; } } void aes256_set_encrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { u32 ukey_s[8]; ukey_s[0] = swap32_S (ukey[0]); ukey_s[1] = swap32_S (ukey[1]); ukey_s[2] = swap32_S (ukey[2]); ukey_s[3] = swap32_S (ukey[3]); ukey_s[4] = swap32_S (ukey[4]); ukey_s[5] = swap32_S (ukey[5]); ukey_s[6] = swap32_S (ukey[6]); ukey_s[7] = swap32_S (ukey[7]); aes256_ExpandKey (ks, ukey_s, s_te0, s_te1, s_te2, s_te3, s_te4); } void aes256_set_decrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 ukey_s[8]; ukey_s[0] = swap32_S (ukey[0]); ukey_s[1] = swap32_S (ukey[1]); ukey_s[2] = swap32_S (ukey[2]); ukey_s[3] = swap32_S (ukey[3]); ukey_s[4] = swap32_S (ukey[4]); ukey_s[5] = swap32_S (ukey[5]); ukey_s[6] = swap32_S (ukey[6]); ukey_s[7] = swap32_S (ukey[7]); aes256_ExpandKey (ks, ukey_s, s_te0, s_te1, s_te2, s_te3, s_te4); aes256_InvertKey (ks, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } void aes256_encrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { const u32 in_s0 = swap32_S (in[0]); const u32 in_s1 = swap32_S (in[1]); const u32 in_s2 = swap32_S (in[2]); const u32 in_s3 = swap32_S (in[3]); u32 t0 = in_s0 ^ ks[0]; u32 t1 = in_s1 ^ ks[1]; u32 t2 = in_s2 ^ ks[2]; u32 t3 = in_s3 ^ ks[3]; #ifdef _unroll #pragma unroll #endif for (int i = 4; i < 56; i += 4) { const uchar4 x0 = as_uchar4 (t0); const uchar4 x1 = as_uchar4 (t1); const uchar4 x2 = as_uchar4 (t2); const uchar4 x3 = as_uchar4 (t3); t0 = s_te0[x0.s3] ^ s_te1[x1.s2] ^ s_te2[x2.s1] ^ s_te3[x3.s0] ^ ks[i + 0]; t1 = s_te0[x1.s3] ^ s_te1[x2.s2] ^ s_te2[x3.s1] ^ s_te3[x0.s0] ^ ks[i + 1]; t2 = s_te0[x2.s3] ^ s_te1[x3.s2] ^ s_te2[x0.s1] ^ s_te3[x1.s0] ^ ks[i + 2]; t3 = s_te0[x3.s3] ^ s_te1[x0.s2] ^ s_te2[x1.s1] ^ s_te3[x2.s0] ^ ks[i + 3]; } const uchar4 x0 = as_uchar4 (t0); const uchar4 x1 = as_uchar4 (t1); const uchar4 x2 = as_uchar4 (t2); const uchar4 x3 = as_uchar4 (t3); out[0] = (s_te4[x0.s3] & 0xff000000) ^ (s_te4[x1.s2] & 0x00ff0000) ^ (s_te4[x2.s1] & 0x0000ff00) ^ (s_te4[x3.s0] & 0x000000ff) ^ ks[56]; out[1] = (s_te4[x1.s3] & 0xff000000) ^ (s_te4[x2.s2] & 0x00ff0000) ^ (s_te4[x3.s1] & 0x0000ff00) ^ (s_te4[x0.s0] & 0x000000ff) ^ ks[57]; out[2] = (s_te4[x2.s3] & 0xff000000) ^ (s_te4[x3.s2] & 0x00ff0000) ^ (s_te4[x0.s1] & 0x0000ff00) ^ (s_te4[x1.s0] & 0x000000ff) ^ ks[58]; out[3] = (s_te4[x3.s3] & 0xff000000) ^ (s_te4[x0.s2] & 0x00ff0000) ^ (s_te4[x1.s1] & 0x0000ff00) ^ (s_te4[x2.s0] & 0x000000ff) ^ ks[59]; out[0] = swap32_S (out[0]); out[1] = swap32_S (out[1]); out[2] = swap32_S (out[2]); out[3] = swap32_S (out[3]); } void aes256_decrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { const u32 in_s0 = swap32_S (in[0]); const u32 in_s1 = swap32_S (in[1]); const u32 in_s2 = swap32_S (in[2]); const u32 in_s3 = swap32_S (in[3]); u32 t0 = in_s0 ^ ks[0]; u32 t1 = in_s1 ^ ks[1]; u32 t2 = in_s2 ^ ks[2]; u32 t3 = in_s3 ^ ks[3]; #ifdef _unroll #pragma unroll #endif for (int i = 4; i < 56; i += 4) { const uchar4 x0 = as_uchar4 (t0); const uchar4 x1 = as_uchar4 (t1); const uchar4 x2 = as_uchar4 (t2); const uchar4 x3 = as_uchar4 (t3); t0 = s_td0[x0.s3] ^ s_td1[x3.s2] ^ s_td2[x2.s1] ^ s_td3[x1.s0] ^ ks[i + 0]; t1 = s_td0[x1.s3] ^ s_td1[x0.s2] ^ s_td2[x3.s1] ^ s_td3[x2.s0] ^ ks[i + 1]; t2 = s_td0[x2.s3] ^ s_td1[x1.s2] ^ s_td2[x0.s1] ^ s_td3[x3.s0] ^ ks[i + 2]; t3 = s_td0[x3.s3] ^ s_td1[x2.s2] ^ s_td2[x1.s1] ^ s_td3[x0.s0] ^ ks[i + 3]; } const uchar4 x0 = as_uchar4 (t0); const uchar4 x1 = as_uchar4 (t1); const uchar4 x2 = as_uchar4 (t2); const uchar4 x3 = as_uchar4 (t3); out[0] = (s_td4[x0.s3] & 0xff000000) ^ (s_td4[x3.s2] & 0x00ff0000) ^ (s_td4[x2.s1] & 0x0000ff00) ^ (s_td4[x1.s0] & 0x000000ff) ^ ks[56]; out[1] = (s_td4[x1.s3] & 0xff000000) ^ (s_td4[x0.s2] & 0x00ff0000) ^ (s_td4[x3.s1] & 0x0000ff00) ^ (s_td4[x2.s0] & 0x000000ff) ^ ks[57]; out[2] = (s_td4[x2.s3] & 0xff000000) ^ (s_td4[x1.s2] & 0x00ff0000) ^ (s_td4[x0.s1] & 0x0000ff00) ^ (s_td4[x3.s0] & 0x000000ff) ^ ks[58]; out[3] = (s_td4[x3.s3] & 0xff000000) ^ (s_td4[x2.s2] & 0x00ff0000) ^ (s_td4[x1.s1] & 0x0000ff00) ^ (s_td4[x0.s0] & 0x000000ff) ^ ks[59]; out[0] = swap32_S (out[0]); out[1] = swap32_S (out[1]); out[2] = swap32_S (out[2]); out[3] = swap32_S (out[3]); } // wrapper to avoid swap32_S() confusion in the kernel code void AES128_set_encrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { u32 ukey_s[4]; ukey_s[0] = swap32_S (ukey[0]); ukey_s[1] = swap32_S (ukey[1]); ukey_s[2] = swap32_S (ukey[2]); ukey_s[3] = swap32_S (ukey[3]); aes128_set_encrypt_key (ks, ukey_s, s_te0, s_te1, s_te2, s_te3, s_te4); } void AES128_set_decrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 ukey_s[4]; ukey_s[0] = swap32_S (ukey[0]); ukey_s[1] = swap32_S (ukey[1]); ukey_s[2] = swap32_S (ukey[2]); ukey_s[3] = swap32_S (ukey[3]); aes128_set_decrypt_key (ks, ukey_s, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } void AES128_encrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { u32 in_s[4]; in_s[0] = swap32_S (in[0]); in_s[1] = swap32_S (in[1]); in_s[2] = swap32_S (in[2]); in_s[3] = swap32_S (in[3]); u32 out_s[4]; aes128_encrypt (ks, in_s, out_s, s_te0, s_te1, s_te2, s_te3, s_te4); out[0] = swap32_S (out_s[0]); out[1] = swap32_S (out_s[1]); out[2] = swap32_S (out_s[2]); out[3] = swap32_S (out_s[3]); } void AES128_decrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 in_s[4]; in_s[0] = swap32_S (in[0]); in_s[1] = swap32_S (in[1]); in_s[2] = swap32_S (in[2]); in_s[3] = swap32_S (in[3]); u32 out_s[4]; aes128_decrypt (ks, in_s, out_s, s_td0, s_td1, s_td2, s_td3, s_td4); out[0] = swap32_S (out_s[0]); out[1] = swap32_S (out_s[1]); out[2] = swap32_S (out_s[2]); out[3] = swap32_S (out_s[3]); } void AES256_set_encrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { u32 ukey_s[8]; ukey_s[0] = swap32_S (ukey[0]); ukey_s[1] = swap32_S (ukey[1]); ukey_s[2] = swap32_S (ukey[2]); ukey_s[3] = swap32_S (ukey[3]); ukey_s[4] = swap32_S (ukey[4]); ukey_s[5] = swap32_S (ukey[5]); ukey_s[6] = swap32_S (ukey[6]); ukey_s[7] = swap32_S (ukey[7]); aes256_set_encrypt_key (ks, ukey_s, s_te0, s_te1, s_te2, s_te3, s_te4); } void AES256_set_decrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 ukey_s[8]; ukey_s[0] = swap32_S (ukey[0]); ukey_s[1] = swap32_S (ukey[1]); ukey_s[2] = swap32_S (ukey[2]); ukey_s[3] = swap32_S (ukey[3]); ukey_s[4] = swap32_S (ukey[4]); ukey_s[5] = swap32_S (ukey[5]); ukey_s[6] = swap32_S (ukey[6]); ukey_s[7] = swap32_S (ukey[7]); aes256_set_decrypt_key (ks, ukey_s, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } void AES256_encrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { u32 in_s[4]; in_s[0] = swap32_S (in[0]); in_s[1] = swap32_S (in[1]); in_s[2] = swap32_S (in[2]); in_s[3] = swap32_S (in[3]); u32 out_s[4]; aes256_encrypt (ks, in_s, out_s, s_te0, s_te1, s_te2, s_te3, s_te4); out[0] = swap32_S (out_s[0]); out[1] = swap32_S (out_s[1]); out[2] = swap32_S (out_s[2]); out[3] = swap32_S (out_s[3]); } void AES256_decrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 in_s[4]; in_s[0] = swap32_S (in[0]); in_s[1] = swap32_S (in[1]); in_s[2] = swap32_S (in[2]); in_s[3] = swap32_S (in[3]); u32 out_s[4]; aes256_decrypt (ks, in_s, out_s, s_td0, s_td1, s_td2, s_td3, s_td4); out[0] = swap32_S (out_s[0]); out[1] = swap32_S (out_s[1]); out[2] = swap32_S (out_s[2]); out[3] = swap32_S (out_s[3]); } hashcat-4.0.1/OpenCL/inc_cipher_serpent.cl000066400000000000000000000545171320027462700204510ustar00rootroot00000000000000/* 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 hashcat 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_S(a, 13); \ c = rotl32_S(c, 3); \ d ^= c ^ (a << 3); \ b ^= a ^ c; \ d = rotl32_S(d, 7); \ b = rotl32_S(b, 1); \ a ^= b ^ d; \ c ^= d ^ (b << 7); \ a = rotl32_S(a, 5); \ c = rotl32_S(c, 22) #define irot(a,b,c,d) \ c = rotr32_S(c, 22); \ a = rotr32_S(a, 5); \ c ^= d ^ (b << 7); \ a ^= b ^ d; \ d = rotr32_S(d, 7); \ b = rotr32_S(b, 1); \ d ^= c ^ (a << 3); \ b ^= a ^ c; \ c = rotr32_S(c, 3); \ a = rotr32_S(a, 13) // 128 bit key void serpent128_set_key (u32 *ks, const u32 *ukey) { #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 4; i++) { ks[i] = ukey[i]; } #ifdef _unroll #pragma unroll #endif for (int i = 4; i < 8; i++) { ks[i] = 0; } ks[4] = 1; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 132; i++) { ks[i + 8] = rotl32_S (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); } void serpent128_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; } void serpent128_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; } // 256 bit key void serpent256_set_key (u32 *ks, const u32 *ukey) { #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { ks[i] = ukey[i]; } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 132; i++) { ks[i + 8] = rotl32_S (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); } 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; } 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; } hashcat-4.0.1/OpenCL/inc_cipher_twofish.cl000066400000000000000000000660201320027462700204440ustar00rootroot00000000000000/* 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 hashcat by Jens Steube */ #define extract_byte(x,n) (((x) >> (8 * (n))) & 0xff) __constant u32a 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 u32a 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] #define q20(x,k) q (0, q (0, x) ^ extract_byte (k[1], 0)) ^ extract_byte (k[0], 0) #define q21(x,k) q (0, q (1, x) ^ extract_byte (k[1], 1)) ^ extract_byte (k[0], 1) #define q22(x,k) q (1, q (0, x) ^ extract_byte (k[1], 2)) ^ extract_byte (k[0], 2) #define q23(x,k) q (1, q (1, x) ^ extract_byte (k[1], 3)) ^ extract_byte (k[0], 3) #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) 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; } // 128 bit key #define g1_fun128(x) \ (mds (0, q20 (extract_byte (x, 3), sk)) ^ \ mds (1, q21 (extract_byte (x, 0), sk)) ^ \ mds (2, q22 (extract_byte (x, 1), sk)) ^ \ mds (3, q23 (extract_byte (x, 2), sk))) #define g0_fun128(x) \ (mds (0, q20 (extract_byte (x, 0), sk)) ^ \ mds (1, q21 (extract_byte (x, 1), sk)) ^ \ mds (2, q22 (extract_byte (x, 2), sk)) ^ \ mds (3, q23 (extract_byte (x, 3), sk))) #define f_rnd128(i) \ { \ u32 t0 = g0_fun128 (data[0]); \ u32 t1 = g1_fun128 (data[1]); \ data[2] = rotr32_S (data[2] ^ (t0 + t1 + lk[4 * (i) + 8]), 1); \ data[3] = rotl32_S (data[3], 1) ^ (t0 + 2 * t1 + lk[4 * (i) + 9]); \ u32 t2 = g0_fun128 (data[2]); \ u32 t3 = g1_fun128 (data[3]); \ data[0] = rotr32_S (data[0] ^ (t2 + t3 + lk[4 * (i) + 10]), 1); \ data[1] = rotl32_S (data[1], 1) ^ (t2 + 2 * t3 + lk[4 * (i) + 11]); \ } #define i_rnd128(i) \ { \ u32 t0 = g0_fun128 (data[0]); \ u32 t1 = g1_fun128 (data[1]); \ data[2] = rotl32_S (data[2], 1) ^ (t0 + t1 + lk[4 * (i) + 10]); \ data[3] = rotr32_S (data[3] ^ (t0 + 2 * t1 + lk[4 * (i) + 11]), 1); \ u32 t2 = g0_fun128 (data[2]); \ u32 t3 = g1_fun128 (data[3]); \ data[0] = rotl32_S (data[0], 1) ^ (t2 + t3 + lk[4 * (i) + 8]); \ data[1] = rotr32_S (data[1] ^ (t2 + 2 * t3 + lk[4 * (i) + 9]), 1); \ } u32 h_fun128 (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 (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); } void twofish128_set_key (u32 *sk, u32 *lk, const u32 *ukey) { u32 me_key[2]; me_key[0] = ukey[0]; me_key[1] = ukey[2]; u32 mo_key[2]; mo_key[0] = ukey[1]; mo_key[1] = ukey[3]; sk[1] = mds_rem (me_key[0], mo_key[0]); sk[0] = mds_rem (me_key[1], mo_key[1]); for (int i = 0; i < 40; i += 2) { u32 a = 0x01010101 * i; u32 b = 0x01010101 + a; a = h_fun128 (sk, lk, a, me_key); b = h_fun128 (sk, lk, b, mo_key); b = rotl32_S (b, 8); lk[i + 0] = a + b; lk[i + 1] = rotl32_S (a + 2 * b, 9); } } void twofish128_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_rnd128 (0); f_rnd128 (1); f_rnd128 (2); f_rnd128 (3); f_rnd128 (4); f_rnd128 (5); f_rnd128 (6); f_rnd128 (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]; } void twofish128_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_rnd128 (7); i_rnd128 (6); i_rnd128 (5); i_rnd128 (4); i_rnd128 (3); i_rnd128 (2); i_rnd128 (1); i_rnd128 (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]; } // 256 bit key #define g1_fun256(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_fun256(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))) #define f_rnd256(i) \ { \ u32 t0 = g0_fun256 (data[0]); \ u32 t1 = g1_fun256 (data[1]); \ data[2] = rotr32_S (data[2] ^ (t0 + t1 + lk[4 * (i) + 8]), 1); \ data[3] = rotl32_S (data[3], 1) ^ (t0 + 2 * t1 + lk[4 * (i) + 9]); \ u32 t2 = g0_fun256 (data[2]); \ u32 t3 = g1_fun256 (data[3]); \ data[0] = rotr32_S (data[0] ^ (t2 + t3 + lk[4 * (i) + 10]), 1); \ data[1] = rotl32_S (data[1], 1) ^ (t2 + 2 * t3 + lk[4 * (i) + 11]); \ } #define i_rnd256(i) \ { \ u32 t0 = g0_fun256 (data[0]); \ u32 t1 = g1_fun256 (data[1]); \ data[2] = rotl32_S (data[2], 1) ^ (t0 + t1 + lk[4 * (i) + 10]); \ data[3] = rotr32_S (data[3] ^ (t0 + 2 * t1 + lk[4 * (i) + 11]), 1); \ u32 t2 = g0_fun256 (data[2]); \ u32 t3 = g1_fun256 (data[3]); \ data[0] = rotl32_S (data[0], 1) ^ (t2 + t3 + lk[4 * (i) + 8]); \ data[1] = rotr32_S (data[1] ^ (t2 + 2 * t3 + lk[4 * (i) + 9]), 1); \ } u32 h_fun256 (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); } 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_fun256 (sk, lk, a, me_key); b = h_fun256 (sk, lk, b, mo_key); b = rotl32_S (b, 8); lk[i + 0] = a + b; lk[i + 1] = rotl32_S (a + 2 * b, 9); } } 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_rnd256 (0); f_rnd256 (1); f_rnd256 (2); f_rnd256 (3); f_rnd256 (4); f_rnd256 (5); f_rnd256 (6); f_rnd256 (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]; } 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_rnd256 (7); i_rnd256 (6); i_rnd256 (5); i_rnd256 (4); i_rnd256 (3); i_rnd256 (2); i_rnd256 (1); i_rnd256 (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]; } hashcat-4.0.1/OpenCL/inc_common.cl000066400000000000000000076707521320027462700167430ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ __constant u32 c_append_helper[64][16] = { { 0x000000ff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x0000ff00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00ff0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x000000ff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x0000ff00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00ff0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x000000ff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x0000ff00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00ff0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x000000ff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x0000ff00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00ff0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000ff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000ff00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00ff0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000ff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000ff00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00ff0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000ff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000ff00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00ff0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000ff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000ff00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00ff0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000ff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000ff00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00ff0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000ff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000ff00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00ff0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000ff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000ff00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00ff0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000ff, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000ff00, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00ff0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000ff, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000ff00, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00ff0000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000ff, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000ff00, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00ff0000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000ff, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000ff00, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00ff0000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000ff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000ff00 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00ff0000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000 }, }; /** * pure scalar functions */ int ffz (const u32 v) { #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 32; i++) { if ((v >> i) & 1) continue; return i; } return -1; } int hash_comp (const u32 d1[4], __global 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); } int find_hash (const u32 digest[4], const u32 digests_cnt, __global 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 = hash_comp (digest, digests_buf[c].digest_buf); if (cmp > 0) { l += m + 1; r--; } if (cmp == 0) return (c); } return (-1); } u32 check_bitmap (__global const u32 *bitmap, const u32 bitmap_mask, const u32 bitmap_shift, const u32 digest) { return (bitmap[(digest >> bitmap_shift) & bitmap_mask] & (1 << (digest & 0x1f))); } u32 check (const u32 digest[4], __global const u32 *bitmap_s1_a, __global const u32 *bitmap_s1_b, __global const u32 *bitmap_s1_c, __global const u32 *bitmap_s1_d, __global const u32 *bitmap_s2_a, __global const u32 *bitmap_s2_b, __global const u32 *bitmap_s2_c, __global 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); } void mark_hash (__global plain_t *plains_buf, __global u32 *d_result, const u32 salt_pos, const u32 digests_cnt, const u32 digest_pos, const u32 hash_pos, const u32 gid, const u32 il_pos) { const u32 idx = atomic_inc (d_result); if (idx >= digests_cnt) { // this is kind of tricky: we *must* call atomic_inc() to know about the current value from a multi-thread perspective // this action creates a buffer overflow, so we need to fix it here atomic_dec (d_result); return; } plains_buf[idx].salt_pos = salt_pos; plains_buf[idx].digest_pos = digest_pos; // relative plains_buf[idx].hash_pos = hash_pos; // absolute plains_buf[idx].gidvid = gid; plains_buf[idx].il_pos = il_pos; } int count_char (const u32 *buf, const int elems, const u32 c) { int r = 0; for (int i = 0; i < elems; i++) { const u32 v = buf[i]; if (((v >> 0) & 0xff) == c) r++; if (((v >> 8) & 0xff) == c) r++; if (((v >> 16) & 0xff) == c) r++; if (((v >> 24) & 0xff) == c) r++; } return r; } float get_entropy (const u32 *buf, const int elems) { const int length = elems * 4; float entropy = 0.0; #ifdef _unroll #pragma unroll #endif for (u32 c = 0; c < 256; c++) { const int r = count_char (buf, elems, c); if (r == 0) continue; float w = (float) r / length; entropy += -w * log2 (w); } return entropy; } /** * vector functions */ void make_utf16be (const u32x in[4], u32x out1[4], u32x out2[4]) { #if defined IS_NV out2[3] = __byte_perm (in[3], 0, 0x3727); out2[2] = __byte_perm (in[3], 0, 0x1707); out2[1] = __byte_perm (in[2], 0, 0x3727); out2[0] = __byte_perm (in[2], 0, 0x1707); out1[3] = __byte_perm (in[1], 0, 0x3727); out1[2] = __byte_perm (in[1], 0, 0x1707); out1[1] = __byte_perm (in[0], 0, 0x3727); out1[0] = __byte_perm (in[0], 0, 0x1707); #elif defined IS_AMD && AMD_GCN >= 3 out2[3] = __byte_perm (in[3], 0, 0x03070207); out2[2] = __byte_perm (in[3], 0, 0x01070007); out2[1] = __byte_perm (in[2], 0, 0x03070207); out2[0] = __byte_perm (in[2], 0, 0x01070007); out1[3] = __byte_perm (in[1], 0, 0x03070207); out1[2] = __byte_perm (in[1], 0, 0x01070007); out1[1] = __byte_perm (in[0], 0, 0x03070207); out1[0] = __byte_perm (in[0], 0, 0x01070007); #else out2[3] = ((in[3] >> 0) & 0xFF000000) | ((in[3] >> 8) & 0x0000FF00); out2[2] = ((in[3] << 16) & 0xFF000000) | ((in[3] << 8) & 0x0000FF00); out2[1] = ((in[2] >> 0) & 0xFF000000) | ((in[2] >> 8) & 0x0000FF00); out2[0] = ((in[2] << 16) & 0xFF000000) | ((in[2] << 8) & 0x0000FF00); out1[3] = ((in[1] >> 0) & 0xFF000000) | ((in[1] >> 8) & 0x0000FF00); out1[2] = ((in[1] << 16) & 0xFF000000) | ((in[1] << 8) & 0x0000FF00); out1[1] = ((in[0] >> 0) & 0xFF000000) | ((in[0] >> 8) & 0x0000FF00); out1[0] = ((in[0] << 16) & 0xFF000000) | ((in[0] << 8) & 0x0000FF00); #endif } void make_utf16beN (const u32x in[4], u32x out1[4], u32x out2[4]) { #if defined IS_NV out2[3] = __byte_perm (in[3], 0, 0x1707); out2[2] = __byte_perm (in[3], 0, 0x3727); out2[1] = __byte_perm (in[2], 0, 0x1707); out2[0] = __byte_perm (in[2], 0, 0x3727); out1[3] = __byte_perm (in[1], 0, 0x1707); out1[2] = __byte_perm (in[1], 0, 0x3727); out1[1] = __byte_perm (in[0], 0, 0x1707); out1[0] = __byte_perm (in[0], 0, 0x3727); #elif defined IS_AMD && AMD_GCN >= 3 out2[3] = __byte_perm (in[3], 0, 0x01070007); out2[2] = __byte_perm (in[3], 0, 0x03070207); out2[1] = __byte_perm (in[2], 0, 0x01070007); out2[0] = __byte_perm (in[2], 0, 0x03070207); out1[3] = __byte_perm (in[1], 0, 0x01070007); out1[2] = __byte_perm (in[1], 0, 0x03070207); out1[1] = __byte_perm (in[0], 0, 0x01070007); out1[0] = __byte_perm (in[0], 0, 0x03070207); #else out2[3] = ((in[3] << 16) & 0xFF000000) | ((in[3] << 8) & 0x0000FF00); out2[2] = ((in[3] >> 0) & 0xFF000000) | ((in[3] >> 8) & 0x0000FF00); out2[1] = ((in[2] << 16) & 0xFF000000) | ((in[2] << 8) & 0x0000FF00); out2[0] = ((in[2] >> 0) & 0xFF000000) | ((in[2] >> 8) & 0x0000FF00); out1[3] = ((in[1] << 16) & 0xFF000000) | ((in[1] << 8) & 0x0000FF00); out1[2] = ((in[1] >> 0) & 0xFF000000) | ((in[1] >> 8) & 0x0000FF00); out1[1] = ((in[0] << 16) & 0xFF000000) | ((in[0] << 8) & 0x0000FF00); out1[0] = ((in[0] >> 0) & 0xFF000000) | ((in[0] >> 8) & 0x0000FF00); #endif } void make_utf16le (const u32x in[4], u32x out1[4], u32x out2[4]) { #if defined IS_NV 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); #elif defined IS_AMD && AMD_GCN >= 3 out2[3] = __byte_perm (in[3], 0, 0x07030702); out2[2] = __byte_perm (in[3], 0, 0x07010700); out2[1] = __byte_perm (in[2], 0, 0x07030702); out2[0] = __byte_perm (in[2], 0, 0x07010700); out1[3] = __byte_perm (in[1], 0, 0x07030702); out1[2] = __byte_perm (in[1], 0, 0x07010700); out1[1] = __byte_perm (in[0], 0, 0x07030702); out1[0] = __byte_perm (in[0], 0, 0x07010700); #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 } void make_utf16leN (const u32x in[4], u32x out1[4], u32x out2[4]) { #if defined IS_NV out2[3] = __byte_perm (in[3], 0, 0x7170); out2[2] = __byte_perm (in[3], 0, 0x7372); out2[1] = __byte_perm (in[2], 0, 0x7170); out2[0] = __byte_perm (in[2], 0, 0x7372); out1[3] = __byte_perm (in[1], 0, 0x7170); out1[2] = __byte_perm (in[1], 0, 0x7372); out1[1] = __byte_perm (in[0], 0, 0x7170); out1[0] = __byte_perm (in[0], 0, 0x7372); #elif defined IS_AMD && AMD_GCN >= 3 out2[3] = __byte_perm (in[3], 0, 0x07010700); out2[2] = __byte_perm (in[3], 0, 0x07030702); out2[1] = __byte_perm (in[2], 0, 0x07010700); out2[0] = __byte_perm (in[2], 0, 0x07030702); out1[3] = __byte_perm (in[1], 0, 0x07010700); out1[2] = __byte_perm (in[1], 0, 0x07030702); out1[1] = __byte_perm (in[0], 0, 0x07010700); out1[0] = __byte_perm (in[0], 0, 0x07030702); #else out2[3] = ((in[3] << 8) & 0x00FF0000) | ((in[3] >> 0) & 0x000000FF); out2[2] = ((in[3] >> 8) & 0x00FF0000) | ((in[3] >> 16) & 0x000000FF); out2[1] = ((in[2] << 8) & 0x00FF0000) | ((in[2] >> 0) & 0x000000FF); out2[0] = ((in[2] >> 8) & 0x00FF0000) | ((in[2] >> 16) & 0x000000FF); out1[3] = ((in[1] << 8) & 0x00FF0000) | ((in[1] >> 0) & 0x000000FF); out1[2] = ((in[1] >> 8) & 0x00FF0000) | ((in[1] >> 16) & 0x000000FF); out1[1] = ((in[0] << 8) & 0x00FF0000) | ((in[0] >> 0) & 0x000000FF); out1[0] = ((in[0] >> 8) & 0x00FF0000) | ((in[0] >> 16) & 0x000000FF); #endif } void undo_utf16be (const u32x in1[4], const u32x in2[4], u32x out[4]) { #if defined IS_NV out[0] = __byte_perm (in1[0], in1[1], 0x4602); out[1] = __byte_perm (in1[2], in1[3], 0x4602); out[2] = __byte_perm (in2[0], in2[1], 0x4602); out[3] = __byte_perm (in2[2], in2[3], 0x4602); #elif defined IS_AMD && AMD_GCN >= 3 out[0] = __byte_perm (in1[0], in1[1], 0x04060002); out[1] = __byte_perm (in1[2], in1[3], 0x04060002); out[2] = __byte_perm (in2[0], in2[1], 0x04060002); out[3] = __byte_perm (in2[2], in2[3], 0x04060002); #else out[0] = ((in1[0] & 0x0000ff00) >> 8) | ((in1[0] & 0xff000000) >> 16) | ((in1[1] & 0x0000ff00) << 8) | ((in1[1] & 0xff000000) << 0); out[1] = ((in1[2] & 0x0000ff00) >> 8) | ((in1[2] & 0xff000000) >> 16) | ((in1[3] & 0x0000ff00) << 8) | ((in1[3] & 0xff000000) << 0); out[2] = ((in2[0] & 0x0000ff00) >> 8) | ((in2[0] & 0xff000000) >> 16) | ((in2[1] & 0x0000ff00) << 8) | ((in2[1] & 0xff000000) << 0); out[3] = ((in2[2] & 0x0000ff00) >> 8) | ((in2[2] & 0xff000000) >> 16) | ((in2[3] & 0x0000ff00) << 8) | ((in2[3] & 0xff000000) << 0); #endif } void undo_utf16le (const u32x in1[4], const u32x in2[4], u32x out[4]) { #if defined IS_NV 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); #elif defined IS_AMD && AMD_GCN >= 3 out[0] = __byte_perm (in1[0], in1[1], 0x06040200); out[1] = __byte_perm (in1[2], in1[3], 0x06040200); out[2] = __byte_perm (in2[0], in2[1], 0x06040200); out[3] = __byte_perm (in2[2], in2[3], 0x06040200); #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 } void append_0x80_1x4 (u32x w0[4], const u32 offset) { w0[0] |= 0x80808080 & c_append_helper[offset][0]; w0[1] |= 0x80808080 & c_append_helper[offset][1]; w0[2] |= 0x80808080 & c_append_helper[offset][2]; w0[3] |= 0x80808080 & c_append_helper[offset][3]; } void append_0x80_2x4 (u32x w0[4], u32x w1[4], const u32 offset) { w0[0] |= 0x80808080 & c_append_helper[offset][0]; w0[1] |= 0x80808080 & c_append_helper[offset][1]; w0[2] |= 0x80808080 & c_append_helper[offset][2]; w0[3] |= 0x80808080 & c_append_helper[offset][3]; w1[0] |= 0x80808080 & c_append_helper[offset][4]; w1[1] |= 0x80808080 & c_append_helper[offset][5]; w1[2] |= 0x80808080 & c_append_helper[offset][6]; w1[3] |= 0x80808080 & c_append_helper[offset][7]; } void append_0x80_3x4 (u32x w0[4], u32x w1[4], u32x w2[4], const u32 offset) { w0[0] |= 0x80808080 & c_append_helper[offset][ 0]; w0[1] |= 0x80808080 & c_append_helper[offset][ 1]; w0[2] |= 0x80808080 & c_append_helper[offset][ 2]; w0[3] |= 0x80808080 & c_append_helper[offset][ 3]; w1[0] |= 0x80808080 & c_append_helper[offset][ 4]; w1[1] |= 0x80808080 & c_append_helper[offset][ 5]; w1[2] |= 0x80808080 & c_append_helper[offset][ 6]; w1[3] |= 0x80808080 & c_append_helper[offset][ 7]; w2[0] |= 0x80808080 & c_append_helper[offset][ 8]; w2[1] |= 0x80808080 & c_append_helper[offset][ 9]; w2[2] |= 0x80808080 & c_append_helper[offset][10]; w2[3] |= 0x80808080 & c_append_helper[offset][11]; } void append_0x80_4x4 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 offset) { w0[0] |= 0x80808080 & c_append_helper[offset][ 0]; w0[1] |= 0x80808080 & c_append_helper[offset][ 1]; w0[2] |= 0x80808080 & c_append_helper[offset][ 2]; w0[3] |= 0x80808080 & c_append_helper[offset][ 3]; w1[0] |= 0x80808080 & c_append_helper[offset][ 4]; w1[1] |= 0x80808080 & c_append_helper[offset][ 5]; w1[2] |= 0x80808080 & c_append_helper[offset][ 6]; w1[3] |= 0x80808080 & c_append_helper[offset][ 7]; w2[0] |= 0x80808080 & c_append_helper[offset][ 8]; w2[1] |= 0x80808080 & c_append_helper[offset][ 9]; w2[2] |= 0x80808080 & c_append_helper[offset][10]; w2[3] |= 0x80808080 & c_append_helper[offset][11]; w3[0] |= 0x80808080 & c_append_helper[offset][12]; w3[1] |= 0x80808080 & c_append_helper[offset][13]; w3[2] |= 0x80808080 & c_append_helper[offset][14]; w3[3] |= 0x80808080 & c_append_helper[offset][15]; } void append_0x80_8x4 (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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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; } } void append_0x80_1x16 (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; } } void switch_buffer_by_offset_le (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_mod_4; #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if (defined IS_AMD && AMD_GCN < 3) || defined IS_GENERIC w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); switch (offset_switch) { case 0: w3[3] = amd_bytealign (w3[2], w3[3], offset); w3[2] = amd_bytealign (w3[1], w3[2], 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[3] = amd_bytealign (w3[1], w3[2], offset); w3[2] = amd_bytealign (w3[0], w3[1], 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[3] = amd_bytealign (w3[0], w3[1], offset); w3[2] = amd_bytealign (w2[3], w3[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[3] = amd_bytealign (w2[3], w3[0], offset); w3[2] = amd_bytealign (w2[2], w2[3], 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[3] = amd_bytealign (w2[2], w2[3], offset); w3[2] = amd_bytealign (w2[1], w2[2], 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[3] = amd_bytealign (w2[1], w2[2], offset); w3[2] = amd_bytealign (w2[0], w2[1], 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[3] = amd_bytealign (w2[0], w2[1], offset); w3[2] = amd_bytealign (w1[3], w2[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[3] = amd_bytealign (w1[3], w2[0], offset); w3[2] = amd_bytealign (w1[2], w1[3], 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[3] = amd_bytealign (w1[2], w1[3], offset); w3[2] = amd_bytealign (w1[1], w1[2], 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[3] = amd_bytealign (w1[1], w1[2], offset); w3[2] = amd_bytealign (w1[0], w1[1], 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[3] = amd_bytealign (w1[0], w1[1], offset); w3[2] = amd_bytealign (w0[3], w1[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[3] = amd_bytealign (w0[3], w1[0], offset); w3[2] = amd_bytealign (w0[2], w0[3], 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[3] = amd_bytealign (w0[2], w0[3], offset); w3[2] = amd_bytealign (w0[1], w0[2], 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[3] = amd_bytealign (w0[1], w0[2], offset); w3[2] = amd_bytealign (w0[0], w0[1], 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; case 14: w3[3] = amd_bytealign (w0[0], w0[1], offset); w3[2] = amd_bytealign ( 0, w0[0], offset); w3[1] = 0; 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; case 15: w3[3] = amd_bytealign ( 0, w0[0], offset); w3[2] = 0; w3[1] = 0; 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; } w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); #endif #if (defined IS_AMD && AMD_GCN >= 3) || defined IS_NV #if defined IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; #endif #if defined IS_AMD const int selector = 0x0706050403020100 >> (offset_minus_4 * 8); #endif switch (offset_switch) { case 0: w3[3] = __byte_perm (w3[2], w3[3], selector); w3[2] = __byte_perm (w3[1], w3[2], selector); 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[3] = __byte_perm (w3[1], w3[2], selector); w3[2] = __byte_perm (w3[0], w3[1], selector); 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[3] = __byte_perm (w3[0], w3[1], selector); w3[2] = __byte_perm (w2[3], w3[0], selector); 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[3] = __byte_perm (w2[3], w3[0], selector); w3[2] = __byte_perm (w2[2], w2[3], selector); 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[3] = __byte_perm (w2[2], w2[3], selector); w3[2] = __byte_perm (w2[1], w2[2], selector); 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[3] = __byte_perm (w2[1], w2[2], selector); w3[2] = __byte_perm (w2[0], w2[1], selector); 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[3] = __byte_perm (w2[0], w2[1], selector); w3[2] = __byte_perm (w1[3], w2[0], selector); 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[3] = __byte_perm (w1[3], w2[0], selector); w3[2] = __byte_perm (w1[2], w1[3], selector); 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[3] = __byte_perm (w1[2], w1[3], selector); w3[2] = __byte_perm (w1[1], w1[2], selector); 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[3] = __byte_perm (w1[1], w1[2], selector); w3[2] = __byte_perm (w1[0], w1[1], selector); 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[3] = __byte_perm (w1[0], w1[1], selector); w3[2] = __byte_perm (w0[3], w1[0], selector); 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[3] = __byte_perm (w0[3], w1[0], selector); w3[2] = __byte_perm (w0[2], w0[3], selector); 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[3] = __byte_perm (w0[2], w0[3], selector); w3[2] = __byte_perm (w0[1], w0[2], selector); 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[3] = __byte_perm (w0[1], w0[2], selector); w3[2] = __byte_perm (w0[0], w0[1], selector); 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; case 14: w3[3] = __byte_perm (w0[0], w0[1], selector); w3[2] = __byte_perm ( 0, w0[0], selector); w3[1] = 0; 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; case 15: w3[3] = __byte_perm ( 0, w0[0], selector); w3[2] = 0; w3[1] = 0; 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 } void switch_buffer_by_offset_carry_le (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x c0[4], u32x c1[4], u32x c2[4], u32x c3[4], const u32 offset) { const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if defined IS_AMD || defined IS_GENERIC w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); switch (offset_switch) { case 0: c0[0] = amd_bytealign (w3[3], 0, offset); w3[3] = amd_bytealign (w3[2], w3[3], offset); w3[2] = amd_bytealign (w3[1], w3[2], 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: c0[1] = amd_bytealign (w3[3], 0, offset); c0[0] = amd_bytealign (w3[2], w3[3], offset); w3[3] = amd_bytealign (w3[1], w3[2], offset); w3[2] = amd_bytealign (w3[0], w3[1], 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: c0[2] = amd_bytealign (w3[3], 0, offset); c0[1] = amd_bytealign (w3[2], w3[3], offset); c0[0] = amd_bytealign (w3[1], w3[2], offset); w3[3] = amd_bytealign (w3[0], w3[1], offset); w3[2] = amd_bytealign (w2[3], w3[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: c0[3] = amd_bytealign (w3[3], 0, offset); c0[2] = amd_bytealign (w3[2], w3[3], offset); c0[1] = amd_bytealign (w3[1], w3[2], offset); c0[0] = amd_bytealign (w3[0], w3[1], offset); w3[3] = amd_bytealign (w2[3], w3[0], offset); w3[2] = amd_bytealign (w2[2], w2[3], 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: c1[0] = amd_bytealign (w3[3], 0, offset); c0[3] = amd_bytealign (w3[2], w3[3], offset); c0[2] = amd_bytealign (w3[1], w3[2], offset); c0[1] = amd_bytealign (w3[0], w3[1], offset); c0[0] = amd_bytealign (w2[3], w3[0], offset); w3[3] = amd_bytealign (w2[2], w2[3], offset); w3[2] = amd_bytealign (w2[1], w2[2], 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: c1[1] = amd_bytealign (w3[3], 0, offset); c1[0] = amd_bytealign (w3[2], w3[3], offset); c0[3] = amd_bytealign (w3[1], w3[2], offset); c0[2] = amd_bytealign (w3[0], w3[1], offset); c0[1] = amd_bytealign (w2[3], w3[0], offset); c0[0] = amd_bytealign (w2[2], w2[3], offset); w3[3] = amd_bytealign (w2[1], w2[2], offset); w3[2] = amd_bytealign (w2[0], w2[1], 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: c1[2] = amd_bytealign (w3[3], 0, offset); c1[1] = amd_bytealign (w3[2], w3[3], offset); c1[0] = amd_bytealign (w3[1], w3[2], offset); c0[3] = amd_bytealign (w3[0], w3[1], offset); c0[2] = amd_bytealign (w2[3], w3[0], offset); c0[1] = amd_bytealign (w2[2], w2[3], offset); c0[0] = amd_bytealign (w2[1], w2[2], offset); w3[3] = amd_bytealign (w2[0], w2[1], offset); w3[2] = amd_bytealign (w1[3], w2[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: c1[3] = amd_bytealign (w3[3], 0, offset); c1[2] = amd_bytealign (w3[2], w3[3], offset); c1[1] = amd_bytealign (w3[1], w3[2], offset); c1[0] = amd_bytealign (w3[0], w3[1], offset); c0[3] = amd_bytealign (w2[3], w3[0], offset); c0[2] = amd_bytealign (w2[2], w2[3], offset); c0[1] = amd_bytealign (w2[1], w2[2], offset); c0[0] = amd_bytealign (w2[0], w2[1], offset); w3[3] = amd_bytealign (w1[3], w2[0], offset); w3[2] = amd_bytealign (w1[2], w1[3], 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: c2[0] = amd_bytealign (w3[3], 0, offset); c1[3] = amd_bytealign (w3[2], w3[3], offset); c1[2] = amd_bytealign (w3[1], w3[2], offset); c1[1] = amd_bytealign (w3[0], w3[1], offset); c1[0] = amd_bytealign (w2[3], w3[0], offset); c0[3] = amd_bytealign (w2[2], w2[3], offset); c0[2] = amd_bytealign (w2[1], w2[2], offset); c0[1] = amd_bytealign (w2[0], w2[1], offset); c0[0] = amd_bytealign (w1[3], w2[0], offset); w3[3] = amd_bytealign (w1[2], w1[3], offset); w3[2] = amd_bytealign (w1[1], w1[2], 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: c2[1] = amd_bytealign (w3[3], 0, offset); c2[0] = amd_bytealign (w3[2], w3[3], offset); c1[3] = amd_bytealign (w3[1], w3[2], offset); c1[2] = amd_bytealign (w3[0], w3[1], offset); c1[1] = amd_bytealign (w2[3], w3[0], offset); c1[0] = amd_bytealign (w2[2], w2[3], offset); c0[3] = amd_bytealign (w2[1], w2[2], offset); c0[2] = amd_bytealign (w2[0], w2[1], offset); c0[1] = amd_bytealign (w1[3], w2[0], offset); c0[0] = amd_bytealign (w1[2], w1[3], offset); w3[3] = amd_bytealign (w1[1], w1[2], offset); w3[2] = amd_bytealign (w1[0], w1[1], 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: c2[2] = amd_bytealign (w3[3], 0, offset); c2[1] = amd_bytealign (w3[2], w3[3], offset); c2[0] = amd_bytealign (w3[1], w3[2], offset); c1[3] = amd_bytealign (w3[0], w3[1], offset); c1[2] = amd_bytealign (w2[3], w3[0], offset); c1[1] = amd_bytealign (w2[2], w2[3], offset); c1[0] = amd_bytealign (w2[1], w2[2], offset); c0[3] = amd_bytealign (w2[0], w2[1], offset); c0[2] = amd_bytealign (w1[3], w2[0], offset); c0[1] = amd_bytealign (w1[2], w1[3], offset); c0[0] = amd_bytealign (w1[1], w1[2], offset); w3[3] = amd_bytealign (w1[0], w1[1], offset); w3[2] = amd_bytealign (w0[3], w1[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: c2[3] = amd_bytealign (w3[3], 0, offset); c2[2] = amd_bytealign (w3[2], w3[3], offset); c2[1] = amd_bytealign (w3[1], w3[2], offset); c2[0] = amd_bytealign (w3[0], w3[1], offset); c1[3] = amd_bytealign (w2[3], w3[0], offset); c1[2] = amd_bytealign (w2[2], w2[3], offset); c1[1] = amd_bytealign (w2[1], w2[2], offset); c1[0] = amd_bytealign (w2[0], w2[1], offset); c0[3] = amd_bytealign (w1[3], w2[0], offset); c0[2] = amd_bytealign (w1[2], w1[3], offset); c0[1] = amd_bytealign (w1[1], w1[2], offset); c0[0] = amd_bytealign (w1[0], w1[1], offset); w3[3] = amd_bytealign (w0[3], w1[0], offset); w3[2] = amd_bytealign (w0[2], w0[3], 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: c3[0] = amd_bytealign (w3[3], 0, offset); c2[3] = amd_bytealign (w3[2], w3[3], offset); c2[2] = amd_bytealign (w3[1], w3[2], offset); c2[1] = amd_bytealign (w3[0], w3[1], offset); c2[0] = amd_bytealign (w2[3], w3[0], offset); c1[3] = amd_bytealign (w2[2], w2[3], offset); c1[2] = amd_bytealign (w2[1], w2[2], offset); c1[1] = amd_bytealign (w2[0], w2[1], offset); c1[0] = amd_bytealign (w1[3], w2[0], offset); c0[3] = amd_bytealign (w1[2], w1[3], offset); c0[2] = amd_bytealign (w1[1], w1[2], offset); c0[1] = amd_bytealign (w1[0], w1[1], offset); c0[0] = amd_bytealign (w0[3], w1[0], offset); w3[3] = amd_bytealign (w0[2], w0[3], offset); w3[2] = amd_bytealign (w0[1], w0[2], 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: c3[1] = amd_bytealign (w3[3], 0, offset); c3[0] = amd_bytealign (w3[2], w3[3], offset); c2[3] = amd_bytealign (w3[1], w3[2], offset); c2[2] = amd_bytealign (w3[0], w3[1], offset); c2[1] = amd_bytealign (w2[3], w3[0], offset); c2[0] = amd_bytealign (w2[2], w2[3], offset); c1[3] = amd_bytealign (w2[1], w2[2], offset); c1[2] = amd_bytealign (w2[0], w2[1], offset); c1[1] = amd_bytealign (w1[3], w2[0], offset); c1[0] = amd_bytealign (w1[2], w1[3], offset); c0[3] = amd_bytealign (w1[1], w1[2], offset); c0[2] = amd_bytealign (w1[0], w1[1], offset); c0[1] = amd_bytealign (w0[3], w1[0], offset); c0[0] = amd_bytealign (w0[2], w0[3], offset); w3[3] = amd_bytealign (w0[1], w0[2], offset); w3[2] = amd_bytealign (w0[0], w0[1], 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; case 14: c3[2] = amd_bytealign (w3[3], 0, offset); c3[1] = amd_bytealign (w3[2], w3[3], offset); c3[0] = amd_bytealign (w3[1], w3[2], offset); c2[3] = amd_bytealign (w3[0], w3[1], offset); c2[2] = amd_bytealign (w2[3], w3[0], offset); c2[1] = amd_bytealign (w2[2], w2[3], offset); c2[0] = amd_bytealign (w2[1], w2[2], offset); c1[3] = amd_bytealign (w2[0], w2[1], offset); c1[2] = amd_bytealign (w1[3], w2[0], offset); c1[1] = amd_bytealign (w1[2], w1[3], offset); c1[0] = amd_bytealign (w1[1], w1[2], offset); c0[3] = amd_bytealign (w1[0], w1[1], offset); c0[2] = amd_bytealign (w0[3], w1[0], offset); c0[1] = amd_bytealign (w0[2], w0[3], offset); c0[0] = amd_bytealign (w0[1], w0[2], offset); w3[3] = amd_bytealign (w0[0], w0[1], offset); w3[2] = amd_bytealign ( 0, w0[0], offset); w3[1] = 0; 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; case 15: c3[3] = amd_bytealign (w3[3], 0, offset); c3[2] = amd_bytealign (w3[2], w3[3], offset); c3[1] = amd_bytealign (w3[1], w3[2], offset); c3[0] = amd_bytealign (w3[0], w3[1], offset); c2[3] = amd_bytealign (w2[3], w3[0], offset); c2[2] = amd_bytealign (w2[2], w2[3], offset); c2[1] = amd_bytealign (w2[1], w2[2], offset); c2[0] = amd_bytealign (w2[0], w2[1], offset); c1[3] = amd_bytealign (w1[3], w2[0], offset); c1[2] = amd_bytealign (w1[2], w1[3], offset); c1[1] = amd_bytealign (w1[1], w1[2], offset); c1[0] = amd_bytealign (w1[0], w1[1], offset); c0[3] = amd_bytealign (w0[3], w1[0], offset); c0[2] = amd_bytealign (w0[2], w0[3], offset); c0[1] = amd_bytealign (w0[1], w0[2], offset); c0[0] = amd_bytealign (w0[0], w0[1], offset); w3[3] = amd_bytealign ( 0, w0[0], offset); w3[2] = 0; w3[1] = 0; 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; } w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); c0[0] = swap32 (c0[0]); c0[1] = swap32 (c0[1]); c0[2] = swap32 (c0[2]); c0[3] = swap32 (c0[3]); c1[0] = swap32 (c1[0]); c1[1] = swap32 (c1[1]); c1[2] = swap32 (c1[2]); c1[3] = swap32 (c1[3]); c2[0] = swap32 (c2[0]); c2[1] = swap32 (c2[1]); c2[2] = swap32 (c2[2]); c2[3] = swap32 (c2[3]); c3[0] = swap32 (c3[0]); c3[1] = swap32 (c3[1]); c3[2] = swap32 (c3[2]); c3[3] = swap32 (c3[3]); #endif #ifdef IS_NV // todo switch (offset_switch) { case 0: c0[0] = amd_bytealign ( 0, w3[3], offset_minus_4); w3[3] = amd_bytealign (w3[3], w3[2], offset_minus_4); w3[2] = amd_bytealign (w3[2], 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] = w3[3]; w3[3] = c0[0]; c0[0] = 0; } break; case 1: c0[1] = amd_bytealign ( 0, w3[3], offset_minus_4); c0[0] = amd_bytealign (w3[3], w3[2], offset_minus_4); w3[3] = amd_bytealign (w3[2], w3[1], offset_minus_4); w3[2] = amd_bytealign (w3[1], 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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = 0; } break; case 2: c0[2] = amd_bytealign ( 0, w3[3], offset_minus_4); c0[1] = amd_bytealign (w3[3], w3[2], offset_minus_4); c0[0] = amd_bytealign (w3[2], w3[1], offset_minus_4); w3[3] = amd_bytealign (w3[1], w3[0], offset_minus_4); w3[2] = amd_bytealign (w3[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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = 0; } break; case 3: c0[3] = amd_bytealign ( 0, w3[3], offset_minus_4); c0[2] = amd_bytealign (w3[3], w3[2], offset_minus_4); c0[1] = amd_bytealign (w3[2], w3[1], offset_minus_4); c0[0] = amd_bytealign (w3[1], w3[0], offset_minus_4); w3[3] = amd_bytealign (w3[0], w2[3], offset_minus_4); w3[2] = amd_bytealign (w2[3], 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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = 0; } break; case 4: c1[0] = amd_bytealign ( 0, w3[3], offset_minus_4); c0[3] = amd_bytealign (w3[3], w3[2], offset_minus_4); c0[2] = amd_bytealign (w3[2], w3[1], offset_minus_4); c0[1] = amd_bytealign (w3[1], w3[0], offset_minus_4); c0[0] = amd_bytealign (w3[0], w2[3], offset_minus_4); w3[3] = amd_bytealign (w2[3], w2[2], offset_minus_4); w3[2] = amd_bytealign (w2[2], 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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = 0; } break; case 5: c1[1] = amd_bytealign ( 0, w3[3], offset_minus_4); c1[0] = amd_bytealign (w3[3], w3[2], offset_minus_4); c0[3] = amd_bytealign (w3[2], w3[1], offset_minus_4); c0[2] = amd_bytealign (w3[1], w3[0], offset_minus_4); c0[1] = amd_bytealign (w3[0], w2[3], offset_minus_4); c0[0] = amd_bytealign (w2[3], w2[2], offset_minus_4); w3[3] = amd_bytealign (w2[2], w2[1], offset_minus_4); w3[2] = amd_bytealign (w2[1], 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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = 0; } break; case 6: c1[2] = amd_bytealign ( 0, w3[3], offset_minus_4); c1[1] = amd_bytealign (w3[3], w3[2], offset_minus_4); c1[0] = amd_bytealign (w3[2], w3[1], offset_minus_4); c0[3] = amd_bytealign (w3[1], w3[0], offset_minus_4); c0[2] = amd_bytealign (w3[0], w2[3], offset_minus_4); c0[1] = amd_bytealign (w2[3], w2[2], offset_minus_4); c0[0] = amd_bytealign (w2[2], w2[1], offset_minus_4); w3[3] = amd_bytealign (w2[1], w2[0], offset_minus_4); w3[2] = amd_bytealign (w2[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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = 0; } break; case 7: c1[3] = amd_bytealign ( 0, w3[3], offset_minus_4); c1[2] = amd_bytealign (w3[3], w3[2], offset_minus_4); c1[1] = amd_bytealign (w3[2], w3[1], offset_minus_4); c1[0] = amd_bytealign (w3[1], w3[0], offset_minus_4); c0[3] = amd_bytealign (w3[0], w2[3], offset_minus_4); c0[2] = amd_bytealign (w2[3], w2[2], offset_minus_4); c0[1] = amd_bytealign (w2[2], w2[1], offset_minus_4); c0[0] = amd_bytealign (w2[1], w2[0], offset_minus_4); w3[3] = amd_bytealign (w2[0], w1[3], offset_minus_4); w3[2] = amd_bytealign (w1[3], 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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = 0; } break; case 8: c2[0] = amd_bytealign ( 0, w3[3], offset_minus_4); c1[3] = amd_bytealign (w3[3], w3[2], offset_minus_4); c1[2] = amd_bytealign (w3[2], w3[1], offset_minus_4); c1[1] = amd_bytealign (w3[1], w3[0], offset_minus_4); c1[0] = amd_bytealign (w3[0], w2[3], offset_minus_4); c0[3] = amd_bytealign (w2[3], w2[2], offset_minus_4); c0[2] = amd_bytealign (w2[2], w2[1], offset_minus_4); c0[1] = amd_bytealign (w2[1], w2[0], offset_minus_4); c0[0] = amd_bytealign (w2[0], w1[3], offset_minus_4); w3[3] = amd_bytealign (w1[3], w1[2], offset_minus_4); w3[2] = amd_bytealign (w1[2], 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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = c2[0]; c2[0] = 0; } break; case 9: c2[1] = amd_bytealign ( 0, w3[3], offset_minus_4); c2[0] = amd_bytealign (w3[3], w3[2], offset_minus_4); c1[3] = amd_bytealign (w3[2], w3[1], offset_minus_4); c1[2] = amd_bytealign (w3[1], w3[0], offset_minus_4); c1[1] = amd_bytealign (w3[0], w2[3], offset_minus_4); c1[0] = amd_bytealign (w2[3], w2[2], offset_minus_4); c0[3] = amd_bytealign (w2[2], w2[1], offset_minus_4); c0[2] = amd_bytealign (w2[1], w2[0], offset_minus_4); c0[1] = amd_bytealign (w2[0], w1[3], offset_minus_4); c0[0] = amd_bytealign (w1[3], w1[2], offset_minus_4); w3[3] = amd_bytealign (w1[2], w1[1], offset_minus_4); w3[2] = amd_bytealign (w1[1], 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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = c2[0]; c2[0] = c2[1]; c2[1] = 0; } break; case 10: c2[2] = amd_bytealign ( 0, w3[3], offset_minus_4); c2[1] = amd_bytealign (w3[3], w3[2], offset_minus_4); c2[0] = amd_bytealign (w3[2], w3[1], offset_minus_4); c1[3] = amd_bytealign (w3[1], w3[0], offset_minus_4); c1[2] = amd_bytealign (w3[0], w2[3], offset_minus_4); c1[1] = amd_bytealign (w2[3], w2[2], offset_minus_4); c1[0] = amd_bytealign (w2[2], w2[1], offset_minus_4); c0[3] = amd_bytealign (w2[1], w2[0], offset_minus_4); c0[2] = amd_bytealign (w2[0], w1[3], offset_minus_4); c0[1] = amd_bytealign (w1[3], w1[2], offset_minus_4); c0[0] = amd_bytealign (w1[2], w1[1], offset_minus_4); w3[3] = amd_bytealign (w1[1], w1[0], offset_minus_4); w3[2] = amd_bytealign (w1[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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = c2[0]; c2[0] = c2[1]; c2[1] = c2[2]; c2[2] = 0; } break; case 11: c2[3] = amd_bytealign ( 0, w3[3], offset_minus_4); c2[2] = amd_bytealign (w3[3], w3[2], offset_minus_4); c2[1] = amd_bytealign (w3[2], w3[1], offset_minus_4); c2[0] = amd_bytealign (w3[1], w3[0], offset_minus_4); c1[3] = amd_bytealign (w3[0], w2[3], offset_minus_4); c1[2] = amd_bytealign (w2[3], w2[2], offset_minus_4); c1[1] = amd_bytealign (w2[2], w2[1], offset_minus_4); c1[0] = amd_bytealign (w2[1], w2[0], offset_minus_4); c0[3] = amd_bytealign (w2[0], w1[3], offset_minus_4); c0[2] = amd_bytealign (w1[3], w1[2], offset_minus_4); c0[1] = amd_bytealign (w1[2], w1[1], offset_minus_4); c0[0] = amd_bytealign (w1[1], w1[0], offset_minus_4); w3[3] = amd_bytealign (w1[0], w0[3], offset_minus_4); w3[2] = amd_bytealign (w0[3], 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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = c2[0]; c2[0] = c2[1]; c2[1] = c2[2]; c2[2] = c2[3]; c2[3] = 0; } break; case 12: c3[0] = amd_bytealign ( 0, w3[3], offset_minus_4); c2[3] = amd_bytealign (w3[3], w3[2], offset_minus_4); c2[2] = amd_bytealign (w3[2], w3[1], offset_minus_4); c2[1] = amd_bytealign (w3[1], w3[0], offset_minus_4); c2[0] = amd_bytealign (w3[0], w2[3], offset_minus_4); c1[3] = amd_bytealign (w2[3], w2[2], offset_minus_4); c1[2] = amd_bytealign (w2[2], w2[1], offset_minus_4); c1[1] = amd_bytealign (w2[1], w2[0], offset_minus_4); c1[0] = amd_bytealign (w2[0], w1[3], offset_minus_4); c0[3] = amd_bytealign (w1[3], w1[2], offset_minus_4); c0[2] = amd_bytealign (w1[2], w1[1], offset_minus_4); c0[1] = amd_bytealign (w1[1], w1[0], offset_minus_4); c0[0] = amd_bytealign (w1[0], w0[3], offset_minus_4); w3[3] = amd_bytealign (w0[3], w0[2], offset_minus_4); w3[2] = amd_bytealign (w0[2], 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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = c2[0]; c2[0] = c2[1]; c2[1] = c2[2]; c2[2] = c2[3]; c2[3] = c3[0]; c3[0] = 0; } break; case 13: c3[1] = amd_bytealign ( 0, w3[3], offset_minus_4); c3[0] = amd_bytealign (w3[3], w3[2], offset_minus_4); c2[3] = amd_bytealign (w3[2], w3[1], offset_minus_4); c2[2] = amd_bytealign (w3[1], w3[0], offset_minus_4); c2[1] = amd_bytealign (w3[0], w2[3], offset_minus_4); c2[0] = amd_bytealign (w2[3], w2[2], offset_minus_4); c1[3] = amd_bytealign (w2[2], w2[1], offset_minus_4); c1[2] = amd_bytealign (w2[1], w2[0], offset_minus_4); c1[1] = amd_bytealign (w2[0], w1[3], offset_minus_4); c1[0] = amd_bytealign (w1[3], w1[2], offset_minus_4); c0[3] = amd_bytealign (w1[2], w1[1], offset_minus_4); c0[2] = amd_bytealign (w1[1], w1[0], offset_minus_4); c0[1] = amd_bytealign (w1[0], w0[3], offset_minus_4); c0[0] = amd_bytealign (w0[3], w0[2], offset_minus_4); w3[3] = amd_bytealign (w0[2], w0[1], offset_minus_4); w3[2] = amd_bytealign (w0[1], 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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = c2[0]; c2[0] = c2[1]; c2[1] = c2[2]; c2[2] = c2[3]; c2[3] = c3[0]; c3[0] = c3[1]; c3[1] = 0; } break; case 14: c3[2] = amd_bytealign ( 0, w3[3], offset_minus_4); c3[1] = amd_bytealign (w3[3], w3[2], offset_minus_4); c3[0] = amd_bytealign (w3[2], w3[1], offset_minus_4); c2[3] = amd_bytealign (w3[1], w3[0], offset_minus_4); c2[2] = amd_bytealign (w3[0], w2[3], offset_minus_4); c2[1] = amd_bytealign (w2[3], w2[2], offset_minus_4); c2[0] = amd_bytealign (w2[2], w2[1], offset_minus_4); c1[3] = amd_bytealign (w2[1], w2[0], offset_minus_4); c1[2] = amd_bytealign (w2[0], w1[3], offset_minus_4); c1[1] = amd_bytealign (w1[3], w1[2], offset_minus_4); c1[0] = amd_bytealign (w1[2], w1[1], offset_minus_4); c0[3] = amd_bytealign (w1[1], w1[0], offset_minus_4); c0[2] = amd_bytealign (w1[0], w0[3], offset_minus_4); c0[1] = amd_bytealign (w0[3], w0[2], offset_minus_4); c0[0] = amd_bytealign (w0[2], w0[1], offset_minus_4); w3[3] = amd_bytealign (w0[1], w0[0], offset_minus_4); w3[2] = amd_bytealign (w0[0], 0, offset_minus_4); w3[1] = 0; 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[2] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = c2[0]; c2[0] = c2[1]; c2[1] = c2[2]; c2[2] = c2[3]; c2[3] = c3[0]; c3[0] = c3[1]; c3[1] = c3[2]; c3[2] = 0; } break; case 15: c3[3] = amd_bytealign ( 0, w3[3], offset_minus_4); c3[2] = amd_bytealign (w3[3], w3[2], offset_minus_4); c3[1] = amd_bytealign (w3[2], w3[1], offset_minus_4); c3[0] = amd_bytealign (w3[1], w3[0], offset_minus_4); c2[3] = amd_bytealign (w3[0], w2[3], offset_minus_4); c2[2] = amd_bytealign (w2[3], w2[2], offset_minus_4); c2[1] = amd_bytealign (w2[2], w2[1], offset_minus_4); c2[0] = amd_bytealign (w2[1], w2[0], offset_minus_4); c1[3] = amd_bytealign (w2[0], w1[3], offset_minus_4); c1[2] = amd_bytealign (w1[3], w1[2], offset_minus_4); c1[1] = amd_bytealign (w1[2], w1[1], offset_minus_4); c1[0] = amd_bytealign (w1[1], w1[0], offset_minus_4); c0[3] = amd_bytealign (w1[0], w0[3], offset_minus_4); c0[2] = amd_bytealign (w0[3], w0[2], offset_minus_4); c0[1] = amd_bytealign (w0[2], w0[1], offset_minus_4); c0[0] = amd_bytealign (w0[1], w0[0], offset_minus_4); w3[3] = amd_bytealign (w0[0], 0, offset_minus_4); w3[2] = 0; w3[1] = 0; 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[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = c2[0]; c2[0] = c2[1]; c2[1] = c2[2]; c2[2] = c2[3]; c2[3] = c3[0]; c3[0] = c3[1]; c3[1] = c3[2]; c3[2] = c3[3]; c3[3] = 0; } break; } #endif } void switch_buffer_by_offset_be (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 offset) { #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if (defined IS_AMD && AMD_GCN < 3) || defined IS_GENERIC switch (offset_switch) { case 0: w3[3] = amd_bytealign (w3[2], w3[3], offset); w3[2] = amd_bytealign (w3[1], w3[2], 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[3] = amd_bytealign (w3[1], w3[2], offset); w3[2] = amd_bytealign (w3[0], w3[1], 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[3] = amd_bytealign (w3[0], w3[1], offset); w3[2] = amd_bytealign (w2[3], w3[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[3] = amd_bytealign (w2[3], w3[0], offset); w3[2] = amd_bytealign (w2[2], w2[3], 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[3] = amd_bytealign (w2[2], w2[3], offset); w3[2] = amd_bytealign (w2[1], w2[2], 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[3] = amd_bytealign (w2[1], w2[2], offset); w3[2] = amd_bytealign (w2[0], w2[1], 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[3] = amd_bytealign (w2[0], w2[1], offset); w3[2] = amd_bytealign (w1[3], w2[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[3] = amd_bytealign (w1[3], w2[0], offset); w3[2] = amd_bytealign (w1[2], w1[3], 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[3] = amd_bytealign (w1[2], w1[3], offset); w3[2] = amd_bytealign (w1[1], w1[2], 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[3] = amd_bytealign (w1[1], w1[2], offset); w3[2] = amd_bytealign (w1[0], w1[1], 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[3] = amd_bytealign (w1[0], w1[1], offset); w3[2] = amd_bytealign (w0[3], w1[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[3] = amd_bytealign (w0[3], w1[0], offset); w3[2] = amd_bytealign (w0[2], w0[3], 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[3] = amd_bytealign (w0[2], w0[3], offset); w3[2] = amd_bytealign (w0[1], w0[2], 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[3] = amd_bytealign (w0[1], w0[2], offset); w3[2] = amd_bytealign (w0[0], w0[1], 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; case 14: w3[3] = amd_bytealign (w0[0], w0[1], offset); w3[2] = amd_bytealign ( 0, w0[0], offset); w3[1] = 0; 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; case 15: w3[3] = amd_bytealign ( 0, w0[0], offset); w3[2] = 0; w3[1] = 0; 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 #if (defined IS_AMD && AMD_GCN >= 3) || defined IS_NV #if defined IS_NV const int selector = (0x76543210 >> ((offset & 3) * 4)) & 0xffff; #endif #if defined IS_AMD const int selector = 0x0706050403020100 >> ((offset & 3) * 8); #endif switch (offset_switch) { case 0: w3[3] = __byte_perm (w3[3], w3[2], selector); w3[2] = __byte_perm (w3[2], w3[1], selector); 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[3] = __byte_perm (w3[2], w3[1], selector); w3[2] = __byte_perm (w3[1], w3[0], selector); 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[3] = __byte_perm (w3[1], w3[0], selector); w3[2] = __byte_perm (w3[0], w2[3], selector); 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[3] = __byte_perm (w3[0], w2[3], selector); w3[2] = __byte_perm (w2[3], w2[2], selector); 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[3] = __byte_perm (w2[3], w2[2], selector); w3[2] = __byte_perm (w2[2], w2[1], selector); 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[3] = __byte_perm (w2[2], w2[1], selector); w3[2] = __byte_perm (w2[1], w2[0], selector); 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[3] = __byte_perm (w2[1], w2[0], selector); w3[2] = __byte_perm (w2[0], w1[3], selector); 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[3] = __byte_perm (w2[0], w1[3], selector); w3[2] = __byte_perm (w1[3], w1[2], selector); 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[3] = __byte_perm (w1[3], w1[2], selector); w3[2] = __byte_perm (w1[2], w1[1], selector); 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[3] = __byte_perm (w1[2], w1[1], selector); w3[2] = __byte_perm (w1[1], w1[0], selector); 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[3] = __byte_perm (w1[1], w1[0], selector); w3[2] = __byte_perm (w1[0], w0[3], selector); 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[3] = __byte_perm (w1[0], w0[3], selector); w3[2] = __byte_perm (w0[3], w0[2], selector); 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[3] = __byte_perm (w0[3], w0[2], selector); w3[2] = __byte_perm (w0[2], w0[1], selector); 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[3] = __byte_perm (w0[2], w0[1], selector); w3[2] = __byte_perm (w0[1], w0[0], selector); 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; case 14: w3[3] = __byte_perm (w0[1], w0[0], selector); w3[2] = __byte_perm (w0[0], 0, selector); w3[1] = 0; 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; case 15: w3[3] = __byte_perm (w0[0], 0, selector); w3[2] = 0; w3[1] = 0; 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 } void switch_buffer_by_offset_carry_be (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x c0[4], u32x c1[4], u32x c2[4], u32x c3[4], const u32 offset) { #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if (defined IS_AMD && AMD_GCN < 3) || defined IS_GENERIC switch (offset_switch) { case 0: c0[0] = amd_bytealign (w3[3], 0, offset); w3[3] = amd_bytealign (w3[2], w3[3], offset); w3[2] = amd_bytealign (w3[1], w3[2], 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: c0[1] = amd_bytealign (w3[3], 0, offset); c0[0] = amd_bytealign (w3[2], w3[3], offset); w3[3] = amd_bytealign (w3[1], w3[2], offset); w3[2] = amd_bytealign (w3[0], w3[1], 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: c0[2] = amd_bytealign (w3[3], 0, offset); c0[1] = amd_bytealign (w3[2], w3[3], offset); c0[0] = amd_bytealign (w3[1], w3[2], offset); w3[3] = amd_bytealign (w3[0], w3[1], offset); w3[2] = amd_bytealign (w2[3], w3[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: c0[3] = amd_bytealign (w3[3], 0, offset); c0[2] = amd_bytealign (w3[2], w3[3], offset); c0[1] = amd_bytealign (w3[1], w3[2], offset); c0[0] = amd_bytealign (w3[0], w3[1], offset); w3[3] = amd_bytealign (w2[3], w3[0], offset); w3[2] = amd_bytealign (w2[2], w2[3], 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: c1[0] = amd_bytealign (w3[3], 0, offset); c0[3] = amd_bytealign (w3[2], w3[3], offset); c0[2] = amd_bytealign (w3[1], w3[2], offset); c0[1] = amd_bytealign (w3[0], w3[1], offset); c0[0] = amd_bytealign (w2[3], w3[0], offset); w3[3] = amd_bytealign (w2[2], w2[3], offset); w3[2] = amd_bytealign (w2[1], w2[2], 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: c1[1] = amd_bytealign (w3[3], 0, offset); c1[0] = amd_bytealign (w3[2], w3[3], offset); c0[3] = amd_bytealign (w3[1], w3[2], offset); c0[2] = amd_bytealign (w3[0], w3[1], offset); c0[1] = amd_bytealign (w2[3], w3[0], offset); c0[0] = amd_bytealign (w2[2], w2[3], offset); w3[3] = amd_bytealign (w2[1], w2[2], offset); w3[2] = amd_bytealign (w2[0], w2[1], 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: c1[2] = amd_bytealign (w3[3], 0, offset); c1[1] = amd_bytealign (w3[2], w3[3], offset); c1[0] = amd_bytealign (w3[1], w3[2], offset); c0[3] = amd_bytealign (w3[0], w3[1], offset); c0[2] = amd_bytealign (w2[3], w3[0], offset); c0[1] = amd_bytealign (w2[2], w2[3], offset); c0[0] = amd_bytealign (w2[1], w2[2], offset); w3[3] = amd_bytealign (w2[0], w2[1], offset); w3[2] = amd_bytealign (w1[3], w2[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: c1[3] = amd_bytealign (w3[3], 0, offset); c1[2] = amd_bytealign (w3[2], w3[3], offset); c1[1] = amd_bytealign (w3[1], w3[2], offset); c1[0] = amd_bytealign (w3[0], w3[1], offset); c0[3] = amd_bytealign (w2[3], w3[0], offset); c0[2] = amd_bytealign (w2[2], w2[3], offset); c0[1] = amd_bytealign (w2[1], w2[2], offset); c0[0] = amd_bytealign (w2[0], w2[1], offset); w3[3] = amd_bytealign (w1[3], w2[0], offset); w3[2] = amd_bytealign (w1[2], w1[3], 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: c2[0] = amd_bytealign (w3[3], 0, offset); c1[3] = amd_bytealign (w3[2], w3[3], offset); c1[2] = amd_bytealign (w3[1], w3[2], offset); c1[1] = amd_bytealign (w3[0], w3[1], offset); c1[0] = amd_bytealign (w2[3], w3[0], offset); c0[3] = amd_bytealign (w2[2], w2[3], offset); c0[2] = amd_bytealign (w2[1], w2[2], offset); c0[1] = amd_bytealign (w2[0], w2[1], offset); c0[0] = amd_bytealign (w1[3], w2[0], offset); w3[3] = amd_bytealign (w1[2], w1[3], offset); w3[2] = amd_bytealign (w1[1], w1[2], 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: c2[1] = amd_bytealign (w3[3], 0, offset); c2[0] = amd_bytealign (w3[2], w3[3], offset); c1[3] = amd_bytealign (w3[1], w3[2], offset); c1[2] = amd_bytealign (w3[0], w3[1], offset); c1[1] = amd_bytealign (w2[3], w3[0], offset); c1[0] = amd_bytealign (w2[2], w2[3], offset); c0[3] = amd_bytealign (w2[1], w2[2], offset); c0[2] = amd_bytealign (w2[0], w2[1], offset); c0[1] = amd_bytealign (w1[3], w2[0], offset); c0[0] = amd_bytealign (w1[2], w1[3], offset); w3[3] = amd_bytealign (w1[1], w1[2], offset); w3[2] = amd_bytealign (w1[0], w1[1], 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: c2[2] = amd_bytealign (w3[3], 0, offset); c2[1] = amd_bytealign (w3[2], w3[3], offset); c2[0] = amd_bytealign (w3[1], w3[2], offset); c1[3] = amd_bytealign (w3[0], w3[1], offset); c1[2] = amd_bytealign (w2[3], w3[0], offset); c1[1] = amd_bytealign (w2[2], w2[3], offset); c1[0] = amd_bytealign (w2[1], w2[2], offset); c0[3] = amd_bytealign (w2[0], w2[1], offset); c0[2] = amd_bytealign (w1[3], w2[0], offset); c0[1] = amd_bytealign (w1[2], w1[3], offset); c0[0] = amd_bytealign (w1[1], w1[2], offset); w3[3] = amd_bytealign (w1[0], w1[1], offset); w3[2] = amd_bytealign (w0[3], w1[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: c2[3] = amd_bytealign (w3[3], 0, offset); c2[2] = amd_bytealign (w3[2], w3[3], offset); c2[1] = amd_bytealign (w3[1], w3[2], offset); c2[0] = amd_bytealign (w3[0], w3[1], offset); c1[3] = amd_bytealign (w2[3], w3[0], offset); c1[2] = amd_bytealign (w2[2], w2[3], offset); c1[1] = amd_bytealign (w2[1], w2[2], offset); c1[0] = amd_bytealign (w2[0], w2[1], offset); c0[3] = amd_bytealign (w1[3], w2[0], offset); c0[2] = amd_bytealign (w1[2], w1[3], offset); c0[1] = amd_bytealign (w1[1], w1[2], offset); c0[0] = amd_bytealign (w1[0], w1[1], offset); w3[3] = amd_bytealign (w0[3], w1[0], offset); w3[2] = amd_bytealign (w0[2], w0[3], 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: c3[0] = amd_bytealign (w3[3], 0, offset); c2[3] = amd_bytealign (w3[2], w3[3], offset); c2[2] = amd_bytealign (w3[1], w3[2], offset); c2[1] = amd_bytealign (w3[0], w3[1], offset); c2[0] = amd_bytealign (w2[3], w3[0], offset); c1[3] = amd_bytealign (w2[2], w2[3], offset); c1[2] = amd_bytealign (w2[1], w2[2], offset); c1[1] = amd_bytealign (w2[0], w2[1], offset); c1[0] = amd_bytealign (w1[3], w2[0], offset); c0[3] = amd_bytealign (w1[2], w1[3], offset); c0[2] = amd_bytealign (w1[1], w1[2], offset); c0[1] = amd_bytealign (w1[0], w1[1], offset); c0[0] = amd_bytealign (w0[3], w1[0], offset); w3[3] = amd_bytealign (w0[2], w0[3], offset); w3[2] = amd_bytealign (w0[1], w0[2], 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: c3[1] = amd_bytealign (w3[3], 0, offset); c3[0] = amd_bytealign (w3[2], w3[3], offset); c2[3] = amd_bytealign (w3[1], w3[2], offset); c2[2] = amd_bytealign (w3[0], w3[1], offset); c2[1] = amd_bytealign (w2[3], w3[0], offset); c2[0] = amd_bytealign (w2[2], w2[3], offset); c1[3] = amd_bytealign (w2[1], w2[2], offset); c1[2] = amd_bytealign (w2[0], w2[1], offset); c1[1] = amd_bytealign (w1[3], w2[0], offset); c1[0] = amd_bytealign (w1[2], w1[3], offset); c0[3] = amd_bytealign (w1[1], w1[2], offset); c0[2] = amd_bytealign (w1[0], w1[1], offset); c0[1] = amd_bytealign (w0[3], w1[0], offset); c0[0] = amd_bytealign (w0[2], w0[3], offset); w3[3] = amd_bytealign (w0[1], w0[2], offset); w3[2] = amd_bytealign (w0[0], w0[1], 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; case 14: c3[2] = amd_bytealign (w3[3], 0, offset); c3[1] = amd_bytealign (w3[2], w3[3], offset); c3[0] = amd_bytealign (w3[1], w3[2], offset); c2[3] = amd_bytealign (w3[0], w3[1], offset); c2[2] = amd_bytealign (w2[3], w3[0], offset); c2[1] = amd_bytealign (w2[2], w2[3], offset); c2[0] = amd_bytealign (w2[1], w2[2], offset); c1[3] = amd_bytealign (w2[0], w2[1], offset); c1[2] = amd_bytealign (w1[3], w2[0], offset); c1[1] = amd_bytealign (w1[2], w1[3], offset); c1[0] = amd_bytealign (w1[1], w1[2], offset); c0[3] = amd_bytealign (w1[0], w1[1], offset); c0[2] = amd_bytealign (w0[3], w1[0], offset); c0[1] = amd_bytealign (w0[2], w0[3], offset); c0[0] = amd_bytealign (w0[1], w0[2], offset); w3[3] = amd_bytealign (w0[0], w0[1], offset); w3[2] = amd_bytealign ( 0, w0[0], offset); w3[1] = 0; 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; case 15: c3[3] = amd_bytealign (w3[3], 0, offset); c3[2] = amd_bytealign (w3[2], w3[3], offset); c3[1] = amd_bytealign (w3[1], w3[2], offset); c3[0] = amd_bytealign (w3[0], w3[1], offset); c2[3] = amd_bytealign (w2[3], w3[0], offset); c2[2] = amd_bytealign (w2[2], w2[3], offset); c2[1] = amd_bytealign (w2[1], w2[2], offset); c2[0] = amd_bytealign (w2[0], w2[1], offset); c1[3] = amd_bytealign (w1[3], w2[0], offset); c1[2] = amd_bytealign (w1[2], w1[3], offset); c1[1] = amd_bytealign (w1[1], w1[2], offset); c1[0] = amd_bytealign (w1[0], w1[1], offset); c0[3] = amd_bytealign (w0[3], w1[0], offset); c0[2] = amd_bytealign (w0[2], w0[3], offset); c0[1] = amd_bytealign (w0[1], w0[2], offset); c0[0] = amd_bytealign (w0[0], w0[1], offset); w3[3] = amd_bytealign ( 0, w0[0], offset); w3[2] = 0; w3[1] = 0; 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 #if (defined IS_AMD && AMD_GCN >= 3) || defined IS_NV #if defined IS_NV const int selector = (0x76543210 >> ((offset & 3) * 4)) & 0xffff; #endif #if defined IS_AMD const int selector = 0x0706050403020100 >> ((offset & 3) * 8); #endif switch (offset_switch) { case 0: c0[0] = __byte_perm ( 0, w3[3], selector); w3[3] = __byte_perm (w3[3], w3[2], selector); w3[2] = __byte_perm (w3[2], w3[1], selector); 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: c0[1] = __byte_perm ( 0, w3[3], selector); c0[0] = __byte_perm (w3[3], w3[2], selector); w3[3] = __byte_perm (w3[2], w3[1], selector); w3[2] = __byte_perm (w3[1], w3[0], selector); 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: c0[2] = __byte_perm ( 0, w3[3], selector); c0[1] = __byte_perm (w3[3], w3[2], selector); c0[0] = __byte_perm (w3[2], w3[1], selector); w3[3] = __byte_perm (w3[1], w3[0], selector); w3[2] = __byte_perm (w3[0], w2[3], selector); 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: c0[3] = __byte_perm ( 0, w3[3], selector); c0[2] = __byte_perm (w3[3], w3[2], selector); c0[1] = __byte_perm (w3[2], w3[1], selector); c0[0] = __byte_perm (w3[1], w3[0], selector); w3[3] = __byte_perm (w3[0], w2[3], selector); w3[2] = __byte_perm (w2[3], w2[2], selector); 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: c1[0] = __byte_perm ( 0, w3[3], selector); c0[3] = __byte_perm (w3[3], w3[2], selector); c0[2] = __byte_perm (w3[2], w3[1], selector); c0[1] = __byte_perm (w3[1], w3[0], selector); c0[0] = __byte_perm (w3[0], w2[3], selector); w3[3] = __byte_perm (w2[3], w2[2], selector); w3[2] = __byte_perm (w2[2], w2[1], selector); 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: c1[1] = __byte_perm ( 0, w3[3], selector); c1[0] = __byte_perm (w3[3], w3[2], selector); c0[3] = __byte_perm (w3[2], w3[1], selector); c0[2] = __byte_perm (w3[1], w3[0], selector); c0[1] = __byte_perm (w3[0], w2[3], selector); c0[0] = __byte_perm (w2[3], w2[2], selector); w3[3] = __byte_perm (w2[2], w2[1], selector); w3[2] = __byte_perm (w2[1], w2[0], selector); 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: c1[2] = __byte_perm ( 0, w3[3], selector); c1[1] = __byte_perm (w3[3], w3[2], selector); c1[0] = __byte_perm (w3[2], w3[1], selector); c0[3] = __byte_perm (w3[1], w3[0], selector); c0[2] = __byte_perm (w3[0], w2[3], selector); c0[1] = __byte_perm (w2[3], w2[2], selector); c0[0] = __byte_perm (w2[2], w2[1], selector); w3[3] = __byte_perm (w2[1], w2[0], selector); w3[2] = __byte_perm (w2[0], w1[3], selector); 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: c1[3] = __byte_perm ( 0, w3[3], selector); c1[2] = __byte_perm (w3[3], w3[2], selector); c1[1] = __byte_perm (w3[2], w3[1], selector); c1[0] = __byte_perm (w3[1], w3[0], selector); c0[3] = __byte_perm (w3[0], w2[3], selector); c0[2] = __byte_perm (w2[3], w2[2], selector); c0[1] = __byte_perm (w2[2], w2[1], selector); c0[0] = __byte_perm (w2[1], w2[0], selector); w3[3] = __byte_perm (w2[0], w1[3], selector); w3[2] = __byte_perm (w1[3], w1[2], selector); 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: c2[0] = __byte_perm ( 0, w3[3], selector); c1[3] = __byte_perm (w3[3], w3[2], selector); c1[2] = __byte_perm (w3[2], w3[1], selector); c1[1] = __byte_perm (w3[1], w3[0], selector); c1[0] = __byte_perm (w3[0], w2[3], selector); c0[3] = __byte_perm (w2[3], w2[2], selector); c0[2] = __byte_perm (w2[2], w2[1], selector); c0[1] = __byte_perm (w2[1], w2[0], selector); c0[0] = __byte_perm (w2[0], w1[3], selector); w3[3] = __byte_perm (w1[3], w1[2], selector); w3[2] = __byte_perm (w1[2], w1[1], selector); 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: c2[1] = __byte_perm ( 0, w3[3], selector); c2[0] = __byte_perm (w3[3], w3[2], selector); c1[3] = __byte_perm (w3[2], w3[1], selector); c1[2] = __byte_perm (w3[1], w3[0], selector); c1[1] = __byte_perm (w3[0], w2[3], selector); c1[0] = __byte_perm (w2[3], w2[2], selector); c0[3] = __byte_perm (w2[2], w2[1], selector); c0[2] = __byte_perm (w2[1], w2[0], selector); c0[1] = __byte_perm (w2[0], w1[3], selector); c0[0] = __byte_perm (w1[3], w1[2], selector); w3[3] = __byte_perm (w1[2], w1[1], selector); w3[2] = __byte_perm (w1[1], w1[0], selector); 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: c2[2] = __byte_perm ( 0, w3[3], selector); c2[1] = __byte_perm (w3[3], w3[2], selector); c2[0] = __byte_perm (w3[2], w3[1], selector); c1[3] = __byte_perm (w3[1], w3[0], selector); c1[2] = __byte_perm (w3[0], w2[3], selector); c1[1] = __byte_perm (w2[3], w2[2], selector); c1[0] = __byte_perm (w2[2], w2[1], selector); c0[3] = __byte_perm (w2[1], w2[0], selector); c0[2] = __byte_perm (w2[0], w1[3], selector); c0[1] = __byte_perm (w1[3], w1[2], selector); c0[0] = __byte_perm (w1[2], w1[1], selector); w3[3] = __byte_perm (w1[1], w1[0], selector); w3[2] = __byte_perm (w1[0], w0[3], selector); 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: c2[3] = __byte_perm ( 0, w3[3], selector); c2[2] = __byte_perm (w3[3], w3[2], selector); c2[1] = __byte_perm (w3[2], w3[1], selector); c2[0] = __byte_perm (w3[1], w3[0], selector); c1[3] = __byte_perm (w3[0], w2[3], selector); c1[2] = __byte_perm (w2[3], w2[2], selector); c1[1] = __byte_perm (w2[2], w2[1], selector); c1[0] = __byte_perm (w2[1], w2[0], selector); c0[3] = __byte_perm (w2[0], w1[3], selector); c0[2] = __byte_perm (w1[3], w1[2], selector); c0[1] = __byte_perm (w1[2], w1[1], selector); c0[0] = __byte_perm (w1[1], w1[0], selector); w3[3] = __byte_perm (w1[0], w0[3], selector); w3[2] = __byte_perm (w0[3], w0[2], selector); 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: c3[0] = __byte_perm ( 0, w3[3], selector); c2[3] = __byte_perm (w3[3], w3[2], selector); c2[2] = __byte_perm (w3[2], w3[1], selector); c2[1] = __byte_perm (w3[1], w3[0], selector); c2[0] = __byte_perm (w3[0], w2[3], selector); c1[3] = __byte_perm (w2[3], w2[2], selector); c1[2] = __byte_perm (w2[2], w2[1], selector); c1[1] = __byte_perm (w2[1], w2[0], selector); c1[0] = __byte_perm (w2[0], w1[3], selector); c0[3] = __byte_perm (w1[3], w1[2], selector); c0[2] = __byte_perm (w1[2], w1[1], selector); c0[1] = __byte_perm (w1[1], w1[0], selector); c0[0] = __byte_perm (w1[0], w0[3], selector); w3[3] = __byte_perm (w0[3], w0[2], selector); w3[2] = __byte_perm (w0[2], w0[1], selector); 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: c3[1] = __byte_perm ( 0, w3[3], selector); c3[0] = __byte_perm (w3[3], w3[2], selector); c2[3] = __byte_perm (w3[2], w3[1], selector); c2[2] = __byte_perm (w3[1], w3[0], selector); c2[1] = __byte_perm (w3[0], w2[3], selector); c2[0] = __byte_perm (w2[3], w2[2], selector); c1[3] = __byte_perm (w2[2], w2[1], selector); c1[2] = __byte_perm (w2[1], w2[0], selector); c1[1] = __byte_perm (w2[0], w1[3], selector); c1[0] = __byte_perm (w1[3], w1[2], selector); c0[3] = __byte_perm (w1[2], w1[1], selector); c0[2] = __byte_perm (w1[1], w1[0], selector); c0[1] = __byte_perm (w1[0], w0[3], selector); c0[0] = __byte_perm (w0[3], w0[2], selector); w3[3] = __byte_perm (w0[2], w0[1], selector); w3[2] = __byte_perm (w0[1], w0[0], selector); 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; case 14: c3[2] = __byte_perm ( 0, w3[3], selector); c3[1] = __byte_perm (w3[3], w3[2], selector); c3[0] = __byte_perm (w3[2], w3[1], selector); c2[3] = __byte_perm (w3[1], w3[0], selector); c2[2] = __byte_perm (w3[0], w2[3], selector); c2[1] = __byte_perm (w2[3], w2[2], selector); c2[0] = __byte_perm (w2[2], w2[1], selector); c1[3] = __byte_perm (w2[1], w2[0], selector); c1[2] = __byte_perm (w2[0], w1[3], selector); c1[1] = __byte_perm (w1[3], w1[2], selector); c1[0] = __byte_perm (w1[2], w1[1], selector); c0[3] = __byte_perm (w1[1], w1[0], selector); c0[2] = __byte_perm (w1[0], w0[3], selector); c0[1] = __byte_perm (w0[3], w0[2], selector); c0[0] = __byte_perm (w0[2], w0[1], selector); w3[3] = __byte_perm (w0[1], w0[0], selector); w3[2] = __byte_perm (w0[0], 0, selector); w3[1] = 0; 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; case 15: c3[3] = __byte_perm ( 0, w3[3], selector); c3[2] = __byte_perm (w3[3], w3[2], selector); c3[1] = __byte_perm (w3[2], w3[1], selector); c3[0] = __byte_perm (w3[1], w3[0], selector); c2[3] = __byte_perm (w3[0], w2[3], selector); c2[2] = __byte_perm (w2[3], w2[2], selector); c2[1] = __byte_perm (w2[2], w2[1], selector); c2[0] = __byte_perm (w2[1], w2[0], selector); c1[3] = __byte_perm (w2[0], w1[3], selector); c1[2] = __byte_perm (w1[3], w1[2], selector); c1[1] = __byte_perm (w1[2], w1[1], selector); c1[0] = __byte_perm (w1[1], w1[0], selector); c0[3] = __byte_perm (w1[0], w0[3], selector); c0[2] = __byte_perm (w0[3], w0[2], selector); c0[1] = __byte_perm (w0[2], w0[1], selector); c0[0] = __byte_perm (w0[1], w0[0], selector); w3[3] = __byte_perm (w0[0], 0, selector); w3[2] = 0; w3[1] = 0; 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 } void switch_buffer_by_offset_8x4_le (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) { const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if (defined IS_AMD && AMD_GCN < 3) || defined IS_GENERIC w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); w4[0] = swap32 (w4[0]); w4[1] = swap32 (w4[1]); w4[2] = swap32 (w4[2]); w4[3] = swap32 (w4[3]); w5[0] = swap32 (w5[0]); w5[1] = swap32 (w5[1]); w5[2] = swap32 (w5[2]); w5[3] = swap32 (w5[3]); w6[0] = swap32 (w6[0]); w6[1] = swap32 (w6[1]); w6[2] = swap32 (w6[2]); w6[3] = swap32 (w6[3]); w7[0] = swap32 (w7[0]); w7[1] = swap32 (w7[1]); w7[2] = swap32 (w7[2]); w7[3] = swap32 (w7[3]); switch (offset_switch) { case 0: w7[3] = amd_bytealign (w7[2], w7[3], offset); w7[2] = amd_bytealign (w7[1], w7[2], offset); w7[1] = amd_bytealign (w7[0], w7[1], offset); w7[0] = amd_bytealign (w6[3], w7[0], offset); w6[3] = amd_bytealign (w6[2], w6[3], offset); w6[2] = amd_bytealign (w6[1], w6[2], offset); w6[1] = amd_bytealign (w6[0], w6[1], offset); w6[0] = amd_bytealign (w5[3], w6[0], offset); w5[3] = amd_bytealign (w5[2], w5[3], offset); w5[2] = amd_bytealign (w5[1], w5[2], offset); w5[1] = amd_bytealign (w5[0], w5[1], offset); w5[0] = amd_bytealign (w4[3], w5[0], offset); w4[3] = amd_bytealign (w4[2], w4[3], offset); w4[2] = amd_bytealign (w4[1], w4[2], offset); w4[1] = amd_bytealign (w4[0], w4[1], offset); w4[0] = amd_bytealign (w3[3], w4[0], offset); w3[3] = amd_bytealign (w3[2], w3[3], offset); w3[2] = amd_bytealign (w3[1], w3[2], 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: w7[3] = amd_bytealign (w7[1], w7[2], offset); w7[2] = amd_bytealign (w7[0], w7[1], offset); w7[1] = amd_bytealign (w6[3], w7[0], offset); w7[0] = amd_bytealign (w6[2], w6[3], offset); w6[3] = amd_bytealign (w6[1], w6[2], offset); w6[2] = amd_bytealign (w6[0], w6[1], offset); w6[1] = amd_bytealign (w5[3], w6[0], offset); w6[0] = amd_bytealign (w5[2], w5[3], offset); w5[3] = amd_bytealign (w5[1], w5[2], offset); w5[2] = amd_bytealign (w5[0], w5[1], offset); w5[1] = amd_bytealign (w4[3], w5[0], offset); w5[0] = amd_bytealign (w4[2], w4[3], offset); w4[3] = amd_bytealign (w4[1], w4[2], offset); w4[2] = amd_bytealign (w4[0], w4[1], offset); w4[1] = amd_bytealign (w3[3], w4[0], offset); w4[0] = amd_bytealign (w3[2], w3[3], offset); w3[3] = amd_bytealign (w3[1], w3[2], offset); w3[2] = amd_bytealign (w3[0], w3[1], 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: w7[3] = amd_bytealign (w7[0], w7[1], offset); w7[2] = amd_bytealign (w6[3], w7[0], offset); w7[1] = amd_bytealign (w6[2], w6[3], offset); w7[0] = amd_bytealign (w6[1], w6[2], offset); w6[3] = amd_bytealign (w6[0], w6[1], offset); w6[2] = amd_bytealign (w5[3], w6[0], offset); w6[1] = amd_bytealign (w5[2], w5[3], offset); w6[0] = amd_bytealign (w5[1], w5[2], offset); w5[3] = amd_bytealign (w5[0], w5[1], offset); w5[2] = amd_bytealign (w4[3], w5[0], offset); w5[1] = amd_bytealign (w4[2], w4[3], offset); w5[0] = amd_bytealign (w4[1], w4[2], offset); w4[3] = amd_bytealign (w4[0], w4[1], offset); w4[2] = amd_bytealign (w3[3], w4[0], offset); w4[1] = amd_bytealign (w3[2], w3[3], offset); w4[0] = amd_bytealign (w3[1], w3[2], offset); w3[3] = amd_bytealign (w3[0], w3[1], offset); w3[2] = amd_bytealign (w2[3], w3[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: w7[3] = amd_bytealign (w6[3], w7[0], offset); w7[2] = amd_bytealign (w6[2], w6[3], offset); w7[1] = amd_bytealign (w6[1], w6[2], offset); w7[0] = amd_bytealign (w6[0], w6[1], offset); w6[3] = amd_bytealign (w5[3], w6[0], offset); w6[2] = amd_bytealign (w5[2], w5[3], offset); w6[1] = amd_bytealign (w5[1], w5[2], offset); w6[0] = amd_bytealign (w5[0], w5[1], offset); w5[3] = amd_bytealign (w4[3], w5[0], offset); w5[2] = amd_bytealign (w4[2], w4[3], offset); w5[1] = amd_bytealign (w4[1], w4[2], offset); w5[0] = amd_bytealign (w4[0], w4[1], offset); w4[3] = amd_bytealign (w3[3], w4[0], offset); w4[2] = amd_bytealign (w3[2], w3[3], offset); w4[1] = amd_bytealign (w3[1], w3[2], offset); w4[0] = amd_bytealign (w3[0], w3[1], offset); w3[3] = amd_bytealign (w2[3], w3[0], offset); w3[2] = amd_bytealign (w2[2], w2[3], 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: w7[3] = amd_bytealign (w6[2], w6[3], offset); w7[2] = amd_bytealign (w6[1], w6[2], offset); w7[1] = amd_bytealign (w6[0], w6[1], offset); w7[0] = amd_bytealign (w5[3], w6[0], offset); w6[3] = amd_bytealign (w5[2], w5[3], offset); w6[2] = amd_bytealign (w5[1], w5[2], offset); w6[1] = amd_bytealign (w5[0], w5[1], offset); w6[0] = amd_bytealign (w4[3], w5[0], offset); w5[3] = amd_bytealign (w4[2], w4[3], offset); w5[2] = amd_bytealign (w4[1], w4[2], offset); w5[1] = amd_bytealign (w4[0], w4[1], offset); w5[0] = amd_bytealign (w3[3], w4[0], offset); w4[3] = amd_bytealign (w3[2], w3[3], offset); w4[2] = amd_bytealign (w3[1], w3[2], offset); w4[1] = amd_bytealign (w3[0], w3[1], offset); w4[0] = amd_bytealign (w2[3], w3[0], offset); w3[3] = amd_bytealign (w2[2], w2[3], offset); w3[2] = amd_bytealign (w2[1], w2[2], 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: w7[3] = amd_bytealign (w6[1], w6[2], offset); w7[2] = amd_bytealign (w6[0], w6[1], offset); w7[1] = amd_bytealign (w5[3], w6[0], offset); w7[0] = amd_bytealign (w5[2], w5[3], offset); w6[3] = amd_bytealign (w5[1], w5[2], offset); w6[2] = amd_bytealign (w5[0], w5[1], offset); w6[1] = amd_bytealign (w4[3], w5[0], offset); w6[0] = amd_bytealign (w4[2], w4[3], offset); w5[3] = amd_bytealign (w4[1], w4[2], offset); w5[2] = amd_bytealign (w4[0], w4[1], offset); w5[1] = amd_bytealign (w3[3], w4[0], offset); w5[0] = amd_bytealign (w3[2], w3[3], offset); w4[3] = amd_bytealign (w3[1], w3[2], offset); w4[2] = amd_bytealign (w3[0], w3[1], offset); w4[1] = amd_bytealign (w2[3], w3[0], offset); w4[0] = amd_bytealign (w2[2], w2[3], offset); w3[3] = amd_bytealign (w2[1], w2[2], offset); w3[2] = amd_bytealign (w2[0], w2[1], 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: w7[3] = amd_bytealign (w6[0], w6[1], offset); w7[2] = amd_bytealign (w5[3], w6[0], offset); w7[1] = amd_bytealign (w5[2], w5[3], offset); w7[0] = amd_bytealign (w5[1], w5[2], offset); w6[3] = amd_bytealign (w5[0], w5[1], offset); w6[2] = amd_bytealign (w4[3], w5[0], offset); w6[1] = amd_bytealign (w4[2], w4[3], offset); w6[0] = amd_bytealign (w4[1], w4[2], offset); w5[3] = amd_bytealign (w4[0], w4[1], offset); w5[2] = amd_bytealign (w3[3], w4[0], offset); w5[1] = amd_bytealign (w3[2], w3[3], offset); w5[0] = amd_bytealign (w3[1], w3[2], offset); w4[3] = amd_bytealign (w3[0], w3[1], offset); w4[2] = amd_bytealign (w2[3], w3[0], offset); w4[1] = amd_bytealign (w2[2], w2[3], offset); w4[0] = amd_bytealign (w2[1], w2[2], offset); w3[3] = amd_bytealign (w2[0], w2[1], offset); w3[2] = amd_bytealign (w1[3], w2[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: w7[3] = amd_bytealign (w5[3], w6[0], offset); w7[2] = amd_bytealign (w5[2], w5[3], offset); w7[1] = amd_bytealign (w5[1], w5[2], offset); w7[0] = amd_bytealign (w5[0], w5[1], offset); w6[3] = amd_bytealign (w4[3], w5[0], offset); w6[2] = amd_bytealign (w4[2], w4[3], offset); w6[1] = amd_bytealign (w4[1], w4[2], offset); w6[0] = amd_bytealign (w4[0], w4[1], offset); w5[3] = amd_bytealign (w3[3], w4[0], offset); w5[2] = amd_bytealign (w3[2], w3[3], offset); w5[1] = amd_bytealign (w3[1], w3[2], offset); w5[0] = amd_bytealign (w3[0], w3[1], offset); w4[3] = amd_bytealign (w2[3], w3[0], offset); w4[2] = amd_bytealign (w2[2], w2[3], offset); w4[1] = amd_bytealign (w2[1], w2[2], offset); w4[0] = amd_bytealign (w2[0], w2[1], offset); w3[3] = amd_bytealign (w1[3], w2[0], offset); w3[2] = amd_bytealign (w1[2], w1[3], 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: w7[3] = amd_bytealign (w5[2], w5[3], offset); w7[2] = amd_bytealign (w5[1], w5[2], offset); w7[1] = amd_bytealign (w5[0], w5[1], offset); w7[0] = amd_bytealign (w4[3], w5[0], offset); w6[3] = amd_bytealign (w4[2], w4[3], offset); w6[2] = amd_bytealign (w4[1], w4[2], offset); w6[1] = amd_bytealign (w4[0], w4[1], offset); w6[0] = amd_bytealign (w3[3], w4[0], offset); w5[3] = amd_bytealign (w3[2], w3[3], offset); w5[2] = amd_bytealign (w3[1], w3[2], offset); w5[1] = amd_bytealign (w3[0], w3[1], offset); w5[0] = amd_bytealign (w2[3], w3[0], offset); w4[3] = amd_bytealign (w2[2], w2[3], offset); w4[2] = amd_bytealign (w2[1], w2[2], offset); w4[1] = amd_bytealign (w2[0], w2[1], offset); w4[0] = amd_bytealign (w1[3], w2[0], offset); w3[3] = amd_bytealign (w1[2], w1[3], offset); w3[2] = amd_bytealign (w1[1], w1[2], 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: w7[3] = amd_bytealign (w5[1], w5[2], offset); w7[2] = amd_bytealign (w5[0], w5[1], offset); w7[1] = amd_bytealign (w4[3], w5[0], offset); w7[0] = amd_bytealign (w4[2], w4[3], offset); w6[3] = amd_bytealign (w4[1], w4[2], offset); w6[2] = amd_bytealign (w4[0], w4[1], offset); w6[1] = amd_bytealign (w3[3], w4[0], offset); w6[0] = amd_bytealign (w3[2], w3[3], offset); w5[3] = amd_bytealign (w3[1], w3[2], offset); w5[2] = amd_bytealign (w3[0], w3[1], offset); w5[1] = amd_bytealign (w2[3], w3[0], offset); w5[0] = amd_bytealign (w2[2], w2[3], offset); w4[3] = amd_bytealign (w2[1], w2[2], offset); w4[2] = amd_bytealign (w2[0], w2[1], offset); w4[1] = amd_bytealign (w1[3], w2[0], offset); w4[0] = amd_bytealign (w1[2], w1[3], offset); w3[3] = amd_bytealign (w1[1], w1[2], offset); w3[2] = amd_bytealign (w1[0], w1[1], 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: w7[3] = amd_bytealign (w5[0], w5[1], offset); w7[2] = amd_bytealign (w4[3], w5[0], offset); w7[1] = amd_bytealign (w4[2], w4[3], offset); w7[0] = amd_bytealign (w4[1], w4[2], offset); w6[3] = amd_bytealign (w4[0], w4[1], offset); w6[2] = amd_bytealign (w3[3], w4[0], offset); w6[1] = amd_bytealign (w3[2], w3[3], offset); w6[0] = amd_bytealign (w3[1], w3[2], offset); w5[3] = amd_bytealign (w3[0], w3[1], offset); w5[2] = amd_bytealign (w2[3], w3[0], offset); w5[1] = amd_bytealign (w2[2], w2[3], offset); w5[0] = amd_bytealign (w2[1], w2[2], offset); w4[3] = amd_bytealign (w2[0], w2[1], offset); w4[2] = amd_bytealign (w1[3], w2[0], offset); w4[1] = amd_bytealign (w1[2], w1[3], offset); w4[0] = amd_bytealign (w1[1], w1[2], offset); w3[3] = amd_bytealign (w1[0], w1[1], offset); w3[2] = amd_bytealign (w0[3], w1[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: w7[3] = amd_bytealign (w4[3], w5[0], offset); w7[2] = amd_bytealign (w4[2], w4[3], offset); w7[1] = amd_bytealign (w4[1], w4[2], offset); w7[0] = amd_bytealign (w4[0], w4[1], offset); w6[3] = amd_bytealign (w3[3], w4[0], offset); w6[2] = amd_bytealign (w3[2], w3[3], offset); w6[1] = amd_bytealign (w3[1], w3[2], offset); w6[0] = amd_bytealign (w3[0], w3[1], offset); w5[3] = amd_bytealign (w2[3], w3[0], offset); w5[2] = amd_bytealign (w2[2], w2[3], offset); w5[1] = amd_bytealign (w2[1], w2[2], offset); w5[0] = amd_bytealign (w2[0], w2[1], offset); w4[3] = amd_bytealign (w1[3], w2[0], offset); w4[2] = amd_bytealign (w1[2], w1[3], offset); w4[1] = amd_bytealign (w1[1], w1[2], offset); w4[0] = amd_bytealign (w1[0], w1[1], offset); w3[3] = amd_bytealign (w0[3], w1[0], offset); w3[2] = amd_bytealign (w0[2], w0[3], 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: w7[3] = amd_bytealign (w4[2], w4[3], offset); w7[2] = amd_bytealign (w4[1], w4[2], offset); w7[1] = amd_bytealign (w4[0], w4[1], offset); w7[0] = amd_bytealign (w3[3], w4[0], offset); w6[3] = amd_bytealign (w3[2], w3[3], offset); w6[2] = amd_bytealign (w3[1], w3[2], offset); w6[1] = amd_bytealign (w3[0], w3[1], offset); w6[0] = amd_bytealign (w2[3], w3[0], offset); w5[3] = amd_bytealign (w2[2], w2[3], offset); w5[2] = amd_bytealign (w2[1], w2[2], offset); w5[1] = amd_bytealign (w2[0], w2[1], offset); w5[0] = amd_bytealign (w1[3], w2[0], offset); w4[3] = amd_bytealign (w1[2], w1[3], offset); w4[2] = amd_bytealign (w1[1], w1[2], offset); w4[1] = amd_bytealign (w1[0], w1[1], offset); w4[0] = amd_bytealign (w0[3], w1[0], offset); w3[3] = amd_bytealign (w0[2], w0[3], offset); w3[2] = amd_bytealign (w0[1], w0[2], 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: w7[3] = amd_bytealign (w4[1], w4[2], offset); w7[2] = amd_bytealign (w4[0], w4[1], offset); w7[1] = amd_bytealign (w3[3], w4[0], offset); w7[0] = amd_bytealign (w3[2], w3[3], offset); w6[3] = amd_bytealign (w3[1], w3[2], offset); w6[2] = amd_bytealign (w3[0], w3[1], offset); w6[1] = amd_bytealign (w2[3], w3[0], offset); w6[0] = amd_bytealign (w2[2], w2[3], offset); w5[3] = amd_bytealign (w2[1], w2[2], offset); w5[2] = amd_bytealign (w2[0], w2[1], offset); w5[1] = amd_bytealign (w1[3], w2[0], offset); w5[0] = amd_bytealign (w1[2], w1[3], offset); w4[3] = amd_bytealign (w1[1], w1[2], offset); w4[2] = amd_bytealign (w1[0], w1[1], offset); w4[1] = amd_bytealign (w0[3], w1[0], offset); w4[0] = amd_bytealign (w0[2], w0[3], offset); w3[3] = amd_bytealign (w0[1], w0[2], offset); w3[2] = amd_bytealign (w0[0], w0[1], 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; case 14: w7[3] = amd_bytealign (w4[0], w4[1], offset); w7[2] = amd_bytealign (w3[3], w4[0], offset); w7[1] = amd_bytealign (w3[2], w3[3], offset); w7[0] = amd_bytealign (w3[1], w3[2], offset); w6[3] = amd_bytealign (w3[0], w3[1], offset); w6[2] = amd_bytealign (w2[3], w3[0], offset); w6[1] = amd_bytealign (w2[2], w2[3], offset); w6[0] = amd_bytealign (w2[1], w2[2], offset); w5[3] = amd_bytealign (w2[0], w2[1], offset); w5[2] = amd_bytealign (w1[3], w2[0], offset); w5[1] = amd_bytealign (w1[2], w1[3], offset); w5[0] = amd_bytealign (w1[1], w1[2], offset); w4[3] = amd_bytealign (w1[0], w1[1], offset); w4[2] = amd_bytealign (w0[3], w1[0], offset); w4[1] = amd_bytealign (w0[2], w0[3], offset); w4[0] = amd_bytealign (w0[1], w0[2], offset); w3[3] = amd_bytealign (w0[0], w0[1], offset); w3[2] = amd_bytealign ( 0, w0[0], offset); w3[1] = 0; 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; case 15: w7[3] = amd_bytealign (w3[3], w4[0], offset); w7[2] = amd_bytealign (w3[2], w3[3], offset); w7[1] = amd_bytealign (w3[1], w3[2], offset); w7[0] = amd_bytealign (w3[0], w3[1], offset); w6[3] = amd_bytealign (w2[3], w3[0], offset); w6[2] = amd_bytealign (w2[2], w2[3], offset); w6[1] = amd_bytealign (w2[1], w2[2], offset); w6[0] = amd_bytealign (w2[0], w2[1], offset); w5[3] = amd_bytealign (w1[3], w2[0], offset); w5[2] = amd_bytealign (w1[2], w1[3], offset); w5[1] = amd_bytealign (w1[1], w1[2], offset); w5[0] = amd_bytealign (w1[0], w1[1], offset); w4[3] = amd_bytealign (w0[3], w1[0], offset); w4[2] = amd_bytealign (w0[2], w0[3], offset); w4[1] = amd_bytealign (w0[1], w0[2], offset); w4[0] = amd_bytealign (w0[0], w0[1], offset); w3[3] = amd_bytealign ( 0, w0[0], offset); w3[2] = 0; w3[1] = 0; 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; case 16: w7[3] = amd_bytealign (w3[2], w3[3], offset); w7[2] = amd_bytealign (w3[1], w3[2], offset); w7[1] = amd_bytealign (w3[0], w3[1], offset); w7[0] = amd_bytealign (w2[3], w3[0], offset); w6[3] = amd_bytealign (w2[2], w2[3], offset); w6[2] = amd_bytealign (w2[1], w2[2], offset); w6[1] = amd_bytealign (w2[0], w2[1], offset); w6[0] = amd_bytealign (w1[3], w2[0], offset); w5[3] = amd_bytealign (w1[2], w1[3], offset); w5[2] = amd_bytealign (w1[1], w1[2], offset); w5[1] = amd_bytealign (w1[0], w1[1], offset); w5[0] = amd_bytealign (w0[3], w1[0], offset); w4[3] = amd_bytealign (w0[2], w0[3], offset); w4[2] = amd_bytealign (w0[1], w0[2], offset); w4[1] = amd_bytealign (w0[0], w0[1], offset); w4[0] = amd_bytealign ( 0, w0[0], offset); w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 17: w7[3] = amd_bytealign (w3[1], w3[2], offset); w7[2] = amd_bytealign (w3[0], w3[1], offset); w7[1] = amd_bytealign (w2[3], w3[0], offset); w7[0] = amd_bytealign (w2[2], w2[3], offset); w6[3] = amd_bytealign (w2[1], w2[2], offset); w6[2] = amd_bytealign (w2[0], w2[1], offset); w6[1] = amd_bytealign (w1[3], w2[0], offset); w6[0] = amd_bytealign (w1[2], w1[3], offset); w5[3] = amd_bytealign (w1[1], w1[2], offset); w5[2] = amd_bytealign (w1[0], w1[1], offset); w5[1] = amd_bytealign (w0[3], w1[0], offset); w5[0] = amd_bytealign (w0[2], w0[3], offset); w4[3] = amd_bytealign (w0[1], w0[2], offset); w4[2] = amd_bytealign (w0[0], w0[1], offset); w4[1] = amd_bytealign ( 0, w0[0], offset); w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 18: w7[3] = amd_bytealign (w3[0], w3[1], offset); w7[2] = amd_bytealign (w2[3], w3[0], offset); w7[1] = amd_bytealign (w2[2], w2[3], offset); w7[0] = amd_bytealign (w2[1], w2[2], offset); w6[3] = amd_bytealign (w2[0], w2[1], offset); w6[2] = amd_bytealign (w1[3], w2[0], offset); w6[1] = amd_bytealign (w1[2], w1[3], offset); w6[0] = amd_bytealign (w1[1], w1[2], offset); w5[3] = amd_bytealign (w1[0], w1[1], offset); w5[2] = amd_bytealign (w0[3], w1[0], offset); w5[1] = amd_bytealign (w0[2], w0[3], offset); w5[0] = amd_bytealign (w0[1], w0[2], offset); w4[3] = amd_bytealign (w0[0], w0[1], offset); w4[2] = amd_bytealign ( 0, w0[0], offset); w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 19: w7[3] = amd_bytealign (w2[3], w3[0], offset); w7[2] = amd_bytealign (w2[2], w2[3], offset); w7[1] = amd_bytealign (w2[1], w2[2], offset); w7[0] = amd_bytealign (w2[0], w2[1], offset); w6[3] = amd_bytealign (w1[3], w2[0], offset); w6[2] = amd_bytealign (w1[2], w1[3], offset); w6[1] = amd_bytealign (w1[1], w1[2], offset); w6[0] = amd_bytealign (w1[0], w1[1], offset); w5[3] = amd_bytealign (w0[3], w1[0], offset); w5[2] = amd_bytealign (w0[2], w0[3], offset); w5[1] = amd_bytealign (w0[1], w0[2], offset); w5[0] = amd_bytealign (w0[0], w0[1], offset); w4[3] = amd_bytealign ( 0, w0[0], offset); w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 20: w7[3] = amd_bytealign (w2[2], w2[3], offset); w7[2] = amd_bytealign (w2[1], w2[2], offset); w7[1] = amd_bytealign (w2[0], w2[1], offset); w7[0] = amd_bytealign (w1[3], w2[0], offset); w6[3] = amd_bytealign (w1[2], w1[3], offset); w6[2] = amd_bytealign (w1[1], w1[2], offset); w6[1] = amd_bytealign (w1[0], w1[1], offset); w6[0] = amd_bytealign (w0[3], w1[0], offset); w5[3] = amd_bytealign (w0[2], w0[3], offset); w5[2] = amd_bytealign (w0[1], w0[2], offset); w5[1] = amd_bytealign (w0[0], w0[1], offset); w5[0] = amd_bytealign ( 0, w0[0], offset); w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 21: w7[3] = amd_bytealign (w2[1], w2[2], offset); w7[2] = amd_bytealign (w2[0], w2[1], offset); w7[1] = amd_bytealign (w1[3], w2[0], offset); w7[0] = amd_bytealign (w1[2], w1[3], offset); w6[3] = amd_bytealign (w1[1], w1[2], offset); w6[2] = amd_bytealign (w1[0], w1[1], offset); w6[1] = amd_bytealign (w0[3], w1[0], offset); w6[0] = amd_bytealign (w0[2], w0[3], offset); w5[3] = amd_bytealign (w0[1], w0[2], offset); w5[2] = amd_bytealign (w0[0], w0[1], offset); w5[1] = amd_bytealign ( 0, w0[0], offset); w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 22: w7[3] = amd_bytealign (w2[0], w2[1], offset); w7[2] = amd_bytealign (w1[3], w2[0], offset); w7[1] = amd_bytealign (w1[2], w1[3], offset); w7[0] = amd_bytealign (w1[1], w1[2], offset); w6[3] = amd_bytealign (w1[0], w1[1], offset); w6[2] = amd_bytealign (w0[3], w1[0], offset); w6[1] = amd_bytealign (w0[2], w0[3], offset); w6[0] = amd_bytealign (w0[1], w0[2], offset); w5[3] = amd_bytealign (w0[0], w0[1], offset); w5[2] = amd_bytealign ( 0, w0[0], offset); w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 23: w7[3] = amd_bytealign (w1[3], w2[0], offset); w7[2] = amd_bytealign (w1[2], w1[3], offset); w7[1] = amd_bytealign (w1[1], w1[2], offset); w7[0] = amd_bytealign (w1[0], w1[1], offset); w6[3] = amd_bytealign (w0[3], w1[0], offset); w6[2] = amd_bytealign (w0[2], w0[3], offset); w6[1] = amd_bytealign (w0[1], w0[2], offset); w6[0] = amd_bytealign (w0[0], w0[1], offset); w5[3] = amd_bytealign ( 0, w0[0], offset); w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 24: w7[3] = amd_bytealign (w1[2], w1[3], offset); w7[2] = amd_bytealign (w1[1], w1[2], offset); w7[1] = amd_bytealign (w1[0], w1[1], offset); w7[0] = amd_bytealign (w0[3], w1[0], offset); w6[3] = amd_bytealign (w0[2], w0[3], offset); w6[2] = amd_bytealign (w0[1], w0[2], offset); w6[1] = amd_bytealign (w0[0], w0[1], offset); w6[0] = amd_bytealign ( 0, w0[0], offset); w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 25: w7[3] = amd_bytealign (w1[1], w1[2], offset); w7[2] = amd_bytealign (w1[0], w1[1], offset); w7[1] = amd_bytealign (w0[3], w1[0], offset); w7[0] = amd_bytealign (w0[2], w0[3], offset); w6[3] = amd_bytealign (w0[1], w0[2], offset); w6[2] = amd_bytealign (w0[0], w0[1], offset); w6[1] = amd_bytealign ( 0, w0[0], offset); w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 26: w7[3] = amd_bytealign (w1[0], w1[1], offset); w7[2] = amd_bytealign (w0[3], w1[0], offset); w7[1] = amd_bytealign (w0[2], w0[3], offset); w7[0] = amd_bytealign (w0[1], w0[2], offset); w6[3] = amd_bytealign (w0[0], w0[1], offset); w6[2] = amd_bytealign ( 0, w0[0], offset); w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 27: w7[3] = amd_bytealign (w0[3], w1[0], offset); w7[2] = amd_bytealign (w0[2], w0[3], offset); w7[1] = amd_bytealign (w0[1], w0[2], offset); w7[0] = amd_bytealign (w0[0], w0[1], offset); w6[3] = amd_bytealign ( 0, w0[0], offset); w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 28: w7[3] = amd_bytealign (w0[2], w0[3], offset); w7[2] = amd_bytealign (w0[1], w0[2], offset); w7[1] = amd_bytealign (w0[0], w0[1], offset); w7[0] = amd_bytealign ( 0, w0[0], offset); w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 29: w7[3] = amd_bytealign (w0[1], w0[2], offset); w7[2] = amd_bytealign (w0[0], w0[1], offset); w7[1] = amd_bytealign ( 0, w0[0], offset); w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 30: w7[3] = amd_bytealign (w0[0], w0[1], offset); w7[2] = amd_bytealign ( 0, w0[0], offset); w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 31: w7[3] = amd_bytealign ( 0, w0[0], offset); w7[2] = 0; w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; } w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); w4[0] = swap32 (w4[0]); w4[1] = swap32 (w4[1]); w4[2] = swap32 (w4[2]); w4[3] = swap32 (w4[3]); w5[0] = swap32 (w5[0]); w5[1] = swap32 (w5[1]); w5[2] = swap32 (w5[2]); w5[3] = swap32 (w5[3]); w6[0] = swap32 (w6[0]); w6[1] = swap32 (w6[1]); w6[2] = swap32 (w6[2]); w6[3] = swap32 (w6[3]); w7[0] = swap32 (w7[0]); w7[1] = swap32 (w7[1]); w7[2] = swap32 (w7[2]); w7[3] = swap32 (w7[3]); #endif #if (defined IS_AMD && AMD_GCN >= 3) || defined IS_NV #if defined IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; #endif #if defined IS_AMD const int selector = 0x0706050403020100 >> (offset_minus_4 * 8); #endif switch (offset_switch) { case 0: w7[3] = __byte_perm (w7[2], w7[3], selector); w7[2] = __byte_perm (w7[1], w7[2], selector); w7[1] = __byte_perm (w7[0], w7[1], selector); w7[0] = __byte_perm (w6[3], w7[0], selector); w6[3] = __byte_perm (w6[2], w6[3], selector); w6[2] = __byte_perm (w6[1], w6[2], selector); w6[1] = __byte_perm (w6[0], w6[1], selector); w6[0] = __byte_perm (w5[3], w6[0], selector); w5[3] = __byte_perm (w5[2], w5[3], selector); w5[2] = __byte_perm (w5[1], w5[2], selector); w5[1] = __byte_perm (w5[0], w5[1], selector); w5[0] = __byte_perm (w4[3], w5[0], selector); w4[3] = __byte_perm (w4[2], w4[3], selector); w4[2] = __byte_perm (w4[1], w4[2], selector); w4[1] = __byte_perm (w4[0], w4[1], selector); w4[0] = __byte_perm (w3[3], w4[0], selector); w3[3] = __byte_perm (w3[2], w3[3], selector); w3[2] = __byte_perm (w3[1], w3[2], selector); 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: w7[3] = __byte_perm (w7[1], w7[2], selector); w7[2] = __byte_perm (w7[0], w7[1], selector); w7[1] = __byte_perm (w6[3], w7[0], selector); w7[0] = __byte_perm (w6[2], w6[3], selector); w6[3] = __byte_perm (w6[1], w6[2], selector); w6[2] = __byte_perm (w6[0], w6[1], selector); w6[1] = __byte_perm (w5[3], w6[0], selector); w6[0] = __byte_perm (w5[2], w5[3], selector); w5[3] = __byte_perm (w5[1], w5[2], selector); w5[2] = __byte_perm (w5[0], w5[1], selector); w5[1] = __byte_perm (w4[3], w5[0], selector); w5[0] = __byte_perm (w4[2], w4[3], selector); w4[3] = __byte_perm (w4[1], w4[2], selector); w4[2] = __byte_perm (w4[0], w4[1], selector); w4[1] = __byte_perm (w3[3], w4[0], selector); w4[0] = __byte_perm (w3[2], w3[3], selector); w3[3] = __byte_perm (w3[1], w3[2], selector); w3[2] = __byte_perm (w3[0], w3[1], selector); 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: w7[3] = __byte_perm (w7[0], w7[1], selector); w7[2] = __byte_perm (w6[3], w7[0], selector); w7[1] = __byte_perm (w6[2], w6[3], selector); w7[0] = __byte_perm (w6[1], w6[2], selector); w6[3] = __byte_perm (w6[0], w6[1], selector); w6[2] = __byte_perm (w5[3], w6[0], selector); w6[1] = __byte_perm (w5[2], w5[3], selector); w6[0] = __byte_perm (w5[1], w5[2], selector); w5[3] = __byte_perm (w5[0], w5[1], selector); w5[2] = __byte_perm (w4[3], w5[0], selector); w5[1] = __byte_perm (w4[2], w4[3], selector); w5[0] = __byte_perm (w4[1], w4[2], selector); w4[3] = __byte_perm (w4[0], w4[1], selector); w4[2] = __byte_perm (w3[3], w4[0], selector); w4[1] = __byte_perm (w3[2], w3[3], selector); w4[0] = __byte_perm (w3[1], w3[2], selector); w3[3] = __byte_perm (w3[0], w3[1], selector); w3[2] = __byte_perm (w2[3], w3[0], selector); 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: w7[3] = __byte_perm (w6[3], w7[0], selector); w7[2] = __byte_perm (w6[2], w6[3], selector); w7[1] = __byte_perm (w6[1], w6[2], selector); w7[0] = __byte_perm (w6[0], w6[1], selector); w6[3] = __byte_perm (w5[3], w6[0], selector); w6[2] = __byte_perm (w5[2], w5[3], selector); w6[1] = __byte_perm (w5[1], w5[2], selector); w6[0] = __byte_perm (w5[0], w5[1], selector); w5[3] = __byte_perm (w4[3], w5[0], selector); w5[2] = __byte_perm (w4[2], w4[3], selector); w5[1] = __byte_perm (w4[1], w4[2], selector); w5[0] = __byte_perm (w4[0], w4[1], selector); w4[3] = __byte_perm (w3[3], w4[0], selector); w4[2] = __byte_perm (w3[2], w3[3], selector); w4[1] = __byte_perm (w3[1], w3[2], selector); w4[0] = __byte_perm (w3[0], w3[1], selector); w3[3] = __byte_perm (w2[3], w3[0], selector); w3[2] = __byte_perm (w2[2], w2[3], selector); 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: w7[3] = __byte_perm (w6[2], w6[3], selector); w7[2] = __byte_perm (w6[1], w6[2], selector); w7[1] = __byte_perm (w6[0], w6[1], selector); w7[0] = __byte_perm (w5[3], w6[0], selector); w6[3] = __byte_perm (w5[2], w5[3], selector); w6[2] = __byte_perm (w5[1], w5[2], selector); w6[1] = __byte_perm (w5[0], w5[1], selector); w6[0] = __byte_perm (w4[3], w5[0], selector); w5[3] = __byte_perm (w4[2], w4[3], selector); w5[2] = __byte_perm (w4[1], w4[2], selector); w5[1] = __byte_perm (w4[0], w4[1], selector); w5[0] = __byte_perm (w3[3], w4[0], selector); w4[3] = __byte_perm (w3[2], w3[3], selector); w4[2] = __byte_perm (w3[1], w3[2], selector); w4[1] = __byte_perm (w3[0], w3[1], selector); w4[0] = __byte_perm (w2[3], w3[0], selector); w3[3] = __byte_perm (w2[2], w2[3], selector); w3[2] = __byte_perm (w2[1], w2[2], selector); 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: w7[3] = __byte_perm (w6[1], w6[2], selector); w7[2] = __byte_perm (w6[0], w6[1], selector); w7[1] = __byte_perm (w5[3], w6[0], selector); w7[0] = __byte_perm (w5[2], w5[3], selector); w6[3] = __byte_perm (w5[1], w5[2], selector); w6[2] = __byte_perm (w5[0], w5[1], selector); w6[1] = __byte_perm (w4[3], w5[0], selector); w6[0] = __byte_perm (w4[2], w4[3], selector); w5[3] = __byte_perm (w4[1], w4[2], selector); w5[2] = __byte_perm (w4[0], w4[1], selector); w5[1] = __byte_perm (w3[3], w4[0], selector); w5[0] = __byte_perm (w3[2], w3[3], selector); w4[3] = __byte_perm (w3[1], w3[2], selector); w4[2] = __byte_perm (w3[0], w3[1], selector); w4[1] = __byte_perm (w2[3], w3[0], selector); w4[0] = __byte_perm (w2[2], w2[3], selector); w3[3] = __byte_perm (w2[1], w2[2], selector); w3[2] = __byte_perm (w2[0], w2[1], selector); 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: w7[3] = __byte_perm (w6[0], w6[1], selector); w7[2] = __byte_perm (w5[3], w6[0], selector); w7[1] = __byte_perm (w5[2], w5[3], selector); w7[0] = __byte_perm (w5[1], w5[2], selector); w6[3] = __byte_perm (w5[0], w5[1], selector); w6[2] = __byte_perm (w4[3], w5[0], selector); w6[1] = __byte_perm (w4[2], w4[3], selector); w6[0] = __byte_perm (w4[1], w4[2], selector); w5[3] = __byte_perm (w4[0], w4[1], selector); w5[2] = __byte_perm (w3[3], w4[0], selector); w5[1] = __byte_perm (w3[2], w3[3], selector); w5[0] = __byte_perm (w3[1], w3[2], selector); w4[3] = __byte_perm (w3[0], w3[1], selector); w4[2] = __byte_perm (w2[3], w3[0], selector); w4[1] = __byte_perm (w2[2], w2[3], selector); w4[0] = __byte_perm (w2[1], w2[2], selector); w3[3] = __byte_perm (w2[0], w2[1], selector); w3[2] = __byte_perm (w1[3], w2[0], selector); 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: w7[3] = __byte_perm (w5[3], w6[0], selector); w7[2] = __byte_perm (w5[2], w5[3], selector); w7[1] = __byte_perm (w5[1], w5[2], selector); w7[0] = __byte_perm (w5[0], w5[1], selector); w6[3] = __byte_perm (w4[3], w5[0], selector); w6[2] = __byte_perm (w4[2], w4[3], selector); w6[1] = __byte_perm (w4[1], w4[2], selector); w6[0] = __byte_perm (w4[0], w4[1], selector); w5[3] = __byte_perm (w3[3], w4[0], selector); w5[2] = __byte_perm (w3[2], w3[3], selector); w5[1] = __byte_perm (w3[1], w3[2], selector); w5[0] = __byte_perm (w3[0], w3[1], selector); w4[3] = __byte_perm (w2[3], w3[0], selector); w4[2] = __byte_perm (w2[2], w2[3], selector); w4[1] = __byte_perm (w2[1], w2[2], selector); w4[0] = __byte_perm (w2[0], w2[1], selector); w3[3] = __byte_perm (w1[3], w2[0], selector); w3[2] = __byte_perm (w1[2], w1[3], selector); 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: w7[3] = __byte_perm (w5[2], w5[3], selector); w7[2] = __byte_perm (w5[1], w5[2], selector); w7[1] = __byte_perm (w5[0], w5[1], selector); w7[0] = __byte_perm (w4[3], w5[0], selector); w6[3] = __byte_perm (w4[2], w4[3], selector); w6[2] = __byte_perm (w4[1], w4[2], selector); w6[1] = __byte_perm (w4[0], w4[1], selector); w6[0] = __byte_perm (w3[3], w4[0], selector); w5[3] = __byte_perm (w3[2], w3[3], selector); w5[2] = __byte_perm (w3[1], w3[2], selector); w5[1] = __byte_perm (w3[0], w3[1], selector); w5[0] = __byte_perm (w2[3], w3[0], selector); w4[3] = __byte_perm (w2[2], w2[3], selector); w4[2] = __byte_perm (w2[1], w2[2], selector); w4[1] = __byte_perm (w2[0], w2[1], selector); w4[0] = __byte_perm (w1[3], w2[0], selector); w3[3] = __byte_perm (w1[2], w1[3], selector); w3[2] = __byte_perm (w1[1], w1[2], selector); 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: w7[3] = __byte_perm (w5[1], w5[2], selector); w7[2] = __byte_perm (w5[0], w5[1], selector); w7[1] = __byte_perm (w4[3], w5[0], selector); w7[0] = __byte_perm (w4[2], w4[3], selector); w6[3] = __byte_perm (w4[1], w4[2], selector); w6[2] = __byte_perm (w4[0], w4[1], selector); w6[1] = __byte_perm (w3[3], w4[0], selector); w6[0] = __byte_perm (w3[2], w3[3], selector); w5[3] = __byte_perm (w3[1], w3[2], selector); w5[2] = __byte_perm (w3[0], w3[1], selector); w5[1] = __byte_perm (w2[3], w3[0], selector); w5[0] = __byte_perm (w2[2], w2[3], selector); w4[3] = __byte_perm (w2[1], w2[2], selector); w4[2] = __byte_perm (w2[0], w2[1], selector); w4[1] = __byte_perm (w1[3], w2[0], selector); w4[0] = __byte_perm (w1[2], w1[3], selector); w3[3] = __byte_perm (w1[1], w1[2], selector); w3[2] = __byte_perm (w1[0], w1[1], selector); 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: w7[3] = __byte_perm (w5[0], w5[1], selector); w7[2] = __byte_perm (w4[3], w5[0], selector); w7[1] = __byte_perm (w4[2], w4[3], selector); w7[0] = __byte_perm (w4[1], w4[2], selector); w6[3] = __byte_perm (w4[0], w4[1], selector); w6[2] = __byte_perm (w3[3], w4[0], selector); w6[1] = __byte_perm (w3[2], w3[3], selector); w6[0] = __byte_perm (w3[1], w3[2], selector); w5[3] = __byte_perm (w3[0], w3[1], selector); w5[2] = __byte_perm (w2[3], w3[0], selector); w5[1] = __byte_perm (w2[2], w2[3], selector); w5[0] = __byte_perm (w2[1], w2[2], selector); w4[3] = __byte_perm (w2[0], w2[1], selector); w4[2] = __byte_perm (w1[3], w2[0], selector); w4[1] = __byte_perm (w1[2], w1[3], selector); w4[0] = __byte_perm (w1[1], w1[2], selector); w3[3] = __byte_perm (w1[0], w1[1], selector); w3[2] = __byte_perm (w0[3], w1[0], selector); 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: w7[3] = __byte_perm (w4[3], w5[0], selector); w7[2] = __byte_perm (w4[2], w4[3], selector); w7[1] = __byte_perm (w4[1], w4[2], selector); w7[0] = __byte_perm (w4[0], w4[1], selector); w6[3] = __byte_perm (w3[3], w4[0], selector); w6[2] = __byte_perm (w3[2], w3[3], selector); w6[1] = __byte_perm (w3[1], w3[2], selector); w6[0] = __byte_perm (w3[0], w3[1], selector); w5[3] = __byte_perm (w2[3], w3[0], selector); w5[2] = __byte_perm (w2[2], w2[3], selector); w5[1] = __byte_perm (w2[1], w2[2], selector); w5[0] = __byte_perm (w2[0], w2[1], selector); w4[3] = __byte_perm (w1[3], w2[0], selector); w4[2] = __byte_perm (w1[2], w1[3], selector); w4[1] = __byte_perm (w1[1], w1[2], selector); w4[0] = __byte_perm (w1[0], w1[1], selector); w3[3] = __byte_perm (w0[3], w1[0], selector); w3[2] = __byte_perm (w0[2], w0[3], selector); 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: w7[3] = __byte_perm (w4[2], w4[3], selector); w7[2] = __byte_perm (w4[1], w4[2], selector); w7[1] = __byte_perm (w4[0], w4[1], selector); w7[0] = __byte_perm (w3[3], w4[0], selector); w6[3] = __byte_perm (w3[2], w3[3], selector); w6[2] = __byte_perm (w3[1], w3[2], selector); w6[1] = __byte_perm (w3[0], w3[1], selector); w6[0] = __byte_perm (w2[3], w3[0], selector); w5[3] = __byte_perm (w2[2], w2[3], selector); w5[2] = __byte_perm (w2[1], w2[2], selector); w5[1] = __byte_perm (w2[0], w2[1], selector); w5[0] = __byte_perm (w1[3], w2[0], selector); w4[3] = __byte_perm (w1[2], w1[3], selector); w4[2] = __byte_perm (w1[1], w1[2], selector); w4[1] = __byte_perm (w1[0], w1[1], selector); w4[0] = __byte_perm (w0[3], w1[0], selector); w3[3] = __byte_perm (w0[2], w0[3], selector); w3[2] = __byte_perm (w0[1], w0[2], selector); 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: w7[3] = __byte_perm (w4[1], w4[2], selector); w7[2] = __byte_perm (w4[0], w4[1], selector); w7[1] = __byte_perm (w3[3], w4[0], selector); w7[0] = __byte_perm (w3[2], w3[3], selector); w6[3] = __byte_perm (w3[1], w3[2], selector); w6[2] = __byte_perm (w3[0], w3[1], selector); w6[1] = __byte_perm (w2[3], w3[0], selector); w6[0] = __byte_perm (w2[2], w2[3], selector); w5[3] = __byte_perm (w2[1], w2[2], selector); w5[2] = __byte_perm (w2[0], w2[1], selector); w5[1] = __byte_perm (w1[3], w2[0], selector); w5[0] = __byte_perm (w1[2], w1[3], selector); w4[3] = __byte_perm (w1[1], w1[2], selector); w4[2] = __byte_perm (w1[0], w1[1], selector); w4[1] = __byte_perm (w0[3], w1[0], selector); w4[0] = __byte_perm (w0[2], w0[3], selector); w3[3] = __byte_perm (w0[1], w0[2], selector); w3[2] = __byte_perm (w0[0], w0[1], selector); 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; case 14: w7[3] = __byte_perm (w4[0], w4[1], selector); w7[2] = __byte_perm (w3[3], w4[0], selector); w7[1] = __byte_perm (w3[2], w3[3], selector); w7[0] = __byte_perm (w3[1], w3[2], selector); w6[3] = __byte_perm (w3[0], w3[1], selector); w6[2] = __byte_perm (w2[3], w3[0], selector); w6[1] = __byte_perm (w2[2], w2[3], selector); w6[0] = __byte_perm (w2[1], w2[2], selector); w5[3] = __byte_perm (w2[0], w2[1], selector); w5[2] = __byte_perm (w1[3], w2[0], selector); w5[1] = __byte_perm (w1[2], w1[3], selector); w5[0] = __byte_perm (w1[1], w1[2], selector); w4[3] = __byte_perm (w1[0], w1[1], selector); w4[2] = __byte_perm (w0[3], w1[0], selector); w4[1] = __byte_perm (w0[2], w0[3], selector); w4[0] = __byte_perm (w0[1], w0[2], selector); w3[3] = __byte_perm (w0[0], w0[1], selector); w3[2] = __byte_perm ( 0, w0[0], selector); w3[1] = 0; 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; case 15: w7[3] = __byte_perm (w3[3], w4[0], selector); w7[2] = __byte_perm (w3[2], w3[3], selector); w7[1] = __byte_perm (w3[1], w3[2], selector); w7[0] = __byte_perm (w3[0], w3[1], selector); w6[3] = __byte_perm (w2[3], w3[0], selector); w6[2] = __byte_perm (w2[2], w2[3], selector); w6[1] = __byte_perm (w2[1], w2[2], selector); w6[0] = __byte_perm (w2[0], w2[1], selector); w5[3] = __byte_perm (w1[3], w2[0], selector); w5[2] = __byte_perm (w1[2], w1[3], selector); w5[1] = __byte_perm (w1[1], w1[2], selector); w5[0] = __byte_perm (w1[0], w1[1], selector); w4[3] = __byte_perm (w0[3], w1[0], selector); w4[2] = __byte_perm (w0[2], w0[3], selector); w4[1] = __byte_perm (w0[1], w0[2], selector); w4[0] = __byte_perm (w0[0], w0[1], selector); w3[3] = __byte_perm ( 0, w0[0], selector); w3[2] = 0; w3[1] = 0; 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 } void switch_buffer_by_offset_8x4_be (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) { #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if (defined IS_AMD && AMD_GCN < 3) || defined IS_GENERIC switch (offset_switch) { case 0: w7[3] = amd_bytealign (w7[2], w7[3], offset); w7[2] = amd_bytealign (w7[1], w7[2], offset); w7[1] = amd_bytealign (w7[0], w7[1], offset); w7[0] = amd_bytealign (w6[3], w7[0], offset); w6[3] = amd_bytealign (w6[2], w6[3], offset); w6[2] = amd_bytealign (w6[1], w6[2], offset); w6[1] = amd_bytealign (w6[0], w6[1], offset); w6[0] = amd_bytealign (w5[3], w6[0], offset); w5[3] = amd_bytealign (w5[2], w5[3], offset); w5[2] = amd_bytealign (w5[1], w5[2], offset); w5[1] = amd_bytealign (w5[0], w5[1], offset); w5[0] = amd_bytealign (w4[3], w5[0], offset); w4[3] = amd_bytealign (w4[2], w4[3], offset); w4[2] = amd_bytealign (w4[1], w4[2], offset); w4[1] = amd_bytealign (w4[0], w4[1], offset); w4[0] = amd_bytealign (w3[3], w4[0], offset); w3[3] = amd_bytealign (w3[2], w3[3], offset); w3[2] = amd_bytealign (w3[1], w3[2], 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: w7[3] = amd_bytealign (w7[1], w7[2], offset); w7[2] = amd_bytealign (w7[0], w7[1], offset); w7[1] = amd_bytealign (w6[3], w7[0], offset); w7[0] = amd_bytealign (w6[2], w6[3], offset); w6[3] = amd_bytealign (w6[1], w6[2], offset); w6[2] = amd_bytealign (w6[0], w6[1], offset); w6[1] = amd_bytealign (w5[3], w6[0], offset); w6[0] = amd_bytealign (w5[2], w5[3], offset); w5[3] = amd_bytealign (w5[1], w5[2], offset); w5[2] = amd_bytealign (w5[0], w5[1], offset); w5[1] = amd_bytealign (w4[3], w5[0], offset); w5[0] = amd_bytealign (w4[2], w4[3], offset); w4[3] = amd_bytealign (w4[1], w4[2], offset); w4[2] = amd_bytealign (w4[0], w4[1], offset); w4[1] = amd_bytealign (w3[3], w4[0], offset); w4[0] = amd_bytealign (w3[2], w3[3], offset); w3[3] = amd_bytealign (w3[1], w3[2], offset); w3[2] = amd_bytealign (w3[0], w3[1], 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: w7[3] = amd_bytealign (w7[0], w7[1], offset); w7[2] = amd_bytealign (w6[3], w7[0], offset); w7[1] = amd_bytealign (w6[2], w6[3], offset); w7[0] = amd_bytealign (w6[1], w6[2], offset); w6[3] = amd_bytealign (w6[0], w6[1], offset); w6[2] = amd_bytealign (w5[3], w6[0], offset); w6[1] = amd_bytealign (w5[2], w5[3], offset); w6[0] = amd_bytealign (w5[1], w5[2], offset); w5[3] = amd_bytealign (w5[0], w5[1], offset); w5[2] = amd_bytealign (w4[3], w5[0], offset); w5[1] = amd_bytealign (w4[2], w4[3], offset); w5[0] = amd_bytealign (w4[1], w4[2], offset); w4[3] = amd_bytealign (w4[0], w4[1], offset); w4[2] = amd_bytealign (w3[3], w4[0], offset); w4[1] = amd_bytealign (w3[2], w3[3], offset); w4[0] = amd_bytealign (w3[1], w3[2], offset); w3[3] = amd_bytealign (w3[0], w3[1], offset); w3[2] = amd_bytealign (w2[3], w3[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: w7[3] = amd_bytealign (w6[3], w7[0], offset); w7[2] = amd_bytealign (w6[2], w6[3], offset); w7[1] = amd_bytealign (w6[1], w6[2], offset); w7[0] = amd_bytealign (w6[0], w6[1], offset); w6[3] = amd_bytealign (w5[3], w6[0], offset); w6[2] = amd_bytealign (w5[2], w5[3], offset); w6[1] = amd_bytealign (w5[1], w5[2], offset); w6[0] = amd_bytealign (w5[0], w5[1], offset); w5[3] = amd_bytealign (w4[3], w5[0], offset); w5[2] = amd_bytealign (w4[2], w4[3], offset); w5[1] = amd_bytealign (w4[1], w4[2], offset); w5[0] = amd_bytealign (w4[0], w4[1], offset); w4[3] = amd_bytealign (w3[3], w4[0], offset); w4[2] = amd_bytealign (w3[2], w3[3], offset); w4[1] = amd_bytealign (w3[1], w3[2], offset); w4[0] = amd_bytealign (w3[0], w3[1], offset); w3[3] = amd_bytealign (w2[3], w3[0], offset); w3[2] = amd_bytealign (w2[2], w2[3], 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: w7[3] = amd_bytealign (w6[2], w6[3], offset); w7[2] = amd_bytealign (w6[1], w6[2], offset); w7[1] = amd_bytealign (w6[0], w6[1], offset); w7[0] = amd_bytealign (w5[3], w6[0], offset); w6[3] = amd_bytealign (w5[2], w5[3], offset); w6[2] = amd_bytealign (w5[1], w5[2], offset); w6[1] = amd_bytealign (w5[0], w5[1], offset); w6[0] = amd_bytealign (w4[3], w5[0], offset); w5[3] = amd_bytealign (w4[2], w4[3], offset); w5[2] = amd_bytealign (w4[1], w4[2], offset); w5[1] = amd_bytealign (w4[0], w4[1], offset); w5[0] = amd_bytealign (w3[3], w4[0], offset); w4[3] = amd_bytealign (w3[2], w3[3], offset); w4[2] = amd_bytealign (w3[1], w3[2], offset); w4[1] = amd_bytealign (w3[0], w3[1], offset); w4[0] = amd_bytealign (w2[3], w3[0], offset); w3[3] = amd_bytealign (w2[2], w2[3], offset); w3[2] = amd_bytealign (w2[1], w2[2], 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: w7[3] = amd_bytealign (w6[1], w6[2], offset); w7[2] = amd_bytealign (w6[0], w6[1], offset); w7[1] = amd_bytealign (w5[3], w6[0], offset); w7[0] = amd_bytealign (w5[2], w5[3], offset); w6[3] = amd_bytealign (w5[1], w5[2], offset); w6[2] = amd_bytealign (w5[0], w5[1], offset); w6[1] = amd_bytealign (w4[3], w5[0], offset); w6[0] = amd_bytealign (w4[2], w4[3], offset); w5[3] = amd_bytealign (w4[1], w4[2], offset); w5[2] = amd_bytealign (w4[0], w4[1], offset); w5[1] = amd_bytealign (w3[3], w4[0], offset); w5[0] = amd_bytealign (w3[2], w3[3], offset); w4[3] = amd_bytealign (w3[1], w3[2], offset); w4[2] = amd_bytealign (w3[0], w3[1], offset); w4[1] = amd_bytealign (w2[3], w3[0], offset); w4[0] = amd_bytealign (w2[2], w2[3], offset); w3[3] = amd_bytealign (w2[1], w2[2], offset); w3[2] = amd_bytealign (w2[0], w2[1], 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: w7[3] = amd_bytealign (w6[0], w6[1], offset); w7[2] = amd_bytealign (w5[3], w6[0], offset); w7[1] = amd_bytealign (w5[2], w5[3], offset); w7[0] = amd_bytealign (w5[1], w5[2], offset); w6[3] = amd_bytealign (w5[0], w5[1], offset); w6[2] = amd_bytealign (w4[3], w5[0], offset); w6[1] = amd_bytealign (w4[2], w4[3], offset); w6[0] = amd_bytealign (w4[1], w4[2], offset); w5[3] = amd_bytealign (w4[0], w4[1], offset); w5[2] = amd_bytealign (w3[3], w4[0], offset); w5[1] = amd_bytealign (w3[2], w3[3], offset); w5[0] = amd_bytealign (w3[1], w3[2], offset); w4[3] = amd_bytealign (w3[0], w3[1], offset); w4[2] = amd_bytealign (w2[3], w3[0], offset); w4[1] = amd_bytealign (w2[2], w2[3], offset); w4[0] = amd_bytealign (w2[1], w2[2], offset); w3[3] = amd_bytealign (w2[0], w2[1], offset); w3[2] = amd_bytealign (w1[3], w2[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: w7[3] = amd_bytealign (w5[3], w6[0], offset); w7[2] = amd_bytealign (w5[2], w5[3], offset); w7[1] = amd_bytealign (w5[1], w5[2], offset); w7[0] = amd_bytealign (w5[0], w5[1], offset); w6[3] = amd_bytealign (w4[3], w5[0], offset); w6[2] = amd_bytealign (w4[2], w4[3], offset); w6[1] = amd_bytealign (w4[1], w4[2], offset); w6[0] = amd_bytealign (w4[0], w4[1], offset); w5[3] = amd_bytealign (w3[3], w4[0], offset); w5[2] = amd_bytealign (w3[2], w3[3], offset); w5[1] = amd_bytealign (w3[1], w3[2], offset); w5[0] = amd_bytealign (w3[0], w3[1], offset); w4[3] = amd_bytealign (w2[3], w3[0], offset); w4[2] = amd_bytealign (w2[2], w2[3], offset); w4[1] = amd_bytealign (w2[1], w2[2], offset); w4[0] = amd_bytealign (w2[0], w2[1], offset); w3[3] = amd_bytealign (w1[3], w2[0], offset); w3[2] = amd_bytealign (w1[2], w1[3], 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: w7[3] = amd_bytealign (w5[2], w5[3], offset); w7[2] = amd_bytealign (w5[1], w5[2], offset); w7[1] = amd_bytealign (w5[0], w5[1], offset); w7[0] = amd_bytealign (w4[3], w5[0], offset); w6[3] = amd_bytealign (w4[2], w4[3], offset); w6[2] = amd_bytealign (w4[1], w4[2], offset); w6[1] = amd_bytealign (w4[0], w4[1], offset); w6[0] = amd_bytealign (w3[3], w4[0], offset); w5[3] = amd_bytealign (w3[2], w3[3], offset); w5[2] = amd_bytealign (w3[1], w3[2], offset); w5[1] = amd_bytealign (w3[0], w3[1], offset); w5[0] = amd_bytealign (w2[3], w3[0], offset); w4[3] = amd_bytealign (w2[2], w2[3], offset); w4[2] = amd_bytealign (w2[1], w2[2], offset); w4[1] = amd_bytealign (w2[0], w2[1], offset); w4[0] = amd_bytealign (w1[3], w2[0], offset); w3[3] = amd_bytealign (w1[2], w1[3], offset); w3[2] = amd_bytealign (w1[1], w1[2], 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: w7[3] = amd_bytealign (w5[1], w5[2], offset); w7[2] = amd_bytealign (w5[0], w5[1], offset); w7[1] = amd_bytealign (w4[3], w5[0], offset); w7[0] = amd_bytealign (w4[2], w4[3], offset); w6[3] = amd_bytealign (w4[1], w4[2], offset); w6[2] = amd_bytealign (w4[0], w4[1], offset); w6[1] = amd_bytealign (w3[3], w4[0], offset); w6[0] = amd_bytealign (w3[2], w3[3], offset); w5[3] = amd_bytealign (w3[1], w3[2], offset); w5[2] = amd_bytealign (w3[0], w3[1], offset); w5[1] = amd_bytealign (w2[3], w3[0], offset); w5[0] = amd_bytealign (w2[2], w2[3], offset); w4[3] = amd_bytealign (w2[1], w2[2], offset); w4[2] = amd_bytealign (w2[0], w2[1], offset); w4[1] = amd_bytealign (w1[3], w2[0], offset); w4[0] = amd_bytealign (w1[2], w1[3], offset); w3[3] = amd_bytealign (w1[1], w1[2], offset); w3[2] = amd_bytealign (w1[0], w1[1], 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: w7[3] = amd_bytealign (w5[0], w5[1], offset); w7[2] = amd_bytealign (w4[3], w5[0], offset); w7[1] = amd_bytealign (w4[2], w4[3], offset); w7[0] = amd_bytealign (w4[1], w4[2], offset); w6[3] = amd_bytealign (w4[0], w4[1], offset); w6[2] = amd_bytealign (w3[3], w4[0], offset); w6[1] = amd_bytealign (w3[2], w3[3], offset); w6[0] = amd_bytealign (w3[1], w3[2], offset); w5[3] = amd_bytealign (w3[0], w3[1], offset); w5[2] = amd_bytealign (w2[3], w3[0], offset); w5[1] = amd_bytealign (w2[2], w2[3], offset); w5[0] = amd_bytealign (w2[1], w2[2], offset); w4[3] = amd_bytealign (w2[0], w2[1], offset); w4[2] = amd_bytealign (w1[3], w2[0], offset); w4[1] = amd_bytealign (w1[2], w1[3], offset); w4[0] = amd_bytealign (w1[1], w1[2], offset); w3[3] = amd_bytealign (w1[0], w1[1], offset); w3[2] = amd_bytealign (w0[3], w1[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: w7[3] = amd_bytealign (w4[3], w5[0], offset); w7[2] = amd_bytealign (w4[2], w4[3], offset); w7[1] = amd_bytealign (w4[1], w4[2], offset); w7[0] = amd_bytealign (w4[0], w4[1], offset); w6[3] = amd_bytealign (w3[3], w4[0], offset); w6[2] = amd_bytealign (w3[2], w3[3], offset); w6[1] = amd_bytealign (w3[1], w3[2], offset); w6[0] = amd_bytealign (w3[0], w3[1], offset); w5[3] = amd_bytealign (w2[3], w3[0], offset); w5[2] = amd_bytealign (w2[2], w2[3], offset); w5[1] = amd_bytealign (w2[1], w2[2], offset); w5[0] = amd_bytealign (w2[0], w2[1], offset); w4[3] = amd_bytealign (w1[3], w2[0], offset); w4[2] = amd_bytealign (w1[2], w1[3], offset); w4[1] = amd_bytealign (w1[1], w1[2], offset); w4[0] = amd_bytealign (w1[0], w1[1], offset); w3[3] = amd_bytealign (w0[3], w1[0], offset); w3[2] = amd_bytealign (w0[2], w0[3], 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: w7[3] = amd_bytealign (w4[2], w4[3], offset); w7[2] = amd_bytealign (w4[1], w4[2], offset); w7[1] = amd_bytealign (w4[0], w4[1], offset); w7[0] = amd_bytealign (w3[3], w4[0], offset); w6[3] = amd_bytealign (w3[2], w3[3], offset); w6[2] = amd_bytealign (w3[1], w3[2], offset); w6[1] = amd_bytealign (w3[0], w3[1], offset); w6[0] = amd_bytealign (w2[3], w3[0], offset); w5[3] = amd_bytealign (w2[2], w2[3], offset); w5[2] = amd_bytealign (w2[1], w2[2], offset); w5[1] = amd_bytealign (w2[0], w2[1], offset); w5[0] = amd_bytealign (w1[3], w2[0], offset); w4[3] = amd_bytealign (w1[2], w1[3], offset); w4[2] = amd_bytealign (w1[1], w1[2], offset); w4[1] = amd_bytealign (w1[0], w1[1], offset); w4[0] = amd_bytealign (w0[3], w1[0], offset); w3[3] = amd_bytealign (w0[2], w0[3], offset); w3[2] = amd_bytealign (w0[1], w0[2], 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: w7[3] = amd_bytealign (w4[1], w4[2], offset); w7[2] = amd_bytealign (w4[0], w4[1], offset); w7[1] = amd_bytealign (w3[3], w4[0], offset); w7[0] = amd_bytealign (w3[2], w3[3], offset); w6[3] = amd_bytealign (w3[1], w3[2], offset); w6[2] = amd_bytealign (w3[0], w3[1], offset); w6[1] = amd_bytealign (w2[3], w3[0], offset); w6[0] = amd_bytealign (w2[2], w2[3], offset); w5[3] = amd_bytealign (w2[1], w2[2], offset); w5[2] = amd_bytealign (w2[0], w2[1], offset); w5[1] = amd_bytealign (w1[3], w2[0], offset); w5[0] = amd_bytealign (w1[2], w1[3], offset); w4[3] = amd_bytealign (w1[1], w1[2], offset); w4[2] = amd_bytealign (w1[0], w1[1], offset); w4[1] = amd_bytealign (w0[3], w1[0], offset); w4[0] = amd_bytealign (w0[2], w0[3], offset); w3[3] = amd_bytealign (w0[1], w0[2], offset); w3[2] = amd_bytealign (w0[0], w0[1], 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; case 14: w7[3] = amd_bytealign (w4[0], w4[1], offset); w7[2] = amd_bytealign (w3[3], w4[0], offset); w7[1] = amd_bytealign (w3[2], w3[3], offset); w7[0] = amd_bytealign (w3[1], w3[2], offset); w6[3] = amd_bytealign (w3[0], w3[1], offset); w6[2] = amd_bytealign (w2[3], w3[0], offset); w6[1] = amd_bytealign (w2[2], w2[3], offset); w6[0] = amd_bytealign (w2[1], w2[2], offset); w5[3] = amd_bytealign (w2[0], w2[1], offset); w5[2] = amd_bytealign (w1[3], w2[0], offset); w5[1] = amd_bytealign (w1[2], w1[3], offset); w5[0] = amd_bytealign (w1[1], w1[2], offset); w4[3] = amd_bytealign (w1[0], w1[1], offset); w4[2] = amd_bytealign (w0[3], w1[0], offset); w4[1] = amd_bytealign (w0[2], w0[3], offset); w4[0] = amd_bytealign (w0[1], w0[2], offset); w3[3] = amd_bytealign (w0[0], w0[1], offset); w3[2] = amd_bytealign ( 0, w0[0], offset); w3[1] = 0; 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; case 15: w7[3] = amd_bytealign (w3[3], w4[0], offset); w7[2] = amd_bytealign (w3[2], w3[3], offset); w7[1] = amd_bytealign (w3[1], w3[2], offset); w7[0] = amd_bytealign (w3[0], w3[1], offset); w6[3] = amd_bytealign (w2[3], w3[0], offset); w6[2] = amd_bytealign (w2[2], w2[3], offset); w6[1] = amd_bytealign (w2[1], w2[2], offset); w6[0] = amd_bytealign (w2[0], w2[1], offset); w5[3] = amd_bytealign (w1[3], w2[0], offset); w5[2] = amd_bytealign (w1[2], w1[3], offset); w5[1] = amd_bytealign (w1[1], w1[2], offset); w5[0] = amd_bytealign (w1[0], w1[1], offset); w4[3] = amd_bytealign (w0[3], w1[0], offset); w4[2] = amd_bytealign (w0[2], w0[3], offset); w4[1] = amd_bytealign (w0[1], w0[2], offset); w4[0] = amd_bytealign (w0[0], w0[1], offset); w3[3] = amd_bytealign ( 0, w0[0], offset); w3[2] = 0; w3[1] = 0; 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; case 16: w7[3] = amd_bytealign (w3[2], w3[3], offset); w7[2] = amd_bytealign (w3[1], w3[2], offset); w7[1] = amd_bytealign (w3[0], w3[1], offset); w7[0] = amd_bytealign (w2[3], w3[0], offset); w6[3] = amd_bytealign (w2[2], w2[3], offset); w6[2] = amd_bytealign (w2[1], w2[2], offset); w6[1] = amd_bytealign (w2[0], w2[1], offset); w6[0] = amd_bytealign (w1[3], w2[0], offset); w5[3] = amd_bytealign (w1[2], w1[3], offset); w5[2] = amd_bytealign (w1[1], w1[2], offset); w5[1] = amd_bytealign (w1[0], w1[1], offset); w5[0] = amd_bytealign (w0[3], w1[0], offset); w4[3] = amd_bytealign (w0[2], w0[3], offset); w4[2] = amd_bytealign (w0[1], w0[2], offset); w4[1] = amd_bytealign (w0[0], w0[1], offset); w4[0] = amd_bytealign ( 0, w0[0], offset); w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 17: w7[3] = amd_bytealign (w3[1], w3[2], offset); w7[2] = amd_bytealign (w3[0], w3[1], offset); w7[1] = amd_bytealign (w2[3], w3[0], offset); w7[0] = amd_bytealign (w2[2], w2[3], offset); w6[3] = amd_bytealign (w2[1], w2[2], offset); w6[2] = amd_bytealign (w2[0], w2[1], offset); w6[1] = amd_bytealign (w1[3], w2[0], offset); w6[0] = amd_bytealign (w1[2], w1[3], offset); w5[3] = amd_bytealign (w1[1], w1[2], offset); w5[2] = amd_bytealign (w1[0], w1[1], offset); w5[1] = amd_bytealign (w0[3], w1[0], offset); w5[0] = amd_bytealign (w0[2], w0[3], offset); w4[3] = amd_bytealign (w0[1], w0[2], offset); w4[2] = amd_bytealign (w0[0], w0[1], offset); w4[1] = amd_bytealign ( 0, w0[0], offset); w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 18: w7[3] = amd_bytealign (w3[0], w3[1], offset); w7[2] = amd_bytealign (w2[3], w3[0], offset); w7[1] = amd_bytealign (w2[2], w2[3], offset); w7[0] = amd_bytealign (w2[1], w2[2], offset); w6[3] = amd_bytealign (w2[0], w2[1], offset); w6[2] = amd_bytealign (w1[3], w2[0], offset); w6[1] = amd_bytealign (w1[2], w1[3], offset); w6[0] = amd_bytealign (w1[1], w1[2], offset); w5[3] = amd_bytealign (w1[0], w1[1], offset); w5[2] = amd_bytealign (w0[3], w1[0], offset); w5[1] = amd_bytealign (w0[2], w0[3], offset); w5[0] = amd_bytealign (w0[1], w0[2], offset); w4[3] = amd_bytealign (w0[0], w0[1], offset); w4[2] = amd_bytealign ( 0, w0[0], offset); w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 19: w7[3] = amd_bytealign (w2[3], w3[0], offset); w7[2] = amd_bytealign (w2[2], w2[3], offset); w7[1] = amd_bytealign (w2[1], w2[2], offset); w7[0] = amd_bytealign (w2[0], w2[1], offset); w6[3] = amd_bytealign (w1[3], w2[0], offset); w6[2] = amd_bytealign (w1[2], w1[3], offset); w6[1] = amd_bytealign (w1[1], w1[2], offset); w6[0] = amd_bytealign (w1[0], w1[1], offset); w5[3] = amd_bytealign (w0[3], w1[0], offset); w5[2] = amd_bytealign (w0[2], w0[3], offset); w5[1] = amd_bytealign (w0[1], w0[2], offset); w5[0] = amd_bytealign (w0[0], w0[1], offset); w4[3] = amd_bytealign ( 0, w0[0], offset); w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 20: w7[3] = amd_bytealign (w2[2], w2[3], offset); w7[2] = amd_bytealign (w2[1], w2[2], offset); w7[1] = amd_bytealign (w2[0], w2[1], offset); w7[0] = amd_bytealign (w1[3], w2[0], offset); w6[3] = amd_bytealign (w1[2], w1[3], offset); w6[2] = amd_bytealign (w1[1], w1[2], offset); w6[1] = amd_bytealign (w1[0], w1[1], offset); w6[0] = amd_bytealign (w0[3], w1[0], offset); w5[3] = amd_bytealign (w0[2], w0[3], offset); w5[2] = amd_bytealign (w0[1], w0[2], offset); w5[1] = amd_bytealign (w0[0], w0[1], offset); w5[0] = amd_bytealign ( 0, w0[0], offset); w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 21: w7[3] = amd_bytealign (w2[1], w2[2], offset); w7[2] = amd_bytealign (w2[0], w2[1], offset); w7[1] = amd_bytealign (w1[3], w2[0], offset); w7[0] = amd_bytealign (w1[2], w1[3], offset); w6[3] = amd_bytealign (w1[1], w1[2], offset); w6[2] = amd_bytealign (w1[0], w1[1], offset); w6[1] = amd_bytealign (w0[3], w1[0], offset); w6[0] = amd_bytealign (w0[2], w0[3], offset); w5[3] = amd_bytealign (w0[1], w0[2], offset); w5[2] = amd_bytealign (w0[0], w0[1], offset); w5[1] = amd_bytealign ( 0, w0[0], offset); w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 22: w7[3] = amd_bytealign (w2[0], w2[1], offset); w7[2] = amd_bytealign (w1[3], w2[0], offset); w7[1] = amd_bytealign (w1[2], w1[3], offset); w7[0] = amd_bytealign (w1[1], w1[2], offset); w6[3] = amd_bytealign (w1[0], w1[1], offset); w6[2] = amd_bytealign (w0[3], w1[0], offset); w6[1] = amd_bytealign (w0[2], w0[3], offset); w6[0] = amd_bytealign (w0[1], w0[2], offset); w5[3] = amd_bytealign (w0[0], w0[1], offset); w5[2] = amd_bytealign ( 0, w0[0], offset); w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 23: w7[3] = amd_bytealign (w1[3], w2[0], offset); w7[2] = amd_bytealign (w1[2], w1[3], offset); w7[1] = amd_bytealign (w1[1], w1[2], offset); w7[0] = amd_bytealign (w1[0], w1[1], offset); w6[3] = amd_bytealign (w0[3], w1[0], offset); w6[2] = amd_bytealign (w0[2], w0[3], offset); w6[1] = amd_bytealign (w0[1], w0[2], offset); w6[0] = amd_bytealign (w0[0], w0[1], offset); w5[3] = amd_bytealign ( 0, w0[0], offset); w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 24: w7[3] = amd_bytealign (w1[2], w1[3], offset); w7[2] = amd_bytealign (w1[1], w1[2], offset); w7[1] = amd_bytealign (w1[0], w1[1], offset); w7[0] = amd_bytealign (w0[3], w1[0], offset); w6[3] = amd_bytealign (w0[2], w0[3], offset); w6[2] = amd_bytealign (w0[1], w0[2], offset); w6[1] = amd_bytealign (w0[0], w0[1], offset); w6[0] = amd_bytealign ( 0, w0[0], offset); w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 25: w7[3] = amd_bytealign (w1[1], w1[2], offset); w7[2] = amd_bytealign (w1[0], w1[1], offset); w7[1] = amd_bytealign (w0[3], w1[0], offset); w7[0] = amd_bytealign (w0[2], w0[3], offset); w6[3] = amd_bytealign (w0[1], w0[2], offset); w6[2] = amd_bytealign (w0[0], w0[1], offset); w6[1] = amd_bytealign ( 0, w0[0], offset); w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 26: w7[3] = amd_bytealign (w1[0], w1[1], offset); w7[2] = amd_bytealign (w0[3], w1[0], offset); w7[1] = amd_bytealign (w0[2], w0[3], offset); w7[0] = amd_bytealign (w0[1], w0[2], offset); w6[3] = amd_bytealign (w0[0], w0[1], offset); w6[2] = amd_bytealign ( 0, w0[0], offset); w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 27: w7[3] = amd_bytealign (w0[3], w1[0], offset); w7[2] = amd_bytealign (w0[2], w0[3], offset); w7[1] = amd_bytealign (w0[1], w0[2], offset); w7[0] = amd_bytealign (w0[0], w0[1], offset); w6[3] = amd_bytealign ( 0, w0[0], offset); w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 28: w7[3] = amd_bytealign (w0[2], w0[3], offset); w7[2] = amd_bytealign (w0[1], w0[2], offset); w7[1] = amd_bytealign (w0[0], w0[1], offset); w7[0] = amd_bytealign ( 0, w0[0], offset); w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 29: w7[3] = amd_bytealign (w0[1], w0[2], offset); w7[2] = amd_bytealign (w0[0], w0[1], offset); w7[1] = amd_bytealign ( 0, w0[0], offset); w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 30: w7[3] = amd_bytealign (w0[0], w0[1], offset); w7[2] = amd_bytealign ( 0, w0[0], offset); w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 31: w7[3] = amd_bytealign ( 0, w0[0], offset); w7[2] = 0; w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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 #if (defined IS_AMD && AMD_GCN >= 3) || defined IS_NV #if defined IS_NV const int selector = (0x76543210 >> ((offset & 3) * 4)) & 0xffff; #endif #if defined IS_AMD const int selector = 0x0706050403020100 >> ((offset & 3) * 8); #endif switch (offset_switch) { case 0: w7[3] = __byte_perm (w7[3], w7[2], selector); w7[2] = __byte_perm (w7[2], w7[1], selector); w7[1] = __byte_perm (w7[1], w7[0], selector); w7[0] = __byte_perm (w7[0], w6[3], selector); w6[3] = __byte_perm (w6[3], w6[2], selector); w6[2] = __byte_perm (w6[2], w6[1], selector); w6[1] = __byte_perm (w6[1], w6[0], selector); w6[0] = __byte_perm (w6[0], w5[3], selector); w5[3] = __byte_perm (w5[3], w5[2], selector); w5[2] = __byte_perm (w5[2], w5[1], selector); w5[1] = __byte_perm (w5[1], w5[0], selector); w5[0] = __byte_perm (w5[0], w4[3], selector); w4[3] = __byte_perm (w4[3], w4[2], selector); w4[2] = __byte_perm (w4[2], w4[1], selector); w4[1] = __byte_perm (w4[1], w4[0], selector); w4[0] = __byte_perm (w4[0], w3[3], selector); w3[3] = __byte_perm (w3[3], w3[2], selector); w3[2] = __byte_perm (w3[2], w3[1], selector); 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: w7[3] = __byte_perm (w7[2], w7[1], selector); w7[2] = __byte_perm (w7[1], w7[0], selector); w7[1] = __byte_perm (w7[0], w6[3], selector); w7[0] = __byte_perm (w6[3], w6[2], selector); w6[3] = __byte_perm (w6[2], w6[1], selector); w6[2] = __byte_perm (w6[1], w6[0], selector); w6[1] = __byte_perm (w6[0], w5[3], selector); w6[0] = __byte_perm (w5[3], w5[2], selector); w5[3] = __byte_perm (w5[2], w5[1], selector); w5[2] = __byte_perm (w5[1], w5[0], selector); w5[1] = __byte_perm (w5[0], w4[3], selector); w5[0] = __byte_perm (w4[3], w4[2], selector); w4[3] = __byte_perm (w4[2], w4[1], selector); w4[2] = __byte_perm (w4[1], w4[0], selector); w4[1] = __byte_perm (w4[0], w3[3], selector); w4[0] = __byte_perm (w3[3], w3[2], selector); w3[3] = __byte_perm (w3[2], w3[1], selector); w3[2] = __byte_perm (w3[1], w3[0], selector); 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: w7[3] = __byte_perm (w7[1], w7[0], selector); w7[2] = __byte_perm (w7[0], w6[3], selector); w7[1] = __byte_perm (w6[3], w6[2], selector); w7[0] = __byte_perm (w6[2], w6[1], selector); w6[3] = __byte_perm (w6[1], w6[0], selector); w6[2] = __byte_perm (w6[0], w5[3], selector); w6[1] = __byte_perm (w5[3], w5[2], selector); w6[0] = __byte_perm (w5[2], w5[1], selector); w5[3] = __byte_perm (w5[1], w5[0], selector); w5[2] = __byte_perm (w5[0], w4[3], selector); w5[1] = __byte_perm (w4[3], w4[2], selector); w5[0] = __byte_perm (w4[2], w4[1], selector); w4[3] = __byte_perm (w4[1], w4[0], selector); w4[2] = __byte_perm (w4[0], w3[3], selector); w4[1] = __byte_perm (w3[3], w3[2], selector); w4[0] = __byte_perm (w3[2], w3[1], selector); w3[3] = __byte_perm (w3[1], w3[0], selector); w3[2] = __byte_perm (w3[0], w2[3], selector); 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: w7[3] = __byte_perm (w7[0], w6[3], selector); w7[2] = __byte_perm (w6[3], w6[2], selector); w7[1] = __byte_perm (w6[2], w6[1], selector); w7[0] = __byte_perm (w6[1], w6[0], selector); w6[3] = __byte_perm (w6[0], w5[3], selector); w6[2] = __byte_perm (w5[3], w5[2], selector); w6[1] = __byte_perm (w5[2], w5[1], selector); w6[0] = __byte_perm (w5[1], w5[0], selector); w5[3] = __byte_perm (w5[0], w4[3], selector); w5[2] = __byte_perm (w4[3], w4[2], selector); w5[1] = __byte_perm (w4[2], w4[1], selector); w5[0] = __byte_perm (w4[1], w4[0], selector); w4[3] = __byte_perm (w4[0], w3[3], selector); w4[2] = __byte_perm (w3[3], w3[2], selector); w4[1] = __byte_perm (w3[2], w3[1], selector); w4[0] = __byte_perm (w3[1], w3[0], selector); w3[3] = __byte_perm (w3[0], w2[3], selector); w3[2] = __byte_perm (w2[3], w2[2], selector); 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: w7[3] = __byte_perm (w6[3], w6[2], selector); w7[2] = __byte_perm (w6[2], w6[1], selector); w7[1] = __byte_perm (w6[1], w6[0], selector); w7[0] = __byte_perm (w6[0], w5[3], selector); w6[3] = __byte_perm (w5[3], w5[2], selector); w6[2] = __byte_perm (w5[2], w5[1], selector); w6[1] = __byte_perm (w5[1], w5[0], selector); w6[0] = __byte_perm (w5[0], w4[3], selector); w5[3] = __byte_perm (w4[3], w4[2], selector); w5[2] = __byte_perm (w4[2], w4[1], selector); w5[1] = __byte_perm (w4[1], w4[0], selector); w5[0] = __byte_perm (w4[0], w3[3], selector); w4[3] = __byte_perm (w3[3], w3[2], selector); w4[2] = __byte_perm (w3[2], w3[1], selector); w4[1] = __byte_perm (w3[1], w3[0], selector); w4[0] = __byte_perm (w3[0], w2[3], selector); w3[3] = __byte_perm (w2[3], w2[2], selector); w3[2] = __byte_perm (w2[2], w2[1], selector); 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: w7[3] = __byte_perm (w6[2], w6[1], selector); w7[2] = __byte_perm (w6[1], w6[0], selector); w7[1] = __byte_perm (w6[0], w5[3], selector); w7[0] = __byte_perm (w5[3], w5[2], selector); w6[3] = __byte_perm (w5[2], w5[1], selector); w6[2] = __byte_perm (w5[1], w5[0], selector); w6[1] = __byte_perm (w5[0], w4[3], selector); w6[0] = __byte_perm (w4[3], w4[2], selector); w5[3] = __byte_perm (w4[2], w4[1], selector); w5[2] = __byte_perm (w4[1], w4[0], selector); w5[1] = __byte_perm (w4[0], w3[3], selector); w5[0] = __byte_perm (w3[3], w3[2], selector); w4[3] = __byte_perm (w3[2], w3[1], selector); w4[2] = __byte_perm (w3[1], w3[0], selector); w4[1] = __byte_perm (w3[0], w2[3], selector); w4[0] = __byte_perm (w2[3], w2[2], selector); w3[3] = __byte_perm (w2[2], w2[1], selector); w3[2] = __byte_perm (w2[1], w2[0], selector); 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: w7[3] = __byte_perm (w6[1], w6[0], selector); w7[2] = __byte_perm (w6[0], w5[3], selector); w7[1] = __byte_perm (w5[3], w5[2], selector); w7[0] = __byte_perm (w5[2], w5[1], selector); w6[3] = __byte_perm (w5[1], w5[0], selector); w6[2] = __byte_perm (w5[0], w4[3], selector); w6[1] = __byte_perm (w4[3], w4[2], selector); w6[0] = __byte_perm (w4[2], w4[1], selector); w5[3] = __byte_perm (w4[1], w4[0], selector); w5[2] = __byte_perm (w4[0], w3[3], selector); w5[1] = __byte_perm (w3[3], w3[2], selector); w5[0] = __byte_perm (w3[2], w3[1], selector); w4[3] = __byte_perm (w3[1], w3[0], selector); w4[2] = __byte_perm (w3[0], w2[3], selector); w4[1] = __byte_perm (w2[3], w2[2], selector); w4[0] = __byte_perm (w2[2], w2[1], selector); w3[3] = __byte_perm (w2[1], w2[0], selector); w3[2] = __byte_perm (w2[0], w1[3], selector); 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: w7[3] = __byte_perm (w6[0], w5[3], selector); w7[2] = __byte_perm (w5[3], w5[2], selector); w7[1] = __byte_perm (w5[2], w5[1], selector); w7[0] = __byte_perm (w5[1], w5[0], selector); w6[3] = __byte_perm (w5[0], w4[3], selector); w6[2] = __byte_perm (w4[3], w4[2], selector); w6[1] = __byte_perm (w4[2], w4[1], selector); w6[0] = __byte_perm (w4[1], w4[0], selector); w5[3] = __byte_perm (w4[0], w3[3], selector); w5[2] = __byte_perm (w3[3], w3[2], selector); w5[1] = __byte_perm (w3[2], w3[1], selector); w5[0] = __byte_perm (w3[1], w3[0], selector); w4[3] = __byte_perm (w3[0], w2[3], selector); w4[2] = __byte_perm (w2[3], w2[2], selector); w4[1] = __byte_perm (w2[2], w2[1], selector); w4[0] = __byte_perm (w2[1], w2[0], selector); w3[3] = __byte_perm (w2[0], w1[3], selector); w3[2] = __byte_perm (w1[3], w1[2], selector); 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: w7[3] = __byte_perm (w5[3], w5[2], selector); w7[2] = __byte_perm (w5[2], w5[1], selector); w7[1] = __byte_perm (w5[1], w5[0], selector); w7[0] = __byte_perm (w5[0], w4[3], selector); w6[3] = __byte_perm (w4[3], w4[2], selector); w6[2] = __byte_perm (w4[2], w4[1], selector); w6[1] = __byte_perm (w4[1], w4[0], selector); w6[0] = __byte_perm (w4[0], w3[3], selector); w5[3] = __byte_perm (w3[3], w3[2], selector); w5[2] = __byte_perm (w3[2], w3[1], selector); w5[1] = __byte_perm (w3[1], w3[0], selector); w5[0] = __byte_perm (w3[0], w2[3], selector); w4[3] = __byte_perm (w2[3], w2[2], selector); w4[2] = __byte_perm (w2[2], w2[1], selector); w4[1] = __byte_perm (w2[1], w2[0], selector); w4[0] = __byte_perm (w2[0], w1[3], selector); w3[3] = __byte_perm (w1[3], w1[2], selector); w3[2] = __byte_perm (w1[2], w1[1], selector); 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: w7[3] = __byte_perm (w5[2], w5[1], selector); w7[2] = __byte_perm (w5[1], w5[0], selector); w7[1] = __byte_perm (w5[0], w4[3], selector); w7[0] = __byte_perm (w4[3], w4[2], selector); w6[3] = __byte_perm (w4[2], w4[1], selector); w6[2] = __byte_perm (w4[1], w4[0], selector); w6[1] = __byte_perm (w4[0], w3[3], selector); w6[0] = __byte_perm (w3[3], w3[2], selector); w5[3] = __byte_perm (w3[2], w3[1], selector); w5[2] = __byte_perm (w3[1], w3[0], selector); w5[1] = __byte_perm (w3[0], w2[3], selector); w5[0] = __byte_perm (w2[3], w2[2], selector); w4[3] = __byte_perm (w2[2], w2[1], selector); w4[2] = __byte_perm (w2[1], w2[0], selector); w4[1] = __byte_perm (w2[0], w1[3], selector); w4[0] = __byte_perm (w1[3], w1[2], selector); w3[3] = __byte_perm (w1[2], w1[1], selector); w3[2] = __byte_perm (w1[1], w1[0], selector); 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: w7[3] = __byte_perm (w5[1], w5[0], selector); w7[2] = __byte_perm (w5[0], w4[3], selector); w7[1] = __byte_perm (w4[3], w4[2], selector); w7[0] = __byte_perm (w4[2], w4[1], selector); w6[3] = __byte_perm (w4[1], w4[0], selector); w6[2] = __byte_perm (w4[0], w3[3], selector); w6[1] = __byte_perm (w3[3], w3[2], selector); w6[0] = __byte_perm (w3[2], w3[1], selector); w5[3] = __byte_perm (w3[1], w3[0], selector); w5[2] = __byte_perm (w3[0], w2[3], selector); w5[1] = __byte_perm (w2[3], w2[2], selector); w5[0] = __byte_perm (w2[2], w2[1], selector); w4[3] = __byte_perm (w2[1], w2[0], selector); w4[2] = __byte_perm (w2[0], w1[3], selector); w4[1] = __byte_perm (w1[3], w1[2], selector); w4[0] = __byte_perm (w1[2], w1[1], selector); w3[3] = __byte_perm (w1[1], w1[0], selector); w3[2] = __byte_perm (w1[0], w0[3], selector); 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: w7[3] = __byte_perm (w5[0], w4[3], selector); w7[2] = __byte_perm (w4[3], w4[2], selector); w7[1] = __byte_perm (w4[2], w4[1], selector); w7[0] = __byte_perm (w4[1], w4[0], selector); w6[3] = __byte_perm (w4[0], w3[3], selector); w6[2] = __byte_perm (w3[3], w3[2], selector); w6[1] = __byte_perm (w3[2], w3[1], selector); w6[0] = __byte_perm (w3[1], w3[0], selector); w5[3] = __byte_perm (w3[0], w2[3], selector); w5[2] = __byte_perm (w2[3], w2[2], selector); w5[1] = __byte_perm (w2[2], w2[1], selector); w5[0] = __byte_perm (w2[1], w2[0], selector); w4[3] = __byte_perm (w2[0], w1[3], selector); w4[2] = __byte_perm (w1[3], w1[2], selector); w4[1] = __byte_perm (w1[2], w1[1], selector); w4[0] = __byte_perm (w1[1], w1[0], selector); w3[3] = __byte_perm (w1[0], w0[3], selector); w3[2] = __byte_perm (w0[3], w0[2], selector); 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: w7[3] = __byte_perm (w4[3], w4[2], selector); w7[2] = __byte_perm (w4[2], w4[1], selector); w7[1] = __byte_perm (w4[1], w4[0], selector); w7[0] = __byte_perm (w4[0], w3[3], selector); w6[3] = __byte_perm (w3[3], w3[2], selector); w6[2] = __byte_perm (w3[2], w3[1], selector); w6[1] = __byte_perm (w3[1], w3[0], selector); w6[0] = __byte_perm (w3[0], w2[3], selector); w5[3] = __byte_perm (w2[3], w2[2], selector); w5[2] = __byte_perm (w2[2], w2[1], selector); w5[1] = __byte_perm (w2[1], w2[0], selector); w5[0] = __byte_perm (w2[0], w1[3], selector); w4[3] = __byte_perm (w1[3], w1[2], selector); w4[2] = __byte_perm (w1[2], w1[1], selector); w4[1] = __byte_perm (w1[1], w1[0], selector); w4[0] = __byte_perm (w1[0], w0[3], selector); w3[3] = __byte_perm (w0[3], w0[2], selector); w3[2] = __byte_perm (w0[2], w0[1], selector); 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: w7[3] = __byte_perm (w4[2], w4[1], selector); w7[2] = __byte_perm (w4[1], w4[0], selector); w7[1] = __byte_perm (w4[0], w3[3], selector); w7[0] = __byte_perm (w3[3], w3[2], selector); w6[3] = __byte_perm (w3[2], w3[1], selector); w6[2] = __byte_perm (w3[1], w3[0], selector); w6[1] = __byte_perm (w3[0], w2[3], selector); w6[0] = __byte_perm (w2[3], w2[2], selector); w5[3] = __byte_perm (w2[2], w2[1], selector); w5[2] = __byte_perm (w2[1], w2[0], selector); w5[1] = __byte_perm (w2[0], w1[3], selector); w5[0] = __byte_perm (w1[3], w1[2], selector); w4[3] = __byte_perm (w1[2], w1[1], selector); w4[2] = __byte_perm (w1[1], w1[0], selector); w4[1] = __byte_perm (w1[0], w0[3], selector); w4[0] = __byte_perm (w0[3], w0[2], selector); w3[3] = __byte_perm (w0[2], w0[1], selector); w3[2] = __byte_perm (w0[1], w0[0], selector); 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; case 14: w7[3] = __byte_perm (w4[1], w4[0], selector); w7[2] = __byte_perm (w4[0], w3[3], selector); w7[1] = __byte_perm (w3[3], w3[2], selector); w7[0] = __byte_perm (w3[2], w3[1], selector); w6[3] = __byte_perm (w3[1], w3[0], selector); w6[2] = __byte_perm (w3[0], w2[3], selector); w6[1] = __byte_perm (w2[3], w2[2], selector); w6[0] = __byte_perm (w2[2], w2[1], selector); w5[3] = __byte_perm (w2[1], w2[0], selector); w5[2] = __byte_perm (w2[0], w1[3], selector); w5[1] = __byte_perm (w1[3], w1[2], selector); w5[0] = __byte_perm (w1[2], w1[1], selector); w4[3] = __byte_perm (w1[1], w1[0], selector); w4[2] = __byte_perm (w1[0], w0[3], selector); w4[1] = __byte_perm (w0[3], w0[2], selector); w4[0] = __byte_perm (w0[2], w0[1], selector); w3[3] = __byte_perm (w0[1], w0[0], selector); w3[2] = __byte_perm (w0[0], 0, selector); w3[1] = 0; 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; case 15: w7[3] = __byte_perm (w4[0], w3[3], selector); w7[2] = __byte_perm (w3[3], w3[2], selector); w7[1] = __byte_perm (w3[2], w3[1], selector); w7[0] = __byte_perm (w3[1], w3[0], selector); w6[3] = __byte_perm (w3[0], w2[3], selector); w6[2] = __byte_perm (w2[3], w2[2], selector); w6[1] = __byte_perm (w2[2], w2[1], selector); w6[0] = __byte_perm (w2[1], w2[0], selector); w5[3] = __byte_perm (w2[0], w1[3], selector); w5[2] = __byte_perm (w1[3], w1[2], selector); w5[1] = __byte_perm (w1[2], w1[1], selector); w5[0] = __byte_perm (w1[1], w1[0], selector); w4[3] = __byte_perm (w1[0], w0[3], selector); w4[2] = __byte_perm (w0[3], w0[2], selector); w4[1] = __byte_perm (w0[2], w0[1], selector); w4[0] = __byte_perm (w0[1], w0[0], selector); w3[3] = __byte_perm (w0[0], 0, selector); w3[2] = 0; w3[1] = 0; 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; case 16: w7[3] = __byte_perm (w3[3], w3[2], selector); w7[2] = __byte_perm (w3[2], w3[1], selector); w7[1] = __byte_perm (w3[1], w3[0], selector); w7[0] = __byte_perm (w3[0], w2[3], selector); w6[3] = __byte_perm (w2[3], w2[2], selector); w6[2] = __byte_perm (w2[2], w2[1], selector); w6[1] = __byte_perm (w2[1], w2[0], selector); w6[0] = __byte_perm (w2[0], w1[3], selector); w5[3] = __byte_perm (w1[3], w1[2], selector); w5[2] = __byte_perm (w1[2], w1[1], selector); w5[1] = __byte_perm (w1[1], w1[0], selector); w5[0] = __byte_perm (w1[0], w0[3], selector); w4[3] = __byte_perm (w0[3], w0[2], selector); w4[2] = __byte_perm (w0[2], w0[1], selector); w4[1] = __byte_perm (w0[1], w0[0], selector); w4[0] = __byte_perm (w0[0], 0, selector); w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 17: w7[3] = __byte_perm (w3[2], w3[1], selector); w7[2] = __byte_perm (w3[1], w3[0], selector); w7[1] = __byte_perm (w3[0], w2[3], selector); w7[0] = __byte_perm (w2[3], w2[2], selector); w6[3] = __byte_perm (w2[2], w2[1], selector); w6[2] = __byte_perm (w2[1], w2[0], selector); w6[1] = __byte_perm (w2[0], w1[3], selector); w6[0] = __byte_perm (w1[3], w1[2], selector); w5[3] = __byte_perm (w1[2], w1[1], selector); w5[2] = __byte_perm (w1[1], w1[0], selector); w5[1] = __byte_perm (w1[0], w0[3], selector); w5[0] = __byte_perm (w0[3], w0[2], selector); w4[3] = __byte_perm (w0[2], w0[1], selector); w4[2] = __byte_perm (w0[1], w0[0], selector); w4[1] = __byte_perm (w0[0], 0, selector); w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 18: w7[3] = __byte_perm (w3[1], w3[0], selector); w7[2] = __byte_perm (w3[0], w2[3], selector); w7[1] = __byte_perm (w2[3], w2[2], selector); w7[0] = __byte_perm (w2[2], w2[1], selector); w6[3] = __byte_perm (w2[1], w2[0], selector); w6[2] = __byte_perm (w2[0], w1[3], selector); w6[1] = __byte_perm (w1[3], w1[2], selector); w6[0] = __byte_perm (w1[2], w1[1], selector); w5[3] = __byte_perm (w1[1], w1[0], selector); w5[2] = __byte_perm (w1[0], w0[3], selector); w5[1] = __byte_perm (w0[3], w0[2], selector); w5[0] = __byte_perm (w0[2], w0[1], selector); w4[3] = __byte_perm (w0[1], w0[0], selector); w4[2] = __byte_perm (w0[0], 0, selector); w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 19: w7[3] = __byte_perm (w3[0], w2[3], selector); w7[2] = __byte_perm (w2[3], w2[2], selector); w7[1] = __byte_perm (w2[2], w2[1], selector); w7[0] = __byte_perm (w2[1], w2[0], selector); w6[3] = __byte_perm (w2[0], w1[3], selector); w6[2] = __byte_perm (w1[3], w1[2], selector); w6[1] = __byte_perm (w1[2], w1[1], selector); w6[0] = __byte_perm (w1[1], w1[0], selector); w5[3] = __byte_perm (w1[0], w0[3], selector); w5[2] = __byte_perm (w0[3], w0[2], selector); w5[1] = __byte_perm (w0[2], w0[1], selector); w5[0] = __byte_perm (w0[1], w0[0], selector); w4[3] = __byte_perm (w0[0], 0, selector); w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 20: w7[3] = __byte_perm (w2[3], w2[2], selector); w7[2] = __byte_perm (w2[2], w2[1], selector); w7[1] = __byte_perm (w2[1], w2[0], selector); w7[0] = __byte_perm (w2[0], w1[3], selector); w6[3] = __byte_perm (w1[3], w1[2], selector); w6[2] = __byte_perm (w1[2], w1[1], selector); w6[1] = __byte_perm (w1[1], w1[0], selector); w6[0] = __byte_perm (w1[0], w0[3], selector); w5[3] = __byte_perm (w0[3], w0[2], selector); w5[2] = __byte_perm (w0[2], w0[1], selector); w5[1] = __byte_perm (w0[1], w0[0], selector); w5[0] = __byte_perm (w0[0], 0, selector); w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 21: w7[3] = __byte_perm (w2[2], w2[1], selector); w7[2] = __byte_perm (w2[1], w2[0], selector); w7[1] = __byte_perm (w2[0], w1[3], selector); w7[0] = __byte_perm (w1[3], w1[2], selector); w6[3] = __byte_perm (w1[2], w1[1], selector); w6[2] = __byte_perm (w1[1], w1[0], selector); w6[1] = __byte_perm (w1[0], w0[3], selector); w6[0] = __byte_perm (w0[3], w0[2], selector); w5[3] = __byte_perm (w0[2], w0[1], selector); w5[2] = __byte_perm (w0[1], w0[0], selector); w5[1] = __byte_perm (w0[0], 0, selector); w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 22: w7[3] = __byte_perm (w2[1], w2[0], selector); w7[2] = __byte_perm (w2[0], w1[3], selector); w7[1] = __byte_perm (w1[3], w1[2], selector); w7[0] = __byte_perm (w1[2], w1[1], selector); w6[3] = __byte_perm (w1[1], w1[0], selector); w6[2] = __byte_perm (w1[0], w0[3], selector); w6[1] = __byte_perm (w0[3], w0[2], selector); w6[0] = __byte_perm (w0[2], w0[1], selector); w5[3] = __byte_perm (w0[1], w0[0], selector); w5[2] = __byte_perm (w0[0], 0, selector); w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 23: w7[3] = __byte_perm (w2[0], w1[3], selector); w7[2] = __byte_perm (w1[3], w1[2], selector); w7[1] = __byte_perm (w1[2], w1[1], selector); w7[0] = __byte_perm (w1[1], w1[0], selector); w6[3] = __byte_perm (w1[0], w0[3], selector); w6[2] = __byte_perm (w0[3], w0[2], selector); w6[1] = __byte_perm (w0[2], w0[1], selector); w6[0] = __byte_perm (w0[1], w0[0], selector); w5[3] = __byte_perm (w0[0], 0, selector); w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 24: w7[3] = __byte_perm (w1[3], w1[2], selector); w7[2] = __byte_perm (w1[2], w1[1], selector); w7[1] = __byte_perm (w1[1], w1[0], selector); w7[0] = __byte_perm (w1[0], w0[3], selector); w6[3] = __byte_perm (w0[3], w0[2], selector); w6[2] = __byte_perm (w0[2], w0[1], selector); w6[1] = __byte_perm (w0[1], w0[0], selector); w6[0] = __byte_perm (w0[0], 0, selector); w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 25: w7[3] = __byte_perm (w1[2], w1[1], selector); w7[2] = __byte_perm (w1[1], w1[0], selector); w7[1] = __byte_perm (w1[0], w0[3], selector); w7[0] = __byte_perm (w0[3], w0[2], selector); w6[3] = __byte_perm (w0[2], w0[1], selector); w6[2] = __byte_perm (w0[1], w0[0], selector); w6[1] = __byte_perm (w0[0], 0, selector); w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 26: w7[3] = __byte_perm (w1[1], w1[0], selector); w7[2] = __byte_perm (w1[0], w0[3], selector); w7[1] = __byte_perm (w0[3], w0[2], selector); w7[0] = __byte_perm (w0[2], w0[1], selector); w6[3] = __byte_perm (w0[1], w0[0], selector); w6[2] = __byte_perm (w0[0], 0, selector); w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 27: w7[3] = __byte_perm (w1[0], w0[3], selector); w7[2] = __byte_perm (w0[3], w0[2], selector); w7[1] = __byte_perm (w0[2], w0[1], selector); w7[0] = __byte_perm (w0[1], w0[0], selector); w6[3] = __byte_perm (w0[0], 0, selector); w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 28: w7[3] = __byte_perm (w0[3], w0[2], selector); w7[2] = __byte_perm (w0[2], w0[1], selector); w7[1] = __byte_perm (w0[1], w0[0], selector); w7[0] = __byte_perm (w0[0], 0, selector); w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 29: w7[3] = __byte_perm (w0[2], w0[1], selector); w7[2] = __byte_perm (w0[1], w0[0], selector); w7[1] = __byte_perm (w0[0], 0, selector); w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 30: w7[3] = __byte_perm (w0[1], w0[0], selector); w7[2] = __byte_perm (w0[0], 0, selector); w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 31: w7[3] = __byte_perm (w0[0], 0, selector); w7[2] = 0; w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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 } void switch_buffer_by_offset_8x4_carry_be (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[4], u32x c0[4], u32x c1[4], u32x c2[4], u32x c3[4], u32x c4[4], u32x c5[4], u32x c6[4], u32x c7[4], const u32 offset) { #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if (defined IS_AMD && AMD_GCN < 3) || defined IS_GENERIC switch (offset_switch) { case 0: c0[0] = amd_bytealign (w7[3], 0, offset); w7[3] = amd_bytealign (w7[2], w7[3], offset); w7[2] = amd_bytealign (w7[1], w7[2], offset); w7[1] = amd_bytealign (w7[0], w7[1], offset); w7[0] = amd_bytealign (w6[3], w7[0], offset); w6[3] = amd_bytealign (w6[2], w6[3], offset); w6[2] = amd_bytealign (w6[1], w6[2], offset); w6[1] = amd_bytealign (w6[0], w6[1], offset); w6[0] = amd_bytealign (w5[3], w6[0], offset); w5[3] = amd_bytealign (w5[2], w5[3], offset); w5[2] = amd_bytealign (w5[1], w5[2], offset); w5[1] = amd_bytealign (w5[0], w5[1], offset); w5[0] = amd_bytealign (w4[3], w5[0], offset); w4[3] = amd_bytealign (w4[2], w4[3], offset); w4[2] = amd_bytealign (w4[1], w4[2], offset); w4[1] = amd_bytealign (w4[0], w4[1], offset); w4[0] = amd_bytealign (w3[3], w4[0], offset); w3[3] = amd_bytealign (w3[2], w3[3], offset); w3[2] = amd_bytealign (w3[1], w3[2], 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: c0[1] = amd_bytealign (w7[3], 0, offset); c0[0] = amd_bytealign (w7[2], w7[3], offset); w7[3] = amd_bytealign (w7[1], w7[2], offset); w7[2] = amd_bytealign (w7[0], w7[1], offset); w7[1] = amd_bytealign (w6[3], w7[0], offset); w7[0] = amd_bytealign (w6[2], w6[3], offset); w6[3] = amd_bytealign (w6[1], w6[2], offset); w6[2] = amd_bytealign (w6[0], w6[1], offset); w6[1] = amd_bytealign (w5[3], w6[0], offset); w6[0] = amd_bytealign (w5[2], w5[3], offset); w5[3] = amd_bytealign (w5[1], w5[2], offset); w5[2] = amd_bytealign (w5[0], w5[1], offset); w5[1] = amd_bytealign (w4[3], w5[0], offset); w5[0] = amd_bytealign (w4[2], w4[3], offset); w4[3] = amd_bytealign (w4[1], w4[2], offset); w4[2] = amd_bytealign (w4[0], w4[1], offset); w4[1] = amd_bytealign (w3[3], w4[0], offset); w4[0] = amd_bytealign (w3[2], w3[3], offset); w3[3] = amd_bytealign (w3[1], w3[2], offset); w3[2] = amd_bytealign (w3[0], w3[1], 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: c0[2] = amd_bytealign (w7[3], 0, offset); c0[1] = amd_bytealign (w7[2], w7[3], offset); c0[0] = amd_bytealign (w7[1], w7[2], offset); w7[3] = amd_bytealign (w7[0], w7[1], offset); w7[2] = amd_bytealign (w6[3], w7[0], offset); w7[1] = amd_bytealign (w6[2], w6[3], offset); w7[0] = amd_bytealign (w6[1], w6[2], offset); w6[3] = amd_bytealign (w6[0], w6[1], offset); w6[2] = amd_bytealign (w5[3], w6[0], offset); w6[1] = amd_bytealign (w5[2], w5[3], offset); w6[0] = amd_bytealign (w5[1], w5[2], offset); w5[3] = amd_bytealign (w5[0], w5[1], offset); w5[2] = amd_bytealign (w4[3], w5[0], offset); w5[1] = amd_bytealign (w4[2], w4[3], offset); w5[0] = amd_bytealign (w4[1], w4[2], offset); w4[3] = amd_bytealign (w4[0], w4[1], offset); w4[2] = amd_bytealign (w3[3], w4[0], offset); w4[1] = amd_bytealign (w3[2], w3[3], offset); w4[0] = amd_bytealign (w3[1], w3[2], offset); w3[3] = amd_bytealign (w3[0], w3[1], offset); w3[2] = amd_bytealign (w2[3], w3[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: c0[3] = amd_bytealign (w7[3], 0, offset); c0[2] = amd_bytealign (w7[2], w7[3], offset); c0[1] = amd_bytealign (w7[1], w7[2], offset); c0[0] = amd_bytealign (w7[0], w7[1], offset); w7[3] = amd_bytealign (w6[3], w7[0], offset); w7[2] = amd_bytealign (w6[2], w6[3], offset); w7[1] = amd_bytealign (w6[1], w6[2], offset); w7[0] = amd_bytealign (w6[0], w6[1], offset); w6[3] = amd_bytealign (w5[3], w6[0], offset); w6[2] = amd_bytealign (w5[2], w5[3], offset); w6[1] = amd_bytealign (w5[1], w5[2], offset); w6[0] = amd_bytealign (w5[0], w5[1], offset); w5[3] = amd_bytealign (w4[3], w5[0], offset); w5[2] = amd_bytealign (w4[2], w4[3], offset); w5[1] = amd_bytealign (w4[1], w4[2], offset); w5[0] = amd_bytealign (w4[0], w4[1], offset); w4[3] = amd_bytealign (w3[3], w4[0], offset); w4[2] = amd_bytealign (w3[2], w3[3], offset); w4[1] = amd_bytealign (w3[1], w3[2], offset); w4[0] = amd_bytealign (w3[0], w3[1], offset); w3[3] = amd_bytealign (w2[3], w3[0], offset); w3[2] = amd_bytealign (w2[2], w2[3], 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: c1[0] = amd_bytealign (w7[3], 0, offset); c0[3] = amd_bytealign (w7[2], w7[3], offset); c0[2] = amd_bytealign (w7[1], w7[2], offset); c0[1] = amd_bytealign (w7[0], w7[1], offset); c0[0] = amd_bytealign (w6[3], w7[0], offset); w7[3] = amd_bytealign (w6[2], w6[3], offset); w7[2] = amd_bytealign (w6[1], w6[2], offset); w7[1] = amd_bytealign (w6[0], w6[1], offset); w7[0] = amd_bytealign (w5[3], w6[0], offset); w6[3] = amd_bytealign (w5[2], w5[3], offset); w6[2] = amd_bytealign (w5[1], w5[2], offset); w6[1] = amd_bytealign (w5[0], w5[1], offset); w6[0] = amd_bytealign (w4[3], w5[0], offset); w5[3] = amd_bytealign (w4[2], w4[3], offset); w5[2] = amd_bytealign (w4[1], w4[2], offset); w5[1] = amd_bytealign (w4[0], w4[1], offset); w5[0] = amd_bytealign (w3[3], w4[0], offset); w4[3] = amd_bytealign (w3[2], w3[3], offset); w4[2] = amd_bytealign (w3[1], w3[2], offset); w4[1] = amd_bytealign (w3[0], w3[1], offset); w4[0] = amd_bytealign (w2[3], w3[0], offset); w3[3] = amd_bytealign (w2[2], w2[3], offset); w3[2] = amd_bytealign (w2[1], w2[2], 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: c1[1] = amd_bytealign (w7[3], 0, offset); c1[0] = amd_bytealign (w7[2], w7[3], offset); c0[3] = amd_bytealign (w7[1], w7[2], offset); c0[2] = amd_bytealign (w7[0], w7[1], offset); c0[1] = amd_bytealign (w6[3], w7[0], offset); c0[0] = amd_bytealign (w6[2], w6[3], offset); w7[3] = amd_bytealign (w6[1], w6[2], offset); w7[2] = amd_bytealign (w6[0], w6[1], offset); w7[1] = amd_bytealign (w5[3], w6[0], offset); w7[0] = amd_bytealign (w5[2], w5[3], offset); w6[3] = amd_bytealign (w5[1], w5[2], offset); w6[2] = amd_bytealign (w5[0], w5[1], offset); w6[1] = amd_bytealign (w4[3], w5[0], offset); w6[0] = amd_bytealign (w4[2], w4[3], offset); w5[3] = amd_bytealign (w4[1], w4[2], offset); w5[2] = amd_bytealign (w4[0], w4[1], offset); w5[1] = amd_bytealign (w3[3], w4[0], offset); w5[0] = amd_bytealign (w3[2], w3[3], offset); w4[3] = amd_bytealign (w3[1], w3[2], offset); w4[2] = amd_bytealign (w3[0], w3[1], offset); w4[1] = amd_bytealign (w2[3], w3[0], offset); w4[0] = amd_bytealign (w2[2], w2[3], offset); w3[3] = amd_bytealign (w2[1], w2[2], offset); w3[2] = amd_bytealign (w2[0], w2[1], 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: c1[2] = amd_bytealign (w7[3], 0, offset); c1[1] = amd_bytealign (w7[2], w7[3], offset); c1[0] = amd_bytealign (w7[1], w7[2], offset); c0[3] = amd_bytealign (w7[0], w7[1], offset); c0[2] = amd_bytealign (w6[3], w7[0], offset); c0[1] = amd_bytealign (w6[2], w6[3], offset); c0[0] = amd_bytealign (w6[1], w6[2], offset); w7[3] = amd_bytealign (w6[0], w6[1], offset); w7[2] = amd_bytealign (w5[3], w6[0], offset); w7[1] = amd_bytealign (w5[2], w5[3], offset); w7[0] = amd_bytealign (w5[1], w5[2], offset); w6[3] = amd_bytealign (w5[0], w5[1], offset); w6[2] = amd_bytealign (w4[3], w5[0], offset); w6[1] = amd_bytealign (w4[2], w4[3], offset); w6[0] = amd_bytealign (w4[1], w4[2], offset); w5[3] = amd_bytealign (w4[0], w4[1], offset); w5[2] = amd_bytealign (w3[3], w4[0], offset); w5[1] = amd_bytealign (w3[2], w3[3], offset); w5[0] = amd_bytealign (w3[1], w3[2], offset); w4[3] = amd_bytealign (w3[0], w3[1], offset); w4[2] = amd_bytealign (w2[3], w3[0], offset); w4[1] = amd_bytealign (w2[2], w2[3], offset); w4[0] = amd_bytealign (w2[1], w2[2], offset); w3[3] = amd_bytealign (w2[0], w2[1], offset); w3[2] = amd_bytealign (w1[3], w2[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: c1[3] = amd_bytealign (w7[3], 0, offset); c1[2] = amd_bytealign (w7[2], w7[3], offset); c1[1] = amd_bytealign (w7[1], w7[2], offset); c1[0] = amd_bytealign (w7[0], w7[1], offset); c0[3] = amd_bytealign (w6[3], w7[0], offset); c0[2] = amd_bytealign (w6[2], w6[3], offset); c0[1] = amd_bytealign (w6[1], w6[2], offset); c0[0] = amd_bytealign (w6[0], w6[1], offset); w7[3] = amd_bytealign (w5[3], w6[0], offset); w7[2] = amd_bytealign (w5[2], w5[3], offset); w7[1] = amd_bytealign (w5[1], w5[2], offset); w7[0] = amd_bytealign (w5[0], w5[1], offset); w6[3] = amd_bytealign (w4[3], w5[0], offset); w6[2] = amd_bytealign (w4[2], w4[3], offset); w6[1] = amd_bytealign (w4[1], w4[2], offset); w6[0] = amd_bytealign (w4[0], w4[1], offset); w5[3] = amd_bytealign (w3[3], w4[0], offset); w5[2] = amd_bytealign (w3[2], w3[3], offset); w5[1] = amd_bytealign (w3[1], w3[2], offset); w5[0] = amd_bytealign (w3[0], w3[1], offset); w4[3] = amd_bytealign (w2[3], w3[0], offset); w4[2] = amd_bytealign (w2[2], w2[3], offset); w4[1] = amd_bytealign (w2[1], w2[2], offset); w4[0] = amd_bytealign (w2[0], w2[1], offset); w3[3] = amd_bytealign (w1[3], w2[0], offset); w3[2] = amd_bytealign (w1[2], w1[3], 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: c2[0] = amd_bytealign (w7[3], 0, offset); c1[3] = amd_bytealign (w7[2], w7[3], offset); c1[2] = amd_bytealign (w7[1], w7[2], offset); c1[1] = amd_bytealign (w7[0], w7[1], offset); c1[0] = amd_bytealign (w6[3], w7[0], offset); c0[3] = amd_bytealign (w6[2], w6[3], offset); c0[2] = amd_bytealign (w6[1], w6[2], offset); c0[1] = amd_bytealign (w6[0], w6[1], offset); c0[0] = amd_bytealign (w5[3], w6[0], offset); w7[3] = amd_bytealign (w5[2], w5[3], offset); w7[2] = amd_bytealign (w5[1], w5[2], offset); w7[1] = amd_bytealign (w5[0], w5[1], offset); w7[0] = amd_bytealign (w4[3], w5[0], offset); w6[3] = amd_bytealign (w4[2], w4[3], offset); w6[2] = amd_bytealign (w4[1], w4[2], offset); w6[1] = amd_bytealign (w4[0], w4[1], offset); w6[0] = amd_bytealign (w3[3], w4[0], offset); w5[3] = amd_bytealign (w3[2], w3[3], offset); w5[2] = amd_bytealign (w3[1], w3[2], offset); w5[1] = amd_bytealign (w3[0], w3[1], offset); w5[0] = amd_bytealign (w2[3], w3[0], offset); w4[3] = amd_bytealign (w2[2], w2[3], offset); w4[2] = amd_bytealign (w2[1], w2[2], offset); w4[1] = amd_bytealign (w2[0], w2[1], offset); w4[0] = amd_bytealign (w1[3], w2[0], offset); w3[3] = amd_bytealign (w1[2], w1[3], offset); w3[2] = amd_bytealign (w1[1], w1[2], 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: c2[1] = amd_bytealign (w7[3], 0, offset); c2[0] = amd_bytealign (w7[2], w7[3], offset); c1[3] = amd_bytealign (w7[1], w7[2], offset); c1[2] = amd_bytealign (w7[0], w7[1], offset); c1[1] = amd_bytealign (w6[3], w7[0], offset); c1[0] = amd_bytealign (w6[2], w6[3], offset); c0[3] = amd_bytealign (w6[1], w6[2], offset); c0[2] = amd_bytealign (w6[0], w6[1], offset); c0[1] = amd_bytealign (w5[3], w6[0], offset); c0[0] = amd_bytealign (w5[2], w5[3], offset); w7[3] = amd_bytealign (w5[1], w5[2], offset); w7[2] = amd_bytealign (w5[0], w5[1], offset); w7[1] = amd_bytealign (w4[3], w5[0], offset); w7[0] = amd_bytealign (w4[2], w4[3], offset); w6[3] = amd_bytealign (w4[1], w4[2], offset); w6[2] = amd_bytealign (w4[0], w4[1], offset); w6[1] = amd_bytealign (w3[3], w4[0], offset); w6[0] = amd_bytealign (w3[2], w3[3], offset); w5[3] = amd_bytealign (w3[1], w3[2], offset); w5[2] = amd_bytealign (w3[0], w3[1], offset); w5[1] = amd_bytealign (w2[3], w3[0], offset); w5[0] = amd_bytealign (w2[2], w2[3], offset); w4[3] = amd_bytealign (w2[1], w2[2], offset); w4[2] = amd_bytealign (w2[0], w2[1], offset); w4[1] = amd_bytealign (w1[3], w2[0], offset); w4[0] = amd_bytealign (w1[2], w1[3], offset); w3[3] = amd_bytealign (w1[1], w1[2], offset); w3[2] = amd_bytealign (w1[0], w1[1], 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: c2[2] = amd_bytealign (w7[3], 0, offset); c2[1] = amd_bytealign (w7[2], w7[3], offset); c2[0] = amd_bytealign (w7[1], w7[2], offset); c1[3] = amd_bytealign (w7[0], w7[1], offset); c1[2] = amd_bytealign (w6[3], w7[0], offset); c1[1] = amd_bytealign (w6[2], w6[3], offset); c1[0] = amd_bytealign (w6[1], w6[2], offset); c0[3] = amd_bytealign (w6[0], w6[1], offset); c0[2] = amd_bytealign (w5[3], w6[0], offset); c0[1] = amd_bytealign (w5[2], w5[3], offset); c0[0] = amd_bytealign (w5[1], w5[2], offset); w7[3] = amd_bytealign (w5[0], w5[1], offset); w7[2] = amd_bytealign (w4[3], w5[0], offset); w7[1] = amd_bytealign (w4[2], w4[3], offset); w7[0] = amd_bytealign (w4[1], w4[2], offset); w6[3] = amd_bytealign (w4[0], w4[1], offset); w6[2] = amd_bytealign (w3[3], w4[0], offset); w6[1] = amd_bytealign (w3[2], w3[3], offset); w6[0] = amd_bytealign (w3[1], w3[2], offset); w5[3] = amd_bytealign (w3[0], w3[1], offset); w5[2] = amd_bytealign (w2[3], w3[0], offset); w5[1] = amd_bytealign (w2[2], w2[3], offset); w5[0] = amd_bytealign (w2[1], w2[2], offset); w4[3] = amd_bytealign (w2[0], w2[1], offset); w4[2] = amd_bytealign (w1[3], w2[0], offset); w4[1] = amd_bytealign (w1[2], w1[3], offset); w4[0] = amd_bytealign (w1[1], w1[2], offset); w3[3] = amd_bytealign (w1[0], w1[1], offset); w3[2] = amd_bytealign (w0[3], w1[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: c2[3] = amd_bytealign (w7[3], 0, offset); c2[2] = amd_bytealign (w7[2], w7[3], offset); c2[1] = amd_bytealign (w7[1], w7[2], offset); c2[0] = amd_bytealign (w7[0], w7[1], offset); c1[3] = amd_bytealign (w6[3], w7[0], offset); c1[2] = amd_bytealign (w6[2], w6[3], offset); c1[1] = amd_bytealign (w6[1], w6[2], offset); c1[0] = amd_bytealign (w6[0], w6[1], offset); c0[3] = amd_bytealign (w5[3], w6[0], offset); c0[2] = amd_bytealign (w5[2], w5[3], offset); c0[1] = amd_bytealign (w5[1], w5[2], offset); c0[0] = amd_bytealign (w5[0], w5[1], offset); w7[3] = amd_bytealign (w4[3], w5[0], offset); w7[2] = amd_bytealign (w4[2], w4[3], offset); w7[1] = amd_bytealign (w4[1], w4[2], offset); w7[0] = amd_bytealign (w4[0], w4[1], offset); w6[3] = amd_bytealign (w3[3], w4[0], offset); w6[2] = amd_bytealign (w3[2], w3[3], offset); w6[1] = amd_bytealign (w3[1], w3[2], offset); w6[0] = amd_bytealign (w3[0], w3[1], offset); w5[3] = amd_bytealign (w2[3], w3[0], offset); w5[2] = amd_bytealign (w2[2], w2[3], offset); w5[1] = amd_bytealign (w2[1], w2[2], offset); w5[0] = amd_bytealign (w2[0], w2[1], offset); w4[3] = amd_bytealign (w1[3], w2[0], offset); w4[2] = amd_bytealign (w1[2], w1[3], offset); w4[1] = amd_bytealign (w1[1], w1[2], offset); w4[0] = amd_bytealign (w1[0], w1[1], offset); w3[3] = amd_bytealign (w0[3], w1[0], offset); w3[2] = amd_bytealign (w0[2], w0[3], 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: c3[0] = amd_bytealign (w7[3], 0, offset); c2[3] = amd_bytealign (w7[2], w7[3], offset); c2[2] = amd_bytealign (w7[1], w7[2], offset); c2[1] = amd_bytealign (w7[0], w7[1], offset); c2[0] = amd_bytealign (w6[3], w7[0], offset); c1[3] = amd_bytealign (w6[2], w6[3], offset); c1[2] = amd_bytealign (w6[1], w6[2], offset); c1[1] = amd_bytealign (w6[0], w6[1], offset); c1[0] = amd_bytealign (w5[3], w6[0], offset); c0[3] = amd_bytealign (w5[2], w5[3], offset); c0[2] = amd_bytealign (w5[1], w5[2], offset); c0[1] = amd_bytealign (w5[0], w5[1], offset); c0[0] = amd_bytealign (w4[3], w5[0], offset); w7[3] = amd_bytealign (w4[2], w4[3], offset); w7[2] = amd_bytealign (w4[1], w4[2], offset); w7[1] = amd_bytealign (w4[0], w4[1], offset); w7[0] = amd_bytealign (w3[3], w4[0], offset); w6[3] = amd_bytealign (w3[2], w3[3], offset); w6[2] = amd_bytealign (w3[1], w3[2], offset); w6[1] = amd_bytealign (w3[0], w3[1], offset); w6[0] = amd_bytealign (w2[3], w3[0], offset); w5[3] = amd_bytealign (w2[2], w2[3], offset); w5[2] = amd_bytealign (w2[1], w2[2], offset); w5[1] = amd_bytealign (w2[0], w2[1], offset); w5[0] = amd_bytealign (w1[3], w2[0], offset); w4[3] = amd_bytealign (w1[2], w1[3], offset); w4[2] = amd_bytealign (w1[1], w1[2], offset); w4[1] = amd_bytealign (w1[0], w1[1], offset); w4[0] = amd_bytealign (w0[3], w1[0], offset); w3[3] = amd_bytealign (w0[2], w0[3], offset); w3[2] = amd_bytealign (w0[1], w0[2], 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: c3[1] = amd_bytealign (w7[3], 0, offset); c3[0] = amd_bytealign (w7[2], w7[3], offset); c2[3] = amd_bytealign (w7[1], w7[2], offset); c2[2] = amd_bytealign (w7[0], w7[1], offset); c2[1] = amd_bytealign (w6[3], w7[0], offset); c2[0] = amd_bytealign (w6[2], w6[3], offset); c1[3] = amd_bytealign (w6[1], w6[2], offset); c1[2] = amd_bytealign (w6[0], w6[1], offset); c1[1] = amd_bytealign (w5[3], w6[0], offset); c1[0] = amd_bytealign (w5[2], w5[3], offset); c0[3] = amd_bytealign (w5[1], w5[2], offset); c0[2] = amd_bytealign (w5[0], w5[1], offset); c0[1] = amd_bytealign (w4[3], w5[0], offset); c0[0] = amd_bytealign (w4[2], w4[3], offset); w7[3] = amd_bytealign (w4[1], w4[2], offset); w7[2] = amd_bytealign (w4[0], w4[1], offset); w7[1] = amd_bytealign (w3[3], w4[0], offset); w7[0] = amd_bytealign (w3[2], w3[3], offset); w6[3] = amd_bytealign (w3[1], w3[2], offset); w6[2] = amd_bytealign (w3[0], w3[1], offset); w6[1] = amd_bytealign (w2[3], w3[0], offset); w6[0] = amd_bytealign (w2[2], w2[3], offset); w5[3] = amd_bytealign (w2[1], w2[2], offset); w5[2] = amd_bytealign (w2[0], w2[1], offset); w5[1] = amd_bytealign (w1[3], w2[0], offset); w5[0] = amd_bytealign (w1[2], w1[3], offset); w4[3] = amd_bytealign (w1[1], w1[2], offset); w4[2] = amd_bytealign (w1[0], w1[1], offset); w4[1] = amd_bytealign (w0[3], w1[0], offset); w4[0] = amd_bytealign (w0[2], w0[3], offset); w3[3] = amd_bytealign (w0[1], w0[2], offset); w3[2] = amd_bytealign (w0[0], w0[1], 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; case 14: c3[2] = amd_bytealign (w7[3], 0, offset); c3[1] = amd_bytealign (w7[2], w7[3], offset); c3[0] = amd_bytealign (w7[1], w7[2], offset); c2[3] = amd_bytealign (w7[0], w7[1], offset); c2[2] = amd_bytealign (w6[3], w7[0], offset); c2[1] = amd_bytealign (w6[2], w6[3], offset); c2[0] = amd_bytealign (w6[1], w6[2], offset); c1[3] = amd_bytealign (w6[0], w6[1], offset); c1[2] = amd_bytealign (w5[3], w6[0], offset); c1[1] = amd_bytealign (w5[2], w5[3], offset); c1[0] = amd_bytealign (w5[1], w5[2], offset); c0[3] = amd_bytealign (w5[0], w5[1], offset); c0[2] = amd_bytealign (w4[3], w5[0], offset); c0[1] = amd_bytealign (w4[2], w4[3], offset); c0[0] = amd_bytealign (w4[1], w4[2], offset); w7[3] = amd_bytealign (w4[0], w4[1], offset); w7[2] = amd_bytealign (w3[3], w4[0], offset); w7[1] = amd_bytealign (w3[2], w3[3], offset); w7[0] = amd_bytealign (w3[1], w3[2], offset); w6[3] = amd_bytealign (w3[0], w3[1], offset); w6[2] = amd_bytealign (w2[3], w3[0], offset); w6[1] = amd_bytealign (w2[2], w2[3], offset); w6[0] = amd_bytealign (w2[1], w2[2], offset); w5[3] = amd_bytealign (w2[0], w2[1], offset); w5[2] = amd_bytealign (w1[3], w2[0], offset); w5[1] = amd_bytealign (w1[2], w1[3], offset); w5[0] = amd_bytealign (w1[1], w1[2], offset); w4[3] = amd_bytealign (w1[0], w1[1], offset); w4[2] = amd_bytealign (w0[3], w1[0], offset); w4[1] = amd_bytealign (w0[2], w0[3], offset); w4[0] = amd_bytealign (w0[1], w0[2], offset); w3[3] = amd_bytealign (w0[0], w0[1], offset); w3[2] = amd_bytealign ( 0, w0[0], offset); w3[1] = 0; 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; case 15: c3[3] = amd_bytealign (w7[3], 0, offset); c3[2] = amd_bytealign (w7[2], w7[3], offset); c3[1] = amd_bytealign (w7[1], w7[2], offset); c3[0] = amd_bytealign (w7[0], w7[1], offset); c2[3] = amd_bytealign (w6[3], w7[0], offset); c2[2] = amd_bytealign (w6[2], w6[3], offset); c2[1] = amd_bytealign (w6[1], w6[2], offset); c2[0] = amd_bytealign (w6[0], w6[1], offset); c1[3] = amd_bytealign (w5[3], w6[0], offset); c1[2] = amd_bytealign (w5[2], w5[3], offset); c1[1] = amd_bytealign (w5[1], w5[2], offset); c1[0] = amd_bytealign (w5[0], w5[1], offset); c0[3] = amd_bytealign (w4[3], w5[0], offset); c0[2] = amd_bytealign (w4[2], w4[3], offset); c0[1] = amd_bytealign (w4[1], w4[2], offset); c0[0] = amd_bytealign (w4[0], w4[1], offset); w7[3] = amd_bytealign (w3[3], w4[0], offset); w7[2] = amd_bytealign (w3[2], w3[3], offset); w7[1] = amd_bytealign (w3[1], w3[2], offset); w7[0] = amd_bytealign (w3[0], w3[1], offset); w6[3] = amd_bytealign (w2[3], w3[0], offset); w6[2] = amd_bytealign (w2[2], w2[3], offset); w6[1] = amd_bytealign (w2[1], w2[2], offset); w6[0] = amd_bytealign (w2[0], w2[1], offset); w5[3] = amd_bytealign (w1[3], w2[0], offset); w5[2] = amd_bytealign (w1[2], w1[3], offset); w5[1] = amd_bytealign (w1[1], w1[2], offset); w5[0] = amd_bytealign (w1[0], w1[1], offset); w4[3] = amd_bytealign (w0[3], w1[0], offset); w4[2] = amd_bytealign (w0[2], w0[3], offset); w4[1] = amd_bytealign (w0[1], w0[2], offset); w4[0] = amd_bytealign (w0[0], w0[1], offset); w3[3] = amd_bytealign ( 0, w0[0], offset); w3[2] = 0; w3[1] = 0; 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; case 16: c4[0] = amd_bytealign (w7[3], 0, offset); c3[3] = amd_bytealign (w7[2], w7[3], offset); c3[2] = amd_bytealign (w7[1], w7[2], offset); c3[1] = amd_bytealign (w7[0], w7[1], offset); c3[0] = amd_bytealign (w6[3], w7[0], offset); c2[3] = amd_bytealign (w6[2], w6[3], offset); c2[2] = amd_bytealign (w6[1], w6[2], offset); c2[1] = amd_bytealign (w6[0], w6[1], offset); c2[0] = amd_bytealign (w5[3], w6[0], offset); c1[3] = amd_bytealign (w5[2], w5[3], offset); c1[2] = amd_bytealign (w5[1], w5[2], offset); c1[1] = amd_bytealign (w5[0], w5[1], offset); c1[0] = amd_bytealign (w4[3], w5[0], offset); c0[3] = amd_bytealign (w4[2], w4[3], offset); c0[2] = amd_bytealign (w4[1], w4[2], offset); c0[1] = amd_bytealign (w4[0], w4[1], offset); c0[0] = amd_bytealign (w3[3], w4[0], offset); w7[3] = amd_bytealign (w3[2], w3[3], offset); w7[2] = amd_bytealign (w3[1], w3[2], offset); w7[1] = amd_bytealign (w3[0], w3[1], offset); w7[0] = amd_bytealign (w2[3], w3[0], offset); w6[3] = amd_bytealign (w2[2], w2[3], offset); w6[2] = amd_bytealign (w2[1], w2[2], offset); w6[1] = amd_bytealign (w2[0], w2[1], offset); w6[0] = amd_bytealign (w1[3], w2[0], offset); w5[3] = amd_bytealign (w1[2], w1[3], offset); w5[2] = amd_bytealign (w1[1], w1[2], offset); w5[1] = amd_bytealign (w1[0], w1[1], offset); w5[0] = amd_bytealign (w0[3], w1[0], offset); w4[3] = amd_bytealign (w0[2], w0[3], offset); w4[2] = amd_bytealign (w0[1], w0[2], offset); w4[1] = amd_bytealign (w0[0], w0[1], offset); w4[0] = amd_bytealign ( 0, w0[0], offset); w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 17: c4[1] = amd_bytealign (w7[3], 0, offset); c4[0] = amd_bytealign (w7[2], w7[3], offset); c3[3] = amd_bytealign (w7[1], w7[2], offset); c3[2] = amd_bytealign (w7[0], w7[1], offset); c3[1] = amd_bytealign (w6[3], w7[0], offset); c3[0] = amd_bytealign (w6[2], w6[3], offset); c2[3] = amd_bytealign (w6[1], w6[2], offset); c2[2] = amd_bytealign (w6[0], w6[1], offset); c2[1] = amd_bytealign (w5[3], w6[0], offset); c2[0] = amd_bytealign (w5[2], w5[3], offset); c1[3] = amd_bytealign (w5[1], w5[2], offset); c1[2] = amd_bytealign (w5[0], w5[1], offset); c1[1] = amd_bytealign (w4[3], w5[0], offset); c1[0] = amd_bytealign (w4[2], w4[3], offset); c0[3] = amd_bytealign (w4[1], w4[2], offset); c0[2] = amd_bytealign (w4[0], w4[1], offset); c0[1] = amd_bytealign (w3[3], w4[0], offset); c0[0] = amd_bytealign (w3[2], w3[3], offset); w7[3] = amd_bytealign (w3[1], w3[2], offset); w7[2] = amd_bytealign (w3[0], w3[1], offset); w7[1] = amd_bytealign (w2[3], w3[0], offset); w7[0] = amd_bytealign (w2[2], w2[3], offset); w6[3] = amd_bytealign (w2[1], w2[2], offset); w6[2] = amd_bytealign (w2[0], w2[1], offset); w6[1] = amd_bytealign (w1[3], w2[0], offset); w6[0] = amd_bytealign (w1[2], w1[3], offset); w5[3] = amd_bytealign (w1[1], w1[2], offset); w5[2] = amd_bytealign (w1[0], w1[1], offset); w5[1] = amd_bytealign (w0[3], w1[0], offset); w5[0] = amd_bytealign (w0[2], w0[3], offset); w4[3] = amd_bytealign (w0[1], w0[2], offset); w4[2] = amd_bytealign (w0[0], w0[1], offset); w4[1] = amd_bytealign ( 0, w0[0], offset); w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 18: c4[2] = amd_bytealign (w7[3], 0, offset); c4[1] = amd_bytealign (w7[2], w7[3], offset); c4[0] = amd_bytealign (w7[1], w7[2], offset); c3[3] = amd_bytealign (w7[0], w7[1], offset); c3[2] = amd_bytealign (w6[3], w7[0], offset); c3[1] = amd_bytealign (w6[2], w6[3], offset); c3[0] = amd_bytealign (w6[1], w6[2], offset); c2[3] = amd_bytealign (w6[0], w6[1], offset); c2[2] = amd_bytealign (w5[3], w6[0], offset); c2[1] = amd_bytealign (w5[2], w5[3], offset); c2[0] = amd_bytealign (w5[1], w5[2], offset); c1[3] = amd_bytealign (w5[0], w5[1], offset); c1[2] = amd_bytealign (w4[3], w5[0], offset); c1[1] = amd_bytealign (w4[2], w4[3], offset); c1[0] = amd_bytealign (w4[1], w4[2], offset); c0[3] = amd_bytealign (w4[0], w4[1], offset); c0[2] = amd_bytealign (w3[3], w4[0], offset); c0[1] = amd_bytealign (w3[2], w3[3], offset); c0[0] = amd_bytealign (w3[1], w3[2], offset); w7[3] = amd_bytealign (w3[0], w3[1], offset); w7[2] = amd_bytealign (w2[3], w3[0], offset); w7[1] = amd_bytealign (w2[2], w2[3], offset); w7[0] = amd_bytealign (w2[1], w2[2], offset); w6[3] = amd_bytealign (w2[0], w2[1], offset); w6[2] = amd_bytealign (w1[3], w2[0], offset); w6[1] = amd_bytealign (w1[2], w1[3], offset); w6[0] = amd_bytealign (w1[1], w1[2], offset); w5[3] = amd_bytealign (w1[0], w1[1], offset); w5[2] = amd_bytealign (w0[3], w1[0], offset); w5[1] = amd_bytealign (w0[2], w0[3], offset); w5[0] = amd_bytealign (w0[1], w0[2], offset); w4[3] = amd_bytealign (w0[0], w0[1], offset); w4[2] = amd_bytealign ( 0, w0[0], offset); w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 19: c4[3] = amd_bytealign (w7[3], 0, offset); c4[2] = amd_bytealign (w7[2], w7[3], offset); c4[1] = amd_bytealign (w7[1], w7[2], offset); c4[0] = amd_bytealign (w7[0], w7[1], offset); c3[3] = amd_bytealign (w6[3], w7[0], offset); c3[2] = amd_bytealign (w6[2], w6[3], offset); c3[1] = amd_bytealign (w6[1], w6[2], offset); c3[0] = amd_bytealign (w6[0], w6[1], offset); c2[3] = amd_bytealign (w5[3], w6[0], offset); c2[2] = amd_bytealign (w5[2], w5[3], offset); c2[1] = amd_bytealign (w5[1], w5[2], offset); c2[0] = amd_bytealign (w5[0], w5[1], offset); c1[3] = amd_bytealign (w4[3], w5[0], offset); c1[2] = amd_bytealign (w4[2], w4[3], offset); c1[1] = amd_bytealign (w4[1], w4[2], offset); c1[0] = amd_bytealign (w4[0], w4[1], offset); c0[3] = amd_bytealign (w3[3], w4[0], offset); c0[2] = amd_bytealign (w3[2], w3[3], offset); c0[1] = amd_bytealign (w3[1], w3[2], offset); c0[0] = amd_bytealign (w3[0], w3[1], offset); w7[3] = amd_bytealign (w2[3], w3[0], offset); w7[2] = amd_bytealign (w2[2], w2[3], offset); w7[1] = amd_bytealign (w2[1], w2[2], offset); w7[0] = amd_bytealign (w2[0], w2[1], offset); w6[3] = amd_bytealign (w1[3], w2[0], offset); w6[2] = amd_bytealign (w1[2], w1[3], offset); w6[1] = amd_bytealign (w1[1], w1[2], offset); w6[0] = amd_bytealign (w1[0], w1[1], offset); w5[3] = amd_bytealign (w0[3], w1[0], offset); w5[2] = amd_bytealign (w0[2], w0[3], offset); w5[1] = amd_bytealign (w0[1], w0[2], offset); w5[0] = amd_bytealign (w0[0], w0[1], offset); w4[3] = amd_bytealign ( 0, w0[0], offset); w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 20: c5[0] = amd_bytealign (w7[3], 0, offset); c4[3] = amd_bytealign (w7[2], w7[3], offset); c4[2] = amd_bytealign (w7[1], w7[2], offset); c4[1] = amd_bytealign (w7[0], w7[1], offset); c4[0] = amd_bytealign (w6[3], w7[0], offset); c3[3] = amd_bytealign (w6[2], w6[3], offset); c3[2] = amd_bytealign (w6[1], w6[2], offset); c3[1] = amd_bytealign (w6[0], w6[1], offset); c3[0] = amd_bytealign (w5[3], w6[0], offset); c2[3] = amd_bytealign (w5[2], w5[3], offset); c2[2] = amd_bytealign (w5[1], w5[2], offset); c2[1] = amd_bytealign (w5[0], w5[1], offset); c2[0] = amd_bytealign (w4[3], w5[0], offset); c1[3] = amd_bytealign (w4[2], w4[3], offset); c1[2] = amd_bytealign (w4[1], w4[2], offset); c1[1] = amd_bytealign (w4[0], w4[1], offset); c1[0] = amd_bytealign (w3[3], w4[0], offset); c0[3] = amd_bytealign (w3[2], w3[3], offset); c0[2] = amd_bytealign (w3[1], w3[2], offset); c0[1] = amd_bytealign (w3[0], w3[1], offset); c0[0] = amd_bytealign (w2[3], w3[0], offset); w7[3] = amd_bytealign (w2[2], w2[3], offset); w7[2] = amd_bytealign (w2[1], w2[2], offset); w7[1] = amd_bytealign (w2[0], w2[1], offset); w7[0] = amd_bytealign (w1[3], w2[0], offset); w6[3] = amd_bytealign (w1[2], w1[3], offset); w6[2] = amd_bytealign (w1[1], w1[2], offset); w6[1] = amd_bytealign (w1[0], w1[1], offset); w6[0] = amd_bytealign (w0[3], w1[0], offset); w5[3] = amd_bytealign (w0[2], w0[3], offset); w5[2] = amd_bytealign (w0[1], w0[2], offset); w5[1] = amd_bytealign (w0[0], w0[1], offset); w5[0] = amd_bytealign ( 0, w0[0], offset); w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 21: c5[1] = amd_bytealign (w7[3], 0, offset); c5[0] = amd_bytealign (w7[2], w7[3], offset); c4[3] = amd_bytealign (w7[1], w7[2], offset); c4[2] = amd_bytealign (w7[0], w7[1], offset); c4[1] = amd_bytealign (w6[3], w7[0], offset); c4[0] = amd_bytealign (w6[2], w6[3], offset); c3[3] = amd_bytealign (w6[1], w6[2], offset); c3[2] = amd_bytealign (w6[0], w6[1], offset); c3[1] = amd_bytealign (w5[3], w6[0], offset); c3[0] = amd_bytealign (w5[2], w5[3], offset); c2[3] = amd_bytealign (w5[1], w5[2], offset); c2[2] = amd_bytealign (w5[0], w5[1], offset); c2[1] = amd_bytealign (w4[3], w5[0], offset); c2[0] = amd_bytealign (w4[2], w4[3], offset); c1[3] = amd_bytealign (w4[1], w4[2], offset); c1[2] = amd_bytealign (w4[0], w4[1], offset); c1[1] = amd_bytealign (w3[3], w4[0], offset); c1[0] = amd_bytealign (w3[2], w3[3], offset); c0[3] = amd_bytealign (w3[1], w3[2], offset); c0[2] = amd_bytealign (w3[0], w3[1], offset); c0[1] = amd_bytealign (w2[3], w3[0], offset); c0[0] = amd_bytealign (w2[2], w2[3], offset); w7[3] = amd_bytealign (w2[1], w2[2], offset); w7[2] = amd_bytealign (w2[0], w2[1], offset); w7[1] = amd_bytealign (w1[3], w2[0], offset); w7[0] = amd_bytealign (w1[2], w1[3], offset); w6[3] = amd_bytealign (w1[1], w1[2], offset); w6[2] = amd_bytealign (w1[0], w1[1], offset); w6[1] = amd_bytealign (w0[3], w1[0], offset); w6[0] = amd_bytealign (w0[2], w0[3], offset); w5[3] = amd_bytealign (w0[1], w0[2], offset); w5[2] = amd_bytealign (w0[0], w0[1], offset); w5[1] = amd_bytealign ( 0, w0[0], offset); w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 22: c5[2] = amd_bytealign (w7[3], 0, offset); c5[1] = amd_bytealign (w7[2], w7[3], offset); c5[0] = amd_bytealign (w7[1], w7[2], offset); c4[3] = amd_bytealign (w7[0], w7[1], offset); c4[2] = amd_bytealign (w6[3], w7[0], offset); c4[1] = amd_bytealign (w6[2], w6[3], offset); c4[0] = amd_bytealign (w6[1], w6[2], offset); c3[3] = amd_bytealign (w6[0], w6[1], offset); c3[2] = amd_bytealign (w5[3], w6[0], offset); c3[1] = amd_bytealign (w5[2], w5[3], offset); c3[0] = amd_bytealign (w5[1], w5[2], offset); c2[3] = amd_bytealign (w5[0], w5[1], offset); c2[2] = amd_bytealign (w4[3], w5[0], offset); c2[1] = amd_bytealign (w4[2], w4[3], offset); c2[0] = amd_bytealign (w4[1], w4[2], offset); c1[3] = amd_bytealign (w4[0], w4[1], offset); c1[2] = amd_bytealign (w3[3], w4[0], offset); c1[1] = amd_bytealign (w3[2], w3[3], offset); c1[0] = amd_bytealign (w3[1], w3[2], offset); c0[3] = amd_bytealign (w3[0], w3[1], offset); c0[2] = amd_bytealign (w2[3], w3[0], offset); c0[1] = amd_bytealign (w2[2], w2[3], offset); c0[0] = amd_bytealign (w2[1], w2[2], offset); w7[3] = amd_bytealign (w2[0], w2[1], offset); w7[2] = amd_bytealign (w1[3], w2[0], offset); w7[1] = amd_bytealign (w1[2], w1[3], offset); w7[0] = amd_bytealign (w1[1], w1[2], offset); w6[3] = amd_bytealign (w1[0], w1[1], offset); w6[2] = amd_bytealign (w0[3], w1[0], offset); w6[1] = amd_bytealign (w0[2], w0[3], offset); w6[0] = amd_bytealign (w0[1], w0[2], offset); w5[3] = amd_bytealign (w0[0], w0[1], offset); w5[2] = amd_bytealign ( 0, w0[0], offset); w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 23: c5[3] = amd_bytealign (w7[3], 0, offset); c5[2] = amd_bytealign (w7[2], w7[3], offset); c5[1] = amd_bytealign (w7[1], w7[2], offset); c5[0] = amd_bytealign (w7[0], w7[1], offset); c4[3] = amd_bytealign (w6[3], w7[0], offset); c4[2] = amd_bytealign (w6[2], w6[3], offset); c4[1] = amd_bytealign (w6[1], w6[2], offset); c4[0] = amd_bytealign (w6[0], w6[1], offset); c3[3] = amd_bytealign (w5[3], w6[0], offset); c3[2] = amd_bytealign (w5[2], w5[3], offset); c3[1] = amd_bytealign (w5[1], w5[2], offset); c3[0] = amd_bytealign (w5[0], w5[1], offset); c2[3] = amd_bytealign (w4[3], w5[0], offset); c2[2] = amd_bytealign (w4[2], w4[3], offset); c2[1] = amd_bytealign (w4[1], w4[2], offset); c2[0] = amd_bytealign (w4[0], w4[1], offset); c1[3] = amd_bytealign (w3[3], w4[0], offset); c1[2] = amd_bytealign (w3[2], w3[3], offset); c1[1] = amd_bytealign (w3[1], w3[2], offset); c1[0] = amd_bytealign (w3[0], w3[1], offset); c0[3] = amd_bytealign (w2[3], w3[0], offset); c0[2] = amd_bytealign (w2[2], w2[3], offset); c0[1] = amd_bytealign (w2[1], w2[2], offset); c0[0] = amd_bytealign (w2[0], w2[1], offset); w7[3] = amd_bytealign (w1[3], w2[0], offset); w7[2] = amd_bytealign (w1[2], w1[3], offset); w7[1] = amd_bytealign (w1[1], w1[2], offset); w7[0] = amd_bytealign (w1[0], w1[1], offset); w6[3] = amd_bytealign (w0[3], w1[0], offset); w6[2] = amd_bytealign (w0[2], w0[3], offset); w6[1] = amd_bytealign (w0[1], w0[2], offset); w6[0] = amd_bytealign (w0[0], w0[1], offset); w5[3] = amd_bytealign ( 0, w0[0], offset); w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 24: c6[0] = amd_bytealign (w7[3], 0, offset); c5[3] = amd_bytealign (w7[2], w7[3], offset); c5[2] = amd_bytealign (w7[1], w7[2], offset); c5[1] = amd_bytealign (w7[0], w7[1], offset); c5[0] = amd_bytealign (w6[3], w7[0], offset); c4[3] = amd_bytealign (w6[2], w6[3], offset); c4[2] = amd_bytealign (w6[1], w6[2], offset); c4[1] = amd_bytealign (w6[0], w6[1], offset); c4[0] = amd_bytealign (w5[3], w6[0], offset); c3[3] = amd_bytealign (w5[2], w5[3], offset); c3[2] = amd_bytealign (w5[1], w5[2], offset); c3[1] = amd_bytealign (w5[0], w5[1], offset); c3[0] = amd_bytealign (w4[3], w5[0], offset); c2[3] = amd_bytealign (w4[2], w4[3], offset); c2[2] = amd_bytealign (w4[1], w4[2], offset); c2[1] = amd_bytealign (w4[0], w4[1], offset); c2[0] = amd_bytealign (w3[3], w4[0], offset); c1[3] = amd_bytealign (w3[2], w3[3], offset); c1[2] = amd_bytealign (w3[1], w3[2], offset); c1[1] = amd_bytealign (w3[0], w3[1], offset); c1[0] = amd_bytealign (w2[3], w3[0], offset); c0[3] = amd_bytealign (w2[2], w2[3], offset); c0[2] = amd_bytealign (w2[1], w2[2], offset); c0[1] = amd_bytealign (w2[0], w2[1], offset); c0[0] = amd_bytealign (w1[3], w2[0], offset); w7[3] = amd_bytealign (w1[2], w1[3], offset); w7[2] = amd_bytealign (w1[1], w1[2], offset); w7[1] = amd_bytealign (w1[0], w1[1], offset); w7[0] = amd_bytealign (w0[3], w1[0], offset); w6[3] = amd_bytealign (w0[2], w0[3], offset); w6[2] = amd_bytealign (w0[1], w0[2], offset); w6[1] = amd_bytealign (w0[0], w0[1], offset); w6[0] = amd_bytealign ( 0, w0[0], offset); w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 25: c6[1] = amd_bytealign (w7[3], 0, offset); c6[0] = amd_bytealign (w7[2], w7[3], offset); c5[3] = amd_bytealign (w7[1], w7[2], offset); c5[2] = amd_bytealign (w7[0], w7[1], offset); c5[1] = amd_bytealign (w6[3], w7[0], offset); c5[0] = amd_bytealign (w6[2], w6[3], offset); c4[3] = amd_bytealign (w6[1], w6[2], offset); c4[2] = amd_bytealign (w6[0], w6[1], offset); c4[1] = amd_bytealign (w5[3], w6[0], offset); c4[0] = amd_bytealign (w5[2], w5[3], offset); c3[3] = amd_bytealign (w5[1], w5[2], offset); c3[2] = amd_bytealign (w5[0], w5[1], offset); c3[1] = amd_bytealign (w4[3], w5[0], offset); c3[0] = amd_bytealign (w4[2], w4[3], offset); c2[3] = amd_bytealign (w4[1], w4[2], offset); c2[2] = amd_bytealign (w4[0], w4[1], offset); c2[1] = amd_bytealign (w3[3], w4[0], offset); c2[0] = amd_bytealign (w3[2], w3[3], offset); c1[3] = amd_bytealign (w3[1], w3[2], offset); c1[2] = amd_bytealign (w3[0], w3[1], offset); c1[1] = amd_bytealign (w2[3], w3[0], offset); c1[0] = amd_bytealign (w2[2], w2[3], offset); c0[3] = amd_bytealign (w2[1], w2[2], offset); c0[2] = amd_bytealign (w2[0], w2[1], offset); c0[1] = amd_bytealign (w1[3], w2[0], offset); c0[0] = amd_bytealign (w1[2], w1[3], offset); w7[3] = amd_bytealign (w1[1], w1[2], offset); w7[2] = amd_bytealign (w1[0], w1[1], offset); w7[1] = amd_bytealign (w0[3], w1[0], offset); w7[0] = amd_bytealign (w0[2], w0[3], offset); w6[3] = amd_bytealign (w0[1], w0[2], offset); w6[2] = amd_bytealign (w0[0], w0[1], offset); w6[1] = amd_bytealign ( 0, w0[0], offset); w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 26: c6[2] = amd_bytealign (w7[3], 0, offset); c6[1] = amd_bytealign (w7[2], w7[3], offset); c6[0] = amd_bytealign (w7[1], w7[2], offset); c5[3] = amd_bytealign (w7[0], w7[1], offset); c5[2] = amd_bytealign (w6[3], w7[0], offset); c5[1] = amd_bytealign (w6[2], w6[3], offset); c5[0] = amd_bytealign (w6[1], w6[2], offset); c4[3] = amd_bytealign (w6[0], w6[1], offset); c4[2] = amd_bytealign (w5[3], w6[0], offset); c4[1] = amd_bytealign (w5[2], w5[3], offset); c4[0] = amd_bytealign (w5[1], w5[2], offset); c3[3] = amd_bytealign (w5[0], w5[1], offset); c3[2] = amd_bytealign (w4[3], w5[0], offset); c3[1] = amd_bytealign (w4[2], w4[3], offset); c3[0] = amd_bytealign (w4[1], w4[2], offset); c2[3] = amd_bytealign (w4[0], w4[1], offset); c2[2] = amd_bytealign (w3[3], w4[0], offset); c2[1] = amd_bytealign (w3[2], w3[3], offset); c2[0] = amd_bytealign (w3[1], w3[2], offset); c1[3] = amd_bytealign (w3[0], w3[1], offset); c1[2] = amd_bytealign (w2[3], w3[0], offset); c1[1] = amd_bytealign (w2[2], w2[3], offset); c1[0] = amd_bytealign (w2[1], w2[2], offset); c0[3] = amd_bytealign (w2[0], w2[1], offset); c0[2] = amd_bytealign (w1[3], w2[0], offset); c0[1] = amd_bytealign (w1[2], w1[3], offset); c0[0] = amd_bytealign (w1[1], w1[2], offset); w7[3] = amd_bytealign (w1[0], w1[1], offset); w7[2] = amd_bytealign (w0[3], w1[0], offset); w7[1] = amd_bytealign (w0[2], w0[3], offset); w7[0] = amd_bytealign (w0[1], w0[2], offset); w6[3] = amd_bytealign (w0[0], w0[1], offset); w6[2] = amd_bytealign ( 0, w0[0], offset); w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 27: c6[3] = amd_bytealign (w7[3], 0, offset); c6[2] = amd_bytealign (w7[2], w7[3], offset); c6[1] = amd_bytealign (w7[1], w7[2], offset); c6[0] = amd_bytealign (w7[0], w7[1], offset); c5[3] = amd_bytealign (w6[3], w7[0], offset); c5[2] = amd_bytealign (w6[2], w6[3], offset); c5[1] = amd_bytealign (w6[1], w6[2], offset); c5[0] = amd_bytealign (w6[0], w6[1], offset); c4[3] = amd_bytealign (w5[3], w6[0], offset); c4[2] = amd_bytealign (w5[2], w5[3], offset); c4[1] = amd_bytealign (w5[1], w5[2], offset); c4[0] = amd_bytealign (w5[0], w5[1], offset); c3[3] = amd_bytealign (w4[3], w5[0], offset); c3[2] = amd_bytealign (w4[2], w4[3], offset); c3[1] = amd_bytealign (w4[1], w4[2], offset); c3[0] = amd_bytealign (w4[0], w4[1], offset); c2[3] = amd_bytealign (w3[3], w4[0], offset); c2[2] = amd_bytealign (w3[2], w3[3], offset); c2[1] = amd_bytealign (w3[1], w3[2], offset); c2[0] = amd_bytealign (w3[0], w3[1], offset); c1[3] = amd_bytealign (w2[3], w3[0], offset); c1[2] = amd_bytealign (w2[2], w2[3], offset); c1[1] = amd_bytealign (w2[1], w2[2], offset); c1[0] = amd_bytealign (w2[0], w2[1], offset); c0[3] = amd_bytealign (w1[3], w2[0], offset); c0[2] = amd_bytealign (w1[2], w1[3], offset); c0[1] = amd_bytealign (w1[1], w1[2], offset); c0[0] = amd_bytealign (w1[0], w1[1], offset); w7[3] = amd_bytealign (w0[3], w1[0], offset); w7[2] = amd_bytealign (w0[2], w0[3], offset); w7[1] = amd_bytealign (w0[1], w0[2], offset); w7[0] = amd_bytealign (w0[0], w0[1], offset); w6[3] = amd_bytealign ( 0, w0[0], offset); w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 28: c7[0] = amd_bytealign (w7[3], 0, offset); c6[3] = amd_bytealign (w7[2], w7[3], offset); c6[2] = amd_bytealign (w7[1], w7[2], offset); c6[1] = amd_bytealign (w7[0], w7[1], offset); c6[0] = amd_bytealign (w6[3], w7[0], offset); c5[3] = amd_bytealign (w6[2], w6[3], offset); c5[2] = amd_bytealign (w6[1], w6[2], offset); c5[1] = amd_bytealign (w6[0], w6[1], offset); c5[0] = amd_bytealign (w5[3], w6[0], offset); c4[3] = amd_bytealign (w5[2], w5[3], offset); c4[2] = amd_bytealign (w5[1], w5[2], offset); c4[1] = amd_bytealign (w5[0], w5[1], offset); c4[0] = amd_bytealign (w4[3], w5[0], offset); c3[3] = amd_bytealign (w4[2], w4[3], offset); c3[2] = amd_bytealign (w4[1], w4[2], offset); c3[1] = amd_bytealign (w4[0], w4[1], offset); c3[0] = amd_bytealign (w3[3], w4[0], offset); c2[3] = amd_bytealign (w3[2], w3[3], offset); c2[2] = amd_bytealign (w3[1], w3[2], offset); c2[1] = amd_bytealign (w3[0], w3[1], offset); c2[0] = amd_bytealign (w2[3], w3[0], offset); c1[3] = amd_bytealign (w2[2], w2[3], offset); c1[2] = amd_bytealign (w2[1], w2[2], offset); c1[1] = amd_bytealign (w2[0], w2[1], offset); c1[0] = amd_bytealign (w1[3], w2[0], offset); c0[3] = amd_bytealign (w1[2], w1[3], offset); c0[2] = amd_bytealign (w1[1], w1[2], offset); c0[1] = amd_bytealign (w1[0], w1[1], offset); c0[0] = amd_bytealign (w0[3], w1[0], offset); w7[3] = amd_bytealign (w0[2], w0[3], offset); w7[2] = amd_bytealign (w0[1], w0[2], offset); w7[1] = amd_bytealign (w0[0], w0[1], offset); w7[0] = amd_bytealign ( 0, w0[0], offset); w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 29: c7[1] = amd_bytealign (w7[3], 0, offset); c7[0] = amd_bytealign (w7[2], w7[3], offset); c6[3] = amd_bytealign (w7[1], w7[2], offset); c6[2] = amd_bytealign (w7[0], w7[1], offset); c6[1] = amd_bytealign (w6[3], w7[0], offset); c6[0] = amd_bytealign (w6[2], w6[3], offset); c5[3] = amd_bytealign (w6[1], w6[2], offset); c5[2] = amd_bytealign (w6[0], w6[1], offset); c5[1] = amd_bytealign (w5[3], w6[0], offset); c5[0] = amd_bytealign (w5[2], w5[3], offset); c4[3] = amd_bytealign (w5[1], w5[2], offset); c4[2] = amd_bytealign (w5[0], w5[1], offset); c4[1] = amd_bytealign (w4[3], w5[0], offset); c4[0] = amd_bytealign (w4[2], w4[3], offset); c3[3] = amd_bytealign (w4[1], w4[2], offset); c3[2] = amd_bytealign (w4[0], w4[1], offset); c3[1] = amd_bytealign (w3[3], w4[0], offset); c3[0] = amd_bytealign (w3[2], w3[3], offset); c2[3] = amd_bytealign (w3[1], w3[2], offset); c2[2] = amd_bytealign (w3[0], w3[1], offset); c2[1] = amd_bytealign (w2[3], w3[0], offset); c2[0] = amd_bytealign (w2[2], w2[3], offset); c1[3] = amd_bytealign (w2[1], w2[2], offset); c1[2] = amd_bytealign (w2[0], w2[1], offset); c1[1] = amd_bytealign (w1[3], w2[0], offset); c1[0] = amd_bytealign (w1[2], w1[3], offset); c0[3] = amd_bytealign (w1[1], w1[2], offset); c0[2] = amd_bytealign (w1[0], w1[1], offset); c0[1] = amd_bytealign (w0[3], w1[0], offset); c0[0] = amd_bytealign (w0[2], w0[3], offset); w7[3] = amd_bytealign (w0[1], w0[2], offset); w7[2] = amd_bytealign (w0[0], w0[1], offset); w7[1] = amd_bytealign ( 0, w0[0], offset); w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 30: c7[2] = amd_bytealign (w7[3], 0, offset); c7[1] = amd_bytealign (w7[2], w7[3], offset); c7[0] = amd_bytealign (w7[1], w7[2], offset); c6[3] = amd_bytealign (w7[0], w7[1], offset); c6[2] = amd_bytealign (w6[3], w7[0], offset); c6[1] = amd_bytealign (w6[2], w6[3], offset); c6[0] = amd_bytealign (w6[1], w6[2], offset); c5[3] = amd_bytealign (w6[0], w6[1], offset); c5[2] = amd_bytealign (w5[3], w6[0], offset); c5[1] = amd_bytealign (w5[2], w5[3], offset); c5[0] = amd_bytealign (w5[1], w5[2], offset); c4[3] = amd_bytealign (w5[0], w5[1], offset); c4[2] = amd_bytealign (w4[3], w5[0], offset); c4[1] = amd_bytealign (w4[2], w4[3], offset); c4[0] = amd_bytealign (w4[1], w4[2], offset); c3[3] = amd_bytealign (w4[0], w4[1], offset); c3[2] = amd_bytealign (w3[3], w4[0], offset); c3[1] = amd_bytealign (w3[2], w3[3], offset); c3[0] = amd_bytealign (w3[1], w3[2], offset); c2[3] = amd_bytealign (w3[0], w3[1], offset); c2[2] = amd_bytealign (w2[3], w3[0], offset); c2[1] = amd_bytealign (w2[2], w2[3], offset); c2[0] = amd_bytealign (w2[1], w2[2], offset); c1[3] = amd_bytealign (w2[0], w2[1], offset); c1[2] = amd_bytealign (w1[3], w2[0], offset); c1[1] = amd_bytealign (w1[2], w1[3], offset); c1[0] = amd_bytealign (w1[1], w1[2], offset); c0[3] = amd_bytealign (w1[0], w1[1], offset); c0[2] = amd_bytealign (w0[3], w1[0], offset); c0[1] = amd_bytealign (w0[2], w0[3], offset); c0[0] = amd_bytealign (w0[1], w0[2], offset); w7[3] = amd_bytealign (w0[0], w0[1], offset); w7[2] = amd_bytealign ( 0, w0[0], offset); w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 31: c7[3] = amd_bytealign (w7[3], 0, offset); c7[2] = amd_bytealign (w7[2], w7[3], offset); c7[1] = amd_bytealign (w7[1], w7[2], offset); c7[0] = amd_bytealign (w7[0], w7[1], offset); c6[3] = amd_bytealign (w6[3], w7[0], offset); c6[2] = amd_bytealign (w6[2], w6[3], offset); c6[1] = amd_bytealign (w6[1], w6[2], offset); c6[0] = amd_bytealign (w6[0], w6[1], offset); c5[3] = amd_bytealign (w5[3], w6[0], offset); c5[2] = amd_bytealign (w5[2], w5[3], offset); c5[1] = amd_bytealign (w5[1], w5[2], offset); c5[0] = amd_bytealign (w5[0], w5[1], offset); c4[3] = amd_bytealign (w4[3], w5[0], offset); c4[2] = amd_bytealign (w4[2], w4[3], offset); c4[1] = amd_bytealign (w4[1], w4[2], offset); c4[0] = amd_bytealign (w4[0], w4[1], offset); c3[3] = amd_bytealign (w3[3], w4[0], offset); c3[2] = amd_bytealign (w3[2], w3[3], offset); c3[1] = amd_bytealign (w3[1], w3[2], offset); c3[0] = amd_bytealign (w3[0], w3[1], offset); c2[3] = amd_bytealign (w2[3], w3[0], offset); c2[2] = amd_bytealign (w2[2], w2[3], offset); c2[1] = amd_bytealign (w2[1], w2[2], offset); c2[0] = amd_bytealign (w2[0], w2[1], offset); c1[3] = amd_bytealign (w1[3], w2[0], offset); c1[2] = amd_bytealign (w1[2], w1[3], offset); c1[1] = amd_bytealign (w1[1], w1[2], offset); c1[0] = amd_bytealign (w1[0], w1[1], offset); c0[3] = amd_bytealign (w0[3], w1[0], offset); c0[2] = amd_bytealign (w0[2], w0[3], offset); c0[1] = amd_bytealign (w0[1], w0[2], offset); c0[0] = amd_bytealign (w0[0], w0[1], offset); w7[3] = amd_bytealign ( 0, w0[0], offset); w7[2] = 0; w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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 #if (defined IS_AMD && AMD_GCN >= 3) || defined IS_NV #if defined IS_NV const int selector = (0x76543210 >> ((offset & 3) * 4)) & 0xffff; #endif #if defined IS_AMD const int selector = 0x0706050403020100 >> ((offset & 3) * 8); #endif switch (offset_switch) { case 0: c0[0] = __byte_perm ( 0, w7[3], selector); w7[3] = __byte_perm (w7[3], w7[2], selector); w7[2] = __byte_perm (w7[2], w7[1], selector); w7[1] = __byte_perm (w7[1], w7[0], selector); w7[0] = __byte_perm (w7[0], w6[3], selector); w6[3] = __byte_perm (w6[3], w6[2], selector); w6[2] = __byte_perm (w6[2], w6[1], selector); w6[1] = __byte_perm (w6[1], w6[0], selector); w6[0] = __byte_perm (w6[0], w5[3], selector); w5[3] = __byte_perm (w5[3], w5[2], selector); w5[2] = __byte_perm (w5[2], w5[1], selector); w5[1] = __byte_perm (w5[1], w5[0], selector); w5[0] = __byte_perm (w5[0], w4[3], selector); w4[3] = __byte_perm (w4[3], w4[2], selector); w4[2] = __byte_perm (w4[2], w4[1], selector); w4[1] = __byte_perm (w4[1], w4[0], selector); w4[0] = __byte_perm (w4[0], w3[3], selector); w3[3] = __byte_perm (w3[3], w3[2], selector); w3[2] = __byte_perm (w3[2], w3[1], selector); 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: c0[1] = __byte_perm ( 0, w7[3], selector); c0[0] = __byte_perm (w7[3], w7[2], selector); w7[3] = __byte_perm (w7[2], w7[1], selector); w7[2] = __byte_perm (w7[1], w7[0], selector); w7[1] = __byte_perm (w7[0], w6[3], selector); w7[0] = __byte_perm (w6[3], w6[2], selector); w6[3] = __byte_perm (w6[2], w6[1], selector); w6[2] = __byte_perm (w6[1], w6[0], selector); w6[1] = __byte_perm (w6[0], w5[3], selector); w6[0] = __byte_perm (w5[3], w5[2], selector); w5[3] = __byte_perm (w5[2], w5[1], selector); w5[2] = __byte_perm (w5[1], w5[0], selector); w5[1] = __byte_perm (w5[0], w4[3], selector); w5[0] = __byte_perm (w4[3], w4[2], selector); w4[3] = __byte_perm (w4[2], w4[1], selector); w4[2] = __byte_perm (w4[1], w4[0], selector); w4[1] = __byte_perm (w4[0], w3[3], selector); w4[0] = __byte_perm (w3[3], w3[2], selector); w3[3] = __byte_perm (w3[2], w3[1], selector); w3[2] = __byte_perm (w3[1], w3[0], selector); 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: c0[2] = __byte_perm ( 0, w7[3], selector); c0[1] = __byte_perm (w7[3], w7[2], selector); c0[0] = __byte_perm (w7[2], w7[1], selector); w7[3] = __byte_perm (w7[1], w7[0], selector); w7[2] = __byte_perm (w7[0], w6[3], selector); w7[1] = __byte_perm (w6[3], w6[2], selector); w7[0] = __byte_perm (w6[2], w6[1], selector); w6[3] = __byte_perm (w6[1], w6[0], selector); w6[2] = __byte_perm (w6[0], w5[3], selector); w6[1] = __byte_perm (w5[3], w5[2], selector); w6[0] = __byte_perm (w5[2], w5[1], selector); w5[3] = __byte_perm (w5[1], w5[0], selector); w5[2] = __byte_perm (w5[0], w4[3], selector); w5[1] = __byte_perm (w4[3], w4[2], selector); w5[0] = __byte_perm (w4[2], w4[1], selector); w4[3] = __byte_perm (w4[1], w4[0], selector); w4[2] = __byte_perm (w4[0], w3[3], selector); w4[1] = __byte_perm (w3[3], w3[2], selector); w4[0] = __byte_perm (w3[2], w3[1], selector); w3[3] = __byte_perm (w3[1], w3[0], selector); w3[2] = __byte_perm (w3[0], w2[3], selector); 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: c0[3] = __byte_perm ( 0, w7[3], selector); c0[2] = __byte_perm (w7[3], w7[2], selector); c0[1] = __byte_perm (w7[2], w7[1], selector); c0[0] = __byte_perm (w7[1], w7[0], selector); w7[3] = __byte_perm (w7[0], w6[3], selector); w7[2] = __byte_perm (w6[3], w6[2], selector); w7[1] = __byte_perm (w6[2], w6[1], selector); w7[0] = __byte_perm (w6[1], w6[0], selector); w6[3] = __byte_perm (w6[0], w5[3], selector); w6[2] = __byte_perm (w5[3], w5[2], selector); w6[1] = __byte_perm (w5[2], w5[1], selector); w6[0] = __byte_perm (w5[1], w5[0], selector); w5[3] = __byte_perm (w5[0], w4[3], selector); w5[2] = __byte_perm (w4[3], w4[2], selector); w5[1] = __byte_perm (w4[2], w4[1], selector); w5[0] = __byte_perm (w4[1], w4[0], selector); w4[3] = __byte_perm (w4[0], w3[3], selector); w4[2] = __byte_perm (w3[3], w3[2], selector); w4[1] = __byte_perm (w3[2], w3[1], selector); w4[0] = __byte_perm (w3[1], w3[0], selector); w3[3] = __byte_perm (w3[0], w2[3], selector); w3[2] = __byte_perm (w2[3], w2[2], selector); 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: c1[0] = __byte_perm ( 0, w7[3], selector); c0[3] = __byte_perm (w7[3], w7[2], selector); c0[2] = __byte_perm (w7[2], w7[1], selector); c0[1] = __byte_perm (w7[1], w7[0], selector); c0[0] = __byte_perm (w7[0], w6[3], selector); w7[3] = __byte_perm (w6[3], w6[2], selector); w7[2] = __byte_perm (w6[2], w6[1], selector); w7[1] = __byte_perm (w6[1], w6[0], selector); w7[0] = __byte_perm (w6[0], w5[3], selector); w6[3] = __byte_perm (w5[3], w5[2], selector); w6[2] = __byte_perm (w5[2], w5[1], selector); w6[1] = __byte_perm (w5[1], w5[0], selector); w6[0] = __byte_perm (w5[0], w4[3], selector); w5[3] = __byte_perm (w4[3], w4[2], selector); w5[2] = __byte_perm (w4[2], w4[1], selector); w5[1] = __byte_perm (w4[1], w4[0], selector); w5[0] = __byte_perm (w4[0], w3[3], selector); w4[3] = __byte_perm (w3[3], w3[2], selector); w4[2] = __byte_perm (w3[2], w3[1], selector); w4[1] = __byte_perm (w3[1], w3[0], selector); w4[0] = __byte_perm (w3[0], w2[3], selector); w3[3] = __byte_perm (w2[3], w2[2], selector); w3[2] = __byte_perm (w2[2], w2[1], selector); 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: c1[1] = __byte_perm ( 0, w7[3], selector); c1[0] = __byte_perm (w7[3], w7[2], selector); c0[3] = __byte_perm (w7[2], w7[1], selector); c0[2] = __byte_perm (w7[1], w7[0], selector); c0[1] = __byte_perm (w7[0], w6[3], selector); c0[0] = __byte_perm (w6[3], w6[2], selector); w7[3] = __byte_perm (w6[2], w6[1], selector); w7[2] = __byte_perm (w6[1], w6[0], selector); w7[1] = __byte_perm (w6[0], w5[3], selector); w7[0] = __byte_perm (w5[3], w5[2], selector); w6[3] = __byte_perm (w5[2], w5[1], selector); w6[2] = __byte_perm (w5[1], w5[0], selector); w6[1] = __byte_perm (w5[0], w4[3], selector); w6[0] = __byte_perm (w4[3], w4[2], selector); w5[3] = __byte_perm (w4[2], w4[1], selector); w5[2] = __byte_perm (w4[1], w4[0], selector); w5[1] = __byte_perm (w4[0], w3[3], selector); w5[0] = __byte_perm (w3[3], w3[2], selector); w4[3] = __byte_perm (w3[2], w3[1], selector); w4[2] = __byte_perm (w3[1], w3[0], selector); w4[1] = __byte_perm (w3[0], w2[3], selector); w4[0] = __byte_perm (w2[3], w2[2], selector); w3[3] = __byte_perm (w2[2], w2[1], selector); w3[2] = __byte_perm (w2[1], w2[0], selector); 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: c1[2] = __byte_perm ( 0, w7[3], selector); c1[1] = __byte_perm (w7[3], w7[2], selector); c1[0] = __byte_perm (w7[2], w7[1], selector); c0[3] = __byte_perm (w7[1], w7[0], selector); c0[2] = __byte_perm (w7[0], w6[3], selector); c0[1] = __byte_perm (w6[3], w6[2], selector); c0[0] = __byte_perm (w6[2], w6[1], selector); w7[3] = __byte_perm (w6[1], w6[0], selector); w7[2] = __byte_perm (w6[0], w5[3], selector); w7[1] = __byte_perm (w5[3], w5[2], selector); w7[0] = __byte_perm (w5[2], w5[1], selector); w6[3] = __byte_perm (w5[1], w5[0], selector); w6[2] = __byte_perm (w5[0], w4[3], selector); w6[1] = __byte_perm (w4[3], w4[2], selector); w6[0] = __byte_perm (w4[2], w4[1], selector); w5[3] = __byte_perm (w4[1], w4[0], selector); w5[2] = __byte_perm (w4[0], w3[3], selector); w5[1] = __byte_perm (w3[3], w3[2], selector); w5[0] = __byte_perm (w3[2], w3[1], selector); w4[3] = __byte_perm (w3[1], w3[0], selector); w4[2] = __byte_perm (w3[0], w2[3], selector); w4[1] = __byte_perm (w2[3], w2[2], selector); w4[0] = __byte_perm (w2[2], w2[1], selector); w3[3] = __byte_perm (w2[1], w2[0], selector); w3[2] = __byte_perm (w2[0], w1[3], selector); 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: c1[3] = __byte_perm ( 0, w7[3], selector); c1[2] = __byte_perm (w7[3], w7[2], selector); c1[1] = __byte_perm (w7[2], w7[1], selector); c1[0] = __byte_perm (w7[1], w7[0], selector); c0[3] = __byte_perm (w7[0], w6[3], selector); c0[2] = __byte_perm (w6[3], w6[2], selector); c0[1] = __byte_perm (w6[2], w6[1], selector); c0[0] = __byte_perm (w6[1], w6[0], selector); w7[3] = __byte_perm (w6[0], w5[3], selector); w7[2] = __byte_perm (w5[3], w5[2], selector); w7[1] = __byte_perm (w5[2], w5[1], selector); w7[0] = __byte_perm (w5[1], w5[0], selector); w6[3] = __byte_perm (w5[0], w4[3], selector); w6[2] = __byte_perm (w4[3], w4[2], selector); w6[1] = __byte_perm (w4[2], w4[1], selector); w6[0] = __byte_perm (w4[1], w4[0], selector); w5[3] = __byte_perm (w4[0], w3[3], selector); w5[2] = __byte_perm (w3[3], w3[2], selector); w5[1] = __byte_perm (w3[2], w3[1], selector); w5[0] = __byte_perm (w3[1], w3[0], selector); w4[3] = __byte_perm (w3[0], w2[3], selector); w4[2] = __byte_perm (w2[3], w2[2], selector); w4[1] = __byte_perm (w2[2], w2[1], selector); w4[0] = __byte_perm (w2[1], w2[0], selector); w3[3] = __byte_perm (w2[0], w1[3], selector); w3[2] = __byte_perm (w1[3], w1[2], selector); 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: c2[0] = __byte_perm ( 0, w7[3], selector); c1[3] = __byte_perm (w7[3], w7[2], selector); c1[2] = __byte_perm (w7[2], w7[1], selector); c1[1] = __byte_perm (w7[1], w7[0], selector); c1[0] = __byte_perm (w7[0], w6[3], selector); c0[3] = __byte_perm (w6[3], w6[2], selector); c0[2] = __byte_perm (w6[2], w6[1], selector); c0[1] = __byte_perm (w6[1], w6[0], selector); c0[0] = __byte_perm (w6[0], w5[3], selector); w7[3] = __byte_perm (w5[3], w5[2], selector); w7[2] = __byte_perm (w5[2], w5[1], selector); w7[1] = __byte_perm (w5[1], w5[0], selector); w7[0] = __byte_perm (w5[0], w4[3], selector); w6[3] = __byte_perm (w4[3], w4[2], selector); w6[2] = __byte_perm (w4[2], w4[1], selector); w6[1] = __byte_perm (w4[1], w4[0], selector); w6[0] = __byte_perm (w4[0], w3[3], selector); w5[3] = __byte_perm (w3[3], w3[2], selector); w5[2] = __byte_perm (w3[2], w3[1], selector); w5[1] = __byte_perm (w3[1], w3[0], selector); w5[0] = __byte_perm (w3[0], w2[3], selector); w4[3] = __byte_perm (w2[3], w2[2], selector); w4[2] = __byte_perm (w2[2], w2[1], selector); w4[1] = __byte_perm (w2[1], w2[0], selector); w4[0] = __byte_perm (w2[0], w1[3], selector); w3[3] = __byte_perm (w1[3], w1[2], selector); w3[2] = __byte_perm (w1[2], w1[1], selector); 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: c2[1] = __byte_perm ( 0, w7[3], selector); c2[0] = __byte_perm (w7[3], w7[2], selector); c1[3] = __byte_perm (w7[2], w7[1], selector); c1[2] = __byte_perm (w7[1], w7[0], selector); c1[1] = __byte_perm (w7[0], w6[3], selector); c1[0] = __byte_perm (w6[3], w6[2], selector); c0[3] = __byte_perm (w6[2], w6[1], selector); c0[2] = __byte_perm (w6[1], w6[0], selector); c0[1] = __byte_perm (w6[0], w5[3], selector); c0[0] = __byte_perm (w5[3], w5[2], selector); w7[3] = __byte_perm (w5[2], w5[1], selector); w7[2] = __byte_perm (w5[1], w5[0], selector); w7[1] = __byte_perm (w5[0], w4[3], selector); w7[0] = __byte_perm (w4[3], w4[2], selector); w6[3] = __byte_perm (w4[2], w4[1], selector); w6[2] = __byte_perm (w4[1], w4[0], selector); w6[1] = __byte_perm (w4[0], w3[3], selector); w6[0] = __byte_perm (w3[3], w3[2], selector); w5[3] = __byte_perm (w3[2], w3[1], selector); w5[2] = __byte_perm (w3[1], w3[0], selector); w5[1] = __byte_perm (w3[0], w2[3], selector); w5[0] = __byte_perm (w2[3], w2[2], selector); w4[3] = __byte_perm (w2[2], w2[1], selector); w4[2] = __byte_perm (w2[1], w2[0], selector); w4[1] = __byte_perm (w2[0], w1[3], selector); w4[0] = __byte_perm (w1[3], w1[2], selector); w3[3] = __byte_perm (w1[2], w1[1], selector); w3[2] = __byte_perm (w1[1], w1[0], selector); 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: c2[2] = __byte_perm ( 0, w7[3], selector); c2[1] = __byte_perm (w7[3], w7[2], selector); c2[0] = __byte_perm (w7[2], w7[1], selector); c1[3] = __byte_perm (w7[1], w7[0], selector); c1[2] = __byte_perm (w7[0], w6[3], selector); c1[1] = __byte_perm (w6[3], w6[2], selector); c1[0] = __byte_perm (w6[2], w6[1], selector); c0[3] = __byte_perm (w6[1], w6[0], selector); c0[2] = __byte_perm (w6[0], w5[3], selector); c0[1] = __byte_perm (w5[3], w5[2], selector); c0[0] = __byte_perm (w5[2], w5[1], selector); w7[3] = __byte_perm (w5[1], w5[0], selector); w7[2] = __byte_perm (w5[0], w4[3], selector); w7[1] = __byte_perm (w4[3], w4[2], selector); w7[0] = __byte_perm (w4[2], w4[1], selector); w6[3] = __byte_perm (w4[1], w4[0], selector); w6[2] = __byte_perm (w4[0], w3[3], selector); w6[1] = __byte_perm (w3[3], w3[2], selector); w6[0] = __byte_perm (w3[2], w3[1], selector); w5[3] = __byte_perm (w3[1], w3[0], selector); w5[2] = __byte_perm (w3[0], w2[3], selector); w5[1] = __byte_perm (w2[3], w2[2], selector); w5[0] = __byte_perm (w2[2], w2[1], selector); w4[3] = __byte_perm (w2[1], w2[0], selector); w4[2] = __byte_perm (w2[0], w1[3], selector); w4[1] = __byte_perm (w1[3], w1[2], selector); w4[0] = __byte_perm (w1[2], w1[1], selector); w3[3] = __byte_perm (w1[1], w1[0], selector); w3[2] = __byte_perm (w1[0], w0[3], selector); 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: c2[3] = __byte_perm ( 0, w7[3], selector); c2[2] = __byte_perm (w7[3], w7[2], selector); c2[1] = __byte_perm (w7[2], w7[1], selector); c2[0] = __byte_perm (w7[1], w7[0], selector); c1[3] = __byte_perm (w7[0], w6[3], selector); c1[2] = __byte_perm (w6[3], w6[2], selector); c1[1] = __byte_perm (w6[2], w6[1], selector); c1[0] = __byte_perm (w6[1], w6[0], selector); c0[3] = __byte_perm (w6[0], w5[3], selector); c0[2] = __byte_perm (w5[3], w5[2], selector); c0[1] = __byte_perm (w5[2], w5[1], selector); c0[0] = __byte_perm (w5[1], w5[0], selector); w7[3] = __byte_perm (w5[0], w4[3], selector); w7[2] = __byte_perm (w4[3], w4[2], selector); w7[1] = __byte_perm (w4[2], w4[1], selector); w7[0] = __byte_perm (w4[1], w4[0], selector); w6[3] = __byte_perm (w4[0], w3[3], selector); w6[2] = __byte_perm (w3[3], w3[2], selector); w6[1] = __byte_perm (w3[2], w3[1], selector); w6[0] = __byte_perm (w3[1], w3[0], selector); w5[3] = __byte_perm (w3[0], w2[3], selector); w5[2] = __byte_perm (w2[3], w2[2], selector); w5[1] = __byte_perm (w2[2], w2[1], selector); w5[0] = __byte_perm (w2[1], w2[0], selector); w4[3] = __byte_perm (w2[0], w1[3], selector); w4[2] = __byte_perm (w1[3], w1[2], selector); w4[1] = __byte_perm (w1[2], w1[1], selector); w4[0] = __byte_perm (w1[1], w1[0], selector); w3[3] = __byte_perm (w1[0], w0[3], selector); w3[2] = __byte_perm (w0[3], w0[2], selector); 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: c3[0] = __byte_perm ( 0, w7[3], selector); c2[3] = __byte_perm (w7[3], w7[2], selector); c2[2] = __byte_perm (w7[2], w7[1], selector); c2[1] = __byte_perm (w7[1], w7[0], selector); c2[0] = __byte_perm (w7[0], w6[3], selector); c1[3] = __byte_perm (w6[3], w6[2], selector); c1[2] = __byte_perm (w6[2], w6[1], selector); c1[1] = __byte_perm (w6[1], w6[0], selector); c1[0] = __byte_perm (w6[0], w5[3], selector); c0[3] = __byte_perm (w5[3], w5[2], selector); c0[2] = __byte_perm (w5[2], w5[1], selector); c0[1] = __byte_perm (w5[1], w5[0], selector); c0[0] = __byte_perm (w5[0], w4[3], selector); w7[3] = __byte_perm (w4[3], w4[2], selector); w7[2] = __byte_perm (w4[2], w4[1], selector); w7[1] = __byte_perm (w4[1], w4[0], selector); w7[0] = __byte_perm (w4[0], w3[3], selector); w6[3] = __byte_perm (w3[3], w3[2], selector); w6[2] = __byte_perm (w3[2], w3[1], selector); w6[1] = __byte_perm (w3[1], w3[0], selector); w6[0] = __byte_perm (w3[0], w2[3], selector); w5[3] = __byte_perm (w2[3], w2[2], selector); w5[2] = __byte_perm (w2[2], w2[1], selector); w5[1] = __byte_perm (w2[1], w2[0], selector); w5[0] = __byte_perm (w2[0], w1[3], selector); w4[3] = __byte_perm (w1[3], w1[2], selector); w4[2] = __byte_perm (w1[2], w1[1], selector); w4[1] = __byte_perm (w1[1], w1[0], selector); w4[0] = __byte_perm (w1[0], w0[3], selector); w3[3] = __byte_perm (w0[3], w0[2], selector); w3[2] = __byte_perm (w0[2], w0[1], selector); 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: c3[1] = __byte_perm ( 0, w7[3], selector); c3[0] = __byte_perm (w7[3], w7[2], selector); c2[3] = __byte_perm (w7[2], w7[1], selector); c2[2] = __byte_perm (w7[1], w7[0], selector); c2[1] = __byte_perm (w7[0], w6[3], selector); c2[0] = __byte_perm (w6[3], w6[2], selector); c1[3] = __byte_perm (w6[2], w6[1], selector); c1[2] = __byte_perm (w6[1], w6[0], selector); c1[1] = __byte_perm (w6[0], w5[3], selector); c1[0] = __byte_perm (w5[3], w5[2], selector); c0[3] = __byte_perm (w5[2], w5[1], selector); c0[2] = __byte_perm (w5[1], w5[0], selector); c0[1] = __byte_perm (w5[0], w4[3], selector); c0[0] = __byte_perm (w4[3], w4[2], selector); w7[3] = __byte_perm (w4[2], w4[1], selector); w7[2] = __byte_perm (w4[1], w4[0], selector); w7[1] = __byte_perm (w4[0], w3[3], selector); w7[0] = __byte_perm (w3[3], w3[2], selector); w6[3] = __byte_perm (w3[2], w3[1], selector); w6[2] = __byte_perm (w3[1], w3[0], selector); w6[1] = __byte_perm (w3[0], w2[3], selector); w6[0] = __byte_perm (w2[3], w2[2], selector); w5[3] = __byte_perm (w2[2], w2[1], selector); w5[2] = __byte_perm (w2[1], w2[0], selector); w5[1] = __byte_perm (w2[0], w1[3], selector); w5[0] = __byte_perm (w1[3], w1[2], selector); w4[3] = __byte_perm (w1[2], w1[1], selector); w4[2] = __byte_perm (w1[1], w1[0], selector); w4[1] = __byte_perm (w1[0], w0[3], selector); w4[0] = __byte_perm (w0[3], w0[2], selector); w3[3] = __byte_perm (w0[2], w0[1], selector); w3[2] = __byte_perm (w0[1], w0[0], selector); 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; case 14: c3[2] = __byte_perm ( 0, w7[3], selector); c3[1] = __byte_perm (w7[3], w7[2], selector); c3[0] = __byte_perm (w7[2], w7[1], selector); c2[3] = __byte_perm (w7[1], w7[0], selector); c2[2] = __byte_perm (w7[0], w6[3], selector); c2[1] = __byte_perm (w6[3], w6[2], selector); c2[0] = __byte_perm (w6[2], w6[1], selector); c1[3] = __byte_perm (w6[1], w6[0], selector); c1[2] = __byte_perm (w6[0], w5[3], selector); c1[1] = __byte_perm (w5[3], w5[2], selector); c1[0] = __byte_perm (w5[2], w5[1], selector); c0[3] = __byte_perm (w5[1], w5[0], selector); c0[2] = __byte_perm (w5[0], w4[3], selector); c0[1] = __byte_perm (w4[3], w4[2], selector); c0[0] = __byte_perm (w4[2], w4[1], selector); w7[3] = __byte_perm (w4[1], w4[0], selector); w7[2] = __byte_perm (w4[0], w3[3], selector); w7[1] = __byte_perm (w3[3], w3[2], selector); w7[0] = __byte_perm (w3[2], w3[1], selector); w6[3] = __byte_perm (w3[1], w3[0], selector); w6[2] = __byte_perm (w3[0], w2[3], selector); w6[1] = __byte_perm (w2[3], w2[2], selector); w6[0] = __byte_perm (w2[2], w2[1], selector); w5[3] = __byte_perm (w2[1], w2[0], selector); w5[2] = __byte_perm (w2[0], w1[3], selector); w5[1] = __byte_perm (w1[3], w1[2], selector); w5[0] = __byte_perm (w1[2], w1[1], selector); w4[3] = __byte_perm (w1[1], w1[0], selector); w4[2] = __byte_perm (w1[0], w0[3], selector); w4[1] = __byte_perm (w0[3], w0[2], selector); w4[0] = __byte_perm (w0[2], w0[1], selector); w3[3] = __byte_perm (w0[1], w0[0], selector); w3[2] = __byte_perm (w0[0], 0, selector); w3[1] = 0; 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; case 15: c3[3] = __byte_perm ( 0, w7[3], selector); c3[2] = __byte_perm (w7[3], w7[2], selector); c3[1] = __byte_perm (w7[2], w7[1], selector); c3[0] = __byte_perm (w7[1], w7[0], selector); c2[3] = __byte_perm (w7[0], w6[3], selector); c2[2] = __byte_perm (w6[3], w6[2], selector); c2[1] = __byte_perm (w6[2], w6[1], selector); c2[0] = __byte_perm (w6[1], w6[0], selector); c1[3] = __byte_perm (w6[0], w5[3], selector); c1[2] = __byte_perm (w5[3], w5[2], selector); c1[1] = __byte_perm (w5[2], w5[1], selector); c1[0] = __byte_perm (w5[1], w5[0], selector); c0[3] = __byte_perm (w5[0], w4[3], selector); c0[2] = __byte_perm (w4[3], w4[2], selector); c0[1] = __byte_perm (w4[2], w4[1], selector); c0[0] = __byte_perm (w4[1], w4[0], selector); w7[3] = __byte_perm (w4[0], w3[3], selector); w7[2] = __byte_perm (w3[3], w3[2], selector); w7[1] = __byte_perm (w3[2], w3[1], selector); w7[0] = __byte_perm (w3[1], w3[0], selector); w6[3] = __byte_perm (w3[0], w2[3], selector); w6[2] = __byte_perm (w2[3], w2[2], selector); w6[1] = __byte_perm (w2[2], w2[1], selector); w6[0] = __byte_perm (w2[1], w2[0], selector); w5[3] = __byte_perm (w2[0], w1[3], selector); w5[2] = __byte_perm (w1[3], w1[2], selector); w5[1] = __byte_perm (w1[2], w1[1], selector); w5[0] = __byte_perm (w1[1], w1[0], selector); w4[3] = __byte_perm (w1[0], w0[3], selector); w4[2] = __byte_perm (w0[3], w0[2], selector); w4[1] = __byte_perm (w0[2], w0[1], selector); w4[0] = __byte_perm (w0[1], w0[0], selector); w3[3] = __byte_perm (w0[0], 0, selector); w3[2] = 0; w3[1] = 0; 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; case 16: c4[0] = __byte_perm ( 0, w7[3], selector); c3[3] = __byte_perm (w7[3], w7[2], selector); c3[2] = __byte_perm (w7[2], w7[1], selector); c3[1] = __byte_perm (w7[1], w7[0], selector); c3[0] = __byte_perm (w7[0], w6[3], selector); c2[3] = __byte_perm (w6[3], w6[2], selector); c2[2] = __byte_perm (w6[2], w6[1], selector); c2[1] = __byte_perm (w6[1], w6[0], selector); c2[0] = __byte_perm (w6[0], w5[3], selector); c1[3] = __byte_perm (w5[3], w5[2], selector); c1[2] = __byte_perm (w5[2], w5[1], selector); c1[1] = __byte_perm (w5[1], w5[0], selector); c1[0] = __byte_perm (w5[0], w4[3], selector); c0[3] = __byte_perm (w4[3], w4[2], selector); c0[2] = __byte_perm (w4[2], w4[1], selector); c0[1] = __byte_perm (w4[1], w4[0], selector); c0[0] = __byte_perm (w4[0], w3[3], selector); w7[3] = __byte_perm (w3[3], w3[2], selector); w7[2] = __byte_perm (w3[2], w3[1], selector); w7[1] = __byte_perm (w3[1], w3[0], selector); w7[0] = __byte_perm (w3[0], w2[3], selector); w6[3] = __byte_perm (w2[3], w2[2], selector); w6[2] = __byte_perm (w2[2], w2[1], selector); w6[1] = __byte_perm (w2[1], w2[0], selector); w6[0] = __byte_perm (w2[0], w1[3], selector); w5[3] = __byte_perm (w1[3], w1[2], selector); w5[2] = __byte_perm (w1[2], w1[1], selector); w5[1] = __byte_perm (w1[1], w1[0], selector); w5[0] = __byte_perm (w1[0], w0[3], selector); w4[3] = __byte_perm (w0[3], w0[2], selector); w4[2] = __byte_perm (w0[2], w0[1], selector); w4[1] = __byte_perm (w0[1], w0[0], selector); w4[0] = __byte_perm (w0[0], 0, selector); w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 17: c4[1] = __byte_perm ( 0, w7[3], selector); c4[0] = __byte_perm (w7[3], w7[2], selector); c3[3] = __byte_perm (w7[2], w7[1], selector); c3[2] = __byte_perm (w7[1], w7[0], selector); c3[1] = __byte_perm (w7[0], w6[3], selector); c3[0] = __byte_perm (w6[3], w6[2], selector); c2[3] = __byte_perm (w6[2], w6[1], selector); c2[2] = __byte_perm (w6[1], w6[0], selector); c2[1] = __byte_perm (w6[0], w5[3], selector); c2[0] = __byte_perm (w5[3], w5[2], selector); c1[3] = __byte_perm (w5[2], w5[1], selector); c1[2] = __byte_perm (w5[1], w5[0], selector); c1[1] = __byte_perm (w5[0], w4[3], selector); c1[0] = __byte_perm (w4[3], w4[2], selector); c0[3] = __byte_perm (w4[2], w4[1], selector); c0[2] = __byte_perm (w4[1], w4[0], selector); c0[1] = __byte_perm (w4[0], w3[3], selector); c0[0] = __byte_perm (w3[3], w3[2], selector); w7[3] = __byte_perm (w3[2], w3[1], selector); w7[2] = __byte_perm (w3[1], w3[0], selector); w7[1] = __byte_perm (w3[0], w2[3], selector); w7[0] = __byte_perm (w2[3], w2[2], selector); w6[3] = __byte_perm (w2[2], w2[1], selector); w6[2] = __byte_perm (w2[1], w2[0], selector); w6[1] = __byte_perm (w2[0], w1[3], selector); w6[0] = __byte_perm (w1[3], w1[2], selector); w5[3] = __byte_perm (w1[2], w1[1], selector); w5[2] = __byte_perm (w1[1], w1[0], selector); w5[1] = __byte_perm (w1[0], w0[3], selector); w5[0] = __byte_perm (w0[3], w0[2], selector); w4[3] = __byte_perm (w0[2], w0[1], selector); w4[2] = __byte_perm (w0[1], w0[0], selector); w4[1] = __byte_perm (w0[0], 0, selector); w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 18: c4[2] = __byte_perm ( 0, w7[3], selector); c4[1] = __byte_perm (w7[3], w7[2], selector); c4[0] = __byte_perm (w7[2], w7[1], selector); c3[3] = __byte_perm (w7[1], w7[0], selector); c3[2] = __byte_perm (w7[0], w6[3], selector); c3[1] = __byte_perm (w6[3], w6[2], selector); c3[0] = __byte_perm (w6[2], w6[1], selector); c2[3] = __byte_perm (w6[1], w6[0], selector); c2[2] = __byte_perm (w6[0], w5[3], selector); c2[1] = __byte_perm (w5[3], w5[2], selector); c2[0] = __byte_perm (w5[2], w5[1], selector); c1[3] = __byte_perm (w5[1], w5[0], selector); c1[2] = __byte_perm (w5[0], w4[3], selector); c1[1] = __byte_perm (w4[3], w4[2], selector); c1[0] = __byte_perm (w4[2], w4[1], selector); c0[3] = __byte_perm (w4[1], w4[0], selector); c0[2] = __byte_perm (w4[0], w3[3], selector); c0[1] = __byte_perm (w3[3], w3[2], selector); c0[0] = __byte_perm (w3[2], w3[1], selector); w7[3] = __byte_perm (w3[1], w3[0], selector); w7[2] = __byte_perm (w3[0], w2[3], selector); w7[1] = __byte_perm (w2[3], w2[2], selector); w7[0] = __byte_perm (w2[2], w2[1], selector); w6[3] = __byte_perm (w2[1], w2[0], selector); w6[2] = __byte_perm (w2[0], w1[3], selector); w6[1] = __byte_perm (w1[3], w1[2], selector); w6[0] = __byte_perm (w1[2], w1[1], selector); w5[3] = __byte_perm (w1[1], w1[0], selector); w5[2] = __byte_perm (w1[0], w0[3], selector); w5[1] = __byte_perm (w0[3], w0[2], selector); w5[0] = __byte_perm (w0[2], w0[1], selector); w4[3] = __byte_perm (w0[1], w0[0], selector); w4[2] = __byte_perm (w0[0], 0, selector); w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 19: c4[3] = __byte_perm ( 0, w7[3], selector); c4[2] = __byte_perm (w7[3], w7[2], selector); c4[1] = __byte_perm (w7[2], w7[1], selector); c4[0] = __byte_perm (w7[1], w7[0], selector); c3[3] = __byte_perm (w7[0], w6[3], selector); c3[2] = __byte_perm (w6[3], w6[2], selector); c3[1] = __byte_perm (w6[2], w6[1], selector); c3[0] = __byte_perm (w6[1], w6[0], selector); c2[3] = __byte_perm (w6[0], w5[3], selector); c2[2] = __byte_perm (w5[3], w5[2], selector); c2[1] = __byte_perm (w5[2], w5[1], selector); c2[0] = __byte_perm (w5[1], w5[0], selector); c1[3] = __byte_perm (w5[0], w4[3], selector); c1[2] = __byte_perm (w4[3], w4[2], selector); c1[1] = __byte_perm (w4[2], w4[1], selector); c1[0] = __byte_perm (w4[1], w4[0], selector); c0[3] = __byte_perm (w4[0], w3[3], selector); c0[2] = __byte_perm (w3[3], w3[2], selector); c0[1] = __byte_perm (w3[2], w3[1], selector); c0[0] = __byte_perm (w3[1], w3[0], selector); w7[3] = __byte_perm (w3[0], w2[3], selector); w7[2] = __byte_perm (w2[3], w2[2], selector); w7[1] = __byte_perm (w2[2], w2[1], selector); w7[0] = __byte_perm (w2[1], w2[0], selector); w6[3] = __byte_perm (w2[0], w1[3], selector); w6[2] = __byte_perm (w1[3], w1[2], selector); w6[1] = __byte_perm (w1[2], w1[1], selector); w6[0] = __byte_perm (w1[1], w1[0], selector); w5[3] = __byte_perm (w1[0], w0[3], selector); w5[2] = __byte_perm (w0[3], w0[2], selector); w5[1] = __byte_perm (w0[2], w0[1], selector); w5[0] = __byte_perm (w0[1], w0[0], selector); w4[3] = __byte_perm (w0[0], 0, selector); w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 20: c5[0] = __byte_perm ( 0, w7[3], selector); c4[3] = __byte_perm (w7[3], w7[2], selector); c4[2] = __byte_perm (w7[2], w7[1], selector); c4[1] = __byte_perm (w7[1], w7[0], selector); c4[0] = __byte_perm (w7[0], w6[3], selector); c3[3] = __byte_perm (w6[3], w6[2], selector); c3[2] = __byte_perm (w6[2], w6[1], selector); c3[1] = __byte_perm (w6[1], w6[0], selector); c3[0] = __byte_perm (w6[0], w5[3], selector); c2[3] = __byte_perm (w5[3], w5[2], selector); c2[2] = __byte_perm (w5[2], w5[1], selector); c2[1] = __byte_perm (w5[1], w5[0], selector); c2[0] = __byte_perm (w5[0], w4[3], selector); c1[3] = __byte_perm (w4[3], w4[2], selector); c1[2] = __byte_perm (w4[2], w4[1], selector); c1[1] = __byte_perm (w4[1], w4[0], selector); c1[0] = __byte_perm (w4[0], w3[3], selector); c0[3] = __byte_perm (w3[3], w3[2], selector); c0[2] = __byte_perm (w3[2], w3[1], selector); c0[1] = __byte_perm (w3[1], w3[0], selector); c0[0] = __byte_perm (w3[0], w2[3], selector); w7[3] = __byte_perm (w2[3], w2[2], selector); w7[2] = __byte_perm (w2[2], w2[1], selector); w7[1] = __byte_perm (w2[1], w2[0], selector); w7[0] = __byte_perm (w2[0], w1[3], selector); w6[3] = __byte_perm (w1[3], w1[2], selector); w6[2] = __byte_perm (w1[2], w1[1], selector); w6[1] = __byte_perm (w1[1], w1[0], selector); w6[0] = __byte_perm (w1[0], w0[3], selector); w5[3] = __byte_perm (w0[3], w0[2], selector); w5[2] = __byte_perm (w0[2], w0[1], selector); w5[1] = __byte_perm (w0[1], w0[0], selector); w5[0] = __byte_perm (w0[0], 0, selector); w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 21: c5[1] = __byte_perm ( 0, w7[3], selector); c5[0] = __byte_perm (w7[3], w7[2], selector); c4[3] = __byte_perm (w7[2], w7[1], selector); c4[2] = __byte_perm (w7[1], w7[0], selector); c4[1] = __byte_perm (w7[0], w6[3], selector); c4[0] = __byte_perm (w6[3], w6[2], selector); c3[3] = __byte_perm (w6[2], w6[1], selector); c3[2] = __byte_perm (w6[1], w6[0], selector); c3[1] = __byte_perm (w6[0], w5[3], selector); c3[0] = __byte_perm (w5[3], w5[2], selector); c2[3] = __byte_perm (w5[2], w5[1], selector); c2[2] = __byte_perm (w5[1], w5[0], selector); c2[1] = __byte_perm (w5[0], w4[3], selector); c2[0] = __byte_perm (w4[3], w4[2], selector); c1[3] = __byte_perm (w4[2], w4[1], selector); c1[2] = __byte_perm (w4[1], w4[0], selector); c1[1] = __byte_perm (w4[0], w3[3], selector); c1[0] = __byte_perm (w3[3], w3[2], selector); c0[3] = __byte_perm (w3[2], w3[1], selector); c0[2] = __byte_perm (w3[1], w3[0], selector); c0[1] = __byte_perm (w3[0], w2[3], selector); c0[0] = __byte_perm (w2[3], w2[2], selector); w7[3] = __byte_perm (w2[2], w2[1], selector); w7[2] = __byte_perm (w2[1], w2[0], selector); w7[1] = __byte_perm (w2[0], w1[3], selector); w7[0] = __byte_perm (w1[3], w1[2], selector); w6[3] = __byte_perm (w1[2], w1[1], selector); w6[2] = __byte_perm (w1[1], w1[0], selector); w6[1] = __byte_perm (w1[0], w0[3], selector); w6[0] = __byte_perm (w0[3], w0[2], selector); w5[3] = __byte_perm (w0[2], w0[1], selector); w5[2] = __byte_perm (w0[1], w0[0], selector); w5[1] = __byte_perm (w0[0], 0, selector); w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 22: c5[2] = __byte_perm ( 0, w7[3], selector); c5[1] = __byte_perm (w7[3], w7[2], selector); c5[0] = __byte_perm (w7[2], w7[1], selector); c4[3] = __byte_perm (w7[1], w7[0], selector); c4[2] = __byte_perm (w7[0], w6[3], selector); c4[1] = __byte_perm (w6[3], w6[2], selector); c4[0] = __byte_perm (w6[2], w6[1], selector); c3[3] = __byte_perm (w6[1], w6[0], selector); c3[2] = __byte_perm (w6[0], w5[3], selector); c3[1] = __byte_perm (w5[3], w5[2], selector); c3[0] = __byte_perm (w5[2], w5[1], selector); c2[3] = __byte_perm (w5[1], w5[0], selector); c2[2] = __byte_perm (w5[0], w4[3], selector); c2[1] = __byte_perm (w4[3], w4[2], selector); c2[0] = __byte_perm (w4[2], w4[1], selector); c1[3] = __byte_perm (w4[1], w4[0], selector); c1[2] = __byte_perm (w4[0], w3[3], selector); c1[1] = __byte_perm (w3[3], w3[2], selector); c1[0] = __byte_perm (w3[2], w3[1], selector); c0[3] = __byte_perm (w3[1], w3[0], selector); c0[2] = __byte_perm (w3[0], w2[3], selector); c0[1] = __byte_perm (w2[3], w2[2], selector); c0[0] = __byte_perm (w2[2], w2[1], selector); w7[3] = __byte_perm (w2[1], w2[0], selector); w7[2] = __byte_perm (w2[0], w1[3], selector); w7[1] = __byte_perm (w1[3], w1[2], selector); w7[0] = __byte_perm (w1[2], w1[1], selector); w6[3] = __byte_perm (w1[1], w1[0], selector); w6[2] = __byte_perm (w1[0], w0[3], selector); w6[1] = __byte_perm (w0[3], w0[2], selector); w6[0] = __byte_perm (w0[2], w0[1], selector); w5[3] = __byte_perm (w0[1], w0[0], selector); w5[2] = __byte_perm (w0[0], 0, selector); w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 23: c5[3] = __byte_perm ( 0, w7[3], selector); c5[2] = __byte_perm (w7[3], w7[2], selector); c5[1] = __byte_perm (w7[2], w7[1], selector); c5[0] = __byte_perm (w7[1], w7[0], selector); c4[3] = __byte_perm (w7[0], w6[3], selector); c4[2] = __byte_perm (w6[3], w6[2], selector); c4[1] = __byte_perm (w6[2], w6[1], selector); c4[0] = __byte_perm (w6[1], w6[0], selector); c3[3] = __byte_perm (w6[0], w5[3], selector); c3[2] = __byte_perm (w5[3], w5[2], selector); c3[1] = __byte_perm (w5[2], w5[1], selector); c3[0] = __byte_perm (w5[1], w5[0], selector); c2[3] = __byte_perm (w5[0], w4[3], selector); c2[2] = __byte_perm (w4[3], w4[2], selector); c2[1] = __byte_perm (w4[2], w4[1], selector); c2[0] = __byte_perm (w4[1], w4[0], selector); c1[3] = __byte_perm (w4[0], w3[3], selector); c1[2] = __byte_perm (w3[3], w3[2], selector); c1[1] = __byte_perm (w3[2], w3[1], selector); c1[0] = __byte_perm (w3[1], w3[0], selector); c0[3] = __byte_perm (w3[0], w2[3], selector); c0[2] = __byte_perm (w2[3], w2[2], selector); c0[1] = __byte_perm (w2[2], w2[1], selector); c0[0] = __byte_perm (w2[1], w2[0], selector); w7[3] = __byte_perm (w2[0], w1[3], selector); w7[2] = __byte_perm (w1[3], w1[2], selector); w7[1] = __byte_perm (w1[2], w1[1], selector); w7[0] = __byte_perm (w1[1], w1[0], selector); w6[3] = __byte_perm (w1[0], w0[3], selector); w6[2] = __byte_perm (w0[3], w0[2], selector); w6[1] = __byte_perm (w0[2], w0[1], selector); w6[0] = __byte_perm (w0[1], w0[0], selector); w5[3] = __byte_perm (w0[0], 0, selector); w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 24: c6[0] = __byte_perm ( 0, w7[3], selector); c5[3] = __byte_perm (w7[3], w7[2], selector); c5[2] = __byte_perm (w7[2], w7[1], selector); c5[1] = __byte_perm (w7[1], w7[0], selector); c5[0] = __byte_perm (w7[0], w6[3], selector); c4[3] = __byte_perm (w6[3], w6[2], selector); c4[2] = __byte_perm (w6[2], w6[1], selector); c4[1] = __byte_perm (w6[1], w6[0], selector); c4[0] = __byte_perm (w6[0], w5[3], selector); c3[3] = __byte_perm (w5[3], w5[2], selector); c3[2] = __byte_perm (w5[2], w5[1], selector); c3[1] = __byte_perm (w5[1], w5[0], selector); c3[0] = __byte_perm (w5[0], w4[3], selector); c2[3] = __byte_perm (w4[3], w4[2], selector); c2[2] = __byte_perm (w4[2], w4[1], selector); c2[1] = __byte_perm (w4[1], w4[0], selector); c2[0] = __byte_perm (w4[0], w3[3], selector); c1[3] = __byte_perm (w3[3], w3[2], selector); c1[2] = __byte_perm (w3[2], w3[1], selector); c1[1] = __byte_perm (w3[1], w3[0], selector); c1[0] = __byte_perm (w3[0], w2[3], selector); c0[3] = __byte_perm (w2[3], w2[2], selector); c0[2] = __byte_perm (w2[2], w2[1], selector); c0[1] = __byte_perm (w2[1], w2[0], selector); c0[0] = __byte_perm (w2[0], w1[3], selector); w7[3] = __byte_perm (w1[3], w1[2], selector); w7[2] = __byte_perm (w1[2], w1[1], selector); w7[1] = __byte_perm (w1[1], w1[0], selector); w7[0] = __byte_perm (w1[0], w0[3], selector); w6[3] = __byte_perm (w0[3], w0[2], selector); w6[2] = __byte_perm (w0[2], w0[1], selector); w6[1] = __byte_perm (w0[1], w0[0], selector); w6[0] = __byte_perm (w0[0], 0, selector); w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 25: c6[1] = __byte_perm ( 0, w7[3], selector); c6[0] = __byte_perm (w7[3], w7[2], selector); c5[3] = __byte_perm (w7[2], w7[1], selector); c5[2] = __byte_perm (w7[1], w7[0], selector); c5[1] = __byte_perm (w7[0], w6[3], selector); c5[0] = __byte_perm (w6[3], w6[2], selector); c4[3] = __byte_perm (w6[2], w6[1], selector); c4[2] = __byte_perm (w6[1], w6[0], selector); c4[1] = __byte_perm (w6[0], w5[3], selector); c4[0] = __byte_perm (w5[3], w5[2], selector); c3[3] = __byte_perm (w5[2], w5[1], selector); c3[2] = __byte_perm (w5[1], w5[0], selector); c3[1] = __byte_perm (w5[0], w4[3], selector); c3[0] = __byte_perm (w4[3], w4[2], selector); c2[3] = __byte_perm (w4[2], w4[1], selector); c2[2] = __byte_perm (w4[1], w4[0], selector); c2[1] = __byte_perm (w4[0], w3[3], selector); c2[0] = __byte_perm (w3[3], w3[2], selector); c1[3] = __byte_perm (w3[2], w3[1], selector); c1[2] = __byte_perm (w3[1], w3[0], selector); c1[1] = __byte_perm (w3[0], w2[3], selector); c1[0] = __byte_perm (w2[3], w2[2], selector); c0[3] = __byte_perm (w2[2], w2[1], selector); c0[2] = __byte_perm (w2[1], w2[0], selector); c0[1] = __byte_perm (w2[0], w1[3], selector); c0[0] = __byte_perm (w1[3], w1[2], selector); w7[3] = __byte_perm (w1[2], w1[1], selector); w7[2] = __byte_perm (w1[1], w1[0], selector); w7[1] = __byte_perm (w1[0], w0[3], selector); w7[0] = __byte_perm (w0[3], w0[2], selector); w6[3] = __byte_perm (w0[2], w0[1], selector); w6[2] = __byte_perm (w0[1], w0[0], selector); w6[1] = __byte_perm (w0[0], 0, selector); w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 26: c6[2] = __byte_perm ( 0, w7[3], selector); c6[1] = __byte_perm (w7[3], w7[2], selector); c6[0] = __byte_perm (w7[2], w7[1], selector); c5[3] = __byte_perm (w7[1], w7[0], selector); c5[2] = __byte_perm (w7[0], w6[3], selector); c5[1] = __byte_perm (w6[3], w6[2], selector); c5[0] = __byte_perm (w6[2], w6[1], selector); c4[3] = __byte_perm (w6[1], w6[0], selector); c4[2] = __byte_perm (w6[0], w5[3], selector); c4[1] = __byte_perm (w5[3], w5[2], selector); c4[0] = __byte_perm (w5[2], w5[1], selector); c3[3] = __byte_perm (w5[1], w5[0], selector); c3[2] = __byte_perm (w5[0], w4[3], selector); c3[1] = __byte_perm (w4[3], w4[2], selector); c3[0] = __byte_perm (w4[2], w4[1], selector); c2[3] = __byte_perm (w4[1], w4[0], selector); c2[2] = __byte_perm (w4[0], w3[3], selector); c2[1] = __byte_perm (w3[3], w3[2], selector); c2[0] = __byte_perm (w3[2], w3[1], selector); c1[3] = __byte_perm (w3[1], w3[0], selector); c1[2] = __byte_perm (w3[0], w2[3], selector); c1[1] = __byte_perm (w2[3], w2[2], selector); c1[0] = __byte_perm (w2[2], w2[1], selector); c0[3] = __byte_perm (w2[1], w2[0], selector); c0[2] = __byte_perm (w2[0], w1[3], selector); c0[1] = __byte_perm (w1[3], w1[2], selector); c0[0] = __byte_perm (w1[2], w1[1], selector); w7[3] = __byte_perm (w1[1], w1[0], selector); w7[2] = __byte_perm (w1[0], w0[3], selector); w7[1] = __byte_perm (w0[3], w0[2], selector); w7[0] = __byte_perm (w0[2], w0[1], selector); w6[3] = __byte_perm (w0[1], w0[0], selector); w6[2] = __byte_perm (w0[0], 0, selector); w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 27: c6[3] = __byte_perm ( 0, w7[3], selector); c6[2] = __byte_perm (w7[3], w7[2], selector); c6[1] = __byte_perm (w7[2], w7[1], selector); c6[0] = __byte_perm (w7[1], w7[0], selector); c5[3] = __byte_perm (w7[0], w6[3], selector); c5[2] = __byte_perm (w6[3], w6[2], selector); c5[1] = __byte_perm (w6[2], w6[1], selector); c5[0] = __byte_perm (w6[1], w6[0], selector); c4[3] = __byte_perm (w6[0], w5[3], selector); c4[2] = __byte_perm (w5[3], w5[2], selector); c4[1] = __byte_perm (w5[2], w5[1], selector); c4[0] = __byte_perm (w5[1], w5[0], selector); c3[3] = __byte_perm (w5[0], w4[3], selector); c3[2] = __byte_perm (w4[3], w4[2], selector); c3[1] = __byte_perm (w4[2], w4[1], selector); c3[0] = __byte_perm (w4[1], w4[0], selector); c2[3] = __byte_perm (w4[0], w3[3], selector); c2[2] = __byte_perm (w3[3], w3[2], selector); c2[1] = __byte_perm (w3[2], w3[1], selector); c2[0] = __byte_perm (w3[1], w3[0], selector); c1[3] = __byte_perm (w3[0], w2[3], selector); c1[2] = __byte_perm (w2[3], w2[2], selector); c1[1] = __byte_perm (w2[2], w2[1], selector); c1[0] = __byte_perm (w2[1], w2[0], selector); c0[3] = __byte_perm (w2[0], w1[3], selector); c0[2] = __byte_perm (w1[3], w1[2], selector); c0[1] = __byte_perm (w1[2], w1[1], selector); c0[0] = __byte_perm (w1[1], w1[0], selector); w7[3] = __byte_perm (w1[0], w0[3], selector); w7[2] = __byte_perm (w0[3], w0[2], selector); w7[1] = __byte_perm (w0[2], w0[1], selector); w7[0] = __byte_perm (w0[1], w0[0], selector); w6[3] = __byte_perm (w0[0], 0, selector); w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 28: c7[0] = __byte_perm ( 0, w7[3], selector); c6[3] = __byte_perm (w7[3], w7[2], selector); c6[2] = __byte_perm (w7[2], w7[1], selector); c6[1] = __byte_perm (w7[1], w7[0], selector); c6[0] = __byte_perm (w7[0], w6[3], selector); c5[3] = __byte_perm (w6[3], w6[2], selector); c5[2] = __byte_perm (w6[2], w6[1], selector); c5[1] = __byte_perm (w6[1], w6[0], selector); c5[0] = __byte_perm (w6[0], w5[3], selector); c4[3] = __byte_perm (w5[3], w5[2], selector); c4[2] = __byte_perm (w5[2], w5[1], selector); c4[1] = __byte_perm (w5[1], w5[0], selector); c4[0] = __byte_perm (w5[0], w4[3], selector); c3[3] = __byte_perm (w4[3], w4[2], selector); c3[2] = __byte_perm (w4[2], w4[1], selector); c3[1] = __byte_perm (w4[1], w4[0], selector); c3[0] = __byte_perm (w4[0], w3[3], selector); c2[3] = __byte_perm (w3[3], w3[2], selector); c2[2] = __byte_perm (w3[2], w3[1], selector); c2[1] = __byte_perm (w3[1], w3[0], selector); c2[0] = __byte_perm (w3[0], w2[3], selector); c1[3] = __byte_perm (w2[3], w2[2], selector); c1[2] = __byte_perm (w2[2], w2[1], selector); c1[1] = __byte_perm (w2[1], w2[0], selector); c1[0] = __byte_perm (w2[0], w1[3], selector); c0[3] = __byte_perm (w1[3], w1[2], selector); c0[2] = __byte_perm (w1[2], w1[1], selector); c0[1] = __byte_perm (w1[1], w1[0], selector); c0[0] = __byte_perm (w1[0], w0[3], selector); w7[3] = __byte_perm (w0[3], w0[2], selector); w7[2] = __byte_perm (w0[2], w0[1], selector); w7[1] = __byte_perm (w0[1], w0[0], selector); w7[0] = __byte_perm (w0[0], 0, selector); w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 29: c7[1] = __byte_perm ( 0, w7[3], selector); c7[0] = __byte_perm (w7[3], w7[2], selector); c6[3] = __byte_perm (w7[2], w7[1], selector); c6[2] = __byte_perm (w7[1], w7[0], selector); c6[1] = __byte_perm (w7[0], w6[3], selector); c6[0] = __byte_perm (w6[3], w6[2], selector); c5[3] = __byte_perm (w6[2], w6[1], selector); c5[2] = __byte_perm (w6[1], w6[0], selector); c5[1] = __byte_perm (w6[0], w5[3], selector); c5[0] = __byte_perm (w5[3], w5[2], selector); c4[3] = __byte_perm (w5[2], w5[1], selector); c4[2] = __byte_perm (w5[1], w5[0], selector); c4[1] = __byte_perm (w5[0], w4[3], selector); c4[0] = __byte_perm (w4[3], w4[2], selector); c3[3] = __byte_perm (w4[2], w4[1], selector); c3[2] = __byte_perm (w4[1], w4[0], selector); c3[1] = __byte_perm (w4[0], w3[3], selector); c3[0] = __byte_perm (w3[3], w3[2], selector); c2[3] = __byte_perm (w3[2], w3[1], selector); c2[2] = __byte_perm (w3[1], w3[0], selector); c2[1] = __byte_perm (w3[0], w2[3], selector); c2[0] = __byte_perm (w2[3], w2[2], selector); c1[3] = __byte_perm (w2[2], w2[1], selector); c1[2] = __byte_perm (w2[1], w2[0], selector); c1[1] = __byte_perm (w2[0], w1[3], selector); c1[0] = __byte_perm (w1[3], w1[2], selector); c0[3] = __byte_perm (w1[2], w1[1], selector); c0[2] = __byte_perm (w1[1], w1[0], selector); c0[1] = __byte_perm (w1[0], w0[3], selector); c0[0] = __byte_perm (w0[3], w0[2], selector); w7[3] = __byte_perm (w0[2], w0[1], selector); w7[2] = __byte_perm (w0[1], w0[0], selector); w7[1] = __byte_perm (w0[0], 0, selector); w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 30: c7[2] = __byte_perm ( 0, w7[3], selector); c7[1] = __byte_perm (w7[3], w7[2], selector); c7[0] = __byte_perm (w7[2], w7[1], selector); c6[3] = __byte_perm (w7[1], w7[0], selector); c6[2] = __byte_perm (w7[0], w6[3], selector); c6[1] = __byte_perm (w6[3], w6[2], selector); c6[0] = __byte_perm (w6[2], w6[1], selector); c5[3] = __byte_perm (w6[1], w6[0], selector); c5[2] = __byte_perm (w6[0], w5[3], selector); c5[1] = __byte_perm (w5[3], w5[2], selector); c5[0] = __byte_perm (w5[2], w5[1], selector); c4[3] = __byte_perm (w5[1], w5[0], selector); c4[2] = __byte_perm (w5[0], w4[3], selector); c4[1] = __byte_perm (w4[3], w4[2], selector); c4[0] = __byte_perm (w4[2], w4[1], selector); c3[3] = __byte_perm (w4[1], w4[0], selector); c3[2] = __byte_perm (w4[0], w3[3], selector); c3[1] = __byte_perm (w3[3], w3[2], selector); c3[0] = __byte_perm (w3[2], w3[1], selector); c2[3] = __byte_perm (w3[1], w3[0], selector); c2[2] = __byte_perm (w3[0], w2[3], selector); c2[1] = __byte_perm (w2[3], w2[2], selector); c2[0] = __byte_perm (w2[2], w2[1], selector); c1[3] = __byte_perm (w2[1], w2[0], selector); c1[2] = __byte_perm (w2[0], w1[3], selector); c1[1] = __byte_perm (w1[3], w1[2], selector); c1[0] = __byte_perm (w1[2], w1[1], selector); c0[3] = __byte_perm (w1[1], w1[0], selector); c0[2] = __byte_perm (w1[0], w0[3], selector); c0[1] = __byte_perm (w0[3], w0[2], selector); c0[0] = __byte_perm (w0[2], w0[1], selector); w7[3] = __byte_perm (w0[1], w0[0], selector); w7[2] = __byte_perm (w0[0], 0, selector); w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 31: c7[3] = __byte_perm ( 0, w7[3], selector); c7[2] = __byte_perm (w7[3], w7[2], selector); c7[1] = __byte_perm (w7[2], w7[1], selector); c7[0] = __byte_perm (w7[1], w7[0], selector); c6[3] = __byte_perm (w7[0], w6[3], selector); c6[2] = __byte_perm (w6[3], w6[2], selector); c6[1] = __byte_perm (w6[2], w6[1], selector); c6[0] = __byte_perm (w6[1], w6[0], selector); c5[3] = __byte_perm (w6[0], w5[3], selector); c5[2] = __byte_perm (w5[3], w5[2], selector); c5[1] = __byte_perm (w5[2], w5[1], selector); c5[0] = __byte_perm (w5[1], w5[0], selector); c4[3] = __byte_perm (w5[0], w4[3], selector); c4[2] = __byte_perm (w4[3], w4[2], selector); c4[1] = __byte_perm (w4[2], w4[1], selector); c4[0] = __byte_perm (w4[1], w4[0], selector); c3[3] = __byte_perm (w4[0], w3[3], selector); c3[2] = __byte_perm (w3[3], w3[2], selector); c3[1] = __byte_perm (w3[2], w3[1], selector); c3[0] = __byte_perm (w3[1], w3[0], selector); c2[3] = __byte_perm (w3[0], w2[3], selector); c2[2] = __byte_perm (w2[3], w2[2], selector); c2[1] = __byte_perm (w2[2], w2[1], selector); c2[0] = __byte_perm (w2[1], w2[0], selector); c1[3] = __byte_perm (w2[0], w1[3], selector); c1[2] = __byte_perm (w1[3], w1[2], selector); c1[1] = __byte_perm (w1[2], w1[1], selector); c1[0] = __byte_perm (w1[1], w1[0], selector); c0[3] = __byte_perm (w1[0], w0[3], selector); c0[2] = __byte_perm (w0[3], w0[2], selector); c0[1] = __byte_perm (w0[2], w0[1], selector); c0[0] = __byte_perm (w0[1], w0[0], selector); w7[3] = __byte_perm (w0[0], 0, selector); w7[2] = 0; w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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 } void switch_buffer_by_offset_1x64_le (u32x w[64], const u32 offset) { const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if (defined IS_AMD && AMD_GCN < 3) || defined IS_GENERIC #pragma unroll for (int i = 0; i < 64; i++) w[i] = swap32 (w[i]); switch (offset_switch) { case 0: w[63] = amd_bytealign (w[62], w[63], offset); w[62] = amd_bytealign (w[61], w[62], offset); w[61] = amd_bytealign (w[60], w[61], offset); w[60] = amd_bytealign (w[59], w[60], offset); w[59] = amd_bytealign (w[58], w[59], offset); w[58] = amd_bytealign (w[57], w[58], offset); w[57] = amd_bytealign (w[56], w[57], offset); w[56] = amd_bytealign (w[55], w[56], offset); w[55] = amd_bytealign (w[54], w[55], offset); w[54] = amd_bytealign (w[53], w[54], offset); w[53] = amd_bytealign (w[52], w[53], offset); w[52] = amd_bytealign (w[51], w[52], offset); w[51] = amd_bytealign (w[50], w[51], offset); w[50] = amd_bytealign (w[49], w[50], offset); w[49] = amd_bytealign (w[48], w[49], offset); w[48] = amd_bytealign (w[47], w[48], offset); w[47] = amd_bytealign (w[46], w[47], offset); w[46] = amd_bytealign (w[45], w[46], offset); w[45] = amd_bytealign (w[44], w[45], offset); w[44] = amd_bytealign (w[43], w[44], offset); w[43] = amd_bytealign (w[42], w[43], offset); w[42] = amd_bytealign (w[41], w[42], offset); w[41] = amd_bytealign (w[40], w[41], offset); w[40] = amd_bytealign (w[39], w[40], offset); w[39] = amd_bytealign (w[38], w[39], offset); w[38] = amd_bytealign (w[37], w[38], offset); w[37] = amd_bytealign (w[36], w[37], offset); w[36] = amd_bytealign (w[35], w[36], offset); w[35] = amd_bytealign (w[34], w[35], offset); w[34] = amd_bytealign (w[33], w[34], offset); w[33] = amd_bytealign (w[32], w[33], offset); w[32] = amd_bytealign (w[31], w[32], offset); w[31] = amd_bytealign (w[30], w[31], offset); w[30] = amd_bytealign (w[29], w[30], offset); w[29] = amd_bytealign (w[28], w[29], offset); w[28] = amd_bytealign (w[27], w[28], offset); w[27] = amd_bytealign (w[26], w[27], offset); w[26] = amd_bytealign (w[25], w[26], offset); w[25] = amd_bytealign (w[24], w[25], offset); w[24] = amd_bytealign (w[23], w[24], offset); w[23] = amd_bytealign (w[22], w[23], offset); w[22] = amd_bytealign (w[21], w[22], offset); w[21] = amd_bytealign (w[20], w[21], offset); w[20] = amd_bytealign (w[19], w[20], offset); w[19] = amd_bytealign (w[18], w[19], offset); w[18] = amd_bytealign (w[17], w[18], offset); w[17] = amd_bytealign (w[16], w[17], offset); w[16] = amd_bytealign (w[15], w[16], offset); w[15] = amd_bytealign (w[14], w[15], offset); w[14] = amd_bytealign (w[13], w[14], offset); w[13] = amd_bytealign (w[12], w[13], offset); w[12] = amd_bytealign (w[11], w[12], offset); w[11] = amd_bytealign (w[10], w[11], offset); w[10] = amd_bytealign (w[ 9], w[10], offset); w[ 9] = amd_bytealign (w[ 8], w[ 9], offset); w[ 8] = amd_bytealign (w[ 7], w[ 8], offset); w[ 7] = amd_bytealign (w[ 6], w[ 7], offset); w[ 6] = amd_bytealign (w[ 5], w[ 6], offset); w[ 5] = amd_bytealign (w[ 4], w[ 5], offset); w[ 4] = amd_bytealign (w[ 3], w[ 4], offset); w[ 3] = amd_bytealign (w[ 2], w[ 3], offset); w[ 2] = amd_bytealign (w[ 1], w[ 2], offset); w[ 1] = amd_bytealign (w[ 0], w[ 1], offset); w[ 0] = amd_bytealign ( 0, w[ 0], offset); break; case 1: w[63] = amd_bytealign (w[61], w[62], offset); w[62] = amd_bytealign (w[60], w[61], offset); w[61] = amd_bytealign (w[59], w[60], offset); w[60] = amd_bytealign (w[58], w[59], offset); w[59] = amd_bytealign (w[57], w[58], offset); w[58] = amd_bytealign (w[56], w[57], offset); w[57] = amd_bytealign (w[55], w[56], offset); w[56] = amd_bytealign (w[54], w[55], offset); w[55] = amd_bytealign (w[53], w[54], offset); w[54] = amd_bytealign (w[52], w[53], offset); w[53] = amd_bytealign (w[51], w[52], offset); w[52] = amd_bytealign (w[50], w[51], offset); w[51] = amd_bytealign (w[49], w[50], offset); w[50] = amd_bytealign (w[48], w[49], offset); w[49] = amd_bytealign (w[47], w[48], offset); w[48] = amd_bytealign (w[46], w[47], offset); w[47] = amd_bytealign (w[45], w[46], offset); w[46] = amd_bytealign (w[44], w[45], offset); w[45] = amd_bytealign (w[43], w[44], offset); w[44] = amd_bytealign (w[42], w[43], offset); w[43] = amd_bytealign (w[41], w[42], offset); w[42] = amd_bytealign (w[40], w[41], offset); w[41] = amd_bytealign (w[39], w[40], offset); w[40] = amd_bytealign (w[38], w[39], offset); w[39] = amd_bytealign (w[37], w[38], offset); w[38] = amd_bytealign (w[36], w[37], offset); w[37] = amd_bytealign (w[35], w[36], offset); w[36] = amd_bytealign (w[34], w[35], offset); w[35] = amd_bytealign (w[33], w[34], offset); w[34] = amd_bytealign (w[32], w[33], offset); w[33] = amd_bytealign (w[31], w[32], offset); w[32] = amd_bytealign (w[30], w[31], offset); w[31] = amd_bytealign (w[29], w[30], offset); w[30] = amd_bytealign (w[28], w[29], offset); w[29] = amd_bytealign (w[27], w[28], offset); w[28] = amd_bytealign (w[26], w[27], offset); w[27] = amd_bytealign (w[25], w[26], offset); w[26] = amd_bytealign (w[24], w[25], offset); w[25] = amd_bytealign (w[23], w[24], offset); w[24] = amd_bytealign (w[22], w[23], offset); w[23] = amd_bytealign (w[21], w[22], offset); w[22] = amd_bytealign (w[20], w[21], offset); w[21] = amd_bytealign (w[19], w[20], offset); w[20] = amd_bytealign (w[18], w[19], offset); w[19] = amd_bytealign (w[17], w[18], offset); w[18] = amd_bytealign (w[16], w[17], offset); w[17] = amd_bytealign (w[15], w[16], offset); w[16] = amd_bytealign (w[14], w[15], offset); w[15] = amd_bytealign (w[13], w[14], offset); w[14] = amd_bytealign (w[12], w[13], offset); w[13] = amd_bytealign (w[11], w[12], offset); w[12] = amd_bytealign (w[10], w[11], offset); w[11] = amd_bytealign (w[ 9], w[10], offset); w[10] = amd_bytealign (w[ 8], w[ 9], offset); w[ 9] = amd_bytealign (w[ 7], w[ 8], offset); w[ 8] = amd_bytealign (w[ 6], w[ 7], offset); w[ 7] = amd_bytealign (w[ 5], w[ 6], offset); w[ 6] = amd_bytealign (w[ 4], w[ 5], offset); w[ 5] = amd_bytealign (w[ 3], w[ 4], offset); w[ 4] = amd_bytealign (w[ 2], w[ 3], offset); w[ 3] = amd_bytealign (w[ 1], w[ 2], offset); w[ 2] = amd_bytealign (w[ 0], w[ 1], offset); w[ 1] = amd_bytealign ( 0, w[ 0], offset); w[ 0] = 0; break; case 2: w[63] = amd_bytealign (w[60], w[61], offset); w[62] = amd_bytealign (w[59], w[60], offset); w[61] = amd_bytealign (w[58], w[59], offset); w[60] = amd_bytealign (w[57], w[58], offset); w[59] = amd_bytealign (w[56], w[57], offset); w[58] = amd_bytealign (w[55], w[56], offset); w[57] = amd_bytealign (w[54], w[55], offset); w[56] = amd_bytealign (w[53], w[54], offset); w[55] = amd_bytealign (w[52], w[53], offset); w[54] = amd_bytealign (w[51], w[52], offset); w[53] = amd_bytealign (w[50], w[51], offset); w[52] = amd_bytealign (w[49], w[50], offset); w[51] = amd_bytealign (w[48], w[49], offset); w[50] = amd_bytealign (w[47], w[48], offset); w[49] = amd_bytealign (w[46], w[47], offset); w[48] = amd_bytealign (w[45], w[46], offset); w[47] = amd_bytealign (w[44], w[45], offset); w[46] = amd_bytealign (w[43], w[44], offset); w[45] = amd_bytealign (w[42], w[43], offset); w[44] = amd_bytealign (w[41], w[42], offset); w[43] = amd_bytealign (w[40], w[41], offset); w[42] = amd_bytealign (w[39], w[40], offset); w[41] = amd_bytealign (w[38], w[39], offset); w[40] = amd_bytealign (w[37], w[38], offset); w[39] = amd_bytealign (w[36], w[37], offset); w[38] = amd_bytealign (w[35], w[36], offset); w[37] = amd_bytealign (w[34], w[35], offset); w[36] = amd_bytealign (w[33], w[34], offset); w[35] = amd_bytealign (w[32], w[33], offset); w[34] = amd_bytealign (w[31], w[32], offset); w[33] = amd_bytealign (w[30], w[31], offset); w[32] = amd_bytealign (w[29], w[30], offset); w[31] = amd_bytealign (w[28], w[29], offset); w[30] = amd_bytealign (w[27], w[28], offset); w[29] = amd_bytealign (w[26], w[27], offset); w[28] = amd_bytealign (w[25], w[26], offset); w[27] = amd_bytealign (w[24], w[25], offset); w[26] = amd_bytealign (w[23], w[24], offset); w[25] = amd_bytealign (w[22], w[23], offset); w[24] = amd_bytealign (w[21], w[22], offset); w[23] = amd_bytealign (w[20], w[21], offset); w[22] = amd_bytealign (w[19], w[20], offset); w[21] = amd_bytealign (w[18], w[19], offset); w[20] = amd_bytealign (w[17], w[18], offset); w[19] = amd_bytealign (w[16], w[17], offset); w[18] = amd_bytealign (w[15], w[16], offset); w[17] = amd_bytealign (w[14], w[15], offset); w[16] = amd_bytealign (w[13], w[14], offset); w[15] = amd_bytealign (w[12], w[13], offset); w[14] = amd_bytealign (w[11], w[12], offset); w[13] = amd_bytealign (w[10], w[11], offset); w[12] = amd_bytealign (w[ 9], w[10], offset); w[11] = amd_bytealign (w[ 8], w[ 9], offset); w[10] = amd_bytealign (w[ 7], w[ 8], offset); w[ 9] = amd_bytealign (w[ 6], w[ 7], offset); w[ 8] = amd_bytealign (w[ 5], w[ 6], offset); w[ 7] = amd_bytealign (w[ 4], w[ 5], offset); w[ 6] = amd_bytealign (w[ 3], w[ 4], offset); w[ 5] = amd_bytealign (w[ 2], w[ 3], offset); w[ 4] = amd_bytealign (w[ 1], w[ 2], offset); w[ 3] = amd_bytealign (w[ 0], w[ 1], offset); w[ 2] = amd_bytealign ( 0, w[ 0], offset); w[ 1] = 0; w[ 0] = 0; break; case 3: w[63] = amd_bytealign (w[59], w[60], offset); w[62] = amd_bytealign (w[58], w[59], offset); w[61] = amd_bytealign (w[57], w[58], offset); w[60] = amd_bytealign (w[56], w[57], offset); w[59] = amd_bytealign (w[55], w[56], offset); w[58] = amd_bytealign (w[54], w[55], offset); w[57] = amd_bytealign (w[53], w[54], offset); w[56] = amd_bytealign (w[52], w[53], offset); w[55] = amd_bytealign (w[51], w[52], offset); w[54] = amd_bytealign (w[50], w[51], offset); w[53] = amd_bytealign (w[49], w[50], offset); w[52] = amd_bytealign (w[48], w[49], offset); w[51] = amd_bytealign (w[47], w[48], offset); w[50] = amd_bytealign (w[46], w[47], offset); w[49] = amd_bytealign (w[45], w[46], offset); w[48] = amd_bytealign (w[44], w[45], offset); w[47] = amd_bytealign (w[43], w[44], offset); w[46] = amd_bytealign (w[42], w[43], offset); w[45] = amd_bytealign (w[41], w[42], offset); w[44] = amd_bytealign (w[40], w[41], offset); w[43] = amd_bytealign (w[39], w[40], offset); w[42] = amd_bytealign (w[38], w[39], offset); w[41] = amd_bytealign (w[37], w[38], offset); w[40] = amd_bytealign (w[36], w[37], offset); w[39] = amd_bytealign (w[35], w[36], offset); w[38] = amd_bytealign (w[34], w[35], offset); w[37] = amd_bytealign (w[33], w[34], offset); w[36] = amd_bytealign (w[32], w[33], offset); w[35] = amd_bytealign (w[31], w[32], offset); w[34] = amd_bytealign (w[30], w[31], offset); w[33] = amd_bytealign (w[29], w[30], offset); w[32] = amd_bytealign (w[28], w[29], offset); w[31] = amd_bytealign (w[27], w[28], offset); w[30] = amd_bytealign (w[26], w[27], offset); w[29] = amd_bytealign (w[25], w[26], offset); w[28] = amd_bytealign (w[24], w[25], offset); w[27] = amd_bytealign (w[23], w[24], offset); w[26] = amd_bytealign (w[22], w[23], offset); w[25] = amd_bytealign (w[21], w[22], offset); w[24] = amd_bytealign (w[20], w[21], offset); w[23] = amd_bytealign (w[19], w[20], offset); w[22] = amd_bytealign (w[18], w[19], offset); w[21] = amd_bytealign (w[17], w[18], offset); w[20] = amd_bytealign (w[16], w[17], offset); w[19] = amd_bytealign (w[15], w[16], offset); w[18] = amd_bytealign (w[14], w[15], offset); w[17] = amd_bytealign (w[13], w[14], offset); w[16] = amd_bytealign (w[12], w[13], offset); w[15] = amd_bytealign (w[11], w[12], offset); w[14] = amd_bytealign (w[10], w[11], offset); w[13] = amd_bytealign (w[ 9], w[10], offset); w[12] = amd_bytealign (w[ 8], w[ 9], offset); w[11] = amd_bytealign (w[ 7], w[ 8], offset); w[10] = amd_bytealign (w[ 6], w[ 7], offset); w[ 9] = amd_bytealign (w[ 5], w[ 6], offset); w[ 8] = amd_bytealign (w[ 4], w[ 5], offset); w[ 7] = amd_bytealign (w[ 3], w[ 4], offset); w[ 6] = amd_bytealign (w[ 2], w[ 3], offset); w[ 5] = amd_bytealign (w[ 1], w[ 2], offset); w[ 4] = amd_bytealign (w[ 0], w[ 1], offset); w[ 3] = amd_bytealign ( 0, w[ 0], offset); w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 4: w[63] = amd_bytealign (w[58], w[59], offset); w[62] = amd_bytealign (w[57], w[58], offset); w[61] = amd_bytealign (w[56], w[57], offset); w[60] = amd_bytealign (w[55], w[56], offset); w[59] = amd_bytealign (w[54], w[55], offset); w[58] = amd_bytealign (w[53], w[54], offset); w[57] = amd_bytealign (w[52], w[53], offset); w[56] = amd_bytealign (w[51], w[52], offset); w[55] = amd_bytealign (w[50], w[51], offset); w[54] = amd_bytealign (w[49], w[50], offset); w[53] = amd_bytealign (w[48], w[49], offset); w[52] = amd_bytealign (w[47], w[48], offset); w[51] = amd_bytealign (w[46], w[47], offset); w[50] = amd_bytealign (w[45], w[46], offset); w[49] = amd_bytealign (w[44], w[45], offset); w[48] = amd_bytealign (w[43], w[44], offset); w[47] = amd_bytealign (w[42], w[43], offset); w[46] = amd_bytealign (w[41], w[42], offset); w[45] = amd_bytealign (w[40], w[41], offset); w[44] = amd_bytealign (w[39], w[40], offset); w[43] = amd_bytealign (w[38], w[39], offset); w[42] = amd_bytealign (w[37], w[38], offset); w[41] = amd_bytealign (w[36], w[37], offset); w[40] = amd_bytealign (w[35], w[36], offset); w[39] = amd_bytealign (w[34], w[35], offset); w[38] = amd_bytealign (w[33], w[34], offset); w[37] = amd_bytealign (w[32], w[33], offset); w[36] = amd_bytealign (w[31], w[32], offset); w[35] = amd_bytealign (w[30], w[31], offset); w[34] = amd_bytealign (w[29], w[30], offset); w[33] = amd_bytealign (w[28], w[29], offset); w[32] = amd_bytealign (w[27], w[28], offset); w[31] = amd_bytealign (w[26], w[27], offset); w[30] = amd_bytealign (w[25], w[26], offset); w[29] = amd_bytealign (w[24], w[25], offset); w[28] = amd_bytealign (w[23], w[24], offset); w[27] = amd_bytealign (w[22], w[23], offset); w[26] = amd_bytealign (w[21], w[22], offset); w[25] = amd_bytealign (w[20], w[21], offset); w[24] = amd_bytealign (w[19], w[20], offset); w[23] = amd_bytealign (w[18], w[19], offset); w[22] = amd_bytealign (w[17], w[18], offset); w[21] = amd_bytealign (w[16], w[17], offset); w[20] = amd_bytealign (w[15], w[16], offset); w[19] = amd_bytealign (w[14], w[15], offset); w[18] = amd_bytealign (w[13], w[14], offset); w[17] = amd_bytealign (w[12], w[13], offset); w[16] = amd_bytealign (w[11], w[12], offset); w[15] = amd_bytealign (w[10], w[11], offset); w[14] = amd_bytealign (w[ 9], w[10], offset); w[13] = amd_bytealign (w[ 8], w[ 9], offset); w[12] = amd_bytealign (w[ 7], w[ 8], offset); w[11] = amd_bytealign (w[ 6], w[ 7], offset); w[10] = amd_bytealign (w[ 5], w[ 6], offset); w[ 9] = amd_bytealign (w[ 4], w[ 5], offset); w[ 8] = amd_bytealign (w[ 3], w[ 4], offset); w[ 7] = amd_bytealign (w[ 2], w[ 3], offset); w[ 6] = amd_bytealign (w[ 1], w[ 2], offset); w[ 5] = amd_bytealign (w[ 0], w[ 1], offset); w[ 4] = amd_bytealign ( 0, w[ 0], offset); w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 5: w[63] = amd_bytealign (w[57], w[58], offset); w[62] = amd_bytealign (w[56], w[57], offset); w[61] = amd_bytealign (w[55], w[56], offset); w[60] = amd_bytealign (w[54], w[55], offset); w[59] = amd_bytealign (w[53], w[54], offset); w[58] = amd_bytealign (w[52], w[53], offset); w[57] = amd_bytealign (w[51], w[52], offset); w[56] = amd_bytealign (w[50], w[51], offset); w[55] = amd_bytealign (w[49], w[50], offset); w[54] = amd_bytealign (w[48], w[49], offset); w[53] = amd_bytealign (w[47], w[48], offset); w[52] = amd_bytealign (w[46], w[47], offset); w[51] = amd_bytealign (w[45], w[46], offset); w[50] = amd_bytealign (w[44], w[45], offset); w[49] = amd_bytealign (w[43], w[44], offset); w[48] = amd_bytealign (w[42], w[43], offset); w[47] = amd_bytealign (w[41], w[42], offset); w[46] = amd_bytealign (w[40], w[41], offset); w[45] = amd_bytealign (w[39], w[40], offset); w[44] = amd_bytealign (w[38], w[39], offset); w[43] = amd_bytealign (w[37], w[38], offset); w[42] = amd_bytealign (w[36], w[37], offset); w[41] = amd_bytealign (w[35], w[36], offset); w[40] = amd_bytealign (w[34], w[35], offset); w[39] = amd_bytealign (w[33], w[34], offset); w[38] = amd_bytealign (w[32], w[33], offset); w[37] = amd_bytealign (w[31], w[32], offset); w[36] = amd_bytealign (w[30], w[31], offset); w[35] = amd_bytealign (w[29], w[30], offset); w[34] = amd_bytealign (w[28], w[29], offset); w[33] = amd_bytealign (w[27], w[28], offset); w[32] = amd_bytealign (w[26], w[27], offset); w[31] = amd_bytealign (w[25], w[26], offset); w[30] = amd_bytealign (w[24], w[25], offset); w[29] = amd_bytealign (w[23], w[24], offset); w[28] = amd_bytealign (w[22], w[23], offset); w[27] = amd_bytealign (w[21], w[22], offset); w[26] = amd_bytealign (w[20], w[21], offset); w[25] = amd_bytealign (w[19], w[20], offset); w[24] = amd_bytealign (w[18], w[19], offset); w[23] = amd_bytealign (w[17], w[18], offset); w[22] = amd_bytealign (w[16], w[17], offset); w[21] = amd_bytealign (w[15], w[16], offset); w[20] = amd_bytealign (w[14], w[15], offset); w[19] = amd_bytealign (w[13], w[14], offset); w[18] = amd_bytealign (w[12], w[13], offset); w[17] = amd_bytealign (w[11], w[12], offset); w[16] = amd_bytealign (w[10], w[11], offset); w[15] = amd_bytealign (w[ 9], w[10], offset); w[14] = amd_bytealign (w[ 8], w[ 9], offset); w[13] = amd_bytealign (w[ 7], w[ 8], offset); w[12] = amd_bytealign (w[ 6], w[ 7], offset); w[11] = amd_bytealign (w[ 5], w[ 6], offset); w[10] = amd_bytealign (w[ 4], w[ 5], offset); w[ 9] = amd_bytealign (w[ 3], w[ 4], offset); w[ 8] = amd_bytealign (w[ 2], w[ 3], offset); w[ 7] = amd_bytealign (w[ 1], w[ 2], offset); w[ 6] = amd_bytealign (w[ 0], w[ 1], offset); w[ 5] = amd_bytealign ( 0, w[ 0], offset); w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 6: w[63] = amd_bytealign (w[56], w[57], offset); w[62] = amd_bytealign (w[55], w[56], offset); w[61] = amd_bytealign (w[54], w[55], offset); w[60] = amd_bytealign (w[53], w[54], offset); w[59] = amd_bytealign (w[52], w[53], offset); w[58] = amd_bytealign (w[51], w[52], offset); w[57] = amd_bytealign (w[50], w[51], offset); w[56] = amd_bytealign (w[49], w[50], offset); w[55] = amd_bytealign (w[48], w[49], offset); w[54] = amd_bytealign (w[47], w[48], offset); w[53] = amd_bytealign (w[46], w[47], offset); w[52] = amd_bytealign (w[45], w[46], offset); w[51] = amd_bytealign (w[44], w[45], offset); w[50] = amd_bytealign (w[43], w[44], offset); w[49] = amd_bytealign (w[42], w[43], offset); w[48] = amd_bytealign (w[41], w[42], offset); w[47] = amd_bytealign (w[40], w[41], offset); w[46] = amd_bytealign (w[39], w[40], offset); w[45] = amd_bytealign (w[38], w[39], offset); w[44] = amd_bytealign (w[37], w[38], offset); w[43] = amd_bytealign (w[36], w[37], offset); w[42] = amd_bytealign (w[35], w[36], offset); w[41] = amd_bytealign (w[34], w[35], offset); w[40] = amd_bytealign (w[33], w[34], offset); w[39] = amd_bytealign (w[32], w[33], offset); w[38] = amd_bytealign (w[31], w[32], offset); w[37] = amd_bytealign (w[30], w[31], offset); w[36] = amd_bytealign (w[29], w[30], offset); w[35] = amd_bytealign (w[28], w[29], offset); w[34] = amd_bytealign (w[27], w[28], offset); w[33] = amd_bytealign (w[26], w[27], offset); w[32] = amd_bytealign (w[25], w[26], offset); w[31] = amd_bytealign (w[24], w[25], offset); w[30] = amd_bytealign (w[23], w[24], offset); w[29] = amd_bytealign (w[22], w[23], offset); w[28] = amd_bytealign (w[21], w[22], offset); w[27] = amd_bytealign (w[20], w[21], offset); w[26] = amd_bytealign (w[19], w[20], offset); w[25] = amd_bytealign (w[18], w[19], offset); w[24] = amd_bytealign (w[17], w[18], offset); w[23] = amd_bytealign (w[16], w[17], offset); w[22] = amd_bytealign (w[15], w[16], offset); w[21] = amd_bytealign (w[14], w[15], offset); w[20] = amd_bytealign (w[13], w[14], offset); w[19] = amd_bytealign (w[12], w[13], offset); w[18] = amd_bytealign (w[11], w[12], offset); w[17] = amd_bytealign (w[10], w[11], offset); w[16] = amd_bytealign (w[ 9], w[10], offset); w[15] = amd_bytealign (w[ 8], w[ 9], offset); w[14] = amd_bytealign (w[ 7], w[ 8], offset); w[13] = amd_bytealign (w[ 6], w[ 7], offset); w[12] = amd_bytealign (w[ 5], w[ 6], offset); w[11] = amd_bytealign (w[ 4], w[ 5], offset); w[10] = amd_bytealign (w[ 3], w[ 4], offset); w[ 9] = amd_bytealign (w[ 2], w[ 3], offset); w[ 8] = amd_bytealign (w[ 1], w[ 2], offset); w[ 7] = amd_bytealign (w[ 0], w[ 1], offset); w[ 6] = amd_bytealign ( 0, w[ 0], offset); w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 7: w[63] = amd_bytealign (w[55], w[56], offset); w[62] = amd_bytealign (w[54], w[55], offset); w[61] = amd_bytealign (w[53], w[54], offset); w[60] = amd_bytealign (w[52], w[53], offset); w[59] = amd_bytealign (w[51], w[52], offset); w[58] = amd_bytealign (w[50], w[51], offset); w[57] = amd_bytealign (w[49], w[50], offset); w[56] = amd_bytealign (w[48], w[49], offset); w[55] = amd_bytealign (w[47], w[48], offset); w[54] = amd_bytealign (w[46], w[47], offset); w[53] = amd_bytealign (w[45], w[46], offset); w[52] = amd_bytealign (w[44], w[45], offset); w[51] = amd_bytealign (w[43], w[44], offset); w[50] = amd_bytealign (w[42], w[43], offset); w[49] = amd_bytealign (w[41], w[42], offset); w[48] = amd_bytealign (w[40], w[41], offset); w[47] = amd_bytealign (w[39], w[40], offset); w[46] = amd_bytealign (w[38], w[39], offset); w[45] = amd_bytealign (w[37], w[38], offset); w[44] = amd_bytealign (w[36], w[37], offset); w[43] = amd_bytealign (w[35], w[36], offset); w[42] = amd_bytealign (w[34], w[35], offset); w[41] = amd_bytealign (w[33], w[34], offset); w[40] = amd_bytealign (w[32], w[33], offset); w[39] = amd_bytealign (w[31], w[32], offset); w[38] = amd_bytealign (w[30], w[31], offset); w[37] = amd_bytealign (w[29], w[30], offset); w[36] = amd_bytealign (w[28], w[29], offset); w[35] = amd_bytealign (w[27], w[28], offset); w[34] = amd_bytealign (w[26], w[27], offset); w[33] = amd_bytealign (w[25], w[26], offset); w[32] = amd_bytealign (w[24], w[25], offset); w[31] = amd_bytealign (w[23], w[24], offset); w[30] = amd_bytealign (w[22], w[23], offset); w[29] = amd_bytealign (w[21], w[22], offset); w[28] = amd_bytealign (w[20], w[21], offset); w[27] = amd_bytealign (w[19], w[20], offset); w[26] = amd_bytealign (w[18], w[19], offset); w[25] = amd_bytealign (w[17], w[18], offset); w[24] = amd_bytealign (w[16], w[17], offset); w[23] = amd_bytealign (w[15], w[16], offset); w[22] = amd_bytealign (w[14], w[15], offset); w[21] = amd_bytealign (w[13], w[14], offset); w[20] = amd_bytealign (w[12], w[13], offset); w[19] = amd_bytealign (w[11], w[12], offset); w[18] = amd_bytealign (w[10], w[11], offset); w[17] = amd_bytealign (w[ 9], w[10], offset); w[16] = amd_bytealign (w[ 8], w[ 9], offset); w[15] = amd_bytealign (w[ 7], w[ 8], offset); w[14] = amd_bytealign (w[ 6], w[ 7], offset); w[13] = amd_bytealign (w[ 5], w[ 6], offset); w[12] = amd_bytealign (w[ 4], w[ 5], offset); w[11] = amd_bytealign (w[ 3], w[ 4], offset); w[10] = amd_bytealign (w[ 2], w[ 3], offset); w[ 9] = amd_bytealign (w[ 1], w[ 2], offset); w[ 8] = amd_bytealign (w[ 0], w[ 1], offset); w[ 7] = amd_bytealign ( 0, w[ 0], offset); w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 8: w[63] = amd_bytealign (w[54], w[55], offset); w[62] = amd_bytealign (w[53], w[54], offset); w[61] = amd_bytealign (w[52], w[53], offset); w[60] = amd_bytealign (w[51], w[52], offset); w[59] = amd_bytealign (w[50], w[51], offset); w[58] = amd_bytealign (w[49], w[50], offset); w[57] = amd_bytealign (w[48], w[49], offset); w[56] = amd_bytealign (w[47], w[48], offset); w[55] = amd_bytealign (w[46], w[47], offset); w[54] = amd_bytealign (w[45], w[46], offset); w[53] = amd_bytealign (w[44], w[45], offset); w[52] = amd_bytealign (w[43], w[44], offset); w[51] = amd_bytealign (w[42], w[43], offset); w[50] = amd_bytealign (w[41], w[42], offset); w[49] = amd_bytealign (w[40], w[41], offset); w[48] = amd_bytealign (w[39], w[40], offset); w[47] = amd_bytealign (w[38], w[39], offset); w[46] = amd_bytealign (w[37], w[38], offset); w[45] = amd_bytealign (w[36], w[37], offset); w[44] = amd_bytealign (w[35], w[36], offset); w[43] = amd_bytealign (w[34], w[35], offset); w[42] = amd_bytealign (w[33], w[34], offset); w[41] = amd_bytealign (w[32], w[33], offset); w[40] = amd_bytealign (w[31], w[32], offset); w[39] = amd_bytealign (w[30], w[31], offset); w[38] = amd_bytealign (w[29], w[30], offset); w[37] = amd_bytealign (w[28], w[29], offset); w[36] = amd_bytealign (w[27], w[28], offset); w[35] = amd_bytealign (w[26], w[27], offset); w[34] = amd_bytealign (w[25], w[26], offset); w[33] = amd_bytealign (w[24], w[25], offset); w[32] = amd_bytealign (w[23], w[24], offset); w[31] = amd_bytealign (w[22], w[23], offset); w[30] = amd_bytealign (w[21], w[22], offset); w[29] = amd_bytealign (w[20], w[21], offset); w[28] = amd_bytealign (w[19], w[20], offset); w[27] = amd_bytealign (w[18], w[19], offset); w[26] = amd_bytealign (w[17], w[18], offset); w[25] = amd_bytealign (w[16], w[17], offset); w[24] = amd_bytealign (w[15], w[16], offset); w[23] = amd_bytealign (w[14], w[15], offset); w[22] = amd_bytealign (w[13], w[14], offset); w[21] = amd_bytealign (w[12], w[13], offset); w[20] = amd_bytealign (w[11], w[12], offset); w[19] = amd_bytealign (w[10], w[11], offset); w[18] = amd_bytealign (w[ 9], w[10], offset); w[17] = amd_bytealign (w[ 8], w[ 9], offset); w[16] = amd_bytealign (w[ 7], w[ 8], offset); w[15] = amd_bytealign (w[ 6], w[ 7], offset); w[14] = amd_bytealign (w[ 5], w[ 6], offset); w[13] = amd_bytealign (w[ 4], w[ 5], offset); w[12] = amd_bytealign (w[ 3], w[ 4], offset); w[11] = amd_bytealign (w[ 2], w[ 3], offset); w[10] = amd_bytealign (w[ 1], w[ 2], offset); w[ 9] = amd_bytealign (w[ 0], w[ 1], offset); w[ 8] = amd_bytealign ( 0, w[ 0], offset); w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 9: w[63] = amd_bytealign (w[53], w[54], offset); w[62] = amd_bytealign (w[52], w[53], offset); w[61] = amd_bytealign (w[51], w[52], offset); w[60] = amd_bytealign (w[50], w[51], offset); w[59] = amd_bytealign (w[49], w[50], offset); w[58] = amd_bytealign (w[48], w[49], offset); w[57] = amd_bytealign (w[47], w[48], offset); w[56] = amd_bytealign (w[46], w[47], offset); w[55] = amd_bytealign (w[45], w[46], offset); w[54] = amd_bytealign (w[44], w[45], offset); w[53] = amd_bytealign (w[43], w[44], offset); w[52] = amd_bytealign (w[42], w[43], offset); w[51] = amd_bytealign (w[41], w[42], offset); w[50] = amd_bytealign (w[40], w[41], offset); w[49] = amd_bytealign (w[39], w[40], offset); w[48] = amd_bytealign (w[38], w[39], offset); w[47] = amd_bytealign (w[37], w[38], offset); w[46] = amd_bytealign (w[36], w[37], offset); w[45] = amd_bytealign (w[35], w[36], offset); w[44] = amd_bytealign (w[34], w[35], offset); w[43] = amd_bytealign (w[33], w[34], offset); w[42] = amd_bytealign (w[32], w[33], offset); w[41] = amd_bytealign (w[31], w[32], offset); w[40] = amd_bytealign (w[30], w[31], offset); w[39] = amd_bytealign (w[29], w[30], offset); w[38] = amd_bytealign (w[28], w[29], offset); w[37] = amd_bytealign (w[27], w[28], offset); w[36] = amd_bytealign (w[26], w[27], offset); w[35] = amd_bytealign (w[25], w[26], offset); w[34] = amd_bytealign (w[24], w[25], offset); w[33] = amd_bytealign (w[23], w[24], offset); w[32] = amd_bytealign (w[22], w[23], offset); w[31] = amd_bytealign (w[21], w[22], offset); w[30] = amd_bytealign (w[20], w[21], offset); w[29] = amd_bytealign (w[19], w[20], offset); w[28] = amd_bytealign (w[18], w[19], offset); w[27] = amd_bytealign (w[17], w[18], offset); w[26] = amd_bytealign (w[16], w[17], offset); w[25] = amd_bytealign (w[15], w[16], offset); w[24] = amd_bytealign (w[14], w[15], offset); w[23] = amd_bytealign (w[13], w[14], offset); w[22] = amd_bytealign (w[12], w[13], offset); w[21] = amd_bytealign (w[11], w[12], offset); w[20] = amd_bytealign (w[10], w[11], offset); w[19] = amd_bytealign (w[ 9], w[10], offset); w[18] = amd_bytealign (w[ 8], w[ 9], offset); w[17] = amd_bytealign (w[ 7], w[ 8], offset); w[16] = amd_bytealign (w[ 6], w[ 7], offset); w[15] = amd_bytealign (w[ 5], w[ 6], offset); w[14] = amd_bytealign (w[ 4], w[ 5], offset); w[13] = amd_bytealign (w[ 3], w[ 4], offset); w[12] = amd_bytealign (w[ 2], w[ 3], offset); w[11] = amd_bytealign (w[ 1], w[ 2], offset); w[10] = amd_bytealign (w[ 0], w[ 1], offset); w[ 9] = amd_bytealign ( 0, w[ 0], offset); w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 10: w[63] = amd_bytealign (w[52], w[53], offset); w[62] = amd_bytealign (w[51], w[52], offset); w[61] = amd_bytealign (w[50], w[51], offset); w[60] = amd_bytealign (w[49], w[50], offset); w[59] = amd_bytealign (w[48], w[49], offset); w[58] = amd_bytealign (w[47], w[48], offset); w[57] = amd_bytealign (w[46], w[47], offset); w[56] = amd_bytealign (w[45], w[46], offset); w[55] = amd_bytealign (w[44], w[45], offset); w[54] = amd_bytealign (w[43], w[44], offset); w[53] = amd_bytealign (w[42], w[43], offset); w[52] = amd_bytealign (w[41], w[42], offset); w[51] = amd_bytealign (w[40], w[41], offset); w[50] = amd_bytealign (w[39], w[40], offset); w[49] = amd_bytealign (w[38], w[39], offset); w[48] = amd_bytealign (w[37], w[38], offset); w[47] = amd_bytealign (w[36], w[37], offset); w[46] = amd_bytealign (w[35], w[36], offset); w[45] = amd_bytealign (w[34], w[35], offset); w[44] = amd_bytealign (w[33], w[34], offset); w[43] = amd_bytealign (w[32], w[33], offset); w[42] = amd_bytealign (w[31], w[32], offset); w[41] = amd_bytealign (w[30], w[31], offset); w[40] = amd_bytealign (w[29], w[30], offset); w[39] = amd_bytealign (w[28], w[29], offset); w[38] = amd_bytealign (w[27], w[28], offset); w[37] = amd_bytealign (w[26], w[27], offset); w[36] = amd_bytealign (w[25], w[26], offset); w[35] = amd_bytealign (w[24], w[25], offset); w[34] = amd_bytealign (w[23], w[24], offset); w[33] = amd_bytealign (w[22], w[23], offset); w[32] = amd_bytealign (w[21], w[22], offset); w[31] = amd_bytealign (w[20], w[21], offset); w[30] = amd_bytealign (w[19], w[20], offset); w[29] = amd_bytealign (w[18], w[19], offset); w[28] = amd_bytealign (w[17], w[18], offset); w[27] = amd_bytealign (w[16], w[17], offset); w[26] = amd_bytealign (w[15], w[16], offset); w[25] = amd_bytealign (w[14], w[15], offset); w[24] = amd_bytealign (w[13], w[14], offset); w[23] = amd_bytealign (w[12], w[13], offset); w[22] = amd_bytealign (w[11], w[12], offset); w[21] = amd_bytealign (w[10], w[11], offset); w[20] = amd_bytealign (w[ 9], w[10], offset); w[19] = amd_bytealign (w[ 8], w[ 9], offset); w[18] = amd_bytealign (w[ 7], w[ 8], offset); w[17] = amd_bytealign (w[ 6], w[ 7], offset); w[16] = amd_bytealign (w[ 5], w[ 6], offset); w[15] = amd_bytealign (w[ 4], w[ 5], offset); w[14] = amd_bytealign (w[ 3], w[ 4], offset); w[13] = amd_bytealign (w[ 2], w[ 3], offset); w[12] = amd_bytealign (w[ 1], w[ 2], offset); w[11] = amd_bytealign (w[ 0], w[ 1], offset); w[10] = amd_bytealign ( 0, w[ 0], offset); w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 11: w[63] = amd_bytealign (w[51], w[52], offset); w[62] = amd_bytealign (w[50], w[51], offset); w[61] = amd_bytealign (w[49], w[50], offset); w[60] = amd_bytealign (w[48], w[49], offset); w[59] = amd_bytealign (w[47], w[48], offset); w[58] = amd_bytealign (w[46], w[47], offset); w[57] = amd_bytealign (w[45], w[46], offset); w[56] = amd_bytealign (w[44], w[45], offset); w[55] = amd_bytealign (w[43], w[44], offset); w[54] = amd_bytealign (w[42], w[43], offset); w[53] = amd_bytealign (w[41], w[42], offset); w[52] = amd_bytealign (w[40], w[41], offset); w[51] = amd_bytealign (w[39], w[40], offset); w[50] = amd_bytealign (w[38], w[39], offset); w[49] = amd_bytealign (w[37], w[38], offset); w[48] = amd_bytealign (w[36], w[37], offset); w[47] = amd_bytealign (w[35], w[36], offset); w[46] = amd_bytealign (w[34], w[35], offset); w[45] = amd_bytealign (w[33], w[34], offset); w[44] = amd_bytealign (w[32], w[33], offset); w[43] = amd_bytealign (w[31], w[32], offset); w[42] = amd_bytealign (w[30], w[31], offset); w[41] = amd_bytealign (w[29], w[30], offset); w[40] = amd_bytealign (w[28], w[29], offset); w[39] = amd_bytealign (w[27], w[28], offset); w[38] = amd_bytealign (w[26], w[27], offset); w[37] = amd_bytealign (w[25], w[26], offset); w[36] = amd_bytealign (w[24], w[25], offset); w[35] = amd_bytealign (w[23], w[24], offset); w[34] = amd_bytealign (w[22], w[23], offset); w[33] = amd_bytealign (w[21], w[22], offset); w[32] = amd_bytealign (w[20], w[21], offset); w[31] = amd_bytealign (w[19], w[20], offset); w[30] = amd_bytealign (w[18], w[19], offset); w[29] = amd_bytealign (w[17], w[18], offset); w[28] = amd_bytealign (w[16], w[17], offset); w[27] = amd_bytealign (w[15], w[16], offset); w[26] = amd_bytealign (w[14], w[15], offset); w[25] = amd_bytealign (w[13], w[14], offset); w[24] = amd_bytealign (w[12], w[13], offset); w[23] = amd_bytealign (w[11], w[12], offset); w[22] = amd_bytealign (w[10], w[11], offset); w[21] = amd_bytealign (w[ 9], w[10], offset); w[20] = amd_bytealign (w[ 8], w[ 9], offset); w[19] = amd_bytealign (w[ 7], w[ 8], offset); w[18] = amd_bytealign (w[ 6], w[ 7], offset); w[17] = amd_bytealign (w[ 5], w[ 6], offset); w[16] = amd_bytealign (w[ 4], w[ 5], offset); w[15] = amd_bytealign (w[ 3], w[ 4], offset); w[14] = amd_bytealign (w[ 2], w[ 3], offset); w[13] = amd_bytealign (w[ 1], w[ 2], offset); w[12] = amd_bytealign (w[ 0], w[ 1], offset); w[11] = amd_bytealign ( 0, w[ 0], offset); w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 12: w[63] = amd_bytealign (w[50], w[51], offset); w[62] = amd_bytealign (w[49], w[50], offset); w[61] = amd_bytealign (w[48], w[49], offset); w[60] = amd_bytealign (w[47], w[48], offset); w[59] = amd_bytealign (w[46], w[47], offset); w[58] = amd_bytealign (w[45], w[46], offset); w[57] = amd_bytealign (w[44], w[45], offset); w[56] = amd_bytealign (w[43], w[44], offset); w[55] = amd_bytealign (w[42], w[43], offset); w[54] = amd_bytealign (w[41], w[42], offset); w[53] = amd_bytealign (w[40], w[41], offset); w[52] = amd_bytealign (w[39], w[40], offset); w[51] = amd_bytealign (w[38], w[39], offset); w[50] = amd_bytealign (w[37], w[38], offset); w[49] = amd_bytealign (w[36], w[37], offset); w[48] = amd_bytealign (w[35], w[36], offset); w[47] = amd_bytealign (w[34], w[35], offset); w[46] = amd_bytealign (w[33], w[34], offset); w[45] = amd_bytealign (w[32], w[33], offset); w[44] = amd_bytealign (w[31], w[32], offset); w[43] = amd_bytealign (w[30], w[31], offset); w[42] = amd_bytealign (w[29], w[30], offset); w[41] = amd_bytealign (w[28], w[29], offset); w[40] = amd_bytealign (w[27], w[28], offset); w[39] = amd_bytealign (w[26], w[27], offset); w[38] = amd_bytealign (w[25], w[26], offset); w[37] = amd_bytealign (w[24], w[25], offset); w[36] = amd_bytealign (w[23], w[24], offset); w[35] = amd_bytealign (w[22], w[23], offset); w[34] = amd_bytealign (w[21], w[22], offset); w[33] = amd_bytealign (w[20], w[21], offset); w[32] = amd_bytealign (w[19], w[20], offset); w[31] = amd_bytealign (w[18], w[19], offset); w[30] = amd_bytealign (w[17], w[18], offset); w[29] = amd_bytealign (w[16], w[17], offset); w[28] = amd_bytealign (w[15], w[16], offset); w[27] = amd_bytealign (w[14], w[15], offset); w[26] = amd_bytealign (w[13], w[14], offset); w[25] = amd_bytealign (w[12], w[13], offset); w[24] = amd_bytealign (w[11], w[12], offset); w[23] = amd_bytealign (w[10], w[11], offset); w[22] = amd_bytealign (w[ 9], w[10], offset); w[21] = amd_bytealign (w[ 8], w[ 9], offset); w[20] = amd_bytealign (w[ 7], w[ 8], offset); w[19] = amd_bytealign (w[ 6], w[ 7], offset); w[18] = amd_bytealign (w[ 5], w[ 6], offset); w[17] = amd_bytealign (w[ 4], w[ 5], offset); w[16] = amd_bytealign (w[ 3], w[ 4], offset); w[15] = amd_bytealign (w[ 2], w[ 3], offset); w[14] = amd_bytealign (w[ 1], w[ 2], offset); w[13] = amd_bytealign (w[ 0], w[ 1], offset); w[12] = amd_bytealign ( 0, w[ 0], offset); w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 13: w[63] = amd_bytealign (w[49], w[50], offset); w[62] = amd_bytealign (w[48], w[49], offset); w[61] = amd_bytealign (w[47], w[48], offset); w[60] = amd_bytealign (w[46], w[47], offset); w[59] = amd_bytealign (w[45], w[46], offset); w[58] = amd_bytealign (w[44], w[45], offset); w[57] = amd_bytealign (w[43], w[44], offset); w[56] = amd_bytealign (w[42], w[43], offset); w[55] = amd_bytealign (w[41], w[42], offset); w[54] = amd_bytealign (w[40], w[41], offset); w[53] = amd_bytealign (w[39], w[40], offset); w[52] = amd_bytealign (w[38], w[39], offset); w[51] = amd_bytealign (w[37], w[38], offset); w[50] = amd_bytealign (w[36], w[37], offset); w[49] = amd_bytealign (w[35], w[36], offset); w[48] = amd_bytealign (w[34], w[35], offset); w[47] = amd_bytealign (w[33], w[34], offset); w[46] = amd_bytealign (w[32], w[33], offset); w[45] = amd_bytealign (w[31], w[32], offset); w[44] = amd_bytealign (w[30], w[31], offset); w[43] = amd_bytealign (w[29], w[30], offset); w[42] = amd_bytealign (w[28], w[29], offset); w[41] = amd_bytealign (w[27], w[28], offset); w[40] = amd_bytealign (w[26], w[27], offset); w[39] = amd_bytealign (w[25], w[26], offset); w[38] = amd_bytealign (w[24], w[25], offset); w[37] = amd_bytealign (w[23], w[24], offset); w[36] = amd_bytealign (w[22], w[23], offset); w[35] = amd_bytealign (w[21], w[22], offset); w[34] = amd_bytealign (w[20], w[21], offset); w[33] = amd_bytealign (w[19], w[20], offset); w[32] = amd_bytealign (w[18], w[19], offset); w[31] = amd_bytealign (w[17], w[18], offset); w[30] = amd_bytealign (w[16], w[17], offset); w[29] = amd_bytealign (w[15], w[16], offset); w[28] = amd_bytealign (w[14], w[15], offset); w[27] = amd_bytealign (w[13], w[14], offset); w[26] = amd_bytealign (w[12], w[13], offset); w[25] = amd_bytealign (w[11], w[12], offset); w[24] = amd_bytealign (w[10], w[11], offset); w[23] = amd_bytealign (w[ 9], w[10], offset); w[22] = amd_bytealign (w[ 8], w[ 9], offset); w[21] = amd_bytealign (w[ 7], w[ 8], offset); w[20] = amd_bytealign (w[ 6], w[ 7], offset); w[19] = amd_bytealign (w[ 5], w[ 6], offset); w[18] = amd_bytealign (w[ 4], w[ 5], offset); w[17] = amd_bytealign (w[ 3], w[ 4], offset); w[16] = amd_bytealign (w[ 2], w[ 3], offset); w[15] = amd_bytealign (w[ 1], w[ 2], offset); w[14] = amd_bytealign (w[ 0], w[ 1], offset); w[13] = amd_bytealign ( 0, w[ 0], offset); w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 14: w[63] = amd_bytealign (w[48], w[49], offset); w[62] = amd_bytealign (w[47], w[48], offset); w[61] = amd_bytealign (w[46], w[47], offset); w[60] = amd_bytealign (w[45], w[46], offset); w[59] = amd_bytealign (w[44], w[45], offset); w[58] = amd_bytealign (w[43], w[44], offset); w[57] = amd_bytealign (w[42], w[43], offset); w[56] = amd_bytealign (w[41], w[42], offset); w[55] = amd_bytealign (w[40], w[41], offset); w[54] = amd_bytealign (w[39], w[40], offset); w[53] = amd_bytealign (w[38], w[39], offset); w[52] = amd_bytealign (w[37], w[38], offset); w[51] = amd_bytealign (w[36], w[37], offset); w[50] = amd_bytealign (w[35], w[36], offset); w[49] = amd_bytealign (w[34], w[35], offset); w[48] = amd_bytealign (w[33], w[34], offset); w[47] = amd_bytealign (w[32], w[33], offset); w[46] = amd_bytealign (w[31], w[32], offset); w[45] = amd_bytealign (w[30], w[31], offset); w[44] = amd_bytealign (w[29], w[30], offset); w[43] = amd_bytealign (w[28], w[29], offset); w[42] = amd_bytealign (w[27], w[28], offset); w[41] = amd_bytealign (w[26], w[27], offset); w[40] = amd_bytealign (w[25], w[26], offset); w[39] = amd_bytealign (w[24], w[25], offset); w[38] = amd_bytealign (w[23], w[24], offset); w[37] = amd_bytealign (w[22], w[23], offset); w[36] = amd_bytealign (w[21], w[22], offset); w[35] = amd_bytealign (w[20], w[21], offset); w[34] = amd_bytealign (w[19], w[20], offset); w[33] = amd_bytealign (w[18], w[19], offset); w[32] = amd_bytealign (w[17], w[18], offset); w[31] = amd_bytealign (w[16], w[17], offset); w[30] = amd_bytealign (w[15], w[16], offset); w[29] = amd_bytealign (w[14], w[15], offset); w[28] = amd_bytealign (w[13], w[14], offset); w[27] = amd_bytealign (w[12], w[13], offset); w[26] = amd_bytealign (w[11], w[12], offset); w[25] = amd_bytealign (w[10], w[11], offset); w[24] = amd_bytealign (w[ 9], w[10], offset); w[23] = amd_bytealign (w[ 8], w[ 9], offset); w[22] = amd_bytealign (w[ 7], w[ 8], offset); w[21] = amd_bytealign (w[ 6], w[ 7], offset); w[20] = amd_bytealign (w[ 5], w[ 6], offset); w[19] = amd_bytealign (w[ 4], w[ 5], offset); w[18] = amd_bytealign (w[ 3], w[ 4], offset); w[17] = amd_bytealign (w[ 2], w[ 3], offset); w[16] = amd_bytealign (w[ 1], w[ 2], offset); w[15] = amd_bytealign (w[ 0], w[ 1], offset); w[14] = amd_bytealign ( 0, w[ 0], offset); w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 15: w[63] = amd_bytealign (w[47], w[48], offset); w[62] = amd_bytealign (w[46], w[47], offset); w[61] = amd_bytealign (w[45], w[46], offset); w[60] = amd_bytealign (w[44], w[45], offset); w[59] = amd_bytealign (w[43], w[44], offset); w[58] = amd_bytealign (w[42], w[43], offset); w[57] = amd_bytealign (w[41], w[42], offset); w[56] = amd_bytealign (w[40], w[41], offset); w[55] = amd_bytealign (w[39], w[40], offset); w[54] = amd_bytealign (w[38], w[39], offset); w[53] = amd_bytealign (w[37], w[38], offset); w[52] = amd_bytealign (w[36], w[37], offset); w[51] = amd_bytealign (w[35], w[36], offset); w[50] = amd_bytealign (w[34], w[35], offset); w[49] = amd_bytealign (w[33], w[34], offset); w[48] = amd_bytealign (w[32], w[33], offset); w[47] = amd_bytealign (w[31], w[32], offset); w[46] = amd_bytealign (w[30], w[31], offset); w[45] = amd_bytealign (w[29], w[30], offset); w[44] = amd_bytealign (w[28], w[29], offset); w[43] = amd_bytealign (w[27], w[28], offset); w[42] = amd_bytealign (w[26], w[27], offset); w[41] = amd_bytealign (w[25], w[26], offset); w[40] = amd_bytealign (w[24], w[25], offset); w[39] = amd_bytealign (w[23], w[24], offset); w[38] = amd_bytealign (w[22], w[23], offset); w[37] = amd_bytealign (w[21], w[22], offset); w[36] = amd_bytealign (w[20], w[21], offset); w[35] = amd_bytealign (w[19], w[20], offset); w[34] = amd_bytealign (w[18], w[19], offset); w[33] = amd_bytealign (w[17], w[18], offset); w[32] = amd_bytealign (w[16], w[17], offset); w[31] = amd_bytealign (w[15], w[16], offset); w[30] = amd_bytealign (w[14], w[15], offset); w[29] = amd_bytealign (w[13], w[14], offset); w[28] = amd_bytealign (w[12], w[13], offset); w[27] = amd_bytealign (w[11], w[12], offset); w[26] = amd_bytealign (w[10], w[11], offset); w[25] = amd_bytealign (w[ 9], w[10], offset); w[24] = amd_bytealign (w[ 8], w[ 9], offset); w[23] = amd_bytealign (w[ 7], w[ 8], offset); w[22] = amd_bytealign (w[ 6], w[ 7], offset); w[21] = amd_bytealign (w[ 5], w[ 6], offset); w[20] = amd_bytealign (w[ 4], w[ 5], offset); w[19] = amd_bytealign (w[ 3], w[ 4], offset); w[18] = amd_bytealign (w[ 2], w[ 3], offset); w[17] = amd_bytealign (w[ 1], w[ 2], offset); w[16] = amd_bytealign (w[ 0], w[ 1], offset); w[15] = amd_bytealign ( 0, w[ 0], offset); w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 16: w[63] = amd_bytealign (w[46], w[47], offset); w[62] = amd_bytealign (w[45], w[46], offset); w[61] = amd_bytealign (w[44], w[45], offset); w[60] = amd_bytealign (w[43], w[44], offset); w[59] = amd_bytealign (w[42], w[43], offset); w[58] = amd_bytealign (w[41], w[42], offset); w[57] = amd_bytealign (w[40], w[41], offset); w[56] = amd_bytealign (w[39], w[40], offset); w[55] = amd_bytealign (w[38], w[39], offset); w[54] = amd_bytealign (w[37], w[38], offset); w[53] = amd_bytealign (w[36], w[37], offset); w[52] = amd_bytealign (w[35], w[36], offset); w[51] = amd_bytealign (w[34], w[35], offset); w[50] = amd_bytealign (w[33], w[34], offset); w[49] = amd_bytealign (w[32], w[33], offset); w[48] = amd_bytealign (w[31], w[32], offset); w[47] = amd_bytealign (w[30], w[31], offset); w[46] = amd_bytealign (w[29], w[30], offset); w[45] = amd_bytealign (w[28], w[29], offset); w[44] = amd_bytealign (w[27], w[28], offset); w[43] = amd_bytealign (w[26], w[27], offset); w[42] = amd_bytealign (w[25], w[26], offset); w[41] = amd_bytealign (w[24], w[25], offset); w[40] = amd_bytealign (w[23], w[24], offset); w[39] = amd_bytealign (w[22], w[23], offset); w[38] = amd_bytealign (w[21], w[22], offset); w[37] = amd_bytealign (w[20], w[21], offset); w[36] = amd_bytealign (w[19], w[20], offset); w[35] = amd_bytealign (w[18], w[19], offset); w[34] = amd_bytealign (w[17], w[18], offset); w[33] = amd_bytealign (w[16], w[17], offset); w[32] = amd_bytealign (w[15], w[16], offset); w[31] = amd_bytealign (w[14], w[15], offset); w[30] = amd_bytealign (w[13], w[14], offset); w[29] = amd_bytealign (w[12], w[13], offset); w[28] = amd_bytealign (w[11], w[12], offset); w[27] = amd_bytealign (w[10], w[11], offset); w[26] = amd_bytealign (w[ 9], w[10], offset); w[25] = amd_bytealign (w[ 8], w[ 9], offset); w[24] = amd_bytealign (w[ 7], w[ 8], offset); w[23] = amd_bytealign (w[ 6], w[ 7], offset); w[22] = amd_bytealign (w[ 5], w[ 6], offset); w[21] = amd_bytealign (w[ 4], w[ 5], offset); w[20] = amd_bytealign (w[ 3], w[ 4], offset); w[19] = amd_bytealign (w[ 2], w[ 3], offset); w[18] = amd_bytealign (w[ 1], w[ 2], offset); w[17] = amd_bytealign (w[ 0], w[ 1], offset); w[16] = amd_bytealign ( 0, w[ 0], offset); w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 17: w[63] = amd_bytealign (w[45], w[46], offset); w[62] = amd_bytealign (w[44], w[45], offset); w[61] = amd_bytealign (w[43], w[44], offset); w[60] = amd_bytealign (w[42], w[43], offset); w[59] = amd_bytealign (w[41], w[42], offset); w[58] = amd_bytealign (w[40], w[41], offset); w[57] = amd_bytealign (w[39], w[40], offset); w[56] = amd_bytealign (w[38], w[39], offset); w[55] = amd_bytealign (w[37], w[38], offset); w[54] = amd_bytealign (w[36], w[37], offset); w[53] = amd_bytealign (w[35], w[36], offset); w[52] = amd_bytealign (w[34], w[35], offset); w[51] = amd_bytealign (w[33], w[34], offset); w[50] = amd_bytealign (w[32], w[33], offset); w[49] = amd_bytealign (w[31], w[32], offset); w[48] = amd_bytealign (w[30], w[31], offset); w[47] = amd_bytealign (w[29], w[30], offset); w[46] = amd_bytealign (w[28], w[29], offset); w[45] = amd_bytealign (w[27], w[28], offset); w[44] = amd_bytealign (w[26], w[27], offset); w[43] = amd_bytealign (w[25], w[26], offset); w[42] = amd_bytealign (w[24], w[25], offset); w[41] = amd_bytealign (w[23], w[24], offset); w[40] = amd_bytealign (w[22], w[23], offset); w[39] = amd_bytealign (w[21], w[22], offset); w[38] = amd_bytealign (w[20], w[21], offset); w[37] = amd_bytealign (w[19], w[20], offset); w[36] = amd_bytealign (w[18], w[19], offset); w[35] = amd_bytealign (w[17], w[18], offset); w[34] = amd_bytealign (w[16], w[17], offset); w[33] = amd_bytealign (w[15], w[16], offset); w[32] = amd_bytealign (w[14], w[15], offset); w[31] = amd_bytealign (w[13], w[14], offset); w[30] = amd_bytealign (w[12], w[13], offset); w[29] = amd_bytealign (w[11], w[12], offset); w[28] = amd_bytealign (w[10], w[11], offset); w[27] = amd_bytealign (w[ 9], w[10], offset); w[26] = amd_bytealign (w[ 8], w[ 9], offset); w[25] = amd_bytealign (w[ 7], w[ 8], offset); w[24] = amd_bytealign (w[ 6], w[ 7], offset); w[23] = amd_bytealign (w[ 5], w[ 6], offset); w[22] = amd_bytealign (w[ 4], w[ 5], offset); w[21] = amd_bytealign (w[ 3], w[ 4], offset); w[20] = amd_bytealign (w[ 2], w[ 3], offset); w[19] = amd_bytealign (w[ 1], w[ 2], offset); w[18] = amd_bytealign (w[ 0], w[ 1], offset); w[17] = amd_bytealign ( 0, w[ 0], offset); w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 18: w[63] = amd_bytealign (w[44], w[45], offset); w[62] = amd_bytealign (w[43], w[44], offset); w[61] = amd_bytealign (w[42], w[43], offset); w[60] = amd_bytealign (w[41], w[42], offset); w[59] = amd_bytealign (w[40], w[41], offset); w[58] = amd_bytealign (w[39], w[40], offset); w[57] = amd_bytealign (w[38], w[39], offset); w[56] = amd_bytealign (w[37], w[38], offset); w[55] = amd_bytealign (w[36], w[37], offset); w[54] = amd_bytealign (w[35], w[36], offset); w[53] = amd_bytealign (w[34], w[35], offset); w[52] = amd_bytealign (w[33], w[34], offset); w[51] = amd_bytealign (w[32], w[33], offset); w[50] = amd_bytealign (w[31], w[32], offset); w[49] = amd_bytealign (w[30], w[31], offset); w[48] = amd_bytealign (w[29], w[30], offset); w[47] = amd_bytealign (w[28], w[29], offset); w[46] = amd_bytealign (w[27], w[28], offset); w[45] = amd_bytealign (w[26], w[27], offset); w[44] = amd_bytealign (w[25], w[26], offset); w[43] = amd_bytealign (w[24], w[25], offset); w[42] = amd_bytealign (w[23], w[24], offset); w[41] = amd_bytealign (w[22], w[23], offset); w[40] = amd_bytealign (w[21], w[22], offset); w[39] = amd_bytealign (w[20], w[21], offset); w[38] = amd_bytealign (w[19], w[20], offset); w[37] = amd_bytealign (w[18], w[19], offset); w[36] = amd_bytealign (w[17], w[18], offset); w[35] = amd_bytealign (w[16], w[17], offset); w[34] = amd_bytealign (w[15], w[16], offset); w[33] = amd_bytealign (w[14], w[15], offset); w[32] = amd_bytealign (w[13], w[14], offset); w[31] = amd_bytealign (w[12], w[13], offset); w[30] = amd_bytealign (w[11], w[12], offset); w[29] = amd_bytealign (w[10], w[11], offset); w[28] = amd_bytealign (w[ 9], w[10], offset); w[27] = amd_bytealign (w[ 8], w[ 9], offset); w[26] = amd_bytealign (w[ 7], w[ 8], offset); w[25] = amd_bytealign (w[ 6], w[ 7], offset); w[24] = amd_bytealign (w[ 5], w[ 6], offset); w[23] = amd_bytealign (w[ 4], w[ 5], offset); w[22] = amd_bytealign (w[ 3], w[ 4], offset); w[21] = amd_bytealign (w[ 2], w[ 3], offset); w[20] = amd_bytealign (w[ 1], w[ 2], offset); w[19] = amd_bytealign (w[ 0], w[ 1], offset); w[18] = amd_bytealign ( 0, w[ 0], offset); w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 19: w[63] = amd_bytealign (w[43], w[44], offset); w[62] = amd_bytealign (w[42], w[43], offset); w[61] = amd_bytealign (w[41], w[42], offset); w[60] = amd_bytealign (w[40], w[41], offset); w[59] = amd_bytealign (w[39], w[40], offset); w[58] = amd_bytealign (w[38], w[39], offset); w[57] = amd_bytealign (w[37], w[38], offset); w[56] = amd_bytealign (w[36], w[37], offset); w[55] = amd_bytealign (w[35], w[36], offset); w[54] = amd_bytealign (w[34], w[35], offset); w[53] = amd_bytealign (w[33], w[34], offset); w[52] = amd_bytealign (w[32], w[33], offset); w[51] = amd_bytealign (w[31], w[32], offset); w[50] = amd_bytealign (w[30], w[31], offset); w[49] = amd_bytealign (w[29], w[30], offset); w[48] = amd_bytealign (w[28], w[29], offset); w[47] = amd_bytealign (w[27], w[28], offset); w[46] = amd_bytealign (w[26], w[27], offset); w[45] = amd_bytealign (w[25], w[26], offset); w[44] = amd_bytealign (w[24], w[25], offset); w[43] = amd_bytealign (w[23], w[24], offset); w[42] = amd_bytealign (w[22], w[23], offset); w[41] = amd_bytealign (w[21], w[22], offset); w[40] = amd_bytealign (w[20], w[21], offset); w[39] = amd_bytealign (w[19], w[20], offset); w[38] = amd_bytealign (w[18], w[19], offset); w[37] = amd_bytealign (w[17], w[18], offset); w[36] = amd_bytealign (w[16], w[17], offset); w[35] = amd_bytealign (w[15], w[16], offset); w[34] = amd_bytealign (w[14], w[15], offset); w[33] = amd_bytealign (w[13], w[14], offset); w[32] = amd_bytealign (w[12], w[13], offset); w[31] = amd_bytealign (w[11], w[12], offset); w[30] = amd_bytealign (w[10], w[11], offset); w[29] = amd_bytealign (w[ 9], w[10], offset); w[28] = amd_bytealign (w[ 8], w[ 9], offset); w[27] = amd_bytealign (w[ 7], w[ 8], offset); w[26] = amd_bytealign (w[ 6], w[ 7], offset); w[25] = amd_bytealign (w[ 5], w[ 6], offset); w[24] = amd_bytealign (w[ 4], w[ 5], offset); w[23] = amd_bytealign (w[ 3], w[ 4], offset); w[22] = amd_bytealign (w[ 2], w[ 3], offset); w[21] = amd_bytealign (w[ 1], w[ 2], offset); w[20] = amd_bytealign (w[ 0], w[ 1], offset); w[19] = amd_bytealign ( 0, w[ 0], offset); w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 20: w[63] = amd_bytealign (w[42], w[43], offset); w[62] = amd_bytealign (w[41], w[42], offset); w[61] = amd_bytealign (w[40], w[41], offset); w[60] = amd_bytealign (w[39], w[40], offset); w[59] = amd_bytealign (w[38], w[39], offset); w[58] = amd_bytealign (w[37], w[38], offset); w[57] = amd_bytealign (w[36], w[37], offset); w[56] = amd_bytealign (w[35], w[36], offset); w[55] = amd_bytealign (w[34], w[35], offset); w[54] = amd_bytealign (w[33], w[34], offset); w[53] = amd_bytealign (w[32], w[33], offset); w[52] = amd_bytealign (w[31], w[32], offset); w[51] = amd_bytealign (w[30], w[31], offset); w[50] = amd_bytealign (w[29], w[30], offset); w[49] = amd_bytealign (w[28], w[29], offset); w[48] = amd_bytealign (w[27], w[28], offset); w[47] = amd_bytealign (w[26], w[27], offset); w[46] = amd_bytealign (w[25], w[26], offset); w[45] = amd_bytealign (w[24], w[25], offset); w[44] = amd_bytealign (w[23], w[24], offset); w[43] = amd_bytealign (w[22], w[23], offset); w[42] = amd_bytealign (w[21], w[22], offset); w[41] = amd_bytealign (w[20], w[21], offset); w[40] = amd_bytealign (w[19], w[20], offset); w[39] = amd_bytealign (w[18], w[19], offset); w[38] = amd_bytealign (w[17], w[18], offset); w[37] = amd_bytealign (w[16], w[17], offset); w[36] = amd_bytealign (w[15], w[16], offset); w[35] = amd_bytealign (w[14], w[15], offset); w[34] = amd_bytealign (w[13], w[14], offset); w[33] = amd_bytealign (w[12], w[13], offset); w[32] = amd_bytealign (w[11], w[12], offset); w[31] = amd_bytealign (w[10], w[11], offset); w[30] = amd_bytealign (w[ 9], w[10], offset); w[29] = amd_bytealign (w[ 8], w[ 9], offset); w[28] = amd_bytealign (w[ 7], w[ 8], offset); w[27] = amd_bytealign (w[ 6], w[ 7], offset); w[26] = amd_bytealign (w[ 5], w[ 6], offset); w[25] = amd_bytealign (w[ 4], w[ 5], offset); w[24] = amd_bytealign (w[ 3], w[ 4], offset); w[23] = amd_bytealign (w[ 2], w[ 3], offset); w[22] = amd_bytealign (w[ 1], w[ 2], offset); w[21] = amd_bytealign (w[ 0], w[ 1], offset); w[20] = amd_bytealign ( 0, w[ 0], offset); w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 21: w[63] = amd_bytealign (w[41], w[42], offset); w[62] = amd_bytealign (w[40], w[41], offset); w[61] = amd_bytealign (w[39], w[40], offset); w[60] = amd_bytealign (w[38], w[39], offset); w[59] = amd_bytealign (w[37], w[38], offset); w[58] = amd_bytealign (w[36], w[37], offset); w[57] = amd_bytealign (w[35], w[36], offset); w[56] = amd_bytealign (w[34], w[35], offset); w[55] = amd_bytealign (w[33], w[34], offset); w[54] = amd_bytealign (w[32], w[33], offset); w[53] = amd_bytealign (w[31], w[32], offset); w[52] = amd_bytealign (w[30], w[31], offset); w[51] = amd_bytealign (w[29], w[30], offset); w[50] = amd_bytealign (w[28], w[29], offset); w[49] = amd_bytealign (w[27], w[28], offset); w[48] = amd_bytealign (w[26], w[27], offset); w[47] = amd_bytealign (w[25], w[26], offset); w[46] = amd_bytealign (w[24], w[25], offset); w[45] = amd_bytealign (w[23], w[24], offset); w[44] = amd_bytealign (w[22], w[23], offset); w[43] = amd_bytealign (w[21], w[22], offset); w[42] = amd_bytealign (w[20], w[21], offset); w[41] = amd_bytealign (w[19], w[20], offset); w[40] = amd_bytealign (w[18], w[19], offset); w[39] = amd_bytealign (w[17], w[18], offset); w[38] = amd_bytealign (w[16], w[17], offset); w[37] = amd_bytealign (w[15], w[16], offset); w[36] = amd_bytealign (w[14], w[15], offset); w[35] = amd_bytealign (w[13], w[14], offset); w[34] = amd_bytealign (w[12], w[13], offset); w[33] = amd_bytealign (w[11], w[12], offset); w[32] = amd_bytealign (w[10], w[11], offset); w[31] = amd_bytealign (w[ 9], w[10], offset); w[30] = amd_bytealign (w[ 8], w[ 9], offset); w[29] = amd_bytealign (w[ 7], w[ 8], offset); w[28] = amd_bytealign (w[ 6], w[ 7], offset); w[27] = amd_bytealign (w[ 5], w[ 6], offset); w[26] = amd_bytealign (w[ 4], w[ 5], offset); w[25] = amd_bytealign (w[ 3], w[ 4], offset); w[24] = amd_bytealign (w[ 2], w[ 3], offset); w[23] = amd_bytealign (w[ 1], w[ 2], offset); w[22] = amd_bytealign (w[ 0], w[ 1], offset); w[21] = amd_bytealign ( 0, w[ 0], offset); w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 22: w[63] = amd_bytealign (w[40], w[41], offset); w[62] = amd_bytealign (w[39], w[40], offset); w[61] = amd_bytealign (w[38], w[39], offset); w[60] = amd_bytealign (w[37], w[38], offset); w[59] = amd_bytealign (w[36], w[37], offset); w[58] = amd_bytealign (w[35], w[36], offset); w[57] = amd_bytealign (w[34], w[35], offset); w[56] = amd_bytealign (w[33], w[34], offset); w[55] = amd_bytealign (w[32], w[33], offset); w[54] = amd_bytealign (w[31], w[32], offset); w[53] = amd_bytealign (w[30], w[31], offset); w[52] = amd_bytealign (w[29], w[30], offset); w[51] = amd_bytealign (w[28], w[29], offset); w[50] = amd_bytealign (w[27], w[28], offset); w[49] = amd_bytealign (w[26], w[27], offset); w[48] = amd_bytealign (w[25], w[26], offset); w[47] = amd_bytealign (w[24], w[25], offset); w[46] = amd_bytealign (w[23], w[24], offset); w[45] = amd_bytealign (w[22], w[23], offset); w[44] = amd_bytealign (w[21], w[22], offset); w[43] = amd_bytealign (w[20], w[21], offset); w[42] = amd_bytealign (w[19], w[20], offset); w[41] = amd_bytealign (w[18], w[19], offset); w[40] = amd_bytealign (w[17], w[18], offset); w[39] = amd_bytealign (w[16], w[17], offset); w[38] = amd_bytealign (w[15], w[16], offset); w[37] = amd_bytealign (w[14], w[15], offset); w[36] = amd_bytealign (w[13], w[14], offset); w[35] = amd_bytealign (w[12], w[13], offset); w[34] = amd_bytealign (w[11], w[12], offset); w[33] = amd_bytealign (w[10], w[11], offset); w[32] = amd_bytealign (w[ 9], w[10], offset); w[31] = amd_bytealign (w[ 8], w[ 9], offset); w[30] = amd_bytealign (w[ 7], w[ 8], offset); w[29] = amd_bytealign (w[ 6], w[ 7], offset); w[28] = amd_bytealign (w[ 5], w[ 6], offset); w[27] = amd_bytealign (w[ 4], w[ 5], offset); w[26] = amd_bytealign (w[ 3], w[ 4], offset); w[25] = amd_bytealign (w[ 2], w[ 3], offset); w[24] = amd_bytealign (w[ 1], w[ 2], offset); w[23] = amd_bytealign (w[ 0], w[ 1], offset); w[22] = amd_bytealign ( 0, w[ 0], offset); w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 23: w[63] = amd_bytealign (w[39], w[40], offset); w[62] = amd_bytealign (w[38], w[39], offset); w[61] = amd_bytealign (w[37], w[38], offset); w[60] = amd_bytealign (w[36], w[37], offset); w[59] = amd_bytealign (w[35], w[36], offset); w[58] = amd_bytealign (w[34], w[35], offset); w[57] = amd_bytealign (w[33], w[34], offset); w[56] = amd_bytealign (w[32], w[33], offset); w[55] = amd_bytealign (w[31], w[32], offset); w[54] = amd_bytealign (w[30], w[31], offset); w[53] = amd_bytealign (w[29], w[30], offset); w[52] = amd_bytealign (w[28], w[29], offset); w[51] = amd_bytealign (w[27], w[28], offset); w[50] = amd_bytealign (w[26], w[27], offset); w[49] = amd_bytealign (w[25], w[26], offset); w[48] = amd_bytealign (w[24], w[25], offset); w[47] = amd_bytealign (w[23], w[24], offset); w[46] = amd_bytealign (w[22], w[23], offset); w[45] = amd_bytealign (w[21], w[22], offset); w[44] = amd_bytealign (w[20], w[21], offset); w[43] = amd_bytealign (w[19], w[20], offset); w[42] = amd_bytealign (w[18], w[19], offset); w[41] = amd_bytealign (w[17], w[18], offset); w[40] = amd_bytealign (w[16], w[17], offset); w[39] = amd_bytealign (w[15], w[16], offset); w[38] = amd_bytealign (w[14], w[15], offset); w[37] = amd_bytealign (w[13], w[14], offset); w[36] = amd_bytealign (w[12], w[13], offset); w[35] = amd_bytealign (w[11], w[12], offset); w[34] = amd_bytealign (w[10], w[11], offset); w[33] = amd_bytealign (w[ 9], w[10], offset); w[32] = amd_bytealign (w[ 8], w[ 9], offset); w[31] = amd_bytealign (w[ 7], w[ 8], offset); w[30] = amd_bytealign (w[ 6], w[ 7], offset); w[29] = amd_bytealign (w[ 5], w[ 6], offset); w[28] = amd_bytealign (w[ 4], w[ 5], offset); w[27] = amd_bytealign (w[ 3], w[ 4], offset); w[26] = amd_bytealign (w[ 2], w[ 3], offset); w[25] = amd_bytealign (w[ 1], w[ 2], offset); w[24] = amd_bytealign (w[ 0], w[ 1], offset); w[23] = amd_bytealign ( 0, w[ 0], offset); w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 24: w[63] = amd_bytealign (w[38], w[39], offset); w[62] = amd_bytealign (w[37], w[38], offset); w[61] = amd_bytealign (w[36], w[37], offset); w[60] = amd_bytealign (w[35], w[36], offset); w[59] = amd_bytealign (w[34], w[35], offset); w[58] = amd_bytealign (w[33], w[34], offset); w[57] = amd_bytealign (w[32], w[33], offset); w[56] = amd_bytealign (w[31], w[32], offset); w[55] = amd_bytealign (w[30], w[31], offset); w[54] = amd_bytealign (w[29], w[30], offset); w[53] = amd_bytealign (w[28], w[29], offset); w[52] = amd_bytealign (w[27], w[28], offset); w[51] = amd_bytealign (w[26], w[27], offset); w[50] = amd_bytealign (w[25], w[26], offset); w[49] = amd_bytealign (w[24], w[25], offset); w[48] = amd_bytealign (w[23], w[24], offset); w[47] = amd_bytealign (w[22], w[23], offset); w[46] = amd_bytealign (w[21], w[22], offset); w[45] = amd_bytealign (w[20], w[21], offset); w[44] = amd_bytealign (w[19], w[20], offset); w[43] = amd_bytealign (w[18], w[19], offset); w[42] = amd_bytealign (w[17], w[18], offset); w[41] = amd_bytealign (w[16], w[17], offset); w[40] = amd_bytealign (w[15], w[16], offset); w[39] = amd_bytealign (w[14], w[15], offset); w[38] = amd_bytealign (w[13], w[14], offset); w[37] = amd_bytealign (w[12], w[13], offset); w[36] = amd_bytealign (w[11], w[12], offset); w[35] = amd_bytealign (w[10], w[11], offset); w[34] = amd_bytealign (w[ 9], w[10], offset); w[33] = amd_bytealign (w[ 8], w[ 9], offset); w[32] = amd_bytealign (w[ 7], w[ 8], offset); w[31] = amd_bytealign (w[ 6], w[ 7], offset); w[30] = amd_bytealign (w[ 5], w[ 6], offset); w[29] = amd_bytealign (w[ 4], w[ 5], offset); w[28] = amd_bytealign (w[ 3], w[ 4], offset); w[27] = amd_bytealign (w[ 2], w[ 3], offset); w[26] = amd_bytealign (w[ 1], w[ 2], offset); w[25] = amd_bytealign (w[ 0], w[ 1], offset); w[24] = amd_bytealign ( 0, w[ 0], offset); w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 25: w[63] = amd_bytealign (w[37], w[38], offset); w[62] = amd_bytealign (w[36], w[37], offset); w[61] = amd_bytealign (w[35], w[36], offset); w[60] = amd_bytealign (w[34], w[35], offset); w[59] = amd_bytealign (w[33], w[34], offset); w[58] = amd_bytealign (w[32], w[33], offset); w[57] = amd_bytealign (w[31], w[32], offset); w[56] = amd_bytealign (w[30], w[31], offset); w[55] = amd_bytealign (w[29], w[30], offset); w[54] = amd_bytealign (w[28], w[29], offset); w[53] = amd_bytealign (w[27], w[28], offset); w[52] = amd_bytealign (w[26], w[27], offset); w[51] = amd_bytealign (w[25], w[26], offset); w[50] = amd_bytealign (w[24], w[25], offset); w[49] = amd_bytealign (w[23], w[24], offset); w[48] = amd_bytealign (w[22], w[23], offset); w[47] = amd_bytealign (w[21], w[22], offset); w[46] = amd_bytealign (w[20], w[21], offset); w[45] = amd_bytealign (w[19], w[20], offset); w[44] = amd_bytealign (w[18], w[19], offset); w[43] = amd_bytealign (w[17], w[18], offset); w[42] = amd_bytealign (w[16], w[17], offset); w[41] = amd_bytealign (w[15], w[16], offset); w[40] = amd_bytealign (w[14], w[15], offset); w[39] = amd_bytealign (w[13], w[14], offset); w[38] = amd_bytealign (w[12], w[13], offset); w[37] = amd_bytealign (w[11], w[12], offset); w[36] = amd_bytealign (w[10], w[11], offset); w[35] = amd_bytealign (w[ 9], w[10], offset); w[34] = amd_bytealign (w[ 8], w[ 9], offset); w[33] = amd_bytealign (w[ 7], w[ 8], offset); w[32] = amd_bytealign (w[ 6], w[ 7], offset); w[31] = amd_bytealign (w[ 5], w[ 6], offset); w[30] = amd_bytealign (w[ 4], w[ 5], offset); w[29] = amd_bytealign (w[ 3], w[ 4], offset); w[28] = amd_bytealign (w[ 2], w[ 3], offset); w[27] = amd_bytealign (w[ 1], w[ 2], offset); w[26] = amd_bytealign (w[ 0], w[ 1], offset); w[25] = amd_bytealign ( 0, w[ 0], offset); w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 26: w[63] = amd_bytealign (w[36], w[37], offset); w[62] = amd_bytealign (w[35], w[36], offset); w[61] = amd_bytealign (w[34], w[35], offset); w[60] = amd_bytealign (w[33], w[34], offset); w[59] = amd_bytealign (w[32], w[33], offset); w[58] = amd_bytealign (w[31], w[32], offset); w[57] = amd_bytealign (w[30], w[31], offset); w[56] = amd_bytealign (w[29], w[30], offset); w[55] = amd_bytealign (w[28], w[29], offset); w[54] = amd_bytealign (w[27], w[28], offset); w[53] = amd_bytealign (w[26], w[27], offset); w[52] = amd_bytealign (w[25], w[26], offset); w[51] = amd_bytealign (w[24], w[25], offset); w[50] = amd_bytealign (w[23], w[24], offset); w[49] = amd_bytealign (w[22], w[23], offset); w[48] = amd_bytealign (w[21], w[22], offset); w[47] = amd_bytealign (w[20], w[21], offset); w[46] = amd_bytealign (w[19], w[20], offset); w[45] = amd_bytealign (w[18], w[19], offset); w[44] = amd_bytealign (w[17], w[18], offset); w[43] = amd_bytealign (w[16], w[17], offset); w[42] = amd_bytealign (w[15], w[16], offset); w[41] = amd_bytealign (w[14], w[15], offset); w[40] = amd_bytealign (w[13], w[14], offset); w[39] = amd_bytealign (w[12], w[13], offset); w[38] = amd_bytealign (w[11], w[12], offset); w[37] = amd_bytealign (w[10], w[11], offset); w[36] = amd_bytealign (w[ 9], w[10], offset); w[35] = amd_bytealign (w[ 8], w[ 9], offset); w[34] = amd_bytealign (w[ 7], w[ 8], offset); w[33] = amd_bytealign (w[ 6], w[ 7], offset); w[32] = amd_bytealign (w[ 5], w[ 6], offset); w[31] = amd_bytealign (w[ 4], w[ 5], offset); w[30] = amd_bytealign (w[ 3], w[ 4], offset); w[29] = amd_bytealign (w[ 2], w[ 3], offset); w[28] = amd_bytealign (w[ 1], w[ 2], offset); w[27] = amd_bytealign (w[ 0], w[ 1], offset); w[26] = amd_bytealign ( 0, w[ 0], offset); w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 27: w[63] = amd_bytealign (w[35], w[36], offset); w[62] = amd_bytealign (w[34], w[35], offset); w[61] = amd_bytealign (w[33], w[34], offset); w[60] = amd_bytealign (w[32], w[33], offset); w[59] = amd_bytealign (w[31], w[32], offset); w[58] = amd_bytealign (w[30], w[31], offset); w[57] = amd_bytealign (w[29], w[30], offset); w[56] = amd_bytealign (w[28], w[29], offset); w[55] = amd_bytealign (w[27], w[28], offset); w[54] = amd_bytealign (w[26], w[27], offset); w[53] = amd_bytealign (w[25], w[26], offset); w[52] = amd_bytealign (w[24], w[25], offset); w[51] = amd_bytealign (w[23], w[24], offset); w[50] = amd_bytealign (w[22], w[23], offset); w[49] = amd_bytealign (w[21], w[22], offset); w[48] = amd_bytealign (w[20], w[21], offset); w[47] = amd_bytealign (w[19], w[20], offset); w[46] = amd_bytealign (w[18], w[19], offset); w[45] = amd_bytealign (w[17], w[18], offset); w[44] = amd_bytealign (w[16], w[17], offset); w[43] = amd_bytealign (w[15], w[16], offset); w[42] = amd_bytealign (w[14], w[15], offset); w[41] = amd_bytealign (w[13], w[14], offset); w[40] = amd_bytealign (w[12], w[13], offset); w[39] = amd_bytealign (w[11], w[12], offset); w[38] = amd_bytealign (w[10], w[11], offset); w[37] = amd_bytealign (w[ 9], w[10], offset); w[36] = amd_bytealign (w[ 8], w[ 9], offset); w[35] = amd_bytealign (w[ 7], w[ 8], offset); w[34] = amd_bytealign (w[ 6], w[ 7], offset); w[33] = amd_bytealign (w[ 5], w[ 6], offset); w[32] = amd_bytealign (w[ 4], w[ 5], offset); w[31] = amd_bytealign (w[ 3], w[ 4], offset); w[30] = amd_bytealign (w[ 2], w[ 3], offset); w[29] = amd_bytealign (w[ 1], w[ 2], offset); w[28] = amd_bytealign (w[ 0], w[ 1], offset); w[27] = amd_bytealign ( 0, w[ 0], offset); w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 28: w[63] = amd_bytealign (w[34], w[35], offset); w[62] = amd_bytealign (w[33], w[34], offset); w[61] = amd_bytealign (w[32], w[33], offset); w[60] = amd_bytealign (w[31], w[32], offset); w[59] = amd_bytealign (w[30], w[31], offset); w[58] = amd_bytealign (w[29], w[30], offset); w[57] = amd_bytealign (w[28], w[29], offset); w[56] = amd_bytealign (w[27], w[28], offset); w[55] = amd_bytealign (w[26], w[27], offset); w[54] = amd_bytealign (w[25], w[26], offset); w[53] = amd_bytealign (w[24], w[25], offset); w[52] = amd_bytealign (w[23], w[24], offset); w[51] = amd_bytealign (w[22], w[23], offset); w[50] = amd_bytealign (w[21], w[22], offset); w[49] = amd_bytealign (w[20], w[21], offset); w[48] = amd_bytealign (w[19], w[20], offset); w[47] = amd_bytealign (w[18], w[19], offset); w[46] = amd_bytealign (w[17], w[18], offset); w[45] = amd_bytealign (w[16], w[17], offset); w[44] = amd_bytealign (w[15], w[16], offset); w[43] = amd_bytealign (w[14], w[15], offset); w[42] = amd_bytealign (w[13], w[14], offset); w[41] = amd_bytealign (w[12], w[13], offset); w[40] = amd_bytealign (w[11], w[12], offset); w[39] = amd_bytealign (w[10], w[11], offset); w[38] = amd_bytealign (w[ 9], w[10], offset); w[37] = amd_bytealign (w[ 8], w[ 9], offset); w[36] = amd_bytealign (w[ 7], w[ 8], offset); w[35] = amd_bytealign (w[ 6], w[ 7], offset); w[34] = amd_bytealign (w[ 5], w[ 6], offset); w[33] = amd_bytealign (w[ 4], w[ 5], offset); w[32] = amd_bytealign (w[ 3], w[ 4], offset); w[31] = amd_bytealign (w[ 2], w[ 3], offset); w[30] = amd_bytealign (w[ 1], w[ 2], offset); w[29] = amd_bytealign (w[ 0], w[ 1], offset); w[28] = amd_bytealign ( 0, w[ 0], offset); w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 29: w[63] = amd_bytealign (w[33], w[34], offset); w[62] = amd_bytealign (w[32], w[33], offset); w[61] = amd_bytealign (w[31], w[32], offset); w[60] = amd_bytealign (w[30], w[31], offset); w[59] = amd_bytealign (w[29], w[30], offset); w[58] = amd_bytealign (w[28], w[29], offset); w[57] = amd_bytealign (w[27], w[28], offset); w[56] = amd_bytealign (w[26], w[27], offset); w[55] = amd_bytealign (w[25], w[26], offset); w[54] = amd_bytealign (w[24], w[25], offset); w[53] = amd_bytealign (w[23], w[24], offset); w[52] = amd_bytealign (w[22], w[23], offset); w[51] = amd_bytealign (w[21], w[22], offset); w[50] = amd_bytealign (w[20], w[21], offset); w[49] = amd_bytealign (w[19], w[20], offset); w[48] = amd_bytealign (w[18], w[19], offset); w[47] = amd_bytealign (w[17], w[18], offset); w[46] = amd_bytealign (w[16], w[17], offset); w[45] = amd_bytealign (w[15], w[16], offset); w[44] = amd_bytealign (w[14], w[15], offset); w[43] = amd_bytealign (w[13], w[14], offset); w[42] = amd_bytealign (w[12], w[13], offset); w[41] = amd_bytealign (w[11], w[12], offset); w[40] = amd_bytealign (w[10], w[11], offset); w[39] = amd_bytealign (w[ 9], w[10], offset); w[38] = amd_bytealign (w[ 8], w[ 9], offset); w[37] = amd_bytealign (w[ 7], w[ 8], offset); w[36] = amd_bytealign (w[ 6], w[ 7], offset); w[35] = amd_bytealign (w[ 5], w[ 6], offset); w[34] = amd_bytealign (w[ 4], w[ 5], offset); w[33] = amd_bytealign (w[ 3], w[ 4], offset); w[32] = amd_bytealign (w[ 2], w[ 3], offset); w[31] = amd_bytealign (w[ 1], w[ 2], offset); w[30] = amd_bytealign (w[ 0], w[ 1], offset); w[29] = amd_bytealign ( 0, w[ 0], offset); w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 30: w[63] = amd_bytealign (w[32], w[33], offset); w[62] = amd_bytealign (w[31], w[32], offset); w[61] = amd_bytealign (w[30], w[31], offset); w[60] = amd_bytealign (w[29], w[30], offset); w[59] = amd_bytealign (w[28], w[29], offset); w[58] = amd_bytealign (w[27], w[28], offset); w[57] = amd_bytealign (w[26], w[27], offset); w[56] = amd_bytealign (w[25], w[26], offset); w[55] = amd_bytealign (w[24], w[25], offset); w[54] = amd_bytealign (w[23], w[24], offset); w[53] = amd_bytealign (w[22], w[23], offset); w[52] = amd_bytealign (w[21], w[22], offset); w[51] = amd_bytealign (w[20], w[21], offset); w[50] = amd_bytealign (w[19], w[20], offset); w[49] = amd_bytealign (w[18], w[19], offset); w[48] = amd_bytealign (w[17], w[18], offset); w[47] = amd_bytealign (w[16], w[17], offset); w[46] = amd_bytealign (w[15], w[16], offset); w[45] = amd_bytealign (w[14], w[15], offset); w[44] = amd_bytealign (w[13], w[14], offset); w[43] = amd_bytealign (w[12], w[13], offset); w[42] = amd_bytealign (w[11], w[12], offset); w[41] = amd_bytealign (w[10], w[11], offset); w[40] = amd_bytealign (w[ 9], w[10], offset); w[39] = amd_bytealign (w[ 8], w[ 9], offset); w[38] = amd_bytealign (w[ 7], w[ 8], offset); w[37] = amd_bytealign (w[ 6], w[ 7], offset); w[36] = amd_bytealign (w[ 5], w[ 6], offset); w[35] = amd_bytealign (w[ 4], w[ 5], offset); w[34] = amd_bytealign (w[ 3], w[ 4], offset); w[33] = amd_bytealign (w[ 2], w[ 3], offset); w[32] = amd_bytealign (w[ 1], w[ 2], offset); w[31] = amd_bytealign (w[ 0], w[ 1], offset); w[30] = amd_bytealign ( 0, w[ 0], offset); w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 31: w[63] = amd_bytealign (w[31], w[32], offset); w[62] = amd_bytealign (w[30], w[31], offset); w[61] = amd_bytealign (w[29], w[30], offset); w[60] = amd_bytealign (w[28], w[29], offset); w[59] = amd_bytealign (w[27], w[28], offset); w[58] = amd_bytealign (w[26], w[27], offset); w[57] = amd_bytealign (w[25], w[26], offset); w[56] = amd_bytealign (w[24], w[25], offset); w[55] = amd_bytealign (w[23], w[24], offset); w[54] = amd_bytealign (w[22], w[23], offset); w[53] = amd_bytealign (w[21], w[22], offset); w[52] = amd_bytealign (w[20], w[21], offset); w[51] = amd_bytealign (w[19], w[20], offset); w[50] = amd_bytealign (w[18], w[19], offset); w[49] = amd_bytealign (w[17], w[18], offset); w[48] = amd_bytealign (w[16], w[17], offset); w[47] = amd_bytealign (w[15], w[16], offset); w[46] = amd_bytealign (w[14], w[15], offset); w[45] = amd_bytealign (w[13], w[14], offset); w[44] = amd_bytealign (w[12], w[13], offset); w[43] = amd_bytealign (w[11], w[12], offset); w[42] = amd_bytealign (w[10], w[11], offset); w[41] = amd_bytealign (w[ 9], w[10], offset); w[40] = amd_bytealign (w[ 8], w[ 9], offset); w[39] = amd_bytealign (w[ 7], w[ 8], offset); w[38] = amd_bytealign (w[ 6], w[ 7], offset); w[37] = amd_bytealign (w[ 5], w[ 6], offset); w[36] = amd_bytealign (w[ 4], w[ 5], offset); w[35] = amd_bytealign (w[ 3], w[ 4], offset); w[34] = amd_bytealign (w[ 2], w[ 3], offset); w[33] = amd_bytealign (w[ 1], w[ 2], offset); w[32] = amd_bytealign (w[ 0], w[ 1], offset); w[31] = amd_bytealign ( 0, w[ 0], offset); w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 32: w[63] = amd_bytealign (w[30], w[31], offset); w[62] = amd_bytealign (w[29], w[30], offset); w[61] = amd_bytealign (w[28], w[29], offset); w[60] = amd_bytealign (w[27], w[28], offset); w[59] = amd_bytealign (w[26], w[27], offset); w[58] = amd_bytealign (w[25], w[26], offset); w[57] = amd_bytealign (w[24], w[25], offset); w[56] = amd_bytealign (w[23], w[24], offset); w[55] = amd_bytealign (w[22], w[23], offset); w[54] = amd_bytealign (w[21], w[22], offset); w[53] = amd_bytealign (w[20], w[21], offset); w[52] = amd_bytealign (w[19], w[20], offset); w[51] = amd_bytealign (w[18], w[19], offset); w[50] = amd_bytealign (w[17], w[18], offset); w[49] = amd_bytealign (w[16], w[17], offset); w[48] = amd_bytealign (w[15], w[16], offset); w[47] = amd_bytealign (w[14], w[15], offset); w[46] = amd_bytealign (w[13], w[14], offset); w[45] = amd_bytealign (w[12], w[13], offset); w[44] = amd_bytealign (w[11], w[12], offset); w[43] = amd_bytealign (w[10], w[11], offset); w[42] = amd_bytealign (w[ 9], w[10], offset); w[41] = amd_bytealign (w[ 8], w[ 9], offset); w[40] = amd_bytealign (w[ 7], w[ 8], offset); w[39] = amd_bytealign (w[ 6], w[ 7], offset); w[38] = amd_bytealign (w[ 5], w[ 6], offset); w[37] = amd_bytealign (w[ 4], w[ 5], offset); w[36] = amd_bytealign (w[ 3], w[ 4], offset); w[35] = amd_bytealign (w[ 2], w[ 3], offset); w[34] = amd_bytealign (w[ 1], w[ 2], offset); w[33] = amd_bytealign (w[ 0], w[ 1], offset); w[32] = amd_bytealign ( 0, w[ 0], offset); w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 33: w[63] = amd_bytealign (w[29], w[30], offset); w[62] = amd_bytealign (w[28], w[29], offset); w[61] = amd_bytealign (w[27], w[28], offset); w[60] = amd_bytealign (w[26], w[27], offset); w[59] = amd_bytealign (w[25], w[26], offset); w[58] = amd_bytealign (w[24], w[25], offset); w[57] = amd_bytealign (w[23], w[24], offset); w[56] = amd_bytealign (w[22], w[23], offset); w[55] = amd_bytealign (w[21], w[22], offset); w[54] = amd_bytealign (w[20], w[21], offset); w[53] = amd_bytealign (w[19], w[20], offset); w[52] = amd_bytealign (w[18], w[19], offset); w[51] = amd_bytealign (w[17], w[18], offset); w[50] = amd_bytealign (w[16], w[17], offset); w[49] = amd_bytealign (w[15], w[16], offset); w[48] = amd_bytealign (w[14], w[15], offset); w[47] = amd_bytealign (w[13], w[14], offset); w[46] = amd_bytealign (w[12], w[13], offset); w[45] = amd_bytealign (w[11], w[12], offset); w[44] = amd_bytealign (w[10], w[11], offset); w[43] = amd_bytealign (w[ 9], w[10], offset); w[42] = amd_bytealign (w[ 8], w[ 9], offset); w[41] = amd_bytealign (w[ 7], w[ 8], offset); w[40] = amd_bytealign (w[ 6], w[ 7], offset); w[39] = amd_bytealign (w[ 5], w[ 6], offset); w[38] = amd_bytealign (w[ 4], w[ 5], offset); w[37] = amd_bytealign (w[ 3], w[ 4], offset); w[36] = amd_bytealign (w[ 2], w[ 3], offset); w[35] = amd_bytealign (w[ 1], w[ 2], offset); w[34] = amd_bytealign (w[ 0], w[ 1], offset); w[33] = amd_bytealign ( 0, w[ 0], offset); w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 34: w[63] = amd_bytealign (w[28], w[29], offset); w[62] = amd_bytealign (w[27], w[28], offset); w[61] = amd_bytealign (w[26], w[27], offset); w[60] = amd_bytealign (w[25], w[26], offset); w[59] = amd_bytealign (w[24], w[25], offset); w[58] = amd_bytealign (w[23], w[24], offset); w[57] = amd_bytealign (w[22], w[23], offset); w[56] = amd_bytealign (w[21], w[22], offset); w[55] = amd_bytealign (w[20], w[21], offset); w[54] = amd_bytealign (w[19], w[20], offset); w[53] = amd_bytealign (w[18], w[19], offset); w[52] = amd_bytealign (w[17], w[18], offset); w[51] = amd_bytealign (w[16], w[17], offset); w[50] = amd_bytealign (w[15], w[16], offset); w[49] = amd_bytealign (w[14], w[15], offset); w[48] = amd_bytealign (w[13], w[14], offset); w[47] = amd_bytealign (w[12], w[13], offset); w[46] = amd_bytealign (w[11], w[12], offset); w[45] = amd_bytealign (w[10], w[11], offset); w[44] = amd_bytealign (w[ 9], w[10], offset); w[43] = amd_bytealign (w[ 8], w[ 9], offset); w[42] = amd_bytealign (w[ 7], w[ 8], offset); w[41] = amd_bytealign (w[ 6], w[ 7], offset); w[40] = amd_bytealign (w[ 5], w[ 6], offset); w[39] = amd_bytealign (w[ 4], w[ 5], offset); w[38] = amd_bytealign (w[ 3], w[ 4], offset); w[37] = amd_bytealign (w[ 2], w[ 3], offset); w[36] = amd_bytealign (w[ 1], w[ 2], offset); w[35] = amd_bytealign (w[ 0], w[ 1], offset); w[34] = amd_bytealign ( 0, w[ 0], offset); w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 35: w[63] = amd_bytealign (w[27], w[28], offset); w[62] = amd_bytealign (w[26], w[27], offset); w[61] = amd_bytealign (w[25], w[26], offset); w[60] = amd_bytealign (w[24], w[25], offset); w[59] = amd_bytealign (w[23], w[24], offset); w[58] = amd_bytealign (w[22], w[23], offset); w[57] = amd_bytealign (w[21], w[22], offset); w[56] = amd_bytealign (w[20], w[21], offset); w[55] = amd_bytealign (w[19], w[20], offset); w[54] = amd_bytealign (w[18], w[19], offset); w[53] = amd_bytealign (w[17], w[18], offset); w[52] = amd_bytealign (w[16], w[17], offset); w[51] = amd_bytealign (w[15], w[16], offset); w[50] = amd_bytealign (w[14], w[15], offset); w[49] = amd_bytealign (w[13], w[14], offset); w[48] = amd_bytealign (w[12], w[13], offset); w[47] = amd_bytealign (w[11], w[12], offset); w[46] = amd_bytealign (w[10], w[11], offset); w[45] = amd_bytealign (w[ 9], w[10], offset); w[44] = amd_bytealign (w[ 8], w[ 9], offset); w[43] = amd_bytealign (w[ 7], w[ 8], offset); w[42] = amd_bytealign (w[ 6], w[ 7], offset); w[41] = amd_bytealign (w[ 5], w[ 6], offset); w[40] = amd_bytealign (w[ 4], w[ 5], offset); w[39] = amd_bytealign (w[ 3], w[ 4], offset); w[38] = amd_bytealign (w[ 2], w[ 3], offset); w[37] = amd_bytealign (w[ 1], w[ 2], offset); w[36] = amd_bytealign (w[ 0], w[ 1], offset); w[35] = amd_bytealign ( 0, w[ 0], offset); w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 36: w[63] = amd_bytealign (w[26], w[27], offset); w[62] = amd_bytealign (w[25], w[26], offset); w[61] = amd_bytealign (w[24], w[25], offset); w[60] = amd_bytealign (w[23], w[24], offset); w[59] = amd_bytealign (w[22], w[23], offset); w[58] = amd_bytealign (w[21], w[22], offset); w[57] = amd_bytealign (w[20], w[21], offset); w[56] = amd_bytealign (w[19], w[20], offset); w[55] = amd_bytealign (w[18], w[19], offset); w[54] = amd_bytealign (w[17], w[18], offset); w[53] = amd_bytealign (w[16], w[17], offset); w[52] = amd_bytealign (w[15], w[16], offset); w[51] = amd_bytealign (w[14], w[15], offset); w[50] = amd_bytealign (w[13], w[14], offset); w[49] = amd_bytealign (w[12], w[13], offset); w[48] = amd_bytealign (w[11], w[12], offset); w[47] = amd_bytealign (w[10], w[11], offset); w[46] = amd_bytealign (w[ 9], w[10], offset); w[45] = amd_bytealign (w[ 8], w[ 9], offset); w[44] = amd_bytealign (w[ 7], w[ 8], offset); w[43] = amd_bytealign (w[ 6], w[ 7], offset); w[42] = amd_bytealign (w[ 5], w[ 6], offset); w[41] = amd_bytealign (w[ 4], w[ 5], offset); w[40] = amd_bytealign (w[ 3], w[ 4], offset); w[39] = amd_bytealign (w[ 2], w[ 3], offset); w[38] = amd_bytealign (w[ 1], w[ 2], offset); w[37] = amd_bytealign (w[ 0], w[ 1], offset); w[36] = amd_bytealign ( 0, w[ 0], offset); w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 37: w[63] = amd_bytealign (w[25], w[26], offset); w[62] = amd_bytealign (w[24], w[25], offset); w[61] = amd_bytealign (w[23], w[24], offset); w[60] = amd_bytealign (w[22], w[23], offset); w[59] = amd_bytealign (w[21], w[22], offset); w[58] = amd_bytealign (w[20], w[21], offset); w[57] = amd_bytealign (w[19], w[20], offset); w[56] = amd_bytealign (w[18], w[19], offset); w[55] = amd_bytealign (w[17], w[18], offset); w[54] = amd_bytealign (w[16], w[17], offset); w[53] = amd_bytealign (w[15], w[16], offset); w[52] = amd_bytealign (w[14], w[15], offset); w[51] = amd_bytealign (w[13], w[14], offset); w[50] = amd_bytealign (w[12], w[13], offset); w[49] = amd_bytealign (w[11], w[12], offset); w[48] = amd_bytealign (w[10], w[11], offset); w[47] = amd_bytealign (w[ 9], w[10], offset); w[46] = amd_bytealign (w[ 8], w[ 9], offset); w[45] = amd_bytealign (w[ 7], w[ 8], offset); w[44] = amd_bytealign (w[ 6], w[ 7], offset); w[43] = amd_bytealign (w[ 5], w[ 6], offset); w[42] = amd_bytealign (w[ 4], w[ 5], offset); w[41] = amd_bytealign (w[ 3], w[ 4], offset); w[40] = amd_bytealign (w[ 2], w[ 3], offset); w[39] = amd_bytealign (w[ 1], w[ 2], offset); w[38] = amd_bytealign (w[ 0], w[ 1], offset); w[37] = amd_bytealign ( 0, w[ 0], offset); w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 38: w[63] = amd_bytealign (w[24], w[25], offset); w[62] = amd_bytealign (w[23], w[24], offset); w[61] = amd_bytealign (w[22], w[23], offset); w[60] = amd_bytealign (w[21], w[22], offset); w[59] = amd_bytealign (w[20], w[21], offset); w[58] = amd_bytealign (w[19], w[20], offset); w[57] = amd_bytealign (w[18], w[19], offset); w[56] = amd_bytealign (w[17], w[18], offset); w[55] = amd_bytealign (w[16], w[17], offset); w[54] = amd_bytealign (w[15], w[16], offset); w[53] = amd_bytealign (w[14], w[15], offset); w[52] = amd_bytealign (w[13], w[14], offset); w[51] = amd_bytealign (w[12], w[13], offset); w[50] = amd_bytealign (w[11], w[12], offset); w[49] = amd_bytealign (w[10], w[11], offset); w[48] = amd_bytealign (w[ 9], w[10], offset); w[47] = amd_bytealign (w[ 8], w[ 9], offset); w[46] = amd_bytealign (w[ 7], w[ 8], offset); w[45] = amd_bytealign (w[ 6], w[ 7], offset); w[44] = amd_bytealign (w[ 5], w[ 6], offset); w[43] = amd_bytealign (w[ 4], w[ 5], offset); w[42] = amd_bytealign (w[ 3], w[ 4], offset); w[41] = amd_bytealign (w[ 2], w[ 3], offset); w[40] = amd_bytealign (w[ 1], w[ 2], offset); w[39] = amd_bytealign (w[ 0], w[ 1], offset); w[38] = amd_bytealign ( 0, w[ 0], offset); w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 39: w[63] = amd_bytealign (w[23], w[24], offset); w[62] = amd_bytealign (w[22], w[23], offset); w[61] = amd_bytealign (w[21], w[22], offset); w[60] = amd_bytealign (w[20], w[21], offset); w[59] = amd_bytealign (w[19], w[20], offset); w[58] = amd_bytealign (w[18], w[19], offset); w[57] = amd_bytealign (w[17], w[18], offset); w[56] = amd_bytealign (w[16], w[17], offset); w[55] = amd_bytealign (w[15], w[16], offset); w[54] = amd_bytealign (w[14], w[15], offset); w[53] = amd_bytealign (w[13], w[14], offset); w[52] = amd_bytealign (w[12], w[13], offset); w[51] = amd_bytealign (w[11], w[12], offset); w[50] = amd_bytealign (w[10], w[11], offset); w[49] = amd_bytealign (w[ 9], w[10], offset); w[48] = amd_bytealign (w[ 8], w[ 9], offset); w[47] = amd_bytealign (w[ 7], w[ 8], offset); w[46] = amd_bytealign (w[ 6], w[ 7], offset); w[45] = amd_bytealign (w[ 5], w[ 6], offset); w[44] = amd_bytealign (w[ 4], w[ 5], offset); w[43] = amd_bytealign (w[ 3], w[ 4], offset); w[42] = amd_bytealign (w[ 2], w[ 3], offset); w[41] = amd_bytealign (w[ 1], w[ 2], offset); w[40] = amd_bytealign (w[ 0], w[ 1], offset); w[39] = amd_bytealign ( 0, w[ 0], offset); w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 40: w[63] = amd_bytealign (w[22], w[23], offset); w[62] = amd_bytealign (w[21], w[22], offset); w[61] = amd_bytealign (w[20], w[21], offset); w[60] = amd_bytealign (w[19], w[20], offset); w[59] = amd_bytealign (w[18], w[19], offset); w[58] = amd_bytealign (w[17], w[18], offset); w[57] = amd_bytealign (w[16], w[17], offset); w[56] = amd_bytealign (w[15], w[16], offset); w[55] = amd_bytealign (w[14], w[15], offset); w[54] = amd_bytealign (w[13], w[14], offset); w[53] = amd_bytealign (w[12], w[13], offset); w[52] = amd_bytealign (w[11], w[12], offset); w[51] = amd_bytealign (w[10], w[11], offset); w[50] = amd_bytealign (w[ 9], w[10], offset); w[49] = amd_bytealign (w[ 8], w[ 9], offset); w[48] = amd_bytealign (w[ 7], w[ 8], offset); w[47] = amd_bytealign (w[ 6], w[ 7], offset); w[46] = amd_bytealign (w[ 5], w[ 6], offset); w[45] = amd_bytealign (w[ 4], w[ 5], offset); w[44] = amd_bytealign (w[ 3], w[ 4], offset); w[43] = amd_bytealign (w[ 2], w[ 3], offset); w[42] = amd_bytealign (w[ 1], w[ 2], offset); w[41] = amd_bytealign (w[ 0], w[ 1], offset); w[40] = amd_bytealign ( 0, w[ 0], offset); w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 41: w[63] = amd_bytealign (w[21], w[22], offset); w[62] = amd_bytealign (w[20], w[21], offset); w[61] = amd_bytealign (w[19], w[20], offset); w[60] = amd_bytealign (w[18], w[19], offset); w[59] = amd_bytealign (w[17], w[18], offset); w[58] = amd_bytealign (w[16], w[17], offset); w[57] = amd_bytealign (w[15], w[16], offset); w[56] = amd_bytealign (w[14], w[15], offset); w[55] = amd_bytealign (w[13], w[14], offset); w[54] = amd_bytealign (w[12], w[13], offset); w[53] = amd_bytealign (w[11], w[12], offset); w[52] = amd_bytealign (w[10], w[11], offset); w[51] = amd_bytealign (w[ 9], w[10], offset); w[50] = amd_bytealign (w[ 8], w[ 9], offset); w[49] = amd_bytealign (w[ 7], w[ 8], offset); w[48] = amd_bytealign (w[ 6], w[ 7], offset); w[47] = amd_bytealign (w[ 5], w[ 6], offset); w[46] = amd_bytealign (w[ 4], w[ 5], offset); w[45] = amd_bytealign (w[ 3], w[ 4], offset); w[44] = amd_bytealign (w[ 2], w[ 3], offset); w[43] = amd_bytealign (w[ 1], w[ 2], offset); w[42] = amd_bytealign (w[ 0], w[ 1], offset); w[41] = amd_bytealign ( 0, w[ 0], offset); w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 42: w[63] = amd_bytealign (w[20], w[21], offset); w[62] = amd_bytealign (w[19], w[20], offset); w[61] = amd_bytealign (w[18], w[19], offset); w[60] = amd_bytealign (w[17], w[18], offset); w[59] = amd_bytealign (w[16], w[17], offset); w[58] = amd_bytealign (w[15], w[16], offset); w[57] = amd_bytealign (w[14], w[15], offset); w[56] = amd_bytealign (w[13], w[14], offset); w[55] = amd_bytealign (w[12], w[13], offset); w[54] = amd_bytealign (w[11], w[12], offset); w[53] = amd_bytealign (w[10], w[11], offset); w[52] = amd_bytealign (w[ 9], w[10], offset); w[51] = amd_bytealign (w[ 8], w[ 9], offset); w[50] = amd_bytealign (w[ 7], w[ 8], offset); w[49] = amd_bytealign (w[ 6], w[ 7], offset); w[48] = amd_bytealign (w[ 5], w[ 6], offset); w[47] = amd_bytealign (w[ 4], w[ 5], offset); w[46] = amd_bytealign (w[ 3], w[ 4], offset); w[45] = amd_bytealign (w[ 2], w[ 3], offset); w[44] = amd_bytealign (w[ 1], w[ 2], offset); w[43] = amd_bytealign (w[ 0], w[ 1], offset); w[42] = amd_bytealign ( 0, w[ 0], offset); w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 43: w[63] = amd_bytealign (w[19], w[20], offset); w[62] = amd_bytealign (w[18], w[19], offset); w[61] = amd_bytealign (w[17], w[18], offset); w[60] = amd_bytealign (w[16], w[17], offset); w[59] = amd_bytealign (w[15], w[16], offset); w[58] = amd_bytealign (w[14], w[15], offset); w[57] = amd_bytealign (w[13], w[14], offset); w[56] = amd_bytealign (w[12], w[13], offset); w[55] = amd_bytealign (w[11], w[12], offset); w[54] = amd_bytealign (w[10], w[11], offset); w[53] = amd_bytealign (w[ 9], w[10], offset); w[52] = amd_bytealign (w[ 8], w[ 9], offset); w[51] = amd_bytealign (w[ 7], w[ 8], offset); w[50] = amd_bytealign (w[ 6], w[ 7], offset); w[49] = amd_bytealign (w[ 5], w[ 6], offset); w[48] = amd_bytealign (w[ 4], w[ 5], offset); w[47] = amd_bytealign (w[ 3], w[ 4], offset); w[46] = amd_bytealign (w[ 2], w[ 3], offset); w[45] = amd_bytealign (w[ 1], w[ 2], offset); w[44] = amd_bytealign (w[ 0], w[ 1], offset); w[43] = amd_bytealign ( 0, w[ 0], offset); w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 44: w[63] = amd_bytealign (w[18], w[19], offset); w[62] = amd_bytealign (w[17], w[18], offset); w[61] = amd_bytealign (w[16], w[17], offset); w[60] = amd_bytealign (w[15], w[16], offset); w[59] = amd_bytealign (w[14], w[15], offset); w[58] = amd_bytealign (w[13], w[14], offset); w[57] = amd_bytealign (w[12], w[13], offset); w[56] = amd_bytealign (w[11], w[12], offset); w[55] = amd_bytealign (w[10], w[11], offset); w[54] = amd_bytealign (w[ 9], w[10], offset); w[53] = amd_bytealign (w[ 8], w[ 9], offset); w[52] = amd_bytealign (w[ 7], w[ 8], offset); w[51] = amd_bytealign (w[ 6], w[ 7], offset); w[50] = amd_bytealign (w[ 5], w[ 6], offset); w[49] = amd_bytealign (w[ 4], w[ 5], offset); w[48] = amd_bytealign (w[ 3], w[ 4], offset); w[47] = amd_bytealign (w[ 2], w[ 3], offset); w[46] = amd_bytealign (w[ 1], w[ 2], offset); w[45] = amd_bytealign (w[ 0], w[ 1], offset); w[44] = amd_bytealign ( 0, w[ 0], offset); w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 45: w[63] = amd_bytealign (w[17], w[18], offset); w[62] = amd_bytealign (w[16], w[17], offset); w[61] = amd_bytealign (w[15], w[16], offset); w[60] = amd_bytealign (w[14], w[15], offset); w[59] = amd_bytealign (w[13], w[14], offset); w[58] = amd_bytealign (w[12], w[13], offset); w[57] = amd_bytealign (w[11], w[12], offset); w[56] = amd_bytealign (w[10], w[11], offset); w[55] = amd_bytealign (w[ 9], w[10], offset); w[54] = amd_bytealign (w[ 8], w[ 9], offset); w[53] = amd_bytealign (w[ 7], w[ 8], offset); w[52] = amd_bytealign (w[ 6], w[ 7], offset); w[51] = amd_bytealign (w[ 5], w[ 6], offset); w[50] = amd_bytealign (w[ 4], w[ 5], offset); w[49] = amd_bytealign (w[ 3], w[ 4], offset); w[48] = amd_bytealign (w[ 2], w[ 3], offset); w[47] = amd_bytealign (w[ 1], w[ 2], offset); w[46] = amd_bytealign (w[ 0], w[ 1], offset); w[45] = amd_bytealign ( 0, w[ 0], offset); w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 46: w[63] = amd_bytealign (w[16], w[17], offset); w[62] = amd_bytealign (w[15], w[16], offset); w[61] = amd_bytealign (w[14], w[15], offset); w[60] = amd_bytealign (w[13], w[14], offset); w[59] = amd_bytealign (w[12], w[13], offset); w[58] = amd_bytealign (w[11], w[12], offset); w[57] = amd_bytealign (w[10], w[11], offset); w[56] = amd_bytealign (w[ 9], w[10], offset); w[55] = amd_bytealign (w[ 8], w[ 9], offset); w[54] = amd_bytealign (w[ 7], w[ 8], offset); w[53] = amd_bytealign (w[ 6], w[ 7], offset); w[52] = amd_bytealign (w[ 5], w[ 6], offset); w[51] = amd_bytealign (w[ 4], w[ 5], offset); w[50] = amd_bytealign (w[ 3], w[ 4], offset); w[49] = amd_bytealign (w[ 2], w[ 3], offset); w[48] = amd_bytealign (w[ 1], w[ 2], offset); w[47] = amd_bytealign (w[ 0], w[ 1], offset); w[46] = amd_bytealign ( 0, w[ 0], offset); w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 47: w[63] = amd_bytealign (w[15], w[16], offset); w[62] = amd_bytealign (w[14], w[15], offset); w[61] = amd_bytealign (w[13], w[14], offset); w[60] = amd_bytealign (w[12], w[13], offset); w[59] = amd_bytealign (w[11], w[12], offset); w[58] = amd_bytealign (w[10], w[11], offset); w[57] = amd_bytealign (w[ 9], w[10], offset); w[56] = amd_bytealign (w[ 8], w[ 9], offset); w[55] = amd_bytealign (w[ 7], w[ 8], offset); w[54] = amd_bytealign (w[ 6], w[ 7], offset); w[53] = amd_bytealign (w[ 5], w[ 6], offset); w[52] = amd_bytealign (w[ 4], w[ 5], offset); w[51] = amd_bytealign (w[ 3], w[ 4], offset); w[50] = amd_bytealign (w[ 2], w[ 3], offset); w[49] = amd_bytealign (w[ 1], w[ 2], offset); w[48] = amd_bytealign (w[ 0], w[ 1], offset); w[47] = amd_bytealign ( 0, w[ 0], offset); w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 48: w[63] = amd_bytealign (w[14], w[15], offset); w[62] = amd_bytealign (w[13], w[14], offset); w[61] = amd_bytealign (w[12], w[13], offset); w[60] = amd_bytealign (w[11], w[12], offset); w[59] = amd_bytealign (w[10], w[11], offset); w[58] = amd_bytealign (w[ 9], w[10], offset); w[57] = amd_bytealign (w[ 8], w[ 9], offset); w[56] = amd_bytealign (w[ 7], w[ 8], offset); w[55] = amd_bytealign (w[ 6], w[ 7], offset); w[54] = amd_bytealign (w[ 5], w[ 6], offset); w[53] = amd_bytealign (w[ 4], w[ 5], offset); w[52] = amd_bytealign (w[ 3], w[ 4], offset); w[51] = amd_bytealign (w[ 2], w[ 3], offset); w[50] = amd_bytealign (w[ 1], w[ 2], offset); w[49] = amd_bytealign (w[ 0], w[ 1], offset); w[48] = amd_bytealign ( 0, w[ 0], offset); w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 49: w[63] = amd_bytealign (w[13], w[14], offset); w[62] = amd_bytealign (w[12], w[13], offset); w[61] = amd_bytealign (w[11], w[12], offset); w[60] = amd_bytealign (w[10], w[11], offset); w[59] = amd_bytealign (w[ 9], w[10], offset); w[58] = amd_bytealign (w[ 8], w[ 9], offset); w[57] = amd_bytealign (w[ 7], w[ 8], offset); w[56] = amd_bytealign (w[ 6], w[ 7], offset); w[55] = amd_bytealign (w[ 5], w[ 6], offset); w[54] = amd_bytealign (w[ 4], w[ 5], offset); w[53] = amd_bytealign (w[ 3], w[ 4], offset); w[52] = amd_bytealign (w[ 2], w[ 3], offset); w[51] = amd_bytealign (w[ 1], w[ 2], offset); w[50] = amd_bytealign (w[ 0], w[ 1], offset); w[49] = amd_bytealign ( 0, w[ 0], offset); w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 50: w[63] = amd_bytealign (w[12], w[13], offset); w[62] = amd_bytealign (w[11], w[12], offset); w[61] = amd_bytealign (w[10], w[11], offset); w[60] = amd_bytealign (w[ 9], w[10], offset); w[59] = amd_bytealign (w[ 8], w[ 9], offset); w[58] = amd_bytealign (w[ 7], w[ 8], offset); w[57] = amd_bytealign (w[ 6], w[ 7], offset); w[56] = amd_bytealign (w[ 5], w[ 6], offset); w[55] = amd_bytealign (w[ 4], w[ 5], offset); w[54] = amd_bytealign (w[ 3], w[ 4], offset); w[53] = amd_bytealign (w[ 2], w[ 3], offset); w[52] = amd_bytealign (w[ 1], w[ 2], offset); w[51] = amd_bytealign (w[ 0], w[ 1], offset); w[50] = amd_bytealign ( 0, w[ 0], offset); w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 51: w[63] = amd_bytealign (w[11], w[12], offset); w[62] = amd_bytealign (w[10], w[11], offset); w[61] = amd_bytealign (w[ 9], w[10], offset); w[60] = amd_bytealign (w[ 8], w[ 9], offset); w[59] = amd_bytealign (w[ 7], w[ 8], offset); w[58] = amd_bytealign (w[ 6], w[ 7], offset); w[57] = amd_bytealign (w[ 5], w[ 6], offset); w[56] = amd_bytealign (w[ 4], w[ 5], offset); w[55] = amd_bytealign (w[ 3], w[ 4], offset); w[54] = amd_bytealign (w[ 2], w[ 3], offset); w[53] = amd_bytealign (w[ 1], w[ 2], offset); w[52] = amd_bytealign (w[ 0], w[ 1], offset); w[51] = amd_bytealign ( 0, w[ 0], offset); w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 52: w[63] = amd_bytealign (w[10], w[11], offset); w[62] = amd_bytealign (w[ 9], w[10], offset); w[61] = amd_bytealign (w[ 8], w[ 9], offset); w[60] = amd_bytealign (w[ 7], w[ 8], offset); w[59] = amd_bytealign (w[ 6], w[ 7], offset); w[58] = amd_bytealign (w[ 5], w[ 6], offset); w[57] = amd_bytealign (w[ 4], w[ 5], offset); w[56] = amd_bytealign (w[ 3], w[ 4], offset); w[55] = amd_bytealign (w[ 2], w[ 3], offset); w[54] = amd_bytealign (w[ 1], w[ 2], offset); w[53] = amd_bytealign (w[ 0], w[ 1], offset); w[52] = amd_bytealign ( 0, w[ 0], offset); w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 53: w[63] = amd_bytealign (w[ 9], w[10], offset); w[62] = amd_bytealign (w[ 8], w[ 9], offset); w[61] = amd_bytealign (w[ 7], w[ 8], offset); w[60] = amd_bytealign (w[ 6], w[ 7], offset); w[59] = amd_bytealign (w[ 5], w[ 6], offset); w[58] = amd_bytealign (w[ 4], w[ 5], offset); w[57] = amd_bytealign (w[ 3], w[ 4], offset); w[56] = amd_bytealign (w[ 2], w[ 3], offset); w[55] = amd_bytealign (w[ 1], w[ 2], offset); w[54] = amd_bytealign (w[ 0], w[ 1], offset); w[53] = amd_bytealign ( 0, w[ 0], offset); w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 54: w[63] = amd_bytealign (w[ 8], w[ 9], offset); w[62] = amd_bytealign (w[ 7], w[ 8], offset); w[61] = amd_bytealign (w[ 6], w[ 7], offset); w[60] = amd_bytealign (w[ 5], w[ 6], offset); w[59] = amd_bytealign (w[ 4], w[ 5], offset); w[58] = amd_bytealign (w[ 3], w[ 4], offset); w[57] = amd_bytealign (w[ 2], w[ 3], offset); w[56] = amd_bytealign (w[ 1], w[ 2], offset); w[55] = amd_bytealign (w[ 0], w[ 1], offset); w[54] = amd_bytealign ( 0, w[ 0], offset); w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 55: w[63] = amd_bytealign (w[ 7], w[ 8], offset); w[62] = amd_bytealign (w[ 6], w[ 7], offset); w[61] = amd_bytealign (w[ 5], w[ 6], offset); w[60] = amd_bytealign (w[ 4], w[ 5], offset); w[59] = amd_bytealign (w[ 3], w[ 4], offset); w[58] = amd_bytealign (w[ 2], w[ 3], offset); w[57] = amd_bytealign (w[ 1], w[ 2], offset); w[56] = amd_bytealign (w[ 0], w[ 1], offset); w[55] = amd_bytealign ( 0, w[ 0], offset); w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 56: w[63] = amd_bytealign (w[ 6], w[ 7], offset); w[62] = amd_bytealign (w[ 5], w[ 6], offset); w[61] = amd_bytealign (w[ 4], w[ 5], offset); w[60] = amd_bytealign (w[ 3], w[ 4], offset); w[59] = amd_bytealign (w[ 2], w[ 3], offset); w[58] = amd_bytealign (w[ 1], w[ 2], offset); w[57] = amd_bytealign (w[ 0], w[ 1], offset); w[56] = amd_bytealign ( 0, w[ 0], offset); w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 57: w[63] = amd_bytealign (w[ 5], w[ 6], offset); w[62] = amd_bytealign (w[ 4], w[ 5], offset); w[61] = amd_bytealign (w[ 3], w[ 4], offset); w[60] = amd_bytealign (w[ 2], w[ 3], offset); w[59] = amd_bytealign (w[ 1], w[ 2], offset); w[58] = amd_bytealign (w[ 0], w[ 1], offset); w[57] = amd_bytealign ( 0, w[ 0], offset); w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 58: w[63] = amd_bytealign (w[ 4], w[ 5], offset); w[62] = amd_bytealign (w[ 3], w[ 4], offset); w[61] = amd_bytealign (w[ 2], w[ 3], offset); w[60] = amd_bytealign (w[ 1], w[ 2], offset); w[59] = amd_bytealign (w[ 0], w[ 1], offset); w[58] = amd_bytealign ( 0, w[ 0], offset); w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 59: w[63] = amd_bytealign (w[ 3], w[ 4], offset); w[62] = amd_bytealign (w[ 2], w[ 3], offset); w[61] = amd_bytealign (w[ 1], w[ 2], offset); w[60] = amd_bytealign (w[ 0], w[ 1], offset); w[59] = amd_bytealign ( 0, w[ 0], offset); w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 60: w[63] = amd_bytealign (w[ 2], w[ 3], offset); w[62] = amd_bytealign (w[ 1], w[ 2], offset); w[61] = amd_bytealign (w[ 0], w[ 1], offset); w[60] = amd_bytealign ( 0, w[ 0], offset); w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 61: w[63] = amd_bytealign (w[ 1], w[ 2], offset); w[62] = amd_bytealign (w[ 0], w[ 1], offset); w[61] = amd_bytealign ( 0, w[ 0], offset); w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 62: w[63] = amd_bytealign (w[ 0], w[ 1], offset); w[62] = amd_bytealign ( 0, w[ 0], offset); w[61] = 0; w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 63: w[63] = amd_bytealign ( 0, w[ 0], offset); w[62] = 0; w[61] = 0; w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; } #pragma unroll for (int i = 0; i < 64; i++) w[i] = swap32 (w[i]); #endif #if (defined IS_AMD && AMD_GCN >= 3) || defined IS_NV #if defined IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; #endif #if defined IS_AMD const int selector = 0x0706050403020100 >> (offset_minus_4 * 8); #endif switch (offset_switch) { case 0: w[63] = __byte_perm (w[62], w[63], selector); w[62] = __byte_perm (w[61], w[62], selector); w[61] = __byte_perm (w[60], w[61], selector); w[60] = __byte_perm (w[59], w[60], selector); w[59] = __byte_perm (w[58], w[59], selector); w[58] = __byte_perm (w[57], w[58], selector); w[57] = __byte_perm (w[56], w[57], selector); w[56] = __byte_perm (w[55], w[56], selector); w[55] = __byte_perm (w[54], w[55], selector); w[54] = __byte_perm (w[53], w[54], selector); w[53] = __byte_perm (w[52], w[53], selector); w[52] = __byte_perm (w[51], w[52], selector); w[51] = __byte_perm (w[50], w[51], selector); w[50] = __byte_perm (w[49], w[50], selector); w[49] = __byte_perm (w[48], w[49], selector); w[48] = __byte_perm (w[47], w[48], selector); w[47] = __byte_perm (w[46], w[47], selector); w[46] = __byte_perm (w[45], w[46], selector); w[45] = __byte_perm (w[44], w[45], selector); w[44] = __byte_perm (w[43], w[44], selector); w[43] = __byte_perm (w[42], w[43], selector); w[42] = __byte_perm (w[41], w[42], selector); w[41] = __byte_perm (w[40], w[41], selector); w[40] = __byte_perm (w[39], w[40], selector); w[39] = __byte_perm (w[38], w[39], selector); w[38] = __byte_perm (w[37], w[38], selector); w[37] = __byte_perm (w[36], w[37], selector); w[36] = __byte_perm (w[35], w[36], selector); w[35] = __byte_perm (w[34], w[35], selector); w[34] = __byte_perm (w[33], w[34], selector); w[33] = __byte_perm (w[32], w[33], selector); w[32] = __byte_perm (w[31], w[32], selector); w[31] = __byte_perm (w[30], w[31], selector); w[30] = __byte_perm (w[29], w[30], selector); w[29] = __byte_perm (w[28], w[29], selector); w[28] = __byte_perm (w[27], w[28], selector); w[27] = __byte_perm (w[26], w[27], selector); w[26] = __byte_perm (w[25], w[26], selector); w[25] = __byte_perm (w[24], w[25], selector); w[24] = __byte_perm (w[23], w[24], selector); w[23] = __byte_perm (w[22], w[23], selector); w[22] = __byte_perm (w[21], w[22], selector); w[21] = __byte_perm (w[20], w[21], selector); w[20] = __byte_perm (w[19], w[20], selector); w[19] = __byte_perm (w[18], w[19], selector); w[18] = __byte_perm (w[17], w[18], selector); w[17] = __byte_perm (w[16], w[17], selector); w[16] = __byte_perm (w[15], w[16], selector); w[15] = __byte_perm (w[14], w[15], selector); w[14] = __byte_perm (w[13], w[14], selector); w[13] = __byte_perm (w[12], w[13], selector); w[12] = __byte_perm (w[11], w[12], selector); w[11] = __byte_perm (w[10], w[11], selector); w[10] = __byte_perm (w[ 9], w[10], selector); w[ 9] = __byte_perm (w[ 8], w[ 9], selector); w[ 8] = __byte_perm (w[ 7], w[ 8], selector); w[ 7] = __byte_perm (w[ 6], w[ 7], selector); w[ 6] = __byte_perm (w[ 5], w[ 6], selector); w[ 5] = __byte_perm (w[ 4], w[ 5], selector); w[ 4] = __byte_perm (w[ 3], w[ 4], selector); w[ 3] = __byte_perm (w[ 2], w[ 3], selector); w[ 2] = __byte_perm (w[ 1], w[ 2], selector); w[ 1] = __byte_perm (w[ 0], w[ 1], selector); w[ 0] = __byte_perm ( 0, w[ 0], selector); break; case 1: w[63] = __byte_perm (w[61], w[62], selector); w[62] = __byte_perm (w[60], w[61], selector); w[61] = __byte_perm (w[59], w[60], selector); w[60] = __byte_perm (w[58], w[59], selector); w[59] = __byte_perm (w[57], w[58], selector); w[58] = __byte_perm (w[56], w[57], selector); w[57] = __byte_perm (w[55], w[56], selector); w[56] = __byte_perm (w[54], w[55], selector); w[55] = __byte_perm (w[53], w[54], selector); w[54] = __byte_perm (w[52], w[53], selector); w[53] = __byte_perm (w[51], w[52], selector); w[52] = __byte_perm (w[50], w[51], selector); w[51] = __byte_perm (w[49], w[50], selector); w[50] = __byte_perm (w[48], w[49], selector); w[49] = __byte_perm (w[47], w[48], selector); w[48] = __byte_perm (w[46], w[47], selector); w[47] = __byte_perm (w[45], w[46], selector); w[46] = __byte_perm (w[44], w[45], selector); w[45] = __byte_perm (w[43], w[44], selector); w[44] = __byte_perm (w[42], w[43], selector); w[43] = __byte_perm (w[41], w[42], selector); w[42] = __byte_perm (w[40], w[41], selector); w[41] = __byte_perm (w[39], w[40], selector); w[40] = __byte_perm (w[38], w[39], selector); w[39] = __byte_perm (w[37], w[38], selector); w[38] = __byte_perm (w[36], w[37], selector); w[37] = __byte_perm (w[35], w[36], selector); w[36] = __byte_perm (w[34], w[35], selector); w[35] = __byte_perm (w[33], w[34], selector); w[34] = __byte_perm (w[32], w[33], selector); w[33] = __byte_perm (w[31], w[32], selector); w[32] = __byte_perm (w[30], w[31], selector); w[31] = __byte_perm (w[29], w[30], selector); w[30] = __byte_perm (w[28], w[29], selector); w[29] = __byte_perm (w[27], w[28], selector); w[28] = __byte_perm (w[26], w[27], selector); w[27] = __byte_perm (w[25], w[26], selector); w[26] = __byte_perm (w[24], w[25], selector); w[25] = __byte_perm (w[23], w[24], selector); w[24] = __byte_perm (w[22], w[23], selector); w[23] = __byte_perm (w[21], w[22], selector); w[22] = __byte_perm (w[20], w[21], selector); w[21] = __byte_perm (w[19], w[20], selector); w[20] = __byte_perm (w[18], w[19], selector); w[19] = __byte_perm (w[17], w[18], selector); w[18] = __byte_perm (w[16], w[17], selector); w[17] = __byte_perm (w[15], w[16], selector); w[16] = __byte_perm (w[14], w[15], selector); w[15] = __byte_perm (w[13], w[14], selector); w[14] = __byte_perm (w[12], w[13], selector); w[13] = __byte_perm (w[11], w[12], selector); w[12] = __byte_perm (w[10], w[11], selector); w[11] = __byte_perm (w[ 9], w[10], selector); w[10] = __byte_perm (w[ 8], w[ 9], selector); w[ 9] = __byte_perm (w[ 7], w[ 8], selector); w[ 8] = __byte_perm (w[ 6], w[ 7], selector); w[ 7] = __byte_perm (w[ 5], w[ 6], selector); w[ 6] = __byte_perm (w[ 4], w[ 5], selector); w[ 5] = __byte_perm (w[ 3], w[ 4], selector); w[ 4] = __byte_perm (w[ 2], w[ 3], selector); w[ 3] = __byte_perm (w[ 1], w[ 2], selector); w[ 2] = __byte_perm (w[ 0], w[ 1], selector); w[ 1] = __byte_perm ( 0, w[ 0], selector); w[ 0] = 0; break; case 2: w[63] = __byte_perm (w[60], w[61], selector); w[62] = __byte_perm (w[59], w[60], selector); w[61] = __byte_perm (w[58], w[59], selector); w[60] = __byte_perm (w[57], w[58], selector); w[59] = __byte_perm (w[56], w[57], selector); w[58] = __byte_perm (w[55], w[56], selector); w[57] = __byte_perm (w[54], w[55], selector); w[56] = __byte_perm (w[53], w[54], selector); w[55] = __byte_perm (w[52], w[53], selector); w[54] = __byte_perm (w[51], w[52], selector); w[53] = __byte_perm (w[50], w[51], selector); w[52] = __byte_perm (w[49], w[50], selector); w[51] = __byte_perm (w[48], w[49], selector); w[50] = __byte_perm (w[47], w[48], selector); w[49] = __byte_perm (w[46], w[47], selector); w[48] = __byte_perm (w[45], w[46], selector); w[47] = __byte_perm (w[44], w[45], selector); w[46] = __byte_perm (w[43], w[44], selector); w[45] = __byte_perm (w[42], w[43], selector); w[44] = __byte_perm (w[41], w[42], selector); w[43] = __byte_perm (w[40], w[41], selector); w[42] = __byte_perm (w[39], w[40], selector); w[41] = __byte_perm (w[38], w[39], selector); w[40] = __byte_perm (w[37], w[38], selector); w[39] = __byte_perm (w[36], w[37], selector); w[38] = __byte_perm (w[35], w[36], selector); w[37] = __byte_perm (w[34], w[35], selector); w[36] = __byte_perm (w[33], w[34], selector); w[35] = __byte_perm (w[32], w[33], selector); w[34] = __byte_perm (w[31], w[32], selector); w[33] = __byte_perm (w[30], w[31], selector); w[32] = __byte_perm (w[29], w[30], selector); w[31] = __byte_perm (w[28], w[29], selector); w[30] = __byte_perm (w[27], w[28], selector); w[29] = __byte_perm (w[26], w[27], selector); w[28] = __byte_perm (w[25], w[26], selector); w[27] = __byte_perm (w[24], w[25], selector); w[26] = __byte_perm (w[23], w[24], selector); w[25] = __byte_perm (w[22], w[23], selector); w[24] = __byte_perm (w[21], w[22], selector); w[23] = __byte_perm (w[20], w[21], selector); w[22] = __byte_perm (w[19], w[20], selector); w[21] = __byte_perm (w[18], w[19], selector); w[20] = __byte_perm (w[17], w[18], selector); w[19] = __byte_perm (w[16], w[17], selector); w[18] = __byte_perm (w[15], w[16], selector); w[17] = __byte_perm (w[14], w[15], selector); w[16] = __byte_perm (w[13], w[14], selector); w[15] = __byte_perm (w[12], w[13], selector); w[14] = __byte_perm (w[11], w[12], selector); w[13] = __byte_perm (w[10], w[11], selector); w[12] = __byte_perm (w[ 9], w[10], selector); w[11] = __byte_perm (w[ 8], w[ 9], selector); w[10] = __byte_perm (w[ 7], w[ 8], selector); w[ 9] = __byte_perm (w[ 6], w[ 7], selector); w[ 8] = __byte_perm (w[ 5], w[ 6], selector); w[ 7] = __byte_perm (w[ 4], w[ 5], selector); w[ 6] = __byte_perm (w[ 3], w[ 4], selector); w[ 5] = __byte_perm (w[ 2], w[ 3], selector); w[ 4] = __byte_perm (w[ 1], w[ 2], selector); w[ 3] = __byte_perm (w[ 0], w[ 1], selector); w[ 2] = __byte_perm ( 0, w[ 0], selector); w[ 1] = 0; w[ 0] = 0; break; case 3: w[63] = __byte_perm (w[59], w[60], selector); w[62] = __byte_perm (w[58], w[59], selector); w[61] = __byte_perm (w[57], w[58], selector); w[60] = __byte_perm (w[56], w[57], selector); w[59] = __byte_perm (w[55], w[56], selector); w[58] = __byte_perm (w[54], w[55], selector); w[57] = __byte_perm (w[53], w[54], selector); w[56] = __byte_perm (w[52], w[53], selector); w[55] = __byte_perm (w[51], w[52], selector); w[54] = __byte_perm (w[50], w[51], selector); w[53] = __byte_perm (w[49], w[50], selector); w[52] = __byte_perm (w[48], w[49], selector); w[51] = __byte_perm (w[47], w[48], selector); w[50] = __byte_perm (w[46], w[47], selector); w[49] = __byte_perm (w[45], w[46], selector); w[48] = __byte_perm (w[44], w[45], selector); w[47] = __byte_perm (w[43], w[44], selector); w[46] = __byte_perm (w[42], w[43], selector); w[45] = __byte_perm (w[41], w[42], selector); w[44] = __byte_perm (w[40], w[41], selector); w[43] = __byte_perm (w[39], w[40], selector); w[42] = __byte_perm (w[38], w[39], selector); w[41] = __byte_perm (w[37], w[38], selector); w[40] = __byte_perm (w[36], w[37], selector); w[39] = __byte_perm (w[35], w[36], selector); w[38] = __byte_perm (w[34], w[35], selector); w[37] = __byte_perm (w[33], w[34], selector); w[36] = __byte_perm (w[32], w[33], selector); w[35] = __byte_perm (w[31], w[32], selector); w[34] = __byte_perm (w[30], w[31], selector); w[33] = __byte_perm (w[29], w[30], selector); w[32] = __byte_perm (w[28], w[29], selector); w[31] = __byte_perm (w[27], w[28], selector); w[30] = __byte_perm (w[26], w[27], selector); w[29] = __byte_perm (w[25], w[26], selector); w[28] = __byte_perm (w[24], w[25], selector); w[27] = __byte_perm (w[23], w[24], selector); w[26] = __byte_perm (w[22], w[23], selector); w[25] = __byte_perm (w[21], w[22], selector); w[24] = __byte_perm (w[20], w[21], selector); w[23] = __byte_perm (w[19], w[20], selector); w[22] = __byte_perm (w[18], w[19], selector); w[21] = __byte_perm (w[17], w[18], selector); w[20] = __byte_perm (w[16], w[17], selector); w[19] = __byte_perm (w[15], w[16], selector); w[18] = __byte_perm (w[14], w[15], selector); w[17] = __byte_perm (w[13], w[14], selector); w[16] = __byte_perm (w[12], w[13], selector); w[15] = __byte_perm (w[11], w[12], selector); w[14] = __byte_perm (w[10], w[11], selector); w[13] = __byte_perm (w[ 9], w[10], selector); w[12] = __byte_perm (w[ 8], w[ 9], selector); w[11] = __byte_perm (w[ 7], w[ 8], selector); w[10] = __byte_perm (w[ 6], w[ 7], selector); w[ 9] = __byte_perm (w[ 5], w[ 6], selector); w[ 8] = __byte_perm (w[ 4], w[ 5], selector); w[ 7] = __byte_perm (w[ 3], w[ 4], selector); w[ 6] = __byte_perm (w[ 2], w[ 3], selector); w[ 5] = __byte_perm (w[ 1], w[ 2], selector); w[ 4] = __byte_perm (w[ 0], w[ 1], selector); w[ 3] = __byte_perm ( 0, w[ 0], selector); w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 4: w[63] = __byte_perm (w[58], w[59], selector); w[62] = __byte_perm (w[57], w[58], selector); w[61] = __byte_perm (w[56], w[57], selector); w[60] = __byte_perm (w[55], w[56], selector); w[59] = __byte_perm (w[54], w[55], selector); w[58] = __byte_perm (w[53], w[54], selector); w[57] = __byte_perm (w[52], w[53], selector); w[56] = __byte_perm (w[51], w[52], selector); w[55] = __byte_perm (w[50], w[51], selector); w[54] = __byte_perm (w[49], w[50], selector); w[53] = __byte_perm (w[48], w[49], selector); w[52] = __byte_perm (w[47], w[48], selector); w[51] = __byte_perm (w[46], w[47], selector); w[50] = __byte_perm (w[45], w[46], selector); w[49] = __byte_perm (w[44], w[45], selector); w[48] = __byte_perm (w[43], w[44], selector); w[47] = __byte_perm (w[42], w[43], selector); w[46] = __byte_perm (w[41], w[42], selector); w[45] = __byte_perm (w[40], w[41], selector); w[44] = __byte_perm (w[39], w[40], selector); w[43] = __byte_perm (w[38], w[39], selector); w[42] = __byte_perm (w[37], w[38], selector); w[41] = __byte_perm (w[36], w[37], selector); w[40] = __byte_perm (w[35], w[36], selector); w[39] = __byte_perm (w[34], w[35], selector); w[38] = __byte_perm (w[33], w[34], selector); w[37] = __byte_perm (w[32], w[33], selector); w[36] = __byte_perm (w[31], w[32], selector); w[35] = __byte_perm (w[30], w[31], selector); w[34] = __byte_perm (w[29], w[30], selector); w[33] = __byte_perm (w[28], w[29], selector); w[32] = __byte_perm (w[27], w[28], selector); w[31] = __byte_perm (w[26], w[27], selector); w[30] = __byte_perm (w[25], w[26], selector); w[29] = __byte_perm (w[24], w[25], selector); w[28] = __byte_perm (w[23], w[24], selector); w[27] = __byte_perm (w[22], w[23], selector); w[26] = __byte_perm (w[21], w[22], selector); w[25] = __byte_perm (w[20], w[21], selector); w[24] = __byte_perm (w[19], w[20], selector); w[23] = __byte_perm (w[18], w[19], selector); w[22] = __byte_perm (w[17], w[18], selector); w[21] = __byte_perm (w[16], w[17], selector); w[20] = __byte_perm (w[15], w[16], selector); w[19] = __byte_perm (w[14], w[15], selector); w[18] = __byte_perm (w[13], w[14], selector); w[17] = __byte_perm (w[12], w[13], selector); w[16] = __byte_perm (w[11], w[12], selector); w[15] = __byte_perm (w[10], w[11], selector); w[14] = __byte_perm (w[ 9], w[10], selector); w[13] = __byte_perm (w[ 8], w[ 9], selector); w[12] = __byte_perm (w[ 7], w[ 8], selector); w[11] = __byte_perm (w[ 6], w[ 7], selector); w[10] = __byte_perm (w[ 5], w[ 6], selector); w[ 9] = __byte_perm (w[ 4], w[ 5], selector); w[ 8] = __byte_perm (w[ 3], w[ 4], selector); w[ 7] = __byte_perm (w[ 2], w[ 3], selector); w[ 6] = __byte_perm (w[ 1], w[ 2], selector); w[ 5] = __byte_perm (w[ 0], w[ 1], selector); w[ 4] = __byte_perm ( 0, w[ 0], selector); w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 5: w[63] = __byte_perm (w[57], w[58], selector); w[62] = __byte_perm (w[56], w[57], selector); w[61] = __byte_perm (w[55], w[56], selector); w[60] = __byte_perm (w[54], w[55], selector); w[59] = __byte_perm (w[53], w[54], selector); w[58] = __byte_perm (w[52], w[53], selector); w[57] = __byte_perm (w[51], w[52], selector); w[56] = __byte_perm (w[50], w[51], selector); w[55] = __byte_perm (w[49], w[50], selector); w[54] = __byte_perm (w[48], w[49], selector); w[53] = __byte_perm (w[47], w[48], selector); w[52] = __byte_perm (w[46], w[47], selector); w[51] = __byte_perm (w[45], w[46], selector); w[50] = __byte_perm (w[44], w[45], selector); w[49] = __byte_perm (w[43], w[44], selector); w[48] = __byte_perm (w[42], w[43], selector); w[47] = __byte_perm (w[41], w[42], selector); w[46] = __byte_perm (w[40], w[41], selector); w[45] = __byte_perm (w[39], w[40], selector); w[44] = __byte_perm (w[38], w[39], selector); w[43] = __byte_perm (w[37], w[38], selector); w[42] = __byte_perm (w[36], w[37], selector); w[41] = __byte_perm (w[35], w[36], selector); w[40] = __byte_perm (w[34], w[35], selector); w[39] = __byte_perm (w[33], w[34], selector); w[38] = __byte_perm (w[32], w[33], selector); w[37] = __byte_perm (w[31], w[32], selector); w[36] = __byte_perm (w[30], w[31], selector); w[35] = __byte_perm (w[29], w[30], selector); w[34] = __byte_perm (w[28], w[29], selector); w[33] = __byte_perm (w[27], w[28], selector); w[32] = __byte_perm (w[26], w[27], selector); w[31] = __byte_perm (w[25], w[26], selector); w[30] = __byte_perm (w[24], w[25], selector); w[29] = __byte_perm (w[23], w[24], selector); w[28] = __byte_perm (w[22], w[23], selector); w[27] = __byte_perm (w[21], w[22], selector); w[26] = __byte_perm (w[20], w[21], selector); w[25] = __byte_perm (w[19], w[20], selector); w[24] = __byte_perm (w[18], w[19], selector); w[23] = __byte_perm (w[17], w[18], selector); w[22] = __byte_perm (w[16], w[17], selector); w[21] = __byte_perm (w[15], w[16], selector); w[20] = __byte_perm (w[14], w[15], selector); w[19] = __byte_perm (w[13], w[14], selector); w[18] = __byte_perm (w[12], w[13], selector); w[17] = __byte_perm (w[11], w[12], selector); w[16] = __byte_perm (w[10], w[11], selector); w[15] = __byte_perm (w[ 9], w[10], selector); w[14] = __byte_perm (w[ 8], w[ 9], selector); w[13] = __byte_perm (w[ 7], w[ 8], selector); w[12] = __byte_perm (w[ 6], w[ 7], selector); w[11] = __byte_perm (w[ 5], w[ 6], selector); w[10] = __byte_perm (w[ 4], w[ 5], selector); w[ 9] = __byte_perm (w[ 3], w[ 4], selector); w[ 8] = __byte_perm (w[ 2], w[ 3], selector); w[ 7] = __byte_perm (w[ 1], w[ 2], selector); w[ 6] = __byte_perm (w[ 0], w[ 1], selector); w[ 5] = __byte_perm ( 0, w[ 0], selector); w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 6: w[63] = __byte_perm (w[56], w[57], selector); w[62] = __byte_perm (w[55], w[56], selector); w[61] = __byte_perm (w[54], w[55], selector); w[60] = __byte_perm (w[53], w[54], selector); w[59] = __byte_perm (w[52], w[53], selector); w[58] = __byte_perm (w[51], w[52], selector); w[57] = __byte_perm (w[50], w[51], selector); w[56] = __byte_perm (w[49], w[50], selector); w[55] = __byte_perm (w[48], w[49], selector); w[54] = __byte_perm (w[47], w[48], selector); w[53] = __byte_perm (w[46], w[47], selector); w[52] = __byte_perm (w[45], w[46], selector); w[51] = __byte_perm (w[44], w[45], selector); w[50] = __byte_perm (w[43], w[44], selector); w[49] = __byte_perm (w[42], w[43], selector); w[48] = __byte_perm (w[41], w[42], selector); w[47] = __byte_perm (w[40], w[41], selector); w[46] = __byte_perm (w[39], w[40], selector); w[45] = __byte_perm (w[38], w[39], selector); w[44] = __byte_perm (w[37], w[38], selector); w[43] = __byte_perm (w[36], w[37], selector); w[42] = __byte_perm (w[35], w[36], selector); w[41] = __byte_perm (w[34], w[35], selector); w[40] = __byte_perm (w[33], w[34], selector); w[39] = __byte_perm (w[32], w[33], selector); w[38] = __byte_perm (w[31], w[32], selector); w[37] = __byte_perm (w[30], w[31], selector); w[36] = __byte_perm (w[29], w[30], selector); w[35] = __byte_perm (w[28], w[29], selector); w[34] = __byte_perm (w[27], w[28], selector); w[33] = __byte_perm (w[26], w[27], selector); w[32] = __byte_perm (w[25], w[26], selector); w[31] = __byte_perm (w[24], w[25], selector); w[30] = __byte_perm (w[23], w[24], selector); w[29] = __byte_perm (w[22], w[23], selector); w[28] = __byte_perm (w[21], w[22], selector); w[27] = __byte_perm (w[20], w[21], selector); w[26] = __byte_perm (w[19], w[20], selector); w[25] = __byte_perm (w[18], w[19], selector); w[24] = __byte_perm (w[17], w[18], selector); w[23] = __byte_perm (w[16], w[17], selector); w[22] = __byte_perm (w[15], w[16], selector); w[21] = __byte_perm (w[14], w[15], selector); w[20] = __byte_perm (w[13], w[14], selector); w[19] = __byte_perm (w[12], w[13], selector); w[18] = __byte_perm (w[11], w[12], selector); w[17] = __byte_perm (w[10], w[11], selector); w[16] = __byte_perm (w[ 9], w[10], selector); w[15] = __byte_perm (w[ 8], w[ 9], selector); w[14] = __byte_perm (w[ 7], w[ 8], selector); w[13] = __byte_perm (w[ 6], w[ 7], selector); w[12] = __byte_perm (w[ 5], w[ 6], selector); w[11] = __byte_perm (w[ 4], w[ 5], selector); w[10] = __byte_perm (w[ 3], w[ 4], selector); w[ 9] = __byte_perm (w[ 2], w[ 3], selector); w[ 8] = __byte_perm (w[ 1], w[ 2], selector); w[ 7] = __byte_perm (w[ 0], w[ 1], selector); w[ 6] = __byte_perm ( 0, w[ 0], selector); w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 7: w[63] = __byte_perm (w[55], w[56], selector); w[62] = __byte_perm (w[54], w[55], selector); w[61] = __byte_perm (w[53], w[54], selector); w[60] = __byte_perm (w[52], w[53], selector); w[59] = __byte_perm (w[51], w[52], selector); w[58] = __byte_perm (w[50], w[51], selector); w[57] = __byte_perm (w[49], w[50], selector); w[56] = __byte_perm (w[48], w[49], selector); w[55] = __byte_perm (w[47], w[48], selector); w[54] = __byte_perm (w[46], w[47], selector); w[53] = __byte_perm (w[45], w[46], selector); w[52] = __byte_perm (w[44], w[45], selector); w[51] = __byte_perm (w[43], w[44], selector); w[50] = __byte_perm (w[42], w[43], selector); w[49] = __byte_perm (w[41], w[42], selector); w[48] = __byte_perm (w[40], w[41], selector); w[47] = __byte_perm (w[39], w[40], selector); w[46] = __byte_perm (w[38], w[39], selector); w[45] = __byte_perm (w[37], w[38], selector); w[44] = __byte_perm (w[36], w[37], selector); w[43] = __byte_perm (w[35], w[36], selector); w[42] = __byte_perm (w[34], w[35], selector); w[41] = __byte_perm (w[33], w[34], selector); w[40] = __byte_perm (w[32], w[33], selector); w[39] = __byte_perm (w[31], w[32], selector); w[38] = __byte_perm (w[30], w[31], selector); w[37] = __byte_perm (w[29], w[30], selector); w[36] = __byte_perm (w[28], w[29], selector); w[35] = __byte_perm (w[27], w[28], selector); w[34] = __byte_perm (w[26], w[27], selector); w[33] = __byte_perm (w[25], w[26], selector); w[32] = __byte_perm (w[24], w[25], selector); w[31] = __byte_perm (w[23], w[24], selector); w[30] = __byte_perm (w[22], w[23], selector); w[29] = __byte_perm (w[21], w[22], selector); w[28] = __byte_perm (w[20], w[21], selector); w[27] = __byte_perm (w[19], w[20], selector); w[26] = __byte_perm (w[18], w[19], selector); w[25] = __byte_perm (w[17], w[18], selector); w[24] = __byte_perm (w[16], w[17], selector); w[23] = __byte_perm (w[15], w[16], selector); w[22] = __byte_perm (w[14], w[15], selector); w[21] = __byte_perm (w[13], w[14], selector); w[20] = __byte_perm (w[12], w[13], selector); w[19] = __byte_perm (w[11], w[12], selector); w[18] = __byte_perm (w[10], w[11], selector); w[17] = __byte_perm (w[ 9], w[10], selector); w[16] = __byte_perm (w[ 8], w[ 9], selector); w[15] = __byte_perm (w[ 7], w[ 8], selector); w[14] = __byte_perm (w[ 6], w[ 7], selector); w[13] = __byte_perm (w[ 5], w[ 6], selector); w[12] = __byte_perm (w[ 4], w[ 5], selector); w[11] = __byte_perm (w[ 3], w[ 4], selector); w[10] = __byte_perm (w[ 2], w[ 3], selector); w[ 9] = __byte_perm (w[ 1], w[ 2], selector); w[ 8] = __byte_perm (w[ 0], w[ 1], selector); w[ 7] = __byte_perm ( 0, w[ 0], selector); w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 8: w[63] = __byte_perm (w[54], w[55], selector); w[62] = __byte_perm (w[53], w[54], selector); w[61] = __byte_perm (w[52], w[53], selector); w[60] = __byte_perm (w[51], w[52], selector); w[59] = __byte_perm (w[50], w[51], selector); w[58] = __byte_perm (w[49], w[50], selector); w[57] = __byte_perm (w[48], w[49], selector); w[56] = __byte_perm (w[47], w[48], selector); w[55] = __byte_perm (w[46], w[47], selector); w[54] = __byte_perm (w[45], w[46], selector); w[53] = __byte_perm (w[44], w[45], selector); w[52] = __byte_perm (w[43], w[44], selector); w[51] = __byte_perm (w[42], w[43], selector); w[50] = __byte_perm (w[41], w[42], selector); w[49] = __byte_perm (w[40], w[41], selector); w[48] = __byte_perm (w[39], w[40], selector); w[47] = __byte_perm (w[38], w[39], selector); w[46] = __byte_perm (w[37], w[38], selector); w[45] = __byte_perm (w[36], w[37], selector); w[44] = __byte_perm (w[35], w[36], selector); w[43] = __byte_perm (w[34], w[35], selector); w[42] = __byte_perm (w[33], w[34], selector); w[41] = __byte_perm (w[32], w[33], selector); w[40] = __byte_perm (w[31], w[32], selector); w[39] = __byte_perm (w[30], w[31], selector); w[38] = __byte_perm (w[29], w[30], selector); w[37] = __byte_perm (w[28], w[29], selector); w[36] = __byte_perm (w[27], w[28], selector); w[35] = __byte_perm (w[26], w[27], selector); w[34] = __byte_perm (w[25], w[26], selector); w[33] = __byte_perm (w[24], w[25], selector); w[32] = __byte_perm (w[23], w[24], selector); w[31] = __byte_perm (w[22], w[23], selector); w[30] = __byte_perm (w[21], w[22], selector); w[29] = __byte_perm (w[20], w[21], selector); w[28] = __byte_perm (w[19], w[20], selector); w[27] = __byte_perm (w[18], w[19], selector); w[26] = __byte_perm (w[17], w[18], selector); w[25] = __byte_perm (w[16], w[17], selector); w[24] = __byte_perm (w[15], w[16], selector); w[23] = __byte_perm (w[14], w[15], selector); w[22] = __byte_perm (w[13], w[14], selector); w[21] = __byte_perm (w[12], w[13], selector); w[20] = __byte_perm (w[11], w[12], selector); w[19] = __byte_perm (w[10], w[11], selector); w[18] = __byte_perm (w[ 9], w[10], selector); w[17] = __byte_perm (w[ 8], w[ 9], selector); w[16] = __byte_perm (w[ 7], w[ 8], selector); w[15] = __byte_perm (w[ 6], w[ 7], selector); w[14] = __byte_perm (w[ 5], w[ 6], selector); w[13] = __byte_perm (w[ 4], w[ 5], selector); w[12] = __byte_perm (w[ 3], w[ 4], selector); w[11] = __byte_perm (w[ 2], w[ 3], selector); w[10] = __byte_perm (w[ 1], w[ 2], selector); w[ 9] = __byte_perm (w[ 0], w[ 1], selector); w[ 8] = __byte_perm ( 0, w[ 0], selector); w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 9: w[63] = __byte_perm (w[53], w[54], selector); w[62] = __byte_perm (w[52], w[53], selector); w[61] = __byte_perm (w[51], w[52], selector); w[60] = __byte_perm (w[50], w[51], selector); w[59] = __byte_perm (w[49], w[50], selector); w[58] = __byte_perm (w[48], w[49], selector); w[57] = __byte_perm (w[47], w[48], selector); w[56] = __byte_perm (w[46], w[47], selector); w[55] = __byte_perm (w[45], w[46], selector); w[54] = __byte_perm (w[44], w[45], selector); w[53] = __byte_perm (w[43], w[44], selector); w[52] = __byte_perm (w[42], w[43], selector); w[51] = __byte_perm (w[41], w[42], selector); w[50] = __byte_perm (w[40], w[41], selector); w[49] = __byte_perm (w[39], w[40], selector); w[48] = __byte_perm (w[38], w[39], selector); w[47] = __byte_perm (w[37], w[38], selector); w[46] = __byte_perm (w[36], w[37], selector); w[45] = __byte_perm (w[35], w[36], selector); w[44] = __byte_perm (w[34], w[35], selector); w[43] = __byte_perm (w[33], w[34], selector); w[42] = __byte_perm (w[32], w[33], selector); w[41] = __byte_perm (w[31], w[32], selector); w[40] = __byte_perm (w[30], w[31], selector); w[39] = __byte_perm (w[29], w[30], selector); w[38] = __byte_perm (w[28], w[29], selector); w[37] = __byte_perm (w[27], w[28], selector); w[36] = __byte_perm (w[26], w[27], selector); w[35] = __byte_perm (w[25], w[26], selector); w[34] = __byte_perm (w[24], w[25], selector); w[33] = __byte_perm (w[23], w[24], selector); w[32] = __byte_perm (w[22], w[23], selector); w[31] = __byte_perm (w[21], w[22], selector); w[30] = __byte_perm (w[20], w[21], selector); w[29] = __byte_perm (w[19], w[20], selector); w[28] = __byte_perm (w[18], w[19], selector); w[27] = __byte_perm (w[17], w[18], selector); w[26] = __byte_perm (w[16], w[17], selector); w[25] = __byte_perm (w[15], w[16], selector); w[24] = __byte_perm (w[14], w[15], selector); w[23] = __byte_perm (w[13], w[14], selector); w[22] = __byte_perm (w[12], w[13], selector); w[21] = __byte_perm (w[11], w[12], selector); w[20] = __byte_perm (w[10], w[11], selector); w[19] = __byte_perm (w[ 9], w[10], selector); w[18] = __byte_perm (w[ 8], w[ 9], selector); w[17] = __byte_perm (w[ 7], w[ 8], selector); w[16] = __byte_perm (w[ 6], w[ 7], selector); w[15] = __byte_perm (w[ 5], w[ 6], selector); w[14] = __byte_perm (w[ 4], w[ 5], selector); w[13] = __byte_perm (w[ 3], w[ 4], selector); w[12] = __byte_perm (w[ 2], w[ 3], selector); w[11] = __byte_perm (w[ 1], w[ 2], selector); w[10] = __byte_perm (w[ 0], w[ 1], selector); w[ 9] = __byte_perm ( 0, w[ 0], selector); w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 10: w[63] = __byte_perm (w[52], w[53], selector); w[62] = __byte_perm (w[51], w[52], selector); w[61] = __byte_perm (w[50], w[51], selector); w[60] = __byte_perm (w[49], w[50], selector); w[59] = __byte_perm (w[48], w[49], selector); w[58] = __byte_perm (w[47], w[48], selector); w[57] = __byte_perm (w[46], w[47], selector); w[56] = __byte_perm (w[45], w[46], selector); w[55] = __byte_perm (w[44], w[45], selector); w[54] = __byte_perm (w[43], w[44], selector); w[53] = __byte_perm (w[42], w[43], selector); w[52] = __byte_perm (w[41], w[42], selector); w[51] = __byte_perm (w[40], w[41], selector); w[50] = __byte_perm (w[39], w[40], selector); w[49] = __byte_perm (w[38], w[39], selector); w[48] = __byte_perm (w[37], w[38], selector); w[47] = __byte_perm (w[36], w[37], selector); w[46] = __byte_perm (w[35], w[36], selector); w[45] = __byte_perm (w[34], w[35], selector); w[44] = __byte_perm (w[33], w[34], selector); w[43] = __byte_perm (w[32], w[33], selector); w[42] = __byte_perm (w[31], w[32], selector); w[41] = __byte_perm (w[30], w[31], selector); w[40] = __byte_perm (w[29], w[30], selector); w[39] = __byte_perm (w[28], w[29], selector); w[38] = __byte_perm (w[27], w[28], selector); w[37] = __byte_perm (w[26], w[27], selector); w[36] = __byte_perm (w[25], w[26], selector); w[35] = __byte_perm (w[24], w[25], selector); w[34] = __byte_perm (w[23], w[24], selector); w[33] = __byte_perm (w[22], w[23], selector); w[32] = __byte_perm (w[21], w[22], selector); w[31] = __byte_perm (w[20], w[21], selector); w[30] = __byte_perm (w[19], w[20], selector); w[29] = __byte_perm (w[18], w[19], selector); w[28] = __byte_perm (w[17], w[18], selector); w[27] = __byte_perm (w[16], w[17], selector); w[26] = __byte_perm (w[15], w[16], selector); w[25] = __byte_perm (w[14], w[15], selector); w[24] = __byte_perm (w[13], w[14], selector); w[23] = __byte_perm (w[12], w[13], selector); w[22] = __byte_perm (w[11], w[12], selector); w[21] = __byte_perm (w[10], w[11], selector); w[20] = __byte_perm (w[ 9], w[10], selector); w[19] = __byte_perm (w[ 8], w[ 9], selector); w[18] = __byte_perm (w[ 7], w[ 8], selector); w[17] = __byte_perm (w[ 6], w[ 7], selector); w[16] = __byte_perm (w[ 5], w[ 6], selector); w[15] = __byte_perm (w[ 4], w[ 5], selector); w[14] = __byte_perm (w[ 3], w[ 4], selector); w[13] = __byte_perm (w[ 2], w[ 3], selector); w[12] = __byte_perm (w[ 1], w[ 2], selector); w[11] = __byte_perm (w[ 0], w[ 1], selector); w[10] = __byte_perm ( 0, w[ 0], selector); w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 11: w[63] = __byte_perm (w[51], w[52], selector); w[62] = __byte_perm (w[50], w[51], selector); w[61] = __byte_perm (w[49], w[50], selector); w[60] = __byte_perm (w[48], w[49], selector); w[59] = __byte_perm (w[47], w[48], selector); w[58] = __byte_perm (w[46], w[47], selector); w[57] = __byte_perm (w[45], w[46], selector); w[56] = __byte_perm (w[44], w[45], selector); w[55] = __byte_perm (w[43], w[44], selector); w[54] = __byte_perm (w[42], w[43], selector); w[53] = __byte_perm (w[41], w[42], selector); w[52] = __byte_perm (w[40], w[41], selector); w[51] = __byte_perm (w[39], w[40], selector); w[50] = __byte_perm (w[38], w[39], selector); w[49] = __byte_perm (w[37], w[38], selector); w[48] = __byte_perm (w[36], w[37], selector); w[47] = __byte_perm (w[35], w[36], selector); w[46] = __byte_perm (w[34], w[35], selector); w[45] = __byte_perm (w[33], w[34], selector); w[44] = __byte_perm (w[32], w[33], selector); w[43] = __byte_perm (w[31], w[32], selector); w[42] = __byte_perm (w[30], w[31], selector); w[41] = __byte_perm (w[29], w[30], selector); w[40] = __byte_perm (w[28], w[29], selector); w[39] = __byte_perm (w[27], w[28], selector); w[38] = __byte_perm (w[26], w[27], selector); w[37] = __byte_perm (w[25], w[26], selector); w[36] = __byte_perm (w[24], w[25], selector); w[35] = __byte_perm (w[23], w[24], selector); w[34] = __byte_perm (w[22], w[23], selector); w[33] = __byte_perm (w[21], w[22], selector); w[32] = __byte_perm (w[20], w[21], selector); w[31] = __byte_perm (w[19], w[20], selector); w[30] = __byte_perm (w[18], w[19], selector); w[29] = __byte_perm (w[17], w[18], selector); w[28] = __byte_perm (w[16], w[17], selector); w[27] = __byte_perm (w[15], w[16], selector); w[26] = __byte_perm (w[14], w[15], selector); w[25] = __byte_perm (w[13], w[14], selector); w[24] = __byte_perm (w[12], w[13], selector); w[23] = __byte_perm (w[11], w[12], selector); w[22] = __byte_perm (w[10], w[11], selector); w[21] = __byte_perm (w[ 9], w[10], selector); w[20] = __byte_perm (w[ 8], w[ 9], selector); w[19] = __byte_perm (w[ 7], w[ 8], selector); w[18] = __byte_perm (w[ 6], w[ 7], selector); w[17] = __byte_perm (w[ 5], w[ 6], selector); w[16] = __byte_perm (w[ 4], w[ 5], selector); w[15] = __byte_perm (w[ 3], w[ 4], selector); w[14] = __byte_perm (w[ 2], w[ 3], selector); w[13] = __byte_perm (w[ 1], w[ 2], selector); w[12] = __byte_perm (w[ 0], w[ 1], selector); w[11] = __byte_perm ( 0, w[ 0], selector); w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 12: w[63] = __byte_perm (w[50], w[51], selector); w[62] = __byte_perm (w[49], w[50], selector); w[61] = __byte_perm (w[48], w[49], selector); w[60] = __byte_perm (w[47], w[48], selector); w[59] = __byte_perm (w[46], w[47], selector); w[58] = __byte_perm (w[45], w[46], selector); w[57] = __byte_perm (w[44], w[45], selector); w[56] = __byte_perm (w[43], w[44], selector); w[55] = __byte_perm (w[42], w[43], selector); w[54] = __byte_perm (w[41], w[42], selector); w[53] = __byte_perm (w[40], w[41], selector); w[52] = __byte_perm (w[39], w[40], selector); w[51] = __byte_perm (w[38], w[39], selector); w[50] = __byte_perm (w[37], w[38], selector); w[49] = __byte_perm (w[36], w[37], selector); w[48] = __byte_perm (w[35], w[36], selector); w[47] = __byte_perm (w[34], w[35], selector); w[46] = __byte_perm (w[33], w[34], selector); w[45] = __byte_perm (w[32], w[33], selector); w[44] = __byte_perm (w[31], w[32], selector); w[43] = __byte_perm (w[30], w[31], selector); w[42] = __byte_perm (w[29], w[30], selector); w[41] = __byte_perm (w[28], w[29], selector); w[40] = __byte_perm (w[27], w[28], selector); w[39] = __byte_perm (w[26], w[27], selector); w[38] = __byte_perm (w[25], w[26], selector); w[37] = __byte_perm (w[24], w[25], selector); w[36] = __byte_perm (w[23], w[24], selector); w[35] = __byte_perm (w[22], w[23], selector); w[34] = __byte_perm (w[21], w[22], selector); w[33] = __byte_perm (w[20], w[21], selector); w[32] = __byte_perm (w[19], w[20], selector); w[31] = __byte_perm (w[18], w[19], selector); w[30] = __byte_perm (w[17], w[18], selector); w[29] = __byte_perm (w[16], w[17], selector); w[28] = __byte_perm (w[15], w[16], selector); w[27] = __byte_perm (w[14], w[15], selector); w[26] = __byte_perm (w[13], w[14], selector); w[25] = __byte_perm (w[12], w[13], selector); w[24] = __byte_perm (w[11], w[12], selector); w[23] = __byte_perm (w[10], w[11], selector); w[22] = __byte_perm (w[ 9], w[10], selector); w[21] = __byte_perm (w[ 8], w[ 9], selector); w[20] = __byte_perm (w[ 7], w[ 8], selector); w[19] = __byte_perm (w[ 6], w[ 7], selector); w[18] = __byte_perm (w[ 5], w[ 6], selector); w[17] = __byte_perm (w[ 4], w[ 5], selector); w[16] = __byte_perm (w[ 3], w[ 4], selector); w[15] = __byte_perm (w[ 2], w[ 3], selector); w[14] = __byte_perm (w[ 1], w[ 2], selector); w[13] = __byte_perm (w[ 0], w[ 1], selector); w[12] = __byte_perm ( 0, w[ 0], selector); w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 13: w[63] = __byte_perm (w[49], w[50], selector); w[62] = __byte_perm (w[48], w[49], selector); w[61] = __byte_perm (w[47], w[48], selector); w[60] = __byte_perm (w[46], w[47], selector); w[59] = __byte_perm (w[45], w[46], selector); w[58] = __byte_perm (w[44], w[45], selector); w[57] = __byte_perm (w[43], w[44], selector); w[56] = __byte_perm (w[42], w[43], selector); w[55] = __byte_perm (w[41], w[42], selector); w[54] = __byte_perm (w[40], w[41], selector); w[53] = __byte_perm (w[39], w[40], selector); w[52] = __byte_perm (w[38], w[39], selector); w[51] = __byte_perm (w[37], w[38], selector); w[50] = __byte_perm (w[36], w[37], selector); w[49] = __byte_perm (w[35], w[36], selector); w[48] = __byte_perm (w[34], w[35], selector); w[47] = __byte_perm (w[33], w[34], selector); w[46] = __byte_perm (w[32], w[33], selector); w[45] = __byte_perm (w[31], w[32], selector); w[44] = __byte_perm (w[30], w[31], selector); w[43] = __byte_perm (w[29], w[30], selector); w[42] = __byte_perm (w[28], w[29], selector); w[41] = __byte_perm (w[27], w[28], selector); w[40] = __byte_perm (w[26], w[27], selector); w[39] = __byte_perm (w[25], w[26], selector); w[38] = __byte_perm (w[24], w[25], selector); w[37] = __byte_perm (w[23], w[24], selector); w[36] = __byte_perm (w[22], w[23], selector); w[35] = __byte_perm (w[21], w[22], selector); w[34] = __byte_perm (w[20], w[21], selector); w[33] = __byte_perm (w[19], w[20], selector); w[32] = __byte_perm (w[18], w[19], selector); w[31] = __byte_perm (w[17], w[18], selector); w[30] = __byte_perm (w[16], w[17], selector); w[29] = __byte_perm (w[15], w[16], selector); w[28] = __byte_perm (w[14], w[15], selector); w[27] = __byte_perm (w[13], w[14], selector); w[26] = __byte_perm (w[12], w[13], selector); w[25] = __byte_perm (w[11], w[12], selector); w[24] = __byte_perm (w[10], w[11], selector); w[23] = __byte_perm (w[ 9], w[10], selector); w[22] = __byte_perm (w[ 8], w[ 9], selector); w[21] = __byte_perm (w[ 7], w[ 8], selector); w[20] = __byte_perm (w[ 6], w[ 7], selector); w[19] = __byte_perm (w[ 5], w[ 6], selector); w[18] = __byte_perm (w[ 4], w[ 5], selector); w[17] = __byte_perm (w[ 3], w[ 4], selector); w[16] = __byte_perm (w[ 2], w[ 3], selector); w[15] = __byte_perm (w[ 1], w[ 2], selector); w[14] = __byte_perm (w[ 0], w[ 1], selector); w[13] = __byte_perm ( 0, w[ 0], selector); w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 14: w[63] = __byte_perm (w[48], w[49], selector); w[62] = __byte_perm (w[47], w[48], selector); w[61] = __byte_perm (w[46], w[47], selector); w[60] = __byte_perm (w[45], w[46], selector); w[59] = __byte_perm (w[44], w[45], selector); w[58] = __byte_perm (w[43], w[44], selector); w[57] = __byte_perm (w[42], w[43], selector); w[56] = __byte_perm (w[41], w[42], selector); w[55] = __byte_perm (w[40], w[41], selector); w[54] = __byte_perm (w[39], w[40], selector); w[53] = __byte_perm (w[38], w[39], selector); w[52] = __byte_perm (w[37], w[38], selector); w[51] = __byte_perm (w[36], w[37], selector); w[50] = __byte_perm (w[35], w[36], selector); w[49] = __byte_perm (w[34], w[35], selector); w[48] = __byte_perm (w[33], w[34], selector); w[47] = __byte_perm (w[32], w[33], selector); w[46] = __byte_perm (w[31], w[32], selector); w[45] = __byte_perm (w[30], w[31], selector); w[44] = __byte_perm (w[29], w[30], selector); w[43] = __byte_perm (w[28], w[29], selector); w[42] = __byte_perm (w[27], w[28], selector); w[41] = __byte_perm (w[26], w[27], selector); w[40] = __byte_perm (w[25], w[26], selector); w[39] = __byte_perm (w[24], w[25], selector); w[38] = __byte_perm (w[23], w[24], selector); w[37] = __byte_perm (w[22], w[23], selector); w[36] = __byte_perm (w[21], w[22], selector); w[35] = __byte_perm (w[20], w[21], selector); w[34] = __byte_perm (w[19], w[20], selector); w[33] = __byte_perm (w[18], w[19], selector); w[32] = __byte_perm (w[17], w[18], selector); w[31] = __byte_perm (w[16], w[17], selector); w[30] = __byte_perm (w[15], w[16], selector); w[29] = __byte_perm (w[14], w[15], selector); w[28] = __byte_perm (w[13], w[14], selector); w[27] = __byte_perm (w[12], w[13], selector); w[26] = __byte_perm (w[11], w[12], selector); w[25] = __byte_perm (w[10], w[11], selector); w[24] = __byte_perm (w[ 9], w[10], selector); w[23] = __byte_perm (w[ 8], w[ 9], selector); w[22] = __byte_perm (w[ 7], w[ 8], selector); w[21] = __byte_perm (w[ 6], w[ 7], selector); w[20] = __byte_perm (w[ 5], w[ 6], selector); w[19] = __byte_perm (w[ 4], w[ 5], selector); w[18] = __byte_perm (w[ 3], w[ 4], selector); w[17] = __byte_perm (w[ 2], w[ 3], selector); w[16] = __byte_perm (w[ 1], w[ 2], selector); w[15] = __byte_perm (w[ 0], w[ 1], selector); w[14] = __byte_perm ( 0, w[ 0], selector); w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 15: w[63] = __byte_perm (w[47], w[48], selector); w[62] = __byte_perm (w[46], w[47], selector); w[61] = __byte_perm (w[45], w[46], selector); w[60] = __byte_perm (w[44], w[45], selector); w[59] = __byte_perm (w[43], w[44], selector); w[58] = __byte_perm (w[42], w[43], selector); w[57] = __byte_perm (w[41], w[42], selector); w[56] = __byte_perm (w[40], w[41], selector); w[55] = __byte_perm (w[39], w[40], selector); w[54] = __byte_perm (w[38], w[39], selector); w[53] = __byte_perm (w[37], w[38], selector); w[52] = __byte_perm (w[36], w[37], selector); w[51] = __byte_perm (w[35], w[36], selector); w[50] = __byte_perm (w[34], w[35], selector); w[49] = __byte_perm (w[33], w[34], selector); w[48] = __byte_perm (w[32], w[33], selector); w[47] = __byte_perm (w[31], w[32], selector); w[46] = __byte_perm (w[30], w[31], selector); w[45] = __byte_perm (w[29], w[30], selector); w[44] = __byte_perm (w[28], w[29], selector); w[43] = __byte_perm (w[27], w[28], selector); w[42] = __byte_perm (w[26], w[27], selector); w[41] = __byte_perm (w[25], w[26], selector); w[40] = __byte_perm (w[24], w[25], selector); w[39] = __byte_perm (w[23], w[24], selector); w[38] = __byte_perm (w[22], w[23], selector); w[37] = __byte_perm (w[21], w[22], selector); w[36] = __byte_perm (w[20], w[21], selector); w[35] = __byte_perm (w[19], w[20], selector); w[34] = __byte_perm (w[18], w[19], selector); w[33] = __byte_perm (w[17], w[18], selector); w[32] = __byte_perm (w[16], w[17], selector); w[31] = __byte_perm (w[15], w[16], selector); w[30] = __byte_perm (w[14], w[15], selector); w[29] = __byte_perm (w[13], w[14], selector); w[28] = __byte_perm (w[12], w[13], selector); w[27] = __byte_perm (w[11], w[12], selector); w[26] = __byte_perm (w[10], w[11], selector); w[25] = __byte_perm (w[ 9], w[10], selector); w[24] = __byte_perm (w[ 8], w[ 9], selector); w[23] = __byte_perm (w[ 7], w[ 8], selector); w[22] = __byte_perm (w[ 6], w[ 7], selector); w[21] = __byte_perm (w[ 5], w[ 6], selector); w[20] = __byte_perm (w[ 4], w[ 5], selector); w[19] = __byte_perm (w[ 3], w[ 4], selector); w[18] = __byte_perm (w[ 2], w[ 3], selector); w[17] = __byte_perm (w[ 1], w[ 2], selector); w[16] = __byte_perm (w[ 0], w[ 1], selector); w[15] = __byte_perm ( 0, w[ 0], selector); w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 16: w[63] = __byte_perm (w[46], w[47], selector); w[62] = __byte_perm (w[45], w[46], selector); w[61] = __byte_perm (w[44], w[45], selector); w[60] = __byte_perm (w[43], w[44], selector); w[59] = __byte_perm (w[42], w[43], selector); w[58] = __byte_perm (w[41], w[42], selector); w[57] = __byte_perm (w[40], w[41], selector); w[56] = __byte_perm (w[39], w[40], selector); w[55] = __byte_perm (w[38], w[39], selector); w[54] = __byte_perm (w[37], w[38], selector); w[53] = __byte_perm (w[36], w[37], selector); w[52] = __byte_perm (w[35], w[36], selector); w[51] = __byte_perm (w[34], w[35], selector); w[50] = __byte_perm (w[33], w[34], selector); w[49] = __byte_perm (w[32], w[33], selector); w[48] = __byte_perm (w[31], w[32], selector); w[47] = __byte_perm (w[30], w[31], selector); w[46] = __byte_perm (w[29], w[30], selector); w[45] = __byte_perm (w[28], w[29], selector); w[44] = __byte_perm (w[27], w[28], selector); w[43] = __byte_perm (w[26], w[27], selector); w[42] = __byte_perm (w[25], w[26], selector); w[41] = __byte_perm (w[24], w[25], selector); w[40] = __byte_perm (w[23], w[24], selector); w[39] = __byte_perm (w[22], w[23], selector); w[38] = __byte_perm (w[21], w[22], selector); w[37] = __byte_perm (w[20], w[21], selector); w[36] = __byte_perm (w[19], w[20], selector); w[35] = __byte_perm (w[18], w[19], selector); w[34] = __byte_perm (w[17], w[18], selector); w[33] = __byte_perm (w[16], w[17], selector); w[32] = __byte_perm (w[15], w[16], selector); w[31] = __byte_perm (w[14], w[15], selector); w[30] = __byte_perm (w[13], w[14], selector); w[29] = __byte_perm (w[12], w[13], selector); w[28] = __byte_perm (w[11], w[12], selector); w[27] = __byte_perm (w[10], w[11], selector); w[26] = __byte_perm (w[ 9], w[10], selector); w[25] = __byte_perm (w[ 8], w[ 9], selector); w[24] = __byte_perm (w[ 7], w[ 8], selector); w[23] = __byte_perm (w[ 6], w[ 7], selector); w[22] = __byte_perm (w[ 5], w[ 6], selector); w[21] = __byte_perm (w[ 4], w[ 5], selector); w[20] = __byte_perm (w[ 3], w[ 4], selector); w[19] = __byte_perm (w[ 2], w[ 3], selector); w[18] = __byte_perm (w[ 1], w[ 2], selector); w[17] = __byte_perm (w[ 0], w[ 1], selector); w[16] = __byte_perm ( 0, w[ 0], selector); w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 17: w[63] = __byte_perm (w[45], w[46], selector); w[62] = __byte_perm (w[44], w[45], selector); w[61] = __byte_perm (w[43], w[44], selector); w[60] = __byte_perm (w[42], w[43], selector); w[59] = __byte_perm (w[41], w[42], selector); w[58] = __byte_perm (w[40], w[41], selector); w[57] = __byte_perm (w[39], w[40], selector); w[56] = __byte_perm (w[38], w[39], selector); w[55] = __byte_perm (w[37], w[38], selector); w[54] = __byte_perm (w[36], w[37], selector); w[53] = __byte_perm (w[35], w[36], selector); w[52] = __byte_perm (w[34], w[35], selector); w[51] = __byte_perm (w[33], w[34], selector); w[50] = __byte_perm (w[32], w[33], selector); w[49] = __byte_perm (w[31], w[32], selector); w[48] = __byte_perm (w[30], w[31], selector); w[47] = __byte_perm (w[29], w[30], selector); w[46] = __byte_perm (w[28], w[29], selector); w[45] = __byte_perm (w[27], w[28], selector); w[44] = __byte_perm (w[26], w[27], selector); w[43] = __byte_perm (w[25], w[26], selector); w[42] = __byte_perm (w[24], w[25], selector); w[41] = __byte_perm (w[23], w[24], selector); w[40] = __byte_perm (w[22], w[23], selector); w[39] = __byte_perm (w[21], w[22], selector); w[38] = __byte_perm (w[20], w[21], selector); w[37] = __byte_perm (w[19], w[20], selector); w[36] = __byte_perm (w[18], w[19], selector); w[35] = __byte_perm (w[17], w[18], selector); w[34] = __byte_perm (w[16], w[17], selector); w[33] = __byte_perm (w[15], w[16], selector); w[32] = __byte_perm (w[14], w[15], selector); w[31] = __byte_perm (w[13], w[14], selector); w[30] = __byte_perm (w[12], w[13], selector); w[29] = __byte_perm (w[11], w[12], selector); w[28] = __byte_perm (w[10], w[11], selector); w[27] = __byte_perm (w[ 9], w[10], selector); w[26] = __byte_perm (w[ 8], w[ 9], selector); w[25] = __byte_perm (w[ 7], w[ 8], selector); w[24] = __byte_perm (w[ 6], w[ 7], selector); w[23] = __byte_perm (w[ 5], w[ 6], selector); w[22] = __byte_perm (w[ 4], w[ 5], selector); w[21] = __byte_perm (w[ 3], w[ 4], selector); w[20] = __byte_perm (w[ 2], w[ 3], selector); w[19] = __byte_perm (w[ 1], w[ 2], selector); w[18] = __byte_perm (w[ 0], w[ 1], selector); w[17] = __byte_perm ( 0, w[ 0], selector); w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 18: w[63] = __byte_perm (w[44], w[45], selector); w[62] = __byte_perm (w[43], w[44], selector); w[61] = __byte_perm (w[42], w[43], selector); w[60] = __byte_perm (w[41], w[42], selector); w[59] = __byte_perm (w[40], w[41], selector); w[58] = __byte_perm (w[39], w[40], selector); w[57] = __byte_perm (w[38], w[39], selector); w[56] = __byte_perm (w[37], w[38], selector); w[55] = __byte_perm (w[36], w[37], selector); w[54] = __byte_perm (w[35], w[36], selector); w[53] = __byte_perm (w[34], w[35], selector); w[52] = __byte_perm (w[33], w[34], selector); w[51] = __byte_perm (w[32], w[33], selector); w[50] = __byte_perm (w[31], w[32], selector); w[49] = __byte_perm (w[30], w[31], selector); w[48] = __byte_perm (w[29], w[30], selector); w[47] = __byte_perm (w[28], w[29], selector); w[46] = __byte_perm (w[27], w[28], selector); w[45] = __byte_perm (w[26], w[27], selector); w[44] = __byte_perm (w[25], w[26], selector); w[43] = __byte_perm (w[24], w[25], selector); w[42] = __byte_perm (w[23], w[24], selector); w[41] = __byte_perm (w[22], w[23], selector); w[40] = __byte_perm (w[21], w[22], selector); w[39] = __byte_perm (w[20], w[21], selector); w[38] = __byte_perm (w[19], w[20], selector); w[37] = __byte_perm (w[18], w[19], selector); w[36] = __byte_perm (w[17], w[18], selector); w[35] = __byte_perm (w[16], w[17], selector); w[34] = __byte_perm (w[15], w[16], selector); w[33] = __byte_perm (w[14], w[15], selector); w[32] = __byte_perm (w[13], w[14], selector); w[31] = __byte_perm (w[12], w[13], selector); w[30] = __byte_perm (w[11], w[12], selector); w[29] = __byte_perm (w[10], w[11], selector); w[28] = __byte_perm (w[ 9], w[10], selector); w[27] = __byte_perm (w[ 8], w[ 9], selector); w[26] = __byte_perm (w[ 7], w[ 8], selector); w[25] = __byte_perm (w[ 6], w[ 7], selector); w[24] = __byte_perm (w[ 5], w[ 6], selector); w[23] = __byte_perm (w[ 4], w[ 5], selector); w[22] = __byte_perm (w[ 3], w[ 4], selector); w[21] = __byte_perm (w[ 2], w[ 3], selector); w[20] = __byte_perm (w[ 1], w[ 2], selector); w[19] = __byte_perm (w[ 0], w[ 1], selector); w[18] = __byte_perm ( 0, w[ 0], selector); w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 19: w[63] = __byte_perm (w[43], w[44], selector); w[62] = __byte_perm (w[42], w[43], selector); w[61] = __byte_perm (w[41], w[42], selector); w[60] = __byte_perm (w[40], w[41], selector); w[59] = __byte_perm (w[39], w[40], selector); w[58] = __byte_perm (w[38], w[39], selector); w[57] = __byte_perm (w[37], w[38], selector); w[56] = __byte_perm (w[36], w[37], selector); w[55] = __byte_perm (w[35], w[36], selector); w[54] = __byte_perm (w[34], w[35], selector); w[53] = __byte_perm (w[33], w[34], selector); w[52] = __byte_perm (w[32], w[33], selector); w[51] = __byte_perm (w[31], w[32], selector); w[50] = __byte_perm (w[30], w[31], selector); w[49] = __byte_perm (w[29], w[30], selector); w[48] = __byte_perm (w[28], w[29], selector); w[47] = __byte_perm (w[27], w[28], selector); w[46] = __byte_perm (w[26], w[27], selector); w[45] = __byte_perm (w[25], w[26], selector); w[44] = __byte_perm (w[24], w[25], selector); w[43] = __byte_perm (w[23], w[24], selector); w[42] = __byte_perm (w[22], w[23], selector); w[41] = __byte_perm (w[21], w[22], selector); w[40] = __byte_perm (w[20], w[21], selector); w[39] = __byte_perm (w[19], w[20], selector); w[38] = __byte_perm (w[18], w[19], selector); w[37] = __byte_perm (w[17], w[18], selector); w[36] = __byte_perm (w[16], w[17], selector); w[35] = __byte_perm (w[15], w[16], selector); w[34] = __byte_perm (w[14], w[15], selector); w[33] = __byte_perm (w[13], w[14], selector); w[32] = __byte_perm (w[12], w[13], selector); w[31] = __byte_perm (w[11], w[12], selector); w[30] = __byte_perm (w[10], w[11], selector); w[29] = __byte_perm (w[ 9], w[10], selector); w[28] = __byte_perm (w[ 8], w[ 9], selector); w[27] = __byte_perm (w[ 7], w[ 8], selector); w[26] = __byte_perm (w[ 6], w[ 7], selector); w[25] = __byte_perm (w[ 5], w[ 6], selector); w[24] = __byte_perm (w[ 4], w[ 5], selector); w[23] = __byte_perm (w[ 3], w[ 4], selector); w[22] = __byte_perm (w[ 2], w[ 3], selector); w[21] = __byte_perm (w[ 1], w[ 2], selector); w[20] = __byte_perm (w[ 0], w[ 1], selector); w[19] = __byte_perm ( 0, w[ 0], selector); w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 20: w[63] = __byte_perm (w[42], w[43], selector); w[62] = __byte_perm (w[41], w[42], selector); w[61] = __byte_perm (w[40], w[41], selector); w[60] = __byte_perm (w[39], w[40], selector); w[59] = __byte_perm (w[38], w[39], selector); w[58] = __byte_perm (w[37], w[38], selector); w[57] = __byte_perm (w[36], w[37], selector); w[56] = __byte_perm (w[35], w[36], selector); w[55] = __byte_perm (w[34], w[35], selector); w[54] = __byte_perm (w[33], w[34], selector); w[53] = __byte_perm (w[32], w[33], selector); w[52] = __byte_perm (w[31], w[32], selector); w[51] = __byte_perm (w[30], w[31], selector); w[50] = __byte_perm (w[29], w[30], selector); w[49] = __byte_perm (w[28], w[29], selector); w[48] = __byte_perm (w[27], w[28], selector); w[47] = __byte_perm (w[26], w[27], selector); w[46] = __byte_perm (w[25], w[26], selector); w[45] = __byte_perm (w[24], w[25], selector); w[44] = __byte_perm (w[23], w[24], selector); w[43] = __byte_perm (w[22], w[23], selector); w[42] = __byte_perm (w[21], w[22], selector); w[41] = __byte_perm (w[20], w[21], selector); w[40] = __byte_perm (w[19], w[20], selector); w[39] = __byte_perm (w[18], w[19], selector); w[38] = __byte_perm (w[17], w[18], selector); w[37] = __byte_perm (w[16], w[17], selector); w[36] = __byte_perm (w[15], w[16], selector); w[35] = __byte_perm (w[14], w[15], selector); w[34] = __byte_perm (w[13], w[14], selector); w[33] = __byte_perm (w[12], w[13], selector); w[32] = __byte_perm (w[11], w[12], selector); w[31] = __byte_perm (w[10], w[11], selector); w[30] = __byte_perm (w[ 9], w[10], selector); w[29] = __byte_perm (w[ 8], w[ 9], selector); w[28] = __byte_perm (w[ 7], w[ 8], selector); w[27] = __byte_perm (w[ 6], w[ 7], selector); w[26] = __byte_perm (w[ 5], w[ 6], selector); w[25] = __byte_perm (w[ 4], w[ 5], selector); w[24] = __byte_perm (w[ 3], w[ 4], selector); w[23] = __byte_perm (w[ 2], w[ 3], selector); w[22] = __byte_perm (w[ 1], w[ 2], selector); w[21] = __byte_perm (w[ 0], w[ 1], selector); w[20] = __byte_perm ( 0, w[ 0], selector); w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 21: w[63] = __byte_perm (w[41], w[42], selector); w[62] = __byte_perm (w[40], w[41], selector); w[61] = __byte_perm (w[39], w[40], selector); w[60] = __byte_perm (w[38], w[39], selector); w[59] = __byte_perm (w[37], w[38], selector); w[58] = __byte_perm (w[36], w[37], selector); w[57] = __byte_perm (w[35], w[36], selector); w[56] = __byte_perm (w[34], w[35], selector); w[55] = __byte_perm (w[33], w[34], selector); w[54] = __byte_perm (w[32], w[33], selector); w[53] = __byte_perm (w[31], w[32], selector); w[52] = __byte_perm (w[30], w[31], selector); w[51] = __byte_perm (w[29], w[30], selector); w[50] = __byte_perm (w[28], w[29], selector); w[49] = __byte_perm (w[27], w[28], selector); w[48] = __byte_perm (w[26], w[27], selector); w[47] = __byte_perm (w[25], w[26], selector); w[46] = __byte_perm (w[24], w[25], selector); w[45] = __byte_perm (w[23], w[24], selector); w[44] = __byte_perm (w[22], w[23], selector); w[43] = __byte_perm (w[21], w[22], selector); w[42] = __byte_perm (w[20], w[21], selector); w[41] = __byte_perm (w[19], w[20], selector); w[40] = __byte_perm (w[18], w[19], selector); w[39] = __byte_perm (w[17], w[18], selector); w[38] = __byte_perm (w[16], w[17], selector); w[37] = __byte_perm (w[15], w[16], selector); w[36] = __byte_perm (w[14], w[15], selector); w[35] = __byte_perm (w[13], w[14], selector); w[34] = __byte_perm (w[12], w[13], selector); w[33] = __byte_perm (w[11], w[12], selector); w[32] = __byte_perm (w[10], w[11], selector); w[31] = __byte_perm (w[ 9], w[10], selector); w[30] = __byte_perm (w[ 8], w[ 9], selector); w[29] = __byte_perm (w[ 7], w[ 8], selector); w[28] = __byte_perm (w[ 6], w[ 7], selector); w[27] = __byte_perm (w[ 5], w[ 6], selector); w[26] = __byte_perm (w[ 4], w[ 5], selector); w[25] = __byte_perm (w[ 3], w[ 4], selector); w[24] = __byte_perm (w[ 2], w[ 3], selector); w[23] = __byte_perm (w[ 1], w[ 2], selector); w[22] = __byte_perm (w[ 0], w[ 1], selector); w[21] = __byte_perm ( 0, w[ 0], selector); w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 22: w[63] = __byte_perm (w[40], w[41], selector); w[62] = __byte_perm (w[39], w[40], selector); w[61] = __byte_perm (w[38], w[39], selector); w[60] = __byte_perm (w[37], w[38], selector); w[59] = __byte_perm (w[36], w[37], selector); w[58] = __byte_perm (w[35], w[36], selector); w[57] = __byte_perm (w[34], w[35], selector); w[56] = __byte_perm (w[33], w[34], selector); w[55] = __byte_perm (w[32], w[33], selector); w[54] = __byte_perm (w[31], w[32], selector); w[53] = __byte_perm (w[30], w[31], selector); w[52] = __byte_perm (w[29], w[30], selector); w[51] = __byte_perm (w[28], w[29], selector); w[50] = __byte_perm (w[27], w[28], selector); w[49] = __byte_perm (w[26], w[27], selector); w[48] = __byte_perm (w[25], w[26], selector); w[47] = __byte_perm (w[24], w[25], selector); w[46] = __byte_perm (w[23], w[24], selector); w[45] = __byte_perm (w[22], w[23], selector); w[44] = __byte_perm (w[21], w[22], selector); w[43] = __byte_perm (w[20], w[21], selector); w[42] = __byte_perm (w[19], w[20], selector); w[41] = __byte_perm (w[18], w[19], selector); w[40] = __byte_perm (w[17], w[18], selector); w[39] = __byte_perm (w[16], w[17], selector); w[38] = __byte_perm (w[15], w[16], selector); w[37] = __byte_perm (w[14], w[15], selector); w[36] = __byte_perm (w[13], w[14], selector); w[35] = __byte_perm (w[12], w[13], selector); w[34] = __byte_perm (w[11], w[12], selector); w[33] = __byte_perm (w[10], w[11], selector); w[32] = __byte_perm (w[ 9], w[10], selector); w[31] = __byte_perm (w[ 8], w[ 9], selector); w[30] = __byte_perm (w[ 7], w[ 8], selector); w[29] = __byte_perm (w[ 6], w[ 7], selector); w[28] = __byte_perm (w[ 5], w[ 6], selector); w[27] = __byte_perm (w[ 4], w[ 5], selector); w[26] = __byte_perm (w[ 3], w[ 4], selector); w[25] = __byte_perm (w[ 2], w[ 3], selector); w[24] = __byte_perm (w[ 1], w[ 2], selector); w[23] = __byte_perm (w[ 0], w[ 1], selector); w[22] = __byte_perm ( 0, w[ 0], selector); w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 23: w[63] = __byte_perm (w[39], w[40], selector); w[62] = __byte_perm (w[38], w[39], selector); w[61] = __byte_perm (w[37], w[38], selector); w[60] = __byte_perm (w[36], w[37], selector); w[59] = __byte_perm (w[35], w[36], selector); w[58] = __byte_perm (w[34], w[35], selector); w[57] = __byte_perm (w[33], w[34], selector); w[56] = __byte_perm (w[32], w[33], selector); w[55] = __byte_perm (w[31], w[32], selector); w[54] = __byte_perm (w[30], w[31], selector); w[53] = __byte_perm (w[29], w[30], selector); w[52] = __byte_perm (w[28], w[29], selector); w[51] = __byte_perm (w[27], w[28], selector); w[50] = __byte_perm (w[26], w[27], selector); w[49] = __byte_perm (w[25], w[26], selector); w[48] = __byte_perm (w[24], w[25], selector); w[47] = __byte_perm (w[23], w[24], selector); w[46] = __byte_perm (w[22], w[23], selector); w[45] = __byte_perm (w[21], w[22], selector); w[44] = __byte_perm (w[20], w[21], selector); w[43] = __byte_perm (w[19], w[20], selector); w[42] = __byte_perm (w[18], w[19], selector); w[41] = __byte_perm (w[17], w[18], selector); w[40] = __byte_perm (w[16], w[17], selector); w[39] = __byte_perm (w[15], w[16], selector); w[38] = __byte_perm (w[14], w[15], selector); w[37] = __byte_perm (w[13], w[14], selector); w[36] = __byte_perm (w[12], w[13], selector); w[35] = __byte_perm (w[11], w[12], selector); w[34] = __byte_perm (w[10], w[11], selector); w[33] = __byte_perm (w[ 9], w[10], selector); w[32] = __byte_perm (w[ 8], w[ 9], selector); w[31] = __byte_perm (w[ 7], w[ 8], selector); w[30] = __byte_perm (w[ 6], w[ 7], selector); w[29] = __byte_perm (w[ 5], w[ 6], selector); w[28] = __byte_perm (w[ 4], w[ 5], selector); w[27] = __byte_perm (w[ 3], w[ 4], selector); w[26] = __byte_perm (w[ 2], w[ 3], selector); w[25] = __byte_perm (w[ 1], w[ 2], selector); w[24] = __byte_perm (w[ 0], w[ 1], selector); w[23] = __byte_perm ( 0, w[ 0], selector); w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 24: w[63] = __byte_perm (w[38], w[39], selector); w[62] = __byte_perm (w[37], w[38], selector); w[61] = __byte_perm (w[36], w[37], selector); w[60] = __byte_perm (w[35], w[36], selector); w[59] = __byte_perm (w[34], w[35], selector); w[58] = __byte_perm (w[33], w[34], selector); w[57] = __byte_perm (w[32], w[33], selector); w[56] = __byte_perm (w[31], w[32], selector); w[55] = __byte_perm (w[30], w[31], selector); w[54] = __byte_perm (w[29], w[30], selector); w[53] = __byte_perm (w[28], w[29], selector); w[52] = __byte_perm (w[27], w[28], selector); w[51] = __byte_perm (w[26], w[27], selector); w[50] = __byte_perm (w[25], w[26], selector); w[49] = __byte_perm (w[24], w[25], selector); w[48] = __byte_perm (w[23], w[24], selector); w[47] = __byte_perm (w[22], w[23], selector); w[46] = __byte_perm (w[21], w[22], selector); w[45] = __byte_perm (w[20], w[21], selector); w[44] = __byte_perm (w[19], w[20], selector); w[43] = __byte_perm (w[18], w[19], selector); w[42] = __byte_perm (w[17], w[18], selector); w[41] = __byte_perm (w[16], w[17], selector); w[40] = __byte_perm (w[15], w[16], selector); w[39] = __byte_perm (w[14], w[15], selector); w[38] = __byte_perm (w[13], w[14], selector); w[37] = __byte_perm (w[12], w[13], selector); w[36] = __byte_perm (w[11], w[12], selector); w[35] = __byte_perm (w[10], w[11], selector); w[34] = __byte_perm (w[ 9], w[10], selector); w[33] = __byte_perm (w[ 8], w[ 9], selector); w[32] = __byte_perm (w[ 7], w[ 8], selector); w[31] = __byte_perm (w[ 6], w[ 7], selector); w[30] = __byte_perm (w[ 5], w[ 6], selector); w[29] = __byte_perm (w[ 4], w[ 5], selector); w[28] = __byte_perm (w[ 3], w[ 4], selector); w[27] = __byte_perm (w[ 2], w[ 3], selector); w[26] = __byte_perm (w[ 1], w[ 2], selector); w[25] = __byte_perm (w[ 0], w[ 1], selector); w[24] = __byte_perm ( 0, w[ 0], selector); w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 25: w[63] = __byte_perm (w[37], w[38], selector); w[62] = __byte_perm (w[36], w[37], selector); w[61] = __byte_perm (w[35], w[36], selector); w[60] = __byte_perm (w[34], w[35], selector); w[59] = __byte_perm (w[33], w[34], selector); w[58] = __byte_perm (w[32], w[33], selector); w[57] = __byte_perm (w[31], w[32], selector); w[56] = __byte_perm (w[30], w[31], selector); w[55] = __byte_perm (w[29], w[30], selector); w[54] = __byte_perm (w[28], w[29], selector); w[53] = __byte_perm (w[27], w[28], selector); w[52] = __byte_perm (w[26], w[27], selector); w[51] = __byte_perm (w[25], w[26], selector); w[50] = __byte_perm (w[24], w[25], selector); w[49] = __byte_perm (w[23], w[24], selector); w[48] = __byte_perm (w[22], w[23], selector); w[47] = __byte_perm (w[21], w[22], selector); w[46] = __byte_perm (w[20], w[21], selector); w[45] = __byte_perm (w[19], w[20], selector); w[44] = __byte_perm (w[18], w[19], selector); w[43] = __byte_perm (w[17], w[18], selector); w[42] = __byte_perm (w[16], w[17], selector); w[41] = __byte_perm (w[15], w[16], selector); w[40] = __byte_perm (w[14], w[15], selector); w[39] = __byte_perm (w[13], w[14], selector); w[38] = __byte_perm (w[12], w[13], selector); w[37] = __byte_perm (w[11], w[12], selector); w[36] = __byte_perm (w[10], w[11], selector); w[35] = __byte_perm (w[ 9], w[10], selector); w[34] = __byte_perm (w[ 8], w[ 9], selector); w[33] = __byte_perm (w[ 7], w[ 8], selector); w[32] = __byte_perm (w[ 6], w[ 7], selector); w[31] = __byte_perm (w[ 5], w[ 6], selector); w[30] = __byte_perm (w[ 4], w[ 5], selector); w[29] = __byte_perm (w[ 3], w[ 4], selector); w[28] = __byte_perm (w[ 2], w[ 3], selector); w[27] = __byte_perm (w[ 1], w[ 2], selector); w[26] = __byte_perm (w[ 0], w[ 1], selector); w[25] = __byte_perm ( 0, w[ 0], selector); w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 26: w[63] = __byte_perm (w[36], w[37], selector); w[62] = __byte_perm (w[35], w[36], selector); w[61] = __byte_perm (w[34], w[35], selector); w[60] = __byte_perm (w[33], w[34], selector); w[59] = __byte_perm (w[32], w[33], selector); w[58] = __byte_perm (w[31], w[32], selector); w[57] = __byte_perm (w[30], w[31], selector); w[56] = __byte_perm (w[29], w[30], selector); w[55] = __byte_perm (w[28], w[29], selector); w[54] = __byte_perm (w[27], w[28], selector); w[53] = __byte_perm (w[26], w[27], selector); w[52] = __byte_perm (w[25], w[26], selector); w[51] = __byte_perm (w[24], w[25], selector); w[50] = __byte_perm (w[23], w[24], selector); w[49] = __byte_perm (w[22], w[23], selector); w[48] = __byte_perm (w[21], w[22], selector); w[47] = __byte_perm (w[20], w[21], selector); w[46] = __byte_perm (w[19], w[20], selector); w[45] = __byte_perm (w[18], w[19], selector); w[44] = __byte_perm (w[17], w[18], selector); w[43] = __byte_perm (w[16], w[17], selector); w[42] = __byte_perm (w[15], w[16], selector); w[41] = __byte_perm (w[14], w[15], selector); w[40] = __byte_perm (w[13], w[14], selector); w[39] = __byte_perm (w[12], w[13], selector); w[38] = __byte_perm (w[11], w[12], selector); w[37] = __byte_perm (w[10], w[11], selector); w[36] = __byte_perm (w[ 9], w[10], selector); w[35] = __byte_perm (w[ 8], w[ 9], selector); w[34] = __byte_perm (w[ 7], w[ 8], selector); w[33] = __byte_perm (w[ 6], w[ 7], selector); w[32] = __byte_perm (w[ 5], w[ 6], selector); w[31] = __byte_perm (w[ 4], w[ 5], selector); w[30] = __byte_perm (w[ 3], w[ 4], selector); w[29] = __byte_perm (w[ 2], w[ 3], selector); w[28] = __byte_perm (w[ 1], w[ 2], selector); w[27] = __byte_perm (w[ 0], w[ 1], selector); w[26] = __byte_perm ( 0, w[ 0], selector); w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 27: w[63] = __byte_perm (w[35], w[36], selector); w[62] = __byte_perm (w[34], w[35], selector); w[61] = __byte_perm (w[33], w[34], selector); w[60] = __byte_perm (w[32], w[33], selector); w[59] = __byte_perm (w[31], w[32], selector); w[58] = __byte_perm (w[30], w[31], selector); w[57] = __byte_perm (w[29], w[30], selector); w[56] = __byte_perm (w[28], w[29], selector); w[55] = __byte_perm (w[27], w[28], selector); w[54] = __byte_perm (w[26], w[27], selector); w[53] = __byte_perm (w[25], w[26], selector); w[52] = __byte_perm (w[24], w[25], selector); w[51] = __byte_perm (w[23], w[24], selector); w[50] = __byte_perm (w[22], w[23], selector); w[49] = __byte_perm (w[21], w[22], selector); w[48] = __byte_perm (w[20], w[21], selector); w[47] = __byte_perm (w[19], w[20], selector); w[46] = __byte_perm (w[18], w[19], selector); w[45] = __byte_perm (w[17], w[18], selector); w[44] = __byte_perm (w[16], w[17], selector); w[43] = __byte_perm (w[15], w[16], selector); w[42] = __byte_perm (w[14], w[15], selector); w[41] = __byte_perm (w[13], w[14], selector); w[40] = __byte_perm (w[12], w[13], selector); w[39] = __byte_perm (w[11], w[12], selector); w[38] = __byte_perm (w[10], w[11], selector); w[37] = __byte_perm (w[ 9], w[10], selector); w[36] = __byte_perm (w[ 8], w[ 9], selector); w[35] = __byte_perm (w[ 7], w[ 8], selector); w[34] = __byte_perm (w[ 6], w[ 7], selector); w[33] = __byte_perm (w[ 5], w[ 6], selector); w[32] = __byte_perm (w[ 4], w[ 5], selector); w[31] = __byte_perm (w[ 3], w[ 4], selector); w[30] = __byte_perm (w[ 2], w[ 3], selector); w[29] = __byte_perm (w[ 1], w[ 2], selector); w[28] = __byte_perm (w[ 0], w[ 1], selector); w[27] = __byte_perm ( 0, w[ 0], selector); w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 28: w[63] = __byte_perm (w[34], w[35], selector); w[62] = __byte_perm (w[33], w[34], selector); w[61] = __byte_perm (w[32], w[33], selector); w[60] = __byte_perm (w[31], w[32], selector); w[59] = __byte_perm (w[30], w[31], selector); w[58] = __byte_perm (w[29], w[30], selector); w[57] = __byte_perm (w[28], w[29], selector); w[56] = __byte_perm (w[27], w[28], selector); w[55] = __byte_perm (w[26], w[27], selector); w[54] = __byte_perm (w[25], w[26], selector); w[53] = __byte_perm (w[24], w[25], selector); w[52] = __byte_perm (w[23], w[24], selector); w[51] = __byte_perm (w[22], w[23], selector); w[50] = __byte_perm (w[21], w[22], selector); w[49] = __byte_perm (w[20], w[21], selector); w[48] = __byte_perm (w[19], w[20], selector); w[47] = __byte_perm (w[18], w[19], selector); w[46] = __byte_perm (w[17], w[18], selector); w[45] = __byte_perm (w[16], w[17], selector); w[44] = __byte_perm (w[15], w[16], selector); w[43] = __byte_perm (w[14], w[15], selector); w[42] = __byte_perm (w[13], w[14], selector); w[41] = __byte_perm (w[12], w[13], selector); w[40] = __byte_perm (w[11], w[12], selector); w[39] = __byte_perm (w[10], w[11], selector); w[38] = __byte_perm (w[ 9], w[10], selector); w[37] = __byte_perm (w[ 8], w[ 9], selector); w[36] = __byte_perm (w[ 7], w[ 8], selector); w[35] = __byte_perm (w[ 6], w[ 7], selector); w[34] = __byte_perm (w[ 5], w[ 6], selector); w[33] = __byte_perm (w[ 4], w[ 5], selector); w[32] = __byte_perm (w[ 3], w[ 4], selector); w[31] = __byte_perm (w[ 2], w[ 3], selector); w[30] = __byte_perm (w[ 1], w[ 2], selector); w[29] = __byte_perm (w[ 0], w[ 1], selector); w[28] = __byte_perm ( 0, w[ 0], selector); w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 29: w[63] = __byte_perm (w[33], w[34], selector); w[62] = __byte_perm (w[32], w[33], selector); w[61] = __byte_perm (w[31], w[32], selector); w[60] = __byte_perm (w[30], w[31], selector); w[59] = __byte_perm (w[29], w[30], selector); w[58] = __byte_perm (w[28], w[29], selector); w[57] = __byte_perm (w[27], w[28], selector); w[56] = __byte_perm (w[26], w[27], selector); w[55] = __byte_perm (w[25], w[26], selector); w[54] = __byte_perm (w[24], w[25], selector); w[53] = __byte_perm (w[23], w[24], selector); w[52] = __byte_perm (w[22], w[23], selector); w[51] = __byte_perm (w[21], w[22], selector); w[50] = __byte_perm (w[20], w[21], selector); w[49] = __byte_perm (w[19], w[20], selector); w[48] = __byte_perm (w[18], w[19], selector); w[47] = __byte_perm (w[17], w[18], selector); w[46] = __byte_perm (w[16], w[17], selector); w[45] = __byte_perm (w[15], w[16], selector); w[44] = __byte_perm (w[14], w[15], selector); w[43] = __byte_perm (w[13], w[14], selector); w[42] = __byte_perm (w[12], w[13], selector); w[41] = __byte_perm (w[11], w[12], selector); w[40] = __byte_perm (w[10], w[11], selector); w[39] = __byte_perm (w[ 9], w[10], selector); w[38] = __byte_perm (w[ 8], w[ 9], selector); w[37] = __byte_perm (w[ 7], w[ 8], selector); w[36] = __byte_perm (w[ 6], w[ 7], selector); w[35] = __byte_perm (w[ 5], w[ 6], selector); w[34] = __byte_perm (w[ 4], w[ 5], selector); w[33] = __byte_perm (w[ 3], w[ 4], selector); w[32] = __byte_perm (w[ 2], w[ 3], selector); w[31] = __byte_perm (w[ 1], w[ 2], selector); w[30] = __byte_perm (w[ 0], w[ 1], selector); w[29] = __byte_perm ( 0, w[ 0], selector); w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 30: w[63] = __byte_perm (w[32], w[33], selector); w[62] = __byte_perm (w[31], w[32], selector); w[61] = __byte_perm (w[30], w[31], selector); w[60] = __byte_perm (w[29], w[30], selector); w[59] = __byte_perm (w[28], w[29], selector); w[58] = __byte_perm (w[27], w[28], selector); w[57] = __byte_perm (w[26], w[27], selector); w[56] = __byte_perm (w[25], w[26], selector); w[55] = __byte_perm (w[24], w[25], selector); w[54] = __byte_perm (w[23], w[24], selector); w[53] = __byte_perm (w[22], w[23], selector); w[52] = __byte_perm (w[21], w[22], selector); w[51] = __byte_perm (w[20], w[21], selector); w[50] = __byte_perm (w[19], w[20], selector); w[49] = __byte_perm (w[18], w[19], selector); w[48] = __byte_perm (w[17], w[18], selector); w[47] = __byte_perm (w[16], w[17], selector); w[46] = __byte_perm (w[15], w[16], selector); w[45] = __byte_perm (w[14], w[15], selector); w[44] = __byte_perm (w[13], w[14], selector); w[43] = __byte_perm (w[12], w[13], selector); w[42] = __byte_perm (w[11], w[12], selector); w[41] = __byte_perm (w[10], w[11], selector); w[40] = __byte_perm (w[ 9], w[10], selector); w[39] = __byte_perm (w[ 8], w[ 9], selector); w[38] = __byte_perm (w[ 7], w[ 8], selector); w[37] = __byte_perm (w[ 6], w[ 7], selector); w[36] = __byte_perm (w[ 5], w[ 6], selector); w[35] = __byte_perm (w[ 4], w[ 5], selector); w[34] = __byte_perm (w[ 3], w[ 4], selector); w[33] = __byte_perm (w[ 2], w[ 3], selector); w[32] = __byte_perm (w[ 1], w[ 2], selector); w[31] = __byte_perm (w[ 0], w[ 1], selector); w[30] = __byte_perm ( 0, w[ 0], selector); w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 31: w[63] = __byte_perm (w[31], w[32], selector); w[62] = __byte_perm (w[30], w[31], selector); w[61] = __byte_perm (w[29], w[30], selector); w[60] = __byte_perm (w[28], w[29], selector); w[59] = __byte_perm (w[27], w[28], selector); w[58] = __byte_perm (w[26], w[27], selector); w[57] = __byte_perm (w[25], w[26], selector); w[56] = __byte_perm (w[24], w[25], selector); w[55] = __byte_perm (w[23], w[24], selector); w[54] = __byte_perm (w[22], w[23], selector); w[53] = __byte_perm (w[21], w[22], selector); w[52] = __byte_perm (w[20], w[21], selector); w[51] = __byte_perm (w[19], w[20], selector); w[50] = __byte_perm (w[18], w[19], selector); w[49] = __byte_perm (w[17], w[18], selector); w[48] = __byte_perm (w[16], w[17], selector); w[47] = __byte_perm (w[15], w[16], selector); w[46] = __byte_perm (w[14], w[15], selector); w[45] = __byte_perm (w[13], w[14], selector); w[44] = __byte_perm (w[12], w[13], selector); w[43] = __byte_perm (w[11], w[12], selector); w[42] = __byte_perm (w[10], w[11], selector); w[41] = __byte_perm (w[ 9], w[10], selector); w[40] = __byte_perm (w[ 8], w[ 9], selector); w[39] = __byte_perm (w[ 7], w[ 8], selector); w[38] = __byte_perm (w[ 6], w[ 7], selector); w[37] = __byte_perm (w[ 5], w[ 6], selector); w[36] = __byte_perm (w[ 4], w[ 5], selector); w[35] = __byte_perm (w[ 3], w[ 4], selector); w[34] = __byte_perm (w[ 2], w[ 3], selector); w[33] = __byte_perm (w[ 1], w[ 2], selector); w[32] = __byte_perm (w[ 0], w[ 1], selector); w[31] = __byte_perm ( 0, w[ 0], selector); w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 32: w[63] = __byte_perm (w[30], w[31], selector); w[62] = __byte_perm (w[29], w[30], selector); w[61] = __byte_perm (w[28], w[29], selector); w[60] = __byte_perm (w[27], w[28], selector); w[59] = __byte_perm (w[26], w[27], selector); w[58] = __byte_perm (w[25], w[26], selector); w[57] = __byte_perm (w[24], w[25], selector); w[56] = __byte_perm (w[23], w[24], selector); w[55] = __byte_perm (w[22], w[23], selector); w[54] = __byte_perm (w[21], w[22], selector); w[53] = __byte_perm (w[20], w[21], selector); w[52] = __byte_perm (w[19], w[20], selector); w[51] = __byte_perm (w[18], w[19], selector); w[50] = __byte_perm (w[17], w[18], selector); w[49] = __byte_perm (w[16], w[17], selector); w[48] = __byte_perm (w[15], w[16], selector); w[47] = __byte_perm (w[14], w[15], selector); w[46] = __byte_perm (w[13], w[14], selector); w[45] = __byte_perm (w[12], w[13], selector); w[44] = __byte_perm (w[11], w[12], selector); w[43] = __byte_perm (w[10], w[11], selector); w[42] = __byte_perm (w[ 9], w[10], selector); w[41] = __byte_perm (w[ 8], w[ 9], selector); w[40] = __byte_perm (w[ 7], w[ 8], selector); w[39] = __byte_perm (w[ 6], w[ 7], selector); w[38] = __byte_perm (w[ 5], w[ 6], selector); w[37] = __byte_perm (w[ 4], w[ 5], selector); w[36] = __byte_perm (w[ 3], w[ 4], selector); w[35] = __byte_perm (w[ 2], w[ 3], selector); w[34] = __byte_perm (w[ 1], w[ 2], selector); w[33] = __byte_perm (w[ 0], w[ 1], selector); w[32] = __byte_perm ( 0, w[ 0], selector); w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 33: w[63] = __byte_perm (w[29], w[30], selector); w[62] = __byte_perm (w[28], w[29], selector); w[61] = __byte_perm (w[27], w[28], selector); w[60] = __byte_perm (w[26], w[27], selector); w[59] = __byte_perm (w[25], w[26], selector); w[58] = __byte_perm (w[24], w[25], selector); w[57] = __byte_perm (w[23], w[24], selector); w[56] = __byte_perm (w[22], w[23], selector); w[55] = __byte_perm (w[21], w[22], selector); w[54] = __byte_perm (w[20], w[21], selector); w[53] = __byte_perm (w[19], w[20], selector); w[52] = __byte_perm (w[18], w[19], selector); w[51] = __byte_perm (w[17], w[18], selector); w[50] = __byte_perm (w[16], w[17], selector); w[49] = __byte_perm (w[15], w[16], selector); w[48] = __byte_perm (w[14], w[15], selector); w[47] = __byte_perm (w[13], w[14], selector); w[46] = __byte_perm (w[12], w[13], selector); w[45] = __byte_perm (w[11], w[12], selector); w[44] = __byte_perm (w[10], w[11], selector); w[43] = __byte_perm (w[ 9], w[10], selector); w[42] = __byte_perm (w[ 8], w[ 9], selector); w[41] = __byte_perm (w[ 7], w[ 8], selector); w[40] = __byte_perm (w[ 6], w[ 7], selector); w[39] = __byte_perm (w[ 5], w[ 6], selector); w[38] = __byte_perm (w[ 4], w[ 5], selector); w[37] = __byte_perm (w[ 3], w[ 4], selector); w[36] = __byte_perm (w[ 2], w[ 3], selector); w[35] = __byte_perm (w[ 1], w[ 2], selector); w[34] = __byte_perm (w[ 0], w[ 1], selector); w[33] = __byte_perm ( 0, w[ 0], selector); w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 34: w[63] = __byte_perm (w[28], w[29], selector); w[62] = __byte_perm (w[27], w[28], selector); w[61] = __byte_perm (w[26], w[27], selector); w[60] = __byte_perm (w[25], w[26], selector); w[59] = __byte_perm (w[24], w[25], selector); w[58] = __byte_perm (w[23], w[24], selector); w[57] = __byte_perm (w[22], w[23], selector); w[56] = __byte_perm (w[21], w[22], selector); w[55] = __byte_perm (w[20], w[21], selector); w[54] = __byte_perm (w[19], w[20], selector); w[53] = __byte_perm (w[18], w[19], selector); w[52] = __byte_perm (w[17], w[18], selector); w[51] = __byte_perm (w[16], w[17], selector); w[50] = __byte_perm (w[15], w[16], selector); w[49] = __byte_perm (w[14], w[15], selector); w[48] = __byte_perm (w[13], w[14], selector); w[47] = __byte_perm (w[12], w[13], selector); w[46] = __byte_perm (w[11], w[12], selector); w[45] = __byte_perm (w[10], w[11], selector); w[44] = __byte_perm (w[ 9], w[10], selector); w[43] = __byte_perm (w[ 8], w[ 9], selector); w[42] = __byte_perm (w[ 7], w[ 8], selector); w[41] = __byte_perm (w[ 6], w[ 7], selector); w[40] = __byte_perm (w[ 5], w[ 6], selector); w[39] = __byte_perm (w[ 4], w[ 5], selector); w[38] = __byte_perm (w[ 3], w[ 4], selector); w[37] = __byte_perm (w[ 2], w[ 3], selector); w[36] = __byte_perm (w[ 1], w[ 2], selector); w[35] = __byte_perm (w[ 0], w[ 1], selector); w[34] = __byte_perm ( 0, w[ 0], selector); w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 35: w[63] = __byte_perm (w[27], w[28], selector); w[62] = __byte_perm (w[26], w[27], selector); w[61] = __byte_perm (w[25], w[26], selector); w[60] = __byte_perm (w[24], w[25], selector); w[59] = __byte_perm (w[23], w[24], selector); w[58] = __byte_perm (w[22], w[23], selector); w[57] = __byte_perm (w[21], w[22], selector); w[56] = __byte_perm (w[20], w[21], selector); w[55] = __byte_perm (w[19], w[20], selector); w[54] = __byte_perm (w[18], w[19], selector); w[53] = __byte_perm (w[17], w[18], selector); w[52] = __byte_perm (w[16], w[17], selector); w[51] = __byte_perm (w[15], w[16], selector); w[50] = __byte_perm (w[14], w[15], selector); w[49] = __byte_perm (w[13], w[14], selector); w[48] = __byte_perm (w[12], w[13], selector); w[47] = __byte_perm (w[11], w[12], selector); w[46] = __byte_perm (w[10], w[11], selector); w[45] = __byte_perm (w[ 9], w[10], selector); w[44] = __byte_perm (w[ 8], w[ 9], selector); w[43] = __byte_perm (w[ 7], w[ 8], selector); w[42] = __byte_perm (w[ 6], w[ 7], selector); w[41] = __byte_perm (w[ 5], w[ 6], selector); w[40] = __byte_perm (w[ 4], w[ 5], selector); w[39] = __byte_perm (w[ 3], w[ 4], selector); w[38] = __byte_perm (w[ 2], w[ 3], selector); w[37] = __byte_perm (w[ 1], w[ 2], selector); w[36] = __byte_perm (w[ 0], w[ 1], selector); w[35] = __byte_perm ( 0, w[ 0], selector); w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 36: w[63] = __byte_perm (w[26], w[27], selector); w[62] = __byte_perm (w[25], w[26], selector); w[61] = __byte_perm (w[24], w[25], selector); w[60] = __byte_perm (w[23], w[24], selector); w[59] = __byte_perm (w[22], w[23], selector); w[58] = __byte_perm (w[21], w[22], selector); w[57] = __byte_perm (w[20], w[21], selector); w[56] = __byte_perm (w[19], w[20], selector); w[55] = __byte_perm (w[18], w[19], selector); w[54] = __byte_perm (w[17], w[18], selector); w[53] = __byte_perm (w[16], w[17], selector); w[52] = __byte_perm (w[15], w[16], selector); w[51] = __byte_perm (w[14], w[15], selector); w[50] = __byte_perm (w[13], w[14], selector); w[49] = __byte_perm (w[12], w[13], selector); w[48] = __byte_perm (w[11], w[12], selector); w[47] = __byte_perm (w[10], w[11], selector); w[46] = __byte_perm (w[ 9], w[10], selector); w[45] = __byte_perm (w[ 8], w[ 9], selector); w[44] = __byte_perm (w[ 7], w[ 8], selector); w[43] = __byte_perm (w[ 6], w[ 7], selector); w[42] = __byte_perm (w[ 5], w[ 6], selector); w[41] = __byte_perm (w[ 4], w[ 5], selector); w[40] = __byte_perm (w[ 3], w[ 4], selector); w[39] = __byte_perm (w[ 2], w[ 3], selector); w[38] = __byte_perm (w[ 1], w[ 2], selector); w[37] = __byte_perm (w[ 0], w[ 1], selector); w[36] = __byte_perm ( 0, w[ 0], selector); w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 37: w[63] = __byte_perm (w[25], w[26], selector); w[62] = __byte_perm (w[24], w[25], selector); w[61] = __byte_perm (w[23], w[24], selector); w[60] = __byte_perm (w[22], w[23], selector); w[59] = __byte_perm (w[21], w[22], selector); w[58] = __byte_perm (w[20], w[21], selector); w[57] = __byte_perm (w[19], w[20], selector); w[56] = __byte_perm (w[18], w[19], selector); w[55] = __byte_perm (w[17], w[18], selector); w[54] = __byte_perm (w[16], w[17], selector); w[53] = __byte_perm (w[15], w[16], selector); w[52] = __byte_perm (w[14], w[15], selector); w[51] = __byte_perm (w[13], w[14], selector); w[50] = __byte_perm (w[12], w[13], selector); w[49] = __byte_perm (w[11], w[12], selector); w[48] = __byte_perm (w[10], w[11], selector); w[47] = __byte_perm (w[ 9], w[10], selector); w[46] = __byte_perm (w[ 8], w[ 9], selector); w[45] = __byte_perm (w[ 7], w[ 8], selector); w[44] = __byte_perm (w[ 6], w[ 7], selector); w[43] = __byte_perm (w[ 5], w[ 6], selector); w[42] = __byte_perm (w[ 4], w[ 5], selector); w[41] = __byte_perm (w[ 3], w[ 4], selector); w[40] = __byte_perm (w[ 2], w[ 3], selector); w[39] = __byte_perm (w[ 1], w[ 2], selector); w[38] = __byte_perm (w[ 0], w[ 1], selector); w[37] = __byte_perm ( 0, w[ 0], selector); w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 38: w[63] = __byte_perm (w[24], w[25], selector); w[62] = __byte_perm (w[23], w[24], selector); w[61] = __byte_perm (w[22], w[23], selector); w[60] = __byte_perm (w[21], w[22], selector); w[59] = __byte_perm (w[20], w[21], selector); w[58] = __byte_perm (w[19], w[20], selector); w[57] = __byte_perm (w[18], w[19], selector); w[56] = __byte_perm (w[17], w[18], selector); w[55] = __byte_perm (w[16], w[17], selector); w[54] = __byte_perm (w[15], w[16], selector); w[53] = __byte_perm (w[14], w[15], selector); w[52] = __byte_perm (w[13], w[14], selector); w[51] = __byte_perm (w[12], w[13], selector); w[50] = __byte_perm (w[11], w[12], selector); w[49] = __byte_perm (w[10], w[11], selector); w[48] = __byte_perm (w[ 9], w[10], selector); w[47] = __byte_perm (w[ 8], w[ 9], selector); w[46] = __byte_perm (w[ 7], w[ 8], selector); w[45] = __byte_perm (w[ 6], w[ 7], selector); w[44] = __byte_perm (w[ 5], w[ 6], selector); w[43] = __byte_perm (w[ 4], w[ 5], selector); w[42] = __byte_perm (w[ 3], w[ 4], selector); w[41] = __byte_perm (w[ 2], w[ 3], selector); w[40] = __byte_perm (w[ 1], w[ 2], selector); w[39] = __byte_perm (w[ 0], w[ 1], selector); w[38] = __byte_perm ( 0, w[ 0], selector); w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 39: w[63] = __byte_perm (w[23], w[24], selector); w[62] = __byte_perm (w[22], w[23], selector); w[61] = __byte_perm (w[21], w[22], selector); w[60] = __byte_perm (w[20], w[21], selector); w[59] = __byte_perm (w[19], w[20], selector); w[58] = __byte_perm (w[18], w[19], selector); w[57] = __byte_perm (w[17], w[18], selector); w[56] = __byte_perm (w[16], w[17], selector); w[55] = __byte_perm (w[15], w[16], selector); w[54] = __byte_perm (w[14], w[15], selector); w[53] = __byte_perm (w[13], w[14], selector); w[52] = __byte_perm (w[12], w[13], selector); w[51] = __byte_perm (w[11], w[12], selector); w[50] = __byte_perm (w[10], w[11], selector); w[49] = __byte_perm (w[ 9], w[10], selector); w[48] = __byte_perm (w[ 8], w[ 9], selector); w[47] = __byte_perm (w[ 7], w[ 8], selector); w[46] = __byte_perm (w[ 6], w[ 7], selector); w[45] = __byte_perm (w[ 5], w[ 6], selector); w[44] = __byte_perm (w[ 4], w[ 5], selector); w[43] = __byte_perm (w[ 3], w[ 4], selector); w[42] = __byte_perm (w[ 2], w[ 3], selector); w[41] = __byte_perm (w[ 1], w[ 2], selector); w[40] = __byte_perm (w[ 0], w[ 1], selector); w[39] = __byte_perm ( 0, w[ 0], selector); w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 40: w[63] = __byte_perm (w[22], w[23], selector); w[62] = __byte_perm (w[21], w[22], selector); w[61] = __byte_perm (w[20], w[21], selector); w[60] = __byte_perm (w[19], w[20], selector); w[59] = __byte_perm (w[18], w[19], selector); w[58] = __byte_perm (w[17], w[18], selector); w[57] = __byte_perm (w[16], w[17], selector); w[56] = __byte_perm (w[15], w[16], selector); w[55] = __byte_perm (w[14], w[15], selector); w[54] = __byte_perm (w[13], w[14], selector); w[53] = __byte_perm (w[12], w[13], selector); w[52] = __byte_perm (w[11], w[12], selector); w[51] = __byte_perm (w[10], w[11], selector); w[50] = __byte_perm (w[ 9], w[10], selector); w[49] = __byte_perm (w[ 8], w[ 9], selector); w[48] = __byte_perm (w[ 7], w[ 8], selector); w[47] = __byte_perm (w[ 6], w[ 7], selector); w[46] = __byte_perm (w[ 5], w[ 6], selector); w[45] = __byte_perm (w[ 4], w[ 5], selector); w[44] = __byte_perm (w[ 3], w[ 4], selector); w[43] = __byte_perm (w[ 2], w[ 3], selector); w[42] = __byte_perm (w[ 1], w[ 2], selector); w[41] = __byte_perm (w[ 0], w[ 1], selector); w[40] = __byte_perm ( 0, w[ 0], selector); w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 41: w[63] = __byte_perm (w[21], w[22], selector); w[62] = __byte_perm (w[20], w[21], selector); w[61] = __byte_perm (w[19], w[20], selector); w[60] = __byte_perm (w[18], w[19], selector); w[59] = __byte_perm (w[17], w[18], selector); w[58] = __byte_perm (w[16], w[17], selector); w[57] = __byte_perm (w[15], w[16], selector); w[56] = __byte_perm (w[14], w[15], selector); w[55] = __byte_perm (w[13], w[14], selector); w[54] = __byte_perm (w[12], w[13], selector); w[53] = __byte_perm (w[11], w[12], selector); w[52] = __byte_perm (w[10], w[11], selector); w[51] = __byte_perm (w[ 9], w[10], selector); w[50] = __byte_perm (w[ 8], w[ 9], selector); w[49] = __byte_perm (w[ 7], w[ 8], selector); w[48] = __byte_perm (w[ 6], w[ 7], selector); w[47] = __byte_perm (w[ 5], w[ 6], selector); w[46] = __byte_perm (w[ 4], w[ 5], selector); w[45] = __byte_perm (w[ 3], w[ 4], selector); w[44] = __byte_perm (w[ 2], w[ 3], selector); w[43] = __byte_perm (w[ 1], w[ 2], selector); w[42] = __byte_perm (w[ 0], w[ 1], selector); w[41] = __byte_perm ( 0, w[ 0], selector); w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 42: w[63] = __byte_perm (w[20], w[21], selector); w[62] = __byte_perm (w[19], w[20], selector); w[61] = __byte_perm (w[18], w[19], selector); w[60] = __byte_perm (w[17], w[18], selector); w[59] = __byte_perm (w[16], w[17], selector); w[58] = __byte_perm (w[15], w[16], selector); w[57] = __byte_perm (w[14], w[15], selector); w[56] = __byte_perm (w[13], w[14], selector); w[55] = __byte_perm (w[12], w[13], selector); w[54] = __byte_perm (w[11], w[12], selector); w[53] = __byte_perm (w[10], w[11], selector); w[52] = __byte_perm (w[ 9], w[10], selector); w[51] = __byte_perm (w[ 8], w[ 9], selector); w[50] = __byte_perm (w[ 7], w[ 8], selector); w[49] = __byte_perm (w[ 6], w[ 7], selector); w[48] = __byte_perm (w[ 5], w[ 6], selector); w[47] = __byte_perm (w[ 4], w[ 5], selector); w[46] = __byte_perm (w[ 3], w[ 4], selector); w[45] = __byte_perm (w[ 2], w[ 3], selector); w[44] = __byte_perm (w[ 1], w[ 2], selector); w[43] = __byte_perm (w[ 0], w[ 1], selector); w[42] = __byte_perm ( 0, w[ 0], selector); w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 43: w[63] = __byte_perm (w[19], w[20], selector); w[62] = __byte_perm (w[18], w[19], selector); w[61] = __byte_perm (w[17], w[18], selector); w[60] = __byte_perm (w[16], w[17], selector); w[59] = __byte_perm (w[15], w[16], selector); w[58] = __byte_perm (w[14], w[15], selector); w[57] = __byte_perm (w[13], w[14], selector); w[56] = __byte_perm (w[12], w[13], selector); w[55] = __byte_perm (w[11], w[12], selector); w[54] = __byte_perm (w[10], w[11], selector); w[53] = __byte_perm (w[ 9], w[10], selector); w[52] = __byte_perm (w[ 8], w[ 9], selector); w[51] = __byte_perm (w[ 7], w[ 8], selector); w[50] = __byte_perm (w[ 6], w[ 7], selector); w[49] = __byte_perm (w[ 5], w[ 6], selector); w[48] = __byte_perm (w[ 4], w[ 5], selector); w[47] = __byte_perm (w[ 3], w[ 4], selector); w[46] = __byte_perm (w[ 2], w[ 3], selector); w[45] = __byte_perm (w[ 1], w[ 2], selector); w[44] = __byte_perm (w[ 0], w[ 1], selector); w[43] = __byte_perm ( 0, w[ 0], selector); w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 44: w[63] = __byte_perm (w[18], w[19], selector); w[62] = __byte_perm (w[17], w[18], selector); w[61] = __byte_perm (w[16], w[17], selector); w[60] = __byte_perm (w[15], w[16], selector); w[59] = __byte_perm (w[14], w[15], selector); w[58] = __byte_perm (w[13], w[14], selector); w[57] = __byte_perm (w[12], w[13], selector); w[56] = __byte_perm (w[11], w[12], selector); w[55] = __byte_perm (w[10], w[11], selector); w[54] = __byte_perm (w[ 9], w[10], selector); w[53] = __byte_perm (w[ 8], w[ 9], selector); w[52] = __byte_perm (w[ 7], w[ 8], selector); w[51] = __byte_perm (w[ 6], w[ 7], selector); w[50] = __byte_perm (w[ 5], w[ 6], selector); w[49] = __byte_perm (w[ 4], w[ 5], selector); w[48] = __byte_perm (w[ 3], w[ 4], selector); w[47] = __byte_perm (w[ 2], w[ 3], selector); w[46] = __byte_perm (w[ 1], w[ 2], selector); w[45] = __byte_perm (w[ 0], w[ 1], selector); w[44] = __byte_perm ( 0, w[ 0], selector); w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 45: w[63] = __byte_perm (w[17], w[18], selector); w[62] = __byte_perm (w[16], w[17], selector); w[61] = __byte_perm (w[15], w[16], selector); w[60] = __byte_perm (w[14], w[15], selector); w[59] = __byte_perm (w[13], w[14], selector); w[58] = __byte_perm (w[12], w[13], selector); w[57] = __byte_perm (w[11], w[12], selector); w[56] = __byte_perm (w[10], w[11], selector); w[55] = __byte_perm (w[ 9], w[10], selector); w[54] = __byte_perm (w[ 8], w[ 9], selector); w[53] = __byte_perm (w[ 7], w[ 8], selector); w[52] = __byte_perm (w[ 6], w[ 7], selector); w[51] = __byte_perm (w[ 5], w[ 6], selector); w[50] = __byte_perm (w[ 4], w[ 5], selector); w[49] = __byte_perm (w[ 3], w[ 4], selector); w[48] = __byte_perm (w[ 2], w[ 3], selector); w[47] = __byte_perm (w[ 1], w[ 2], selector); w[46] = __byte_perm (w[ 0], w[ 1], selector); w[45] = __byte_perm ( 0, w[ 0], selector); w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 46: w[63] = __byte_perm (w[16], w[17], selector); w[62] = __byte_perm (w[15], w[16], selector); w[61] = __byte_perm (w[14], w[15], selector); w[60] = __byte_perm (w[13], w[14], selector); w[59] = __byte_perm (w[12], w[13], selector); w[58] = __byte_perm (w[11], w[12], selector); w[57] = __byte_perm (w[10], w[11], selector); w[56] = __byte_perm (w[ 9], w[10], selector); w[55] = __byte_perm (w[ 8], w[ 9], selector); w[54] = __byte_perm (w[ 7], w[ 8], selector); w[53] = __byte_perm (w[ 6], w[ 7], selector); w[52] = __byte_perm (w[ 5], w[ 6], selector); w[51] = __byte_perm (w[ 4], w[ 5], selector); w[50] = __byte_perm (w[ 3], w[ 4], selector); w[49] = __byte_perm (w[ 2], w[ 3], selector); w[48] = __byte_perm (w[ 1], w[ 2], selector); w[47] = __byte_perm (w[ 0], w[ 1], selector); w[46] = __byte_perm ( 0, w[ 0], selector); w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 47: w[63] = __byte_perm (w[15], w[16], selector); w[62] = __byte_perm (w[14], w[15], selector); w[61] = __byte_perm (w[13], w[14], selector); w[60] = __byte_perm (w[12], w[13], selector); w[59] = __byte_perm (w[11], w[12], selector); w[58] = __byte_perm (w[10], w[11], selector); w[57] = __byte_perm (w[ 9], w[10], selector); w[56] = __byte_perm (w[ 8], w[ 9], selector); w[55] = __byte_perm (w[ 7], w[ 8], selector); w[54] = __byte_perm (w[ 6], w[ 7], selector); w[53] = __byte_perm (w[ 5], w[ 6], selector); w[52] = __byte_perm (w[ 4], w[ 5], selector); w[51] = __byte_perm (w[ 3], w[ 4], selector); w[50] = __byte_perm (w[ 2], w[ 3], selector); w[49] = __byte_perm (w[ 1], w[ 2], selector); w[48] = __byte_perm (w[ 0], w[ 1], selector); w[47] = __byte_perm ( 0, w[ 0], selector); w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 48: w[63] = __byte_perm (w[14], w[15], selector); w[62] = __byte_perm (w[13], w[14], selector); w[61] = __byte_perm (w[12], w[13], selector); w[60] = __byte_perm (w[11], w[12], selector); w[59] = __byte_perm (w[10], w[11], selector); w[58] = __byte_perm (w[ 9], w[10], selector); w[57] = __byte_perm (w[ 8], w[ 9], selector); w[56] = __byte_perm (w[ 7], w[ 8], selector); w[55] = __byte_perm (w[ 6], w[ 7], selector); w[54] = __byte_perm (w[ 5], w[ 6], selector); w[53] = __byte_perm (w[ 4], w[ 5], selector); w[52] = __byte_perm (w[ 3], w[ 4], selector); w[51] = __byte_perm (w[ 2], w[ 3], selector); w[50] = __byte_perm (w[ 1], w[ 2], selector); w[49] = __byte_perm (w[ 0], w[ 1], selector); w[48] = __byte_perm ( 0, w[ 0], selector); w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 49: w[63] = __byte_perm (w[13], w[14], selector); w[62] = __byte_perm (w[12], w[13], selector); w[61] = __byte_perm (w[11], w[12], selector); w[60] = __byte_perm (w[10], w[11], selector); w[59] = __byte_perm (w[ 9], w[10], selector); w[58] = __byte_perm (w[ 8], w[ 9], selector); w[57] = __byte_perm (w[ 7], w[ 8], selector); w[56] = __byte_perm (w[ 6], w[ 7], selector); w[55] = __byte_perm (w[ 5], w[ 6], selector); w[54] = __byte_perm (w[ 4], w[ 5], selector); w[53] = __byte_perm (w[ 3], w[ 4], selector); w[52] = __byte_perm (w[ 2], w[ 3], selector); w[51] = __byte_perm (w[ 1], w[ 2], selector); w[50] = __byte_perm (w[ 0], w[ 1], selector); w[49] = __byte_perm ( 0, w[ 0], selector); w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 50: w[63] = __byte_perm (w[12], w[13], selector); w[62] = __byte_perm (w[11], w[12], selector); w[61] = __byte_perm (w[10], w[11], selector); w[60] = __byte_perm (w[ 9], w[10], selector); w[59] = __byte_perm (w[ 8], w[ 9], selector); w[58] = __byte_perm (w[ 7], w[ 8], selector); w[57] = __byte_perm (w[ 6], w[ 7], selector); w[56] = __byte_perm (w[ 5], w[ 6], selector); w[55] = __byte_perm (w[ 4], w[ 5], selector); w[54] = __byte_perm (w[ 3], w[ 4], selector); w[53] = __byte_perm (w[ 2], w[ 3], selector); w[52] = __byte_perm (w[ 1], w[ 2], selector); w[51] = __byte_perm (w[ 0], w[ 1], selector); w[50] = __byte_perm ( 0, w[ 0], selector); w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 51: w[63] = __byte_perm (w[11], w[12], selector); w[62] = __byte_perm (w[10], w[11], selector); w[61] = __byte_perm (w[ 9], w[10], selector); w[60] = __byte_perm (w[ 8], w[ 9], selector); w[59] = __byte_perm (w[ 7], w[ 8], selector); w[58] = __byte_perm (w[ 6], w[ 7], selector); w[57] = __byte_perm (w[ 5], w[ 6], selector); w[56] = __byte_perm (w[ 4], w[ 5], selector); w[55] = __byte_perm (w[ 3], w[ 4], selector); w[54] = __byte_perm (w[ 2], w[ 3], selector); w[53] = __byte_perm (w[ 1], w[ 2], selector); w[52] = __byte_perm (w[ 0], w[ 1], selector); w[51] = __byte_perm ( 0, w[ 0], selector); w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 52: w[63] = __byte_perm (w[10], w[11], selector); w[62] = __byte_perm (w[ 9], w[10], selector); w[61] = __byte_perm (w[ 8], w[ 9], selector); w[60] = __byte_perm (w[ 7], w[ 8], selector); w[59] = __byte_perm (w[ 6], w[ 7], selector); w[58] = __byte_perm (w[ 5], w[ 6], selector); w[57] = __byte_perm (w[ 4], w[ 5], selector); w[56] = __byte_perm (w[ 3], w[ 4], selector); w[55] = __byte_perm (w[ 2], w[ 3], selector); w[54] = __byte_perm (w[ 1], w[ 2], selector); w[53] = __byte_perm (w[ 0], w[ 1], selector); w[52] = __byte_perm ( 0, w[ 0], selector); w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 53: w[63] = __byte_perm (w[ 9], w[10], selector); w[62] = __byte_perm (w[ 8], w[ 9], selector); w[61] = __byte_perm (w[ 7], w[ 8], selector); w[60] = __byte_perm (w[ 6], w[ 7], selector); w[59] = __byte_perm (w[ 5], w[ 6], selector); w[58] = __byte_perm (w[ 4], w[ 5], selector); w[57] = __byte_perm (w[ 3], w[ 4], selector); w[56] = __byte_perm (w[ 2], w[ 3], selector); w[55] = __byte_perm (w[ 1], w[ 2], selector); w[54] = __byte_perm (w[ 0], w[ 1], selector); w[53] = __byte_perm ( 0, w[ 0], selector); w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 54: w[63] = __byte_perm (w[ 8], w[ 9], selector); w[62] = __byte_perm (w[ 7], w[ 8], selector); w[61] = __byte_perm (w[ 6], w[ 7], selector); w[60] = __byte_perm (w[ 5], w[ 6], selector); w[59] = __byte_perm (w[ 4], w[ 5], selector); w[58] = __byte_perm (w[ 3], w[ 4], selector); w[57] = __byte_perm (w[ 2], w[ 3], selector); w[56] = __byte_perm (w[ 1], w[ 2], selector); w[55] = __byte_perm (w[ 0], w[ 1], selector); w[54] = __byte_perm ( 0, w[ 0], selector); w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 55: w[63] = __byte_perm (w[ 7], w[ 8], selector); w[62] = __byte_perm (w[ 6], w[ 7], selector); w[61] = __byte_perm (w[ 5], w[ 6], selector); w[60] = __byte_perm (w[ 4], w[ 5], selector); w[59] = __byte_perm (w[ 3], w[ 4], selector); w[58] = __byte_perm (w[ 2], w[ 3], selector); w[57] = __byte_perm (w[ 1], w[ 2], selector); w[56] = __byte_perm (w[ 0], w[ 1], selector); w[55] = __byte_perm ( 0, w[ 0], selector); w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 56: w[63] = __byte_perm (w[ 6], w[ 7], selector); w[62] = __byte_perm (w[ 5], w[ 6], selector); w[61] = __byte_perm (w[ 4], w[ 5], selector); w[60] = __byte_perm (w[ 3], w[ 4], selector); w[59] = __byte_perm (w[ 2], w[ 3], selector); w[58] = __byte_perm (w[ 1], w[ 2], selector); w[57] = __byte_perm (w[ 0], w[ 1], selector); w[56] = __byte_perm ( 0, w[ 0], selector); w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 57: w[63] = __byte_perm (w[ 5], w[ 6], selector); w[62] = __byte_perm (w[ 4], w[ 5], selector); w[61] = __byte_perm (w[ 3], w[ 4], selector); w[60] = __byte_perm (w[ 2], w[ 3], selector); w[59] = __byte_perm (w[ 1], w[ 2], selector); w[58] = __byte_perm (w[ 0], w[ 1], selector); w[57] = __byte_perm ( 0, w[ 0], selector); w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 58: w[63] = __byte_perm (w[ 4], w[ 5], selector); w[62] = __byte_perm (w[ 3], w[ 4], selector); w[61] = __byte_perm (w[ 2], w[ 3], selector); w[60] = __byte_perm (w[ 1], w[ 2], selector); w[59] = __byte_perm (w[ 0], w[ 1], selector); w[58] = __byte_perm ( 0, w[ 0], selector); w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 59: w[63] = __byte_perm (w[ 3], w[ 4], selector); w[62] = __byte_perm (w[ 2], w[ 3], selector); w[61] = __byte_perm (w[ 1], w[ 2], selector); w[60] = __byte_perm (w[ 0], w[ 1], selector); w[59] = __byte_perm ( 0, w[ 0], selector); w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 60: w[63] = __byte_perm (w[ 2], w[ 3], selector); w[62] = __byte_perm (w[ 1], w[ 2], selector); w[61] = __byte_perm (w[ 0], w[ 1], selector); w[60] = __byte_perm ( 0, w[ 0], selector); w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 61: w[63] = __byte_perm (w[ 1], w[ 2], selector); w[62] = __byte_perm (w[ 0], w[ 1], selector); w[61] = __byte_perm ( 0, w[ 0], selector); w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 62: w[63] = __byte_perm (w[ 0], w[ 1], selector); w[62] = __byte_perm ( 0, w[ 0], selector); w[61] = 0; w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 63: w[63] = __byte_perm ( 0, w[ 0], selector); w[62] = 0; w[61] = 0; w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; } #endif } void switch_buffer_by_offset_1x64_be (u32x w[64], const u32 offset) { #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if (defined IS_AMD && AMD_GCN < 3) || defined IS_GENERIC switch (offset_switch) { case 0: w[63] = amd_bytealign (w[62], w[63], offset); w[62] = amd_bytealign (w[61], w[62], offset); w[61] = amd_bytealign (w[60], w[61], offset); w[60] = amd_bytealign (w[59], w[60], offset); w[59] = amd_bytealign (w[58], w[59], offset); w[58] = amd_bytealign (w[57], w[58], offset); w[57] = amd_bytealign (w[56], w[57], offset); w[56] = amd_bytealign (w[55], w[56], offset); w[55] = amd_bytealign (w[54], w[55], offset); w[54] = amd_bytealign (w[53], w[54], offset); w[53] = amd_bytealign (w[52], w[53], offset); w[52] = amd_bytealign (w[51], w[52], offset); w[51] = amd_bytealign (w[50], w[51], offset); w[50] = amd_bytealign (w[49], w[50], offset); w[49] = amd_bytealign (w[48], w[49], offset); w[48] = amd_bytealign (w[47], w[48], offset); w[47] = amd_bytealign (w[46], w[47], offset); w[46] = amd_bytealign (w[45], w[46], offset); w[45] = amd_bytealign (w[44], w[45], offset); w[44] = amd_bytealign (w[43], w[44], offset); w[43] = amd_bytealign (w[42], w[43], offset); w[42] = amd_bytealign (w[41], w[42], offset); w[41] = amd_bytealign (w[40], w[41], offset); w[40] = amd_bytealign (w[39], w[40], offset); w[39] = amd_bytealign (w[38], w[39], offset); w[38] = amd_bytealign (w[37], w[38], offset); w[37] = amd_bytealign (w[36], w[37], offset); w[36] = amd_bytealign (w[35], w[36], offset); w[35] = amd_bytealign (w[34], w[35], offset); w[34] = amd_bytealign (w[33], w[34], offset); w[33] = amd_bytealign (w[32], w[33], offset); w[32] = amd_bytealign (w[31], w[32], offset); w[31] = amd_bytealign (w[30], w[31], offset); w[30] = amd_bytealign (w[29], w[30], offset); w[29] = amd_bytealign (w[28], w[29], offset); w[28] = amd_bytealign (w[27], w[28], offset); w[27] = amd_bytealign (w[26], w[27], offset); w[26] = amd_bytealign (w[25], w[26], offset); w[25] = amd_bytealign (w[24], w[25], offset); w[24] = amd_bytealign (w[23], w[24], offset); w[23] = amd_bytealign (w[22], w[23], offset); w[22] = amd_bytealign (w[21], w[22], offset); w[21] = amd_bytealign (w[20], w[21], offset); w[20] = amd_bytealign (w[19], w[20], offset); w[19] = amd_bytealign (w[18], w[19], offset); w[18] = amd_bytealign (w[17], w[18], offset); w[17] = amd_bytealign (w[16], w[17], offset); w[16] = amd_bytealign (w[15], w[16], offset); w[15] = amd_bytealign (w[14], w[15], offset); w[14] = amd_bytealign (w[13], w[14], offset); w[13] = amd_bytealign (w[12], w[13], offset); w[12] = amd_bytealign (w[11], w[12], offset); w[11] = amd_bytealign (w[10], w[11], offset); w[10] = amd_bytealign (w[ 9], w[10], offset); w[ 9] = amd_bytealign (w[ 8], w[ 9], offset); w[ 8] = amd_bytealign (w[ 7], w[ 8], offset); w[ 7] = amd_bytealign (w[ 6], w[ 7], offset); w[ 6] = amd_bytealign (w[ 5], w[ 6], offset); w[ 5] = amd_bytealign (w[ 4], w[ 5], offset); w[ 4] = amd_bytealign (w[ 3], w[ 4], offset); w[ 3] = amd_bytealign (w[ 2], w[ 3], offset); w[ 2] = amd_bytealign (w[ 1], w[ 2], offset); w[ 1] = amd_bytealign (w[ 0], w[ 1], offset); w[ 0] = amd_bytealign ( 0, w[ 0], offset); break; case 1: w[63] = amd_bytealign (w[61], w[62], offset); w[62] = amd_bytealign (w[60], w[61], offset); w[61] = amd_bytealign (w[59], w[60], offset); w[60] = amd_bytealign (w[58], w[59], offset); w[59] = amd_bytealign (w[57], w[58], offset); w[58] = amd_bytealign (w[56], w[57], offset); w[57] = amd_bytealign (w[55], w[56], offset); w[56] = amd_bytealign (w[54], w[55], offset); w[55] = amd_bytealign (w[53], w[54], offset); w[54] = amd_bytealign (w[52], w[53], offset); w[53] = amd_bytealign (w[51], w[52], offset); w[52] = amd_bytealign (w[50], w[51], offset); w[51] = amd_bytealign (w[49], w[50], offset); w[50] = amd_bytealign (w[48], w[49], offset); w[49] = amd_bytealign (w[47], w[48], offset); w[48] = amd_bytealign (w[46], w[47], offset); w[47] = amd_bytealign (w[45], w[46], offset); w[46] = amd_bytealign (w[44], w[45], offset); w[45] = amd_bytealign (w[43], w[44], offset); w[44] = amd_bytealign (w[42], w[43], offset); w[43] = amd_bytealign (w[41], w[42], offset); w[42] = amd_bytealign (w[40], w[41], offset); w[41] = amd_bytealign (w[39], w[40], offset); w[40] = amd_bytealign (w[38], w[39], offset); w[39] = amd_bytealign (w[37], w[38], offset); w[38] = amd_bytealign (w[36], w[37], offset); w[37] = amd_bytealign (w[35], w[36], offset); w[36] = amd_bytealign (w[34], w[35], offset); w[35] = amd_bytealign (w[33], w[34], offset); w[34] = amd_bytealign (w[32], w[33], offset); w[33] = amd_bytealign (w[31], w[32], offset); w[32] = amd_bytealign (w[30], w[31], offset); w[31] = amd_bytealign (w[29], w[30], offset); w[30] = amd_bytealign (w[28], w[29], offset); w[29] = amd_bytealign (w[27], w[28], offset); w[28] = amd_bytealign (w[26], w[27], offset); w[27] = amd_bytealign (w[25], w[26], offset); w[26] = amd_bytealign (w[24], w[25], offset); w[25] = amd_bytealign (w[23], w[24], offset); w[24] = amd_bytealign (w[22], w[23], offset); w[23] = amd_bytealign (w[21], w[22], offset); w[22] = amd_bytealign (w[20], w[21], offset); w[21] = amd_bytealign (w[19], w[20], offset); w[20] = amd_bytealign (w[18], w[19], offset); w[19] = amd_bytealign (w[17], w[18], offset); w[18] = amd_bytealign (w[16], w[17], offset); w[17] = amd_bytealign (w[15], w[16], offset); w[16] = amd_bytealign (w[14], w[15], offset); w[15] = amd_bytealign (w[13], w[14], offset); w[14] = amd_bytealign (w[12], w[13], offset); w[13] = amd_bytealign (w[11], w[12], offset); w[12] = amd_bytealign (w[10], w[11], offset); w[11] = amd_bytealign (w[ 9], w[10], offset); w[10] = amd_bytealign (w[ 8], w[ 9], offset); w[ 9] = amd_bytealign (w[ 7], w[ 8], offset); w[ 8] = amd_bytealign (w[ 6], w[ 7], offset); w[ 7] = amd_bytealign (w[ 5], w[ 6], offset); w[ 6] = amd_bytealign (w[ 4], w[ 5], offset); w[ 5] = amd_bytealign (w[ 3], w[ 4], offset); w[ 4] = amd_bytealign (w[ 2], w[ 3], offset); w[ 3] = amd_bytealign (w[ 1], w[ 2], offset); w[ 2] = amd_bytealign (w[ 0], w[ 1], offset); w[ 1] = amd_bytealign ( 0, w[ 0], offset); w[ 0] = 0; break; case 2: w[63] = amd_bytealign (w[60], w[61], offset); w[62] = amd_bytealign (w[59], w[60], offset); w[61] = amd_bytealign (w[58], w[59], offset); w[60] = amd_bytealign (w[57], w[58], offset); w[59] = amd_bytealign (w[56], w[57], offset); w[58] = amd_bytealign (w[55], w[56], offset); w[57] = amd_bytealign (w[54], w[55], offset); w[56] = amd_bytealign (w[53], w[54], offset); w[55] = amd_bytealign (w[52], w[53], offset); w[54] = amd_bytealign (w[51], w[52], offset); w[53] = amd_bytealign (w[50], w[51], offset); w[52] = amd_bytealign (w[49], w[50], offset); w[51] = amd_bytealign (w[48], w[49], offset); w[50] = amd_bytealign (w[47], w[48], offset); w[49] = amd_bytealign (w[46], w[47], offset); w[48] = amd_bytealign (w[45], w[46], offset); w[47] = amd_bytealign (w[44], w[45], offset); w[46] = amd_bytealign (w[43], w[44], offset); w[45] = amd_bytealign (w[42], w[43], offset); w[44] = amd_bytealign (w[41], w[42], offset); w[43] = amd_bytealign (w[40], w[41], offset); w[42] = amd_bytealign (w[39], w[40], offset); w[41] = amd_bytealign (w[38], w[39], offset); w[40] = amd_bytealign (w[37], w[38], offset); w[39] = amd_bytealign (w[36], w[37], offset); w[38] = amd_bytealign (w[35], w[36], offset); w[37] = amd_bytealign (w[34], w[35], offset); w[36] = amd_bytealign (w[33], w[34], offset); w[35] = amd_bytealign (w[32], w[33], offset); w[34] = amd_bytealign (w[31], w[32], offset); w[33] = amd_bytealign (w[30], w[31], offset); w[32] = amd_bytealign (w[29], w[30], offset); w[31] = amd_bytealign (w[28], w[29], offset); w[30] = amd_bytealign (w[27], w[28], offset); w[29] = amd_bytealign (w[26], w[27], offset); w[28] = amd_bytealign (w[25], w[26], offset); w[27] = amd_bytealign (w[24], w[25], offset); w[26] = amd_bytealign (w[23], w[24], offset); w[25] = amd_bytealign (w[22], w[23], offset); w[24] = amd_bytealign (w[21], w[22], offset); w[23] = amd_bytealign (w[20], w[21], offset); w[22] = amd_bytealign (w[19], w[20], offset); w[21] = amd_bytealign (w[18], w[19], offset); w[20] = amd_bytealign (w[17], w[18], offset); w[19] = amd_bytealign (w[16], w[17], offset); w[18] = amd_bytealign (w[15], w[16], offset); w[17] = amd_bytealign (w[14], w[15], offset); w[16] = amd_bytealign (w[13], w[14], offset); w[15] = amd_bytealign (w[12], w[13], offset); w[14] = amd_bytealign (w[11], w[12], offset); w[13] = amd_bytealign (w[10], w[11], offset); w[12] = amd_bytealign (w[ 9], w[10], offset); w[11] = amd_bytealign (w[ 8], w[ 9], offset); w[10] = amd_bytealign (w[ 7], w[ 8], offset); w[ 9] = amd_bytealign (w[ 6], w[ 7], offset); w[ 8] = amd_bytealign (w[ 5], w[ 6], offset); w[ 7] = amd_bytealign (w[ 4], w[ 5], offset); w[ 6] = amd_bytealign (w[ 3], w[ 4], offset); w[ 5] = amd_bytealign (w[ 2], w[ 3], offset); w[ 4] = amd_bytealign (w[ 1], w[ 2], offset); w[ 3] = amd_bytealign (w[ 0], w[ 1], offset); w[ 2] = amd_bytealign ( 0, w[ 0], offset); w[ 1] = 0; w[ 0] = 0; break; case 3: w[63] = amd_bytealign (w[59], w[60], offset); w[62] = amd_bytealign (w[58], w[59], offset); w[61] = amd_bytealign (w[57], w[58], offset); w[60] = amd_bytealign (w[56], w[57], offset); w[59] = amd_bytealign (w[55], w[56], offset); w[58] = amd_bytealign (w[54], w[55], offset); w[57] = amd_bytealign (w[53], w[54], offset); w[56] = amd_bytealign (w[52], w[53], offset); w[55] = amd_bytealign (w[51], w[52], offset); w[54] = amd_bytealign (w[50], w[51], offset); w[53] = amd_bytealign (w[49], w[50], offset); w[52] = amd_bytealign (w[48], w[49], offset); w[51] = amd_bytealign (w[47], w[48], offset); w[50] = amd_bytealign (w[46], w[47], offset); w[49] = amd_bytealign (w[45], w[46], offset); w[48] = amd_bytealign (w[44], w[45], offset); w[47] = amd_bytealign (w[43], w[44], offset); w[46] = amd_bytealign (w[42], w[43], offset); w[45] = amd_bytealign (w[41], w[42], offset); w[44] = amd_bytealign (w[40], w[41], offset); w[43] = amd_bytealign (w[39], w[40], offset); w[42] = amd_bytealign (w[38], w[39], offset); w[41] = amd_bytealign (w[37], w[38], offset); w[40] = amd_bytealign (w[36], w[37], offset); w[39] = amd_bytealign (w[35], w[36], offset); w[38] = amd_bytealign (w[34], w[35], offset); w[37] = amd_bytealign (w[33], w[34], offset); w[36] = amd_bytealign (w[32], w[33], offset); w[35] = amd_bytealign (w[31], w[32], offset); w[34] = amd_bytealign (w[30], w[31], offset); w[33] = amd_bytealign (w[29], w[30], offset); w[32] = amd_bytealign (w[28], w[29], offset); w[31] = amd_bytealign (w[27], w[28], offset); w[30] = amd_bytealign (w[26], w[27], offset); w[29] = amd_bytealign (w[25], w[26], offset); w[28] = amd_bytealign (w[24], w[25], offset); w[27] = amd_bytealign (w[23], w[24], offset); w[26] = amd_bytealign (w[22], w[23], offset); w[25] = amd_bytealign (w[21], w[22], offset); w[24] = amd_bytealign (w[20], w[21], offset); w[23] = amd_bytealign (w[19], w[20], offset); w[22] = amd_bytealign (w[18], w[19], offset); w[21] = amd_bytealign (w[17], w[18], offset); w[20] = amd_bytealign (w[16], w[17], offset); w[19] = amd_bytealign (w[15], w[16], offset); w[18] = amd_bytealign (w[14], w[15], offset); w[17] = amd_bytealign (w[13], w[14], offset); w[16] = amd_bytealign (w[12], w[13], offset); w[15] = amd_bytealign (w[11], w[12], offset); w[14] = amd_bytealign (w[10], w[11], offset); w[13] = amd_bytealign (w[ 9], w[10], offset); w[12] = amd_bytealign (w[ 8], w[ 9], offset); w[11] = amd_bytealign (w[ 7], w[ 8], offset); w[10] = amd_bytealign (w[ 6], w[ 7], offset); w[ 9] = amd_bytealign (w[ 5], w[ 6], offset); w[ 8] = amd_bytealign (w[ 4], w[ 5], offset); w[ 7] = amd_bytealign (w[ 3], w[ 4], offset); w[ 6] = amd_bytealign (w[ 2], w[ 3], offset); w[ 5] = amd_bytealign (w[ 1], w[ 2], offset); w[ 4] = amd_bytealign (w[ 0], w[ 1], offset); w[ 3] = amd_bytealign ( 0, w[ 0], offset); w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 4: w[63] = amd_bytealign (w[58], w[59], offset); w[62] = amd_bytealign (w[57], w[58], offset); w[61] = amd_bytealign (w[56], w[57], offset); w[60] = amd_bytealign (w[55], w[56], offset); w[59] = amd_bytealign (w[54], w[55], offset); w[58] = amd_bytealign (w[53], w[54], offset); w[57] = amd_bytealign (w[52], w[53], offset); w[56] = amd_bytealign (w[51], w[52], offset); w[55] = amd_bytealign (w[50], w[51], offset); w[54] = amd_bytealign (w[49], w[50], offset); w[53] = amd_bytealign (w[48], w[49], offset); w[52] = amd_bytealign (w[47], w[48], offset); w[51] = amd_bytealign (w[46], w[47], offset); w[50] = amd_bytealign (w[45], w[46], offset); w[49] = amd_bytealign (w[44], w[45], offset); w[48] = amd_bytealign (w[43], w[44], offset); w[47] = amd_bytealign (w[42], w[43], offset); w[46] = amd_bytealign (w[41], w[42], offset); w[45] = amd_bytealign (w[40], w[41], offset); w[44] = amd_bytealign (w[39], w[40], offset); w[43] = amd_bytealign (w[38], w[39], offset); w[42] = amd_bytealign (w[37], w[38], offset); w[41] = amd_bytealign (w[36], w[37], offset); w[40] = amd_bytealign (w[35], w[36], offset); w[39] = amd_bytealign (w[34], w[35], offset); w[38] = amd_bytealign (w[33], w[34], offset); w[37] = amd_bytealign (w[32], w[33], offset); w[36] = amd_bytealign (w[31], w[32], offset); w[35] = amd_bytealign (w[30], w[31], offset); w[34] = amd_bytealign (w[29], w[30], offset); w[33] = amd_bytealign (w[28], w[29], offset); w[32] = amd_bytealign (w[27], w[28], offset); w[31] = amd_bytealign (w[26], w[27], offset); w[30] = amd_bytealign (w[25], w[26], offset); w[29] = amd_bytealign (w[24], w[25], offset); w[28] = amd_bytealign (w[23], w[24], offset); w[27] = amd_bytealign (w[22], w[23], offset); w[26] = amd_bytealign (w[21], w[22], offset); w[25] = amd_bytealign (w[20], w[21], offset); w[24] = amd_bytealign (w[19], w[20], offset); w[23] = amd_bytealign (w[18], w[19], offset); w[22] = amd_bytealign (w[17], w[18], offset); w[21] = amd_bytealign (w[16], w[17], offset); w[20] = amd_bytealign (w[15], w[16], offset); w[19] = amd_bytealign (w[14], w[15], offset); w[18] = amd_bytealign (w[13], w[14], offset); w[17] = amd_bytealign (w[12], w[13], offset); w[16] = amd_bytealign (w[11], w[12], offset); w[15] = amd_bytealign (w[10], w[11], offset); w[14] = amd_bytealign (w[ 9], w[10], offset); w[13] = amd_bytealign (w[ 8], w[ 9], offset); w[12] = amd_bytealign (w[ 7], w[ 8], offset); w[11] = amd_bytealign (w[ 6], w[ 7], offset); w[10] = amd_bytealign (w[ 5], w[ 6], offset); w[ 9] = amd_bytealign (w[ 4], w[ 5], offset); w[ 8] = amd_bytealign (w[ 3], w[ 4], offset); w[ 7] = amd_bytealign (w[ 2], w[ 3], offset); w[ 6] = amd_bytealign (w[ 1], w[ 2], offset); w[ 5] = amd_bytealign (w[ 0], w[ 1], offset); w[ 4] = amd_bytealign ( 0, w[ 0], offset); w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 5: w[63] = amd_bytealign (w[57], w[58], offset); w[62] = amd_bytealign (w[56], w[57], offset); w[61] = amd_bytealign (w[55], w[56], offset); w[60] = amd_bytealign (w[54], w[55], offset); w[59] = amd_bytealign (w[53], w[54], offset); w[58] = amd_bytealign (w[52], w[53], offset); w[57] = amd_bytealign (w[51], w[52], offset); w[56] = amd_bytealign (w[50], w[51], offset); w[55] = amd_bytealign (w[49], w[50], offset); w[54] = amd_bytealign (w[48], w[49], offset); w[53] = amd_bytealign (w[47], w[48], offset); w[52] = amd_bytealign (w[46], w[47], offset); w[51] = amd_bytealign (w[45], w[46], offset); w[50] = amd_bytealign (w[44], w[45], offset); w[49] = amd_bytealign (w[43], w[44], offset); w[48] = amd_bytealign (w[42], w[43], offset); w[47] = amd_bytealign (w[41], w[42], offset); w[46] = amd_bytealign (w[40], w[41], offset); w[45] = amd_bytealign (w[39], w[40], offset); w[44] = amd_bytealign (w[38], w[39], offset); w[43] = amd_bytealign (w[37], w[38], offset); w[42] = amd_bytealign (w[36], w[37], offset); w[41] = amd_bytealign (w[35], w[36], offset); w[40] = amd_bytealign (w[34], w[35], offset); w[39] = amd_bytealign (w[33], w[34], offset); w[38] = amd_bytealign (w[32], w[33], offset); w[37] = amd_bytealign (w[31], w[32], offset); w[36] = amd_bytealign (w[30], w[31], offset); w[35] = amd_bytealign (w[29], w[30], offset); w[34] = amd_bytealign (w[28], w[29], offset); w[33] = amd_bytealign (w[27], w[28], offset); w[32] = amd_bytealign (w[26], w[27], offset); w[31] = amd_bytealign (w[25], w[26], offset); w[30] = amd_bytealign (w[24], w[25], offset); w[29] = amd_bytealign (w[23], w[24], offset); w[28] = amd_bytealign (w[22], w[23], offset); w[27] = amd_bytealign (w[21], w[22], offset); w[26] = amd_bytealign (w[20], w[21], offset); w[25] = amd_bytealign (w[19], w[20], offset); w[24] = amd_bytealign (w[18], w[19], offset); w[23] = amd_bytealign (w[17], w[18], offset); w[22] = amd_bytealign (w[16], w[17], offset); w[21] = amd_bytealign (w[15], w[16], offset); w[20] = amd_bytealign (w[14], w[15], offset); w[19] = amd_bytealign (w[13], w[14], offset); w[18] = amd_bytealign (w[12], w[13], offset); w[17] = amd_bytealign (w[11], w[12], offset); w[16] = amd_bytealign (w[10], w[11], offset); w[15] = amd_bytealign (w[ 9], w[10], offset); w[14] = amd_bytealign (w[ 8], w[ 9], offset); w[13] = amd_bytealign (w[ 7], w[ 8], offset); w[12] = amd_bytealign (w[ 6], w[ 7], offset); w[11] = amd_bytealign (w[ 5], w[ 6], offset); w[10] = amd_bytealign (w[ 4], w[ 5], offset); w[ 9] = amd_bytealign (w[ 3], w[ 4], offset); w[ 8] = amd_bytealign (w[ 2], w[ 3], offset); w[ 7] = amd_bytealign (w[ 1], w[ 2], offset); w[ 6] = amd_bytealign (w[ 0], w[ 1], offset); w[ 5] = amd_bytealign ( 0, w[ 0], offset); w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 6: w[63] = amd_bytealign (w[56], w[57], offset); w[62] = amd_bytealign (w[55], w[56], offset); w[61] = amd_bytealign (w[54], w[55], offset); w[60] = amd_bytealign (w[53], w[54], offset); w[59] = amd_bytealign (w[52], w[53], offset); w[58] = amd_bytealign (w[51], w[52], offset); w[57] = amd_bytealign (w[50], w[51], offset); w[56] = amd_bytealign (w[49], w[50], offset); w[55] = amd_bytealign (w[48], w[49], offset); w[54] = amd_bytealign (w[47], w[48], offset); w[53] = amd_bytealign (w[46], w[47], offset); w[52] = amd_bytealign (w[45], w[46], offset); w[51] = amd_bytealign (w[44], w[45], offset); w[50] = amd_bytealign (w[43], w[44], offset); w[49] = amd_bytealign (w[42], w[43], offset); w[48] = amd_bytealign (w[41], w[42], offset); w[47] = amd_bytealign (w[40], w[41], offset); w[46] = amd_bytealign (w[39], w[40], offset); w[45] = amd_bytealign (w[38], w[39], offset); w[44] = amd_bytealign (w[37], w[38], offset); w[43] = amd_bytealign (w[36], w[37], offset); w[42] = amd_bytealign (w[35], w[36], offset); w[41] = amd_bytealign (w[34], w[35], offset); w[40] = amd_bytealign (w[33], w[34], offset); w[39] = amd_bytealign (w[32], w[33], offset); w[38] = amd_bytealign (w[31], w[32], offset); w[37] = amd_bytealign (w[30], w[31], offset); w[36] = amd_bytealign (w[29], w[30], offset); w[35] = amd_bytealign (w[28], w[29], offset); w[34] = amd_bytealign (w[27], w[28], offset); w[33] = amd_bytealign (w[26], w[27], offset); w[32] = amd_bytealign (w[25], w[26], offset); w[31] = amd_bytealign (w[24], w[25], offset); w[30] = amd_bytealign (w[23], w[24], offset); w[29] = amd_bytealign (w[22], w[23], offset); w[28] = amd_bytealign (w[21], w[22], offset); w[27] = amd_bytealign (w[20], w[21], offset); w[26] = amd_bytealign (w[19], w[20], offset); w[25] = amd_bytealign (w[18], w[19], offset); w[24] = amd_bytealign (w[17], w[18], offset); w[23] = amd_bytealign (w[16], w[17], offset); w[22] = amd_bytealign (w[15], w[16], offset); w[21] = amd_bytealign (w[14], w[15], offset); w[20] = amd_bytealign (w[13], w[14], offset); w[19] = amd_bytealign (w[12], w[13], offset); w[18] = amd_bytealign (w[11], w[12], offset); w[17] = amd_bytealign (w[10], w[11], offset); w[16] = amd_bytealign (w[ 9], w[10], offset); w[15] = amd_bytealign (w[ 8], w[ 9], offset); w[14] = amd_bytealign (w[ 7], w[ 8], offset); w[13] = amd_bytealign (w[ 6], w[ 7], offset); w[12] = amd_bytealign (w[ 5], w[ 6], offset); w[11] = amd_bytealign (w[ 4], w[ 5], offset); w[10] = amd_bytealign (w[ 3], w[ 4], offset); w[ 9] = amd_bytealign (w[ 2], w[ 3], offset); w[ 8] = amd_bytealign (w[ 1], w[ 2], offset); w[ 7] = amd_bytealign (w[ 0], w[ 1], offset); w[ 6] = amd_bytealign ( 0, w[ 0], offset); w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 7: w[63] = amd_bytealign (w[55], w[56], offset); w[62] = amd_bytealign (w[54], w[55], offset); w[61] = amd_bytealign (w[53], w[54], offset); w[60] = amd_bytealign (w[52], w[53], offset); w[59] = amd_bytealign (w[51], w[52], offset); w[58] = amd_bytealign (w[50], w[51], offset); w[57] = amd_bytealign (w[49], w[50], offset); w[56] = amd_bytealign (w[48], w[49], offset); w[55] = amd_bytealign (w[47], w[48], offset); w[54] = amd_bytealign (w[46], w[47], offset); w[53] = amd_bytealign (w[45], w[46], offset); w[52] = amd_bytealign (w[44], w[45], offset); w[51] = amd_bytealign (w[43], w[44], offset); w[50] = amd_bytealign (w[42], w[43], offset); w[49] = amd_bytealign (w[41], w[42], offset); w[48] = amd_bytealign (w[40], w[41], offset); w[47] = amd_bytealign (w[39], w[40], offset); w[46] = amd_bytealign (w[38], w[39], offset); w[45] = amd_bytealign (w[37], w[38], offset); w[44] = amd_bytealign (w[36], w[37], offset); w[43] = amd_bytealign (w[35], w[36], offset); w[42] = amd_bytealign (w[34], w[35], offset); w[41] = amd_bytealign (w[33], w[34], offset); w[40] = amd_bytealign (w[32], w[33], offset); w[39] = amd_bytealign (w[31], w[32], offset); w[38] = amd_bytealign (w[30], w[31], offset); w[37] = amd_bytealign (w[29], w[30], offset); w[36] = amd_bytealign (w[28], w[29], offset); w[35] = amd_bytealign (w[27], w[28], offset); w[34] = amd_bytealign (w[26], w[27], offset); w[33] = amd_bytealign (w[25], w[26], offset); w[32] = amd_bytealign (w[24], w[25], offset); w[31] = amd_bytealign (w[23], w[24], offset); w[30] = amd_bytealign (w[22], w[23], offset); w[29] = amd_bytealign (w[21], w[22], offset); w[28] = amd_bytealign (w[20], w[21], offset); w[27] = amd_bytealign (w[19], w[20], offset); w[26] = amd_bytealign (w[18], w[19], offset); w[25] = amd_bytealign (w[17], w[18], offset); w[24] = amd_bytealign (w[16], w[17], offset); w[23] = amd_bytealign (w[15], w[16], offset); w[22] = amd_bytealign (w[14], w[15], offset); w[21] = amd_bytealign (w[13], w[14], offset); w[20] = amd_bytealign (w[12], w[13], offset); w[19] = amd_bytealign (w[11], w[12], offset); w[18] = amd_bytealign (w[10], w[11], offset); w[17] = amd_bytealign (w[ 9], w[10], offset); w[16] = amd_bytealign (w[ 8], w[ 9], offset); w[15] = amd_bytealign (w[ 7], w[ 8], offset); w[14] = amd_bytealign (w[ 6], w[ 7], offset); w[13] = amd_bytealign (w[ 5], w[ 6], offset); w[12] = amd_bytealign (w[ 4], w[ 5], offset); w[11] = amd_bytealign (w[ 3], w[ 4], offset); w[10] = amd_bytealign (w[ 2], w[ 3], offset); w[ 9] = amd_bytealign (w[ 1], w[ 2], offset); w[ 8] = amd_bytealign (w[ 0], w[ 1], offset); w[ 7] = amd_bytealign ( 0, w[ 0], offset); w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 8: w[63] = amd_bytealign (w[54], w[55], offset); w[62] = amd_bytealign (w[53], w[54], offset); w[61] = amd_bytealign (w[52], w[53], offset); w[60] = amd_bytealign (w[51], w[52], offset); w[59] = amd_bytealign (w[50], w[51], offset); w[58] = amd_bytealign (w[49], w[50], offset); w[57] = amd_bytealign (w[48], w[49], offset); w[56] = amd_bytealign (w[47], w[48], offset); w[55] = amd_bytealign (w[46], w[47], offset); w[54] = amd_bytealign (w[45], w[46], offset); w[53] = amd_bytealign (w[44], w[45], offset); w[52] = amd_bytealign (w[43], w[44], offset); w[51] = amd_bytealign (w[42], w[43], offset); w[50] = amd_bytealign (w[41], w[42], offset); w[49] = amd_bytealign (w[40], w[41], offset); w[48] = amd_bytealign (w[39], w[40], offset); w[47] = amd_bytealign (w[38], w[39], offset); w[46] = amd_bytealign (w[37], w[38], offset); w[45] = amd_bytealign (w[36], w[37], offset); w[44] = amd_bytealign (w[35], w[36], offset); w[43] = amd_bytealign (w[34], w[35], offset); w[42] = amd_bytealign (w[33], w[34], offset); w[41] = amd_bytealign (w[32], w[33], offset); w[40] = amd_bytealign (w[31], w[32], offset); w[39] = amd_bytealign (w[30], w[31], offset); w[38] = amd_bytealign (w[29], w[30], offset); w[37] = amd_bytealign (w[28], w[29], offset); w[36] = amd_bytealign (w[27], w[28], offset); w[35] = amd_bytealign (w[26], w[27], offset); w[34] = amd_bytealign (w[25], w[26], offset); w[33] = amd_bytealign (w[24], w[25], offset); w[32] = amd_bytealign (w[23], w[24], offset); w[31] = amd_bytealign (w[22], w[23], offset); w[30] = amd_bytealign (w[21], w[22], offset); w[29] = amd_bytealign (w[20], w[21], offset); w[28] = amd_bytealign (w[19], w[20], offset); w[27] = amd_bytealign (w[18], w[19], offset); w[26] = amd_bytealign (w[17], w[18], offset); w[25] = amd_bytealign (w[16], w[17], offset); w[24] = amd_bytealign (w[15], w[16], offset); w[23] = amd_bytealign (w[14], w[15], offset); w[22] = amd_bytealign (w[13], w[14], offset); w[21] = amd_bytealign (w[12], w[13], offset); w[20] = amd_bytealign (w[11], w[12], offset); w[19] = amd_bytealign (w[10], w[11], offset); w[18] = amd_bytealign (w[ 9], w[10], offset); w[17] = amd_bytealign (w[ 8], w[ 9], offset); w[16] = amd_bytealign (w[ 7], w[ 8], offset); w[15] = amd_bytealign (w[ 6], w[ 7], offset); w[14] = amd_bytealign (w[ 5], w[ 6], offset); w[13] = amd_bytealign (w[ 4], w[ 5], offset); w[12] = amd_bytealign (w[ 3], w[ 4], offset); w[11] = amd_bytealign (w[ 2], w[ 3], offset); w[10] = amd_bytealign (w[ 1], w[ 2], offset); w[ 9] = amd_bytealign (w[ 0], w[ 1], offset); w[ 8] = amd_bytealign ( 0, w[ 0], offset); w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 9: w[63] = amd_bytealign (w[53], w[54], offset); w[62] = amd_bytealign (w[52], w[53], offset); w[61] = amd_bytealign (w[51], w[52], offset); w[60] = amd_bytealign (w[50], w[51], offset); w[59] = amd_bytealign (w[49], w[50], offset); w[58] = amd_bytealign (w[48], w[49], offset); w[57] = amd_bytealign (w[47], w[48], offset); w[56] = amd_bytealign (w[46], w[47], offset); w[55] = amd_bytealign (w[45], w[46], offset); w[54] = amd_bytealign (w[44], w[45], offset); w[53] = amd_bytealign (w[43], w[44], offset); w[52] = amd_bytealign (w[42], w[43], offset); w[51] = amd_bytealign (w[41], w[42], offset); w[50] = amd_bytealign (w[40], w[41], offset); w[49] = amd_bytealign (w[39], w[40], offset); w[48] = amd_bytealign (w[38], w[39], offset); w[47] = amd_bytealign (w[37], w[38], offset); w[46] = amd_bytealign (w[36], w[37], offset); w[45] = amd_bytealign (w[35], w[36], offset); w[44] = amd_bytealign (w[34], w[35], offset); w[43] = amd_bytealign (w[33], w[34], offset); w[42] = amd_bytealign (w[32], w[33], offset); w[41] = amd_bytealign (w[31], w[32], offset); w[40] = amd_bytealign (w[30], w[31], offset); w[39] = amd_bytealign (w[29], w[30], offset); w[38] = amd_bytealign (w[28], w[29], offset); w[37] = amd_bytealign (w[27], w[28], offset); w[36] = amd_bytealign (w[26], w[27], offset); w[35] = amd_bytealign (w[25], w[26], offset); w[34] = amd_bytealign (w[24], w[25], offset); w[33] = amd_bytealign (w[23], w[24], offset); w[32] = amd_bytealign (w[22], w[23], offset); w[31] = amd_bytealign (w[21], w[22], offset); w[30] = amd_bytealign (w[20], w[21], offset); w[29] = amd_bytealign (w[19], w[20], offset); w[28] = amd_bytealign (w[18], w[19], offset); w[27] = amd_bytealign (w[17], w[18], offset); w[26] = amd_bytealign (w[16], w[17], offset); w[25] = amd_bytealign (w[15], w[16], offset); w[24] = amd_bytealign (w[14], w[15], offset); w[23] = amd_bytealign (w[13], w[14], offset); w[22] = amd_bytealign (w[12], w[13], offset); w[21] = amd_bytealign (w[11], w[12], offset); w[20] = amd_bytealign (w[10], w[11], offset); w[19] = amd_bytealign (w[ 9], w[10], offset); w[18] = amd_bytealign (w[ 8], w[ 9], offset); w[17] = amd_bytealign (w[ 7], w[ 8], offset); w[16] = amd_bytealign (w[ 6], w[ 7], offset); w[15] = amd_bytealign (w[ 5], w[ 6], offset); w[14] = amd_bytealign (w[ 4], w[ 5], offset); w[13] = amd_bytealign (w[ 3], w[ 4], offset); w[12] = amd_bytealign (w[ 2], w[ 3], offset); w[11] = amd_bytealign (w[ 1], w[ 2], offset); w[10] = amd_bytealign (w[ 0], w[ 1], offset); w[ 9] = amd_bytealign ( 0, w[ 0], offset); w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 10: w[63] = amd_bytealign (w[52], w[53], offset); w[62] = amd_bytealign (w[51], w[52], offset); w[61] = amd_bytealign (w[50], w[51], offset); w[60] = amd_bytealign (w[49], w[50], offset); w[59] = amd_bytealign (w[48], w[49], offset); w[58] = amd_bytealign (w[47], w[48], offset); w[57] = amd_bytealign (w[46], w[47], offset); w[56] = amd_bytealign (w[45], w[46], offset); w[55] = amd_bytealign (w[44], w[45], offset); w[54] = amd_bytealign (w[43], w[44], offset); w[53] = amd_bytealign (w[42], w[43], offset); w[52] = amd_bytealign (w[41], w[42], offset); w[51] = amd_bytealign (w[40], w[41], offset); w[50] = amd_bytealign (w[39], w[40], offset); w[49] = amd_bytealign (w[38], w[39], offset); w[48] = amd_bytealign (w[37], w[38], offset); w[47] = amd_bytealign (w[36], w[37], offset); w[46] = amd_bytealign (w[35], w[36], offset); w[45] = amd_bytealign (w[34], w[35], offset); w[44] = amd_bytealign (w[33], w[34], offset); w[43] = amd_bytealign (w[32], w[33], offset); w[42] = amd_bytealign (w[31], w[32], offset); w[41] = amd_bytealign (w[30], w[31], offset); w[40] = amd_bytealign (w[29], w[30], offset); w[39] = amd_bytealign (w[28], w[29], offset); w[38] = amd_bytealign (w[27], w[28], offset); w[37] = amd_bytealign (w[26], w[27], offset); w[36] = amd_bytealign (w[25], w[26], offset); w[35] = amd_bytealign (w[24], w[25], offset); w[34] = amd_bytealign (w[23], w[24], offset); w[33] = amd_bytealign (w[22], w[23], offset); w[32] = amd_bytealign (w[21], w[22], offset); w[31] = amd_bytealign (w[20], w[21], offset); w[30] = amd_bytealign (w[19], w[20], offset); w[29] = amd_bytealign (w[18], w[19], offset); w[28] = amd_bytealign (w[17], w[18], offset); w[27] = amd_bytealign (w[16], w[17], offset); w[26] = amd_bytealign (w[15], w[16], offset); w[25] = amd_bytealign (w[14], w[15], offset); w[24] = amd_bytealign (w[13], w[14], offset); w[23] = amd_bytealign (w[12], w[13], offset); w[22] = amd_bytealign (w[11], w[12], offset); w[21] = amd_bytealign (w[10], w[11], offset); w[20] = amd_bytealign (w[ 9], w[10], offset); w[19] = amd_bytealign (w[ 8], w[ 9], offset); w[18] = amd_bytealign (w[ 7], w[ 8], offset); w[17] = amd_bytealign (w[ 6], w[ 7], offset); w[16] = amd_bytealign (w[ 5], w[ 6], offset); w[15] = amd_bytealign (w[ 4], w[ 5], offset); w[14] = amd_bytealign (w[ 3], w[ 4], offset); w[13] = amd_bytealign (w[ 2], w[ 3], offset); w[12] = amd_bytealign (w[ 1], w[ 2], offset); w[11] = amd_bytealign (w[ 0], w[ 1], offset); w[10] = amd_bytealign ( 0, w[ 0], offset); w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 11: w[63] = amd_bytealign (w[51], w[52], offset); w[62] = amd_bytealign (w[50], w[51], offset); w[61] = amd_bytealign (w[49], w[50], offset); w[60] = amd_bytealign (w[48], w[49], offset); w[59] = amd_bytealign (w[47], w[48], offset); w[58] = amd_bytealign (w[46], w[47], offset); w[57] = amd_bytealign (w[45], w[46], offset); w[56] = amd_bytealign (w[44], w[45], offset); w[55] = amd_bytealign (w[43], w[44], offset); w[54] = amd_bytealign (w[42], w[43], offset); w[53] = amd_bytealign (w[41], w[42], offset); w[52] = amd_bytealign (w[40], w[41], offset); w[51] = amd_bytealign (w[39], w[40], offset); w[50] = amd_bytealign (w[38], w[39], offset); w[49] = amd_bytealign (w[37], w[38], offset); w[48] = amd_bytealign (w[36], w[37], offset); w[47] = amd_bytealign (w[35], w[36], offset); w[46] = amd_bytealign (w[34], w[35], offset); w[45] = amd_bytealign (w[33], w[34], offset); w[44] = amd_bytealign (w[32], w[33], offset); w[43] = amd_bytealign (w[31], w[32], offset); w[42] = amd_bytealign (w[30], w[31], offset); w[41] = amd_bytealign (w[29], w[30], offset); w[40] = amd_bytealign (w[28], w[29], offset); w[39] = amd_bytealign (w[27], w[28], offset); w[38] = amd_bytealign (w[26], w[27], offset); w[37] = amd_bytealign (w[25], w[26], offset); w[36] = amd_bytealign (w[24], w[25], offset); w[35] = amd_bytealign (w[23], w[24], offset); w[34] = amd_bytealign (w[22], w[23], offset); w[33] = amd_bytealign (w[21], w[22], offset); w[32] = amd_bytealign (w[20], w[21], offset); w[31] = amd_bytealign (w[19], w[20], offset); w[30] = amd_bytealign (w[18], w[19], offset); w[29] = amd_bytealign (w[17], w[18], offset); w[28] = amd_bytealign (w[16], w[17], offset); w[27] = amd_bytealign (w[15], w[16], offset); w[26] = amd_bytealign (w[14], w[15], offset); w[25] = amd_bytealign (w[13], w[14], offset); w[24] = amd_bytealign (w[12], w[13], offset); w[23] = amd_bytealign (w[11], w[12], offset); w[22] = amd_bytealign (w[10], w[11], offset); w[21] = amd_bytealign (w[ 9], w[10], offset); w[20] = amd_bytealign (w[ 8], w[ 9], offset); w[19] = amd_bytealign (w[ 7], w[ 8], offset); w[18] = amd_bytealign (w[ 6], w[ 7], offset); w[17] = amd_bytealign (w[ 5], w[ 6], offset); w[16] = amd_bytealign (w[ 4], w[ 5], offset); w[15] = amd_bytealign (w[ 3], w[ 4], offset); w[14] = amd_bytealign (w[ 2], w[ 3], offset); w[13] = amd_bytealign (w[ 1], w[ 2], offset); w[12] = amd_bytealign (w[ 0], w[ 1], offset); w[11] = amd_bytealign ( 0, w[ 0], offset); w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 12: w[63] = amd_bytealign (w[50], w[51], offset); w[62] = amd_bytealign (w[49], w[50], offset); w[61] = amd_bytealign (w[48], w[49], offset); w[60] = amd_bytealign (w[47], w[48], offset); w[59] = amd_bytealign (w[46], w[47], offset); w[58] = amd_bytealign (w[45], w[46], offset); w[57] = amd_bytealign (w[44], w[45], offset); w[56] = amd_bytealign (w[43], w[44], offset); w[55] = amd_bytealign (w[42], w[43], offset); w[54] = amd_bytealign (w[41], w[42], offset); w[53] = amd_bytealign (w[40], w[41], offset); w[52] = amd_bytealign (w[39], w[40], offset); w[51] = amd_bytealign (w[38], w[39], offset); w[50] = amd_bytealign (w[37], w[38], offset); w[49] = amd_bytealign (w[36], w[37], offset); w[48] = amd_bytealign (w[35], w[36], offset); w[47] = amd_bytealign (w[34], w[35], offset); w[46] = amd_bytealign (w[33], w[34], offset); w[45] = amd_bytealign (w[32], w[33], offset); w[44] = amd_bytealign (w[31], w[32], offset); w[43] = amd_bytealign (w[30], w[31], offset); w[42] = amd_bytealign (w[29], w[30], offset); w[41] = amd_bytealign (w[28], w[29], offset); w[40] = amd_bytealign (w[27], w[28], offset); w[39] = amd_bytealign (w[26], w[27], offset); w[38] = amd_bytealign (w[25], w[26], offset); w[37] = amd_bytealign (w[24], w[25], offset); w[36] = amd_bytealign (w[23], w[24], offset); w[35] = amd_bytealign (w[22], w[23], offset); w[34] = amd_bytealign (w[21], w[22], offset); w[33] = amd_bytealign (w[20], w[21], offset); w[32] = amd_bytealign (w[19], w[20], offset); w[31] = amd_bytealign (w[18], w[19], offset); w[30] = amd_bytealign (w[17], w[18], offset); w[29] = amd_bytealign (w[16], w[17], offset); w[28] = amd_bytealign (w[15], w[16], offset); w[27] = amd_bytealign (w[14], w[15], offset); w[26] = amd_bytealign (w[13], w[14], offset); w[25] = amd_bytealign (w[12], w[13], offset); w[24] = amd_bytealign (w[11], w[12], offset); w[23] = amd_bytealign (w[10], w[11], offset); w[22] = amd_bytealign (w[ 9], w[10], offset); w[21] = amd_bytealign (w[ 8], w[ 9], offset); w[20] = amd_bytealign (w[ 7], w[ 8], offset); w[19] = amd_bytealign (w[ 6], w[ 7], offset); w[18] = amd_bytealign (w[ 5], w[ 6], offset); w[17] = amd_bytealign (w[ 4], w[ 5], offset); w[16] = amd_bytealign (w[ 3], w[ 4], offset); w[15] = amd_bytealign (w[ 2], w[ 3], offset); w[14] = amd_bytealign (w[ 1], w[ 2], offset); w[13] = amd_bytealign (w[ 0], w[ 1], offset); w[12] = amd_bytealign ( 0, w[ 0], offset); w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 13: w[63] = amd_bytealign (w[49], w[50], offset); w[62] = amd_bytealign (w[48], w[49], offset); w[61] = amd_bytealign (w[47], w[48], offset); w[60] = amd_bytealign (w[46], w[47], offset); w[59] = amd_bytealign (w[45], w[46], offset); w[58] = amd_bytealign (w[44], w[45], offset); w[57] = amd_bytealign (w[43], w[44], offset); w[56] = amd_bytealign (w[42], w[43], offset); w[55] = amd_bytealign (w[41], w[42], offset); w[54] = amd_bytealign (w[40], w[41], offset); w[53] = amd_bytealign (w[39], w[40], offset); w[52] = amd_bytealign (w[38], w[39], offset); w[51] = amd_bytealign (w[37], w[38], offset); w[50] = amd_bytealign (w[36], w[37], offset); w[49] = amd_bytealign (w[35], w[36], offset); w[48] = amd_bytealign (w[34], w[35], offset); w[47] = amd_bytealign (w[33], w[34], offset); w[46] = amd_bytealign (w[32], w[33], offset); w[45] = amd_bytealign (w[31], w[32], offset); w[44] = amd_bytealign (w[30], w[31], offset); w[43] = amd_bytealign (w[29], w[30], offset); w[42] = amd_bytealign (w[28], w[29], offset); w[41] = amd_bytealign (w[27], w[28], offset); w[40] = amd_bytealign (w[26], w[27], offset); w[39] = amd_bytealign (w[25], w[26], offset); w[38] = amd_bytealign (w[24], w[25], offset); w[37] = amd_bytealign (w[23], w[24], offset); w[36] = amd_bytealign (w[22], w[23], offset); w[35] = amd_bytealign (w[21], w[22], offset); w[34] = amd_bytealign (w[20], w[21], offset); w[33] = amd_bytealign (w[19], w[20], offset); w[32] = amd_bytealign (w[18], w[19], offset); w[31] = amd_bytealign (w[17], w[18], offset); w[30] = amd_bytealign (w[16], w[17], offset); w[29] = amd_bytealign (w[15], w[16], offset); w[28] = amd_bytealign (w[14], w[15], offset); w[27] = amd_bytealign (w[13], w[14], offset); w[26] = amd_bytealign (w[12], w[13], offset); w[25] = amd_bytealign (w[11], w[12], offset); w[24] = amd_bytealign (w[10], w[11], offset); w[23] = amd_bytealign (w[ 9], w[10], offset); w[22] = amd_bytealign (w[ 8], w[ 9], offset); w[21] = amd_bytealign (w[ 7], w[ 8], offset); w[20] = amd_bytealign (w[ 6], w[ 7], offset); w[19] = amd_bytealign (w[ 5], w[ 6], offset); w[18] = amd_bytealign (w[ 4], w[ 5], offset); w[17] = amd_bytealign (w[ 3], w[ 4], offset); w[16] = amd_bytealign (w[ 2], w[ 3], offset); w[15] = amd_bytealign (w[ 1], w[ 2], offset); w[14] = amd_bytealign (w[ 0], w[ 1], offset); w[13] = amd_bytealign ( 0, w[ 0], offset); w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 14: w[63] = amd_bytealign (w[48], w[49], offset); w[62] = amd_bytealign (w[47], w[48], offset); w[61] = amd_bytealign (w[46], w[47], offset); w[60] = amd_bytealign (w[45], w[46], offset); w[59] = amd_bytealign (w[44], w[45], offset); w[58] = amd_bytealign (w[43], w[44], offset); w[57] = amd_bytealign (w[42], w[43], offset); w[56] = amd_bytealign (w[41], w[42], offset); w[55] = amd_bytealign (w[40], w[41], offset); w[54] = amd_bytealign (w[39], w[40], offset); w[53] = amd_bytealign (w[38], w[39], offset); w[52] = amd_bytealign (w[37], w[38], offset); w[51] = amd_bytealign (w[36], w[37], offset); w[50] = amd_bytealign (w[35], w[36], offset); w[49] = amd_bytealign (w[34], w[35], offset); w[48] = amd_bytealign (w[33], w[34], offset); w[47] = amd_bytealign (w[32], w[33], offset); w[46] = amd_bytealign (w[31], w[32], offset); w[45] = amd_bytealign (w[30], w[31], offset); w[44] = amd_bytealign (w[29], w[30], offset); w[43] = amd_bytealign (w[28], w[29], offset); w[42] = amd_bytealign (w[27], w[28], offset); w[41] = amd_bytealign (w[26], w[27], offset); w[40] = amd_bytealign (w[25], w[26], offset); w[39] = amd_bytealign (w[24], w[25], offset); w[38] = amd_bytealign (w[23], w[24], offset); w[37] = amd_bytealign (w[22], w[23], offset); w[36] = amd_bytealign (w[21], w[22], offset); w[35] = amd_bytealign (w[20], w[21], offset); w[34] = amd_bytealign (w[19], w[20], offset); w[33] = amd_bytealign (w[18], w[19], offset); w[32] = amd_bytealign (w[17], w[18], offset); w[31] = amd_bytealign (w[16], w[17], offset); w[30] = amd_bytealign (w[15], w[16], offset); w[29] = amd_bytealign (w[14], w[15], offset); w[28] = amd_bytealign (w[13], w[14], offset); w[27] = amd_bytealign (w[12], w[13], offset); w[26] = amd_bytealign (w[11], w[12], offset); w[25] = amd_bytealign (w[10], w[11], offset); w[24] = amd_bytealign (w[ 9], w[10], offset); w[23] = amd_bytealign (w[ 8], w[ 9], offset); w[22] = amd_bytealign (w[ 7], w[ 8], offset); w[21] = amd_bytealign (w[ 6], w[ 7], offset); w[20] = amd_bytealign (w[ 5], w[ 6], offset); w[19] = amd_bytealign (w[ 4], w[ 5], offset); w[18] = amd_bytealign (w[ 3], w[ 4], offset); w[17] = amd_bytealign (w[ 2], w[ 3], offset); w[16] = amd_bytealign (w[ 1], w[ 2], offset); w[15] = amd_bytealign (w[ 0], w[ 1], offset); w[14] = amd_bytealign ( 0, w[ 0], offset); w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 15: w[63] = amd_bytealign (w[47], w[48], offset); w[62] = amd_bytealign (w[46], w[47], offset); w[61] = amd_bytealign (w[45], w[46], offset); w[60] = amd_bytealign (w[44], w[45], offset); w[59] = amd_bytealign (w[43], w[44], offset); w[58] = amd_bytealign (w[42], w[43], offset); w[57] = amd_bytealign (w[41], w[42], offset); w[56] = amd_bytealign (w[40], w[41], offset); w[55] = amd_bytealign (w[39], w[40], offset); w[54] = amd_bytealign (w[38], w[39], offset); w[53] = amd_bytealign (w[37], w[38], offset); w[52] = amd_bytealign (w[36], w[37], offset); w[51] = amd_bytealign (w[35], w[36], offset); w[50] = amd_bytealign (w[34], w[35], offset); w[49] = amd_bytealign (w[33], w[34], offset); w[48] = amd_bytealign (w[32], w[33], offset); w[47] = amd_bytealign (w[31], w[32], offset); w[46] = amd_bytealign (w[30], w[31], offset); w[45] = amd_bytealign (w[29], w[30], offset); w[44] = amd_bytealign (w[28], w[29], offset); w[43] = amd_bytealign (w[27], w[28], offset); w[42] = amd_bytealign (w[26], w[27], offset); w[41] = amd_bytealign (w[25], w[26], offset); w[40] = amd_bytealign (w[24], w[25], offset); w[39] = amd_bytealign (w[23], w[24], offset); w[38] = amd_bytealign (w[22], w[23], offset); w[37] = amd_bytealign (w[21], w[22], offset); w[36] = amd_bytealign (w[20], w[21], offset); w[35] = amd_bytealign (w[19], w[20], offset); w[34] = amd_bytealign (w[18], w[19], offset); w[33] = amd_bytealign (w[17], w[18], offset); w[32] = amd_bytealign (w[16], w[17], offset); w[31] = amd_bytealign (w[15], w[16], offset); w[30] = amd_bytealign (w[14], w[15], offset); w[29] = amd_bytealign (w[13], w[14], offset); w[28] = amd_bytealign (w[12], w[13], offset); w[27] = amd_bytealign (w[11], w[12], offset); w[26] = amd_bytealign (w[10], w[11], offset); w[25] = amd_bytealign (w[ 9], w[10], offset); w[24] = amd_bytealign (w[ 8], w[ 9], offset); w[23] = amd_bytealign (w[ 7], w[ 8], offset); w[22] = amd_bytealign (w[ 6], w[ 7], offset); w[21] = amd_bytealign (w[ 5], w[ 6], offset); w[20] = amd_bytealign (w[ 4], w[ 5], offset); w[19] = amd_bytealign (w[ 3], w[ 4], offset); w[18] = amd_bytealign (w[ 2], w[ 3], offset); w[17] = amd_bytealign (w[ 1], w[ 2], offset); w[16] = amd_bytealign (w[ 0], w[ 1], offset); w[15] = amd_bytealign ( 0, w[ 0], offset); w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 16: w[63] = amd_bytealign (w[46], w[47], offset); w[62] = amd_bytealign (w[45], w[46], offset); w[61] = amd_bytealign (w[44], w[45], offset); w[60] = amd_bytealign (w[43], w[44], offset); w[59] = amd_bytealign (w[42], w[43], offset); w[58] = amd_bytealign (w[41], w[42], offset); w[57] = amd_bytealign (w[40], w[41], offset); w[56] = amd_bytealign (w[39], w[40], offset); w[55] = amd_bytealign (w[38], w[39], offset); w[54] = amd_bytealign (w[37], w[38], offset); w[53] = amd_bytealign (w[36], w[37], offset); w[52] = amd_bytealign (w[35], w[36], offset); w[51] = amd_bytealign (w[34], w[35], offset); w[50] = amd_bytealign (w[33], w[34], offset); w[49] = amd_bytealign (w[32], w[33], offset); w[48] = amd_bytealign (w[31], w[32], offset); w[47] = amd_bytealign (w[30], w[31], offset); w[46] = amd_bytealign (w[29], w[30], offset); w[45] = amd_bytealign (w[28], w[29], offset); w[44] = amd_bytealign (w[27], w[28], offset); w[43] = amd_bytealign (w[26], w[27], offset); w[42] = amd_bytealign (w[25], w[26], offset); w[41] = amd_bytealign (w[24], w[25], offset); w[40] = amd_bytealign (w[23], w[24], offset); w[39] = amd_bytealign (w[22], w[23], offset); w[38] = amd_bytealign (w[21], w[22], offset); w[37] = amd_bytealign (w[20], w[21], offset); w[36] = amd_bytealign (w[19], w[20], offset); w[35] = amd_bytealign (w[18], w[19], offset); w[34] = amd_bytealign (w[17], w[18], offset); w[33] = amd_bytealign (w[16], w[17], offset); w[32] = amd_bytealign (w[15], w[16], offset); w[31] = amd_bytealign (w[14], w[15], offset); w[30] = amd_bytealign (w[13], w[14], offset); w[29] = amd_bytealign (w[12], w[13], offset); w[28] = amd_bytealign (w[11], w[12], offset); w[27] = amd_bytealign (w[10], w[11], offset); w[26] = amd_bytealign (w[ 9], w[10], offset); w[25] = amd_bytealign (w[ 8], w[ 9], offset); w[24] = amd_bytealign (w[ 7], w[ 8], offset); w[23] = amd_bytealign (w[ 6], w[ 7], offset); w[22] = amd_bytealign (w[ 5], w[ 6], offset); w[21] = amd_bytealign (w[ 4], w[ 5], offset); w[20] = amd_bytealign (w[ 3], w[ 4], offset); w[19] = amd_bytealign (w[ 2], w[ 3], offset); w[18] = amd_bytealign (w[ 1], w[ 2], offset); w[17] = amd_bytealign (w[ 0], w[ 1], offset); w[16] = amd_bytealign ( 0, w[ 0], offset); w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 17: w[63] = amd_bytealign (w[45], w[46], offset); w[62] = amd_bytealign (w[44], w[45], offset); w[61] = amd_bytealign (w[43], w[44], offset); w[60] = amd_bytealign (w[42], w[43], offset); w[59] = amd_bytealign (w[41], w[42], offset); w[58] = amd_bytealign (w[40], w[41], offset); w[57] = amd_bytealign (w[39], w[40], offset); w[56] = amd_bytealign (w[38], w[39], offset); w[55] = amd_bytealign (w[37], w[38], offset); w[54] = amd_bytealign (w[36], w[37], offset); w[53] = amd_bytealign (w[35], w[36], offset); w[52] = amd_bytealign (w[34], w[35], offset); w[51] = amd_bytealign (w[33], w[34], offset); w[50] = amd_bytealign (w[32], w[33], offset); w[49] = amd_bytealign (w[31], w[32], offset); w[48] = amd_bytealign (w[30], w[31], offset); w[47] = amd_bytealign (w[29], w[30], offset); w[46] = amd_bytealign (w[28], w[29], offset); w[45] = amd_bytealign (w[27], w[28], offset); w[44] = amd_bytealign (w[26], w[27], offset); w[43] = amd_bytealign (w[25], w[26], offset); w[42] = amd_bytealign (w[24], w[25], offset); w[41] = amd_bytealign (w[23], w[24], offset); w[40] = amd_bytealign (w[22], w[23], offset); w[39] = amd_bytealign (w[21], w[22], offset); w[38] = amd_bytealign (w[20], w[21], offset); w[37] = amd_bytealign (w[19], w[20], offset); w[36] = amd_bytealign (w[18], w[19], offset); w[35] = amd_bytealign (w[17], w[18], offset); w[34] = amd_bytealign (w[16], w[17], offset); w[33] = amd_bytealign (w[15], w[16], offset); w[32] = amd_bytealign (w[14], w[15], offset); w[31] = amd_bytealign (w[13], w[14], offset); w[30] = amd_bytealign (w[12], w[13], offset); w[29] = amd_bytealign (w[11], w[12], offset); w[28] = amd_bytealign (w[10], w[11], offset); w[27] = amd_bytealign (w[ 9], w[10], offset); w[26] = amd_bytealign (w[ 8], w[ 9], offset); w[25] = amd_bytealign (w[ 7], w[ 8], offset); w[24] = amd_bytealign (w[ 6], w[ 7], offset); w[23] = amd_bytealign (w[ 5], w[ 6], offset); w[22] = amd_bytealign (w[ 4], w[ 5], offset); w[21] = amd_bytealign (w[ 3], w[ 4], offset); w[20] = amd_bytealign (w[ 2], w[ 3], offset); w[19] = amd_bytealign (w[ 1], w[ 2], offset); w[18] = amd_bytealign (w[ 0], w[ 1], offset); w[17] = amd_bytealign ( 0, w[ 0], offset); w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 18: w[63] = amd_bytealign (w[44], w[45], offset); w[62] = amd_bytealign (w[43], w[44], offset); w[61] = amd_bytealign (w[42], w[43], offset); w[60] = amd_bytealign (w[41], w[42], offset); w[59] = amd_bytealign (w[40], w[41], offset); w[58] = amd_bytealign (w[39], w[40], offset); w[57] = amd_bytealign (w[38], w[39], offset); w[56] = amd_bytealign (w[37], w[38], offset); w[55] = amd_bytealign (w[36], w[37], offset); w[54] = amd_bytealign (w[35], w[36], offset); w[53] = amd_bytealign (w[34], w[35], offset); w[52] = amd_bytealign (w[33], w[34], offset); w[51] = amd_bytealign (w[32], w[33], offset); w[50] = amd_bytealign (w[31], w[32], offset); w[49] = amd_bytealign (w[30], w[31], offset); w[48] = amd_bytealign (w[29], w[30], offset); w[47] = amd_bytealign (w[28], w[29], offset); w[46] = amd_bytealign (w[27], w[28], offset); w[45] = amd_bytealign (w[26], w[27], offset); w[44] = amd_bytealign (w[25], w[26], offset); w[43] = amd_bytealign (w[24], w[25], offset); w[42] = amd_bytealign (w[23], w[24], offset); w[41] = amd_bytealign (w[22], w[23], offset); w[40] = amd_bytealign (w[21], w[22], offset); w[39] = amd_bytealign (w[20], w[21], offset); w[38] = amd_bytealign (w[19], w[20], offset); w[37] = amd_bytealign (w[18], w[19], offset); w[36] = amd_bytealign (w[17], w[18], offset); w[35] = amd_bytealign (w[16], w[17], offset); w[34] = amd_bytealign (w[15], w[16], offset); w[33] = amd_bytealign (w[14], w[15], offset); w[32] = amd_bytealign (w[13], w[14], offset); w[31] = amd_bytealign (w[12], w[13], offset); w[30] = amd_bytealign (w[11], w[12], offset); w[29] = amd_bytealign (w[10], w[11], offset); w[28] = amd_bytealign (w[ 9], w[10], offset); w[27] = amd_bytealign (w[ 8], w[ 9], offset); w[26] = amd_bytealign (w[ 7], w[ 8], offset); w[25] = amd_bytealign (w[ 6], w[ 7], offset); w[24] = amd_bytealign (w[ 5], w[ 6], offset); w[23] = amd_bytealign (w[ 4], w[ 5], offset); w[22] = amd_bytealign (w[ 3], w[ 4], offset); w[21] = amd_bytealign (w[ 2], w[ 3], offset); w[20] = amd_bytealign (w[ 1], w[ 2], offset); w[19] = amd_bytealign (w[ 0], w[ 1], offset); w[18] = amd_bytealign ( 0, w[ 0], offset); w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 19: w[63] = amd_bytealign (w[43], w[44], offset); w[62] = amd_bytealign (w[42], w[43], offset); w[61] = amd_bytealign (w[41], w[42], offset); w[60] = amd_bytealign (w[40], w[41], offset); w[59] = amd_bytealign (w[39], w[40], offset); w[58] = amd_bytealign (w[38], w[39], offset); w[57] = amd_bytealign (w[37], w[38], offset); w[56] = amd_bytealign (w[36], w[37], offset); w[55] = amd_bytealign (w[35], w[36], offset); w[54] = amd_bytealign (w[34], w[35], offset); w[53] = amd_bytealign (w[33], w[34], offset); w[52] = amd_bytealign (w[32], w[33], offset); w[51] = amd_bytealign (w[31], w[32], offset); w[50] = amd_bytealign (w[30], w[31], offset); w[49] = amd_bytealign (w[29], w[30], offset); w[48] = amd_bytealign (w[28], w[29], offset); w[47] = amd_bytealign (w[27], w[28], offset); w[46] = amd_bytealign (w[26], w[27], offset); w[45] = amd_bytealign (w[25], w[26], offset); w[44] = amd_bytealign (w[24], w[25], offset); w[43] = amd_bytealign (w[23], w[24], offset); w[42] = amd_bytealign (w[22], w[23], offset); w[41] = amd_bytealign (w[21], w[22], offset); w[40] = amd_bytealign (w[20], w[21], offset); w[39] = amd_bytealign (w[19], w[20], offset); w[38] = amd_bytealign (w[18], w[19], offset); w[37] = amd_bytealign (w[17], w[18], offset); w[36] = amd_bytealign (w[16], w[17], offset); w[35] = amd_bytealign (w[15], w[16], offset); w[34] = amd_bytealign (w[14], w[15], offset); w[33] = amd_bytealign (w[13], w[14], offset); w[32] = amd_bytealign (w[12], w[13], offset); w[31] = amd_bytealign (w[11], w[12], offset); w[30] = amd_bytealign (w[10], w[11], offset); w[29] = amd_bytealign (w[ 9], w[10], offset); w[28] = amd_bytealign (w[ 8], w[ 9], offset); w[27] = amd_bytealign (w[ 7], w[ 8], offset); w[26] = amd_bytealign (w[ 6], w[ 7], offset); w[25] = amd_bytealign (w[ 5], w[ 6], offset); w[24] = amd_bytealign (w[ 4], w[ 5], offset); w[23] = amd_bytealign (w[ 3], w[ 4], offset); w[22] = amd_bytealign (w[ 2], w[ 3], offset); w[21] = amd_bytealign (w[ 1], w[ 2], offset); w[20] = amd_bytealign (w[ 0], w[ 1], offset); w[19] = amd_bytealign ( 0, w[ 0], offset); w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 20: w[63] = amd_bytealign (w[42], w[43], offset); w[62] = amd_bytealign (w[41], w[42], offset); w[61] = amd_bytealign (w[40], w[41], offset); w[60] = amd_bytealign (w[39], w[40], offset); w[59] = amd_bytealign (w[38], w[39], offset); w[58] = amd_bytealign (w[37], w[38], offset); w[57] = amd_bytealign (w[36], w[37], offset); w[56] = amd_bytealign (w[35], w[36], offset); w[55] = amd_bytealign (w[34], w[35], offset); w[54] = amd_bytealign (w[33], w[34], offset); w[53] = amd_bytealign (w[32], w[33], offset); w[52] = amd_bytealign (w[31], w[32], offset); w[51] = amd_bytealign (w[30], w[31], offset); w[50] = amd_bytealign (w[29], w[30], offset); w[49] = amd_bytealign (w[28], w[29], offset); w[48] = amd_bytealign (w[27], w[28], offset); w[47] = amd_bytealign (w[26], w[27], offset); w[46] = amd_bytealign (w[25], w[26], offset); w[45] = amd_bytealign (w[24], w[25], offset); w[44] = amd_bytealign (w[23], w[24], offset); w[43] = amd_bytealign (w[22], w[23], offset); w[42] = amd_bytealign (w[21], w[22], offset); w[41] = amd_bytealign (w[20], w[21], offset); w[40] = amd_bytealign (w[19], w[20], offset); w[39] = amd_bytealign (w[18], w[19], offset); w[38] = amd_bytealign (w[17], w[18], offset); w[37] = amd_bytealign (w[16], w[17], offset); w[36] = amd_bytealign (w[15], w[16], offset); w[35] = amd_bytealign (w[14], w[15], offset); w[34] = amd_bytealign (w[13], w[14], offset); w[33] = amd_bytealign (w[12], w[13], offset); w[32] = amd_bytealign (w[11], w[12], offset); w[31] = amd_bytealign (w[10], w[11], offset); w[30] = amd_bytealign (w[ 9], w[10], offset); w[29] = amd_bytealign (w[ 8], w[ 9], offset); w[28] = amd_bytealign (w[ 7], w[ 8], offset); w[27] = amd_bytealign (w[ 6], w[ 7], offset); w[26] = amd_bytealign (w[ 5], w[ 6], offset); w[25] = amd_bytealign (w[ 4], w[ 5], offset); w[24] = amd_bytealign (w[ 3], w[ 4], offset); w[23] = amd_bytealign (w[ 2], w[ 3], offset); w[22] = amd_bytealign (w[ 1], w[ 2], offset); w[21] = amd_bytealign (w[ 0], w[ 1], offset); w[20] = amd_bytealign ( 0, w[ 0], offset); w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 21: w[63] = amd_bytealign (w[41], w[42], offset); w[62] = amd_bytealign (w[40], w[41], offset); w[61] = amd_bytealign (w[39], w[40], offset); w[60] = amd_bytealign (w[38], w[39], offset); w[59] = amd_bytealign (w[37], w[38], offset); w[58] = amd_bytealign (w[36], w[37], offset); w[57] = amd_bytealign (w[35], w[36], offset); w[56] = amd_bytealign (w[34], w[35], offset); w[55] = amd_bytealign (w[33], w[34], offset); w[54] = amd_bytealign (w[32], w[33], offset); w[53] = amd_bytealign (w[31], w[32], offset); w[52] = amd_bytealign (w[30], w[31], offset); w[51] = amd_bytealign (w[29], w[30], offset); w[50] = amd_bytealign (w[28], w[29], offset); w[49] = amd_bytealign (w[27], w[28], offset); w[48] = amd_bytealign (w[26], w[27], offset); w[47] = amd_bytealign (w[25], w[26], offset); w[46] = amd_bytealign (w[24], w[25], offset); w[45] = amd_bytealign (w[23], w[24], offset); w[44] = amd_bytealign (w[22], w[23], offset); w[43] = amd_bytealign (w[21], w[22], offset); w[42] = amd_bytealign (w[20], w[21], offset); w[41] = amd_bytealign (w[19], w[20], offset); w[40] = amd_bytealign (w[18], w[19], offset); w[39] = amd_bytealign (w[17], w[18], offset); w[38] = amd_bytealign (w[16], w[17], offset); w[37] = amd_bytealign (w[15], w[16], offset); w[36] = amd_bytealign (w[14], w[15], offset); w[35] = amd_bytealign (w[13], w[14], offset); w[34] = amd_bytealign (w[12], w[13], offset); w[33] = amd_bytealign (w[11], w[12], offset); w[32] = amd_bytealign (w[10], w[11], offset); w[31] = amd_bytealign (w[ 9], w[10], offset); w[30] = amd_bytealign (w[ 8], w[ 9], offset); w[29] = amd_bytealign (w[ 7], w[ 8], offset); w[28] = amd_bytealign (w[ 6], w[ 7], offset); w[27] = amd_bytealign (w[ 5], w[ 6], offset); w[26] = amd_bytealign (w[ 4], w[ 5], offset); w[25] = amd_bytealign (w[ 3], w[ 4], offset); w[24] = amd_bytealign (w[ 2], w[ 3], offset); w[23] = amd_bytealign (w[ 1], w[ 2], offset); w[22] = amd_bytealign (w[ 0], w[ 1], offset); w[21] = amd_bytealign ( 0, w[ 0], offset); w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 22: w[63] = amd_bytealign (w[40], w[41], offset); w[62] = amd_bytealign (w[39], w[40], offset); w[61] = amd_bytealign (w[38], w[39], offset); w[60] = amd_bytealign (w[37], w[38], offset); w[59] = amd_bytealign (w[36], w[37], offset); w[58] = amd_bytealign (w[35], w[36], offset); w[57] = amd_bytealign (w[34], w[35], offset); w[56] = amd_bytealign (w[33], w[34], offset); w[55] = amd_bytealign (w[32], w[33], offset); w[54] = amd_bytealign (w[31], w[32], offset); w[53] = amd_bytealign (w[30], w[31], offset); w[52] = amd_bytealign (w[29], w[30], offset); w[51] = amd_bytealign (w[28], w[29], offset); w[50] = amd_bytealign (w[27], w[28], offset); w[49] = amd_bytealign (w[26], w[27], offset); w[48] = amd_bytealign (w[25], w[26], offset); w[47] = amd_bytealign (w[24], w[25], offset); w[46] = amd_bytealign (w[23], w[24], offset); w[45] = amd_bytealign (w[22], w[23], offset); w[44] = amd_bytealign (w[21], w[22], offset); w[43] = amd_bytealign (w[20], w[21], offset); w[42] = amd_bytealign (w[19], w[20], offset); w[41] = amd_bytealign (w[18], w[19], offset); w[40] = amd_bytealign (w[17], w[18], offset); w[39] = amd_bytealign (w[16], w[17], offset); w[38] = amd_bytealign (w[15], w[16], offset); w[37] = amd_bytealign (w[14], w[15], offset); w[36] = amd_bytealign (w[13], w[14], offset); w[35] = amd_bytealign (w[12], w[13], offset); w[34] = amd_bytealign (w[11], w[12], offset); w[33] = amd_bytealign (w[10], w[11], offset); w[32] = amd_bytealign (w[ 9], w[10], offset); w[31] = amd_bytealign (w[ 8], w[ 9], offset); w[30] = amd_bytealign (w[ 7], w[ 8], offset); w[29] = amd_bytealign (w[ 6], w[ 7], offset); w[28] = amd_bytealign (w[ 5], w[ 6], offset); w[27] = amd_bytealign (w[ 4], w[ 5], offset); w[26] = amd_bytealign (w[ 3], w[ 4], offset); w[25] = amd_bytealign (w[ 2], w[ 3], offset); w[24] = amd_bytealign (w[ 1], w[ 2], offset); w[23] = amd_bytealign (w[ 0], w[ 1], offset); w[22] = amd_bytealign ( 0, w[ 0], offset); w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 23: w[63] = amd_bytealign (w[39], w[40], offset); w[62] = amd_bytealign (w[38], w[39], offset); w[61] = amd_bytealign (w[37], w[38], offset); w[60] = amd_bytealign (w[36], w[37], offset); w[59] = amd_bytealign (w[35], w[36], offset); w[58] = amd_bytealign (w[34], w[35], offset); w[57] = amd_bytealign (w[33], w[34], offset); w[56] = amd_bytealign (w[32], w[33], offset); w[55] = amd_bytealign (w[31], w[32], offset); w[54] = amd_bytealign (w[30], w[31], offset); w[53] = amd_bytealign (w[29], w[30], offset); w[52] = amd_bytealign (w[28], w[29], offset); w[51] = amd_bytealign (w[27], w[28], offset); w[50] = amd_bytealign (w[26], w[27], offset); w[49] = amd_bytealign (w[25], w[26], offset); w[48] = amd_bytealign (w[24], w[25], offset); w[47] = amd_bytealign (w[23], w[24], offset); w[46] = amd_bytealign (w[22], w[23], offset); w[45] = amd_bytealign (w[21], w[22], offset); w[44] = amd_bytealign (w[20], w[21], offset); w[43] = amd_bytealign (w[19], w[20], offset); w[42] = amd_bytealign (w[18], w[19], offset); w[41] = amd_bytealign (w[17], w[18], offset); w[40] = amd_bytealign (w[16], w[17], offset); w[39] = amd_bytealign (w[15], w[16], offset); w[38] = amd_bytealign (w[14], w[15], offset); w[37] = amd_bytealign (w[13], w[14], offset); w[36] = amd_bytealign (w[12], w[13], offset); w[35] = amd_bytealign (w[11], w[12], offset); w[34] = amd_bytealign (w[10], w[11], offset); w[33] = amd_bytealign (w[ 9], w[10], offset); w[32] = amd_bytealign (w[ 8], w[ 9], offset); w[31] = amd_bytealign (w[ 7], w[ 8], offset); w[30] = amd_bytealign (w[ 6], w[ 7], offset); w[29] = amd_bytealign (w[ 5], w[ 6], offset); w[28] = amd_bytealign (w[ 4], w[ 5], offset); w[27] = amd_bytealign (w[ 3], w[ 4], offset); w[26] = amd_bytealign (w[ 2], w[ 3], offset); w[25] = amd_bytealign (w[ 1], w[ 2], offset); w[24] = amd_bytealign (w[ 0], w[ 1], offset); w[23] = amd_bytealign ( 0, w[ 0], offset); w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 24: w[63] = amd_bytealign (w[38], w[39], offset); w[62] = amd_bytealign (w[37], w[38], offset); w[61] = amd_bytealign (w[36], w[37], offset); w[60] = amd_bytealign (w[35], w[36], offset); w[59] = amd_bytealign (w[34], w[35], offset); w[58] = amd_bytealign (w[33], w[34], offset); w[57] = amd_bytealign (w[32], w[33], offset); w[56] = amd_bytealign (w[31], w[32], offset); w[55] = amd_bytealign (w[30], w[31], offset); w[54] = amd_bytealign (w[29], w[30], offset); w[53] = amd_bytealign (w[28], w[29], offset); w[52] = amd_bytealign (w[27], w[28], offset); w[51] = amd_bytealign (w[26], w[27], offset); w[50] = amd_bytealign (w[25], w[26], offset); w[49] = amd_bytealign (w[24], w[25], offset); w[48] = amd_bytealign (w[23], w[24], offset); w[47] = amd_bytealign (w[22], w[23], offset); w[46] = amd_bytealign (w[21], w[22], offset); w[45] = amd_bytealign (w[20], w[21], offset); w[44] = amd_bytealign (w[19], w[20], offset); w[43] = amd_bytealign (w[18], w[19], offset); w[42] = amd_bytealign (w[17], w[18], offset); w[41] = amd_bytealign (w[16], w[17], offset); w[40] = amd_bytealign (w[15], w[16], offset); w[39] = amd_bytealign (w[14], w[15], offset); w[38] = amd_bytealign (w[13], w[14], offset); w[37] = amd_bytealign (w[12], w[13], offset); w[36] = amd_bytealign (w[11], w[12], offset); w[35] = amd_bytealign (w[10], w[11], offset); w[34] = amd_bytealign (w[ 9], w[10], offset); w[33] = amd_bytealign (w[ 8], w[ 9], offset); w[32] = amd_bytealign (w[ 7], w[ 8], offset); w[31] = amd_bytealign (w[ 6], w[ 7], offset); w[30] = amd_bytealign (w[ 5], w[ 6], offset); w[29] = amd_bytealign (w[ 4], w[ 5], offset); w[28] = amd_bytealign (w[ 3], w[ 4], offset); w[27] = amd_bytealign (w[ 2], w[ 3], offset); w[26] = amd_bytealign (w[ 1], w[ 2], offset); w[25] = amd_bytealign (w[ 0], w[ 1], offset); w[24] = amd_bytealign ( 0, w[ 0], offset); w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 25: w[63] = amd_bytealign (w[37], w[38], offset); w[62] = amd_bytealign (w[36], w[37], offset); w[61] = amd_bytealign (w[35], w[36], offset); w[60] = amd_bytealign (w[34], w[35], offset); w[59] = amd_bytealign (w[33], w[34], offset); w[58] = amd_bytealign (w[32], w[33], offset); w[57] = amd_bytealign (w[31], w[32], offset); w[56] = amd_bytealign (w[30], w[31], offset); w[55] = amd_bytealign (w[29], w[30], offset); w[54] = amd_bytealign (w[28], w[29], offset); w[53] = amd_bytealign (w[27], w[28], offset); w[52] = amd_bytealign (w[26], w[27], offset); w[51] = amd_bytealign (w[25], w[26], offset); w[50] = amd_bytealign (w[24], w[25], offset); w[49] = amd_bytealign (w[23], w[24], offset); w[48] = amd_bytealign (w[22], w[23], offset); w[47] = amd_bytealign (w[21], w[22], offset); w[46] = amd_bytealign (w[20], w[21], offset); w[45] = amd_bytealign (w[19], w[20], offset); w[44] = amd_bytealign (w[18], w[19], offset); w[43] = amd_bytealign (w[17], w[18], offset); w[42] = amd_bytealign (w[16], w[17], offset); w[41] = amd_bytealign (w[15], w[16], offset); w[40] = amd_bytealign (w[14], w[15], offset); w[39] = amd_bytealign (w[13], w[14], offset); w[38] = amd_bytealign (w[12], w[13], offset); w[37] = amd_bytealign (w[11], w[12], offset); w[36] = amd_bytealign (w[10], w[11], offset); w[35] = amd_bytealign (w[ 9], w[10], offset); w[34] = amd_bytealign (w[ 8], w[ 9], offset); w[33] = amd_bytealign (w[ 7], w[ 8], offset); w[32] = amd_bytealign (w[ 6], w[ 7], offset); w[31] = amd_bytealign (w[ 5], w[ 6], offset); w[30] = amd_bytealign (w[ 4], w[ 5], offset); w[29] = amd_bytealign (w[ 3], w[ 4], offset); w[28] = amd_bytealign (w[ 2], w[ 3], offset); w[27] = amd_bytealign (w[ 1], w[ 2], offset); w[26] = amd_bytealign (w[ 0], w[ 1], offset); w[25] = amd_bytealign ( 0, w[ 0], offset); w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 26: w[63] = amd_bytealign (w[36], w[37], offset); w[62] = amd_bytealign (w[35], w[36], offset); w[61] = amd_bytealign (w[34], w[35], offset); w[60] = amd_bytealign (w[33], w[34], offset); w[59] = amd_bytealign (w[32], w[33], offset); w[58] = amd_bytealign (w[31], w[32], offset); w[57] = amd_bytealign (w[30], w[31], offset); w[56] = amd_bytealign (w[29], w[30], offset); w[55] = amd_bytealign (w[28], w[29], offset); w[54] = amd_bytealign (w[27], w[28], offset); w[53] = amd_bytealign (w[26], w[27], offset); w[52] = amd_bytealign (w[25], w[26], offset); w[51] = amd_bytealign (w[24], w[25], offset); w[50] = amd_bytealign (w[23], w[24], offset); w[49] = amd_bytealign (w[22], w[23], offset); w[48] = amd_bytealign (w[21], w[22], offset); w[47] = amd_bytealign (w[20], w[21], offset); w[46] = amd_bytealign (w[19], w[20], offset); w[45] = amd_bytealign (w[18], w[19], offset); w[44] = amd_bytealign (w[17], w[18], offset); w[43] = amd_bytealign (w[16], w[17], offset); w[42] = amd_bytealign (w[15], w[16], offset); w[41] = amd_bytealign (w[14], w[15], offset); w[40] = amd_bytealign (w[13], w[14], offset); w[39] = amd_bytealign (w[12], w[13], offset); w[38] = amd_bytealign (w[11], w[12], offset); w[37] = amd_bytealign (w[10], w[11], offset); w[36] = amd_bytealign (w[ 9], w[10], offset); w[35] = amd_bytealign (w[ 8], w[ 9], offset); w[34] = amd_bytealign (w[ 7], w[ 8], offset); w[33] = amd_bytealign (w[ 6], w[ 7], offset); w[32] = amd_bytealign (w[ 5], w[ 6], offset); w[31] = amd_bytealign (w[ 4], w[ 5], offset); w[30] = amd_bytealign (w[ 3], w[ 4], offset); w[29] = amd_bytealign (w[ 2], w[ 3], offset); w[28] = amd_bytealign (w[ 1], w[ 2], offset); w[27] = amd_bytealign (w[ 0], w[ 1], offset); w[26] = amd_bytealign ( 0, w[ 0], offset); w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 27: w[63] = amd_bytealign (w[35], w[36], offset); w[62] = amd_bytealign (w[34], w[35], offset); w[61] = amd_bytealign (w[33], w[34], offset); w[60] = amd_bytealign (w[32], w[33], offset); w[59] = amd_bytealign (w[31], w[32], offset); w[58] = amd_bytealign (w[30], w[31], offset); w[57] = amd_bytealign (w[29], w[30], offset); w[56] = amd_bytealign (w[28], w[29], offset); w[55] = amd_bytealign (w[27], w[28], offset); w[54] = amd_bytealign (w[26], w[27], offset); w[53] = amd_bytealign (w[25], w[26], offset); w[52] = amd_bytealign (w[24], w[25], offset); w[51] = amd_bytealign (w[23], w[24], offset); w[50] = amd_bytealign (w[22], w[23], offset); w[49] = amd_bytealign (w[21], w[22], offset); w[48] = amd_bytealign (w[20], w[21], offset); w[47] = amd_bytealign (w[19], w[20], offset); w[46] = amd_bytealign (w[18], w[19], offset); w[45] = amd_bytealign (w[17], w[18], offset); w[44] = amd_bytealign (w[16], w[17], offset); w[43] = amd_bytealign (w[15], w[16], offset); w[42] = amd_bytealign (w[14], w[15], offset); w[41] = amd_bytealign (w[13], w[14], offset); w[40] = amd_bytealign (w[12], w[13], offset); w[39] = amd_bytealign (w[11], w[12], offset); w[38] = amd_bytealign (w[10], w[11], offset); w[37] = amd_bytealign (w[ 9], w[10], offset); w[36] = amd_bytealign (w[ 8], w[ 9], offset); w[35] = amd_bytealign (w[ 7], w[ 8], offset); w[34] = amd_bytealign (w[ 6], w[ 7], offset); w[33] = amd_bytealign (w[ 5], w[ 6], offset); w[32] = amd_bytealign (w[ 4], w[ 5], offset); w[31] = amd_bytealign (w[ 3], w[ 4], offset); w[30] = amd_bytealign (w[ 2], w[ 3], offset); w[29] = amd_bytealign (w[ 1], w[ 2], offset); w[28] = amd_bytealign (w[ 0], w[ 1], offset); w[27] = amd_bytealign ( 0, w[ 0], offset); w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 28: w[63] = amd_bytealign (w[34], w[35], offset); w[62] = amd_bytealign (w[33], w[34], offset); w[61] = amd_bytealign (w[32], w[33], offset); w[60] = amd_bytealign (w[31], w[32], offset); w[59] = amd_bytealign (w[30], w[31], offset); w[58] = amd_bytealign (w[29], w[30], offset); w[57] = amd_bytealign (w[28], w[29], offset); w[56] = amd_bytealign (w[27], w[28], offset); w[55] = amd_bytealign (w[26], w[27], offset); w[54] = amd_bytealign (w[25], w[26], offset); w[53] = amd_bytealign (w[24], w[25], offset); w[52] = amd_bytealign (w[23], w[24], offset); w[51] = amd_bytealign (w[22], w[23], offset); w[50] = amd_bytealign (w[21], w[22], offset); w[49] = amd_bytealign (w[20], w[21], offset); w[48] = amd_bytealign (w[19], w[20], offset); w[47] = amd_bytealign (w[18], w[19], offset); w[46] = amd_bytealign (w[17], w[18], offset); w[45] = amd_bytealign (w[16], w[17], offset); w[44] = amd_bytealign (w[15], w[16], offset); w[43] = amd_bytealign (w[14], w[15], offset); w[42] = amd_bytealign (w[13], w[14], offset); w[41] = amd_bytealign (w[12], w[13], offset); w[40] = amd_bytealign (w[11], w[12], offset); w[39] = amd_bytealign (w[10], w[11], offset); w[38] = amd_bytealign (w[ 9], w[10], offset); w[37] = amd_bytealign (w[ 8], w[ 9], offset); w[36] = amd_bytealign (w[ 7], w[ 8], offset); w[35] = amd_bytealign (w[ 6], w[ 7], offset); w[34] = amd_bytealign (w[ 5], w[ 6], offset); w[33] = amd_bytealign (w[ 4], w[ 5], offset); w[32] = amd_bytealign (w[ 3], w[ 4], offset); w[31] = amd_bytealign (w[ 2], w[ 3], offset); w[30] = amd_bytealign (w[ 1], w[ 2], offset); w[29] = amd_bytealign (w[ 0], w[ 1], offset); w[28] = amd_bytealign ( 0, w[ 0], offset); w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 29: w[63] = amd_bytealign (w[33], w[34], offset); w[62] = amd_bytealign (w[32], w[33], offset); w[61] = amd_bytealign (w[31], w[32], offset); w[60] = amd_bytealign (w[30], w[31], offset); w[59] = amd_bytealign (w[29], w[30], offset); w[58] = amd_bytealign (w[28], w[29], offset); w[57] = amd_bytealign (w[27], w[28], offset); w[56] = amd_bytealign (w[26], w[27], offset); w[55] = amd_bytealign (w[25], w[26], offset); w[54] = amd_bytealign (w[24], w[25], offset); w[53] = amd_bytealign (w[23], w[24], offset); w[52] = amd_bytealign (w[22], w[23], offset); w[51] = amd_bytealign (w[21], w[22], offset); w[50] = amd_bytealign (w[20], w[21], offset); w[49] = amd_bytealign (w[19], w[20], offset); w[48] = amd_bytealign (w[18], w[19], offset); w[47] = amd_bytealign (w[17], w[18], offset); w[46] = amd_bytealign (w[16], w[17], offset); w[45] = amd_bytealign (w[15], w[16], offset); w[44] = amd_bytealign (w[14], w[15], offset); w[43] = amd_bytealign (w[13], w[14], offset); w[42] = amd_bytealign (w[12], w[13], offset); w[41] = amd_bytealign (w[11], w[12], offset); w[40] = amd_bytealign (w[10], w[11], offset); w[39] = amd_bytealign (w[ 9], w[10], offset); w[38] = amd_bytealign (w[ 8], w[ 9], offset); w[37] = amd_bytealign (w[ 7], w[ 8], offset); w[36] = amd_bytealign (w[ 6], w[ 7], offset); w[35] = amd_bytealign (w[ 5], w[ 6], offset); w[34] = amd_bytealign (w[ 4], w[ 5], offset); w[33] = amd_bytealign (w[ 3], w[ 4], offset); w[32] = amd_bytealign (w[ 2], w[ 3], offset); w[31] = amd_bytealign (w[ 1], w[ 2], offset); w[30] = amd_bytealign (w[ 0], w[ 1], offset); w[29] = amd_bytealign ( 0, w[ 0], offset); w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 30: w[63] = amd_bytealign (w[32], w[33], offset); w[62] = amd_bytealign (w[31], w[32], offset); w[61] = amd_bytealign (w[30], w[31], offset); w[60] = amd_bytealign (w[29], w[30], offset); w[59] = amd_bytealign (w[28], w[29], offset); w[58] = amd_bytealign (w[27], w[28], offset); w[57] = amd_bytealign (w[26], w[27], offset); w[56] = amd_bytealign (w[25], w[26], offset); w[55] = amd_bytealign (w[24], w[25], offset); w[54] = amd_bytealign (w[23], w[24], offset); w[53] = amd_bytealign (w[22], w[23], offset); w[52] = amd_bytealign (w[21], w[22], offset); w[51] = amd_bytealign (w[20], w[21], offset); w[50] = amd_bytealign (w[19], w[20], offset); w[49] = amd_bytealign (w[18], w[19], offset); w[48] = amd_bytealign (w[17], w[18], offset); w[47] = amd_bytealign (w[16], w[17], offset); w[46] = amd_bytealign (w[15], w[16], offset); w[45] = amd_bytealign (w[14], w[15], offset); w[44] = amd_bytealign (w[13], w[14], offset); w[43] = amd_bytealign (w[12], w[13], offset); w[42] = amd_bytealign (w[11], w[12], offset); w[41] = amd_bytealign (w[10], w[11], offset); w[40] = amd_bytealign (w[ 9], w[10], offset); w[39] = amd_bytealign (w[ 8], w[ 9], offset); w[38] = amd_bytealign (w[ 7], w[ 8], offset); w[37] = amd_bytealign (w[ 6], w[ 7], offset); w[36] = amd_bytealign (w[ 5], w[ 6], offset); w[35] = amd_bytealign (w[ 4], w[ 5], offset); w[34] = amd_bytealign (w[ 3], w[ 4], offset); w[33] = amd_bytealign (w[ 2], w[ 3], offset); w[32] = amd_bytealign (w[ 1], w[ 2], offset); w[31] = amd_bytealign (w[ 0], w[ 1], offset); w[30] = amd_bytealign ( 0, w[ 0], offset); w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 31: w[63] = amd_bytealign (w[31], w[32], offset); w[62] = amd_bytealign (w[30], w[31], offset); w[61] = amd_bytealign (w[29], w[30], offset); w[60] = amd_bytealign (w[28], w[29], offset); w[59] = amd_bytealign (w[27], w[28], offset); w[58] = amd_bytealign (w[26], w[27], offset); w[57] = amd_bytealign (w[25], w[26], offset); w[56] = amd_bytealign (w[24], w[25], offset); w[55] = amd_bytealign (w[23], w[24], offset); w[54] = amd_bytealign (w[22], w[23], offset); w[53] = amd_bytealign (w[21], w[22], offset); w[52] = amd_bytealign (w[20], w[21], offset); w[51] = amd_bytealign (w[19], w[20], offset); w[50] = amd_bytealign (w[18], w[19], offset); w[49] = amd_bytealign (w[17], w[18], offset); w[48] = amd_bytealign (w[16], w[17], offset); w[47] = amd_bytealign (w[15], w[16], offset); w[46] = amd_bytealign (w[14], w[15], offset); w[45] = amd_bytealign (w[13], w[14], offset); w[44] = amd_bytealign (w[12], w[13], offset); w[43] = amd_bytealign (w[11], w[12], offset); w[42] = amd_bytealign (w[10], w[11], offset); w[41] = amd_bytealign (w[ 9], w[10], offset); w[40] = amd_bytealign (w[ 8], w[ 9], offset); w[39] = amd_bytealign (w[ 7], w[ 8], offset); w[38] = amd_bytealign (w[ 6], w[ 7], offset); w[37] = amd_bytealign (w[ 5], w[ 6], offset); w[36] = amd_bytealign (w[ 4], w[ 5], offset); w[35] = amd_bytealign (w[ 3], w[ 4], offset); w[34] = amd_bytealign (w[ 2], w[ 3], offset); w[33] = amd_bytealign (w[ 1], w[ 2], offset); w[32] = amd_bytealign (w[ 0], w[ 1], offset); w[31] = amd_bytealign ( 0, w[ 0], offset); w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 32: w[63] = amd_bytealign (w[30], w[31], offset); w[62] = amd_bytealign (w[29], w[30], offset); w[61] = amd_bytealign (w[28], w[29], offset); w[60] = amd_bytealign (w[27], w[28], offset); w[59] = amd_bytealign (w[26], w[27], offset); w[58] = amd_bytealign (w[25], w[26], offset); w[57] = amd_bytealign (w[24], w[25], offset); w[56] = amd_bytealign (w[23], w[24], offset); w[55] = amd_bytealign (w[22], w[23], offset); w[54] = amd_bytealign (w[21], w[22], offset); w[53] = amd_bytealign (w[20], w[21], offset); w[52] = amd_bytealign (w[19], w[20], offset); w[51] = amd_bytealign (w[18], w[19], offset); w[50] = amd_bytealign (w[17], w[18], offset); w[49] = amd_bytealign (w[16], w[17], offset); w[48] = amd_bytealign (w[15], w[16], offset); w[47] = amd_bytealign (w[14], w[15], offset); w[46] = amd_bytealign (w[13], w[14], offset); w[45] = amd_bytealign (w[12], w[13], offset); w[44] = amd_bytealign (w[11], w[12], offset); w[43] = amd_bytealign (w[10], w[11], offset); w[42] = amd_bytealign (w[ 9], w[10], offset); w[41] = amd_bytealign (w[ 8], w[ 9], offset); w[40] = amd_bytealign (w[ 7], w[ 8], offset); w[39] = amd_bytealign (w[ 6], w[ 7], offset); w[38] = amd_bytealign (w[ 5], w[ 6], offset); w[37] = amd_bytealign (w[ 4], w[ 5], offset); w[36] = amd_bytealign (w[ 3], w[ 4], offset); w[35] = amd_bytealign (w[ 2], w[ 3], offset); w[34] = amd_bytealign (w[ 1], w[ 2], offset); w[33] = amd_bytealign (w[ 0], w[ 1], offset); w[32] = amd_bytealign ( 0, w[ 0], offset); w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 33: w[63] = amd_bytealign (w[29], w[30], offset); w[62] = amd_bytealign (w[28], w[29], offset); w[61] = amd_bytealign (w[27], w[28], offset); w[60] = amd_bytealign (w[26], w[27], offset); w[59] = amd_bytealign (w[25], w[26], offset); w[58] = amd_bytealign (w[24], w[25], offset); w[57] = amd_bytealign (w[23], w[24], offset); w[56] = amd_bytealign (w[22], w[23], offset); w[55] = amd_bytealign (w[21], w[22], offset); w[54] = amd_bytealign (w[20], w[21], offset); w[53] = amd_bytealign (w[19], w[20], offset); w[52] = amd_bytealign (w[18], w[19], offset); w[51] = amd_bytealign (w[17], w[18], offset); w[50] = amd_bytealign (w[16], w[17], offset); w[49] = amd_bytealign (w[15], w[16], offset); w[48] = amd_bytealign (w[14], w[15], offset); w[47] = amd_bytealign (w[13], w[14], offset); w[46] = amd_bytealign (w[12], w[13], offset); w[45] = amd_bytealign (w[11], w[12], offset); w[44] = amd_bytealign (w[10], w[11], offset); w[43] = amd_bytealign (w[ 9], w[10], offset); w[42] = amd_bytealign (w[ 8], w[ 9], offset); w[41] = amd_bytealign (w[ 7], w[ 8], offset); w[40] = amd_bytealign (w[ 6], w[ 7], offset); w[39] = amd_bytealign (w[ 5], w[ 6], offset); w[38] = amd_bytealign (w[ 4], w[ 5], offset); w[37] = amd_bytealign (w[ 3], w[ 4], offset); w[36] = amd_bytealign (w[ 2], w[ 3], offset); w[35] = amd_bytealign (w[ 1], w[ 2], offset); w[34] = amd_bytealign (w[ 0], w[ 1], offset); w[33] = amd_bytealign ( 0, w[ 0], offset); w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 34: w[63] = amd_bytealign (w[28], w[29], offset); w[62] = amd_bytealign (w[27], w[28], offset); w[61] = amd_bytealign (w[26], w[27], offset); w[60] = amd_bytealign (w[25], w[26], offset); w[59] = amd_bytealign (w[24], w[25], offset); w[58] = amd_bytealign (w[23], w[24], offset); w[57] = amd_bytealign (w[22], w[23], offset); w[56] = amd_bytealign (w[21], w[22], offset); w[55] = amd_bytealign (w[20], w[21], offset); w[54] = amd_bytealign (w[19], w[20], offset); w[53] = amd_bytealign (w[18], w[19], offset); w[52] = amd_bytealign (w[17], w[18], offset); w[51] = amd_bytealign (w[16], w[17], offset); w[50] = amd_bytealign (w[15], w[16], offset); w[49] = amd_bytealign (w[14], w[15], offset); w[48] = amd_bytealign (w[13], w[14], offset); w[47] = amd_bytealign (w[12], w[13], offset); w[46] = amd_bytealign (w[11], w[12], offset); w[45] = amd_bytealign (w[10], w[11], offset); w[44] = amd_bytealign (w[ 9], w[10], offset); w[43] = amd_bytealign (w[ 8], w[ 9], offset); w[42] = amd_bytealign (w[ 7], w[ 8], offset); w[41] = amd_bytealign (w[ 6], w[ 7], offset); w[40] = amd_bytealign (w[ 5], w[ 6], offset); w[39] = amd_bytealign (w[ 4], w[ 5], offset); w[38] = amd_bytealign (w[ 3], w[ 4], offset); w[37] = amd_bytealign (w[ 2], w[ 3], offset); w[36] = amd_bytealign (w[ 1], w[ 2], offset); w[35] = amd_bytealign (w[ 0], w[ 1], offset); w[34] = amd_bytealign ( 0, w[ 0], offset); w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 35: w[63] = amd_bytealign (w[27], w[28], offset); w[62] = amd_bytealign (w[26], w[27], offset); w[61] = amd_bytealign (w[25], w[26], offset); w[60] = amd_bytealign (w[24], w[25], offset); w[59] = amd_bytealign (w[23], w[24], offset); w[58] = amd_bytealign (w[22], w[23], offset); w[57] = amd_bytealign (w[21], w[22], offset); w[56] = amd_bytealign (w[20], w[21], offset); w[55] = amd_bytealign (w[19], w[20], offset); w[54] = amd_bytealign (w[18], w[19], offset); w[53] = amd_bytealign (w[17], w[18], offset); w[52] = amd_bytealign (w[16], w[17], offset); w[51] = amd_bytealign (w[15], w[16], offset); w[50] = amd_bytealign (w[14], w[15], offset); w[49] = amd_bytealign (w[13], w[14], offset); w[48] = amd_bytealign (w[12], w[13], offset); w[47] = amd_bytealign (w[11], w[12], offset); w[46] = amd_bytealign (w[10], w[11], offset); w[45] = amd_bytealign (w[ 9], w[10], offset); w[44] = amd_bytealign (w[ 8], w[ 9], offset); w[43] = amd_bytealign (w[ 7], w[ 8], offset); w[42] = amd_bytealign (w[ 6], w[ 7], offset); w[41] = amd_bytealign (w[ 5], w[ 6], offset); w[40] = amd_bytealign (w[ 4], w[ 5], offset); w[39] = amd_bytealign (w[ 3], w[ 4], offset); w[38] = amd_bytealign (w[ 2], w[ 3], offset); w[37] = amd_bytealign (w[ 1], w[ 2], offset); w[36] = amd_bytealign (w[ 0], w[ 1], offset); w[35] = amd_bytealign ( 0, w[ 0], offset); w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 36: w[63] = amd_bytealign (w[26], w[27], offset); w[62] = amd_bytealign (w[25], w[26], offset); w[61] = amd_bytealign (w[24], w[25], offset); w[60] = amd_bytealign (w[23], w[24], offset); w[59] = amd_bytealign (w[22], w[23], offset); w[58] = amd_bytealign (w[21], w[22], offset); w[57] = amd_bytealign (w[20], w[21], offset); w[56] = amd_bytealign (w[19], w[20], offset); w[55] = amd_bytealign (w[18], w[19], offset); w[54] = amd_bytealign (w[17], w[18], offset); w[53] = amd_bytealign (w[16], w[17], offset); w[52] = amd_bytealign (w[15], w[16], offset); w[51] = amd_bytealign (w[14], w[15], offset); w[50] = amd_bytealign (w[13], w[14], offset); w[49] = amd_bytealign (w[12], w[13], offset); w[48] = amd_bytealign (w[11], w[12], offset); w[47] = amd_bytealign (w[10], w[11], offset); w[46] = amd_bytealign (w[ 9], w[10], offset); w[45] = amd_bytealign (w[ 8], w[ 9], offset); w[44] = amd_bytealign (w[ 7], w[ 8], offset); w[43] = amd_bytealign (w[ 6], w[ 7], offset); w[42] = amd_bytealign (w[ 5], w[ 6], offset); w[41] = amd_bytealign (w[ 4], w[ 5], offset); w[40] = amd_bytealign (w[ 3], w[ 4], offset); w[39] = amd_bytealign (w[ 2], w[ 3], offset); w[38] = amd_bytealign (w[ 1], w[ 2], offset); w[37] = amd_bytealign (w[ 0], w[ 1], offset); w[36] = amd_bytealign ( 0, w[ 0], offset); w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 37: w[63] = amd_bytealign (w[25], w[26], offset); w[62] = amd_bytealign (w[24], w[25], offset); w[61] = amd_bytealign (w[23], w[24], offset); w[60] = amd_bytealign (w[22], w[23], offset); w[59] = amd_bytealign (w[21], w[22], offset); w[58] = amd_bytealign (w[20], w[21], offset); w[57] = amd_bytealign (w[19], w[20], offset); w[56] = amd_bytealign (w[18], w[19], offset); w[55] = amd_bytealign (w[17], w[18], offset); w[54] = amd_bytealign (w[16], w[17], offset); w[53] = amd_bytealign (w[15], w[16], offset); w[52] = amd_bytealign (w[14], w[15], offset); w[51] = amd_bytealign (w[13], w[14], offset); w[50] = amd_bytealign (w[12], w[13], offset); w[49] = amd_bytealign (w[11], w[12], offset); w[48] = amd_bytealign (w[10], w[11], offset); w[47] = amd_bytealign (w[ 9], w[10], offset); w[46] = amd_bytealign (w[ 8], w[ 9], offset); w[45] = amd_bytealign (w[ 7], w[ 8], offset); w[44] = amd_bytealign (w[ 6], w[ 7], offset); w[43] = amd_bytealign (w[ 5], w[ 6], offset); w[42] = amd_bytealign (w[ 4], w[ 5], offset); w[41] = amd_bytealign (w[ 3], w[ 4], offset); w[40] = amd_bytealign (w[ 2], w[ 3], offset); w[39] = amd_bytealign (w[ 1], w[ 2], offset); w[38] = amd_bytealign (w[ 0], w[ 1], offset); w[37] = amd_bytealign ( 0, w[ 0], offset); w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 38: w[63] = amd_bytealign (w[24], w[25], offset); w[62] = amd_bytealign (w[23], w[24], offset); w[61] = amd_bytealign (w[22], w[23], offset); w[60] = amd_bytealign (w[21], w[22], offset); w[59] = amd_bytealign (w[20], w[21], offset); w[58] = amd_bytealign (w[19], w[20], offset); w[57] = amd_bytealign (w[18], w[19], offset); w[56] = amd_bytealign (w[17], w[18], offset); w[55] = amd_bytealign (w[16], w[17], offset); w[54] = amd_bytealign (w[15], w[16], offset); w[53] = amd_bytealign (w[14], w[15], offset); w[52] = amd_bytealign (w[13], w[14], offset); w[51] = amd_bytealign (w[12], w[13], offset); w[50] = amd_bytealign (w[11], w[12], offset); w[49] = amd_bytealign (w[10], w[11], offset); w[48] = amd_bytealign (w[ 9], w[10], offset); w[47] = amd_bytealign (w[ 8], w[ 9], offset); w[46] = amd_bytealign (w[ 7], w[ 8], offset); w[45] = amd_bytealign (w[ 6], w[ 7], offset); w[44] = amd_bytealign (w[ 5], w[ 6], offset); w[43] = amd_bytealign (w[ 4], w[ 5], offset); w[42] = amd_bytealign (w[ 3], w[ 4], offset); w[41] = amd_bytealign (w[ 2], w[ 3], offset); w[40] = amd_bytealign (w[ 1], w[ 2], offset); w[39] = amd_bytealign (w[ 0], w[ 1], offset); w[38] = amd_bytealign ( 0, w[ 0], offset); w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 39: w[63] = amd_bytealign (w[23], w[24], offset); w[62] = amd_bytealign (w[22], w[23], offset); w[61] = amd_bytealign (w[21], w[22], offset); w[60] = amd_bytealign (w[20], w[21], offset); w[59] = amd_bytealign (w[19], w[20], offset); w[58] = amd_bytealign (w[18], w[19], offset); w[57] = amd_bytealign (w[17], w[18], offset); w[56] = amd_bytealign (w[16], w[17], offset); w[55] = amd_bytealign (w[15], w[16], offset); w[54] = amd_bytealign (w[14], w[15], offset); w[53] = amd_bytealign (w[13], w[14], offset); w[52] = amd_bytealign (w[12], w[13], offset); w[51] = amd_bytealign (w[11], w[12], offset); w[50] = amd_bytealign (w[10], w[11], offset); w[49] = amd_bytealign (w[ 9], w[10], offset); w[48] = amd_bytealign (w[ 8], w[ 9], offset); w[47] = amd_bytealign (w[ 7], w[ 8], offset); w[46] = amd_bytealign (w[ 6], w[ 7], offset); w[45] = amd_bytealign (w[ 5], w[ 6], offset); w[44] = amd_bytealign (w[ 4], w[ 5], offset); w[43] = amd_bytealign (w[ 3], w[ 4], offset); w[42] = amd_bytealign (w[ 2], w[ 3], offset); w[41] = amd_bytealign (w[ 1], w[ 2], offset); w[40] = amd_bytealign (w[ 0], w[ 1], offset); w[39] = amd_bytealign ( 0, w[ 0], offset); w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 40: w[63] = amd_bytealign (w[22], w[23], offset); w[62] = amd_bytealign (w[21], w[22], offset); w[61] = amd_bytealign (w[20], w[21], offset); w[60] = amd_bytealign (w[19], w[20], offset); w[59] = amd_bytealign (w[18], w[19], offset); w[58] = amd_bytealign (w[17], w[18], offset); w[57] = amd_bytealign (w[16], w[17], offset); w[56] = amd_bytealign (w[15], w[16], offset); w[55] = amd_bytealign (w[14], w[15], offset); w[54] = amd_bytealign (w[13], w[14], offset); w[53] = amd_bytealign (w[12], w[13], offset); w[52] = amd_bytealign (w[11], w[12], offset); w[51] = amd_bytealign (w[10], w[11], offset); w[50] = amd_bytealign (w[ 9], w[10], offset); w[49] = amd_bytealign (w[ 8], w[ 9], offset); w[48] = amd_bytealign (w[ 7], w[ 8], offset); w[47] = amd_bytealign (w[ 6], w[ 7], offset); w[46] = amd_bytealign (w[ 5], w[ 6], offset); w[45] = amd_bytealign (w[ 4], w[ 5], offset); w[44] = amd_bytealign (w[ 3], w[ 4], offset); w[43] = amd_bytealign (w[ 2], w[ 3], offset); w[42] = amd_bytealign (w[ 1], w[ 2], offset); w[41] = amd_bytealign (w[ 0], w[ 1], offset); w[40] = amd_bytealign ( 0, w[ 0], offset); w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 41: w[63] = amd_bytealign (w[21], w[22], offset); w[62] = amd_bytealign (w[20], w[21], offset); w[61] = amd_bytealign (w[19], w[20], offset); w[60] = amd_bytealign (w[18], w[19], offset); w[59] = amd_bytealign (w[17], w[18], offset); w[58] = amd_bytealign (w[16], w[17], offset); w[57] = amd_bytealign (w[15], w[16], offset); w[56] = amd_bytealign (w[14], w[15], offset); w[55] = amd_bytealign (w[13], w[14], offset); w[54] = amd_bytealign (w[12], w[13], offset); w[53] = amd_bytealign (w[11], w[12], offset); w[52] = amd_bytealign (w[10], w[11], offset); w[51] = amd_bytealign (w[ 9], w[10], offset); w[50] = amd_bytealign (w[ 8], w[ 9], offset); w[49] = amd_bytealign (w[ 7], w[ 8], offset); w[48] = amd_bytealign (w[ 6], w[ 7], offset); w[47] = amd_bytealign (w[ 5], w[ 6], offset); w[46] = amd_bytealign (w[ 4], w[ 5], offset); w[45] = amd_bytealign (w[ 3], w[ 4], offset); w[44] = amd_bytealign (w[ 2], w[ 3], offset); w[43] = amd_bytealign (w[ 1], w[ 2], offset); w[42] = amd_bytealign (w[ 0], w[ 1], offset); w[41] = amd_bytealign ( 0, w[ 0], offset); w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 42: w[63] = amd_bytealign (w[20], w[21], offset); w[62] = amd_bytealign (w[19], w[20], offset); w[61] = amd_bytealign (w[18], w[19], offset); w[60] = amd_bytealign (w[17], w[18], offset); w[59] = amd_bytealign (w[16], w[17], offset); w[58] = amd_bytealign (w[15], w[16], offset); w[57] = amd_bytealign (w[14], w[15], offset); w[56] = amd_bytealign (w[13], w[14], offset); w[55] = amd_bytealign (w[12], w[13], offset); w[54] = amd_bytealign (w[11], w[12], offset); w[53] = amd_bytealign (w[10], w[11], offset); w[52] = amd_bytealign (w[ 9], w[10], offset); w[51] = amd_bytealign (w[ 8], w[ 9], offset); w[50] = amd_bytealign (w[ 7], w[ 8], offset); w[49] = amd_bytealign (w[ 6], w[ 7], offset); w[48] = amd_bytealign (w[ 5], w[ 6], offset); w[47] = amd_bytealign (w[ 4], w[ 5], offset); w[46] = amd_bytealign (w[ 3], w[ 4], offset); w[45] = amd_bytealign (w[ 2], w[ 3], offset); w[44] = amd_bytealign (w[ 1], w[ 2], offset); w[43] = amd_bytealign (w[ 0], w[ 1], offset); w[42] = amd_bytealign ( 0, w[ 0], offset); w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 43: w[63] = amd_bytealign (w[19], w[20], offset); w[62] = amd_bytealign (w[18], w[19], offset); w[61] = amd_bytealign (w[17], w[18], offset); w[60] = amd_bytealign (w[16], w[17], offset); w[59] = amd_bytealign (w[15], w[16], offset); w[58] = amd_bytealign (w[14], w[15], offset); w[57] = amd_bytealign (w[13], w[14], offset); w[56] = amd_bytealign (w[12], w[13], offset); w[55] = amd_bytealign (w[11], w[12], offset); w[54] = amd_bytealign (w[10], w[11], offset); w[53] = amd_bytealign (w[ 9], w[10], offset); w[52] = amd_bytealign (w[ 8], w[ 9], offset); w[51] = amd_bytealign (w[ 7], w[ 8], offset); w[50] = amd_bytealign (w[ 6], w[ 7], offset); w[49] = amd_bytealign (w[ 5], w[ 6], offset); w[48] = amd_bytealign (w[ 4], w[ 5], offset); w[47] = amd_bytealign (w[ 3], w[ 4], offset); w[46] = amd_bytealign (w[ 2], w[ 3], offset); w[45] = amd_bytealign (w[ 1], w[ 2], offset); w[44] = amd_bytealign (w[ 0], w[ 1], offset); w[43] = amd_bytealign ( 0, w[ 0], offset); w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 44: w[63] = amd_bytealign (w[18], w[19], offset); w[62] = amd_bytealign (w[17], w[18], offset); w[61] = amd_bytealign (w[16], w[17], offset); w[60] = amd_bytealign (w[15], w[16], offset); w[59] = amd_bytealign (w[14], w[15], offset); w[58] = amd_bytealign (w[13], w[14], offset); w[57] = amd_bytealign (w[12], w[13], offset); w[56] = amd_bytealign (w[11], w[12], offset); w[55] = amd_bytealign (w[10], w[11], offset); w[54] = amd_bytealign (w[ 9], w[10], offset); w[53] = amd_bytealign (w[ 8], w[ 9], offset); w[52] = amd_bytealign (w[ 7], w[ 8], offset); w[51] = amd_bytealign (w[ 6], w[ 7], offset); w[50] = amd_bytealign (w[ 5], w[ 6], offset); w[49] = amd_bytealign (w[ 4], w[ 5], offset); w[48] = amd_bytealign (w[ 3], w[ 4], offset); w[47] = amd_bytealign (w[ 2], w[ 3], offset); w[46] = amd_bytealign (w[ 1], w[ 2], offset); w[45] = amd_bytealign (w[ 0], w[ 1], offset); w[44] = amd_bytealign ( 0, w[ 0], offset); w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 45: w[63] = amd_bytealign (w[17], w[18], offset); w[62] = amd_bytealign (w[16], w[17], offset); w[61] = amd_bytealign (w[15], w[16], offset); w[60] = amd_bytealign (w[14], w[15], offset); w[59] = amd_bytealign (w[13], w[14], offset); w[58] = amd_bytealign (w[12], w[13], offset); w[57] = amd_bytealign (w[11], w[12], offset); w[56] = amd_bytealign (w[10], w[11], offset); w[55] = amd_bytealign (w[ 9], w[10], offset); w[54] = amd_bytealign (w[ 8], w[ 9], offset); w[53] = amd_bytealign (w[ 7], w[ 8], offset); w[52] = amd_bytealign (w[ 6], w[ 7], offset); w[51] = amd_bytealign (w[ 5], w[ 6], offset); w[50] = amd_bytealign (w[ 4], w[ 5], offset); w[49] = amd_bytealign (w[ 3], w[ 4], offset); w[48] = amd_bytealign (w[ 2], w[ 3], offset); w[47] = amd_bytealign (w[ 1], w[ 2], offset); w[46] = amd_bytealign (w[ 0], w[ 1], offset); w[45] = amd_bytealign ( 0, w[ 0], offset); w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 46: w[63] = amd_bytealign (w[16], w[17], offset); w[62] = amd_bytealign (w[15], w[16], offset); w[61] = amd_bytealign (w[14], w[15], offset); w[60] = amd_bytealign (w[13], w[14], offset); w[59] = amd_bytealign (w[12], w[13], offset); w[58] = amd_bytealign (w[11], w[12], offset); w[57] = amd_bytealign (w[10], w[11], offset); w[56] = amd_bytealign (w[ 9], w[10], offset); w[55] = amd_bytealign (w[ 8], w[ 9], offset); w[54] = amd_bytealign (w[ 7], w[ 8], offset); w[53] = amd_bytealign (w[ 6], w[ 7], offset); w[52] = amd_bytealign (w[ 5], w[ 6], offset); w[51] = amd_bytealign (w[ 4], w[ 5], offset); w[50] = amd_bytealign (w[ 3], w[ 4], offset); w[49] = amd_bytealign (w[ 2], w[ 3], offset); w[48] = amd_bytealign (w[ 1], w[ 2], offset); w[47] = amd_bytealign (w[ 0], w[ 1], offset); w[46] = amd_bytealign ( 0, w[ 0], offset); w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 47: w[63] = amd_bytealign (w[15], w[16], offset); w[62] = amd_bytealign (w[14], w[15], offset); w[61] = amd_bytealign (w[13], w[14], offset); w[60] = amd_bytealign (w[12], w[13], offset); w[59] = amd_bytealign (w[11], w[12], offset); w[58] = amd_bytealign (w[10], w[11], offset); w[57] = amd_bytealign (w[ 9], w[10], offset); w[56] = amd_bytealign (w[ 8], w[ 9], offset); w[55] = amd_bytealign (w[ 7], w[ 8], offset); w[54] = amd_bytealign (w[ 6], w[ 7], offset); w[53] = amd_bytealign (w[ 5], w[ 6], offset); w[52] = amd_bytealign (w[ 4], w[ 5], offset); w[51] = amd_bytealign (w[ 3], w[ 4], offset); w[50] = amd_bytealign (w[ 2], w[ 3], offset); w[49] = amd_bytealign (w[ 1], w[ 2], offset); w[48] = amd_bytealign (w[ 0], w[ 1], offset); w[47] = amd_bytealign ( 0, w[ 0], offset); w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 48: w[63] = amd_bytealign (w[14], w[15], offset); w[62] = amd_bytealign (w[13], w[14], offset); w[61] = amd_bytealign (w[12], w[13], offset); w[60] = amd_bytealign (w[11], w[12], offset); w[59] = amd_bytealign (w[10], w[11], offset); w[58] = amd_bytealign (w[ 9], w[10], offset); w[57] = amd_bytealign (w[ 8], w[ 9], offset); w[56] = amd_bytealign (w[ 7], w[ 8], offset); w[55] = amd_bytealign (w[ 6], w[ 7], offset); w[54] = amd_bytealign (w[ 5], w[ 6], offset); w[53] = amd_bytealign (w[ 4], w[ 5], offset); w[52] = amd_bytealign (w[ 3], w[ 4], offset); w[51] = amd_bytealign (w[ 2], w[ 3], offset); w[50] = amd_bytealign (w[ 1], w[ 2], offset); w[49] = amd_bytealign (w[ 0], w[ 1], offset); w[48] = amd_bytealign ( 0, w[ 0], offset); w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 49: w[63] = amd_bytealign (w[13], w[14], offset); w[62] = amd_bytealign (w[12], w[13], offset); w[61] = amd_bytealign (w[11], w[12], offset); w[60] = amd_bytealign (w[10], w[11], offset); w[59] = amd_bytealign (w[ 9], w[10], offset); w[58] = amd_bytealign (w[ 8], w[ 9], offset); w[57] = amd_bytealign (w[ 7], w[ 8], offset); w[56] = amd_bytealign (w[ 6], w[ 7], offset); w[55] = amd_bytealign (w[ 5], w[ 6], offset); w[54] = amd_bytealign (w[ 4], w[ 5], offset); w[53] = amd_bytealign (w[ 3], w[ 4], offset); w[52] = amd_bytealign (w[ 2], w[ 3], offset); w[51] = amd_bytealign (w[ 1], w[ 2], offset); w[50] = amd_bytealign (w[ 0], w[ 1], offset); w[49] = amd_bytealign ( 0, w[ 0], offset); w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 50: w[63] = amd_bytealign (w[12], w[13], offset); w[62] = amd_bytealign (w[11], w[12], offset); w[61] = amd_bytealign (w[10], w[11], offset); w[60] = amd_bytealign (w[ 9], w[10], offset); w[59] = amd_bytealign (w[ 8], w[ 9], offset); w[58] = amd_bytealign (w[ 7], w[ 8], offset); w[57] = amd_bytealign (w[ 6], w[ 7], offset); w[56] = amd_bytealign (w[ 5], w[ 6], offset); w[55] = amd_bytealign (w[ 4], w[ 5], offset); w[54] = amd_bytealign (w[ 3], w[ 4], offset); w[53] = amd_bytealign (w[ 2], w[ 3], offset); w[52] = amd_bytealign (w[ 1], w[ 2], offset); w[51] = amd_bytealign (w[ 0], w[ 1], offset); w[50] = amd_bytealign ( 0, w[ 0], offset); w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 51: w[63] = amd_bytealign (w[11], w[12], offset); w[62] = amd_bytealign (w[10], w[11], offset); w[61] = amd_bytealign (w[ 9], w[10], offset); w[60] = amd_bytealign (w[ 8], w[ 9], offset); w[59] = amd_bytealign (w[ 7], w[ 8], offset); w[58] = amd_bytealign (w[ 6], w[ 7], offset); w[57] = amd_bytealign (w[ 5], w[ 6], offset); w[56] = amd_bytealign (w[ 4], w[ 5], offset); w[55] = amd_bytealign (w[ 3], w[ 4], offset); w[54] = amd_bytealign (w[ 2], w[ 3], offset); w[53] = amd_bytealign (w[ 1], w[ 2], offset); w[52] = amd_bytealign (w[ 0], w[ 1], offset); w[51] = amd_bytealign ( 0, w[ 0], offset); w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 52: w[63] = amd_bytealign (w[10], w[11], offset); w[62] = amd_bytealign (w[ 9], w[10], offset); w[61] = amd_bytealign (w[ 8], w[ 9], offset); w[60] = amd_bytealign (w[ 7], w[ 8], offset); w[59] = amd_bytealign (w[ 6], w[ 7], offset); w[58] = amd_bytealign (w[ 5], w[ 6], offset); w[57] = amd_bytealign (w[ 4], w[ 5], offset); w[56] = amd_bytealign (w[ 3], w[ 4], offset); w[55] = amd_bytealign (w[ 2], w[ 3], offset); w[54] = amd_bytealign (w[ 1], w[ 2], offset); w[53] = amd_bytealign (w[ 0], w[ 1], offset); w[52] = amd_bytealign ( 0, w[ 0], offset); w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 53: w[63] = amd_bytealign (w[ 9], w[10], offset); w[62] = amd_bytealign (w[ 8], w[ 9], offset); w[61] = amd_bytealign (w[ 7], w[ 8], offset); w[60] = amd_bytealign (w[ 6], w[ 7], offset); w[59] = amd_bytealign (w[ 5], w[ 6], offset); w[58] = amd_bytealign (w[ 4], w[ 5], offset); w[57] = amd_bytealign (w[ 3], w[ 4], offset); w[56] = amd_bytealign (w[ 2], w[ 3], offset); w[55] = amd_bytealign (w[ 1], w[ 2], offset); w[54] = amd_bytealign (w[ 0], w[ 1], offset); w[53] = amd_bytealign ( 0, w[ 0], offset); w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 54: w[63] = amd_bytealign (w[ 8], w[ 9], offset); w[62] = amd_bytealign (w[ 7], w[ 8], offset); w[61] = amd_bytealign (w[ 6], w[ 7], offset); w[60] = amd_bytealign (w[ 5], w[ 6], offset); w[59] = amd_bytealign (w[ 4], w[ 5], offset); w[58] = amd_bytealign (w[ 3], w[ 4], offset); w[57] = amd_bytealign (w[ 2], w[ 3], offset); w[56] = amd_bytealign (w[ 1], w[ 2], offset); w[55] = amd_bytealign (w[ 0], w[ 1], offset); w[54] = amd_bytealign ( 0, w[ 0], offset); w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 55: w[63] = amd_bytealign (w[ 7], w[ 8], offset); w[62] = amd_bytealign (w[ 6], w[ 7], offset); w[61] = amd_bytealign (w[ 5], w[ 6], offset); w[60] = amd_bytealign (w[ 4], w[ 5], offset); w[59] = amd_bytealign (w[ 3], w[ 4], offset); w[58] = amd_bytealign (w[ 2], w[ 3], offset); w[57] = amd_bytealign (w[ 1], w[ 2], offset); w[56] = amd_bytealign (w[ 0], w[ 1], offset); w[55] = amd_bytealign ( 0, w[ 0], offset); w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 56: w[63] = amd_bytealign (w[ 6], w[ 7], offset); w[62] = amd_bytealign (w[ 5], w[ 6], offset); w[61] = amd_bytealign (w[ 4], w[ 5], offset); w[60] = amd_bytealign (w[ 3], w[ 4], offset); w[59] = amd_bytealign (w[ 2], w[ 3], offset); w[58] = amd_bytealign (w[ 1], w[ 2], offset); w[57] = amd_bytealign (w[ 0], w[ 1], offset); w[56] = amd_bytealign ( 0, w[ 0], offset); w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 57: w[63] = amd_bytealign (w[ 5], w[ 6], offset); w[62] = amd_bytealign (w[ 4], w[ 5], offset); w[61] = amd_bytealign (w[ 3], w[ 4], offset); w[60] = amd_bytealign (w[ 2], w[ 3], offset); w[59] = amd_bytealign (w[ 1], w[ 2], offset); w[58] = amd_bytealign (w[ 0], w[ 1], offset); w[57] = amd_bytealign ( 0, w[ 0], offset); w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 58: w[63] = amd_bytealign (w[ 4], w[ 5], offset); w[62] = amd_bytealign (w[ 3], w[ 4], offset); w[61] = amd_bytealign (w[ 2], w[ 3], offset); w[60] = amd_bytealign (w[ 1], w[ 2], offset); w[59] = amd_bytealign (w[ 0], w[ 1], offset); w[58] = amd_bytealign ( 0, w[ 0], offset); w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 59: w[63] = amd_bytealign (w[ 3], w[ 4], offset); w[62] = amd_bytealign (w[ 2], w[ 3], offset); w[61] = amd_bytealign (w[ 1], w[ 2], offset); w[60] = amd_bytealign (w[ 0], w[ 1], offset); w[59] = amd_bytealign ( 0, w[ 0], offset); w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 60: w[63] = amd_bytealign (w[ 2], w[ 3], offset); w[62] = amd_bytealign (w[ 1], w[ 2], offset); w[61] = amd_bytealign (w[ 0], w[ 1], offset); w[60] = amd_bytealign ( 0, w[ 0], offset); w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 61: w[63] = amd_bytealign (w[ 1], w[ 2], offset); w[62] = amd_bytealign (w[ 0], w[ 1], offset); w[61] = amd_bytealign ( 0, w[ 0], offset); w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 62: w[63] = amd_bytealign (w[ 0], w[ 1], offset); w[62] = amd_bytealign ( 0, w[ 0], offset); w[61] = 0; w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 63: w[63] = amd_bytealign ( 0, w[ 0], offset); w[62] = 0; w[61] = 0; w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; } #endif #if (defined IS_AMD && AMD_GCN >= 3) || defined IS_NV #if defined IS_NV const int selector = (0x76543210 >> ((offset & 3) * 4)) & 0xffff; #endif #if defined IS_AMD const int selector = 0x0706050403020100 >> ((offset & 3) * 8); #endif switch (offset_switch) { case 0: w[63] = __byte_perm (w[63], w[62], selector); w[62] = __byte_perm (w[62], w[61], selector); w[61] = __byte_perm (w[61], w[60], selector); w[60] = __byte_perm (w[60], w[59], selector); w[59] = __byte_perm (w[59], w[58], selector); w[58] = __byte_perm (w[58], w[57], selector); w[57] = __byte_perm (w[57], w[56], selector); w[56] = __byte_perm (w[56], w[55], selector); w[55] = __byte_perm (w[55], w[54], selector); w[54] = __byte_perm (w[54], w[53], selector); w[53] = __byte_perm (w[53], w[52], selector); w[52] = __byte_perm (w[52], w[51], selector); w[51] = __byte_perm (w[51], w[50], selector); w[50] = __byte_perm (w[50], w[49], selector); w[49] = __byte_perm (w[49], w[48], selector); w[48] = __byte_perm (w[48], w[47], selector); w[47] = __byte_perm (w[47], w[46], selector); w[46] = __byte_perm (w[46], w[45], selector); w[45] = __byte_perm (w[45], w[44], selector); w[44] = __byte_perm (w[44], w[43], selector); w[43] = __byte_perm (w[43], w[42], selector); w[42] = __byte_perm (w[42], w[41], selector); w[41] = __byte_perm (w[41], w[40], selector); w[40] = __byte_perm (w[40], w[39], selector); w[39] = __byte_perm (w[39], w[38], selector); w[38] = __byte_perm (w[38], w[37], selector); w[37] = __byte_perm (w[37], w[36], selector); w[36] = __byte_perm (w[36], w[35], selector); w[35] = __byte_perm (w[35], w[34], selector); w[34] = __byte_perm (w[34], w[33], selector); w[33] = __byte_perm (w[33], w[32], selector); w[32] = __byte_perm (w[32], w[31], selector); w[31] = __byte_perm (w[31], w[30], selector); w[30] = __byte_perm (w[30], w[29], selector); w[29] = __byte_perm (w[29], w[28], selector); w[28] = __byte_perm (w[28], w[27], selector); w[27] = __byte_perm (w[27], w[26], selector); w[26] = __byte_perm (w[26], w[25], selector); w[25] = __byte_perm (w[25], w[24], selector); w[24] = __byte_perm (w[24], w[23], selector); w[23] = __byte_perm (w[23], w[22], selector); w[22] = __byte_perm (w[22], w[21], selector); w[21] = __byte_perm (w[21], w[20], selector); w[20] = __byte_perm (w[20], w[19], selector); w[19] = __byte_perm (w[19], w[18], selector); w[18] = __byte_perm (w[18], w[17], selector); w[17] = __byte_perm (w[17], w[16], selector); w[16] = __byte_perm (w[16], w[15], selector); w[15] = __byte_perm (w[15], w[14], selector); w[14] = __byte_perm (w[14], w[13], selector); w[13] = __byte_perm (w[13], w[12], selector); w[12] = __byte_perm (w[12], w[11], selector); w[11] = __byte_perm (w[11], w[10], selector); w[10] = __byte_perm (w[10], w[ 9], selector); w[ 9] = __byte_perm (w[ 9], w[ 8], selector); w[ 8] = __byte_perm (w[ 8], w[ 7], selector); w[ 7] = __byte_perm (w[ 7], w[ 6], selector); w[ 6] = __byte_perm (w[ 6], w[ 5], selector); w[ 5] = __byte_perm (w[ 5], w[ 4], selector); w[ 4] = __byte_perm (w[ 4], w[ 3], selector); w[ 3] = __byte_perm (w[ 3], w[ 2], selector); w[ 2] = __byte_perm (w[ 2], w[ 1], selector); w[ 1] = __byte_perm (w[ 1], w[ 0], selector); w[ 0] = __byte_perm (w[ 0], 0, selector); break; case 1: w[63] = __byte_perm (w[62], w[61], selector); w[62] = __byte_perm (w[61], w[60], selector); w[61] = __byte_perm (w[60], w[59], selector); w[60] = __byte_perm (w[59], w[58], selector); w[59] = __byte_perm (w[58], w[57], selector); w[58] = __byte_perm (w[57], w[56], selector); w[57] = __byte_perm (w[56], w[55], selector); w[56] = __byte_perm (w[55], w[54], selector); w[55] = __byte_perm (w[54], w[53], selector); w[54] = __byte_perm (w[53], w[52], selector); w[53] = __byte_perm (w[52], w[51], selector); w[52] = __byte_perm (w[51], w[50], selector); w[51] = __byte_perm (w[50], w[49], selector); w[50] = __byte_perm (w[49], w[48], selector); w[49] = __byte_perm (w[48], w[47], selector); w[48] = __byte_perm (w[47], w[46], selector); w[47] = __byte_perm (w[46], w[45], selector); w[46] = __byte_perm (w[45], w[44], selector); w[45] = __byte_perm (w[44], w[43], selector); w[44] = __byte_perm (w[43], w[42], selector); w[43] = __byte_perm (w[42], w[41], selector); w[42] = __byte_perm (w[41], w[40], selector); w[41] = __byte_perm (w[40], w[39], selector); w[40] = __byte_perm (w[39], w[38], selector); w[39] = __byte_perm (w[38], w[37], selector); w[38] = __byte_perm (w[37], w[36], selector); w[37] = __byte_perm (w[36], w[35], selector); w[36] = __byte_perm (w[35], w[34], selector); w[35] = __byte_perm (w[34], w[33], selector); w[34] = __byte_perm (w[33], w[32], selector); w[33] = __byte_perm (w[32], w[31], selector); w[32] = __byte_perm (w[31], w[30], selector); w[31] = __byte_perm (w[30], w[29], selector); w[30] = __byte_perm (w[29], w[28], selector); w[29] = __byte_perm (w[28], w[27], selector); w[28] = __byte_perm (w[27], w[26], selector); w[27] = __byte_perm (w[26], w[25], selector); w[26] = __byte_perm (w[25], w[24], selector); w[25] = __byte_perm (w[24], w[23], selector); w[24] = __byte_perm (w[23], w[22], selector); w[23] = __byte_perm (w[22], w[21], selector); w[22] = __byte_perm (w[21], w[20], selector); w[21] = __byte_perm (w[20], w[19], selector); w[20] = __byte_perm (w[19], w[18], selector); w[19] = __byte_perm (w[18], w[17], selector); w[18] = __byte_perm (w[17], w[16], selector); w[17] = __byte_perm (w[16], w[15], selector); w[16] = __byte_perm (w[15], w[14], selector); w[15] = __byte_perm (w[14], w[13], selector); w[14] = __byte_perm (w[13], w[12], selector); w[13] = __byte_perm (w[12], w[11], selector); w[12] = __byte_perm (w[11], w[10], selector); w[11] = __byte_perm (w[10], w[ 9], selector); w[10] = __byte_perm (w[ 9], w[ 8], selector); w[ 9] = __byte_perm (w[ 8], w[ 7], selector); w[ 8] = __byte_perm (w[ 7], w[ 6], selector); w[ 7] = __byte_perm (w[ 6], w[ 5], selector); w[ 6] = __byte_perm (w[ 5], w[ 4], selector); w[ 5] = __byte_perm (w[ 4], w[ 3], selector); w[ 4] = __byte_perm (w[ 3], w[ 2], selector); w[ 3] = __byte_perm (w[ 2], w[ 1], selector); w[ 2] = __byte_perm (w[ 1], w[ 0], selector); w[ 1] = __byte_perm (w[ 0], 0, selector); w[ 0] = 0; break; case 2: w[63] = __byte_perm (w[61], w[60], selector); w[62] = __byte_perm (w[60], w[59], selector); w[61] = __byte_perm (w[59], w[58], selector); w[60] = __byte_perm (w[58], w[57], selector); w[59] = __byte_perm (w[57], w[56], selector); w[58] = __byte_perm (w[56], w[55], selector); w[57] = __byte_perm (w[55], w[54], selector); w[56] = __byte_perm (w[54], w[53], selector); w[55] = __byte_perm (w[53], w[52], selector); w[54] = __byte_perm (w[52], w[51], selector); w[53] = __byte_perm (w[51], w[50], selector); w[52] = __byte_perm (w[50], w[49], selector); w[51] = __byte_perm (w[49], w[48], selector); w[50] = __byte_perm (w[48], w[47], selector); w[49] = __byte_perm (w[47], w[46], selector); w[48] = __byte_perm (w[46], w[45], selector); w[47] = __byte_perm (w[45], w[44], selector); w[46] = __byte_perm (w[44], w[43], selector); w[45] = __byte_perm (w[43], w[42], selector); w[44] = __byte_perm (w[42], w[41], selector); w[43] = __byte_perm (w[41], w[40], selector); w[42] = __byte_perm (w[40], w[39], selector); w[41] = __byte_perm (w[39], w[38], selector); w[40] = __byte_perm (w[38], w[37], selector); w[39] = __byte_perm (w[37], w[36], selector); w[38] = __byte_perm (w[36], w[35], selector); w[37] = __byte_perm (w[35], w[34], selector); w[36] = __byte_perm (w[34], w[33], selector); w[35] = __byte_perm (w[33], w[32], selector); w[34] = __byte_perm (w[32], w[31], selector); w[33] = __byte_perm (w[31], w[30], selector); w[32] = __byte_perm (w[30], w[29], selector); w[31] = __byte_perm (w[29], w[28], selector); w[30] = __byte_perm (w[28], w[27], selector); w[29] = __byte_perm (w[27], w[26], selector); w[28] = __byte_perm (w[26], w[25], selector); w[27] = __byte_perm (w[25], w[24], selector); w[26] = __byte_perm (w[24], w[23], selector); w[25] = __byte_perm (w[23], w[22], selector); w[24] = __byte_perm (w[22], w[21], selector); w[23] = __byte_perm (w[21], w[20], selector); w[22] = __byte_perm (w[20], w[19], selector); w[21] = __byte_perm (w[19], w[18], selector); w[20] = __byte_perm (w[18], w[17], selector); w[19] = __byte_perm (w[17], w[16], selector); w[18] = __byte_perm (w[16], w[15], selector); w[17] = __byte_perm (w[15], w[14], selector); w[16] = __byte_perm (w[14], w[13], selector); w[15] = __byte_perm (w[13], w[12], selector); w[14] = __byte_perm (w[12], w[11], selector); w[13] = __byte_perm (w[11], w[10], selector); w[12] = __byte_perm (w[10], w[ 9], selector); w[11] = __byte_perm (w[ 9], w[ 8], selector); w[10] = __byte_perm (w[ 8], w[ 7], selector); w[ 9] = __byte_perm (w[ 7], w[ 6], selector); w[ 8] = __byte_perm (w[ 6], w[ 5], selector); w[ 7] = __byte_perm (w[ 5], w[ 4], selector); w[ 6] = __byte_perm (w[ 4], w[ 3], selector); w[ 5] = __byte_perm (w[ 3], w[ 2], selector); w[ 4] = __byte_perm (w[ 2], w[ 1], selector); w[ 3] = __byte_perm (w[ 1], w[ 0], selector); w[ 2] = __byte_perm (w[ 0], 0, selector); w[ 1] = 0; w[ 0] = 0; break; case 3: w[63] = __byte_perm (w[60], w[59], selector); w[62] = __byte_perm (w[59], w[58], selector); w[61] = __byte_perm (w[58], w[57], selector); w[60] = __byte_perm (w[57], w[56], selector); w[59] = __byte_perm (w[56], w[55], selector); w[58] = __byte_perm (w[55], w[54], selector); w[57] = __byte_perm (w[54], w[53], selector); w[56] = __byte_perm (w[53], w[52], selector); w[55] = __byte_perm (w[52], w[51], selector); w[54] = __byte_perm (w[51], w[50], selector); w[53] = __byte_perm (w[50], w[49], selector); w[52] = __byte_perm (w[49], w[48], selector); w[51] = __byte_perm (w[48], w[47], selector); w[50] = __byte_perm (w[47], w[46], selector); w[49] = __byte_perm (w[46], w[45], selector); w[48] = __byte_perm (w[45], w[44], selector); w[47] = __byte_perm (w[44], w[43], selector); w[46] = __byte_perm (w[43], w[42], selector); w[45] = __byte_perm (w[42], w[41], selector); w[44] = __byte_perm (w[41], w[40], selector); w[43] = __byte_perm (w[40], w[39], selector); w[42] = __byte_perm (w[39], w[38], selector); w[41] = __byte_perm (w[38], w[37], selector); w[40] = __byte_perm (w[37], w[36], selector); w[39] = __byte_perm (w[36], w[35], selector); w[38] = __byte_perm (w[35], w[34], selector); w[37] = __byte_perm (w[34], w[33], selector); w[36] = __byte_perm (w[33], w[32], selector); w[35] = __byte_perm (w[32], w[31], selector); w[34] = __byte_perm (w[31], w[30], selector); w[33] = __byte_perm (w[30], w[29], selector); w[32] = __byte_perm (w[29], w[28], selector); w[31] = __byte_perm (w[28], w[27], selector); w[30] = __byte_perm (w[27], w[26], selector); w[29] = __byte_perm (w[26], w[25], selector); w[28] = __byte_perm (w[25], w[24], selector); w[27] = __byte_perm (w[24], w[23], selector); w[26] = __byte_perm (w[23], w[22], selector); w[25] = __byte_perm (w[22], w[21], selector); w[24] = __byte_perm (w[21], w[20], selector); w[23] = __byte_perm (w[20], w[19], selector); w[22] = __byte_perm (w[19], w[18], selector); w[21] = __byte_perm (w[18], w[17], selector); w[20] = __byte_perm (w[17], w[16], selector); w[19] = __byte_perm (w[16], w[15], selector); w[18] = __byte_perm (w[15], w[14], selector); w[17] = __byte_perm (w[14], w[13], selector); w[16] = __byte_perm (w[13], w[12], selector); w[15] = __byte_perm (w[12], w[11], selector); w[14] = __byte_perm (w[11], w[10], selector); w[13] = __byte_perm (w[10], w[ 9], selector); w[12] = __byte_perm (w[ 9], w[ 8], selector); w[11] = __byte_perm (w[ 8], w[ 7], selector); w[10] = __byte_perm (w[ 7], w[ 6], selector); w[ 9] = __byte_perm (w[ 6], w[ 5], selector); w[ 8] = __byte_perm (w[ 5], w[ 4], selector); w[ 7] = __byte_perm (w[ 4], w[ 3], selector); w[ 6] = __byte_perm (w[ 3], w[ 2], selector); w[ 5] = __byte_perm (w[ 2], w[ 1], selector); w[ 4] = __byte_perm (w[ 1], w[ 0], selector); w[ 3] = __byte_perm (w[ 0], 0, selector); w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 4: w[63] = __byte_perm (w[59], w[58], selector); w[62] = __byte_perm (w[58], w[57], selector); w[61] = __byte_perm (w[57], w[56], selector); w[60] = __byte_perm (w[56], w[55], selector); w[59] = __byte_perm (w[55], w[54], selector); w[58] = __byte_perm (w[54], w[53], selector); w[57] = __byte_perm (w[53], w[52], selector); w[56] = __byte_perm (w[52], w[51], selector); w[55] = __byte_perm (w[51], w[50], selector); w[54] = __byte_perm (w[50], w[49], selector); w[53] = __byte_perm (w[49], w[48], selector); w[52] = __byte_perm (w[48], w[47], selector); w[51] = __byte_perm (w[47], w[46], selector); w[50] = __byte_perm (w[46], w[45], selector); w[49] = __byte_perm (w[45], w[44], selector); w[48] = __byte_perm (w[44], w[43], selector); w[47] = __byte_perm (w[43], w[42], selector); w[46] = __byte_perm (w[42], w[41], selector); w[45] = __byte_perm (w[41], w[40], selector); w[44] = __byte_perm (w[40], w[39], selector); w[43] = __byte_perm (w[39], w[38], selector); w[42] = __byte_perm (w[38], w[37], selector); w[41] = __byte_perm (w[37], w[36], selector); w[40] = __byte_perm (w[36], w[35], selector); w[39] = __byte_perm (w[35], w[34], selector); w[38] = __byte_perm (w[34], w[33], selector); w[37] = __byte_perm (w[33], w[32], selector); w[36] = __byte_perm (w[32], w[31], selector); w[35] = __byte_perm (w[31], w[30], selector); w[34] = __byte_perm (w[30], w[29], selector); w[33] = __byte_perm (w[29], w[28], selector); w[32] = __byte_perm (w[28], w[27], selector); w[31] = __byte_perm (w[27], w[26], selector); w[30] = __byte_perm (w[26], w[25], selector); w[29] = __byte_perm (w[25], w[24], selector); w[28] = __byte_perm (w[24], w[23], selector); w[27] = __byte_perm (w[23], w[22], selector); w[26] = __byte_perm (w[22], w[21], selector); w[25] = __byte_perm (w[21], w[20], selector); w[24] = __byte_perm (w[20], w[19], selector); w[23] = __byte_perm (w[19], w[18], selector); w[22] = __byte_perm (w[18], w[17], selector); w[21] = __byte_perm (w[17], w[16], selector); w[20] = __byte_perm (w[16], w[15], selector); w[19] = __byte_perm (w[15], w[14], selector); w[18] = __byte_perm (w[14], w[13], selector); w[17] = __byte_perm (w[13], w[12], selector); w[16] = __byte_perm (w[12], w[11], selector); w[15] = __byte_perm (w[11], w[10], selector); w[14] = __byte_perm (w[10], w[ 9], selector); w[13] = __byte_perm (w[ 9], w[ 8], selector); w[12] = __byte_perm (w[ 8], w[ 7], selector); w[11] = __byte_perm (w[ 7], w[ 6], selector); w[10] = __byte_perm (w[ 6], w[ 5], selector); w[ 9] = __byte_perm (w[ 5], w[ 4], selector); w[ 8] = __byte_perm (w[ 4], w[ 3], selector); w[ 7] = __byte_perm (w[ 3], w[ 2], selector); w[ 6] = __byte_perm (w[ 2], w[ 1], selector); w[ 5] = __byte_perm (w[ 1], w[ 0], selector); w[ 4] = __byte_perm (w[ 0], 0, selector); w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 5: w[63] = __byte_perm (w[58], w[57], selector); w[62] = __byte_perm (w[57], w[56], selector); w[61] = __byte_perm (w[56], w[55], selector); w[60] = __byte_perm (w[55], w[54], selector); w[59] = __byte_perm (w[54], w[53], selector); w[58] = __byte_perm (w[53], w[52], selector); w[57] = __byte_perm (w[52], w[51], selector); w[56] = __byte_perm (w[51], w[50], selector); w[55] = __byte_perm (w[50], w[49], selector); w[54] = __byte_perm (w[49], w[48], selector); w[53] = __byte_perm (w[48], w[47], selector); w[52] = __byte_perm (w[47], w[46], selector); w[51] = __byte_perm (w[46], w[45], selector); w[50] = __byte_perm (w[45], w[44], selector); w[49] = __byte_perm (w[44], w[43], selector); w[48] = __byte_perm (w[43], w[42], selector); w[47] = __byte_perm (w[42], w[41], selector); w[46] = __byte_perm (w[41], w[40], selector); w[45] = __byte_perm (w[40], w[39], selector); w[44] = __byte_perm (w[39], w[38], selector); w[43] = __byte_perm (w[38], w[37], selector); w[42] = __byte_perm (w[37], w[36], selector); w[41] = __byte_perm (w[36], w[35], selector); w[40] = __byte_perm (w[35], w[34], selector); w[39] = __byte_perm (w[34], w[33], selector); w[38] = __byte_perm (w[33], w[32], selector); w[37] = __byte_perm (w[32], w[31], selector); w[36] = __byte_perm (w[31], w[30], selector); w[35] = __byte_perm (w[30], w[29], selector); w[34] = __byte_perm (w[29], w[28], selector); w[33] = __byte_perm (w[28], w[27], selector); w[32] = __byte_perm (w[27], w[26], selector); w[31] = __byte_perm (w[26], w[25], selector); w[30] = __byte_perm (w[25], w[24], selector); w[29] = __byte_perm (w[24], w[23], selector); w[28] = __byte_perm (w[23], w[22], selector); w[27] = __byte_perm (w[22], w[21], selector); w[26] = __byte_perm (w[21], w[20], selector); w[25] = __byte_perm (w[20], w[19], selector); w[24] = __byte_perm (w[19], w[18], selector); w[23] = __byte_perm (w[18], w[17], selector); w[22] = __byte_perm (w[17], w[16], selector); w[21] = __byte_perm (w[16], w[15], selector); w[20] = __byte_perm (w[15], w[14], selector); w[19] = __byte_perm (w[14], w[13], selector); w[18] = __byte_perm (w[13], w[12], selector); w[17] = __byte_perm (w[12], w[11], selector); w[16] = __byte_perm (w[11], w[10], selector); w[15] = __byte_perm (w[10], w[ 9], selector); w[14] = __byte_perm (w[ 9], w[ 8], selector); w[13] = __byte_perm (w[ 8], w[ 7], selector); w[12] = __byte_perm (w[ 7], w[ 6], selector); w[11] = __byte_perm (w[ 6], w[ 5], selector); w[10] = __byte_perm (w[ 5], w[ 4], selector); w[ 9] = __byte_perm (w[ 4], w[ 3], selector); w[ 8] = __byte_perm (w[ 3], w[ 2], selector); w[ 7] = __byte_perm (w[ 2], w[ 1], selector); w[ 6] = __byte_perm (w[ 1], w[ 0], selector); w[ 5] = __byte_perm (w[ 0], 0, selector); w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 6: w[63] = __byte_perm (w[57], w[56], selector); w[62] = __byte_perm (w[56], w[55], selector); w[61] = __byte_perm (w[55], w[54], selector); w[60] = __byte_perm (w[54], w[53], selector); w[59] = __byte_perm (w[53], w[52], selector); w[58] = __byte_perm (w[52], w[51], selector); w[57] = __byte_perm (w[51], w[50], selector); w[56] = __byte_perm (w[50], w[49], selector); w[55] = __byte_perm (w[49], w[48], selector); w[54] = __byte_perm (w[48], w[47], selector); w[53] = __byte_perm (w[47], w[46], selector); w[52] = __byte_perm (w[46], w[45], selector); w[51] = __byte_perm (w[45], w[44], selector); w[50] = __byte_perm (w[44], w[43], selector); w[49] = __byte_perm (w[43], w[42], selector); w[48] = __byte_perm (w[42], w[41], selector); w[47] = __byte_perm (w[41], w[40], selector); w[46] = __byte_perm (w[40], w[39], selector); w[45] = __byte_perm (w[39], w[38], selector); w[44] = __byte_perm (w[38], w[37], selector); w[43] = __byte_perm (w[37], w[36], selector); w[42] = __byte_perm (w[36], w[35], selector); w[41] = __byte_perm (w[35], w[34], selector); w[40] = __byte_perm (w[34], w[33], selector); w[39] = __byte_perm (w[33], w[32], selector); w[38] = __byte_perm (w[32], w[31], selector); w[37] = __byte_perm (w[31], w[30], selector); w[36] = __byte_perm (w[30], w[29], selector); w[35] = __byte_perm (w[29], w[28], selector); w[34] = __byte_perm (w[28], w[27], selector); w[33] = __byte_perm (w[27], w[26], selector); w[32] = __byte_perm (w[26], w[25], selector); w[31] = __byte_perm (w[25], w[24], selector); w[30] = __byte_perm (w[24], w[23], selector); w[29] = __byte_perm (w[23], w[22], selector); w[28] = __byte_perm (w[22], w[21], selector); w[27] = __byte_perm (w[21], w[20], selector); w[26] = __byte_perm (w[20], w[19], selector); w[25] = __byte_perm (w[19], w[18], selector); w[24] = __byte_perm (w[18], w[17], selector); w[23] = __byte_perm (w[17], w[16], selector); w[22] = __byte_perm (w[16], w[15], selector); w[21] = __byte_perm (w[15], w[14], selector); w[20] = __byte_perm (w[14], w[13], selector); w[19] = __byte_perm (w[13], w[12], selector); w[18] = __byte_perm (w[12], w[11], selector); w[17] = __byte_perm (w[11], w[10], selector); w[16] = __byte_perm (w[10], w[ 9], selector); w[15] = __byte_perm (w[ 9], w[ 8], selector); w[14] = __byte_perm (w[ 8], w[ 7], selector); w[13] = __byte_perm (w[ 7], w[ 6], selector); w[12] = __byte_perm (w[ 6], w[ 5], selector); w[11] = __byte_perm (w[ 5], w[ 4], selector); w[10] = __byte_perm (w[ 4], w[ 3], selector); w[ 9] = __byte_perm (w[ 3], w[ 2], selector); w[ 8] = __byte_perm (w[ 2], w[ 1], selector); w[ 7] = __byte_perm (w[ 1], w[ 0], selector); w[ 6] = __byte_perm (w[ 0], 0, selector); w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 7: w[63] = __byte_perm (w[56], w[55], selector); w[62] = __byte_perm (w[55], w[54], selector); w[61] = __byte_perm (w[54], w[53], selector); w[60] = __byte_perm (w[53], w[52], selector); w[59] = __byte_perm (w[52], w[51], selector); w[58] = __byte_perm (w[51], w[50], selector); w[57] = __byte_perm (w[50], w[49], selector); w[56] = __byte_perm (w[49], w[48], selector); w[55] = __byte_perm (w[48], w[47], selector); w[54] = __byte_perm (w[47], w[46], selector); w[53] = __byte_perm (w[46], w[45], selector); w[52] = __byte_perm (w[45], w[44], selector); w[51] = __byte_perm (w[44], w[43], selector); w[50] = __byte_perm (w[43], w[42], selector); w[49] = __byte_perm (w[42], w[41], selector); w[48] = __byte_perm (w[41], w[40], selector); w[47] = __byte_perm (w[40], w[39], selector); w[46] = __byte_perm (w[39], w[38], selector); w[45] = __byte_perm (w[38], w[37], selector); w[44] = __byte_perm (w[37], w[36], selector); w[43] = __byte_perm (w[36], w[35], selector); w[42] = __byte_perm (w[35], w[34], selector); w[41] = __byte_perm (w[34], w[33], selector); w[40] = __byte_perm (w[33], w[32], selector); w[39] = __byte_perm (w[32], w[31], selector); w[38] = __byte_perm (w[31], w[30], selector); w[37] = __byte_perm (w[30], w[29], selector); w[36] = __byte_perm (w[29], w[28], selector); w[35] = __byte_perm (w[28], w[27], selector); w[34] = __byte_perm (w[27], w[26], selector); w[33] = __byte_perm (w[26], w[25], selector); w[32] = __byte_perm (w[25], w[24], selector); w[31] = __byte_perm (w[24], w[23], selector); w[30] = __byte_perm (w[23], w[22], selector); w[29] = __byte_perm (w[22], w[21], selector); w[28] = __byte_perm (w[21], w[20], selector); w[27] = __byte_perm (w[20], w[19], selector); w[26] = __byte_perm (w[19], w[18], selector); w[25] = __byte_perm (w[18], w[17], selector); w[24] = __byte_perm (w[17], w[16], selector); w[23] = __byte_perm (w[16], w[15], selector); w[22] = __byte_perm (w[15], w[14], selector); w[21] = __byte_perm (w[14], w[13], selector); w[20] = __byte_perm (w[13], w[12], selector); w[19] = __byte_perm (w[12], w[11], selector); w[18] = __byte_perm (w[11], w[10], selector); w[17] = __byte_perm (w[10], w[ 9], selector); w[16] = __byte_perm (w[ 9], w[ 8], selector); w[15] = __byte_perm (w[ 8], w[ 7], selector); w[14] = __byte_perm (w[ 7], w[ 6], selector); w[13] = __byte_perm (w[ 6], w[ 5], selector); w[12] = __byte_perm (w[ 5], w[ 4], selector); w[11] = __byte_perm (w[ 4], w[ 3], selector); w[10] = __byte_perm (w[ 3], w[ 2], selector); w[ 9] = __byte_perm (w[ 2], w[ 1], selector); w[ 8] = __byte_perm (w[ 1], w[ 0], selector); w[ 7] = __byte_perm (w[ 0], 0, selector); w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 8: w[63] = __byte_perm (w[55], w[54], selector); w[62] = __byte_perm (w[54], w[53], selector); w[61] = __byte_perm (w[53], w[52], selector); w[60] = __byte_perm (w[52], w[51], selector); w[59] = __byte_perm (w[51], w[50], selector); w[58] = __byte_perm (w[50], w[49], selector); w[57] = __byte_perm (w[49], w[48], selector); w[56] = __byte_perm (w[48], w[47], selector); w[55] = __byte_perm (w[47], w[46], selector); w[54] = __byte_perm (w[46], w[45], selector); w[53] = __byte_perm (w[45], w[44], selector); w[52] = __byte_perm (w[44], w[43], selector); w[51] = __byte_perm (w[43], w[42], selector); w[50] = __byte_perm (w[42], w[41], selector); w[49] = __byte_perm (w[41], w[40], selector); w[48] = __byte_perm (w[40], w[39], selector); w[47] = __byte_perm (w[39], w[38], selector); w[46] = __byte_perm (w[38], w[37], selector); w[45] = __byte_perm (w[37], w[36], selector); w[44] = __byte_perm (w[36], w[35], selector); w[43] = __byte_perm (w[35], w[34], selector); w[42] = __byte_perm (w[34], w[33], selector); w[41] = __byte_perm (w[33], w[32], selector); w[40] = __byte_perm (w[32], w[31], selector); w[39] = __byte_perm (w[31], w[30], selector); w[38] = __byte_perm (w[30], w[29], selector); w[37] = __byte_perm (w[29], w[28], selector); w[36] = __byte_perm (w[28], w[27], selector); w[35] = __byte_perm (w[27], w[26], selector); w[34] = __byte_perm (w[26], w[25], selector); w[33] = __byte_perm (w[25], w[24], selector); w[32] = __byte_perm (w[24], w[23], selector); w[31] = __byte_perm (w[23], w[22], selector); w[30] = __byte_perm (w[22], w[21], selector); w[29] = __byte_perm (w[21], w[20], selector); w[28] = __byte_perm (w[20], w[19], selector); w[27] = __byte_perm (w[19], w[18], selector); w[26] = __byte_perm (w[18], w[17], selector); w[25] = __byte_perm (w[17], w[16], selector); w[24] = __byte_perm (w[16], w[15], selector); w[23] = __byte_perm (w[15], w[14], selector); w[22] = __byte_perm (w[14], w[13], selector); w[21] = __byte_perm (w[13], w[12], selector); w[20] = __byte_perm (w[12], w[11], selector); w[19] = __byte_perm (w[11], w[10], selector); w[18] = __byte_perm (w[10], w[ 9], selector); w[17] = __byte_perm (w[ 9], w[ 8], selector); w[16] = __byte_perm (w[ 8], w[ 7], selector); w[15] = __byte_perm (w[ 7], w[ 6], selector); w[14] = __byte_perm (w[ 6], w[ 5], selector); w[13] = __byte_perm (w[ 5], w[ 4], selector); w[12] = __byte_perm (w[ 4], w[ 3], selector); w[11] = __byte_perm (w[ 3], w[ 2], selector); w[10] = __byte_perm (w[ 2], w[ 1], selector); w[ 9] = __byte_perm (w[ 1], w[ 0], selector); w[ 8] = __byte_perm (w[ 0], 0, selector); w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 9: w[63] = __byte_perm (w[54], w[53], selector); w[62] = __byte_perm (w[53], w[52], selector); w[61] = __byte_perm (w[52], w[51], selector); w[60] = __byte_perm (w[51], w[50], selector); w[59] = __byte_perm (w[50], w[49], selector); w[58] = __byte_perm (w[49], w[48], selector); w[57] = __byte_perm (w[48], w[47], selector); w[56] = __byte_perm (w[47], w[46], selector); w[55] = __byte_perm (w[46], w[45], selector); w[54] = __byte_perm (w[45], w[44], selector); w[53] = __byte_perm (w[44], w[43], selector); w[52] = __byte_perm (w[43], w[42], selector); w[51] = __byte_perm (w[42], w[41], selector); w[50] = __byte_perm (w[41], w[40], selector); w[49] = __byte_perm (w[40], w[39], selector); w[48] = __byte_perm (w[39], w[38], selector); w[47] = __byte_perm (w[38], w[37], selector); w[46] = __byte_perm (w[37], w[36], selector); w[45] = __byte_perm (w[36], w[35], selector); w[44] = __byte_perm (w[35], w[34], selector); w[43] = __byte_perm (w[34], w[33], selector); w[42] = __byte_perm (w[33], w[32], selector); w[41] = __byte_perm (w[32], w[31], selector); w[40] = __byte_perm (w[31], w[30], selector); w[39] = __byte_perm (w[30], w[29], selector); w[38] = __byte_perm (w[29], w[28], selector); w[37] = __byte_perm (w[28], w[27], selector); w[36] = __byte_perm (w[27], w[26], selector); w[35] = __byte_perm (w[26], w[25], selector); w[34] = __byte_perm (w[25], w[24], selector); w[33] = __byte_perm (w[24], w[23], selector); w[32] = __byte_perm (w[23], w[22], selector); w[31] = __byte_perm (w[22], w[21], selector); w[30] = __byte_perm (w[21], w[20], selector); w[29] = __byte_perm (w[20], w[19], selector); w[28] = __byte_perm (w[19], w[18], selector); w[27] = __byte_perm (w[18], w[17], selector); w[26] = __byte_perm (w[17], w[16], selector); w[25] = __byte_perm (w[16], w[15], selector); w[24] = __byte_perm (w[15], w[14], selector); w[23] = __byte_perm (w[14], w[13], selector); w[22] = __byte_perm (w[13], w[12], selector); w[21] = __byte_perm (w[12], w[11], selector); w[20] = __byte_perm (w[11], w[10], selector); w[19] = __byte_perm (w[10], w[ 9], selector); w[18] = __byte_perm (w[ 9], w[ 8], selector); w[17] = __byte_perm (w[ 8], w[ 7], selector); w[16] = __byte_perm (w[ 7], w[ 6], selector); w[15] = __byte_perm (w[ 6], w[ 5], selector); w[14] = __byte_perm (w[ 5], w[ 4], selector); w[13] = __byte_perm (w[ 4], w[ 3], selector); w[12] = __byte_perm (w[ 3], w[ 2], selector); w[11] = __byte_perm (w[ 2], w[ 1], selector); w[10] = __byte_perm (w[ 1], w[ 0], selector); w[ 9] = __byte_perm (w[ 0], 0, selector); w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 10: w[63] = __byte_perm (w[53], w[52], selector); w[62] = __byte_perm (w[52], w[51], selector); w[61] = __byte_perm (w[51], w[50], selector); w[60] = __byte_perm (w[50], w[49], selector); w[59] = __byte_perm (w[49], w[48], selector); w[58] = __byte_perm (w[48], w[47], selector); w[57] = __byte_perm (w[47], w[46], selector); w[56] = __byte_perm (w[46], w[45], selector); w[55] = __byte_perm (w[45], w[44], selector); w[54] = __byte_perm (w[44], w[43], selector); w[53] = __byte_perm (w[43], w[42], selector); w[52] = __byte_perm (w[42], w[41], selector); w[51] = __byte_perm (w[41], w[40], selector); w[50] = __byte_perm (w[40], w[39], selector); w[49] = __byte_perm (w[39], w[38], selector); w[48] = __byte_perm (w[38], w[37], selector); w[47] = __byte_perm (w[37], w[36], selector); w[46] = __byte_perm (w[36], w[35], selector); w[45] = __byte_perm (w[35], w[34], selector); w[44] = __byte_perm (w[34], w[33], selector); w[43] = __byte_perm (w[33], w[32], selector); w[42] = __byte_perm (w[32], w[31], selector); w[41] = __byte_perm (w[31], w[30], selector); w[40] = __byte_perm (w[30], w[29], selector); w[39] = __byte_perm (w[29], w[28], selector); w[38] = __byte_perm (w[28], w[27], selector); w[37] = __byte_perm (w[27], w[26], selector); w[36] = __byte_perm (w[26], w[25], selector); w[35] = __byte_perm (w[25], w[24], selector); w[34] = __byte_perm (w[24], w[23], selector); w[33] = __byte_perm (w[23], w[22], selector); w[32] = __byte_perm (w[22], w[21], selector); w[31] = __byte_perm (w[21], w[20], selector); w[30] = __byte_perm (w[20], w[19], selector); w[29] = __byte_perm (w[19], w[18], selector); w[28] = __byte_perm (w[18], w[17], selector); w[27] = __byte_perm (w[17], w[16], selector); w[26] = __byte_perm (w[16], w[15], selector); w[25] = __byte_perm (w[15], w[14], selector); w[24] = __byte_perm (w[14], w[13], selector); w[23] = __byte_perm (w[13], w[12], selector); w[22] = __byte_perm (w[12], w[11], selector); w[21] = __byte_perm (w[11], w[10], selector); w[20] = __byte_perm (w[10], w[ 9], selector); w[19] = __byte_perm (w[ 9], w[ 8], selector); w[18] = __byte_perm (w[ 8], w[ 7], selector); w[17] = __byte_perm (w[ 7], w[ 6], selector); w[16] = __byte_perm (w[ 6], w[ 5], selector); w[15] = __byte_perm (w[ 5], w[ 4], selector); w[14] = __byte_perm (w[ 4], w[ 3], selector); w[13] = __byte_perm (w[ 3], w[ 2], selector); w[12] = __byte_perm (w[ 2], w[ 1], selector); w[11] = __byte_perm (w[ 1], w[ 0], selector); w[10] = __byte_perm (w[ 0], 0, selector); w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 11: w[63] = __byte_perm (w[52], w[51], selector); w[62] = __byte_perm (w[51], w[50], selector); w[61] = __byte_perm (w[50], w[49], selector); w[60] = __byte_perm (w[49], w[48], selector); w[59] = __byte_perm (w[48], w[47], selector); w[58] = __byte_perm (w[47], w[46], selector); w[57] = __byte_perm (w[46], w[45], selector); w[56] = __byte_perm (w[45], w[44], selector); w[55] = __byte_perm (w[44], w[43], selector); w[54] = __byte_perm (w[43], w[42], selector); w[53] = __byte_perm (w[42], w[41], selector); w[52] = __byte_perm (w[41], w[40], selector); w[51] = __byte_perm (w[40], w[39], selector); w[50] = __byte_perm (w[39], w[38], selector); w[49] = __byte_perm (w[38], w[37], selector); w[48] = __byte_perm (w[37], w[36], selector); w[47] = __byte_perm (w[36], w[35], selector); w[46] = __byte_perm (w[35], w[34], selector); w[45] = __byte_perm (w[34], w[33], selector); w[44] = __byte_perm (w[33], w[32], selector); w[43] = __byte_perm (w[32], w[31], selector); w[42] = __byte_perm (w[31], w[30], selector); w[41] = __byte_perm (w[30], w[29], selector); w[40] = __byte_perm (w[29], w[28], selector); w[39] = __byte_perm (w[28], w[27], selector); w[38] = __byte_perm (w[27], w[26], selector); w[37] = __byte_perm (w[26], w[25], selector); w[36] = __byte_perm (w[25], w[24], selector); w[35] = __byte_perm (w[24], w[23], selector); w[34] = __byte_perm (w[23], w[22], selector); w[33] = __byte_perm (w[22], w[21], selector); w[32] = __byte_perm (w[21], w[20], selector); w[31] = __byte_perm (w[20], w[19], selector); w[30] = __byte_perm (w[19], w[18], selector); w[29] = __byte_perm (w[18], w[17], selector); w[28] = __byte_perm (w[17], w[16], selector); w[27] = __byte_perm (w[16], w[15], selector); w[26] = __byte_perm (w[15], w[14], selector); w[25] = __byte_perm (w[14], w[13], selector); w[24] = __byte_perm (w[13], w[12], selector); w[23] = __byte_perm (w[12], w[11], selector); w[22] = __byte_perm (w[11], w[10], selector); w[21] = __byte_perm (w[10], w[ 9], selector); w[20] = __byte_perm (w[ 9], w[ 8], selector); w[19] = __byte_perm (w[ 8], w[ 7], selector); w[18] = __byte_perm (w[ 7], w[ 6], selector); w[17] = __byte_perm (w[ 6], w[ 5], selector); w[16] = __byte_perm (w[ 5], w[ 4], selector); w[15] = __byte_perm (w[ 4], w[ 3], selector); w[14] = __byte_perm (w[ 3], w[ 2], selector); w[13] = __byte_perm (w[ 2], w[ 1], selector); w[12] = __byte_perm (w[ 1], w[ 0], selector); w[11] = __byte_perm (w[ 0], 0, selector); w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 12: w[63] = __byte_perm (w[51], w[50], selector); w[62] = __byte_perm (w[50], w[49], selector); w[61] = __byte_perm (w[49], w[48], selector); w[60] = __byte_perm (w[48], w[47], selector); w[59] = __byte_perm (w[47], w[46], selector); w[58] = __byte_perm (w[46], w[45], selector); w[57] = __byte_perm (w[45], w[44], selector); w[56] = __byte_perm (w[44], w[43], selector); w[55] = __byte_perm (w[43], w[42], selector); w[54] = __byte_perm (w[42], w[41], selector); w[53] = __byte_perm (w[41], w[40], selector); w[52] = __byte_perm (w[40], w[39], selector); w[51] = __byte_perm (w[39], w[38], selector); w[50] = __byte_perm (w[38], w[37], selector); w[49] = __byte_perm (w[37], w[36], selector); w[48] = __byte_perm (w[36], w[35], selector); w[47] = __byte_perm (w[35], w[34], selector); w[46] = __byte_perm (w[34], w[33], selector); w[45] = __byte_perm (w[33], w[32], selector); w[44] = __byte_perm (w[32], w[31], selector); w[43] = __byte_perm (w[31], w[30], selector); w[42] = __byte_perm (w[30], w[29], selector); w[41] = __byte_perm (w[29], w[28], selector); w[40] = __byte_perm (w[28], w[27], selector); w[39] = __byte_perm (w[27], w[26], selector); w[38] = __byte_perm (w[26], w[25], selector); w[37] = __byte_perm (w[25], w[24], selector); w[36] = __byte_perm (w[24], w[23], selector); w[35] = __byte_perm (w[23], w[22], selector); w[34] = __byte_perm (w[22], w[21], selector); w[33] = __byte_perm (w[21], w[20], selector); w[32] = __byte_perm (w[20], w[19], selector); w[31] = __byte_perm (w[19], w[18], selector); w[30] = __byte_perm (w[18], w[17], selector); w[29] = __byte_perm (w[17], w[16], selector); w[28] = __byte_perm (w[16], w[15], selector); w[27] = __byte_perm (w[15], w[14], selector); w[26] = __byte_perm (w[14], w[13], selector); w[25] = __byte_perm (w[13], w[12], selector); w[24] = __byte_perm (w[12], w[11], selector); w[23] = __byte_perm (w[11], w[10], selector); w[22] = __byte_perm (w[10], w[ 9], selector); w[21] = __byte_perm (w[ 9], w[ 8], selector); w[20] = __byte_perm (w[ 8], w[ 7], selector); w[19] = __byte_perm (w[ 7], w[ 6], selector); w[18] = __byte_perm (w[ 6], w[ 5], selector); w[17] = __byte_perm (w[ 5], w[ 4], selector); w[16] = __byte_perm (w[ 4], w[ 3], selector); w[15] = __byte_perm (w[ 3], w[ 2], selector); w[14] = __byte_perm (w[ 2], w[ 1], selector); w[13] = __byte_perm (w[ 1], w[ 0], selector); w[12] = __byte_perm (w[ 0], 0, selector); w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 13: w[63] = __byte_perm (w[50], w[49], selector); w[62] = __byte_perm (w[49], w[48], selector); w[61] = __byte_perm (w[48], w[47], selector); w[60] = __byte_perm (w[47], w[46], selector); w[59] = __byte_perm (w[46], w[45], selector); w[58] = __byte_perm (w[45], w[44], selector); w[57] = __byte_perm (w[44], w[43], selector); w[56] = __byte_perm (w[43], w[42], selector); w[55] = __byte_perm (w[42], w[41], selector); w[54] = __byte_perm (w[41], w[40], selector); w[53] = __byte_perm (w[40], w[39], selector); w[52] = __byte_perm (w[39], w[38], selector); w[51] = __byte_perm (w[38], w[37], selector); w[50] = __byte_perm (w[37], w[36], selector); w[49] = __byte_perm (w[36], w[35], selector); w[48] = __byte_perm (w[35], w[34], selector); w[47] = __byte_perm (w[34], w[33], selector); w[46] = __byte_perm (w[33], w[32], selector); w[45] = __byte_perm (w[32], w[31], selector); w[44] = __byte_perm (w[31], w[30], selector); w[43] = __byte_perm (w[30], w[29], selector); w[42] = __byte_perm (w[29], w[28], selector); w[41] = __byte_perm (w[28], w[27], selector); w[40] = __byte_perm (w[27], w[26], selector); w[39] = __byte_perm (w[26], w[25], selector); w[38] = __byte_perm (w[25], w[24], selector); w[37] = __byte_perm (w[24], w[23], selector); w[36] = __byte_perm (w[23], w[22], selector); w[35] = __byte_perm (w[22], w[21], selector); w[34] = __byte_perm (w[21], w[20], selector); w[33] = __byte_perm (w[20], w[19], selector); w[32] = __byte_perm (w[19], w[18], selector); w[31] = __byte_perm (w[18], w[17], selector); w[30] = __byte_perm (w[17], w[16], selector); w[29] = __byte_perm (w[16], w[15], selector); w[28] = __byte_perm (w[15], w[14], selector); w[27] = __byte_perm (w[14], w[13], selector); w[26] = __byte_perm (w[13], w[12], selector); w[25] = __byte_perm (w[12], w[11], selector); w[24] = __byte_perm (w[11], w[10], selector); w[23] = __byte_perm (w[10], w[ 9], selector); w[22] = __byte_perm (w[ 9], w[ 8], selector); w[21] = __byte_perm (w[ 8], w[ 7], selector); w[20] = __byte_perm (w[ 7], w[ 6], selector); w[19] = __byte_perm (w[ 6], w[ 5], selector); w[18] = __byte_perm (w[ 5], w[ 4], selector); w[17] = __byte_perm (w[ 4], w[ 3], selector); w[16] = __byte_perm (w[ 3], w[ 2], selector); w[15] = __byte_perm (w[ 2], w[ 1], selector); w[14] = __byte_perm (w[ 1], w[ 0], selector); w[13] = __byte_perm (w[ 0], 0, selector); w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 14: w[63] = __byte_perm (w[49], w[48], selector); w[62] = __byte_perm (w[48], w[47], selector); w[61] = __byte_perm (w[47], w[46], selector); w[60] = __byte_perm (w[46], w[45], selector); w[59] = __byte_perm (w[45], w[44], selector); w[58] = __byte_perm (w[44], w[43], selector); w[57] = __byte_perm (w[43], w[42], selector); w[56] = __byte_perm (w[42], w[41], selector); w[55] = __byte_perm (w[41], w[40], selector); w[54] = __byte_perm (w[40], w[39], selector); w[53] = __byte_perm (w[39], w[38], selector); w[52] = __byte_perm (w[38], w[37], selector); w[51] = __byte_perm (w[37], w[36], selector); w[50] = __byte_perm (w[36], w[35], selector); w[49] = __byte_perm (w[35], w[34], selector); w[48] = __byte_perm (w[34], w[33], selector); w[47] = __byte_perm (w[33], w[32], selector); w[46] = __byte_perm (w[32], w[31], selector); w[45] = __byte_perm (w[31], w[30], selector); w[44] = __byte_perm (w[30], w[29], selector); w[43] = __byte_perm (w[29], w[28], selector); w[42] = __byte_perm (w[28], w[27], selector); w[41] = __byte_perm (w[27], w[26], selector); w[40] = __byte_perm (w[26], w[25], selector); w[39] = __byte_perm (w[25], w[24], selector); w[38] = __byte_perm (w[24], w[23], selector); w[37] = __byte_perm (w[23], w[22], selector); w[36] = __byte_perm (w[22], w[21], selector); w[35] = __byte_perm (w[21], w[20], selector); w[34] = __byte_perm (w[20], w[19], selector); w[33] = __byte_perm (w[19], w[18], selector); w[32] = __byte_perm (w[18], w[17], selector); w[31] = __byte_perm (w[17], w[16], selector); w[30] = __byte_perm (w[16], w[15], selector); w[29] = __byte_perm (w[15], w[14], selector); w[28] = __byte_perm (w[14], w[13], selector); w[27] = __byte_perm (w[13], w[12], selector); w[26] = __byte_perm (w[12], w[11], selector); w[25] = __byte_perm (w[11], w[10], selector); w[24] = __byte_perm (w[10], w[ 9], selector); w[23] = __byte_perm (w[ 9], w[ 8], selector); w[22] = __byte_perm (w[ 8], w[ 7], selector); w[21] = __byte_perm (w[ 7], w[ 6], selector); w[20] = __byte_perm (w[ 6], w[ 5], selector); w[19] = __byte_perm (w[ 5], w[ 4], selector); w[18] = __byte_perm (w[ 4], w[ 3], selector); w[17] = __byte_perm (w[ 3], w[ 2], selector); w[16] = __byte_perm (w[ 2], w[ 1], selector); w[15] = __byte_perm (w[ 1], w[ 0], selector); w[14] = __byte_perm (w[ 0], 0, selector); w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 15: w[63] = __byte_perm (w[48], w[47], selector); w[62] = __byte_perm (w[47], w[46], selector); w[61] = __byte_perm (w[46], w[45], selector); w[60] = __byte_perm (w[45], w[44], selector); w[59] = __byte_perm (w[44], w[43], selector); w[58] = __byte_perm (w[43], w[42], selector); w[57] = __byte_perm (w[42], w[41], selector); w[56] = __byte_perm (w[41], w[40], selector); w[55] = __byte_perm (w[40], w[39], selector); w[54] = __byte_perm (w[39], w[38], selector); w[53] = __byte_perm (w[38], w[37], selector); w[52] = __byte_perm (w[37], w[36], selector); w[51] = __byte_perm (w[36], w[35], selector); w[50] = __byte_perm (w[35], w[34], selector); w[49] = __byte_perm (w[34], w[33], selector); w[48] = __byte_perm (w[33], w[32], selector); w[47] = __byte_perm (w[32], w[31], selector); w[46] = __byte_perm (w[31], w[30], selector); w[45] = __byte_perm (w[30], w[29], selector); w[44] = __byte_perm (w[29], w[28], selector); w[43] = __byte_perm (w[28], w[27], selector); w[42] = __byte_perm (w[27], w[26], selector); w[41] = __byte_perm (w[26], w[25], selector); w[40] = __byte_perm (w[25], w[24], selector); w[39] = __byte_perm (w[24], w[23], selector); w[38] = __byte_perm (w[23], w[22], selector); w[37] = __byte_perm (w[22], w[21], selector); w[36] = __byte_perm (w[21], w[20], selector); w[35] = __byte_perm (w[20], w[19], selector); w[34] = __byte_perm (w[19], w[18], selector); w[33] = __byte_perm (w[18], w[17], selector); w[32] = __byte_perm (w[17], w[16], selector); w[31] = __byte_perm (w[16], w[15], selector); w[30] = __byte_perm (w[15], w[14], selector); w[29] = __byte_perm (w[14], w[13], selector); w[28] = __byte_perm (w[13], w[12], selector); w[27] = __byte_perm (w[12], w[11], selector); w[26] = __byte_perm (w[11], w[10], selector); w[25] = __byte_perm (w[10], w[ 9], selector); w[24] = __byte_perm (w[ 9], w[ 8], selector); w[23] = __byte_perm (w[ 8], w[ 7], selector); w[22] = __byte_perm (w[ 7], w[ 6], selector); w[21] = __byte_perm (w[ 6], w[ 5], selector); w[20] = __byte_perm (w[ 5], w[ 4], selector); w[19] = __byte_perm (w[ 4], w[ 3], selector); w[18] = __byte_perm (w[ 3], w[ 2], selector); w[17] = __byte_perm (w[ 2], w[ 1], selector); w[16] = __byte_perm (w[ 1], w[ 0], selector); w[15] = __byte_perm (w[ 0], 0, selector); w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 16: w[63] = __byte_perm (w[47], w[46], selector); w[62] = __byte_perm (w[46], w[45], selector); w[61] = __byte_perm (w[45], w[44], selector); w[60] = __byte_perm (w[44], w[43], selector); w[59] = __byte_perm (w[43], w[42], selector); w[58] = __byte_perm (w[42], w[41], selector); w[57] = __byte_perm (w[41], w[40], selector); w[56] = __byte_perm (w[40], w[39], selector); w[55] = __byte_perm (w[39], w[38], selector); w[54] = __byte_perm (w[38], w[37], selector); w[53] = __byte_perm (w[37], w[36], selector); w[52] = __byte_perm (w[36], w[35], selector); w[51] = __byte_perm (w[35], w[34], selector); w[50] = __byte_perm (w[34], w[33], selector); w[49] = __byte_perm (w[33], w[32], selector); w[48] = __byte_perm (w[32], w[31], selector); w[47] = __byte_perm (w[31], w[30], selector); w[46] = __byte_perm (w[30], w[29], selector); w[45] = __byte_perm (w[29], w[28], selector); w[44] = __byte_perm (w[28], w[27], selector); w[43] = __byte_perm (w[27], w[26], selector); w[42] = __byte_perm (w[26], w[25], selector); w[41] = __byte_perm (w[25], w[24], selector); w[40] = __byte_perm (w[24], w[23], selector); w[39] = __byte_perm (w[23], w[22], selector); w[38] = __byte_perm (w[22], w[21], selector); w[37] = __byte_perm (w[21], w[20], selector); w[36] = __byte_perm (w[20], w[19], selector); w[35] = __byte_perm (w[19], w[18], selector); w[34] = __byte_perm (w[18], w[17], selector); w[33] = __byte_perm (w[17], w[16], selector); w[32] = __byte_perm (w[16], w[15], selector); w[31] = __byte_perm (w[15], w[14], selector); w[30] = __byte_perm (w[14], w[13], selector); w[29] = __byte_perm (w[13], w[12], selector); w[28] = __byte_perm (w[12], w[11], selector); w[27] = __byte_perm (w[11], w[10], selector); w[26] = __byte_perm (w[10], w[ 9], selector); w[25] = __byte_perm (w[ 9], w[ 8], selector); w[24] = __byte_perm (w[ 8], w[ 7], selector); w[23] = __byte_perm (w[ 7], w[ 6], selector); w[22] = __byte_perm (w[ 6], w[ 5], selector); w[21] = __byte_perm (w[ 5], w[ 4], selector); w[20] = __byte_perm (w[ 4], w[ 3], selector); w[19] = __byte_perm (w[ 3], w[ 2], selector); w[18] = __byte_perm (w[ 2], w[ 1], selector); w[17] = __byte_perm (w[ 1], w[ 0], selector); w[16] = __byte_perm (w[ 0], 0, selector); w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 17: w[63] = __byte_perm (w[46], w[45], selector); w[62] = __byte_perm (w[45], w[44], selector); w[61] = __byte_perm (w[44], w[43], selector); w[60] = __byte_perm (w[43], w[42], selector); w[59] = __byte_perm (w[42], w[41], selector); w[58] = __byte_perm (w[41], w[40], selector); w[57] = __byte_perm (w[40], w[39], selector); w[56] = __byte_perm (w[39], w[38], selector); w[55] = __byte_perm (w[38], w[37], selector); w[54] = __byte_perm (w[37], w[36], selector); w[53] = __byte_perm (w[36], w[35], selector); w[52] = __byte_perm (w[35], w[34], selector); w[51] = __byte_perm (w[34], w[33], selector); w[50] = __byte_perm (w[33], w[32], selector); w[49] = __byte_perm (w[32], w[31], selector); w[48] = __byte_perm (w[31], w[30], selector); w[47] = __byte_perm (w[30], w[29], selector); w[46] = __byte_perm (w[29], w[28], selector); w[45] = __byte_perm (w[28], w[27], selector); w[44] = __byte_perm (w[27], w[26], selector); w[43] = __byte_perm (w[26], w[25], selector); w[42] = __byte_perm (w[25], w[24], selector); w[41] = __byte_perm (w[24], w[23], selector); w[40] = __byte_perm (w[23], w[22], selector); w[39] = __byte_perm (w[22], w[21], selector); w[38] = __byte_perm (w[21], w[20], selector); w[37] = __byte_perm (w[20], w[19], selector); w[36] = __byte_perm (w[19], w[18], selector); w[35] = __byte_perm (w[18], w[17], selector); w[34] = __byte_perm (w[17], w[16], selector); w[33] = __byte_perm (w[16], w[15], selector); w[32] = __byte_perm (w[15], w[14], selector); w[31] = __byte_perm (w[14], w[13], selector); w[30] = __byte_perm (w[13], w[12], selector); w[29] = __byte_perm (w[12], w[11], selector); w[28] = __byte_perm (w[11], w[10], selector); w[27] = __byte_perm (w[10], w[ 9], selector); w[26] = __byte_perm (w[ 9], w[ 8], selector); w[25] = __byte_perm (w[ 8], w[ 7], selector); w[24] = __byte_perm (w[ 7], w[ 6], selector); w[23] = __byte_perm (w[ 6], w[ 5], selector); w[22] = __byte_perm (w[ 5], w[ 4], selector); w[21] = __byte_perm (w[ 4], w[ 3], selector); w[20] = __byte_perm (w[ 3], w[ 2], selector); w[19] = __byte_perm (w[ 2], w[ 1], selector); w[18] = __byte_perm (w[ 1], w[ 0], selector); w[17] = __byte_perm (w[ 0], 0, selector); w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 18: w[63] = __byte_perm (w[45], w[44], selector); w[62] = __byte_perm (w[44], w[43], selector); w[61] = __byte_perm (w[43], w[42], selector); w[60] = __byte_perm (w[42], w[41], selector); w[59] = __byte_perm (w[41], w[40], selector); w[58] = __byte_perm (w[40], w[39], selector); w[57] = __byte_perm (w[39], w[38], selector); w[56] = __byte_perm (w[38], w[37], selector); w[55] = __byte_perm (w[37], w[36], selector); w[54] = __byte_perm (w[36], w[35], selector); w[53] = __byte_perm (w[35], w[34], selector); w[52] = __byte_perm (w[34], w[33], selector); w[51] = __byte_perm (w[33], w[32], selector); w[50] = __byte_perm (w[32], w[31], selector); w[49] = __byte_perm (w[31], w[30], selector); w[48] = __byte_perm (w[30], w[29], selector); w[47] = __byte_perm (w[29], w[28], selector); w[46] = __byte_perm (w[28], w[27], selector); w[45] = __byte_perm (w[27], w[26], selector); w[44] = __byte_perm (w[26], w[25], selector); w[43] = __byte_perm (w[25], w[24], selector); w[42] = __byte_perm (w[24], w[23], selector); w[41] = __byte_perm (w[23], w[22], selector); w[40] = __byte_perm (w[22], w[21], selector); w[39] = __byte_perm (w[21], w[20], selector); w[38] = __byte_perm (w[20], w[19], selector); w[37] = __byte_perm (w[19], w[18], selector); w[36] = __byte_perm (w[18], w[17], selector); w[35] = __byte_perm (w[17], w[16], selector); w[34] = __byte_perm (w[16], w[15], selector); w[33] = __byte_perm (w[15], w[14], selector); w[32] = __byte_perm (w[14], w[13], selector); w[31] = __byte_perm (w[13], w[12], selector); w[30] = __byte_perm (w[12], w[11], selector); w[29] = __byte_perm (w[11], w[10], selector); w[28] = __byte_perm (w[10], w[ 9], selector); w[27] = __byte_perm (w[ 9], w[ 8], selector); w[26] = __byte_perm (w[ 8], w[ 7], selector); w[25] = __byte_perm (w[ 7], w[ 6], selector); w[24] = __byte_perm (w[ 6], w[ 5], selector); w[23] = __byte_perm (w[ 5], w[ 4], selector); w[22] = __byte_perm (w[ 4], w[ 3], selector); w[21] = __byte_perm (w[ 3], w[ 2], selector); w[20] = __byte_perm (w[ 2], w[ 1], selector); w[19] = __byte_perm (w[ 1], w[ 0], selector); w[18] = __byte_perm (w[ 0], 0, selector); w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 19: w[63] = __byte_perm (w[44], w[43], selector); w[62] = __byte_perm (w[43], w[42], selector); w[61] = __byte_perm (w[42], w[41], selector); w[60] = __byte_perm (w[41], w[40], selector); w[59] = __byte_perm (w[40], w[39], selector); w[58] = __byte_perm (w[39], w[38], selector); w[57] = __byte_perm (w[38], w[37], selector); w[56] = __byte_perm (w[37], w[36], selector); w[55] = __byte_perm (w[36], w[35], selector); w[54] = __byte_perm (w[35], w[34], selector); w[53] = __byte_perm (w[34], w[33], selector); w[52] = __byte_perm (w[33], w[32], selector); w[51] = __byte_perm (w[32], w[31], selector); w[50] = __byte_perm (w[31], w[30], selector); w[49] = __byte_perm (w[30], w[29], selector); w[48] = __byte_perm (w[29], w[28], selector); w[47] = __byte_perm (w[28], w[27], selector); w[46] = __byte_perm (w[27], w[26], selector); w[45] = __byte_perm (w[26], w[25], selector); w[44] = __byte_perm (w[25], w[24], selector); w[43] = __byte_perm (w[24], w[23], selector); w[42] = __byte_perm (w[23], w[22], selector); w[41] = __byte_perm (w[22], w[21], selector); w[40] = __byte_perm (w[21], w[20], selector); w[39] = __byte_perm (w[20], w[19], selector); w[38] = __byte_perm (w[19], w[18], selector); w[37] = __byte_perm (w[18], w[17], selector); w[36] = __byte_perm (w[17], w[16], selector); w[35] = __byte_perm (w[16], w[15], selector); w[34] = __byte_perm (w[15], w[14], selector); w[33] = __byte_perm (w[14], w[13], selector); w[32] = __byte_perm (w[13], w[12], selector); w[31] = __byte_perm (w[12], w[11], selector); w[30] = __byte_perm (w[11], w[10], selector); w[29] = __byte_perm (w[10], w[ 9], selector); w[28] = __byte_perm (w[ 9], w[ 8], selector); w[27] = __byte_perm (w[ 8], w[ 7], selector); w[26] = __byte_perm (w[ 7], w[ 6], selector); w[25] = __byte_perm (w[ 6], w[ 5], selector); w[24] = __byte_perm (w[ 5], w[ 4], selector); w[23] = __byte_perm (w[ 4], w[ 3], selector); w[22] = __byte_perm (w[ 3], w[ 2], selector); w[21] = __byte_perm (w[ 2], w[ 1], selector); w[20] = __byte_perm (w[ 1], w[ 0], selector); w[19] = __byte_perm (w[ 0], 0, selector); w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 20: w[63] = __byte_perm (w[43], w[42], selector); w[62] = __byte_perm (w[42], w[41], selector); w[61] = __byte_perm (w[41], w[40], selector); w[60] = __byte_perm (w[40], w[39], selector); w[59] = __byte_perm (w[39], w[38], selector); w[58] = __byte_perm (w[38], w[37], selector); w[57] = __byte_perm (w[37], w[36], selector); w[56] = __byte_perm (w[36], w[35], selector); w[55] = __byte_perm (w[35], w[34], selector); w[54] = __byte_perm (w[34], w[33], selector); w[53] = __byte_perm (w[33], w[32], selector); w[52] = __byte_perm (w[32], w[31], selector); w[51] = __byte_perm (w[31], w[30], selector); w[50] = __byte_perm (w[30], w[29], selector); w[49] = __byte_perm (w[29], w[28], selector); w[48] = __byte_perm (w[28], w[27], selector); w[47] = __byte_perm (w[27], w[26], selector); w[46] = __byte_perm (w[26], w[25], selector); w[45] = __byte_perm (w[25], w[24], selector); w[44] = __byte_perm (w[24], w[23], selector); w[43] = __byte_perm (w[23], w[22], selector); w[42] = __byte_perm (w[22], w[21], selector); w[41] = __byte_perm (w[21], w[20], selector); w[40] = __byte_perm (w[20], w[19], selector); w[39] = __byte_perm (w[19], w[18], selector); w[38] = __byte_perm (w[18], w[17], selector); w[37] = __byte_perm (w[17], w[16], selector); w[36] = __byte_perm (w[16], w[15], selector); w[35] = __byte_perm (w[15], w[14], selector); w[34] = __byte_perm (w[14], w[13], selector); w[33] = __byte_perm (w[13], w[12], selector); w[32] = __byte_perm (w[12], w[11], selector); w[31] = __byte_perm (w[11], w[10], selector); w[30] = __byte_perm (w[10], w[ 9], selector); w[29] = __byte_perm (w[ 9], w[ 8], selector); w[28] = __byte_perm (w[ 8], w[ 7], selector); w[27] = __byte_perm (w[ 7], w[ 6], selector); w[26] = __byte_perm (w[ 6], w[ 5], selector); w[25] = __byte_perm (w[ 5], w[ 4], selector); w[24] = __byte_perm (w[ 4], w[ 3], selector); w[23] = __byte_perm (w[ 3], w[ 2], selector); w[22] = __byte_perm (w[ 2], w[ 1], selector); w[21] = __byte_perm (w[ 1], w[ 0], selector); w[20] = __byte_perm (w[ 0], 0, selector); w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 21: w[63] = __byte_perm (w[42], w[41], selector); w[62] = __byte_perm (w[41], w[40], selector); w[61] = __byte_perm (w[40], w[39], selector); w[60] = __byte_perm (w[39], w[38], selector); w[59] = __byte_perm (w[38], w[37], selector); w[58] = __byte_perm (w[37], w[36], selector); w[57] = __byte_perm (w[36], w[35], selector); w[56] = __byte_perm (w[35], w[34], selector); w[55] = __byte_perm (w[34], w[33], selector); w[54] = __byte_perm (w[33], w[32], selector); w[53] = __byte_perm (w[32], w[31], selector); w[52] = __byte_perm (w[31], w[30], selector); w[51] = __byte_perm (w[30], w[29], selector); w[50] = __byte_perm (w[29], w[28], selector); w[49] = __byte_perm (w[28], w[27], selector); w[48] = __byte_perm (w[27], w[26], selector); w[47] = __byte_perm (w[26], w[25], selector); w[46] = __byte_perm (w[25], w[24], selector); w[45] = __byte_perm (w[24], w[23], selector); w[44] = __byte_perm (w[23], w[22], selector); w[43] = __byte_perm (w[22], w[21], selector); w[42] = __byte_perm (w[21], w[20], selector); w[41] = __byte_perm (w[20], w[19], selector); w[40] = __byte_perm (w[19], w[18], selector); w[39] = __byte_perm (w[18], w[17], selector); w[38] = __byte_perm (w[17], w[16], selector); w[37] = __byte_perm (w[16], w[15], selector); w[36] = __byte_perm (w[15], w[14], selector); w[35] = __byte_perm (w[14], w[13], selector); w[34] = __byte_perm (w[13], w[12], selector); w[33] = __byte_perm (w[12], w[11], selector); w[32] = __byte_perm (w[11], w[10], selector); w[31] = __byte_perm (w[10], w[ 9], selector); w[30] = __byte_perm (w[ 9], w[ 8], selector); w[29] = __byte_perm (w[ 8], w[ 7], selector); w[28] = __byte_perm (w[ 7], w[ 6], selector); w[27] = __byte_perm (w[ 6], w[ 5], selector); w[26] = __byte_perm (w[ 5], w[ 4], selector); w[25] = __byte_perm (w[ 4], w[ 3], selector); w[24] = __byte_perm (w[ 3], w[ 2], selector); w[23] = __byte_perm (w[ 2], w[ 1], selector); w[22] = __byte_perm (w[ 1], w[ 0], selector); w[21] = __byte_perm (w[ 0], 0, selector); w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 22: w[63] = __byte_perm (w[41], w[40], selector); w[62] = __byte_perm (w[40], w[39], selector); w[61] = __byte_perm (w[39], w[38], selector); w[60] = __byte_perm (w[38], w[37], selector); w[59] = __byte_perm (w[37], w[36], selector); w[58] = __byte_perm (w[36], w[35], selector); w[57] = __byte_perm (w[35], w[34], selector); w[56] = __byte_perm (w[34], w[33], selector); w[55] = __byte_perm (w[33], w[32], selector); w[54] = __byte_perm (w[32], w[31], selector); w[53] = __byte_perm (w[31], w[30], selector); w[52] = __byte_perm (w[30], w[29], selector); w[51] = __byte_perm (w[29], w[28], selector); w[50] = __byte_perm (w[28], w[27], selector); w[49] = __byte_perm (w[27], w[26], selector); w[48] = __byte_perm (w[26], w[25], selector); w[47] = __byte_perm (w[25], w[24], selector); w[46] = __byte_perm (w[24], w[23], selector); w[45] = __byte_perm (w[23], w[22], selector); w[44] = __byte_perm (w[22], w[21], selector); w[43] = __byte_perm (w[21], w[20], selector); w[42] = __byte_perm (w[20], w[19], selector); w[41] = __byte_perm (w[19], w[18], selector); w[40] = __byte_perm (w[18], w[17], selector); w[39] = __byte_perm (w[17], w[16], selector); w[38] = __byte_perm (w[16], w[15], selector); w[37] = __byte_perm (w[15], w[14], selector); w[36] = __byte_perm (w[14], w[13], selector); w[35] = __byte_perm (w[13], w[12], selector); w[34] = __byte_perm (w[12], w[11], selector); w[33] = __byte_perm (w[11], w[10], selector); w[32] = __byte_perm (w[10], w[ 9], selector); w[31] = __byte_perm (w[ 9], w[ 8], selector); w[30] = __byte_perm (w[ 8], w[ 7], selector); w[29] = __byte_perm (w[ 7], w[ 6], selector); w[28] = __byte_perm (w[ 6], w[ 5], selector); w[27] = __byte_perm (w[ 5], w[ 4], selector); w[26] = __byte_perm (w[ 4], w[ 3], selector); w[25] = __byte_perm (w[ 3], w[ 2], selector); w[24] = __byte_perm (w[ 2], w[ 1], selector); w[23] = __byte_perm (w[ 1], w[ 0], selector); w[22] = __byte_perm (w[ 0], 0, selector); w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 23: w[63] = __byte_perm (w[40], w[39], selector); w[62] = __byte_perm (w[39], w[38], selector); w[61] = __byte_perm (w[38], w[37], selector); w[60] = __byte_perm (w[37], w[36], selector); w[59] = __byte_perm (w[36], w[35], selector); w[58] = __byte_perm (w[35], w[34], selector); w[57] = __byte_perm (w[34], w[33], selector); w[56] = __byte_perm (w[33], w[32], selector); w[55] = __byte_perm (w[32], w[31], selector); w[54] = __byte_perm (w[31], w[30], selector); w[53] = __byte_perm (w[30], w[29], selector); w[52] = __byte_perm (w[29], w[28], selector); w[51] = __byte_perm (w[28], w[27], selector); w[50] = __byte_perm (w[27], w[26], selector); w[49] = __byte_perm (w[26], w[25], selector); w[48] = __byte_perm (w[25], w[24], selector); w[47] = __byte_perm (w[24], w[23], selector); w[46] = __byte_perm (w[23], w[22], selector); w[45] = __byte_perm (w[22], w[21], selector); w[44] = __byte_perm (w[21], w[20], selector); w[43] = __byte_perm (w[20], w[19], selector); w[42] = __byte_perm (w[19], w[18], selector); w[41] = __byte_perm (w[18], w[17], selector); w[40] = __byte_perm (w[17], w[16], selector); w[39] = __byte_perm (w[16], w[15], selector); w[38] = __byte_perm (w[15], w[14], selector); w[37] = __byte_perm (w[14], w[13], selector); w[36] = __byte_perm (w[13], w[12], selector); w[35] = __byte_perm (w[12], w[11], selector); w[34] = __byte_perm (w[11], w[10], selector); w[33] = __byte_perm (w[10], w[ 9], selector); w[32] = __byte_perm (w[ 9], w[ 8], selector); w[31] = __byte_perm (w[ 8], w[ 7], selector); w[30] = __byte_perm (w[ 7], w[ 6], selector); w[29] = __byte_perm (w[ 6], w[ 5], selector); w[28] = __byte_perm (w[ 5], w[ 4], selector); w[27] = __byte_perm (w[ 4], w[ 3], selector); w[26] = __byte_perm (w[ 3], w[ 2], selector); w[25] = __byte_perm (w[ 2], w[ 1], selector); w[24] = __byte_perm (w[ 1], w[ 0], selector); w[23] = __byte_perm (w[ 0], 0, selector); w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 24: w[63] = __byte_perm (w[39], w[38], selector); w[62] = __byte_perm (w[38], w[37], selector); w[61] = __byte_perm (w[37], w[36], selector); w[60] = __byte_perm (w[36], w[35], selector); w[59] = __byte_perm (w[35], w[34], selector); w[58] = __byte_perm (w[34], w[33], selector); w[57] = __byte_perm (w[33], w[32], selector); w[56] = __byte_perm (w[32], w[31], selector); w[55] = __byte_perm (w[31], w[30], selector); w[54] = __byte_perm (w[30], w[29], selector); w[53] = __byte_perm (w[29], w[28], selector); w[52] = __byte_perm (w[28], w[27], selector); w[51] = __byte_perm (w[27], w[26], selector); w[50] = __byte_perm (w[26], w[25], selector); w[49] = __byte_perm (w[25], w[24], selector); w[48] = __byte_perm (w[24], w[23], selector); w[47] = __byte_perm (w[23], w[22], selector); w[46] = __byte_perm (w[22], w[21], selector); w[45] = __byte_perm (w[21], w[20], selector); w[44] = __byte_perm (w[20], w[19], selector); w[43] = __byte_perm (w[19], w[18], selector); w[42] = __byte_perm (w[18], w[17], selector); w[41] = __byte_perm (w[17], w[16], selector); w[40] = __byte_perm (w[16], w[15], selector); w[39] = __byte_perm (w[15], w[14], selector); w[38] = __byte_perm (w[14], w[13], selector); w[37] = __byte_perm (w[13], w[12], selector); w[36] = __byte_perm (w[12], w[11], selector); w[35] = __byte_perm (w[11], w[10], selector); w[34] = __byte_perm (w[10], w[ 9], selector); w[33] = __byte_perm (w[ 9], w[ 8], selector); w[32] = __byte_perm (w[ 8], w[ 7], selector); w[31] = __byte_perm (w[ 7], w[ 6], selector); w[30] = __byte_perm (w[ 6], w[ 5], selector); w[29] = __byte_perm (w[ 5], w[ 4], selector); w[28] = __byte_perm (w[ 4], w[ 3], selector); w[27] = __byte_perm (w[ 3], w[ 2], selector); w[26] = __byte_perm (w[ 2], w[ 1], selector); w[25] = __byte_perm (w[ 1], w[ 0], selector); w[24] = __byte_perm (w[ 0], 0, selector); w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 25: w[63] = __byte_perm (w[38], w[37], selector); w[62] = __byte_perm (w[37], w[36], selector); w[61] = __byte_perm (w[36], w[35], selector); w[60] = __byte_perm (w[35], w[34], selector); w[59] = __byte_perm (w[34], w[33], selector); w[58] = __byte_perm (w[33], w[32], selector); w[57] = __byte_perm (w[32], w[31], selector); w[56] = __byte_perm (w[31], w[30], selector); w[55] = __byte_perm (w[30], w[29], selector); w[54] = __byte_perm (w[29], w[28], selector); w[53] = __byte_perm (w[28], w[27], selector); w[52] = __byte_perm (w[27], w[26], selector); w[51] = __byte_perm (w[26], w[25], selector); w[50] = __byte_perm (w[25], w[24], selector); w[49] = __byte_perm (w[24], w[23], selector); w[48] = __byte_perm (w[23], w[22], selector); w[47] = __byte_perm (w[22], w[21], selector); w[46] = __byte_perm (w[21], w[20], selector); w[45] = __byte_perm (w[20], w[19], selector); w[44] = __byte_perm (w[19], w[18], selector); w[43] = __byte_perm (w[18], w[17], selector); w[42] = __byte_perm (w[17], w[16], selector); w[41] = __byte_perm (w[16], w[15], selector); w[40] = __byte_perm (w[15], w[14], selector); w[39] = __byte_perm (w[14], w[13], selector); w[38] = __byte_perm (w[13], w[12], selector); w[37] = __byte_perm (w[12], w[11], selector); w[36] = __byte_perm (w[11], w[10], selector); w[35] = __byte_perm (w[10], w[ 9], selector); w[34] = __byte_perm (w[ 9], w[ 8], selector); w[33] = __byte_perm (w[ 8], w[ 7], selector); w[32] = __byte_perm (w[ 7], w[ 6], selector); w[31] = __byte_perm (w[ 6], w[ 5], selector); w[30] = __byte_perm (w[ 5], w[ 4], selector); w[29] = __byte_perm (w[ 4], w[ 3], selector); w[28] = __byte_perm (w[ 3], w[ 2], selector); w[27] = __byte_perm (w[ 2], w[ 1], selector); w[26] = __byte_perm (w[ 1], w[ 0], selector); w[25] = __byte_perm (w[ 0], 0, selector); w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 26: w[63] = __byte_perm (w[37], w[36], selector); w[62] = __byte_perm (w[36], w[35], selector); w[61] = __byte_perm (w[35], w[34], selector); w[60] = __byte_perm (w[34], w[33], selector); w[59] = __byte_perm (w[33], w[32], selector); w[58] = __byte_perm (w[32], w[31], selector); w[57] = __byte_perm (w[31], w[30], selector); w[56] = __byte_perm (w[30], w[29], selector); w[55] = __byte_perm (w[29], w[28], selector); w[54] = __byte_perm (w[28], w[27], selector); w[53] = __byte_perm (w[27], w[26], selector); w[52] = __byte_perm (w[26], w[25], selector); w[51] = __byte_perm (w[25], w[24], selector); w[50] = __byte_perm (w[24], w[23], selector); w[49] = __byte_perm (w[23], w[22], selector); w[48] = __byte_perm (w[22], w[21], selector); w[47] = __byte_perm (w[21], w[20], selector); w[46] = __byte_perm (w[20], w[19], selector); w[45] = __byte_perm (w[19], w[18], selector); w[44] = __byte_perm (w[18], w[17], selector); w[43] = __byte_perm (w[17], w[16], selector); w[42] = __byte_perm (w[16], w[15], selector); w[41] = __byte_perm (w[15], w[14], selector); w[40] = __byte_perm (w[14], w[13], selector); w[39] = __byte_perm (w[13], w[12], selector); w[38] = __byte_perm (w[12], w[11], selector); w[37] = __byte_perm (w[11], w[10], selector); w[36] = __byte_perm (w[10], w[ 9], selector); w[35] = __byte_perm (w[ 9], w[ 8], selector); w[34] = __byte_perm (w[ 8], w[ 7], selector); w[33] = __byte_perm (w[ 7], w[ 6], selector); w[32] = __byte_perm (w[ 6], w[ 5], selector); w[31] = __byte_perm (w[ 5], w[ 4], selector); w[30] = __byte_perm (w[ 4], w[ 3], selector); w[29] = __byte_perm (w[ 3], w[ 2], selector); w[28] = __byte_perm (w[ 2], w[ 1], selector); w[27] = __byte_perm (w[ 1], w[ 0], selector); w[26] = __byte_perm (w[ 0], 0, selector); w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 27: w[63] = __byte_perm (w[36], w[35], selector); w[62] = __byte_perm (w[35], w[34], selector); w[61] = __byte_perm (w[34], w[33], selector); w[60] = __byte_perm (w[33], w[32], selector); w[59] = __byte_perm (w[32], w[31], selector); w[58] = __byte_perm (w[31], w[30], selector); w[57] = __byte_perm (w[30], w[29], selector); w[56] = __byte_perm (w[29], w[28], selector); w[55] = __byte_perm (w[28], w[27], selector); w[54] = __byte_perm (w[27], w[26], selector); w[53] = __byte_perm (w[26], w[25], selector); w[52] = __byte_perm (w[25], w[24], selector); w[51] = __byte_perm (w[24], w[23], selector); w[50] = __byte_perm (w[23], w[22], selector); w[49] = __byte_perm (w[22], w[21], selector); w[48] = __byte_perm (w[21], w[20], selector); w[47] = __byte_perm (w[20], w[19], selector); w[46] = __byte_perm (w[19], w[18], selector); w[45] = __byte_perm (w[18], w[17], selector); w[44] = __byte_perm (w[17], w[16], selector); w[43] = __byte_perm (w[16], w[15], selector); w[42] = __byte_perm (w[15], w[14], selector); w[41] = __byte_perm (w[14], w[13], selector); w[40] = __byte_perm (w[13], w[12], selector); w[39] = __byte_perm (w[12], w[11], selector); w[38] = __byte_perm (w[11], w[10], selector); w[37] = __byte_perm (w[10], w[ 9], selector); w[36] = __byte_perm (w[ 9], w[ 8], selector); w[35] = __byte_perm (w[ 8], w[ 7], selector); w[34] = __byte_perm (w[ 7], w[ 6], selector); w[33] = __byte_perm (w[ 6], w[ 5], selector); w[32] = __byte_perm (w[ 5], w[ 4], selector); w[31] = __byte_perm (w[ 4], w[ 3], selector); w[30] = __byte_perm (w[ 3], w[ 2], selector); w[29] = __byte_perm (w[ 2], w[ 1], selector); w[28] = __byte_perm (w[ 1], w[ 0], selector); w[27] = __byte_perm (w[ 0], 0, selector); w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 28: w[63] = __byte_perm (w[35], w[34], selector); w[62] = __byte_perm (w[34], w[33], selector); w[61] = __byte_perm (w[33], w[32], selector); w[60] = __byte_perm (w[32], w[31], selector); w[59] = __byte_perm (w[31], w[30], selector); w[58] = __byte_perm (w[30], w[29], selector); w[57] = __byte_perm (w[29], w[28], selector); w[56] = __byte_perm (w[28], w[27], selector); w[55] = __byte_perm (w[27], w[26], selector); w[54] = __byte_perm (w[26], w[25], selector); w[53] = __byte_perm (w[25], w[24], selector); w[52] = __byte_perm (w[24], w[23], selector); w[51] = __byte_perm (w[23], w[22], selector); w[50] = __byte_perm (w[22], w[21], selector); w[49] = __byte_perm (w[21], w[20], selector); w[48] = __byte_perm (w[20], w[19], selector); w[47] = __byte_perm (w[19], w[18], selector); w[46] = __byte_perm (w[18], w[17], selector); w[45] = __byte_perm (w[17], w[16], selector); w[44] = __byte_perm (w[16], w[15], selector); w[43] = __byte_perm (w[15], w[14], selector); w[42] = __byte_perm (w[14], w[13], selector); w[41] = __byte_perm (w[13], w[12], selector); w[40] = __byte_perm (w[12], w[11], selector); w[39] = __byte_perm (w[11], w[10], selector); w[38] = __byte_perm (w[10], w[ 9], selector); w[37] = __byte_perm (w[ 9], w[ 8], selector); w[36] = __byte_perm (w[ 8], w[ 7], selector); w[35] = __byte_perm (w[ 7], w[ 6], selector); w[34] = __byte_perm (w[ 6], w[ 5], selector); w[33] = __byte_perm (w[ 5], w[ 4], selector); w[32] = __byte_perm (w[ 4], w[ 3], selector); w[31] = __byte_perm (w[ 3], w[ 2], selector); w[30] = __byte_perm (w[ 2], w[ 1], selector); w[29] = __byte_perm (w[ 1], w[ 0], selector); w[28] = __byte_perm (w[ 0], 0, selector); w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 29: w[63] = __byte_perm (w[34], w[33], selector); w[62] = __byte_perm (w[33], w[32], selector); w[61] = __byte_perm (w[32], w[31], selector); w[60] = __byte_perm (w[31], w[30], selector); w[59] = __byte_perm (w[30], w[29], selector); w[58] = __byte_perm (w[29], w[28], selector); w[57] = __byte_perm (w[28], w[27], selector); w[56] = __byte_perm (w[27], w[26], selector); w[55] = __byte_perm (w[26], w[25], selector); w[54] = __byte_perm (w[25], w[24], selector); w[53] = __byte_perm (w[24], w[23], selector); w[52] = __byte_perm (w[23], w[22], selector); w[51] = __byte_perm (w[22], w[21], selector); w[50] = __byte_perm (w[21], w[20], selector); w[49] = __byte_perm (w[20], w[19], selector); w[48] = __byte_perm (w[19], w[18], selector); w[47] = __byte_perm (w[18], w[17], selector); w[46] = __byte_perm (w[17], w[16], selector); w[45] = __byte_perm (w[16], w[15], selector); w[44] = __byte_perm (w[15], w[14], selector); w[43] = __byte_perm (w[14], w[13], selector); w[42] = __byte_perm (w[13], w[12], selector); w[41] = __byte_perm (w[12], w[11], selector); w[40] = __byte_perm (w[11], w[10], selector); w[39] = __byte_perm (w[10], w[ 9], selector); w[38] = __byte_perm (w[ 9], w[ 8], selector); w[37] = __byte_perm (w[ 8], w[ 7], selector); w[36] = __byte_perm (w[ 7], w[ 6], selector); w[35] = __byte_perm (w[ 6], w[ 5], selector); w[34] = __byte_perm (w[ 5], w[ 4], selector); w[33] = __byte_perm (w[ 4], w[ 3], selector); w[32] = __byte_perm (w[ 3], w[ 2], selector); w[31] = __byte_perm (w[ 2], w[ 1], selector); w[30] = __byte_perm (w[ 1], w[ 0], selector); w[29] = __byte_perm (w[ 0], 0, selector); w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 30: w[63] = __byte_perm (w[33], w[32], selector); w[62] = __byte_perm (w[32], w[31], selector); w[61] = __byte_perm (w[31], w[30], selector); w[60] = __byte_perm (w[30], w[29], selector); w[59] = __byte_perm (w[29], w[28], selector); w[58] = __byte_perm (w[28], w[27], selector); w[57] = __byte_perm (w[27], w[26], selector); w[56] = __byte_perm (w[26], w[25], selector); w[55] = __byte_perm (w[25], w[24], selector); w[54] = __byte_perm (w[24], w[23], selector); w[53] = __byte_perm (w[23], w[22], selector); w[52] = __byte_perm (w[22], w[21], selector); w[51] = __byte_perm (w[21], w[20], selector); w[50] = __byte_perm (w[20], w[19], selector); w[49] = __byte_perm (w[19], w[18], selector); w[48] = __byte_perm (w[18], w[17], selector); w[47] = __byte_perm (w[17], w[16], selector); w[46] = __byte_perm (w[16], w[15], selector); w[45] = __byte_perm (w[15], w[14], selector); w[44] = __byte_perm (w[14], w[13], selector); w[43] = __byte_perm (w[13], w[12], selector); w[42] = __byte_perm (w[12], w[11], selector); w[41] = __byte_perm (w[11], w[10], selector); w[40] = __byte_perm (w[10], w[ 9], selector); w[39] = __byte_perm (w[ 9], w[ 8], selector); w[38] = __byte_perm (w[ 8], w[ 7], selector); w[37] = __byte_perm (w[ 7], w[ 6], selector); w[36] = __byte_perm (w[ 6], w[ 5], selector); w[35] = __byte_perm (w[ 5], w[ 4], selector); w[34] = __byte_perm (w[ 4], w[ 3], selector); w[33] = __byte_perm (w[ 3], w[ 2], selector); w[32] = __byte_perm (w[ 2], w[ 1], selector); w[31] = __byte_perm (w[ 1], w[ 0], selector); w[30] = __byte_perm (w[ 0], 0, selector); w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 31: w[63] = __byte_perm (w[32], w[31], selector); w[62] = __byte_perm (w[31], w[30], selector); w[61] = __byte_perm (w[30], w[29], selector); w[60] = __byte_perm (w[29], w[28], selector); w[59] = __byte_perm (w[28], w[27], selector); w[58] = __byte_perm (w[27], w[26], selector); w[57] = __byte_perm (w[26], w[25], selector); w[56] = __byte_perm (w[25], w[24], selector); w[55] = __byte_perm (w[24], w[23], selector); w[54] = __byte_perm (w[23], w[22], selector); w[53] = __byte_perm (w[22], w[21], selector); w[52] = __byte_perm (w[21], w[20], selector); w[51] = __byte_perm (w[20], w[19], selector); w[50] = __byte_perm (w[19], w[18], selector); w[49] = __byte_perm (w[18], w[17], selector); w[48] = __byte_perm (w[17], w[16], selector); w[47] = __byte_perm (w[16], w[15], selector); w[46] = __byte_perm (w[15], w[14], selector); w[45] = __byte_perm (w[14], w[13], selector); w[44] = __byte_perm (w[13], w[12], selector); w[43] = __byte_perm (w[12], w[11], selector); w[42] = __byte_perm (w[11], w[10], selector); w[41] = __byte_perm (w[10], w[ 9], selector); w[40] = __byte_perm (w[ 9], w[ 8], selector); w[39] = __byte_perm (w[ 8], w[ 7], selector); w[38] = __byte_perm (w[ 7], w[ 6], selector); w[37] = __byte_perm (w[ 6], w[ 5], selector); w[36] = __byte_perm (w[ 5], w[ 4], selector); w[35] = __byte_perm (w[ 4], w[ 3], selector); w[34] = __byte_perm (w[ 3], w[ 2], selector); w[33] = __byte_perm (w[ 2], w[ 1], selector); w[32] = __byte_perm (w[ 1], w[ 0], selector); w[31] = __byte_perm (w[ 0], 0, selector); w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 32: w[63] = __byte_perm (w[31], w[30], selector); w[62] = __byte_perm (w[30], w[29], selector); w[61] = __byte_perm (w[29], w[28], selector); w[60] = __byte_perm (w[28], w[27], selector); w[59] = __byte_perm (w[27], w[26], selector); w[58] = __byte_perm (w[26], w[25], selector); w[57] = __byte_perm (w[25], w[24], selector); w[56] = __byte_perm (w[24], w[23], selector); w[55] = __byte_perm (w[23], w[22], selector); w[54] = __byte_perm (w[22], w[21], selector); w[53] = __byte_perm (w[21], w[20], selector); w[52] = __byte_perm (w[20], w[19], selector); w[51] = __byte_perm (w[19], w[18], selector); w[50] = __byte_perm (w[18], w[17], selector); w[49] = __byte_perm (w[17], w[16], selector); w[48] = __byte_perm (w[16], w[15], selector); w[47] = __byte_perm (w[15], w[14], selector); w[46] = __byte_perm (w[14], w[13], selector); w[45] = __byte_perm (w[13], w[12], selector); w[44] = __byte_perm (w[12], w[11], selector); w[43] = __byte_perm (w[11], w[10], selector); w[42] = __byte_perm (w[10], w[ 9], selector); w[41] = __byte_perm (w[ 9], w[ 8], selector); w[40] = __byte_perm (w[ 8], w[ 7], selector); w[39] = __byte_perm (w[ 7], w[ 6], selector); w[38] = __byte_perm (w[ 6], w[ 5], selector); w[37] = __byte_perm (w[ 5], w[ 4], selector); w[36] = __byte_perm (w[ 4], w[ 3], selector); w[35] = __byte_perm (w[ 3], w[ 2], selector); w[34] = __byte_perm (w[ 2], w[ 1], selector); w[33] = __byte_perm (w[ 1], w[ 0], selector); w[32] = __byte_perm (w[ 0], 0, selector); w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 33: w[63] = __byte_perm (w[30], w[29], selector); w[62] = __byte_perm (w[29], w[28], selector); w[61] = __byte_perm (w[28], w[27], selector); w[60] = __byte_perm (w[27], w[26], selector); w[59] = __byte_perm (w[26], w[25], selector); w[58] = __byte_perm (w[25], w[24], selector); w[57] = __byte_perm (w[24], w[23], selector); w[56] = __byte_perm (w[23], w[22], selector); w[55] = __byte_perm (w[22], w[21], selector); w[54] = __byte_perm (w[21], w[20], selector); w[53] = __byte_perm (w[20], w[19], selector); w[52] = __byte_perm (w[19], w[18], selector); w[51] = __byte_perm (w[18], w[17], selector); w[50] = __byte_perm (w[17], w[16], selector); w[49] = __byte_perm (w[16], w[15], selector); w[48] = __byte_perm (w[15], w[14], selector); w[47] = __byte_perm (w[14], w[13], selector); w[46] = __byte_perm (w[13], w[12], selector); w[45] = __byte_perm (w[12], w[11], selector); w[44] = __byte_perm (w[11], w[10], selector); w[43] = __byte_perm (w[10], w[ 9], selector); w[42] = __byte_perm (w[ 9], w[ 8], selector); w[41] = __byte_perm (w[ 8], w[ 7], selector); w[40] = __byte_perm (w[ 7], w[ 6], selector); w[39] = __byte_perm (w[ 6], w[ 5], selector); w[38] = __byte_perm (w[ 5], w[ 4], selector); w[37] = __byte_perm (w[ 4], w[ 3], selector); w[36] = __byte_perm (w[ 3], w[ 2], selector); w[35] = __byte_perm (w[ 2], w[ 1], selector); w[34] = __byte_perm (w[ 1], w[ 0], selector); w[33] = __byte_perm (w[ 0], 0, selector); w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 34: w[63] = __byte_perm (w[29], w[28], selector); w[62] = __byte_perm (w[28], w[27], selector); w[61] = __byte_perm (w[27], w[26], selector); w[60] = __byte_perm (w[26], w[25], selector); w[59] = __byte_perm (w[25], w[24], selector); w[58] = __byte_perm (w[24], w[23], selector); w[57] = __byte_perm (w[23], w[22], selector); w[56] = __byte_perm (w[22], w[21], selector); w[55] = __byte_perm (w[21], w[20], selector); w[54] = __byte_perm (w[20], w[19], selector); w[53] = __byte_perm (w[19], w[18], selector); w[52] = __byte_perm (w[18], w[17], selector); w[51] = __byte_perm (w[17], w[16], selector); w[50] = __byte_perm (w[16], w[15], selector); w[49] = __byte_perm (w[15], w[14], selector); w[48] = __byte_perm (w[14], w[13], selector); w[47] = __byte_perm (w[13], w[12], selector); w[46] = __byte_perm (w[12], w[11], selector); w[45] = __byte_perm (w[11], w[10], selector); w[44] = __byte_perm (w[10], w[ 9], selector); w[43] = __byte_perm (w[ 9], w[ 8], selector); w[42] = __byte_perm (w[ 8], w[ 7], selector); w[41] = __byte_perm (w[ 7], w[ 6], selector); w[40] = __byte_perm (w[ 6], w[ 5], selector); w[39] = __byte_perm (w[ 5], w[ 4], selector); w[38] = __byte_perm (w[ 4], w[ 3], selector); w[37] = __byte_perm (w[ 3], w[ 2], selector); w[36] = __byte_perm (w[ 2], w[ 1], selector); w[35] = __byte_perm (w[ 1], w[ 0], selector); w[34] = __byte_perm (w[ 0], 0, selector); w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 35: w[63] = __byte_perm (w[28], w[27], selector); w[62] = __byte_perm (w[27], w[26], selector); w[61] = __byte_perm (w[26], w[25], selector); w[60] = __byte_perm (w[25], w[24], selector); w[59] = __byte_perm (w[24], w[23], selector); w[58] = __byte_perm (w[23], w[22], selector); w[57] = __byte_perm (w[22], w[21], selector); w[56] = __byte_perm (w[21], w[20], selector); w[55] = __byte_perm (w[20], w[19], selector); w[54] = __byte_perm (w[19], w[18], selector); w[53] = __byte_perm (w[18], w[17], selector); w[52] = __byte_perm (w[17], w[16], selector); w[51] = __byte_perm (w[16], w[15], selector); w[50] = __byte_perm (w[15], w[14], selector); w[49] = __byte_perm (w[14], w[13], selector); w[48] = __byte_perm (w[13], w[12], selector); w[47] = __byte_perm (w[12], w[11], selector); w[46] = __byte_perm (w[11], w[10], selector); w[45] = __byte_perm (w[10], w[ 9], selector); w[44] = __byte_perm (w[ 9], w[ 8], selector); w[43] = __byte_perm (w[ 8], w[ 7], selector); w[42] = __byte_perm (w[ 7], w[ 6], selector); w[41] = __byte_perm (w[ 6], w[ 5], selector); w[40] = __byte_perm (w[ 5], w[ 4], selector); w[39] = __byte_perm (w[ 4], w[ 3], selector); w[38] = __byte_perm (w[ 3], w[ 2], selector); w[37] = __byte_perm (w[ 2], w[ 1], selector); w[36] = __byte_perm (w[ 1], w[ 0], selector); w[35] = __byte_perm (w[ 0], 0, selector); w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 36: w[63] = __byte_perm (w[27], w[26], selector); w[62] = __byte_perm (w[26], w[25], selector); w[61] = __byte_perm (w[25], w[24], selector); w[60] = __byte_perm (w[24], w[23], selector); w[59] = __byte_perm (w[23], w[22], selector); w[58] = __byte_perm (w[22], w[21], selector); w[57] = __byte_perm (w[21], w[20], selector); w[56] = __byte_perm (w[20], w[19], selector); w[55] = __byte_perm (w[19], w[18], selector); w[54] = __byte_perm (w[18], w[17], selector); w[53] = __byte_perm (w[17], w[16], selector); w[52] = __byte_perm (w[16], w[15], selector); w[51] = __byte_perm (w[15], w[14], selector); w[50] = __byte_perm (w[14], w[13], selector); w[49] = __byte_perm (w[13], w[12], selector); w[48] = __byte_perm (w[12], w[11], selector); w[47] = __byte_perm (w[11], w[10], selector); w[46] = __byte_perm (w[10], w[ 9], selector); w[45] = __byte_perm (w[ 9], w[ 8], selector); w[44] = __byte_perm (w[ 8], w[ 7], selector); w[43] = __byte_perm (w[ 7], w[ 6], selector); w[42] = __byte_perm (w[ 6], w[ 5], selector); w[41] = __byte_perm (w[ 5], w[ 4], selector); w[40] = __byte_perm (w[ 4], w[ 3], selector); w[39] = __byte_perm (w[ 3], w[ 2], selector); w[38] = __byte_perm (w[ 2], w[ 1], selector); w[37] = __byte_perm (w[ 1], w[ 0], selector); w[36] = __byte_perm (w[ 0], 0, selector); w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 37: w[63] = __byte_perm (w[26], w[25], selector); w[62] = __byte_perm (w[25], w[24], selector); w[61] = __byte_perm (w[24], w[23], selector); w[60] = __byte_perm (w[23], w[22], selector); w[59] = __byte_perm (w[22], w[21], selector); w[58] = __byte_perm (w[21], w[20], selector); w[57] = __byte_perm (w[20], w[19], selector); w[56] = __byte_perm (w[19], w[18], selector); w[55] = __byte_perm (w[18], w[17], selector); w[54] = __byte_perm (w[17], w[16], selector); w[53] = __byte_perm (w[16], w[15], selector); w[52] = __byte_perm (w[15], w[14], selector); w[51] = __byte_perm (w[14], w[13], selector); w[50] = __byte_perm (w[13], w[12], selector); w[49] = __byte_perm (w[12], w[11], selector); w[48] = __byte_perm (w[11], w[10], selector); w[47] = __byte_perm (w[10], w[ 9], selector); w[46] = __byte_perm (w[ 9], w[ 8], selector); w[45] = __byte_perm (w[ 8], w[ 7], selector); w[44] = __byte_perm (w[ 7], w[ 6], selector); w[43] = __byte_perm (w[ 6], w[ 5], selector); w[42] = __byte_perm (w[ 5], w[ 4], selector); w[41] = __byte_perm (w[ 4], w[ 3], selector); w[40] = __byte_perm (w[ 3], w[ 2], selector); w[39] = __byte_perm (w[ 2], w[ 1], selector); w[38] = __byte_perm (w[ 1], w[ 0], selector); w[37] = __byte_perm (w[ 0], 0, selector); w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 38: w[63] = __byte_perm (w[25], w[24], selector); w[62] = __byte_perm (w[24], w[23], selector); w[61] = __byte_perm (w[23], w[22], selector); w[60] = __byte_perm (w[22], w[21], selector); w[59] = __byte_perm (w[21], w[20], selector); w[58] = __byte_perm (w[20], w[19], selector); w[57] = __byte_perm (w[19], w[18], selector); w[56] = __byte_perm (w[18], w[17], selector); w[55] = __byte_perm (w[17], w[16], selector); w[54] = __byte_perm (w[16], w[15], selector); w[53] = __byte_perm (w[15], w[14], selector); w[52] = __byte_perm (w[14], w[13], selector); w[51] = __byte_perm (w[13], w[12], selector); w[50] = __byte_perm (w[12], w[11], selector); w[49] = __byte_perm (w[11], w[10], selector); w[48] = __byte_perm (w[10], w[ 9], selector); w[47] = __byte_perm (w[ 9], w[ 8], selector); w[46] = __byte_perm (w[ 8], w[ 7], selector); w[45] = __byte_perm (w[ 7], w[ 6], selector); w[44] = __byte_perm (w[ 6], w[ 5], selector); w[43] = __byte_perm (w[ 5], w[ 4], selector); w[42] = __byte_perm (w[ 4], w[ 3], selector); w[41] = __byte_perm (w[ 3], w[ 2], selector); w[40] = __byte_perm (w[ 2], w[ 1], selector); w[39] = __byte_perm (w[ 1], w[ 0], selector); w[38] = __byte_perm (w[ 0], 0, selector); w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 39: w[63] = __byte_perm (w[24], w[23], selector); w[62] = __byte_perm (w[23], w[22], selector); w[61] = __byte_perm (w[22], w[21], selector); w[60] = __byte_perm (w[21], w[20], selector); w[59] = __byte_perm (w[20], w[19], selector); w[58] = __byte_perm (w[19], w[18], selector); w[57] = __byte_perm (w[18], w[17], selector); w[56] = __byte_perm (w[17], w[16], selector); w[55] = __byte_perm (w[16], w[15], selector); w[54] = __byte_perm (w[15], w[14], selector); w[53] = __byte_perm (w[14], w[13], selector); w[52] = __byte_perm (w[13], w[12], selector); w[51] = __byte_perm (w[12], w[11], selector); w[50] = __byte_perm (w[11], w[10], selector); w[49] = __byte_perm (w[10], w[ 9], selector); w[48] = __byte_perm (w[ 9], w[ 8], selector); w[47] = __byte_perm (w[ 8], w[ 7], selector); w[46] = __byte_perm (w[ 7], w[ 6], selector); w[45] = __byte_perm (w[ 6], w[ 5], selector); w[44] = __byte_perm (w[ 5], w[ 4], selector); w[43] = __byte_perm (w[ 4], w[ 3], selector); w[42] = __byte_perm (w[ 3], w[ 2], selector); w[41] = __byte_perm (w[ 2], w[ 1], selector); w[40] = __byte_perm (w[ 1], w[ 0], selector); w[39] = __byte_perm (w[ 0], 0, selector); w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 40: w[63] = __byte_perm (w[23], w[22], selector); w[62] = __byte_perm (w[22], w[21], selector); w[61] = __byte_perm (w[21], w[20], selector); w[60] = __byte_perm (w[20], w[19], selector); w[59] = __byte_perm (w[19], w[18], selector); w[58] = __byte_perm (w[18], w[17], selector); w[57] = __byte_perm (w[17], w[16], selector); w[56] = __byte_perm (w[16], w[15], selector); w[55] = __byte_perm (w[15], w[14], selector); w[54] = __byte_perm (w[14], w[13], selector); w[53] = __byte_perm (w[13], w[12], selector); w[52] = __byte_perm (w[12], w[11], selector); w[51] = __byte_perm (w[11], w[10], selector); w[50] = __byte_perm (w[10], w[ 9], selector); w[49] = __byte_perm (w[ 9], w[ 8], selector); w[48] = __byte_perm (w[ 8], w[ 7], selector); w[47] = __byte_perm (w[ 7], w[ 6], selector); w[46] = __byte_perm (w[ 6], w[ 5], selector); w[45] = __byte_perm (w[ 5], w[ 4], selector); w[44] = __byte_perm (w[ 4], w[ 3], selector); w[43] = __byte_perm (w[ 3], w[ 2], selector); w[42] = __byte_perm (w[ 2], w[ 1], selector); w[41] = __byte_perm (w[ 1], w[ 0], selector); w[40] = __byte_perm (w[ 0], 0, selector); w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 41: w[63] = __byte_perm (w[22], w[21], selector); w[62] = __byte_perm (w[21], w[20], selector); w[61] = __byte_perm (w[20], w[19], selector); w[60] = __byte_perm (w[19], w[18], selector); w[59] = __byte_perm (w[18], w[17], selector); w[58] = __byte_perm (w[17], w[16], selector); w[57] = __byte_perm (w[16], w[15], selector); w[56] = __byte_perm (w[15], w[14], selector); w[55] = __byte_perm (w[14], w[13], selector); w[54] = __byte_perm (w[13], w[12], selector); w[53] = __byte_perm (w[12], w[11], selector); w[52] = __byte_perm (w[11], w[10], selector); w[51] = __byte_perm (w[10], w[ 9], selector); w[50] = __byte_perm (w[ 9], w[ 8], selector); w[49] = __byte_perm (w[ 8], w[ 7], selector); w[48] = __byte_perm (w[ 7], w[ 6], selector); w[47] = __byte_perm (w[ 6], w[ 5], selector); w[46] = __byte_perm (w[ 5], w[ 4], selector); w[45] = __byte_perm (w[ 4], w[ 3], selector); w[44] = __byte_perm (w[ 3], w[ 2], selector); w[43] = __byte_perm (w[ 2], w[ 1], selector); w[42] = __byte_perm (w[ 1], w[ 0], selector); w[41] = __byte_perm (w[ 0], 0, selector); w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 42: w[63] = __byte_perm (w[21], w[20], selector); w[62] = __byte_perm (w[20], w[19], selector); w[61] = __byte_perm (w[19], w[18], selector); w[60] = __byte_perm (w[18], w[17], selector); w[59] = __byte_perm (w[17], w[16], selector); w[58] = __byte_perm (w[16], w[15], selector); w[57] = __byte_perm (w[15], w[14], selector); w[56] = __byte_perm (w[14], w[13], selector); w[55] = __byte_perm (w[13], w[12], selector); w[54] = __byte_perm (w[12], w[11], selector); w[53] = __byte_perm (w[11], w[10], selector); w[52] = __byte_perm (w[10], w[ 9], selector); w[51] = __byte_perm (w[ 9], w[ 8], selector); w[50] = __byte_perm (w[ 8], w[ 7], selector); w[49] = __byte_perm (w[ 7], w[ 6], selector); w[48] = __byte_perm (w[ 6], w[ 5], selector); w[47] = __byte_perm (w[ 5], w[ 4], selector); w[46] = __byte_perm (w[ 4], w[ 3], selector); w[45] = __byte_perm (w[ 3], w[ 2], selector); w[44] = __byte_perm (w[ 2], w[ 1], selector); w[43] = __byte_perm (w[ 1], w[ 0], selector); w[42] = __byte_perm (w[ 0], 0, selector); w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 43: w[63] = __byte_perm (w[20], w[19], selector); w[62] = __byte_perm (w[19], w[18], selector); w[61] = __byte_perm (w[18], w[17], selector); w[60] = __byte_perm (w[17], w[16], selector); w[59] = __byte_perm (w[16], w[15], selector); w[58] = __byte_perm (w[15], w[14], selector); w[57] = __byte_perm (w[14], w[13], selector); w[56] = __byte_perm (w[13], w[12], selector); w[55] = __byte_perm (w[12], w[11], selector); w[54] = __byte_perm (w[11], w[10], selector); w[53] = __byte_perm (w[10], w[ 9], selector); w[52] = __byte_perm (w[ 9], w[ 8], selector); w[51] = __byte_perm (w[ 8], w[ 7], selector); w[50] = __byte_perm (w[ 7], w[ 6], selector); w[49] = __byte_perm (w[ 6], w[ 5], selector); w[48] = __byte_perm (w[ 5], w[ 4], selector); w[47] = __byte_perm (w[ 4], w[ 3], selector); w[46] = __byte_perm (w[ 3], w[ 2], selector); w[45] = __byte_perm (w[ 2], w[ 1], selector); w[44] = __byte_perm (w[ 1], w[ 0], selector); w[43] = __byte_perm (w[ 0], 0, selector); w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 44: w[63] = __byte_perm (w[19], w[18], selector); w[62] = __byte_perm (w[18], w[17], selector); w[61] = __byte_perm (w[17], w[16], selector); w[60] = __byte_perm (w[16], w[15], selector); w[59] = __byte_perm (w[15], w[14], selector); w[58] = __byte_perm (w[14], w[13], selector); w[57] = __byte_perm (w[13], w[12], selector); w[56] = __byte_perm (w[12], w[11], selector); w[55] = __byte_perm (w[11], w[10], selector); w[54] = __byte_perm (w[10], w[ 9], selector); w[53] = __byte_perm (w[ 9], w[ 8], selector); w[52] = __byte_perm (w[ 8], w[ 7], selector); w[51] = __byte_perm (w[ 7], w[ 6], selector); w[50] = __byte_perm (w[ 6], w[ 5], selector); w[49] = __byte_perm (w[ 5], w[ 4], selector); w[48] = __byte_perm (w[ 4], w[ 3], selector); w[47] = __byte_perm (w[ 3], w[ 2], selector); w[46] = __byte_perm (w[ 2], w[ 1], selector); w[45] = __byte_perm (w[ 1], w[ 0], selector); w[44] = __byte_perm (w[ 0], 0, selector); w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 45: w[63] = __byte_perm (w[18], w[17], selector); w[62] = __byte_perm (w[17], w[16], selector); w[61] = __byte_perm (w[16], w[15], selector); w[60] = __byte_perm (w[15], w[14], selector); w[59] = __byte_perm (w[14], w[13], selector); w[58] = __byte_perm (w[13], w[12], selector); w[57] = __byte_perm (w[12], w[11], selector); w[56] = __byte_perm (w[11], w[10], selector); w[55] = __byte_perm (w[10], w[ 9], selector); w[54] = __byte_perm (w[ 9], w[ 8], selector); w[53] = __byte_perm (w[ 8], w[ 7], selector); w[52] = __byte_perm (w[ 7], w[ 6], selector); w[51] = __byte_perm (w[ 6], w[ 5], selector); w[50] = __byte_perm (w[ 5], w[ 4], selector); w[49] = __byte_perm (w[ 4], w[ 3], selector); w[48] = __byte_perm (w[ 3], w[ 2], selector); w[47] = __byte_perm (w[ 2], w[ 1], selector); w[46] = __byte_perm (w[ 1], w[ 0], selector); w[45] = __byte_perm (w[ 0], 0, selector); w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 46: w[63] = __byte_perm (w[17], w[16], selector); w[62] = __byte_perm (w[16], w[15], selector); w[61] = __byte_perm (w[15], w[14], selector); w[60] = __byte_perm (w[14], w[13], selector); w[59] = __byte_perm (w[13], w[12], selector); w[58] = __byte_perm (w[12], w[11], selector); w[57] = __byte_perm (w[11], w[10], selector); w[56] = __byte_perm (w[10], w[ 9], selector); w[55] = __byte_perm (w[ 9], w[ 8], selector); w[54] = __byte_perm (w[ 8], w[ 7], selector); w[53] = __byte_perm (w[ 7], w[ 6], selector); w[52] = __byte_perm (w[ 6], w[ 5], selector); w[51] = __byte_perm (w[ 5], w[ 4], selector); w[50] = __byte_perm (w[ 4], w[ 3], selector); w[49] = __byte_perm (w[ 3], w[ 2], selector); w[48] = __byte_perm (w[ 2], w[ 1], selector); w[47] = __byte_perm (w[ 1], w[ 0], selector); w[46] = __byte_perm (w[ 0], 0, selector); w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 47: w[63] = __byte_perm (w[16], w[15], selector); w[62] = __byte_perm (w[15], w[14], selector); w[61] = __byte_perm (w[14], w[13], selector); w[60] = __byte_perm (w[13], w[12], selector); w[59] = __byte_perm (w[12], w[11], selector); w[58] = __byte_perm (w[11], w[10], selector); w[57] = __byte_perm (w[10], w[ 9], selector); w[56] = __byte_perm (w[ 9], w[ 8], selector); w[55] = __byte_perm (w[ 8], w[ 7], selector); w[54] = __byte_perm (w[ 7], w[ 6], selector); w[53] = __byte_perm (w[ 6], w[ 5], selector); w[52] = __byte_perm (w[ 5], w[ 4], selector); w[51] = __byte_perm (w[ 4], w[ 3], selector); w[50] = __byte_perm (w[ 3], w[ 2], selector); w[49] = __byte_perm (w[ 2], w[ 1], selector); w[48] = __byte_perm (w[ 1], w[ 0], selector); w[47] = __byte_perm (w[ 0], 0, selector); w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 48: w[63] = __byte_perm (w[15], w[14], selector); w[62] = __byte_perm (w[14], w[13], selector); w[61] = __byte_perm (w[13], w[12], selector); w[60] = __byte_perm (w[12], w[11], selector); w[59] = __byte_perm (w[11], w[10], selector); w[58] = __byte_perm (w[10], w[ 9], selector); w[57] = __byte_perm (w[ 9], w[ 8], selector); w[56] = __byte_perm (w[ 8], w[ 7], selector); w[55] = __byte_perm (w[ 7], w[ 6], selector); w[54] = __byte_perm (w[ 6], w[ 5], selector); w[53] = __byte_perm (w[ 5], w[ 4], selector); w[52] = __byte_perm (w[ 4], w[ 3], selector); w[51] = __byte_perm (w[ 3], w[ 2], selector); w[50] = __byte_perm (w[ 2], w[ 1], selector); w[49] = __byte_perm (w[ 1], w[ 0], selector); w[48] = __byte_perm (w[ 0], 0, selector); w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 49: w[63] = __byte_perm (w[14], w[13], selector); w[62] = __byte_perm (w[13], w[12], selector); w[61] = __byte_perm (w[12], w[11], selector); w[60] = __byte_perm (w[11], w[10], selector); w[59] = __byte_perm (w[10], w[ 9], selector); w[58] = __byte_perm (w[ 9], w[ 8], selector); w[57] = __byte_perm (w[ 8], w[ 7], selector); w[56] = __byte_perm (w[ 7], w[ 6], selector); w[55] = __byte_perm (w[ 6], w[ 5], selector); w[54] = __byte_perm (w[ 5], w[ 4], selector); w[53] = __byte_perm (w[ 4], w[ 3], selector); w[52] = __byte_perm (w[ 3], w[ 2], selector); w[51] = __byte_perm (w[ 2], w[ 1], selector); w[50] = __byte_perm (w[ 1], w[ 0], selector); w[49] = __byte_perm (w[ 0], 0, selector); w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 50: w[63] = __byte_perm (w[13], w[12], selector); w[62] = __byte_perm (w[12], w[11], selector); w[61] = __byte_perm (w[11], w[10], selector); w[60] = __byte_perm (w[10], w[ 9], selector); w[59] = __byte_perm (w[ 9], w[ 8], selector); w[58] = __byte_perm (w[ 8], w[ 7], selector); w[57] = __byte_perm (w[ 7], w[ 6], selector); w[56] = __byte_perm (w[ 6], w[ 5], selector); w[55] = __byte_perm (w[ 5], w[ 4], selector); w[54] = __byte_perm (w[ 4], w[ 3], selector); w[53] = __byte_perm (w[ 3], w[ 2], selector); w[52] = __byte_perm (w[ 2], w[ 1], selector); w[51] = __byte_perm (w[ 1], w[ 0], selector); w[50] = __byte_perm (w[ 0], 0, selector); w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 51: w[63] = __byte_perm (w[12], w[11], selector); w[62] = __byte_perm (w[11], w[10], selector); w[61] = __byte_perm (w[10], w[ 9], selector); w[60] = __byte_perm (w[ 9], w[ 8], selector); w[59] = __byte_perm (w[ 8], w[ 7], selector); w[58] = __byte_perm (w[ 7], w[ 6], selector); w[57] = __byte_perm (w[ 6], w[ 5], selector); w[56] = __byte_perm (w[ 5], w[ 4], selector); w[55] = __byte_perm (w[ 4], w[ 3], selector); w[54] = __byte_perm (w[ 3], w[ 2], selector); w[53] = __byte_perm (w[ 2], w[ 1], selector); w[52] = __byte_perm (w[ 1], w[ 0], selector); w[51] = __byte_perm (w[ 0], 0, selector); w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 52: w[63] = __byte_perm (w[11], w[10], selector); w[62] = __byte_perm (w[10], w[ 9], selector); w[61] = __byte_perm (w[ 9], w[ 8], selector); w[60] = __byte_perm (w[ 8], w[ 7], selector); w[59] = __byte_perm (w[ 7], w[ 6], selector); w[58] = __byte_perm (w[ 6], w[ 5], selector); w[57] = __byte_perm (w[ 5], w[ 4], selector); w[56] = __byte_perm (w[ 4], w[ 3], selector); w[55] = __byte_perm (w[ 3], w[ 2], selector); w[54] = __byte_perm (w[ 2], w[ 1], selector); w[53] = __byte_perm (w[ 1], w[ 0], selector); w[52] = __byte_perm (w[ 0], 0, selector); w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 53: w[63] = __byte_perm (w[10], w[ 9], selector); w[62] = __byte_perm (w[ 9], w[ 8], selector); w[61] = __byte_perm (w[ 8], w[ 7], selector); w[60] = __byte_perm (w[ 7], w[ 6], selector); w[59] = __byte_perm (w[ 6], w[ 5], selector); w[58] = __byte_perm (w[ 5], w[ 4], selector); w[57] = __byte_perm (w[ 4], w[ 3], selector); w[56] = __byte_perm (w[ 3], w[ 2], selector); w[55] = __byte_perm (w[ 2], w[ 1], selector); w[54] = __byte_perm (w[ 1], w[ 0], selector); w[53] = __byte_perm (w[ 0], 0, selector); w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 54: w[63] = __byte_perm (w[ 9], w[ 8], selector); w[62] = __byte_perm (w[ 8], w[ 7], selector); w[61] = __byte_perm (w[ 7], w[ 6], selector); w[60] = __byte_perm (w[ 6], w[ 5], selector); w[59] = __byte_perm (w[ 5], w[ 4], selector); w[58] = __byte_perm (w[ 4], w[ 3], selector); w[57] = __byte_perm (w[ 3], w[ 2], selector); w[56] = __byte_perm (w[ 2], w[ 1], selector); w[55] = __byte_perm (w[ 1], w[ 0], selector); w[54] = __byte_perm (w[ 0], 0, selector); w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 55: w[63] = __byte_perm (w[ 8], w[ 7], selector); w[62] = __byte_perm (w[ 7], w[ 6], selector); w[61] = __byte_perm (w[ 6], w[ 5], selector); w[60] = __byte_perm (w[ 5], w[ 4], selector); w[59] = __byte_perm (w[ 4], w[ 3], selector); w[58] = __byte_perm (w[ 3], w[ 2], selector); w[57] = __byte_perm (w[ 2], w[ 1], selector); w[56] = __byte_perm (w[ 1], w[ 0], selector); w[55] = __byte_perm (w[ 0], 0, selector); w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 56: w[63] = __byte_perm (w[ 7], w[ 6], selector); w[62] = __byte_perm (w[ 6], w[ 5], selector); w[61] = __byte_perm (w[ 5], w[ 4], selector); w[60] = __byte_perm (w[ 4], w[ 3], selector); w[59] = __byte_perm (w[ 3], w[ 2], selector); w[58] = __byte_perm (w[ 2], w[ 1], selector); w[57] = __byte_perm (w[ 1], w[ 0], selector); w[56] = __byte_perm (w[ 0], 0, selector); w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 57: w[63] = __byte_perm (w[ 6], w[ 5], selector); w[62] = __byte_perm (w[ 5], w[ 4], selector); w[61] = __byte_perm (w[ 4], w[ 3], selector); w[60] = __byte_perm (w[ 3], w[ 2], selector); w[59] = __byte_perm (w[ 2], w[ 1], selector); w[58] = __byte_perm (w[ 1], w[ 0], selector); w[57] = __byte_perm (w[ 0], 0, selector); w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 58: w[63] = __byte_perm (w[ 5], w[ 4], selector); w[62] = __byte_perm (w[ 4], w[ 3], selector); w[61] = __byte_perm (w[ 3], w[ 2], selector); w[60] = __byte_perm (w[ 2], w[ 1], selector); w[59] = __byte_perm (w[ 1], w[ 0], selector); w[58] = __byte_perm (w[ 0], 0, selector); w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 59: w[63] = __byte_perm (w[ 4], w[ 3], selector); w[62] = __byte_perm (w[ 3], w[ 2], selector); w[61] = __byte_perm (w[ 2], w[ 1], selector); w[60] = __byte_perm (w[ 1], w[ 0], selector); w[59] = __byte_perm (w[ 0], 0, selector); w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 60: w[63] = __byte_perm (w[ 3], w[ 2], selector); w[62] = __byte_perm (w[ 2], w[ 1], selector); w[61] = __byte_perm (w[ 1], w[ 0], selector); w[60] = __byte_perm (w[ 0], 0, selector); w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 61: w[63] = __byte_perm (w[ 2], w[ 1], selector); w[62] = __byte_perm (w[ 1], w[ 0], selector); w[61] = __byte_perm (w[ 0], 0, selector); w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 62: w[63] = __byte_perm (w[ 1], w[ 0], selector); w[62] = __byte_perm (w[ 0], 0, selector); w[61] = 0; w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 63: w[63] = __byte_perm (w[ 0], 0, selector); w[62] = 0; w[61] = 0; w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; } #endif } /** * vector functions as scalar (for outer loop usage) */ void truncate_block_4x4_le_S (u32 w0[4], const u32 len) { switch (len) { case 0: w0[0] = 0; w0[1] = 0; w0[2] = 0; w0[3] = 0; break; case 1: w0[0] &= 0x000000ff; w0[1] = 0; w0[2] = 0; w0[3] = 0; break; case 2: w0[0] &= 0x0000ffff; w0[1] = 0; w0[2] = 0; w0[3] = 0; break; case 3: w0[0] &= 0x00ffffff; w0[1] = 0; w0[2] = 0; w0[3] = 0; break; case 4: w0[1] = 0; w0[2] = 0; w0[3] = 0; break; case 5: w0[1] &= 0x000000ff; w0[2] = 0; w0[3] = 0; break; case 6: w0[1] &= 0x0000ffff; w0[2] = 0; w0[3] = 0; break; case 7: w0[1] &= 0x00ffffff; w0[2] = 0; w0[3] = 0; break; case 8: w0[2] = 0; w0[3] = 0; break; case 9: w0[2] &= 0x000000ff; w0[3] = 0; break; case 10: w0[2] &= 0x0000ffff; w0[3] = 0; break; case 11: w0[2] &= 0x00ffffff; w0[3] = 0; break; case 12: w0[3] = 0; break; case 13: w0[3] &= 0x000000ff; break; case 14: w0[3] &= 0x0000ffff; break; case 15: w0[3] &= 0x00ffffff; break; } } void truncate_block_4x4_be_S (u32 w0[4], const u32 len) { switch (len) { case 0: w0[0] = 0; w0[1] = 0; w0[2] = 0; w0[3] = 0; break; case 1: w0[0] &= 0xff000000; w0[1] = 0; w0[2] = 0; w0[3] = 0; break; case 2: w0[0] &= 0xffff0000; w0[1] = 0; w0[2] = 0; w0[3] = 0; break; case 3: w0[0] &= 0xffffff00; w0[1] = 0; w0[2] = 0; w0[3] = 0; break; case 4: w0[1] = 0; w0[2] = 0; w0[3] = 0; break; case 5: w0[1] &= 0xff000000; w0[2] = 0; w0[3] = 0; break; case 6: w0[1] &= 0xffff0000; w0[2] = 0; w0[3] = 0; break; case 7: w0[1] &= 0xffffff00; w0[2] = 0; w0[3] = 0; break; case 8: w0[2] = 0; w0[3] = 0; break; case 9: w0[2] &= 0xff000000; w0[3] = 0; break; case 10: w0[2] &= 0xffff0000; w0[3] = 0; break; case 11: w0[2] &= 0xffffff00; w0[3] = 0; break; case 12: w0[3] = 0; break; case 13: w0[3] &= 0xff000000; break; case 14: w0[3] &= 0xffff0000; break; case 15: w0[3] &= 0xffffff00; break; } } void truncate_block_16x4_le_S (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 len) { switch (len) { case 0: 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] = 0; w3[2] = 0; w3[3] = 0; break; case 1: w0[0] &= 0x000000ff; 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] = 0; break; case 2: w0[0] &= 0x0000ffff; 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] = 0; break; case 3: w0[0] &= 0x00ffffff; 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] = 0; break; case 4: 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] = 0; break; case 5: w0[1] &= 0x000000ff; 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; break; case 6: w0[1] &= 0x0000ffff; 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; break; case 7: w0[1] &= 0x00ffffff; 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; break; case 8: 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; break; case 9: w0[2] &= 0x000000ff; 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; break; case 10: w0[2] &= 0x0000ffff; 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; break; case 11: w0[2] &= 0x00ffffff; 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; break; case 12: 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; break; case 13: w0[3] &= 0x000000ff; 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; break; case 14: w0[3] &= 0x0000ffff; 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; break; case 15: w0[3] &= 0x00ffffff; 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; break; case 16: 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; break; case 17: w1[0] &= 0x000000ff; 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; break; case 18: w1[0] &= 0x0000ffff; 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; break; case 19: w1[0] &= 0x00ffffff; 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; break; case 20: 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; break; case 21: w1[1] &= 0x000000ff; 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; break; case 22: w1[1] &= 0x0000ffff; 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; break; case 23: w1[1] &= 0x00ffffff; 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; break; case 24: 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; break; case 25: w1[2] &= 0x000000ff; 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; break; case 26: w1[2] &= 0x0000ffff; 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; break; case 27: w1[2] &= 0x00ffffff; 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; break; case 28: 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; break; case 29: w1[3] &= 0x000000ff; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 30: w1[3] &= 0x0000ffff; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 31: w1[3] &= 0x00ffffff; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 32: w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 33: w2[0] &= 0x000000ff; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 34: w2[0] &= 0x0000ffff; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 35: w2[0] &= 0x00ffffff; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 36: w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 37: w2[1] &= 0x000000ff; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 38: w2[1] &= 0x0000ffff; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 39: w2[1] &= 0x00ffffff; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 40: w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 41: w2[2] &= 0x000000ff; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 42: w2[2] &= 0x0000ffff; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 43: w2[2] &= 0x00ffffff; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 44: w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 45: w2[3] &= 0x000000ff; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 46: w2[3] &= 0x0000ffff; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 47: w2[3] &= 0x00ffffff; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 48: w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 49: w3[0] &= 0x000000ff; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 50: w3[0] &= 0x0000ffff; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 51: w3[0] &= 0x00ffffff; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 52: w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 53: w3[1] &= 0x000000ff; w3[2] = 0; w3[3] = 0; break; case 54: w3[1] &= 0x0000ffff; w3[2] = 0; w3[3] = 0; break; case 55: w3[1] &= 0x00ffffff; w3[2] = 0; w3[3] = 0; break; case 56: w3[2] = 0; w3[3] = 0; break; case 57: w3[2] &= 0x000000ff; w3[3] = 0; break; case 58: w3[2] &= 0x0000ffff; w3[3] = 0; break; case 59: w3[2] &= 0x00ffffff; w3[3] = 0; break; case 60: w3[3] = 0; break; case 61: w3[3] &= 0x000000ff; break; case 62: w3[3] &= 0x0000ffff; break; case 63: w3[3] &= 0x00ffffff; break; } } void truncate_block_16x4_be_S (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 len) { switch (len) { case 0: 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] = 0; w3[2] = 0; w3[3] = 0; break; case 1: w0[0] &= 0xff000000; 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] = 0; break; case 2: w0[0] &= 0xffff0000; 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] = 0; break; case 3: w0[0] &= 0xffffff00; 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] = 0; break; case 4: 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] = 0; break; case 5: w0[1] &= 0xff000000; 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; break; case 6: w0[1] &= 0xffff0000; 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; break; case 7: w0[1] &= 0xffffff00; 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; break; case 8: 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; break; case 9: w0[2] &= 0xff000000; 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; break; case 10: w0[2] &= 0xffff0000; 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; break; case 11: w0[2] &= 0xffffff00; 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; break; case 12: 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; break; case 13: w0[3] &= 0xff000000; 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; break; case 14: w0[3] &= 0xffff0000; 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; break; case 15: w0[3] &= 0xffffff00; 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; break; case 16: 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; break; case 17: w1[0] &= 0xff000000; 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; break; case 18: w1[0] &= 0xffff0000; 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; break; case 19: w1[0] &= 0xffffff00; 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; break; case 20: 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; break; case 21: w1[1] &= 0xff000000; 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; break; case 22: w1[1] &= 0xffff0000; 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; break; case 23: w1[1] &= 0xffffff00; 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; break; case 24: 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; break; case 25: w1[2] &= 0xff000000; 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; break; case 26: w1[2] &= 0xffff0000; 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; break; case 27: w1[2] &= 0xffffff00; 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; break; case 28: 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; break; case 29: w1[3] &= 0xff000000; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 30: w1[3] &= 0xffff0000; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 31: w1[3] &= 0xffffff00; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 32: w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 33: w2[0] &= 0xff000000; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 34: w2[0] &= 0xffff0000; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 35: w2[0] &= 0xffffff00; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 36: w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 37: w2[1] &= 0xff000000; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 38: w2[1] &= 0xffff0000; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 39: w2[1] &= 0xffffff00; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 40: w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 41: w2[2] &= 0xff000000; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 42: w2[2] &= 0xffff0000; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 43: w2[2] &= 0xffffff00; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 44: w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 45: w2[3] &= 0xff000000; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 46: w2[3] &= 0xffff0000; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 47: w2[3] &= 0xffffff00; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 48: w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 49: w3[0] &= 0xff000000; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 50: w3[0] &= 0xffff0000; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 51: w3[0] &= 0xffffff00; w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 52: w3[1] = 0; w3[2] = 0; w3[3] = 0; break; case 53: w3[1] &= 0xff000000; w3[2] = 0; w3[3] = 0; break; case 54: w3[1] &= 0xffff0000; w3[2] = 0; w3[3] = 0; break; case 55: w3[1] &= 0xffffff00; w3[2] = 0; w3[3] = 0; break; case 56: w3[2] = 0; w3[3] = 0; break; case 57: w3[2] &= 0xff000000; w3[3] = 0; break; case 58: w3[2] &= 0xffff0000; w3[3] = 0; break; case 59: w3[2] &= 0xffffff00; w3[3] = 0; break; case 60: w3[3] = 0; break; case 61: w3[3] &= 0xff000000; break; case 62: w3[3] &= 0xffff0000; break; case 63: w3[3] &= 0xffffff00; break; } } void append_0x01_2x4_S (u32 w0[4], u32 w1[4], const u32 offset) { w0[0] |= 0x01010101 & c_append_helper[offset][0]; w0[1] |= 0x01010101 & c_append_helper[offset][1]; w0[2] |= 0x01010101 & c_append_helper[offset][2]; w0[3] |= 0x01010101 & c_append_helper[offset][3]; w1[0] |= 0x01010101 & c_append_helper[offset][4]; w1[1] |= 0x01010101 & c_append_helper[offset][5]; w1[2] |= 0x01010101 & c_append_helper[offset][6]; w1[3] |= 0x01010101 & c_append_helper[offset][7]; } void append_0x80_1x4_S (u32 w0[4], const u32 offset) { w0[0] |= 0x80808080 & c_append_helper[offset][0]; w0[1] |= 0x80808080 & c_append_helper[offset][1]; w0[2] |= 0x80808080 & c_append_helper[offset][2]; w0[3] |= 0x80808080 & c_append_helper[offset][3]; } void append_0x80_2x4_S (u32 w0[4], u32 w1[4], const u32 offset) { w0[0] |= 0x80808080 & c_append_helper[offset][0]; w0[1] |= 0x80808080 & c_append_helper[offset][1]; w0[2] |= 0x80808080 & c_append_helper[offset][2]; w0[3] |= 0x80808080 & c_append_helper[offset][3]; w1[0] |= 0x80808080 & c_append_helper[offset][4]; w1[1] |= 0x80808080 & c_append_helper[offset][5]; w1[2] |= 0x80808080 & c_append_helper[offset][6]; w1[3] |= 0x80808080 & c_append_helper[offset][7]; } void append_0x80_3x4_S (u32 w0[4], u32 w1[4], u32 w2[4], const u32 offset) { w0[0] |= 0x80808080 & c_append_helper[offset][ 0]; w0[1] |= 0x80808080 & c_append_helper[offset][ 1]; w0[2] |= 0x80808080 & c_append_helper[offset][ 2]; w0[3] |= 0x80808080 & c_append_helper[offset][ 3]; w1[0] |= 0x80808080 & c_append_helper[offset][ 4]; w1[1] |= 0x80808080 & c_append_helper[offset][ 5]; w1[2] |= 0x80808080 & c_append_helper[offset][ 6]; w1[3] |= 0x80808080 & c_append_helper[offset][ 7]; w2[0] |= 0x80808080 & c_append_helper[offset][ 8]; w2[1] |= 0x80808080 & c_append_helper[offset][ 9]; w2[2] |= 0x80808080 & c_append_helper[offset][10]; w2[3] |= 0x80808080 & c_append_helper[offset][11]; } void append_0x80_4x4_S (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 offset) { w0[0] |= 0x80808080 & c_append_helper[offset][ 0]; w0[1] |= 0x80808080 & c_append_helper[offset][ 1]; w0[2] |= 0x80808080 & c_append_helper[offset][ 2]; w0[3] |= 0x80808080 & c_append_helper[offset][ 3]; w1[0] |= 0x80808080 & c_append_helper[offset][ 4]; w1[1] |= 0x80808080 & c_append_helper[offset][ 5]; w1[2] |= 0x80808080 & c_append_helper[offset][ 6]; w1[3] |= 0x80808080 & c_append_helper[offset][ 7]; w2[0] |= 0x80808080 & c_append_helper[offset][ 8]; w2[1] |= 0x80808080 & c_append_helper[offset][ 9]; w2[2] |= 0x80808080 & c_append_helper[offset][10]; w2[3] |= 0x80808080 & c_append_helper[offset][11]; w3[0] |= 0x80808080 & c_append_helper[offset][12]; w3[1] |= 0x80808080 & c_append_helper[offset][13]; w3[2] |= 0x80808080 & c_append_helper[offset][14]; w3[3] |= 0x80808080 & c_append_helper[offset][15]; } void append_0x80_8x4_S (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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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; } } void make_utf16be_S (const u32 in[4], u32 out1[4], u32 out2[4]) { #if defined IS_NV out2[3] = __byte_perm_S (in[3], 0, 0x3727); out2[2] = __byte_perm_S (in[3], 0, 0x1707); out2[1] = __byte_perm_S (in[2], 0, 0x3727); out2[0] = __byte_perm_S (in[2], 0, 0x1707); out1[3] = __byte_perm_S (in[1], 0, 0x3727); out1[2] = __byte_perm_S (in[1], 0, 0x1707); out1[1] = __byte_perm_S (in[0], 0, 0x3727); out1[0] = __byte_perm_S (in[0], 0, 0x1707); #elif defined IS_AMD && AMD_GCN >= 3 out2[3] = __byte_perm_S (in[3], 0, 0x03070207); out2[2] = __byte_perm_S (in[3], 0, 0x01070007); out2[1] = __byte_perm_S (in[2], 0, 0x03070207); out2[0] = __byte_perm_S (in[2], 0, 0x01070007); out1[3] = __byte_perm_S (in[1], 0, 0x03070207); out1[2] = __byte_perm_S (in[1], 0, 0x01070007); out1[1] = __byte_perm_S (in[0], 0, 0x03070207); out1[0] = __byte_perm_S (in[0], 0, 0x01070007); #else out2[3] = ((in[3] >> 0) & 0xFF000000) | ((in[3] >> 8) & 0x0000FF00); out2[2] = ((in[3] << 16) & 0xFF000000) | ((in[3] << 8) & 0x0000FF00); out2[1] = ((in[2] >> 0) & 0xFF000000) | ((in[2] >> 8) & 0x0000FF00); out2[0] = ((in[2] << 16) & 0xFF000000) | ((in[2] << 8) & 0x0000FF00); out1[3] = ((in[1] >> 0) & 0xFF000000) | ((in[1] >> 8) & 0x0000FF00); out1[2] = ((in[1] << 16) & 0xFF000000) | ((in[1] << 8) & 0x0000FF00); out1[1] = ((in[0] >> 0) & 0xFF000000) | ((in[0] >> 8) & 0x0000FF00); out1[0] = ((in[0] << 16) & 0xFF000000) | ((in[0] << 8) & 0x0000FF00); #endif } void make_utf16le_S (const u32 in[4], u32 out1[4], u32 out2[4]) { #if defined IS_NV out2[3] = __byte_perm_S (in[3], 0, 0x7372); out2[2] = __byte_perm_S (in[3], 0, 0x7170); out2[1] = __byte_perm_S (in[2], 0, 0x7372); out2[0] = __byte_perm_S (in[2], 0, 0x7170); out1[3] = __byte_perm_S (in[1], 0, 0x7372); out1[2] = __byte_perm_S (in[1], 0, 0x7170); out1[1] = __byte_perm_S (in[0], 0, 0x7372); out1[0] = __byte_perm_S (in[0], 0, 0x7170); #elif defined IS_AMD && AMD_GCN >= 3 out2[3] = __byte_perm_S (in[3], 0, 0x07030702); out2[2] = __byte_perm_S (in[3], 0, 0x07010700); out2[1] = __byte_perm_S (in[2], 0, 0x07030702); out2[0] = __byte_perm_S (in[2], 0, 0x07010700); out1[3] = __byte_perm_S (in[1], 0, 0x07030702); out1[2] = __byte_perm_S (in[1], 0, 0x07010700); out1[1] = __byte_perm_S (in[0], 0, 0x07030702); out1[0] = __byte_perm_S (in[0], 0, 0x07010700); #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 } void undo_utf16be_S (const u32 in1[4], const u32 in2[4], u32 out[4]) { #if defined IS_NV out[0] = __byte_perm_S (in1[0], in1[1], 0x4602); out[1] = __byte_perm_S (in1[2], in1[3], 0x4602); out[2] = __byte_perm_S (in2[0], in2[1], 0x4602); out[3] = __byte_perm_S (in2[2], in2[3], 0x4602); #elif defined IS_AMD && AMD_GCN >= 3 out[0] = __byte_perm_S (in1[0], in1[1], 0x04060002); out[1] = __byte_perm_S (in1[2], in1[3], 0x04060002); out[2] = __byte_perm_S (in2[0], in2[1], 0x04060002); out[3] = __byte_perm_S (in2[2], in2[3], 0x04060002); #else out[0] = ((in1[0] & 0x0000ff00) >> 8) | ((in1[0] & 0xff000000) >> 16) | ((in1[1] & 0x0000ff00) << 8) | ((in1[1] & 0xff000000) << 0); out[1] = ((in1[2] & 0x0000ff00) >> 8) | ((in1[2] & 0xff000000) >> 16) | ((in1[3] & 0x0000ff00) << 8) | ((in1[3] & 0xff000000) << 0); out[2] = ((in2[0] & 0x0000ff00) >> 8) | ((in2[0] & 0xff000000) >> 16) | ((in2[1] & 0x0000ff00) << 8) | ((in2[1] & 0xff000000) << 0); out[3] = ((in2[2] & 0x0000ff00) >> 8) | ((in2[2] & 0xff000000) >> 16) | ((in2[3] & 0x0000ff00) << 8) | ((in2[3] & 0xff000000) << 0); #endif } void undo_utf16le_S (const u32 in1[4], const u32 in2[4], u32 out[4]) { #if defined IS_NV out[0] = __byte_perm_S (in1[0], in1[1], 0x6420); out[1] = __byte_perm_S (in1[2], in1[3], 0x6420); out[2] = __byte_perm_S (in2[0], in2[1], 0x6420); out[3] = __byte_perm_S (in2[2], in2[3], 0x6420); #elif defined IS_AMD && AMD_GCN >= 3 out[0] = __byte_perm_S (in1[0], in1[1], 0x06040200); out[1] = __byte_perm_S (in1[2], in1[3], 0x06040200); out[2] = __byte_perm_S (in2[0], in2[1], 0x06040200); out[3] = __byte_perm_S (in2[2], in2[3], 0x06040200); #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 } void switch_buffer_by_offset_le_S (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_mod_4; #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if (defined IS_AMD && AMD_GCN < 3) || defined IS_GENERIC w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); switch (offset_switch) { case 0: w3[3] = amd_bytealign_S (w3[2], w3[3], offset); w3[2] = amd_bytealign_S (w3[1], w3[2], offset); w3[1] = amd_bytealign_S (w3[0], w3[1], offset); w3[0] = amd_bytealign_S (w2[3], w3[0], offset); w2[3] = amd_bytealign_S (w2[2], w2[3], offset); w2[2] = amd_bytealign_S (w2[1], w2[2], offset); w2[1] = amd_bytealign_S (w2[0], w2[1], offset); w2[0] = amd_bytealign_S (w1[3], w2[0], offset); w1[3] = amd_bytealign_S (w1[2], w1[3], offset); w1[2] = amd_bytealign_S (w1[1], w1[2], offset); w1[1] = amd_bytealign_S (w1[0], w1[1], offset); w1[0] = amd_bytealign_S (w0[3], w1[0], offset); w0[3] = amd_bytealign_S (w0[2], w0[3], offset); w0[2] = amd_bytealign_S (w0[1], w0[2], offset); w0[1] = amd_bytealign_S (w0[0], w0[1], offset); w0[0] = amd_bytealign_S ( 0, w0[0], offset); break; case 1: w3[3] = amd_bytealign_S (w3[1], w3[2], offset); w3[2] = amd_bytealign_S (w3[0], w3[1], offset); w3[1] = amd_bytealign_S (w2[3], w3[0], offset); w3[0] = amd_bytealign_S (w2[2], w2[3], offset); w2[3] = amd_bytealign_S (w2[1], w2[2], offset); w2[2] = amd_bytealign_S (w2[0], w2[1], offset); w2[1] = amd_bytealign_S (w1[3], w2[0], offset); w2[0] = amd_bytealign_S (w1[2], w1[3], offset); w1[3] = amd_bytealign_S (w1[1], w1[2], offset); w1[2] = amd_bytealign_S (w1[0], w1[1], offset); w1[1] = amd_bytealign_S (w0[3], w1[0], offset); w1[0] = amd_bytealign_S (w0[2], w0[3], offset); w0[3] = amd_bytealign_S (w0[1], w0[2], offset); w0[2] = amd_bytealign_S (w0[0], w0[1], offset); w0[1] = amd_bytealign_S ( 0, w0[0], offset); w0[0] = 0; break; case 2: w3[3] = amd_bytealign_S (w3[0], w3[1], offset); w3[2] = amd_bytealign_S (w2[3], w3[0], offset); w3[1] = amd_bytealign_S (w2[2], w2[3], offset); w3[0] = amd_bytealign_S (w2[1], w2[2], offset); w2[3] = amd_bytealign_S (w2[0], w2[1], offset); w2[2] = amd_bytealign_S (w1[3], w2[0], offset); w2[1] = amd_bytealign_S (w1[2], w1[3], offset); w2[0] = amd_bytealign_S (w1[1], w1[2], offset); w1[3] = amd_bytealign_S (w1[0], w1[1], offset); w1[2] = amd_bytealign_S (w0[3], w1[0], offset); w1[1] = amd_bytealign_S (w0[2], w0[3], offset); w1[0] = amd_bytealign_S (w0[1], w0[2], offset); w0[3] = amd_bytealign_S (w0[0], w0[1], offset); w0[2] = amd_bytealign_S ( 0, w0[0], offset); w0[1] = 0; w0[0] = 0; break; case 3: w3[3] = amd_bytealign_S (w2[3], w3[0], offset); w3[2] = amd_bytealign_S (w2[2], w2[3], offset); w3[1] = amd_bytealign_S (w2[1], w2[2], offset); w3[0] = amd_bytealign_S (w2[0], w2[1], offset); w2[3] = amd_bytealign_S (w1[3], w2[0], offset); w2[2] = amd_bytealign_S (w1[2], w1[3], offset); w2[1] = amd_bytealign_S (w1[1], w1[2], offset); w2[0] = amd_bytealign_S (w1[0], w1[1], offset); w1[3] = amd_bytealign_S (w0[3], w1[0], offset); w1[2] = amd_bytealign_S (w0[2], w0[3], offset); w1[1] = amd_bytealign_S (w0[1], w0[2], offset); w1[0] = amd_bytealign_S (w0[0], w0[1], offset); w0[3] = amd_bytealign_S ( 0, w0[0], offset); w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 4: w3[3] = amd_bytealign_S (w2[2], w2[3], offset); w3[2] = amd_bytealign_S (w2[1], w2[2], offset); w3[1] = amd_bytealign_S (w2[0], w2[1], offset); w3[0] = amd_bytealign_S (w1[3], w2[0], offset); w2[3] = amd_bytealign_S (w1[2], w1[3], offset); w2[2] = amd_bytealign_S (w1[1], w1[2], offset); w2[1] = amd_bytealign_S (w1[0], w1[1], offset); w2[0] = amd_bytealign_S (w0[3], w1[0], offset); w1[3] = amd_bytealign_S (w0[2], w0[3], offset); w1[2] = amd_bytealign_S (w0[1], w0[2], offset); w1[1] = amd_bytealign_S (w0[0], w0[1], offset); w1[0] = amd_bytealign_S ( 0, w0[0], offset); w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 5: w3[3] = amd_bytealign_S (w2[1], w2[2], offset); w3[2] = amd_bytealign_S (w2[0], w2[1], offset); w3[1] = amd_bytealign_S (w1[3], w2[0], offset); w3[0] = amd_bytealign_S (w1[2], w1[3], offset); w2[3] = amd_bytealign_S (w1[1], w1[2], offset); w2[2] = amd_bytealign_S (w1[0], w1[1], offset); w2[1] = amd_bytealign_S (w0[3], w1[0], offset); w2[0] = amd_bytealign_S (w0[2], w0[3], offset); w1[3] = amd_bytealign_S (w0[1], w0[2], offset); w1[2] = amd_bytealign_S (w0[0], w0[1], offset); w1[1] = amd_bytealign_S ( 0, w0[0], offset); w1[0] = 0; w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 6: w3[3] = amd_bytealign_S (w2[0], w2[1], offset); w3[2] = amd_bytealign_S (w1[3], w2[0], offset); w3[1] = amd_bytealign_S (w1[2], w1[3], offset); w3[0] = amd_bytealign_S (w1[1], w1[2], offset); w2[3] = amd_bytealign_S (w1[0], w1[1], offset); w2[2] = amd_bytealign_S (w0[3], w1[0], offset); w2[1] = amd_bytealign_S (w0[2], w0[3], offset); w2[0] = amd_bytealign_S (w0[1], w0[2], offset); w1[3] = amd_bytealign_S (w0[0], w0[1], offset); w1[2] = amd_bytealign_S ( 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[3] = amd_bytealign_S (w1[3], w2[0], offset); w3[2] = amd_bytealign_S (w1[2], w1[3], offset); w3[1] = amd_bytealign_S (w1[1], w1[2], offset); w3[0] = amd_bytealign_S (w1[0], w1[1], offset); w2[3] = amd_bytealign_S (w0[3], w1[0], offset); w2[2] = amd_bytealign_S (w0[2], w0[3], offset); w2[1] = amd_bytealign_S (w0[1], w0[2], offset); w2[0] = amd_bytealign_S (w0[0], w0[1], offset); w1[3] = amd_bytealign_S ( 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[3] = amd_bytealign_S (w1[2], w1[3], offset); w3[2] = amd_bytealign_S (w1[1], w1[2], offset); w3[1] = amd_bytealign_S (w1[0], w1[1], offset); w3[0] = amd_bytealign_S (w0[3], w1[0], offset); w2[3] = amd_bytealign_S (w0[2], w0[3], offset); w2[2] = amd_bytealign_S (w0[1], w0[2], offset); w2[1] = amd_bytealign_S (w0[0], w0[1], offset); w2[0] = amd_bytealign_S ( 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[3] = amd_bytealign_S (w1[1], w1[2], offset); w3[2] = amd_bytealign_S (w1[0], w1[1], offset); w3[1] = amd_bytealign_S (w0[3], w1[0], offset); w3[0] = amd_bytealign_S (w0[2], w0[3], offset); w2[3] = amd_bytealign_S (w0[1], w0[2], offset); w2[2] = amd_bytealign_S (w0[0], w0[1], offset); w2[1] = amd_bytealign_S ( 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[3] = amd_bytealign_S (w1[0], w1[1], offset); w3[2] = amd_bytealign_S (w0[3], w1[0], offset); w3[1] = amd_bytealign_S (w0[2], w0[3], offset); w3[0] = amd_bytealign_S (w0[1], w0[2], offset); w2[3] = amd_bytealign_S (w0[0], w0[1], offset); w2[2] = amd_bytealign_S ( 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[3] = amd_bytealign_S (w0[3], w1[0], offset); w3[2] = amd_bytealign_S (w0[2], w0[3], offset); w3[1] = amd_bytealign_S (w0[1], w0[2], offset); w3[0] = amd_bytealign_S (w0[0], w0[1], offset); w2[3] = amd_bytealign_S ( 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[3] = amd_bytealign_S (w0[2], w0[3], offset); w3[2] = amd_bytealign_S (w0[1], w0[2], offset); w3[1] = amd_bytealign_S (w0[0], w0[1], offset); w3[0] = amd_bytealign_S ( 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[3] = amd_bytealign_S (w0[1], w0[2], offset); w3[2] = amd_bytealign_S (w0[0], w0[1], offset); w3[1] = amd_bytealign_S ( 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; case 14: w3[3] = amd_bytealign_S (w0[0], w0[1], offset); w3[2] = amd_bytealign_S ( 0, w0[0], offset); w3[1] = 0; 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; case 15: w3[3] = amd_bytealign_S ( 0, w0[0], offset); w3[2] = 0; w3[1] = 0; 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; } w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); #endif #if (defined IS_AMD && AMD_GCN >= 3) || defined IS_NV #if defined IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; #endif #if defined IS_AMD const int selector = 0x0706050403020100 >> (offset_minus_4 * 8); #endif switch (offset_switch) { case 0: w3[3] = __byte_perm_S (w3[2], w3[3], selector); w3[2] = __byte_perm_S (w3[1], w3[2], selector); w3[1] = __byte_perm_S (w3[0], w3[1], selector); w3[0] = __byte_perm_S (w2[3], w3[0], selector); w2[3] = __byte_perm_S (w2[2], w2[3], selector); w2[2] = __byte_perm_S (w2[1], w2[2], selector); w2[1] = __byte_perm_S (w2[0], w2[1], selector); w2[0] = __byte_perm_S (w1[3], w2[0], selector); w1[3] = __byte_perm_S (w1[2], w1[3], selector); w1[2] = __byte_perm_S (w1[1], w1[2], selector); w1[1] = __byte_perm_S (w1[0], w1[1], selector); w1[0] = __byte_perm_S (w0[3], w1[0], selector); w0[3] = __byte_perm_S (w0[2], w0[3], selector); w0[2] = __byte_perm_S (w0[1], w0[2], selector); w0[1] = __byte_perm_S (w0[0], w0[1], selector); w0[0] = __byte_perm_S ( 0, w0[0], selector); break; case 1: w3[3] = __byte_perm_S (w3[1], w3[2], selector); w3[2] = __byte_perm_S (w3[0], w3[1], selector); w3[1] = __byte_perm_S (w2[3], w3[0], selector); w3[0] = __byte_perm_S (w2[2], w2[3], selector); w2[3] = __byte_perm_S (w2[1], w2[2], selector); w2[2] = __byte_perm_S (w2[0], w2[1], selector); w2[1] = __byte_perm_S (w1[3], w2[0], selector); w2[0] = __byte_perm_S (w1[2], w1[3], selector); w1[3] = __byte_perm_S (w1[1], w1[2], selector); w1[2] = __byte_perm_S (w1[0], w1[1], selector); w1[1] = __byte_perm_S (w0[3], w1[0], selector); w1[0] = __byte_perm_S (w0[2], w0[3], selector); w0[3] = __byte_perm_S (w0[1], w0[2], selector); w0[2] = __byte_perm_S (w0[0], w0[1], selector); w0[1] = __byte_perm_S ( 0, w0[0], selector); w0[0] = 0; break; case 2: w3[3] = __byte_perm_S (w3[0], w3[1], selector); w3[2] = __byte_perm_S (w2[3], w3[0], selector); w3[1] = __byte_perm_S (w2[2], w2[3], selector); w3[0] = __byte_perm_S (w2[1], w2[2], selector); w2[3] = __byte_perm_S (w2[0], w2[1], selector); w2[2] = __byte_perm_S (w1[3], w2[0], selector); w2[1] = __byte_perm_S (w1[2], w1[3], selector); w2[0] = __byte_perm_S (w1[1], w1[2], selector); w1[3] = __byte_perm_S (w1[0], w1[1], selector); w1[2] = __byte_perm_S (w0[3], w1[0], selector); w1[1] = __byte_perm_S (w0[2], w0[3], selector); w1[0] = __byte_perm_S (w0[1], w0[2], selector); w0[3] = __byte_perm_S (w0[0], w0[1], selector); w0[2] = __byte_perm_S ( 0, w0[0], selector); w0[1] = 0; w0[0] = 0; break; case 3: w3[3] = __byte_perm_S (w2[3], w3[0], selector); w3[2] = __byte_perm_S (w2[2], w2[3], selector); w3[1] = __byte_perm_S (w2[1], w2[2], selector); w3[0] = __byte_perm_S (w2[0], w2[1], selector); w2[3] = __byte_perm_S (w1[3], w2[0], selector); w2[2] = __byte_perm_S (w1[2], w1[3], selector); w2[1] = __byte_perm_S (w1[1], w1[2], selector); w2[0] = __byte_perm_S (w1[0], w1[1], selector); w1[3] = __byte_perm_S (w0[3], w1[0], selector); w1[2] = __byte_perm_S (w0[2], w0[3], selector); w1[1] = __byte_perm_S (w0[1], w0[2], selector); w1[0] = __byte_perm_S (w0[0], w0[1], selector); w0[3] = __byte_perm_S ( 0, w0[0], selector); w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 4: w3[3] = __byte_perm_S (w2[2], w2[3], selector); w3[2] = __byte_perm_S (w2[1], w2[2], selector); w3[1] = __byte_perm_S (w2[0], w2[1], selector); w3[0] = __byte_perm_S (w1[3], w2[0], selector); w2[3] = __byte_perm_S (w1[2], w1[3], selector); w2[2] = __byte_perm_S (w1[1], w1[2], selector); w2[1] = __byte_perm_S (w1[0], w1[1], selector); w2[0] = __byte_perm_S (w0[3], w1[0], selector); w1[3] = __byte_perm_S (w0[2], w0[3], selector); w1[2] = __byte_perm_S (w0[1], w0[2], selector); w1[1] = __byte_perm_S (w0[0], w0[1], selector); w1[0] = __byte_perm_S ( 0, w0[0], selector); w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 5: w3[3] = __byte_perm_S (w2[1], w2[2], selector); w3[2] = __byte_perm_S (w2[0], w2[1], selector); w3[1] = __byte_perm_S (w1[3], w2[0], selector); w3[0] = __byte_perm_S (w1[2], w1[3], selector); w2[3] = __byte_perm_S (w1[1], w1[2], selector); w2[2] = __byte_perm_S (w1[0], w1[1], selector); w2[1] = __byte_perm_S (w0[3], w1[0], selector); w2[0] = __byte_perm_S (w0[2], w0[3], selector); w1[3] = __byte_perm_S (w0[1], w0[2], selector); w1[2] = __byte_perm_S (w0[0], w0[1], selector); w1[1] = __byte_perm_S ( 0, w0[0], selector); w1[0] = 0; w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 6: w3[3] = __byte_perm_S (w2[0], w2[1], selector); w3[2] = __byte_perm_S (w1[3], w2[0], selector); w3[1] = __byte_perm_S (w1[2], w1[3], selector); w3[0] = __byte_perm_S (w1[1], w1[2], selector); w2[3] = __byte_perm_S (w1[0], w1[1], selector); w2[2] = __byte_perm_S (w0[3], w1[0], selector); w2[1] = __byte_perm_S (w0[2], w0[3], selector); w2[0] = __byte_perm_S (w0[1], w0[2], selector); w1[3] = __byte_perm_S (w0[0], w0[1], selector); w1[2] = __byte_perm_S ( 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[3] = __byte_perm_S (w1[3], w2[0], selector); w3[2] = __byte_perm_S (w1[2], w1[3], selector); w3[1] = __byte_perm_S (w1[1], w1[2], selector); w3[0] = __byte_perm_S (w1[0], w1[1], selector); w2[3] = __byte_perm_S (w0[3], w1[0], selector); w2[2] = __byte_perm_S (w0[2], w0[3], selector); w2[1] = __byte_perm_S (w0[1], w0[2], selector); w2[0] = __byte_perm_S (w0[0], w0[1], selector); w1[3] = __byte_perm_S ( 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[3] = __byte_perm_S (w1[2], w1[3], selector); w3[2] = __byte_perm_S (w1[1], w1[2], selector); w3[1] = __byte_perm_S (w1[0], w1[1], selector); w3[0] = __byte_perm_S (w0[3], w1[0], selector); w2[3] = __byte_perm_S (w0[2], w0[3], selector); w2[2] = __byte_perm_S (w0[1], w0[2], selector); w2[1] = __byte_perm_S (w0[0], w0[1], selector); w2[0] = __byte_perm_S ( 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[3] = __byte_perm_S (w1[1], w1[2], selector); w3[2] = __byte_perm_S (w1[0], w1[1], selector); w3[1] = __byte_perm_S (w0[3], w1[0], selector); w3[0] = __byte_perm_S (w0[2], w0[3], selector); w2[3] = __byte_perm_S (w0[1], w0[2], selector); w2[2] = __byte_perm_S (w0[0], w0[1], selector); w2[1] = __byte_perm_S ( 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[3] = __byte_perm_S (w1[0], w1[1], selector); w3[2] = __byte_perm_S (w0[3], w1[0], selector); w3[1] = __byte_perm_S (w0[2], w0[3], selector); w3[0] = __byte_perm_S (w0[1], w0[2], selector); w2[3] = __byte_perm_S (w0[0], w0[1], selector); w2[2] = __byte_perm_S ( 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[3] = __byte_perm_S (w0[3], w1[0], selector); w3[2] = __byte_perm_S (w0[2], w0[3], selector); w3[1] = __byte_perm_S (w0[1], w0[2], selector); w3[0] = __byte_perm_S (w0[0], w0[1], selector); w2[3] = __byte_perm_S ( 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[3] = __byte_perm_S (w0[2], w0[3], selector); w3[2] = __byte_perm_S (w0[1], w0[2], selector); w3[1] = __byte_perm_S (w0[0], w0[1], selector); w3[0] = __byte_perm_S ( 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[3] = __byte_perm_S (w0[1], w0[2], selector); w3[2] = __byte_perm_S (w0[0], w0[1], selector); w3[1] = __byte_perm_S ( 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; case 14: w3[3] = __byte_perm_S (w0[0], w0[1], selector); w3[2] = __byte_perm_S ( 0, w0[0], selector); w3[1] = 0; 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; case 15: w3[3] = __byte_perm_S ( 0, w0[0], selector); w3[2] = 0; w3[1] = 0; 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 } void switch_buffer_by_offset_carry_le_S (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 c0[4], u32 c1[4], u32 c2[4], u32 c3[4], const u32 offset) { const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if defined IS_AMD || defined IS_GENERIC w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); switch (offset_switch) { case 0: c0[0] = amd_bytealign_S (w3[3], 0, offset); w3[3] = amd_bytealign_S (w3[2], w3[3], offset); w3[2] = amd_bytealign_S (w3[1], w3[2], offset); w3[1] = amd_bytealign_S (w3[0], w3[1], offset); w3[0] = amd_bytealign_S (w2[3], w3[0], offset); w2[3] = amd_bytealign_S (w2[2], w2[3], offset); w2[2] = amd_bytealign_S (w2[1], w2[2], offset); w2[1] = amd_bytealign_S (w2[0], w2[1], offset); w2[0] = amd_bytealign_S (w1[3], w2[0], offset); w1[3] = amd_bytealign_S (w1[2], w1[3], offset); w1[2] = amd_bytealign_S (w1[1], w1[2], offset); w1[1] = amd_bytealign_S (w1[0], w1[1], offset); w1[0] = amd_bytealign_S (w0[3], w1[0], offset); w0[3] = amd_bytealign_S (w0[2], w0[3], offset); w0[2] = amd_bytealign_S (w0[1], w0[2], offset); w0[1] = amd_bytealign_S (w0[0], w0[1], offset); w0[0] = amd_bytealign_S ( 0, w0[0], offset); break; case 1: c0[1] = amd_bytealign_S (w3[3], 0, offset); c0[0] = amd_bytealign_S (w3[2], w3[3], offset); w3[3] = amd_bytealign_S (w3[1], w3[2], offset); w3[2] = amd_bytealign_S (w3[0], w3[1], offset); w3[1] = amd_bytealign_S (w2[3], w3[0], offset); w3[0] = amd_bytealign_S (w2[2], w2[3], offset); w2[3] = amd_bytealign_S (w2[1], w2[2], offset); w2[2] = amd_bytealign_S (w2[0], w2[1], offset); w2[1] = amd_bytealign_S (w1[3], w2[0], offset); w2[0] = amd_bytealign_S (w1[2], w1[3], offset); w1[3] = amd_bytealign_S (w1[1], w1[2], offset); w1[2] = amd_bytealign_S (w1[0], w1[1], offset); w1[1] = amd_bytealign_S (w0[3], w1[0], offset); w1[0] = amd_bytealign_S (w0[2], w0[3], offset); w0[3] = amd_bytealign_S (w0[1], w0[2], offset); w0[2] = amd_bytealign_S (w0[0], w0[1], offset); w0[1] = amd_bytealign_S ( 0, w0[0], offset); w0[0] = 0; break; case 2: c0[2] = amd_bytealign_S (w3[3], 0, offset); c0[1] = amd_bytealign_S (w3[2], w3[3], offset); c0[0] = amd_bytealign_S (w3[1], w3[2], offset); w3[3] = amd_bytealign_S (w3[0], w3[1], offset); w3[2] = amd_bytealign_S (w2[3], w3[0], offset); w3[1] = amd_bytealign_S (w2[2], w2[3], offset); w3[0] = amd_bytealign_S (w2[1], w2[2], offset); w2[3] = amd_bytealign_S (w2[0], w2[1], offset); w2[2] = amd_bytealign_S (w1[3], w2[0], offset); w2[1] = amd_bytealign_S (w1[2], w1[3], offset); w2[0] = amd_bytealign_S (w1[1], w1[2], offset); w1[3] = amd_bytealign_S (w1[0], w1[1], offset); w1[2] = amd_bytealign_S (w0[3], w1[0], offset); w1[1] = amd_bytealign_S (w0[2], w0[3], offset); w1[0] = amd_bytealign_S (w0[1], w0[2], offset); w0[3] = amd_bytealign_S (w0[0], w0[1], offset); w0[2] = amd_bytealign_S ( 0, w0[0], offset); w0[1] = 0; w0[0] = 0; break; case 3: c0[3] = amd_bytealign_S (w3[3], 0, offset); c0[2] = amd_bytealign_S (w3[2], w3[3], offset); c0[1] = amd_bytealign_S (w3[1], w3[2], offset); c0[0] = amd_bytealign_S (w3[0], w3[1], offset); w3[3] = amd_bytealign_S (w2[3], w3[0], offset); w3[2] = amd_bytealign_S (w2[2], w2[3], offset); w3[1] = amd_bytealign_S (w2[1], w2[2], offset); w3[0] = amd_bytealign_S (w2[0], w2[1], offset); w2[3] = amd_bytealign_S (w1[3], w2[0], offset); w2[2] = amd_bytealign_S (w1[2], w1[3], offset); w2[1] = amd_bytealign_S (w1[1], w1[2], offset); w2[0] = amd_bytealign_S (w1[0], w1[1], offset); w1[3] = amd_bytealign_S (w0[3], w1[0], offset); w1[2] = amd_bytealign_S (w0[2], w0[3], offset); w1[1] = amd_bytealign_S (w0[1], w0[2], offset); w1[0] = amd_bytealign_S (w0[0], w0[1], offset); w0[3] = amd_bytealign_S ( 0, w0[0], offset); w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 4: c1[0] = amd_bytealign_S (w3[3], 0, offset); c0[3] = amd_bytealign_S (w3[2], w3[3], offset); c0[2] = amd_bytealign_S (w3[1], w3[2], offset); c0[1] = amd_bytealign_S (w3[0], w3[1], offset); c0[0] = amd_bytealign_S (w2[3], w3[0], offset); w3[3] = amd_bytealign_S (w2[2], w2[3], offset); w3[2] = amd_bytealign_S (w2[1], w2[2], offset); w3[1] = amd_bytealign_S (w2[0], w2[1], offset); w3[0] = amd_bytealign_S (w1[3], w2[0], offset); w2[3] = amd_bytealign_S (w1[2], w1[3], offset); w2[2] = amd_bytealign_S (w1[1], w1[2], offset); w2[1] = amd_bytealign_S (w1[0], w1[1], offset); w2[0] = amd_bytealign_S (w0[3], w1[0], offset); w1[3] = amd_bytealign_S (w0[2], w0[3], offset); w1[2] = amd_bytealign_S (w0[1], w0[2], offset); w1[1] = amd_bytealign_S (w0[0], w0[1], offset); w1[0] = amd_bytealign_S ( 0, w0[0], offset); w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 5: c1[1] = amd_bytealign_S (w3[3], 0, offset); c1[0] = amd_bytealign_S (w3[2], w3[3], offset); c0[3] = amd_bytealign_S (w3[1], w3[2], offset); c0[2] = amd_bytealign_S (w3[0], w3[1], offset); c0[1] = amd_bytealign_S (w2[3], w3[0], offset); c0[0] = amd_bytealign_S (w2[2], w2[3], offset); w3[3] = amd_bytealign_S (w2[1], w2[2], offset); w3[2] = amd_bytealign_S (w2[0], w2[1], offset); w3[1] = amd_bytealign_S (w1[3], w2[0], offset); w3[0] = amd_bytealign_S (w1[2], w1[3], offset); w2[3] = amd_bytealign_S (w1[1], w1[2], offset); w2[2] = amd_bytealign_S (w1[0], w1[1], offset); w2[1] = amd_bytealign_S (w0[3], w1[0], offset); w2[0] = amd_bytealign_S (w0[2], w0[3], offset); w1[3] = amd_bytealign_S (w0[1], w0[2], offset); w1[2] = amd_bytealign_S (w0[0], w0[1], offset); w1[1] = amd_bytealign_S ( 0, w0[0], offset); w1[0] = 0; w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 6: c1[2] = amd_bytealign_S (w3[3], 0, offset); c1[1] = amd_bytealign_S (w3[2], w3[3], offset); c1[0] = amd_bytealign_S (w3[1], w3[2], offset); c0[3] = amd_bytealign_S (w3[0], w3[1], offset); c0[2] = amd_bytealign_S (w2[3], w3[0], offset); c0[1] = amd_bytealign_S (w2[2], w2[3], offset); c0[0] = amd_bytealign_S (w2[1], w2[2], offset); w3[3] = amd_bytealign_S (w2[0], w2[1], offset); w3[2] = amd_bytealign_S (w1[3], w2[0], offset); w3[1] = amd_bytealign_S (w1[2], w1[3], offset); w3[0] = amd_bytealign_S (w1[1], w1[2], offset); w2[3] = amd_bytealign_S (w1[0], w1[1], offset); w2[2] = amd_bytealign_S (w0[3], w1[0], offset); w2[1] = amd_bytealign_S (w0[2], w0[3], offset); w2[0] = amd_bytealign_S (w0[1], w0[2], offset); w1[3] = amd_bytealign_S (w0[0], w0[1], offset); w1[2] = amd_bytealign_S ( 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: c1[3] = amd_bytealign_S (w3[3], 0, offset); c1[2] = amd_bytealign_S (w3[2], w3[3], offset); c1[1] = amd_bytealign_S (w3[1], w3[2], offset); c1[0] = amd_bytealign_S (w3[0], w3[1], offset); c0[3] = amd_bytealign_S (w2[3], w3[0], offset); c0[2] = amd_bytealign_S (w2[2], w2[3], offset); c0[1] = amd_bytealign_S (w2[1], w2[2], offset); c0[0] = amd_bytealign_S (w2[0], w2[1], offset); w3[3] = amd_bytealign_S (w1[3], w2[0], offset); w3[2] = amd_bytealign_S (w1[2], w1[3], offset); w3[1] = amd_bytealign_S (w1[1], w1[2], offset); w3[0] = amd_bytealign_S (w1[0], w1[1], offset); w2[3] = amd_bytealign_S (w0[3], w1[0], offset); w2[2] = amd_bytealign_S (w0[2], w0[3], offset); w2[1] = amd_bytealign_S (w0[1], w0[2], offset); w2[0] = amd_bytealign_S (w0[0], w0[1], offset); w1[3] = amd_bytealign_S ( 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: c2[0] = amd_bytealign_S (w3[3], 0, offset); c1[3] = amd_bytealign_S (w3[2], w3[3], offset); c1[2] = amd_bytealign_S (w3[1], w3[2], offset); c1[1] = amd_bytealign_S (w3[0], w3[1], offset); c1[0] = amd_bytealign_S (w2[3], w3[0], offset); c0[3] = amd_bytealign_S (w2[2], w2[3], offset); c0[2] = amd_bytealign_S (w2[1], w2[2], offset); c0[1] = amd_bytealign_S (w2[0], w2[1], offset); c0[0] = amd_bytealign_S (w1[3], w2[0], offset); w3[3] = amd_bytealign_S (w1[2], w1[3], offset); w3[2] = amd_bytealign_S (w1[1], w1[2], offset); w3[1] = amd_bytealign_S (w1[0], w1[1], offset); w3[0] = amd_bytealign_S (w0[3], w1[0], offset); w2[3] = amd_bytealign_S (w0[2], w0[3], offset); w2[2] = amd_bytealign_S (w0[1], w0[2], offset); w2[1] = amd_bytealign_S (w0[0], w0[1], offset); w2[0] = amd_bytealign_S ( 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: c2[1] = amd_bytealign_S (w3[3], 0, offset); c2[0] = amd_bytealign_S (w3[2], w3[3], offset); c1[3] = amd_bytealign_S (w3[1], w3[2], offset); c1[2] = amd_bytealign_S (w3[0], w3[1], offset); c1[1] = amd_bytealign_S (w2[3], w3[0], offset); c1[0] = amd_bytealign_S (w2[2], w2[3], offset); c0[3] = amd_bytealign_S (w2[1], w2[2], offset); c0[2] = amd_bytealign_S (w2[0], w2[1], offset); c0[1] = amd_bytealign_S (w1[3], w2[0], offset); c0[0] = amd_bytealign_S (w1[2], w1[3], offset); w3[3] = amd_bytealign_S (w1[1], w1[2], offset); w3[2] = amd_bytealign_S (w1[0], w1[1], offset); w3[1] = amd_bytealign_S (w0[3], w1[0], offset); w3[0] = amd_bytealign_S (w0[2], w0[3], offset); w2[3] = amd_bytealign_S (w0[1], w0[2], offset); w2[2] = amd_bytealign_S (w0[0], w0[1], offset); w2[1] = amd_bytealign_S ( 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: c2[2] = amd_bytealign_S (w3[3], 0, offset); c2[1] = amd_bytealign_S (w3[2], w3[3], offset); c2[0] = amd_bytealign_S (w3[1], w3[2], offset); c1[3] = amd_bytealign_S (w3[0], w3[1], offset); c1[2] = amd_bytealign_S (w2[3], w3[0], offset); c1[1] = amd_bytealign_S (w2[2], w2[3], offset); c1[0] = amd_bytealign_S (w2[1], w2[2], offset); c0[3] = amd_bytealign_S (w2[0], w2[1], offset); c0[2] = amd_bytealign_S (w1[3], w2[0], offset); c0[1] = amd_bytealign_S (w1[2], w1[3], offset); c0[0] = amd_bytealign_S (w1[1], w1[2], offset); w3[3] = amd_bytealign_S (w1[0], w1[1], offset); w3[2] = amd_bytealign_S (w0[3], w1[0], offset); w3[1] = amd_bytealign_S (w0[2], w0[3], offset); w3[0] = amd_bytealign_S (w0[1], w0[2], offset); w2[3] = amd_bytealign_S (w0[0], w0[1], offset); w2[2] = amd_bytealign_S ( 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: c2[3] = amd_bytealign_S (w3[3], 0, offset); c2[2] = amd_bytealign_S (w3[2], w3[3], offset); c2[1] = amd_bytealign_S (w3[1], w3[2], offset); c2[0] = amd_bytealign_S (w3[0], w3[1], offset); c1[3] = amd_bytealign_S (w2[3], w3[0], offset); c1[2] = amd_bytealign_S (w2[2], w2[3], offset); c1[1] = amd_bytealign_S (w2[1], w2[2], offset); c1[0] = amd_bytealign_S (w2[0], w2[1], offset); c0[3] = amd_bytealign_S (w1[3], w2[0], offset); c0[2] = amd_bytealign_S (w1[2], w1[3], offset); c0[1] = amd_bytealign_S (w1[1], w1[2], offset); c0[0] = amd_bytealign_S (w1[0], w1[1], offset); w3[3] = amd_bytealign_S (w0[3], w1[0], offset); w3[2] = amd_bytealign_S (w0[2], w0[3], offset); w3[1] = amd_bytealign_S (w0[1], w0[2], offset); w3[0] = amd_bytealign_S (w0[0], w0[1], offset); w2[3] = amd_bytealign_S ( 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: c3[0] = amd_bytealign_S (w3[3], 0, offset); c2[3] = amd_bytealign_S (w3[2], w3[3], offset); c2[2] = amd_bytealign_S (w3[1], w3[2], offset); c2[1] = amd_bytealign_S (w3[0], w3[1], offset); c2[0] = amd_bytealign_S (w2[3], w3[0], offset); c1[3] = amd_bytealign_S (w2[2], w2[3], offset); c1[2] = amd_bytealign_S (w2[1], w2[2], offset); c1[1] = amd_bytealign_S (w2[0], w2[1], offset); c1[0] = amd_bytealign_S (w1[3], w2[0], offset); c0[3] = amd_bytealign_S (w1[2], w1[3], offset); c0[2] = amd_bytealign_S (w1[1], w1[2], offset); c0[1] = amd_bytealign_S (w1[0], w1[1], offset); c0[0] = amd_bytealign_S (w0[3], w1[0], offset); w3[3] = amd_bytealign_S (w0[2], w0[3], offset); w3[2] = amd_bytealign_S (w0[1], w0[2], offset); w3[1] = amd_bytealign_S (w0[0], w0[1], offset); w3[0] = amd_bytealign_S ( 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: c3[1] = amd_bytealign_S (w3[3], 0, offset); c3[0] = amd_bytealign_S (w3[2], w3[3], offset); c2[3] = amd_bytealign_S (w3[1], w3[2], offset); c2[2] = amd_bytealign_S (w3[0], w3[1], offset); c2[1] = amd_bytealign_S (w2[3], w3[0], offset); c2[0] = amd_bytealign_S (w2[2], w2[3], offset); c1[3] = amd_bytealign_S (w2[1], w2[2], offset); c1[2] = amd_bytealign_S (w2[0], w2[1], offset); c1[1] = amd_bytealign_S (w1[3], w2[0], offset); c1[0] = amd_bytealign_S (w1[2], w1[3], offset); c0[3] = amd_bytealign_S (w1[1], w1[2], offset); c0[2] = amd_bytealign_S (w1[0], w1[1], offset); c0[1] = amd_bytealign_S (w0[3], w1[0], offset); c0[0] = amd_bytealign_S (w0[2], w0[3], offset); w3[3] = amd_bytealign_S (w0[1], w0[2], offset); w3[2] = amd_bytealign_S (w0[0], w0[1], offset); w3[1] = amd_bytealign_S ( 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; case 14: c3[2] = amd_bytealign_S (w3[3], 0, offset); c3[1] = amd_bytealign_S (w3[2], w3[3], offset); c3[0] = amd_bytealign_S (w3[1], w3[2], offset); c2[3] = amd_bytealign_S (w3[0], w3[1], offset); c2[2] = amd_bytealign_S (w2[3], w3[0], offset); c2[1] = amd_bytealign_S (w2[2], w2[3], offset); c2[0] = amd_bytealign_S (w2[1], w2[2], offset); c1[3] = amd_bytealign_S (w2[0], w2[1], offset); c1[2] = amd_bytealign_S (w1[3], w2[0], offset); c1[1] = amd_bytealign_S (w1[2], w1[3], offset); c1[0] = amd_bytealign_S (w1[1], w1[2], offset); c0[3] = amd_bytealign_S (w1[0], w1[1], offset); c0[2] = amd_bytealign_S (w0[3], w1[0], offset); c0[1] = amd_bytealign_S (w0[2], w0[3], offset); c0[0] = amd_bytealign_S (w0[1], w0[2], offset); w3[3] = amd_bytealign_S (w0[0], w0[1], offset); w3[2] = amd_bytealign_S ( 0, w0[0], offset); w3[1] = 0; 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; case 15: c3[3] = amd_bytealign_S (w3[3], 0, offset); c3[2] = amd_bytealign_S (w3[2], w3[3], offset); c3[1] = amd_bytealign_S (w3[1], w3[2], offset); c3[0] = amd_bytealign_S (w3[0], w3[1], offset); c2[3] = amd_bytealign_S (w2[3], w3[0], offset); c2[2] = amd_bytealign_S (w2[2], w2[3], offset); c2[1] = amd_bytealign_S (w2[1], w2[2], offset); c2[0] = amd_bytealign_S (w2[0], w2[1], offset); c1[3] = amd_bytealign_S (w1[3], w2[0], offset); c1[2] = amd_bytealign_S (w1[2], w1[3], offset); c1[1] = amd_bytealign_S (w1[1], w1[2], offset); c1[0] = amd_bytealign_S (w1[0], w1[1], offset); c0[3] = amd_bytealign_S (w0[3], w1[0], offset); c0[2] = amd_bytealign_S (w0[2], w0[3], offset); c0[1] = amd_bytealign_S (w0[1], w0[2], offset); c0[0] = amd_bytealign_S (w0[0], w0[1], offset); w3[3] = amd_bytealign_S ( 0, w0[0], offset); w3[2] = 0; w3[1] = 0; 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; } w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); c0[0] = swap32_S (c0[0]); c0[1] = swap32_S (c0[1]); c0[2] = swap32_S (c0[2]); c0[3] = swap32_S (c0[3]); c1[0] = swap32_S (c1[0]); c1[1] = swap32_S (c1[1]); c1[2] = swap32_S (c1[2]); c1[3] = swap32_S (c1[3]); c2[0] = swap32_S (c2[0]); c2[1] = swap32_S (c2[1]); c2[2] = swap32_S (c2[2]); c2[3] = swap32_S (c2[3]); c3[0] = swap32_S (c3[0]); c3[1] = swap32_S (c3[1]); c3[2] = swap32_S (c3[2]); c3[3] = swap32_S (c3[3]); #endif #ifdef IS_NV // todo switch (offset_switch) { case 0: c0[0] = amd_bytealign_S ( 0, w3[3], offset_minus_4); w3[3] = amd_bytealign_S (w3[3], w3[2], offset_minus_4); w3[2] = amd_bytealign_S (w3[2], w3[1], offset_minus_4); w3[1] = amd_bytealign_S (w3[1], w3[0], offset_minus_4); w3[0] = amd_bytealign_S (w3[0], w2[3], offset_minus_4); w2[3] = amd_bytealign_S (w2[3], w2[2], offset_minus_4); w2[2] = amd_bytealign_S (w2[2], w2[1], offset_minus_4); w2[1] = amd_bytealign_S (w2[1], w2[0], offset_minus_4); w2[0] = amd_bytealign_S (w2[0], w1[3], offset_minus_4); w1[3] = amd_bytealign_S (w1[3], w1[2], offset_minus_4); w1[2] = amd_bytealign_S (w1[2], w1[1], offset_minus_4); w1[1] = amd_bytealign_S (w1[1], w1[0], offset_minus_4); w1[0] = amd_bytealign_S (w1[0], w0[3], offset_minus_4); w0[3] = amd_bytealign_S (w0[3], w0[2], offset_minus_4); w0[2] = amd_bytealign_S (w0[2], w0[1], offset_minus_4); w0[1] = amd_bytealign_S (w0[1], w0[0], offset_minus_4); w0[0] = amd_bytealign_S (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] = w3[3]; w3[3] = c0[0]; c0[0] = 0; } break; case 1: c0[1] = amd_bytealign_S ( 0, w3[3], offset_minus_4); c0[0] = amd_bytealign_S (w3[3], w3[2], offset_minus_4); w3[3] = amd_bytealign_S (w3[2], w3[1], offset_minus_4); w3[2] = amd_bytealign_S (w3[1], w3[0], offset_minus_4); w3[1] = amd_bytealign_S (w3[0], w2[3], offset_minus_4); w3[0] = amd_bytealign_S (w2[3], w2[2], offset_minus_4); w2[3] = amd_bytealign_S (w2[2], w2[1], offset_minus_4); w2[2] = amd_bytealign_S (w2[1], w2[0], offset_minus_4); w2[1] = amd_bytealign_S (w2[0], w1[3], offset_minus_4); w2[0] = amd_bytealign_S (w1[3], w1[2], offset_minus_4); w1[3] = amd_bytealign_S (w1[2], w1[1], offset_minus_4); w1[2] = amd_bytealign_S (w1[1], w1[0], offset_minus_4); w1[1] = amd_bytealign_S (w1[0], w0[3], offset_minus_4); w1[0] = amd_bytealign_S (w0[3], w0[2], offset_minus_4); w0[3] = amd_bytealign_S (w0[2], w0[1], offset_minus_4); w0[2] = amd_bytealign_S (w0[1], w0[0], offset_minus_4); w0[1] = amd_bytealign_S (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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = 0; } break; case 2: c0[2] = amd_bytealign_S ( 0, w3[3], offset_minus_4); c0[1] = amd_bytealign_S (w3[3], w3[2], offset_minus_4); c0[0] = amd_bytealign_S (w3[2], w3[1], offset_minus_4); w3[3] = amd_bytealign_S (w3[1], w3[0], offset_minus_4); w3[2] = amd_bytealign_S (w3[0], w2[3], offset_minus_4); w3[1] = amd_bytealign_S (w2[3], w2[2], offset_minus_4); w3[0] = amd_bytealign_S (w2[2], w2[1], offset_minus_4); w2[3] = amd_bytealign_S (w2[1], w2[0], offset_minus_4); w2[2] = amd_bytealign_S (w2[0], w1[3], offset_minus_4); w2[1] = amd_bytealign_S (w1[3], w1[2], offset_minus_4); w2[0] = amd_bytealign_S (w1[2], w1[1], offset_minus_4); w1[3] = amd_bytealign_S (w1[1], w1[0], offset_minus_4); w1[2] = amd_bytealign_S (w1[0], w0[3], offset_minus_4); w1[1] = amd_bytealign_S (w0[3], w0[2], offset_minus_4); w1[0] = amd_bytealign_S (w0[2], w0[1], offset_minus_4); w0[3] = amd_bytealign_S (w0[1], w0[0], offset_minus_4); w0[2] = amd_bytealign_S (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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = 0; } break; case 3: c0[3] = amd_bytealign_S ( 0, w3[3], offset_minus_4); c0[2] = amd_bytealign_S (w3[3], w3[2], offset_minus_4); c0[1] = amd_bytealign_S (w3[2], w3[1], offset_minus_4); c0[0] = amd_bytealign_S (w3[1], w3[0], offset_minus_4); w3[3] = amd_bytealign_S (w3[0], w2[3], offset_minus_4); w3[2] = amd_bytealign_S (w2[3], w2[2], offset_minus_4); w3[1] = amd_bytealign_S (w2[2], w2[1], offset_minus_4); w3[0] = amd_bytealign_S (w2[1], w2[0], offset_minus_4); w2[3] = amd_bytealign_S (w2[0], w1[3], offset_minus_4); w2[2] = amd_bytealign_S (w1[3], w1[2], offset_minus_4); w2[1] = amd_bytealign_S (w1[2], w1[1], offset_minus_4); w2[0] = amd_bytealign_S (w1[1], w1[0], offset_minus_4); w1[3] = amd_bytealign_S (w1[0], w0[3], offset_minus_4); w1[2] = amd_bytealign_S (w0[3], w0[2], offset_minus_4); w1[1] = amd_bytealign_S (w0[2], w0[1], offset_minus_4); w1[0] = amd_bytealign_S (w0[1], w0[0], offset_minus_4); w0[3] = amd_bytealign_S (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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = 0; } break; case 4: c1[0] = amd_bytealign_S ( 0, w3[3], offset_minus_4); c0[3] = amd_bytealign_S (w3[3], w3[2], offset_minus_4); c0[2] = amd_bytealign_S (w3[2], w3[1], offset_minus_4); c0[1] = amd_bytealign_S (w3[1], w3[0], offset_minus_4); c0[0] = amd_bytealign_S (w3[0], w2[3], offset_minus_4); w3[3] = amd_bytealign_S (w2[3], w2[2], offset_minus_4); w3[2] = amd_bytealign_S (w2[2], w2[1], offset_minus_4); w3[1] = amd_bytealign_S (w2[1], w2[0], offset_minus_4); w3[0] = amd_bytealign_S (w2[0], w1[3], offset_minus_4); w2[3] = amd_bytealign_S (w1[3], w1[2], offset_minus_4); w2[2] = amd_bytealign_S (w1[2], w1[1], offset_minus_4); w2[1] = amd_bytealign_S (w1[1], w1[0], offset_minus_4); w2[0] = amd_bytealign_S (w1[0], w0[3], offset_minus_4); w1[3] = amd_bytealign_S (w0[3], w0[2], offset_minus_4); w1[2] = amd_bytealign_S (w0[2], w0[1], offset_minus_4); w1[1] = amd_bytealign_S (w0[1], w0[0], offset_minus_4); w1[0] = amd_bytealign_S (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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = 0; } break; case 5: c1[1] = amd_bytealign_S ( 0, w3[3], offset_minus_4); c1[0] = amd_bytealign_S (w3[3], w3[2], offset_minus_4); c0[3] = amd_bytealign_S (w3[2], w3[1], offset_minus_4); c0[2] = amd_bytealign_S (w3[1], w3[0], offset_minus_4); c0[1] = amd_bytealign_S (w3[0], w2[3], offset_minus_4); c0[0] = amd_bytealign_S (w2[3], w2[2], offset_minus_4); w3[3] = amd_bytealign_S (w2[2], w2[1], offset_minus_4); w3[2] = amd_bytealign_S (w2[1], w2[0], offset_minus_4); w3[1] = amd_bytealign_S (w2[0], w1[3], offset_minus_4); w3[0] = amd_bytealign_S (w1[3], w1[2], offset_minus_4); w2[3] = amd_bytealign_S (w1[2], w1[1], offset_minus_4); w2[2] = amd_bytealign_S (w1[1], w1[0], offset_minus_4); w2[1] = amd_bytealign_S (w1[0], w0[3], offset_minus_4); w2[0] = amd_bytealign_S (w0[3], w0[2], offset_minus_4); w1[3] = amd_bytealign_S (w0[2], w0[1], offset_minus_4); w1[2] = amd_bytealign_S (w0[1], w0[0], offset_minus_4); w1[1] = amd_bytealign_S (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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = 0; } break; case 6: c1[2] = amd_bytealign_S ( 0, w3[3], offset_minus_4); c1[1] = amd_bytealign_S (w3[3], w3[2], offset_minus_4); c1[0] = amd_bytealign_S (w3[2], w3[1], offset_minus_4); c0[3] = amd_bytealign_S (w3[1], w3[0], offset_minus_4); c0[2] = amd_bytealign_S (w3[0], w2[3], offset_minus_4); c0[1] = amd_bytealign_S (w2[3], w2[2], offset_minus_4); c0[0] = amd_bytealign_S (w2[2], w2[1], offset_minus_4); w3[3] = amd_bytealign_S (w2[1], w2[0], offset_minus_4); w3[2] = amd_bytealign_S (w2[0], w1[3], offset_minus_4); w3[1] = amd_bytealign_S (w1[3], w1[2], offset_minus_4); w3[0] = amd_bytealign_S (w1[2], w1[1], offset_minus_4); w2[3] = amd_bytealign_S (w1[1], w1[0], offset_minus_4); w2[2] = amd_bytealign_S (w1[0], w0[3], offset_minus_4); w2[1] = amd_bytealign_S (w0[3], w0[2], offset_minus_4); w2[0] = amd_bytealign_S (w0[2], w0[1], offset_minus_4); w1[3] = amd_bytealign_S (w0[1], w0[0], offset_minus_4); w1[2] = amd_bytealign_S (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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = 0; } break; case 7: c1[3] = amd_bytealign_S ( 0, w3[3], offset_minus_4); c1[2] = amd_bytealign_S (w3[3], w3[2], offset_minus_4); c1[1] = amd_bytealign_S (w3[2], w3[1], offset_minus_4); c1[0] = amd_bytealign_S (w3[1], w3[0], offset_minus_4); c0[3] = amd_bytealign_S (w3[0], w2[3], offset_minus_4); c0[2] = amd_bytealign_S (w2[3], w2[2], offset_minus_4); c0[1] = amd_bytealign_S (w2[2], w2[1], offset_minus_4); c0[0] = amd_bytealign_S (w2[1], w2[0], offset_minus_4); w3[3] = amd_bytealign_S (w2[0], w1[3], offset_minus_4); w3[2] = amd_bytealign_S (w1[3], w1[2], offset_minus_4); w3[1] = amd_bytealign_S (w1[2], w1[1], offset_minus_4); w3[0] = amd_bytealign_S (w1[1], w1[0], offset_minus_4); w2[3] = amd_bytealign_S (w1[0], w0[3], offset_minus_4); w2[2] = amd_bytealign_S (w0[3], w0[2], offset_minus_4); w2[1] = amd_bytealign_S (w0[2], w0[1], offset_minus_4); w2[0] = amd_bytealign_S (w0[1], w0[0], offset_minus_4); w1[3] = amd_bytealign_S (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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = 0; } break; case 8: c2[0] = amd_bytealign_S ( 0, w3[3], offset_minus_4); c1[3] = amd_bytealign_S (w3[3], w3[2], offset_minus_4); c1[2] = amd_bytealign_S (w3[2], w3[1], offset_minus_4); c1[1] = amd_bytealign_S (w3[1], w3[0], offset_minus_4); c1[0] = amd_bytealign_S (w3[0], w2[3], offset_minus_4); c0[3] = amd_bytealign_S (w2[3], w2[2], offset_minus_4); c0[2] = amd_bytealign_S (w2[2], w2[1], offset_minus_4); c0[1] = amd_bytealign_S (w2[1], w2[0], offset_minus_4); c0[0] = amd_bytealign_S (w2[0], w1[3], offset_minus_4); w3[3] = amd_bytealign_S (w1[3], w1[2], offset_minus_4); w3[2] = amd_bytealign_S (w1[2], w1[1], offset_minus_4); w3[1] = amd_bytealign_S (w1[1], w1[0], offset_minus_4); w3[0] = amd_bytealign_S (w1[0], w0[3], offset_minus_4); w2[3] = amd_bytealign_S (w0[3], w0[2], offset_minus_4); w2[2] = amd_bytealign_S (w0[2], w0[1], offset_minus_4); w2[1] = amd_bytealign_S (w0[1], w0[0], offset_minus_4); w2[0] = amd_bytealign_S (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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = c2[0]; c2[0] = 0; } break; case 9: c2[1] = amd_bytealign_S ( 0, w3[3], offset_minus_4); c2[0] = amd_bytealign_S (w3[3], w3[2], offset_minus_4); c1[3] = amd_bytealign_S (w3[2], w3[1], offset_minus_4); c1[2] = amd_bytealign_S (w3[1], w3[0], offset_minus_4); c1[1] = amd_bytealign_S (w3[0], w2[3], offset_minus_4); c1[0] = amd_bytealign_S (w2[3], w2[2], offset_minus_4); c0[3] = amd_bytealign_S (w2[2], w2[1], offset_minus_4); c0[2] = amd_bytealign_S (w2[1], w2[0], offset_minus_4); c0[1] = amd_bytealign_S (w2[0], w1[3], offset_minus_4); c0[0] = amd_bytealign_S (w1[3], w1[2], offset_minus_4); w3[3] = amd_bytealign_S (w1[2], w1[1], offset_minus_4); w3[2] = amd_bytealign_S (w1[1], w1[0], offset_minus_4); w3[1] = amd_bytealign_S (w1[0], w0[3], offset_minus_4); w3[0] = amd_bytealign_S (w0[3], w0[2], offset_minus_4); w2[3] = amd_bytealign_S (w0[2], w0[1], offset_minus_4); w2[2] = amd_bytealign_S (w0[1], w0[0], offset_minus_4); w2[1] = amd_bytealign_S (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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = c2[0]; c2[0] = c2[1]; c2[1] = 0; } break; case 10: c2[2] = amd_bytealign_S ( 0, w3[3], offset_minus_4); c2[1] = amd_bytealign_S (w3[3], w3[2], offset_minus_4); c2[0] = amd_bytealign_S (w3[2], w3[1], offset_minus_4); c1[3] = amd_bytealign_S (w3[1], w3[0], offset_minus_4); c1[2] = amd_bytealign_S (w3[0], w2[3], offset_minus_4); c1[1] = amd_bytealign_S (w2[3], w2[2], offset_minus_4); c1[0] = amd_bytealign_S (w2[2], w2[1], offset_minus_4); c0[3] = amd_bytealign_S (w2[1], w2[0], offset_minus_4); c0[2] = amd_bytealign_S (w2[0], w1[3], offset_minus_4); c0[1] = amd_bytealign_S (w1[3], w1[2], offset_minus_4); c0[0] = amd_bytealign_S (w1[2], w1[1], offset_minus_4); w3[3] = amd_bytealign_S (w1[1], w1[0], offset_minus_4); w3[2] = amd_bytealign_S (w1[0], w0[3], offset_minus_4); w3[1] = amd_bytealign_S (w0[3], w0[2], offset_minus_4); w3[0] = amd_bytealign_S (w0[2], w0[1], offset_minus_4); w2[3] = amd_bytealign_S (w0[1], w0[0], offset_minus_4); w2[2] = amd_bytealign_S (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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = c2[0]; c2[0] = c2[1]; c2[1] = c2[2]; c2[2] = 0; } break; case 11: c2[3] = amd_bytealign_S ( 0, w3[3], offset_minus_4); c2[2] = amd_bytealign_S (w3[3], w3[2], offset_minus_4); c2[1] = amd_bytealign_S (w3[2], w3[1], offset_minus_4); c2[0] = amd_bytealign_S (w3[1], w3[0], offset_minus_4); c1[3] = amd_bytealign_S (w3[0], w2[3], offset_minus_4); c1[2] = amd_bytealign_S (w2[3], w2[2], offset_minus_4); c1[1] = amd_bytealign_S (w2[2], w2[1], offset_minus_4); c1[0] = amd_bytealign_S (w2[1], w2[0], offset_minus_4); c0[3] = amd_bytealign_S (w2[0], w1[3], offset_minus_4); c0[2] = amd_bytealign_S (w1[3], w1[2], offset_minus_4); c0[1] = amd_bytealign_S (w1[2], w1[1], offset_minus_4); c0[0] = amd_bytealign_S (w1[1], w1[0], offset_minus_4); w3[3] = amd_bytealign_S (w1[0], w0[3], offset_minus_4); w3[2] = amd_bytealign_S (w0[3], w0[2], offset_minus_4); w3[1] = amd_bytealign_S (w0[2], w0[1], offset_minus_4); w3[0] = amd_bytealign_S (w0[1], w0[0], offset_minus_4); w2[3] = amd_bytealign_S (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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = c2[0]; c2[0] = c2[1]; c2[1] = c2[2]; c2[2] = c2[3]; c2[3] = 0; } break; case 12: c3[0] = amd_bytealign_S ( 0, w3[3], offset_minus_4); c2[3] = amd_bytealign_S (w3[3], w3[2], offset_minus_4); c2[2] = amd_bytealign_S (w3[2], w3[1], offset_minus_4); c2[1] = amd_bytealign_S (w3[1], w3[0], offset_minus_4); c2[0] = amd_bytealign_S (w3[0], w2[3], offset_minus_4); c1[3] = amd_bytealign_S (w2[3], w2[2], offset_minus_4); c1[2] = amd_bytealign_S (w2[2], w2[1], offset_minus_4); c1[1] = amd_bytealign_S (w2[1], w2[0], offset_minus_4); c1[0] = amd_bytealign_S (w2[0], w1[3], offset_minus_4); c0[3] = amd_bytealign_S (w1[3], w1[2], offset_minus_4); c0[2] = amd_bytealign_S (w1[2], w1[1], offset_minus_4); c0[1] = amd_bytealign_S (w1[1], w1[0], offset_minus_4); c0[0] = amd_bytealign_S (w1[0], w0[3], offset_minus_4); w3[3] = amd_bytealign_S (w0[3], w0[2], offset_minus_4); w3[2] = amd_bytealign_S (w0[2], w0[1], offset_minus_4); w3[1] = amd_bytealign_S (w0[1], w0[0], offset_minus_4); w3[0] = amd_bytealign_S (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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = c2[0]; c2[0] = c2[1]; c2[1] = c2[2]; c2[2] = c2[3]; c2[3] = c3[0]; c3[0] = 0; } break; case 13: c3[1] = amd_bytealign_S ( 0, w3[3], offset_minus_4); c3[0] = amd_bytealign_S (w3[3], w3[2], offset_minus_4); c2[3] = amd_bytealign_S (w3[2], w3[1], offset_minus_4); c2[2] = amd_bytealign_S (w3[1], w3[0], offset_minus_4); c2[1] = amd_bytealign_S (w3[0], w2[3], offset_minus_4); c2[0] = amd_bytealign_S (w2[3], w2[2], offset_minus_4); c1[3] = amd_bytealign_S (w2[2], w2[1], offset_minus_4); c1[2] = amd_bytealign_S (w2[1], w2[0], offset_minus_4); c1[1] = amd_bytealign_S (w2[0], w1[3], offset_minus_4); c1[0] = amd_bytealign_S (w1[3], w1[2], offset_minus_4); c0[3] = amd_bytealign_S (w1[2], w1[1], offset_minus_4); c0[2] = amd_bytealign_S (w1[1], w1[0], offset_minus_4); c0[1] = amd_bytealign_S (w1[0], w0[3], offset_minus_4); c0[0] = amd_bytealign_S (w0[3], w0[2], offset_minus_4); w3[3] = amd_bytealign_S (w0[2], w0[1], offset_minus_4); w3[2] = amd_bytealign_S (w0[1], w0[0], offset_minus_4); w3[1] = amd_bytealign_S (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] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = c2[0]; c2[0] = c2[1]; c2[1] = c2[2]; c2[2] = c2[3]; c2[3] = c3[0]; c3[0] = c3[1]; c3[1] = 0; } break; case 14: c3[2] = amd_bytealign_S ( 0, w3[3], offset_minus_4); c3[1] = amd_bytealign_S (w3[3], w3[2], offset_minus_4); c3[0] = amd_bytealign_S (w3[2], w3[1], offset_minus_4); c2[3] = amd_bytealign_S (w3[1], w3[0], offset_minus_4); c2[2] = amd_bytealign_S (w3[0], w2[3], offset_minus_4); c2[1] = amd_bytealign_S (w2[3], w2[2], offset_minus_4); c2[0] = amd_bytealign_S (w2[2], w2[1], offset_minus_4); c1[3] = amd_bytealign_S (w2[1], w2[0], offset_minus_4); c1[2] = amd_bytealign_S (w2[0], w1[3], offset_minus_4); c1[1] = amd_bytealign_S (w1[3], w1[2], offset_minus_4); c1[0] = amd_bytealign_S (w1[2], w1[1], offset_minus_4); c0[3] = amd_bytealign_S (w1[1], w1[0], offset_minus_4); c0[2] = amd_bytealign_S (w1[0], w0[3], offset_minus_4); c0[1] = amd_bytealign_S (w0[3], w0[2], offset_minus_4); c0[0] = amd_bytealign_S (w0[2], w0[1], offset_minus_4); w3[3] = amd_bytealign_S (w0[1], w0[0], offset_minus_4); w3[2] = amd_bytealign_S (w0[0], 0, offset_minus_4); w3[1] = 0; 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[2] = w3[3]; w3[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = c2[0]; c2[0] = c2[1]; c2[1] = c2[2]; c2[2] = c2[3]; c2[3] = c3[0]; c3[0] = c3[1]; c3[1] = c3[2]; c3[2] = 0; } break; case 15: c3[3] = amd_bytealign_S ( 0, w3[3], offset_minus_4); c3[2] = amd_bytealign_S (w3[3], w3[2], offset_minus_4); c3[1] = amd_bytealign_S (w3[2], w3[1], offset_minus_4); c3[0] = amd_bytealign_S (w3[1], w3[0], offset_minus_4); c2[3] = amd_bytealign_S (w3[0], w2[3], offset_minus_4); c2[2] = amd_bytealign_S (w2[3], w2[2], offset_minus_4); c2[1] = amd_bytealign_S (w2[2], w2[1], offset_minus_4); c2[0] = amd_bytealign_S (w2[1], w2[0], offset_minus_4); c1[3] = amd_bytealign_S (w2[0], w1[3], offset_minus_4); c1[2] = amd_bytealign_S (w1[3], w1[2], offset_minus_4); c1[1] = amd_bytealign_S (w1[2], w1[1], offset_minus_4); c1[0] = amd_bytealign_S (w1[1], w1[0], offset_minus_4); c0[3] = amd_bytealign_S (w1[0], w0[3], offset_minus_4); c0[2] = amd_bytealign_S (w0[3], w0[2], offset_minus_4); c0[1] = amd_bytealign_S (w0[2], w0[1], offset_minus_4); c0[0] = amd_bytealign_S (w0[1], w0[0], offset_minus_4); w3[3] = amd_bytealign_S (w0[0], 0, offset_minus_4); w3[2] = 0; w3[1] = 0; 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[3] = c0[0]; c0[0] = c0[1]; c0[1] = c0[2]; c0[2] = c0[3]; c0[3] = c1[0]; c1[0] = c1[1]; c1[1] = c1[2]; c1[2] = c1[3]; c1[3] = c2[0]; c2[0] = c2[1]; c2[1] = c2[2]; c2[2] = c2[3]; c2[3] = c3[0]; c3[0] = c3[1]; c3[1] = c3[2]; c3[2] = c3[3]; c3[3] = 0; } break; } #endif } void switch_buffer_by_offset_be_S (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 offset) { #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if (defined IS_AMD && AMD_GCN < 3) || defined IS_GENERIC switch (offset_switch) { case 0: w3[3] = amd_bytealign_S (w3[2], w3[3], offset); w3[2] = amd_bytealign_S (w3[1], w3[2], offset); w3[1] = amd_bytealign_S (w3[0], w3[1], offset); w3[0] = amd_bytealign_S (w2[3], w3[0], offset); w2[3] = amd_bytealign_S (w2[2], w2[3], offset); w2[2] = amd_bytealign_S (w2[1], w2[2], offset); w2[1] = amd_bytealign_S (w2[0], w2[1], offset); w2[0] = amd_bytealign_S (w1[3], w2[0], offset); w1[3] = amd_bytealign_S (w1[2], w1[3], offset); w1[2] = amd_bytealign_S (w1[1], w1[2], offset); w1[1] = amd_bytealign_S (w1[0], w1[1], offset); w1[0] = amd_bytealign_S (w0[3], w1[0], offset); w0[3] = amd_bytealign_S (w0[2], w0[3], offset); w0[2] = amd_bytealign_S (w0[1], w0[2], offset); w0[1] = amd_bytealign_S (w0[0], w0[1], offset); w0[0] = amd_bytealign_S ( 0, w0[0], offset); break; case 1: w3[3] = amd_bytealign_S (w3[1], w3[2], offset); w3[2] = amd_bytealign_S (w3[0], w3[1], offset); w3[1] = amd_bytealign_S (w2[3], w3[0], offset); w3[0] = amd_bytealign_S (w2[2], w2[3], offset); w2[3] = amd_bytealign_S (w2[1], w2[2], offset); w2[2] = amd_bytealign_S (w2[0], w2[1], offset); w2[1] = amd_bytealign_S (w1[3], w2[0], offset); w2[0] = amd_bytealign_S (w1[2], w1[3], offset); w1[3] = amd_bytealign_S (w1[1], w1[2], offset); w1[2] = amd_bytealign_S (w1[0], w1[1], offset); w1[1] = amd_bytealign_S (w0[3], w1[0], offset); w1[0] = amd_bytealign_S (w0[2], w0[3], offset); w0[3] = amd_bytealign_S (w0[1], w0[2], offset); w0[2] = amd_bytealign_S (w0[0], w0[1], offset); w0[1] = amd_bytealign_S ( 0, w0[0], offset); w0[0] = 0; break; case 2: w3[3] = amd_bytealign_S (w3[0], w3[1], offset); w3[2] = amd_bytealign_S (w2[3], w3[0], offset); w3[1] = amd_bytealign_S (w2[2], w2[3], offset); w3[0] = amd_bytealign_S (w2[1], w2[2], offset); w2[3] = amd_bytealign_S (w2[0], w2[1], offset); w2[2] = amd_bytealign_S (w1[3], w2[0], offset); w2[1] = amd_bytealign_S (w1[2], w1[3], offset); w2[0] = amd_bytealign_S (w1[1], w1[2], offset); w1[3] = amd_bytealign_S (w1[0], w1[1], offset); w1[2] = amd_bytealign_S (w0[3], w1[0], offset); w1[1] = amd_bytealign_S (w0[2], w0[3], offset); w1[0] = amd_bytealign_S (w0[1], w0[2], offset); w0[3] = amd_bytealign_S (w0[0], w0[1], offset); w0[2] = amd_bytealign_S ( 0, w0[0], offset); w0[1] = 0; w0[0] = 0; break; case 3: w3[3] = amd_bytealign_S (w2[3], w3[0], offset); w3[2] = amd_bytealign_S (w2[2], w2[3], offset); w3[1] = amd_bytealign_S (w2[1], w2[2], offset); w3[0] = amd_bytealign_S (w2[0], w2[1], offset); w2[3] = amd_bytealign_S (w1[3], w2[0], offset); w2[2] = amd_bytealign_S (w1[2], w1[3], offset); w2[1] = amd_bytealign_S (w1[1], w1[2], offset); w2[0] = amd_bytealign_S (w1[0], w1[1], offset); w1[3] = amd_bytealign_S (w0[3], w1[0], offset); w1[2] = amd_bytealign_S (w0[2], w0[3], offset); w1[1] = amd_bytealign_S (w0[1], w0[2], offset); w1[0] = amd_bytealign_S (w0[0], w0[1], offset); w0[3] = amd_bytealign_S ( 0, w0[0], offset); w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 4: w3[3] = amd_bytealign_S (w2[2], w2[3], offset); w3[2] = amd_bytealign_S (w2[1], w2[2], offset); w3[1] = amd_bytealign_S (w2[0], w2[1], offset); w3[0] = amd_bytealign_S (w1[3], w2[0], offset); w2[3] = amd_bytealign_S (w1[2], w1[3], offset); w2[2] = amd_bytealign_S (w1[1], w1[2], offset); w2[1] = amd_bytealign_S (w1[0], w1[1], offset); w2[0] = amd_bytealign_S (w0[3], w1[0], offset); w1[3] = amd_bytealign_S (w0[2], w0[3], offset); w1[2] = amd_bytealign_S (w0[1], w0[2], offset); w1[1] = amd_bytealign_S (w0[0], w0[1], offset); w1[0] = amd_bytealign_S ( 0, w0[0], offset); w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 5: w3[3] = amd_bytealign_S (w2[1], w2[2], offset); w3[2] = amd_bytealign_S (w2[0], w2[1], offset); w3[1] = amd_bytealign_S (w1[3], w2[0], offset); w3[0] = amd_bytealign_S (w1[2], w1[3], offset); w2[3] = amd_bytealign_S (w1[1], w1[2], offset); w2[2] = amd_bytealign_S (w1[0], w1[1], offset); w2[1] = amd_bytealign_S (w0[3], w1[0], offset); w2[0] = amd_bytealign_S (w0[2], w0[3], offset); w1[3] = amd_bytealign_S (w0[1], w0[2], offset); w1[2] = amd_bytealign_S (w0[0], w0[1], offset); w1[1] = amd_bytealign_S ( 0, w0[0], offset); w1[0] = 0; w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 6: w3[3] = amd_bytealign_S (w2[0], w2[1], offset); w3[2] = amd_bytealign_S (w1[3], w2[0], offset); w3[1] = amd_bytealign_S (w1[2], w1[3], offset); w3[0] = amd_bytealign_S (w1[1], w1[2], offset); w2[3] = amd_bytealign_S (w1[0], w1[1], offset); w2[2] = amd_bytealign_S (w0[3], w1[0], offset); w2[1] = amd_bytealign_S (w0[2], w0[3], offset); w2[0] = amd_bytealign_S (w0[1], w0[2], offset); w1[3] = amd_bytealign_S (w0[0], w0[1], offset); w1[2] = amd_bytealign_S ( 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[3] = amd_bytealign_S (w1[3], w2[0], offset); w3[2] = amd_bytealign_S (w1[2], w1[3], offset); w3[1] = amd_bytealign_S (w1[1], w1[2], offset); w3[0] = amd_bytealign_S (w1[0], w1[1], offset); w2[3] = amd_bytealign_S (w0[3], w1[0], offset); w2[2] = amd_bytealign_S (w0[2], w0[3], offset); w2[1] = amd_bytealign_S (w0[1], w0[2], offset); w2[0] = amd_bytealign_S (w0[0], w0[1], offset); w1[3] = amd_bytealign_S ( 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[3] = amd_bytealign_S (w1[2], w1[3], offset); w3[2] = amd_bytealign_S (w1[1], w1[2], offset); w3[1] = amd_bytealign_S (w1[0], w1[1], offset); w3[0] = amd_bytealign_S (w0[3], w1[0], offset); w2[3] = amd_bytealign_S (w0[2], w0[3], offset); w2[2] = amd_bytealign_S (w0[1], w0[2], offset); w2[1] = amd_bytealign_S (w0[0], w0[1], offset); w2[0] = amd_bytealign_S ( 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[3] = amd_bytealign_S (w1[1], w1[2], offset); w3[2] = amd_bytealign_S (w1[0], w1[1], offset); w3[1] = amd_bytealign_S (w0[3], w1[0], offset); w3[0] = amd_bytealign_S (w0[2], w0[3], offset); w2[3] = amd_bytealign_S (w0[1], w0[2], offset); w2[2] = amd_bytealign_S (w0[0], w0[1], offset); w2[1] = amd_bytealign_S ( 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[3] = amd_bytealign_S (w1[0], w1[1], offset); w3[2] = amd_bytealign_S (w0[3], w1[0], offset); w3[1] = amd_bytealign_S (w0[2], w0[3], offset); w3[0] = amd_bytealign_S (w0[1], w0[2], offset); w2[3] = amd_bytealign_S (w0[0], w0[1], offset); w2[2] = amd_bytealign_S ( 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[3] = amd_bytealign_S (w0[3], w1[0], offset); w3[2] = amd_bytealign_S (w0[2], w0[3], offset); w3[1] = amd_bytealign_S (w0[1], w0[2], offset); w3[0] = amd_bytealign_S (w0[0], w0[1], offset); w2[3] = amd_bytealign_S ( 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[3] = amd_bytealign_S (w0[2], w0[3], offset); w3[2] = amd_bytealign_S (w0[1], w0[2], offset); w3[1] = amd_bytealign_S (w0[0], w0[1], offset); w3[0] = amd_bytealign_S ( 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[3] = amd_bytealign_S (w0[1], w0[2], offset); w3[2] = amd_bytealign_S (w0[0], w0[1], offset); w3[1] = amd_bytealign_S ( 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; case 14: w3[3] = amd_bytealign_S (w0[0], w0[1], offset); w3[2] = amd_bytealign_S ( 0, w0[0], offset); w3[1] = 0; 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; case 15: w3[3] = amd_bytealign_S ( 0, w0[0], offset); w3[2] = 0; w3[1] = 0; 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 #if (defined IS_AMD && AMD_GCN >= 3) || defined IS_NV #if defined IS_NV const int selector = (0x76543210 >> ((offset & 3) * 4)) & 0xffff; #endif #if defined IS_AMD const int selector = 0x0706050403020100 >> ((offset & 3) * 8); #endif switch (offset_switch) { case 0: w3[3] = __byte_perm_S (w3[3], w3[2], selector); w3[2] = __byte_perm_S (w3[2], w3[1], selector); w3[1] = __byte_perm_S (w3[1], w3[0], selector); w3[0] = __byte_perm_S (w3[0], w2[3], selector); w2[3] = __byte_perm_S (w2[3], w2[2], selector); w2[2] = __byte_perm_S (w2[2], w2[1], selector); w2[1] = __byte_perm_S (w2[1], w2[0], selector); w2[0] = __byte_perm_S (w2[0], w1[3], selector); w1[3] = __byte_perm_S (w1[3], w1[2], selector); w1[2] = __byte_perm_S (w1[2], w1[1], selector); w1[1] = __byte_perm_S (w1[1], w1[0], selector); w1[0] = __byte_perm_S (w1[0], w0[3], selector); w0[3] = __byte_perm_S (w0[3], w0[2], selector); w0[2] = __byte_perm_S (w0[2], w0[1], selector); w0[1] = __byte_perm_S (w0[1], w0[0], selector); w0[0] = __byte_perm_S (w0[0], 0, selector); break; case 1: w3[3] = __byte_perm_S (w3[2], w3[1], selector); w3[2] = __byte_perm_S (w3[1], w3[0], selector); w3[1] = __byte_perm_S (w3[0], w2[3], selector); w3[0] = __byte_perm_S (w2[3], w2[2], selector); w2[3] = __byte_perm_S (w2[2], w2[1], selector); w2[2] = __byte_perm_S (w2[1], w2[0], selector); w2[1] = __byte_perm_S (w2[0], w1[3], selector); w2[0] = __byte_perm_S (w1[3], w1[2], selector); w1[3] = __byte_perm_S (w1[2], w1[1], selector); w1[2] = __byte_perm_S (w1[1], w1[0], selector); w1[1] = __byte_perm_S (w1[0], w0[3], selector); w1[0] = __byte_perm_S (w0[3], w0[2], selector); w0[3] = __byte_perm_S (w0[2], w0[1], selector); w0[2] = __byte_perm_S (w0[1], w0[0], selector); w0[1] = __byte_perm_S (w0[0], 0, selector); w0[0] = 0; break; case 2: w3[3] = __byte_perm_S (w3[1], w3[0], selector); w3[2] = __byte_perm_S (w3[0], w2[3], selector); w3[1] = __byte_perm_S (w2[3], w2[2], selector); w3[0] = __byte_perm_S (w2[2], w2[1], selector); w2[3] = __byte_perm_S (w2[1], w2[0], selector); w2[2] = __byte_perm_S (w2[0], w1[3], selector); w2[1] = __byte_perm_S (w1[3], w1[2], selector); w2[0] = __byte_perm_S (w1[2], w1[1], selector); w1[3] = __byte_perm_S (w1[1], w1[0], selector); w1[2] = __byte_perm_S (w1[0], w0[3], selector); w1[1] = __byte_perm_S (w0[3], w0[2], selector); w1[0] = __byte_perm_S (w0[2], w0[1], selector); w0[3] = __byte_perm_S (w0[1], w0[0], selector); w0[2] = __byte_perm_S (w0[0], 0, selector); w0[1] = 0; w0[0] = 0; break; case 3: w3[3] = __byte_perm_S (w3[0], w2[3], selector); w3[2] = __byte_perm_S (w2[3], w2[2], selector); w3[1] = __byte_perm_S (w2[2], w2[1], selector); w3[0] = __byte_perm_S (w2[1], w2[0], selector); w2[3] = __byte_perm_S (w2[0], w1[3], selector); w2[2] = __byte_perm_S (w1[3], w1[2], selector); w2[1] = __byte_perm_S (w1[2], w1[1], selector); w2[0] = __byte_perm_S (w1[1], w1[0], selector); w1[3] = __byte_perm_S (w1[0], w0[3], selector); w1[2] = __byte_perm_S (w0[3], w0[2], selector); w1[1] = __byte_perm_S (w0[2], w0[1], selector); w1[0] = __byte_perm_S (w0[1], w0[0], selector); w0[3] = __byte_perm_S (w0[0], 0, selector); w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 4: w3[3] = __byte_perm_S (w2[3], w2[2], selector); w3[2] = __byte_perm_S (w2[2], w2[1], selector); w3[1] = __byte_perm_S (w2[1], w2[0], selector); w3[0] = __byte_perm_S (w2[0], w1[3], selector); w2[3] = __byte_perm_S (w1[3], w1[2], selector); w2[2] = __byte_perm_S (w1[2], w1[1], selector); w2[1] = __byte_perm_S (w1[1], w1[0], selector); w2[0] = __byte_perm_S (w1[0], w0[3], selector); w1[3] = __byte_perm_S (w0[3], w0[2], selector); w1[2] = __byte_perm_S (w0[2], w0[1], selector); w1[1] = __byte_perm_S (w0[1], w0[0], selector); w1[0] = __byte_perm_S (w0[0], 0, selector); w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 5: w3[3] = __byte_perm_S (w2[2], w2[1], selector); w3[2] = __byte_perm_S (w2[1], w2[0], selector); w3[1] = __byte_perm_S (w2[0], w1[3], selector); w3[0] = __byte_perm_S (w1[3], w1[2], selector); w2[3] = __byte_perm_S (w1[2], w1[1], selector); w2[2] = __byte_perm_S (w1[1], w1[0], selector); w2[1] = __byte_perm_S (w1[0], w0[3], selector); w2[0] = __byte_perm_S (w0[3], w0[2], selector); w1[3] = __byte_perm_S (w0[2], w0[1], selector); w1[2] = __byte_perm_S (w0[1], w0[0], selector); w1[1] = __byte_perm_S (w0[0], 0, selector); w1[0] = 0; w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 6: w3[3] = __byte_perm_S (w2[1], w2[0], selector); w3[2] = __byte_perm_S (w2[0], w1[3], selector); w3[1] = __byte_perm_S (w1[3], w1[2], selector); w3[0] = __byte_perm_S (w1[2], w1[1], selector); w2[3] = __byte_perm_S (w1[1], w1[0], selector); w2[2] = __byte_perm_S (w1[0], w0[3], selector); w2[1] = __byte_perm_S (w0[3], w0[2], selector); w2[0] = __byte_perm_S (w0[2], w0[1], selector); w1[3] = __byte_perm_S (w0[1], w0[0], selector); w1[2] = __byte_perm_S (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[3] = __byte_perm_S (w2[0], w1[3], selector); w3[2] = __byte_perm_S (w1[3], w1[2], selector); w3[1] = __byte_perm_S (w1[2], w1[1], selector); w3[0] = __byte_perm_S (w1[1], w1[0], selector); w2[3] = __byte_perm_S (w1[0], w0[3], selector); w2[2] = __byte_perm_S (w0[3], w0[2], selector); w2[1] = __byte_perm_S (w0[2], w0[1], selector); w2[0] = __byte_perm_S (w0[1], w0[0], selector); w1[3] = __byte_perm_S (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[3] = __byte_perm_S (w1[3], w1[2], selector); w3[2] = __byte_perm_S (w1[2], w1[1], selector); w3[1] = __byte_perm_S (w1[1], w1[0], selector); w3[0] = __byte_perm_S (w1[0], w0[3], selector); w2[3] = __byte_perm_S (w0[3], w0[2], selector); w2[2] = __byte_perm_S (w0[2], w0[1], selector); w2[1] = __byte_perm_S (w0[1], w0[0], selector); w2[0] = __byte_perm_S (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[3] = __byte_perm_S (w1[2], w1[1], selector); w3[2] = __byte_perm_S (w1[1], w1[0], selector); w3[1] = __byte_perm_S (w1[0], w0[3], selector); w3[0] = __byte_perm_S (w0[3], w0[2], selector); w2[3] = __byte_perm_S (w0[2], w0[1], selector); w2[2] = __byte_perm_S (w0[1], w0[0], selector); w2[1] = __byte_perm_S (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[3] = __byte_perm_S (w1[1], w1[0], selector); w3[2] = __byte_perm_S (w1[0], w0[3], selector); w3[1] = __byte_perm_S (w0[3], w0[2], selector); w3[0] = __byte_perm_S (w0[2], w0[1], selector); w2[3] = __byte_perm_S (w0[1], w0[0], selector); w2[2] = __byte_perm_S (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[3] = __byte_perm_S (w1[0], w0[3], selector); w3[2] = __byte_perm_S (w0[3], w0[2], selector); w3[1] = __byte_perm_S (w0[2], w0[1], selector); w3[0] = __byte_perm_S (w0[1], w0[0], selector); w2[3] = __byte_perm_S (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[3] = __byte_perm_S (w0[3], w0[2], selector); w3[2] = __byte_perm_S (w0[2], w0[1], selector); w3[1] = __byte_perm_S (w0[1], w0[0], selector); w3[0] = __byte_perm_S (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[3] = __byte_perm_S (w0[2], w0[1], selector); w3[2] = __byte_perm_S (w0[1], w0[0], selector); w3[1] = __byte_perm_S (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; case 14: w3[3] = __byte_perm_S (w0[1], w0[0], selector); w3[2] = __byte_perm_S (w0[0], 0, selector); w3[1] = 0; 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; case 15: w3[3] = __byte_perm_S (w0[0], 0, selector); w3[2] = 0; w3[1] = 0; 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 } void switch_buffer_by_offset_carry_be_S (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 c0[4], u32 c1[4], u32 c2[4], u32 c3[4], const u32 offset) { #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if (defined IS_AMD && AMD_GCN < 3) || defined IS_GENERIC switch (offset_switch) { case 0: c0[0] = amd_bytealign_S (w3[3], 0, offset); w3[3] = amd_bytealign_S (w3[2], w3[3], offset); w3[2] = amd_bytealign_S (w3[1], w3[2], offset); w3[1] = amd_bytealign_S (w3[0], w3[1], offset); w3[0] = amd_bytealign_S (w2[3], w3[0], offset); w2[3] = amd_bytealign_S (w2[2], w2[3], offset); w2[2] = amd_bytealign_S (w2[1], w2[2], offset); w2[1] = amd_bytealign_S (w2[0], w2[1], offset); w2[0] = amd_bytealign_S (w1[3], w2[0], offset); w1[3] = amd_bytealign_S (w1[2], w1[3], offset); w1[2] = amd_bytealign_S (w1[1], w1[2], offset); w1[1] = amd_bytealign_S (w1[0], w1[1], offset); w1[0] = amd_bytealign_S (w0[3], w1[0], offset); w0[3] = amd_bytealign_S (w0[2], w0[3], offset); w0[2] = amd_bytealign_S (w0[1], w0[2], offset); w0[1] = amd_bytealign_S (w0[0], w0[1], offset); w0[0] = amd_bytealign_S ( 0, w0[0], offset); break; case 1: c0[1] = amd_bytealign_S (w3[3], 0, offset); c0[0] = amd_bytealign_S (w3[2], w3[3], offset); w3[3] = amd_bytealign_S (w3[1], w3[2], offset); w3[2] = amd_bytealign_S (w3[0], w3[1], offset); w3[1] = amd_bytealign_S (w2[3], w3[0], offset); w3[0] = amd_bytealign_S (w2[2], w2[3], offset); w2[3] = amd_bytealign_S (w2[1], w2[2], offset); w2[2] = amd_bytealign_S (w2[0], w2[1], offset); w2[1] = amd_bytealign_S (w1[3], w2[0], offset); w2[0] = amd_bytealign_S (w1[2], w1[3], offset); w1[3] = amd_bytealign_S (w1[1], w1[2], offset); w1[2] = amd_bytealign_S (w1[0], w1[1], offset); w1[1] = amd_bytealign_S (w0[3], w1[0], offset); w1[0] = amd_bytealign_S (w0[2], w0[3], offset); w0[3] = amd_bytealign_S (w0[1], w0[2], offset); w0[2] = amd_bytealign_S (w0[0], w0[1], offset); w0[1] = amd_bytealign_S ( 0, w0[0], offset); w0[0] = 0; break; case 2: c0[2] = amd_bytealign_S (w3[3], 0, offset); c0[1] = amd_bytealign_S (w3[2], w3[3], offset); c0[0] = amd_bytealign_S (w3[1], w3[2], offset); w3[3] = amd_bytealign_S (w3[0], w3[1], offset); w3[2] = amd_bytealign_S (w2[3], w3[0], offset); w3[1] = amd_bytealign_S (w2[2], w2[3], offset); w3[0] = amd_bytealign_S (w2[1], w2[2], offset); w2[3] = amd_bytealign_S (w2[0], w2[1], offset); w2[2] = amd_bytealign_S (w1[3], w2[0], offset); w2[1] = amd_bytealign_S (w1[2], w1[3], offset); w2[0] = amd_bytealign_S (w1[1], w1[2], offset); w1[3] = amd_bytealign_S (w1[0], w1[1], offset); w1[2] = amd_bytealign_S (w0[3], w1[0], offset); w1[1] = amd_bytealign_S (w0[2], w0[3], offset); w1[0] = amd_bytealign_S (w0[1], w0[2], offset); w0[3] = amd_bytealign_S (w0[0], w0[1], offset); w0[2] = amd_bytealign_S ( 0, w0[0], offset); w0[1] = 0; w0[0] = 0; break; case 3: c0[3] = amd_bytealign_S (w3[3], 0, offset); c0[2] = amd_bytealign_S (w3[2], w3[3], offset); c0[1] = amd_bytealign_S (w3[1], w3[2], offset); c0[0] = amd_bytealign_S (w3[0], w3[1], offset); w3[3] = amd_bytealign_S (w2[3], w3[0], offset); w3[2] = amd_bytealign_S (w2[2], w2[3], offset); w3[1] = amd_bytealign_S (w2[1], w2[2], offset); w3[0] = amd_bytealign_S (w2[0], w2[1], offset); w2[3] = amd_bytealign_S (w1[3], w2[0], offset); w2[2] = amd_bytealign_S (w1[2], w1[3], offset); w2[1] = amd_bytealign_S (w1[1], w1[2], offset); w2[0] = amd_bytealign_S (w1[0], w1[1], offset); w1[3] = amd_bytealign_S (w0[3], w1[0], offset); w1[2] = amd_bytealign_S (w0[2], w0[3], offset); w1[1] = amd_bytealign_S (w0[1], w0[2], offset); w1[0] = amd_bytealign_S (w0[0], w0[1], offset); w0[3] = amd_bytealign_S ( 0, w0[0], offset); w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 4: c1[0] = amd_bytealign_S (w3[3], 0, offset); c0[3] = amd_bytealign_S (w3[2], w3[3], offset); c0[2] = amd_bytealign_S (w3[1], w3[2], offset); c0[1] = amd_bytealign_S (w3[0], w3[1], offset); c0[0] = amd_bytealign_S (w2[3], w3[0], offset); w3[3] = amd_bytealign_S (w2[2], w2[3], offset); w3[2] = amd_bytealign_S (w2[1], w2[2], offset); w3[1] = amd_bytealign_S (w2[0], w2[1], offset); w3[0] = amd_bytealign_S (w1[3], w2[0], offset); w2[3] = amd_bytealign_S (w1[2], w1[3], offset); w2[2] = amd_bytealign_S (w1[1], w1[2], offset); w2[1] = amd_bytealign_S (w1[0], w1[1], offset); w2[0] = amd_bytealign_S (w0[3], w1[0], offset); w1[3] = amd_bytealign_S (w0[2], w0[3], offset); w1[2] = amd_bytealign_S (w0[1], w0[2], offset); w1[1] = amd_bytealign_S (w0[0], w0[1], offset); w1[0] = amd_bytealign_S ( 0, w0[0], offset); w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 5: c1[1] = amd_bytealign_S (w3[3], 0, offset); c1[0] = amd_bytealign_S (w3[2], w3[3], offset); c0[3] = amd_bytealign_S (w3[1], w3[2], offset); c0[2] = amd_bytealign_S (w3[0], w3[1], offset); c0[1] = amd_bytealign_S (w2[3], w3[0], offset); c0[0] = amd_bytealign_S (w2[2], w2[3], offset); w3[3] = amd_bytealign_S (w2[1], w2[2], offset); w3[2] = amd_bytealign_S (w2[0], w2[1], offset); w3[1] = amd_bytealign_S (w1[3], w2[0], offset); w3[0] = amd_bytealign_S (w1[2], w1[3], offset); w2[3] = amd_bytealign_S (w1[1], w1[2], offset); w2[2] = amd_bytealign_S (w1[0], w1[1], offset); w2[1] = amd_bytealign_S (w0[3], w1[0], offset); w2[0] = amd_bytealign_S (w0[2], w0[3], offset); w1[3] = amd_bytealign_S (w0[1], w0[2], offset); w1[2] = amd_bytealign_S (w0[0], w0[1], offset); w1[1] = amd_bytealign_S ( 0, w0[0], offset); w1[0] = 0; w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 6: c1[2] = amd_bytealign_S (w3[3], 0, offset); c1[1] = amd_bytealign_S (w3[2], w3[3], offset); c1[0] = amd_bytealign_S (w3[1], w3[2], offset); c0[3] = amd_bytealign_S (w3[0], w3[1], offset); c0[2] = amd_bytealign_S (w2[3], w3[0], offset); c0[1] = amd_bytealign_S (w2[2], w2[3], offset); c0[0] = amd_bytealign_S (w2[1], w2[2], offset); w3[3] = amd_bytealign_S (w2[0], w2[1], offset); w3[2] = amd_bytealign_S (w1[3], w2[0], offset); w3[1] = amd_bytealign_S (w1[2], w1[3], offset); w3[0] = amd_bytealign_S (w1[1], w1[2], offset); w2[3] = amd_bytealign_S (w1[0], w1[1], offset); w2[2] = amd_bytealign_S (w0[3], w1[0], offset); w2[1] = amd_bytealign_S (w0[2], w0[3], offset); w2[0] = amd_bytealign_S (w0[1], w0[2], offset); w1[3] = amd_bytealign_S (w0[0], w0[1], offset); w1[2] = amd_bytealign_S ( 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: c1[3] = amd_bytealign_S (w3[3], 0, offset); c1[2] = amd_bytealign_S (w3[2], w3[3], offset); c1[1] = amd_bytealign_S (w3[1], w3[2], offset); c1[0] = amd_bytealign_S (w3[0], w3[1], offset); c0[3] = amd_bytealign_S (w2[3], w3[0], offset); c0[2] = amd_bytealign_S (w2[2], w2[3], offset); c0[1] = amd_bytealign_S (w2[1], w2[2], offset); c0[0] = amd_bytealign_S (w2[0], w2[1], offset); w3[3] = amd_bytealign_S (w1[3], w2[0], offset); w3[2] = amd_bytealign_S (w1[2], w1[3], offset); w3[1] = amd_bytealign_S (w1[1], w1[2], offset); w3[0] = amd_bytealign_S (w1[0], w1[1], offset); w2[3] = amd_bytealign_S (w0[3], w1[0], offset); w2[2] = amd_bytealign_S (w0[2], w0[3], offset); w2[1] = amd_bytealign_S (w0[1], w0[2], offset); w2[0] = amd_bytealign_S (w0[0], w0[1], offset); w1[3] = amd_bytealign_S ( 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: c2[0] = amd_bytealign_S (w3[3], 0, offset); c1[3] = amd_bytealign_S (w3[2], w3[3], offset); c1[2] = amd_bytealign_S (w3[1], w3[2], offset); c1[1] = amd_bytealign_S (w3[0], w3[1], offset); c1[0] = amd_bytealign_S (w2[3], w3[0], offset); c0[3] = amd_bytealign_S (w2[2], w2[3], offset); c0[2] = amd_bytealign_S (w2[1], w2[2], offset); c0[1] = amd_bytealign_S (w2[0], w2[1], offset); c0[0] = amd_bytealign_S (w1[3], w2[0], offset); w3[3] = amd_bytealign_S (w1[2], w1[3], offset); w3[2] = amd_bytealign_S (w1[1], w1[2], offset); w3[1] = amd_bytealign_S (w1[0], w1[1], offset); w3[0] = amd_bytealign_S (w0[3], w1[0], offset); w2[3] = amd_bytealign_S (w0[2], w0[3], offset); w2[2] = amd_bytealign_S (w0[1], w0[2], offset); w2[1] = amd_bytealign_S (w0[0], w0[1], offset); w2[0] = amd_bytealign_S ( 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: c2[1] = amd_bytealign_S (w3[3], 0, offset); c2[0] = amd_bytealign_S (w3[2], w3[3], offset); c1[3] = amd_bytealign_S (w3[1], w3[2], offset); c1[2] = amd_bytealign_S (w3[0], w3[1], offset); c1[1] = amd_bytealign_S (w2[3], w3[0], offset); c1[0] = amd_bytealign_S (w2[2], w2[3], offset); c0[3] = amd_bytealign_S (w2[1], w2[2], offset); c0[2] = amd_bytealign_S (w2[0], w2[1], offset); c0[1] = amd_bytealign_S (w1[3], w2[0], offset); c0[0] = amd_bytealign_S (w1[2], w1[3], offset); w3[3] = amd_bytealign_S (w1[1], w1[2], offset); w3[2] = amd_bytealign_S (w1[0], w1[1], offset); w3[1] = amd_bytealign_S (w0[3], w1[0], offset); w3[0] = amd_bytealign_S (w0[2], w0[3], offset); w2[3] = amd_bytealign_S (w0[1], w0[2], offset); w2[2] = amd_bytealign_S (w0[0], w0[1], offset); w2[1] = amd_bytealign_S ( 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: c2[2] = amd_bytealign_S (w3[3], 0, offset); c2[1] = amd_bytealign_S (w3[2], w3[3], offset); c2[0] = amd_bytealign_S (w3[1], w3[2], offset); c1[3] = amd_bytealign_S (w3[0], w3[1], offset); c1[2] = amd_bytealign_S (w2[3], w3[0], offset); c1[1] = amd_bytealign_S (w2[2], w2[3], offset); c1[0] = amd_bytealign_S (w2[1], w2[2], offset); c0[3] = amd_bytealign_S (w2[0], w2[1], offset); c0[2] = amd_bytealign_S (w1[3], w2[0], offset); c0[1] = amd_bytealign_S (w1[2], w1[3], offset); c0[0] = amd_bytealign_S (w1[1], w1[2], offset); w3[3] = amd_bytealign_S (w1[0], w1[1], offset); w3[2] = amd_bytealign_S (w0[3], w1[0], offset); w3[1] = amd_bytealign_S (w0[2], w0[3], offset); w3[0] = amd_bytealign_S (w0[1], w0[2], offset); w2[3] = amd_bytealign_S (w0[0], w0[1], offset); w2[2] = amd_bytealign_S ( 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: c2[3] = amd_bytealign_S (w3[3], 0, offset); c2[2] = amd_bytealign_S (w3[2], w3[3], offset); c2[1] = amd_bytealign_S (w3[1], w3[2], offset); c2[0] = amd_bytealign_S (w3[0], w3[1], offset); c1[3] = amd_bytealign_S (w2[3], w3[0], offset); c1[2] = amd_bytealign_S (w2[2], w2[3], offset); c1[1] = amd_bytealign_S (w2[1], w2[2], offset); c1[0] = amd_bytealign_S (w2[0], w2[1], offset); c0[3] = amd_bytealign_S (w1[3], w2[0], offset); c0[2] = amd_bytealign_S (w1[2], w1[3], offset); c0[1] = amd_bytealign_S (w1[1], w1[2], offset); c0[0] = amd_bytealign_S (w1[0], w1[1], offset); w3[3] = amd_bytealign_S (w0[3], w1[0], offset); w3[2] = amd_bytealign_S (w0[2], w0[3], offset); w3[1] = amd_bytealign_S (w0[1], w0[2], offset); w3[0] = amd_bytealign_S (w0[0], w0[1], offset); w2[3] = amd_bytealign_S ( 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: c3[0] = amd_bytealign_S (w3[3], 0, offset); c2[3] = amd_bytealign_S (w3[2], w3[3], offset); c2[2] = amd_bytealign_S (w3[1], w3[2], offset); c2[1] = amd_bytealign_S (w3[0], w3[1], offset); c2[0] = amd_bytealign_S (w2[3], w3[0], offset); c1[3] = amd_bytealign_S (w2[2], w2[3], offset); c1[2] = amd_bytealign_S (w2[1], w2[2], offset); c1[1] = amd_bytealign_S (w2[0], w2[1], offset); c1[0] = amd_bytealign_S (w1[3], w2[0], offset); c0[3] = amd_bytealign_S (w1[2], w1[3], offset); c0[2] = amd_bytealign_S (w1[1], w1[2], offset); c0[1] = amd_bytealign_S (w1[0], w1[1], offset); c0[0] = amd_bytealign_S (w0[3], w1[0], offset); w3[3] = amd_bytealign_S (w0[2], w0[3], offset); w3[2] = amd_bytealign_S (w0[1], w0[2], offset); w3[1] = amd_bytealign_S (w0[0], w0[1], offset); w3[0] = amd_bytealign_S ( 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: c3[1] = amd_bytealign_S (w3[3], 0, offset); c3[0] = amd_bytealign_S (w3[2], w3[3], offset); c2[3] = amd_bytealign_S (w3[1], w3[2], offset); c2[2] = amd_bytealign_S (w3[0], w3[1], offset); c2[1] = amd_bytealign_S (w2[3], w3[0], offset); c2[0] = amd_bytealign_S (w2[2], w2[3], offset); c1[3] = amd_bytealign_S (w2[1], w2[2], offset); c1[2] = amd_bytealign_S (w2[0], w2[1], offset); c1[1] = amd_bytealign_S (w1[3], w2[0], offset); c1[0] = amd_bytealign_S (w1[2], w1[3], offset); c0[3] = amd_bytealign_S (w1[1], w1[2], offset); c0[2] = amd_bytealign_S (w1[0], w1[1], offset); c0[1] = amd_bytealign_S (w0[3], w1[0], offset); c0[0] = amd_bytealign_S (w0[2], w0[3], offset); w3[3] = amd_bytealign_S (w0[1], w0[2], offset); w3[2] = amd_bytealign_S (w0[0], w0[1], offset); w3[1] = amd_bytealign_S ( 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; case 14: c3[2] = amd_bytealign_S (w3[3], 0, offset); c3[1] = amd_bytealign_S (w3[2], w3[3], offset); c3[0] = amd_bytealign_S (w3[1], w3[2], offset); c2[3] = amd_bytealign_S (w3[0], w3[1], offset); c2[2] = amd_bytealign_S (w2[3], w3[0], offset); c2[1] = amd_bytealign_S (w2[2], w2[3], offset); c2[0] = amd_bytealign_S (w2[1], w2[2], offset); c1[3] = amd_bytealign_S (w2[0], w2[1], offset); c1[2] = amd_bytealign_S (w1[3], w2[0], offset); c1[1] = amd_bytealign_S (w1[2], w1[3], offset); c1[0] = amd_bytealign_S (w1[1], w1[2], offset); c0[3] = amd_bytealign_S (w1[0], w1[1], offset); c0[2] = amd_bytealign_S (w0[3], w1[0], offset); c0[1] = amd_bytealign_S (w0[2], w0[3], offset); c0[0] = amd_bytealign_S (w0[1], w0[2], offset); w3[3] = amd_bytealign_S (w0[0], w0[1], offset); w3[2] = amd_bytealign_S ( 0, w0[0], offset); w3[1] = 0; 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; case 15: c3[3] = amd_bytealign_S (w3[3], 0, offset); c3[2] = amd_bytealign_S (w3[2], w3[3], offset); c3[1] = amd_bytealign_S (w3[1], w3[2], offset); c3[0] = amd_bytealign_S (w3[0], w3[1], offset); c2[3] = amd_bytealign_S (w2[3], w3[0], offset); c2[2] = amd_bytealign_S (w2[2], w2[3], offset); c2[1] = amd_bytealign_S (w2[1], w2[2], offset); c2[0] = amd_bytealign_S (w2[0], w2[1], offset); c1[3] = amd_bytealign_S (w1[3], w2[0], offset); c1[2] = amd_bytealign_S (w1[2], w1[3], offset); c1[1] = amd_bytealign_S (w1[1], w1[2], offset); c1[0] = amd_bytealign_S (w1[0], w1[1], offset); c0[3] = amd_bytealign_S (w0[3], w1[0], offset); c0[2] = amd_bytealign_S (w0[2], w0[3], offset); c0[1] = amd_bytealign_S (w0[1], w0[2], offset); c0[0] = amd_bytealign_S (w0[0], w0[1], offset); w3[3] = amd_bytealign_S ( 0, w0[0], offset); w3[2] = 0; w3[1] = 0; 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 #if (defined IS_AMD && AMD_GCN >= 3) || defined IS_NV #if defined IS_NV const int selector = (0x76543210 >> ((offset & 3) * 4)) & 0xffff; #endif #if defined IS_AMD const int selector = 0x0706050403020100 >> ((offset & 3) * 8); #endif switch (offset_switch) { case 0: c0[0] = __byte_perm_S ( 0, w3[3], selector); w3[3] = __byte_perm_S (w3[3], w3[2], selector); w3[2] = __byte_perm_S (w3[2], w3[1], selector); w3[1] = __byte_perm_S (w3[1], w3[0], selector); w3[0] = __byte_perm_S (w3[0], w2[3], selector); w2[3] = __byte_perm_S (w2[3], w2[2], selector); w2[2] = __byte_perm_S (w2[2], w2[1], selector); w2[1] = __byte_perm_S (w2[1], w2[0], selector); w2[0] = __byte_perm_S (w2[0], w1[3], selector); w1[3] = __byte_perm_S (w1[3], w1[2], selector); w1[2] = __byte_perm_S (w1[2], w1[1], selector); w1[1] = __byte_perm_S (w1[1], w1[0], selector); w1[0] = __byte_perm_S (w1[0], w0[3], selector); w0[3] = __byte_perm_S (w0[3], w0[2], selector); w0[2] = __byte_perm_S (w0[2], w0[1], selector); w0[1] = __byte_perm_S (w0[1], w0[0], selector); w0[0] = __byte_perm_S (w0[0], 0, selector); break; case 1: c0[1] = __byte_perm_S ( 0, w3[3], selector); c0[0] = __byte_perm_S (w3[3], w3[2], selector); w3[3] = __byte_perm_S (w3[2], w3[1], selector); w3[2] = __byte_perm_S (w3[1], w3[0], selector); w3[1] = __byte_perm_S (w3[0], w2[3], selector); w3[0] = __byte_perm_S (w2[3], w2[2], selector); w2[3] = __byte_perm_S (w2[2], w2[1], selector); w2[2] = __byte_perm_S (w2[1], w2[0], selector); w2[1] = __byte_perm_S (w2[0], w1[3], selector); w2[0] = __byte_perm_S (w1[3], w1[2], selector); w1[3] = __byte_perm_S (w1[2], w1[1], selector); w1[2] = __byte_perm_S (w1[1], w1[0], selector); w1[1] = __byte_perm_S (w1[0], w0[3], selector); w1[0] = __byte_perm_S (w0[3], w0[2], selector); w0[3] = __byte_perm_S (w0[2], w0[1], selector); w0[2] = __byte_perm_S (w0[1], w0[0], selector); w0[1] = __byte_perm_S (w0[0], 0, selector); w0[0] = 0; break; case 2: c0[2] = __byte_perm_S ( 0, w3[3], selector); c0[1] = __byte_perm_S (w3[3], w3[2], selector); c0[0] = __byte_perm_S (w3[2], w3[1], selector); w3[3] = __byte_perm_S (w3[1], w3[0], selector); w3[2] = __byte_perm_S (w3[0], w2[3], selector); w3[1] = __byte_perm_S (w2[3], w2[2], selector); w3[0] = __byte_perm_S (w2[2], w2[1], selector); w2[3] = __byte_perm_S (w2[1], w2[0], selector); w2[2] = __byte_perm_S (w2[0], w1[3], selector); w2[1] = __byte_perm_S (w1[3], w1[2], selector); w2[0] = __byte_perm_S (w1[2], w1[1], selector); w1[3] = __byte_perm_S (w1[1], w1[0], selector); w1[2] = __byte_perm_S (w1[0], w0[3], selector); w1[1] = __byte_perm_S (w0[3], w0[2], selector); w1[0] = __byte_perm_S (w0[2], w0[1], selector); w0[3] = __byte_perm_S (w0[1], w0[0], selector); w0[2] = __byte_perm_S (w0[0], 0, selector); w0[1] = 0; w0[0] = 0; break; case 3: c0[3] = __byte_perm_S ( 0, w3[3], selector); c0[2] = __byte_perm_S (w3[3], w3[2], selector); c0[1] = __byte_perm_S (w3[2], w3[1], selector); c0[0] = __byte_perm_S (w3[1], w3[0], selector); w3[3] = __byte_perm_S (w3[0], w2[3], selector); w3[2] = __byte_perm_S (w2[3], w2[2], selector); w3[1] = __byte_perm_S (w2[2], w2[1], selector); w3[0] = __byte_perm_S (w2[1], w2[0], selector); w2[3] = __byte_perm_S (w2[0], w1[3], selector); w2[2] = __byte_perm_S (w1[3], w1[2], selector); w2[1] = __byte_perm_S (w1[2], w1[1], selector); w2[0] = __byte_perm_S (w1[1], w1[0], selector); w1[3] = __byte_perm_S (w1[0], w0[3], selector); w1[2] = __byte_perm_S (w0[3], w0[2], selector); w1[1] = __byte_perm_S (w0[2], w0[1], selector); w1[0] = __byte_perm_S (w0[1], w0[0], selector); w0[3] = __byte_perm_S (w0[0], 0, selector); w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 4: c1[0] = __byte_perm_S ( 0, w3[3], selector); c0[3] = __byte_perm_S (w3[3], w3[2], selector); c0[2] = __byte_perm_S (w3[2], w3[1], selector); c0[1] = __byte_perm_S (w3[1], w3[0], selector); c0[0] = __byte_perm_S (w3[0], w2[3], selector); w3[3] = __byte_perm_S (w2[3], w2[2], selector); w3[2] = __byte_perm_S (w2[2], w2[1], selector); w3[1] = __byte_perm_S (w2[1], w2[0], selector); w3[0] = __byte_perm_S (w2[0], w1[3], selector); w2[3] = __byte_perm_S (w1[3], w1[2], selector); w2[2] = __byte_perm_S (w1[2], w1[1], selector); w2[1] = __byte_perm_S (w1[1], w1[0], selector); w2[0] = __byte_perm_S (w1[0], w0[3], selector); w1[3] = __byte_perm_S (w0[3], w0[2], selector); w1[2] = __byte_perm_S (w0[2], w0[1], selector); w1[1] = __byte_perm_S (w0[1], w0[0], selector); w1[0] = __byte_perm_S (w0[0], 0, selector); w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 5: c1[1] = __byte_perm_S ( 0, w3[3], selector); c1[0] = __byte_perm_S (w3[3], w3[2], selector); c0[3] = __byte_perm_S (w3[2], w3[1], selector); c0[2] = __byte_perm_S (w3[1], w3[0], selector); c0[1] = __byte_perm_S (w3[0], w2[3], selector); c0[0] = __byte_perm_S (w2[3], w2[2], selector); w3[3] = __byte_perm_S (w2[2], w2[1], selector); w3[2] = __byte_perm_S (w2[1], w2[0], selector); w3[1] = __byte_perm_S (w2[0], w1[3], selector); w3[0] = __byte_perm_S (w1[3], w1[2], selector); w2[3] = __byte_perm_S (w1[2], w1[1], selector); w2[2] = __byte_perm_S (w1[1], w1[0], selector); w2[1] = __byte_perm_S (w1[0], w0[3], selector); w2[0] = __byte_perm_S (w0[3], w0[2], selector); w1[3] = __byte_perm_S (w0[2], w0[1], selector); w1[2] = __byte_perm_S (w0[1], w0[0], selector); w1[1] = __byte_perm_S (w0[0], 0, selector); w1[0] = 0; w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 6: c1[2] = __byte_perm_S ( 0, w3[3], selector); c1[1] = __byte_perm_S (w3[3], w3[2], selector); c1[0] = __byte_perm_S (w3[2], w3[1], selector); c0[3] = __byte_perm_S (w3[1], w3[0], selector); c0[2] = __byte_perm_S (w3[0], w2[3], selector); c0[1] = __byte_perm_S (w2[3], w2[2], selector); c0[0] = __byte_perm_S (w2[2], w2[1], selector); w3[3] = __byte_perm_S (w2[1], w2[0], selector); w3[2] = __byte_perm_S (w2[0], w1[3], selector); w3[1] = __byte_perm_S (w1[3], w1[2], selector); w3[0] = __byte_perm_S (w1[2], w1[1], selector); w2[3] = __byte_perm_S (w1[1], w1[0], selector); w2[2] = __byte_perm_S (w1[0], w0[3], selector); w2[1] = __byte_perm_S (w0[3], w0[2], selector); w2[0] = __byte_perm_S (w0[2], w0[1], selector); w1[3] = __byte_perm_S (w0[1], w0[0], selector); w1[2] = __byte_perm_S (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: c1[3] = __byte_perm_S ( 0, w3[3], selector); c1[2] = __byte_perm_S (w3[3], w3[2], selector); c1[1] = __byte_perm_S (w3[2], w3[1], selector); c1[0] = __byte_perm_S (w3[1], w3[0], selector); c0[3] = __byte_perm_S (w3[0], w2[3], selector); c0[2] = __byte_perm_S (w2[3], w2[2], selector); c0[1] = __byte_perm_S (w2[2], w2[1], selector); c0[0] = __byte_perm_S (w2[1], w2[0], selector); w3[3] = __byte_perm_S (w2[0], w1[3], selector); w3[2] = __byte_perm_S (w1[3], w1[2], selector); w3[1] = __byte_perm_S (w1[2], w1[1], selector); w3[0] = __byte_perm_S (w1[1], w1[0], selector); w2[3] = __byte_perm_S (w1[0], w0[3], selector); w2[2] = __byte_perm_S (w0[3], w0[2], selector); w2[1] = __byte_perm_S (w0[2], w0[1], selector); w2[0] = __byte_perm_S (w0[1], w0[0], selector); w1[3] = __byte_perm_S (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: c2[0] = __byte_perm_S ( 0, w3[3], selector); c1[3] = __byte_perm_S (w3[3], w3[2], selector); c1[2] = __byte_perm_S (w3[2], w3[1], selector); c1[1] = __byte_perm_S (w3[1], w3[0], selector); c1[0] = __byte_perm_S (w3[0], w2[3], selector); c0[3] = __byte_perm_S (w2[3], w2[2], selector); c0[2] = __byte_perm_S (w2[2], w2[1], selector); c0[1] = __byte_perm_S (w2[1], w2[0], selector); c0[0] = __byte_perm_S (w2[0], w1[3], selector); w3[3] = __byte_perm_S (w1[3], w1[2], selector); w3[2] = __byte_perm_S (w1[2], w1[1], selector); w3[1] = __byte_perm_S (w1[1], w1[0], selector); w3[0] = __byte_perm_S (w1[0], w0[3], selector); w2[3] = __byte_perm_S (w0[3], w0[2], selector); w2[2] = __byte_perm_S (w0[2], w0[1], selector); w2[1] = __byte_perm_S (w0[1], w0[0], selector); w2[0] = __byte_perm_S (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: c2[1] = __byte_perm_S ( 0, w3[3], selector); c2[0] = __byte_perm_S (w3[3], w3[2], selector); c1[3] = __byte_perm_S (w3[2], w3[1], selector); c1[2] = __byte_perm_S (w3[1], w3[0], selector); c1[1] = __byte_perm_S (w3[0], w2[3], selector); c1[0] = __byte_perm_S (w2[3], w2[2], selector); c0[3] = __byte_perm_S (w2[2], w2[1], selector); c0[2] = __byte_perm_S (w2[1], w2[0], selector); c0[1] = __byte_perm_S (w2[0], w1[3], selector); c0[0] = __byte_perm_S (w1[3], w1[2], selector); w3[3] = __byte_perm_S (w1[2], w1[1], selector); w3[2] = __byte_perm_S (w1[1], w1[0], selector); w3[1] = __byte_perm_S (w1[0], w0[3], selector); w3[0] = __byte_perm_S (w0[3], w0[2], selector); w2[3] = __byte_perm_S (w0[2], w0[1], selector); w2[2] = __byte_perm_S (w0[1], w0[0], selector); w2[1] = __byte_perm_S (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: c2[2] = __byte_perm_S ( 0, w3[3], selector); c2[1] = __byte_perm_S (w3[3], w3[2], selector); c2[0] = __byte_perm_S (w3[2], w3[1], selector); c1[3] = __byte_perm_S (w3[1], w3[0], selector); c1[2] = __byte_perm_S (w3[0], w2[3], selector); c1[1] = __byte_perm_S (w2[3], w2[2], selector); c1[0] = __byte_perm_S (w2[2], w2[1], selector); c0[3] = __byte_perm_S (w2[1], w2[0], selector); c0[2] = __byte_perm_S (w2[0], w1[3], selector); c0[1] = __byte_perm_S (w1[3], w1[2], selector); c0[0] = __byte_perm_S (w1[2], w1[1], selector); w3[3] = __byte_perm_S (w1[1], w1[0], selector); w3[2] = __byte_perm_S (w1[0], w0[3], selector); w3[1] = __byte_perm_S (w0[3], w0[2], selector); w3[0] = __byte_perm_S (w0[2], w0[1], selector); w2[3] = __byte_perm_S (w0[1], w0[0], selector); w2[2] = __byte_perm_S (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: c2[3] = __byte_perm_S ( 0, w3[3], selector); c2[2] = __byte_perm_S (w3[3], w3[2], selector); c2[1] = __byte_perm_S (w3[2], w3[1], selector); c2[0] = __byte_perm_S (w3[1], w3[0], selector); c1[3] = __byte_perm_S (w3[0], w2[3], selector); c1[2] = __byte_perm_S (w2[3], w2[2], selector); c1[1] = __byte_perm_S (w2[2], w2[1], selector); c1[0] = __byte_perm_S (w2[1], w2[0], selector); c0[3] = __byte_perm_S (w2[0], w1[3], selector); c0[2] = __byte_perm_S (w1[3], w1[2], selector); c0[1] = __byte_perm_S (w1[2], w1[1], selector); c0[0] = __byte_perm_S (w1[1], w1[0], selector); w3[3] = __byte_perm_S (w1[0], w0[3], selector); w3[2] = __byte_perm_S (w0[3], w0[2], selector); w3[1] = __byte_perm_S (w0[2], w0[1], selector); w3[0] = __byte_perm_S (w0[1], w0[0], selector); w2[3] = __byte_perm_S (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: c3[0] = __byte_perm_S ( 0, w3[3], selector); c2[3] = __byte_perm_S (w3[3], w3[2], selector); c2[2] = __byte_perm_S (w3[2], w3[1], selector); c2[1] = __byte_perm_S (w3[1], w3[0], selector); c2[0] = __byte_perm_S (w3[0], w2[3], selector); c1[3] = __byte_perm_S (w2[3], w2[2], selector); c1[2] = __byte_perm_S (w2[2], w2[1], selector); c1[1] = __byte_perm_S (w2[1], w2[0], selector); c1[0] = __byte_perm_S (w2[0], w1[3], selector); c0[3] = __byte_perm_S (w1[3], w1[2], selector); c0[2] = __byte_perm_S (w1[2], w1[1], selector); c0[1] = __byte_perm_S (w1[1], w1[0], selector); c0[0] = __byte_perm_S (w1[0], w0[3], selector); w3[3] = __byte_perm_S (w0[3], w0[2], selector); w3[2] = __byte_perm_S (w0[2], w0[1], selector); w3[1] = __byte_perm_S (w0[1], w0[0], selector); w3[0] = __byte_perm_S (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: c3[1] = __byte_perm_S ( 0, w3[3], selector); c3[0] = __byte_perm_S (w3[3], w3[2], selector); c2[3] = __byte_perm_S (w3[2], w3[1], selector); c2[2] = __byte_perm_S (w3[1], w3[0], selector); c2[1] = __byte_perm_S (w3[0], w2[3], selector); c2[0] = __byte_perm_S (w2[3], w2[2], selector); c1[3] = __byte_perm_S (w2[2], w2[1], selector); c1[2] = __byte_perm_S (w2[1], w2[0], selector); c1[1] = __byte_perm_S (w2[0], w1[3], selector); c1[0] = __byte_perm_S (w1[3], w1[2], selector); c0[3] = __byte_perm_S (w1[2], w1[1], selector); c0[2] = __byte_perm_S (w1[1], w1[0], selector); c0[1] = __byte_perm_S (w1[0], w0[3], selector); c0[0] = __byte_perm_S (w0[3], w0[2], selector); w3[3] = __byte_perm_S (w0[2], w0[1], selector); w3[2] = __byte_perm_S (w0[1], w0[0], selector); w3[1] = __byte_perm_S (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; case 14: c3[2] = __byte_perm_S ( 0, w3[3], selector); c3[1] = __byte_perm_S (w3[3], w3[2], selector); c3[0] = __byte_perm_S (w3[2], w3[1], selector); c2[3] = __byte_perm_S (w3[1], w3[0], selector); c2[2] = __byte_perm_S (w3[0], w2[3], selector); c2[1] = __byte_perm_S (w2[3], w2[2], selector); c2[0] = __byte_perm_S (w2[2], w2[1], selector); c1[3] = __byte_perm_S (w2[1], w2[0], selector); c1[2] = __byte_perm_S (w2[0], w1[3], selector); c1[1] = __byte_perm_S (w1[3], w1[2], selector); c1[0] = __byte_perm_S (w1[2], w1[1], selector); c0[3] = __byte_perm_S (w1[1], w1[0], selector); c0[2] = __byte_perm_S (w1[0], w0[3], selector); c0[1] = __byte_perm_S (w0[3], w0[2], selector); c0[0] = __byte_perm_S (w0[2], w0[1], selector); w3[3] = __byte_perm_S (w0[1], w0[0], selector); w3[2] = __byte_perm_S (w0[0], 0, selector); w3[1] = 0; 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; case 15: c3[3] = __byte_perm_S ( 0, w3[3], selector); c3[2] = __byte_perm_S (w3[3], w3[2], selector); c3[1] = __byte_perm_S (w3[2], w3[1], selector); c3[0] = __byte_perm_S (w3[1], w3[0], selector); c2[3] = __byte_perm_S (w3[0], w2[3], selector); c2[2] = __byte_perm_S (w2[3], w2[2], selector); c2[1] = __byte_perm_S (w2[2], w2[1], selector); c2[0] = __byte_perm_S (w2[1], w2[0], selector); c1[3] = __byte_perm_S (w2[0], w1[3], selector); c1[2] = __byte_perm_S (w1[3], w1[2], selector); c1[1] = __byte_perm_S (w1[2], w1[1], selector); c1[0] = __byte_perm_S (w1[1], w1[0], selector); c0[3] = __byte_perm_S (w1[0], w0[3], selector); c0[2] = __byte_perm_S (w0[3], w0[2], selector); c0[1] = __byte_perm_S (w0[2], w0[1], selector); c0[0] = __byte_perm_S (w0[1], w0[0], selector); w3[3] = __byte_perm_S (w0[0], 0, selector); w3[2] = 0; w3[1] = 0; 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 } void switch_buffer_by_offset_8x4_le_S (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) { const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if (defined IS_AMD && AMD_GCN < 3) || defined IS_GENERIC w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); switch (offset_switch) { case 0: w7[3] = amd_bytealign_S (w7[2], w7[3], offset); w7[2] = amd_bytealign_S (w7[1], w7[2], offset); w7[1] = amd_bytealign_S (w7[0], w7[1], offset); w7[0] = amd_bytealign_S (w6[3], w7[0], offset); w6[3] = amd_bytealign_S (w6[2], w6[3], offset); w6[2] = amd_bytealign_S (w6[1], w6[2], offset); w6[1] = amd_bytealign_S (w6[0], w6[1], offset); w6[0] = amd_bytealign_S (w5[3], w6[0], offset); w5[3] = amd_bytealign_S (w5[2], w5[3], offset); w5[2] = amd_bytealign_S (w5[1], w5[2], offset); w5[1] = amd_bytealign_S (w5[0], w5[1], offset); w5[0] = amd_bytealign_S (w4[3], w5[0], offset); w4[3] = amd_bytealign_S (w4[2], w4[3], offset); w4[2] = amd_bytealign_S (w4[1], w4[2], offset); w4[1] = amd_bytealign_S (w4[0], w4[1], offset); w4[0] = amd_bytealign_S (w3[3], w4[0], offset); w3[3] = amd_bytealign_S (w3[2], w3[3], offset); w3[2] = amd_bytealign_S (w3[1], w3[2], offset); w3[1] = amd_bytealign_S (w3[0], w3[1], offset); w3[0] = amd_bytealign_S (w2[3], w3[0], offset); w2[3] = amd_bytealign_S (w2[2], w2[3], offset); w2[2] = amd_bytealign_S (w2[1], w2[2], offset); w2[1] = amd_bytealign_S (w2[0], w2[1], offset); w2[0] = amd_bytealign_S (w1[3], w2[0], offset); w1[3] = amd_bytealign_S (w1[2], w1[3], offset); w1[2] = amd_bytealign_S (w1[1], w1[2], offset); w1[1] = amd_bytealign_S (w1[0], w1[1], offset); w1[0] = amd_bytealign_S (w0[3], w1[0], offset); w0[3] = amd_bytealign_S (w0[2], w0[3], offset); w0[2] = amd_bytealign_S (w0[1], w0[2], offset); w0[1] = amd_bytealign_S (w0[0], w0[1], offset); w0[0] = amd_bytealign_S ( 0, w0[0], offset); break; case 1: w7[3] = amd_bytealign_S (w7[1], w7[2], offset); w7[2] = amd_bytealign_S (w7[0], w7[1], offset); w7[1] = amd_bytealign_S (w6[3], w7[0], offset); w7[0] = amd_bytealign_S (w6[2], w6[3], offset); w6[3] = amd_bytealign_S (w6[1], w6[2], offset); w6[2] = amd_bytealign_S (w6[0], w6[1], offset); w6[1] = amd_bytealign_S (w5[3], w6[0], offset); w6[0] = amd_bytealign_S (w5[2], w5[3], offset); w5[3] = amd_bytealign_S (w5[1], w5[2], offset); w5[2] = amd_bytealign_S (w5[0], w5[1], offset); w5[1] = amd_bytealign_S (w4[3], w5[0], offset); w5[0] = amd_bytealign_S (w4[2], w4[3], offset); w4[3] = amd_bytealign_S (w4[1], w4[2], offset); w4[2] = amd_bytealign_S (w4[0], w4[1], offset); w4[1] = amd_bytealign_S (w3[3], w4[0], offset); w4[0] = amd_bytealign_S (w3[2], w3[3], offset); w3[3] = amd_bytealign_S (w3[1], w3[2], offset); w3[2] = amd_bytealign_S (w3[0], w3[1], offset); w3[1] = amd_bytealign_S (w2[3], w3[0], offset); w3[0] = amd_bytealign_S (w2[2], w2[3], offset); w2[3] = amd_bytealign_S (w2[1], w2[2], offset); w2[2] = amd_bytealign_S (w2[0], w2[1], offset); w2[1] = amd_bytealign_S (w1[3], w2[0], offset); w2[0] = amd_bytealign_S (w1[2], w1[3], offset); w1[3] = amd_bytealign_S (w1[1], w1[2], offset); w1[2] = amd_bytealign_S (w1[0], w1[1], offset); w1[1] = amd_bytealign_S (w0[3], w1[0], offset); w1[0] = amd_bytealign_S (w0[2], w0[3], offset); w0[3] = amd_bytealign_S (w0[1], w0[2], offset); w0[2] = amd_bytealign_S (w0[0], w0[1], offset); w0[1] = amd_bytealign_S ( 0, w0[0], offset); w0[0] = 0; break; case 2: w7[3] = amd_bytealign_S (w7[0], w7[1], offset); w7[2] = amd_bytealign_S (w6[3], w7[0], offset); w7[1] = amd_bytealign_S (w6[2], w6[3], offset); w7[0] = amd_bytealign_S (w6[1], w6[2], offset); w6[3] = amd_bytealign_S (w6[0], w6[1], offset); w6[2] = amd_bytealign_S (w5[3], w6[0], offset); w6[1] = amd_bytealign_S (w5[2], w5[3], offset); w6[0] = amd_bytealign_S (w5[1], w5[2], offset); w5[3] = amd_bytealign_S (w5[0], w5[1], offset); w5[2] = amd_bytealign_S (w4[3], w5[0], offset); w5[1] = amd_bytealign_S (w4[2], w4[3], offset); w5[0] = amd_bytealign_S (w4[1], w4[2], offset); w4[3] = amd_bytealign_S (w4[0], w4[1], offset); w4[2] = amd_bytealign_S (w3[3], w4[0], offset); w4[1] = amd_bytealign_S (w3[2], w3[3], offset); w4[0] = amd_bytealign_S (w3[1], w3[2], offset); w3[3] = amd_bytealign_S (w3[0], w3[1], offset); w3[2] = amd_bytealign_S (w2[3], w3[0], offset); w3[1] = amd_bytealign_S (w2[2], w2[3], offset); w3[0] = amd_bytealign_S (w2[1], w2[2], offset); w2[3] = amd_bytealign_S (w2[0], w2[1], offset); w2[2] = amd_bytealign_S (w1[3], w2[0], offset); w2[1] = amd_bytealign_S (w1[2], w1[3], offset); w2[0] = amd_bytealign_S (w1[1], w1[2], offset); w1[3] = amd_bytealign_S (w1[0], w1[1], offset); w1[2] = amd_bytealign_S (w0[3], w1[0], offset); w1[1] = amd_bytealign_S (w0[2], w0[3], offset); w1[0] = amd_bytealign_S (w0[1], w0[2], offset); w0[3] = amd_bytealign_S (w0[0], w0[1], offset); w0[2] = amd_bytealign_S ( 0, w0[0], offset); w0[1] = 0; w0[0] = 0; break; case 3: w7[3] = amd_bytealign_S (w6[3], w7[0], offset); w7[2] = amd_bytealign_S (w6[2], w6[3], offset); w7[1] = amd_bytealign_S (w6[1], w6[2], offset); w7[0] = amd_bytealign_S (w6[0], w6[1], offset); w6[3] = amd_bytealign_S (w5[3], w6[0], offset); w6[2] = amd_bytealign_S (w5[2], w5[3], offset); w6[1] = amd_bytealign_S (w5[1], w5[2], offset); w6[0] = amd_bytealign_S (w5[0], w5[1], offset); w5[3] = amd_bytealign_S (w4[3], w5[0], offset); w5[2] = amd_bytealign_S (w4[2], w4[3], offset); w5[1] = amd_bytealign_S (w4[1], w4[2], offset); w5[0] = amd_bytealign_S (w4[0], w4[1], offset); w4[3] = amd_bytealign_S (w3[3], w4[0], offset); w4[2] = amd_bytealign_S (w3[2], w3[3], offset); w4[1] = amd_bytealign_S (w3[1], w3[2], offset); w4[0] = amd_bytealign_S (w3[0], w3[1], offset); w3[3] = amd_bytealign_S (w2[3], w3[0], offset); w3[2] = amd_bytealign_S (w2[2], w2[3], offset); w3[1] = amd_bytealign_S (w2[1], w2[2], offset); w3[0] = amd_bytealign_S (w2[0], w2[1], offset); w2[3] = amd_bytealign_S (w1[3], w2[0], offset); w2[2] = amd_bytealign_S (w1[2], w1[3], offset); w2[1] = amd_bytealign_S (w1[1], w1[2], offset); w2[0] = amd_bytealign_S (w1[0], w1[1], offset); w1[3] = amd_bytealign_S (w0[3], w1[0], offset); w1[2] = amd_bytealign_S (w0[2], w0[3], offset); w1[1] = amd_bytealign_S (w0[1], w0[2], offset); w1[0] = amd_bytealign_S (w0[0], w0[1], offset); w0[3] = amd_bytealign_S ( 0, w0[0], offset); w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 4: w7[3] = amd_bytealign_S (w6[2], w6[3], offset); w7[2] = amd_bytealign_S (w6[1], w6[2], offset); w7[1] = amd_bytealign_S (w6[0], w6[1], offset); w7[0] = amd_bytealign_S (w5[3], w6[0], offset); w6[3] = amd_bytealign_S (w5[2], w5[3], offset); w6[2] = amd_bytealign_S (w5[1], w5[2], offset); w6[1] = amd_bytealign_S (w5[0], w5[1], offset); w6[0] = amd_bytealign_S (w4[3], w5[0], offset); w5[3] = amd_bytealign_S (w4[2], w4[3], offset); w5[2] = amd_bytealign_S (w4[1], w4[2], offset); w5[1] = amd_bytealign_S (w4[0], w4[1], offset); w5[0] = amd_bytealign_S (w3[3], w4[0], offset); w4[3] = amd_bytealign_S (w3[2], w3[3], offset); w4[2] = amd_bytealign_S (w3[1], w3[2], offset); w4[1] = amd_bytealign_S (w3[0], w3[1], offset); w4[0] = amd_bytealign_S (w2[3], w3[0], offset); w3[3] = amd_bytealign_S (w2[2], w2[3], offset); w3[2] = amd_bytealign_S (w2[1], w2[2], offset); w3[1] = amd_bytealign_S (w2[0], w2[1], offset); w3[0] = amd_bytealign_S (w1[3], w2[0], offset); w2[3] = amd_bytealign_S (w1[2], w1[3], offset); w2[2] = amd_bytealign_S (w1[1], w1[2], offset); w2[1] = amd_bytealign_S (w1[0], w1[1], offset); w2[0] = amd_bytealign_S (w0[3], w1[0], offset); w1[3] = amd_bytealign_S (w0[2], w0[3], offset); w1[2] = amd_bytealign_S (w0[1], w0[2], offset); w1[1] = amd_bytealign_S (w0[0], w0[1], offset); w1[0] = amd_bytealign_S ( 0, w0[0], offset); w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 5: w7[3] = amd_bytealign_S (w6[1], w6[2], offset); w7[2] = amd_bytealign_S (w6[0], w6[1], offset); w7[1] = amd_bytealign_S (w5[3], w6[0], offset); w7[0] = amd_bytealign_S (w5[2], w5[3], offset); w6[3] = amd_bytealign_S (w5[1], w5[2], offset); w6[2] = amd_bytealign_S (w5[0], w5[1], offset); w6[1] = amd_bytealign_S (w4[3], w5[0], offset); w6[0] = amd_bytealign_S (w4[2], w4[3], offset); w5[3] = amd_bytealign_S (w4[1], w4[2], offset); w5[2] = amd_bytealign_S (w4[0], w4[1], offset); w5[1] = amd_bytealign_S (w3[3], w4[0], offset); w5[0] = amd_bytealign_S (w3[2], w3[3], offset); w4[3] = amd_bytealign_S (w3[1], w3[2], offset); w4[2] = amd_bytealign_S (w3[0], w3[1], offset); w4[1] = amd_bytealign_S (w2[3], w3[0], offset); w4[0] = amd_bytealign_S (w2[2], w2[3], offset); w3[3] = amd_bytealign_S (w2[1], w2[2], offset); w3[2] = amd_bytealign_S (w2[0], w2[1], offset); w3[1] = amd_bytealign_S (w1[3], w2[0], offset); w3[0] = amd_bytealign_S (w1[2], w1[3], offset); w2[3] = amd_bytealign_S (w1[1], w1[2], offset); w2[2] = amd_bytealign_S (w1[0], w1[1], offset); w2[1] = amd_bytealign_S (w0[3], w1[0], offset); w2[0] = amd_bytealign_S (w0[2], w0[3], offset); w1[3] = amd_bytealign_S (w0[1], w0[2], offset); w1[2] = amd_bytealign_S (w0[0], w0[1], offset); w1[1] = amd_bytealign_S ( 0, w0[0], offset); w1[0] = 0; w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 6: w7[3] = amd_bytealign_S (w6[0], w6[1], offset); w7[2] = amd_bytealign_S (w5[3], w6[0], offset); w7[1] = amd_bytealign_S (w5[2], w5[3], offset); w7[0] = amd_bytealign_S (w5[1], w5[2], offset); w6[3] = amd_bytealign_S (w5[0], w5[1], offset); w6[2] = amd_bytealign_S (w4[3], w5[0], offset); w6[1] = amd_bytealign_S (w4[2], w4[3], offset); w6[0] = amd_bytealign_S (w4[1], w4[2], offset); w5[3] = amd_bytealign_S (w4[0], w4[1], offset); w5[2] = amd_bytealign_S (w3[3], w4[0], offset); w5[1] = amd_bytealign_S (w3[2], w3[3], offset); w5[0] = amd_bytealign_S (w3[1], w3[2], offset); w4[3] = amd_bytealign_S (w3[0], w3[1], offset); w4[2] = amd_bytealign_S (w2[3], w3[0], offset); w4[1] = amd_bytealign_S (w2[2], w2[3], offset); w4[0] = amd_bytealign_S (w2[1], w2[2], offset); w3[3] = amd_bytealign_S (w2[0], w2[1], offset); w3[2] = amd_bytealign_S (w1[3], w2[0], offset); w3[1] = amd_bytealign_S (w1[2], w1[3], offset); w3[0] = amd_bytealign_S (w1[1], w1[2], offset); w2[3] = amd_bytealign_S (w1[0], w1[1], offset); w2[2] = amd_bytealign_S (w0[3], w1[0], offset); w2[1] = amd_bytealign_S (w0[2], w0[3], offset); w2[0] = amd_bytealign_S (w0[1], w0[2], offset); w1[3] = amd_bytealign_S (w0[0], w0[1], offset); w1[2] = amd_bytealign_S ( 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: w7[3] = amd_bytealign_S (w5[3], w6[0], offset); w7[2] = amd_bytealign_S (w5[2], w5[3], offset); w7[1] = amd_bytealign_S (w5[1], w5[2], offset); w7[0] = amd_bytealign_S (w5[0], w5[1], offset); w6[3] = amd_bytealign_S (w4[3], w5[0], offset); w6[2] = amd_bytealign_S (w4[2], w4[3], offset); w6[1] = amd_bytealign_S (w4[1], w4[2], offset); w6[0] = amd_bytealign_S (w4[0], w4[1], offset); w5[3] = amd_bytealign_S (w3[3], w4[0], offset); w5[2] = amd_bytealign_S (w3[2], w3[3], offset); w5[1] = amd_bytealign_S (w3[1], w3[2], offset); w5[0] = amd_bytealign_S (w3[0], w3[1], offset); w4[3] = amd_bytealign_S (w2[3], w3[0], offset); w4[2] = amd_bytealign_S (w2[2], w2[3], offset); w4[1] = amd_bytealign_S (w2[1], w2[2], offset); w4[0] = amd_bytealign_S (w2[0], w2[1], offset); w3[3] = amd_bytealign_S (w1[3], w2[0], offset); w3[2] = amd_bytealign_S (w1[2], w1[3], offset); w3[1] = amd_bytealign_S (w1[1], w1[2], offset); w3[0] = amd_bytealign_S (w1[0], w1[1], offset); w2[3] = amd_bytealign_S (w0[3], w1[0], offset); w2[2] = amd_bytealign_S (w0[2], w0[3], offset); w2[1] = amd_bytealign_S (w0[1], w0[2], offset); w2[0] = amd_bytealign_S (w0[0], w0[1], offset); w1[3] = amd_bytealign_S ( 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: w7[3] = amd_bytealign_S (w5[2], w5[3], offset); w7[2] = amd_bytealign_S (w5[1], w5[2], offset); w7[1] = amd_bytealign_S (w5[0], w5[1], offset); w7[0] = amd_bytealign_S (w4[3], w5[0], offset); w6[3] = amd_bytealign_S (w4[2], w4[3], offset); w6[2] = amd_bytealign_S (w4[1], w4[2], offset); w6[1] = amd_bytealign_S (w4[0], w4[1], offset); w6[0] = amd_bytealign_S (w3[3], w4[0], offset); w5[3] = amd_bytealign_S (w3[2], w3[3], offset); w5[2] = amd_bytealign_S (w3[1], w3[2], offset); w5[1] = amd_bytealign_S (w3[0], w3[1], offset); w5[0] = amd_bytealign_S (w2[3], w3[0], offset); w4[3] = amd_bytealign_S (w2[2], w2[3], offset); w4[2] = amd_bytealign_S (w2[1], w2[2], offset); w4[1] = amd_bytealign_S (w2[0], w2[1], offset); w4[0] = amd_bytealign_S (w1[3], w2[0], offset); w3[3] = amd_bytealign_S (w1[2], w1[3], offset); w3[2] = amd_bytealign_S (w1[1], w1[2], offset); w3[1] = amd_bytealign_S (w1[0], w1[1], offset); w3[0] = amd_bytealign_S (w0[3], w1[0], offset); w2[3] = amd_bytealign_S (w0[2], w0[3], offset); w2[2] = amd_bytealign_S (w0[1], w0[2], offset); w2[1] = amd_bytealign_S (w0[0], w0[1], offset); w2[0] = amd_bytealign_S ( 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: w7[3] = amd_bytealign_S (w5[1], w5[2], offset); w7[2] = amd_bytealign_S (w5[0], w5[1], offset); w7[1] = amd_bytealign_S (w4[3], w5[0], offset); w7[0] = amd_bytealign_S (w4[2], w4[3], offset); w6[3] = amd_bytealign_S (w4[1], w4[2], offset); w6[2] = amd_bytealign_S (w4[0], w4[1], offset); w6[1] = amd_bytealign_S (w3[3], w4[0], offset); w6[0] = amd_bytealign_S (w3[2], w3[3], offset); w5[3] = amd_bytealign_S (w3[1], w3[2], offset); w5[2] = amd_bytealign_S (w3[0], w3[1], offset); w5[1] = amd_bytealign_S (w2[3], w3[0], offset); w5[0] = amd_bytealign_S (w2[2], w2[3], offset); w4[3] = amd_bytealign_S (w2[1], w2[2], offset); w4[2] = amd_bytealign_S (w2[0], w2[1], offset); w4[1] = amd_bytealign_S (w1[3], w2[0], offset); w4[0] = amd_bytealign_S (w1[2], w1[3], offset); w3[3] = amd_bytealign_S (w1[1], w1[2], offset); w3[2] = amd_bytealign_S (w1[0], w1[1], offset); w3[1] = amd_bytealign_S (w0[3], w1[0], offset); w3[0] = amd_bytealign_S (w0[2], w0[3], offset); w2[3] = amd_bytealign_S (w0[1], w0[2], offset); w2[2] = amd_bytealign_S (w0[0], w0[1], offset); w2[1] = amd_bytealign_S ( 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: w7[3] = amd_bytealign_S (w5[0], w5[1], offset); w7[2] = amd_bytealign_S (w4[3], w5[0], offset); w7[1] = amd_bytealign_S (w4[2], w4[3], offset); w7[0] = amd_bytealign_S (w4[1], w4[2], offset); w6[3] = amd_bytealign_S (w4[0], w4[1], offset); w6[2] = amd_bytealign_S (w3[3], w4[0], offset); w6[1] = amd_bytealign_S (w3[2], w3[3], offset); w6[0] = amd_bytealign_S (w3[1], w3[2], offset); w5[3] = amd_bytealign_S (w3[0], w3[1], offset); w5[2] = amd_bytealign_S (w2[3], w3[0], offset); w5[1] = amd_bytealign_S (w2[2], w2[3], offset); w5[0] = amd_bytealign_S (w2[1], w2[2], offset); w4[3] = amd_bytealign_S (w2[0], w2[1], offset); w4[2] = amd_bytealign_S (w1[3], w2[0], offset); w4[1] = amd_bytealign_S (w1[2], w1[3], offset); w4[0] = amd_bytealign_S (w1[1], w1[2], offset); w3[3] = amd_bytealign_S (w1[0], w1[1], offset); w3[2] = amd_bytealign_S (w0[3], w1[0], offset); w3[1] = amd_bytealign_S (w0[2], w0[3], offset); w3[0] = amd_bytealign_S (w0[1], w0[2], offset); w2[3] = amd_bytealign_S (w0[0], w0[1], offset); w2[2] = amd_bytealign_S ( 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: w7[3] = amd_bytealign_S (w4[3], w5[0], offset); w7[2] = amd_bytealign_S (w4[2], w4[3], offset); w7[1] = amd_bytealign_S (w4[1], w4[2], offset); w7[0] = amd_bytealign_S (w4[0], w4[1], offset); w6[3] = amd_bytealign_S (w3[3], w4[0], offset); w6[2] = amd_bytealign_S (w3[2], w3[3], offset); w6[1] = amd_bytealign_S (w3[1], w3[2], offset); w6[0] = amd_bytealign_S (w3[0], w3[1], offset); w5[3] = amd_bytealign_S (w2[3], w3[0], offset); w5[2] = amd_bytealign_S (w2[2], w2[3], offset); w5[1] = amd_bytealign_S (w2[1], w2[2], offset); w5[0] = amd_bytealign_S (w2[0], w2[1], offset); w4[3] = amd_bytealign_S (w1[3], w2[0], offset); w4[2] = amd_bytealign_S (w1[2], w1[3], offset); w4[1] = amd_bytealign_S (w1[1], w1[2], offset); w4[0] = amd_bytealign_S (w1[0], w1[1], offset); w3[3] = amd_bytealign_S (w0[3], w1[0], offset); w3[2] = amd_bytealign_S (w0[2], w0[3], offset); w3[1] = amd_bytealign_S (w0[1], w0[2], offset); w3[0] = amd_bytealign_S (w0[0], w0[1], offset); w2[3] = amd_bytealign_S ( 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: w7[3] = amd_bytealign_S (w4[2], w4[3], offset); w7[2] = amd_bytealign_S (w4[1], w4[2], offset); w7[1] = amd_bytealign_S (w4[0], w4[1], offset); w7[0] = amd_bytealign_S (w3[3], w4[0], offset); w6[3] = amd_bytealign_S (w3[2], w3[3], offset); w6[2] = amd_bytealign_S (w3[1], w3[2], offset); w6[1] = amd_bytealign_S (w3[0], w3[1], offset); w6[0] = amd_bytealign_S (w2[3], w3[0], offset); w5[3] = amd_bytealign_S (w2[2], w2[3], offset); w5[2] = amd_bytealign_S (w2[1], w2[2], offset); w5[1] = amd_bytealign_S (w2[0], w2[1], offset); w5[0] = amd_bytealign_S (w1[3], w2[0], offset); w4[3] = amd_bytealign_S (w1[2], w1[3], offset); w4[2] = amd_bytealign_S (w1[1], w1[2], offset); w4[1] = amd_bytealign_S (w1[0], w1[1], offset); w4[0] = amd_bytealign_S (w0[3], w1[0], offset); w3[3] = amd_bytealign_S (w0[2], w0[3], offset); w3[2] = amd_bytealign_S (w0[1], w0[2], offset); w3[1] = amd_bytealign_S (w0[0], w0[1], offset); w3[0] = amd_bytealign_S ( 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: w7[3] = amd_bytealign_S (w4[1], w4[2], offset); w7[2] = amd_bytealign_S (w4[0], w4[1], offset); w7[1] = amd_bytealign_S (w3[3], w4[0], offset); w7[0] = amd_bytealign_S (w3[2], w3[3], offset); w6[3] = amd_bytealign_S (w3[1], w3[2], offset); w6[2] = amd_bytealign_S (w3[0], w3[1], offset); w6[1] = amd_bytealign_S (w2[3], w3[0], offset); w6[0] = amd_bytealign_S (w2[2], w2[3], offset); w5[3] = amd_bytealign_S (w2[1], w2[2], offset); w5[2] = amd_bytealign_S (w2[0], w2[1], offset); w5[1] = amd_bytealign_S (w1[3], w2[0], offset); w5[0] = amd_bytealign_S (w1[2], w1[3], offset); w4[3] = amd_bytealign_S (w1[1], w1[2], offset); w4[2] = amd_bytealign_S (w1[0], w1[1], offset); w4[1] = amd_bytealign_S (w0[3], w1[0], offset); w4[0] = amd_bytealign_S (w0[2], w0[3], offset); w3[3] = amd_bytealign_S (w0[1], w0[2], offset); w3[2] = amd_bytealign_S (w0[0], w0[1], offset); w3[1] = amd_bytealign_S ( 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; case 14: w7[3] = amd_bytealign_S (w4[0], w4[1], offset); w7[2] = amd_bytealign_S (w3[3], w4[0], offset); w7[1] = amd_bytealign_S (w3[2], w3[3], offset); w7[0] = amd_bytealign_S (w3[1], w3[2], offset); w6[3] = amd_bytealign_S (w3[0], w3[1], offset); w6[2] = amd_bytealign_S (w2[3], w3[0], offset); w6[1] = amd_bytealign_S (w2[2], w2[3], offset); w6[0] = amd_bytealign_S (w2[1], w2[2], offset); w5[3] = amd_bytealign_S (w2[0], w2[1], offset); w5[2] = amd_bytealign_S (w1[3], w2[0], offset); w5[1] = amd_bytealign_S (w1[2], w1[3], offset); w5[0] = amd_bytealign_S (w1[1], w1[2], offset); w4[3] = amd_bytealign_S (w1[0], w1[1], offset); w4[2] = amd_bytealign_S (w0[3], w1[0], offset); w4[1] = amd_bytealign_S (w0[2], w0[3], offset); w4[0] = amd_bytealign_S (w0[1], w0[2], offset); w3[3] = amd_bytealign_S (w0[0], w0[1], offset); w3[2] = amd_bytealign_S ( 0, w0[0], offset); w3[1] = 0; 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; case 15: w7[3] = amd_bytealign_S (w3[3], w4[0], offset); w7[2] = amd_bytealign_S (w3[2], w3[3], offset); w7[1] = amd_bytealign_S (w3[1], w3[2], offset); w7[0] = amd_bytealign_S (w3[0], w3[1], offset); w6[3] = amd_bytealign_S (w2[3], w3[0], offset); w6[2] = amd_bytealign_S (w2[2], w2[3], offset); w6[1] = amd_bytealign_S (w2[1], w2[2], offset); w6[0] = amd_bytealign_S (w2[0], w2[1], offset); w5[3] = amd_bytealign_S (w1[3], w2[0], offset); w5[2] = amd_bytealign_S (w1[2], w1[3], offset); w5[1] = amd_bytealign_S (w1[1], w1[2], offset); w5[0] = amd_bytealign_S (w1[0], w1[1], offset); w4[3] = amd_bytealign_S (w0[3], w1[0], offset); w4[2] = amd_bytealign_S (w0[2], w0[3], offset); w4[1] = amd_bytealign_S (w0[1], w0[2], offset); w4[0] = amd_bytealign_S (w0[0], w0[1], offset); w3[3] = amd_bytealign_S ( 0, w0[0], offset); w3[2] = 0; w3[1] = 0; 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; case 16: w7[3] = amd_bytealign_S (w3[2], w3[3], offset); w7[2] = amd_bytealign_S (w3[1], w3[2], offset); w7[1] = amd_bytealign_S (w3[0], w3[1], offset); w7[0] = amd_bytealign_S (w2[3], w3[0], offset); w6[3] = amd_bytealign_S (w2[2], w2[3], offset); w6[2] = amd_bytealign_S (w2[1], w2[2], offset); w6[1] = amd_bytealign_S (w2[0], w2[1], offset); w6[0] = amd_bytealign_S (w1[3], w2[0], offset); w5[3] = amd_bytealign_S (w1[2], w1[3], offset); w5[2] = amd_bytealign_S (w1[1], w1[2], offset); w5[1] = amd_bytealign_S (w1[0], w1[1], offset); w5[0] = amd_bytealign_S (w0[3], w1[0], offset); w4[3] = amd_bytealign_S (w0[2], w0[3], offset); w4[2] = amd_bytealign_S (w0[1], w0[2], offset); w4[1] = amd_bytealign_S (w0[0], w0[1], offset); w4[0] = amd_bytealign_S ( 0, w0[0], offset); w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 17: w7[3] = amd_bytealign_S (w3[1], w3[2], offset); w7[2] = amd_bytealign_S (w3[0], w3[1], offset); w7[1] = amd_bytealign_S (w2[3], w3[0], offset); w7[0] = amd_bytealign_S (w2[2], w2[3], offset); w6[3] = amd_bytealign_S (w2[1], w2[2], offset); w6[2] = amd_bytealign_S (w2[0], w2[1], offset); w6[1] = amd_bytealign_S (w1[3], w2[0], offset); w6[0] = amd_bytealign_S (w1[2], w1[3], offset); w5[3] = amd_bytealign_S (w1[1], w1[2], offset); w5[2] = amd_bytealign_S (w1[0], w1[1], offset); w5[1] = amd_bytealign_S (w0[3], w1[0], offset); w5[0] = amd_bytealign_S (w0[2], w0[3], offset); w4[3] = amd_bytealign_S (w0[1], w0[2], offset); w4[2] = amd_bytealign_S (w0[0], w0[1], offset); w4[1] = amd_bytealign_S ( 0, w0[0], offset); w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 18: w7[3] = amd_bytealign_S (w3[0], w3[1], offset); w7[2] = amd_bytealign_S (w2[3], w3[0], offset); w7[1] = amd_bytealign_S (w2[2], w2[3], offset); w7[0] = amd_bytealign_S (w2[1], w2[2], offset); w6[3] = amd_bytealign_S (w2[0], w2[1], offset); w6[2] = amd_bytealign_S (w1[3], w2[0], offset); w6[1] = amd_bytealign_S (w1[2], w1[3], offset); w6[0] = amd_bytealign_S (w1[1], w1[2], offset); w5[3] = amd_bytealign_S (w1[0], w1[1], offset); w5[2] = amd_bytealign_S (w0[3], w1[0], offset); w5[1] = amd_bytealign_S (w0[2], w0[3], offset); w5[0] = amd_bytealign_S (w0[1], w0[2], offset); w4[3] = amd_bytealign_S (w0[0], w0[1], offset); w4[2] = amd_bytealign_S ( 0, w0[0], offset); w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 19: w7[3] = amd_bytealign_S (w2[3], w3[0], offset); w7[2] = amd_bytealign_S (w2[2], w2[3], offset); w7[1] = amd_bytealign_S (w2[1], w2[2], offset); w7[0] = amd_bytealign_S (w2[0], w2[1], offset); w6[3] = amd_bytealign_S (w1[3], w2[0], offset); w6[2] = amd_bytealign_S (w1[2], w1[3], offset); w6[1] = amd_bytealign_S (w1[1], w1[2], offset); w6[0] = amd_bytealign_S (w1[0], w1[1], offset); w5[3] = amd_bytealign_S (w0[3], w1[0], offset); w5[2] = amd_bytealign_S (w0[2], w0[3], offset); w5[1] = amd_bytealign_S (w0[1], w0[2], offset); w5[0] = amd_bytealign_S (w0[0], w0[1], offset); w4[3] = amd_bytealign_S ( 0, w0[0], offset); w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 20: w7[3] = amd_bytealign_S (w2[2], w2[3], offset); w7[2] = amd_bytealign_S (w2[1], w2[2], offset); w7[1] = amd_bytealign_S (w2[0], w2[1], offset); w7[0] = amd_bytealign_S (w1[3], w2[0], offset); w6[3] = amd_bytealign_S (w1[2], w1[3], offset); w6[2] = amd_bytealign_S (w1[1], w1[2], offset); w6[1] = amd_bytealign_S (w1[0], w1[1], offset); w6[0] = amd_bytealign_S (w0[3], w1[0], offset); w5[3] = amd_bytealign_S (w0[2], w0[3], offset); w5[2] = amd_bytealign_S (w0[1], w0[2], offset); w5[1] = amd_bytealign_S (w0[0], w0[1], offset); w5[0] = amd_bytealign_S ( 0, w0[0], offset); w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 21: w7[3] = amd_bytealign_S (w2[1], w2[2], offset); w7[2] = amd_bytealign_S (w2[0], w2[1], offset); w7[1] = amd_bytealign_S (w1[3], w2[0], offset); w7[0] = amd_bytealign_S (w1[2], w1[3], offset); w6[3] = amd_bytealign_S (w1[1], w1[2], offset); w6[2] = amd_bytealign_S (w1[0], w1[1], offset); w6[1] = amd_bytealign_S (w0[3], w1[0], offset); w6[0] = amd_bytealign_S (w0[2], w0[3], offset); w5[3] = amd_bytealign_S (w0[1], w0[2], offset); w5[2] = amd_bytealign_S (w0[0], w0[1], offset); w5[1] = amd_bytealign_S ( 0, w0[0], offset); w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 22: w7[3] = amd_bytealign_S (w2[0], w2[1], offset); w7[2] = amd_bytealign_S (w1[3], w2[0], offset); w7[1] = amd_bytealign_S (w1[2], w1[3], offset); w7[0] = amd_bytealign_S (w1[1], w1[2], offset); w6[3] = amd_bytealign_S (w1[0], w1[1], offset); w6[2] = amd_bytealign_S (w0[3], w1[0], offset); w6[1] = amd_bytealign_S (w0[2], w0[3], offset); w6[0] = amd_bytealign_S (w0[1], w0[2], offset); w5[3] = amd_bytealign_S (w0[0], w0[1], offset); w5[2] = amd_bytealign_S ( 0, w0[0], offset); w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 23: w7[3] = amd_bytealign_S (w1[3], w2[0], offset); w7[2] = amd_bytealign_S (w1[2], w1[3], offset); w7[1] = amd_bytealign_S (w1[1], w1[2], offset); w7[0] = amd_bytealign_S (w1[0], w1[1], offset); w6[3] = amd_bytealign_S (w0[3], w1[0], offset); w6[2] = amd_bytealign_S (w0[2], w0[3], offset); w6[1] = amd_bytealign_S (w0[1], w0[2], offset); w6[0] = amd_bytealign_S (w0[0], w0[1], offset); w5[3] = amd_bytealign_S ( 0, w0[0], offset); w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 24: w7[3] = amd_bytealign_S (w1[2], w1[3], offset); w7[2] = amd_bytealign_S (w1[1], w1[2], offset); w7[1] = amd_bytealign_S (w1[0], w1[1], offset); w7[0] = amd_bytealign_S (w0[3], w1[0], offset); w6[3] = amd_bytealign_S (w0[2], w0[3], offset); w6[2] = amd_bytealign_S (w0[1], w0[2], offset); w6[1] = amd_bytealign_S (w0[0], w0[1], offset); w6[0] = amd_bytealign_S ( 0, w0[0], offset); w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 25: w7[3] = amd_bytealign_S (w1[1], w1[2], offset); w7[2] = amd_bytealign_S (w1[0], w1[1], offset); w7[1] = amd_bytealign_S (w0[3], w1[0], offset); w7[0] = amd_bytealign_S (w0[2], w0[3], offset); w6[3] = amd_bytealign_S (w0[1], w0[2], offset); w6[2] = amd_bytealign_S (w0[0], w0[1], offset); w6[1] = amd_bytealign_S ( 0, w0[0], offset); w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 26: w7[3] = amd_bytealign_S (w1[0], w1[1], offset); w7[2] = amd_bytealign_S (w0[3], w1[0], offset); w7[1] = amd_bytealign_S (w0[2], w0[3], offset); w7[0] = amd_bytealign_S (w0[1], w0[2], offset); w6[3] = amd_bytealign_S (w0[0], w0[1], offset); w6[2] = amd_bytealign_S ( 0, w0[0], offset); w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 27: w7[3] = amd_bytealign_S (w0[3], w1[0], offset); w7[2] = amd_bytealign_S (w0[2], w0[3], offset); w7[1] = amd_bytealign_S (w0[1], w0[2], offset); w7[0] = amd_bytealign_S (w0[0], w0[1], offset); w6[3] = amd_bytealign_S ( 0, w0[0], offset); w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 28: w7[3] = amd_bytealign_S (w0[2], w0[3], offset); w7[2] = amd_bytealign_S (w0[1], w0[2], offset); w7[1] = amd_bytealign_S (w0[0], w0[1], offset); w7[0] = amd_bytealign_S ( 0, w0[0], offset); w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 29: w7[3] = amd_bytealign_S (w0[1], w0[2], offset); w7[2] = amd_bytealign_S (w0[0], w0[1], offset); w7[1] = amd_bytealign_S ( 0, w0[0], offset); w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 30: w7[3] = amd_bytealign_S (w0[0], w0[1], offset); w7[2] = amd_bytealign_S ( 0, w0[0], offset); w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 31: w7[3] = amd_bytealign_S ( 0, w0[0], offset); w7[2] = 0; w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; } w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); #endif #if (defined IS_AMD && AMD_GCN >= 3) || defined IS_NV #if defined IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; #endif #if defined IS_AMD const int selector = 0x0706050403020100 >> (offset_minus_4 * 8); #endif switch (offset_switch) { case 0: w7[3] = __byte_perm_S (w7[2], w7[3], selector); w7[2] = __byte_perm_S (w7[1], w7[2], selector); w7[1] = __byte_perm_S (w7[0], w7[1], selector); w7[0] = __byte_perm_S (w6[3], w7[0], selector); w6[3] = __byte_perm_S (w6[2], w6[3], selector); w6[2] = __byte_perm_S (w6[1], w6[2], selector); w6[1] = __byte_perm_S (w6[0], w6[1], selector); w6[0] = __byte_perm_S (w5[3], w6[0], selector); w5[3] = __byte_perm_S (w5[2], w5[3], selector); w5[2] = __byte_perm_S (w5[1], w5[2], selector); w5[1] = __byte_perm_S (w5[0], w5[1], selector); w5[0] = __byte_perm_S (w4[3], w5[0], selector); w4[3] = __byte_perm_S (w4[2], w4[3], selector); w4[2] = __byte_perm_S (w4[1], w4[2], selector); w4[1] = __byte_perm_S (w4[0], w4[1], selector); w4[0] = __byte_perm_S (w3[3], w4[0], selector); w3[3] = __byte_perm_S (w3[2], w3[3], selector); w3[2] = __byte_perm_S (w3[1], w3[2], selector); w3[1] = __byte_perm_S (w3[0], w3[1], selector); w3[0] = __byte_perm_S (w2[3], w3[0], selector); w2[3] = __byte_perm_S (w2[2], w2[3], selector); w2[2] = __byte_perm_S (w2[1], w2[2], selector); w2[1] = __byte_perm_S (w2[0], w2[1], selector); w2[0] = __byte_perm_S (w1[3], w2[0], selector); w1[3] = __byte_perm_S (w1[2], w1[3], selector); w1[2] = __byte_perm_S (w1[1], w1[2], selector); w1[1] = __byte_perm_S (w1[0], w1[1], selector); w1[0] = __byte_perm_S (w0[3], w1[0], selector); w0[3] = __byte_perm_S (w0[2], w0[3], selector); w0[2] = __byte_perm_S (w0[1], w0[2], selector); w0[1] = __byte_perm_S (w0[0], w0[1], selector); w0[0] = __byte_perm_S ( 0, w0[0], selector); break; case 1: w7[3] = __byte_perm_S (w7[1], w7[2], selector); w7[2] = __byte_perm_S (w7[0], w7[1], selector); w7[1] = __byte_perm_S (w6[3], w7[0], selector); w7[0] = __byte_perm_S (w6[2], w6[3], selector); w6[3] = __byte_perm_S (w6[1], w6[2], selector); w6[2] = __byte_perm_S (w6[0], w6[1], selector); w6[1] = __byte_perm_S (w5[3], w6[0], selector); w6[0] = __byte_perm_S (w5[2], w5[3], selector); w5[3] = __byte_perm_S (w5[1], w5[2], selector); w5[2] = __byte_perm_S (w5[0], w5[1], selector); w5[1] = __byte_perm_S (w4[3], w5[0], selector); w5[0] = __byte_perm_S (w4[2], w4[3], selector); w4[3] = __byte_perm_S (w4[1], w4[2], selector); w4[2] = __byte_perm_S (w4[0], w4[1], selector); w4[1] = __byte_perm_S (w3[3], w4[0], selector); w4[0] = __byte_perm_S (w3[2], w3[3], selector); w3[3] = __byte_perm_S (w3[1], w3[2], selector); w3[2] = __byte_perm_S (w3[0], w3[1], selector); w3[1] = __byte_perm_S (w2[3], w3[0], selector); w3[0] = __byte_perm_S (w2[2], w2[3], selector); w2[3] = __byte_perm_S (w2[1], w2[2], selector); w2[2] = __byte_perm_S (w2[0], w2[1], selector); w2[1] = __byte_perm_S (w1[3], w2[0], selector); w2[0] = __byte_perm_S (w1[2], w1[3], selector); w1[3] = __byte_perm_S (w1[1], w1[2], selector); w1[2] = __byte_perm_S (w1[0], w1[1], selector); w1[1] = __byte_perm_S (w0[3], w1[0], selector); w1[0] = __byte_perm_S (w0[2], w0[3], selector); w0[3] = __byte_perm_S (w0[1], w0[2], selector); w0[2] = __byte_perm_S (w0[0], w0[1], selector); w0[1] = __byte_perm_S ( 0, w0[0], selector); w0[0] = 0; break; case 2: w7[3] = __byte_perm_S (w7[0], w7[1], selector); w7[2] = __byte_perm_S (w6[3], w7[0], selector); w7[1] = __byte_perm_S (w6[2], w6[3], selector); w7[0] = __byte_perm_S (w6[1], w6[2], selector); w6[3] = __byte_perm_S (w6[0], w6[1], selector); w6[2] = __byte_perm_S (w5[3], w6[0], selector); w6[1] = __byte_perm_S (w5[2], w5[3], selector); w6[0] = __byte_perm_S (w5[1], w5[2], selector); w5[3] = __byte_perm_S (w5[0], w5[1], selector); w5[2] = __byte_perm_S (w4[3], w5[0], selector); w5[1] = __byte_perm_S (w4[2], w4[3], selector); w5[0] = __byte_perm_S (w4[1], w4[2], selector); w4[3] = __byte_perm_S (w4[0], w4[1], selector); w4[2] = __byte_perm_S (w3[3], w4[0], selector); w4[1] = __byte_perm_S (w3[2], w3[3], selector); w4[0] = __byte_perm_S (w3[1], w3[2], selector); w3[3] = __byte_perm_S (w3[0], w3[1], selector); w3[2] = __byte_perm_S (w2[3], w3[0], selector); w3[1] = __byte_perm_S (w2[2], w2[3], selector); w3[0] = __byte_perm_S (w2[1], w2[2], selector); w2[3] = __byte_perm_S (w2[0], w2[1], selector); w2[2] = __byte_perm_S (w1[3], w2[0], selector); w2[1] = __byte_perm_S (w1[2], w1[3], selector); w2[0] = __byte_perm_S (w1[1], w1[2], selector); w1[3] = __byte_perm_S (w1[0], w1[1], selector); w1[2] = __byte_perm_S (w0[3], w1[0], selector); w1[1] = __byte_perm_S (w0[2], w0[3], selector); w1[0] = __byte_perm_S (w0[1], w0[2], selector); w0[3] = __byte_perm_S (w0[0], w0[1], selector); w0[2] = __byte_perm_S ( 0, w0[0], selector); w0[1] = 0; w0[0] = 0; break; case 3: w7[3] = __byte_perm_S (w6[3], w7[0], selector); w7[2] = __byte_perm_S (w6[2], w6[3], selector); w7[1] = __byte_perm_S (w6[1], w6[2], selector); w7[0] = __byte_perm_S (w6[0], w6[1], selector); w6[3] = __byte_perm_S (w5[3], w6[0], selector); w6[2] = __byte_perm_S (w5[2], w5[3], selector); w6[1] = __byte_perm_S (w5[1], w5[2], selector); w6[0] = __byte_perm_S (w5[0], w5[1], selector); w5[3] = __byte_perm_S (w4[3], w5[0], selector); w5[2] = __byte_perm_S (w4[2], w4[3], selector); w5[1] = __byte_perm_S (w4[1], w4[2], selector); w5[0] = __byte_perm_S (w4[0], w4[1], selector); w4[3] = __byte_perm_S (w3[3], w4[0], selector); w4[2] = __byte_perm_S (w3[2], w3[3], selector); w4[1] = __byte_perm_S (w3[1], w3[2], selector); w4[0] = __byte_perm_S (w3[0], w3[1], selector); w3[3] = __byte_perm_S (w2[3], w3[0], selector); w3[2] = __byte_perm_S (w2[2], w2[3], selector); w3[1] = __byte_perm_S (w2[1], w2[2], selector); w3[0] = __byte_perm_S (w2[0], w2[1], selector); w2[3] = __byte_perm_S (w1[3], w2[0], selector); w2[2] = __byte_perm_S (w1[2], w1[3], selector); w2[1] = __byte_perm_S (w1[1], w1[2], selector); w2[0] = __byte_perm_S (w1[0], w1[1], selector); w1[3] = __byte_perm_S (w0[3], w1[0], selector); w1[2] = __byte_perm_S (w0[2], w0[3], selector); w1[1] = __byte_perm_S (w0[1], w0[2], selector); w1[0] = __byte_perm_S (w0[0], w0[1], selector); w0[3] = __byte_perm_S ( 0, w0[0], selector); w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 4: w7[3] = __byte_perm_S (w6[2], w6[3], selector); w7[2] = __byte_perm_S (w6[1], w6[2], selector); w7[1] = __byte_perm_S (w6[0], w6[1], selector); w7[0] = __byte_perm_S (w5[3], w6[0], selector); w6[3] = __byte_perm_S (w5[2], w5[3], selector); w6[2] = __byte_perm_S (w5[1], w5[2], selector); w6[1] = __byte_perm_S (w5[0], w5[1], selector); w6[0] = __byte_perm_S (w4[3], w5[0], selector); w5[3] = __byte_perm_S (w4[2], w4[3], selector); w5[2] = __byte_perm_S (w4[1], w4[2], selector); w5[1] = __byte_perm_S (w4[0], w4[1], selector); w5[0] = __byte_perm_S (w3[3], w4[0], selector); w4[3] = __byte_perm_S (w3[2], w3[3], selector); w4[2] = __byte_perm_S (w3[1], w3[2], selector); w4[1] = __byte_perm_S (w3[0], w3[1], selector); w4[0] = __byte_perm_S (w2[3], w3[0], selector); w3[3] = __byte_perm_S (w2[2], w2[3], selector); w3[2] = __byte_perm_S (w2[1], w2[2], selector); w3[1] = __byte_perm_S (w2[0], w2[1], selector); w3[0] = __byte_perm_S (w1[3], w2[0], selector); w2[3] = __byte_perm_S (w1[2], w1[3], selector); w2[2] = __byte_perm_S (w1[1], w1[2], selector); w2[1] = __byte_perm_S (w1[0], w1[1], selector); w2[0] = __byte_perm_S (w0[3], w1[0], selector); w1[3] = __byte_perm_S (w0[2], w0[3], selector); w1[2] = __byte_perm_S (w0[1], w0[2], selector); w1[1] = __byte_perm_S (w0[0], w0[1], selector); w1[0] = __byte_perm_S ( 0, w0[0], selector); w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 5: w7[3] = __byte_perm_S (w6[1], w6[2], selector); w7[2] = __byte_perm_S (w6[0], w6[1], selector); w7[1] = __byte_perm_S (w5[3], w6[0], selector); w7[0] = __byte_perm_S (w5[2], w5[3], selector); w6[3] = __byte_perm_S (w5[1], w5[2], selector); w6[2] = __byte_perm_S (w5[0], w5[1], selector); w6[1] = __byte_perm_S (w4[3], w5[0], selector); w6[0] = __byte_perm_S (w4[2], w4[3], selector); w5[3] = __byte_perm_S (w4[1], w4[2], selector); w5[2] = __byte_perm_S (w4[0], w4[1], selector); w5[1] = __byte_perm_S (w3[3], w4[0], selector); w5[0] = __byte_perm_S (w3[2], w3[3], selector); w4[3] = __byte_perm_S (w3[1], w3[2], selector); w4[2] = __byte_perm_S (w3[0], w3[1], selector); w4[1] = __byte_perm_S (w2[3], w3[0], selector); w4[0] = __byte_perm_S (w2[2], w2[3], selector); w3[3] = __byte_perm_S (w2[1], w2[2], selector); w3[2] = __byte_perm_S (w2[0], w2[1], selector); w3[1] = __byte_perm_S (w1[3], w2[0], selector); w3[0] = __byte_perm_S (w1[2], w1[3], selector); w2[3] = __byte_perm_S (w1[1], w1[2], selector); w2[2] = __byte_perm_S (w1[0], w1[1], selector); w2[1] = __byte_perm_S (w0[3], w1[0], selector); w2[0] = __byte_perm_S (w0[2], w0[3], selector); w1[3] = __byte_perm_S (w0[1], w0[2], selector); w1[2] = __byte_perm_S (w0[0], w0[1], selector); w1[1] = __byte_perm_S ( 0, w0[0], selector); w1[0] = 0; w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 6: w7[3] = __byte_perm_S (w6[0], w6[1], selector); w7[2] = __byte_perm_S (w5[3], w6[0], selector); w7[1] = __byte_perm_S (w5[2], w5[3], selector); w7[0] = __byte_perm_S (w5[1], w5[2], selector); w6[3] = __byte_perm_S (w5[0], w5[1], selector); w6[2] = __byte_perm_S (w4[3], w5[0], selector); w6[1] = __byte_perm_S (w4[2], w4[3], selector); w6[0] = __byte_perm_S (w4[1], w4[2], selector); w5[3] = __byte_perm_S (w4[0], w4[1], selector); w5[2] = __byte_perm_S (w3[3], w4[0], selector); w5[1] = __byte_perm_S (w3[2], w3[3], selector); w5[0] = __byte_perm_S (w3[1], w3[2], selector); w4[3] = __byte_perm_S (w3[0], w3[1], selector); w4[2] = __byte_perm_S (w2[3], w3[0], selector); w4[1] = __byte_perm_S (w2[2], w2[3], selector); w4[0] = __byte_perm_S (w2[1], w2[2], selector); w3[3] = __byte_perm_S (w2[0], w2[1], selector); w3[2] = __byte_perm_S (w1[3], w2[0], selector); w3[1] = __byte_perm_S (w1[2], w1[3], selector); w3[0] = __byte_perm_S (w1[1], w1[2], selector); w2[3] = __byte_perm_S (w1[0], w1[1], selector); w2[2] = __byte_perm_S (w0[3], w1[0], selector); w2[1] = __byte_perm_S (w0[2], w0[3], selector); w2[0] = __byte_perm_S (w0[1], w0[2], selector); w1[3] = __byte_perm_S (w0[0], w0[1], selector); w1[2] = __byte_perm_S ( 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: w7[3] = __byte_perm_S (w5[3], w6[0], selector); w7[2] = __byte_perm_S (w5[2], w5[3], selector); w7[1] = __byte_perm_S (w5[1], w5[2], selector); w7[0] = __byte_perm_S (w5[0], w5[1], selector); w6[3] = __byte_perm_S (w4[3], w5[0], selector); w6[2] = __byte_perm_S (w4[2], w4[3], selector); w6[1] = __byte_perm_S (w4[1], w4[2], selector); w6[0] = __byte_perm_S (w4[0], w4[1], selector); w5[3] = __byte_perm_S (w3[3], w4[0], selector); w5[2] = __byte_perm_S (w3[2], w3[3], selector); w5[1] = __byte_perm_S (w3[1], w3[2], selector); w5[0] = __byte_perm_S (w3[0], w3[1], selector); w4[3] = __byte_perm_S (w2[3], w3[0], selector); w4[2] = __byte_perm_S (w2[2], w2[3], selector); w4[1] = __byte_perm_S (w2[1], w2[2], selector); w4[0] = __byte_perm_S (w2[0], w2[1], selector); w3[3] = __byte_perm_S (w1[3], w2[0], selector); w3[2] = __byte_perm_S (w1[2], w1[3], selector); w3[1] = __byte_perm_S (w1[1], w1[2], selector); w3[0] = __byte_perm_S (w1[0], w1[1], selector); w2[3] = __byte_perm_S (w0[3], w1[0], selector); w2[2] = __byte_perm_S (w0[2], w0[3], selector); w2[1] = __byte_perm_S (w0[1], w0[2], selector); w2[0] = __byte_perm_S (w0[0], w0[1], selector); w1[3] = __byte_perm_S ( 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: w7[3] = __byte_perm_S (w5[2], w5[3], selector); w7[2] = __byte_perm_S (w5[1], w5[2], selector); w7[1] = __byte_perm_S (w5[0], w5[1], selector); w7[0] = __byte_perm_S (w4[3], w5[0], selector); w6[3] = __byte_perm_S (w4[2], w4[3], selector); w6[2] = __byte_perm_S (w4[1], w4[2], selector); w6[1] = __byte_perm_S (w4[0], w4[1], selector); w6[0] = __byte_perm_S (w3[3], w4[0], selector); w5[3] = __byte_perm_S (w3[2], w3[3], selector); w5[2] = __byte_perm_S (w3[1], w3[2], selector); w5[1] = __byte_perm_S (w3[0], w3[1], selector); w5[0] = __byte_perm_S (w2[3], w3[0], selector); w4[3] = __byte_perm_S (w2[2], w2[3], selector); w4[2] = __byte_perm_S (w2[1], w2[2], selector); w4[1] = __byte_perm_S (w2[0], w2[1], selector); w4[0] = __byte_perm_S (w1[3], w2[0], selector); w3[3] = __byte_perm_S (w1[2], w1[3], selector); w3[2] = __byte_perm_S (w1[1], w1[2], selector); w3[1] = __byte_perm_S (w1[0], w1[1], selector); w3[0] = __byte_perm_S (w0[3], w1[0], selector); w2[3] = __byte_perm_S (w0[2], w0[3], selector); w2[2] = __byte_perm_S (w0[1], w0[2], selector); w2[1] = __byte_perm_S (w0[0], w0[1], selector); w2[0] = __byte_perm_S ( 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: w7[3] = __byte_perm_S (w5[1], w5[2], selector); w7[2] = __byte_perm_S (w5[0], w5[1], selector); w7[1] = __byte_perm_S (w4[3], w5[0], selector); w7[0] = __byte_perm_S (w4[2], w4[3], selector); w6[3] = __byte_perm_S (w4[1], w4[2], selector); w6[2] = __byte_perm_S (w4[0], w4[1], selector); w6[1] = __byte_perm_S (w3[3], w4[0], selector); w6[0] = __byte_perm_S (w3[2], w3[3], selector); w5[3] = __byte_perm_S (w3[1], w3[2], selector); w5[2] = __byte_perm_S (w3[0], w3[1], selector); w5[1] = __byte_perm_S (w2[3], w3[0], selector); w5[0] = __byte_perm_S (w2[2], w2[3], selector); w4[3] = __byte_perm_S (w2[1], w2[2], selector); w4[2] = __byte_perm_S (w2[0], w2[1], selector); w4[1] = __byte_perm_S (w1[3], w2[0], selector); w4[0] = __byte_perm_S (w1[2], w1[3], selector); w3[3] = __byte_perm_S (w1[1], w1[2], selector); w3[2] = __byte_perm_S (w1[0], w1[1], selector); w3[1] = __byte_perm_S (w0[3], w1[0], selector); w3[0] = __byte_perm_S (w0[2], w0[3], selector); w2[3] = __byte_perm_S (w0[1], w0[2], selector); w2[2] = __byte_perm_S (w0[0], w0[1], selector); w2[1] = __byte_perm_S ( 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: w7[3] = __byte_perm_S (w5[0], w5[1], selector); w7[2] = __byte_perm_S (w4[3], w5[0], selector); w7[1] = __byte_perm_S (w4[2], w4[3], selector); w7[0] = __byte_perm_S (w4[1], w4[2], selector); w6[3] = __byte_perm_S (w4[0], w4[1], selector); w6[2] = __byte_perm_S (w3[3], w4[0], selector); w6[1] = __byte_perm_S (w3[2], w3[3], selector); w6[0] = __byte_perm_S (w3[1], w3[2], selector); w5[3] = __byte_perm_S (w3[0], w3[1], selector); w5[2] = __byte_perm_S (w2[3], w3[0], selector); w5[1] = __byte_perm_S (w2[2], w2[3], selector); w5[0] = __byte_perm_S (w2[1], w2[2], selector); w4[3] = __byte_perm_S (w2[0], w2[1], selector); w4[2] = __byte_perm_S (w1[3], w2[0], selector); w4[1] = __byte_perm_S (w1[2], w1[3], selector); w4[0] = __byte_perm_S (w1[1], w1[2], selector); w3[3] = __byte_perm_S (w1[0], w1[1], selector); w3[2] = __byte_perm_S (w0[3], w1[0], selector); w3[1] = __byte_perm_S (w0[2], w0[3], selector); w3[0] = __byte_perm_S (w0[1], w0[2], selector); w2[3] = __byte_perm_S (w0[0], w0[1], selector); w2[2] = __byte_perm_S ( 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: w7[3] = __byte_perm_S (w4[3], w5[0], selector); w7[2] = __byte_perm_S (w4[2], w4[3], selector); w7[1] = __byte_perm_S (w4[1], w4[2], selector); w7[0] = __byte_perm_S (w4[0], w4[1], selector); w6[3] = __byte_perm_S (w3[3], w4[0], selector); w6[2] = __byte_perm_S (w3[2], w3[3], selector); w6[1] = __byte_perm_S (w3[1], w3[2], selector); w6[0] = __byte_perm_S (w3[0], w3[1], selector); w5[3] = __byte_perm_S (w2[3], w3[0], selector); w5[2] = __byte_perm_S (w2[2], w2[3], selector); w5[1] = __byte_perm_S (w2[1], w2[2], selector); w5[0] = __byte_perm_S (w2[0], w2[1], selector); w4[3] = __byte_perm_S (w1[3], w2[0], selector); w4[2] = __byte_perm_S (w1[2], w1[3], selector); w4[1] = __byte_perm_S (w1[1], w1[2], selector); w4[0] = __byte_perm_S (w1[0], w1[1], selector); w3[3] = __byte_perm_S (w0[3], w1[0], selector); w3[2] = __byte_perm_S (w0[2], w0[3], selector); w3[1] = __byte_perm_S (w0[1], w0[2], selector); w3[0] = __byte_perm_S (w0[0], w0[1], selector); w2[3] = __byte_perm_S ( 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: w7[3] = __byte_perm_S (w4[2], w4[3], selector); w7[2] = __byte_perm_S (w4[1], w4[2], selector); w7[1] = __byte_perm_S (w4[0], w4[1], selector); w7[0] = __byte_perm_S (w3[3], w4[0], selector); w6[3] = __byte_perm_S (w3[2], w3[3], selector); w6[2] = __byte_perm_S (w3[1], w3[2], selector); w6[1] = __byte_perm_S (w3[0], w3[1], selector); w6[0] = __byte_perm_S (w2[3], w3[0], selector); w5[3] = __byte_perm_S (w2[2], w2[3], selector); w5[2] = __byte_perm_S (w2[1], w2[2], selector); w5[1] = __byte_perm_S (w2[0], w2[1], selector); w5[0] = __byte_perm_S (w1[3], w2[0], selector); w4[3] = __byte_perm_S (w1[2], w1[3], selector); w4[2] = __byte_perm_S (w1[1], w1[2], selector); w4[1] = __byte_perm_S (w1[0], w1[1], selector); w4[0] = __byte_perm_S (w0[3], w1[0], selector); w3[3] = __byte_perm_S (w0[2], w0[3], selector); w3[2] = __byte_perm_S (w0[1], w0[2], selector); w3[1] = __byte_perm_S (w0[0], w0[1], selector); w3[0] = __byte_perm_S ( 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: w7[3] = __byte_perm_S (w4[1], w4[2], selector); w7[2] = __byte_perm_S (w4[0], w4[1], selector); w7[1] = __byte_perm_S (w3[3], w4[0], selector); w7[0] = __byte_perm_S (w3[2], w3[3], selector); w6[3] = __byte_perm_S (w3[1], w3[2], selector); w6[2] = __byte_perm_S (w3[0], w3[1], selector); w6[1] = __byte_perm_S (w2[3], w3[0], selector); w6[0] = __byte_perm_S (w2[2], w2[3], selector); w5[3] = __byte_perm_S (w2[1], w2[2], selector); w5[2] = __byte_perm_S (w2[0], w2[1], selector); w5[1] = __byte_perm_S (w1[3], w2[0], selector); w5[0] = __byte_perm_S (w1[2], w1[3], selector); w4[3] = __byte_perm_S (w1[1], w1[2], selector); w4[2] = __byte_perm_S (w1[0], w1[1], selector); w4[1] = __byte_perm_S (w0[3], w1[0], selector); w4[0] = __byte_perm_S (w0[2], w0[3], selector); w3[3] = __byte_perm_S (w0[1], w0[2], selector); w3[2] = __byte_perm_S (w0[0], w0[1], selector); w3[1] = __byte_perm_S ( 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; case 14: w7[3] = __byte_perm_S (w4[0], w4[1], selector); w7[2] = __byte_perm_S (w3[3], w4[0], selector); w7[1] = __byte_perm_S (w3[2], w3[3], selector); w7[0] = __byte_perm_S (w3[1], w3[2], selector); w6[3] = __byte_perm_S (w3[0], w3[1], selector); w6[2] = __byte_perm_S (w2[3], w3[0], selector); w6[1] = __byte_perm_S (w2[2], w2[3], selector); w6[0] = __byte_perm_S (w2[1], w2[2], selector); w5[3] = __byte_perm_S (w2[0], w2[1], selector); w5[2] = __byte_perm_S (w1[3], w2[0], selector); w5[1] = __byte_perm_S (w1[2], w1[3], selector); w5[0] = __byte_perm_S (w1[1], w1[2], selector); w4[3] = __byte_perm_S (w1[0], w1[1], selector); w4[2] = __byte_perm_S (w0[3], w1[0], selector); w4[1] = __byte_perm_S (w0[2], w0[3], selector); w4[0] = __byte_perm_S (w0[1], w0[2], selector); w3[3] = __byte_perm_S (w0[0], w0[1], selector); w3[2] = __byte_perm_S ( 0, w0[0], selector); w3[1] = 0; 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; case 15: w7[3] = __byte_perm_S (w3[3], w4[0], selector); w7[2] = __byte_perm_S (w3[2], w3[3], selector); w7[1] = __byte_perm_S (w3[1], w3[2], selector); w7[0] = __byte_perm_S (w3[0], w3[1], selector); w6[3] = __byte_perm_S (w2[3], w3[0], selector); w6[2] = __byte_perm_S (w2[2], w2[3], selector); w6[1] = __byte_perm_S (w2[1], w2[2], selector); w6[0] = __byte_perm_S (w2[0], w2[1], selector); w5[3] = __byte_perm_S (w1[3], w2[0], selector); w5[2] = __byte_perm_S (w1[2], w1[3], selector); w5[1] = __byte_perm_S (w1[1], w1[2], selector); w5[0] = __byte_perm_S (w1[0], w1[1], selector); w4[3] = __byte_perm_S (w0[3], w1[0], selector); w4[2] = __byte_perm_S (w0[2], w0[3], selector); w4[1] = __byte_perm_S (w0[1], w0[2], selector); w4[0] = __byte_perm_S (w0[0], w0[1], selector); w3[3] = __byte_perm_S ( 0, w0[0], selector); w3[2] = 0; w3[1] = 0; 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 } void switch_buffer_by_offset_8x4_be_S (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) { #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if (defined IS_AMD && AMD_GCN < 3) || defined IS_GENERIC switch (offset_switch) { case 0: w7[3] = amd_bytealign_S (w7[2], w7[3], offset); w7[2] = amd_bytealign_S (w7[1], w7[2], offset); w7[1] = amd_bytealign_S (w7[0], w7[1], offset); w7[0] = amd_bytealign_S (w6[3], w7[0], offset); w6[3] = amd_bytealign_S (w6[2], w6[3], offset); w6[2] = amd_bytealign_S (w6[1], w6[2], offset); w6[1] = amd_bytealign_S (w6[0], w6[1], offset); w6[0] = amd_bytealign_S (w5[3], w6[0], offset); w5[3] = amd_bytealign_S (w5[2], w5[3], offset); w5[2] = amd_bytealign_S (w5[1], w5[2], offset); w5[1] = amd_bytealign_S (w5[0], w5[1], offset); w5[0] = amd_bytealign_S (w4[3], w5[0], offset); w4[3] = amd_bytealign_S (w4[2], w4[3], offset); w4[2] = amd_bytealign_S (w4[1], w4[2], offset); w4[1] = amd_bytealign_S (w4[0], w4[1], offset); w4[0] = amd_bytealign_S (w3[3], w4[0], offset); w3[3] = amd_bytealign_S (w3[2], w3[3], offset); w3[2] = amd_bytealign_S (w3[1], w3[2], offset); w3[1] = amd_bytealign_S (w3[0], w3[1], offset); w3[0] = amd_bytealign_S (w2[3], w3[0], offset); w2[3] = amd_bytealign_S (w2[2], w2[3], offset); w2[2] = amd_bytealign_S (w2[1], w2[2], offset); w2[1] = amd_bytealign_S (w2[0], w2[1], offset); w2[0] = amd_bytealign_S (w1[3], w2[0], offset); w1[3] = amd_bytealign_S (w1[2], w1[3], offset); w1[2] = amd_bytealign_S (w1[1], w1[2], offset); w1[1] = amd_bytealign_S (w1[0], w1[1], offset); w1[0] = amd_bytealign_S (w0[3], w1[0], offset); w0[3] = amd_bytealign_S (w0[2], w0[3], offset); w0[2] = amd_bytealign_S (w0[1], w0[2], offset); w0[1] = amd_bytealign_S (w0[0], w0[1], offset); w0[0] = amd_bytealign_S ( 0, w0[0], offset); break; case 1: w7[3] = amd_bytealign_S (w7[1], w7[2], offset); w7[2] = amd_bytealign_S (w7[0], w7[1], offset); w7[1] = amd_bytealign_S (w6[3], w7[0], offset); w7[0] = amd_bytealign_S (w6[2], w6[3], offset); w6[3] = amd_bytealign_S (w6[1], w6[2], offset); w6[2] = amd_bytealign_S (w6[0], w6[1], offset); w6[1] = amd_bytealign_S (w5[3], w6[0], offset); w6[0] = amd_bytealign_S (w5[2], w5[3], offset); w5[3] = amd_bytealign_S (w5[1], w5[2], offset); w5[2] = amd_bytealign_S (w5[0], w5[1], offset); w5[1] = amd_bytealign_S (w4[3], w5[0], offset); w5[0] = amd_bytealign_S (w4[2], w4[3], offset); w4[3] = amd_bytealign_S (w4[1], w4[2], offset); w4[2] = amd_bytealign_S (w4[0], w4[1], offset); w4[1] = amd_bytealign_S (w3[3], w4[0], offset); w4[0] = amd_bytealign_S (w3[2], w3[3], offset); w3[3] = amd_bytealign_S (w3[1], w3[2], offset); w3[2] = amd_bytealign_S (w3[0], w3[1], offset); w3[1] = amd_bytealign_S (w2[3], w3[0], offset); w3[0] = amd_bytealign_S (w2[2], w2[3], offset); w2[3] = amd_bytealign_S (w2[1], w2[2], offset); w2[2] = amd_bytealign_S (w2[0], w2[1], offset); w2[1] = amd_bytealign_S (w1[3], w2[0], offset); w2[0] = amd_bytealign_S (w1[2], w1[3], offset); w1[3] = amd_bytealign_S (w1[1], w1[2], offset); w1[2] = amd_bytealign_S (w1[0], w1[1], offset); w1[1] = amd_bytealign_S (w0[3], w1[0], offset); w1[0] = amd_bytealign_S (w0[2], w0[3], offset); w0[3] = amd_bytealign_S (w0[1], w0[2], offset); w0[2] = amd_bytealign_S (w0[0], w0[1], offset); w0[1] = amd_bytealign_S ( 0, w0[0], offset); w0[0] = 0; break; case 2: w7[3] = amd_bytealign_S (w7[0], w7[1], offset); w7[2] = amd_bytealign_S (w6[3], w7[0], offset); w7[1] = amd_bytealign_S (w6[2], w6[3], offset); w7[0] = amd_bytealign_S (w6[1], w6[2], offset); w6[3] = amd_bytealign_S (w6[0], w6[1], offset); w6[2] = amd_bytealign_S (w5[3], w6[0], offset); w6[1] = amd_bytealign_S (w5[2], w5[3], offset); w6[0] = amd_bytealign_S (w5[1], w5[2], offset); w5[3] = amd_bytealign_S (w5[0], w5[1], offset); w5[2] = amd_bytealign_S (w4[3], w5[0], offset); w5[1] = amd_bytealign_S (w4[2], w4[3], offset); w5[0] = amd_bytealign_S (w4[1], w4[2], offset); w4[3] = amd_bytealign_S (w4[0], w4[1], offset); w4[2] = amd_bytealign_S (w3[3], w4[0], offset); w4[1] = amd_bytealign_S (w3[2], w3[3], offset); w4[0] = amd_bytealign_S (w3[1], w3[2], offset); w3[3] = amd_bytealign_S (w3[0], w3[1], offset); w3[2] = amd_bytealign_S (w2[3], w3[0], offset); w3[1] = amd_bytealign_S (w2[2], w2[3], offset); w3[0] = amd_bytealign_S (w2[1], w2[2], offset); w2[3] = amd_bytealign_S (w2[0], w2[1], offset); w2[2] = amd_bytealign_S (w1[3], w2[0], offset); w2[1] = amd_bytealign_S (w1[2], w1[3], offset); w2[0] = amd_bytealign_S (w1[1], w1[2], offset); w1[3] = amd_bytealign_S (w1[0], w1[1], offset); w1[2] = amd_bytealign_S (w0[3], w1[0], offset); w1[1] = amd_bytealign_S (w0[2], w0[3], offset); w1[0] = amd_bytealign_S (w0[1], w0[2], offset); w0[3] = amd_bytealign_S (w0[0], w0[1], offset); w0[2] = amd_bytealign_S ( 0, w0[0], offset); w0[1] = 0; w0[0] = 0; break; case 3: w7[3] = amd_bytealign_S (w6[3], w7[0], offset); w7[2] = amd_bytealign_S (w6[2], w6[3], offset); w7[1] = amd_bytealign_S (w6[1], w6[2], offset); w7[0] = amd_bytealign_S (w6[0], w6[1], offset); w6[3] = amd_bytealign_S (w5[3], w6[0], offset); w6[2] = amd_bytealign_S (w5[2], w5[3], offset); w6[1] = amd_bytealign_S (w5[1], w5[2], offset); w6[0] = amd_bytealign_S (w5[0], w5[1], offset); w5[3] = amd_bytealign_S (w4[3], w5[0], offset); w5[2] = amd_bytealign_S (w4[2], w4[3], offset); w5[1] = amd_bytealign_S (w4[1], w4[2], offset); w5[0] = amd_bytealign_S (w4[0], w4[1], offset); w4[3] = amd_bytealign_S (w3[3], w4[0], offset); w4[2] = amd_bytealign_S (w3[2], w3[3], offset); w4[1] = amd_bytealign_S (w3[1], w3[2], offset); w4[0] = amd_bytealign_S (w3[0], w3[1], offset); w3[3] = amd_bytealign_S (w2[3], w3[0], offset); w3[2] = amd_bytealign_S (w2[2], w2[3], offset); w3[1] = amd_bytealign_S (w2[1], w2[2], offset); w3[0] = amd_bytealign_S (w2[0], w2[1], offset); w2[3] = amd_bytealign_S (w1[3], w2[0], offset); w2[2] = amd_bytealign_S (w1[2], w1[3], offset); w2[1] = amd_bytealign_S (w1[1], w1[2], offset); w2[0] = amd_bytealign_S (w1[0], w1[1], offset); w1[3] = amd_bytealign_S (w0[3], w1[0], offset); w1[2] = amd_bytealign_S (w0[2], w0[3], offset); w1[1] = amd_bytealign_S (w0[1], w0[2], offset); w1[0] = amd_bytealign_S (w0[0], w0[1], offset); w0[3] = amd_bytealign_S ( 0, w0[0], offset); w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 4: w7[3] = amd_bytealign_S (w6[2], w6[3], offset); w7[2] = amd_bytealign_S (w6[1], w6[2], offset); w7[1] = amd_bytealign_S (w6[0], w6[1], offset); w7[0] = amd_bytealign_S (w5[3], w6[0], offset); w6[3] = amd_bytealign_S (w5[2], w5[3], offset); w6[2] = amd_bytealign_S (w5[1], w5[2], offset); w6[1] = amd_bytealign_S (w5[0], w5[1], offset); w6[0] = amd_bytealign_S (w4[3], w5[0], offset); w5[3] = amd_bytealign_S (w4[2], w4[3], offset); w5[2] = amd_bytealign_S (w4[1], w4[2], offset); w5[1] = amd_bytealign_S (w4[0], w4[1], offset); w5[0] = amd_bytealign_S (w3[3], w4[0], offset); w4[3] = amd_bytealign_S (w3[2], w3[3], offset); w4[2] = amd_bytealign_S (w3[1], w3[2], offset); w4[1] = amd_bytealign_S (w3[0], w3[1], offset); w4[0] = amd_bytealign_S (w2[3], w3[0], offset); w3[3] = amd_bytealign_S (w2[2], w2[3], offset); w3[2] = amd_bytealign_S (w2[1], w2[2], offset); w3[1] = amd_bytealign_S (w2[0], w2[1], offset); w3[0] = amd_bytealign_S (w1[3], w2[0], offset); w2[3] = amd_bytealign_S (w1[2], w1[3], offset); w2[2] = amd_bytealign_S (w1[1], w1[2], offset); w2[1] = amd_bytealign_S (w1[0], w1[1], offset); w2[0] = amd_bytealign_S (w0[3], w1[0], offset); w1[3] = amd_bytealign_S (w0[2], w0[3], offset); w1[2] = amd_bytealign_S (w0[1], w0[2], offset); w1[1] = amd_bytealign_S (w0[0], w0[1], offset); w1[0] = amd_bytealign_S ( 0, w0[0], offset); w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 5: w7[3] = amd_bytealign_S (w6[1], w6[2], offset); w7[2] = amd_bytealign_S (w6[0], w6[1], offset); w7[1] = amd_bytealign_S (w5[3], w6[0], offset); w7[0] = amd_bytealign_S (w5[2], w5[3], offset); w6[3] = amd_bytealign_S (w5[1], w5[2], offset); w6[2] = amd_bytealign_S (w5[0], w5[1], offset); w6[1] = amd_bytealign_S (w4[3], w5[0], offset); w6[0] = amd_bytealign_S (w4[2], w4[3], offset); w5[3] = amd_bytealign_S (w4[1], w4[2], offset); w5[2] = amd_bytealign_S (w4[0], w4[1], offset); w5[1] = amd_bytealign_S (w3[3], w4[0], offset); w5[0] = amd_bytealign_S (w3[2], w3[3], offset); w4[3] = amd_bytealign_S (w3[1], w3[2], offset); w4[2] = amd_bytealign_S (w3[0], w3[1], offset); w4[1] = amd_bytealign_S (w2[3], w3[0], offset); w4[0] = amd_bytealign_S (w2[2], w2[3], offset); w3[3] = amd_bytealign_S (w2[1], w2[2], offset); w3[2] = amd_bytealign_S (w2[0], w2[1], offset); w3[1] = amd_bytealign_S (w1[3], w2[0], offset); w3[0] = amd_bytealign_S (w1[2], w1[3], offset); w2[3] = amd_bytealign_S (w1[1], w1[2], offset); w2[2] = amd_bytealign_S (w1[0], w1[1], offset); w2[1] = amd_bytealign_S (w0[3], w1[0], offset); w2[0] = amd_bytealign_S (w0[2], w0[3], offset); w1[3] = amd_bytealign_S (w0[1], w0[2], offset); w1[2] = amd_bytealign_S (w0[0], w0[1], offset); w1[1] = amd_bytealign_S ( 0, w0[0], offset); w1[0] = 0; w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 6: w7[3] = amd_bytealign_S (w6[0], w6[1], offset); w7[2] = amd_bytealign_S (w5[3], w6[0], offset); w7[1] = amd_bytealign_S (w5[2], w5[3], offset); w7[0] = amd_bytealign_S (w5[1], w5[2], offset); w6[3] = amd_bytealign_S (w5[0], w5[1], offset); w6[2] = amd_bytealign_S (w4[3], w5[0], offset); w6[1] = amd_bytealign_S (w4[2], w4[3], offset); w6[0] = amd_bytealign_S (w4[1], w4[2], offset); w5[3] = amd_bytealign_S (w4[0], w4[1], offset); w5[2] = amd_bytealign_S (w3[3], w4[0], offset); w5[1] = amd_bytealign_S (w3[2], w3[3], offset); w5[0] = amd_bytealign_S (w3[1], w3[2], offset); w4[3] = amd_bytealign_S (w3[0], w3[1], offset); w4[2] = amd_bytealign_S (w2[3], w3[0], offset); w4[1] = amd_bytealign_S (w2[2], w2[3], offset); w4[0] = amd_bytealign_S (w2[1], w2[2], offset); w3[3] = amd_bytealign_S (w2[0], w2[1], offset); w3[2] = amd_bytealign_S (w1[3], w2[0], offset); w3[1] = amd_bytealign_S (w1[2], w1[3], offset); w3[0] = amd_bytealign_S (w1[1], w1[2], offset); w2[3] = amd_bytealign_S (w1[0], w1[1], offset); w2[2] = amd_bytealign_S (w0[3], w1[0], offset); w2[1] = amd_bytealign_S (w0[2], w0[3], offset); w2[0] = amd_bytealign_S (w0[1], w0[2], offset); w1[3] = amd_bytealign_S (w0[0], w0[1], offset); w1[2] = amd_bytealign_S ( 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: w7[3] = amd_bytealign_S (w5[3], w6[0], offset); w7[2] = amd_bytealign_S (w5[2], w5[3], offset); w7[1] = amd_bytealign_S (w5[1], w5[2], offset); w7[0] = amd_bytealign_S (w5[0], w5[1], offset); w6[3] = amd_bytealign_S (w4[3], w5[0], offset); w6[2] = amd_bytealign_S (w4[2], w4[3], offset); w6[1] = amd_bytealign_S (w4[1], w4[2], offset); w6[0] = amd_bytealign_S (w4[0], w4[1], offset); w5[3] = amd_bytealign_S (w3[3], w4[0], offset); w5[2] = amd_bytealign_S (w3[2], w3[3], offset); w5[1] = amd_bytealign_S (w3[1], w3[2], offset); w5[0] = amd_bytealign_S (w3[0], w3[1], offset); w4[3] = amd_bytealign_S (w2[3], w3[0], offset); w4[2] = amd_bytealign_S (w2[2], w2[3], offset); w4[1] = amd_bytealign_S (w2[1], w2[2], offset); w4[0] = amd_bytealign_S (w2[0], w2[1], offset); w3[3] = amd_bytealign_S (w1[3], w2[0], offset); w3[2] = amd_bytealign_S (w1[2], w1[3], offset); w3[1] = amd_bytealign_S (w1[1], w1[2], offset); w3[0] = amd_bytealign_S (w1[0], w1[1], offset); w2[3] = amd_bytealign_S (w0[3], w1[0], offset); w2[2] = amd_bytealign_S (w0[2], w0[3], offset); w2[1] = amd_bytealign_S (w0[1], w0[2], offset); w2[0] = amd_bytealign_S (w0[0], w0[1], offset); w1[3] = amd_bytealign_S ( 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: w7[3] = amd_bytealign_S (w5[2], w5[3], offset); w7[2] = amd_bytealign_S (w5[1], w5[2], offset); w7[1] = amd_bytealign_S (w5[0], w5[1], offset); w7[0] = amd_bytealign_S (w4[3], w5[0], offset); w6[3] = amd_bytealign_S (w4[2], w4[3], offset); w6[2] = amd_bytealign_S (w4[1], w4[2], offset); w6[1] = amd_bytealign_S (w4[0], w4[1], offset); w6[0] = amd_bytealign_S (w3[3], w4[0], offset); w5[3] = amd_bytealign_S (w3[2], w3[3], offset); w5[2] = amd_bytealign_S (w3[1], w3[2], offset); w5[1] = amd_bytealign_S (w3[0], w3[1], offset); w5[0] = amd_bytealign_S (w2[3], w3[0], offset); w4[3] = amd_bytealign_S (w2[2], w2[3], offset); w4[2] = amd_bytealign_S (w2[1], w2[2], offset); w4[1] = amd_bytealign_S (w2[0], w2[1], offset); w4[0] = amd_bytealign_S (w1[3], w2[0], offset); w3[3] = amd_bytealign_S (w1[2], w1[3], offset); w3[2] = amd_bytealign_S (w1[1], w1[2], offset); w3[1] = amd_bytealign_S (w1[0], w1[1], offset); w3[0] = amd_bytealign_S (w0[3], w1[0], offset); w2[3] = amd_bytealign_S (w0[2], w0[3], offset); w2[2] = amd_bytealign_S (w0[1], w0[2], offset); w2[1] = amd_bytealign_S (w0[0], w0[1], offset); w2[0] = amd_bytealign_S ( 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: w7[3] = amd_bytealign_S (w5[1], w5[2], offset); w7[2] = amd_bytealign_S (w5[0], w5[1], offset); w7[1] = amd_bytealign_S (w4[3], w5[0], offset); w7[0] = amd_bytealign_S (w4[2], w4[3], offset); w6[3] = amd_bytealign_S (w4[1], w4[2], offset); w6[2] = amd_bytealign_S (w4[0], w4[1], offset); w6[1] = amd_bytealign_S (w3[3], w4[0], offset); w6[0] = amd_bytealign_S (w3[2], w3[3], offset); w5[3] = amd_bytealign_S (w3[1], w3[2], offset); w5[2] = amd_bytealign_S (w3[0], w3[1], offset); w5[1] = amd_bytealign_S (w2[3], w3[0], offset); w5[0] = amd_bytealign_S (w2[2], w2[3], offset); w4[3] = amd_bytealign_S (w2[1], w2[2], offset); w4[2] = amd_bytealign_S (w2[0], w2[1], offset); w4[1] = amd_bytealign_S (w1[3], w2[0], offset); w4[0] = amd_bytealign_S (w1[2], w1[3], offset); w3[3] = amd_bytealign_S (w1[1], w1[2], offset); w3[2] = amd_bytealign_S (w1[0], w1[1], offset); w3[1] = amd_bytealign_S (w0[3], w1[0], offset); w3[0] = amd_bytealign_S (w0[2], w0[3], offset); w2[3] = amd_bytealign_S (w0[1], w0[2], offset); w2[2] = amd_bytealign_S (w0[0], w0[1], offset); w2[1] = amd_bytealign_S ( 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: w7[3] = amd_bytealign_S (w5[0], w5[1], offset); w7[2] = amd_bytealign_S (w4[3], w5[0], offset); w7[1] = amd_bytealign_S (w4[2], w4[3], offset); w7[0] = amd_bytealign_S (w4[1], w4[2], offset); w6[3] = amd_bytealign_S (w4[0], w4[1], offset); w6[2] = amd_bytealign_S (w3[3], w4[0], offset); w6[1] = amd_bytealign_S (w3[2], w3[3], offset); w6[0] = amd_bytealign_S (w3[1], w3[2], offset); w5[3] = amd_bytealign_S (w3[0], w3[1], offset); w5[2] = amd_bytealign_S (w2[3], w3[0], offset); w5[1] = amd_bytealign_S (w2[2], w2[3], offset); w5[0] = amd_bytealign_S (w2[1], w2[2], offset); w4[3] = amd_bytealign_S (w2[0], w2[1], offset); w4[2] = amd_bytealign_S (w1[3], w2[0], offset); w4[1] = amd_bytealign_S (w1[2], w1[3], offset); w4[0] = amd_bytealign_S (w1[1], w1[2], offset); w3[3] = amd_bytealign_S (w1[0], w1[1], offset); w3[2] = amd_bytealign_S (w0[3], w1[0], offset); w3[1] = amd_bytealign_S (w0[2], w0[3], offset); w3[0] = amd_bytealign_S (w0[1], w0[2], offset); w2[3] = amd_bytealign_S (w0[0], w0[1], offset); w2[2] = amd_bytealign_S ( 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: w7[3] = amd_bytealign_S (w4[3], w5[0], offset); w7[2] = amd_bytealign_S (w4[2], w4[3], offset); w7[1] = amd_bytealign_S (w4[1], w4[2], offset); w7[0] = amd_bytealign_S (w4[0], w4[1], offset); w6[3] = amd_bytealign_S (w3[3], w4[0], offset); w6[2] = amd_bytealign_S (w3[2], w3[3], offset); w6[1] = amd_bytealign_S (w3[1], w3[2], offset); w6[0] = amd_bytealign_S (w3[0], w3[1], offset); w5[3] = amd_bytealign_S (w2[3], w3[0], offset); w5[2] = amd_bytealign_S (w2[2], w2[3], offset); w5[1] = amd_bytealign_S (w2[1], w2[2], offset); w5[0] = amd_bytealign_S (w2[0], w2[1], offset); w4[3] = amd_bytealign_S (w1[3], w2[0], offset); w4[2] = amd_bytealign_S (w1[2], w1[3], offset); w4[1] = amd_bytealign_S (w1[1], w1[2], offset); w4[0] = amd_bytealign_S (w1[0], w1[1], offset); w3[3] = amd_bytealign_S (w0[3], w1[0], offset); w3[2] = amd_bytealign_S (w0[2], w0[3], offset); w3[1] = amd_bytealign_S (w0[1], w0[2], offset); w3[0] = amd_bytealign_S (w0[0], w0[1], offset); w2[3] = amd_bytealign_S ( 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: w7[3] = amd_bytealign_S (w4[2], w4[3], offset); w7[2] = amd_bytealign_S (w4[1], w4[2], offset); w7[1] = amd_bytealign_S (w4[0], w4[1], offset); w7[0] = amd_bytealign_S (w3[3], w4[0], offset); w6[3] = amd_bytealign_S (w3[2], w3[3], offset); w6[2] = amd_bytealign_S (w3[1], w3[2], offset); w6[1] = amd_bytealign_S (w3[0], w3[1], offset); w6[0] = amd_bytealign_S (w2[3], w3[0], offset); w5[3] = amd_bytealign_S (w2[2], w2[3], offset); w5[2] = amd_bytealign_S (w2[1], w2[2], offset); w5[1] = amd_bytealign_S (w2[0], w2[1], offset); w5[0] = amd_bytealign_S (w1[3], w2[0], offset); w4[3] = amd_bytealign_S (w1[2], w1[3], offset); w4[2] = amd_bytealign_S (w1[1], w1[2], offset); w4[1] = amd_bytealign_S (w1[0], w1[1], offset); w4[0] = amd_bytealign_S (w0[3], w1[0], offset); w3[3] = amd_bytealign_S (w0[2], w0[3], offset); w3[2] = amd_bytealign_S (w0[1], w0[2], offset); w3[1] = amd_bytealign_S (w0[0], w0[1], offset); w3[0] = amd_bytealign_S ( 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: w7[3] = amd_bytealign_S (w4[1], w4[2], offset); w7[2] = amd_bytealign_S (w4[0], w4[1], offset); w7[1] = amd_bytealign_S (w3[3], w4[0], offset); w7[0] = amd_bytealign_S (w3[2], w3[3], offset); w6[3] = amd_bytealign_S (w3[1], w3[2], offset); w6[2] = amd_bytealign_S (w3[0], w3[1], offset); w6[1] = amd_bytealign_S (w2[3], w3[0], offset); w6[0] = amd_bytealign_S (w2[2], w2[3], offset); w5[3] = amd_bytealign_S (w2[1], w2[2], offset); w5[2] = amd_bytealign_S (w2[0], w2[1], offset); w5[1] = amd_bytealign_S (w1[3], w2[0], offset); w5[0] = amd_bytealign_S (w1[2], w1[3], offset); w4[3] = amd_bytealign_S (w1[1], w1[2], offset); w4[2] = amd_bytealign_S (w1[0], w1[1], offset); w4[1] = amd_bytealign_S (w0[3], w1[0], offset); w4[0] = amd_bytealign_S (w0[2], w0[3], offset); w3[3] = amd_bytealign_S (w0[1], w0[2], offset); w3[2] = amd_bytealign_S (w0[0], w0[1], offset); w3[1] = amd_bytealign_S ( 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; case 14: w7[3] = amd_bytealign_S (w4[0], w4[1], offset); w7[2] = amd_bytealign_S (w3[3], w4[0], offset); w7[1] = amd_bytealign_S (w3[2], w3[3], offset); w7[0] = amd_bytealign_S (w3[1], w3[2], offset); w6[3] = amd_bytealign_S (w3[0], w3[1], offset); w6[2] = amd_bytealign_S (w2[3], w3[0], offset); w6[1] = amd_bytealign_S (w2[2], w2[3], offset); w6[0] = amd_bytealign_S (w2[1], w2[2], offset); w5[3] = amd_bytealign_S (w2[0], w2[1], offset); w5[2] = amd_bytealign_S (w1[3], w2[0], offset); w5[1] = amd_bytealign_S (w1[2], w1[3], offset); w5[0] = amd_bytealign_S (w1[1], w1[2], offset); w4[3] = amd_bytealign_S (w1[0], w1[1], offset); w4[2] = amd_bytealign_S (w0[3], w1[0], offset); w4[1] = amd_bytealign_S (w0[2], w0[3], offset); w4[0] = amd_bytealign_S (w0[1], w0[2], offset); w3[3] = amd_bytealign_S (w0[0], w0[1], offset); w3[2] = amd_bytealign_S ( 0, w0[0], offset); w3[1] = 0; 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; case 15: w7[3] = amd_bytealign_S (w3[3], w4[0], offset); w7[2] = amd_bytealign_S (w3[2], w3[3], offset); w7[1] = amd_bytealign_S (w3[1], w3[2], offset); w7[0] = amd_bytealign_S (w3[0], w3[1], offset); w6[3] = amd_bytealign_S (w2[3], w3[0], offset); w6[2] = amd_bytealign_S (w2[2], w2[3], offset); w6[1] = amd_bytealign_S (w2[1], w2[2], offset); w6[0] = amd_bytealign_S (w2[0], w2[1], offset); w5[3] = amd_bytealign_S (w1[3], w2[0], offset); w5[2] = amd_bytealign_S (w1[2], w1[3], offset); w5[1] = amd_bytealign_S (w1[1], w1[2], offset); w5[0] = amd_bytealign_S (w1[0], w1[1], offset); w4[3] = amd_bytealign_S (w0[3], w1[0], offset); w4[2] = amd_bytealign_S (w0[2], w0[3], offset); w4[1] = amd_bytealign_S (w0[1], w0[2], offset); w4[0] = amd_bytealign_S (w0[0], w0[1], offset); w3[3] = amd_bytealign_S ( 0, w0[0], offset); w3[2] = 0; w3[1] = 0; 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; case 16: w7[3] = amd_bytealign_S (w3[2], w3[3], offset); w7[2] = amd_bytealign_S (w3[1], w3[2], offset); w7[1] = amd_bytealign_S (w3[0], w3[1], offset); w7[0] = amd_bytealign_S (w2[3], w3[0], offset); w6[3] = amd_bytealign_S (w2[2], w2[3], offset); w6[2] = amd_bytealign_S (w2[1], w2[2], offset); w6[1] = amd_bytealign_S (w2[0], w2[1], offset); w6[0] = amd_bytealign_S (w1[3], w2[0], offset); w5[3] = amd_bytealign_S (w1[2], w1[3], offset); w5[2] = amd_bytealign_S (w1[1], w1[2], offset); w5[1] = amd_bytealign_S (w1[0], w1[1], offset); w5[0] = amd_bytealign_S (w0[3], w1[0], offset); w4[3] = amd_bytealign_S (w0[2], w0[3], offset); w4[2] = amd_bytealign_S (w0[1], w0[2], offset); w4[1] = amd_bytealign_S (w0[0], w0[1], offset); w4[0] = amd_bytealign_S ( 0, w0[0], offset); w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 17: w7[3] = amd_bytealign_S (w3[1], w3[2], offset); w7[2] = amd_bytealign_S (w3[0], w3[1], offset); w7[1] = amd_bytealign_S (w2[3], w3[0], offset); w7[0] = amd_bytealign_S (w2[2], w2[3], offset); w6[3] = amd_bytealign_S (w2[1], w2[2], offset); w6[2] = amd_bytealign_S (w2[0], w2[1], offset); w6[1] = amd_bytealign_S (w1[3], w2[0], offset); w6[0] = amd_bytealign_S (w1[2], w1[3], offset); w5[3] = amd_bytealign_S (w1[1], w1[2], offset); w5[2] = amd_bytealign_S (w1[0], w1[1], offset); w5[1] = amd_bytealign_S (w0[3], w1[0], offset); w5[0] = amd_bytealign_S (w0[2], w0[3], offset); w4[3] = amd_bytealign_S (w0[1], w0[2], offset); w4[2] = amd_bytealign_S (w0[0], w0[1], offset); w4[1] = amd_bytealign_S ( 0, w0[0], offset); w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 18: w7[3] = amd_bytealign_S (w3[0], w3[1], offset); w7[2] = amd_bytealign_S (w2[3], w3[0], offset); w7[1] = amd_bytealign_S (w2[2], w2[3], offset); w7[0] = amd_bytealign_S (w2[1], w2[2], offset); w6[3] = amd_bytealign_S (w2[0], w2[1], offset); w6[2] = amd_bytealign_S (w1[3], w2[0], offset); w6[1] = amd_bytealign_S (w1[2], w1[3], offset); w6[0] = amd_bytealign_S (w1[1], w1[2], offset); w5[3] = amd_bytealign_S (w1[0], w1[1], offset); w5[2] = amd_bytealign_S (w0[3], w1[0], offset); w5[1] = amd_bytealign_S (w0[2], w0[3], offset); w5[0] = amd_bytealign_S (w0[1], w0[2], offset); w4[3] = amd_bytealign_S (w0[0], w0[1], offset); w4[2] = amd_bytealign_S ( 0, w0[0], offset); w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 19: w7[3] = amd_bytealign_S (w2[3], w3[0], offset); w7[2] = amd_bytealign_S (w2[2], w2[3], offset); w7[1] = amd_bytealign_S (w2[1], w2[2], offset); w7[0] = amd_bytealign_S (w2[0], w2[1], offset); w6[3] = amd_bytealign_S (w1[3], w2[0], offset); w6[2] = amd_bytealign_S (w1[2], w1[3], offset); w6[1] = amd_bytealign_S (w1[1], w1[2], offset); w6[0] = amd_bytealign_S (w1[0], w1[1], offset); w5[3] = amd_bytealign_S (w0[3], w1[0], offset); w5[2] = amd_bytealign_S (w0[2], w0[3], offset); w5[1] = amd_bytealign_S (w0[1], w0[2], offset); w5[0] = amd_bytealign_S (w0[0], w0[1], offset); w4[3] = amd_bytealign_S ( 0, w0[0], offset); w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 20: w7[3] = amd_bytealign_S (w2[2], w2[3], offset); w7[2] = amd_bytealign_S (w2[1], w2[2], offset); w7[1] = amd_bytealign_S (w2[0], w2[1], offset); w7[0] = amd_bytealign_S (w1[3], w2[0], offset); w6[3] = amd_bytealign_S (w1[2], w1[3], offset); w6[2] = amd_bytealign_S (w1[1], w1[2], offset); w6[1] = amd_bytealign_S (w1[0], w1[1], offset); w6[0] = amd_bytealign_S (w0[3], w1[0], offset); w5[3] = amd_bytealign_S (w0[2], w0[3], offset); w5[2] = amd_bytealign_S (w0[1], w0[2], offset); w5[1] = amd_bytealign_S (w0[0], w0[1], offset); w5[0] = amd_bytealign_S ( 0, w0[0], offset); w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 21: w7[3] = amd_bytealign_S (w2[1], w2[2], offset); w7[2] = amd_bytealign_S (w2[0], w2[1], offset); w7[1] = amd_bytealign_S (w1[3], w2[0], offset); w7[0] = amd_bytealign_S (w1[2], w1[3], offset); w6[3] = amd_bytealign_S (w1[1], w1[2], offset); w6[2] = amd_bytealign_S (w1[0], w1[1], offset); w6[1] = amd_bytealign_S (w0[3], w1[0], offset); w6[0] = amd_bytealign_S (w0[2], w0[3], offset); w5[3] = amd_bytealign_S (w0[1], w0[2], offset); w5[2] = amd_bytealign_S (w0[0], w0[1], offset); w5[1] = amd_bytealign_S ( 0, w0[0], offset); w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 22: w7[3] = amd_bytealign_S (w2[0], w2[1], offset); w7[2] = amd_bytealign_S (w1[3], w2[0], offset); w7[1] = amd_bytealign_S (w1[2], w1[3], offset); w7[0] = amd_bytealign_S (w1[1], w1[2], offset); w6[3] = amd_bytealign_S (w1[0], w1[1], offset); w6[2] = amd_bytealign_S (w0[3], w1[0], offset); w6[1] = amd_bytealign_S (w0[2], w0[3], offset); w6[0] = amd_bytealign_S (w0[1], w0[2], offset); w5[3] = amd_bytealign_S (w0[0], w0[1], offset); w5[2] = amd_bytealign_S ( 0, w0[0], offset); w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 23: w7[3] = amd_bytealign_S (w1[3], w2[0], offset); w7[2] = amd_bytealign_S (w1[2], w1[3], offset); w7[1] = amd_bytealign_S (w1[1], w1[2], offset); w7[0] = amd_bytealign_S (w1[0], w1[1], offset); w6[3] = amd_bytealign_S (w0[3], w1[0], offset); w6[2] = amd_bytealign_S (w0[2], w0[3], offset); w6[1] = amd_bytealign_S (w0[1], w0[2], offset); w6[0] = amd_bytealign_S (w0[0], w0[1], offset); w5[3] = amd_bytealign_S ( 0, w0[0], offset); w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 24: w7[3] = amd_bytealign_S (w1[2], w1[3], offset); w7[2] = amd_bytealign_S (w1[1], w1[2], offset); w7[1] = amd_bytealign_S (w1[0], w1[1], offset); w7[0] = amd_bytealign_S (w0[3], w1[0], offset); w6[3] = amd_bytealign_S (w0[2], w0[3], offset); w6[2] = amd_bytealign_S (w0[1], w0[2], offset); w6[1] = amd_bytealign_S (w0[0], w0[1], offset); w6[0] = amd_bytealign_S ( 0, w0[0], offset); w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 25: w7[3] = amd_bytealign_S (w1[1], w1[2], offset); w7[2] = amd_bytealign_S (w1[0], w1[1], offset); w7[1] = amd_bytealign_S (w0[3], w1[0], offset); w7[0] = amd_bytealign_S (w0[2], w0[3], offset); w6[3] = amd_bytealign_S (w0[1], w0[2], offset); w6[2] = amd_bytealign_S (w0[0], w0[1], offset); w6[1] = amd_bytealign_S ( 0, w0[0], offset); w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 26: w7[3] = amd_bytealign_S (w1[0], w1[1], offset); w7[2] = amd_bytealign_S (w0[3], w1[0], offset); w7[1] = amd_bytealign_S (w0[2], w0[3], offset); w7[0] = amd_bytealign_S (w0[1], w0[2], offset); w6[3] = amd_bytealign_S (w0[0], w0[1], offset); w6[2] = amd_bytealign_S ( 0, w0[0], offset); w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 27: w7[3] = amd_bytealign_S (w0[3], w1[0], offset); w7[2] = amd_bytealign_S (w0[2], w0[3], offset); w7[1] = amd_bytealign_S (w0[1], w0[2], offset); w7[0] = amd_bytealign_S (w0[0], w0[1], offset); w6[3] = amd_bytealign_S ( 0, w0[0], offset); w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 28: w7[3] = amd_bytealign_S (w0[2], w0[3], offset); w7[2] = amd_bytealign_S (w0[1], w0[2], offset); w7[1] = amd_bytealign_S (w0[0], w0[1], offset); w7[0] = amd_bytealign_S ( 0, w0[0], offset); w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 29: w7[3] = amd_bytealign_S (w0[1], w0[2], offset); w7[2] = amd_bytealign_S (w0[0], w0[1], offset); w7[1] = amd_bytealign_S ( 0, w0[0], offset); w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 30: w7[3] = amd_bytealign_S (w0[0], w0[1], offset); w7[2] = amd_bytealign_S ( 0, w0[0], offset); w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 31: w7[3] = amd_bytealign_S ( 0, w0[0], offset); w7[2] = 0; w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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 #if (defined IS_AMD && AMD_GCN >= 3) || defined IS_NV #if defined IS_NV const int selector = (0x76543210 >> ((offset & 3) * 4)) & 0xffff; #endif #if defined IS_AMD const int selector = 0x0706050403020100 >> ((offset & 3) * 8); #endif switch (offset_switch) { case 0: w7[3] = __byte_perm_S (w7[3], w7[2], selector); w7[2] = __byte_perm_S (w7[2], w7[1], selector); w7[1] = __byte_perm_S (w7[1], w7[0], selector); w7[0] = __byte_perm_S (w7[0], w6[3], selector); w6[3] = __byte_perm_S (w6[3], w6[2], selector); w6[2] = __byte_perm_S (w6[2], w6[1], selector); w6[1] = __byte_perm_S (w6[1], w6[0], selector); w6[0] = __byte_perm_S (w6[0], w5[3], selector); w5[3] = __byte_perm_S (w5[3], w5[2], selector); w5[2] = __byte_perm_S (w5[2], w5[1], selector); w5[1] = __byte_perm_S (w5[1], w5[0], selector); w5[0] = __byte_perm_S (w5[0], w4[3], selector); w4[3] = __byte_perm_S (w4[3], w4[2], selector); w4[2] = __byte_perm_S (w4[2], w4[1], selector); w4[1] = __byte_perm_S (w4[1], w4[0], selector); w4[0] = __byte_perm_S (w4[0], w3[3], selector); w3[3] = __byte_perm_S (w3[3], w3[2], selector); w3[2] = __byte_perm_S (w3[2], w3[1], selector); w3[1] = __byte_perm_S (w3[1], w3[0], selector); w3[0] = __byte_perm_S (w3[0], w2[3], selector); w2[3] = __byte_perm_S (w2[3], w2[2], selector); w2[2] = __byte_perm_S (w2[2], w2[1], selector); w2[1] = __byte_perm_S (w2[1], w2[0], selector); w2[0] = __byte_perm_S (w2[0], w1[3], selector); w1[3] = __byte_perm_S (w1[3], w1[2], selector); w1[2] = __byte_perm_S (w1[2], w1[1], selector); w1[1] = __byte_perm_S (w1[1], w1[0], selector); w1[0] = __byte_perm_S (w1[0], w0[3], selector); w0[3] = __byte_perm_S (w0[3], w0[2], selector); w0[2] = __byte_perm_S (w0[2], w0[1], selector); w0[1] = __byte_perm_S (w0[1], w0[0], selector); w0[0] = __byte_perm_S (w0[0], 0, selector); break; case 1: w7[3] = __byte_perm_S (w7[2], w7[1], selector); w7[2] = __byte_perm_S (w7[1], w7[0], selector); w7[1] = __byte_perm_S (w7[0], w6[3], selector); w7[0] = __byte_perm_S (w6[3], w6[2], selector); w6[3] = __byte_perm_S (w6[2], w6[1], selector); w6[2] = __byte_perm_S (w6[1], w6[0], selector); w6[1] = __byte_perm_S (w6[0], w5[3], selector); w6[0] = __byte_perm_S (w5[3], w5[2], selector); w5[3] = __byte_perm_S (w5[2], w5[1], selector); w5[2] = __byte_perm_S (w5[1], w5[0], selector); w5[1] = __byte_perm_S (w5[0], w4[3], selector); w5[0] = __byte_perm_S (w4[3], w4[2], selector); w4[3] = __byte_perm_S (w4[2], w4[1], selector); w4[2] = __byte_perm_S (w4[1], w4[0], selector); w4[1] = __byte_perm_S (w4[0], w3[3], selector); w4[0] = __byte_perm_S (w3[3], w3[2], selector); w3[3] = __byte_perm_S (w3[2], w3[1], selector); w3[2] = __byte_perm_S (w3[1], w3[0], selector); w3[1] = __byte_perm_S (w3[0], w2[3], selector); w3[0] = __byte_perm_S (w2[3], w2[2], selector); w2[3] = __byte_perm_S (w2[2], w2[1], selector); w2[2] = __byte_perm_S (w2[1], w2[0], selector); w2[1] = __byte_perm_S (w2[0], w1[3], selector); w2[0] = __byte_perm_S (w1[3], w1[2], selector); w1[3] = __byte_perm_S (w1[2], w1[1], selector); w1[2] = __byte_perm_S (w1[1], w1[0], selector); w1[1] = __byte_perm_S (w1[0], w0[3], selector); w1[0] = __byte_perm_S (w0[3], w0[2], selector); w0[3] = __byte_perm_S (w0[2], w0[1], selector); w0[2] = __byte_perm_S (w0[1], w0[0], selector); w0[1] = __byte_perm_S (w0[0], 0, selector); w0[0] = 0; break; case 2: w7[3] = __byte_perm_S (w7[1], w7[0], selector); w7[2] = __byte_perm_S (w7[0], w6[3], selector); w7[1] = __byte_perm_S (w6[3], w6[2], selector); w7[0] = __byte_perm_S (w6[2], w6[1], selector); w6[3] = __byte_perm_S (w6[1], w6[0], selector); w6[2] = __byte_perm_S (w6[0], w5[3], selector); w6[1] = __byte_perm_S (w5[3], w5[2], selector); w6[0] = __byte_perm_S (w5[2], w5[1], selector); w5[3] = __byte_perm_S (w5[1], w5[0], selector); w5[2] = __byte_perm_S (w5[0], w4[3], selector); w5[1] = __byte_perm_S (w4[3], w4[2], selector); w5[0] = __byte_perm_S (w4[2], w4[1], selector); w4[3] = __byte_perm_S (w4[1], w4[0], selector); w4[2] = __byte_perm_S (w4[0], w3[3], selector); w4[1] = __byte_perm_S (w3[3], w3[2], selector); w4[0] = __byte_perm_S (w3[2], w3[1], selector); w3[3] = __byte_perm_S (w3[1], w3[0], selector); w3[2] = __byte_perm_S (w3[0], w2[3], selector); w3[1] = __byte_perm_S (w2[3], w2[2], selector); w3[0] = __byte_perm_S (w2[2], w2[1], selector); w2[3] = __byte_perm_S (w2[1], w2[0], selector); w2[2] = __byte_perm_S (w2[0], w1[3], selector); w2[1] = __byte_perm_S (w1[3], w1[2], selector); w2[0] = __byte_perm_S (w1[2], w1[1], selector); w1[3] = __byte_perm_S (w1[1], w1[0], selector); w1[2] = __byte_perm_S (w1[0], w0[3], selector); w1[1] = __byte_perm_S (w0[3], w0[2], selector); w1[0] = __byte_perm_S (w0[2], w0[1], selector); w0[3] = __byte_perm_S (w0[1], w0[0], selector); w0[2] = __byte_perm_S (w0[0], 0, selector); w0[1] = 0; w0[0] = 0; break; case 3: w7[3] = __byte_perm_S (w7[0], w6[3], selector); w7[2] = __byte_perm_S (w6[3], w6[2], selector); w7[1] = __byte_perm_S (w6[2], w6[1], selector); w7[0] = __byte_perm_S (w6[1], w6[0], selector); w6[3] = __byte_perm_S (w6[0], w5[3], selector); w6[2] = __byte_perm_S (w5[3], w5[2], selector); w6[1] = __byte_perm_S (w5[2], w5[1], selector); w6[0] = __byte_perm_S (w5[1], w5[0], selector); w5[3] = __byte_perm_S (w5[0], w4[3], selector); w5[2] = __byte_perm_S (w4[3], w4[2], selector); w5[1] = __byte_perm_S (w4[2], w4[1], selector); w5[0] = __byte_perm_S (w4[1], w4[0], selector); w4[3] = __byte_perm_S (w4[0], w3[3], selector); w4[2] = __byte_perm_S (w3[3], w3[2], selector); w4[1] = __byte_perm_S (w3[2], w3[1], selector); w4[0] = __byte_perm_S (w3[1], w3[0], selector); w3[3] = __byte_perm_S (w3[0], w2[3], selector); w3[2] = __byte_perm_S (w2[3], w2[2], selector); w3[1] = __byte_perm_S (w2[2], w2[1], selector); w3[0] = __byte_perm_S (w2[1], w2[0], selector); w2[3] = __byte_perm_S (w2[0], w1[3], selector); w2[2] = __byte_perm_S (w1[3], w1[2], selector); w2[1] = __byte_perm_S (w1[2], w1[1], selector); w2[0] = __byte_perm_S (w1[1], w1[0], selector); w1[3] = __byte_perm_S (w1[0], w0[3], selector); w1[2] = __byte_perm_S (w0[3], w0[2], selector); w1[1] = __byte_perm_S (w0[2], w0[1], selector); w1[0] = __byte_perm_S (w0[1], w0[0], selector); w0[3] = __byte_perm_S (w0[0], 0, selector); w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 4: w7[3] = __byte_perm_S (w6[3], w6[2], selector); w7[2] = __byte_perm_S (w6[2], w6[1], selector); w7[1] = __byte_perm_S (w6[1], w6[0], selector); w7[0] = __byte_perm_S (w6[0], w5[3], selector); w6[3] = __byte_perm_S (w5[3], w5[2], selector); w6[2] = __byte_perm_S (w5[2], w5[1], selector); w6[1] = __byte_perm_S (w5[1], w5[0], selector); w6[0] = __byte_perm_S (w5[0], w4[3], selector); w5[3] = __byte_perm_S (w4[3], w4[2], selector); w5[2] = __byte_perm_S (w4[2], w4[1], selector); w5[1] = __byte_perm_S (w4[1], w4[0], selector); w5[0] = __byte_perm_S (w4[0], w3[3], selector); w4[3] = __byte_perm_S (w3[3], w3[2], selector); w4[2] = __byte_perm_S (w3[2], w3[1], selector); w4[1] = __byte_perm_S (w3[1], w3[0], selector); w4[0] = __byte_perm_S (w3[0], w2[3], selector); w3[3] = __byte_perm_S (w2[3], w2[2], selector); w3[2] = __byte_perm_S (w2[2], w2[1], selector); w3[1] = __byte_perm_S (w2[1], w2[0], selector); w3[0] = __byte_perm_S (w2[0], w1[3], selector); w2[3] = __byte_perm_S (w1[3], w1[2], selector); w2[2] = __byte_perm_S (w1[2], w1[1], selector); w2[1] = __byte_perm_S (w1[1], w1[0], selector); w2[0] = __byte_perm_S (w1[0], w0[3], selector); w1[3] = __byte_perm_S (w0[3], w0[2], selector); w1[2] = __byte_perm_S (w0[2], w0[1], selector); w1[1] = __byte_perm_S (w0[1], w0[0], selector); w1[0] = __byte_perm_S (w0[0], 0, selector); w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 5: w7[3] = __byte_perm_S (w6[2], w6[1], selector); w7[2] = __byte_perm_S (w6[1], w6[0], selector); w7[1] = __byte_perm_S (w6[0], w5[3], selector); w7[0] = __byte_perm_S (w5[3], w5[2], selector); w6[3] = __byte_perm_S (w5[2], w5[1], selector); w6[2] = __byte_perm_S (w5[1], w5[0], selector); w6[1] = __byte_perm_S (w5[0], w4[3], selector); w6[0] = __byte_perm_S (w4[3], w4[2], selector); w5[3] = __byte_perm_S (w4[2], w4[1], selector); w5[2] = __byte_perm_S (w4[1], w4[0], selector); w5[1] = __byte_perm_S (w4[0], w3[3], selector); w5[0] = __byte_perm_S (w3[3], w3[2], selector); w4[3] = __byte_perm_S (w3[2], w3[1], selector); w4[2] = __byte_perm_S (w3[1], w3[0], selector); w4[1] = __byte_perm_S (w3[0], w2[3], selector); w4[0] = __byte_perm_S (w2[3], w2[2], selector); w3[3] = __byte_perm_S (w2[2], w2[1], selector); w3[2] = __byte_perm_S (w2[1], w2[0], selector); w3[1] = __byte_perm_S (w2[0], w1[3], selector); w3[0] = __byte_perm_S (w1[3], w1[2], selector); w2[3] = __byte_perm_S (w1[2], w1[1], selector); w2[2] = __byte_perm_S (w1[1], w1[0], selector); w2[1] = __byte_perm_S (w1[0], w0[3], selector); w2[0] = __byte_perm_S (w0[3], w0[2], selector); w1[3] = __byte_perm_S (w0[2], w0[1], selector); w1[2] = __byte_perm_S (w0[1], w0[0], selector); w1[1] = __byte_perm_S (w0[0], 0, selector); w1[0] = 0; w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 6: w7[3] = __byte_perm_S (w6[1], w6[0], selector); w7[2] = __byte_perm_S (w6[0], w5[3], selector); w7[1] = __byte_perm_S (w5[3], w5[2], selector); w7[0] = __byte_perm_S (w5[2], w5[1], selector); w6[3] = __byte_perm_S (w5[1], w5[0], selector); w6[2] = __byte_perm_S (w5[0], w4[3], selector); w6[1] = __byte_perm_S (w4[3], w4[2], selector); w6[0] = __byte_perm_S (w4[2], w4[1], selector); w5[3] = __byte_perm_S (w4[1], w4[0], selector); w5[2] = __byte_perm_S (w4[0], w3[3], selector); w5[1] = __byte_perm_S (w3[3], w3[2], selector); w5[0] = __byte_perm_S (w3[2], w3[1], selector); w4[3] = __byte_perm_S (w3[1], w3[0], selector); w4[2] = __byte_perm_S (w3[0], w2[3], selector); w4[1] = __byte_perm_S (w2[3], w2[2], selector); w4[0] = __byte_perm_S (w2[2], w2[1], selector); w3[3] = __byte_perm_S (w2[1], w2[0], selector); w3[2] = __byte_perm_S (w2[0], w1[3], selector); w3[1] = __byte_perm_S (w1[3], w1[2], selector); w3[0] = __byte_perm_S (w1[2], w1[1], selector); w2[3] = __byte_perm_S (w1[1], w1[0], selector); w2[2] = __byte_perm_S (w1[0], w0[3], selector); w2[1] = __byte_perm_S (w0[3], w0[2], selector); w2[0] = __byte_perm_S (w0[2], w0[1], selector); w1[3] = __byte_perm_S (w0[1], w0[0], selector); w1[2] = __byte_perm_S (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: w7[3] = __byte_perm_S (w6[0], w5[3], selector); w7[2] = __byte_perm_S (w5[3], w5[2], selector); w7[1] = __byte_perm_S (w5[2], w5[1], selector); w7[0] = __byte_perm_S (w5[1], w5[0], selector); w6[3] = __byte_perm_S (w5[0], w4[3], selector); w6[2] = __byte_perm_S (w4[3], w4[2], selector); w6[1] = __byte_perm_S (w4[2], w4[1], selector); w6[0] = __byte_perm_S (w4[1], w4[0], selector); w5[3] = __byte_perm_S (w4[0], w3[3], selector); w5[2] = __byte_perm_S (w3[3], w3[2], selector); w5[1] = __byte_perm_S (w3[2], w3[1], selector); w5[0] = __byte_perm_S (w3[1], w3[0], selector); w4[3] = __byte_perm_S (w3[0], w2[3], selector); w4[2] = __byte_perm_S (w2[3], w2[2], selector); w4[1] = __byte_perm_S (w2[2], w2[1], selector); w4[0] = __byte_perm_S (w2[1], w2[0], selector); w3[3] = __byte_perm_S (w2[0], w1[3], selector); w3[2] = __byte_perm_S (w1[3], w1[2], selector); w3[1] = __byte_perm_S (w1[2], w1[1], selector); w3[0] = __byte_perm_S (w1[1], w1[0], selector); w2[3] = __byte_perm_S (w1[0], w0[3], selector); w2[2] = __byte_perm_S (w0[3], w0[2], selector); w2[1] = __byte_perm_S (w0[2], w0[1], selector); w2[0] = __byte_perm_S (w0[1], w0[0], selector); w1[3] = __byte_perm_S (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: w7[3] = __byte_perm_S (w5[3], w5[2], selector); w7[2] = __byte_perm_S (w5[2], w5[1], selector); w7[1] = __byte_perm_S (w5[1], w5[0], selector); w7[0] = __byte_perm_S (w5[0], w4[3], selector); w6[3] = __byte_perm_S (w4[3], w4[2], selector); w6[2] = __byte_perm_S (w4[2], w4[1], selector); w6[1] = __byte_perm_S (w4[1], w4[0], selector); w6[0] = __byte_perm_S (w4[0], w3[3], selector); w5[3] = __byte_perm_S (w3[3], w3[2], selector); w5[2] = __byte_perm_S (w3[2], w3[1], selector); w5[1] = __byte_perm_S (w3[1], w3[0], selector); w5[0] = __byte_perm_S (w3[0], w2[3], selector); w4[3] = __byte_perm_S (w2[3], w2[2], selector); w4[2] = __byte_perm_S (w2[2], w2[1], selector); w4[1] = __byte_perm_S (w2[1], w2[0], selector); w4[0] = __byte_perm_S (w2[0], w1[3], selector); w3[3] = __byte_perm_S (w1[3], w1[2], selector); w3[2] = __byte_perm_S (w1[2], w1[1], selector); w3[1] = __byte_perm_S (w1[1], w1[0], selector); w3[0] = __byte_perm_S (w1[0], w0[3], selector); w2[3] = __byte_perm_S (w0[3], w0[2], selector); w2[2] = __byte_perm_S (w0[2], w0[1], selector); w2[1] = __byte_perm_S (w0[1], w0[0], selector); w2[0] = __byte_perm_S (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: w7[3] = __byte_perm_S (w5[2], w5[1], selector); w7[2] = __byte_perm_S (w5[1], w5[0], selector); w7[1] = __byte_perm_S (w5[0], w4[3], selector); w7[0] = __byte_perm_S (w4[3], w4[2], selector); w6[3] = __byte_perm_S (w4[2], w4[1], selector); w6[2] = __byte_perm_S (w4[1], w4[0], selector); w6[1] = __byte_perm_S (w4[0], w3[3], selector); w6[0] = __byte_perm_S (w3[3], w3[2], selector); w5[3] = __byte_perm_S (w3[2], w3[1], selector); w5[2] = __byte_perm_S (w3[1], w3[0], selector); w5[1] = __byte_perm_S (w3[0], w2[3], selector); w5[0] = __byte_perm_S (w2[3], w2[2], selector); w4[3] = __byte_perm_S (w2[2], w2[1], selector); w4[2] = __byte_perm_S (w2[1], w2[0], selector); w4[1] = __byte_perm_S (w2[0], w1[3], selector); w4[0] = __byte_perm_S (w1[3], w1[2], selector); w3[3] = __byte_perm_S (w1[2], w1[1], selector); w3[2] = __byte_perm_S (w1[1], w1[0], selector); w3[1] = __byte_perm_S (w1[0], w0[3], selector); w3[0] = __byte_perm_S (w0[3], w0[2], selector); w2[3] = __byte_perm_S (w0[2], w0[1], selector); w2[2] = __byte_perm_S (w0[1], w0[0], selector); w2[1] = __byte_perm_S (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: w7[3] = __byte_perm_S (w5[1], w5[0], selector); w7[2] = __byte_perm_S (w5[0], w4[3], selector); w7[1] = __byte_perm_S (w4[3], w4[2], selector); w7[0] = __byte_perm_S (w4[2], w4[1], selector); w6[3] = __byte_perm_S (w4[1], w4[0], selector); w6[2] = __byte_perm_S (w4[0], w3[3], selector); w6[1] = __byte_perm_S (w3[3], w3[2], selector); w6[0] = __byte_perm_S (w3[2], w3[1], selector); w5[3] = __byte_perm_S (w3[1], w3[0], selector); w5[2] = __byte_perm_S (w3[0], w2[3], selector); w5[1] = __byte_perm_S (w2[3], w2[2], selector); w5[0] = __byte_perm_S (w2[2], w2[1], selector); w4[3] = __byte_perm_S (w2[1], w2[0], selector); w4[2] = __byte_perm_S (w2[0], w1[3], selector); w4[1] = __byte_perm_S (w1[3], w1[2], selector); w4[0] = __byte_perm_S (w1[2], w1[1], selector); w3[3] = __byte_perm_S (w1[1], w1[0], selector); w3[2] = __byte_perm_S (w1[0], w0[3], selector); w3[1] = __byte_perm_S (w0[3], w0[2], selector); w3[0] = __byte_perm_S (w0[2], w0[1], selector); w2[3] = __byte_perm_S (w0[1], w0[0], selector); w2[2] = __byte_perm_S (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: w7[3] = __byte_perm_S (w5[0], w4[3], selector); w7[2] = __byte_perm_S (w4[3], w4[2], selector); w7[1] = __byte_perm_S (w4[2], w4[1], selector); w7[0] = __byte_perm_S (w4[1], w4[0], selector); w6[3] = __byte_perm_S (w4[0], w3[3], selector); w6[2] = __byte_perm_S (w3[3], w3[2], selector); w6[1] = __byte_perm_S (w3[2], w3[1], selector); w6[0] = __byte_perm_S (w3[1], w3[0], selector); w5[3] = __byte_perm_S (w3[0], w2[3], selector); w5[2] = __byte_perm_S (w2[3], w2[2], selector); w5[1] = __byte_perm_S (w2[2], w2[1], selector); w5[0] = __byte_perm_S (w2[1], w2[0], selector); w4[3] = __byte_perm_S (w2[0], w1[3], selector); w4[2] = __byte_perm_S (w1[3], w1[2], selector); w4[1] = __byte_perm_S (w1[2], w1[1], selector); w4[0] = __byte_perm_S (w1[1], w1[0], selector); w3[3] = __byte_perm_S (w1[0], w0[3], selector); w3[2] = __byte_perm_S (w0[3], w0[2], selector); w3[1] = __byte_perm_S (w0[2], w0[1], selector); w3[0] = __byte_perm_S (w0[1], w0[0], selector); w2[3] = __byte_perm_S (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: w7[3] = __byte_perm_S (w4[3], w4[2], selector); w7[2] = __byte_perm_S (w4[2], w4[1], selector); w7[1] = __byte_perm_S (w4[1], w4[0], selector); w7[0] = __byte_perm_S (w4[0], w3[3], selector); w6[3] = __byte_perm_S (w3[3], w3[2], selector); w6[2] = __byte_perm_S (w3[2], w3[1], selector); w6[1] = __byte_perm_S (w3[1], w3[0], selector); w6[0] = __byte_perm_S (w3[0], w2[3], selector); w5[3] = __byte_perm_S (w2[3], w2[2], selector); w5[2] = __byte_perm_S (w2[2], w2[1], selector); w5[1] = __byte_perm_S (w2[1], w2[0], selector); w5[0] = __byte_perm_S (w2[0], w1[3], selector); w4[3] = __byte_perm_S (w1[3], w1[2], selector); w4[2] = __byte_perm_S (w1[2], w1[1], selector); w4[1] = __byte_perm_S (w1[1], w1[0], selector); w4[0] = __byte_perm_S (w1[0], w0[3], selector); w3[3] = __byte_perm_S (w0[3], w0[2], selector); w3[2] = __byte_perm_S (w0[2], w0[1], selector); w3[1] = __byte_perm_S (w0[1], w0[0], selector); w3[0] = __byte_perm_S (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: w7[3] = __byte_perm_S (w4[2], w4[1], selector); w7[2] = __byte_perm_S (w4[1], w4[0], selector); w7[1] = __byte_perm_S (w4[0], w3[3], selector); w7[0] = __byte_perm_S (w3[3], w3[2], selector); w6[3] = __byte_perm_S (w3[2], w3[1], selector); w6[2] = __byte_perm_S (w3[1], w3[0], selector); w6[1] = __byte_perm_S (w3[0], w2[3], selector); w6[0] = __byte_perm_S (w2[3], w2[2], selector); w5[3] = __byte_perm_S (w2[2], w2[1], selector); w5[2] = __byte_perm_S (w2[1], w2[0], selector); w5[1] = __byte_perm_S (w2[0], w1[3], selector); w5[0] = __byte_perm_S (w1[3], w1[2], selector); w4[3] = __byte_perm_S (w1[2], w1[1], selector); w4[2] = __byte_perm_S (w1[1], w1[0], selector); w4[1] = __byte_perm_S (w1[0], w0[3], selector); w4[0] = __byte_perm_S (w0[3], w0[2], selector); w3[3] = __byte_perm_S (w0[2], w0[1], selector); w3[2] = __byte_perm_S (w0[1], w0[0], selector); w3[1] = __byte_perm_S (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; case 14: w7[3] = __byte_perm_S (w4[1], w4[0], selector); w7[2] = __byte_perm_S (w4[0], w3[3], selector); w7[1] = __byte_perm_S (w3[3], w3[2], selector); w7[0] = __byte_perm_S (w3[2], w3[1], selector); w6[3] = __byte_perm_S (w3[1], w3[0], selector); w6[2] = __byte_perm_S (w3[0], w2[3], selector); w6[1] = __byte_perm_S (w2[3], w2[2], selector); w6[0] = __byte_perm_S (w2[2], w2[1], selector); w5[3] = __byte_perm_S (w2[1], w2[0], selector); w5[2] = __byte_perm_S (w2[0], w1[3], selector); w5[1] = __byte_perm_S (w1[3], w1[2], selector); w5[0] = __byte_perm_S (w1[2], w1[1], selector); w4[3] = __byte_perm_S (w1[1], w1[0], selector); w4[2] = __byte_perm_S (w1[0], w0[3], selector); w4[1] = __byte_perm_S (w0[3], w0[2], selector); w4[0] = __byte_perm_S (w0[2], w0[1], selector); w3[3] = __byte_perm_S (w0[1], w0[0], selector); w3[2] = __byte_perm_S (w0[0], 0, selector); w3[1] = 0; 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; case 15: w7[3] = __byte_perm_S (w4[0], w3[3], selector); w7[2] = __byte_perm_S (w3[3], w3[2], selector); w7[1] = __byte_perm_S (w3[2], w3[1], selector); w7[0] = __byte_perm_S (w3[1], w3[0], selector); w6[3] = __byte_perm_S (w3[0], w2[3], selector); w6[2] = __byte_perm_S (w2[3], w2[2], selector); w6[1] = __byte_perm_S (w2[2], w2[1], selector); w6[0] = __byte_perm_S (w2[1], w2[0], selector); w5[3] = __byte_perm_S (w2[0], w1[3], selector); w5[2] = __byte_perm_S (w1[3], w1[2], selector); w5[1] = __byte_perm_S (w1[2], w1[1], selector); w5[0] = __byte_perm_S (w1[1], w1[0], selector); w4[3] = __byte_perm_S (w1[0], w0[3], selector); w4[2] = __byte_perm_S (w0[3], w0[2], selector); w4[1] = __byte_perm_S (w0[2], w0[1], selector); w4[0] = __byte_perm_S (w0[1], w0[0], selector); w3[3] = __byte_perm_S (w0[0], 0, selector); w3[2] = 0; w3[1] = 0; 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; case 16: w7[3] = __byte_perm_S (w3[3], w3[2], selector); w7[2] = __byte_perm_S (w3[2], w3[1], selector); w7[1] = __byte_perm_S (w3[1], w3[0], selector); w7[0] = __byte_perm_S (w3[0], w2[3], selector); w6[3] = __byte_perm_S (w2[3], w2[2], selector); w6[2] = __byte_perm_S (w2[2], w2[1], selector); w6[1] = __byte_perm_S (w2[1], w2[0], selector); w6[0] = __byte_perm_S (w2[0], w1[3], selector); w5[3] = __byte_perm_S (w1[3], w1[2], selector); w5[2] = __byte_perm_S (w1[2], w1[1], selector); w5[1] = __byte_perm_S (w1[1], w1[0], selector); w5[0] = __byte_perm_S (w1[0], w0[3], selector); w4[3] = __byte_perm_S (w0[3], w0[2], selector); w4[2] = __byte_perm_S (w0[2], w0[1], selector); w4[1] = __byte_perm_S (w0[1], w0[0], selector); w4[0] = __byte_perm_S (w0[0], 0, selector); w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 17: w7[3] = __byte_perm_S (w3[2], w3[1], selector); w7[2] = __byte_perm_S (w3[1], w3[0], selector); w7[1] = __byte_perm_S (w3[0], w2[3], selector); w7[0] = __byte_perm_S (w2[3], w2[2], selector); w6[3] = __byte_perm_S (w2[2], w2[1], selector); w6[2] = __byte_perm_S (w2[1], w2[0], selector); w6[1] = __byte_perm_S (w2[0], w1[3], selector); w6[0] = __byte_perm_S (w1[3], w1[2], selector); w5[3] = __byte_perm_S (w1[2], w1[1], selector); w5[2] = __byte_perm_S (w1[1], w1[0], selector); w5[1] = __byte_perm_S (w1[0], w0[3], selector); w5[0] = __byte_perm_S (w0[3], w0[2], selector); w4[3] = __byte_perm_S (w0[2], w0[1], selector); w4[2] = __byte_perm_S (w0[1], w0[0], selector); w4[1] = __byte_perm_S (w0[0], 0, selector); w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 18: w7[3] = __byte_perm_S (w3[1], w3[0], selector); w7[2] = __byte_perm_S (w3[0], w2[3], selector); w7[1] = __byte_perm_S (w2[3], w2[2], selector); w7[0] = __byte_perm_S (w2[2], w2[1], selector); w6[3] = __byte_perm_S (w2[1], w2[0], selector); w6[2] = __byte_perm_S (w2[0], w1[3], selector); w6[1] = __byte_perm_S (w1[3], w1[2], selector); w6[0] = __byte_perm_S (w1[2], w1[1], selector); w5[3] = __byte_perm_S (w1[1], w1[0], selector); w5[2] = __byte_perm_S (w1[0], w0[3], selector); w5[1] = __byte_perm_S (w0[3], w0[2], selector); w5[0] = __byte_perm_S (w0[2], w0[1], selector); w4[3] = __byte_perm_S (w0[1], w0[0], selector); w4[2] = __byte_perm_S (w0[0], 0, selector); w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 19: w7[3] = __byte_perm_S (w3[0], w2[3], selector); w7[2] = __byte_perm_S (w2[3], w2[2], selector); w7[1] = __byte_perm_S (w2[2], w2[1], selector); w7[0] = __byte_perm_S (w2[1], w2[0], selector); w6[3] = __byte_perm_S (w2[0], w1[3], selector); w6[2] = __byte_perm_S (w1[3], w1[2], selector); w6[1] = __byte_perm_S (w1[2], w1[1], selector); w6[0] = __byte_perm_S (w1[1], w1[0], selector); w5[3] = __byte_perm_S (w1[0], w0[3], selector); w5[2] = __byte_perm_S (w0[3], w0[2], selector); w5[1] = __byte_perm_S (w0[2], w0[1], selector); w5[0] = __byte_perm_S (w0[1], w0[0], selector); w4[3] = __byte_perm_S (w0[0], 0, selector); w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 20: w7[3] = __byte_perm_S (w2[3], w2[2], selector); w7[2] = __byte_perm_S (w2[2], w2[1], selector); w7[1] = __byte_perm_S (w2[1], w2[0], selector); w7[0] = __byte_perm_S (w2[0], w1[3], selector); w6[3] = __byte_perm_S (w1[3], w1[2], selector); w6[2] = __byte_perm_S (w1[2], w1[1], selector); w6[1] = __byte_perm_S (w1[1], w1[0], selector); w6[0] = __byte_perm_S (w1[0], w0[3], selector); w5[3] = __byte_perm_S (w0[3], w0[2], selector); w5[2] = __byte_perm_S (w0[2], w0[1], selector); w5[1] = __byte_perm_S (w0[1], w0[0], selector); w5[0] = __byte_perm_S (w0[0], 0, selector); w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 21: w7[3] = __byte_perm_S (w2[2], w2[1], selector); w7[2] = __byte_perm_S (w2[1], w2[0], selector); w7[1] = __byte_perm_S (w2[0], w1[3], selector); w7[0] = __byte_perm_S (w1[3], w1[2], selector); w6[3] = __byte_perm_S (w1[2], w1[1], selector); w6[2] = __byte_perm_S (w1[1], w1[0], selector); w6[1] = __byte_perm_S (w1[0], w0[3], selector); w6[0] = __byte_perm_S (w0[3], w0[2], selector); w5[3] = __byte_perm_S (w0[2], w0[1], selector); w5[2] = __byte_perm_S (w0[1], w0[0], selector); w5[1] = __byte_perm_S (w0[0], 0, selector); w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 22: w7[3] = __byte_perm_S (w2[1], w2[0], selector); w7[2] = __byte_perm_S (w2[0], w1[3], selector); w7[1] = __byte_perm_S (w1[3], w1[2], selector); w7[0] = __byte_perm_S (w1[2], w1[1], selector); w6[3] = __byte_perm_S (w1[1], w1[0], selector); w6[2] = __byte_perm_S (w1[0], w0[3], selector); w6[1] = __byte_perm_S (w0[3], w0[2], selector); w6[0] = __byte_perm_S (w0[2], w0[1], selector); w5[3] = __byte_perm_S (w0[1], w0[0], selector); w5[2] = __byte_perm_S (w0[0], 0, selector); w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 23: w7[3] = __byte_perm_S (w2[0], w1[3], selector); w7[2] = __byte_perm_S (w1[3], w1[2], selector); w7[1] = __byte_perm_S (w1[2], w1[1], selector); w7[0] = __byte_perm_S (w1[1], w1[0], selector); w6[3] = __byte_perm_S (w1[0], w0[3], selector); w6[2] = __byte_perm_S (w0[3], w0[2], selector); w6[1] = __byte_perm_S (w0[2], w0[1], selector); w6[0] = __byte_perm_S (w0[1], w0[0], selector); w5[3] = __byte_perm_S (w0[0], 0, selector); w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 24: w7[3] = __byte_perm_S (w1[3], w1[2], selector); w7[2] = __byte_perm_S (w1[2], w1[1], selector); w7[1] = __byte_perm_S (w1[1], w1[0], selector); w7[0] = __byte_perm_S (w1[0], w0[3], selector); w6[3] = __byte_perm_S (w0[3], w0[2], selector); w6[2] = __byte_perm_S (w0[2], w0[1], selector); w6[1] = __byte_perm_S (w0[1], w0[0], selector); w6[0] = __byte_perm_S (w0[0], 0, selector); w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 25: w7[3] = __byte_perm_S (w1[2], w1[1], selector); w7[2] = __byte_perm_S (w1[1], w1[0], selector); w7[1] = __byte_perm_S (w1[0], w0[3], selector); w7[0] = __byte_perm_S (w0[3], w0[2], selector); w6[3] = __byte_perm_S (w0[2], w0[1], selector); w6[2] = __byte_perm_S (w0[1], w0[0], selector); w6[1] = __byte_perm_S (w0[0], 0, selector); w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 26: w7[3] = __byte_perm_S (w1[1], w1[0], selector); w7[2] = __byte_perm_S (w1[0], w0[3], selector); w7[1] = __byte_perm_S (w0[3], w0[2], selector); w7[0] = __byte_perm_S (w0[2], w0[1], selector); w6[3] = __byte_perm_S (w0[1], w0[0], selector); w6[2] = __byte_perm_S (w0[0], 0, selector); w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 27: w7[3] = __byte_perm_S (w1[0], w0[3], selector); w7[2] = __byte_perm_S (w0[3], w0[2], selector); w7[1] = __byte_perm_S (w0[2], w0[1], selector); w7[0] = __byte_perm_S (w0[1], w0[0], selector); w6[3] = __byte_perm_S (w0[0], 0, selector); w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 28: w7[3] = __byte_perm_S (w0[3], w0[2], selector); w7[2] = __byte_perm_S (w0[2], w0[1], selector); w7[1] = __byte_perm_S (w0[1], w0[0], selector); w7[0] = __byte_perm_S (w0[0], 0, selector); w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 29: w7[3] = __byte_perm_S (w0[2], w0[1], selector); w7[2] = __byte_perm_S (w0[1], w0[0], selector); w7[1] = __byte_perm_S (w0[0], 0, selector); w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 30: w7[3] = __byte_perm_S (w0[1], w0[0], selector); w7[2] = __byte_perm_S (w0[0], 0, selector); w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 31: w7[3] = __byte_perm_S (w0[0], 0, selector); w7[2] = 0; w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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 } void switch_buffer_by_offset_8x4_carry_be_S (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 w4[4], u32 w5[4], u32 w6[4], u32 w7[4], u32 c0[4], u32 c1[4], u32 c2[4], u32 c3[4], u32 c4[4], u32 c5[4], u32 c6[4], u32 c7[4], const u32 offset) { #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if (defined IS_AMD && AMD_GCN < 3) || defined IS_GENERIC switch (offset_switch) { case 0: c0[0] = amd_bytealign_S (w7[3], 0, offset); w7[3] = amd_bytealign_S (w7[2], w7[3], offset); w7[2] = amd_bytealign_S (w7[1], w7[2], offset); w7[1] = amd_bytealign_S (w7[0], w7[1], offset); w7[0] = amd_bytealign_S (w6[3], w7[0], offset); w6[3] = amd_bytealign_S (w6[2], w6[3], offset); w6[2] = amd_bytealign_S (w6[1], w6[2], offset); w6[1] = amd_bytealign_S (w6[0], w6[1], offset); w6[0] = amd_bytealign_S (w5[3], w6[0], offset); w5[3] = amd_bytealign_S (w5[2], w5[3], offset); w5[2] = amd_bytealign_S (w5[1], w5[2], offset); w5[1] = amd_bytealign_S (w5[0], w5[1], offset); w5[0] = amd_bytealign_S (w4[3], w5[0], offset); w4[3] = amd_bytealign_S (w4[2], w4[3], offset); w4[2] = amd_bytealign_S (w4[1], w4[2], offset); w4[1] = amd_bytealign_S (w4[0], w4[1], offset); w4[0] = amd_bytealign_S (w3[3], w4[0], offset); w3[3] = amd_bytealign_S (w3[2], w3[3], offset); w3[2] = amd_bytealign_S (w3[1], w3[2], offset); w3[1] = amd_bytealign_S (w3[0], w3[1], offset); w3[0] = amd_bytealign_S (w2[3], w3[0], offset); w2[3] = amd_bytealign_S (w2[2], w2[3], offset); w2[2] = amd_bytealign_S (w2[1], w2[2], offset); w2[1] = amd_bytealign_S (w2[0], w2[1], offset); w2[0] = amd_bytealign_S (w1[3], w2[0], offset); w1[3] = amd_bytealign_S (w1[2], w1[3], offset); w1[2] = amd_bytealign_S (w1[1], w1[2], offset); w1[1] = amd_bytealign_S (w1[0], w1[1], offset); w1[0] = amd_bytealign_S (w0[3], w1[0], offset); w0[3] = amd_bytealign_S (w0[2], w0[3], offset); w0[2] = amd_bytealign_S (w0[1], w0[2], offset); w0[1] = amd_bytealign_S (w0[0], w0[1], offset); w0[0] = amd_bytealign_S ( 0, w0[0], offset); break; case 1: c0[1] = amd_bytealign_S (w7[3], 0, offset); c0[0] = amd_bytealign_S (w7[2], w7[3], offset); w7[3] = amd_bytealign_S (w7[1], w7[2], offset); w7[2] = amd_bytealign_S (w7[0], w7[1], offset); w7[1] = amd_bytealign_S (w6[3], w7[0], offset); w7[0] = amd_bytealign_S (w6[2], w6[3], offset); w6[3] = amd_bytealign_S (w6[1], w6[2], offset); w6[2] = amd_bytealign_S (w6[0], w6[1], offset); w6[1] = amd_bytealign_S (w5[3], w6[0], offset); w6[0] = amd_bytealign_S (w5[2], w5[3], offset); w5[3] = amd_bytealign_S (w5[1], w5[2], offset); w5[2] = amd_bytealign_S (w5[0], w5[1], offset); w5[1] = amd_bytealign_S (w4[3], w5[0], offset); w5[0] = amd_bytealign_S (w4[2], w4[3], offset); w4[3] = amd_bytealign_S (w4[1], w4[2], offset); w4[2] = amd_bytealign_S (w4[0], w4[1], offset); w4[1] = amd_bytealign_S (w3[3], w4[0], offset); w4[0] = amd_bytealign_S (w3[2], w3[3], offset); w3[3] = amd_bytealign_S (w3[1], w3[2], offset); w3[2] = amd_bytealign_S (w3[0], w3[1], offset); w3[1] = amd_bytealign_S (w2[3], w3[0], offset); w3[0] = amd_bytealign_S (w2[2], w2[3], offset); w2[3] = amd_bytealign_S (w2[1], w2[2], offset); w2[2] = amd_bytealign_S (w2[0], w2[1], offset); w2[1] = amd_bytealign_S (w1[3], w2[0], offset); w2[0] = amd_bytealign_S (w1[2], w1[3], offset); w1[3] = amd_bytealign_S (w1[1], w1[2], offset); w1[2] = amd_bytealign_S (w1[0], w1[1], offset); w1[1] = amd_bytealign_S (w0[3], w1[0], offset); w1[0] = amd_bytealign_S (w0[2], w0[3], offset); w0[3] = amd_bytealign_S (w0[1], w0[2], offset); w0[2] = amd_bytealign_S (w0[0], w0[1], offset); w0[1] = amd_bytealign_S ( 0, w0[0], offset); w0[0] = 0; break; case 2: c0[2] = amd_bytealign_S (w7[3], 0, offset); c0[1] = amd_bytealign_S (w7[2], w7[3], offset); c0[0] = amd_bytealign_S (w7[1], w7[2], offset); w7[3] = amd_bytealign_S (w7[0], w7[1], offset); w7[2] = amd_bytealign_S (w6[3], w7[0], offset); w7[1] = amd_bytealign_S (w6[2], w6[3], offset); w7[0] = amd_bytealign_S (w6[1], w6[2], offset); w6[3] = amd_bytealign_S (w6[0], w6[1], offset); w6[2] = amd_bytealign_S (w5[3], w6[0], offset); w6[1] = amd_bytealign_S (w5[2], w5[3], offset); w6[0] = amd_bytealign_S (w5[1], w5[2], offset); w5[3] = amd_bytealign_S (w5[0], w5[1], offset); w5[2] = amd_bytealign_S (w4[3], w5[0], offset); w5[1] = amd_bytealign_S (w4[2], w4[3], offset); w5[0] = amd_bytealign_S (w4[1], w4[2], offset); w4[3] = amd_bytealign_S (w4[0], w4[1], offset); w4[2] = amd_bytealign_S (w3[3], w4[0], offset); w4[1] = amd_bytealign_S (w3[2], w3[3], offset); w4[0] = amd_bytealign_S (w3[1], w3[2], offset); w3[3] = amd_bytealign_S (w3[0], w3[1], offset); w3[2] = amd_bytealign_S (w2[3], w3[0], offset); w3[1] = amd_bytealign_S (w2[2], w2[3], offset); w3[0] = amd_bytealign_S (w2[1], w2[2], offset); w2[3] = amd_bytealign_S (w2[0], w2[1], offset); w2[2] = amd_bytealign_S (w1[3], w2[0], offset); w2[1] = amd_bytealign_S (w1[2], w1[3], offset); w2[0] = amd_bytealign_S (w1[1], w1[2], offset); w1[3] = amd_bytealign_S (w1[0], w1[1], offset); w1[2] = amd_bytealign_S (w0[3], w1[0], offset); w1[1] = amd_bytealign_S (w0[2], w0[3], offset); w1[0] = amd_bytealign_S (w0[1], w0[2], offset); w0[3] = amd_bytealign_S (w0[0], w0[1], offset); w0[2] = amd_bytealign_S ( 0, w0[0], offset); w0[1] = 0; w0[0] = 0; break; case 3: c0[3] = amd_bytealign_S (w7[3], 0, offset); c0[2] = amd_bytealign_S (w7[2], w7[3], offset); c0[1] = amd_bytealign_S (w7[1], w7[2], offset); c0[0] = amd_bytealign_S (w7[0], w7[1], offset); w7[3] = amd_bytealign_S (w6[3], w7[0], offset); w7[2] = amd_bytealign_S (w6[2], w6[3], offset); w7[1] = amd_bytealign_S (w6[1], w6[2], offset); w7[0] = amd_bytealign_S (w6[0], w6[1], offset); w6[3] = amd_bytealign_S (w5[3], w6[0], offset); w6[2] = amd_bytealign_S (w5[2], w5[3], offset); w6[1] = amd_bytealign_S (w5[1], w5[2], offset); w6[0] = amd_bytealign_S (w5[0], w5[1], offset); w5[3] = amd_bytealign_S (w4[3], w5[0], offset); w5[2] = amd_bytealign_S (w4[2], w4[3], offset); w5[1] = amd_bytealign_S (w4[1], w4[2], offset); w5[0] = amd_bytealign_S (w4[0], w4[1], offset); w4[3] = amd_bytealign_S (w3[3], w4[0], offset); w4[2] = amd_bytealign_S (w3[2], w3[3], offset); w4[1] = amd_bytealign_S (w3[1], w3[2], offset); w4[0] = amd_bytealign_S (w3[0], w3[1], offset); w3[3] = amd_bytealign_S (w2[3], w3[0], offset); w3[2] = amd_bytealign_S (w2[2], w2[3], offset); w3[1] = amd_bytealign_S (w2[1], w2[2], offset); w3[0] = amd_bytealign_S (w2[0], w2[1], offset); w2[3] = amd_bytealign_S (w1[3], w2[0], offset); w2[2] = amd_bytealign_S (w1[2], w1[3], offset); w2[1] = amd_bytealign_S (w1[1], w1[2], offset); w2[0] = amd_bytealign_S (w1[0], w1[1], offset); w1[3] = amd_bytealign_S (w0[3], w1[0], offset); w1[2] = amd_bytealign_S (w0[2], w0[3], offset); w1[1] = amd_bytealign_S (w0[1], w0[2], offset); w1[0] = amd_bytealign_S (w0[0], w0[1], offset); w0[3] = amd_bytealign_S ( 0, w0[0], offset); w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 4: c1[0] = amd_bytealign_S (w7[3], 0, offset); c0[3] = amd_bytealign_S (w7[2], w7[3], offset); c0[2] = amd_bytealign_S (w7[1], w7[2], offset); c0[1] = amd_bytealign_S (w7[0], w7[1], offset); c0[0] = amd_bytealign_S (w6[3], w7[0], offset); w7[3] = amd_bytealign_S (w6[2], w6[3], offset); w7[2] = amd_bytealign_S (w6[1], w6[2], offset); w7[1] = amd_bytealign_S (w6[0], w6[1], offset); w7[0] = amd_bytealign_S (w5[3], w6[0], offset); w6[3] = amd_bytealign_S (w5[2], w5[3], offset); w6[2] = amd_bytealign_S (w5[1], w5[2], offset); w6[1] = amd_bytealign_S (w5[0], w5[1], offset); w6[0] = amd_bytealign_S (w4[3], w5[0], offset); w5[3] = amd_bytealign_S (w4[2], w4[3], offset); w5[2] = amd_bytealign_S (w4[1], w4[2], offset); w5[1] = amd_bytealign_S (w4[0], w4[1], offset); w5[0] = amd_bytealign_S (w3[3], w4[0], offset); w4[3] = amd_bytealign_S (w3[2], w3[3], offset); w4[2] = amd_bytealign_S (w3[1], w3[2], offset); w4[1] = amd_bytealign_S (w3[0], w3[1], offset); w4[0] = amd_bytealign_S (w2[3], w3[0], offset); w3[3] = amd_bytealign_S (w2[2], w2[3], offset); w3[2] = amd_bytealign_S (w2[1], w2[2], offset); w3[1] = amd_bytealign_S (w2[0], w2[1], offset); w3[0] = amd_bytealign_S (w1[3], w2[0], offset); w2[3] = amd_bytealign_S (w1[2], w1[3], offset); w2[2] = amd_bytealign_S (w1[1], w1[2], offset); w2[1] = amd_bytealign_S (w1[0], w1[1], offset); w2[0] = amd_bytealign_S (w0[3], w1[0], offset); w1[3] = amd_bytealign_S (w0[2], w0[3], offset); w1[2] = amd_bytealign_S (w0[1], w0[2], offset); w1[1] = amd_bytealign_S (w0[0], w0[1], offset); w1[0] = amd_bytealign_S ( 0, w0[0], offset); w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 5: c1[1] = amd_bytealign_S (w7[3], 0, offset); c1[0] = amd_bytealign_S (w7[2], w7[3], offset); c0[3] = amd_bytealign_S (w7[1], w7[2], offset); c0[2] = amd_bytealign_S (w7[0], w7[1], offset); c0[1] = amd_bytealign_S (w6[3], w7[0], offset); c0[0] = amd_bytealign_S (w6[2], w6[3], offset); w7[3] = amd_bytealign_S (w6[1], w6[2], offset); w7[2] = amd_bytealign_S (w6[0], w6[1], offset); w7[1] = amd_bytealign_S (w5[3], w6[0], offset); w7[0] = amd_bytealign_S (w5[2], w5[3], offset); w6[3] = amd_bytealign_S (w5[1], w5[2], offset); w6[2] = amd_bytealign_S (w5[0], w5[1], offset); w6[1] = amd_bytealign_S (w4[3], w5[0], offset); w6[0] = amd_bytealign_S (w4[2], w4[3], offset); w5[3] = amd_bytealign_S (w4[1], w4[2], offset); w5[2] = amd_bytealign_S (w4[0], w4[1], offset); w5[1] = amd_bytealign_S (w3[3], w4[0], offset); w5[0] = amd_bytealign_S (w3[2], w3[3], offset); w4[3] = amd_bytealign_S (w3[1], w3[2], offset); w4[2] = amd_bytealign_S (w3[0], w3[1], offset); w4[1] = amd_bytealign_S (w2[3], w3[0], offset); w4[0] = amd_bytealign_S (w2[2], w2[3], offset); w3[3] = amd_bytealign_S (w2[1], w2[2], offset); w3[2] = amd_bytealign_S (w2[0], w2[1], offset); w3[1] = amd_bytealign_S (w1[3], w2[0], offset); w3[0] = amd_bytealign_S (w1[2], w1[3], offset); w2[3] = amd_bytealign_S (w1[1], w1[2], offset); w2[2] = amd_bytealign_S (w1[0], w1[1], offset); w2[1] = amd_bytealign_S (w0[3], w1[0], offset); w2[0] = amd_bytealign_S (w0[2], w0[3], offset); w1[3] = amd_bytealign_S (w0[1], w0[2], offset); w1[2] = amd_bytealign_S (w0[0], w0[1], offset); w1[1] = amd_bytealign_S ( 0, w0[0], offset); w1[0] = 0; w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 6: c1[2] = amd_bytealign_S (w7[3], 0, offset); c1[1] = amd_bytealign_S (w7[2], w7[3], offset); c1[0] = amd_bytealign_S (w7[1], w7[2], offset); c0[3] = amd_bytealign_S (w7[0], w7[1], offset); c0[2] = amd_bytealign_S (w6[3], w7[0], offset); c0[1] = amd_bytealign_S (w6[2], w6[3], offset); c0[0] = amd_bytealign_S (w6[1], w6[2], offset); w7[3] = amd_bytealign_S (w6[0], w6[1], offset); w7[2] = amd_bytealign_S (w5[3], w6[0], offset); w7[1] = amd_bytealign_S (w5[2], w5[3], offset); w7[0] = amd_bytealign_S (w5[1], w5[2], offset); w6[3] = amd_bytealign_S (w5[0], w5[1], offset); w6[2] = amd_bytealign_S (w4[3], w5[0], offset); w6[1] = amd_bytealign_S (w4[2], w4[3], offset); w6[0] = amd_bytealign_S (w4[1], w4[2], offset); w5[3] = amd_bytealign_S (w4[0], w4[1], offset); w5[2] = amd_bytealign_S (w3[3], w4[0], offset); w5[1] = amd_bytealign_S (w3[2], w3[3], offset); w5[0] = amd_bytealign_S (w3[1], w3[2], offset); w4[3] = amd_bytealign_S (w3[0], w3[1], offset); w4[2] = amd_bytealign_S (w2[3], w3[0], offset); w4[1] = amd_bytealign_S (w2[2], w2[3], offset); w4[0] = amd_bytealign_S (w2[1], w2[2], offset); w3[3] = amd_bytealign_S (w2[0], w2[1], offset); w3[2] = amd_bytealign_S (w1[3], w2[0], offset); w3[1] = amd_bytealign_S (w1[2], w1[3], offset); w3[0] = amd_bytealign_S (w1[1], w1[2], offset); w2[3] = amd_bytealign_S (w1[0], w1[1], offset); w2[2] = amd_bytealign_S (w0[3], w1[0], offset); w2[1] = amd_bytealign_S (w0[2], w0[3], offset); w2[0] = amd_bytealign_S (w0[1], w0[2], offset); w1[3] = amd_bytealign_S (w0[0], w0[1], offset); w1[2] = amd_bytealign_S ( 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: c1[3] = amd_bytealign_S (w7[3], 0, offset); c1[2] = amd_bytealign_S (w7[2], w7[3], offset); c1[1] = amd_bytealign_S (w7[1], w7[2], offset); c1[0] = amd_bytealign_S (w7[0], w7[1], offset); c0[3] = amd_bytealign_S (w6[3], w7[0], offset); c0[2] = amd_bytealign_S (w6[2], w6[3], offset); c0[1] = amd_bytealign_S (w6[1], w6[2], offset); c0[0] = amd_bytealign_S (w6[0], w6[1], offset); w7[3] = amd_bytealign_S (w5[3], w6[0], offset); w7[2] = amd_bytealign_S (w5[2], w5[3], offset); w7[1] = amd_bytealign_S (w5[1], w5[2], offset); w7[0] = amd_bytealign_S (w5[0], w5[1], offset); w6[3] = amd_bytealign_S (w4[3], w5[0], offset); w6[2] = amd_bytealign_S (w4[2], w4[3], offset); w6[1] = amd_bytealign_S (w4[1], w4[2], offset); w6[0] = amd_bytealign_S (w4[0], w4[1], offset); w5[3] = amd_bytealign_S (w3[3], w4[0], offset); w5[2] = amd_bytealign_S (w3[2], w3[3], offset); w5[1] = amd_bytealign_S (w3[1], w3[2], offset); w5[0] = amd_bytealign_S (w3[0], w3[1], offset); w4[3] = amd_bytealign_S (w2[3], w3[0], offset); w4[2] = amd_bytealign_S (w2[2], w2[3], offset); w4[1] = amd_bytealign_S (w2[1], w2[2], offset); w4[0] = amd_bytealign_S (w2[0], w2[1], offset); w3[3] = amd_bytealign_S (w1[3], w2[0], offset); w3[2] = amd_bytealign_S (w1[2], w1[3], offset); w3[1] = amd_bytealign_S (w1[1], w1[2], offset); w3[0] = amd_bytealign_S (w1[0], w1[1], offset); w2[3] = amd_bytealign_S (w0[3], w1[0], offset); w2[2] = amd_bytealign_S (w0[2], w0[3], offset); w2[1] = amd_bytealign_S (w0[1], w0[2], offset); w2[0] = amd_bytealign_S (w0[0], w0[1], offset); w1[3] = amd_bytealign_S ( 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: c2[0] = amd_bytealign_S (w7[3], 0, offset); c1[3] = amd_bytealign_S (w7[2], w7[3], offset); c1[2] = amd_bytealign_S (w7[1], w7[2], offset); c1[1] = amd_bytealign_S (w7[0], w7[1], offset); c1[0] = amd_bytealign_S (w6[3], w7[0], offset); c0[3] = amd_bytealign_S (w6[2], w6[3], offset); c0[2] = amd_bytealign_S (w6[1], w6[2], offset); c0[1] = amd_bytealign_S (w6[0], w6[1], offset); c0[0] = amd_bytealign_S (w5[3], w6[0], offset); w7[3] = amd_bytealign_S (w5[2], w5[3], offset); w7[2] = amd_bytealign_S (w5[1], w5[2], offset); w7[1] = amd_bytealign_S (w5[0], w5[1], offset); w7[0] = amd_bytealign_S (w4[3], w5[0], offset); w6[3] = amd_bytealign_S (w4[2], w4[3], offset); w6[2] = amd_bytealign_S (w4[1], w4[2], offset); w6[1] = amd_bytealign_S (w4[0], w4[1], offset); w6[0] = amd_bytealign_S (w3[3], w4[0], offset); w5[3] = amd_bytealign_S (w3[2], w3[3], offset); w5[2] = amd_bytealign_S (w3[1], w3[2], offset); w5[1] = amd_bytealign_S (w3[0], w3[1], offset); w5[0] = amd_bytealign_S (w2[3], w3[0], offset); w4[3] = amd_bytealign_S (w2[2], w2[3], offset); w4[2] = amd_bytealign_S (w2[1], w2[2], offset); w4[1] = amd_bytealign_S (w2[0], w2[1], offset); w4[0] = amd_bytealign_S (w1[3], w2[0], offset); w3[3] = amd_bytealign_S (w1[2], w1[3], offset); w3[2] = amd_bytealign_S (w1[1], w1[2], offset); w3[1] = amd_bytealign_S (w1[0], w1[1], offset); w3[0] = amd_bytealign_S (w0[3], w1[0], offset); w2[3] = amd_bytealign_S (w0[2], w0[3], offset); w2[2] = amd_bytealign_S (w0[1], w0[2], offset); w2[1] = amd_bytealign_S (w0[0], w0[1], offset); w2[0] = amd_bytealign_S ( 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: c2[1] = amd_bytealign_S (w7[3], 0, offset); c2[0] = amd_bytealign_S (w7[2], w7[3], offset); c1[3] = amd_bytealign_S (w7[1], w7[2], offset); c1[2] = amd_bytealign_S (w7[0], w7[1], offset); c1[1] = amd_bytealign_S (w6[3], w7[0], offset); c1[0] = amd_bytealign_S (w6[2], w6[3], offset); c0[3] = amd_bytealign_S (w6[1], w6[2], offset); c0[2] = amd_bytealign_S (w6[0], w6[1], offset); c0[1] = amd_bytealign_S (w5[3], w6[0], offset); c0[0] = amd_bytealign_S (w5[2], w5[3], offset); w7[3] = amd_bytealign_S (w5[1], w5[2], offset); w7[2] = amd_bytealign_S (w5[0], w5[1], offset); w7[1] = amd_bytealign_S (w4[3], w5[0], offset); w7[0] = amd_bytealign_S (w4[2], w4[3], offset); w6[3] = amd_bytealign_S (w4[1], w4[2], offset); w6[2] = amd_bytealign_S (w4[0], w4[1], offset); w6[1] = amd_bytealign_S (w3[3], w4[0], offset); w6[0] = amd_bytealign_S (w3[2], w3[3], offset); w5[3] = amd_bytealign_S (w3[1], w3[2], offset); w5[2] = amd_bytealign_S (w3[0], w3[1], offset); w5[1] = amd_bytealign_S (w2[3], w3[0], offset); w5[0] = amd_bytealign_S (w2[2], w2[3], offset); w4[3] = amd_bytealign_S (w2[1], w2[2], offset); w4[2] = amd_bytealign_S (w2[0], w2[1], offset); w4[1] = amd_bytealign_S (w1[3], w2[0], offset); w4[0] = amd_bytealign_S (w1[2], w1[3], offset); w3[3] = amd_bytealign_S (w1[1], w1[2], offset); w3[2] = amd_bytealign_S (w1[0], w1[1], offset); w3[1] = amd_bytealign_S (w0[3], w1[0], offset); w3[0] = amd_bytealign_S (w0[2], w0[3], offset); w2[3] = amd_bytealign_S (w0[1], w0[2], offset); w2[2] = amd_bytealign_S (w0[0], w0[1], offset); w2[1] = amd_bytealign_S ( 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: c2[2] = amd_bytealign_S (w7[3], 0, offset); c2[1] = amd_bytealign_S (w7[2], w7[3], offset); c2[0] = amd_bytealign_S (w7[1], w7[2], offset); c1[3] = amd_bytealign_S (w7[0], w7[1], offset); c1[2] = amd_bytealign_S (w6[3], w7[0], offset); c1[1] = amd_bytealign_S (w6[2], w6[3], offset); c1[0] = amd_bytealign_S (w6[1], w6[2], offset); c0[3] = amd_bytealign_S (w6[0], w6[1], offset); c0[2] = amd_bytealign_S (w5[3], w6[0], offset); c0[1] = amd_bytealign_S (w5[2], w5[3], offset); c0[0] = amd_bytealign_S (w5[1], w5[2], offset); w7[3] = amd_bytealign_S (w5[0], w5[1], offset); w7[2] = amd_bytealign_S (w4[3], w5[0], offset); w7[1] = amd_bytealign_S (w4[2], w4[3], offset); w7[0] = amd_bytealign_S (w4[1], w4[2], offset); w6[3] = amd_bytealign_S (w4[0], w4[1], offset); w6[2] = amd_bytealign_S (w3[3], w4[0], offset); w6[1] = amd_bytealign_S (w3[2], w3[3], offset); w6[0] = amd_bytealign_S (w3[1], w3[2], offset); w5[3] = amd_bytealign_S (w3[0], w3[1], offset); w5[2] = amd_bytealign_S (w2[3], w3[0], offset); w5[1] = amd_bytealign_S (w2[2], w2[3], offset); w5[0] = amd_bytealign_S (w2[1], w2[2], offset); w4[3] = amd_bytealign_S (w2[0], w2[1], offset); w4[2] = amd_bytealign_S (w1[3], w2[0], offset); w4[1] = amd_bytealign_S (w1[2], w1[3], offset); w4[0] = amd_bytealign_S (w1[1], w1[2], offset); w3[3] = amd_bytealign_S (w1[0], w1[1], offset); w3[2] = amd_bytealign_S (w0[3], w1[0], offset); w3[1] = amd_bytealign_S (w0[2], w0[3], offset); w3[0] = amd_bytealign_S (w0[1], w0[2], offset); w2[3] = amd_bytealign_S (w0[0], w0[1], offset); w2[2] = amd_bytealign_S ( 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: c2[3] = amd_bytealign_S (w7[3], 0, offset); c2[2] = amd_bytealign_S (w7[2], w7[3], offset); c2[1] = amd_bytealign_S (w7[1], w7[2], offset); c2[0] = amd_bytealign_S (w7[0], w7[1], offset); c1[3] = amd_bytealign_S (w6[3], w7[0], offset); c1[2] = amd_bytealign_S (w6[2], w6[3], offset); c1[1] = amd_bytealign_S (w6[1], w6[2], offset); c1[0] = amd_bytealign_S (w6[0], w6[1], offset); c0[3] = amd_bytealign_S (w5[3], w6[0], offset); c0[2] = amd_bytealign_S (w5[2], w5[3], offset); c0[1] = amd_bytealign_S (w5[1], w5[2], offset); c0[0] = amd_bytealign_S (w5[0], w5[1], offset); w7[3] = amd_bytealign_S (w4[3], w5[0], offset); w7[2] = amd_bytealign_S (w4[2], w4[3], offset); w7[1] = amd_bytealign_S (w4[1], w4[2], offset); w7[0] = amd_bytealign_S (w4[0], w4[1], offset); w6[3] = amd_bytealign_S (w3[3], w4[0], offset); w6[2] = amd_bytealign_S (w3[2], w3[3], offset); w6[1] = amd_bytealign_S (w3[1], w3[2], offset); w6[0] = amd_bytealign_S (w3[0], w3[1], offset); w5[3] = amd_bytealign_S (w2[3], w3[0], offset); w5[2] = amd_bytealign_S (w2[2], w2[3], offset); w5[1] = amd_bytealign_S (w2[1], w2[2], offset); w5[0] = amd_bytealign_S (w2[0], w2[1], offset); w4[3] = amd_bytealign_S (w1[3], w2[0], offset); w4[2] = amd_bytealign_S (w1[2], w1[3], offset); w4[1] = amd_bytealign_S (w1[1], w1[2], offset); w4[0] = amd_bytealign_S (w1[0], w1[1], offset); w3[3] = amd_bytealign_S (w0[3], w1[0], offset); w3[2] = amd_bytealign_S (w0[2], w0[3], offset); w3[1] = amd_bytealign_S (w0[1], w0[2], offset); w3[0] = amd_bytealign_S (w0[0], w0[1], offset); w2[3] = amd_bytealign_S ( 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: c3[0] = amd_bytealign_S (w7[3], 0, offset); c2[3] = amd_bytealign_S (w7[2], w7[3], offset); c2[2] = amd_bytealign_S (w7[1], w7[2], offset); c2[1] = amd_bytealign_S (w7[0], w7[1], offset); c2[0] = amd_bytealign_S (w6[3], w7[0], offset); c1[3] = amd_bytealign_S (w6[2], w6[3], offset); c1[2] = amd_bytealign_S (w6[1], w6[2], offset); c1[1] = amd_bytealign_S (w6[0], w6[1], offset); c1[0] = amd_bytealign_S (w5[3], w6[0], offset); c0[3] = amd_bytealign_S (w5[2], w5[3], offset); c0[2] = amd_bytealign_S (w5[1], w5[2], offset); c0[1] = amd_bytealign_S (w5[0], w5[1], offset); c0[0] = amd_bytealign_S (w4[3], w5[0], offset); w7[3] = amd_bytealign_S (w4[2], w4[3], offset); w7[2] = amd_bytealign_S (w4[1], w4[2], offset); w7[1] = amd_bytealign_S (w4[0], w4[1], offset); w7[0] = amd_bytealign_S (w3[3], w4[0], offset); w6[3] = amd_bytealign_S (w3[2], w3[3], offset); w6[2] = amd_bytealign_S (w3[1], w3[2], offset); w6[1] = amd_bytealign_S (w3[0], w3[1], offset); w6[0] = amd_bytealign_S (w2[3], w3[0], offset); w5[3] = amd_bytealign_S (w2[2], w2[3], offset); w5[2] = amd_bytealign_S (w2[1], w2[2], offset); w5[1] = amd_bytealign_S (w2[0], w2[1], offset); w5[0] = amd_bytealign_S (w1[3], w2[0], offset); w4[3] = amd_bytealign_S (w1[2], w1[3], offset); w4[2] = amd_bytealign_S (w1[1], w1[2], offset); w4[1] = amd_bytealign_S (w1[0], w1[1], offset); w4[0] = amd_bytealign_S (w0[3], w1[0], offset); w3[3] = amd_bytealign_S (w0[2], w0[3], offset); w3[2] = amd_bytealign_S (w0[1], w0[2], offset); w3[1] = amd_bytealign_S (w0[0], w0[1], offset); w3[0] = amd_bytealign_S ( 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: c3[1] = amd_bytealign_S (w7[3], 0, offset); c3[0] = amd_bytealign_S (w7[2], w7[3], offset); c2[3] = amd_bytealign_S (w7[1], w7[2], offset); c2[2] = amd_bytealign_S (w7[0], w7[1], offset); c2[1] = amd_bytealign_S (w6[3], w7[0], offset); c2[0] = amd_bytealign_S (w6[2], w6[3], offset); c1[3] = amd_bytealign_S (w6[1], w6[2], offset); c1[2] = amd_bytealign_S (w6[0], w6[1], offset); c1[1] = amd_bytealign_S (w5[3], w6[0], offset); c1[0] = amd_bytealign_S (w5[2], w5[3], offset); c0[3] = amd_bytealign_S (w5[1], w5[2], offset); c0[2] = amd_bytealign_S (w5[0], w5[1], offset); c0[1] = amd_bytealign_S (w4[3], w5[0], offset); c0[0] = amd_bytealign_S (w4[2], w4[3], offset); w7[3] = amd_bytealign_S (w4[1], w4[2], offset); w7[2] = amd_bytealign_S (w4[0], w4[1], offset); w7[1] = amd_bytealign_S (w3[3], w4[0], offset); w7[0] = amd_bytealign_S (w3[2], w3[3], offset); w6[3] = amd_bytealign_S (w3[1], w3[2], offset); w6[2] = amd_bytealign_S (w3[0], w3[1], offset); w6[1] = amd_bytealign_S (w2[3], w3[0], offset); w6[0] = amd_bytealign_S (w2[2], w2[3], offset); w5[3] = amd_bytealign_S (w2[1], w2[2], offset); w5[2] = amd_bytealign_S (w2[0], w2[1], offset); w5[1] = amd_bytealign_S (w1[3], w2[0], offset); w5[0] = amd_bytealign_S (w1[2], w1[3], offset); w4[3] = amd_bytealign_S (w1[1], w1[2], offset); w4[2] = amd_bytealign_S (w1[0], w1[1], offset); w4[1] = amd_bytealign_S (w0[3], w1[0], offset); w4[0] = amd_bytealign_S (w0[2], w0[3], offset); w3[3] = amd_bytealign_S (w0[1], w0[2], offset); w3[2] = amd_bytealign_S (w0[0], w0[1], offset); w3[1] = amd_bytealign_S ( 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; case 14: c3[2] = amd_bytealign_S (w7[3], 0, offset); c3[1] = amd_bytealign_S (w7[2], w7[3], offset); c3[0] = amd_bytealign_S (w7[1], w7[2], offset); c2[3] = amd_bytealign_S (w7[0], w7[1], offset); c2[2] = amd_bytealign_S (w6[3], w7[0], offset); c2[1] = amd_bytealign_S (w6[2], w6[3], offset); c2[0] = amd_bytealign_S (w6[1], w6[2], offset); c1[3] = amd_bytealign_S (w6[0], w6[1], offset); c1[2] = amd_bytealign_S (w5[3], w6[0], offset); c1[1] = amd_bytealign_S (w5[2], w5[3], offset); c1[0] = amd_bytealign_S (w5[1], w5[2], offset); c0[3] = amd_bytealign_S (w5[0], w5[1], offset); c0[2] = amd_bytealign_S (w4[3], w5[0], offset); c0[1] = amd_bytealign_S (w4[2], w4[3], offset); c0[0] = amd_bytealign_S (w4[1], w4[2], offset); w7[3] = amd_bytealign_S (w4[0], w4[1], offset); w7[2] = amd_bytealign_S (w3[3], w4[0], offset); w7[1] = amd_bytealign_S (w3[2], w3[3], offset); w7[0] = amd_bytealign_S (w3[1], w3[2], offset); w6[3] = amd_bytealign_S (w3[0], w3[1], offset); w6[2] = amd_bytealign_S (w2[3], w3[0], offset); w6[1] = amd_bytealign_S (w2[2], w2[3], offset); w6[0] = amd_bytealign_S (w2[1], w2[2], offset); w5[3] = amd_bytealign_S (w2[0], w2[1], offset); w5[2] = amd_bytealign_S (w1[3], w2[0], offset); w5[1] = amd_bytealign_S (w1[2], w1[3], offset); w5[0] = amd_bytealign_S (w1[1], w1[2], offset); w4[3] = amd_bytealign_S (w1[0], w1[1], offset); w4[2] = amd_bytealign_S (w0[3], w1[0], offset); w4[1] = amd_bytealign_S (w0[2], w0[3], offset); w4[0] = amd_bytealign_S (w0[1], w0[2], offset); w3[3] = amd_bytealign_S (w0[0], w0[1], offset); w3[2] = amd_bytealign_S ( 0, w0[0], offset); w3[1] = 0; 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; case 15: c3[3] = amd_bytealign_S (w7[3], 0, offset); c3[2] = amd_bytealign_S (w7[2], w7[3], offset); c3[1] = amd_bytealign_S (w7[1], w7[2], offset); c3[0] = amd_bytealign_S (w7[0], w7[1], offset); c2[3] = amd_bytealign_S (w6[3], w7[0], offset); c2[2] = amd_bytealign_S (w6[2], w6[3], offset); c2[1] = amd_bytealign_S (w6[1], w6[2], offset); c2[0] = amd_bytealign_S (w6[0], w6[1], offset); c1[3] = amd_bytealign_S (w5[3], w6[0], offset); c1[2] = amd_bytealign_S (w5[2], w5[3], offset); c1[1] = amd_bytealign_S (w5[1], w5[2], offset); c1[0] = amd_bytealign_S (w5[0], w5[1], offset); c0[3] = amd_bytealign_S (w4[3], w5[0], offset); c0[2] = amd_bytealign_S (w4[2], w4[3], offset); c0[1] = amd_bytealign_S (w4[1], w4[2], offset); c0[0] = amd_bytealign_S (w4[0], w4[1], offset); w7[3] = amd_bytealign_S (w3[3], w4[0], offset); w7[2] = amd_bytealign_S (w3[2], w3[3], offset); w7[1] = amd_bytealign_S (w3[1], w3[2], offset); w7[0] = amd_bytealign_S (w3[0], w3[1], offset); w6[3] = amd_bytealign_S (w2[3], w3[0], offset); w6[2] = amd_bytealign_S (w2[2], w2[3], offset); w6[1] = amd_bytealign_S (w2[1], w2[2], offset); w6[0] = amd_bytealign_S (w2[0], w2[1], offset); w5[3] = amd_bytealign_S (w1[3], w2[0], offset); w5[2] = amd_bytealign_S (w1[2], w1[3], offset); w5[1] = amd_bytealign_S (w1[1], w1[2], offset); w5[0] = amd_bytealign_S (w1[0], w1[1], offset); w4[3] = amd_bytealign_S (w0[3], w1[0], offset); w4[2] = amd_bytealign_S (w0[2], w0[3], offset); w4[1] = amd_bytealign_S (w0[1], w0[2], offset); w4[0] = amd_bytealign_S (w0[0], w0[1], offset); w3[3] = amd_bytealign_S ( 0, w0[0], offset); w3[2] = 0; w3[1] = 0; 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; case 16: c4[0] = amd_bytealign_S (w7[3], 0, offset); c3[3] = amd_bytealign_S (w7[2], w7[3], offset); c3[2] = amd_bytealign_S (w7[1], w7[2], offset); c3[1] = amd_bytealign_S (w7[0], w7[1], offset); c3[0] = amd_bytealign_S (w6[3], w7[0], offset); c2[3] = amd_bytealign_S (w6[2], w6[3], offset); c2[2] = amd_bytealign_S (w6[1], w6[2], offset); c2[1] = amd_bytealign_S (w6[0], w6[1], offset); c2[0] = amd_bytealign_S (w5[3], w6[0], offset); c1[3] = amd_bytealign_S (w5[2], w5[3], offset); c1[2] = amd_bytealign_S (w5[1], w5[2], offset); c1[1] = amd_bytealign_S (w5[0], w5[1], offset); c1[0] = amd_bytealign_S (w4[3], w5[0], offset); c0[3] = amd_bytealign_S (w4[2], w4[3], offset); c0[2] = amd_bytealign_S (w4[1], w4[2], offset); c0[1] = amd_bytealign_S (w4[0], w4[1], offset); c0[0] = amd_bytealign_S (w3[3], w4[0], offset); w7[3] = amd_bytealign_S (w3[2], w3[3], offset); w7[2] = amd_bytealign_S (w3[1], w3[2], offset); w7[1] = amd_bytealign_S (w3[0], w3[1], offset); w7[0] = amd_bytealign_S (w2[3], w3[0], offset); w6[3] = amd_bytealign_S (w2[2], w2[3], offset); w6[2] = amd_bytealign_S (w2[1], w2[2], offset); w6[1] = amd_bytealign_S (w2[0], w2[1], offset); w6[0] = amd_bytealign_S (w1[3], w2[0], offset); w5[3] = amd_bytealign_S (w1[2], w1[3], offset); w5[2] = amd_bytealign_S (w1[1], w1[2], offset); w5[1] = amd_bytealign_S (w1[0], w1[1], offset); w5[0] = amd_bytealign_S (w0[3], w1[0], offset); w4[3] = amd_bytealign_S (w0[2], w0[3], offset); w4[2] = amd_bytealign_S (w0[1], w0[2], offset); w4[1] = amd_bytealign_S (w0[0], w0[1], offset); w4[0] = amd_bytealign_S ( 0, w0[0], offset); w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 17: c4[1] = amd_bytealign_S (w7[3], 0, offset); c4[0] = amd_bytealign_S (w7[2], w7[3], offset); c3[3] = amd_bytealign_S (w7[1], w7[2], offset); c3[2] = amd_bytealign_S (w7[0], w7[1], offset); c3[1] = amd_bytealign_S (w6[3], w7[0], offset); c3[0] = amd_bytealign_S (w6[2], w6[3], offset); c2[3] = amd_bytealign_S (w6[1], w6[2], offset); c2[2] = amd_bytealign_S (w6[0], w6[1], offset); c2[1] = amd_bytealign_S (w5[3], w6[0], offset); c2[0] = amd_bytealign_S (w5[2], w5[3], offset); c1[3] = amd_bytealign_S (w5[1], w5[2], offset); c1[2] = amd_bytealign_S (w5[0], w5[1], offset); c1[1] = amd_bytealign_S (w4[3], w5[0], offset); c1[0] = amd_bytealign_S (w4[2], w4[3], offset); c0[3] = amd_bytealign_S (w4[1], w4[2], offset); c0[2] = amd_bytealign_S (w4[0], w4[1], offset); c0[1] = amd_bytealign_S (w3[3], w4[0], offset); c0[0] = amd_bytealign_S (w3[2], w3[3], offset); w7[3] = amd_bytealign_S (w3[1], w3[2], offset); w7[2] = amd_bytealign_S (w3[0], w3[1], offset); w7[1] = amd_bytealign_S (w2[3], w3[0], offset); w7[0] = amd_bytealign_S (w2[2], w2[3], offset); w6[3] = amd_bytealign_S (w2[1], w2[2], offset); w6[2] = amd_bytealign_S (w2[0], w2[1], offset); w6[1] = amd_bytealign_S (w1[3], w2[0], offset); w6[0] = amd_bytealign_S (w1[2], w1[3], offset); w5[3] = amd_bytealign_S (w1[1], w1[2], offset); w5[2] = amd_bytealign_S (w1[0], w1[1], offset); w5[1] = amd_bytealign_S (w0[3], w1[0], offset); w5[0] = amd_bytealign_S (w0[2], w0[3], offset); w4[3] = amd_bytealign_S (w0[1], w0[2], offset); w4[2] = amd_bytealign_S (w0[0], w0[1], offset); w4[1] = amd_bytealign_S ( 0, w0[0], offset); w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 18: c4[2] = amd_bytealign_S (w7[3], 0, offset); c4[1] = amd_bytealign_S (w7[2], w7[3], offset); c4[0] = amd_bytealign_S (w7[1], w7[2], offset); c3[3] = amd_bytealign_S (w7[0], w7[1], offset); c3[2] = amd_bytealign_S (w6[3], w7[0], offset); c3[1] = amd_bytealign_S (w6[2], w6[3], offset); c3[0] = amd_bytealign_S (w6[1], w6[2], offset); c2[3] = amd_bytealign_S (w6[0], w6[1], offset); c2[2] = amd_bytealign_S (w5[3], w6[0], offset); c2[1] = amd_bytealign_S (w5[2], w5[3], offset); c2[0] = amd_bytealign_S (w5[1], w5[2], offset); c1[3] = amd_bytealign_S (w5[0], w5[1], offset); c1[2] = amd_bytealign_S (w4[3], w5[0], offset); c1[1] = amd_bytealign_S (w4[2], w4[3], offset); c1[0] = amd_bytealign_S (w4[1], w4[2], offset); c0[3] = amd_bytealign_S (w4[0], w4[1], offset); c0[2] = amd_bytealign_S (w3[3], w4[0], offset); c0[1] = amd_bytealign_S (w3[2], w3[3], offset); c0[0] = amd_bytealign_S (w3[1], w3[2], offset); w7[3] = amd_bytealign_S (w3[0], w3[1], offset); w7[2] = amd_bytealign_S (w2[3], w3[0], offset); w7[1] = amd_bytealign_S (w2[2], w2[3], offset); w7[0] = amd_bytealign_S (w2[1], w2[2], offset); w6[3] = amd_bytealign_S (w2[0], w2[1], offset); w6[2] = amd_bytealign_S (w1[3], w2[0], offset); w6[1] = amd_bytealign_S (w1[2], w1[3], offset); w6[0] = amd_bytealign_S (w1[1], w1[2], offset); w5[3] = amd_bytealign_S (w1[0], w1[1], offset); w5[2] = amd_bytealign_S (w0[3], w1[0], offset); w5[1] = amd_bytealign_S (w0[2], w0[3], offset); w5[0] = amd_bytealign_S (w0[1], w0[2], offset); w4[3] = amd_bytealign_S (w0[0], w0[1], offset); w4[2] = amd_bytealign_S ( 0, w0[0], offset); w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 19: c4[3] = amd_bytealign_S (w7[3], 0, offset); c4[2] = amd_bytealign_S (w7[2], w7[3], offset); c4[1] = amd_bytealign_S (w7[1], w7[2], offset); c4[0] = amd_bytealign_S (w7[0], w7[1], offset); c3[3] = amd_bytealign_S (w6[3], w7[0], offset); c3[2] = amd_bytealign_S (w6[2], w6[3], offset); c3[1] = amd_bytealign_S (w6[1], w6[2], offset); c3[0] = amd_bytealign_S (w6[0], w6[1], offset); c2[3] = amd_bytealign_S (w5[3], w6[0], offset); c2[2] = amd_bytealign_S (w5[2], w5[3], offset); c2[1] = amd_bytealign_S (w5[1], w5[2], offset); c2[0] = amd_bytealign_S (w5[0], w5[1], offset); c1[3] = amd_bytealign_S (w4[3], w5[0], offset); c1[2] = amd_bytealign_S (w4[2], w4[3], offset); c1[1] = amd_bytealign_S (w4[1], w4[2], offset); c1[0] = amd_bytealign_S (w4[0], w4[1], offset); c0[3] = amd_bytealign_S (w3[3], w4[0], offset); c0[2] = amd_bytealign_S (w3[2], w3[3], offset); c0[1] = amd_bytealign_S (w3[1], w3[2], offset); c0[0] = amd_bytealign_S (w3[0], w3[1], offset); w7[3] = amd_bytealign_S (w2[3], w3[0], offset); w7[2] = amd_bytealign_S (w2[2], w2[3], offset); w7[1] = amd_bytealign_S (w2[1], w2[2], offset); w7[0] = amd_bytealign_S (w2[0], w2[1], offset); w6[3] = amd_bytealign_S (w1[3], w2[0], offset); w6[2] = amd_bytealign_S (w1[2], w1[3], offset); w6[1] = amd_bytealign_S (w1[1], w1[2], offset); w6[0] = amd_bytealign_S (w1[0], w1[1], offset); w5[3] = amd_bytealign_S (w0[3], w1[0], offset); w5[2] = amd_bytealign_S (w0[2], w0[3], offset); w5[1] = amd_bytealign_S (w0[1], w0[2], offset); w5[0] = amd_bytealign_S (w0[0], w0[1], offset); w4[3] = amd_bytealign_S ( 0, w0[0], offset); w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 20: c5[0] = amd_bytealign_S (w7[3], 0, offset); c4[3] = amd_bytealign_S (w7[2], w7[3], offset); c4[2] = amd_bytealign_S (w7[1], w7[2], offset); c4[1] = amd_bytealign_S (w7[0], w7[1], offset); c4[0] = amd_bytealign_S (w6[3], w7[0], offset); c3[3] = amd_bytealign_S (w6[2], w6[3], offset); c3[2] = amd_bytealign_S (w6[1], w6[2], offset); c3[1] = amd_bytealign_S (w6[0], w6[1], offset); c3[0] = amd_bytealign_S (w5[3], w6[0], offset); c2[3] = amd_bytealign_S (w5[2], w5[3], offset); c2[2] = amd_bytealign_S (w5[1], w5[2], offset); c2[1] = amd_bytealign_S (w5[0], w5[1], offset); c2[0] = amd_bytealign_S (w4[3], w5[0], offset); c1[3] = amd_bytealign_S (w4[2], w4[3], offset); c1[2] = amd_bytealign_S (w4[1], w4[2], offset); c1[1] = amd_bytealign_S (w4[0], w4[1], offset); c1[0] = amd_bytealign_S (w3[3], w4[0], offset); c0[3] = amd_bytealign_S (w3[2], w3[3], offset); c0[2] = amd_bytealign_S (w3[1], w3[2], offset); c0[1] = amd_bytealign_S (w3[0], w3[1], offset); c0[0] = amd_bytealign_S (w2[3], w3[0], offset); w7[3] = amd_bytealign_S (w2[2], w2[3], offset); w7[2] = amd_bytealign_S (w2[1], w2[2], offset); w7[1] = amd_bytealign_S (w2[0], w2[1], offset); w7[0] = amd_bytealign_S (w1[3], w2[0], offset); w6[3] = amd_bytealign_S (w1[2], w1[3], offset); w6[2] = amd_bytealign_S (w1[1], w1[2], offset); w6[1] = amd_bytealign_S (w1[0], w1[1], offset); w6[0] = amd_bytealign_S (w0[3], w1[0], offset); w5[3] = amd_bytealign_S (w0[2], w0[3], offset); w5[2] = amd_bytealign_S (w0[1], w0[2], offset); w5[1] = amd_bytealign_S (w0[0], w0[1], offset); w5[0] = amd_bytealign_S ( 0, w0[0], offset); w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 21: c5[1] = amd_bytealign_S (w7[3], 0, offset); c5[0] = amd_bytealign_S (w7[2], w7[3], offset); c4[3] = amd_bytealign_S (w7[1], w7[2], offset); c4[2] = amd_bytealign_S (w7[0], w7[1], offset); c4[1] = amd_bytealign_S (w6[3], w7[0], offset); c4[0] = amd_bytealign_S (w6[2], w6[3], offset); c3[3] = amd_bytealign_S (w6[1], w6[2], offset); c3[2] = amd_bytealign_S (w6[0], w6[1], offset); c3[1] = amd_bytealign_S (w5[3], w6[0], offset); c3[0] = amd_bytealign_S (w5[2], w5[3], offset); c2[3] = amd_bytealign_S (w5[1], w5[2], offset); c2[2] = amd_bytealign_S (w5[0], w5[1], offset); c2[1] = amd_bytealign_S (w4[3], w5[0], offset); c2[0] = amd_bytealign_S (w4[2], w4[3], offset); c1[3] = amd_bytealign_S (w4[1], w4[2], offset); c1[2] = amd_bytealign_S (w4[0], w4[1], offset); c1[1] = amd_bytealign_S (w3[3], w4[0], offset); c1[0] = amd_bytealign_S (w3[2], w3[3], offset); c0[3] = amd_bytealign_S (w3[1], w3[2], offset); c0[2] = amd_bytealign_S (w3[0], w3[1], offset); c0[1] = amd_bytealign_S (w2[3], w3[0], offset); c0[0] = amd_bytealign_S (w2[2], w2[3], offset); w7[3] = amd_bytealign_S (w2[1], w2[2], offset); w7[2] = amd_bytealign_S (w2[0], w2[1], offset); w7[1] = amd_bytealign_S (w1[3], w2[0], offset); w7[0] = amd_bytealign_S (w1[2], w1[3], offset); w6[3] = amd_bytealign_S (w1[1], w1[2], offset); w6[2] = amd_bytealign_S (w1[0], w1[1], offset); w6[1] = amd_bytealign_S (w0[3], w1[0], offset); w6[0] = amd_bytealign_S (w0[2], w0[3], offset); w5[3] = amd_bytealign_S (w0[1], w0[2], offset); w5[2] = amd_bytealign_S (w0[0], w0[1], offset); w5[1] = amd_bytealign_S ( 0, w0[0], offset); w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 22: c5[2] = amd_bytealign_S (w7[3], 0, offset); c5[1] = amd_bytealign_S (w7[2], w7[3], offset); c5[0] = amd_bytealign_S (w7[1], w7[2], offset); c4[3] = amd_bytealign_S (w7[0], w7[1], offset); c4[2] = amd_bytealign_S (w6[3], w7[0], offset); c4[1] = amd_bytealign_S (w6[2], w6[3], offset); c4[0] = amd_bytealign_S (w6[1], w6[2], offset); c3[3] = amd_bytealign_S (w6[0], w6[1], offset); c3[2] = amd_bytealign_S (w5[3], w6[0], offset); c3[1] = amd_bytealign_S (w5[2], w5[3], offset); c3[0] = amd_bytealign_S (w5[1], w5[2], offset); c2[3] = amd_bytealign_S (w5[0], w5[1], offset); c2[2] = amd_bytealign_S (w4[3], w5[0], offset); c2[1] = amd_bytealign_S (w4[2], w4[3], offset); c2[0] = amd_bytealign_S (w4[1], w4[2], offset); c1[3] = amd_bytealign_S (w4[0], w4[1], offset); c1[2] = amd_bytealign_S (w3[3], w4[0], offset); c1[1] = amd_bytealign_S (w3[2], w3[3], offset); c1[0] = amd_bytealign_S (w3[1], w3[2], offset); c0[3] = amd_bytealign_S (w3[0], w3[1], offset); c0[2] = amd_bytealign_S (w2[3], w3[0], offset); c0[1] = amd_bytealign_S (w2[2], w2[3], offset); c0[0] = amd_bytealign_S (w2[1], w2[2], offset); w7[3] = amd_bytealign_S (w2[0], w2[1], offset); w7[2] = amd_bytealign_S (w1[3], w2[0], offset); w7[1] = amd_bytealign_S (w1[2], w1[3], offset); w7[0] = amd_bytealign_S (w1[1], w1[2], offset); w6[3] = amd_bytealign_S (w1[0], w1[1], offset); w6[2] = amd_bytealign_S (w0[3], w1[0], offset); w6[1] = amd_bytealign_S (w0[2], w0[3], offset); w6[0] = amd_bytealign_S (w0[1], w0[2], offset); w5[3] = amd_bytealign_S (w0[0], w0[1], offset); w5[2] = amd_bytealign_S ( 0, w0[0], offset); w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 23: c5[3] = amd_bytealign_S (w7[3], 0, offset); c5[2] = amd_bytealign_S (w7[2], w7[3], offset); c5[1] = amd_bytealign_S (w7[1], w7[2], offset); c5[0] = amd_bytealign_S (w7[0], w7[1], offset); c4[3] = amd_bytealign_S (w6[3], w7[0], offset); c4[2] = amd_bytealign_S (w6[2], w6[3], offset); c4[1] = amd_bytealign_S (w6[1], w6[2], offset); c4[0] = amd_bytealign_S (w6[0], w6[1], offset); c3[3] = amd_bytealign_S (w5[3], w6[0], offset); c3[2] = amd_bytealign_S (w5[2], w5[3], offset); c3[1] = amd_bytealign_S (w5[1], w5[2], offset); c3[0] = amd_bytealign_S (w5[0], w5[1], offset); c2[3] = amd_bytealign_S (w4[3], w5[0], offset); c2[2] = amd_bytealign_S (w4[2], w4[3], offset); c2[1] = amd_bytealign_S (w4[1], w4[2], offset); c2[0] = amd_bytealign_S (w4[0], w4[1], offset); c1[3] = amd_bytealign_S (w3[3], w4[0], offset); c1[2] = amd_bytealign_S (w3[2], w3[3], offset); c1[1] = amd_bytealign_S (w3[1], w3[2], offset); c1[0] = amd_bytealign_S (w3[0], w3[1], offset); c0[3] = amd_bytealign_S (w2[3], w3[0], offset); c0[2] = amd_bytealign_S (w2[2], w2[3], offset); c0[1] = amd_bytealign_S (w2[1], w2[2], offset); c0[0] = amd_bytealign_S (w2[0], w2[1], offset); w7[3] = amd_bytealign_S (w1[3], w2[0], offset); w7[2] = amd_bytealign_S (w1[2], w1[3], offset); w7[1] = amd_bytealign_S (w1[1], w1[2], offset); w7[0] = amd_bytealign_S (w1[0], w1[1], offset); w6[3] = amd_bytealign_S (w0[3], w1[0], offset); w6[2] = amd_bytealign_S (w0[2], w0[3], offset); w6[1] = amd_bytealign_S (w0[1], w0[2], offset); w6[0] = amd_bytealign_S (w0[0], w0[1], offset); w5[3] = amd_bytealign_S ( 0, w0[0], offset); w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 24: c6[0] = amd_bytealign_S (w7[3], 0, offset); c5[3] = amd_bytealign_S (w7[2], w7[3], offset); c5[2] = amd_bytealign_S (w7[1], w7[2], offset); c5[1] = amd_bytealign_S (w7[0], w7[1], offset); c5[0] = amd_bytealign_S (w6[3], w7[0], offset); c4[3] = amd_bytealign_S (w6[2], w6[3], offset); c4[2] = amd_bytealign_S (w6[1], w6[2], offset); c4[1] = amd_bytealign_S (w6[0], w6[1], offset); c4[0] = amd_bytealign_S (w5[3], w6[0], offset); c3[3] = amd_bytealign_S (w5[2], w5[3], offset); c3[2] = amd_bytealign_S (w5[1], w5[2], offset); c3[1] = amd_bytealign_S (w5[0], w5[1], offset); c3[0] = amd_bytealign_S (w4[3], w5[0], offset); c2[3] = amd_bytealign_S (w4[2], w4[3], offset); c2[2] = amd_bytealign_S (w4[1], w4[2], offset); c2[1] = amd_bytealign_S (w4[0], w4[1], offset); c2[0] = amd_bytealign_S (w3[3], w4[0], offset); c1[3] = amd_bytealign_S (w3[2], w3[3], offset); c1[2] = amd_bytealign_S (w3[1], w3[2], offset); c1[1] = amd_bytealign_S (w3[0], w3[1], offset); c1[0] = amd_bytealign_S (w2[3], w3[0], offset); c0[3] = amd_bytealign_S (w2[2], w2[3], offset); c0[2] = amd_bytealign_S (w2[1], w2[2], offset); c0[1] = amd_bytealign_S (w2[0], w2[1], offset); c0[0] = amd_bytealign_S (w1[3], w2[0], offset); w7[3] = amd_bytealign_S (w1[2], w1[3], offset); w7[2] = amd_bytealign_S (w1[1], w1[2], offset); w7[1] = amd_bytealign_S (w1[0], w1[1], offset); w7[0] = amd_bytealign_S (w0[3], w1[0], offset); w6[3] = amd_bytealign_S (w0[2], w0[3], offset); w6[2] = amd_bytealign_S (w0[1], w0[2], offset); w6[1] = amd_bytealign_S (w0[0], w0[1], offset); w6[0] = amd_bytealign_S ( 0, w0[0], offset); w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 25: c6[1] = amd_bytealign_S (w7[3], 0, offset); c6[0] = amd_bytealign_S (w7[2], w7[3], offset); c5[3] = amd_bytealign_S (w7[1], w7[2], offset); c5[2] = amd_bytealign_S (w7[0], w7[1], offset); c5[1] = amd_bytealign_S (w6[3], w7[0], offset); c5[0] = amd_bytealign_S (w6[2], w6[3], offset); c4[3] = amd_bytealign_S (w6[1], w6[2], offset); c4[2] = amd_bytealign_S (w6[0], w6[1], offset); c4[1] = amd_bytealign_S (w5[3], w6[0], offset); c4[0] = amd_bytealign_S (w5[2], w5[3], offset); c3[3] = amd_bytealign_S (w5[1], w5[2], offset); c3[2] = amd_bytealign_S (w5[0], w5[1], offset); c3[1] = amd_bytealign_S (w4[3], w5[0], offset); c3[0] = amd_bytealign_S (w4[2], w4[3], offset); c2[3] = amd_bytealign_S (w4[1], w4[2], offset); c2[2] = amd_bytealign_S (w4[0], w4[1], offset); c2[1] = amd_bytealign_S (w3[3], w4[0], offset); c2[0] = amd_bytealign_S (w3[2], w3[3], offset); c1[3] = amd_bytealign_S (w3[1], w3[2], offset); c1[2] = amd_bytealign_S (w3[0], w3[1], offset); c1[1] = amd_bytealign_S (w2[3], w3[0], offset); c1[0] = amd_bytealign_S (w2[2], w2[3], offset); c0[3] = amd_bytealign_S (w2[1], w2[2], offset); c0[2] = amd_bytealign_S (w2[0], w2[1], offset); c0[1] = amd_bytealign_S (w1[3], w2[0], offset); c0[0] = amd_bytealign_S (w1[2], w1[3], offset); w7[3] = amd_bytealign_S (w1[1], w1[2], offset); w7[2] = amd_bytealign_S (w1[0], w1[1], offset); w7[1] = amd_bytealign_S (w0[3], w1[0], offset); w7[0] = amd_bytealign_S (w0[2], w0[3], offset); w6[3] = amd_bytealign_S (w0[1], w0[2], offset); w6[2] = amd_bytealign_S (w0[0], w0[1], offset); w6[1] = amd_bytealign_S ( 0, w0[0], offset); w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 26: c6[2] = amd_bytealign_S (w7[3], 0, offset); c6[1] = amd_bytealign_S (w7[2], w7[3], offset); c6[0] = amd_bytealign_S (w7[1], w7[2], offset); c5[3] = amd_bytealign_S (w7[0], w7[1], offset); c5[2] = amd_bytealign_S (w6[3], w7[0], offset); c5[1] = amd_bytealign_S (w6[2], w6[3], offset); c5[0] = amd_bytealign_S (w6[1], w6[2], offset); c4[3] = amd_bytealign_S (w6[0], w6[1], offset); c4[2] = amd_bytealign_S (w5[3], w6[0], offset); c4[1] = amd_bytealign_S (w5[2], w5[3], offset); c4[0] = amd_bytealign_S (w5[1], w5[2], offset); c3[3] = amd_bytealign_S (w5[0], w5[1], offset); c3[2] = amd_bytealign_S (w4[3], w5[0], offset); c3[1] = amd_bytealign_S (w4[2], w4[3], offset); c3[0] = amd_bytealign_S (w4[1], w4[2], offset); c2[3] = amd_bytealign_S (w4[0], w4[1], offset); c2[2] = amd_bytealign_S (w3[3], w4[0], offset); c2[1] = amd_bytealign_S (w3[2], w3[3], offset); c2[0] = amd_bytealign_S (w3[1], w3[2], offset); c1[3] = amd_bytealign_S (w3[0], w3[1], offset); c1[2] = amd_bytealign_S (w2[3], w3[0], offset); c1[1] = amd_bytealign_S (w2[2], w2[3], offset); c1[0] = amd_bytealign_S (w2[1], w2[2], offset); c0[3] = amd_bytealign_S (w2[0], w2[1], offset); c0[2] = amd_bytealign_S (w1[3], w2[0], offset); c0[1] = amd_bytealign_S (w1[2], w1[3], offset); c0[0] = amd_bytealign_S (w1[1], w1[2], offset); w7[3] = amd_bytealign_S (w1[0], w1[1], offset); w7[2] = amd_bytealign_S (w0[3], w1[0], offset); w7[1] = amd_bytealign_S (w0[2], w0[3], offset); w7[0] = amd_bytealign_S (w0[1], w0[2], offset); w6[3] = amd_bytealign_S (w0[0], w0[1], offset); w6[2] = amd_bytealign_S ( 0, w0[0], offset); w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 27: c6[3] = amd_bytealign_S (w7[3], 0, offset); c6[2] = amd_bytealign_S (w7[2], w7[3], offset); c6[1] = amd_bytealign_S (w7[1], w7[2], offset); c6[0] = amd_bytealign_S (w7[0], w7[1], offset); c5[3] = amd_bytealign_S (w6[3], w7[0], offset); c5[2] = amd_bytealign_S (w6[2], w6[3], offset); c5[1] = amd_bytealign_S (w6[1], w6[2], offset); c5[0] = amd_bytealign_S (w6[0], w6[1], offset); c4[3] = amd_bytealign_S (w5[3], w6[0], offset); c4[2] = amd_bytealign_S (w5[2], w5[3], offset); c4[1] = amd_bytealign_S (w5[1], w5[2], offset); c4[0] = amd_bytealign_S (w5[0], w5[1], offset); c3[3] = amd_bytealign_S (w4[3], w5[0], offset); c3[2] = amd_bytealign_S (w4[2], w4[3], offset); c3[1] = amd_bytealign_S (w4[1], w4[2], offset); c3[0] = amd_bytealign_S (w4[0], w4[1], offset); c2[3] = amd_bytealign_S (w3[3], w4[0], offset); c2[2] = amd_bytealign_S (w3[2], w3[3], offset); c2[1] = amd_bytealign_S (w3[1], w3[2], offset); c2[0] = amd_bytealign_S (w3[0], w3[1], offset); c1[3] = amd_bytealign_S (w2[3], w3[0], offset); c1[2] = amd_bytealign_S (w2[2], w2[3], offset); c1[1] = amd_bytealign_S (w2[1], w2[2], offset); c1[0] = amd_bytealign_S (w2[0], w2[1], offset); c0[3] = amd_bytealign_S (w1[3], w2[0], offset); c0[2] = amd_bytealign_S (w1[2], w1[3], offset); c0[1] = amd_bytealign_S (w1[1], w1[2], offset); c0[0] = amd_bytealign_S (w1[0], w1[1], offset); w7[3] = amd_bytealign_S (w0[3], w1[0], offset); w7[2] = amd_bytealign_S (w0[2], w0[3], offset); w7[1] = amd_bytealign_S (w0[1], w0[2], offset); w7[0] = amd_bytealign_S (w0[0], w0[1], offset); w6[3] = amd_bytealign_S ( 0, w0[0], offset); w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 28: c7[0] = amd_bytealign_S (w7[3], 0, offset); c6[3] = amd_bytealign_S (w7[2], w7[3], offset); c6[2] = amd_bytealign_S (w7[1], w7[2], offset); c6[1] = amd_bytealign_S (w7[0], w7[1], offset); c6[0] = amd_bytealign_S (w6[3], w7[0], offset); c5[3] = amd_bytealign_S (w6[2], w6[3], offset); c5[2] = amd_bytealign_S (w6[1], w6[2], offset); c5[1] = amd_bytealign_S (w6[0], w6[1], offset); c5[0] = amd_bytealign_S (w5[3], w6[0], offset); c4[3] = amd_bytealign_S (w5[2], w5[3], offset); c4[2] = amd_bytealign_S (w5[1], w5[2], offset); c4[1] = amd_bytealign_S (w5[0], w5[1], offset); c4[0] = amd_bytealign_S (w4[3], w5[0], offset); c3[3] = amd_bytealign_S (w4[2], w4[3], offset); c3[2] = amd_bytealign_S (w4[1], w4[2], offset); c3[1] = amd_bytealign_S (w4[0], w4[1], offset); c3[0] = amd_bytealign_S (w3[3], w4[0], offset); c2[3] = amd_bytealign_S (w3[2], w3[3], offset); c2[2] = amd_bytealign_S (w3[1], w3[2], offset); c2[1] = amd_bytealign_S (w3[0], w3[1], offset); c2[0] = amd_bytealign_S (w2[3], w3[0], offset); c1[3] = amd_bytealign_S (w2[2], w2[3], offset); c1[2] = amd_bytealign_S (w2[1], w2[2], offset); c1[1] = amd_bytealign_S (w2[0], w2[1], offset); c1[0] = amd_bytealign_S (w1[3], w2[0], offset); c0[3] = amd_bytealign_S (w1[2], w1[3], offset); c0[2] = amd_bytealign_S (w1[1], w1[2], offset); c0[1] = amd_bytealign_S (w1[0], w1[1], offset); c0[0] = amd_bytealign_S (w0[3], w1[0], offset); w7[3] = amd_bytealign_S (w0[2], w0[3], offset); w7[2] = amd_bytealign_S (w0[1], w0[2], offset); w7[1] = amd_bytealign_S (w0[0], w0[1], offset); w7[0] = amd_bytealign_S ( 0, w0[0], offset); w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 29: c7[1] = amd_bytealign_S (w7[3], 0, offset); c7[0] = amd_bytealign_S (w7[2], w7[3], offset); c6[3] = amd_bytealign_S (w7[1], w7[2], offset); c6[2] = amd_bytealign_S (w7[0], w7[1], offset); c6[1] = amd_bytealign_S (w6[3], w7[0], offset); c6[0] = amd_bytealign_S (w6[2], w6[3], offset); c5[3] = amd_bytealign_S (w6[1], w6[2], offset); c5[2] = amd_bytealign_S (w6[0], w6[1], offset); c5[1] = amd_bytealign_S (w5[3], w6[0], offset); c5[0] = amd_bytealign_S (w5[2], w5[3], offset); c4[3] = amd_bytealign_S (w5[1], w5[2], offset); c4[2] = amd_bytealign_S (w5[0], w5[1], offset); c4[1] = amd_bytealign_S (w4[3], w5[0], offset); c4[0] = amd_bytealign_S (w4[2], w4[3], offset); c3[3] = amd_bytealign_S (w4[1], w4[2], offset); c3[2] = amd_bytealign_S (w4[0], w4[1], offset); c3[1] = amd_bytealign_S (w3[3], w4[0], offset); c3[0] = amd_bytealign_S (w3[2], w3[3], offset); c2[3] = amd_bytealign_S (w3[1], w3[2], offset); c2[2] = amd_bytealign_S (w3[0], w3[1], offset); c2[1] = amd_bytealign_S (w2[3], w3[0], offset); c2[0] = amd_bytealign_S (w2[2], w2[3], offset); c1[3] = amd_bytealign_S (w2[1], w2[2], offset); c1[2] = amd_bytealign_S (w2[0], w2[1], offset); c1[1] = amd_bytealign_S (w1[3], w2[0], offset); c1[0] = amd_bytealign_S (w1[2], w1[3], offset); c0[3] = amd_bytealign_S (w1[1], w1[2], offset); c0[2] = amd_bytealign_S (w1[0], w1[1], offset); c0[1] = amd_bytealign_S (w0[3], w1[0], offset); c0[0] = amd_bytealign_S (w0[2], w0[3], offset); w7[3] = amd_bytealign_S (w0[1], w0[2], offset); w7[2] = amd_bytealign_S (w0[0], w0[1], offset); w7[1] = amd_bytealign_S ( 0, w0[0], offset); w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 30: c7[2] = amd_bytealign_S (w7[3], 0, offset); c7[1] = amd_bytealign_S (w7[2], w7[3], offset); c7[0] = amd_bytealign_S (w7[1], w7[2], offset); c6[3] = amd_bytealign_S (w7[0], w7[1], offset); c6[2] = amd_bytealign_S (w6[3], w7[0], offset); c6[1] = amd_bytealign_S (w6[2], w6[3], offset); c6[0] = amd_bytealign_S (w6[1], w6[2], offset); c5[3] = amd_bytealign_S (w6[0], w6[1], offset); c5[2] = amd_bytealign_S (w5[3], w6[0], offset); c5[1] = amd_bytealign_S (w5[2], w5[3], offset); c5[0] = amd_bytealign_S (w5[1], w5[2], offset); c4[3] = amd_bytealign_S (w5[0], w5[1], offset); c4[2] = amd_bytealign_S (w4[3], w5[0], offset); c4[1] = amd_bytealign_S (w4[2], w4[3], offset); c4[0] = amd_bytealign_S (w4[1], w4[2], offset); c3[3] = amd_bytealign_S (w4[0], w4[1], offset); c3[2] = amd_bytealign_S (w3[3], w4[0], offset); c3[1] = amd_bytealign_S (w3[2], w3[3], offset); c3[0] = amd_bytealign_S (w3[1], w3[2], offset); c2[3] = amd_bytealign_S (w3[0], w3[1], offset); c2[2] = amd_bytealign_S (w2[3], w3[0], offset); c2[1] = amd_bytealign_S (w2[2], w2[3], offset); c2[0] = amd_bytealign_S (w2[1], w2[2], offset); c1[3] = amd_bytealign_S (w2[0], w2[1], offset); c1[2] = amd_bytealign_S (w1[3], w2[0], offset); c1[1] = amd_bytealign_S (w1[2], w1[3], offset); c1[0] = amd_bytealign_S (w1[1], w1[2], offset); c0[3] = amd_bytealign_S (w1[0], w1[1], offset); c0[2] = amd_bytealign_S (w0[3], w1[0], offset); c0[1] = amd_bytealign_S (w0[2], w0[3], offset); c0[0] = amd_bytealign_S (w0[1], w0[2], offset); w7[3] = amd_bytealign_S (w0[0], w0[1], offset); w7[2] = amd_bytealign_S ( 0, w0[0], offset); w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 31: c7[3] = amd_bytealign_S (w7[3], 0, offset); c7[2] = amd_bytealign_S (w7[2], w7[3], offset); c7[1] = amd_bytealign_S (w7[1], w7[2], offset); c7[0] = amd_bytealign_S (w7[0], w7[1], offset); c6[3] = amd_bytealign_S (w6[3], w7[0], offset); c6[2] = amd_bytealign_S (w6[2], w6[3], offset); c6[1] = amd_bytealign_S (w6[1], w6[2], offset); c6[0] = amd_bytealign_S (w6[0], w6[1], offset); c5[3] = amd_bytealign_S (w5[3], w6[0], offset); c5[2] = amd_bytealign_S (w5[2], w5[3], offset); c5[1] = amd_bytealign_S (w5[1], w5[2], offset); c5[0] = amd_bytealign_S (w5[0], w5[1], offset); c4[3] = amd_bytealign_S (w4[3], w5[0], offset); c4[2] = amd_bytealign_S (w4[2], w4[3], offset); c4[1] = amd_bytealign_S (w4[1], w4[2], offset); c4[0] = amd_bytealign_S (w4[0], w4[1], offset); c3[3] = amd_bytealign_S (w3[3], w4[0], offset); c3[2] = amd_bytealign_S (w3[2], w3[3], offset); c3[1] = amd_bytealign_S (w3[1], w3[2], offset); c3[0] = amd_bytealign_S (w3[0], w3[1], offset); c2[3] = amd_bytealign_S (w2[3], w3[0], offset); c2[2] = amd_bytealign_S (w2[2], w2[3], offset); c2[1] = amd_bytealign_S (w2[1], w2[2], offset); c2[0] = amd_bytealign_S (w2[0], w2[1], offset); c1[3] = amd_bytealign_S (w1[3], w2[0], offset); c1[2] = amd_bytealign_S (w1[2], w1[3], offset); c1[1] = amd_bytealign_S (w1[1], w1[2], offset); c1[0] = amd_bytealign_S (w1[0], w1[1], offset); c0[3] = amd_bytealign_S (w0[3], w1[0], offset); c0[2] = amd_bytealign_S (w0[2], w0[3], offset); c0[1] = amd_bytealign_S (w0[1], w0[2], offset); c0[0] = amd_bytealign_S (w0[0], w0[1], offset); w7[3] = amd_bytealign_S ( 0, w0[0], offset); w7[2] = 0; w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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 #if (defined IS_AMD && AMD_GCN >= 3) || defined IS_NV #if defined IS_NV const int selector = (0x76543210 >> ((offset & 3) * 4)) & 0xffff; #endif #if defined IS_AMD const int selector = 0x0706050403020100 >> ((offset & 3) * 8); #endif switch (offset_switch) { case 0: c0[0] = __byte_perm_S ( 0, w7[3], selector); w7[3] = __byte_perm_S (w7[3], w7[2], selector); w7[2] = __byte_perm_S (w7[2], w7[1], selector); w7[1] = __byte_perm_S (w7[1], w7[0], selector); w7[0] = __byte_perm_S (w7[0], w6[3], selector); w6[3] = __byte_perm_S (w6[3], w6[2], selector); w6[2] = __byte_perm_S (w6[2], w6[1], selector); w6[1] = __byte_perm_S (w6[1], w6[0], selector); w6[0] = __byte_perm_S (w6[0], w5[3], selector); w5[3] = __byte_perm_S (w5[3], w5[2], selector); w5[2] = __byte_perm_S (w5[2], w5[1], selector); w5[1] = __byte_perm_S (w5[1], w5[0], selector); w5[0] = __byte_perm_S (w5[0], w4[3], selector); w4[3] = __byte_perm_S (w4[3], w4[2], selector); w4[2] = __byte_perm_S (w4[2], w4[1], selector); w4[1] = __byte_perm_S (w4[1], w4[0], selector); w4[0] = __byte_perm_S (w4[0], w3[3], selector); w3[3] = __byte_perm_S (w3[3], w3[2], selector); w3[2] = __byte_perm_S (w3[2], w3[1], selector); w3[1] = __byte_perm_S (w3[1], w3[0], selector); w3[0] = __byte_perm_S (w3[0], w2[3], selector); w2[3] = __byte_perm_S (w2[3], w2[2], selector); w2[2] = __byte_perm_S (w2[2], w2[1], selector); w2[1] = __byte_perm_S (w2[1], w2[0], selector); w2[0] = __byte_perm_S (w2[0], w1[3], selector); w1[3] = __byte_perm_S (w1[3], w1[2], selector); w1[2] = __byte_perm_S (w1[2], w1[1], selector); w1[1] = __byte_perm_S (w1[1], w1[0], selector); w1[0] = __byte_perm_S (w1[0], w0[3], selector); w0[3] = __byte_perm_S (w0[3], w0[2], selector); w0[2] = __byte_perm_S (w0[2], w0[1], selector); w0[1] = __byte_perm_S (w0[1], w0[0], selector); w0[0] = __byte_perm_S (w0[0], 0, selector); break; case 1: c0[1] = __byte_perm_S ( 0, w7[3], selector); c0[0] = __byte_perm_S (w7[3], w7[2], selector); w7[3] = __byte_perm_S (w7[2], w7[1], selector); w7[2] = __byte_perm_S (w7[1], w7[0], selector); w7[1] = __byte_perm_S (w7[0], w6[3], selector); w7[0] = __byte_perm_S (w6[3], w6[2], selector); w6[3] = __byte_perm_S (w6[2], w6[1], selector); w6[2] = __byte_perm_S (w6[1], w6[0], selector); w6[1] = __byte_perm_S (w6[0], w5[3], selector); w6[0] = __byte_perm_S (w5[3], w5[2], selector); w5[3] = __byte_perm_S (w5[2], w5[1], selector); w5[2] = __byte_perm_S (w5[1], w5[0], selector); w5[1] = __byte_perm_S (w5[0], w4[3], selector); w5[0] = __byte_perm_S (w4[3], w4[2], selector); w4[3] = __byte_perm_S (w4[2], w4[1], selector); w4[2] = __byte_perm_S (w4[1], w4[0], selector); w4[1] = __byte_perm_S (w4[0], w3[3], selector); w4[0] = __byte_perm_S (w3[3], w3[2], selector); w3[3] = __byte_perm_S (w3[2], w3[1], selector); w3[2] = __byte_perm_S (w3[1], w3[0], selector); w3[1] = __byte_perm_S (w3[0], w2[3], selector); w3[0] = __byte_perm_S (w2[3], w2[2], selector); w2[3] = __byte_perm_S (w2[2], w2[1], selector); w2[2] = __byte_perm_S (w2[1], w2[0], selector); w2[1] = __byte_perm_S (w2[0], w1[3], selector); w2[0] = __byte_perm_S (w1[3], w1[2], selector); w1[3] = __byte_perm_S (w1[2], w1[1], selector); w1[2] = __byte_perm_S (w1[1], w1[0], selector); w1[1] = __byte_perm_S (w1[0], w0[3], selector); w1[0] = __byte_perm_S (w0[3], w0[2], selector); w0[3] = __byte_perm_S (w0[2], w0[1], selector); w0[2] = __byte_perm_S (w0[1], w0[0], selector); w0[1] = __byte_perm_S (w0[0], 0, selector); w0[0] = 0; break; case 2: c0[2] = __byte_perm_S ( 0, w7[3], selector); c0[1] = __byte_perm_S (w7[3], w7[2], selector); c0[0] = __byte_perm_S (w7[2], w7[1], selector); w7[3] = __byte_perm_S (w7[1], w7[0], selector); w7[2] = __byte_perm_S (w7[0], w6[3], selector); w7[1] = __byte_perm_S (w6[3], w6[2], selector); w7[0] = __byte_perm_S (w6[2], w6[1], selector); w6[3] = __byte_perm_S (w6[1], w6[0], selector); w6[2] = __byte_perm_S (w6[0], w5[3], selector); w6[1] = __byte_perm_S (w5[3], w5[2], selector); w6[0] = __byte_perm_S (w5[2], w5[1], selector); w5[3] = __byte_perm_S (w5[1], w5[0], selector); w5[2] = __byte_perm_S (w5[0], w4[3], selector); w5[1] = __byte_perm_S (w4[3], w4[2], selector); w5[0] = __byte_perm_S (w4[2], w4[1], selector); w4[3] = __byte_perm_S (w4[1], w4[0], selector); w4[2] = __byte_perm_S (w4[0], w3[3], selector); w4[1] = __byte_perm_S (w3[3], w3[2], selector); w4[0] = __byte_perm_S (w3[2], w3[1], selector); w3[3] = __byte_perm_S (w3[1], w3[0], selector); w3[2] = __byte_perm_S (w3[0], w2[3], selector); w3[1] = __byte_perm_S (w2[3], w2[2], selector); w3[0] = __byte_perm_S (w2[2], w2[1], selector); w2[3] = __byte_perm_S (w2[1], w2[0], selector); w2[2] = __byte_perm_S (w2[0], w1[3], selector); w2[1] = __byte_perm_S (w1[3], w1[2], selector); w2[0] = __byte_perm_S (w1[2], w1[1], selector); w1[3] = __byte_perm_S (w1[1], w1[0], selector); w1[2] = __byte_perm_S (w1[0], w0[3], selector); w1[1] = __byte_perm_S (w0[3], w0[2], selector); w1[0] = __byte_perm_S (w0[2], w0[1], selector); w0[3] = __byte_perm_S (w0[1], w0[0], selector); w0[2] = __byte_perm_S (w0[0], 0, selector); w0[1] = 0; w0[0] = 0; break; case 3: c0[3] = __byte_perm_S ( 0, w7[3], selector); c0[2] = __byte_perm_S (w7[3], w7[2], selector); c0[1] = __byte_perm_S (w7[2], w7[1], selector); c0[0] = __byte_perm_S (w7[1], w7[0], selector); w7[3] = __byte_perm_S (w7[0], w6[3], selector); w7[2] = __byte_perm_S (w6[3], w6[2], selector); w7[1] = __byte_perm_S (w6[2], w6[1], selector); w7[0] = __byte_perm_S (w6[1], w6[0], selector); w6[3] = __byte_perm_S (w6[0], w5[3], selector); w6[2] = __byte_perm_S (w5[3], w5[2], selector); w6[1] = __byte_perm_S (w5[2], w5[1], selector); w6[0] = __byte_perm_S (w5[1], w5[0], selector); w5[3] = __byte_perm_S (w5[0], w4[3], selector); w5[2] = __byte_perm_S (w4[3], w4[2], selector); w5[1] = __byte_perm_S (w4[2], w4[1], selector); w5[0] = __byte_perm_S (w4[1], w4[0], selector); w4[3] = __byte_perm_S (w4[0], w3[3], selector); w4[2] = __byte_perm_S (w3[3], w3[2], selector); w4[1] = __byte_perm_S (w3[2], w3[1], selector); w4[0] = __byte_perm_S (w3[1], w3[0], selector); w3[3] = __byte_perm_S (w3[0], w2[3], selector); w3[2] = __byte_perm_S (w2[3], w2[2], selector); w3[1] = __byte_perm_S (w2[2], w2[1], selector); w3[0] = __byte_perm_S (w2[1], w2[0], selector); w2[3] = __byte_perm_S (w2[0], w1[3], selector); w2[2] = __byte_perm_S (w1[3], w1[2], selector); w2[1] = __byte_perm_S (w1[2], w1[1], selector); w2[0] = __byte_perm_S (w1[1], w1[0], selector); w1[3] = __byte_perm_S (w1[0], w0[3], selector); w1[2] = __byte_perm_S (w0[3], w0[2], selector); w1[1] = __byte_perm_S (w0[2], w0[1], selector); w1[0] = __byte_perm_S (w0[1], w0[0], selector); w0[3] = __byte_perm_S (w0[0], 0, selector); w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 4: c1[0] = __byte_perm_S ( 0, w7[3], selector); c0[3] = __byte_perm_S (w7[3], w7[2], selector); c0[2] = __byte_perm_S (w7[2], w7[1], selector); c0[1] = __byte_perm_S (w7[1], w7[0], selector); c0[0] = __byte_perm_S (w7[0], w6[3], selector); w7[3] = __byte_perm_S (w6[3], w6[2], selector); w7[2] = __byte_perm_S (w6[2], w6[1], selector); w7[1] = __byte_perm_S (w6[1], w6[0], selector); w7[0] = __byte_perm_S (w6[0], w5[3], selector); w6[3] = __byte_perm_S (w5[3], w5[2], selector); w6[2] = __byte_perm_S (w5[2], w5[1], selector); w6[1] = __byte_perm_S (w5[1], w5[0], selector); w6[0] = __byte_perm_S (w5[0], w4[3], selector); w5[3] = __byte_perm_S (w4[3], w4[2], selector); w5[2] = __byte_perm_S (w4[2], w4[1], selector); w5[1] = __byte_perm_S (w4[1], w4[0], selector); w5[0] = __byte_perm_S (w4[0], w3[3], selector); w4[3] = __byte_perm_S (w3[3], w3[2], selector); w4[2] = __byte_perm_S (w3[2], w3[1], selector); w4[1] = __byte_perm_S (w3[1], w3[0], selector); w4[0] = __byte_perm_S (w3[0], w2[3], selector); w3[3] = __byte_perm_S (w2[3], w2[2], selector); w3[2] = __byte_perm_S (w2[2], w2[1], selector); w3[1] = __byte_perm_S (w2[1], w2[0], selector); w3[0] = __byte_perm_S (w2[0], w1[3], selector); w2[3] = __byte_perm_S (w1[3], w1[2], selector); w2[2] = __byte_perm_S (w1[2], w1[1], selector); w2[1] = __byte_perm_S (w1[1], w1[0], selector); w2[0] = __byte_perm_S (w1[0], w0[3], selector); w1[3] = __byte_perm_S (w0[3], w0[2], selector); w1[2] = __byte_perm_S (w0[2], w0[1], selector); w1[1] = __byte_perm_S (w0[1], w0[0], selector); w1[0] = __byte_perm_S (w0[0], 0, selector); w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 5: c1[1] = __byte_perm_S ( 0, w7[3], selector); c1[0] = __byte_perm_S (w7[3], w7[2], selector); c0[3] = __byte_perm_S (w7[2], w7[1], selector); c0[2] = __byte_perm_S (w7[1], w7[0], selector); c0[1] = __byte_perm_S (w7[0], w6[3], selector); c0[0] = __byte_perm_S (w6[3], w6[2], selector); w7[3] = __byte_perm_S (w6[2], w6[1], selector); w7[2] = __byte_perm_S (w6[1], w6[0], selector); w7[1] = __byte_perm_S (w6[0], w5[3], selector); w7[0] = __byte_perm_S (w5[3], w5[2], selector); w6[3] = __byte_perm_S (w5[2], w5[1], selector); w6[2] = __byte_perm_S (w5[1], w5[0], selector); w6[1] = __byte_perm_S (w5[0], w4[3], selector); w6[0] = __byte_perm_S (w4[3], w4[2], selector); w5[3] = __byte_perm_S (w4[2], w4[1], selector); w5[2] = __byte_perm_S (w4[1], w4[0], selector); w5[1] = __byte_perm_S (w4[0], w3[3], selector); w5[0] = __byte_perm_S (w3[3], w3[2], selector); w4[3] = __byte_perm_S (w3[2], w3[1], selector); w4[2] = __byte_perm_S (w3[1], w3[0], selector); w4[1] = __byte_perm_S (w3[0], w2[3], selector); w4[0] = __byte_perm_S (w2[3], w2[2], selector); w3[3] = __byte_perm_S (w2[2], w2[1], selector); w3[2] = __byte_perm_S (w2[1], w2[0], selector); w3[1] = __byte_perm_S (w2[0], w1[3], selector); w3[0] = __byte_perm_S (w1[3], w1[2], selector); w2[3] = __byte_perm_S (w1[2], w1[1], selector); w2[2] = __byte_perm_S (w1[1], w1[0], selector); w2[1] = __byte_perm_S (w1[0], w0[3], selector); w2[0] = __byte_perm_S (w0[3], w0[2], selector); w1[3] = __byte_perm_S (w0[2], w0[1], selector); w1[2] = __byte_perm_S (w0[1], w0[0], selector); w1[1] = __byte_perm_S (w0[0], 0, selector); w1[0] = 0; w0[3] = 0; w0[2] = 0; w0[1] = 0; w0[0] = 0; break; case 6: c1[2] = __byte_perm_S ( 0, w7[3], selector); c1[1] = __byte_perm_S (w7[3], w7[2], selector); c1[0] = __byte_perm_S (w7[2], w7[1], selector); c0[3] = __byte_perm_S (w7[1], w7[0], selector); c0[2] = __byte_perm_S (w7[0], w6[3], selector); c0[1] = __byte_perm_S (w6[3], w6[2], selector); c0[0] = __byte_perm_S (w6[2], w6[1], selector); w7[3] = __byte_perm_S (w6[1], w6[0], selector); w7[2] = __byte_perm_S (w6[0], w5[3], selector); w7[1] = __byte_perm_S (w5[3], w5[2], selector); w7[0] = __byte_perm_S (w5[2], w5[1], selector); w6[3] = __byte_perm_S (w5[1], w5[0], selector); w6[2] = __byte_perm_S (w5[0], w4[3], selector); w6[1] = __byte_perm_S (w4[3], w4[2], selector); w6[0] = __byte_perm_S (w4[2], w4[1], selector); w5[3] = __byte_perm_S (w4[1], w4[0], selector); w5[2] = __byte_perm_S (w4[0], w3[3], selector); w5[1] = __byte_perm_S (w3[3], w3[2], selector); w5[0] = __byte_perm_S (w3[2], w3[1], selector); w4[3] = __byte_perm_S (w3[1], w3[0], selector); w4[2] = __byte_perm_S (w3[0], w2[3], selector); w4[1] = __byte_perm_S (w2[3], w2[2], selector); w4[0] = __byte_perm_S (w2[2], w2[1], selector); w3[3] = __byte_perm_S (w2[1], w2[0], selector); w3[2] = __byte_perm_S (w2[0], w1[3], selector); w3[1] = __byte_perm_S (w1[3], w1[2], selector); w3[0] = __byte_perm_S (w1[2], w1[1], selector); w2[3] = __byte_perm_S (w1[1], w1[0], selector); w2[2] = __byte_perm_S (w1[0], w0[3], selector); w2[1] = __byte_perm_S (w0[3], w0[2], selector); w2[0] = __byte_perm_S (w0[2], w0[1], selector); w1[3] = __byte_perm_S (w0[1], w0[0], selector); w1[2] = __byte_perm_S (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: c1[3] = __byte_perm_S ( 0, w7[3], selector); c1[2] = __byte_perm_S (w7[3], w7[2], selector); c1[1] = __byte_perm_S (w7[2], w7[1], selector); c1[0] = __byte_perm_S (w7[1], w7[0], selector); c0[3] = __byte_perm_S (w7[0], w6[3], selector); c0[2] = __byte_perm_S (w6[3], w6[2], selector); c0[1] = __byte_perm_S (w6[2], w6[1], selector); c0[0] = __byte_perm_S (w6[1], w6[0], selector); w7[3] = __byte_perm_S (w6[0], w5[3], selector); w7[2] = __byte_perm_S (w5[3], w5[2], selector); w7[1] = __byte_perm_S (w5[2], w5[1], selector); w7[0] = __byte_perm_S (w5[1], w5[0], selector); w6[3] = __byte_perm_S (w5[0], w4[3], selector); w6[2] = __byte_perm_S (w4[3], w4[2], selector); w6[1] = __byte_perm_S (w4[2], w4[1], selector); w6[0] = __byte_perm_S (w4[1], w4[0], selector); w5[3] = __byte_perm_S (w4[0], w3[3], selector); w5[2] = __byte_perm_S (w3[3], w3[2], selector); w5[1] = __byte_perm_S (w3[2], w3[1], selector); w5[0] = __byte_perm_S (w3[1], w3[0], selector); w4[3] = __byte_perm_S (w3[0], w2[3], selector); w4[2] = __byte_perm_S (w2[3], w2[2], selector); w4[1] = __byte_perm_S (w2[2], w2[1], selector); w4[0] = __byte_perm_S (w2[1], w2[0], selector); w3[3] = __byte_perm_S (w2[0], w1[3], selector); w3[2] = __byte_perm_S (w1[3], w1[2], selector); w3[1] = __byte_perm_S (w1[2], w1[1], selector); w3[0] = __byte_perm_S (w1[1], w1[0], selector); w2[3] = __byte_perm_S (w1[0], w0[3], selector); w2[2] = __byte_perm_S (w0[3], w0[2], selector); w2[1] = __byte_perm_S (w0[2], w0[1], selector); w2[0] = __byte_perm_S (w0[1], w0[0], selector); w1[3] = __byte_perm_S (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: c2[0] = __byte_perm_S ( 0, w7[3], selector); c1[3] = __byte_perm_S (w7[3], w7[2], selector); c1[2] = __byte_perm_S (w7[2], w7[1], selector); c1[1] = __byte_perm_S (w7[1], w7[0], selector); c1[0] = __byte_perm_S (w7[0], w6[3], selector); c0[3] = __byte_perm_S (w6[3], w6[2], selector); c0[2] = __byte_perm_S (w6[2], w6[1], selector); c0[1] = __byte_perm_S (w6[1], w6[0], selector); c0[0] = __byte_perm_S (w6[0], w5[3], selector); w7[3] = __byte_perm_S (w5[3], w5[2], selector); w7[2] = __byte_perm_S (w5[2], w5[1], selector); w7[1] = __byte_perm_S (w5[1], w5[0], selector); w7[0] = __byte_perm_S (w5[0], w4[3], selector); w6[3] = __byte_perm_S (w4[3], w4[2], selector); w6[2] = __byte_perm_S (w4[2], w4[1], selector); w6[1] = __byte_perm_S (w4[1], w4[0], selector); w6[0] = __byte_perm_S (w4[0], w3[3], selector); w5[3] = __byte_perm_S (w3[3], w3[2], selector); w5[2] = __byte_perm_S (w3[2], w3[1], selector); w5[1] = __byte_perm_S (w3[1], w3[0], selector); w5[0] = __byte_perm_S (w3[0], w2[3], selector); w4[3] = __byte_perm_S (w2[3], w2[2], selector); w4[2] = __byte_perm_S (w2[2], w2[1], selector); w4[1] = __byte_perm_S (w2[1], w2[0], selector); w4[0] = __byte_perm_S (w2[0], w1[3], selector); w3[3] = __byte_perm_S (w1[3], w1[2], selector); w3[2] = __byte_perm_S (w1[2], w1[1], selector); w3[1] = __byte_perm_S (w1[1], w1[0], selector); w3[0] = __byte_perm_S (w1[0], w0[3], selector); w2[3] = __byte_perm_S (w0[3], w0[2], selector); w2[2] = __byte_perm_S (w0[2], w0[1], selector); w2[1] = __byte_perm_S (w0[1], w0[0], selector); w2[0] = __byte_perm_S (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: c2[1] = __byte_perm_S ( 0, w7[3], selector); c2[0] = __byte_perm_S (w7[3], w7[2], selector); c1[3] = __byte_perm_S (w7[2], w7[1], selector); c1[2] = __byte_perm_S (w7[1], w7[0], selector); c1[1] = __byte_perm_S (w7[0], w6[3], selector); c1[0] = __byte_perm_S (w6[3], w6[2], selector); c0[3] = __byte_perm_S (w6[2], w6[1], selector); c0[2] = __byte_perm_S (w6[1], w6[0], selector); c0[1] = __byte_perm_S (w6[0], w5[3], selector); c0[0] = __byte_perm_S (w5[3], w5[2], selector); w7[3] = __byte_perm_S (w5[2], w5[1], selector); w7[2] = __byte_perm_S (w5[1], w5[0], selector); w7[1] = __byte_perm_S (w5[0], w4[3], selector); w7[0] = __byte_perm_S (w4[3], w4[2], selector); w6[3] = __byte_perm_S (w4[2], w4[1], selector); w6[2] = __byte_perm_S (w4[1], w4[0], selector); w6[1] = __byte_perm_S (w4[0], w3[3], selector); w6[0] = __byte_perm_S (w3[3], w3[2], selector); w5[3] = __byte_perm_S (w3[2], w3[1], selector); w5[2] = __byte_perm_S (w3[1], w3[0], selector); w5[1] = __byte_perm_S (w3[0], w2[3], selector); w5[0] = __byte_perm_S (w2[3], w2[2], selector); w4[3] = __byte_perm_S (w2[2], w2[1], selector); w4[2] = __byte_perm_S (w2[1], w2[0], selector); w4[1] = __byte_perm_S (w2[0], w1[3], selector); w4[0] = __byte_perm_S (w1[3], w1[2], selector); w3[3] = __byte_perm_S (w1[2], w1[1], selector); w3[2] = __byte_perm_S (w1[1], w1[0], selector); w3[1] = __byte_perm_S (w1[0], w0[3], selector); w3[0] = __byte_perm_S (w0[3], w0[2], selector); w2[3] = __byte_perm_S (w0[2], w0[1], selector); w2[2] = __byte_perm_S (w0[1], w0[0], selector); w2[1] = __byte_perm_S (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: c2[2] = __byte_perm_S ( 0, w7[3], selector); c2[1] = __byte_perm_S (w7[3], w7[2], selector); c2[0] = __byte_perm_S (w7[2], w7[1], selector); c1[3] = __byte_perm_S (w7[1], w7[0], selector); c1[2] = __byte_perm_S (w7[0], w6[3], selector); c1[1] = __byte_perm_S (w6[3], w6[2], selector); c1[0] = __byte_perm_S (w6[2], w6[1], selector); c0[3] = __byte_perm_S (w6[1], w6[0], selector); c0[2] = __byte_perm_S (w6[0], w5[3], selector); c0[1] = __byte_perm_S (w5[3], w5[2], selector); c0[0] = __byte_perm_S (w5[2], w5[1], selector); w7[3] = __byte_perm_S (w5[1], w5[0], selector); w7[2] = __byte_perm_S (w5[0], w4[3], selector); w7[1] = __byte_perm_S (w4[3], w4[2], selector); w7[0] = __byte_perm_S (w4[2], w4[1], selector); w6[3] = __byte_perm_S (w4[1], w4[0], selector); w6[2] = __byte_perm_S (w4[0], w3[3], selector); w6[1] = __byte_perm_S (w3[3], w3[2], selector); w6[0] = __byte_perm_S (w3[2], w3[1], selector); w5[3] = __byte_perm_S (w3[1], w3[0], selector); w5[2] = __byte_perm_S (w3[0], w2[3], selector); w5[1] = __byte_perm_S (w2[3], w2[2], selector); w5[0] = __byte_perm_S (w2[2], w2[1], selector); w4[3] = __byte_perm_S (w2[1], w2[0], selector); w4[2] = __byte_perm_S (w2[0], w1[3], selector); w4[1] = __byte_perm_S (w1[3], w1[2], selector); w4[0] = __byte_perm_S (w1[2], w1[1], selector); w3[3] = __byte_perm_S (w1[1], w1[0], selector); w3[2] = __byte_perm_S (w1[0], w0[3], selector); w3[1] = __byte_perm_S (w0[3], w0[2], selector); w3[0] = __byte_perm_S (w0[2], w0[1], selector); w2[3] = __byte_perm_S (w0[1], w0[0], selector); w2[2] = __byte_perm_S (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: c2[3] = __byte_perm_S ( 0, w7[3], selector); c2[2] = __byte_perm_S (w7[3], w7[2], selector); c2[1] = __byte_perm_S (w7[2], w7[1], selector); c2[0] = __byte_perm_S (w7[1], w7[0], selector); c1[3] = __byte_perm_S (w7[0], w6[3], selector); c1[2] = __byte_perm_S (w6[3], w6[2], selector); c1[1] = __byte_perm_S (w6[2], w6[1], selector); c1[0] = __byte_perm_S (w6[1], w6[0], selector); c0[3] = __byte_perm_S (w6[0], w5[3], selector); c0[2] = __byte_perm_S (w5[3], w5[2], selector); c0[1] = __byte_perm_S (w5[2], w5[1], selector); c0[0] = __byte_perm_S (w5[1], w5[0], selector); w7[3] = __byte_perm_S (w5[0], w4[3], selector); w7[2] = __byte_perm_S (w4[3], w4[2], selector); w7[1] = __byte_perm_S (w4[2], w4[1], selector); w7[0] = __byte_perm_S (w4[1], w4[0], selector); w6[3] = __byte_perm_S (w4[0], w3[3], selector); w6[2] = __byte_perm_S (w3[3], w3[2], selector); w6[1] = __byte_perm_S (w3[2], w3[1], selector); w6[0] = __byte_perm_S (w3[1], w3[0], selector); w5[3] = __byte_perm_S (w3[0], w2[3], selector); w5[2] = __byte_perm_S (w2[3], w2[2], selector); w5[1] = __byte_perm_S (w2[2], w2[1], selector); w5[0] = __byte_perm_S (w2[1], w2[0], selector); w4[3] = __byte_perm_S (w2[0], w1[3], selector); w4[2] = __byte_perm_S (w1[3], w1[2], selector); w4[1] = __byte_perm_S (w1[2], w1[1], selector); w4[0] = __byte_perm_S (w1[1], w1[0], selector); w3[3] = __byte_perm_S (w1[0], w0[3], selector); w3[2] = __byte_perm_S (w0[3], w0[2], selector); w3[1] = __byte_perm_S (w0[2], w0[1], selector); w3[0] = __byte_perm_S (w0[1], w0[0], selector); w2[3] = __byte_perm_S (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: c3[0] = __byte_perm_S ( 0, w7[3], selector); c2[3] = __byte_perm_S (w7[3], w7[2], selector); c2[2] = __byte_perm_S (w7[2], w7[1], selector); c2[1] = __byte_perm_S (w7[1], w7[0], selector); c2[0] = __byte_perm_S (w7[0], w6[3], selector); c1[3] = __byte_perm_S (w6[3], w6[2], selector); c1[2] = __byte_perm_S (w6[2], w6[1], selector); c1[1] = __byte_perm_S (w6[1], w6[0], selector); c1[0] = __byte_perm_S (w6[0], w5[3], selector); c0[3] = __byte_perm_S (w5[3], w5[2], selector); c0[2] = __byte_perm_S (w5[2], w5[1], selector); c0[1] = __byte_perm_S (w5[1], w5[0], selector); c0[0] = __byte_perm_S (w5[0], w4[3], selector); w7[3] = __byte_perm_S (w4[3], w4[2], selector); w7[2] = __byte_perm_S (w4[2], w4[1], selector); w7[1] = __byte_perm_S (w4[1], w4[0], selector); w7[0] = __byte_perm_S (w4[0], w3[3], selector); w6[3] = __byte_perm_S (w3[3], w3[2], selector); w6[2] = __byte_perm_S (w3[2], w3[1], selector); w6[1] = __byte_perm_S (w3[1], w3[0], selector); w6[0] = __byte_perm_S (w3[0], w2[3], selector); w5[3] = __byte_perm_S (w2[3], w2[2], selector); w5[2] = __byte_perm_S (w2[2], w2[1], selector); w5[1] = __byte_perm_S (w2[1], w2[0], selector); w5[0] = __byte_perm_S (w2[0], w1[3], selector); w4[3] = __byte_perm_S (w1[3], w1[2], selector); w4[2] = __byte_perm_S (w1[2], w1[1], selector); w4[1] = __byte_perm_S (w1[1], w1[0], selector); w4[0] = __byte_perm_S (w1[0], w0[3], selector); w3[3] = __byte_perm_S (w0[3], w0[2], selector); w3[2] = __byte_perm_S (w0[2], w0[1], selector); w3[1] = __byte_perm_S (w0[1], w0[0], selector); w3[0] = __byte_perm_S (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: c3[1] = __byte_perm_S ( 0, w7[3], selector); c3[0] = __byte_perm_S (w7[3], w7[2], selector); c2[3] = __byte_perm_S (w7[2], w7[1], selector); c2[2] = __byte_perm_S (w7[1], w7[0], selector); c2[1] = __byte_perm_S (w7[0], w6[3], selector); c2[0] = __byte_perm_S (w6[3], w6[2], selector); c1[3] = __byte_perm_S (w6[2], w6[1], selector); c1[2] = __byte_perm_S (w6[1], w6[0], selector); c1[1] = __byte_perm_S (w6[0], w5[3], selector); c1[0] = __byte_perm_S (w5[3], w5[2], selector); c0[3] = __byte_perm_S (w5[2], w5[1], selector); c0[2] = __byte_perm_S (w5[1], w5[0], selector); c0[1] = __byte_perm_S (w5[0], w4[3], selector); c0[0] = __byte_perm_S (w4[3], w4[2], selector); w7[3] = __byte_perm_S (w4[2], w4[1], selector); w7[2] = __byte_perm_S (w4[1], w4[0], selector); w7[1] = __byte_perm_S (w4[0], w3[3], selector); w7[0] = __byte_perm_S (w3[3], w3[2], selector); w6[3] = __byte_perm_S (w3[2], w3[1], selector); w6[2] = __byte_perm_S (w3[1], w3[0], selector); w6[1] = __byte_perm_S (w3[0], w2[3], selector); w6[0] = __byte_perm_S (w2[3], w2[2], selector); w5[3] = __byte_perm_S (w2[2], w2[1], selector); w5[2] = __byte_perm_S (w2[1], w2[0], selector); w5[1] = __byte_perm_S (w2[0], w1[3], selector); w5[0] = __byte_perm_S (w1[3], w1[2], selector); w4[3] = __byte_perm_S (w1[2], w1[1], selector); w4[2] = __byte_perm_S (w1[1], w1[0], selector); w4[1] = __byte_perm_S (w1[0], w0[3], selector); w4[0] = __byte_perm_S (w0[3], w0[2], selector); w3[3] = __byte_perm_S (w0[2], w0[1], selector); w3[2] = __byte_perm_S (w0[1], w0[0], selector); w3[1] = __byte_perm_S (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; case 14: c3[2] = __byte_perm_S ( 0, w7[3], selector); c3[1] = __byte_perm_S (w7[3], w7[2], selector); c3[0] = __byte_perm_S (w7[2], w7[1], selector); c2[3] = __byte_perm_S (w7[1], w7[0], selector); c2[2] = __byte_perm_S (w7[0], w6[3], selector); c2[1] = __byte_perm_S (w6[3], w6[2], selector); c2[0] = __byte_perm_S (w6[2], w6[1], selector); c1[3] = __byte_perm_S (w6[1], w6[0], selector); c1[2] = __byte_perm_S (w6[0], w5[3], selector); c1[1] = __byte_perm_S (w5[3], w5[2], selector); c1[0] = __byte_perm_S (w5[2], w5[1], selector); c0[3] = __byte_perm_S (w5[1], w5[0], selector); c0[2] = __byte_perm_S (w5[0], w4[3], selector); c0[1] = __byte_perm_S (w4[3], w4[2], selector); c0[0] = __byte_perm_S (w4[2], w4[1], selector); w7[3] = __byte_perm_S (w4[1], w4[0], selector); w7[2] = __byte_perm_S (w4[0], w3[3], selector); w7[1] = __byte_perm_S (w3[3], w3[2], selector); w7[0] = __byte_perm_S (w3[2], w3[1], selector); w6[3] = __byte_perm_S (w3[1], w3[0], selector); w6[2] = __byte_perm_S (w3[0], w2[3], selector); w6[1] = __byte_perm_S (w2[3], w2[2], selector); w6[0] = __byte_perm_S (w2[2], w2[1], selector); w5[3] = __byte_perm_S (w2[1], w2[0], selector); w5[2] = __byte_perm_S (w2[0], w1[3], selector); w5[1] = __byte_perm_S (w1[3], w1[2], selector); w5[0] = __byte_perm_S (w1[2], w1[1], selector); w4[3] = __byte_perm_S (w1[1], w1[0], selector); w4[2] = __byte_perm_S (w1[0], w0[3], selector); w4[1] = __byte_perm_S (w0[3], w0[2], selector); w4[0] = __byte_perm_S (w0[2], w0[1], selector); w3[3] = __byte_perm_S (w0[1], w0[0], selector); w3[2] = __byte_perm_S (w0[0], 0, selector); w3[1] = 0; 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; case 15: c3[3] = __byte_perm_S ( 0, w7[3], selector); c3[2] = __byte_perm_S (w7[3], w7[2], selector); c3[1] = __byte_perm_S (w7[2], w7[1], selector); c3[0] = __byte_perm_S (w7[1], w7[0], selector); c2[3] = __byte_perm_S (w7[0], w6[3], selector); c2[2] = __byte_perm_S (w6[3], w6[2], selector); c2[1] = __byte_perm_S (w6[2], w6[1], selector); c2[0] = __byte_perm_S (w6[1], w6[0], selector); c1[3] = __byte_perm_S (w6[0], w5[3], selector); c1[2] = __byte_perm_S (w5[3], w5[2], selector); c1[1] = __byte_perm_S (w5[2], w5[1], selector); c1[0] = __byte_perm_S (w5[1], w5[0], selector); c0[3] = __byte_perm_S (w5[0], w4[3], selector); c0[2] = __byte_perm_S (w4[3], w4[2], selector); c0[1] = __byte_perm_S (w4[2], w4[1], selector); c0[0] = __byte_perm_S (w4[1], w4[0], selector); w7[3] = __byte_perm_S (w4[0], w3[3], selector); w7[2] = __byte_perm_S (w3[3], w3[2], selector); w7[1] = __byte_perm_S (w3[2], w3[1], selector); w7[0] = __byte_perm_S (w3[1], w3[0], selector); w6[3] = __byte_perm_S (w3[0], w2[3], selector); w6[2] = __byte_perm_S (w2[3], w2[2], selector); w6[1] = __byte_perm_S (w2[2], w2[1], selector); w6[0] = __byte_perm_S (w2[1], w2[0], selector); w5[3] = __byte_perm_S (w2[0], w1[3], selector); w5[2] = __byte_perm_S (w1[3], w1[2], selector); w5[1] = __byte_perm_S (w1[2], w1[1], selector); w5[0] = __byte_perm_S (w1[1], w1[0], selector); w4[3] = __byte_perm_S (w1[0], w0[3], selector); w4[2] = __byte_perm_S (w0[3], w0[2], selector); w4[1] = __byte_perm_S (w0[2], w0[1], selector); w4[0] = __byte_perm_S (w0[1], w0[0], selector); w3[3] = __byte_perm_S (w0[0], 0, selector); w3[2] = 0; w3[1] = 0; 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; case 16: c4[0] = __byte_perm_S ( 0, w7[3], selector); c3[3] = __byte_perm_S (w7[3], w7[2], selector); c3[2] = __byte_perm_S (w7[2], w7[1], selector); c3[1] = __byte_perm_S (w7[1], w7[0], selector); c3[0] = __byte_perm_S (w7[0], w6[3], selector); c2[3] = __byte_perm_S (w6[3], w6[2], selector); c2[2] = __byte_perm_S (w6[2], w6[1], selector); c2[1] = __byte_perm_S (w6[1], w6[0], selector); c2[0] = __byte_perm_S (w6[0], w5[3], selector); c1[3] = __byte_perm_S (w5[3], w5[2], selector); c1[2] = __byte_perm_S (w5[2], w5[1], selector); c1[1] = __byte_perm_S (w5[1], w5[0], selector); c1[0] = __byte_perm_S (w5[0], w4[3], selector); c0[3] = __byte_perm_S (w4[3], w4[2], selector); c0[2] = __byte_perm_S (w4[2], w4[1], selector); c0[1] = __byte_perm_S (w4[1], w4[0], selector); c0[0] = __byte_perm_S (w4[0], w3[3], selector); w7[3] = __byte_perm_S (w3[3], w3[2], selector); w7[2] = __byte_perm_S (w3[2], w3[1], selector); w7[1] = __byte_perm_S (w3[1], w3[0], selector); w7[0] = __byte_perm_S (w3[0], w2[3], selector); w6[3] = __byte_perm_S (w2[3], w2[2], selector); w6[2] = __byte_perm_S (w2[2], w2[1], selector); w6[1] = __byte_perm_S (w2[1], w2[0], selector); w6[0] = __byte_perm_S (w2[0], w1[3], selector); w5[3] = __byte_perm_S (w1[3], w1[2], selector); w5[2] = __byte_perm_S (w1[2], w1[1], selector); w5[1] = __byte_perm_S (w1[1], w1[0], selector); w5[0] = __byte_perm_S (w1[0], w0[3], selector); w4[3] = __byte_perm_S (w0[3], w0[2], selector); w4[2] = __byte_perm_S (w0[2], w0[1], selector); w4[1] = __byte_perm_S (w0[1], w0[0], selector); w4[0] = __byte_perm_S (w0[0], 0, selector); w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 17: c4[1] = __byte_perm_S ( 0, w7[3], selector); c4[0] = __byte_perm_S (w7[3], w7[2], selector); c3[3] = __byte_perm_S (w7[2], w7[1], selector); c3[2] = __byte_perm_S (w7[1], w7[0], selector); c3[1] = __byte_perm_S (w7[0], w6[3], selector); c3[0] = __byte_perm_S (w6[3], w6[2], selector); c2[3] = __byte_perm_S (w6[2], w6[1], selector); c2[2] = __byte_perm_S (w6[1], w6[0], selector); c2[1] = __byte_perm_S (w6[0], w5[3], selector); c2[0] = __byte_perm_S (w5[3], w5[2], selector); c1[3] = __byte_perm_S (w5[2], w5[1], selector); c1[2] = __byte_perm_S (w5[1], w5[0], selector); c1[1] = __byte_perm_S (w5[0], w4[3], selector); c1[0] = __byte_perm_S (w4[3], w4[2], selector); c0[3] = __byte_perm_S (w4[2], w4[1], selector); c0[2] = __byte_perm_S (w4[1], w4[0], selector); c0[1] = __byte_perm_S (w4[0], w3[3], selector); c0[0] = __byte_perm_S (w3[3], w3[2], selector); w7[3] = __byte_perm_S (w3[2], w3[1], selector); w7[2] = __byte_perm_S (w3[1], w3[0], selector); w7[1] = __byte_perm_S (w3[0], w2[3], selector); w7[0] = __byte_perm_S (w2[3], w2[2], selector); w6[3] = __byte_perm_S (w2[2], w2[1], selector); w6[2] = __byte_perm_S (w2[1], w2[0], selector); w6[1] = __byte_perm_S (w2[0], w1[3], selector); w6[0] = __byte_perm_S (w1[3], w1[2], selector); w5[3] = __byte_perm_S (w1[2], w1[1], selector); w5[2] = __byte_perm_S (w1[1], w1[0], selector); w5[1] = __byte_perm_S (w1[0], w0[3], selector); w5[0] = __byte_perm_S (w0[3], w0[2], selector); w4[3] = __byte_perm_S (w0[2], w0[1], selector); w4[2] = __byte_perm_S (w0[1], w0[0], selector); w4[1] = __byte_perm_S (w0[0], 0, selector); w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 18: c4[2] = __byte_perm_S ( 0, w7[3], selector); c4[1] = __byte_perm_S (w7[3], w7[2], selector); c4[0] = __byte_perm_S (w7[2], w7[1], selector); c3[3] = __byte_perm_S (w7[1], w7[0], selector); c3[2] = __byte_perm_S (w7[0], w6[3], selector); c3[1] = __byte_perm_S (w6[3], w6[2], selector); c3[0] = __byte_perm_S (w6[2], w6[1], selector); c2[3] = __byte_perm_S (w6[1], w6[0], selector); c2[2] = __byte_perm_S (w6[0], w5[3], selector); c2[1] = __byte_perm_S (w5[3], w5[2], selector); c2[0] = __byte_perm_S (w5[2], w5[1], selector); c1[3] = __byte_perm_S (w5[1], w5[0], selector); c1[2] = __byte_perm_S (w5[0], w4[3], selector); c1[1] = __byte_perm_S (w4[3], w4[2], selector); c1[0] = __byte_perm_S (w4[2], w4[1], selector); c0[3] = __byte_perm_S (w4[1], w4[0], selector); c0[2] = __byte_perm_S (w4[0], w3[3], selector); c0[1] = __byte_perm_S (w3[3], w3[2], selector); c0[0] = __byte_perm_S (w3[2], w3[1], selector); w7[3] = __byte_perm_S (w3[1], w3[0], selector); w7[2] = __byte_perm_S (w3[0], w2[3], selector); w7[1] = __byte_perm_S (w2[3], w2[2], selector); w7[0] = __byte_perm_S (w2[2], w2[1], selector); w6[3] = __byte_perm_S (w2[1], w2[0], selector); w6[2] = __byte_perm_S (w2[0], w1[3], selector); w6[1] = __byte_perm_S (w1[3], w1[2], selector); w6[0] = __byte_perm_S (w1[2], w1[1], selector); w5[3] = __byte_perm_S (w1[1], w1[0], selector); w5[2] = __byte_perm_S (w1[0], w0[3], selector); w5[1] = __byte_perm_S (w0[3], w0[2], selector); w5[0] = __byte_perm_S (w0[2], w0[1], selector); w4[3] = __byte_perm_S (w0[1], w0[0], selector); w4[2] = __byte_perm_S (w0[0], 0, selector); w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 19: c4[3] = __byte_perm_S ( 0, w7[3], selector); c4[2] = __byte_perm_S (w7[3], w7[2], selector); c4[1] = __byte_perm_S (w7[2], w7[1], selector); c4[0] = __byte_perm_S (w7[1], w7[0], selector); c3[3] = __byte_perm_S (w7[0], w6[3], selector); c3[2] = __byte_perm_S (w6[3], w6[2], selector); c3[1] = __byte_perm_S (w6[2], w6[1], selector); c3[0] = __byte_perm_S (w6[1], w6[0], selector); c2[3] = __byte_perm_S (w6[0], w5[3], selector); c2[2] = __byte_perm_S (w5[3], w5[2], selector); c2[1] = __byte_perm_S (w5[2], w5[1], selector); c2[0] = __byte_perm_S (w5[1], w5[0], selector); c1[3] = __byte_perm_S (w5[0], w4[3], selector); c1[2] = __byte_perm_S (w4[3], w4[2], selector); c1[1] = __byte_perm_S (w4[2], w4[1], selector); c1[0] = __byte_perm_S (w4[1], w4[0], selector); c0[3] = __byte_perm_S (w4[0], w3[3], selector); c0[2] = __byte_perm_S (w3[3], w3[2], selector); c0[1] = __byte_perm_S (w3[2], w3[1], selector); c0[0] = __byte_perm_S (w3[1], w3[0], selector); w7[3] = __byte_perm_S (w3[0], w2[3], selector); w7[2] = __byte_perm_S (w2[3], w2[2], selector); w7[1] = __byte_perm_S (w2[2], w2[1], selector); w7[0] = __byte_perm_S (w2[1], w2[0], selector); w6[3] = __byte_perm_S (w2[0], w1[3], selector); w6[2] = __byte_perm_S (w1[3], w1[2], selector); w6[1] = __byte_perm_S (w1[2], w1[1], selector); w6[0] = __byte_perm_S (w1[1], w1[0], selector); w5[3] = __byte_perm_S (w1[0], w0[3], selector); w5[2] = __byte_perm_S (w0[3], w0[2], selector); w5[1] = __byte_perm_S (w0[2], w0[1], selector); w5[0] = __byte_perm_S (w0[1], w0[0], selector); w4[3] = __byte_perm_S (w0[0], 0, selector); w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 20: c5[0] = __byte_perm_S ( 0, w7[3], selector); c4[3] = __byte_perm_S (w7[3], w7[2], selector); c4[2] = __byte_perm_S (w7[2], w7[1], selector); c4[1] = __byte_perm_S (w7[1], w7[0], selector); c4[0] = __byte_perm_S (w7[0], w6[3], selector); c3[3] = __byte_perm_S (w6[3], w6[2], selector); c3[2] = __byte_perm_S (w6[2], w6[1], selector); c3[1] = __byte_perm_S (w6[1], w6[0], selector); c3[0] = __byte_perm_S (w6[0], w5[3], selector); c2[3] = __byte_perm_S (w5[3], w5[2], selector); c2[2] = __byte_perm_S (w5[2], w5[1], selector); c2[1] = __byte_perm_S (w5[1], w5[0], selector); c2[0] = __byte_perm_S (w5[0], w4[3], selector); c1[3] = __byte_perm_S (w4[3], w4[2], selector); c1[2] = __byte_perm_S (w4[2], w4[1], selector); c1[1] = __byte_perm_S (w4[1], w4[0], selector); c1[0] = __byte_perm_S (w4[0], w3[3], selector); c0[3] = __byte_perm_S (w3[3], w3[2], selector); c0[2] = __byte_perm_S (w3[2], w3[1], selector); c0[1] = __byte_perm_S (w3[1], w3[0], selector); c0[0] = __byte_perm_S (w3[0], w2[3], selector); w7[3] = __byte_perm_S (w2[3], w2[2], selector); w7[2] = __byte_perm_S (w2[2], w2[1], selector); w7[1] = __byte_perm_S (w2[1], w2[0], selector); w7[0] = __byte_perm_S (w2[0], w1[3], selector); w6[3] = __byte_perm_S (w1[3], w1[2], selector); w6[2] = __byte_perm_S (w1[2], w1[1], selector); w6[1] = __byte_perm_S (w1[1], w1[0], selector); w6[0] = __byte_perm_S (w1[0], w0[3], selector); w5[3] = __byte_perm_S (w0[3], w0[2], selector); w5[2] = __byte_perm_S (w0[2], w0[1], selector); w5[1] = __byte_perm_S (w0[1], w0[0], selector); w5[0] = __byte_perm_S (w0[0], 0, selector); w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 21: c5[1] = __byte_perm_S ( 0, w7[3], selector); c5[0] = __byte_perm_S (w7[3], w7[2], selector); c4[3] = __byte_perm_S (w7[2], w7[1], selector); c4[2] = __byte_perm_S (w7[1], w7[0], selector); c4[1] = __byte_perm_S (w7[0], w6[3], selector); c4[0] = __byte_perm_S (w6[3], w6[2], selector); c3[3] = __byte_perm_S (w6[2], w6[1], selector); c3[2] = __byte_perm_S (w6[1], w6[0], selector); c3[1] = __byte_perm_S (w6[0], w5[3], selector); c3[0] = __byte_perm_S (w5[3], w5[2], selector); c2[3] = __byte_perm_S (w5[2], w5[1], selector); c2[2] = __byte_perm_S (w5[1], w5[0], selector); c2[1] = __byte_perm_S (w5[0], w4[3], selector); c2[0] = __byte_perm_S (w4[3], w4[2], selector); c1[3] = __byte_perm_S (w4[2], w4[1], selector); c1[2] = __byte_perm_S (w4[1], w4[0], selector); c1[1] = __byte_perm_S (w4[0], w3[3], selector); c1[0] = __byte_perm_S (w3[3], w3[2], selector); c0[3] = __byte_perm_S (w3[2], w3[1], selector); c0[2] = __byte_perm_S (w3[1], w3[0], selector); c0[1] = __byte_perm_S (w3[0], w2[3], selector); c0[0] = __byte_perm_S (w2[3], w2[2], selector); w7[3] = __byte_perm_S (w2[2], w2[1], selector); w7[2] = __byte_perm_S (w2[1], w2[0], selector); w7[1] = __byte_perm_S (w2[0], w1[3], selector); w7[0] = __byte_perm_S (w1[3], w1[2], selector); w6[3] = __byte_perm_S (w1[2], w1[1], selector); w6[2] = __byte_perm_S (w1[1], w1[0], selector); w6[1] = __byte_perm_S (w1[0], w0[3], selector); w6[0] = __byte_perm_S (w0[3], w0[2], selector); w5[3] = __byte_perm_S (w0[2], w0[1], selector); w5[2] = __byte_perm_S (w0[1], w0[0], selector); w5[1] = __byte_perm_S (w0[0], 0, selector); w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 22: c5[2] = __byte_perm_S ( 0, w7[3], selector); c5[1] = __byte_perm_S (w7[3], w7[2], selector); c5[0] = __byte_perm_S (w7[2], w7[1], selector); c4[3] = __byte_perm_S (w7[1], w7[0], selector); c4[2] = __byte_perm_S (w7[0], w6[3], selector); c4[1] = __byte_perm_S (w6[3], w6[2], selector); c4[0] = __byte_perm_S (w6[2], w6[1], selector); c3[3] = __byte_perm_S (w6[1], w6[0], selector); c3[2] = __byte_perm_S (w6[0], w5[3], selector); c3[1] = __byte_perm_S (w5[3], w5[2], selector); c3[0] = __byte_perm_S (w5[2], w5[1], selector); c2[3] = __byte_perm_S (w5[1], w5[0], selector); c2[2] = __byte_perm_S (w5[0], w4[3], selector); c2[1] = __byte_perm_S (w4[3], w4[2], selector); c2[0] = __byte_perm_S (w4[2], w4[1], selector); c1[3] = __byte_perm_S (w4[1], w4[0], selector); c1[2] = __byte_perm_S (w4[0], w3[3], selector); c1[1] = __byte_perm_S (w3[3], w3[2], selector); c1[0] = __byte_perm_S (w3[2], w3[1], selector); c0[3] = __byte_perm_S (w3[1], w3[0], selector); c0[2] = __byte_perm_S (w3[0], w2[3], selector); c0[1] = __byte_perm_S (w2[3], w2[2], selector); c0[0] = __byte_perm_S (w2[2], w2[1], selector); w7[3] = __byte_perm_S (w2[1], w2[0], selector); w7[2] = __byte_perm_S (w2[0], w1[3], selector); w7[1] = __byte_perm_S (w1[3], w1[2], selector); w7[0] = __byte_perm_S (w1[2], w1[1], selector); w6[3] = __byte_perm_S (w1[1], w1[0], selector); w6[2] = __byte_perm_S (w1[0], w0[3], selector); w6[1] = __byte_perm_S (w0[3], w0[2], selector); w6[0] = __byte_perm_S (w0[2], w0[1], selector); w5[3] = __byte_perm_S (w0[1], w0[0], selector); w5[2] = __byte_perm_S (w0[0], 0, selector); w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 23: c5[3] = __byte_perm_S ( 0, w7[3], selector); c5[2] = __byte_perm_S (w7[3], w7[2], selector); c5[1] = __byte_perm_S (w7[2], w7[1], selector); c5[0] = __byte_perm_S (w7[1], w7[0], selector); c4[3] = __byte_perm_S (w7[0], w6[3], selector); c4[2] = __byte_perm_S (w6[3], w6[2], selector); c4[1] = __byte_perm_S (w6[2], w6[1], selector); c4[0] = __byte_perm_S (w6[1], w6[0], selector); c3[3] = __byte_perm_S (w6[0], w5[3], selector); c3[2] = __byte_perm_S (w5[3], w5[2], selector); c3[1] = __byte_perm_S (w5[2], w5[1], selector); c3[0] = __byte_perm_S (w5[1], w5[0], selector); c2[3] = __byte_perm_S (w5[0], w4[3], selector); c2[2] = __byte_perm_S (w4[3], w4[2], selector); c2[1] = __byte_perm_S (w4[2], w4[1], selector); c2[0] = __byte_perm_S (w4[1], w4[0], selector); c1[3] = __byte_perm_S (w4[0], w3[3], selector); c1[2] = __byte_perm_S (w3[3], w3[2], selector); c1[1] = __byte_perm_S (w3[2], w3[1], selector); c1[0] = __byte_perm_S (w3[1], w3[0], selector); c0[3] = __byte_perm_S (w3[0], w2[3], selector); c0[2] = __byte_perm_S (w2[3], w2[2], selector); c0[1] = __byte_perm_S (w2[2], w2[1], selector); c0[0] = __byte_perm_S (w2[1], w2[0], selector); w7[3] = __byte_perm_S (w2[0], w1[3], selector); w7[2] = __byte_perm_S (w1[3], w1[2], selector); w7[1] = __byte_perm_S (w1[2], w1[1], selector); w7[0] = __byte_perm_S (w1[1], w1[0], selector); w6[3] = __byte_perm_S (w1[0], w0[3], selector); w6[2] = __byte_perm_S (w0[3], w0[2], selector); w6[1] = __byte_perm_S (w0[2], w0[1], selector); w6[0] = __byte_perm_S (w0[1], w0[0], selector); w5[3] = __byte_perm_S (w0[0], 0, selector); w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 24: c6[0] = __byte_perm_S ( 0, w7[3], selector); c5[3] = __byte_perm_S (w7[3], w7[2], selector); c5[2] = __byte_perm_S (w7[2], w7[1], selector); c5[1] = __byte_perm_S (w7[1], w7[0], selector); c5[0] = __byte_perm_S (w7[0], w6[3], selector); c4[3] = __byte_perm_S (w6[3], w6[2], selector); c4[2] = __byte_perm_S (w6[2], w6[1], selector); c4[1] = __byte_perm_S (w6[1], w6[0], selector); c4[0] = __byte_perm_S (w6[0], w5[3], selector); c3[3] = __byte_perm_S (w5[3], w5[2], selector); c3[2] = __byte_perm_S (w5[2], w5[1], selector); c3[1] = __byte_perm_S (w5[1], w5[0], selector); c3[0] = __byte_perm_S (w5[0], w4[3], selector); c2[3] = __byte_perm_S (w4[3], w4[2], selector); c2[2] = __byte_perm_S (w4[2], w4[1], selector); c2[1] = __byte_perm_S (w4[1], w4[0], selector); c2[0] = __byte_perm_S (w4[0], w3[3], selector); c1[3] = __byte_perm_S (w3[3], w3[2], selector); c1[2] = __byte_perm_S (w3[2], w3[1], selector); c1[1] = __byte_perm_S (w3[1], w3[0], selector); c1[0] = __byte_perm_S (w3[0], w2[3], selector); c0[3] = __byte_perm_S (w2[3], w2[2], selector); c0[2] = __byte_perm_S (w2[2], w2[1], selector); c0[1] = __byte_perm_S (w2[1], w2[0], selector); c0[0] = __byte_perm_S (w2[0], w1[3], selector); w7[3] = __byte_perm_S (w1[3], w1[2], selector); w7[2] = __byte_perm_S (w1[2], w1[1], selector); w7[1] = __byte_perm_S (w1[1], w1[0], selector); w7[0] = __byte_perm_S (w1[0], w0[3], selector); w6[3] = __byte_perm_S (w0[3], w0[2], selector); w6[2] = __byte_perm_S (w0[2], w0[1], selector); w6[1] = __byte_perm_S (w0[1], w0[0], selector); w6[0] = __byte_perm_S (w0[0], 0, selector); w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 25: c6[1] = __byte_perm_S ( 0, w7[3], selector); c6[0] = __byte_perm_S (w7[3], w7[2], selector); c5[3] = __byte_perm_S (w7[2], w7[1], selector); c5[2] = __byte_perm_S (w7[1], w7[0], selector); c5[1] = __byte_perm_S (w7[0], w6[3], selector); c5[0] = __byte_perm_S (w6[3], w6[2], selector); c4[3] = __byte_perm_S (w6[2], w6[1], selector); c4[2] = __byte_perm_S (w6[1], w6[0], selector); c4[1] = __byte_perm_S (w6[0], w5[3], selector); c4[0] = __byte_perm_S (w5[3], w5[2], selector); c3[3] = __byte_perm_S (w5[2], w5[1], selector); c3[2] = __byte_perm_S (w5[1], w5[0], selector); c3[1] = __byte_perm_S (w5[0], w4[3], selector); c3[0] = __byte_perm_S (w4[3], w4[2], selector); c2[3] = __byte_perm_S (w4[2], w4[1], selector); c2[2] = __byte_perm_S (w4[1], w4[0], selector); c2[1] = __byte_perm_S (w4[0], w3[3], selector); c2[0] = __byte_perm_S (w3[3], w3[2], selector); c1[3] = __byte_perm_S (w3[2], w3[1], selector); c1[2] = __byte_perm_S (w3[1], w3[0], selector); c1[1] = __byte_perm_S (w3[0], w2[3], selector); c1[0] = __byte_perm_S (w2[3], w2[2], selector); c0[3] = __byte_perm_S (w2[2], w2[1], selector); c0[2] = __byte_perm_S (w2[1], w2[0], selector); c0[1] = __byte_perm_S (w2[0], w1[3], selector); c0[0] = __byte_perm_S (w1[3], w1[2], selector); w7[3] = __byte_perm_S (w1[2], w1[1], selector); w7[2] = __byte_perm_S (w1[1], w1[0], selector); w7[1] = __byte_perm_S (w1[0], w0[3], selector); w7[0] = __byte_perm_S (w0[3], w0[2], selector); w6[3] = __byte_perm_S (w0[2], w0[1], selector); w6[2] = __byte_perm_S (w0[1], w0[0], selector); w6[1] = __byte_perm_S (w0[0], 0, selector); w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 26: c6[2] = __byte_perm_S ( 0, w7[3], selector); c6[1] = __byte_perm_S (w7[3], w7[2], selector); c6[0] = __byte_perm_S (w7[2], w7[1], selector); c5[3] = __byte_perm_S (w7[1], w7[0], selector); c5[2] = __byte_perm_S (w7[0], w6[3], selector); c5[1] = __byte_perm_S (w6[3], w6[2], selector); c5[0] = __byte_perm_S (w6[2], w6[1], selector); c4[3] = __byte_perm_S (w6[1], w6[0], selector); c4[2] = __byte_perm_S (w6[0], w5[3], selector); c4[1] = __byte_perm_S (w5[3], w5[2], selector); c4[0] = __byte_perm_S (w5[2], w5[1], selector); c3[3] = __byte_perm_S (w5[1], w5[0], selector); c3[2] = __byte_perm_S (w5[0], w4[3], selector); c3[1] = __byte_perm_S (w4[3], w4[2], selector); c3[0] = __byte_perm_S (w4[2], w4[1], selector); c2[3] = __byte_perm_S (w4[1], w4[0], selector); c2[2] = __byte_perm_S (w4[0], w3[3], selector); c2[1] = __byte_perm_S (w3[3], w3[2], selector); c2[0] = __byte_perm_S (w3[2], w3[1], selector); c1[3] = __byte_perm_S (w3[1], w3[0], selector); c1[2] = __byte_perm_S (w3[0], w2[3], selector); c1[1] = __byte_perm_S (w2[3], w2[2], selector); c1[0] = __byte_perm_S (w2[2], w2[1], selector); c0[3] = __byte_perm_S (w2[1], w2[0], selector); c0[2] = __byte_perm_S (w2[0], w1[3], selector); c0[1] = __byte_perm_S (w1[3], w1[2], selector); c0[0] = __byte_perm_S (w1[2], w1[1], selector); w7[3] = __byte_perm_S (w1[1], w1[0], selector); w7[2] = __byte_perm_S (w1[0], w0[3], selector); w7[1] = __byte_perm_S (w0[3], w0[2], selector); w7[0] = __byte_perm_S (w0[2], w0[1], selector); w6[3] = __byte_perm_S (w0[1], w0[0], selector); w6[2] = __byte_perm_S (w0[0], 0, selector); w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 27: c6[3] = __byte_perm_S ( 0, w7[3], selector); c6[2] = __byte_perm_S (w7[3], w7[2], selector); c6[1] = __byte_perm_S (w7[2], w7[1], selector); c6[0] = __byte_perm_S (w7[1], w7[0], selector); c5[3] = __byte_perm_S (w7[0], w6[3], selector); c5[2] = __byte_perm_S (w6[3], w6[2], selector); c5[1] = __byte_perm_S (w6[2], w6[1], selector); c5[0] = __byte_perm_S (w6[1], w6[0], selector); c4[3] = __byte_perm_S (w6[0], w5[3], selector); c4[2] = __byte_perm_S (w5[3], w5[2], selector); c4[1] = __byte_perm_S (w5[2], w5[1], selector); c4[0] = __byte_perm_S (w5[1], w5[0], selector); c3[3] = __byte_perm_S (w5[0], w4[3], selector); c3[2] = __byte_perm_S (w4[3], w4[2], selector); c3[1] = __byte_perm_S (w4[2], w4[1], selector); c3[0] = __byte_perm_S (w4[1], w4[0], selector); c2[3] = __byte_perm_S (w4[0], w3[3], selector); c2[2] = __byte_perm_S (w3[3], w3[2], selector); c2[1] = __byte_perm_S (w3[2], w3[1], selector); c2[0] = __byte_perm_S (w3[1], w3[0], selector); c1[3] = __byte_perm_S (w3[0], w2[3], selector); c1[2] = __byte_perm_S (w2[3], w2[2], selector); c1[1] = __byte_perm_S (w2[2], w2[1], selector); c1[0] = __byte_perm_S (w2[1], w2[0], selector); c0[3] = __byte_perm_S (w2[0], w1[3], selector); c0[2] = __byte_perm_S (w1[3], w1[2], selector); c0[1] = __byte_perm_S (w1[2], w1[1], selector); c0[0] = __byte_perm_S (w1[1], w1[0], selector); w7[3] = __byte_perm_S (w1[0], w0[3], selector); w7[2] = __byte_perm_S (w0[3], w0[2], selector); w7[1] = __byte_perm_S (w0[2], w0[1], selector); w7[0] = __byte_perm_S (w0[1], w0[0], selector); w6[3] = __byte_perm_S (w0[0], 0, selector); w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 28: c7[0] = __byte_perm_S ( 0, w7[3], selector); c6[3] = __byte_perm_S (w7[3], w7[2], selector); c6[2] = __byte_perm_S (w7[2], w7[1], selector); c6[1] = __byte_perm_S (w7[1], w7[0], selector); c6[0] = __byte_perm_S (w7[0], w6[3], selector); c5[3] = __byte_perm_S (w6[3], w6[2], selector); c5[2] = __byte_perm_S (w6[2], w6[1], selector); c5[1] = __byte_perm_S (w6[1], w6[0], selector); c5[0] = __byte_perm_S (w6[0], w5[3], selector); c4[3] = __byte_perm_S (w5[3], w5[2], selector); c4[2] = __byte_perm_S (w5[2], w5[1], selector); c4[1] = __byte_perm_S (w5[1], w5[0], selector); c4[0] = __byte_perm_S (w5[0], w4[3], selector); c3[3] = __byte_perm_S (w4[3], w4[2], selector); c3[2] = __byte_perm_S (w4[2], w4[1], selector); c3[1] = __byte_perm_S (w4[1], w4[0], selector); c3[0] = __byte_perm_S (w4[0], w3[3], selector); c2[3] = __byte_perm_S (w3[3], w3[2], selector); c2[2] = __byte_perm_S (w3[2], w3[1], selector); c2[1] = __byte_perm_S (w3[1], w3[0], selector); c2[0] = __byte_perm_S (w3[0], w2[3], selector); c1[3] = __byte_perm_S (w2[3], w2[2], selector); c1[2] = __byte_perm_S (w2[2], w2[1], selector); c1[1] = __byte_perm_S (w2[1], w2[0], selector); c1[0] = __byte_perm_S (w2[0], w1[3], selector); c0[3] = __byte_perm_S (w1[3], w1[2], selector); c0[2] = __byte_perm_S (w1[2], w1[1], selector); c0[1] = __byte_perm_S (w1[1], w1[0], selector); c0[0] = __byte_perm_S (w1[0], w0[3], selector); w7[3] = __byte_perm_S (w0[3], w0[2], selector); w7[2] = __byte_perm_S (w0[2], w0[1], selector); w7[1] = __byte_perm_S (w0[1], w0[0], selector); w7[0] = __byte_perm_S (w0[0], 0, selector); w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 29: c7[1] = __byte_perm_S ( 0, w7[3], selector); c7[0] = __byte_perm_S (w7[3], w7[2], selector); c6[3] = __byte_perm_S (w7[2], w7[1], selector); c6[2] = __byte_perm_S (w7[1], w7[0], selector); c6[1] = __byte_perm_S (w7[0], w6[3], selector); c6[0] = __byte_perm_S (w6[3], w6[2], selector); c5[3] = __byte_perm_S (w6[2], w6[1], selector); c5[2] = __byte_perm_S (w6[1], w6[0], selector); c5[1] = __byte_perm_S (w6[0], w5[3], selector); c5[0] = __byte_perm_S (w5[3], w5[2], selector); c4[3] = __byte_perm_S (w5[2], w5[1], selector); c4[2] = __byte_perm_S (w5[1], w5[0], selector); c4[1] = __byte_perm_S (w5[0], w4[3], selector); c4[0] = __byte_perm_S (w4[3], w4[2], selector); c3[3] = __byte_perm_S (w4[2], w4[1], selector); c3[2] = __byte_perm_S (w4[1], w4[0], selector); c3[1] = __byte_perm_S (w4[0], w3[3], selector); c3[0] = __byte_perm_S (w3[3], w3[2], selector); c2[3] = __byte_perm_S (w3[2], w3[1], selector); c2[2] = __byte_perm_S (w3[1], w3[0], selector); c2[1] = __byte_perm_S (w3[0], w2[3], selector); c2[0] = __byte_perm_S (w2[3], w2[2], selector); c1[3] = __byte_perm_S (w2[2], w2[1], selector); c1[2] = __byte_perm_S (w2[1], w2[0], selector); c1[1] = __byte_perm_S (w2[0], w1[3], selector); c1[0] = __byte_perm_S (w1[3], w1[2], selector); c0[3] = __byte_perm_S (w1[2], w1[1], selector); c0[2] = __byte_perm_S (w1[1], w1[0], selector); c0[1] = __byte_perm_S (w1[0], w0[3], selector); c0[0] = __byte_perm_S (w0[3], w0[2], selector); w7[3] = __byte_perm_S (w0[2], w0[1], selector); w7[2] = __byte_perm_S (w0[1], w0[0], selector); w7[1] = __byte_perm_S (w0[0], 0, selector); w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 30: c7[2] = __byte_perm_S ( 0, w7[3], selector); c7[1] = __byte_perm_S (w7[3], w7[2], selector); c7[0] = __byte_perm_S (w7[2], w7[1], selector); c6[3] = __byte_perm_S (w7[1], w7[0], selector); c6[2] = __byte_perm_S (w7[0], w6[3], selector); c6[1] = __byte_perm_S (w6[3], w6[2], selector); c6[0] = __byte_perm_S (w6[2], w6[1], selector); c5[3] = __byte_perm_S (w6[1], w6[0], selector); c5[2] = __byte_perm_S (w6[0], w5[3], selector); c5[1] = __byte_perm_S (w5[3], w5[2], selector); c5[0] = __byte_perm_S (w5[2], w5[1], selector); c4[3] = __byte_perm_S (w5[1], w5[0], selector); c4[2] = __byte_perm_S (w5[0], w4[3], selector); c4[1] = __byte_perm_S (w4[3], w4[2], selector); c4[0] = __byte_perm_S (w4[2], w4[1], selector); c3[3] = __byte_perm_S (w4[1], w4[0], selector); c3[2] = __byte_perm_S (w4[0], w3[3], selector); c3[1] = __byte_perm_S (w3[3], w3[2], selector); c3[0] = __byte_perm_S (w3[2], w3[1], selector); c2[3] = __byte_perm_S (w3[1], w3[0], selector); c2[2] = __byte_perm_S (w3[0], w2[3], selector); c2[1] = __byte_perm_S (w2[3], w2[2], selector); c2[0] = __byte_perm_S (w2[2], w2[1], selector); c1[3] = __byte_perm_S (w2[1], w2[0], selector); c1[2] = __byte_perm_S (w2[0], w1[3], selector); c1[1] = __byte_perm_S (w1[3], w1[2], selector); c1[0] = __byte_perm_S (w1[2], w1[1], selector); c0[3] = __byte_perm_S (w1[1], w1[0], selector); c0[2] = __byte_perm_S (w1[0], w0[3], selector); c0[1] = __byte_perm_S (w0[3], w0[2], selector); c0[0] = __byte_perm_S (w0[2], w0[1], selector); w7[3] = __byte_perm_S (w0[1], w0[0], selector); w7[2] = __byte_perm_S (w0[0], 0, selector); w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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; case 31: c7[3] = __byte_perm_S ( 0, w7[3], selector); c7[2] = __byte_perm_S (w7[3], w7[2], selector); c7[1] = __byte_perm_S (w7[2], w7[1], selector); c7[0] = __byte_perm_S (w7[1], w7[0], selector); c6[3] = __byte_perm_S (w7[0], w6[3], selector); c6[2] = __byte_perm_S (w6[3], w6[2], selector); c6[1] = __byte_perm_S (w6[2], w6[1], selector); c6[0] = __byte_perm_S (w6[1], w6[0], selector); c5[3] = __byte_perm_S (w6[0], w5[3], selector); c5[2] = __byte_perm_S (w5[3], w5[2], selector); c5[1] = __byte_perm_S (w5[2], w5[1], selector); c5[0] = __byte_perm_S (w5[1], w5[0], selector); c4[3] = __byte_perm_S (w5[0], w4[3], selector); c4[2] = __byte_perm_S (w4[3], w4[2], selector); c4[1] = __byte_perm_S (w4[2], w4[1], selector); c4[0] = __byte_perm_S (w4[1], w4[0], selector); c3[3] = __byte_perm_S (w4[0], w3[3], selector); c3[2] = __byte_perm_S (w3[3], w3[2], selector); c3[1] = __byte_perm_S (w3[2], w3[1], selector); c3[0] = __byte_perm_S (w3[1], w3[0], selector); c2[3] = __byte_perm_S (w3[0], w2[3], selector); c2[2] = __byte_perm_S (w2[3], w2[2], selector); c2[1] = __byte_perm_S (w2[2], w2[1], selector); c2[0] = __byte_perm_S (w2[1], w2[0], selector); c1[3] = __byte_perm_S (w2[0], w1[3], selector); c1[2] = __byte_perm_S (w1[3], w1[2], selector); c1[1] = __byte_perm_S (w1[2], w1[1], selector); c1[0] = __byte_perm_S (w1[1], w1[0], selector); c0[3] = __byte_perm_S (w1[0], w0[3], selector); c0[2] = __byte_perm_S (w0[3], w0[2], selector); c0[1] = __byte_perm_S (w0[2], w0[1], selector); c0[0] = __byte_perm_S (w0[1], w0[0], selector); w7[3] = __byte_perm_S (w0[0], 0, selector); w7[2] = 0; w7[1] = 0; w7[0] = 0; w6[3] = 0; w6[2] = 0; w6[1] = 0; w6[0] = 0; w5[3] = 0; w5[2] = 0; w5[1] = 0; w5[0] = 0; w4[3] = 0; w4[2] = 0; w4[1] = 0; w4[0] = 0; w3[3] = 0; w3[2] = 0; w3[1] = 0; 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 } void switch_buffer_by_offset_1x64_le_S (u32 w[64], const u32 offset) { const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if (defined IS_AMD && AMD_GCN < 3) || defined IS_GENERIC #pragma unroll for (int i = 0; i < 64; i++) w[i] = swap32_S (w[i]); switch (offset_switch) { case 0: w[63] = amd_bytealign_S (w[62], w[63], offset); w[62] = amd_bytealign_S (w[61], w[62], offset); w[61] = amd_bytealign_S (w[60], w[61], offset); w[60] = amd_bytealign_S (w[59], w[60], offset); w[59] = amd_bytealign_S (w[58], w[59], offset); w[58] = amd_bytealign_S (w[57], w[58], offset); w[57] = amd_bytealign_S (w[56], w[57], offset); w[56] = amd_bytealign_S (w[55], w[56], offset); w[55] = amd_bytealign_S (w[54], w[55], offset); w[54] = amd_bytealign_S (w[53], w[54], offset); w[53] = amd_bytealign_S (w[52], w[53], offset); w[52] = amd_bytealign_S (w[51], w[52], offset); w[51] = amd_bytealign_S (w[50], w[51], offset); w[50] = amd_bytealign_S (w[49], w[50], offset); w[49] = amd_bytealign_S (w[48], w[49], offset); w[48] = amd_bytealign_S (w[47], w[48], offset); w[47] = amd_bytealign_S (w[46], w[47], offset); w[46] = amd_bytealign_S (w[45], w[46], offset); w[45] = amd_bytealign_S (w[44], w[45], offset); w[44] = amd_bytealign_S (w[43], w[44], offset); w[43] = amd_bytealign_S (w[42], w[43], offset); w[42] = amd_bytealign_S (w[41], w[42], offset); w[41] = amd_bytealign_S (w[40], w[41], offset); w[40] = amd_bytealign_S (w[39], w[40], offset); w[39] = amd_bytealign_S (w[38], w[39], offset); w[38] = amd_bytealign_S (w[37], w[38], offset); w[37] = amd_bytealign_S (w[36], w[37], offset); w[36] = amd_bytealign_S (w[35], w[36], offset); w[35] = amd_bytealign_S (w[34], w[35], offset); w[34] = amd_bytealign_S (w[33], w[34], offset); w[33] = amd_bytealign_S (w[32], w[33], offset); w[32] = amd_bytealign_S (w[31], w[32], offset); w[31] = amd_bytealign_S (w[30], w[31], offset); w[30] = amd_bytealign_S (w[29], w[30], offset); w[29] = amd_bytealign_S (w[28], w[29], offset); w[28] = amd_bytealign_S (w[27], w[28], offset); w[27] = amd_bytealign_S (w[26], w[27], offset); w[26] = amd_bytealign_S (w[25], w[26], offset); w[25] = amd_bytealign_S (w[24], w[25], offset); w[24] = amd_bytealign_S (w[23], w[24], offset); w[23] = amd_bytealign_S (w[22], w[23], offset); w[22] = amd_bytealign_S (w[21], w[22], offset); w[21] = amd_bytealign_S (w[20], w[21], offset); w[20] = amd_bytealign_S (w[19], w[20], offset); w[19] = amd_bytealign_S (w[18], w[19], offset); w[18] = amd_bytealign_S (w[17], w[18], offset); w[17] = amd_bytealign_S (w[16], w[17], offset); w[16] = amd_bytealign_S (w[15], w[16], offset); w[15] = amd_bytealign_S (w[14], w[15], offset); w[14] = amd_bytealign_S (w[13], w[14], offset); w[13] = amd_bytealign_S (w[12], w[13], offset); w[12] = amd_bytealign_S (w[11], w[12], offset); w[11] = amd_bytealign_S (w[10], w[11], offset); w[10] = amd_bytealign_S (w[ 9], w[10], offset); w[ 9] = amd_bytealign_S (w[ 8], w[ 9], offset); w[ 8] = amd_bytealign_S (w[ 7], w[ 8], offset); w[ 7] = amd_bytealign_S (w[ 6], w[ 7], offset); w[ 6] = amd_bytealign_S (w[ 5], w[ 6], offset); w[ 5] = amd_bytealign_S (w[ 4], w[ 5], offset); w[ 4] = amd_bytealign_S (w[ 3], w[ 4], offset); w[ 3] = amd_bytealign_S (w[ 2], w[ 3], offset); w[ 2] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 1] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 0] = amd_bytealign_S ( 0, w[ 0], offset); break; case 1: w[63] = amd_bytealign_S (w[61], w[62], offset); w[62] = amd_bytealign_S (w[60], w[61], offset); w[61] = amd_bytealign_S (w[59], w[60], offset); w[60] = amd_bytealign_S (w[58], w[59], offset); w[59] = amd_bytealign_S (w[57], w[58], offset); w[58] = amd_bytealign_S (w[56], w[57], offset); w[57] = amd_bytealign_S (w[55], w[56], offset); w[56] = amd_bytealign_S (w[54], w[55], offset); w[55] = amd_bytealign_S (w[53], w[54], offset); w[54] = amd_bytealign_S (w[52], w[53], offset); w[53] = amd_bytealign_S (w[51], w[52], offset); w[52] = amd_bytealign_S (w[50], w[51], offset); w[51] = amd_bytealign_S (w[49], w[50], offset); w[50] = amd_bytealign_S (w[48], w[49], offset); w[49] = amd_bytealign_S (w[47], w[48], offset); w[48] = amd_bytealign_S (w[46], w[47], offset); w[47] = amd_bytealign_S (w[45], w[46], offset); w[46] = amd_bytealign_S (w[44], w[45], offset); w[45] = amd_bytealign_S (w[43], w[44], offset); w[44] = amd_bytealign_S (w[42], w[43], offset); w[43] = amd_bytealign_S (w[41], w[42], offset); w[42] = amd_bytealign_S (w[40], w[41], offset); w[41] = amd_bytealign_S (w[39], w[40], offset); w[40] = amd_bytealign_S (w[38], w[39], offset); w[39] = amd_bytealign_S (w[37], w[38], offset); w[38] = amd_bytealign_S (w[36], w[37], offset); w[37] = amd_bytealign_S (w[35], w[36], offset); w[36] = amd_bytealign_S (w[34], w[35], offset); w[35] = amd_bytealign_S (w[33], w[34], offset); w[34] = amd_bytealign_S (w[32], w[33], offset); w[33] = amd_bytealign_S (w[31], w[32], offset); w[32] = amd_bytealign_S (w[30], w[31], offset); w[31] = amd_bytealign_S (w[29], w[30], offset); w[30] = amd_bytealign_S (w[28], w[29], offset); w[29] = amd_bytealign_S (w[27], w[28], offset); w[28] = amd_bytealign_S (w[26], w[27], offset); w[27] = amd_bytealign_S (w[25], w[26], offset); w[26] = amd_bytealign_S (w[24], w[25], offset); w[25] = amd_bytealign_S (w[23], w[24], offset); w[24] = amd_bytealign_S (w[22], w[23], offset); w[23] = amd_bytealign_S (w[21], w[22], offset); w[22] = amd_bytealign_S (w[20], w[21], offset); w[21] = amd_bytealign_S (w[19], w[20], offset); w[20] = amd_bytealign_S (w[18], w[19], offset); w[19] = amd_bytealign_S (w[17], w[18], offset); w[18] = amd_bytealign_S (w[16], w[17], offset); w[17] = amd_bytealign_S (w[15], w[16], offset); w[16] = amd_bytealign_S (w[14], w[15], offset); w[15] = amd_bytealign_S (w[13], w[14], offset); w[14] = amd_bytealign_S (w[12], w[13], offset); w[13] = amd_bytealign_S (w[11], w[12], offset); w[12] = amd_bytealign_S (w[10], w[11], offset); w[11] = amd_bytealign_S (w[ 9], w[10], offset); w[10] = amd_bytealign_S (w[ 8], w[ 9], offset); w[ 9] = amd_bytealign_S (w[ 7], w[ 8], offset); w[ 8] = amd_bytealign_S (w[ 6], w[ 7], offset); w[ 7] = amd_bytealign_S (w[ 5], w[ 6], offset); w[ 6] = amd_bytealign_S (w[ 4], w[ 5], offset); w[ 5] = amd_bytealign_S (w[ 3], w[ 4], offset); w[ 4] = amd_bytealign_S (w[ 2], w[ 3], offset); w[ 3] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 2] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 1] = amd_bytealign_S ( 0, w[ 0], offset); w[ 0] = 0; break; case 2: w[63] = amd_bytealign_S (w[60], w[61], offset); w[62] = amd_bytealign_S (w[59], w[60], offset); w[61] = amd_bytealign_S (w[58], w[59], offset); w[60] = amd_bytealign_S (w[57], w[58], offset); w[59] = amd_bytealign_S (w[56], w[57], offset); w[58] = amd_bytealign_S (w[55], w[56], offset); w[57] = amd_bytealign_S (w[54], w[55], offset); w[56] = amd_bytealign_S (w[53], w[54], offset); w[55] = amd_bytealign_S (w[52], w[53], offset); w[54] = amd_bytealign_S (w[51], w[52], offset); w[53] = amd_bytealign_S (w[50], w[51], offset); w[52] = amd_bytealign_S (w[49], w[50], offset); w[51] = amd_bytealign_S (w[48], w[49], offset); w[50] = amd_bytealign_S (w[47], w[48], offset); w[49] = amd_bytealign_S (w[46], w[47], offset); w[48] = amd_bytealign_S (w[45], w[46], offset); w[47] = amd_bytealign_S (w[44], w[45], offset); w[46] = amd_bytealign_S (w[43], w[44], offset); w[45] = amd_bytealign_S (w[42], w[43], offset); w[44] = amd_bytealign_S (w[41], w[42], offset); w[43] = amd_bytealign_S (w[40], w[41], offset); w[42] = amd_bytealign_S (w[39], w[40], offset); w[41] = amd_bytealign_S (w[38], w[39], offset); w[40] = amd_bytealign_S (w[37], w[38], offset); w[39] = amd_bytealign_S (w[36], w[37], offset); w[38] = amd_bytealign_S (w[35], w[36], offset); w[37] = amd_bytealign_S (w[34], w[35], offset); w[36] = amd_bytealign_S (w[33], w[34], offset); w[35] = amd_bytealign_S (w[32], w[33], offset); w[34] = amd_bytealign_S (w[31], w[32], offset); w[33] = amd_bytealign_S (w[30], w[31], offset); w[32] = amd_bytealign_S (w[29], w[30], offset); w[31] = amd_bytealign_S (w[28], w[29], offset); w[30] = amd_bytealign_S (w[27], w[28], offset); w[29] = amd_bytealign_S (w[26], w[27], offset); w[28] = amd_bytealign_S (w[25], w[26], offset); w[27] = amd_bytealign_S (w[24], w[25], offset); w[26] = amd_bytealign_S (w[23], w[24], offset); w[25] = amd_bytealign_S (w[22], w[23], offset); w[24] = amd_bytealign_S (w[21], w[22], offset); w[23] = amd_bytealign_S (w[20], w[21], offset); w[22] = amd_bytealign_S (w[19], w[20], offset); w[21] = amd_bytealign_S (w[18], w[19], offset); w[20] = amd_bytealign_S (w[17], w[18], offset); w[19] = amd_bytealign_S (w[16], w[17], offset); w[18] = amd_bytealign_S (w[15], w[16], offset); w[17] = amd_bytealign_S (w[14], w[15], offset); w[16] = amd_bytealign_S (w[13], w[14], offset); w[15] = amd_bytealign_S (w[12], w[13], offset); w[14] = amd_bytealign_S (w[11], w[12], offset); w[13] = amd_bytealign_S (w[10], w[11], offset); w[12] = amd_bytealign_S (w[ 9], w[10], offset); w[11] = amd_bytealign_S (w[ 8], w[ 9], offset); w[10] = amd_bytealign_S (w[ 7], w[ 8], offset); w[ 9] = amd_bytealign_S (w[ 6], w[ 7], offset); w[ 8] = amd_bytealign_S (w[ 5], w[ 6], offset); w[ 7] = amd_bytealign_S (w[ 4], w[ 5], offset); w[ 6] = amd_bytealign_S (w[ 3], w[ 4], offset); w[ 5] = amd_bytealign_S (w[ 2], w[ 3], offset); w[ 4] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 3] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 2] = amd_bytealign_S ( 0, w[ 0], offset); w[ 1] = 0; w[ 0] = 0; break; case 3: w[63] = amd_bytealign_S (w[59], w[60], offset); w[62] = amd_bytealign_S (w[58], w[59], offset); w[61] = amd_bytealign_S (w[57], w[58], offset); w[60] = amd_bytealign_S (w[56], w[57], offset); w[59] = amd_bytealign_S (w[55], w[56], offset); w[58] = amd_bytealign_S (w[54], w[55], offset); w[57] = amd_bytealign_S (w[53], w[54], offset); w[56] = amd_bytealign_S (w[52], w[53], offset); w[55] = amd_bytealign_S (w[51], w[52], offset); w[54] = amd_bytealign_S (w[50], w[51], offset); w[53] = amd_bytealign_S (w[49], w[50], offset); w[52] = amd_bytealign_S (w[48], w[49], offset); w[51] = amd_bytealign_S (w[47], w[48], offset); w[50] = amd_bytealign_S (w[46], w[47], offset); w[49] = amd_bytealign_S (w[45], w[46], offset); w[48] = amd_bytealign_S (w[44], w[45], offset); w[47] = amd_bytealign_S (w[43], w[44], offset); w[46] = amd_bytealign_S (w[42], w[43], offset); w[45] = amd_bytealign_S (w[41], w[42], offset); w[44] = amd_bytealign_S (w[40], w[41], offset); w[43] = amd_bytealign_S (w[39], w[40], offset); w[42] = amd_bytealign_S (w[38], w[39], offset); w[41] = amd_bytealign_S (w[37], w[38], offset); w[40] = amd_bytealign_S (w[36], w[37], offset); w[39] = amd_bytealign_S (w[35], w[36], offset); w[38] = amd_bytealign_S (w[34], w[35], offset); w[37] = amd_bytealign_S (w[33], w[34], offset); w[36] = amd_bytealign_S (w[32], w[33], offset); w[35] = amd_bytealign_S (w[31], w[32], offset); w[34] = amd_bytealign_S (w[30], w[31], offset); w[33] = amd_bytealign_S (w[29], w[30], offset); w[32] = amd_bytealign_S (w[28], w[29], offset); w[31] = amd_bytealign_S (w[27], w[28], offset); w[30] = amd_bytealign_S (w[26], w[27], offset); w[29] = amd_bytealign_S (w[25], w[26], offset); w[28] = amd_bytealign_S (w[24], w[25], offset); w[27] = amd_bytealign_S (w[23], w[24], offset); w[26] = amd_bytealign_S (w[22], w[23], offset); w[25] = amd_bytealign_S (w[21], w[22], offset); w[24] = amd_bytealign_S (w[20], w[21], offset); w[23] = amd_bytealign_S (w[19], w[20], offset); w[22] = amd_bytealign_S (w[18], w[19], offset); w[21] = amd_bytealign_S (w[17], w[18], offset); w[20] = amd_bytealign_S (w[16], w[17], offset); w[19] = amd_bytealign_S (w[15], w[16], offset); w[18] = amd_bytealign_S (w[14], w[15], offset); w[17] = amd_bytealign_S (w[13], w[14], offset); w[16] = amd_bytealign_S (w[12], w[13], offset); w[15] = amd_bytealign_S (w[11], w[12], offset); w[14] = amd_bytealign_S (w[10], w[11], offset); w[13] = amd_bytealign_S (w[ 9], w[10], offset); w[12] = amd_bytealign_S (w[ 8], w[ 9], offset); w[11] = amd_bytealign_S (w[ 7], w[ 8], offset); w[10] = amd_bytealign_S (w[ 6], w[ 7], offset); w[ 9] = amd_bytealign_S (w[ 5], w[ 6], offset); w[ 8] = amd_bytealign_S (w[ 4], w[ 5], offset); w[ 7] = amd_bytealign_S (w[ 3], w[ 4], offset); w[ 6] = amd_bytealign_S (w[ 2], w[ 3], offset); w[ 5] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 4] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 3] = amd_bytealign_S ( 0, w[ 0], offset); w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 4: w[63] = amd_bytealign_S (w[58], w[59], offset); w[62] = amd_bytealign_S (w[57], w[58], offset); w[61] = amd_bytealign_S (w[56], w[57], offset); w[60] = amd_bytealign_S (w[55], w[56], offset); w[59] = amd_bytealign_S (w[54], w[55], offset); w[58] = amd_bytealign_S (w[53], w[54], offset); w[57] = amd_bytealign_S (w[52], w[53], offset); w[56] = amd_bytealign_S (w[51], w[52], offset); w[55] = amd_bytealign_S (w[50], w[51], offset); w[54] = amd_bytealign_S (w[49], w[50], offset); w[53] = amd_bytealign_S (w[48], w[49], offset); w[52] = amd_bytealign_S (w[47], w[48], offset); w[51] = amd_bytealign_S (w[46], w[47], offset); w[50] = amd_bytealign_S (w[45], w[46], offset); w[49] = amd_bytealign_S (w[44], w[45], offset); w[48] = amd_bytealign_S (w[43], w[44], offset); w[47] = amd_bytealign_S (w[42], w[43], offset); w[46] = amd_bytealign_S (w[41], w[42], offset); w[45] = amd_bytealign_S (w[40], w[41], offset); w[44] = amd_bytealign_S (w[39], w[40], offset); w[43] = amd_bytealign_S (w[38], w[39], offset); w[42] = amd_bytealign_S (w[37], w[38], offset); w[41] = amd_bytealign_S (w[36], w[37], offset); w[40] = amd_bytealign_S (w[35], w[36], offset); w[39] = amd_bytealign_S (w[34], w[35], offset); w[38] = amd_bytealign_S (w[33], w[34], offset); w[37] = amd_bytealign_S (w[32], w[33], offset); w[36] = amd_bytealign_S (w[31], w[32], offset); w[35] = amd_bytealign_S (w[30], w[31], offset); w[34] = amd_bytealign_S (w[29], w[30], offset); w[33] = amd_bytealign_S (w[28], w[29], offset); w[32] = amd_bytealign_S (w[27], w[28], offset); w[31] = amd_bytealign_S (w[26], w[27], offset); w[30] = amd_bytealign_S (w[25], w[26], offset); w[29] = amd_bytealign_S (w[24], w[25], offset); w[28] = amd_bytealign_S (w[23], w[24], offset); w[27] = amd_bytealign_S (w[22], w[23], offset); w[26] = amd_bytealign_S (w[21], w[22], offset); w[25] = amd_bytealign_S (w[20], w[21], offset); w[24] = amd_bytealign_S (w[19], w[20], offset); w[23] = amd_bytealign_S (w[18], w[19], offset); w[22] = amd_bytealign_S (w[17], w[18], offset); w[21] = amd_bytealign_S (w[16], w[17], offset); w[20] = amd_bytealign_S (w[15], w[16], offset); w[19] = amd_bytealign_S (w[14], w[15], offset); w[18] = amd_bytealign_S (w[13], w[14], offset); w[17] = amd_bytealign_S (w[12], w[13], offset); w[16] = amd_bytealign_S (w[11], w[12], offset); w[15] = amd_bytealign_S (w[10], w[11], offset); w[14] = amd_bytealign_S (w[ 9], w[10], offset); w[13] = amd_bytealign_S (w[ 8], w[ 9], offset); w[12] = amd_bytealign_S (w[ 7], w[ 8], offset); w[11] = amd_bytealign_S (w[ 6], w[ 7], offset); w[10] = amd_bytealign_S (w[ 5], w[ 6], offset); w[ 9] = amd_bytealign_S (w[ 4], w[ 5], offset); w[ 8] = amd_bytealign_S (w[ 3], w[ 4], offset); w[ 7] = amd_bytealign_S (w[ 2], w[ 3], offset); w[ 6] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 5] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 4] = amd_bytealign_S ( 0, w[ 0], offset); w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 5: w[63] = amd_bytealign_S (w[57], w[58], offset); w[62] = amd_bytealign_S (w[56], w[57], offset); w[61] = amd_bytealign_S (w[55], w[56], offset); w[60] = amd_bytealign_S (w[54], w[55], offset); w[59] = amd_bytealign_S (w[53], w[54], offset); w[58] = amd_bytealign_S (w[52], w[53], offset); w[57] = amd_bytealign_S (w[51], w[52], offset); w[56] = amd_bytealign_S (w[50], w[51], offset); w[55] = amd_bytealign_S (w[49], w[50], offset); w[54] = amd_bytealign_S (w[48], w[49], offset); w[53] = amd_bytealign_S (w[47], w[48], offset); w[52] = amd_bytealign_S (w[46], w[47], offset); w[51] = amd_bytealign_S (w[45], w[46], offset); w[50] = amd_bytealign_S (w[44], w[45], offset); w[49] = amd_bytealign_S (w[43], w[44], offset); w[48] = amd_bytealign_S (w[42], w[43], offset); w[47] = amd_bytealign_S (w[41], w[42], offset); w[46] = amd_bytealign_S (w[40], w[41], offset); w[45] = amd_bytealign_S (w[39], w[40], offset); w[44] = amd_bytealign_S (w[38], w[39], offset); w[43] = amd_bytealign_S (w[37], w[38], offset); w[42] = amd_bytealign_S (w[36], w[37], offset); w[41] = amd_bytealign_S (w[35], w[36], offset); w[40] = amd_bytealign_S (w[34], w[35], offset); w[39] = amd_bytealign_S (w[33], w[34], offset); w[38] = amd_bytealign_S (w[32], w[33], offset); w[37] = amd_bytealign_S (w[31], w[32], offset); w[36] = amd_bytealign_S (w[30], w[31], offset); w[35] = amd_bytealign_S (w[29], w[30], offset); w[34] = amd_bytealign_S (w[28], w[29], offset); w[33] = amd_bytealign_S (w[27], w[28], offset); w[32] = amd_bytealign_S (w[26], w[27], offset); w[31] = amd_bytealign_S (w[25], w[26], offset); w[30] = amd_bytealign_S (w[24], w[25], offset); w[29] = amd_bytealign_S (w[23], w[24], offset); w[28] = amd_bytealign_S (w[22], w[23], offset); w[27] = amd_bytealign_S (w[21], w[22], offset); w[26] = amd_bytealign_S (w[20], w[21], offset); w[25] = amd_bytealign_S (w[19], w[20], offset); w[24] = amd_bytealign_S (w[18], w[19], offset); w[23] = amd_bytealign_S (w[17], w[18], offset); w[22] = amd_bytealign_S (w[16], w[17], offset); w[21] = amd_bytealign_S (w[15], w[16], offset); w[20] = amd_bytealign_S (w[14], w[15], offset); w[19] = amd_bytealign_S (w[13], w[14], offset); w[18] = amd_bytealign_S (w[12], w[13], offset); w[17] = amd_bytealign_S (w[11], w[12], offset); w[16] = amd_bytealign_S (w[10], w[11], offset); w[15] = amd_bytealign_S (w[ 9], w[10], offset); w[14] = amd_bytealign_S (w[ 8], w[ 9], offset); w[13] = amd_bytealign_S (w[ 7], w[ 8], offset); w[12] = amd_bytealign_S (w[ 6], w[ 7], offset); w[11] = amd_bytealign_S (w[ 5], w[ 6], offset); w[10] = amd_bytealign_S (w[ 4], w[ 5], offset); w[ 9] = amd_bytealign_S (w[ 3], w[ 4], offset); w[ 8] = amd_bytealign_S (w[ 2], w[ 3], offset); w[ 7] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 6] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 5] = amd_bytealign_S ( 0, w[ 0], offset); w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 6: w[63] = amd_bytealign_S (w[56], w[57], offset); w[62] = amd_bytealign_S (w[55], w[56], offset); w[61] = amd_bytealign_S (w[54], w[55], offset); w[60] = amd_bytealign_S (w[53], w[54], offset); w[59] = amd_bytealign_S (w[52], w[53], offset); w[58] = amd_bytealign_S (w[51], w[52], offset); w[57] = amd_bytealign_S (w[50], w[51], offset); w[56] = amd_bytealign_S (w[49], w[50], offset); w[55] = amd_bytealign_S (w[48], w[49], offset); w[54] = amd_bytealign_S (w[47], w[48], offset); w[53] = amd_bytealign_S (w[46], w[47], offset); w[52] = amd_bytealign_S (w[45], w[46], offset); w[51] = amd_bytealign_S (w[44], w[45], offset); w[50] = amd_bytealign_S (w[43], w[44], offset); w[49] = amd_bytealign_S (w[42], w[43], offset); w[48] = amd_bytealign_S (w[41], w[42], offset); w[47] = amd_bytealign_S (w[40], w[41], offset); w[46] = amd_bytealign_S (w[39], w[40], offset); w[45] = amd_bytealign_S (w[38], w[39], offset); w[44] = amd_bytealign_S (w[37], w[38], offset); w[43] = amd_bytealign_S (w[36], w[37], offset); w[42] = amd_bytealign_S (w[35], w[36], offset); w[41] = amd_bytealign_S (w[34], w[35], offset); w[40] = amd_bytealign_S (w[33], w[34], offset); w[39] = amd_bytealign_S (w[32], w[33], offset); w[38] = amd_bytealign_S (w[31], w[32], offset); w[37] = amd_bytealign_S (w[30], w[31], offset); w[36] = amd_bytealign_S (w[29], w[30], offset); w[35] = amd_bytealign_S (w[28], w[29], offset); w[34] = amd_bytealign_S (w[27], w[28], offset); w[33] = amd_bytealign_S (w[26], w[27], offset); w[32] = amd_bytealign_S (w[25], w[26], offset); w[31] = amd_bytealign_S (w[24], w[25], offset); w[30] = amd_bytealign_S (w[23], w[24], offset); w[29] = amd_bytealign_S (w[22], w[23], offset); w[28] = amd_bytealign_S (w[21], w[22], offset); w[27] = amd_bytealign_S (w[20], w[21], offset); w[26] = amd_bytealign_S (w[19], w[20], offset); w[25] = amd_bytealign_S (w[18], w[19], offset); w[24] = amd_bytealign_S (w[17], w[18], offset); w[23] = amd_bytealign_S (w[16], w[17], offset); w[22] = amd_bytealign_S (w[15], w[16], offset); w[21] = amd_bytealign_S (w[14], w[15], offset); w[20] = amd_bytealign_S (w[13], w[14], offset); w[19] = amd_bytealign_S (w[12], w[13], offset); w[18] = amd_bytealign_S (w[11], w[12], offset); w[17] = amd_bytealign_S (w[10], w[11], offset); w[16] = amd_bytealign_S (w[ 9], w[10], offset); w[15] = amd_bytealign_S (w[ 8], w[ 9], offset); w[14] = amd_bytealign_S (w[ 7], w[ 8], offset); w[13] = amd_bytealign_S (w[ 6], w[ 7], offset); w[12] = amd_bytealign_S (w[ 5], w[ 6], offset); w[11] = amd_bytealign_S (w[ 4], w[ 5], offset); w[10] = amd_bytealign_S (w[ 3], w[ 4], offset); w[ 9] = amd_bytealign_S (w[ 2], w[ 3], offset); w[ 8] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 7] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 6] = amd_bytealign_S ( 0, w[ 0], offset); w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 7: w[63] = amd_bytealign_S (w[55], w[56], offset); w[62] = amd_bytealign_S (w[54], w[55], offset); w[61] = amd_bytealign_S (w[53], w[54], offset); w[60] = amd_bytealign_S (w[52], w[53], offset); w[59] = amd_bytealign_S (w[51], w[52], offset); w[58] = amd_bytealign_S (w[50], w[51], offset); w[57] = amd_bytealign_S (w[49], w[50], offset); w[56] = amd_bytealign_S (w[48], w[49], offset); w[55] = amd_bytealign_S (w[47], w[48], offset); w[54] = amd_bytealign_S (w[46], w[47], offset); w[53] = amd_bytealign_S (w[45], w[46], offset); w[52] = amd_bytealign_S (w[44], w[45], offset); w[51] = amd_bytealign_S (w[43], w[44], offset); w[50] = amd_bytealign_S (w[42], w[43], offset); w[49] = amd_bytealign_S (w[41], w[42], offset); w[48] = amd_bytealign_S (w[40], w[41], offset); w[47] = amd_bytealign_S (w[39], w[40], offset); w[46] = amd_bytealign_S (w[38], w[39], offset); w[45] = amd_bytealign_S (w[37], w[38], offset); w[44] = amd_bytealign_S (w[36], w[37], offset); w[43] = amd_bytealign_S (w[35], w[36], offset); w[42] = amd_bytealign_S (w[34], w[35], offset); w[41] = amd_bytealign_S (w[33], w[34], offset); w[40] = amd_bytealign_S (w[32], w[33], offset); w[39] = amd_bytealign_S (w[31], w[32], offset); w[38] = amd_bytealign_S (w[30], w[31], offset); w[37] = amd_bytealign_S (w[29], w[30], offset); w[36] = amd_bytealign_S (w[28], w[29], offset); w[35] = amd_bytealign_S (w[27], w[28], offset); w[34] = amd_bytealign_S (w[26], w[27], offset); w[33] = amd_bytealign_S (w[25], w[26], offset); w[32] = amd_bytealign_S (w[24], w[25], offset); w[31] = amd_bytealign_S (w[23], w[24], offset); w[30] = amd_bytealign_S (w[22], w[23], offset); w[29] = amd_bytealign_S (w[21], w[22], offset); w[28] = amd_bytealign_S (w[20], w[21], offset); w[27] = amd_bytealign_S (w[19], w[20], offset); w[26] = amd_bytealign_S (w[18], w[19], offset); w[25] = amd_bytealign_S (w[17], w[18], offset); w[24] = amd_bytealign_S (w[16], w[17], offset); w[23] = amd_bytealign_S (w[15], w[16], offset); w[22] = amd_bytealign_S (w[14], w[15], offset); w[21] = amd_bytealign_S (w[13], w[14], offset); w[20] = amd_bytealign_S (w[12], w[13], offset); w[19] = amd_bytealign_S (w[11], w[12], offset); w[18] = amd_bytealign_S (w[10], w[11], offset); w[17] = amd_bytealign_S (w[ 9], w[10], offset); w[16] = amd_bytealign_S (w[ 8], w[ 9], offset); w[15] = amd_bytealign_S (w[ 7], w[ 8], offset); w[14] = amd_bytealign_S (w[ 6], w[ 7], offset); w[13] = amd_bytealign_S (w[ 5], w[ 6], offset); w[12] = amd_bytealign_S (w[ 4], w[ 5], offset); w[11] = amd_bytealign_S (w[ 3], w[ 4], offset); w[10] = amd_bytealign_S (w[ 2], w[ 3], offset); w[ 9] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 8] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 7] = amd_bytealign_S ( 0, w[ 0], offset); w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 8: w[63] = amd_bytealign_S (w[54], w[55], offset); w[62] = amd_bytealign_S (w[53], w[54], offset); w[61] = amd_bytealign_S (w[52], w[53], offset); w[60] = amd_bytealign_S (w[51], w[52], offset); w[59] = amd_bytealign_S (w[50], w[51], offset); w[58] = amd_bytealign_S (w[49], w[50], offset); w[57] = amd_bytealign_S (w[48], w[49], offset); w[56] = amd_bytealign_S (w[47], w[48], offset); w[55] = amd_bytealign_S (w[46], w[47], offset); w[54] = amd_bytealign_S (w[45], w[46], offset); w[53] = amd_bytealign_S (w[44], w[45], offset); w[52] = amd_bytealign_S (w[43], w[44], offset); w[51] = amd_bytealign_S (w[42], w[43], offset); w[50] = amd_bytealign_S (w[41], w[42], offset); w[49] = amd_bytealign_S (w[40], w[41], offset); w[48] = amd_bytealign_S (w[39], w[40], offset); w[47] = amd_bytealign_S (w[38], w[39], offset); w[46] = amd_bytealign_S (w[37], w[38], offset); w[45] = amd_bytealign_S (w[36], w[37], offset); w[44] = amd_bytealign_S (w[35], w[36], offset); w[43] = amd_bytealign_S (w[34], w[35], offset); w[42] = amd_bytealign_S (w[33], w[34], offset); w[41] = amd_bytealign_S (w[32], w[33], offset); w[40] = amd_bytealign_S (w[31], w[32], offset); w[39] = amd_bytealign_S (w[30], w[31], offset); w[38] = amd_bytealign_S (w[29], w[30], offset); w[37] = amd_bytealign_S (w[28], w[29], offset); w[36] = amd_bytealign_S (w[27], w[28], offset); w[35] = amd_bytealign_S (w[26], w[27], offset); w[34] = amd_bytealign_S (w[25], w[26], offset); w[33] = amd_bytealign_S (w[24], w[25], offset); w[32] = amd_bytealign_S (w[23], w[24], offset); w[31] = amd_bytealign_S (w[22], w[23], offset); w[30] = amd_bytealign_S (w[21], w[22], offset); w[29] = amd_bytealign_S (w[20], w[21], offset); w[28] = amd_bytealign_S (w[19], w[20], offset); w[27] = amd_bytealign_S (w[18], w[19], offset); w[26] = amd_bytealign_S (w[17], w[18], offset); w[25] = amd_bytealign_S (w[16], w[17], offset); w[24] = amd_bytealign_S (w[15], w[16], offset); w[23] = amd_bytealign_S (w[14], w[15], offset); w[22] = amd_bytealign_S (w[13], w[14], offset); w[21] = amd_bytealign_S (w[12], w[13], offset); w[20] = amd_bytealign_S (w[11], w[12], offset); w[19] = amd_bytealign_S (w[10], w[11], offset); w[18] = amd_bytealign_S (w[ 9], w[10], offset); w[17] = amd_bytealign_S (w[ 8], w[ 9], offset); w[16] = amd_bytealign_S (w[ 7], w[ 8], offset); w[15] = amd_bytealign_S (w[ 6], w[ 7], offset); w[14] = amd_bytealign_S (w[ 5], w[ 6], offset); w[13] = amd_bytealign_S (w[ 4], w[ 5], offset); w[12] = amd_bytealign_S (w[ 3], w[ 4], offset); w[11] = amd_bytealign_S (w[ 2], w[ 3], offset); w[10] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 9] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 8] = amd_bytealign_S ( 0, w[ 0], offset); w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 9: w[63] = amd_bytealign_S (w[53], w[54], offset); w[62] = amd_bytealign_S (w[52], w[53], offset); w[61] = amd_bytealign_S (w[51], w[52], offset); w[60] = amd_bytealign_S (w[50], w[51], offset); w[59] = amd_bytealign_S (w[49], w[50], offset); w[58] = amd_bytealign_S (w[48], w[49], offset); w[57] = amd_bytealign_S (w[47], w[48], offset); w[56] = amd_bytealign_S (w[46], w[47], offset); w[55] = amd_bytealign_S (w[45], w[46], offset); w[54] = amd_bytealign_S (w[44], w[45], offset); w[53] = amd_bytealign_S (w[43], w[44], offset); w[52] = amd_bytealign_S (w[42], w[43], offset); w[51] = amd_bytealign_S (w[41], w[42], offset); w[50] = amd_bytealign_S (w[40], w[41], offset); w[49] = amd_bytealign_S (w[39], w[40], offset); w[48] = amd_bytealign_S (w[38], w[39], offset); w[47] = amd_bytealign_S (w[37], w[38], offset); w[46] = amd_bytealign_S (w[36], w[37], offset); w[45] = amd_bytealign_S (w[35], w[36], offset); w[44] = amd_bytealign_S (w[34], w[35], offset); w[43] = amd_bytealign_S (w[33], w[34], offset); w[42] = amd_bytealign_S (w[32], w[33], offset); w[41] = amd_bytealign_S (w[31], w[32], offset); w[40] = amd_bytealign_S (w[30], w[31], offset); w[39] = amd_bytealign_S (w[29], w[30], offset); w[38] = amd_bytealign_S (w[28], w[29], offset); w[37] = amd_bytealign_S (w[27], w[28], offset); w[36] = amd_bytealign_S (w[26], w[27], offset); w[35] = amd_bytealign_S (w[25], w[26], offset); w[34] = amd_bytealign_S (w[24], w[25], offset); w[33] = amd_bytealign_S (w[23], w[24], offset); w[32] = amd_bytealign_S (w[22], w[23], offset); w[31] = amd_bytealign_S (w[21], w[22], offset); w[30] = amd_bytealign_S (w[20], w[21], offset); w[29] = amd_bytealign_S (w[19], w[20], offset); w[28] = amd_bytealign_S (w[18], w[19], offset); w[27] = amd_bytealign_S (w[17], w[18], offset); w[26] = amd_bytealign_S (w[16], w[17], offset); w[25] = amd_bytealign_S (w[15], w[16], offset); w[24] = amd_bytealign_S (w[14], w[15], offset); w[23] = amd_bytealign_S (w[13], w[14], offset); w[22] = amd_bytealign_S (w[12], w[13], offset); w[21] = amd_bytealign_S (w[11], w[12], offset); w[20] = amd_bytealign_S (w[10], w[11], offset); w[19] = amd_bytealign_S (w[ 9], w[10], offset); w[18] = amd_bytealign_S (w[ 8], w[ 9], offset); w[17] = amd_bytealign_S (w[ 7], w[ 8], offset); w[16] = amd_bytealign_S (w[ 6], w[ 7], offset); w[15] = amd_bytealign_S (w[ 5], w[ 6], offset); w[14] = amd_bytealign_S (w[ 4], w[ 5], offset); w[13] = amd_bytealign_S (w[ 3], w[ 4], offset); w[12] = amd_bytealign_S (w[ 2], w[ 3], offset); w[11] = amd_bytealign_S (w[ 1], w[ 2], offset); w[10] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 9] = amd_bytealign_S ( 0, w[ 0], offset); w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 10: w[63] = amd_bytealign_S (w[52], w[53], offset); w[62] = amd_bytealign_S (w[51], w[52], offset); w[61] = amd_bytealign_S (w[50], w[51], offset); w[60] = amd_bytealign_S (w[49], w[50], offset); w[59] = amd_bytealign_S (w[48], w[49], offset); w[58] = amd_bytealign_S (w[47], w[48], offset); w[57] = amd_bytealign_S (w[46], w[47], offset); w[56] = amd_bytealign_S (w[45], w[46], offset); w[55] = amd_bytealign_S (w[44], w[45], offset); w[54] = amd_bytealign_S (w[43], w[44], offset); w[53] = amd_bytealign_S (w[42], w[43], offset); w[52] = amd_bytealign_S (w[41], w[42], offset); w[51] = amd_bytealign_S (w[40], w[41], offset); w[50] = amd_bytealign_S (w[39], w[40], offset); w[49] = amd_bytealign_S (w[38], w[39], offset); w[48] = amd_bytealign_S (w[37], w[38], offset); w[47] = amd_bytealign_S (w[36], w[37], offset); w[46] = amd_bytealign_S (w[35], w[36], offset); w[45] = amd_bytealign_S (w[34], w[35], offset); w[44] = amd_bytealign_S (w[33], w[34], offset); w[43] = amd_bytealign_S (w[32], w[33], offset); w[42] = amd_bytealign_S (w[31], w[32], offset); w[41] = amd_bytealign_S (w[30], w[31], offset); w[40] = amd_bytealign_S (w[29], w[30], offset); w[39] = amd_bytealign_S (w[28], w[29], offset); w[38] = amd_bytealign_S (w[27], w[28], offset); w[37] = amd_bytealign_S (w[26], w[27], offset); w[36] = amd_bytealign_S (w[25], w[26], offset); w[35] = amd_bytealign_S (w[24], w[25], offset); w[34] = amd_bytealign_S (w[23], w[24], offset); w[33] = amd_bytealign_S (w[22], w[23], offset); w[32] = amd_bytealign_S (w[21], w[22], offset); w[31] = amd_bytealign_S (w[20], w[21], offset); w[30] = amd_bytealign_S (w[19], w[20], offset); w[29] = amd_bytealign_S (w[18], w[19], offset); w[28] = amd_bytealign_S (w[17], w[18], offset); w[27] = amd_bytealign_S (w[16], w[17], offset); w[26] = amd_bytealign_S (w[15], w[16], offset); w[25] = amd_bytealign_S (w[14], w[15], offset); w[24] = amd_bytealign_S (w[13], w[14], offset); w[23] = amd_bytealign_S (w[12], w[13], offset); w[22] = amd_bytealign_S (w[11], w[12], offset); w[21] = amd_bytealign_S (w[10], w[11], offset); w[20] = amd_bytealign_S (w[ 9], w[10], offset); w[19] = amd_bytealign_S (w[ 8], w[ 9], offset); w[18] = amd_bytealign_S (w[ 7], w[ 8], offset); w[17] = amd_bytealign_S (w[ 6], w[ 7], offset); w[16] = amd_bytealign_S (w[ 5], w[ 6], offset); w[15] = amd_bytealign_S (w[ 4], w[ 5], offset); w[14] = amd_bytealign_S (w[ 3], w[ 4], offset); w[13] = amd_bytealign_S (w[ 2], w[ 3], offset); w[12] = amd_bytealign_S (w[ 1], w[ 2], offset); w[11] = amd_bytealign_S (w[ 0], w[ 1], offset); w[10] = amd_bytealign_S ( 0, w[ 0], offset); w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 11: w[63] = amd_bytealign_S (w[51], w[52], offset); w[62] = amd_bytealign_S (w[50], w[51], offset); w[61] = amd_bytealign_S (w[49], w[50], offset); w[60] = amd_bytealign_S (w[48], w[49], offset); w[59] = amd_bytealign_S (w[47], w[48], offset); w[58] = amd_bytealign_S (w[46], w[47], offset); w[57] = amd_bytealign_S (w[45], w[46], offset); w[56] = amd_bytealign_S (w[44], w[45], offset); w[55] = amd_bytealign_S (w[43], w[44], offset); w[54] = amd_bytealign_S (w[42], w[43], offset); w[53] = amd_bytealign_S (w[41], w[42], offset); w[52] = amd_bytealign_S (w[40], w[41], offset); w[51] = amd_bytealign_S (w[39], w[40], offset); w[50] = amd_bytealign_S (w[38], w[39], offset); w[49] = amd_bytealign_S (w[37], w[38], offset); w[48] = amd_bytealign_S (w[36], w[37], offset); w[47] = amd_bytealign_S (w[35], w[36], offset); w[46] = amd_bytealign_S (w[34], w[35], offset); w[45] = amd_bytealign_S (w[33], w[34], offset); w[44] = amd_bytealign_S (w[32], w[33], offset); w[43] = amd_bytealign_S (w[31], w[32], offset); w[42] = amd_bytealign_S (w[30], w[31], offset); w[41] = amd_bytealign_S (w[29], w[30], offset); w[40] = amd_bytealign_S (w[28], w[29], offset); w[39] = amd_bytealign_S (w[27], w[28], offset); w[38] = amd_bytealign_S (w[26], w[27], offset); w[37] = amd_bytealign_S (w[25], w[26], offset); w[36] = amd_bytealign_S (w[24], w[25], offset); w[35] = amd_bytealign_S (w[23], w[24], offset); w[34] = amd_bytealign_S (w[22], w[23], offset); w[33] = amd_bytealign_S (w[21], w[22], offset); w[32] = amd_bytealign_S (w[20], w[21], offset); w[31] = amd_bytealign_S (w[19], w[20], offset); w[30] = amd_bytealign_S (w[18], w[19], offset); w[29] = amd_bytealign_S (w[17], w[18], offset); w[28] = amd_bytealign_S (w[16], w[17], offset); w[27] = amd_bytealign_S (w[15], w[16], offset); w[26] = amd_bytealign_S (w[14], w[15], offset); w[25] = amd_bytealign_S (w[13], w[14], offset); w[24] = amd_bytealign_S (w[12], w[13], offset); w[23] = amd_bytealign_S (w[11], w[12], offset); w[22] = amd_bytealign_S (w[10], w[11], offset); w[21] = amd_bytealign_S (w[ 9], w[10], offset); w[20] = amd_bytealign_S (w[ 8], w[ 9], offset); w[19] = amd_bytealign_S (w[ 7], w[ 8], offset); w[18] = amd_bytealign_S (w[ 6], w[ 7], offset); w[17] = amd_bytealign_S (w[ 5], w[ 6], offset); w[16] = amd_bytealign_S (w[ 4], w[ 5], offset); w[15] = amd_bytealign_S (w[ 3], w[ 4], offset); w[14] = amd_bytealign_S (w[ 2], w[ 3], offset); w[13] = amd_bytealign_S (w[ 1], w[ 2], offset); w[12] = amd_bytealign_S (w[ 0], w[ 1], offset); w[11] = amd_bytealign_S ( 0, w[ 0], offset); w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 12: w[63] = amd_bytealign_S (w[50], w[51], offset); w[62] = amd_bytealign_S (w[49], w[50], offset); w[61] = amd_bytealign_S (w[48], w[49], offset); w[60] = amd_bytealign_S (w[47], w[48], offset); w[59] = amd_bytealign_S (w[46], w[47], offset); w[58] = amd_bytealign_S (w[45], w[46], offset); w[57] = amd_bytealign_S (w[44], w[45], offset); w[56] = amd_bytealign_S (w[43], w[44], offset); w[55] = amd_bytealign_S (w[42], w[43], offset); w[54] = amd_bytealign_S (w[41], w[42], offset); w[53] = amd_bytealign_S (w[40], w[41], offset); w[52] = amd_bytealign_S (w[39], w[40], offset); w[51] = amd_bytealign_S (w[38], w[39], offset); w[50] = amd_bytealign_S (w[37], w[38], offset); w[49] = amd_bytealign_S (w[36], w[37], offset); w[48] = amd_bytealign_S (w[35], w[36], offset); w[47] = amd_bytealign_S (w[34], w[35], offset); w[46] = amd_bytealign_S (w[33], w[34], offset); w[45] = amd_bytealign_S (w[32], w[33], offset); w[44] = amd_bytealign_S (w[31], w[32], offset); w[43] = amd_bytealign_S (w[30], w[31], offset); w[42] = amd_bytealign_S (w[29], w[30], offset); w[41] = amd_bytealign_S (w[28], w[29], offset); w[40] = amd_bytealign_S (w[27], w[28], offset); w[39] = amd_bytealign_S (w[26], w[27], offset); w[38] = amd_bytealign_S (w[25], w[26], offset); w[37] = amd_bytealign_S (w[24], w[25], offset); w[36] = amd_bytealign_S (w[23], w[24], offset); w[35] = amd_bytealign_S (w[22], w[23], offset); w[34] = amd_bytealign_S (w[21], w[22], offset); w[33] = amd_bytealign_S (w[20], w[21], offset); w[32] = amd_bytealign_S (w[19], w[20], offset); w[31] = amd_bytealign_S (w[18], w[19], offset); w[30] = amd_bytealign_S (w[17], w[18], offset); w[29] = amd_bytealign_S (w[16], w[17], offset); w[28] = amd_bytealign_S (w[15], w[16], offset); w[27] = amd_bytealign_S (w[14], w[15], offset); w[26] = amd_bytealign_S (w[13], w[14], offset); w[25] = amd_bytealign_S (w[12], w[13], offset); w[24] = amd_bytealign_S (w[11], w[12], offset); w[23] = amd_bytealign_S (w[10], w[11], offset); w[22] = amd_bytealign_S (w[ 9], w[10], offset); w[21] = amd_bytealign_S (w[ 8], w[ 9], offset); w[20] = amd_bytealign_S (w[ 7], w[ 8], offset); w[19] = amd_bytealign_S (w[ 6], w[ 7], offset); w[18] = amd_bytealign_S (w[ 5], w[ 6], offset); w[17] = amd_bytealign_S (w[ 4], w[ 5], offset); w[16] = amd_bytealign_S (w[ 3], w[ 4], offset); w[15] = amd_bytealign_S (w[ 2], w[ 3], offset); w[14] = amd_bytealign_S (w[ 1], w[ 2], offset); w[13] = amd_bytealign_S (w[ 0], w[ 1], offset); w[12] = amd_bytealign_S ( 0, w[ 0], offset); w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 13: w[63] = amd_bytealign_S (w[49], w[50], offset); w[62] = amd_bytealign_S (w[48], w[49], offset); w[61] = amd_bytealign_S (w[47], w[48], offset); w[60] = amd_bytealign_S (w[46], w[47], offset); w[59] = amd_bytealign_S (w[45], w[46], offset); w[58] = amd_bytealign_S (w[44], w[45], offset); w[57] = amd_bytealign_S (w[43], w[44], offset); w[56] = amd_bytealign_S (w[42], w[43], offset); w[55] = amd_bytealign_S (w[41], w[42], offset); w[54] = amd_bytealign_S (w[40], w[41], offset); w[53] = amd_bytealign_S (w[39], w[40], offset); w[52] = amd_bytealign_S (w[38], w[39], offset); w[51] = amd_bytealign_S (w[37], w[38], offset); w[50] = amd_bytealign_S (w[36], w[37], offset); w[49] = amd_bytealign_S (w[35], w[36], offset); w[48] = amd_bytealign_S (w[34], w[35], offset); w[47] = amd_bytealign_S (w[33], w[34], offset); w[46] = amd_bytealign_S (w[32], w[33], offset); w[45] = amd_bytealign_S (w[31], w[32], offset); w[44] = amd_bytealign_S (w[30], w[31], offset); w[43] = amd_bytealign_S (w[29], w[30], offset); w[42] = amd_bytealign_S (w[28], w[29], offset); w[41] = amd_bytealign_S (w[27], w[28], offset); w[40] = amd_bytealign_S (w[26], w[27], offset); w[39] = amd_bytealign_S (w[25], w[26], offset); w[38] = amd_bytealign_S (w[24], w[25], offset); w[37] = amd_bytealign_S (w[23], w[24], offset); w[36] = amd_bytealign_S (w[22], w[23], offset); w[35] = amd_bytealign_S (w[21], w[22], offset); w[34] = amd_bytealign_S (w[20], w[21], offset); w[33] = amd_bytealign_S (w[19], w[20], offset); w[32] = amd_bytealign_S (w[18], w[19], offset); w[31] = amd_bytealign_S (w[17], w[18], offset); w[30] = amd_bytealign_S (w[16], w[17], offset); w[29] = amd_bytealign_S (w[15], w[16], offset); w[28] = amd_bytealign_S (w[14], w[15], offset); w[27] = amd_bytealign_S (w[13], w[14], offset); w[26] = amd_bytealign_S (w[12], w[13], offset); w[25] = amd_bytealign_S (w[11], w[12], offset); w[24] = amd_bytealign_S (w[10], w[11], offset); w[23] = amd_bytealign_S (w[ 9], w[10], offset); w[22] = amd_bytealign_S (w[ 8], w[ 9], offset); w[21] = amd_bytealign_S (w[ 7], w[ 8], offset); w[20] = amd_bytealign_S (w[ 6], w[ 7], offset); w[19] = amd_bytealign_S (w[ 5], w[ 6], offset); w[18] = amd_bytealign_S (w[ 4], w[ 5], offset); w[17] = amd_bytealign_S (w[ 3], w[ 4], offset); w[16] = amd_bytealign_S (w[ 2], w[ 3], offset); w[15] = amd_bytealign_S (w[ 1], w[ 2], offset); w[14] = amd_bytealign_S (w[ 0], w[ 1], offset); w[13] = amd_bytealign_S ( 0, w[ 0], offset); w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 14: w[63] = amd_bytealign_S (w[48], w[49], offset); w[62] = amd_bytealign_S (w[47], w[48], offset); w[61] = amd_bytealign_S (w[46], w[47], offset); w[60] = amd_bytealign_S (w[45], w[46], offset); w[59] = amd_bytealign_S (w[44], w[45], offset); w[58] = amd_bytealign_S (w[43], w[44], offset); w[57] = amd_bytealign_S (w[42], w[43], offset); w[56] = amd_bytealign_S (w[41], w[42], offset); w[55] = amd_bytealign_S (w[40], w[41], offset); w[54] = amd_bytealign_S (w[39], w[40], offset); w[53] = amd_bytealign_S (w[38], w[39], offset); w[52] = amd_bytealign_S (w[37], w[38], offset); w[51] = amd_bytealign_S (w[36], w[37], offset); w[50] = amd_bytealign_S (w[35], w[36], offset); w[49] = amd_bytealign_S (w[34], w[35], offset); w[48] = amd_bytealign_S (w[33], w[34], offset); w[47] = amd_bytealign_S (w[32], w[33], offset); w[46] = amd_bytealign_S (w[31], w[32], offset); w[45] = amd_bytealign_S (w[30], w[31], offset); w[44] = amd_bytealign_S (w[29], w[30], offset); w[43] = amd_bytealign_S (w[28], w[29], offset); w[42] = amd_bytealign_S (w[27], w[28], offset); w[41] = amd_bytealign_S (w[26], w[27], offset); w[40] = amd_bytealign_S (w[25], w[26], offset); w[39] = amd_bytealign_S (w[24], w[25], offset); w[38] = amd_bytealign_S (w[23], w[24], offset); w[37] = amd_bytealign_S (w[22], w[23], offset); w[36] = amd_bytealign_S (w[21], w[22], offset); w[35] = amd_bytealign_S (w[20], w[21], offset); w[34] = amd_bytealign_S (w[19], w[20], offset); w[33] = amd_bytealign_S (w[18], w[19], offset); w[32] = amd_bytealign_S (w[17], w[18], offset); w[31] = amd_bytealign_S (w[16], w[17], offset); w[30] = amd_bytealign_S (w[15], w[16], offset); w[29] = amd_bytealign_S (w[14], w[15], offset); w[28] = amd_bytealign_S (w[13], w[14], offset); w[27] = amd_bytealign_S (w[12], w[13], offset); w[26] = amd_bytealign_S (w[11], w[12], offset); w[25] = amd_bytealign_S (w[10], w[11], offset); w[24] = amd_bytealign_S (w[ 9], w[10], offset); w[23] = amd_bytealign_S (w[ 8], w[ 9], offset); w[22] = amd_bytealign_S (w[ 7], w[ 8], offset); w[21] = amd_bytealign_S (w[ 6], w[ 7], offset); w[20] = amd_bytealign_S (w[ 5], w[ 6], offset); w[19] = amd_bytealign_S (w[ 4], w[ 5], offset); w[18] = amd_bytealign_S (w[ 3], w[ 4], offset); w[17] = amd_bytealign_S (w[ 2], w[ 3], offset); w[16] = amd_bytealign_S (w[ 1], w[ 2], offset); w[15] = amd_bytealign_S (w[ 0], w[ 1], offset); w[14] = amd_bytealign_S ( 0, w[ 0], offset); w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 15: w[63] = amd_bytealign_S (w[47], w[48], offset); w[62] = amd_bytealign_S (w[46], w[47], offset); w[61] = amd_bytealign_S (w[45], w[46], offset); w[60] = amd_bytealign_S (w[44], w[45], offset); w[59] = amd_bytealign_S (w[43], w[44], offset); w[58] = amd_bytealign_S (w[42], w[43], offset); w[57] = amd_bytealign_S (w[41], w[42], offset); w[56] = amd_bytealign_S (w[40], w[41], offset); w[55] = amd_bytealign_S (w[39], w[40], offset); w[54] = amd_bytealign_S (w[38], w[39], offset); w[53] = amd_bytealign_S (w[37], w[38], offset); w[52] = amd_bytealign_S (w[36], w[37], offset); w[51] = amd_bytealign_S (w[35], w[36], offset); w[50] = amd_bytealign_S (w[34], w[35], offset); w[49] = amd_bytealign_S (w[33], w[34], offset); w[48] = amd_bytealign_S (w[32], w[33], offset); w[47] = amd_bytealign_S (w[31], w[32], offset); w[46] = amd_bytealign_S (w[30], w[31], offset); w[45] = amd_bytealign_S (w[29], w[30], offset); w[44] = amd_bytealign_S (w[28], w[29], offset); w[43] = amd_bytealign_S (w[27], w[28], offset); w[42] = amd_bytealign_S (w[26], w[27], offset); w[41] = amd_bytealign_S (w[25], w[26], offset); w[40] = amd_bytealign_S (w[24], w[25], offset); w[39] = amd_bytealign_S (w[23], w[24], offset); w[38] = amd_bytealign_S (w[22], w[23], offset); w[37] = amd_bytealign_S (w[21], w[22], offset); w[36] = amd_bytealign_S (w[20], w[21], offset); w[35] = amd_bytealign_S (w[19], w[20], offset); w[34] = amd_bytealign_S (w[18], w[19], offset); w[33] = amd_bytealign_S (w[17], w[18], offset); w[32] = amd_bytealign_S (w[16], w[17], offset); w[31] = amd_bytealign_S (w[15], w[16], offset); w[30] = amd_bytealign_S (w[14], w[15], offset); w[29] = amd_bytealign_S (w[13], w[14], offset); w[28] = amd_bytealign_S (w[12], w[13], offset); w[27] = amd_bytealign_S (w[11], w[12], offset); w[26] = amd_bytealign_S (w[10], w[11], offset); w[25] = amd_bytealign_S (w[ 9], w[10], offset); w[24] = amd_bytealign_S (w[ 8], w[ 9], offset); w[23] = amd_bytealign_S (w[ 7], w[ 8], offset); w[22] = amd_bytealign_S (w[ 6], w[ 7], offset); w[21] = amd_bytealign_S (w[ 5], w[ 6], offset); w[20] = amd_bytealign_S (w[ 4], w[ 5], offset); w[19] = amd_bytealign_S (w[ 3], w[ 4], offset); w[18] = amd_bytealign_S (w[ 2], w[ 3], offset); w[17] = amd_bytealign_S (w[ 1], w[ 2], offset); w[16] = amd_bytealign_S (w[ 0], w[ 1], offset); w[15] = amd_bytealign_S ( 0, w[ 0], offset); w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 16: w[63] = amd_bytealign_S (w[46], w[47], offset); w[62] = amd_bytealign_S (w[45], w[46], offset); w[61] = amd_bytealign_S (w[44], w[45], offset); w[60] = amd_bytealign_S (w[43], w[44], offset); w[59] = amd_bytealign_S (w[42], w[43], offset); w[58] = amd_bytealign_S (w[41], w[42], offset); w[57] = amd_bytealign_S (w[40], w[41], offset); w[56] = amd_bytealign_S (w[39], w[40], offset); w[55] = amd_bytealign_S (w[38], w[39], offset); w[54] = amd_bytealign_S (w[37], w[38], offset); w[53] = amd_bytealign_S (w[36], w[37], offset); w[52] = amd_bytealign_S (w[35], w[36], offset); w[51] = amd_bytealign_S (w[34], w[35], offset); w[50] = amd_bytealign_S (w[33], w[34], offset); w[49] = amd_bytealign_S (w[32], w[33], offset); w[48] = amd_bytealign_S (w[31], w[32], offset); w[47] = amd_bytealign_S (w[30], w[31], offset); w[46] = amd_bytealign_S (w[29], w[30], offset); w[45] = amd_bytealign_S (w[28], w[29], offset); w[44] = amd_bytealign_S (w[27], w[28], offset); w[43] = amd_bytealign_S (w[26], w[27], offset); w[42] = amd_bytealign_S (w[25], w[26], offset); w[41] = amd_bytealign_S (w[24], w[25], offset); w[40] = amd_bytealign_S (w[23], w[24], offset); w[39] = amd_bytealign_S (w[22], w[23], offset); w[38] = amd_bytealign_S (w[21], w[22], offset); w[37] = amd_bytealign_S (w[20], w[21], offset); w[36] = amd_bytealign_S (w[19], w[20], offset); w[35] = amd_bytealign_S (w[18], w[19], offset); w[34] = amd_bytealign_S (w[17], w[18], offset); w[33] = amd_bytealign_S (w[16], w[17], offset); w[32] = amd_bytealign_S (w[15], w[16], offset); w[31] = amd_bytealign_S (w[14], w[15], offset); w[30] = amd_bytealign_S (w[13], w[14], offset); w[29] = amd_bytealign_S (w[12], w[13], offset); w[28] = amd_bytealign_S (w[11], w[12], offset); w[27] = amd_bytealign_S (w[10], w[11], offset); w[26] = amd_bytealign_S (w[ 9], w[10], offset); w[25] = amd_bytealign_S (w[ 8], w[ 9], offset); w[24] = amd_bytealign_S (w[ 7], w[ 8], offset); w[23] = amd_bytealign_S (w[ 6], w[ 7], offset); w[22] = amd_bytealign_S (w[ 5], w[ 6], offset); w[21] = amd_bytealign_S (w[ 4], w[ 5], offset); w[20] = amd_bytealign_S (w[ 3], w[ 4], offset); w[19] = amd_bytealign_S (w[ 2], w[ 3], offset); w[18] = amd_bytealign_S (w[ 1], w[ 2], offset); w[17] = amd_bytealign_S (w[ 0], w[ 1], offset); w[16] = amd_bytealign_S ( 0, w[ 0], offset); w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 17: w[63] = amd_bytealign_S (w[45], w[46], offset); w[62] = amd_bytealign_S (w[44], w[45], offset); w[61] = amd_bytealign_S (w[43], w[44], offset); w[60] = amd_bytealign_S (w[42], w[43], offset); w[59] = amd_bytealign_S (w[41], w[42], offset); w[58] = amd_bytealign_S (w[40], w[41], offset); w[57] = amd_bytealign_S (w[39], w[40], offset); w[56] = amd_bytealign_S (w[38], w[39], offset); w[55] = amd_bytealign_S (w[37], w[38], offset); w[54] = amd_bytealign_S (w[36], w[37], offset); w[53] = amd_bytealign_S (w[35], w[36], offset); w[52] = amd_bytealign_S (w[34], w[35], offset); w[51] = amd_bytealign_S (w[33], w[34], offset); w[50] = amd_bytealign_S (w[32], w[33], offset); w[49] = amd_bytealign_S (w[31], w[32], offset); w[48] = amd_bytealign_S (w[30], w[31], offset); w[47] = amd_bytealign_S (w[29], w[30], offset); w[46] = amd_bytealign_S (w[28], w[29], offset); w[45] = amd_bytealign_S (w[27], w[28], offset); w[44] = amd_bytealign_S (w[26], w[27], offset); w[43] = amd_bytealign_S (w[25], w[26], offset); w[42] = amd_bytealign_S (w[24], w[25], offset); w[41] = amd_bytealign_S (w[23], w[24], offset); w[40] = amd_bytealign_S (w[22], w[23], offset); w[39] = amd_bytealign_S (w[21], w[22], offset); w[38] = amd_bytealign_S (w[20], w[21], offset); w[37] = amd_bytealign_S (w[19], w[20], offset); w[36] = amd_bytealign_S (w[18], w[19], offset); w[35] = amd_bytealign_S (w[17], w[18], offset); w[34] = amd_bytealign_S (w[16], w[17], offset); w[33] = amd_bytealign_S (w[15], w[16], offset); w[32] = amd_bytealign_S (w[14], w[15], offset); w[31] = amd_bytealign_S (w[13], w[14], offset); w[30] = amd_bytealign_S (w[12], w[13], offset); w[29] = amd_bytealign_S (w[11], w[12], offset); w[28] = amd_bytealign_S (w[10], w[11], offset); w[27] = amd_bytealign_S (w[ 9], w[10], offset); w[26] = amd_bytealign_S (w[ 8], w[ 9], offset); w[25] = amd_bytealign_S (w[ 7], w[ 8], offset); w[24] = amd_bytealign_S (w[ 6], w[ 7], offset); w[23] = amd_bytealign_S (w[ 5], w[ 6], offset); w[22] = amd_bytealign_S (w[ 4], w[ 5], offset); w[21] = amd_bytealign_S (w[ 3], w[ 4], offset); w[20] = amd_bytealign_S (w[ 2], w[ 3], offset); w[19] = amd_bytealign_S (w[ 1], w[ 2], offset); w[18] = amd_bytealign_S (w[ 0], w[ 1], offset); w[17] = amd_bytealign_S ( 0, w[ 0], offset); w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 18: w[63] = amd_bytealign_S (w[44], w[45], offset); w[62] = amd_bytealign_S (w[43], w[44], offset); w[61] = amd_bytealign_S (w[42], w[43], offset); w[60] = amd_bytealign_S (w[41], w[42], offset); w[59] = amd_bytealign_S (w[40], w[41], offset); w[58] = amd_bytealign_S (w[39], w[40], offset); w[57] = amd_bytealign_S (w[38], w[39], offset); w[56] = amd_bytealign_S (w[37], w[38], offset); w[55] = amd_bytealign_S (w[36], w[37], offset); w[54] = amd_bytealign_S (w[35], w[36], offset); w[53] = amd_bytealign_S (w[34], w[35], offset); w[52] = amd_bytealign_S (w[33], w[34], offset); w[51] = amd_bytealign_S (w[32], w[33], offset); w[50] = amd_bytealign_S (w[31], w[32], offset); w[49] = amd_bytealign_S (w[30], w[31], offset); w[48] = amd_bytealign_S (w[29], w[30], offset); w[47] = amd_bytealign_S (w[28], w[29], offset); w[46] = amd_bytealign_S (w[27], w[28], offset); w[45] = amd_bytealign_S (w[26], w[27], offset); w[44] = amd_bytealign_S (w[25], w[26], offset); w[43] = amd_bytealign_S (w[24], w[25], offset); w[42] = amd_bytealign_S (w[23], w[24], offset); w[41] = amd_bytealign_S (w[22], w[23], offset); w[40] = amd_bytealign_S (w[21], w[22], offset); w[39] = amd_bytealign_S (w[20], w[21], offset); w[38] = amd_bytealign_S (w[19], w[20], offset); w[37] = amd_bytealign_S (w[18], w[19], offset); w[36] = amd_bytealign_S (w[17], w[18], offset); w[35] = amd_bytealign_S (w[16], w[17], offset); w[34] = amd_bytealign_S (w[15], w[16], offset); w[33] = amd_bytealign_S (w[14], w[15], offset); w[32] = amd_bytealign_S (w[13], w[14], offset); w[31] = amd_bytealign_S (w[12], w[13], offset); w[30] = amd_bytealign_S (w[11], w[12], offset); w[29] = amd_bytealign_S (w[10], w[11], offset); w[28] = amd_bytealign_S (w[ 9], w[10], offset); w[27] = amd_bytealign_S (w[ 8], w[ 9], offset); w[26] = amd_bytealign_S (w[ 7], w[ 8], offset); w[25] = amd_bytealign_S (w[ 6], w[ 7], offset); w[24] = amd_bytealign_S (w[ 5], w[ 6], offset); w[23] = amd_bytealign_S (w[ 4], w[ 5], offset); w[22] = amd_bytealign_S (w[ 3], w[ 4], offset); w[21] = amd_bytealign_S (w[ 2], w[ 3], offset); w[20] = amd_bytealign_S (w[ 1], w[ 2], offset); w[19] = amd_bytealign_S (w[ 0], w[ 1], offset); w[18] = amd_bytealign_S ( 0, w[ 0], offset); w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 19: w[63] = amd_bytealign_S (w[43], w[44], offset); w[62] = amd_bytealign_S (w[42], w[43], offset); w[61] = amd_bytealign_S (w[41], w[42], offset); w[60] = amd_bytealign_S (w[40], w[41], offset); w[59] = amd_bytealign_S (w[39], w[40], offset); w[58] = amd_bytealign_S (w[38], w[39], offset); w[57] = amd_bytealign_S (w[37], w[38], offset); w[56] = amd_bytealign_S (w[36], w[37], offset); w[55] = amd_bytealign_S (w[35], w[36], offset); w[54] = amd_bytealign_S (w[34], w[35], offset); w[53] = amd_bytealign_S (w[33], w[34], offset); w[52] = amd_bytealign_S (w[32], w[33], offset); w[51] = amd_bytealign_S (w[31], w[32], offset); w[50] = amd_bytealign_S (w[30], w[31], offset); w[49] = amd_bytealign_S (w[29], w[30], offset); w[48] = amd_bytealign_S (w[28], w[29], offset); w[47] = amd_bytealign_S (w[27], w[28], offset); w[46] = amd_bytealign_S (w[26], w[27], offset); w[45] = amd_bytealign_S (w[25], w[26], offset); w[44] = amd_bytealign_S (w[24], w[25], offset); w[43] = amd_bytealign_S (w[23], w[24], offset); w[42] = amd_bytealign_S (w[22], w[23], offset); w[41] = amd_bytealign_S (w[21], w[22], offset); w[40] = amd_bytealign_S (w[20], w[21], offset); w[39] = amd_bytealign_S (w[19], w[20], offset); w[38] = amd_bytealign_S (w[18], w[19], offset); w[37] = amd_bytealign_S (w[17], w[18], offset); w[36] = amd_bytealign_S (w[16], w[17], offset); w[35] = amd_bytealign_S (w[15], w[16], offset); w[34] = amd_bytealign_S (w[14], w[15], offset); w[33] = amd_bytealign_S (w[13], w[14], offset); w[32] = amd_bytealign_S (w[12], w[13], offset); w[31] = amd_bytealign_S (w[11], w[12], offset); w[30] = amd_bytealign_S (w[10], w[11], offset); w[29] = amd_bytealign_S (w[ 9], w[10], offset); w[28] = amd_bytealign_S (w[ 8], w[ 9], offset); w[27] = amd_bytealign_S (w[ 7], w[ 8], offset); w[26] = amd_bytealign_S (w[ 6], w[ 7], offset); w[25] = amd_bytealign_S (w[ 5], w[ 6], offset); w[24] = amd_bytealign_S (w[ 4], w[ 5], offset); w[23] = amd_bytealign_S (w[ 3], w[ 4], offset); w[22] = amd_bytealign_S (w[ 2], w[ 3], offset); w[21] = amd_bytealign_S (w[ 1], w[ 2], offset); w[20] = amd_bytealign_S (w[ 0], w[ 1], offset); w[19] = amd_bytealign_S ( 0, w[ 0], offset); w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 20: w[63] = amd_bytealign_S (w[42], w[43], offset); w[62] = amd_bytealign_S (w[41], w[42], offset); w[61] = amd_bytealign_S (w[40], w[41], offset); w[60] = amd_bytealign_S (w[39], w[40], offset); w[59] = amd_bytealign_S (w[38], w[39], offset); w[58] = amd_bytealign_S (w[37], w[38], offset); w[57] = amd_bytealign_S (w[36], w[37], offset); w[56] = amd_bytealign_S (w[35], w[36], offset); w[55] = amd_bytealign_S (w[34], w[35], offset); w[54] = amd_bytealign_S (w[33], w[34], offset); w[53] = amd_bytealign_S (w[32], w[33], offset); w[52] = amd_bytealign_S (w[31], w[32], offset); w[51] = amd_bytealign_S (w[30], w[31], offset); w[50] = amd_bytealign_S (w[29], w[30], offset); w[49] = amd_bytealign_S (w[28], w[29], offset); w[48] = amd_bytealign_S (w[27], w[28], offset); w[47] = amd_bytealign_S (w[26], w[27], offset); w[46] = amd_bytealign_S (w[25], w[26], offset); w[45] = amd_bytealign_S (w[24], w[25], offset); w[44] = amd_bytealign_S (w[23], w[24], offset); w[43] = amd_bytealign_S (w[22], w[23], offset); w[42] = amd_bytealign_S (w[21], w[22], offset); w[41] = amd_bytealign_S (w[20], w[21], offset); w[40] = amd_bytealign_S (w[19], w[20], offset); w[39] = amd_bytealign_S (w[18], w[19], offset); w[38] = amd_bytealign_S (w[17], w[18], offset); w[37] = amd_bytealign_S (w[16], w[17], offset); w[36] = amd_bytealign_S (w[15], w[16], offset); w[35] = amd_bytealign_S (w[14], w[15], offset); w[34] = amd_bytealign_S (w[13], w[14], offset); w[33] = amd_bytealign_S (w[12], w[13], offset); w[32] = amd_bytealign_S (w[11], w[12], offset); w[31] = amd_bytealign_S (w[10], w[11], offset); w[30] = amd_bytealign_S (w[ 9], w[10], offset); w[29] = amd_bytealign_S (w[ 8], w[ 9], offset); w[28] = amd_bytealign_S (w[ 7], w[ 8], offset); w[27] = amd_bytealign_S (w[ 6], w[ 7], offset); w[26] = amd_bytealign_S (w[ 5], w[ 6], offset); w[25] = amd_bytealign_S (w[ 4], w[ 5], offset); w[24] = amd_bytealign_S (w[ 3], w[ 4], offset); w[23] = amd_bytealign_S (w[ 2], w[ 3], offset); w[22] = amd_bytealign_S (w[ 1], w[ 2], offset); w[21] = amd_bytealign_S (w[ 0], w[ 1], offset); w[20] = amd_bytealign_S ( 0, w[ 0], offset); w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 21: w[63] = amd_bytealign_S (w[41], w[42], offset); w[62] = amd_bytealign_S (w[40], w[41], offset); w[61] = amd_bytealign_S (w[39], w[40], offset); w[60] = amd_bytealign_S (w[38], w[39], offset); w[59] = amd_bytealign_S (w[37], w[38], offset); w[58] = amd_bytealign_S (w[36], w[37], offset); w[57] = amd_bytealign_S (w[35], w[36], offset); w[56] = amd_bytealign_S (w[34], w[35], offset); w[55] = amd_bytealign_S (w[33], w[34], offset); w[54] = amd_bytealign_S (w[32], w[33], offset); w[53] = amd_bytealign_S (w[31], w[32], offset); w[52] = amd_bytealign_S (w[30], w[31], offset); w[51] = amd_bytealign_S (w[29], w[30], offset); w[50] = amd_bytealign_S (w[28], w[29], offset); w[49] = amd_bytealign_S (w[27], w[28], offset); w[48] = amd_bytealign_S (w[26], w[27], offset); w[47] = amd_bytealign_S (w[25], w[26], offset); w[46] = amd_bytealign_S (w[24], w[25], offset); w[45] = amd_bytealign_S (w[23], w[24], offset); w[44] = amd_bytealign_S (w[22], w[23], offset); w[43] = amd_bytealign_S (w[21], w[22], offset); w[42] = amd_bytealign_S (w[20], w[21], offset); w[41] = amd_bytealign_S (w[19], w[20], offset); w[40] = amd_bytealign_S (w[18], w[19], offset); w[39] = amd_bytealign_S (w[17], w[18], offset); w[38] = amd_bytealign_S (w[16], w[17], offset); w[37] = amd_bytealign_S (w[15], w[16], offset); w[36] = amd_bytealign_S (w[14], w[15], offset); w[35] = amd_bytealign_S (w[13], w[14], offset); w[34] = amd_bytealign_S (w[12], w[13], offset); w[33] = amd_bytealign_S (w[11], w[12], offset); w[32] = amd_bytealign_S (w[10], w[11], offset); w[31] = amd_bytealign_S (w[ 9], w[10], offset); w[30] = amd_bytealign_S (w[ 8], w[ 9], offset); w[29] = amd_bytealign_S (w[ 7], w[ 8], offset); w[28] = amd_bytealign_S (w[ 6], w[ 7], offset); w[27] = amd_bytealign_S (w[ 5], w[ 6], offset); w[26] = amd_bytealign_S (w[ 4], w[ 5], offset); w[25] = amd_bytealign_S (w[ 3], w[ 4], offset); w[24] = amd_bytealign_S (w[ 2], w[ 3], offset); w[23] = amd_bytealign_S (w[ 1], w[ 2], offset); w[22] = amd_bytealign_S (w[ 0], w[ 1], offset); w[21] = amd_bytealign_S ( 0, w[ 0], offset); w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 22: w[63] = amd_bytealign_S (w[40], w[41], offset); w[62] = amd_bytealign_S (w[39], w[40], offset); w[61] = amd_bytealign_S (w[38], w[39], offset); w[60] = amd_bytealign_S (w[37], w[38], offset); w[59] = amd_bytealign_S (w[36], w[37], offset); w[58] = amd_bytealign_S (w[35], w[36], offset); w[57] = amd_bytealign_S (w[34], w[35], offset); w[56] = amd_bytealign_S (w[33], w[34], offset); w[55] = amd_bytealign_S (w[32], w[33], offset); w[54] = amd_bytealign_S (w[31], w[32], offset); w[53] = amd_bytealign_S (w[30], w[31], offset); w[52] = amd_bytealign_S (w[29], w[30], offset); w[51] = amd_bytealign_S (w[28], w[29], offset); w[50] = amd_bytealign_S (w[27], w[28], offset); w[49] = amd_bytealign_S (w[26], w[27], offset); w[48] = amd_bytealign_S (w[25], w[26], offset); w[47] = amd_bytealign_S (w[24], w[25], offset); w[46] = amd_bytealign_S (w[23], w[24], offset); w[45] = amd_bytealign_S (w[22], w[23], offset); w[44] = amd_bytealign_S (w[21], w[22], offset); w[43] = amd_bytealign_S (w[20], w[21], offset); w[42] = amd_bytealign_S (w[19], w[20], offset); w[41] = amd_bytealign_S (w[18], w[19], offset); w[40] = amd_bytealign_S (w[17], w[18], offset); w[39] = amd_bytealign_S (w[16], w[17], offset); w[38] = amd_bytealign_S (w[15], w[16], offset); w[37] = amd_bytealign_S (w[14], w[15], offset); w[36] = amd_bytealign_S (w[13], w[14], offset); w[35] = amd_bytealign_S (w[12], w[13], offset); w[34] = amd_bytealign_S (w[11], w[12], offset); w[33] = amd_bytealign_S (w[10], w[11], offset); w[32] = amd_bytealign_S (w[ 9], w[10], offset); w[31] = amd_bytealign_S (w[ 8], w[ 9], offset); w[30] = amd_bytealign_S (w[ 7], w[ 8], offset); w[29] = amd_bytealign_S (w[ 6], w[ 7], offset); w[28] = amd_bytealign_S (w[ 5], w[ 6], offset); w[27] = amd_bytealign_S (w[ 4], w[ 5], offset); w[26] = amd_bytealign_S (w[ 3], w[ 4], offset); w[25] = amd_bytealign_S (w[ 2], w[ 3], offset); w[24] = amd_bytealign_S (w[ 1], w[ 2], offset); w[23] = amd_bytealign_S (w[ 0], w[ 1], offset); w[22] = amd_bytealign_S ( 0, w[ 0], offset); w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 23: w[63] = amd_bytealign_S (w[39], w[40], offset); w[62] = amd_bytealign_S (w[38], w[39], offset); w[61] = amd_bytealign_S (w[37], w[38], offset); w[60] = amd_bytealign_S (w[36], w[37], offset); w[59] = amd_bytealign_S (w[35], w[36], offset); w[58] = amd_bytealign_S (w[34], w[35], offset); w[57] = amd_bytealign_S (w[33], w[34], offset); w[56] = amd_bytealign_S (w[32], w[33], offset); w[55] = amd_bytealign_S (w[31], w[32], offset); w[54] = amd_bytealign_S (w[30], w[31], offset); w[53] = amd_bytealign_S (w[29], w[30], offset); w[52] = amd_bytealign_S (w[28], w[29], offset); w[51] = amd_bytealign_S (w[27], w[28], offset); w[50] = amd_bytealign_S (w[26], w[27], offset); w[49] = amd_bytealign_S (w[25], w[26], offset); w[48] = amd_bytealign_S (w[24], w[25], offset); w[47] = amd_bytealign_S (w[23], w[24], offset); w[46] = amd_bytealign_S (w[22], w[23], offset); w[45] = amd_bytealign_S (w[21], w[22], offset); w[44] = amd_bytealign_S (w[20], w[21], offset); w[43] = amd_bytealign_S (w[19], w[20], offset); w[42] = amd_bytealign_S (w[18], w[19], offset); w[41] = amd_bytealign_S (w[17], w[18], offset); w[40] = amd_bytealign_S (w[16], w[17], offset); w[39] = amd_bytealign_S (w[15], w[16], offset); w[38] = amd_bytealign_S (w[14], w[15], offset); w[37] = amd_bytealign_S (w[13], w[14], offset); w[36] = amd_bytealign_S (w[12], w[13], offset); w[35] = amd_bytealign_S (w[11], w[12], offset); w[34] = amd_bytealign_S (w[10], w[11], offset); w[33] = amd_bytealign_S (w[ 9], w[10], offset); w[32] = amd_bytealign_S (w[ 8], w[ 9], offset); w[31] = amd_bytealign_S (w[ 7], w[ 8], offset); w[30] = amd_bytealign_S (w[ 6], w[ 7], offset); w[29] = amd_bytealign_S (w[ 5], w[ 6], offset); w[28] = amd_bytealign_S (w[ 4], w[ 5], offset); w[27] = amd_bytealign_S (w[ 3], w[ 4], offset); w[26] = amd_bytealign_S (w[ 2], w[ 3], offset); w[25] = amd_bytealign_S (w[ 1], w[ 2], offset); w[24] = amd_bytealign_S (w[ 0], w[ 1], offset); w[23] = amd_bytealign_S ( 0, w[ 0], offset); w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 24: w[63] = amd_bytealign_S (w[38], w[39], offset); w[62] = amd_bytealign_S (w[37], w[38], offset); w[61] = amd_bytealign_S (w[36], w[37], offset); w[60] = amd_bytealign_S (w[35], w[36], offset); w[59] = amd_bytealign_S (w[34], w[35], offset); w[58] = amd_bytealign_S (w[33], w[34], offset); w[57] = amd_bytealign_S (w[32], w[33], offset); w[56] = amd_bytealign_S (w[31], w[32], offset); w[55] = amd_bytealign_S (w[30], w[31], offset); w[54] = amd_bytealign_S (w[29], w[30], offset); w[53] = amd_bytealign_S (w[28], w[29], offset); w[52] = amd_bytealign_S (w[27], w[28], offset); w[51] = amd_bytealign_S (w[26], w[27], offset); w[50] = amd_bytealign_S (w[25], w[26], offset); w[49] = amd_bytealign_S (w[24], w[25], offset); w[48] = amd_bytealign_S (w[23], w[24], offset); w[47] = amd_bytealign_S (w[22], w[23], offset); w[46] = amd_bytealign_S (w[21], w[22], offset); w[45] = amd_bytealign_S (w[20], w[21], offset); w[44] = amd_bytealign_S (w[19], w[20], offset); w[43] = amd_bytealign_S (w[18], w[19], offset); w[42] = amd_bytealign_S (w[17], w[18], offset); w[41] = amd_bytealign_S (w[16], w[17], offset); w[40] = amd_bytealign_S (w[15], w[16], offset); w[39] = amd_bytealign_S (w[14], w[15], offset); w[38] = amd_bytealign_S (w[13], w[14], offset); w[37] = amd_bytealign_S (w[12], w[13], offset); w[36] = amd_bytealign_S (w[11], w[12], offset); w[35] = amd_bytealign_S (w[10], w[11], offset); w[34] = amd_bytealign_S (w[ 9], w[10], offset); w[33] = amd_bytealign_S (w[ 8], w[ 9], offset); w[32] = amd_bytealign_S (w[ 7], w[ 8], offset); w[31] = amd_bytealign_S (w[ 6], w[ 7], offset); w[30] = amd_bytealign_S (w[ 5], w[ 6], offset); w[29] = amd_bytealign_S (w[ 4], w[ 5], offset); w[28] = amd_bytealign_S (w[ 3], w[ 4], offset); w[27] = amd_bytealign_S (w[ 2], w[ 3], offset); w[26] = amd_bytealign_S (w[ 1], w[ 2], offset); w[25] = amd_bytealign_S (w[ 0], w[ 1], offset); w[24] = amd_bytealign_S ( 0, w[ 0], offset); w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 25: w[63] = amd_bytealign_S (w[37], w[38], offset); w[62] = amd_bytealign_S (w[36], w[37], offset); w[61] = amd_bytealign_S (w[35], w[36], offset); w[60] = amd_bytealign_S (w[34], w[35], offset); w[59] = amd_bytealign_S (w[33], w[34], offset); w[58] = amd_bytealign_S (w[32], w[33], offset); w[57] = amd_bytealign_S (w[31], w[32], offset); w[56] = amd_bytealign_S (w[30], w[31], offset); w[55] = amd_bytealign_S (w[29], w[30], offset); w[54] = amd_bytealign_S (w[28], w[29], offset); w[53] = amd_bytealign_S (w[27], w[28], offset); w[52] = amd_bytealign_S (w[26], w[27], offset); w[51] = amd_bytealign_S (w[25], w[26], offset); w[50] = amd_bytealign_S (w[24], w[25], offset); w[49] = amd_bytealign_S (w[23], w[24], offset); w[48] = amd_bytealign_S (w[22], w[23], offset); w[47] = amd_bytealign_S (w[21], w[22], offset); w[46] = amd_bytealign_S (w[20], w[21], offset); w[45] = amd_bytealign_S (w[19], w[20], offset); w[44] = amd_bytealign_S (w[18], w[19], offset); w[43] = amd_bytealign_S (w[17], w[18], offset); w[42] = amd_bytealign_S (w[16], w[17], offset); w[41] = amd_bytealign_S (w[15], w[16], offset); w[40] = amd_bytealign_S (w[14], w[15], offset); w[39] = amd_bytealign_S (w[13], w[14], offset); w[38] = amd_bytealign_S (w[12], w[13], offset); w[37] = amd_bytealign_S (w[11], w[12], offset); w[36] = amd_bytealign_S (w[10], w[11], offset); w[35] = amd_bytealign_S (w[ 9], w[10], offset); w[34] = amd_bytealign_S (w[ 8], w[ 9], offset); w[33] = amd_bytealign_S (w[ 7], w[ 8], offset); w[32] = amd_bytealign_S (w[ 6], w[ 7], offset); w[31] = amd_bytealign_S (w[ 5], w[ 6], offset); w[30] = amd_bytealign_S (w[ 4], w[ 5], offset); w[29] = amd_bytealign_S (w[ 3], w[ 4], offset); w[28] = amd_bytealign_S (w[ 2], w[ 3], offset); w[27] = amd_bytealign_S (w[ 1], w[ 2], offset); w[26] = amd_bytealign_S (w[ 0], w[ 1], offset); w[25] = amd_bytealign_S ( 0, w[ 0], offset); w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 26: w[63] = amd_bytealign_S (w[36], w[37], offset); w[62] = amd_bytealign_S (w[35], w[36], offset); w[61] = amd_bytealign_S (w[34], w[35], offset); w[60] = amd_bytealign_S (w[33], w[34], offset); w[59] = amd_bytealign_S (w[32], w[33], offset); w[58] = amd_bytealign_S (w[31], w[32], offset); w[57] = amd_bytealign_S (w[30], w[31], offset); w[56] = amd_bytealign_S (w[29], w[30], offset); w[55] = amd_bytealign_S (w[28], w[29], offset); w[54] = amd_bytealign_S (w[27], w[28], offset); w[53] = amd_bytealign_S (w[26], w[27], offset); w[52] = amd_bytealign_S (w[25], w[26], offset); w[51] = amd_bytealign_S (w[24], w[25], offset); w[50] = amd_bytealign_S (w[23], w[24], offset); w[49] = amd_bytealign_S (w[22], w[23], offset); w[48] = amd_bytealign_S (w[21], w[22], offset); w[47] = amd_bytealign_S (w[20], w[21], offset); w[46] = amd_bytealign_S (w[19], w[20], offset); w[45] = amd_bytealign_S (w[18], w[19], offset); w[44] = amd_bytealign_S (w[17], w[18], offset); w[43] = amd_bytealign_S (w[16], w[17], offset); w[42] = amd_bytealign_S (w[15], w[16], offset); w[41] = amd_bytealign_S (w[14], w[15], offset); w[40] = amd_bytealign_S (w[13], w[14], offset); w[39] = amd_bytealign_S (w[12], w[13], offset); w[38] = amd_bytealign_S (w[11], w[12], offset); w[37] = amd_bytealign_S (w[10], w[11], offset); w[36] = amd_bytealign_S (w[ 9], w[10], offset); w[35] = amd_bytealign_S (w[ 8], w[ 9], offset); w[34] = amd_bytealign_S (w[ 7], w[ 8], offset); w[33] = amd_bytealign_S (w[ 6], w[ 7], offset); w[32] = amd_bytealign_S (w[ 5], w[ 6], offset); w[31] = amd_bytealign_S (w[ 4], w[ 5], offset); w[30] = amd_bytealign_S (w[ 3], w[ 4], offset); w[29] = amd_bytealign_S (w[ 2], w[ 3], offset); w[28] = amd_bytealign_S (w[ 1], w[ 2], offset); w[27] = amd_bytealign_S (w[ 0], w[ 1], offset); w[26] = amd_bytealign_S ( 0, w[ 0], offset); w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 27: w[63] = amd_bytealign_S (w[35], w[36], offset); w[62] = amd_bytealign_S (w[34], w[35], offset); w[61] = amd_bytealign_S (w[33], w[34], offset); w[60] = amd_bytealign_S (w[32], w[33], offset); w[59] = amd_bytealign_S (w[31], w[32], offset); w[58] = amd_bytealign_S (w[30], w[31], offset); w[57] = amd_bytealign_S (w[29], w[30], offset); w[56] = amd_bytealign_S (w[28], w[29], offset); w[55] = amd_bytealign_S (w[27], w[28], offset); w[54] = amd_bytealign_S (w[26], w[27], offset); w[53] = amd_bytealign_S (w[25], w[26], offset); w[52] = amd_bytealign_S (w[24], w[25], offset); w[51] = amd_bytealign_S (w[23], w[24], offset); w[50] = amd_bytealign_S (w[22], w[23], offset); w[49] = amd_bytealign_S (w[21], w[22], offset); w[48] = amd_bytealign_S (w[20], w[21], offset); w[47] = amd_bytealign_S (w[19], w[20], offset); w[46] = amd_bytealign_S (w[18], w[19], offset); w[45] = amd_bytealign_S (w[17], w[18], offset); w[44] = amd_bytealign_S (w[16], w[17], offset); w[43] = amd_bytealign_S (w[15], w[16], offset); w[42] = amd_bytealign_S (w[14], w[15], offset); w[41] = amd_bytealign_S (w[13], w[14], offset); w[40] = amd_bytealign_S (w[12], w[13], offset); w[39] = amd_bytealign_S (w[11], w[12], offset); w[38] = amd_bytealign_S (w[10], w[11], offset); w[37] = amd_bytealign_S (w[ 9], w[10], offset); w[36] = amd_bytealign_S (w[ 8], w[ 9], offset); w[35] = amd_bytealign_S (w[ 7], w[ 8], offset); w[34] = amd_bytealign_S (w[ 6], w[ 7], offset); w[33] = amd_bytealign_S (w[ 5], w[ 6], offset); w[32] = amd_bytealign_S (w[ 4], w[ 5], offset); w[31] = amd_bytealign_S (w[ 3], w[ 4], offset); w[30] = amd_bytealign_S (w[ 2], w[ 3], offset); w[29] = amd_bytealign_S (w[ 1], w[ 2], offset); w[28] = amd_bytealign_S (w[ 0], w[ 1], offset); w[27] = amd_bytealign_S ( 0, w[ 0], offset); w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 28: w[63] = amd_bytealign_S (w[34], w[35], offset); w[62] = amd_bytealign_S (w[33], w[34], offset); w[61] = amd_bytealign_S (w[32], w[33], offset); w[60] = amd_bytealign_S (w[31], w[32], offset); w[59] = amd_bytealign_S (w[30], w[31], offset); w[58] = amd_bytealign_S (w[29], w[30], offset); w[57] = amd_bytealign_S (w[28], w[29], offset); w[56] = amd_bytealign_S (w[27], w[28], offset); w[55] = amd_bytealign_S (w[26], w[27], offset); w[54] = amd_bytealign_S (w[25], w[26], offset); w[53] = amd_bytealign_S (w[24], w[25], offset); w[52] = amd_bytealign_S (w[23], w[24], offset); w[51] = amd_bytealign_S (w[22], w[23], offset); w[50] = amd_bytealign_S (w[21], w[22], offset); w[49] = amd_bytealign_S (w[20], w[21], offset); w[48] = amd_bytealign_S (w[19], w[20], offset); w[47] = amd_bytealign_S (w[18], w[19], offset); w[46] = amd_bytealign_S (w[17], w[18], offset); w[45] = amd_bytealign_S (w[16], w[17], offset); w[44] = amd_bytealign_S (w[15], w[16], offset); w[43] = amd_bytealign_S (w[14], w[15], offset); w[42] = amd_bytealign_S (w[13], w[14], offset); w[41] = amd_bytealign_S (w[12], w[13], offset); w[40] = amd_bytealign_S (w[11], w[12], offset); w[39] = amd_bytealign_S (w[10], w[11], offset); w[38] = amd_bytealign_S (w[ 9], w[10], offset); w[37] = amd_bytealign_S (w[ 8], w[ 9], offset); w[36] = amd_bytealign_S (w[ 7], w[ 8], offset); w[35] = amd_bytealign_S (w[ 6], w[ 7], offset); w[34] = amd_bytealign_S (w[ 5], w[ 6], offset); w[33] = amd_bytealign_S (w[ 4], w[ 5], offset); w[32] = amd_bytealign_S (w[ 3], w[ 4], offset); w[31] = amd_bytealign_S (w[ 2], w[ 3], offset); w[30] = amd_bytealign_S (w[ 1], w[ 2], offset); w[29] = amd_bytealign_S (w[ 0], w[ 1], offset); w[28] = amd_bytealign_S ( 0, w[ 0], offset); w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 29: w[63] = amd_bytealign_S (w[33], w[34], offset); w[62] = amd_bytealign_S (w[32], w[33], offset); w[61] = amd_bytealign_S (w[31], w[32], offset); w[60] = amd_bytealign_S (w[30], w[31], offset); w[59] = amd_bytealign_S (w[29], w[30], offset); w[58] = amd_bytealign_S (w[28], w[29], offset); w[57] = amd_bytealign_S (w[27], w[28], offset); w[56] = amd_bytealign_S (w[26], w[27], offset); w[55] = amd_bytealign_S (w[25], w[26], offset); w[54] = amd_bytealign_S (w[24], w[25], offset); w[53] = amd_bytealign_S (w[23], w[24], offset); w[52] = amd_bytealign_S (w[22], w[23], offset); w[51] = amd_bytealign_S (w[21], w[22], offset); w[50] = amd_bytealign_S (w[20], w[21], offset); w[49] = amd_bytealign_S (w[19], w[20], offset); w[48] = amd_bytealign_S (w[18], w[19], offset); w[47] = amd_bytealign_S (w[17], w[18], offset); w[46] = amd_bytealign_S (w[16], w[17], offset); w[45] = amd_bytealign_S (w[15], w[16], offset); w[44] = amd_bytealign_S (w[14], w[15], offset); w[43] = amd_bytealign_S (w[13], w[14], offset); w[42] = amd_bytealign_S (w[12], w[13], offset); w[41] = amd_bytealign_S (w[11], w[12], offset); w[40] = amd_bytealign_S (w[10], w[11], offset); w[39] = amd_bytealign_S (w[ 9], w[10], offset); w[38] = amd_bytealign_S (w[ 8], w[ 9], offset); w[37] = amd_bytealign_S (w[ 7], w[ 8], offset); w[36] = amd_bytealign_S (w[ 6], w[ 7], offset); w[35] = amd_bytealign_S (w[ 5], w[ 6], offset); w[34] = amd_bytealign_S (w[ 4], w[ 5], offset); w[33] = amd_bytealign_S (w[ 3], w[ 4], offset); w[32] = amd_bytealign_S (w[ 2], w[ 3], offset); w[31] = amd_bytealign_S (w[ 1], w[ 2], offset); w[30] = amd_bytealign_S (w[ 0], w[ 1], offset); w[29] = amd_bytealign_S ( 0, w[ 0], offset); w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 30: w[63] = amd_bytealign_S (w[32], w[33], offset); w[62] = amd_bytealign_S (w[31], w[32], offset); w[61] = amd_bytealign_S (w[30], w[31], offset); w[60] = amd_bytealign_S (w[29], w[30], offset); w[59] = amd_bytealign_S (w[28], w[29], offset); w[58] = amd_bytealign_S (w[27], w[28], offset); w[57] = amd_bytealign_S (w[26], w[27], offset); w[56] = amd_bytealign_S (w[25], w[26], offset); w[55] = amd_bytealign_S (w[24], w[25], offset); w[54] = amd_bytealign_S (w[23], w[24], offset); w[53] = amd_bytealign_S (w[22], w[23], offset); w[52] = amd_bytealign_S (w[21], w[22], offset); w[51] = amd_bytealign_S (w[20], w[21], offset); w[50] = amd_bytealign_S (w[19], w[20], offset); w[49] = amd_bytealign_S (w[18], w[19], offset); w[48] = amd_bytealign_S (w[17], w[18], offset); w[47] = amd_bytealign_S (w[16], w[17], offset); w[46] = amd_bytealign_S (w[15], w[16], offset); w[45] = amd_bytealign_S (w[14], w[15], offset); w[44] = amd_bytealign_S (w[13], w[14], offset); w[43] = amd_bytealign_S (w[12], w[13], offset); w[42] = amd_bytealign_S (w[11], w[12], offset); w[41] = amd_bytealign_S (w[10], w[11], offset); w[40] = amd_bytealign_S (w[ 9], w[10], offset); w[39] = amd_bytealign_S (w[ 8], w[ 9], offset); w[38] = amd_bytealign_S (w[ 7], w[ 8], offset); w[37] = amd_bytealign_S (w[ 6], w[ 7], offset); w[36] = amd_bytealign_S (w[ 5], w[ 6], offset); w[35] = amd_bytealign_S (w[ 4], w[ 5], offset); w[34] = amd_bytealign_S (w[ 3], w[ 4], offset); w[33] = amd_bytealign_S (w[ 2], w[ 3], offset); w[32] = amd_bytealign_S (w[ 1], w[ 2], offset); w[31] = amd_bytealign_S (w[ 0], w[ 1], offset); w[30] = amd_bytealign_S ( 0, w[ 0], offset); w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 31: w[63] = amd_bytealign_S (w[31], w[32], offset); w[62] = amd_bytealign_S (w[30], w[31], offset); w[61] = amd_bytealign_S (w[29], w[30], offset); w[60] = amd_bytealign_S (w[28], w[29], offset); w[59] = amd_bytealign_S (w[27], w[28], offset); w[58] = amd_bytealign_S (w[26], w[27], offset); w[57] = amd_bytealign_S (w[25], w[26], offset); w[56] = amd_bytealign_S (w[24], w[25], offset); w[55] = amd_bytealign_S (w[23], w[24], offset); w[54] = amd_bytealign_S (w[22], w[23], offset); w[53] = amd_bytealign_S (w[21], w[22], offset); w[52] = amd_bytealign_S (w[20], w[21], offset); w[51] = amd_bytealign_S (w[19], w[20], offset); w[50] = amd_bytealign_S (w[18], w[19], offset); w[49] = amd_bytealign_S (w[17], w[18], offset); w[48] = amd_bytealign_S (w[16], w[17], offset); w[47] = amd_bytealign_S (w[15], w[16], offset); w[46] = amd_bytealign_S (w[14], w[15], offset); w[45] = amd_bytealign_S (w[13], w[14], offset); w[44] = amd_bytealign_S (w[12], w[13], offset); w[43] = amd_bytealign_S (w[11], w[12], offset); w[42] = amd_bytealign_S (w[10], w[11], offset); w[41] = amd_bytealign_S (w[ 9], w[10], offset); w[40] = amd_bytealign_S (w[ 8], w[ 9], offset); w[39] = amd_bytealign_S (w[ 7], w[ 8], offset); w[38] = amd_bytealign_S (w[ 6], w[ 7], offset); w[37] = amd_bytealign_S (w[ 5], w[ 6], offset); w[36] = amd_bytealign_S (w[ 4], w[ 5], offset); w[35] = amd_bytealign_S (w[ 3], w[ 4], offset); w[34] = amd_bytealign_S (w[ 2], w[ 3], offset); w[33] = amd_bytealign_S (w[ 1], w[ 2], offset); w[32] = amd_bytealign_S (w[ 0], w[ 1], offset); w[31] = amd_bytealign_S ( 0, w[ 0], offset); w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 32: w[63] = amd_bytealign_S (w[30], w[31], offset); w[62] = amd_bytealign_S (w[29], w[30], offset); w[61] = amd_bytealign_S (w[28], w[29], offset); w[60] = amd_bytealign_S (w[27], w[28], offset); w[59] = amd_bytealign_S (w[26], w[27], offset); w[58] = amd_bytealign_S (w[25], w[26], offset); w[57] = amd_bytealign_S (w[24], w[25], offset); w[56] = amd_bytealign_S (w[23], w[24], offset); w[55] = amd_bytealign_S (w[22], w[23], offset); w[54] = amd_bytealign_S (w[21], w[22], offset); w[53] = amd_bytealign_S (w[20], w[21], offset); w[52] = amd_bytealign_S (w[19], w[20], offset); w[51] = amd_bytealign_S (w[18], w[19], offset); w[50] = amd_bytealign_S (w[17], w[18], offset); w[49] = amd_bytealign_S (w[16], w[17], offset); w[48] = amd_bytealign_S (w[15], w[16], offset); w[47] = amd_bytealign_S (w[14], w[15], offset); w[46] = amd_bytealign_S (w[13], w[14], offset); w[45] = amd_bytealign_S (w[12], w[13], offset); w[44] = amd_bytealign_S (w[11], w[12], offset); w[43] = amd_bytealign_S (w[10], w[11], offset); w[42] = amd_bytealign_S (w[ 9], w[10], offset); w[41] = amd_bytealign_S (w[ 8], w[ 9], offset); w[40] = amd_bytealign_S (w[ 7], w[ 8], offset); w[39] = amd_bytealign_S (w[ 6], w[ 7], offset); w[38] = amd_bytealign_S (w[ 5], w[ 6], offset); w[37] = amd_bytealign_S (w[ 4], w[ 5], offset); w[36] = amd_bytealign_S (w[ 3], w[ 4], offset); w[35] = amd_bytealign_S (w[ 2], w[ 3], offset); w[34] = amd_bytealign_S (w[ 1], w[ 2], offset); w[33] = amd_bytealign_S (w[ 0], w[ 1], offset); w[32] = amd_bytealign_S ( 0, w[ 0], offset); w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 33: w[63] = amd_bytealign_S (w[29], w[30], offset); w[62] = amd_bytealign_S (w[28], w[29], offset); w[61] = amd_bytealign_S (w[27], w[28], offset); w[60] = amd_bytealign_S (w[26], w[27], offset); w[59] = amd_bytealign_S (w[25], w[26], offset); w[58] = amd_bytealign_S (w[24], w[25], offset); w[57] = amd_bytealign_S (w[23], w[24], offset); w[56] = amd_bytealign_S (w[22], w[23], offset); w[55] = amd_bytealign_S (w[21], w[22], offset); w[54] = amd_bytealign_S (w[20], w[21], offset); w[53] = amd_bytealign_S (w[19], w[20], offset); w[52] = amd_bytealign_S (w[18], w[19], offset); w[51] = amd_bytealign_S (w[17], w[18], offset); w[50] = amd_bytealign_S (w[16], w[17], offset); w[49] = amd_bytealign_S (w[15], w[16], offset); w[48] = amd_bytealign_S (w[14], w[15], offset); w[47] = amd_bytealign_S (w[13], w[14], offset); w[46] = amd_bytealign_S (w[12], w[13], offset); w[45] = amd_bytealign_S (w[11], w[12], offset); w[44] = amd_bytealign_S (w[10], w[11], offset); w[43] = amd_bytealign_S (w[ 9], w[10], offset); w[42] = amd_bytealign_S (w[ 8], w[ 9], offset); w[41] = amd_bytealign_S (w[ 7], w[ 8], offset); w[40] = amd_bytealign_S (w[ 6], w[ 7], offset); w[39] = amd_bytealign_S (w[ 5], w[ 6], offset); w[38] = amd_bytealign_S (w[ 4], w[ 5], offset); w[37] = amd_bytealign_S (w[ 3], w[ 4], offset); w[36] = amd_bytealign_S (w[ 2], w[ 3], offset); w[35] = amd_bytealign_S (w[ 1], w[ 2], offset); w[34] = amd_bytealign_S (w[ 0], w[ 1], offset); w[33] = amd_bytealign_S ( 0, w[ 0], offset); w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 34: w[63] = amd_bytealign_S (w[28], w[29], offset); w[62] = amd_bytealign_S (w[27], w[28], offset); w[61] = amd_bytealign_S (w[26], w[27], offset); w[60] = amd_bytealign_S (w[25], w[26], offset); w[59] = amd_bytealign_S (w[24], w[25], offset); w[58] = amd_bytealign_S (w[23], w[24], offset); w[57] = amd_bytealign_S (w[22], w[23], offset); w[56] = amd_bytealign_S (w[21], w[22], offset); w[55] = amd_bytealign_S (w[20], w[21], offset); w[54] = amd_bytealign_S (w[19], w[20], offset); w[53] = amd_bytealign_S (w[18], w[19], offset); w[52] = amd_bytealign_S (w[17], w[18], offset); w[51] = amd_bytealign_S (w[16], w[17], offset); w[50] = amd_bytealign_S (w[15], w[16], offset); w[49] = amd_bytealign_S (w[14], w[15], offset); w[48] = amd_bytealign_S (w[13], w[14], offset); w[47] = amd_bytealign_S (w[12], w[13], offset); w[46] = amd_bytealign_S (w[11], w[12], offset); w[45] = amd_bytealign_S (w[10], w[11], offset); w[44] = amd_bytealign_S (w[ 9], w[10], offset); w[43] = amd_bytealign_S (w[ 8], w[ 9], offset); w[42] = amd_bytealign_S (w[ 7], w[ 8], offset); w[41] = amd_bytealign_S (w[ 6], w[ 7], offset); w[40] = amd_bytealign_S (w[ 5], w[ 6], offset); w[39] = amd_bytealign_S (w[ 4], w[ 5], offset); w[38] = amd_bytealign_S (w[ 3], w[ 4], offset); w[37] = amd_bytealign_S (w[ 2], w[ 3], offset); w[36] = amd_bytealign_S (w[ 1], w[ 2], offset); w[35] = amd_bytealign_S (w[ 0], w[ 1], offset); w[34] = amd_bytealign_S ( 0, w[ 0], offset); w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 35: w[63] = amd_bytealign_S (w[27], w[28], offset); w[62] = amd_bytealign_S (w[26], w[27], offset); w[61] = amd_bytealign_S (w[25], w[26], offset); w[60] = amd_bytealign_S (w[24], w[25], offset); w[59] = amd_bytealign_S (w[23], w[24], offset); w[58] = amd_bytealign_S (w[22], w[23], offset); w[57] = amd_bytealign_S (w[21], w[22], offset); w[56] = amd_bytealign_S (w[20], w[21], offset); w[55] = amd_bytealign_S (w[19], w[20], offset); w[54] = amd_bytealign_S (w[18], w[19], offset); w[53] = amd_bytealign_S (w[17], w[18], offset); w[52] = amd_bytealign_S (w[16], w[17], offset); w[51] = amd_bytealign_S (w[15], w[16], offset); w[50] = amd_bytealign_S (w[14], w[15], offset); w[49] = amd_bytealign_S (w[13], w[14], offset); w[48] = amd_bytealign_S (w[12], w[13], offset); w[47] = amd_bytealign_S (w[11], w[12], offset); w[46] = amd_bytealign_S (w[10], w[11], offset); w[45] = amd_bytealign_S (w[ 9], w[10], offset); w[44] = amd_bytealign_S (w[ 8], w[ 9], offset); w[43] = amd_bytealign_S (w[ 7], w[ 8], offset); w[42] = amd_bytealign_S (w[ 6], w[ 7], offset); w[41] = amd_bytealign_S (w[ 5], w[ 6], offset); w[40] = amd_bytealign_S (w[ 4], w[ 5], offset); w[39] = amd_bytealign_S (w[ 3], w[ 4], offset); w[38] = amd_bytealign_S (w[ 2], w[ 3], offset); w[37] = amd_bytealign_S (w[ 1], w[ 2], offset); w[36] = amd_bytealign_S (w[ 0], w[ 1], offset); w[35] = amd_bytealign_S ( 0, w[ 0], offset); w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 36: w[63] = amd_bytealign_S (w[26], w[27], offset); w[62] = amd_bytealign_S (w[25], w[26], offset); w[61] = amd_bytealign_S (w[24], w[25], offset); w[60] = amd_bytealign_S (w[23], w[24], offset); w[59] = amd_bytealign_S (w[22], w[23], offset); w[58] = amd_bytealign_S (w[21], w[22], offset); w[57] = amd_bytealign_S (w[20], w[21], offset); w[56] = amd_bytealign_S (w[19], w[20], offset); w[55] = amd_bytealign_S (w[18], w[19], offset); w[54] = amd_bytealign_S (w[17], w[18], offset); w[53] = amd_bytealign_S (w[16], w[17], offset); w[52] = amd_bytealign_S (w[15], w[16], offset); w[51] = amd_bytealign_S (w[14], w[15], offset); w[50] = amd_bytealign_S (w[13], w[14], offset); w[49] = amd_bytealign_S (w[12], w[13], offset); w[48] = amd_bytealign_S (w[11], w[12], offset); w[47] = amd_bytealign_S (w[10], w[11], offset); w[46] = amd_bytealign_S (w[ 9], w[10], offset); w[45] = amd_bytealign_S (w[ 8], w[ 9], offset); w[44] = amd_bytealign_S (w[ 7], w[ 8], offset); w[43] = amd_bytealign_S (w[ 6], w[ 7], offset); w[42] = amd_bytealign_S (w[ 5], w[ 6], offset); w[41] = amd_bytealign_S (w[ 4], w[ 5], offset); w[40] = amd_bytealign_S (w[ 3], w[ 4], offset); w[39] = amd_bytealign_S (w[ 2], w[ 3], offset); w[38] = amd_bytealign_S (w[ 1], w[ 2], offset); w[37] = amd_bytealign_S (w[ 0], w[ 1], offset); w[36] = amd_bytealign_S ( 0, w[ 0], offset); w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 37: w[63] = amd_bytealign_S (w[25], w[26], offset); w[62] = amd_bytealign_S (w[24], w[25], offset); w[61] = amd_bytealign_S (w[23], w[24], offset); w[60] = amd_bytealign_S (w[22], w[23], offset); w[59] = amd_bytealign_S (w[21], w[22], offset); w[58] = amd_bytealign_S (w[20], w[21], offset); w[57] = amd_bytealign_S (w[19], w[20], offset); w[56] = amd_bytealign_S (w[18], w[19], offset); w[55] = amd_bytealign_S (w[17], w[18], offset); w[54] = amd_bytealign_S (w[16], w[17], offset); w[53] = amd_bytealign_S (w[15], w[16], offset); w[52] = amd_bytealign_S (w[14], w[15], offset); w[51] = amd_bytealign_S (w[13], w[14], offset); w[50] = amd_bytealign_S (w[12], w[13], offset); w[49] = amd_bytealign_S (w[11], w[12], offset); w[48] = amd_bytealign_S (w[10], w[11], offset); w[47] = amd_bytealign_S (w[ 9], w[10], offset); w[46] = amd_bytealign_S (w[ 8], w[ 9], offset); w[45] = amd_bytealign_S (w[ 7], w[ 8], offset); w[44] = amd_bytealign_S (w[ 6], w[ 7], offset); w[43] = amd_bytealign_S (w[ 5], w[ 6], offset); w[42] = amd_bytealign_S (w[ 4], w[ 5], offset); w[41] = amd_bytealign_S (w[ 3], w[ 4], offset); w[40] = amd_bytealign_S (w[ 2], w[ 3], offset); w[39] = amd_bytealign_S (w[ 1], w[ 2], offset); w[38] = amd_bytealign_S (w[ 0], w[ 1], offset); w[37] = amd_bytealign_S ( 0, w[ 0], offset); w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 38: w[63] = amd_bytealign_S (w[24], w[25], offset); w[62] = amd_bytealign_S (w[23], w[24], offset); w[61] = amd_bytealign_S (w[22], w[23], offset); w[60] = amd_bytealign_S (w[21], w[22], offset); w[59] = amd_bytealign_S (w[20], w[21], offset); w[58] = amd_bytealign_S (w[19], w[20], offset); w[57] = amd_bytealign_S (w[18], w[19], offset); w[56] = amd_bytealign_S (w[17], w[18], offset); w[55] = amd_bytealign_S (w[16], w[17], offset); w[54] = amd_bytealign_S (w[15], w[16], offset); w[53] = amd_bytealign_S (w[14], w[15], offset); w[52] = amd_bytealign_S (w[13], w[14], offset); w[51] = amd_bytealign_S (w[12], w[13], offset); w[50] = amd_bytealign_S (w[11], w[12], offset); w[49] = amd_bytealign_S (w[10], w[11], offset); w[48] = amd_bytealign_S (w[ 9], w[10], offset); w[47] = amd_bytealign_S (w[ 8], w[ 9], offset); w[46] = amd_bytealign_S (w[ 7], w[ 8], offset); w[45] = amd_bytealign_S (w[ 6], w[ 7], offset); w[44] = amd_bytealign_S (w[ 5], w[ 6], offset); w[43] = amd_bytealign_S (w[ 4], w[ 5], offset); w[42] = amd_bytealign_S (w[ 3], w[ 4], offset); w[41] = amd_bytealign_S (w[ 2], w[ 3], offset); w[40] = amd_bytealign_S (w[ 1], w[ 2], offset); w[39] = amd_bytealign_S (w[ 0], w[ 1], offset); w[38] = amd_bytealign_S ( 0, w[ 0], offset); w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 39: w[63] = amd_bytealign_S (w[23], w[24], offset); w[62] = amd_bytealign_S (w[22], w[23], offset); w[61] = amd_bytealign_S (w[21], w[22], offset); w[60] = amd_bytealign_S (w[20], w[21], offset); w[59] = amd_bytealign_S (w[19], w[20], offset); w[58] = amd_bytealign_S (w[18], w[19], offset); w[57] = amd_bytealign_S (w[17], w[18], offset); w[56] = amd_bytealign_S (w[16], w[17], offset); w[55] = amd_bytealign_S (w[15], w[16], offset); w[54] = amd_bytealign_S (w[14], w[15], offset); w[53] = amd_bytealign_S (w[13], w[14], offset); w[52] = amd_bytealign_S (w[12], w[13], offset); w[51] = amd_bytealign_S (w[11], w[12], offset); w[50] = amd_bytealign_S (w[10], w[11], offset); w[49] = amd_bytealign_S (w[ 9], w[10], offset); w[48] = amd_bytealign_S (w[ 8], w[ 9], offset); w[47] = amd_bytealign_S (w[ 7], w[ 8], offset); w[46] = amd_bytealign_S (w[ 6], w[ 7], offset); w[45] = amd_bytealign_S (w[ 5], w[ 6], offset); w[44] = amd_bytealign_S (w[ 4], w[ 5], offset); w[43] = amd_bytealign_S (w[ 3], w[ 4], offset); w[42] = amd_bytealign_S (w[ 2], w[ 3], offset); w[41] = amd_bytealign_S (w[ 1], w[ 2], offset); w[40] = amd_bytealign_S (w[ 0], w[ 1], offset); w[39] = amd_bytealign_S ( 0, w[ 0], offset); w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 40: w[63] = amd_bytealign_S (w[22], w[23], offset); w[62] = amd_bytealign_S (w[21], w[22], offset); w[61] = amd_bytealign_S (w[20], w[21], offset); w[60] = amd_bytealign_S (w[19], w[20], offset); w[59] = amd_bytealign_S (w[18], w[19], offset); w[58] = amd_bytealign_S (w[17], w[18], offset); w[57] = amd_bytealign_S (w[16], w[17], offset); w[56] = amd_bytealign_S (w[15], w[16], offset); w[55] = amd_bytealign_S (w[14], w[15], offset); w[54] = amd_bytealign_S (w[13], w[14], offset); w[53] = amd_bytealign_S (w[12], w[13], offset); w[52] = amd_bytealign_S (w[11], w[12], offset); w[51] = amd_bytealign_S (w[10], w[11], offset); w[50] = amd_bytealign_S (w[ 9], w[10], offset); w[49] = amd_bytealign_S (w[ 8], w[ 9], offset); w[48] = amd_bytealign_S (w[ 7], w[ 8], offset); w[47] = amd_bytealign_S (w[ 6], w[ 7], offset); w[46] = amd_bytealign_S (w[ 5], w[ 6], offset); w[45] = amd_bytealign_S (w[ 4], w[ 5], offset); w[44] = amd_bytealign_S (w[ 3], w[ 4], offset); w[43] = amd_bytealign_S (w[ 2], w[ 3], offset); w[42] = amd_bytealign_S (w[ 1], w[ 2], offset); w[41] = amd_bytealign_S (w[ 0], w[ 1], offset); w[40] = amd_bytealign_S ( 0, w[ 0], offset); w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 41: w[63] = amd_bytealign_S (w[21], w[22], offset); w[62] = amd_bytealign_S (w[20], w[21], offset); w[61] = amd_bytealign_S (w[19], w[20], offset); w[60] = amd_bytealign_S (w[18], w[19], offset); w[59] = amd_bytealign_S (w[17], w[18], offset); w[58] = amd_bytealign_S (w[16], w[17], offset); w[57] = amd_bytealign_S (w[15], w[16], offset); w[56] = amd_bytealign_S (w[14], w[15], offset); w[55] = amd_bytealign_S (w[13], w[14], offset); w[54] = amd_bytealign_S (w[12], w[13], offset); w[53] = amd_bytealign_S (w[11], w[12], offset); w[52] = amd_bytealign_S (w[10], w[11], offset); w[51] = amd_bytealign_S (w[ 9], w[10], offset); w[50] = amd_bytealign_S (w[ 8], w[ 9], offset); w[49] = amd_bytealign_S (w[ 7], w[ 8], offset); w[48] = amd_bytealign_S (w[ 6], w[ 7], offset); w[47] = amd_bytealign_S (w[ 5], w[ 6], offset); w[46] = amd_bytealign_S (w[ 4], w[ 5], offset); w[45] = amd_bytealign_S (w[ 3], w[ 4], offset); w[44] = amd_bytealign_S (w[ 2], w[ 3], offset); w[43] = amd_bytealign_S (w[ 1], w[ 2], offset); w[42] = amd_bytealign_S (w[ 0], w[ 1], offset); w[41] = amd_bytealign_S ( 0, w[ 0], offset); w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 42: w[63] = amd_bytealign_S (w[20], w[21], offset); w[62] = amd_bytealign_S (w[19], w[20], offset); w[61] = amd_bytealign_S (w[18], w[19], offset); w[60] = amd_bytealign_S (w[17], w[18], offset); w[59] = amd_bytealign_S (w[16], w[17], offset); w[58] = amd_bytealign_S (w[15], w[16], offset); w[57] = amd_bytealign_S (w[14], w[15], offset); w[56] = amd_bytealign_S (w[13], w[14], offset); w[55] = amd_bytealign_S (w[12], w[13], offset); w[54] = amd_bytealign_S (w[11], w[12], offset); w[53] = amd_bytealign_S (w[10], w[11], offset); w[52] = amd_bytealign_S (w[ 9], w[10], offset); w[51] = amd_bytealign_S (w[ 8], w[ 9], offset); w[50] = amd_bytealign_S (w[ 7], w[ 8], offset); w[49] = amd_bytealign_S (w[ 6], w[ 7], offset); w[48] = amd_bytealign_S (w[ 5], w[ 6], offset); w[47] = amd_bytealign_S (w[ 4], w[ 5], offset); w[46] = amd_bytealign_S (w[ 3], w[ 4], offset); w[45] = amd_bytealign_S (w[ 2], w[ 3], offset); w[44] = amd_bytealign_S (w[ 1], w[ 2], offset); w[43] = amd_bytealign_S (w[ 0], w[ 1], offset); w[42] = amd_bytealign_S ( 0, w[ 0], offset); w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 43: w[63] = amd_bytealign_S (w[19], w[20], offset); w[62] = amd_bytealign_S (w[18], w[19], offset); w[61] = amd_bytealign_S (w[17], w[18], offset); w[60] = amd_bytealign_S (w[16], w[17], offset); w[59] = amd_bytealign_S (w[15], w[16], offset); w[58] = amd_bytealign_S (w[14], w[15], offset); w[57] = amd_bytealign_S (w[13], w[14], offset); w[56] = amd_bytealign_S (w[12], w[13], offset); w[55] = amd_bytealign_S (w[11], w[12], offset); w[54] = amd_bytealign_S (w[10], w[11], offset); w[53] = amd_bytealign_S (w[ 9], w[10], offset); w[52] = amd_bytealign_S (w[ 8], w[ 9], offset); w[51] = amd_bytealign_S (w[ 7], w[ 8], offset); w[50] = amd_bytealign_S (w[ 6], w[ 7], offset); w[49] = amd_bytealign_S (w[ 5], w[ 6], offset); w[48] = amd_bytealign_S (w[ 4], w[ 5], offset); w[47] = amd_bytealign_S (w[ 3], w[ 4], offset); w[46] = amd_bytealign_S (w[ 2], w[ 3], offset); w[45] = amd_bytealign_S (w[ 1], w[ 2], offset); w[44] = amd_bytealign_S (w[ 0], w[ 1], offset); w[43] = amd_bytealign_S ( 0, w[ 0], offset); w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 44: w[63] = amd_bytealign_S (w[18], w[19], offset); w[62] = amd_bytealign_S (w[17], w[18], offset); w[61] = amd_bytealign_S (w[16], w[17], offset); w[60] = amd_bytealign_S (w[15], w[16], offset); w[59] = amd_bytealign_S (w[14], w[15], offset); w[58] = amd_bytealign_S (w[13], w[14], offset); w[57] = amd_bytealign_S (w[12], w[13], offset); w[56] = amd_bytealign_S (w[11], w[12], offset); w[55] = amd_bytealign_S (w[10], w[11], offset); w[54] = amd_bytealign_S (w[ 9], w[10], offset); w[53] = amd_bytealign_S (w[ 8], w[ 9], offset); w[52] = amd_bytealign_S (w[ 7], w[ 8], offset); w[51] = amd_bytealign_S (w[ 6], w[ 7], offset); w[50] = amd_bytealign_S (w[ 5], w[ 6], offset); w[49] = amd_bytealign_S (w[ 4], w[ 5], offset); w[48] = amd_bytealign_S (w[ 3], w[ 4], offset); w[47] = amd_bytealign_S (w[ 2], w[ 3], offset); w[46] = amd_bytealign_S (w[ 1], w[ 2], offset); w[45] = amd_bytealign_S (w[ 0], w[ 1], offset); w[44] = amd_bytealign_S ( 0, w[ 0], offset); w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 45: w[63] = amd_bytealign_S (w[17], w[18], offset); w[62] = amd_bytealign_S (w[16], w[17], offset); w[61] = amd_bytealign_S (w[15], w[16], offset); w[60] = amd_bytealign_S (w[14], w[15], offset); w[59] = amd_bytealign_S (w[13], w[14], offset); w[58] = amd_bytealign_S (w[12], w[13], offset); w[57] = amd_bytealign_S (w[11], w[12], offset); w[56] = amd_bytealign_S (w[10], w[11], offset); w[55] = amd_bytealign_S (w[ 9], w[10], offset); w[54] = amd_bytealign_S (w[ 8], w[ 9], offset); w[53] = amd_bytealign_S (w[ 7], w[ 8], offset); w[52] = amd_bytealign_S (w[ 6], w[ 7], offset); w[51] = amd_bytealign_S (w[ 5], w[ 6], offset); w[50] = amd_bytealign_S (w[ 4], w[ 5], offset); w[49] = amd_bytealign_S (w[ 3], w[ 4], offset); w[48] = amd_bytealign_S (w[ 2], w[ 3], offset); w[47] = amd_bytealign_S (w[ 1], w[ 2], offset); w[46] = amd_bytealign_S (w[ 0], w[ 1], offset); w[45] = amd_bytealign_S ( 0, w[ 0], offset); w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 46: w[63] = amd_bytealign_S (w[16], w[17], offset); w[62] = amd_bytealign_S (w[15], w[16], offset); w[61] = amd_bytealign_S (w[14], w[15], offset); w[60] = amd_bytealign_S (w[13], w[14], offset); w[59] = amd_bytealign_S (w[12], w[13], offset); w[58] = amd_bytealign_S (w[11], w[12], offset); w[57] = amd_bytealign_S (w[10], w[11], offset); w[56] = amd_bytealign_S (w[ 9], w[10], offset); w[55] = amd_bytealign_S (w[ 8], w[ 9], offset); w[54] = amd_bytealign_S (w[ 7], w[ 8], offset); w[53] = amd_bytealign_S (w[ 6], w[ 7], offset); w[52] = amd_bytealign_S (w[ 5], w[ 6], offset); w[51] = amd_bytealign_S (w[ 4], w[ 5], offset); w[50] = amd_bytealign_S (w[ 3], w[ 4], offset); w[49] = amd_bytealign_S (w[ 2], w[ 3], offset); w[48] = amd_bytealign_S (w[ 1], w[ 2], offset); w[47] = amd_bytealign_S (w[ 0], w[ 1], offset); w[46] = amd_bytealign_S ( 0, w[ 0], offset); w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 47: w[63] = amd_bytealign_S (w[15], w[16], offset); w[62] = amd_bytealign_S (w[14], w[15], offset); w[61] = amd_bytealign_S (w[13], w[14], offset); w[60] = amd_bytealign_S (w[12], w[13], offset); w[59] = amd_bytealign_S (w[11], w[12], offset); w[58] = amd_bytealign_S (w[10], w[11], offset); w[57] = amd_bytealign_S (w[ 9], w[10], offset); w[56] = amd_bytealign_S (w[ 8], w[ 9], offset); w[55] = amd_bytealign_S (w[ 7], w[ 8], offset); w[54] = amd_bytealign_S (w[ 6], w[ 7], offset); w[53] = amd_bytealign_S (w[ 5], w[ 6], offset); w[52] = amd_bytealign_S (w[ 4], w[ 5], offset); w[51] = amd_bytealign_S (w[ 3], w[ 4], offset); w[50] = amd_bytealign_S (w[ 2], w[ 3], offset); w[49] = amd_bytealign_S (w[ 1], w[ 2], offset); w[48] = amd_bytealign_S (w[ 0], w[ 1], offset); w[47] = amd_bytealign_S ( 0, w[ 0], offset); w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 48: w[63] = amd_bytealign_S (w[14], w[15], offset); w[62] = amd_bytealign_S (w[13], w[14], offset); w[61] = amd_bytealign_S (w[12], w[13], offset); w[60] = amd_bytealign_S (w[11], w[12], offset); w[59] = amd_bytealign_S (w[10], w[11], offset); w[58] = amd_bytealign_S (w[ 9], w[10], offset); w[57] = amd_bytealign_S (w[ 8], w[ 9], offset); w[56] = amd_bytealign_S (w[ 7], w[ 8], offset); w[55] = amd_bytealign_S (w[ 6], w[ 7], offset); w[54] = amd_bytealign_S (w[ 5], w[ 6], offset); w[53] = amd_bytealign_S (w[ 4], w[ 5], offset); w[52] = amd_bytealign_S (w[ 3], w[ 4], offset); w[51] = amd_bytealign_S (w[ 2], w[ 3], offset); w[50] = amd_bytealign_S (w[ 1], w[ 2], offset); w[49] = amd_bytealign_S (w[ 0], w[ 1], offset); w[48] = amd_bytealign_S ( 0, w[ 0], offset); w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 49: w[63] = amd_bytealign_S (w[13], w[14], offset); w[62] = amd_bytealign_S (w[12], w[13], offset); w[61] = amd_bytealign_S (w[11], w[12], offset); w[60] = amd_bytealign_S (w[10], w[11], offset); w[59] = amd_bytealign_S (w[ 9], w[10], offset); w[58] = amd_bytealign_S (w[ 8], w[ 9], offset); w[57] = amd_bytealign_S (w[ 7], w[ 8], offset); w[56] = amd_bytealign_S (w[ 6], w[ 7], offset); w[55] = amd_bytealign_S (w[ 5], w[ 6], offset); w[54] = amd_bytealign_S (w[ 4], w[ 5], offset); w[53] = amd_bytealign_S (w[ 3], w[ 4], offset); w[52] = amd_bytealign_S (w[ 2], w[ 3], offset); w[51] = amd_bytealign_S (w[ 1], w[ 2], offset); w[50] = amd_bytealign_S (w[ 0], w[ 1], offset); w[49] = amd_bytealign_S ( 0, w[ 0], offset); w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 50: w[63] = amd_bytealign_S (w[12], w[13], offset); w[62] = amd_bytealign_S (w[11], w[12], offset); w[61] = amd_bytealign_S (w[10], w[11], offset); w[60] = amd_bytealign_S (w[ 9], w[10], offset); w[59] = amd_bytealign_S (w[ 8], w[ 9], offset); w[58] = amd_bytealign_S (w[ 7], w[ 8], offset); w[57] = amd_bytealign_S (w[ 6], w[ 7], offset); w[56] = amd_bytealign_S (w[ 5], w[ 6], offset); w[55] = amd_bytealign_S (w[ 4], w[ 5], offset); w[54] = amd_bytealign_S (w[ 3], w[ 4], offset); w[53] = amd_bytealign_S (w[ 2], w[ 3], offset); w[52] = amd_bytealign_S (w[ 1], w[ 2], offset); w[51] = amd_bytealign_S (w[ 0], w[ 1], offset); w[50] = amd_bytealign_S ( 0, w[ 0], offset); w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 51: w[63] = amd_bytealign_S (w[11], w[12], offset); w[62] = amd_bytealign_S (w[10], w[11], offset); w[61] = amd_bytealign_S (w[ 9], w[10], offset); w[60] = amd_bytealign_S (w[ 8], w[ 9], offset); w[59] = amd_bytealign_S (w[ 7], w[ 8], offset); w[58] = amd_bytealign_S (w[ 6], w[ 7], offset); w[57] = amd_bytealign_S (w[ 5], w[ 6], offset); w[56] = amd_bytealign_S (w[ 4], w[ 5], offset); w[55] = amd_bytealign_S (w[ 3], w[ 4], offset); w[54] = amd_bytealign_S (w[ 2], w[ 3], offset); w[53] = amd_bytealign_S (w[ 1], w[ 2], offset); w[52] = amd_bytealign_S (w[ 0], w[ 1], offset); w[51] = amd_bytealign_S ( 0, w[ 0], offset); w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 52: w[63] = amd_bytealign_S (w[10], w[11], offset); w[62] = amd_bytealign_S (w[ 9], w[10], offset); w[61] = amd_bytealign_S (w[ 8], w[ 9], offset); w[60] = amd_bytealign_S (w[ 7], w[ 8], offset); w[59] = amd_bytealign_S (w[ 6], w[ 7], offset); w[58] = amd_bytealign_S (w[ 5], w[ 6], offset); w[57] = amd_bytealign_S (w[ 4], w[ 5], offset); w[56] = amd_bytealign_S (w[ 3], w[ 4], offset); w[55] = amd_bytealign_S (w[ 2], w[ 3], offset); w[54] = amd_bytealign_S (w[ 1], w[ 2], offset); w[53] = amd_bytealign_S (w[ 0], w[ 1], offset); w[52] = amd_bytealign_S ( 0, w[ 0], offset); w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 53: w[63] = amd_bytealign_S (w[ 9], w[10], offset); w[62] = amd_bytealign_S (w[ 8], w[ 9], offset); w[61] = amd_bytealign_S (w[ 7], w[ 8], offset); w[60] = amd_bytealign_S (w[ 6], w[ 7], offset); w[59] = amd_bytealign_S (w[ 5], w[ 6], offset); w[58] = amd_bytealign_S (w[ 4], w[ 5], offset); w[57] = amd_bytealign_S (w[ 3], w[ 4], offset); w[56] = amd_bytealign_S (w[ 2], w[ 3], offset); w[55] = amd_bytealign_S (w[ 1], w[ 2], offset); w[54] = amd_bytealign_S (w[ 0], w[ 1], offset); w[53] = amd_bytealign_S ( 0, w[ 0], offset); w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 54: w[63] = amd_bytealign_S (w[ 8], w[ 9], offset); w[62] = amd_bytealign_S (w[ 7], w[ 8], offset); w[61] = amd_bytealign_S (w[ 6], w[ 7], offset); w[60] = amd_bytealign_S (w[ 5], w[ 6], offset); w[59] = amd_bytealign_S (w[ 4], w[ 5], offset); w[58] = amd_bytealign_S (w[ 3], w[ 4], offset); w[57] = amd_bytealign_S (w[ 2], w[ 3], offset); w[56] = amd_bytealign_S (w[ 1], w[ 2], offset); w[55] = amd_bytealign_S (w[ 0], w[ 1], offset); w[54] = amd_bytealign_S ( 0, w[ 0], offset); w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 55: w[63] = amd_bytealign_S (w[ 7], w[ 8], offset); w[62] = amd_bytealign_S (w[ 6], w[ 7], offset); w[61] = amd_bytealign_S (w[ 5], w[ 6], offset); w[60] = amd_bytealign_S (w[ 4], w[ 5], offset); w[59] = amd_bytealign_S (w[ 3], w[ 4], offset); w[58] = amd_bytealign_S (w[ 2], w[ 3], offset); w[57] = amd_bytealign_S (w[ 1], w[ 2], offset); w[56] = amd_bytealign_S (w[ 0], w[ 1], offset); w[55] = amd_bytealign_S ( 0, w[ 0], offset); w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 56: w[63] = amd_bytealign_S (w[ 6], w[ 7], offset); w[62] = amd_bytealign_S (w[ 5], w[ 6], offset); w[61] = amd_bytealign_S (w[ 4], w[ 5], offset); w[60] = amd_bytealign_S (w[ 3], w[ 4], offset); w[59] = amd_bytealign_S (w[ 2], w[ 3], offset); w[58] = amd_bytealign_S (w[ 1], w[ 2], offset); w[57] = amd_bytealign_S (w[ 0], w[ 1], offset); w[56] = amd_bytealign_S ( 0, w[ 0], offset); w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 57: w[63] = amd_bytealign_S (w[ 5], w[ 6], offset); w[62] = amd_bytealign_S (w[ 4], w[ 5], offset); w[61] = amd_bytealign_S (w[ 3], w[ 4], offset); w[60] = amd_bytealign_S (w[ 2], w[ 3], offset); w[59] = amd_bytealign_S (w[ 1], w[ 2], offset); w[58] = amd_bytealign_S (w[ 0], w[ 1], offset); w[57] = amd_bytealign_S ( 0, w[ 0], offset); w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 58: w[63] = amd_bytealign_S (w[ 4], w[ 5], offset); w[62] = amd_bytealign_S (w[ 3], w[ 4], offset); w[61] = amd_bytealign_S (w[ 2], w[ 3], offset); w[60] = amd_bytealign_S (w[ 1], w[ 2], offset); w[59] = amd_bytealign_S (w[ 0], w[ 1], offset); w[58] = amd_bytealign_S ( 0, w[ 0], offset); w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 59: w[63] = amd_bytealign_S (w[ 3], w[ 4], offset); w[62] = amd_bytealign_S (w[ 2], w[ 3], offset); w[61] = amd_bytealign_S (w[ 1], w[ 2], offset); w[60] = amd_bytealign_S (w[ 0], w[ 1], offset); w[59] = amd_bytealign_S ( 0, w[ 0], offset); w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 60: w[63] = amd_bytealign_S (w[ 2], w[ 3], offset); w[62] = amd_bytealign_S (w[ 1], w[ 2], offset); w[61] = amd_bytealign_S (w[ 0], w[ 1], offset); w[60] = amd_bytealign_S ( 0, w[ 0], offset); w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 61: w[63] = amd_bytealign_S (w[ 1], w[ 2], offset); w[62] = amd_bytealign_S (w[ 0], w[ 1], offset); w[61] = amd_bytealign_S ( 0, w[ 0], offset); w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 62: w[63] = amd_bytealign_S (w[ 0], w[ 1], offset); w[62] = amd_bytealign_S ( 0, w[ 0], offset); w[61] = 0; w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 63: w[63] = amd_bytealign_S ( 0, w[ 0], offset); w[62] = 0; w[61] = 0; w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; } #pragma unroll for (int i = 0; i < 64; i++) w[i] = swap32_S (w[i]); #endif #if (defined IS_AMD && AMD_GCN >= 3) || defined IS_NV #if defined IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; #endif #if defined IS_AMD const int selector = 0x0706050403020100 >> (offset_minus_4 * 8); #endif switch (offset_switch) { case 0: w[63] = __byte_perm_S (w[62], w[63], selector); w[62] = __byte_perm_S (w[61], w[62], selector); w[61] = __byte_perm_S (w[60], w[61], selector); w[60] = __byte_perm_S (w[59], w[60], selector); w[59] = __byte_perm_S (w[58], w[59], selector); w[58] = __byte_perm_S (w[57], w[58], selector); w[57] = __byte_perm_S (w[56], w[57], selector); w[56] = __byte_perm_S (w[55], w[56], selector); w[55] = __byte_perm_S (w[54], w[55], selector); w[54] = __byte_perm_S (w[53], w[54], selector); w[53] = __byte_perm_S (w[52], w[53], selector); w[52] = __byte_perm_S (w[51], w[52], selector); w[51] = __byte_perm_S (w[50], w[51], selector); w[50] = __byte_perm_S (w[49], w[50], selector); w[49] = __byte_perm_S (w[48], w[49], selector); w[48] = __byte_perm_S (w[47], w[48], selector); w[47] = __byte_perm_S (w[46], w[47], selector); w[46] = __byte_perm_S (w[45], w[46], selector); w[45] = __byte_perm_S (w[44], w[45], selector); w[44] = __byte_perm_S (w[43], w[44], selector); w[43] = __byte_perm_S (w[42], w[43], selector); w[42] = __byte_perm_S (w[41], w[42], selector); w[41] = __byte_perm_S (w[40], w[41], selector); w[40] = __byte_perm_S (w[39], w[40], selector); w[39] = __byte_perm_S (w[38], w[39], selector); w[38] = __byte_perm_S (w[37], w[38], selector); w[37] = __byte_perm_S (w[36], w[37], selector); w[36] = __byte_perm_S (w[35], w[36], selector); w[35] = __byte_perm_S (w[34], w[35], selector); w[34] = __byte_perm_S (w[33], w[34], selector); w[33] = __byte_perm_S (w[32], w[33], selector); w[32] = __byte_perm_S (w[31], w[32], selector); w[31] = __byte_perm_S (w[30], w[31], selector); w[30] = __byte_perm_S (w[29], w[30], selector); w[29] = __byte_perm_S (w[28], w[29], selector); w[28] = __byte_perm_S (w[27], w[28], selector); w[27] = __byte_perm_S (w[26], w[27], selector); w[26] = __byte_perm_S (w[25], w[26], selector); w[25] = __byte_perm_S (w[24], w[25], selector); w[24] = __byte_perm_S (w[23], w[24], selector); w[23] = __byte_perm_S (w[22], w[23], selector); w[22] = __byte_perm_S (w[21], w[22], selector); w[21] = __byte_perm_S (w[20], w[21], selector); w[20] = __byte_perm_S (w[19], w[20], selector); w[19] = __byte_perm_S (w[18], w[19], selector); w[18] = __byte_perm_S (w[17], w[18], selector); w[17] = __byte_perm_S (w[16], w[17], selector); w[16] = __byte_perm_S (w[15], w[16], selector); w[15] = __byte_perm_S (w[14], w[15], selector); w[14] = __byte_perm_S (w[13], w[14], selector); w[13] = __byte_perm_S (w[12], w[13], selector); w[12] = __byte_perm_S (w[11], w[12], selector); w[11] = __byte_perm_S (w[10], w[11], selector); w[10] = __byte_perm_S (w[ 9], w[10], selector); w[ 9] = __byte_perm_S (w[ 8], w[ 9], selector); w[ 8] = __byte_perm_S (w[ 7], w[ 8], selector); w[ 7] = __byte_perm_S (w[ 6], w[ 7], selector); w[ 6] = __byte_perm_S (w[ 5], w[ 6], selector); w[ 5] = __byte_perm_S (w[ 4], w[ 5], selector); w[ 4] = __byte_perm_S (w[ 3], w[ 4], selector); w[ 3] = __byte_perm_S (w[ 2], w[ 3], selector); w[ 2] = __byte_perm_S (w[ 1], w[ 2], selector); w[ 1] = __byte_perm_S (w[ 0], w[ 1], selector); w[ 0] = __byte_perm_S ( 0, w[ 0], selector); break; case 1: w[63] = __byte_perm_S (w[61], w[62], selector); w[62] = __byte_perm_S (w[60], w[61], selector); w[61] = __byte_perm_S (w[59], w[60], selector); w[60] = __byte_perm_S (w[58], w[59], selector); w[59] = __byte_perm_S (w[57], w[58], selector); w[58] = __byte_perm_S (w[56], w[57], selector); w[57] = __byte_perm_S (w[55], w[56], selector); w[56] = __byte_perm_S (w[54], w[55], selector); w[55] = __byte_perm_S (w[53], w[54], selector); w[54] = __byte_perm_S (w[52], w[53], selector); w[53] = __byte_perm_S (w[51], w[52], selector); w[52] = __byte_perm_S (w[50], w[51], selector); w[51] = __byte_perm_S (w[49], w[50], selector); w[50] = __byte_perm_S (w[48], w[49], selector); w[49] = __byte_perm_S (w[47], w[48], selector); w[48] = __byte_perm_S (w[46], w[47], selector); w[47] = __byte_perm_S (w[45], w[46], selector); w[46] = __byte_perm_S (w[44], w[45], selector); w[45] = __byte_perm_S (w[43], w[44], selector); w[44] = __byte_perm_S (w[42], w[43], selector); w[43] = __byte_perm_S (w[41], w[42], selector); w[42] = __byte_perm_S (w[40], w[41], selector); w[41] = __byte_perm_S (w[39], w[40], selector); w[40] = __byte_perm_S (w[38], w[39], selector); w[39] = __byte_perm_S (w[37], w[38], selector); w[38] = __byte_perm_S (w[36], w[37], selector); w[37] = __byte_perm_S (w[35], w[36], selector); w[36] = __byte_perm_S (w[34], w[35], selector); w[35] = __byte_perm_S (w[33], w[34], selector); w[34] = __byte_perm_S (w[32], w[33], selector); w[33] = __byte_perm_S (w[31], w[32], selector); w[32] = __byte_perm_S (w[30], w[31], selector); w[31] = __byte_perm_S (w[29], w[30], selector); w[30] = __byte_perm_S (w[28], w[29], selector); w[29] = __byte_perm_S (w[27], w[28], selector); w[28] = __byte_perm_S (w[26], w[27], selector); w[27] = __byte_perm_S (w[25], w[26], selector); w[26] = __byte_perm_S (w[24], w[25], selector); w[25] = __byte_perm_S (w[23], w[24], selector); w[24] = __byte_perm_S (w[22], w[23], selector); w[23] = __byte_perm_S (w[21], w[22], selector); w[22] = __byte_perm_S (w[20], w[21], selector); w[21] = __byte_perm_S (w[19], w[20], selector); w[20] = __byte_perm_S (w[18], w[19], selector); w[19] = __byte_perm_S (w[17], w[18], selector); w[18] = __byte_perm_S (w[16], w[17], selector); w[17] = __byte_perm_S (w[15], w[16], selector); w[16] = __byte_perm_S (w[14], w[15], selector); w[15] = __byte_perm_S (w[13], w[14], selector); w[14] = __byte_perm_S (w[12], w[13], selector); w[13] = __byte_perm_S (w[11], w[12], selector); w[12] = __byte_perm_S (w[10], w[11], selector); w[11] = __byte_perm_S (w[ 9], w[10], selector); w[10] = __byte_perm_S (w[ 8], w[ 9], selector); w[ 9] = __byte_perm_S (w[ 7], w[ 8], selector); w[ 8] = __byte_perm_S (w[ 6], w[ 7], selector); w[ 7] = __byte_perm_S (w[ 5], w[ 6], selector); w[ 6] = __byte_perm_S (w[ 4], w[ 5], selector); w[ 5] = __byte_perm_S (w[ 3], w[ 4], selector); w[ 4] = __byte_perm_S (w[ 2], w[ 3], selector); w[ 3] = __byte_perm_S (w[ 1], w[ 2], selector); w[ 2] = __byte_perm_S (w[ 0], w[ 1], selector); w[ 1] = __byte_perm_S ( 0, w[ 0], selector); w[ 0] = 0; break; case 2: w[63] = __byte_perm_S (w[60], w[61], selector); w[62] = __byte_perm_S (w[59], w[60], selector); w[61] = __byte_perm_S (w[58], w[59], selector); w[60] = __byte_perm_S (w[57], w[58], selector); w[59] = __byte_perm_S (w[56], w[57], selector); w[58] = __byte_perm_S (w[55], w[56], selector); w[57] = __byte_perm_S (w[54], w[55], selector); w[56] = __byte_perm_S (w[53], w[54], selector); w[55] = __byte_perm_S (w[52], w[53], selector); w[54] = __byte_perm_S (w[51], w[52], selector); w[53] = __byte_perm_S (w[50], w[51], selector); w[52] = __byte_perm_S (w[49], w[50], selector); w[51] = __byte_perm_S (w[48], w[49], selector); w[50] = __byte_perm_S (w[47], w[48], selector); w[49] = __byte_perm_S (w[46], w[47], selector); w[48] = __byte_perm_S (w[45], w[46], selector); w[47] = __byte_perm_S (w[44], w[45], selector); w[46] = __byte_perm_S (w[43], w[44], selector); w[45] = __byte_perm_S (w[42], w[43], selector); w[44] = __byte_perm_S (w[41], w[42], selector); w[43] = __byte_perm_S (w[40], w[41], selector); w[42] = __byte_perm_S (w[39], w[40], selector); w[41] = __byte_perm_S (w[38], w[39], selector); w[40] = __byte_perm_S (w[37], w[38], selector); w[39] = __byte_perm_S (w[36], w[37], selector); w[38] = __byte_perm_S (w[35], w[36], selector); w[37] = __byte_perm_S (w[34], w[35], selector); w[36] = __byte_perm_S (w[33], w[34], selector); w[35] = __byte_perm_S (w[32], w[33], selector); w[34] = __byte_perm_S (w[31], w[32], selector); w[33] = __byte_perm_S (w[30], w[31], selector); w[32] = __byte_perm_S (w[29], w[30], selector); w[31] = __byte_perm_S (w[28], w[29], selector); w[30] = __byte_perm_S (w[27], w[28], selector); w[29] = __byte_perm_S (w[26], w[27], selector); w[28] = __byte_perm_S (w[25], w[26], selector); w[27] = __byte_perm_S (w[24], w[25], selector); w[26] = __byte_perm_S (w[23], w[24], selector); w[25] = __byte_perm_S (w[22], w[23], selector); w[24] = __byte_perm_S (w[21], w[22], selector); w[23] = __byte_perm_S (w[20], w[21], selector); w[22] = __byte_perm_S (w[19], w[20], selector); w[21] = __byte_perm_S (w[18], w[19], selector); w[20] = __byte_perm_S (w[17], w[18], selector); w[19] = __byte_perm_S (w[16], w[17], selector); w[18] = __byte_perm_S (w[15], w[16], selector); w[17] = __byte_perm_S (w[14], w[15], selector); w[16] = __byte_perm_S (w[13], w[14], selector); w[15] = __byte_perm_S (w[12], w[13], selector); w[14] = __byte_perm_S (w[11], w[12], selector); w[13] = __byte_perm_S (w[10], w[11], selector); w[12] = __byte_perm_S (w[ 9], w[10], selector); w[11] = __byte_perm_S (w[ 8], w[ 9], selector); w[10] = __byte_perm_S (w[ 7], w[ 8], selector); w[ 9] = __byte_perm_S (w[ 6], w[ 7], selector); w[ 8] = __byte_perm_S (w[ 5], w[ 6], selector); w[ 7] = __byte_perm_S (w[ 4], w[ 5], selector); w[ 6] = __byte_perm_S (w[ 3], w[ 4], selector); w[ 5] = __byte_perm_S (w[ 2], w[ 3], selector); w[ 4] = __byte_perm_S (w[ 1], w[ 2], selector); w[ 3] = __byte_perm_S (w[ 0], w[ 1], selector); w[ 2] = __byte_perm_S ( 0, w[ 0], selector); w[ 1] = 0; w[ 0] = 0; break; case 3: w[63] = __byte_perm_S (w[59], w[60], selector); w[62] = __byte_perm_S (w[58], w[59], selector); w[61] = __byte_perm_S (w[57], w[58], selector); w[60] = __byte_perm_S (w[56], w[57], selector); w[59] = __byte_perm_S (w[55], w[56], selector); w[58] = __byte_perm_S (w[54], w[55], selector); w[57] = __byte_perm_S (w[53], w[54], selector); w[56] = __byte_perm_S (w[52], w[53], selector); w[55] = __byte_perm_S (w[51], w[52], selector); w[54] = __byte_perm_S (w[50], w[51], selector); w[53] = __byte_perm_S (w[49], w[50], selector); w[52] = __byte_perm_S (w[48], w[49], selector); w[51] = __byte_perm_S (w[47], w[48], selector); w[50] = __byte_perm_S (w[46], w[47], selector); w[49] = __byte_perm_S (w[45], w[46], selector); w[48] = __byte_perm_S (w[44], w[45], selector); w[47] = __byte_perm_S (w[43], w[44], selector); w[46] = __byte_perm_S (w[42], w[43], selector); w[45] = __byte_perm_S (w[41], w[42], selector); w[44] = __byte_perm_S (w[40], w[41], selector); w[43] = __byte_perm_S (w[39], w[40], selector); w[42] = __byte_perm_S (w[38], w[39], selector); w[41] = __byte_perm_S (w[37], w[38], selector); w[40] = __byte_perm_S (w[36], w[37], selector); w[39] = __byte_perm_S (w[35], w[36], selector); w[38] = __byte_perm_S (w[34], w[35], selector); w[37] = __byte_perm_S (w[33], w[34], selector); w[36] = __byte_perm_S (w[32], w[33], selector); w[35] = __byte_perm_S (w[31], w[32], selector); w[34] = __byte_perm_S (w[30], w[31], selector); w[33] = __byte_perm_S (w[29], w[30], selector); w[32] = __byte_perm_S (w[28], w[29], selector); w[31] = __byte_perm_S (w[27], w[28], selector); w[30] = __byte_perm_S (w[26], w[27], selector); w[29] = __byte_perm_S (w[25], w[26], selector); w[28] = __byte_perm_S (w[24], w[25], selector); w[27] = __byte_perm_S (w[23], w[24], selector); w[26] = __byte_perm_S (w[22], w[23], selector); w[25] = __byte_perm_S (w[21], w[22], selector); w[24] = __byte_perm_S (w[20], w[21], selector); w[23] = __byte_perm_S (w[19], w[20], selector); w[22] = __byte_perm_S (w[18], w[19], selector); w[21] = __byte_perm_S (w[17], w[18], selector); w[20] = __byte_perm_S (w[16], w[17], selector); w[19] = __byte_perm_S (w[15], w[16], selector); w[18] = __byte_perm_S (w[14], w[15], selector); w[17] = __byte_perm_S (w[13], w[14], selector); w[16] = __byte_perm_S (w[12], w[13], selector); w[15] = __byte_perm_S (w[11], w[12], selector); w[14] = __byte_perm_S (w[10], w[11], selector); w[13] = __byte_perm_S (w[ 9], w[10], selector); w[12] = __byte_perm_S (w[ 8], w[ 9], selector); w[11] = __byte_perm_S (w[ 7], w[ 8], selector); w[10] = __byte_perm_S (w[ 6], w[ 7], selector); w[ 9] = __byte_perm_S (w[ 5], w[ 6], selector); w[ 8] = __byte_perm_S (w[ 4], w[ 5], selector); w[ 7] = __byte_perm_S (w[ 3], w[ 4], selector); w[ 6] = __byte_perm_S (w[ 2], w[ 3], selector); w[ 5] = __byte_perm_S (w[ 1], w[ 2], selector); w[ 4] = __byte_perm_S (w[ 0], w[ 1], selector); w[ 3] = __byte_perm_S ( 0, w[ 0], selector); w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 4: w[63] = __byte_perm_S (w[58], w[59], selector); w[62] = __byte_perm_S (w[57], w[58], selector); w[61] = __byte_perm_S (w[56], w[57], selector); w[60] = __byte_perm_S (w[55], w[56], selector); w[59] = __byte_perm_S (w[54], w[55], selector); w[58] = __byte_perm_S (w[53], w[54], selector); w[57] = __byte_perm_S (w[52], w[53], selector); w[56] = __byte_perm_S (w[51], w[52], selector); w[55] = __byte_perm_S (w[50], w[51], selector); w[54] = __byte_perm_S (w[49], w[50], selector); w[53] = __byte_perm_S (w[48], w[49], selector); w[52] = __byte_perm_S (w[47], w[48], selector); w[51] = __byte_perm_S (w[46], w[47], selector); w[50] = __byte_perm_S (w[45], w[46], selector); w[49] = __byte_perm_S (w[44], w[45], selector); w[48] = __byte_perm_S (w[43], w[44], selector); w[47] = __byte_perm_S (w[42], w[43], selector); w[46] = __byte_perm_S (w[41], w[42], selector); w[45] = __byte_perm_S (w[40], w[41], selector); w[44] = __byte_perm_S (w[39], w[40], selector); w[43] = __byte_perm_S (w[38], w[39], selector); w[42] = __byte_perm_S (w[37], w[38], selector); w[41] = __byte_perm_S (w[36], w[37], selector); w[40] = __byte_perm_S (w[35], w[36], selector); w[39] = __byte_perm_S (w[34], w[35], selector); w[38] = __byte_perm_S (w[33], w[34], selector); w[37] = __byte_perm_S (w[32], w[33], selector); w[36] = __byte_perm_S (w[31], w[32], selector); w[35] = __byte_perm_S (w[30], w[31], selector); w[34] = __byte_perm_S (w[29], w[30], selector); w[33] = __byte_perm_S (w[28], w[29], selector); w[32] = __byte_perm_S (w[27], w[28], selector); w[31] = __byte_perm_S (w[26], w[27], selector); w[30] = __byte_perm_S (w[25], w[26], selector); w[29] = __byte_perm_S (w[24], w[25], selector); w[28] = __byte_perm_S (w[23], w[24], selector); w[27] = __byte_perm_S (w[22], w[23], selector); w[26] = __byte_perm_S (w[21], w[22], selector); w[25] = __byte_perm_S (w[20], w[21], selector); w[24] = __byte_perm_S (w[19], w[20], selector); w[23] = __byte_perm_S (w[18], w[19], selector); w[22] = __byte_perm_S (w[17], w[18], selector); w[21] = __byte_perm_S (w[16], w[17], selector); w[20] = __byte_perm_S (w[15], w[16], selector); w[19] = __byte_perm_S (w[14], w[15], selector); w[18] = __byte_perm_S (w[13], w[14], selector); w[17] = __byte_perm_S (w[12], w[13], selector); w[16] = __byte_perm_S (w[11], w[12], selector); w[15] = __byte_perm_S (w[10], w[11], selector); w[14] = __byte_perm_S (w[ 9], w[10], selector); w[13] = __byte_perm_S (w[ 8], w[ 9], selector); w[12] = __byte_perm_S (w[ 7], w[ 8], selector); w[11] = __byte_perm_S (w[ 6], w[ 7], selector); w[10] = __byte_perm_S (w[ 5], w[ 6], selector); w[ 9] = __byte_perm_S (w[ 4], w[ 5], selector); w[ 8] = __byte_perm_S (w[ 3], w[ 4], selector); w[ 7] = __byte_perm_S (w[ 2], w[ 3], selector); w[ 6] = __byte_perm_S (w[ 1], w[ 2], selector); w[ 5] = __byte_perm_S (w[ 0], w[ 1], selector); w[ 4] = __byte_perm_S ( 0, w[ 0], selector); w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 5: w[63] = __byte_perm_S (w[57], w[58], selector); w[62] = __byte_perm_S (w[56], w[57], selector); w[61] = __byte_perm_S (w[55], w[56], selector); w[60] = __byte_perm_S (w[54], w[55], selector); w[59] = __byte_perm_S (w[53], w[54], selector); w[58] = __byte_perm_S (w[52], w[53], selector); w[57] = __byte_perm_S (w[51], w[52], selector); w[56] = __byte_perm_S (w[50], w[51], selector); w[55] = __byte_perm_S (w[49], w[50], selector); w[54] = __byte_perm_S (w[48], w[49], selector); w[53] = __byte_perm_S (w[47], w[48], selector); w[52] = __byte_perm_S (w[46], w[47], selector); w[51] = __byte_perm_S (w[45], w[46], selector); w[50] = __byte_perm_S (w[44], w[45], selector); w[49] = __byte_perm_S (w[43], w[44], selector); w[48] = __byte_perm_S (w[42], w[43], selector); w[47] = __byte_perm_S (w[41], w[42], selector); w[46] = __byte_perm_S (w[40], w[41], selector); w[45] = __byte_perm_S (w[39], w[40], selector); w[44] = __byte_perm_S (w[38], w[39], selector); w[43] = __byte_perm_S (w[37], w[38], selector); w[42] = __byte_perm_S (w[36], w[37], selector); w[41] = __byte_perm_S (w[35], w[36], selector); w[40] = __byte_perm_S (w[34], w[35], selector); w[39] = __byte_perm_S (w[33], w[34], selector); w[38] = __byte_perm_S (w[32], w[33], selector); w[37] = __byte_perm_S (w[31], w[32], selector); w[36] = __byte_perm_S (w[30], w[31], selector); w[35] = __byte_perm_S (w[29], w[30], selector); w[34] = __byte_perm_S (w[28], w[29], selector); w[33] = __byte_perm_S (w[27], w[28], selector); w[32] = __byte_perm_S (w[26], w[27], selector); w[31] = __byte_perm_S (w[25], w[26], selector); w[30] = __byte_perm_S (w[24], w[25], selector); w[29] = __byte_perm_S (w[23], w[24], selector); w[28] = __byte_perm_S (w[22], w[23], selector); w[27] = __byte_perm_S (w[21], w[22], selector); w[26] = __byte_perm_S (w[20], w[21], selector); w[25] = __byte_perm_S (w[19], w[20], selector); w[24] = __byte_perm_S (w[18], w[19], selector); w[23] = __byte_perm_S (w[17], w[18], selector); w[22] = __byte_perm_S (w[16], w[17], selector); w[21] = __byte_perm_S (w[15], w[16], selector); w[20] = __byte_perm_S (w[14], w[15], selector); w[19] = __byte_perm_S (w[13], w[14], selector); w[18] = __byte_perm_S (w[12], w[13], selector); w[17] = __byte_perm_S (w[11], w[12], selector); w[16] = __byte_perm_S (w[10], w[11], selector); w[15] = __byte_perm_S (w[ 9], w[10], selector); w[14] = __byte_perm_S (w[ 8], w[ 9], selector); w[13] = __byte_perm_S (w[ 7], w[ 8], selector); w[12] = __byte_perm_S (w[ 6], w[ 7], selector); w[11] = __byte_perm_S (w[ 5], w[ 6], selector); w[10] = __byte_perm_S (w[ 4], w[ 5], selector); w[ 9] = __byte_perm_S (w[ 3], w[ 4], selector); w[ 8] = __byte_perm_S (w[ 2], w[ 3], selector); w[ 7] = __byte_perm_S (w[ 1], w[ 2], selector); w[ 6] = __byte_perm_S (w[ 0], w[ 1], selector); w[ 5] = __byte_perm_S ( 0, w[ 0], selector); w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 6: w[63] = __byte_perm_S (w[56], w[57], selector); w[62] = __byte_perm_S (w[55], w[56], selector); w[61] = __byte_perm_S (w[54], w[55], selector); w[60] = __byte_perm_S (w[53], w[54], selector); w[59] = __byte_perm_S (w[52], w[53], selector); w[58] = __byte_perm_S (w[51], w[52], selector); w[57] = __byte_perm_S (w[50], w[51], selector); w[56] = __byte_perm_S (w[49], w[50], selector); w[55] = __byte_perm_S (w[48], w[49], selector); w[54] = __byte_perm_S (w[47], w[48], selector); w[53] = __byte_perm_S (w[46], w[47], selector); w[52] = __byte_perm_S (w[45], w[46], selector); w[51] = __byte_perm_S (w[44], w[45], selector); w[50] = __byte_perm_S (w[43], w[44], selector); w[49] = __byte_perm_S (w[42], w[43], selector); w[48] = __byte_perm_S (w[41], w[42], selector); w[47] = __byte_perm_S (w[40], w[41], selector); w[46] = __byte_perm_S (w[39], w[40], selector); w[45] = __byte_perm_S (w[38], w[39], selector); w[44] = __byte_perm_S (w[37], w[38], selector); w[43] = __byte_perm_S (w[36], w[37], selector); w[42] = __byte_perm_S (w[35], w[36], selector); w[41] = __byte_perm_S (w[34], w[35], selector); w[40] = __byte_perm_S (w[33], w[34], selector); w[39] = __byte_perm_S (w[32], w[33], selector); w[38] = __byte_perm_S (w[31], w[32], selector); w[37] = __byte_perm_S (w[30], w[31], selector); w[36] = __byte_perm_S (w[29], w[30], selector); w[35] = __byte_perm_S (w[28], w[29], selector); w[34] = __byte_perm_S (w[27], w[28], selector); w[33] = __byte_perm_S (w[26], w[27], selector); w[32] = __byte_perm_S (w[25], w[26], selector); w[31] = __byte_perm_S (w[24], w[25], selector); w[30] = __byte_perm_S (w[23], w[24], selector); w[29] = __byte_perm_S (w[22], w[23], selector); w[28] = __byte_perm_S (w[21], w[22], selector); w[27] = __byte_perm_S (w[20], w[21], selector); w[26] = __byte_perm_S (w[19], w[20], selector); w[25] = __byte_perm_S (w[18], w[19], selector); w[24] = __byte_perm_S (w[17], w[18], selector); w[23] = __byte_perm_S (w[16], w[17], selector); w[22] = __byte_perm_S (w[15], w[16], selector); w[21] = __byte_perm_S (w[14], w[15], selector); w[20] = __byte_perm_S (w[13], w[14], selector); w[19] = __byte_perm_S (w[12], w[13], selector); w[18] = __byte_perm_S (w[11], w[12], selector); w[17] = __byte_perm_S (w[10], w[11], selector); w[16] = __byte_perm_S (w[ 9], w[10], selector); w[15] = __byte_perm_S (w[ 8], w[ 9], selector); w[14] = __byte_perm_S (w[ 7], w[ 8], selector); w[13] = __byte_perm_S (w[ 6], w[ 7], selector); w[12] = __byte_perm_S (w[ 5], w[ 6], selector); w[11] = __byte_perm_S (w[ 4], w[ 5], selector); w[10] = __byte_perm_S (w[ 3], w[ 4], selector); w[ 9] = __byte_perm_S (w[ 2], w[ 3], selector); w[ 8] = __byte_perm_S (w[ 1], w[ 2], selector); w[ 7] = __byte_perm_S (w[ 0], w[ 1], selector); w[ 6] = __byte_perm_S ( 0, w[ 0], selector); w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 7: w[63] = __byte_perm_S (w[55], w[56], selector); w[62] = __byte_perm_S (w[54], w[55], selector); w[61] = __byte_perm_S (w[53], w[54], selector); w[60] = __byte_perm_S (w[52], w[53], selector); w[59] = __byte_perm_S (w[51], w[52], selector); w[58] = __byte_perm_S (w[50], w[51], selector); w[57] = __byte_perm_S (w[49], w[50], selector); w[56] = __byte_perm_S (w[48], w[49], selector); w[55] = __byte_perm_S (w[47], w[48], selector); w[54] = __byte_perm_S (w[46], w[47], selector); w[53] = __byte_perm_S (w[45], w[46], selector); w[52] = __byte_perm_S (w[44], w[45], selector); w[51] = __byte_perm_S (w[43], w[44], selector); w[50] = __byte_perm_S (w[42], w[43], selector); w[49] = __byte_perm_S (w[41], w[42], selector); w[48] = __byte_perm_S (w[40], w[41], selector); w[47] = __byte_perm_S (w[39], w[40], selector); w[46] = __byte_perm_S (w[38], w[39], selector); w[45] = __byte_perm_S (w[37], w[38], selector); w[44] = __byte_perm_S (w[36], w[37], selector); w[43] = __byte_perm_S (w[35], w[36], selector); w[42] = __byte_perm_S (w[34], w[35], selector); w[41] = __byte_perm_S (w[33], w[34], selector); w[40] = __byte_perm_S (w[32], w[33], selector); w[39] = __byte_perm_S (w[31], w[32], selector); w[38] = __byte_perm_S (w[30], w[31], selector); w[37] = __byte_perm_S (w[29], w[30], selector); w[36] = __byte_perm_S (w[28], w[29], selector); w[35] = __byte_perm_S (w[27], w[28], selector); w[34] = __byte_perm_S (w[26], w[27], selector); w[33] = __byte_perm_S (w[25], w[26], selector); w[32] = __byte_perm_S (w[24], w[25], selector); w[31] = __byte_perm_S (w[23], w[24], selector); w[30] = __byte_perm_S (w[22], w[23], selector); w[29] = __byte_perm_S (w[21], w[22], selector); w[28] = __byte_perm_S (w[20], w[21], selector); w[27] = __byte_perm_S (w[19], w[20], selector); w[26] = __byte_perm_S (w[18], w[19], selector); w[25] = __byte_perm_S (w[17], w[18], selector); w[24] = __byte_perm_S (w[16], w[17], selector); w[23] = __byte_perm_S (w[15], w[16], selector); w[22] = __byte_perm_S (w[14], w[15], selector); w[21] = __byte_perm_S (w[13], w[14], selector); w[20] = __byte_perm_S (w[12], w[13], selector); w[19] = __byte_perm_S (w[11], w[12], selector); w[18] = __byte_perm_S (w[10], w[11], selector); w[17] = __byte_perm_S (w[ 9], w[10], selector); w[16] = __byte_perm_S (w[ 8], w[ 9], selector); w[15] = __byte_perm_S (w[ 7], w[ 8], selector); w[14] = __byte_perm_S (w[ 6], w[ 7], selector); w[13] = __byte_perm_S (w[ 5], w[ 6], selector); w[12] = __byte_perm_S (w[ 4], w[ 5], selector); w[11] = __byte_perm_S (w[ 3], w[ 4], selector); w[10] = __byte_perm_S (w[ 2], w[ 3], selector); w[ 9] = __byte_perm_S (w[ 1], w[ 2], selector); w[ 8] = __byte_perm_S (w[ 0], w[ 1], selector); w[ 7] = __byte_perm_S ( 0, w[ 0], selector); w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 8: w[63] = __byte_perm_S (w[54], w[55], selector); w[62] = __byte_perm_S (w[53], w[54], selector); w[61] = __byte_perm_S (w[52], w[53], selector); w[60] = __byte_perm_S (w[51], w[52], selector); w[59] = __byte_perm_S (w[50], w[51], selector); w[58] = __byte_perm_S (w[49], w[50], selector); w[57] = __byte_perm_S (w[48], w[49], selector); w[56] = __byte_perm_S (w[47], w[48], selector); w[55] = __byte_perm_S (w[46], w[47], selector); w[54] = __byte_perm_S (w[45], w[46], selector); w[53] = __byte_perm_S (w[44], w[45], selector); w[52] = __byte_perm_S (w[43], w[44], selector); w[51] = __byte_perm_S (w[42], w[43], selector); w[50] = __byte_perm_S (w[41], w[42], selector); w[49] = __byte_perm_S (w[40], w[41], selector); w[48] = __byte_perm_S (w[39], w[40], selector); w[47] = __byte_perm_S (w[38], w[39], selector); w[46] = __byte_perm_S (w[37], w[38], selector); w[45] = __byte_perm_S (w[36], w[37], selector); w[44] = __byte_perm_S (w[35], w[36], selector); w[43] = __byte_perm_S (w[34], w[35], selector); w[42] = __byte_perm_S (w[33], w[34], selector); w[41] = __byte_perm_S (w[32], w[33], selector); w[40] = __byte_perm_S (w[31], w[32], selector); w[39] = __byte_perm_S (w[30], w[31], selector); w[38] = __byte_perm_S (w[29], w[30], selector); w[37] = __byte_perm_S (w[28], w[29], selector); w[36] = __byte_perm_S (w[27], w[28], selector); w[35] = __byte_perm_S (w[26], w[27], selector); w[34] = __byte_perm_S (w[25], w[26], selector); w[33] = __byte_perm_S (w[24], w[25], selector); w[32] = __byte_perm_S (w[23], w[24], selector); w[31] = __byte_perm_S (w[22], w[23], selector); w[30] = __byte_perm_S (w[21], w[22], selector); w[29] = __byte_perm_S (w[20], w[21], selector); w[28] = __byte_perm_S (w[19], w[20], selector); w[27] = __byte_perm_S (w[18], w[19], selector); w[26] = __byte_perm_S (w[17], w[18], selector); w[25] = __byte_perm_S (w[16], w[17], selector); w[24] = __byte_perm_S (w[15], w[16], selector); w[23] = __byte_perm_S (w[14], w[15], selector); w[22] = __byte_perm_S (w[13], w[14], selector); w[21] = __byte_perm_S (w[12], w[13], selector); w[20] = __byte_perm_S (w[11], w[12], selector); w[19] = __byte_perm_S (w[10], w[11], selector); w[18] = __byte_perm_S (w[ 9], w[10], selector); w[17] = __byte_perm_S (w[ 8], w[ 9], selector); w[16] = __byte_perm_S (w[ 7], w[ 8], selector); w[15] = __byte_perm_S (w[ 6], w[ 7], selector); w[14] = __byte_perm_S (w[ 5], w[ 6], selector); w[13] = __byte_perm_S (w[ 4], w[ 5], selector); w[12] = __byte_perm_S (w[ 3], w[ 4], selector); w[11] = __byte_perm_S (w[ 2], w[ 3], selector); w[10] = __byte_perm_S (w[ 1], w[ 2], selector); w[ 9] = __byte_perm_S (w[ 0], w[ 1], selector); w[ 8] = __byte_perm_S ( 0, w[ 0], selector); w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 9: w[63] = __byte_perm_S (w[53], w[54], selector); w[62] = __byte_perm_S (w[52], w[53], selector); w[61] = __byte_perm_S (w[51], w[52], selector); w[60] = __byte_perm_S (w[50], w[51], selector); w[59] = __byte_perm_S (w[49], w[50], selector); w[58] = __byte_perm_S (w[48], w[49], selector); w[57] = __byte_perm_S (w[47], w[48], selector); w[56] = __byte_perm_S (w[46], w[47], selector); w[55] = __byte_perm_S (w[45], w[46], selector); w[54] = __byte_perm_S (w[44], w[45], selector); w[53] = __byte_perm_S (w[43], w[44], selector); w[52] = __byte_perm_S (w[42], w[43], selector); w[51] = __byte_perm_S (w[41], w[42], selector); w[50] = __byte_perm_S (w[40], w[41], selector); w[49] = __byte_perm_S (w[39], w[40], selector); w[48] = __byte_perm_S (w[38], w[39], selector); w[47] = __byte_perm_S (w[37], w[38], selector); w[46] = __byte_perm_S (w[36], w[37], selector); w[45] = __byte_perm_S (w[35], w[36], selector); w[44] = __byte_perm_S (w[34], w[35], selector); w[43] = __byte_perm_S (w[33], w[34], selector); w[42] = __byte_perm_S (w[32], w[33], selector); w[41] = __byte_perm_S (w[31], w[32], selector); w[40] = __byte_perm_S (w[30], w[31], selector); w[39] = __byte_perm_S (w[29], w[30], selector); w[38] = __byte_perm_S (w[28], w[29], selector); w[37] = __byte_perm_S (w[27], w[28], selector); w[36] = __byte_perm_S (w[26], w[27], selector); w[35] = __byte_perm_S (w[25], w[26], selector); w[34] = __byte_perm_S (w[24], w[25], selector); w[33] = __byte_perm_S (w[23], w[24], selector); w[32] = __byte_perm_S (w[22], w[23], selector); w[31] = __byte_perm_S (w[21], w[22], selector); w[30] = __byte_perm_S (w[20], w[21], selector); w[29] = __byte_perm_S (w[19], w[20], selector); w[28] = __byte_perm_S (w[18], w[19], selector); w[27] = __byte_perm_S (w[17], w[18], selector); w[26] = __byte_perm_S (w[16], w[17], selector); w[25] = __byte_perm_S (w[15], w[16], selector); w[24] = __byte_perm_S (w[14], w[15], selector); w[23] = __byte_perm_S (w[13], w[14], selector); w[22] = __byte_perm_S (w[12], w[13], selector); w[21] = __byte_perm_S (w[11], w[12], selector); w[20] = __byte_perm_S (w[10], w[11], selector); w[19] = __byte_perm_S (w[ 9], w[10], selector); w[18] = __byte_perm_S (w[ 8], w[ 9], selector); w[17] = __byte_perm_S (w[ 7], w[ 8], selector); w[16] = __byte_perm_S (w[ 6], w[ 7], selector); w[15] = __byte_perm_S (w[ 5], w[ 6], selector); w[14] = __byte_perm_S (w[ 4], w[ 5], selector); w[13] = __byte_perm_S (w[ 3], w[ 4], selector); w[12] = __byte_perm_S (w[ 2], w[ 3], selector); w[11] = __byte_perm_S (w[ 1], w[ 2], selector); w[10] = __byte_perm_S (w[ 0], w[ 1], selector); w[ 9] = __byte_perm_S ( 0, w[ 0], selector); w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 10: w[63] = __byte_perm_S (w[52], w[53], selector); w[62] = __byte_perm_S (w[51], w[52], selector); w[61] = __byte_perm_S (w[50], w[51], selector); w[60] = __byte_perm_S (w[49], w[50], selector); w[59] = __byte_perm_S (w[48], w[49], selector); w[58] = __byte_perm_S (w[47], w[48], selector); w[57] = __byte_perm_S (w[46], w[47], selector); w[56] = __byte_perm_S (w[45], w[46], selector); w[55] = __byte_perm_S (w[44], w[45], selector); w[54] = __byte_perm_S (w[43], w[44], selector); w[53] = __byte_perm_S (w[42], w[43], selector); w[52] = __byte_perm_S (w[41], w[42], selector); w[51] = __byte_perm_S (w[40], w[41], selector); w[50] = __byte_perm_S (w[39], w[40], selector); w[49] = __byte_perm_S (w[38], w[39], selector); w[48] = __byte_perm_S (w[37], w[38], selector); w[47] = __byte_perm_S (w[36], w[37], selector); w[46] = __byte_perm_S (w[35], w[36], selector); w[45] = __byte_perm_S (w[34], w[35], selector); w[44] = __byte_perm_S (w[33], w[34], selector); w[43] = __byte_perm_S (w[32], w[33], selector); w[42] = __byte_perm_S (w[31], w[32], selector); w[41] = __byte_perm_S (w[30], w[31], selector); w[40] = __byte_perm_S (w[29], w[30], selector); w[39] = __byte_perm_S (w[28], w[29], selector); w[38] = __byte_perm_S (w[27], w[28], selector); w[37] = __byte_perm_S (w[26], w[27], selector); w[36] = __byte_perm_S (w[25], w[26], selector); w[35] = __byte_perm_S (w[24], w[25], selector); w[34] = __byte_perm_S (w[23], w[24], selector); w[33] = __byte_perm_S (w[22], w[23], selector); w[32] = __byte_perm_S (w[21], w[22], selector); w[31] = __byte_perm_S (w[20], w[21], selector); w[30] = __byte_perm_S (w[19], w[20], selector); w[29] = __byte_perm_S (w[18], w[19], selector); w[28] = __byte_perm_S (w[17], w[18], selector); w[27] = __byte_perm_S (w[16], w[17], selector); w[26] = __byte_perm_S (w[15], w[16], selector); w[25] = __byte_perm_S (w[14], w[15], selector); w[24] = __byte_perm_S (w[13], w[14], selector); w[23] = __byte_perm_S (w[12], w[13], selector); w[22] = __byte_perm_S (w[11], w[12], selector); w[21] = __byte_perm_S (w[10], w[11], selector); w[20] = __byte_perm_S (w[ 9], w[10], selector); w[19] = __byte_perm_S (w[ 8], w[ 9], selector); w[18] = __byte_perm_S (w[ 7], w[ 8], selector); w[17] = __byte_perm_S (w[ 6], w[ 7], selector); w[16] = __byte_perm_S (w[ 5], w[ 6], selector); w[15] = __byte_perm_S (w[ 4], w[ 5], selector); w[14] = __byte_perm_S (w[ 3], w[ 4], selector); w[13] = __byte_perm_S (w[ 2], w[ 3], selector); w[12] = __byte_perm_S (w[ 1], w[ 2], selector); w[11] = __byte_perm_S (w[ 0], w[ 1], selector); w[10] = __byte_perm_S ( 0, w[ 0], selector); w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 11: w[63] = __byte_perm_S (w[51], w[52], selector); w[62] = __byte_perm_S (w[50], w[51], selector); w[61] = __byte_perm_S (w[49], w[50], selector); w[60] = __byte_perm_S (w[48], w[49], selector); w[59] = __byte_perm_S (w[47], w[48], selector); w[58] = __byte_perm_S (w[46], w[47], selector); w[57] = __byte_perm_S (w[45], w[46], selector); w[56] = __byte_perm_S (w[44], w[45], selector); w[55] = __byte_perm_S (w[43], w[44], selector); w[54] = __byte_perm_S (w[42], w[43], selector); w[53] = __byte_perm_S (w[41], w[42], selector); w[52] = __byte_perm_S (w[40], w[41], selector); w[51] = __byte_perm_S (w[39], w[40], selector); w[50] = __byte_perm_S (w[38], w[39], selector); w[49] = __byte_perm_S (w[37], w[38], selector); w[48] = __byte_perm_S (w[36], w[37], selector); w[47] = __byte_perm_S (w[35], w[36], selector); w[46] = __byte_perm_S (w[34], w[35], selector); w[45] = __byte_perm_S (w[33], w[34], selector); w[44] = __byte_perm_S (w[32], w[33], selector); w[43] = __byte_perm_S (w[31], w[32], selector); w[42] = __byte_perm_S (w[30], w[31], selector); w[41] = __byte_perm_S (w[29], w[30], selector); w[40] = __byte_perm_S (w[28], w[29], selector); w[39] = __byte_perm_S (w[27], w[28], selector); w[38] = __byte_perm_S (w[26], w[27], selector); w[37] = __byte_perm_S (w[25], w[26], selector); w[36] = __byte_perm_S (w[24], w[25], selector); w[35] = __byte_perm_S (w[23], w[24], selector); w[34] = __byte_perm_S (w[22], w[23], selector); w[33] = __byte_perm_S (w[21], w[22], selector); w[32] = __byte_perm_S (w[20], w[21], selector); w[31] = __byte_perm_S (w[19], w[20], selector); w[30] = __byte_perm_S (w[18], w[19], selector); w[29] = __byte_perm_S (w[17], w[18], selector); w[28] = __byte_perm_S (w[16], w[17], selector); w[27] = __byte_perm_S (w[15], w[16], selector); w[26] = __byte_perm_S (w[14], w[15], selector); w[25] = __byte_perm_S (w[13], w[14], selector); w[24] = __byte_perm_S (w[12], w[13], selector); w[23] = __byte_perm_S (w[11], w[12], selector); w[22] = __byte_perm_S (w[10], w[11], selector); w[21] = __byte_perm_S (w[ 9], w[10], selector); w[20] = __byte_perm_S (w[ 8], w[ 9], selector); w[19] = __byte_perm_S (w[ 7], w[ 8], selector); w[18] = __byte_perm_S (w[ 6], w[ 7], selector); w[17] = __byte_perm_S (w[ 5], w[ 6], selector); w[16] = __byte_perm_S (w[ 4], w[ 5], selector); w[15] = __byte_perm_S (w[ 3], w[ 4], selector); w[14] = __byte_perm_S (w[ 2], w[ 3], selector); w[13] = __byte_perm_S (w[ 1], w[ 2], selector); w[12] = __byte_perm_S (w[ 0], w[ 1], selector); w[11] = __byte_perm_S ( 0, w[ 0], selector); w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 12: w[63] = __byte_perm_S (w[50], w[51], selector); w[62] = __byte_perm_S (w[49], w[50], selector); w[61] = __byte_perm_S (w[48], w[49], selector); w[60] = __byte_perm_S (w[47], w[48], selector); w[59] = __byte_perm_S (w[46], w[47], selector); w[58] = __byte_perm_S (w[45], w[46], selector); w[57] = __byte_perm_S (w[44], w[45], selector); w[56] = __byte_perm_S (w[43], w[44], selector); w[55] = __byte_perm_S (w[42], w[43], selector); w[54] = __byte_perm_S (w[41], w[42], selector); w[53] = __byte_perm_S (w[40], w[41], selector); w[52] = __byte_perm_S (w[39], w[40], selector); w[51] = __byte_perm_S (w[38], w[39], selector); w[50] = __byte_perm_S (w[37], w[38], selector); w[49] = __byte_perm_S (w[36], w[37], selector); w[48] = __byte_perm_S (w[35], w[36], selector); w[47] = __byte_perm_S (w[34], w[35], selector); w[46] = __byte_perm_S (w[33], w[34], selector); w[45] = __byte_perm_S (w[32], w[33], selector); w[44] = __byte_perm_S (w[31], w[32], selector); w[43] = __byte_perm_S (w[30], w[31], selector); w[42] = __byte_perm_S (w[29], w[30], selector); w[41] = __byte_perm_S (w[28], w[29], selector); w[40] = __byte_perm_S (w[27], w[28], selector); w[39] = __byte_perm_S (w[26], w[27], selector); w[38] = __byte_perm_S (w[25], w[26], selector); w[37] = __byte_perm_S (w[24], w[25], selector); w[36] = __byte_perm_S (w[23], w[24], selector); w[35] = __byte_perm_S (w[22], w[23], selector); w[34] = __byte_perm_S (w[21], w[22], selector); w[33] = __byte_perm_S (w[20], w[21], selector); w[32] = __byte_perm_S (w[19], w[20], selector); w[31] = __byte_perm_S (w[18], w[19], selector); w[30] = __byte_perm_S (w[17], w[18], selector); w[29] = __byte_perm_S (w[16], w[17], selector); w[28] = __byte_perm_S (w[15], w[16], selector); w[27] = __byte_perm_S (w[14], w[15], selector); w[26] = __byte_perm_S (w[13], w[14], selector); w[25] = __byte_perm_S (w[12], w[13], selector); w[24] = __byte_perm_S (w[11], w[12], selector); w[23] = __byte_perm_S (w[10], w[11], selector); w[22] = __byte_perm_S (w[ 9], w[10], selector); w[21] = __byte_perm_S (w[ 8], w[ 9], selector); w[20] = __byte_perm_S (w[ 7], w[ 8], selector); w[19] = __byte_perm_S (w[ 6], w[ 7], selector); w[18] = __byte_perm_S (w[ 5], w[ 6], selector); w[17] = __byte_perm_S (w[ 4], w[ 5], selector); w[16] = __byte_perm_S (w[ 3], w[ 4], selector); w[15] = __byte_perm_S (w[ 2], w[ 3], selector); w[14] = __byte_perm_S (w[ 1], w[ 2], selector); w[13] = __byte_perm_S (w[ 0], w[ 1], selector); w[12] = __byte_perm_S ( 0, w[ 0], selector); w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 13: w[63] = __byte_perm_S (w[49], w[50], selector); w[62] = __byte_perm_S (w[48], w[49], selector); w[61] = __byte_perm_S (w[47], w[48], selector); w[60] = __byte_perm_S (w[46], w[47], selector); w[59] = __byte_perm_S (w[45], w[46], selector); w[58] = __byte_perm_S (w[44], w[45], selector); w[57] = __byte_perm_S (w[43], w[44], selector); w[56] = __byte_perm_S (w[42], w[43], selector); w[55] = __byte_perm_S (w[41], w[42], selector); w[54] = __byte_perm_S (w[40], w[41], selector); w[53] = __byte_perm_S (w[39], w[40], selector); w[52] = __byte_perm_S (w[38], w[39], selector); w[51] = __byte_perm_S (w[37], w[38], selector); w[50] = __byte_perm_S (w[36], w[37], selector); w[49] = __byte_perm_S (w[35], w[36], selector); w[48] = __byte_perm_S (w[34], w[35], selector); w[47] = __byte_perm_S (w[33], w[34], selector); w[46] = __byte_perm_S (w[32], w[33], selector); w[45] = __byte_perm_S (w[31], w[32], selector); w[44] = __byte_perm_S (w[30], w[31], selector); w[43] = __byte_perm_S (w[29], w[30], selector); w[42] = __byte_perm_S (w[28], w[29], selector); w[41] = __byte_perm_S (w[27], w[28], selector); w[40] = __byte_perm_S (w[26], w[27], selector); w[39] = __byte_perm_S (w[25], w[26], selector); w[38] = __byte_perm_S (w[24], w[25], selector); w[37] = __byte_perm_S (w[23], w[24], selector); w[36] = __byte_perm_S (w[22], w[23], selector); w[35] = __byte_perm_S (w[21], w[22], selector); w[34] = __byte_perm_S (w[20], w[21], selector); w[33] = __byte_perm_S (w[19], w[20], selector); w[32] = __byte_perm_S (w[18], w[19], selector); w[31] = __byte_perm_S (w[17], w[18], selector); w[30] = __byte_perm_S (w[16], w[17], selector); w[29] = __byte_perm_S (w[15], w[16], selector); w[28] = __byte_perm_S (w[14], w[15], selector); w[27] = __byte_perm_S (w[13], w[14], selector); w[26] = __byte_perm_S (w[12], w[13], selector); w[25] = __byte_perm_S (w[11], w[12], selector); w[24] = __byte_perm_S (w[10], w[11], selector); w[23] = __byte_perm_S (w[ 9], w[10], selector); w[22] = __byte_perm_S (w[ 8], w[ 9], selector); w[21] = __byte_perm_S (w[ 7], w[ 8], selector); w[20] = __byte_perm_S (w[ 6], w[ 7], selector); w[19] = __byte_perm_S (w[ 5], w[ 6], selector); w[18] = __byte_perm_S (w[ 4], w[ 5], selector); w[17] = __byte_perm_S (w[ 3], w[ 4], selector); w[16] = __byte_perm_S (w[ 2], w[ 3], selector); w[15] = __byte_perm_S (w[ 1], w[ 2], selector); w[14] = __byte_perm_S (w[ 0], w[ 1], selector); w[13] = __byte_perm_S ( 0, w[ 0], selector); w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 14: w[63] = __byte_perm_S (w[48], w[49], selector); w[62] = __byte_perm_S (w[47], w[48], selector); w[61] = __byte_perm_S (w[46], w[47], selector); w[60] = __byte_perm_S (w[45], w[46], selector); w[59] = __byte_perm_S (w[44], w[45], selector); w[58] = __byte_perm_S (w[43], w[44], selector); w[57] = __byte_perm_S (w[42], w[43], selector); w[56] = __byte_perm_S (w[41], w[42], selector); w[55] = __byte_perm_S (w[40], w[41], selector); w[54] = __byte_perm_S (w[39], w[40], selector); w[53] = __byte_perm_S (w[38], w[39], selector); w[52] = __byte_perm_S (w[37], w[38], selector); w[51] = __byte_perm_S (w[36], w[37], selector); w[50] = __byte_perm_S (w[35], w[36], selector); w[49] = __byte_perm_S (w[34], w[35], selector); w[48] = __byte_perm_S (w[33], w[34], selector); w[47] = __byte_perm_S (w[32], w[33], selector); w[46] = __byte_perm_S (w[31], w[32], selector); w[45] = __byte_perm_S (w[30], w[31], selector); w[44] = __byte_perm_S (w[29], w[30], selector); w[43] = __byte_perm_S (w[28], w[29], selector); w[42] = __byte_perm_S (w[27], w[28], selector); w[41] = __byte_perm_S (w[26], w[27], selector); w[40] = __byte_perm_S (w[25], w[26], selector); w[39] = __byte_perm_S (w[24], w[25], selector); w[38] = __byte_perm_S (w[23], w[24], selector); w[37] = __byte_perm_S (w[22], w[23], selector); w[36] = __byte_perm_S (w[21], w[22], selector); w[35] = __byte_perm_S (w[20], w[21], selector); w[34] = __byte_perm_S (w[19], w[20], selector); w[33] = __byte_perm_S (w[18], w[19], selector); w[32] = __byte_perm_S (w[17], w[18], selector); w[31] = __byte_perm_S (w[16], w[17], selector); w[30] = __byte_perm_S (w[15], w[16], selector); w[29] = __byte_perm_S (w[14], w[15], selector); w[28] = __byte_perm_S (w[13], w[14], selector); w[27] = __byte_perm_S (w[12], w[13], selector); w[26] = __byte_perm_S (w[11], w[12], selector); w[25] = __byte_perm_S (w[10], w[11], selector); w[24] = __byte_perm_S (w[ 9], w[10], selector); w[23] = __byte_perm_S (w[ 8], w[ 9], selector); w[22] = __byte_perm_S (w[ 7], w[ 8], selector); w[21] = __byte_perm_S (w[ 6], w[ 7], selector); w[20] = __byte_perm_S (w[ 5], w[ 6], selector); w[19] = __byte_perm_S (w[ 4], w[ 5], selector); w[18] = __byte_perm_S (w[ 3], w[ 4], selector); w[17] = __byte_perm_S (w[ 2], w[ 3], selector); w[16] = __byte_perm_S (w[ 1], w[ 2], selector); w[15] = __byte_perm_S (w[ 0], w[ 1], selector); w[14] = __byte_perm_S ( 0, w[ 0], selector); w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 15: w[63] = __byte_perm_S (w[47], w[48], selector); w[62] = __byte_perm_S (w[46], w[47], selector); w[61] = __byte_perm_S (w[45], w[46], selector); w[60] = __byte_perm_S (w[44], w[45], selector); w[59] = __byte_perm_S (w[43], w[44], selector); w[58] = __byte_perm_S (w[42], w[43], selector); w[57] = __byte_perm_S (w[41], w[42], selector); w[56] = __byte_perm_S (w[40], w[41], selector); w[55] = __byte_perm_S (w[39], w[40], selector); w[54] = __byte_perm_S (w[38], w[39], selector); w[53] = __byte_perm_S (w[37], w[38], selector); w[52] = __byte_perm_S (w[36], w[37], selector); w[51] = __byte_perm_S (w[35], w[36], selector); w[50] = __byte_perm_S (w[34], w[35], selector); w[49] = __byte_perm_S (w[33], w[34], selector); w[48] = __byte_perm_S (w[32], w[33], selector); w[47] = __byte_perm_S (w[31], w[32], selector); w[46] = __byte_perm_S (w[30], w[31], selector); w[45] = __byte_perm_S (w[29], w[30], selector); w[44] = __byte_perm_S (w[28], w[29], selector); w[43] = __byte_perm_S (w[27], w[28], selector); w[42] = __byte_perm_S (w[26], w[27], selector); w[41] = __byte_perm_S (w[25], w[26], selector); w[40] = __byte_perm_S (w[24], w[25], selector); w[39] = __byte_perm_S (w[23], w[24], selector); w[38] = __byte_perm_S (w[22], w[23], selector); w[37] = __byte_perm_S (w[21], w[22], selector); w[36] = __byte_perm_S (w[20], w[21], selector); w[35] = __byte_perm_S (w[19], w[20], selector); w[34] = __byte_perm_S (w[18], w[19], selector); w[33] = __byte_perm_S (w[17], w[18], selector); w[32] = __byte_perm_S (w[16], w[17], selector); w[31] = __byte_perm_S (w[15], w[16], selector); w[30] = __byte_perm_S (w[14], w[15], selector); w[29] = __byte_perm_S (w[13], w[14], selector); w[28] = __byte_perm_S (w[12], w[13], selector); w[27] = __byte_perm_S (w[11], w[12], selector); w[26] = __byte_perm_S (w[10], w[11], selector); w[25] = __byte_perm_S (w[ 9], w[10], selector); w[24] = __byte_perm_S (w[ 8], w[ 9], selector); w[23] = __byte_perm_S (w[ 7], w[ 8], selector); w[22] = __byte_perm_S (w[ 6], w[ 7], selector); w[21] = __byte_perm_S (w[ 5], w[ 6], selector); w[20] = __byte_perm_S (w[ 4], w[ 5], selector); w[19] = __byte_perm_S (w[ 3], w[ 4], selector); w[18] = __byte_perm_S (w[ 2], w[ 3], selector); w[17] = __byte_perm_S (w[ 1], w[ 2], selector); w[16] = __byte_perm_S (w[ 0], w[ 1], selector); w[15] = __byte_perm_S ( 0, w[ 0], selector); w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 16: w[63] = __byte_perm_S (w[46], w[47], selector); w[62] = __byte_perm_S (w[45], w[46], selector); w[61] = __byte_perm_S (w[44], w[45], selector); w[60] = __byte_perm_S (w[43], w[44], selector); w[59] = __byte_perm_S (w[42], w[43], selector); w[58] = __byte_perm_S (w[41], w[42], selector); w[57] = __byte_perm_S (w[40], w[41], selector); w[56] = __byte_perm_S (w[39], w[40], selector); w[55] = __byte_perm_S (w[38], w[39], selector); w[54] = __byte_perm_S (w[37], w[38], selector); w[53] = __byte_perm_S (w[36], w[37], selector); w[52] = __byte_perm_S (w[35], w[36], selector); w[51] = __byte_perm_S (w[34], w[35], selector); w[50] = __byte_perm_S (w[33], w[34], selector); w[49] = __byte_perm_S (w[32], w[33], selector); w[48] = __byte_perm_S (w[31], w[32], selector); w[47] = __byte_perm_S (w[30], w[31], selector); w[46] = __byte_perm_S (w[29], w[30], selector); w[45] = __byte_perm_S (w[28], w[29], selector); w[44] = __byte_perm_S (w[27], w[28], selector); w[43] = __byte_perm_S (w[26], w[27], selector); w[42] = __byte_perm_S (w[25], w[26], selector); w[41] = __byte_perm_S (w[24], w[25], selector); w[40] = __byte_perm_S (w[23], w[24], selector); w[39] = __byte_perm_S (w[22], w[23], selector); w[38] = __byte_perm_S (w[21], w[22], selector); w[37] = __byte_perm_S (w[20], w[21], selector); w[36] = __byte_perm_S (w[19], w[20], selector); w[35] = __byte_perm_S (w[18], w[19], selector); w[34] = __byte_perm_S (w[17], w[18], selector); w[33] = __byte_perm_S (w[16], w[17], selector); w[32] = __byte_perm_S (w[15], w[16], selector); w[31] = __byte_perm_S (w[14], w[15], selector); w[30] = __byte_perm_S (w[13], w[14], selector); w[29] = __byte_perm_S (w[12], w[13], selector); w[28] = __byte_perm_S (w[11], w[12], selector); w[27] = __byte_perm_S (w[10], w[11], selector); w[26] = __byte_perm_S (w[ 9], w[10], selector); w[25] = __byte_perm_S (w[ 8], w[ 9], selector); w[24] = __byte_perm_S (w[ 7], w[ 8], selector); w[23] = __byte_perm_S (w[ 6], w[ 7], selector); w[22] = __byte_perm_S (w[ 5], w[ 6], selector); w[21] = __byte_perm_S (w[ 4], w[ 5], selector); w[20] = __byte_perm_S (w[ 3], w[ 4], selector); w[19] = __byte_perm_S (w[ 2], w[ 3], selector); w[18] = __byte_perm_S (w[ 1], w[ 2], selector); w[17] = __byte_perm_S (w[ 0], w[ 1], selector); w[16] = __byte_perm_S ( 0, w[ 0], selector); w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 17: w[63] = __byte_perm_S (w[45], w[46], selector); w[62] = __byte_perm_S (w[44], w[45], selector); w[61] = __byte_perm_S (w[43], w[44], selector); w[60] = __byte_perm_S (w[42], w[43], selector); w[59] = __byte_perm_S (w[41], w[42], selector); w[58] = __byte_perm_S (w[40], w[41], selector); w[57] = __byte_perm_S (w[39], w[40], selector); w[56] = __byte_perm_S (w[38], w[39], selector); w[55] = __byte_perm_S (w[37], w[38], selector); w[54] = __byte_perm_S (w[36], w[37], selector); w[53] = __byte_perm_S (w[35], w[36], selector); w[52] = __byte_perm_S (w[34], w[35], selector); w[51] = __byte_perm_S (w[33], w[34], selector); w[50] = __byte_perm_S (w[32], w[33], selector); w[49] = __byte_perm_S (w[31], w[32], selector); w[48] = __byte_perm_S (w[30], w[31], selector); w[47] = __byte_perm_S (w[29], w[30], selector); w[46] = __byte_perm_S (w[28], w[29], selector); w[45] = __byte_perm_S (w[27], w[28], selector); w[44] = __byte_perm_S (w[26], w[27], selector); w[43] = __byte_perm_S (w[25], w[26], selector); w[42] = __byte_perm_S (w[24], w[25], selector); w[41] = __byte_perm_S (w[23], w[24], selector); w[40] = __byte_perm_S (w[22], w[23], selector); w[39] = __byte_perm_S (w[21], w[22], selector); w[38] = __byte_perm_S (w[20], w[21], selector); w[37] = __byte_perm_S (w[19], w[20], selector); w[36] = __byte_perm_S (w[18], w[19], selector); w[35] = __byte_perm_S (w[17], w[18], selector); w[34] = __byte_perm_S (w[16], w[17], selector); w[33] = __byte_perm_S (w[15], w[16], selector); w[32] = __byte_perm_S (w[14], w[15], selector); w[31] = __byte_perm_S (w[13], w[14], selector); w[30] = __byte_perm_S (w[12], w[13], selector); w[29] = __byte_perm_S (w[11], w[12], selector); w[28] = __byte_perm_S (w[10], w[11], selector); w[27] = __byte_perm_S (w[ 9], w[10], selector); w[26] = __byte_perm_S (w[ 8], w[ 9], selector); w[25] = __byte_perm_S (w[ 7], w[ 8], selector); w[24] = __byte_perm_S (w[ 6], w[ 7], selector); w[23] = __byte_perm_S (w[ 5], w[ 6], selector); w[22] = __byte_perm_S (w[ 4], w[ 5], selector); w[21] = __byte_perm_S (w[ 3], w[ 4], selector); w[20] = __byte_perm_S (w[ 2], w[ 3], selector); w[19] = __byte_perm_S (w[ 1], w[ 2], selector); w[18] = __byte_perm_S (w[ 0], w[ 1], selector); w[17] = __byte_perm_S ( 0, w[ 0], selector); w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 18: w[63] = __byte_perm_S (w[44], w[45], selector); w[62] = __byte_perm_S (w[43], w[44], selector); w[61] = __byte_perm_S (w[42], w[43], selector); w[60] = __byte_perm_S (w[41], w[42], selector); w[59] = __byte_perm_S (w[40], w[41], selector); w[58] = __byte_perm_S (w[39], w[40], selector); w[57] = __byte_perm_S (w[38], w[39], selector); w[56] = __byte_perm_S (w[37], w[38], selector); w[55] = __byte_perm_S (w[36], w[37], selector); w[54] = __byte_perm_S (w[35], w[36], selector); w[53] = __byte_perm_S (w[34], w[35], selector); w[52] = __byte_perm_S (w[33], w[34], selector); w[51] = __byte_perm_S (w[32], w[33], selector); w[50] = __byte_perm_S (w[31], w[32], selector); w[49] = __byte_perm_S (w[30], w[31], selector); w[48] = __byte_perm_S (w[29], w[30], selector); w[47] = __byte_perm_S (w[28], w[29], selector); w[46] = __byte_perm_S (w[27], w[28], selector); w[45] = __byte_perm_S (w[26], w[27], selector); w[44] = __byte_perm_S (w[25], w[26], selector); w[43] = __byte_perm_S (w[24], w[25], selector); w[42] = __byte_perm_S (w[23], w[24], selector); w[41] = __byte_perm_S (w[22], w[23], selector); w[40] = __byte_perm_S (w[21], w[22], selector); w[39] = __byte_perm_S (w[20], w[21], selector); w[38] = __byte_perm_S (w[19], w[20], selector); w[37] = __byte_perm_S (w[18], w[19], selector); w[36] = __byte_perm_S (w[17], w[18], selector); w[35] = __byte_perm_S (w[16], w[17], selector); w[34] = __byte_perm_S (w[15], w[16], selector); w[33] = __byte_perm_S (w[14], w[15], selector); w[32] = __byte_perm_S (w[13], w[14], selector); w[31] = __byte_perm_S (w[12], w[13], selector); w[30] = __byte_perm_S (w[11], w[12], selector); w[29] = __byte_perm_S (w[10], w[11], selector); w[28] = __byte_perm_S (w[ 9], w[10], selector); w[27] = __byte_perm_S (w[ 8], w[ 9], selector); w[26] = __byte_perm_S (w[ 7], w[ 8], selector); w[25] = __byte_perm_S (w[ 6], w[ 7], selector); w[24] = __byte_perm_S (w[ 5], w[ 6], selector); w[23] = __byte_perm_S (w[ 4], w[ 5], selector); w[22] = __byte_perm_S (w[ 3], w[ 4], selector); w[21] = __byte_perm_S (w[ 2], w[ 3], selector); w[20] = __byte_perm_S (w[ 1], w[ 2], selector); w[19] = __byte_perm_S (w[ 0], w[ 1], selector); w[18] = __byte_perm_S ( 0, w[ 0], selector); w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 19: w[63] = __byte_perm_S (w[43], w[44], selector); w[62] = __byte_perm_S (w[42], w[43], selector); w[61] = __byte_perm_S (w[41], w[42], selector); w[60] = __byte_perm_S (w[40], w[41], selector); w[59] = __byte_perm_S (w[39], w[40], selector); w[58] = __byte_perm_S (w[38], w[39], selector); w[57] = __byte_perm_S (w[37], w[38], selector); w[56] = __byte_perm_S (w[36], w[37], selector); w[55] = __byte_perm_S (w[35], w[36], selector); w[54] = __byte_perm_S (w[34], w[35], selector); w[53] = __byte_perm_S (w[33], w[34], selector); w[52] = __byte_perm_S (w[32], w[33], selector); w[51] = __byte_perm_S (w[31], w[32], selector); w[50] = __byte_perm_S (w[30], w[31], selector); w[49] = __byte_perm_S (w[29], w[30], selector); w[48] = __byte_perm_S (w[28], w[29], selector); w[47] = __byte_perm_S (w[27], w[28], selector); w[46] = __byte_perm_S (w[26], w[27], selector); w[45] = __byte_perm_S (w[25], w[26], selector); w[44] = __byte_perm_S (w[24], w[25], selector); w[43] = __byte_perm_S (w[23], w[24], selector); w[42] = __byte_perm_S (w[22], w[23], selector); w[41] = __byte_perm_S (w[21], w[22], selector); w[40] = __byte_perm_S (w[20], w[21], selector); w[39] = __byte_perm_S (w[19], w[20], selector); w[38] = __byte_perm_S (w[18], w[19], selector); w[37] = __byte_perm_S (w[17], w[18], selector); w[36] = __byte_perm_S (w[16], w[17], selector); w[35] = __byte_perm_S (w[15], w[16], selector); w[34] = __byte_perm_S (w[14], w[15], selector); w[33] = __byte_perm_S (w[13], w[14], selector); w[32] = __byte_perm_S (w[12], w[13], selector); w[31] = __byte_perm_S (w[11], w[12], selector); w[30] = __byte_perm_S (w[10], w[11], selector); w[29] = __byte_perm_S (w[ 9], w[10], selector); w[28] = __byte_perm_S (w[ 8], w[ 9], selector); w[27] = __byte_perm_S (w[ 7], w[ 8], selector); w[26] = __byte_perm_S (w[ 6], w[ 7], selector); w[25] = __byte_perm_S (w[ 5], w[ 6], selector); w[24] = __byte_perm_S (w[ 4], w[ 5], selector); w[23] = __byte_perm_S (w[ 3], w[ 4], selector); w[22] = __byte_perm_S (w[ 2], w[ 3], selector); w[21] = __byte_perm_S (w[ 1], w[ 2], selector); w[20] = __byte_perm_S (w[ 0], w[ 1], selector); w[19] = __byte_perm_S ( 0, w[ 0], selector); w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 20: w[63] = __byte_perm_S (w[42], w[43], selector); w[62] = __byte_perm_S (w[41], w[42], selector); w[61] = __byte_perm_S (w[40], w[41], selector); w[60] = __byte_perm_S (w[39], w[40], selector); w[59] = __byte_perm_S (w[38], w[39], selector); w[58] = __byte_perm_S (w[37], w[38], selector); w[57] = __byte_perm_S (w[36], w[37], selector); w[56] = __byte_perm_S (w[35], w[36], selector); w[55] = __byte_perm_S (w[34], w[35], selector); w[54] = __byte_perm_S (w[33], w[34], selector); w[53] = __byte_perm_S (w[32], w[33], selector); w[52] = __byte_perm_S (w[31], w[32], selector); w[51] = __byte_perm_S (w[30], w[31], selector); w[50] = __byte_perm_S (w[29], w[30], selector); w[49] = __byte_perm_S (w[28], w[29], selector); w[48] = __byte_perm_S (w[27], w[28], selector); w[47] = __byte_perm_S (w[26], w[27], selector); w[46] = __byte_perm_S (w[25], w[26], selector); w[45] = __byte_perm_S (w[24], w[25], selector); w[44] = __byte_perm_S (w[23], w[24], selector); w[43] = __byte_perm_S (w[22], w[23], selector); w[42] = __byte_perm_S (w[21], w[22], selector); w[41] = __byte_perm_S (w[20], w[21], selector); w[40] = __byte_perm_S (w[19], w[20], selector); w[39] = __byte_perm_S (w[18], w[19], selector); w[38] = __byte_perm_S (w[17], w[18], selector); w[37] = __byte_perm_S (w[16], w[17], selector); w[36] = __byte_perm_S (w[15], w[16], selector); w[35] = __byte_perm_S (w[14], w[15], selector); w[34] = __byte_perm_S (w[13], w[14], selector); w[33] = __byte_perm_S (w[12], w[13], selector); w[32] = __byte_perm_S (w[11], w[12], selector); w[31] = __byte_perm_S (w[10], w[11], selector); w[30] = __byte_perm_S (w[ 9], w[10], selector); w[29] = __byte_perm_S (w[ 8], w[ 9], selector); w[28] = __byte_perm_S (w[ 7], w[ 8], selector); w[27] = __byte_perm_S (w[ 6], w[ 7], selector); w[26] = __byte_perm_S (w[ 5], w[ 6], selector); w[25] = __byte_perm_S (w[ 4], w[ 5], selector); w[24] = __byte_perm_S (w[ 3], w[ 4], selector); w[23] = __byte_perm_S (w[ 2], w[ 3], selector); w[22] = __byte_perm_S (w[ 1], w[ 2], selector); w[21] = __byte_perm_S (w[ 0], w[ 1], selector); w[20] = __byte_perm_S ( 0, w[ 0], selector); w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 21: w[63] = __byte_perm_S (w[41], w[42], selector); w[62] = __byte_perm_S (w[40], w[41], selector); w[61] = __byte_perm_S (w[39], w[40], selector); w[60] = __byte_perm_S (w[38], w[39], selector); w[59] = __byte_perm_S (w[37], w[38], selector); w[58] = __byte_perm_S (w[36], w[37], selector); w[57] = __byte_perm_S (w[35], w[36], selector); w[56] = __byte_perm_S (w[34], w[35], selector); w[55] = __byte_perm_S (w[33], w[34], selector); w[54] = __byte_perm_S (w[32], w[33], selector); w[53] = __byte_perm_S (w[31], w[32], selector); w[52] = __byte_perm_S (w[30], w[31], selector); w[51] = __byte_perm_S (w[29], w[30], selector); w[50] = __byte_perm_S (w[28], w[29], selector); w[49] = __byte_perm_S (w[27], w[28], selector); w[48] = __byte_perm_S (w[26], w[27], selector); w[47] = __byte_perm_S (w[25], w[26], selector); w[46] = __byte_perm_S (w[24], w[25], selector); w[45] = __byte_perm_S (w[23], w[24], selector); w[44] = __byte_perm_S (w[22], w[23], selector); w[43] = __byte_perm_S (w[21], w[22], selector); w[42] = __byte_perm_S (w[20], w[21], selector); w[41] = __byte_perm_S (w[19], w[20], selector); w[40] = __byte_perm_S (w[18], w[19], selector); w[39] = __byte_perm_S (w[17], w[18], selector); w[38] = __byte_perm_S (w[16], w[17], selector); w[37] = __byte_perm_S (w[15], w[16], selector); w[36] = __byte_perm_S (w[14], w[15], selector); w[35] = __byte_perm_S (w[13], w[14], selector); w[34] = __byte_perm_S (w[12], w[13], selector); w[33] = __byte_perm_S (w[11], w[12], selector); w[32] = __byte_perm_S (w[10], w[11], selector); w[31] = __byte_perm_S (w[ 9], w[10], selector); w[30] = __byte_perm_S (w[ 8], w[ 9], selector); w[29] = __byte_perm_S (w[ 7], w[ 8], selector); w[28] = __byte_perm_S (w[ 6], w[ 7], selector); w[27] = __byte_perm_S (w[ 5], w[ 6], selector); w[26] = __byte_perm_S (w[ 4], w[ 5], selector); w[25] = __byte_perm_S (w[ 3], w[ 4], selector); w[24] = __byte_perm_S (w[ 2], w[ 3], selector); w[23] = __byte_perm_S (w[ 1], w[ 2], selector); w[22] = __byte_perm_S (w[ 0], w[ 1], selector); w[21] = __byte_perm_S ( 0, w[ 0], selector); w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 22: w[63] = __byte_perm_S (w[40], w[41], selector); w[62] = __byte_perm_S (w[39], w[40], selector); w[61] = __byte_perm_S (w[38], w[39], selector); w[60] = __byte_perm_S (w[37], w[38], selector); w[59] = __byte_perm_S (w[36], w[37], selector); w[58] = __byte_perm_S (w[35], w[36], selector); w[57] = __byte_perm_S (w[34], w[35], selector); w[56] = __byte_perm_S (w[33], w[34], selector); w[55] = __byte_perm_S (w[32], w[33], selector); w[54] = __byte_perm_S (w[31], w[32], selector); w[53] = __byte_perm_S (w[30], w[31], selector); w[52] = __byte_perm_S (w[29], w[30], selector); w[51] = __byte_perm_S (w[28], w[29], selector); w[50] = __byte_perm_S (w[27], w[28], selector); w[49] = __byte_perm_S (w[26], w[27], selector); w[48] = __byte_perm_S (w[25], w[26], selector); w[47] = __byte_perm_S (w[24], w[25], selector); w[46] = __byte_perm_S (w[23], w[24], selector); w[45] = __byte_perm_S (w[22], w[23], selector); w[44] = __byte_perm_S (w[21], w[22], selector); w[43] = __byte_perm_S (w[20], w[21], selector); w[42] = __byte_perm_S (w[19], w[20], selector); w[41] = __byte_perm_S (w[18], w[19], selector); w[40] = __byte_perm_S (w[17], w[18], selector); w[39] = __byte_perm_S (w[16], w[17], selector); w[38] = __byte_perm_S (w[15], w[16], selector); w[37] = __byte_perm_S (w[14], w[15], selector); w[36] = __byte_perm_S (w[13], w[14], selector); w[35] = __byte_perm_S (w[12], w[13], selector); w[34] = __byte_perm_S (w[11], w[12], selector); w[33] = __byte_perm_S (w[10], w[11], selector); w[32] = __byte_perm_S (w[ 9], w[10], selector); w[31] = __byte_perm_S (w[ 8], w[ 9], selector); w[30] = __byte_perm_S (w[ 7], w[ 8], selector); w[29] = __byte_perm_S (w[ 6], w[ 7], selector); w[28] = __byte_perm_S (w[ 5], w[ 6], selector); w[27] = __byte_perm_S (w[ 4], w[ 5], selector); w[26] = __byte_perm_S (w[ 3], w[ 4], selector); w[25] = __byte_perm_S (w[ 2], w[ 3], selector); w[24] = __byte_perm_S (w[ 1], w[ 2], selector); w[23] = __byte_perm_S (w[ 0], w[ 1], selector); w[22] = __byte_perm_S ( 0, w[ 0], selector); w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 23: w[63] = __byte_perm_S (w[39], w[40], selector); w[62] = __byte_perm_S (w[38], w[39], selector); w[61] = __byte_perm_S (w[37], w[38], selector); w[60] = __byte_perm_S (w[36], w[37], selector); w[59] = __byte_perm_S (w[35], w[36], selector); w[58] = __byte_perm_S (w[34], w[35], selector); w[57] = __byte_perm_S (w[33], w[34], selector); w[56] = __byte_perm_S (w[32], w[33], selector); w[55] = __byte_perm_S (w[31], w[32], selector); w[54] = __byte_perm_S (w[30], w[31], selector); w[53] = __byte_perm_S (w[29], w[30], selector); w[52] = __byte_perm_S (w[28], w[29], selector); w[51] = __byte_perm_S (w[27], w[28], selector); w[50] = __byte_perm_S (w[26], w[27], selector); w[49] = __byte_perm_S (w[25], w[26], selector); w[48] = __byte_perm_S (w[24], w[25], selector); w[47] = __byte_perm_S (w[23], w[24], selector); w[46] = __byte_perm_S (w[22], w[23], selector); w[45] = __byte_perm_S (w[21], w[22], selector); w[44] = __byte_perm_S (w[20], w[21], selector); w[43] = __byte_perm_S (w[19], w[20], selector); w[42] = __byte_perm_S (w[18], w[19], selector); w[41] = __byte_perm_S (w[17], w[18], selector); w[40] = __byte_perm_S (w[16], w[17], selector); w[39] = __byte_perm_S (w[15], w[16], selector); w[38] = __byte_perm_S (w[14], w[15], selector); w[37] = __byte_perm_S (w[13], w[14], selector); w[36] = __byte_perm_S (w[12], w[13], selector); w[35] = __byte_perm_S (w[11], w[12], selector); w[34] = __byte_perm_S (w[10], w[11], selector); w[33] = __byte_perm_S (w[ 9], w[10], selector); w[32] = __byte_perm_S (w[ 8], w[ 9], selector); w[31] = __byte_perm_S (w[ 7], w[ 8], selector); w[30] = __byte_perm_S (w[ 6], w[ 7], selector); w[29] = __byte_perm_S (w[ 5], w[ 6], selector); w[28] = __byte_perm_S (w[ 4], w[ 5], selector); w[27] = __byte_perm_S (w[ 3], w[ 4], selector); w[26] = __byte_perm_S (w[ 2], w[ 3], selector); w[25] = __byte_perm_S (w[ 1], w[ 2], selector); w[24] = __byte_perm_S (w[ 0], w[ 1], selector); w[23] = __byte_perm_S ( 0, w[ 0], selector); w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 24: w[63] = __byte_perm_S (w[38], w[39], selector); w[62] = __byte_perm_S (w[37], w[38], selector); w[61] = __byte_perm_S (w[36], w[37], selector); w[60] = __byte_perm_S (w[35], w[36], selector); w[59] = __byte_perm_S (w[34], w[35], selector); w[58] = __byte_perm_S (w[33], w[34], selector); w[57] = __byte_perm_S (w[32], w[33], selector); w[56] = __byte_perm_S (w[31], w[32], selector); w[55] = __byte_perm_S (w[30], w[31], selector); w[54] = __byte_perm_S (w[29], w[30], selector); w[53] = __byte_perm_S (w[28], w[29], selector); w[52] = __byte_perm_S (w[27], w[28], selector); w[51] = __byte_perm_S (w[26], w[27], selector); w[50] = __byte_perm_S (w[25], w[26], selector); w[49] = __byte_perm_S (w[24], w[25], selector); w[48] = __byte_perm_S (w[23], w[24], selector); w[47] = __byte_perm_S (w[22], w[23], selector); w[46] = __byte_perm_S (w[21], w[22], selector); w[45] = __byte_perm_S (w[20], w[21], selector); w[44] = __byte_perm_S (w[19], w[20], selector); w[43] = __byte_perm_S (w[18], w[19], selector); w[42] = __byte_perm_S (w[17], w[18], selector); w[41] = __byte_perm_S (w[16], w[17], selector); w[40] = __byte_perm_S (w[15], w[16], selector); w[39] = __byte_perm_S (w[14], w[15], selector); w[38] = __byte_perm_S (w[13], w[14], selector); w[37] = __byte_perm_S (w[12], w[13], selector); w[36] = __byte_perm_S (w[11], w[12], selector); w[35] = __byte_perm_S (w[10], w[11], selector); w[34] = __byte_perm_S (w[ 9], w[10], selector); w[33] = __byte_perm_S (w[ 8], w[ 9], selector); w[32] = __byte_perm_S (w[ 7], w[ 8], selector); w[31] = __byte_perm_S (w[ 6], w[ 7], selector); w[30] = __byte_perm_S (w[ 5], w[ 6], selector); w[29] = __byte_perm_S (w[ 4], w[ 5], selector); w[28] = __byte_perm_S (w[ 3], w[ 4], selector); w[27] = __byte_perm_S (w[ 2], w[ 3], selector); w[26] = __byte_perm_S (w[ 1], w[ 2], selector); w[25] = __byte_perm_S (w[ 0], w[ 1], selector); w[24] = __byte_perm_S ( 0, w[ 0], selector); w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 25: w[63] = __byte_perm_S (w[37], w[38], selector); w[62] = __byte_perm_S (w[36], w[37], selector); w[61] = __byte_perm_S (w[35], w[36], selector); w[60] = __byte_perm_S (w[34], w[35], selector); w[59] = __byte_perm_S (w[33], w[34], selector); w[58] = __byte_perm_S (w[32], w[33], selector); w[57] = __byte_perm_S (w[31], w[32], selector); w[56] = __byte_perm_S (w[30], w[31], selector); w[55] = __byte_perm_S (w[29], w[30], selector); w[54] = __byte_perm_S (w[28], w[29], selector); w[53] = __byte_perm_S (w[27], w[28], selector); w[52] = __byte_perm_S (w[26], w[27], selector); w[51] = __byte_perm_S (w[25], w[26], selector); w[50] = __byte_perm_S (w[24], w[25], selector); w[49] = __byte_perm_S (w[23], w[24], selector); w[48] = __byte_perm_S (w[22], w[23], selector); w[47] = __byte_perm_S (w[21], w[22], selector); w[46] = __byte_perm_S (w[20], w[21], selector); w[45] = __byte_perm_S (w[19], w[20], selector); w[44] = __byte_perm_S (w[18], w[19], selector); w[43] = __byte_perm_S (w[17], w[18], selector); w[42] = __byte_perm_S (w[16], w[17], selector); w[41] = __byte_perm_S (w[15], w[16], selector); w[40] = __byte_perm_S (w[14], w[15], selector); w[39] = __byte_perm_S (w[13], w[14], selector); w[38] = __byte_perm_S (w[12], w[13], selector); w[37] = __byte_perm_S (w[11], w[12], selector); w[36] = __byte_perm_S (w[10], w[11], selector); w[35] = __byte_perm_S (w[ 9], w[10], selector); w[34] = __byte_perm_S (w[ 8], w[ 9], selector); w[33] = __byte_perm_S (w[ 7], w[ 8], selector); w[32] = __byte_perm_S (w[ 6], w[ 7], selector); w[31] = __byte_perm_S (w[ 5], w[ 6], selector); w[30] = __byte_perm_S (w[ 4], w[ 5], selector); w[29] = __byte_perm_S (w[ 3], w[ 4], selector); w[28] = __byte_perm_S (w[ 2], w[ 3], selector); w[27] = __byte_perm_S (w[ 1], w[ 2], selector); w[26] = __byte_perm_S (w[ 0], w[ 1], selector); w[25] = __byte_perm_S ( 0, w[ 0], selector); w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 26: w[63] = __byte_perm_S (w[36], w[37], selector); w[62] = __byte_perm_S (w[35], w[36], selector); w[61] = __byte_perm_S (w[34], w[35], selector); w[60] = __byte_perm_S (w[33], w[34], selector); w[59] = __byte_perm_S (w[32], w[33], selector); w[58] = __byte_perm_S (w[31], w[32], selector); w[57] = __byte_perm_S (w[30], w[31], selector); w[56] = __byte_perm_S (w[29], w[30], selector); w[55] = __byte_perm_S (w[28], w[29], selector); w[54] = __byte_perm_S (w[27], w[28], selector); w[53] = __byte_perm_S (w[26], w[27], selector); w[52] = __byte_perm_S (w[25], w[26], selector); w[51] = __byte_perm_S (w[24], w[25], selector); w[50] = __byte_perm_S (w[23], w[24], selector); w[49] = __byte_perm_S (w[22], w[23], selector); w[48] = __byte_perm_S (w[21], w[22], selector); w[47] = __byte_perm_S (w[20], w[21], selector); w[46] = __byte_perm_S (w[19], w[20], selector); w[45] = __byte_perm_S (w[18], w[19], selector); w[44] = __byte_perm_S (w[17], w[18], selector); w[43] = __byte_perm_S (w[16], w[17], selector); w[42] = __byte_perm_S (w[15], w[16], selector); w[41] = __byte_perm_S (w[14], w[15], selector); w[40] = __byte_perm_S (w[13], w[14], selector); w[39] = __byte_perm_S (w[12], w[13], selector); w[38] = __byte_perm_S (w[11], w[12], selector); w[37] = __byte_perm_S (w[10], w[11], selector); w[36] = __byte_perm_S (w[ 9], w[10], selector); w[35] = __byte_perm_S (w[ 8], w[ 9], selector); w[34] = __byte_perm_S (w[ 7], w[ 8], selector); w[33] = __byte_perm_S (w[ 6], w[ 7], selector); w[32] = __byte_perm_S (w[ 5], w[ 6], selector); w[31] = __byte_perm_S (w[ 4], w[ 5], selector); w[30] = __byte_perm_S (w[ 3], w[ 4], selector); w[29] = __byte_perm_S (w[ 2], w[ 3], selector); w[28] = __byte_perm_S (w[ 1], w[ 2], selector); w[27] = __byte_perm_S (w[ 0], w[ 1], selector); w[26] = __byte_perm_S ( 0, w[ 0], selector); w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 27: w[63] = __byte_perm_S (w[35], w[36], selector); w[62] = __byte_perm_S (w[34], w[35], selector); w[61] = __byte_perm_S (w[33], w[34], selector); w[60] = __byte_perm_S (w[32], w[33], selector); w[59] = __byte_perm_S (w[31], w[32], selector); w[58] = __byte_perm_S (w[30], w[31], selector); w[57] = __byte_perm_S (w[29], w[30], selector); w[56] = __byte_perm_S (w[28], w[29], selector); w[55] = __byte_perm_S (w[27], w[28], selector); w[54] = __byte_perm_S (w[26], w[27], selector); w[53] = __byte_perm_S (w[25], w[26], selector); w[52] = __byte_perm_S (w[24], w[25], selector); w[51] = __byte_perm_S (w[23], w[24], selector); w[50] = __byte_perm_S (w[22], w[23], selector); w[49] = __byte_perm_S (w[21], w[22], selector); w[48] = __byte_perm_S (w[20], w[21], selector); w[47] = __byte_perm_S (w[19], w[20], selector); w[46] = __byte_perm_S (w[18], w[19], selector); w[45] = __byte_perm_S (w[17], w[18], selector); w[44] = __byte_perm_S (w[16], w[17], selector); w[43] = __byte_perm_S (w[15], w[16], selector); w[42] = __byte_perm_S (w[14], w[15], selector); w[41] = __byte_perm_S (w[13], w[14], selector); w[40] = __byte_perm_S (w[12], w[13], selector); w[39] = __byte_perm_S (w[11], w[12], selector); w[38] = __byte_perm_S (w[10], w[11], selector); w[37] = __byte_perm_S (w[ 9], w[10], selector); w[36] = __byte_perm_S (w[ 8], w[ 9], selector); w[35] = __byte_perm_S (w[ 7], w[ 8], selector); w[34] = __byte_perm_S (w[ 6], w[ 7], selector); w[33] = __byte_perm_S (w[ 5], w[ 6], selector); w[32] = __byte_perm_S (w[ 4], w[ 5], selector); w[31] = __byte_perm_S (w[ 3], w[ 4], selector); w[30] = __byte_perm_S (w[ 2], w[ 3], selector); w[29] = __byte_perm_S (w[ 1], w[ 2], selector); w[28] = __byte_perm_S (w[ 0], w[ 1], selector); w[27] = __byte_perm_S ( 0, w[ 0], selector); w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 28: w[63] = __byte_perm_S (w[34], w[35], selector); w[62] = __byte_perm_S (w[33], w[34], selector); w[61] = __byte_perm_S (w[32], w[33], selector); w[60] = __byte_perm_S (w[31], w[32], selector); w[59] = __byte_perm_S (w[30], w[31], selector); w[58] = __byte_perm_S (w[29], w[30], selector); w[57] = __byte_perm_S (w[28], w[29], selector); w[56] = __byte_perm_S (w[27], w[28], selector); w[55] = __byte_perm_S (w[26], w[27], selector); w[54] = __byte_perm_S (w[25], w[26], selector); w[53] = __byte_perm_S (w[24], w[25], selector); w[52] = __byte_perm_S (w[23], w[24], selector); w[51] = __byte_perm_S (w[22], w[23], selector); w[50] = __byte_perm_S (w[21], w[22], selector); w[49] = __byte_perm_S (w[20], w[21], selector); w[48] = __byte_perm_S (w[19], w[20], selector); w[47] = __byte_perm_S (w[18], w[19], selector); w[46] = __byte_perm_S (w[17], w[18], selector); w[45] = __byte_perm_S (w[16], w[17], selector); w[44] = __byte_perm_S (w[15], w[16], selector); w[43] = __byte_perm_S (w[14], w[15], selector); w[42] = __byte_perm_S (w[13], w[14], selector); w[41] = __byte_perm_S (w[12], w[13], selector); w[40] = __byte_perm_S (w[11], w[12], selector); w[39] = __byte_perm_S (w[10], w[11], selector); w[38] = __byte_perm_S (w[ 9], w[10], selector); w[37] = __byte_perm_S (w[ 8], w[ 9], selector); w[36] = __byte_perm_S (w[ 7], w[ 8], selector); w[35] = __byte_perm_S (w[ 6], w[ 7], selector); w[34] = __byte_perm_S (w[ 5], w[ 6], selector); w[33] = __byte_perm_S (w[ 4], w[ 5], selector); w[32] = __byte_perm_S (w[ 3], w[ 4], selector); w[31] = __byte_perm_S (w[ 2], w[ 3], selector); w[30] = __byte_perm_S (w[ 1], w[ 2], selector); w[29] = __byte_perm_S (w[ 0], w[ 1], selector); w[28] = __byte_perm_S ( 0, w[ 0], selector); w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 29: w[63] = __byte_perm_S (w[33], w[34], selector); w[62] = __byte_perm_S (w[32], w[33], selector); w[61] = __byte_perm_S (w[31], w[32], selector); w[60] = __byte_perm_S (w[30], w[31], selector); w[59] = __byte_perm_S (w[29], w[30], selector); w[58] = __byte_perm_S (w[28], w[29], selector); w[57] = __byte_perm_S (w[27], w[28], selector); w[56] = __byte_perm_S (w[26], w[27], selector); w[55] = __byte_perm_S (w[25], w[26], selector); w[54] = __byte_perm_S (w[24], w[25], selector); w[53] = __byte_perm_S (w[23], w[24], selector); w[52] = __byte_perm_S (w[22], w[23], selector); w[51] = __byte_perm_S (w[21], w[22], selector); w[50] = __byte_perm_S (w[20], w[21], selector); w[49] = __byte_perm_S (w[19], w[20], selector); w[48] = __byte_perm_S (w[18], w[19], selector); w[47] = __byte_perm_S (w[17], w[18], selector); w[46] = __byte_perm_S (w[16], w[17], selector); w[45] = __byte_perm_S (w[15], w[16], selector); w[44] = __byte_perm_S (w[14], w[15], selector); w[43] = __byte_perm_S (w[13], w[14], selector); w[42] = __byte_perm_S (w[12], w[13], selector); w[41] = __byte_perm_S (w[11], w[12], selector); w[40] = __byte_perm_S (w[10], w[11], selector); w[39] = __byte_perm_S (w[ 9], w[10], selector); w[38] = __byte_perm_S (w[ 8], w[ 9], selector); w[37] = __byte_perm_S (w[ 7], w[ 8], selector); w[36] = __byte_perm_S (w[ 6], w[ 7], selector); w[35] = __byte_perm_S (w[ 5], w[ 6], selector); w[34] = __byte_perm_S (w[ 4], w[ 5], selector); w[33] = __byte_perm_S (w[ 3], w[ 4], selector); w[32] = __byte_perm_S (w[ 2], w[ 3], selector); w[31] = __byte_perm_S (w[ 1], w[ 2], selector); w[30] = __byte_perm_S (w[ 0], w[ 1], selector); w[29] = __byte_perm_S ( 0, w[ 0], selector); w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 30: w[63] = __byte_perm_S (w[32], w[33], selector); w[62] = __byte_perm_S (w[31], w[32], selector); w[61] = __byte_perm_S (w[30], w[31], selector); w[60] = __byte_perm_S (w[29], w[30], selector); w[59] = __byte_perm_S (w[28], w[29], selector); w[58] = __byte_perm_S (w[27], w[28], selector); w[57] = __byte_perm_S (w[26], w[27], selector); w[56] = __byte_perm_S (w[25], w[26], selector); w[55] = __byte_perm_S (w[24], w[25], selector); w[54] = __byte_perm_S (w[23], w[24], selector); w[53] = __byte_perm_S (w[22], w[23], selector); w[52] = __byte_perm_S (w[21], w[22], selector); w[51] = __byte_perm_S (w[20], w[21], selector); w[50] = __byte_perm_S (w[19], w[20], selector); w[49] = __byte_perm_S (w[18], w[19], selector); w[48] = __byte_perm_S (w[17], w[18], selector); w[47] = __byte_perm_S (w[16], w[17], selector); w[46] = __byte_perm_S (w[15], w[16], selector); w[45] = __byte_perm_S (w[14], w[15], selector); w[44] = __byte_perm_S (w[13], w[14], selector); w[43] = __byte_perm_S (w[12], w[13], selector); w[42] = __byte_perm_S (w[11], w[12], selector); w[41] = __byte_perm_S (w[10], w[11], selector); w[40] = __byte_perm_S (w[ 9], w[10], selector); w[39] = __byte_perm_S (w[ 8], w[ 9], selector); w[38] = __byte_perm_S (w[ 7], w[ 8], selector); w[37] = __byte_perm_S (w[ 6], w[ 7], selector); w[36] = __byte_perm_S (w[ 5], w[ 6], selector); w[35] = __byte_perm_S (w[ 4], w[ 5], selector); w[34] = __byte_perm_S (w[ 3], w[ 4], selector); w[33] = __byte_perm_S (w[ 2], w[ 3], selector); w[32] = __byte_perm_S (w[ 1], w[ 2], selector); w[31] = __byte_perm_S (w[ 0], w[ 1], selector); w[30] = __byte_perm_S ( 0, w[ 0], selector); w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 31: w[63] = __byte_perm_S (w[31], w[32], selector); w[62] = __byte_perm_S (w[30], w[31], selector); w[61] = __byte_perm_S (w[29], w[30], selector); w[60] = __byte_perm_S (w[28], w[29], selector); w[59] = __byte_perm_S (w[27], w[28], selector); w[58] = __byte_perm_S (w[26], w[27], selector); w[57] = __byte_perm_S (w[25], w[26], selector); w[56] = __byte_perm_S (w[24], w[25], selector); w[55] = __byte_perm_S (w[23], w[24], selector); w[54] = __byte_perm_S (w[22], w[23], selector); w[53] = __byte_perm_S (w[21], w[22], selector); w[52] = __byte_perm_S (w[20], w[21], selector); w[51] = __byte_perm_S (w[19], w[20], selector); w[50] = __byte_perm_S (w[18], w[19], selector); w[49] = __byte_perm_S (w[17], w[18], selector); w[48] = __byte_perm_S (w[16], w[17], selector); w[47] = __byte_perm_S (w[15], w[16], selector); w[46] = __byte_perm_S (w[14], w[15], selector); w[45] = __byte_perm_S (w[13], w[14], selector); w[44] = __byte_perm_S (w[12], w[13], selector); w[43] = __byte_perm_S (w[11], w[12], selector); w[42] = __byte_perm_S (w[10], w[11], selector); w[41] = __byte_perm_S (w[ 9], w[10], selector); w[40] = __byte_perm_S (w[ 8], w[ 9], selector); w[39] = __byte_perm_S (w[ 7], w[ 8], selector); w[38] = __byte_perm_S (w[ 6], w[ 7], selector); w[37] = __byte_perm_S (w[ 5], w[ 6], selector); w[36] = __byte_perm_S (w[ 4], w[ 5], selector); w[35] = __byte_perm_S (w[ 3], w[ 4], selector); w[34] = __byte_perm_S (w[ 2], w[ 3], selector); w[33] = __byte_perm_S (w[ 1], w[ 2], selector); w[32] = __byte_perm_S (w[ 0], w[ 1], selector); w[31] = __byte_perm_S ( 0, w[ 0], selector); w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 32: w[63] = __byte_perm_S (w[30], w[31], selector); w[62] = __byte_perm_S (w[29], w[30], selector); w[61] = __byte_perm_S (w[28], w[29], selector); w[60] = __byte_perm_S (w[27], w[28], selector); w[59] = __byte_perm_S (w[26], w[27], selector); w[58] = __byte_perm_S (w[25], w[26], selector); w[57] = __byte_perm_S (w[24], w[25], selector); w[56] = __byte_perm_S (w[23], w[24], selector); w[55] = __byte_perm_S (w[22], w[23], selector); w[54] = __byte_perm_S (w[21], w[22], selector); w[53] = __byte_perm_S (w[20], w[21], selector); w[52] = __byte_perm_S (w[19], w[20], selector); w[51] = __byte_perm_S (w[18], w[19], selector); w[50] = __byte_perm_S (w[17], w[18], selector); w[49] = __byte_perm_S (w[16], w[17], selector); w[48] = __byte_perm_S (w[15], w[16], selector); w[47] = __byte_perm_S (w[14], w[15], selector); w[46] = __byte_perm_S (w[13], w[14], selector); w[45] = __byte_perm_S (w[12], w[13], selector); w[44] = __byte_perm_S (w[11], w[12], selector); w[43] = __byte_perm_S (w[10], w[11], selector); w[42] = __byte_perm_S (w[ 9], w[10], selector); w[41] = __byte_perm_S (w[ 8], w[ 9], selector); w[40] = __byte_perm_S (w[ 7], w[ 8], selector); w[39] = __byte_perm_S (w[ 6], w[ 7], selector); w[38] = __byte_perm_S (w[ 5], w[ 6], selector); w[37] = __byte_perm_S (w[ 4], w[ 5], selector); w[36] = __byte_perm_S (w[ 3], w[ 4], selector); w[35] = __byte_perm_S (w[ 2], w[ 3], selector); w[34] = __byte_perm_S (w[ 1], w[ 2], selector); w[33] = __byte_perm_S (w[ 0], w[ 1], selector); w[32] = __byte_perm_S ( 0, w[ 0], selector); w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 33: w[63] = __byte_perm_S (w[29], w[30], selector); w[62] = __byte_perm_S (w[28], w[29], selector); w[61] = __byte_perm_S (w[27], w[28], selector); w[60] = __byte_perm_S (w[26], w[27], selector); w[59] = __byte_perm_S (w[25], w[26], selector); w[58] = __byte_perm_S (w[24], w[25], selector); w[57] = __byte_perm_S (w[23], w[24], selector); w[56] = __byte_perm_S (w[22], w[23], selector); w[55] = __byte_perm_S (w[21], w[22], selector); w[54] = __byte_perm_S (w[20], w[21], selector); w[53] = __byte_perm_S (w[19], w[20], selector); w[52] = __byte_perm_S (w[18], w[19], selector); w[51] = __byte_perm_S (w[17], w[18], selector); w[50] = __byte_perm_S (w[16], w[17], selector); w[49] = __byte_perm_S (w[15], w[16], selector); w[48] = __byte_perm_S (w[14], w[15], selector); w[47] = __byte_perm_S (w[13], w[14], selector); w[46] = __byte_perm_S (w[12], w[13], selector); w[45] = __byte_perm_S (w[11], w[12], selector); w[44] = __byte_perm_S (w[10], w[11], selector); w[43] = __byte_perm_S (w[ 9], w[10], selector); w[42] = __byte_perm_S (w[ 8], w[ 9], selector); w[41] = __byte_perm_S (w[ 7], w[ 8], selector); w[40] = __byte_perm_S (w[ 6], w[ 7], selector); w[39] = __byte_perm_S (w[ 5], w[ 6], selector); w[38] = __byte_perm_S (w[ 4], w[ 5], selector); w[37] = __byte_perm_S (w[ 3], w[ 4], selector); w[36] = __byte_perm_S (w[ 2], w[ 3], selector); w[35] = __byte_perm_S (w[ 1], w[ 2], selector); w[34] = __byte_perm_S (w[ 0], w[ 1], selector); w[33] = __byte_perm_S ( 0, w[ 0], selector); w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 34: w[63] = __byte_perm_S (w[28], w[29], selector); w[62] = __byte_perm_S (w[27], w[28], selector); w[61] = __byte_perm_S (w[26], w[27], selector); w[60] = __byte_perm_S (w[25], w[26], selector); w[59] = __byte_perm_S (w[24], w[25], selector); w[58] = __byte_perm_S (w[23], w[24], selector); w[57] = __byte_perm_S (w[22], w[23], selector); w[56] = __byte_perm_S (w[21], w[22], selector); w[55] = __byte_perm_S (w[20], w[21], selector); w[54] = __byte_perm_S (w[19], w[20], selector); w[53] = __byte_perm_S (w[18], w[19], selector); w[52] = __byte_perm_S (w[17], w[18], selector); w[51] = __byte_perm_S (w[16], w[17], selector); w[50] = __byte_perm_S (w[15], w[16], selector); w[49] = __byte_perm_S (w[14], w[15], selector); w[48] = __byte_perm_S (w[13], w[14], selector); w[47] = __byte_perm_S (w[12], w[13], selector); w[46] = __byte_perm_S (w[11], w[12], selector); w[45] = __byte_perm_S (w[10], w[11], selector); w[44] = __byte_perm_S (w[ 9], w[10], selector); w[43] = __byte_perm_S (w[ 8], w[ 9], selector); w[42] = __byte_perm_S (w[ 7], w[ 8], selector); w[41] = __byte_perm_S (w[ 6], w[ 7], selector); w[40] = __byte_perm_S (w[ 5], w[ 6], selector); w[39] = __byte_perm_S (w[ 4], w[ 5], selector); w[38] = __byte_perm_S (w[ 3], w[ 4], selector); w[37] = __byte_perm_S (w[ 2], w[ 3], selector); w[36] = __byte_perm_S (w[ 1], w[ 2], selector); w[35] = __byte_perm_S (w[ 0], w[ 1], selector); w[34] = __byte_perm_S ( 0, w[ 0], selector); w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 35: w[63] = __byte_perm_S (w[27], w[28], selector); w[62] = __byte_perm_S (w[26], w[27], selector); w[61] = __byte_perm_S (w[25], w[26], selector); w[60] = __byte_perm_S (w[24], w[25], selector); w[59] = __byte_perm_S (w[23], w[24], selector); w[58] = __byte_perm_S (w[22], w[23], selector); w[57] = __byte_perm_S (w[21], w[22], selector); w[56] = __byte_perm_S (w[20], w[21], selector); w[55] = __byte_perm_S (w[19], w[20], selector); w[54] = __byte_perm_S (w[18], w[19], selector); w[53] = __byte_perm_S (w[17], w[18], selector); w[52] = __byte_perm_S (w[16], w[17], selector); w[51] = __byte_perm_S (w[15], w[16], selector); w[50] = __byte_perm_S (w[14], w[15], selector); w[49] = __byte_perm_S (w[13], w[14], selector); w[48] = __byte_perm_S (w[12], w[13], selector); w[47] = __byte_perm_S (w[11], w[12], selector); w[46] = __byte_perm_S (w[10], w[11], selector); w[45] = __byte_perm_S (w[ 9], w[10], selector); w[44] = __byte_perm_S (w[ 8], w[ 9], selector); w[43] = __byte_perm_S (w[ 7], w[ 8], selector); w[42] = __byte_perm_S (w[ 6], w[ 7], selector); w[41] = __byte_perm_S (w[ 5], w[ 6], selector); w[40] = __byte_perm_S (w[ 4], w[ 5], selector); w[39] = __byte_perm_S (w[ 3], w[ 4], selector); w[38] = __byte_perm_S (w[ 2], w[ 3], selector); w[37] = __byte_perm_S (w[ 1], w[ 2], selector); w[36] = __byte_perm_S (w[ 0], w[ 1], selector); w[35] = __byte_perm_S ( 0, w[ 0], selector); w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 36: w[63] = __byte_perm_S (w[26], w[27], selector); w[62] = __byte_perm_S (w[25], w[26], selector); w[61] = __byte_perm_S (w[24], w[25], selector); w[60] = __byte_perm_S (w[23], w[24], selector); w[59] = __byte_perm_S (w[22], w[23], selector); w[58] = __byte_perm_S (w[21], w[22], selector); w[57] = __byte_perm_S (w[20], w[21], selector); w[56] = __byte_perm_S (w[19], w[20], selector); w[55] = __byte_perm_S (w[18], w[19], selector); w[54] = __byte_perm_S (w[17], w[18], selector); w[53] = __byte_perm_S (w[16], w[17], selector); w[52] = __byte_perm_S (w[15], w[16], selector); w[51] = __byte_perm_S (w[14], w[15], selector); w[50] = __byte_perm_S (w[13], w[14], selector); w[49] = __byte_perm_S (w[12], w[13], selector); w[48] = __byte_perm_S (w[11], w[12], selector); w[47] = __byte_perm_S (w[10], w[11], selector); w[46] = __byte_perm_S (w[ 9], w[10], selector); w[45] = __byte_perm_S (w[ 8], w[ 9], selector); w[44] = __byte_perm_S (w[ 7], w[ 8], selector); w[43] = __byte_perm_S (w[ 6], w[ 7], selector); w[42] = __byte_perm_S (w[ 5], w[ 6], selector); w[41] = __byte_perm_S (w[ 4], w[ 5], selector); w[40] = __byte_perm_S (w[ 3], w[ 4], selector); w[39] = __byte_perm_S (w[ 2], w[ 3], selector); w[38] = __byte_perm_S (w[ 1], w[ 2], selector); w[37] = __byte_perm_S (w[ 0], w[ 1], selector); w[36] = __byte_perm_S ( 0, w[ 0], selector); w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 37: w[63] = __byte_perm_S (w[25], w[26], selector); w[62] = __byte_perm_S (w[24], w[25], selector); w[61] = __byte_perm_S (w[23], w[24], selector); w[60] = __byte_perm_S (w[22], w[23], selector); w[59] = __byte_perm_S (w[21], w[22], selector); w[58] = __byte_perm_S (w[20], w[21], selector); w[57] = __byte_perm_S (w[19], w[20], selector); w[56] = __byte_perm_S (w[18], w[19], selector); w[55] = __byte_perm_S (w[17], w[18], selector); w[54] = __byte_perm_S (w[16], w[17], selector); w[53] = __byte_perm_S (w[15], w[16], selector); w[52] = __byte_perm_S (w[14], w[15], selector); w[51] = __byte_perm_S (w[13], w[14], selector); w[50] = __byte_perm_S (w[12], w[13], selector); w[49] = __byte_perm_S (w[11], w[12], selector); w[48] = __byte_perm_S (w[10], w[11], selector); w[47] = __byte_perm_S (w[ 9], w[10], selector); w[46] = __byte_perm_S (w[ 8], w[ 9], selector); w[45] = __byte_perm_S (w[ 7], w[ 8], selector); w[44] = __byte_perm_S (w[ 6], w[ 7], selector); w[43] = __byte_perm_S (w[ 5], w[ 6], selector); w[42] = __byte_perm_S (w[ 4], w[ 5], selector); w[41] = __byte_perm_S (w[ 3], w[ 4], selector); w[40] = __byte_perm_S (w[ 2], w[ 3], selector); w[39] = __byte_perm_S (w[ 1], w[ 2], selector); w[38] = __byte_perm_S (w[ 0], w[ 1], selector); w[37] = __byte_perm_S ( 0, w[ 0], selector); w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 38: w[63] = __byte_perm_S (w[24], w[25], selector); w[62] = __byte_perm_S (w[23], w[24], selector); w[61] = __byte_perm_S (w[22], w[23], selector); w[60] = __byte_perm_S (w[21], w[22], selector); w[59] = __byte_perm_S (w[20], w[21], selector); w[58] = __byte_perm_S (w[19], w[20], selector); w[57] = __byte_perm_S (w[18], w[19], selector); w[56] = __byte_perm_S (w[17], w[18], selector); w[55] = __byte_perm_S (w[16], w[17], selector); w[54] = __byte_perm_S (w[15], w[16], selector); w[53] = __byte_perm_S (w[14], w[15], selector); w[52] = __byte_perm_S (w[13], w[14], selector); w[51] = __byte_perm_S (w[12], w[13], selector); w[50] = __byte_perm_S (w[11], w[12], selector); w[49] = __byte_perm_S (w[10], w[11], selector); w[48] = __byte_perm_S (w[ 9], w[10], selector); w[47] = __byte_perm_S (w[ 8], w[ 9], selector); w[46] = __byte_perm_S (w[ 7], w[ 8], selector); w[45] = __byte_perm_S (w[ 6], w[ 7], selector); w[44] = __byte_perm_S (w[ 5], w[ 6], selector); w[43] = __byte_perm_S (w[ 4], w[ 5], selector); w[42] = __byte_perm_S (w[ 3], w[ 4], selector); w[41] = __byte_perm_S (w[ 2], w[ 3], selector); w[40] = __byte_perm_S (w[ 1], w[ 2], selector); w[39] = __byte_perm_S (w[ 0], w[ 1], selector); w[38] = __byte_perm_S ( 0, w[ 0], selector); w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 39: w[63] = __byte_perm_S (w[23], w[24], selector); w[62] = __byte_perm_S (w[22], w[23], selector); w[61] = __byte_perm_S (w[21], w[22], selector); w[60] = __byte_perm_S (w[20], w[21], selector); w[59] = __byte_perm_S (w[19], w[20], selector); w[58] = __byte_perm_S (w[18], w[19], selector); w[57] = __byte_perm_S (w[17], w[18], selector); w[56] = __byte_perm_S (w[16], w[17], selector); w[55] = __byte_perm_S (w[15], w[16], selector); w[54] = __byte_perm_S (w[14], w[15], selector); w[53] = __byte_perm_S (w[13], w[14], selector); w[52] = __byte_perm_S (w[12], w[13], selector); w[51] = __byte_perm_S (w[11], w[12], selector); w[50] = __byte_perm_S (w[10], w[11], selector); w[49] = __byte_perm_S (w[ 9], w[10], selector); w[48] = __byte_perm_S (w[ 8], w[ 9], selector); w[47] = __byte_perm_S (w[ 7], w[ 8], selector); w[46] = __byte_perm_S (w[ 6], w[ 7], selector); w[45] = __byte_perm_S (w[ 5], w[ 6], selector); w[44] = __byte_perm_S (w[ 4], w[ 5], selector); w[43] = __byte_perm_S (w[ 3], w[ 4], selector); w[42] = __byte_perm_S (w[ 2], w[ 3], selector); w[41] = __byte_perm_S (w[ 1], w[ 2], selector); w[40] = __byte_perm_S (w[ 0], w[ 1], selector); w[39] = __byte_perm_S ( 0, w[ 0], selector); w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 40: w[63] = __byte_perm_S (w[22], w[23], selector); w[62] = __byte_perm_S (w[21], w[22], selector); w[61] = __byte_perm_S (w[20], w[21], selector); w[60] = __byte_perm_S (w[19], w[20], selector); w[59] = __byte_perm_S (w[18], w[19], selector); w[58] = __byte_perm_S (w[17], w[18], selector); w[57] = __byte_perm_S (w[16], w[17], selector); w[56] = __byte_perm_S (w[15], w[16], selector); w[55] = __byte_perm_S (w[14], w[15], selector); w[54] = __byte_perm_S (w[13], w[14], selector); w[53] = __byte_perm_S (w[12], w[13], selector); w[52] = __byte_perm_S (w[11], w[12], selector); w[51] = __byte_perm_S (w[10], w[11], selector); w[50] = __byte_perm_S (w[ 9], w[10], selector); w[49] = __byte_perm_S (w[ 8], w[ 9], selector); w[48] = __byte_perm_S (w[ 7], w[ 8], selector); w[47] = __byte_perm_S (w[ 6], w[ 7], selector); w[46] = __byte_perm_S (w[ 5], w[ 6], selector); w[45] = __byte_perm_S (w[ 4], w[ 5], selector); w[44] = __byte_perm_S (w[ 3], w[ 4], selector); w[43] = __byte_perm_S (w[ 2], w[ 3], selector); w[42] = __byte_perm_S (w[ 1], w[ 2], selector); w[41] = __byte_perm_S (w[ 0], w[ 1], selector); w[40] = __byte_perm_S ( 0, w[ 0], selector); w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 41: w[63] = __byte_perm_S (w[21], w[22], selector); w[62] = __byte_perm_S (w[20], w[21], selector); w[61] = __byte_perm_S (w[19], w[20], selector); w[60] = __byte_perm_S (w[18], w[19], selector); w[59] = __byte_perm_S (w[17], w[18], selector); w[58] = __byte_perm_S (w[16], w[17], selector); w[57] = __byte_perm_S (w[15], w[16], selector); w[56] = __byte_perm_S (w[14], w[15], selector); w[55] = __byte_perm_S (w[13], w[14], selector); w[54] = __byte_perm_S (w[12], w[13], selector); w[53] = __byte_perm_S (w[11], w[12], selector); w[52] = __byte_perm_S (w[10], w[11], selector); w[51] = __byte_perm_S (w[ 9], w[10], selector); w[50] = __byte_perm_S (w[ 8], w[ 9], selector); w[49] = __byte_perm_S (w[ 7], w[ 8], selector); w[48] = __byte_perm_S (w[ 6], w[ 7], selector); w[47] = __byte_perm_S (w[ 5], w[ 6], selector); w[46] = __byte_perm_S (w[ 4], w[ 5], selector); w[45] = __byte_perm_S (w[ 3], w[ 4], selector); w[44] = __byte_perm_S (w[ 2], w[ 3], selector); w[43] = __byte_perm_S (w[ 1], w[ 2], selector); w[42] = __byte_perm_S (w[ 0], w[ 1], selector); w[41] = __byte_perm_S ( 0, w[ 0], selector); w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 42: w[63] = __byte_perm_S (w[20], w[21], selector); w[62] = __byte_perm_S (w[19], w[20], selector); w[61] = __byte_perm_S (w[18], w[19], selector); w[60] = __byte_perm_S (w[17], w[18], selector); w[59] = __byte_perm_S (w[16], w[17], selector); w[58] = __byte_perm_S (w[15], w[16], selector); w[57] = __byte_perm_S (w[14], w[15], selector); w[56] = __byte_perm_S (w[13], w[14], selector); w[55] = __byte_perm_S (w[12], w[13], selector); w[54] = __byte_perm_S (w[11], w[12], selector); w[53] = __byte_perm_S (w[10], w[11], selector); w[52] = __byte_perm_S (w[ 9], w[10], selector); w[51] = __byte_perm_S (w[ 8], w[ 9], selector); w[50] = __byte_perm_S (w[ 7], w[ 8], selector); w[49] = __byte_perm_S (w[ 6], w[ 7], selector); w[48] = __byte_perm_S (w[ 5], w[ 6], selector); w[47] = __byte_perm_S (w[ 4], w[ 5], selector); w[46] = __byte_perm_S (w[ 3], w[ 4], selector); w[45] = __byte_perm_S (w[ 2], w[ 3], selector); w[44] = __byte_perm_S (w[ 1], w[ 2], selector); w[43] = __byte_perm_S (w[ 0], w[ 1], selector); w[42] = __byte_perm_S ( 0, w[ 0], selector); w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 43: w[63] = __byte_perm_S (w[19], w[20], selector); w[62] = __byte_perm_S (w[18], w[19], selector); w[61] = __byte_perm_S (w[17], w[18], selector); w[60] = __byte_perm_S (w[16], w[17], selector); w[59] = __byte_perm_S (w[15], w[16], selector); w[58] = __byte_perm_S (w[14], w[15], selector); w[57] = __byte_perm_S (w[13], w[14], selector); w[56] = __byte_perm_S (w[12], w[13], selector); w[55] = __byte_perm_S (w[11], w[12], selector); w[54] = __byte_perm_S (w[10], w[11], selector); w[53] = __byte_perm_S (w[ 9], w[10], selector); w[52] = __byte_perm_S (w[ 8], w[ 9], selector); w[51] = __byte_perm_S (w[ 7], w[ 8], selector); w[50] = __byte_perm_S (w[ 6], w[ 7], selector); w[49] = __byte_perm_S (w[ 5], w[ 6], selector); w[48] = __byte_perm_S (w[ 4], w[ 5], selector); w[47] = __byte_perm_S (w[ 3], w[ 4], selector); w[46] = __byte_perm_S (w[ 2], w[ 3], selector); w[45] = __byte_perm_S (w[ 1], w[ 2], selector); w[44] = __byte_perm_S (w[ 0], w[ 1], selector); w[43] = __byte_perm_S ( 0, w[ 0], selector); w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 44: w[63] = __byte_perm_S (w[18], w[19], selector); w[62] = __byte_perm_S (w[17], w[18], selector); w[61] = __byte_perm_S (w[16], w[17], selector); w[60] = __byte_perm_S (w[15], w[16], selector); w[59] = __byte_perm_S (w[14], w[15], selector); w[58] = __byte_perm_S (w[13], w[14], selector); w[57] = __byte_perm_S (w[12], w[13], selector); w[56] = __byte_perm_S (w[11], w[12], selector); w[55] = __byte_perm_S (w[10], w[11], selector); w[54] = __byte_perm_S (w[ 9], w[10], selector); w[53] = __byte_perm_S (w[ 8], w[ 9], selector); w[52] = __byte_perm_S (w[ 7], w[ 8], selector); w[51] = __byte_perm_S (w[ 6], w[ 7], selector); w[50] = __byte_perm_S (w[ 5], w[ 6], selector); w[49] = __byte_perm_S (w[ 4], w[ 5], selector); w[48] = __byte_perm_S (w[ 3], w[ 4], selector); w[47] = __byte_perm_S (w[ 2], w[ 3], selector); w[46] = __byte_perm_S (w[ 1], w[ 2], selector); w[45] = __byte_perm_S (w[ 0], w[ 1], selector); w[44] = __byte_perm_S ( 0, w[ 0], selector); w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 45: w[63] = __byte_perm_S (w[17], w[18], selector); w[62] = __byte_perm_S (w[16], w[17], selector); w[61] = __byte_perm_S (w[15], w[16], selector); w[60] = __byte_perm_S (w[14], w[15], selector); w[59] = __byte_perm_S (w[13], w[14], selector); w[58] = __byte_perm_S (w[12], w[13], selector); w[57] = __byte_perm_S (w[11], w[12], selector); w[56] = __byte_perm_S (w[10], w[11], selector); w[55] = __byte_perm_S (w[ 9], w[10], selector); w[54] = __byte_perm_S (w[ 8], w[ 9], selector); w[53] = __byte_perm_S (w[ 7], w[ 8], selector); w[52] = __byte_perm_S (w[ 6], w[ 7], selector); w[51] = __byte_perm_S (w[ 5], w[ 6], selector); w[50] = __byte_perm_S (w[ 4], w[ 5], selector); w[49] = __byte_perm_S (w[ 3], w[ 4], selector); w[48] = __byte_perm_S (w[ 2], w[ 3], selector); w[47] = __byte_perm_S (w[ 1], w[ 2], selector); w[46] = __byte_perm_S (w[ 0], w[ 1], selector); w[45] = __byte_perm_S ( 0, w[ 0], selector); w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 46: w[63] = __byte_perm_S (w[16], w[17], selector); w[62] = __byte_perm_S (w[15], w[16], selector); w[61] = __byte_perm_S (w[14], w[15], selector); w[60] = __byte_perm_S (w[13], w[14], selector); w[59] = __byte_perm_S (w[12], w[13], selector); w[58] = __byte_perm_S (w[11], w[12], selector); w[57] = __byte_perm_S (w[10], w[11], selector); w[56] = __byte_perm_S (w[ 9], w[10], selector); w[55] = __byte_perm_S (w[ 8], w[ 9], selector); w[54] = __byte_perm_S (w[ 7], w[ 8], selector); w[53] = __byte_perm_S (w[ 6], w[ 7], selector); w[52] = __byte_perm_S (w[ 5], w[ 6], selector); w[51] = __byte_perm_S (w[ 4], w[ 5], selector); w[50] = __byte_perm_S (w[ 3], w[ 4], selector); w[49] = __byte_perm_S (w[ 2], w[ 3], selector); w[48] = __byte_perm_S (w[ 1], w[ 2], selector); w[47] = __byte_perm_S (w[ 0], w[ 1], selector); w[46] = __byte_perm_S ( 0, w[ 0], selector); w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 47: w[63] = __byte_perm_S (w[15], w[16], selector); w[62] = __byte_perm_S (w[14], w[15], selector); w[61] = __byte_perm_S (w[13], w[14], selector); w[60] = __byte_perm_S (w[12], w[13], selector); w[59] = __byte_perm_S (w[11], w[12], selector); w[58] = __byte_perm_S (w[10], w[11], selector); w[57] = __byte_perm_S (w[ 9], w[10], selector); w[56] = __byte_perm_S (w[ 8], w[ 9], selector); w[55] = __byte_perm_S (w[ 7], w[ 8], selector); w[54] = __byte_perm_S (w[ 6], w[ 7], selector); w[53] = __byte_perm_S (w[ 5], w[ 6], selector); w[52] = __byte_perm_S (w[ 4], w[ 5], selector); w[51] = __byte_perm_S (w[ 3], w[ 4], selector); w[50] = __byte_perm_S (w[ 2], w[ 3], selector); w[49] = __byte_perm_S (w[ 1], w[ 2], selector); w[48] = __byte_perm_S (w[ 0], w[ 1], selector); w[47] = __byte_perm_S ( 0, w[ 0], selector); w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 48: w[63] = __byte_perm_S (w[14], w[15], selector); w[62] = __byte_perm_S (w[13], w[14], selector); w[61] = __byte_perm_S (w[12], w[13], selector); w[60] = __byte_perm_S (w[11], w[12], selector); w[59] = __byte_perm_S (w[10], w[11], selector); w[58] = __byte_perm_S (w[ 9], w[10], selector); w[57] = __byte_perm_S (w[ 8], w[ 9], selector); w[56] = __byte_perm_S (w[ 7], w[ 8], selector); w[55] = __byte_perm_S (w[ 6], w[ 7], selector); w[54] = __byte_perm_S (w[ 5], w[ 6], selector); w[53] = __byte_perm_S (w[ 4], w[ 5], selector); w[52] = __byte_perm_S (w[ 3], w[ 4], selector); w[51] = __byte_perm_S (w[ 2], w[ 3], selector); w[50] = __byte_perm_S (w[ 1], w[ 2], selector); w[49] = __byte_perm_S (w[ 0], w[ 1], selector); w[48] = __byte_perm_S ( 0, w[ 0], selector); w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 49: w[63] = __byte_perm_S (w[13], w[14], selector); w[62] = __byte_perm_S (w[12], w[13], selector); w[61] = __byte_perm_S (w[11], w[12], selector); w[60] = __byte_perm_S (w[10], w[11], selector); w[59] = __byte_perm_S (w[ 9], w[10], selector); w[58] = __byte_perm_S (w[ 8], w[ 9], selector); w[57] = __byte_perm_S (w[ 7], w[ 8], selector); w[56] = __byte_perm_S (w[ 6], w[ 7], selector); w[55] = __byte_perm_S (w[ 5], w[ 6], selector); w[54] = __byte_perm_S (w[ 4], w[ 5], selector); w[53] = __byte_perm_S (w[ 3], w[ 4], selector); w[52] = __byte_perm_S (w[ 2], w[ 3], selector); w[51] = __byte_perm_S (w[ 1], w[ 2], selector); w[50] = __byte_perm_S (w[ 0], w[ 1], selector); w[49] = __byte_perm_S ( 0, w[ 0], selector); w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 50: w[63] = __byte_perm_S (w[12], w[13], selector); w[62] = __byte_perm_S (w[11], w[12], selector); w[61] = __byte_perm_S (w[10], w[11], selector); w[60] = __byte_perm_S (w[ 9], w[10], selector); w[59] = __byte_perm_S (w[ 8], w[ 9], selector); w[58] = __byte_perm_S (w[ 7], w[ 8], selector); w[57] = __byte_perm_S (w[ 6], w[ 7], selector); w[56] = __byte_perm_S (w[ 5], w[ 6], selector); w[55] = __byte_perm_S (w[ 4], w[ 5], selector); w[54] = __byte_perm_S (w[ 3], w[ 4], selector); w[53] = __byte_perm_S (w[ 2], w[ 3], selector); w[52] = __byte_perm_S (w[ 1], w[ 2], selector); w[51] = __byte_perm_S (w[ 0], w[ 1], selector); w[50] = __byte_perm_S ( 0, w[ 0], selector); w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 51: w[63] = __byte_perm_S (w[11], w[12], selector); w[62] = __byte_perm_S (w[10], w[11], selector); w[61] = __byte_perm_S (w[ 9], w[10], selector); w[60] = __byte_perm_S (w[ 8], w[ 9], selector); w[59] = __byte_perm_S (w[ 7], w[ 8], selector); w[58] = __byte_perm_S (w[ 6], w[ 7], selector); w[57] = __byte_perm_S (w[ 5], w[ 6], selector); w[56] = __byte_perm_S (w[ 4], w[ 5], selector); w[55] = __byte_perm_S (w[ 3], w[ 4], selector); w[54] = __byte_perm_S (w[ 2], w[ 3], selector); w[53] = __byte_perm_S (w[ 1], w[ 2], selector); w[52] = __byte_perm_S (w[ 0], w[ 1], selector); w[51] = __byte_perm_S ( 0, w[ 0], selector); w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 52: w[63] = __byte_perm_S (w[10], w[11], selector); w[62] = __byte_perm_S (w[ 9], w[10], selector); w[61] = __byte_perm_S (w[ 8], w[ 9], selector); w[60] = __byte_perm_S (w[ 7], w[ 8], selector); w[59] = __byte_perm_S (w[ 6], w[ 7], selector); w[58] = __byte_perm_S (w[ 5], w[ 6], selector); w[57] = __byte_perm_S (w[ 4], w[ 5], selector); w[56] = __byte_perm_S (w[ 3], w[ 4], selector); w[55] = __byte_perm_S (w[ 2], w[ 3], selector); w[54] = __byte_perm_S (w[ 1], w[ 2], selector); w[53] = __byte_perm_S (w[ 0], w[ 1], selector); w[52] = __byte_perm_S ( 0, w[ 0], selector); w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 53: w[63] = __byte_perm_S (w[ 9], w[10], selector); w[62] = __byte_perm_S (w[ 8], w[ 9], selector); w[61] = __byte_perm_S (w[ 7], w[ 8], selector); w[60] = __byte_perm_S (w[ 6], w[ 7], selector); w[59] = __byte_perm_S (w[ 5], w[ 6], selector); w[58] = __byte_perm_S (w[ 4], w[ 5], selector); w[57] = __byte_perm_S (w[ 3], w[ 4], selector); w[56] = __byte_perm_S (w[ 2], w[ 3], selector); w[55] = __byte_perm_S (w[ 1], w[ 2], selector); w[54] = __byte_perm_S (w[ 0], w[ 1], selector); w[53] = __byte_perm_S ( 0, w[ 0], selector); w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 54: w[63] = __byte_perm_S (w[ 8], w[ 9], selector); w[62] = __byte_perm_S (w[ 7], w[ 8], selector); w[61] = __byte_perm_S (w[ 6], w[ 7], selector); w[60] = __byte_perm_S (w[ 5], w[ 6], selector); w[59] = __byte_perm_S (w[ 4], w[ 5], selector); w[58] = __byte_perm_S (w[ 3], w[ 4], selector); w[57] = __byte_perm_S (w[ 2], w[ 3], selector); w[56] = __byte_perm_S (w[ 1], w[ 2], selector); w[55] = __byte_perm_S (w[ 0], w[ 1], selector); w[54] = __byte_perm_S ( 0, w[ 0], selector); w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 55: w[63] = __byte_perm_S (w[ 7], w[ 8], selector); w[62] = __byte_perm_S (w[ 6], w[ 7], selector); w[61] = __byte_perm_S (w[ 5], w[ 6], selector); w[60] = __byte_perm_S (w[ 4], w[ 5], selector); w[59] = __byte_perm_S (w[ 3], w[ 4], selector); w[58] = __byte_perm_S (w[ 2], w[ 3], selector); w[57] = __byte_perm_S (w[ 1], w[ 2], selector); w[56] = __byte_perm_S (w[ 0], w[ 1], selector); w[55] = __byte_perm_S ( 0, w[ 0], selector); w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 56: w[63] = __byte_perm_S (w[ 6], w[ 7], selector); w[62] = __byte_perm_S (w[ 5], w[ 6], selector); w[61] = __byte_perm_S (w[ 4], w[ 5], selector); w[60] = __byte_perm_S (w[ 3], w[ 4], selector); w[59] = __byte_perm_S (w[ 2], w[ 3], selector); w[58] = __byte_perm_S (w[ 1], w[ 2], selector); w[57] = __byte_perm_S (w[ 0], w[ 1], selector); w[56] = __byte_perm_S ( 0, w[ 0], selector); w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 57: w[63] = __byte_perm_S (w[ 5], w[ 6], selector); w[62] = __byte_perm_S (w[ 4], w[ 5], selector); w[61] = __byte_perm_S (w[ 3], w[ 4], selector); w[60] = __byte_perm_S (w[ 2], w[ 3], selector); w[59] = __byte_perm_S (w[ 1], w[ 2], selector); w[58] = __byte_perm_S (w[ 0], w[ 1], selector); w[57] = __byte_perm_S ( 0, w[ 0], selector); w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 58: w[63] = __byte_perm_S (w[ 4], w[ 5], selector); w[62] = __byte_perm_S (w[ 3], w[ 4], selector); w[61] = __byte_perm_S (w[ 2], w[ 3], selector); w[60] = __byte_perm_S (w[ 1], w[ 2], selector); w[59] = __byte_perm_S (w[ 0], w[ 1], selector); w[58] = __byte_perm_S ( 0, w[ 0], selector); w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 59: w[63] = __byte_perm_S (w[ 3], w[ 4], selector); w[62] = __byte_perm_S (w[ 2], w[ 3], selector); w[61] = __byte_perm_S (w[ 1], w[ 2], selector); w[60] = __byte_perm_S (w[ 0], w[ 1], selector); w[59] = __byte_perm_S ( 0, w[ 0], selector); w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 60: w[63] = __byte_perm_S (w[ 2], w[ 3], selector); w[62] = __byte_perm_S (w[ 1], w[ 2], selector); w[61] = __byte_perm_S (w[ 0], w[ 1], selector); w[60] = __byte_perm_S ( 0, w[ 0], selector); w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 61: w[63] = __byte_perm_S (w[ 1], w[ 2], selector); w[62] = __byte_perm_S (w[ 0], w[ 1], selector); w[61] = __byte_perm_S ( 0, w[ 0], selector); w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 62: w[63] = __byte_perm_S (w[ 0], w[ 1], selector); w[62] = __byte_perm_S ( 0, w[ 0], selector); w[61] = 0; w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 63: w[63] = __byte_perm_S ( 0, w[ 0], selector); w[62] = 0; w[61] = 0; w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; } #endif } void switch_buffer_by_offset_1x64_be_S (u32 w[64], const u32 offset) { #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if (defined IS_AMD && AMD_GCN < 3) || defined IS_GENERIC switch (offset_switch) { case 0: w[63] = amd_bytealign_S (w[62], w[63], offset); w[62] = amd_bytealign_S (w[61], w[62], offset); w[61] = amd_bytealign_S (w[60], w[61], offset); w[60] = amd_bytealign_S (w[59], w[60], offset); w[59] = amd_bytealign_S (w[58], w[59], offset); w[58] = amd_bytealign_S (w[57], w[58], offset); w[57] = amd_bytealign_S (w[56], w[57], offset); w[56] = amd_bytealign_S (w[55], w[56], offset); w[55] = amd_bytealign_S (w[54], w[55], offset); w[54] = amd_bytealign_S (w[53], w[54], offset); w[53] = amd_bytealign_S (w[52], w[53], offset); w[52] = amd_bytealign_S (w[51], w[52], offset); w[51] = amd_bytealign_S (w[50], w[51], offset); w[50] = amd_bytealign_S (w[49], w[50], offset); w[49] = amd_bytealign_S (w[48], w[49], offset); w[48] = amd_bytealign_S (w[47], w[48], offset); w[47] = amd_bytealign_S (w[46], w[47], offset); w[46] = amd_bytealign_S (w[45], w[46], offset); w[45] = amd_bytealign_S (w[44], w[45], offset); w[44] = amd_bytealign_S (w[43], w[44], offset); w[43] = amd_bytealign_S (w[42], w[43], offset); w[42] = amd_bytealign_S (w[41], w[42], offset); w[41] = amd_bytealign_S (w[40], w[41], offset); w[40] = amd_bytealign_S (w[39], w[40], offset); w[39] = amd_bytealign_S (w[38], w[39], offset); w[38] = amd_bytealign_S (w[37], w[38], offset); w[37] = amd_bytealign_S (w[36], w[37], offset); w[36] = amd_bytealign_S (w[35], w[36], offset); w[35] = amd_bytealign_S (w[34], w[35], offset); w[34] = amd_bytealign_S (w[33], w[34], offset); w[33] = amd_bytealign_S (w[32], w[33], offset); w[32] = amd_bytealign_S (w[31], w[32], offset); w[31] = amd_bytealign_S (w[30], w[31], offset); w[30] = amd_bytealign_S (w[29], w[30], offset); w[29] = amd_bytealign_S (w[28], w[29], offset); w[28] = amd_bytealign_S (w[27], w[28], offset); w[27] = amd_bytealign_S (w[26], w[27], offset); w[26] = amd_bytealign_S (w[25], w[26], offset); w[25] = amd_bytealign_S (w[24], w[25], offset); w[24] = amd_bytealign_S (w[23], w[24], offset); w[23] = amd_bytealign_S (w[22], w[23], offset); w[22] = amd_bytealign_S (w[21], w[22], offset); w[21] = amd_bytealign_S (w[20], w[21], offset); w[20] = amd_bytealign_S (w[19], w[20], offset); w[19] = amd_bytealign_S (w[18], w[19], offset); w[18] = amd_bytealign_S (w[17], w[18], offset); w[17] = amd_bytealign_S (w[16], w[17], offset); w[16] = amd_bytealign_S (w[15], w[16], offset); w[15] = amd_bytealign_S (w[14], w[15], offset); w[14] = amd_bytealign_S (w[13], w[14], offset); w[13] = amd_bytealign_S (w[12], w[13], offset); w[12] = amd_bytealign_S (w[11], w[12], offset); w[11] = amd_bytealign_S (w[10], w[11], offset); w[10] = amd_bytealign_S (w[ 9], w[10], offset); w[ 9] = amd_bytealign_S (w[ 8], w[ 9], offset); w[ 8] = amd_bytealign_S (w[ 7], w[ 8], offset); w[ 7] = amd_bytealign_S (w[ 6], w[ 7], offset); w[ 6] = amd_bytealign_S (w[ 5], w[ 6], offset); w[ 5] = amd_bytealign_S (w[ 4], w[ 5], offset); w[ 4] = amd_bytealign_S (w[ 3], w[ 4], offset); w[ 3] = amd_bytealign_S (w[ 2], w[ 3], offset); w[ 2] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 1] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 0] = amd_bytealign_S ( 0, w[ 0], offset); break; case 1: w[63] = amd_bytealign_S (w[61], w[62], offset); w[62] = amd_bytealign_S (w[60], w[61], offset); w[61] = amd_bytealign_S (w[59], w[60], offset); w[60] = amd_bytealign_S (w[58], w[59], offset); w[59] = amd_bytealign_S (w[57], w[58], offset); w[58] = amd_bytealign_S (w[56], w[57], offset); w[57] = amd_bytealign_S (w[55], w[56], offset); w[56] = amd_bytealign_S (w[54], w[55], offset); w[55] = amd_bytealign_S (w[53], w[54], offset); w[54] = amd_bytealign_S (w[52], w[53], offset); w[53] = amd_bytealign_S (w[51], w[52], offset); w[52] = amd_bytealign_S (w[50], w[51], offset); w[51] = amd_bytealign_S (w[49], w[50], offset); w[50] = amd_bytealign_S (w[48], w[49], offset); w[49] = amd_bytealign_S (w[47], w[48], offset); w[48] = amd_bytealign_S (w[46], w[47], offset); w[47] = amd_bytealign_S (w[45], w[46], offset); w[46] = amd_bytealign_S (w[44], w[45], offset); w[45] = amd_bytealign_S (w[43], w[44], offset); w[44] = amd_bytealign_S (w[42], w[43], offset); w[43] = amd_bytealign_S (w[41], w[42], offset); w[42] = amd_bytealign_S (w[40], w[41], offset); w[41] = amd_bytealign_S (w[39], w[40], offset); w[40] = amd_bytealign_S (w[38], w[39], offset); w[39] = amd_bytealign_S (w[37], w[38], offset); w[38] = amd_bytealign_S (w[36], w[37], offset); w[37] = amd_bytealign_S (w[35], w[36], offset); w[36] = amd_bytealign_S (w[34], w[35], offset); w[35] = amd_bytealign_S (w[33], w[34], offset); w[34] = amd_bytealign_S (w[32], w[33], offset); w[33] = amd_bytealign_S (w[31], w[32], offset); w[32] = amd_bytealign_S (w[30], w[31], offset); w[31] = amd_bytealign_S (w[29], w[30], offset); w[30] = amd_bytealign_S (w[28], w[29], offset); w[29] = amd_bytealign_S (w[27], w[28], offset); w[28] = amd_bytealign_S (w[26], w[27], offset); w[27] = amd_bytealign_S (w[25], w[26], offset); w[26] = amd_bytealign_S (w[24], w[25], offset); w[25] = amd_bytealign_S (w[23], w[24], offset); w[24] = amd_bytealign_S (w[22], w[23], offset); w[23] = amd_bytealign_S (w[21], w[22], offset); w[22] = amd_bytealign_S (w[20], w[21], offset); w[21] = amd_bytealign_S (w[19], w[20], offset); w[20] = amd_bytealign_S (w[18], w[19], offset); w[19] = amd_bytealign_S (w[17], w[18], offset); w[18] = amd_bytealign_S (w[16], w[17], offset); w[17] = amd_bytealign_S (w[15], w[16], offset); w[16] = amd_bytealign_S (w[14], w[15], offset); w[15] = amd_bytealign_S (w[13], w[14], offset); w[14] = amd_bytealign_S (w[12], w[13], offset); w[13] = amd_bytealign_S (w[11], w[12], offset); w[12] = amd_bytealign_S (w[10], w[11], offset); w[11] = amd_bytealign_S (w[ 9], w[10], offset); w[10] = amd_bytealign_S (w[ 8], w[ 9], offset); w[ 9] = amd_bytealign_S (w[ 7], w[ 8], offset); w[ 8] = amd_bytealign_S (w[ 6], w[ 7], offset); w[ 7] = amd_bytealign_S (w[ 5], w[ 6], offset); w[ 6] = amd_bytealign_S (w[ 4], w[ 5], offset); w[ 5] = amd_bytealign_S (w[ 3], w[ 4], offset); w[ 4] = amd_bytealign_S (w[ 2], w[ 3], offset); w[ 3] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 2] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 1] = amd_bytealign_S ( 0, w[ 0], offset); w[ 0] = 0; break; case 2: w[63] = amd_bytealign_S (w[60], w[61], offset); w[62] = amd_bytealign_S (w[59], w[60], offset); w[61] = amd_bytealign_S (w[58], w[59], offset); w[60] = amd_bytealign_S (w[57], w[58], offset); w[59] = amd_bytealign_S (w[56], w[57], offset); w[58] = amd_bytealign_S (w[55], w[56], offset); w[57] = amd_bytealign_S (w[54], w[55], offset); w[56] = amd_bytealign_S (w[53], w[54], offset); w[55] = amd_bytealign_S (w[52], w[53], offset); w[54] = amd_bytealign_S (w[51], w[52], offset); w[53] = amd_bytealign_S (w[50], w[51], offset); w[52] = amd_bytealign_S (w[49], w[50], offset); w[51] = amd_bytealign_S (w[48], w[49], offset); w[50] = amd_bytealign_S (w[47], w[48], offset); w[49] = amd_bytealign_S (w[46], w[47], offset); w[48] = amd_bytealign_S (w[45], w[46], offset); w[47] = amd_bytealign_S (w[44], w[45], offset); w[46] = amd_bytealign_S (w[43], w[44], offset); w[45] = amd_bytealign_S (w[42], w[43], offset); w[44] = amd_bytealign_S (w[41], w[42], offset); w[43] = amd_bytealign_S (w[40], w[41], offset); w[42] = amd_bytealign_S (w[39], w[40], offset); w[41] = amd_bytealign_S (w[38], w[39], offset); w[40] = amd_bytealign_S (w[37], w[38], offset); w[39] = amd_bytealign_S (w[36], w[37], offset); w[38] = amd_bytealign_S (w[35], w[36], offset); w[37] = amd_bytealign_S (w[34], w[35], offset); w[36] = amd_bytealign_S (w[33], w[34], offset); w[35] = amd_bytealign_S (w[32], w[33], offset); w[34] = amd_bytealign_S (w[31], w[32], offset); w[33] = amd_bytealign_S (w[30], w[31], offset); w[32] = amd_bytealign_S (w[29], w[30], offset); w[31] = amd_bytealign_S (w[28], w[29], offset); w[30] = amd_bytealign_S (w[27], w[28], offset); w[29] = amd_bytealign_S (w[26], w[27], offset); w[28] = amd_bytealign_S (w[25], w[26], offset); w[27] = amd_bytealign_S (w[24], w[25], offset); w[26] = amd_bytealign_S (w[23], w[24], offset); w[25] = amd_bytealign_S (w[22], w[23], offset); w[24] = amd_bytealign_S (w[21], w[22], offset); w[23] = amd_bytealign_S (w[20], w[21], offset); w[22] = amd_bytealign_S (w[19], w[20], offset); w[21] = amd_bytealign_S (w[18], w[19], offset); w[20] = amd_bytealign_S (w[17], w[18], offset); w[19] = amd_bytealign_S (w[16], w[17], offset); w[18] = amd_bytealign_S (w[15], w[16], offset); w[17] = amd_bytealign_S (w[14], w[15], offset); w[16] = amd_bytealign_S (w[13], w[14], offset); w[15] = amd_bytealign_S (w[12], w[13], offset); w[14] = amd_bytealign_S (w[11], w[12], offset); w[13] = amd_bytealign_S (w[10], w[11], offset); w[12] = amd_bytealign_S (w[ 9], w[10], offset); w[11] = amd_bytealign_S (w[ 8], w[ 9], offset); w[10] = amd_bytealign_S (w[ 7], w[ 8], offset); w[ 9] = amd_bytealign_S (w[ 6], w[ 7], offset); w[ 8] = amd_bytealign_S (w[ 5], w[ 6], offset); w[ 7] = amd_bytealign_S (w[ 4], w[ 5], offset); w[ 6] = amd_bytealign_S (w[ 3], w[ 4], offset); w[ 5] = amd_bytealign_S (w[ 2], w[ 3], offset); w[ 4] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 3] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 2] = amd_bytealign_S ( 0, w[ 0], offset); w[ 1] = 0; w[ 0] = 0; break; case 3: w[63] = amd_bytealign_S (w[59], w[60], offset); w[62] = amd_bytealign_S (w[58], w[59], offset); w[61] = amd_bytealign_S (w[57], w[58], offset); w[60] = amd_bytealign_S (w[56], w[57], offset); w[59] = amd_bytealign_S (w[55], w[56], offset); w[58] = amd_bytealign_S (w[54], w[55], offset); w[57] = amd_bytealign_S (w[53], w[54], offset); w[56] = amd_bytealign_S (w[52], w[53], offset); w[55] = amd_bytealign_S (w[51], w[52], offset); w[54] = amd_bytealign_S (w[50], w[51], offset); w[53] = amd_bytealign_S (w[49], w[50], offset); w[52] = amd_bytealign_S (w[48], w[49], offset); w[51] = amd_bytealign_S (w[47], w[48], offset); w[50] = amd_bytealign_S (w[46], w[47], offset); w[49] = amd_bytealign_S (w[45], w[46], offset); w[48] = amd_bytealign_S (w[44], w[45], offset); w[47] = amd_bytealign_S (w[43], w[44], offset); w[46] = amd_bytealign_S (w[42], w[43], offset); w[45] = amd_bytealign_S (w[41], w[42], offset); w[44] = amd_bytealign_S (w[40], w[41], offset); w[43] = amd_bytealign_S (w[39], w[40], offset); w[42] = amd_bytealign_S (w[38], w[39], offset); w[41] = amd_bytealign_S (w[37], w[38], offset); w[40] = amd_bytealign_S (w[36], w[37], offset); w[39] = amd_bytealign_S (w[35], w[36], offset); w[38] = amd_bytealign_S (w[34], w[35], offset); w[37] = amd_bytealign_S (w[33], w[34], offset); w[36] = amd_bytealign_S (w[32], w[33], offset); w[35] = amd_bytealign_S (w[31], w[32], offset); w[34] = amd_bytealign_S (w[30], w[31], offset); w[33] = amd_bytealign_S (w[29], w[30], offset); w[32] = amd_bytealign_S (w[28], w[29], offset); w[31] = amd_bytealign_S (w[27], w[28], offset); w[30] = amd_bytealign_S (w[26], w[27], offset); w[29] = amd_bytealign_S (w[25], w[26], offset); w[28] = amd_bytealign_S (w[24], w[25], offset); w[27] = amd_bytealign_S (w[23], w[24], offset); w[26] = amd_bytealign_S (w[22], w[23], offset); w[25] = amd_bytealign_S (w[21], w[22], offset); w[24] = amd_bytealign_S (w[20], w[21], offset); w[23] = amd_bytealign_S (w[19], w[20], offset); w[22] = amd_bytealign_S (w[18], w[19], offset); w[21] = amd_bytealign_S (w[17], w[18], offset); w[20] = amd_bytealign_S (w[16], w[17], offset); w[19] = amd_bytealign_S (w[15], w[16], offset); w[18] = amd_bytealign_S (w[14], w[15], offset); w[17] = amd_bytealign_S (w[13], w[14], offset); w[16] = amd_bytealign_S (w[12], w[13], offset); w[15] = amd_bytealign_S (w[11], w[12], offset); w[14] = amd_bytealign_S (w[10], w[11], offset); w[13] = amd_bytealign_S (w[ 9], w[10], offset); w[12] = amd_bytealign_S (w[ 8], w[ 9], offset); w[11] = amd_bytealign_S (w[ 7], w[ 8], offset); w[10] = amd_bytealign_S (w[ 6], w[ 7], offset); w[ 9] = amd_bytealign_S (w[ 5], w[ 6], offset); w[ 8] = amd_bytealign_S (w[ 4], w[ 5], offset); w[ 7] = amd_bytealign_S (w[ 3], w[ 4], offset); w[ 6] = amd_bytealign_S (w[ 2], w[ 3], offset); w[ 5] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 4] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 3] = amd_bytealign_S ( 0, w[ 0], offset); w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 4: w[63] = amd_bytealign_S (w[58], w[59], offset); w[62] = amd_bytealign_S (w[57], w[58], offset); w[61] = amd_bytealign_S (w[56], w[57], offset); w[60] = amd_bytealign_S (w[55], w[56], offset); w[59] = amd_bytealign_S (w[54], w[55], offset); w[58] = amd_bytealign_S (w[53], w[54], offset); w[57] = amd_bytealign_S (w[52], w[53], offset); w[56] = amd_bytealign_S (w[51], w[52], offset); w[55] = amd_bytealign_S (w[50], w[51], offset); w[54] = amd_bytealign_S (w[49], w[50], offset); w[53] = amd_bytealign_S (w[48], w[49], offset); w[52] = amd_bytealign_S (w[47], w[48], offset); w[51] = amd_bytealign_S (w[46], w[47], offset); w[50] = amd_bytealign_S (w[45], w[46], offset); w[49] = amd_bytealign_S (w[44], w[45], offset); w[48] = amd_bytealign_S (w[43], w[44], offset); w[47] = amd_bytealign_S (w[42], w[43], offset); w[46] = amd_bytealign_S (w[41], w[42], offset); w[45] = amd_bytealign_S (w[40], w[41], offset); w[44] = amd_bytealign_S (w[39], w[40], offset); w[43] = amd_bytealign_S (w[38], w[39], offset); w[42] = amd_bytealign_S (w[37], w[38], offset); w[41] = amd_bytealign_S (w[36], w[37], offset); w[40] = amd_bytealign_S (w[35], w[36], offset); w[39] = amd_bytealign_S (w[34], w[35], offset); w[38] = amd_bytealign_S (w[33], w[34], offset); w[37] = amd_bytealign_S (w[32], w[33], offset); w[36] = amd_bytealign_S (w[31], w[32], offset); w[35] = amd_bytealign_S (w[30], w[31], offset); w[34] = amd_bytealign_S (w[29], w[30], offset); w[33] = amd_bytealign_S (w[28], w[29], offset); w[32] = amd_bytealign_S (w[27], w[28], offset); w[31] = amd_bytealign_S (w[26], w[27], offset); w[30] = amd_bytealign_S (w[25], w[26], offset); w[29] = amd_bytealign_S (w[24], w[25], offset); w[28] = amd_bytealign_S (w[23], w[24], offset); w[27] = amd_bytealign_S (w[22], w[23], offset); w[26] = amd_bytealign_S (w[21], w[22], offset); w[25] = amd_bytealign_S (w[20], w[21], offset); w[24] = amd_bytealign_S (w[19], w[20], offset); w[23] = amd_bytealign_S (w[18], w[19], offset); w[22] = amd_bytealign_S (w[17], w[18], offset); w[21] = amd_bytealign_S (w[16], w[17], offset); w[20] = amd_bytealign_S (w[15], w[16], offset); w[19] = amd_bytealign_S (w[14], w[15], offset); w[18] = amd_bytealign_S (w[13], w[14], offset); w[17] = amd_bytealign_S (w[12], w[13], offset); w[16] = amd_bytealign_S (w[11], w[12], offset); w[15] = amd_bytealign_S (w[10], w[11], offset); w[14] = amd_bytealign_S (w[ 9], w[10], offset); w[13] = amd_bytealign_S (w[ 8], w[ 9], offset); w[12] = amd_bytealign_S (w[ 7], w[ 8], offset); w[11] = amd_bytealign_S (w[ 6], w[ 7], offset); w[10] = amd_bytealign_S (w[ 5], w[ 6], offset); w[ 9] = amd_bytealign_S (w[ 4], w[ 5], offset); w[ 8] = amd_bytealign_S (w[ 3], w[ 4], offset); w[ 7] = amd_bytealign_S (w[ 2], w[ 3], offset); w[ 6] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 5] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 4] = amd_bytealign_S ( 0, w[ 0], offset); w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 5: w[63] = amd_bytealign_S (w[57], w[58], offset); w[62] = amd_bytealign_S (w[56], w[57], offset); w[61] = amd_bytealign_S (w[55], w[56], offset); w[60] = amd_bytealign_S (w[54], w[55], offset); w[59] = amd_bytealign_S (w[53], w[54], offset); w[58] = amd_bytealign_S (w[52], w[53], offset); w[57] = amd_bytealign_S (w[51], w[52], offset); w[56] = amd_bytealign_S (w[50], w[51], offset); w[55] = amd_bytealign_S (w[49], w[50], offset); w[54] = amd_bytealign_S (w[48], w[49], offset); w[53] = amd_bytealign_S (w[47], w[48], offset); w[52] = amd_bytealign_S (w[46], w[47], offset); w[51] = amd_bytealign_S (w[45], w[46], offset); w[50] = amd_bytealign_S (w[44], w[45], offset); w[49] = amd_bytealign_S (w[43], w[44], offset); w[48] = amd_bytealign_S (w[42], w[43], offset); w[47] = amd_bytealign_S (w[41], w[42], offset); w[46] = amd_bytealign_S (w[40], w[41], offset); w[45] = amd_bytealign_S (w[39], w[40], offset); w[44] = amd_bytealign_S (w[38], w[39], offset); w[43] = amd_bytealign_S (w[37], w[38], offset); w[42] = amd_bytealign_S (w[36], w[37], offset); w[41] = amd_bytealign_S (w[35], w[36], offset); w[40] = amd_bytealign_S (w[34], w[35], offset); w[39] = amd_bytealign_S (w[33], w[34], offset); w[38] = amd_bytealign_S (w[32], w[33], offset); w[37] = amd_bytealign_S (w[31], w[32], offset); w[36] = amd_bytealign_S (w[30], w[31], offset); w[35] = amd_bytealign_S (w[29], w[30], offset); w[34] = amd_bytealign_S (w[28], w[29], offset); w[33] = amd_bytealign_S (w[27], w[28], offset); w[32] = amd_bytealign_S (w[26], w[27], offset); w[31] = amd_bytealign_S (w[25], w[26], offset); w[30] = amd_bytealign_S (w[24], w[25], offset); w[29] = amd_bytealign_S (w[23], w[24], offset); w[28] = amd_bytealign_S (w[22], w[23], offset); w[27] = amd_bytealign_S (w[21], w[22], offset); w[26] = amd_bytealign_S (w[20], w[21], offset); w[25] = amd_bytealign_S (w[19], w[20], offset); w[24] = amd_bytealign_S (w[18], w[19], offset); w[23] = amd_bytealign_S (w[17], w[18], offset); w[22] = amd_bytealign_S (w[16], w[17], offset); w[21] = amd_bytealign_S (w[15], w[16], offset); w[20] = amd_bytealign_S (w[14], w[15], offset); w[19] = amd_bytealign_S (w[13], w[14], offset); w[18] = amd_bytealign_S (w[12], w[13], offset); w[17] = amd_bytealign_S (w[11], w[12], offset); w[16] = amd_bytealign_S (w[10], w[11], offset); w[15] = amd_bytealign_S (w[ 9], w[10], offset); w[14] = amd_bytealign_S (w[ 8], w[ 9], offset); w[13] = amd_bytealign_S (w[ 7], w[ 8], offset); w[12] = amd_bytealign_S (w[ 6], w[ 7], offset); w[11] = amd_bytealign_S (w[ 5], w[ 6], offset); w[10] = amd_bytealign_S (w[ 4], w[ 5], offset); w[ 9] = amd_bytealign_S (w[ 3], w[ 4], offset); w[ 8] = amd_bytealign_S (w[ 2], w[ 3], offset); w[ 7] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 6] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 5] = amd_bytealign_S ( 0, w[ 0], offset); w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 6: w[63] = amd_bytealign_S (w[56], w[57], offset); w[62] = amd_bytealign_S (w[55], w[56], offset); w[61] = amd_bytealign_S (w[54], w[55], offset); w[60] = amd_bytealign_S (w[53], w[54], offset); w[59] = amd_bytealign_S (w[52], w[53], offset); w[58] = amd_bytealign_S (w[51], w[52], offset); w[57] = amd_bytealign_S (w[50], w[51], offset); w[56] = amd_bytealign_S (w[49], w[50], offset); w[55] = amd_bytealign_S (w[48], w[49], offset); w[54] = amd_bytealign_S (w[47], w[48], offset); w[53] = amd_bytealign_S (w[46], w[47], offset); w[52] = amd_bytealign_S (w[45], w[46], offset); w[51] = amd_bytealign_S (w[44], w[45], offset); w[50] = amd_bytealign_S (w[43], w[44], offset); w[49] = amd_bytealign_S (w[42], w[43], offset); w[48] = amd_bytealign_S (w[41], w[42], offset); w[47] = amd_bytealign_S (w[40], w[41], offset); w[46] = amd_bytealign_S (w[39], w[40], offset); w[45] = amd_bytealign_S (w[38], w[39], offset); w[44] = amd_bytealign_S (w[37], w[38], offset); w[43] = amd_bytealign_S (w[36], w[37], offset); w[42] = amd_bytealign_S (w[35], w[36], offset); w[41] = amd_bytealign_S (w[34], w[35], offset); w[40] = amd_bytealign_S (w[33], w[34], offset); w[39] = amd_bytealign_S (w[32], w[33], offset); w[38] = amd_bytealign_S (w[31], w[32], offset); w[37] = amd_bytealign_S (w[30], w[31], offset); w[36] = amd_bytealign_S (w[29], w[30], offset); w[35] = amd_bytealign_S (w[28], w[29], offset); w[34] = amd_bytealign_S (w[27], w[28], offset); w[33] = amd_bytealign_S (w[26], w[27], offset); w[32] = amd_bytealign_S (w[25], w[26], offset); w[31] = amd_bytealign_S (w[24], w[25], offset); w[30] = amd_bytealign_S (w[23], w[24], offset); w[29] = amd_bytealign_S (w[22], w[23], offset); w[28] = amd_bytealign_S (w[21], w[22], offset); w[27] = amd_bytealign_S (w[20], w[21], offset); w[26] = amd_bytealign_S (w[19], w[20], offset); w[25] = amd_bytealign_S (w[18], w[19], offset); w[24] = amd_bytealign_S (w[17], w[18], offset); w[23] = amd_bytealign_S (w[16], w[17], offset); w[22] = amd_bytealign_S (w[15], w[16], offset); w[21] = amd_bytealign_S (w[14], w[15], offset); w[20] = amd_bytealign_S (w[13], w[14], offset); w[19] = amd_bytealign_S (w[12], w[13], offset); w[18] = amd_bytealign_S (w[11], w[12], offset); w[17] = amd_bytealign_S (w[10], w[11], offset); w[16] = amd_bytealign_S (w[ 9], w[10], offset); w[15] = amd_bytealign_S (w[ 8], w[ 9], offset); w[14] = amd_bytealign_S (w[ 7], w[ 8], offset); w[13] = amd_bytealign_S (w[ 6], w[ 7], offset); w[12] = amd_bytealign_S (w[ 5], w[ 6], offset); w[11] = amd_bytealign_S (w[ 4], w[ 5], offset); w[10] = amd_bytealign_S (w[ 3], w[ 4], offset); w[ 9] = amd_bytealign_S (w[ 2], w[ 3], offset); w[ 8] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 7] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 6] = amd_bytealign_S ( 0, w[ 0], offset); w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 7: w[63] = amd_bytealign_S (w[55], w[56], offset); w[62] = amd_bytealign_S (w[54], w[55], offset); w[61] = amd_bytealign_S (w[53], w[54], offset); w[60] = amd_bytealign_S (w[52], w[53], offset); w[59] = amd_bytealign_S (w[51], w[52], offset); w[58] = amd_bytealign_S (w[50], w[51], offset); w[57] = amd_bytealign_S (w[49], w[50], offset); w[56] = amd_bytealign_S (w[48], w[49], offset); w[55] = amd_bytealign_S (w[47], w[48], offset); w[54] = amd_bytealign_S (w[46], w[47], offset); w[53] = amd_bytealign_S (w[45], w[46], offset); w[52] = amd_bytealign_S (w[44], w[45], offset); w[51] = amd_bytealign_S (w[43], w[44], offset); w[50] = amd_bytealign_S (w[42], w[43], offset); w[49] = amd_bytealign_S (w[41], w[42], offset); w[48] = amd_bytealign_S (w[40], w[41], offset); w[47] = amd_bytealign_S (w[39], w[40], offset); w[46] = amd_bytealign_S (w[38], w[39], offset); w[45] = amd_bytealign_S (w[37], w[38], offset); w[44] = amd_bytealign_S (w[36], w[37], offset); w[43] = amd_bytealign_S (w[35], w[36], offset); w[42] = amd_bytealign_S (w[34], w[35], offset); w[41] = amd_bytealign_S (w[33], w[34], offset); w[40] = amd_bytealign_S (w[32], w[33], offset); w[39] = amd_bytealign_S (w[31], w[32], offset); w[38] = amd_bytealign_S (w[30], w[31], offset); w[37] = amd_bytealign_S (w[29], w[30], offset); w[36] = amd_bytealign_S (w[28], w[29], offset); w[35] = amd_bytealign_S (w[27], w[28], offset); w[34] = amd_bytealign_S (w[26], w[27], offset); w[33] = amd_bytealign_S (w[25], w[26], offset); w[32] = amd_bytealign_S (w[24], w[25], offset); w[31] = amd_bytealign_S (w[23], w[24], offset); w[30] = amd_bytealign_S (w[22], w[23], offset); w[29] = amd_bytealign_S (w[21], w[22], offset); w[28] = amd_bytealign_S (w[20], w[21], offset); w[27] = amd_bytealign_S (w[19], w[20], offset); w[26] = amd_bytealign_S (w[18], w[19], offset); w[25] = amd_bytealign_S (w[17], w[18], offset); w[24] = amd_bytealign_S (w[16], w[17], offset); w[23] = amd_bytealign_S (w[15], w[16], offset); w[22] = amd_bytealign_S (w[14], w[15], offset); w[21] = amd_bytealign_S (w[13], w[14], offset); w[20] = amd_bytealign_S (w[12], w[13], offset); w[19] = amd_bytealign_S (w[11], w[12], offset); w[18] = amd_bytealign_S (w[10], w[11], offset); w[17] = amd_bytealign_S (w[ 9], w[10], offset); w[16] = amd_bytealign_S (w[ 8], w[ 9], offset); w[15] = amd_bytealign_S (w[ 7], w[ 8], offset); w[14] = amd_bytealign_S (w[ 6], w[ 7], offset); w[13] = amd_bytealign_S (w[ 5], w[ 6], offset); w[12] = amd_bytealign_S (w[ 4], w[ 5], offset); w[11] = amd_bytealign_S (w[ 3], w[ 4], offset); w[10] = amd_bytealign_S (w[ 2], w[ 3], offset); w[ 9] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 8] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 7] = amd_bytealign_S ( 0, w[ 0], offset); w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 8: w[63] = amd_bytealign_S (w[54], w[55], offset); w[62] = amd_bytealign_S (w[53], w[54], offset); w[61] = amd_bytealign_S (w[52], w[53], offset); w[60] = amd_bytealign_S (w[51], w[52], offset); w[59] = amd_bytealign_S (w[50], w[51], offset); w[58] = amd_bytealign_S (w[49], w[50], offset); w[57] = amd_bytealign_S (w[48], w[49], offset); w[56] = amd_bytealign_S (w[47], w[48], offset); w[55] = amd_bytealign_S (w[46], w[47], offset); w[54] = amd_bytealign_S (w[45], w[46], offset); w[53] = amd_bytealign_S (w[44], w[45], offset); w[52] = amd_bytealign_S (w[43], w[44], offset); w[51] = amd_bytealign_S (w[42], w[43], offset); w[50] = amd_bytealign_S (w[41], w[42], offset); w[49] = amd_bytealign_S (w[40], w[41], offset); w[48] = amd_bytealign_S (w[39], w[40], offset); w[47] = amd_bytealign_S (w[38], w[39], offset); w[46] = amd_bytealign_S (w[37], w[38], offset); w[45] = amd_bytealign_S (w[36], w[37], offset); w[44] = amd_bytealign_S (w[35], w[36], offset); w[43] = amd_bytealign_S (w[34], w[35], offset); w[42] = amd_bytealign_S (w[33], w[34], offset); w[41] = amd_bytealign_S (w[32], w[33], offset); w[40] = amd_bytealign_S (w[31], w[32], offset); w[39] = amd_bytealign_S (w[30], w[31], offset); w[38] = amd_bytealign_S (w[29], w[30], offset); w[37] = amd_bytealign_S (w[28], w[29], offset); w[36] = amd_bytealign_S (w[27], w[28], offset); w[35] = amd_bytealign_S (w[26], w[27], offset); w[34] = amd_bytealign_S (w[25], w[26], offset); w[33] = amd_bytealign_S (w[24], w[25], offset); w[32] = amd_bytealign_S (w[23], w[24], offset); w[31] = amd_bytealign_S (w[22], w[23], offset); w[30] = amd_bytealign_S (w[21], w[22], offset); w[29] = amd_bytealign_S (w[20], w[21], offset); w[28] = amd_bytealign_S (w[19], w[20], offset); w[27] = amd_bytealign_S (w[18], w[19], offset); w[26] = amd_bytealign_S (w[17], w[18], offset); w[25] = amd_bytealign_S (w[16], w[17], offset); w[24] = amd_bytealign_S (w[15], w[16], offset); w[23] = amd_bytealign_S (w[14], w[15], offset); w[22] = amd_bytealign_S (w[13], w[14], offset); w[21] = amd_bytealign_S (w[12], w[13], offset); w[20] = amd_bytealign_S (w[11], w[12], offset); w[19] = amd_bytealign_S (w[10], w[11], offset); w[18] = amd_bytealign_S (w[ 9], w[10], offset); w[17] = amd_bytealign_S (w[ 8], w[ 9], offset); w[16] = amd_bytealign_S (w[ 7], w[ 8], offset); w[15] = amd_bytealign_S (w[ 6], w[ 7], offset); w[14] = amd_bytealign_S (w[ 5], w[ 6], offset); w[13] = amd_bytealign_S (w[ 4], w[ 5], offset); w[12] = amd_bytealign_S (w[ 3], w[ 4], offset); w[11] = amd_bytealign_S (w[ 2], w[ 3], offset); w[10] = amd_bytealign_S (w[ 1], w[ 2], offset); w[ 9] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 8] = amd_bytealign_S ( 0, w[ 0], offset); w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 9: w[63] = amd_bytealign_S (w[53], w[54], offset); w[62] = amd_bytealign_S (w[52], w[53], offset); w[61] = amd_bytealign_S (w[51], w[52], offset); w[60] = amd_bytealign_S (w[50], w[51], offset); w[59] = amd_bytealign_S (w[49], w[50], offset); w[58] = amd_bytealign_S (w[48], w[49], offset); w[57] = amd_bytealign_S (w[47], w[48], offset); w[56] = amd_bytealign_S (w[46], w[47], offset); w[55] = amd_bytealign_S (w[45], w[46], offset); w[54] = amd_bytealign_S (w[44], w[45], offset); w[53] = amd_bytealign_S (w[43], w[44], offset); w[52] = amd_bytealign_S (w[42], w[43], offset); w[51] = amd_bytealign_S (w[41], w[42], offset); w[50] = amd_bytealign_S (w[40], w[41], offset); w[49] = amd_bytealign_S (w[39], w[40], offset); w[48] = amd_bytealign_S (w[38], w[39], offset); w[47] = amd_bytealign_S (w[37], w[38], offset); w[46] = amd_bytealign_S (w[36], w[37], offset); w[45] = amd_bytealign_S (w[35], w[36], offset); w[44] = amd_bytealign_S (w[34], w[35], offset); w[43] = amd_bytealign_S (w[33], w[34], offset); w[42] = amd_bytealign_S (w[32], w[33], offset); w[41] = amd_bytealign_S (w[31], w[32], offset); w[40] = amd_bytealign_S (w[30], w[31], offset); w[39] = amd_bytealign_S (w[29], w[30], offset); w[38] = amd_bytealign_S (w[28], w[29], offset); w[37] = amd_bytealign_S (w[27], w[28], offset); w[36] = amd_bytealign_S (w[26], w[27], offset); w[35] = amd_bytealign_S (w[25], w[26], offset); w[34] = amd_bytealign_S (w[24], w[25], offset); w[33] = amd_bytealign_S (w[23], w[24], offset); w[32] = amd_bytealign_S (w[22], w[23], offset); w[31] = amd_bytealign_S (w[21], w[22], offset); w[30] = amd_bytealign_S (w[20], w[21], offset); w[29] = amd_bytealign_S (w[19], w[20], offset); w[28] = amd_bytealign_S (w[18], w[19], offset); w[27] = amd_bytealign_S (w[17], w[18], offset); w[26] = amd_bytealign_S (w[16], w[17], offset); w[25] = amd_bytealign_S (w[15], w[16], offset); w[24] = amd_bytealign_S (w[14], w[15], offset); w[23] = amd_bytealign_S (w[13], w[14], offset); w[22] = amd_bytealign_S (w[12], w[13], offset); w[21] = amd_bytealign_S (w[11], w[12], offset); w[20] = amd_bytealign_S (w[10], w[11], offset); w[19] = amd_bytealign_S (w[ 9], w[10], offset); w[18] = amd_bytealign_S (w[ 8], w[ 9], offset); w[17] = amd_bytealign_S (w[ 7], w[ 8], offset); w[16] = amd_bytealign_S (w[ 6], w[ 7], offset); w[15] = amd_bytealign_S (w[ 5], w[ 6], offset); w[14] = amd_bytealign_S (w[ 4], w[ 5], offset); w[13] = amd_bytealign_S (w[ 3], w[ 4], offset); w[12] = amd_bytealign_S (w[ 2], w[ 3], offset); w[11] = amd_bytealign_S (w[ 1], w[ 2], offset); w[10] = amd_bytealign_S (w[ 0], w[ 1], offset); w[ 9] = amd_bytealign_S ( 0, w[ 0], offset); w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 10: w[63] = amd_bytealign_S (w[52], w[53], offset); w[62] = amd_bytealign_S (w[51], w[52], offset); w[61] = amd_bytealign_S (w[50], w[51], offset); w[60] = amd_bytealign_S (w[49], w[50], offset); w[59] = amd_bytealign_S (w[48], w[49], offset); w[58] = amd_bytealign_S (w[47], w[48], offset); w[57] = amd_bytealign_S (w[46], w[47], offset); w[56] = amd_bytealign_S (w[45], w[46], offset); w[55] = amd_bytealign_S (w[44], w[45], offset); w[54] = amd_bytealign_S (w[43], w[44], offset); w[53] = amd_bytealign_S (w[42], w[43], offset); w[52] = amd_bytealign_S (w[41], w[42], offset); w[51] = amd_bytealign_S (w[40], w[41], offset); w[50] = amd_bytealign_S (w[39], w[40], offset); w[49] = amd_bytealign_S (w[38], w[39], offset); w[48] = amd_bytealign_S (w[37], w[38], offset); w[47] = amd_bytealign_S (w[36], w[37], offset); w[46] = amd_bytealign_S (w[35], w[36], offset); w[45] = amd_bytealign_S (w[34], w[35], offset); w[44] = amd_bytealign_S (w[33], w[34], offset); w[43] = amd_bytealign_S (w[32], w[33], offset); w[42] = amd_bytealign_S (w[31], w[32], offset); w[41] = amd_bytealign_S (w[30], w[31], offset); w[40] = amd_bytealign_S (w[29], w[30], offset); w[39] = amd_bytealign_S (w[28], w[29], offset); w[38] = amd_bytealign_S (w[27], w[28], offset); w[37] = amd_bytealign_S (w[26], w[27], offset); w[36] = amd_bytealign_S (w[25], w[26], offset); w[35] = amd_bytealign_S (w[24], w[25], offset); w[34] = amd_bytealign_S (w[23], w[24], offset); w[33] = amd_bytealign_S (w[22], w[23], offset); w[32] = amd_bytealign_S (w[21], w[22], offset); w[31] = amd_bytealign_S (w[20], w[21], offset); w[30] = amd_bytealign_S (w[19], w[20], offset); w[29] = amd_bytealign_S (w[18], w[19], offset); w[28] = amd_bytealign_S (w[17], w[18], offset); w[27] = amd_bytealign_S (w[16], w[17], offset); w[26] = amd_bytealign_S (w[15], w[16], offset); w[25] = amd_bytealign_S (w[14], w[15], offset); w[24] = amd_bytealign_S (w[13], w[14], offset); w[23] = amd_bytealign_S (w[12], w[13], offset); w[22] = amd_bytealign_S (w[11], w[12], offset); w[21] = amd_bytealign_S (w[10], w[11], offset); w[20] = amd_bytealign_S (w[ 9], w[10], offset); w[19] = amd_bytealign_S (w[ 8], w[ 9], offset); w[18] = amd_bytealign_S (w[ 7], w[ 8], offset); w[17] = amd_bytealign_S (w[ 6], w[ 7], offset); w[16] = amd_bytealign_S (w[ 5], w[ 6], offset); w[15] = amd_bytealign_S (w[ 4], w[ 5], offset); w[14] = amd_bytealign_S (w[ 3], w[ 4], offset); w[13] = amd_bytealign_S (w[ 2], w[ 3], offset); w[12] = amd_bytealign_S (w[ 1], w[ 2], offset); w[11] = amd_bytealign_S (w[ 0], w[ 1], offset); w[10] = amd_bytealign_S ( 0, w[ 0], offset); w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 11: w[63] = amd_bytealign_S (w[51], w[52], offset); w[62] = amd_bytealign_S (w[50], w[51], offset); w[61] = amd_bytealign_S (w[49], w[50], offset); w[60] = amd_bytealign_S (w[48], w[49], offset); w[59] = amd_bytealign_S (w[47], w[48], offset); w[58] = amd_bytealign_S (w[46], w[47], offset); w[57] = amd_bytealign_S (w[45], w[46], offset); w[56] = amd_bytealign_S (w[44], w[45], offset); w[55] = amd_bytealign_S (w[43], w[44], offset); w[54] = amd_bytealign_S (w[42], w[43], offset); w[53] = amd_bytealign_S (w[41], w[42], offset); w[52] = amd_bytealign_S (w[40], w[41], offset); w[51] = amd_bytealign_S (w[39], w[40], offset); w[50] = amd_bytealign_S (w[38], w[39], offset); w[49] = amd_bytealign_S (w[37], w[38], offset); w[48] = amd_bytealign_S (w[36], w[37], offset); w[47] = amd_bytealign_S (w[35], w[36], offset); w[46] = amd_bytealign_S (w[34], w[35], offset); w[45] = amd_bytealign_S (w[33], w[34], offset); w[44] = amd_bytealign_S (w[32], w[33], offset); w[43] = amd_bytealign_S (w[31], w[32], offset); w[42] = amd_bytealign_S (w[30], w[31], offset); w[41] = amd_bytealign_S (w[29], w[30], offset); w[40] = amd_bytealign_S (w[28], w[29], offset); w[39] = amd_bytealign_S (w[27], w[28], offset); w[38] = amd_bytealign_S (w[26], w[27], offset); w[37] = amd_bytealign_S (w[25], w[26], offset); w[36] = amd_bytealign_S (w[24], w[25], offset); w[35] = amd_bytealign_S (w[23], w[24], offset); w[34] = amd_bytealign_S (w[22], w[23], offset); w[33] = amd_bytealign_S (w[21], w[22], offset); w[32] = amd_bytealign_S (w[20], w[21], offset); w[31] = amd_bytealign_S (w[19], w[20], offset); w[30] = amd_bytealign_S (w[18], w[19], offset); w[29] = amd_bytealign_S (w[17], w[18], offset); w[28] = amd_bytealign_S (w[16], w[17], offset); w[27] = amd_bytealign_S (w[15], w[16], offset); w[26] = amd_bytealign_S (w[14], w[15], offset); w[25] = amd_bytealign_S (w[13], w[14], offset); w[24] = amd_bytealign_S (w[12], w[13], offset); w[23] = amd_bytealign_S (w[11], w[12], offset); w[22] = amd_bytealign_S (w[10], w[11], offset); w[21] = amd_bytealign_S (w[ 9], w[10], offset); w[20] = amd_bytealign_S (w[ 8], w[ 9], offset); w[19] = amd_bytealign_S (w[ 7], w[ 8], offset); w[18] = amd_bytealign_S (w[ 6], w[ 7], offset); w[17] = amd_bytealign_S (w[ 5], w[ 6], offset); w[16] = amd_bytealign_S (w[ 4], w[ 5], offset); w[15] = amd_bytealign_S (w[ 3], w[ 4], offset); w[14] = amd_bytealign_S (w[ 2], w[ 3], offset); w[13] = amd_bytealign_S (w[ 1], w[ 2], offset); w[12] = amd_bytealign_S (w[ 0], w[ 1], offset); w[11] = amd_bytealign_S ( 0, w[ 0], offset); w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 12: w[63] = amd_bytealign_S (w[50], w[51], offset); w[62] = amd_bytealign_S (w[49], w[50], offset); w[61] = amd_bytealign_S (w[48], w[49], offset); w[60] = amd_bytealign_S (w[47], w[48], offset); w[59] = amd_bytealign_S (w[46], w[47], offset); w[58] = amd_bytealign_S (w[45], w[46], offset); w[57] = amd_bytealign_S (w[44], w[45], offset); w[56] = amd_bytealign_S (w[43], w[44], offset); w[55] = amd_bytealign_S (w[42], w[43], offset); w[54] = amd_bytealign_S (w[41], w[42], offset); w[53] = amd_bytealign_S (w[40], w[41], offset); w[52] = amd_bytealign_S (w[39], w[40], offset); w[51] = amd_bytealign_S (w[38], w[39], offset); w[50] = amd_bytealign_S (w[37], w[38], offset); w[49] = amd_bytealign_S (w[36], w[37], offset); w[48] = amd_bytealign_S (w[35], w[36], offset); w[47] = amd_bytealign_S (w[34], w[35], offset); w[46] = amd_bytealign_S (w[33], w[34], offset); w[45] = amd_bytealign_S (w[32], w[33], offset); w[44] = amd_bytealign_S (w[31], w[32], offset); w[43] = amd_bytealign_S (w[30], w[31], offset); w[42] = amd_bytealign_S (w[29], w[30], offset); w[41] = amd_bytealign_S (w[28], w[29], offset); w[40] = amd_bytealign_S (w[27], w[28], offset); w[39] = amd_bytealign_S (w[26], w[27], offset); w[38] = amd_bytealign_S (w[25], w[26], offset); w[37] = amd_bytealign_S (w[24], w[25], offset); w[36] = amd_bytealign_S (w[23], w[24], offset); w[35] = amd_bytealign_S (w[22], w[23], offset); w[34] = amd_bytealign_S (w[21], w[22], offset); w[33] = amd_bytealign_S (w[20], w[21], offset); w[32] = amd_bytealign_S (w[19], w[20], offset); w[31] = amd_bytealign_S (w[18], w[19], offset); w[30] = amd_bytealign_S (w[17], w[18], offset); w[29] = amd_bytealign_S (w[16], w[17], offset); w[28] = amd_bytealign_S (w[15], w[16], offset); w[27] = amd_bytealign_S (w[14], w[15], offset); w[26] = amd_bytealign_S (w[13], w[14], offset); w[25] = amd_bytealign_S (w[12], w[13], offset); w[24] = amd_bytealign_S (w[11], w[12], offset); w[23] = amd_bytealign_S (w[10], w[11], offset); w[22] = amd_bytealign_S (w[ 9], w[10], offset); w[21] = amd_bytealign_S (w[ 8], w[ 9], offset); w[20] = amd_bytealign_S (w[ 7], w[ 8], offset); w[19] = amd_bytealign_S (w[ 6], w[ 7], offset); w[18] = amd_bytealign_S (w[ 5], w[ 6], offset); w[17] = amd_bytealign_S (w[ 4], w[ 5], offset); w[16] = amd_bytealign_S (w[ 3], w[ 4], offset); w[15] = amd_bytealign_S (w[ 2], w[ 3], offset); w[14] = amd_bytealign_S (w[ 1], w[ 2], offset); w[13] = amd_bytealign_S (w[ 0], w[ 1], offset); w[12] = amd_bytealign_S ( 0, w[ 0], offset); w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 13: w[63] = amd_bytealign_S (w[49], w[50], offset); w[62] = amd_bytealign_S (w[48], w[49], offset); w[61] = amd_bytealign_S (w[47], w[48], offset); w[60] = amd_bytealign_S (w[46], w[47], offset); w[59] = amd_bytealign_S (w[45], w[46], offset); w[58] = amd_bytealign_S (w[44], w[45], offset); w[57] = amd_bytealign_S (w[43], w[44], offset); w[56] = amd_bytealign_S (w[42], w[43], offset); w[55] = amd_bytealign_S (w[41], w[42], offset); w[54] = amd_bytealign_S (w[40], w[41], offset); w[53] = amd_bytealign_S (w[39], w[40], offset); w[52] = amd_bytealign_S (w[38], w[39], offset); w[51] = amd_bytealign_S (w[37], w[38], offset); w[50] = amd_bytealign_S (w[36], w[37], offset); w[49] = amd_bytealign_S (w[35], w[36], offset); w[48] = amd_bytealign_S (w[34], w[35], offset); w[47] = amd_bytealign_S (w[33], w[34], offset); w[46] = amd_bytealign_S (w[32], w[33], offset); w[45] = amd_bytealign_S (w[31], w[32], offset); w[44] = amd_bytealign_S (w[30], w[31], offset); w[43] = amd_bytealign_S (w[29], w[30], offset); w[42] = amd_bytealign_S (w[28], w[29], offset); w[41] = amd_bytealign_S (w[27], w[28], offset); w[40] = amd_bytealign_S (w[26], w[27], offset); w[39] = amd_bytealign_S (w[25], w[26], offset); w[38] = amd_bytealign_S (w[24], w[25], offset); w[37] = amd_bytealign_S (w[23], w[24], offset); w[36] = amd_bytealign_S (w[22], w[23], offset); w[35] = amd_bytealign_S (w[21], w[22], offset); w[34] = amd_bytealign_S (w[20], w[21], offset); w[33] = amd_bytealign_S (w[19], w[20], offset); w[32] = amd_bytealign_S (w[18], w[19], offset); w[31] = amd_bytealign_S (w[17], w[18], offset); w[30] = amd_bytealign_S (w[16], w[17], offset); w[29] = amd_bytealign_S (w[15], w[16], offset); w[28] = amd_bytealign_S (w[14], w[15], offset); w[27] = amd_bytealign_S (w[13], w[14], offset); w[26] = amd_bytealign_S (w[12], w[13], offset); w[25] = amd_bytealign_S (w[11], w[12], offset); w[24] = amd_bytealign_S (w[10], w[11], offset); w[23] = amd_bytealign_S (w[ 9], w[10], offset); w[22] = amd_bytealign_S (w[ 8], w[ 9], offset); w[21] = amd_bytealign_S (w[ 7], w[ 8], offset); w[20] = amd_bytealign_S (w[ 6], w[ 7], offset); w[19] = amd_bytealign_S (w[ 5], w[ 6], offset); w[18] = amd_bytealign_S (w[ 4], w[ 5], offset); w[17] = amd_bytealign_S (w[ 3], w[ 4], offset); w[16] = amd_bytealign_S (w[ 2], w[ 3], offset); w[15] = amd_bytealign_S (w[ 1], w[ 2], offset); w[14] = amd_bytealign_S (w[ 0], w[ 1], offset); w[13] = amd_bytealign_S ( 0, w[ 0], offset); w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 14: w[63] = amd_bytealign_S (w[48], w[49], offset); w[62] = amd_bytealign_S (w[47], w[48], offset); w[61] = amd_bytealign_S (w[46], w[47], offset); w[60] = amd_bytealign_S (w[45], w[46], offset); w[59] = amd_bytealign_S (w[44], w[45], offset); w[58] = amd_bytealign_S (w[43], w[44], offset); w[57] = amd_bytealign_S (w[42], w[43], offset); w[56] = amd_bytealign_S (w[41], w[42], offset); w[55] = amd_bytealign_S (w[40], w[41], offset); w[54] = amd_bytealign_S (w[39], w[40], offset); w[53] = amd_bytealign_S (w[38], w[39], offset); w[52] = amd_bytealign_S (w[37], w[38], offset); w[51] = amd_bytealign_S (w[36], w[37], offset); w[50] = amd_bytealign_S (w[35], w[36], offset); w[49] = amd_bytealign_S (w[34], w[35], offset); w[48] = amd_bytealign_S (w[33], w[34], offset); w[47] = amd_bytealign_S (w[32], w[33], offset); w[46] = amd_bytealign_S (w[31], w[32], offset); w[45] = amd_bytealign_S (w[30], w[31], offset); w[44] = amd_bytealign_S (w[29], w[30], offset); w[43] = amd_bytealign_S (w[28], w[29], offset); w[42] = amd_bytealign_S (w[27], w[28], offset); w[41] = amd_bytealign_S (w[26], w[27], offset); w[40] = amd_bytealign_S (w[25], w[26], offset); w[39] = amd_bytealign_S (w[24], w[25], offset); w[38] = amd_bytealign_S (w[23], w[24], offset); w[37] = amd_bytealign_S (w[22], w[23], offset); w[36] = amd_bytealign_S (w[21], w[22], offset); w[35] = amd_bytealign_S (w[20], w[21], offset); w[34] = amd_bytealign_S (w[19], w[20], offset); w[33] = amd_bytealign_S (w[18], w[19], offset); w[32] = amd_bytealign_S (w[17], w[18], offset); w[31] = amd_bytealign_S (w[16], w[17], offset); w[30] = amd_bytealign_S (w[15], w[16], offset); w[29] = amd_bytealign_S (w[14], w[15], offset); w[28] = amd_bytealign_S (w[13], w[14], offset); w[27] = amd_bytealign_S (w[12], w[13], offset); w[26] = amd_bytealign_S (w[11], w[12], offset); w[25] = amd_bytealign_S (w[10], w[11], offset); w[24] = amd_bytealign_S (w[ 9], w[10], offset); w[23] = amd_bytealign_S (w[ 8], w[ 9], offset); w[22] = amd_bytealign_S (w[ 7], w[ 8], offset); w[21] = amd_bytealign_S (w[ 6], w[ 7], offset); w[20] = amd_bytealign_S (w[ 5], w[ 6], offset); w[19] = amd_bytealign_S (w[ 4], w[ 5], offset); w[18] = amd_bytealign_S (w[ 3], w[ 4], offset); w[17] = amd_bytealign_S (w[ 2], w[ 3], offset); w[16] = amd_bytealign_S (w[ 1], w[ 2], offset); w[15] = amd_bytealign_S (w[ 0], w[ 1], offset); w[14] = amd_bytealign_S ( 0, w[ 0], offset); w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 15: w[63] = amd_bytealign_S (w[47], w[48], offset); w[62] = amd_bytealign_S (w[46], w[47], offset); w[61] = amd_bytealign_S (w[45], w[46], offset); w[60] = amd_bytealign_S (w[44], w[45], offset); w[59] = amd_bytealign_S (w[43], w[44], offset); w[58] = amd_bytealign_S (w[42], w[43], offset); w[57] = amd_bytealign_S (w[41], w[42], offset); w[56] = amd_bytealign_S (w[40], w[41], offset); w[55] = amd_bytealign_S (w[39], w[40], offset); w[54] = amd_bytealign_S (w[38], w[39], offset); w[53] = amd_bytealign_S (w[37], w[38], offset); w[52] = amd_bytealign_S (w[36], w[37], offset); w[51] = amd_bytealign_S (w[35], w[36], offset); w[50] = amd_bytealign_S (w[34], w[35], offset); w[49] = amd_bytealign_S (w[33], w[34], offset); w[48] = amd_bytealign_S (w[32], w[33], offset); w[47] = amd_bytealign_S (w[31], w[32], offset); w[46] = amd_bytealign_S (w[30], w[31], offset); w[45] = amd_bytealign_S (w[29], w[30], offset); w[44] = amd_bytealign_S (w[28], w[29], offset); w[43] = amd_bytealign_S (w[27], w[28], offset); w[42] = amd_bytealign_S (w[26], w[27], offset); w[41] = amd_bytealign_S (w[25], w[26], offset); w[40] = amd_bytealign_S (w[24], w[25], offset); w[39] = amd_bytealign_S (w[23], w[24], offset); w[38] = amd_bytealign_S (w[22], w[23], offset); w[37] = amd_bytealign_S (w[21], w[22], offset); w[36] = amd_bytealign_S (w[20], w[21], offset); w[35] = amd_bytealign_S (w[19], w[20], offset); w[34] = amd_bytealign_S (w[18], w[19], offset); w[33] = amd_bytealign_S (w[17], w[18], offset); w[32] = amd_bytealign_S (w[16], w[17], offset); w[31] = amd_bytealign_S (w[15], w[16], offset); w[30] = amd_bytealign_S (w[14], w[15], offset); w[29] = amd_bytealign_S (w[13], w[14], offset); w[28] = amd_bytealign_S (w[12], w[13], offset); w[27] = amd_bytealign_S (w[11], w[12], offset); w[26] = amd_bytealign_S (w[10], w[11], offset); w[25] = amd_bytealign_S (w[ 9], w[10], offset); w[24] = amd_bytealign_S (w[ 8], w[ 9], offset); w[23] = amd_bytealign_S (w[ 7], w[ 8], offset); w[22] = amd_bytealign_S (w[ 6], w[ 7], offset); w[21] = amd_bytealign_S (w[ 5], w[ 6], offset); w[20] = amd_bytealign_S (w[ 4], w[ 5], offset); w[19] = amd_bytealign_S (w[ 3], w[ 4], offset); w[18] = amd_bytealign_S (w[ 2], w[ 3], offset); w[17] = amd_bytealign_S (w[ 1], w[ 2], offset); w[16] = amd_bytealign_S (w[ 0], w[ 1], offset); w[15] = amd_bytealign_S ( 0, w[ 0], offset); w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 16: w[63] = amd_bytealign_S (w[46], w[47], offset); w[62] = amd_bytealign_S (w[45], w[46], offset); w[61] = amd_bytealign_S (w[44], w[45], offset); w[60] = amd_bytealign_S (w[43], w[44], offset); w[59] = amd_bytealign_S (w[42], w[43], offset); w[58] = amd_bytealign_S (w[41], w[42], offset); w[57] = amd_bytealign_S (w[40], w[41], offset); w[56] = amd_bytealign_S (w[39], w[40], offset); w[55] = amd_bytealign_S (w[38], w[39], offset); w[54] = amd_bytealign_S (w[37], w[38], offset); w[53] = amd_bytealign_S (w[36], w[37], offset); w[52] = amd_bytealign_S (w[35], w[36], offset); w[51] = amd_bytealign_S (w[34], w[35], offset); w[50] = amd_bytealign_S (w[33], w[34], offset); w[49] = amd_bytealign_S (w[32], w[33], offset); w[48] = amd_bytealign_S (w[31], w[32], offset); w[47] = amd_bytealign_S (w[30], w[31], offset); w[46] = amd_bytealign_S (w[29], w[30], offset); w[45] = amd_bytealign_S (w[28], w[29], offset); w[44] = amd_bytealign_S (w[27], w[28], offset); w[43] = amd_bytealign_S (w[26], w[27], offset); w[42] = amd_bytealign_S (w[25], w[26], offset); w[41] = amd_bytealign_S (w[24], w[25], offset); w[40] = amd_bytealign_S (w[23], w[24], offset); w[39] = amd_bytealign_S (w[22], w[23], offset); w[38] = amd_bytealign_S (w[21], w[22], offset); w[37] = amd_bytealign_S (w[20], w[21], offset); w[36] = amd_bytealign_S (w[19], w[20], offset); w[35] = amd_bytealign_S (w[18], w[19], offset); w[34] = amd_bytealign_S (w[17], w[18], offset); w[33] = amd_bytealign_S (w[16], w[17], offset); w[32] = amd_bytealign_S (w[15], w[16], offset); w[31] = amd_bytealign_S (w[14], w[15], offset); w[30] = amd_bytealign_S (w[13], w[14], offset); w[29] = amd_bytealign_S (w[12], w[13], offset); w[28] = amd_bytealign_S (w[11], w[12], offset); w[27] = amd_bytealign_S (w[10], w[11], offset); w[26] = amd_bytealign_S (w[ 9], w[10], offset); w[25] = amd_bytealign_S (w[ 8], w[ 9], offset); w[24] = amd_bytealign_S (w[ 7], w[ 8], offset); w[23] = amd_bytealign_S (w[ 6], w[ 7], offset); w[22] = amd_bytealign_S (w[ 5], w[ 6], offset); w[21] = amd_bytealign_S (w[ 4], w[ 5], offset); w[20] = amd_bytealign_S (w[ 3], w[ 4], offset); w[19] = amd_bytealign_S (w[ 2], w[ 3], offset); w[18] = amd_bytealign_S (w[ 1], w[ 2], offset); w[17] = amd_bytealign_S (w[ 0], w[ 1], offset); w[16] = amd_bytealign_S ( 0, w[ 0], offset); w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 17: w[63] = amd_bytealign_S (w[45], w[46], offset); w[62] = amd_bytealign_S (w[44], w[45], offset); w[61] = amd_bytealign_S (w[43], w[44], offset); w[60] = amd_bytealign_S (w[42], w[43], offset); w[59] = amd_bytealign_S (w[41], w[42], offset); w[58] = amd_bytealign_S (w[40], w[41], offset); w[57] = amd_bytealign_S (w[39], w[40], offset); w[56] = amd_bytealign_S (w[38], w[39], offset); w[55] = amd_bytealign_S (w[37], w[38], offset); w[54] = amd_bytealign_S (w[36], w[37], offset); w[53] = amd_bytealign_S (w[35], w[36], offset); w[52] = amd_bytealign_S (w[34], w[35], offset); w[51] = amd_bytealign_S (w[33], w[34], offset); w[50] = amd_bytealign_S (w[32], w[33], offset); w[49] = amd_bytealign_S (w[31], w[32], offset); w[48] = amd_bytealign_S (w[30], w[31], offset); w[47] = amd_bytealign_S (w[29], w[30], offset); w[46] = amd_bytealign_S (w[28], w[29], offset); w[45] = amd_bytealign_S (w[27], w[28], offset); w[44] = amd_bytealign_S (w[26], w[27], offset); w[43] = amd_bytealign_S (w[25], w[26], offset); w[42] = amd_bytealign_S (w[24], w[25], offset); w[41] = amd_bytealign_S (w[23], w[24], offset); w[40] = amd_bytealign_S (w[22], w[23], offset); w[39] = amd_bytealign_S (w[21], w[22], offset); w[38] = amd_bytealign_S (w[20], w[21], offset); w[37] = amd_bytealign_S (w[19], w[20], offset); w[36] = amd_bytealign_S (w[18], w[19], offset); w[35] = amd_bytealign_S (w[17], w[18], offset); w[34] = amd_bytealign_S (w[16], w[17], offset); w[33] = amd_bytealign_S (w[15], w[16], offset); w[32] = amd_bytealign_S (w[14], w[15], offset); w[31] = amd_bytealign_S (w[13], w[14], offset); w[30] = amd_bytealign_S (w[12], w[13], offset); w[29] = amd_bytealign_S (w[11], w[12], offset); w[28] = amd_bytealign_S (w[10], w[11], offset); w[27] = amd_bytealign_S (w[ 9], w[10], offset); w[26] = amd_bytealign_S (w[ 8], w[ 9], offset); w[25] = amd_bytealign_S (w[ 7], w[ 8], offset); w[24] = amd_bytealign_S (w[ 6], w[ 7], offset); w[23] = amd_bytealign_S (w[ 5], w[ 6], offset); w[22] = amd_bytealign_S (w[ 4], w[ 5], offset); w[21] = amd_bytealign_S (w[ 3], w[ 4], offset); w[20] = amd_bytealign_S (w[ 2], w[ 3], offset); w[19] = amd_bytealign_S (w[ 1], w[ 2], offset); w[18] = amd_bytealign_S (w[ 0], w[ 1], offset); w[17] = amd_bytealign_S ( 0, w[ 0], offset); w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 18: w[63] = amd_bytealign_S (w[44], w[45], offset); w[62] = amd_bytealign_S (w[43], w[44], offset); w[61] = amd_bytealign_S (w[42], w[43], offset); w[60] = amd_bytealign_S (w[41], w[42], offset); w[59] = amd_bytealign_S (w[40], w[41], offset); w[58] = amd_bytealign_S (w[39], w[40], offset); w[57] = amd_bytealign_S (w[38], w[39], offset); w[56] = amd_bytealign_S (w[37], w[38], offset); w[55] = amd_bytealign_S (w[36], w[37], offset); w[54] = amd_bytealign_S (w[35], w[36], offset); w[53] = amd_bytealign_S (w[34], w[35], offset); w[52] = amd_bytealign_S (w[33], w[34], offset); w[51] = amd_bytealign_S (w[32], w[33], offset); w[50] = amd_bytealign_S (w[31], w[32], offset); w[49] = amd_bytealign_S (w[30], w[31], offset); w[48] = amd_bytealign_S (w[29], w[30], offset); w[47] = amd_bytealign_S (w[28], w[29], offset); w[46] = amd_bytealign_S (w[27], w[28], offset); w[45] = amd_bytealign_S (w[26], w[27], offset); w[44] = amd_bytealign_S (w[25], w[26], offset); w[43] = amd_bytealign_S (w[24], w[25], offset); w[42] = amd_bytealign_S (w[23], w[24], offset); w[41] = amd_bytealign_S (w[22], w[23], offset); w[40] = amd_bytealign_S (w[21], w[22], offset); w[39] = amd_bytealign_S (w[20], w[21], offset); w[38] = amd_bytealign_S (w[19], w[20], offset); w[37] = amd_bytealign_S (w[18], w[19], offset); w[36] = amd_bytealign_S (w[17], w[18], offset); w[35] = amd_bytealign_S (w[16], w[17], offset); w[34] = amd_bytealign_S (w[15], w[16], offset); w[33] = amd_bytealign_S (w[14], w[15], offset); w[32] = amd_bytealign_S (w[13], w[14], offset); w[31] = amd_bytealign_S (w[12], w[13], offset); w[30] = amd_bytealign_S (w[11], w[12], offset); w[29] = amd_bytealign_S (w[10], w[11], offset); w[28] = amd_bytealign_S (w[ 9], w[10], offset); w[27] = amd_bytealign_S (w[ 8], w[ 9], offset); w[26] = amd_bytealign_S (w[ 7], w[ 8], offset); w[25] = amd_bytealign_S (w[ 6], w[ 7], offset); w[24] = amd_bytealign_S (w[ 5], w[ 6], offset); w[23] = amd_bytealign_S (w[ 4], w[ 5], offset); w[22] = amd_bytealign_S (w[ 3], w[ 4], offset); w[21] = amd_bytealign_S (w[ 2], w[ 3], offset); w[20] = amd_bytealign_S (w[ 1], w[ 2], offset); w[19] = amd_bytealign_S (w[ 0], w[ 1], offset); w[18] = amd_bytealign_S ( 0, w[ 0], offset); w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 19: w[63] = amd_bytealign_S (w[43], w[44], offset); w[62] = amd_bytealign_S (w[42], w[43], offset); w[61] = amd_bytealign_S (w[41], w[42], offset); w[60] = amd_bytealign_S (w[40], w[41], offset); w[59] = amd_bytealign_S (w[39], w[40], offset); w[58] = amd_bytealign_S (w[38], w[39], offset); w[57] = amd_bytealign_S (w[37], w[38], offset); w[56] = amd_bytealign_S (w[36], w[37], offset); w[55] = amd_bytealign_S (w[35], w[36], offset); w[54] = amd_bytealign_S (w[34], w[35], offset); w[53] = amd_bytealign_S (w[33], w[34], offset); w[52] = amd_bytealign_S (w[32], w[33], offset); w[51] = amd_bytealign_S (w[31], w[32], offset); w[50] = amd_bytealign_S (w[30], w[31], offset); w[49] = amd_bytealign_S (w[29], w[30], offset); w[48] = amd_bytealign_S (w[28], w[29], offset); w[47] = amd_bytealign_S (w[27], w[28], offset); w[46] = amd_bytealign_S (w[26], w[27], offset); w[45] = amd_bytealign_S (w[25], w[26], offset); w[44] = amd_bytealign_S (w[24], w[25], offset); w[43] = amd_bytealign_S (w[23], w[24], offset); w[42] = amd_bytealign_S (w[22], w[23], offset); w[41] = amd_bytealign_S (w[21], w[22], offset); w[40] = amd_bytealign_S (w[20], w[21], offset); w[39] = amd_bytealign_S (w[19], w[20], offset); w[38] = amd_bytealign_S (w[18], w[19], offset); w[37] = amd_bytealign_S (w[17], w[18], offset); w[36] = amd_bytealign_S (w[16], w[17], offset); w[35] = amd_bytealign_S (w[15], w[16], offset); w[34] = amd_bytealign_S (w[14], w[15], offset); w[33] = amd_bytealign_S (w[13], w[14], offset); w[32] = amd_bytealign_S (w[12], w[13], offset); w[31] = amd_bytealign_S (w[11], w[12], offset); w[30] = amd_bytealign_S (w[10], w[11], offset); w[29] = amd_bytealign_S (w[ 9], w[10], offset); w[28] = amd_bytealign_S (w[ 8], w[ 9], offset); w[27] = amd_bytealign_S (w[ 7], w[ 8], offset); w[26] = amd_bytealign_S (w[ 6], w[ 7], offset); w[25] = amd_bytealign_S (w[ 5], w[ 6], offset); w[24] = amd_bytealign_S (w[ 4], w[ 5], offset); w[23] = amd_bytealign_S (w[ 3], w[ 4], offset); w[22] = amd_bytealign_S (w[ 2], w[ 3], offset); w[21] = amd_bytealign_S (w[ 1], w[ 2], offset); w[20] = amd_bytealign_S (w[ 0], w[ 1], offset); w[19] = amd_bytealign_S ( 0, w[ 0], offset); w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 20: w[63] = amd_bytealign_S (w[42], w[43], offset); w[62] = amd_bytealign_S (w[41], w[42], offset); w[61] = amd_bytealign_S (w[40], w[41], offset); w[60] = amd_bytealign_S (w[39], w[40], offset); w[59] = amd_bytealign_S (w[38], w[39], offset); w[58] = amd_bytealign_S (w[37], w[38], offset); w[57] = amd_bytealign_S (w[36], w[37], offset); w[56] = amd_bytealign_S (w[35], w[36], offset); w[55] = amd_bytealign_S (w[34], w[35], offset); w[54] = amd_bytealign_S (w[33], w[34], offset); w[53] = amd_bytealign_S (w[32], w[33], offset); w[52] = amd_bytealign_S (w[31], w[32], offset); w[51] = amd_bytealign_S (w[30], w[31], offset); w[50] = amd_bytealign_S (w[29], w[30], offset); w[49] = amd_bytealign_S (w[28], w[29], offset); w[48] = amd_bytealign_S (w[27], w[28], offset); w[47] = amd_bytealign_S (w[26], w[27], offset); w[46] = amd_bytealign_S (w[25], w[26], offset); w[45] = amd_bytealign_S (w[24], w[25], offset); w[44] = amd_bytealign_S (w[23], w[24], offset); w[43] = amd_bytealign_S (w[22], w[23], offset); w[42] = amd_bytealign_S (w[21], w[22], offset); w[41] = amd_bytealign_S (w[20], w[21], offset); w[40] = amd_bytealign_S (w[19], w[20], offset); w[39] = amd_bytealign_S (w[18], w[19], offset); w[38] = amd_bytealign_S (w[17], w[18], offset); w[37] = amd_bytealign_S (w[16], w[17], offset); w[36] = amd_bytealign_S (w[15], w[16], offset); w[35] = amd_bytealign_S (w[14], w[15], offset); w[34] = amd_bytealign_S (w[13], w[14], offset); w[33] = amd_bytealign_S (w[12], w[13], offset); w[32] = amd_bytealign_S (w[11], w[12], offset); w[31] = amd_bytealign_S (w[10], w[11], offset); w[30] = amd_bytealign_S (w[ 9], w[10], offset); w[29] = amd_bytealign_S (w[ 8], w[ 9], offset); w[28] = amd_bytealign_S (w[ 7], w[ 8], offset); w[27] = amd_bytealign_S (w[ 6], w[ 7], offset); w[26] = amd_bytealign_S (w[ 5], w[ 6], offset); w[25] = amd_bytealign_S (w[ 4], w[ 5], offset); w[24] = amd_bytealign_S (w[ 3], w[ 4], offset); w[23] = amd_bytealign_S (w[ 2], w[ 3], offset); w[22] = amd_bytealign_S (w[ 1], w[ 2], offset); w[21] = amd_bytealign_S (w[ 0], w[ 1], offset); w[20] = amd_bytealign_S ( 0, w[ 0], offset); w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 21: w[63] = amd_bytealign_S (w[41], w[42], offset); w[62] = amd_bytealign_S (w[40], w[41], offset); w[61] = amd_bytealign_S (w[39], w[40], offset); w[60] = amd_bytealign_S (w[38], w[39], offset); w[59] = amd_bytealign_S (w[37], w[38], offset); w[58] = amd_bytealign_S (w[36], w[37], offset); w[57] = amd_bytealign_S (w[35], w[36], offset); w[56] = amd_bytealign_S (w[34], w[35], offset); w[55] = amd_bytealign_S (w[33], w[34], offset); w[54] = amd_bytealign_S (w[32], w[33], offset); w[53] = amd_bytealign_S (w[31], w[32], offset); w[52] = amd_bytealign_S (w[30], w[31], offset); w[51] = amd_bytealign_S (w[29], w[30], offset); w[50] = amd_bytealign_S (w[28], w[29], offset); w[49] = amd_bytealign_S (w[27], w[28], offset); w[48] = amd_bytealign_S (w[26], w[27], offset); w[47] = amd_bytealign_S (w[25], w[26], offset); w[46] = amd_bytealign_S (w[24], w[25], offset); w[45] = amd_bytealign_S (w[23], w[24], offset); w[44] = amd_bytealign_S (w[22], w[23], offset); w[43] = amd_bytealign_S (w[21], w[22], offset); w[42] = amd_bytealign_S (w[20], w[21], offset); w[41] = amd_bytealign_S (w[19], w[20], offset); w[40] = amd_bytealign_S (w[18], w[19], offset); w[39] = amd_bytealign_S (w[17], w[18], offset); w[38] = amd_bytealign_S (w[16], w[17], offset); w[37] = amd_bytealign_S (w[15], w[16], offset); w[36] = amd_bytealign_S (w[14], w[15], offset); w[35] = amd_bytealign_S (w[13], w[14], offset); w[34] = amd_bytealign_S (w[12], w[13], offset); w[33] = amd_bytealign_S (w[11], w[12], offset); w[32] = amd_bytealign_S (w[10], w[11], offset); w[31] = amd_bytealign_S (w[ 9], w[10], offset); w[30] = amd_bytealign_S (w[ 8], w[ 9], offset); w[29] = amd_bytealign_S (w[ 7], w[ 8], offset); w[28] = amd_bytealign_S (w[ 6], w[ 7], offset); w[27] = amd_bytealign_S (w[ 5], w[ 6], offset); w[26] = amd_bytealign_S (w[ 4], w[ 5], offset); w[25] = amd_bytealign_S (w[ 3], w[ 4], offset); w[24] = amd_bytealign_S (w[ 2], w[ 3], offset); w[23] = amd_bytealign_S (w[ 1], w[ 2], offset); w[22] = amd_bytealign_S (w[ 0], w[ 1], offset); w[21] = amd_bytealign_S ( 0, w[ 0], offset); w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 22: w[63] = amd_bytealign_S (w[40], w[41], offset); w[62] = amd_bytealign_S (w[39], w[40], offset); w[61] = amd_bytealign_S (w[38], w[39], offset); w[60] = amd_bytealign_S (w[37], w[38], offset); w[59] = amd_bytealign_S (w[36], w[37], offset); w[58] = amd_bytealign_S (w[35], w[36], offset); w[57] = amd_bytealign_S (w[34], w[35], offset); w[56] = amd_bytealign_S (w[33], w[34], offset); w[55] = amd_bytealign_S (w[32], w[33], offset); w[54] = amd_bytealign_S (w[31], w[32], offset); w[53] = amd_bytealign_S (w[30], w[31], offset); w[52] = amd_bytealign_S (w[29], w[30], offset); w[51] = amd_bytealign_S (w[28], w[29], offset); w[50] = amd_bytealign_S (w[27], w[28], offset); w[49] = amd_bytealign_S (w[26], w[27], offset); w[48] = amd_bytealign_S (w[25], w[26], offset); w[47] = amd_bytealign_S (w[24], w[25], offset); w[46] = amd_bytealign_S (w[23], w[24], offset); w[45] = amd_bytealign_S (w[22], w[23], offset); w[44] = amd_bytealign_S (w[21], w[22], offset); w[43] = amd_bytealign_S (w[20], w[21], offset); w[42] = amd_bytealign_S (w[19], w[20], offset); w[41] = amd_bytealign_S (w[18], w[19], offset); w[40] = amd_bytealign_S (w[17], w[18], offset); w[39] = amd_bytealign_S (w[16], w[17], offset); w[38] = amd_bytealign_S (w[15], w[16], offset); w[37] = amd_bytealign_S (w[14], w[15], offset); w[36] = amd_bytealign_S (w[13], w[14], offset); w[35] = amd_bytealign_S (w[12], w[13], offset); w[34] = amd_bytealign_S (w[11], w[12], offset); w[33] = amd_bytealign_S (w[10], w[11], offset); w[32] = amd_bytealign_S (w[ 9], w[10], offset); w[31] = amd_bytealign_S (w[ 8], w[ 9], offset); w[30] = amd_bytealign_S (w[ 7], w[ 8], offset); w[29] = amd_bytealign_S (w[ 6], w[ 7], offset); w[28] = amd_bytealign_S (w[ 5], w[ 6], offset); w[27] = amd_bytealign_S (w[ 4], w[ 5], offset); w[26] = amd_bytealign_S (w[ 3], w[ 4], offset); w[25] = amd_bytealign_S (w[ 2], w[ 3], offset); w[24] = amd_bytealign_S (w[ 1], w[ 2], offset); w[23] = amd_bytealign_S (w[ 0], w[ 1], offset); w[22] = amd_bytealign_S ( 0, w[ 0], offset); w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 23: w[63] = amd_bytealign_S (w[39], w[40], offset); w[62] = amd_bytealign_S (w[38], w[39], offset); w[61] = amd_bytealign_S (w[37], w[38], offset); w[60] = amd_bytealign_S (w[36], w[37], offset); w[59] = amd_bytealign_S (w[35], w[36], offset); w[58] = amd_bytealign_S (w[34], w[35], offset); w[57] = amd_bytealign_S (w[33], w[34], offset); w[56] = amd_bytealign_S (w[32], w[33], offset); w[55] = amd_bytealign_S (w[31], w[32], offset); w[54] = amd_bytealign_S (w[30], w[31], offset); w[53] = amd_bytealign_S (w[29], w[30], offset); w[52] = amd_bytealign_S (w[28], w[29], offset); w[51] = amd_bytealign_S (w[27], w[28], offset); w[50] = amd_bytealign_S (w[26], w[27], offset); w[49] = amd_bytealign_S (w[25], w[26], offset); w[48] = amd_bytealign_S (w[24], w[25], offset); w[47] = amd_bytealign_S (w[23], w[24], offset); w[46] = amd_bytealign_S (w[22], w[23], offset); w[45] = amd_bytealign_S (w[21], w[22], offset); w[44] = amd_bytealign_S (w[20], w[21], offset); w[43] = amd_bytealign_S (w[19], w[20], offset); w[42] = amd_bytealign_S (w[18], w[19], offset); w[41] = amd_bytealign_S (w[17], w[18], offset); w[40] = amd_bytealign_S (w[16], w[17], offset); w[39] = amd_bytealign_S (w[15], w[16], offset); w[38] = amd_bytealign_S (w[14], w[15], offset); w[37] = amd_bytealign_S (w[13], w[14], offset); w[36] = amd_bytealign_S (w[12], w[13], offset); w[35] = amd_bytealign_S (w[11], w[12], offset); w[34] = amd_bytealign_S (w[10], w[11], offset); w[33] = amd_bytealign_S (w[ 9], w[10], offset); w[32] = amd_bytealign_S (w[ 8], w[ 9], offset); w[31] = amd_bytealign_S (w[ 7], w[ 8], offset); w[30] = amd_bytealign_S (w[ 6], w[ 7], offset); w[29] = amd_bytealign_S (w[ 5], w[ 6], offset); w[28] = amd_bytealign_S (w[ 4], w[ 5], offset); w[27] = amd_bytealign_S (w[ 3], w[ 4], offset); w[26] = amd_bytealign_S (w[ 2], w[ 3], offset); w[25] = amd_bytealign_S (w[ 1], w[ 2], offset); w[24] = amd_bytealign_S (w[ 0], w[ 1], offset); w[23] = amd_bytealign_S ( 0, w[ 0], offset); w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 24: w[63] = amd_bytealign_S (w[38], w[39], offset); w[62] = amd_bytealign_S (w[37], w[38], offset); w[61] = amd_bytealign_S (w[36], w[37], offset); w[60] = amd_bytealign_S (w[35], w[36], offset); w[59] = amd_bytealign_S (w[34], w[35], offset); w[58] = amd_bytealign_S (w[33], w[34], offset); w[57] = amd_bytealign_S (w[32], w[33], offset); w[56] = amd_bytealign_S (w[31], w[32], offset); w[55] = amd_bytealign_S (w[30], w[31], offset); w[54] = amd_bytealign_S (w[29], w[30], offset); w[53] = amd_bytealign_S (w[28], w[29], offset); w[52] = amd_bytealign_S (w[27], w[28], offset); w[51] = amd_bytealign_S (w[26], w[27], offset); w[50] = amd_bytealign_S (w[25], w[26], offset); w[49] = amd_bytealign_S (w[24], w[25], offset); w[48] = amd_bytealign_S (w[23], w[24], offset); w[47] = amd_bytealign_S (w[22], w[23], offset); w[46] = amd_bytealign_S (w[21], w[22], offset); w[45] = amd_bytealign_S (w[20], w[21], offset); w[44] = amd_bytealign_S (w[19], w[20], offset); w[43] = amd_bytealign_S (w[18], w[19], offset); w[42] = amd_bytealign_S (w[17], w[18], offset); w[41] = amd_bytealign_S (w[16], w[17], offset); w[40] = amd_bytealign_S (w[15], w[16], offset); w[39] = amd_bytealign_S (w[14], w[15], offset); w[38] = amd_bytealign_S (w[13], w[14], offset); w[37] = amd_bytealign_S (w[12], w[13], offset); w[36] = amd_bytealign_S (w[11], w[12], offset); w[35] = amd_bytealign_S (w[10], w[11], offset); w[34] = amd_bytealign_S (w[ 9], w[10], offset); w[33] = amd_bytealign_S (w[ 8], w[ 9], offset); w[32] = amd_bytealign_S (w[ 7], w[ 8], offset); w[31] = amd_bytealign_S (w[ 6], w[ 7], offset); w[30] = amd_bytealign_S (w[ 5], w[ 6], offset); w[29] = amd_bytealign_S (w[ 4], w[ 5], offset); w[28] = amd_bytealign_S (w[ 3], w[ 4], offset); w[27] = amd_bytealign_S (w[ 2], w[ 3], offset); w[26] = amd_bytealign_S (w[ 1], w[ 2], offset); w[25] = amd_bytealign_S (w[ 0], w[ 1], offset); w[24] = amd_bytealign_S ( 0, w[ 0], offset); w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 25: w[63] = amd_bytealign_S (w[37], w[38], offset); w[62] = amd_bytealign_S (w[36], w[37], offset); w[61] = amd_bytealign_S (w[35], w[36], offset); w[60] = amd_bytealign_S (w[34], w[35], offset); w[59] = amd_bytealign_S (w[33], w[34], offset); w[58] = amd_bytealign_S (w[32], w[33], offset); w[57] = amd_bytealign_S (w[31], w[32], offset); w[56] = amd_bytealign_S (w[30], w[31], offset); w[55] = amd_bytealign_S (w[29], w[30], offset); w[54] = amd_bytealign_S (w[28], w[29], offset); w[53] = amd_bytealign_S (w[27], w[28], offset); w[52] = amd_bytealign_S (w[26], w[27], offset); w[51] = amd_bytealign_S (w[25], w[26], offset); w[50] = amd_bytealign_S (w[24], w[25], offset); w[49] = amd_bytealign_S (w[23], w[24], offset); w[48] = amd_bytealign_S (w[22], w[23], offset); w[47] = amd_bytealign_S (w[21], w[22], offset); w[46] = amd_bytealign_S (w[20], w[21], offset); w[45] = amd_bytealign_S (w[19], w[20], offset); w[44] = amd_bytealign_S (w[18], w[19], offset); w[43] = amd_bytealign_S (w[17], w[18], offset); w[42] = amd_bytealign_S (w[16], w[17], offset); w[41] = amd_bytealign_S (w[15], w[16], offset); w[40] = amd_bytealign_S (w[14], w[15], offset); w[39] = amd_bytealign_S (w[13], w[14], offset); w[38] = amd_bytealign_S (w[12], w[13], offset); w[37] = amd_bytealign_S (w[11], w[12], offset); w[36] = amd_bytealign_S (w[10], w[11], offset); w[35] = amd_bytealign_S (w[ 9], w[10], offset); w[34] = amd_bytealign_S (w[ 8], w[ 9], offset); w[33] = amd_bytealign_S (w[ 7], w[ 8], offset); w[32] = amd_bytealign_S (w[ 6], w[ 7], offset); w[31] = amd_bytealign_S (w[ 5], w[ 6], offset); w[30] = amd_bytealign_S (w[ 4], w[ 5], offset); w[29] = amd_bytealign_S (w[ 3], w[ 4], offset); w[28] = amd_bytealign_S (w[ 2], w[ 3], offset); w[27] = amd_bytealign_S (w[ 1], w[ 2], offset); w[26] = amd_bytealign_S (w[ 0], w[ 1], offset); w[25] = amd_bytealign_S ( 0, w[ 0], offset); w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 26: w[63] = amd_bytealign_S (w[36], w[37], offset); w[62] = amd_bytealign_S (w[35], w[36], offset); w[61] = amd_bytealign_S (w[34], w[35], offset); w[60] = amd_bytealign_S (w[33], w[34], offset); w[59] = amd_bytealign_S (w[32], w[33], offset); w[58] = amd_bytealign_S (w[31], w[32], offset); w[57] = amd_bytealign_S (w[30], w[31], offset); w[56] = amd_bytealign_S (w[29], w[30], offset); w[55] = amd_bytealign_S (w[28], w[29], offset); w[54] = amd_bytealign_S (w[27], w[28], offset); w[53] = amd_bytealign_S (w[26], w[27], offset); w[52] = amd_bytealign_S (w[25], w[26], offset); w[51] = amd_bytealign_S (w[24], w[25], offset); w[50] = amd_bytealign_S (w[23], w[24], offset); w[49] = amd_bytealign_S (w[22], w[23], offset); w[48] = amd_bytealign_S (w[21], w[22], offset); w[47] = amd_bytealign_S (w[20], w[21], offset); w[46] = amd_bytealign_S (w[19], w[20], offset); w[45] = amd_bytealign_S (w[18], w[19], offset); w[44] = amd_bytealign_S (w[17], w[18], offset); w[43] = amd_bytealign_S (w[16], w[17], offset); w[42] = amd_bytealign_S (w[15], w[16], offset); w[41] = amd_bytealign_S (w[14], w[15], offset); w[40] = amd_bytealign_S (w[13], w[14], offset); w[39] = amd_bytealign_S (w[12], w[13], offset); w[38] = amd_bytealign_S (w[11], w[12], offset); w[37] = amd_bytealign_S (w[10], w[11], offset); w[36] = amd_bytealign_S (w[ 9], w[10], offset); w[35] = amd_bytealign_S (w[ 8], w[ 9], offset); w[34] = amd_bytealign_S (w[ 7], w[ 8], offset); w[33] = amd_bytealign_S (w[ 6], w[ 7], offset); w[32] = amd_bytealign_S (w[ 5], w[ 6], offset); w[31] = amd_bytealign_S (w[ 4], w[ 5], offset); w[30] = amd_bytealign_S (w[ 3], w[ 4], offset); w[29] = amd_bytealign_S (w[ 2], w[ 3], offset); w[28] = amd_bytealign_S (w[ 1], w[ 2], offset); w[27] = amd_bytealign_S (w[ 0], w[ 1], offset); w[26] = amd_bytealign_S ( 0, w[ 0], offset); w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 27: w[63] = amd_bytealign_S (w[35], w[36], offset); w[62] = amd_bytealign_S (w[34], w[35], offset); w[61] = amd_bytealign_S (w[33], w[34], offset); w[60] = amd_bytealign_S (w[32], w[33], offset); w[59] = amd_bytealign_S (w[31], w[32], offset); w[58] = amd_bytealign_S (w[30], w[31], offset); w[57] = amd_bytealign_S (w[29], w[30], offset); w[56] = amd_bytealign_S (w[28], w[29], offset); w[55] = amd_bytealign_S (w[27], w[28], offset); w[54] = amd_bytealign_S (w[26], w[27], offset); w[53] = amd_bytealign_S (w[25], w[26], offset); w[52] = amd_bytealign_S (w[24], w[25], offset); w[51] = amd_bytealign_S (w[23], w[24], offset); w[50] = amd_bytealign_S (w[22], w[23], offset); w[49] = amd_bytealign_S (w[21], w[22], offset); w[48] = amd_bytealign_S (w[20], w[21], offset); w[47] = amd_bytealign_S (w[19], w[20], offset); w[46] = amd_bytealign_S (w[18], w[19], offset); w[45] = amd_bytealign_S (w[17], w[18], offset); w[44] = amd_bytealign_S (w[16], w[17], offset); w[43] = amd_bytealign_S (w[15], w[16], offset); w[42] = amd_bytealign_S (w[14], w[15], offset); w[41] = amd_bytealign_S (w[13], w[14], offset); w[40] = amd_bytealign_S (w[12], w[13], offset); w[39] = amd_bytealign_S (w[11], w[12], offset); w[38] = amd_bytealign_S (w[10], w[11], offset); w[37] = amd_bytealign_S (w[ 9], w[10], offset); w[36] = amd_bytealign_S (w[ 8], w[ 9], offset); w[35] = amd_bytealign_S (w[ 7], w[ 8], offset); w[34] = amd_bytealign_S (w[ 6], w[ 7], offset); w[33] = amd_bytealign_S (w[ 5], w[ 6], offset); w[32] = amd_bytealign_S (w[ 4], w[ 5], offset); w[31] = amd_bytealign_S (w[ 3], w[ 4], offset); w[30] = amd_bytealign_S (w[ 2], w[ 3], offset); w[29] = amd_bytealign_S (w[ 1], w[ 2], offset); w[28] = amd_bytealign_S (w[ 0], w[ 1], offset); w[27] = amd_bytealign_S ( 0, w[ 0], offset); w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 28: w[63] = amd_bytealign_S (w[34], w[35], offset); w[62] = amd_bytealign_S (w[33], w[34], offset); w[61] = amd_bytealign_S (w[32], w[33], offset); w[60] = amd_bytealign_S (w[31], w[32], offset); w[59] = amd_bytealign_S (w[30], w[31], offset); w[58] = amd_bytealign_S (w[29], w[30], offset); w[57] = amd_bytealign_S (w[28], w[29], offset); w[56] = amd_bytealign_S (w[27], w[28], offset); w[55] = amd_bytealign_S (w[26], w[27], offset); w[54] = amd_bytealign_S (w[25], w[26], offset); w[53] = amd_bytealign_S (w[24], w[25], offset); w[52] = amd_bytealign_S (w[23], w[24], offset); w[51] = amd_bytealign_S (w[22], w[23], offset); w[50] = amd_bytealign_S (w[21], w[22], offset); w[49] = amd_bytealign_S (w[20], w[21], offset); w[48] = amd_bytealign_S (w[19], w[20], offset); w[47] = amd_bytealign_S (w[18], w[19], offset); w[46] = amd_bytealign_S (w[17], w[18], offset); w[45] = amd_bytealign_S (w[16], w[17], offset); w[44] = amd_bytealign_S (w[15], w[16], offset); w[43] = amd_bytealign_S (w[14], w[15], offset); w[42] = amd_bytealign_S (w[13], w[14], offset); w[41] = amd_bytealign_S (w[12], w[13], offset); w[40] = amd_bytealign_S (w[11], w[12], offset); w[39] = amd_bytealign_S (w[10], w[11], offset); w[38] = amd_bytealign_S (w[ 9], w[10], offset); w[37] = amd_bytealign_S (w[ 8], w[ 9], offset); w[36] = amd_bytealign_S (w[ 7], w[ 8], offset); w[35] = amd_bytealign_S (w[ 6], w[ 7], offset); w[34] = amd_bytealign_S (w[ 5], w[ 6], offset); w[33] = amd_bytealign_S (w[ 4], w[ 5], offset); w[32] = amd_bytealign_S (w[ 3], w[ 4], offset); w[31] = amd_bytealign_S (w[ 2], w[ 3], offset); w[30] = amd_bytealign_S (w[ 1], w[ 2], offset); w[29] = amd_bytealign_S (w[ 0], w[ 1], offset); w[28] = amd_bytealign_S ( 0, w[ 0], offset); w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 29: w[63] = amd_bytealign_S (w[33], w[34], offset); w[62] = amd_bytealign_S (w[32], w[33], offset); w[61] = amd_bytealign_S (w[31], w[32], offset); w[60] = amd_bytealign_S (w[30], w[31], offset); w[59] = amd_bytealign_S (w[29], w[30], offset); w[58] = amd_bytealign_S (w[28], w[29], offset); w[57] = amd_bytealign_S (w[27], w[28], offset); w[56] = amd_bytealign_S (w[26], w[27], offset); w[55] = amd_bytealign_S (w[25], w[26], offset); w[54] = amd_bytealign_S (w[24], w[25], offset); w[53] = amd_bytealign_S (w[23], w[24], offset); w[52] = amd_bytealign_S (w[22], w[23], offset); w[51] = amd_bytealign_S (w[21], w[22], offset); w[50] = amd_bytealign_S (w[20], w[21], offset); w[49] = amd_bytealign_S (w[19], w[20], offset); w[48] = amd_bytealign_S (w[18], w[19], offset); w[47] = amd_bytealign_S (w[17], w[18], offset); w[46] = amd_bytealign_S (w[16], w[17], offset); w[45] = amd_bytealign_S (w[15], w[16], offset); w[44] = amd_bytealign_S (w[14], w[15], offset); w[43] = amd_bytealign_S (w[13], w[14], offset); w[42] = amd_bytealign_S (w[12], w[13], offset); w[41] = amd_bytealign_S (w[11], w[12], offset); w[40] = amd_bytealign_S (w[10], w[11], offset); w[39] = amd_bytealign_S (w[ 9], w[10], offset); w[38] = amd_bytealign_S (w[ 8], w[ 9], offset); w[37] = amd_bytealign_S (w[ 7], w[ 8], offset); w[36] = amd_bytealign_S (w[ 6], w[ 7], offset); w[35] = amd_bytealign_S (w[ 5], w[ 6], offset); w[34] = amd_bytealign_S (w[ 4], w[ 5], offset); w[33] = amd_bytealign_S (w[ 3], w[ 4], offset); w[32] = amd_bytealign_S (w[ 2], w[ 3], offset); w[31] = amd_bytealign_S (w[ 1], w[ 2], offset); w[30] = amd_bytealign_S (w[ 0], w[ 1], offset); w[29] = amd_bytealign_S ( 0, w[ 0], offset); w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 30: w[63] = amd_bytealign_S (w[32], w[33], offset); w[62] = amd_bytealign_S (w[31], w[32], offset); w[61] = amd_bytealign_S (w[30], w[31], offset); w[60] = amd_bytealign_S (w[29], w[30], offset); w[59] = amd_bytealign_S (w[28], w[29], offset); w[58] = amd_bytealign_S (w[27], w[28], offset); w[57] = amd_bytealign_S (w[26], w[27], offset); w[56] = amd_bytealign_S (w[25], w[26], offset); w[55] = amd_bytealign_S (w[24], w[25], offset); w[54] = amd_bytealign_S (w[23], w[24], offset); w[53] = amd_bytealign_S (w[22], w[23], offset); w[52] = amd_bytealign_S (w[21], w[22], offset); w[51] = amd_bytealign_S (w[20], w[21], offset); w[50] = amd_bytealign_S (w[19], w[20], offset); w[49] = amd_bytealign_S (w[18], w[19], offset); w[48] = amd_bytealign_S (w[17], w[18], offset); w[47] = amd_bytealign_S (w[16], w[17], offset); w[46] = amd_bytealign_S (w[15], w[16], offset); w[45] = amd_bytealign_S (w[14], w[15], offset); w[44] = amd_bytealign_S (w[13], w[14], offset); w[43] = amd_bytealign_S (w[12], w[13], offset); w[42] = amd_bytealign_S (w[11], w[12], offset); w[41] = amd_bytealign_S (w[10], w[11], offset); w[40] = amd_bytealign_S (w[ 9], w[10], offset); w[39] = amd_bytealign_S (w[ 8], w[ 9], offset); w[38] = amd_bytealign_S (w[ 7], w[ 8], offset); w[37] = amd_bytealign_S (w[ 6], w[ 7], offset); w[36] = amd_bytealign_S (w[ 5], w[ 6], offset); w[35] = amd_bytealign_S (w[ 4], w[ 5], offset); w[34] = amd_bytealign_S (w[ 3], w[ 4], offset); w[33] = amd_bytealign_S (w[ 2], w[ 3], offset); w[32] = amd_bytealign_S (w[ 1], w[ 2], offset); w[31] = amd_bytealign_S (w[ 0], w[ 1], offset); w[30] = amd_bytealign_S ( 0, w[ 0], offset); w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 31: w[63] = amd_bytealign_S (w[31], w[32], offset); w[62] = amd_bytealign_S (w[30], w[31], offset); w[61] = amd_bytealign_S (w[29], w[30], offset); w[60] = amd_bytealign_S (w[28], w[29], offset); w[59] = amd_bytealign_S (w[27], w[28], offset); w[58] = amd_bytealign_S (w[26], w[27], offset); w[57] = amd_bytealign_S (w[25], w[26], offset); w[56] = amd_bytealign_S (w[24], w[25], offset); w[55] = amd_bytealign_S (w[23], w[24], offset); w[54] = amd_bytealign_S (w[22], w[23], offset); w[53] = amd_bytealign_S (w[21], w[22], offset); w[52] = amd_bytealign_S (w[20], w[21], offset); w[51] = amd_bytealign_S (w[19], w[20], offset); w[50] = amd_bytealign_S (w[18], w[19], offset); w[49] = amd_bytealign_S (w[17], w[18], offset); w[48] = amd_bytealign_S (w[16], w[17], offset); w[47] = amd_bytealign_S (w[15], w[16], offset); w[46] = amd_bytealign_S (w[14], w[15], offset); w[45] = amd_bytealign_S (w[13], w[14], offset); w[44] = amd_bytealign_S (w[12], w[13], offset); w[43] = amd_bytealign_S (w[11], w[12], offset); w[42] = amd_bytealign_S (w[10], w[11], offset); w[41] = amd_bytealign_S (w[ 9], w[10], offset); w[40] = amd_bytealign_S (w[ 8], w[ 9], offset); w[39] = amd_bytealign_S (w[ 7], w[ 8], offset); w[38] = amd_bytealign_S (w[ 6], w[ 7], offset); w[37] = amd_bytealign_S (w[ 5], w[ 6], offset); w[36] = amd_bytealign_S (w[ 4], w[ 5], offset); w[35] = amd_bytealign_S (w[ 3], w[ 4], offset); w[34] = amd_bytealign_S (w[ 2], w[ 3], offset); w[33] = amd_bytealign_S (w[ 1], w[ 2], offset); w[32] = amd_bytealign_S (w[ 0], w[ 1], offset); w[31] = amd_bytealign_S ( 0, w[ 0], offset); w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 32: w[63] = amd_bytealign_S (w[30], w[31], offset); w[62] = amd_bytealign_S (w[29], w[30], offset); w[61] = amd_bytealign_S (w[28], w[29], offset); w[60] = amd_bytealign_S (w[27], w[28], offset); w[59] = amd_bytealign_S (w[26], w[27], offset); w[58] = amd_bytealign_S (w[25], w[26], offset); w[57] = amd_bytealign_S (w[24], w[25], offset); w[56] = amd_bytealign_S (w[23], w[24], offset); w[55] = amd_bytealign_S (w[22], w[23], offset); w[54] = amd_bytealign_S (w[21], w[22], offset); w[53] = amd_bytealign_S (w[20], w[21], offset); w[52] = amd_bytealign_S (w[19], w[20], offset); w[51] = amd_bytealign_S (w[18], w[19], offset); w[50] = amd_bytealign_S (w[17], w[18], offset); w[49] = amd_bytealign_S (w[16], w[17], offset); w[48] = amd_bytealign_S (w[15], w[16], offset); w[47] = amd_bytealign_S (w[14], w[15], offset); w[46] = amd_bytealign_S (w[13], w[14], offset); w[45] = amd_bytealign_S (w[12], w[13], offset); w[44] = amd_bytealign_S (w[11], w[12], offset); w[43] = amd_bytealign_S (w[10], w[11], offset); w[42] = amd_bytealign_S (w[ 9], w[10], offset); w[41] = amd_bytealign_S (w[ 8], w[ 9], offset); w[40] = amd_bytealign_S (w[ 7], w[ 8], offset); w[39] = amd_bytealign_S (w[ 6], w[ 7], offset); w[38] = amd_bytealign_S (w[ 5], w[ 6], offset); w[37] = amd_bytealign_S (w[ 4], w[ 5], offset); w[36] = amd_bytealign_S (w[ 3], w[ 4], offset); w[35] = amd_bytealign_S (w[ 2], w[ 3], offset); w[34] = amd_bytealign_S (w[ 1], w[ 2], offset); w[33] = amd_bytealign_S (w[ 0], w[ 1], offset); w[32] = amd_bytealign_S ( 0, w[ 0], offset); w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 33: w[63] = amd_bytealign_S (w[29], w[30], offset); w[62] = amd_bytealign_S (w[28], w[29], offset); w[61] = amd_bytealign_S (w[27], w[28], offset); w[60] = amd_bytealign_S (w[26], w[27], offset); w[59] = amd_bytealign_S (w[25], w[26], offset); w[58] = amd_bytealign_S (w[24], w[25], offset); w[57] = amd_bytealign_S (w[23], w[24], offset); w[56] = amd_bytealign_S (w[22], w[23], offset); w[55] = amd_bytealign_S (w[21], w[22], offset); w[54] = amd_bytealign_S (w[20], w[21], offset); w[53] = amd_bytealign_S (w[19], w[20], offset); w[52] = amd_bytealign_S (w[18], w[19], offset); w[51] = amd_bytealign_S (w[17], w[18], offset); w[50] = amd_bytealign_S (w[16], w[17], offset); w[49] = amd_bytealign_S (w[15], w[16], offset); w[48] = amd_bytealign_S (w[14], w[15], offset); w[47] = amd_bytealign_S (w[13], w[14], offset); w[46] = amd_bytealign_S (w[12], w[13], offset); w[45] = amd_bytealign_S (w[11], w[12], offset); w[44] = amd_bytealign_S (w[10], w[11], offset); w[43] = amd_bytealign_S (w[ 9], w[10], offset); w[42] = amd_bytealign_S (w[ 8], w[ 9], offset); w[41] = amd_bytealign_S (w[ 7], w[ 8], offset); w[40] = amd_bytealign_S (w[ 6], w[ 7], offset); w[39] = amd_bytealign_S (w[ 5], w[ 6], offset); w[38] = amd_bytealign_S (w[ 4], w[ 5], offset); w[37] = amd_bytealign_S (w[ 3], w[ 4], offset); w[36] = amd_bytealign_S (w[ 2], w[ 3], offset); w[35] = amd_bytealign_S (w[ 1], w[ 2], offset); w[34] = amd_bytealign_S (w[ 0], w[ 1], offset); w[33] = amd_bytealign_S ( 0, w[ 0], offset); w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 34: w[63] = amd_bytealign_S (w[28], w[29], offset); w[62] = amd_bytealign_S (w[27], w[28], offset); w[61] = amd_bytealign_S (w[26], w[27], offset); w[60] = amd_bytealign_S (w[25], w[26], offset); w[59] = amd_bytealign_S (w[24], w[25], offset); w[58] = amd_bytealign_S (w[23], w[24], offset); w[57] = amd_bytealign_S (w[22], w[23], offset); w[56] = amd_bytealign_S (w[21], w[22], offset); w[55] = amd_bytealign_S (w[20], w[21], offset); w[54] = amd_bytealign_S (w[19], w[20], offset); w[53] = amd_bytealign_S (w[18], w[19], offset); w[52] = amd_bytealign_S (w[17], w[18], offset); w[51] = amd_bytealign_S (w[16], w[17], offset); w[50] = amd_bytealign_S (w[15], w[16], offset); w[49] = amd_bytealign_S (w[14], w[15], offset); w[48] = amd_bytealign_S (w[13], w[14], offset); w[47] = amd_bytealign_S (w[12], w[13], offset); w[46] = amd_bytealign_S (w[11], w[12], offset); w[45] = amd_bytealign_S (w[10], w[11], offset); w[44] = amd_bytealign_S (w[ 9], w[10], offset); w[43] = amd_bytealign_S (w[ 8], w[ 9], offset); w[42] = amd_bytealign_S (w[ 7], w[ 8], offset); w[41] = amd_bytealign_S (w[ 6], w[ 7], offset); w[40] = amd_bytealign_S (w[ 5], w[ 6], offset); w[39] = amd_bytealign_S (w[ 4], w[ 5], offset); w[38] = amd_bytealign_S (w[ 3], w[ 4], offset); w[37] = amd_bytealign_S (w[ 2], w[ 3], offset); w[36] = amd_bytealign_S (w[ 1], w[ 2], offset); w[35] = amd_bytealign_S (w[ 0], w[ 1], offset); w[34] = amd_bytealign_S ( 0, w[ 0], offset); w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 35: w[63] = amd_bytealign_S (w[27], w[28], offset); w[62] = amd_bytealign_S (w[26], w[27], offset); w[61] = amd_bytealign_S (w[25], w[26], offset); w[60] = amd_bytealign_S (w[24], w[25], offset); w[59] = amd_bytealign_S (w[23], w[24], offset); w[58] = amd_bytealign_S (w[22], w[23], offset); w[57] = amd_bytealign_S (w[21], w[22], offset); w[56] = amd_bytealign_S (w[20], w[21], offset); w[55] = amd_bytealign_S (w[19], w[20], offset); w[54] = amd_bytealign_S (w[18], w[19], offset); w[53] = amd_bytealign_S (w[17], w[18], offset); w[52] = amd_bytealign_S (w[16], w[17], offset); w[51] = amd_bytealign_S (w[15], w[16], offset); w[50] = amd_bytealign_S (w[14], w[15], offset); w[49] = amd_bytealign_S (w[13], w[14], offset); w[48] = amd_bytealign_S (w[12], w[13], offset); w[47] = amd_bytealign_S (w[11], w[12], offset); w[46] = amd_bytealign_S (w[10], w[11], offset); w[45] = amd_bytealign_S (w[ 9], w[10], offset); w[44] = amd_bytealign_S (w[ 8], w[ 9], offset); w[43] = amd_bytealign_S (w[ 7], w[ 8], offset); w[42] = amd_bytealign_S (w[ 6], w[ 7], offset); w[41] = amd_bytealign_S (w[ 5], w[ 6], offset); w[40] = amd_bytealign_S (w[ 4], w[ 5], offset); w[39] = amd_bytealign_S (w[ 3], w[ 4], offset); w[38] = amd_bytealign_S (w[ 2], w[ 3], offset); w[37] = amd_bytealign_S (w[ 1], w[ 2], offset); w[36] = amd_bytealign_S (w[ 0], w[ 1], offset); w[35] = amd_bytealign_S ( 0, w[ 0], offset); w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 36: w[63] = amd_bytealign_S (w[26], w[27], offset); w[62] = amd_bytealign_S (w[25], w[26], offset); w[61] = amd_bytealign_S (w[24], w[25], offset); w[60] = amd_bytealign_S (w[23], w[24], offset); w[59] = amd_bytealign_S (w[22], w[23], offset); w[58] = amd_bytealign_S (w[21], w[22], offset); w[57] = amd_bytealign_S (w[20], w[21], offset); w[56] = amd_bytealign_S (w[19], w[20], offset); w[55] = amd_bytealign_S (w[18], w[19], offset); w[54] = amd_bytealign_S (w[17], w[18], offset); w[53] = amd_bytealign_S (w[16], w[17], offset); w[52] = amd_bytealign_S (w[15], w[16], offset); w[51] = amd_bytealign_S (w[14], w[15], offset); w[50] = amd_bytealign_S (w[13], w[14], offset); w[49] = amd_bytealign_S (w[12], w[13], offset); w[48] = amd_bytealign_S (w[11], w[12], offset); w[47] = amd_bytealign_S (w[10], w[11], offset); w[46] = amd_bytealign_S (w[ 9], w[10], offset); w[45] = amd_bytealign_S (w[ 8], w[ 9], offset); w[44] = amd_bytealign_S (w[ 7], w[ 8], offset); w[43] = amd_bytealign_S (w[ 6], w[ 7], offset); w[42] = amd_bytealign_S (w[ 5], w[ 6], offset); w[41] = amd_bytealign_S (w[ 4], w[ 5], offset); w[40] = amd_bytealign_S (w[ 3], w[ 4], offset); w[39] = amd_bytealign_S (w[ 2], w[ 3], offset); w[38] = amd_bytealign_S (w[ 1], w[ 2], offset); w[37] = amd_bytealign_S (w[ 0], w[ 1], offset); w[36] = amd_bytealign_S ( 0, w[ 0], offset); w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 37: w[63] = amd_bytealign_S (w[25], w[26], offset); w[62] = amd_bytealign_S (w[24], w[25], offset); w[61] = amd_bytealign_S (w[23], w[24], offset); w[60] = amd_bytealign_S (w[22], w[23], offset); w[59] = amd_bytealign_S (w[21], w[22], offset); w[58] = amd_bytealign_S (w[20], w[21], offset); w[57] = amd_bytealign_S (w[19], w[20], offset); w[56] = amd_bytealign_S (w[18], w[19], offset); w[55] = amd_bytealign_S (w[17], w[18], offset); w[54] = amd_bytealign_S (w[16], w[17], offset); w[53] = amd_bytealign_S (w[15], w[16], offset); w[52] = amd_bytealign_S (w[14], w[15], offset); w[51] = amd_bytealign_S (w[13], w[14], offset); w[50] = amd_bytealign_S (w[12], w[13], offset); w[49] = amd_bytealign_S (w[11], w[12], offset); w[48] = amd_bytealign_S (w[10], w[11], offset); w[47] = amd_bytealign_S (w[ 9], w[10], offset); w[46] = amd_bytealign_S (w[ 8], w[ 9], offset); w[45] = amd_bytealign_S (w[ 7], w[ 8], offset); w[44] = amd_bytealign_S (w[ 6], w[ 7], offset); w[43] = amd_bytealign_S (w[ 5], w[ 6], offset); w[42] = amd_bytealign_S (w[ 4], w[ 5], offset); w[41] = amd_bytealign_S (w[ 3], w[ 4], offset); w[40] = amd_bytealign_S (w[ 2], w[ 3], offset); w[39] = amd_bytealign_S (w[ 1], w[ 2], offset); w[38] = amd_bytealign_S (w[ 0], w[ 1], offset); w[37] = amd_bytealign_S ( 0, w[ 0], offset); w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 38: w[63] = amd_bytealign_S (w[24], w[25], offset); w[62] = amd_bytealign_S (w[23], w[24], offset); w[61] = amd_bytealign_S (w[22], w[23], offset); w[60] = amd_bytealign_S (w[21], w[22], offset); w[59] = amd_bytealign_S (w[20], w[21], offset); w[58] = amd_bytealign_S (w[19], w[20], offset); w[57] = amd_bytealign_S (w[18], w[19], offset); w[56] = amd_bytealign_S (w[17], w[18], offset); w[55] = amd_bytealign_S (w[16], w[17], offset); w[54] = amd_bytealign_S (w[15], w[16], offset); w[53] = amd_bytealign_S (w[14], w[15], offset); w[52] = amd_bytealign_S (w[13], w[14], offset); w[51] = amd_bytealign_S (w[12], w[13], offset); w[50] = amd_bytealign_S (w[11], w[12], offset); w[49] = amd_bytealign_S (w[10], w[11], offset); w[48] = amd_bytealign_S (w[ 9], w[10], offset); w[47] = amd_bytealign_S (w[ 8], w[ 9], offset); w[46] = amd_bytealign_S (w[ 7], w[ 8], offset); w[45] = amd_bytealign_S (w[ 6], w[ 7], offset); w[44] = amd_bytealign_S (w[ 5], w[ 6], offset); w[43] = amd_bytealign_S (w[ 4], w[ 5], offset); w[42] = amd_bytealign_S (w[ 3], w[ 4], offset); w[41] = amd_bytealign_S (w[ 2], w[ 3], offset); w[40] = amd_bytealign_S (w[ 1], w[ 2], offset); w[39] = amd_bytealign_S (w[ 0], w[ 1], offset); w[38] = amd_bytealign_S ( 0, w[ 0], offset); w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 39: w[63] = amd_bytealign_S (w[23], w[24], offset); w[62] = amd_bytealign_S (w[22], w[23], offset); w[61] = amd_bytealign_S (w[21], w[22], offset); w[60] = amd_bytealign_S (w[20], w[21], offset); w[59] = amd_bytealign_S (w[19], w[20], offset); w[58] = amd_bytealign_S (w[18], w[19], offset); w[57] = amd_bytealign_S (w[17], w[18], offset); w[56] = amd_bytealign_S (w[16], w[17], offset); w[55] = amd_bytealign_S (w[15], w[16], offset); w[54] = amd_bytealign_S (w[14], w[15], offset); w[53] = amd_bytealign_S (w[13], w[14], offset); w[52] = amd_bytealign_S (w[12], w[13], offset); w[51] = amd_bytealign_S (w[11], w[12], offset); w[50] = amd_bytealign_S (w[10], w[11], offset); w[49] = amd_bytealign_S (w[ 9], w[10], offset); w[48] = amd_bytealign_S (w[ 8], w[ 9], offset); w[47] = amd_bytealign_S (w[ 7], w[ 8], offset); w[46] = amd_bytealign_S (w[ 6], w[ 7], offset); w[45] = amd_bytealign_S (w[ 5], w[ 6], offset); w[44] = amd_bytealign_S (w[ 4], w[ 5], offset); w[43] = amd_bytealign_S (w[ 3], w[ 4], offset); w[42] = amd_bytealign_S (w[ 2], w[ 3], offset); w[41] = amd_bytealign_S (w[ 1], w[ 2], offset); w[40] = amd_bytealign_S (w[ 0], w[ 1], offset); w[39] = amd_bytealign_S ( 0, w[ 0], offset); w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 40: w[63] = amd_bytealign_S (w[22], w[23], offset); w[62] = amd_bytealign_S (w[21], w[22], offset); w[61] = amd_bytealign_S (w[20], w[21], offset); w[60] = amd_bytealign_S (w[19], w[20], offset); w[59] = amd_bytealign_S (w[18], w[19], offset); w[58] = amd_bytealign_S (w[17], w[18], offset); w[57] = amd_bytealign_S (w[16], w[17], offset); w[56] = amd_bytealign_S (w[15], w[16], offset); w[55] = amd_bytealign_S (w[14], w[15], offset); w[54] = amd_bytealign_S (w[13], w[14], offset); w[53] = amd_bytealign_S (w[12], w[13], offset); w[52] = amd_bytealign_S (w[11], w[12], offset); w[51] = amd_bytealign_S (w[10], w[11], offset); w[50] = amd_bytealign_S (w[ 9], w[10], offset); w[49] = amd_bytealign_S (w[ 8], w[ 9], offset); w[48] = amd_bytealign_S (w[ 7], w[ 8], offset); w[47] = amd_bytealign_S (w[ 6], w[ 7], offset); w[46] = amd_bytealign_S (w[ 5], w[ 6], offset); w[45] = amd_bytealign_S (w[ 4], w[ 5], offset); w[44] = amd_bytealign_S (w[ 3], w[ 4], offset); w[43] = amd_bytealign_S (w[ 2], w[ 3], offset); w[42] = amd_bytealign_S (w[ 1], w[ 2], offset); w[41] = amd_bytealign_S (w[ 0], w[ 1], offset); w[40] = amd_bytealign_S ( 0, w[ 0], offset); w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 41: w[63] = amd_bytealign_S (w[21], w[22], offset); w[62] = amd_bytealign_S (w[20], w[21], offset); w[61] = amd_bytealign_S (w[19], w[20], offset); w[60] = amd_bytealign_S (w[18], w[19], offset); w[59] = amd_bytealign_S (w[17], w[18], offset); w[58] = amd_bytealign_S (w[16], w[17], offset); w[57] = amd_bytealign_S (w[15], w[16], offset); w[56] = amd_bytealign_S (w[14], w[15], offset); w[55] = amd_bytealign_S (w[13], w[14], offset); w[54] = amd_bytealign_S (w[12], w[13], offset); w[53] = amd_bytealign_S (w[11], w[12], offset); w[52] = amd_bytealign_S (w[10], w[11], offset); w[51] = amd_bytealign_S (w[ 9], w[10], offset); w[50] = amd_bytealign_S (w[ 8], w[ 9], offset); w[49] = amd_bytealign_S (w[ 7], w[ 8], offset); w[48] = amd_bytealign_S (w[ 6], w[ 7], offset); w[47] = amd_bytealign_S (w[ 5], w[ 6], offset); w[46] = amd_bytealign_S (w[ 4], w[ 5], offset); w[45] = amd_bytealign_S (w[ 3], w[ 4], offset); w[44] = amd_bytealign_S (w[ 2], w[ 3], offset); w[43] = amd_bytealign_S (w[ 1], w[ 2], offset); w[42] = amd_bytealign_S (w[ 0], w[ 1], offset); w[41] = amd_bytealign_S ( 0, w[ 0], offset); w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 42: w[63] = amd_bytealign_S (w[20], w[21], offset); w[62] = amd_bytealign_S (w[19], w[20], offset); w[61] = amd_bytealign_S (w[18], w[19], offset); w[60] = amd_bytealign_S (w[17], w[18], offset); w[59] = amd_bytealign_S (w[16], w[17], offset); w[58] = amd_bytealign_S (w[15], w[16], offset); w[57] = amd_bytealign_S (w[14], w[15], offset); w[56] = amd_bytealign_S (w[13], w[14], offset); w[55] = amd_bytealign_S (w[12], w[13], offset); w[54] = amd_bytealign_S (w[11], w[12], offset); w[53] = amd_bytealign_S (w[10], w[11], offset); w[52] = amd_bytealign_S (w[ 9], w[10], offset); w[51] = amd_bytealign_S (w[ 8], w[ 9], offset); w[50] = amd_bytealign_S (w[ 7], w[ 8], offset); w[49] = amd_bytealign_S (w[ 6], w[ 7], offset); w[48] = amd_bytealign_S (w[ 5], w[ 6], offset); w[47] = amd_bytealign_S (w[ 4], w[ 5], offset); w[46] = amd_bytealign_S (w[ 3], w[ 4], offset); w[45] = amd_bytealign_S (w[ 2], w[ 3], offset); w[44] = amd_bytealign_S (w[ 1], w[ 2], offset); w[43] = amd_bytealign_S (w[ 0], w[ 1], offset); w[42] = amd_bytealign_S ( 0, w[ 0], offset); w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 43: w[63] = amd_bytealign_S (w[19], w[20], offset); w[62] = amd_bytealign_S (w[18], w[19], offset); w[61] = amd_bytealign_S (w[17], w[18], offset); w[60] = amd_bytealign_S (w[16], w[17], offset); w[59] = amd_bytealign_S (w[15], w[16], offset); w[58] = amd_bytealign_S (w[14], w[15], offset); w[57] = amd_bytealign_S (w[13], w[14], offset); w[56] = amd_bytealign_S (w[12], w[13], offset); w[55] = amd_bytealign_S (w[11], w[12], offset); w[54] = amd_bytealign_S (w[10], w[11], offset); w[53] = amd_bytealign_S (w[ 9], w[10], offset); w[52] = amd_bytealign_S (w[ 8], w[ 9], offset); w[51] = amd_bytealign_S (w[ 7], w[ 8], offset); w[50] = amd_bytealign_S (w[ 6], w[ 7], offset); w[49] = amd_bytealign_S (w[ 5], w[ 6], offset); w[48] = amd_bytealign_S (w[ 4], w[ 5], offset); w[47] = amd_bytealign_S (w[ 3], w[ 4], offset); w[46] = amd_bytealign_S (w[ 2], w[ 3], offset); w[45] = amd_bytealign_S (w[ 1], w[ 2], offset); w[44] = amd_bytealign_S (w[ 0], w[ 1], offset); w[43] = amd_bytealign_S ( 0, w[ 0], offset); w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 44: w[63] = amd_bytealign_S (w[18], w[19], offset); w[62] = amd_bytealign_S (w[17], w[18], offset); w[61] = amd_bytealign_S (w[16], w[17], offset); w[60] = amd_bytealign_S (w[15], w[16], offset); w[59] = amd_bytealign_S (w[14], w[15], offset); w[58] = amd_bytealign_S (w[13], w[14], offset); w[57] = amd_bytealign_S (w[12], w[13], offset); w[56] = amd_bytealign_S (w[11], w[12], offset); w[55] = amd_bytealign_S (w[10], w[11], offset); w[54] = amd_bytealign_S (w[ 9], w[10], offset); w[53] = amd_bytealign_S (w[ 8], w[ 9], offset); w[52] = amd_bytealign_S (w[ 7], w[ 8], offset); w[51] = amd_bytealign_S (w[ 6], w[ 7], offset); w[50] = amd_bytealign_S (w[ 5], w[ 6], offset); w[49] = amd_bytealign_S (w[ 4], w[ 5], offset); w[48] = amd_bytealign_S (w[ 3], w[ 4], offset); w[47] = amd_bytealign_S (w[ 2], w[ 3], offset); w[46] = amd_bytealign_S (w[ 1], w[ 2], offset); w[45] = amd_bytealign_S (w[ 0], w[ 1], offset); w[44] = amd_bytealign_S ( 0, w[ 0], offset); w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 45: w[63] = amd_bytealign_S (w[17], w[18], offset); w[62] = amd_bytealign_S (w[16], w[17], offset); w[61] = amd_bytealign_S (w[15], w[16], offset); w[60] = amd_bytealign_S (w[14], w[15], offset); w[59] = amd_bytealign_S (w[13], w[14], offset); w[58] = amd_bytealign_S (w[12], w[13], offset); w[57] = amd_bytealign_S (w[11], w[12], offset); w[56] = amd_bytealign_S (w[10], w[11], offset); w[55] = amd_bytealign_S (w[ 9], w[10], offset); w[54] = amd_bytealign_S (w[ 8], w[ 9], offset); w[53] = amd_bytealign_S (w[ 7], w[ 8], offset); w[52] = amd_bytealign_S (w[ 6], w[ 7], offset); w[51] = amd_bytealign_S (w[ 5], w[ 6], offset); w[50] = amd_bytealign_S (w[ 4], w[ 5], offset); w[49] = amd_bytealign_S (w[ 3], w[ 4], offset); w[48] = amd_bytealign_S (w[ 2], w[ 3], offset); w[47] = amd_bytealign_S (w[ 1], w[ 2], offset); w[46] = amd_bytealign_S (w[ 0], w[ 1], offset); w[45] = amd_bytealign_S ( 0, w[ 0], offset); w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 46: w[63] = amd_bytealign_S (w[16], w[17], offset); w[62] = amd_bytealign_S (w[15], w[16], offset); w[61] = amd_bytealign_S (w[14], w[15], offset); w[60] = amd_bytealign_S (w[13], w[14], offset); w[59] = amd_bytealign_S (w[12], w[13], offset); w[58] = amd_bytealign_S (w[11], w[12], offset); w[57] = amd_bytealign_S (w[10], w[11], offset); w[56] = amd_bytealign_S (w[ 9], w[10], offset); w[55] = amd_bytealign_S (w[ 8], w[ 9], offset); w[54] = amd_bytealign_S (w[ 7], w[ 8], offset); w[53] = amd_bytealign_S (w[ 6], w[ 7], offset); w[52] = amd_bytealign_S (w[ 5], w[ 6], offset); w[51] = amd_bytealign_S (w[ 4], w[ 5], offset); w[50] = amd_bytealign_S (w[ 3], w[ 4], offset); w[49] = amd_bytealign_S (w[ 2], w[ 3], offset); w[48] = amd_bytealign_S (w[ 1], w[ 2], offset); w[47] = amd_bytealign_S (w[ 0], w[ 1], offset); w[46] = amd_bytealign_S ( 0, w[ 0], offset); w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 47: w[63] = amd_bytealign_S (w[15], w[16], offset); w[62] = amd_bytealign_S (w[14], w[15], offset); w[61] = amd_bytealign_S (w[13], w[14], offset); w[60] = amd_bytealign_S (w[12], w[13], offset); w[59] = amd_bytealign_S (w[11], w[12], offset); w[58] = amd_bytealign_S (w[10], w[11], offset); w[57] = amd_bytealign_S (w[ 9], w[10], offset); w[56] = amd_bytealign_S (w[ 8], w[ 9], offset); w[55] = amd_bytealign_S (w[ 7], w[ 8], offset); w[54] = amd_bytealign_S (w[ 6], w[ 7], offset); w[53] = amd_bytealign_S (w[ 5], w[ 6], offset); w[52] = amd_bytealign_S (w[ 4], w[ 5], offset); w[51] = amd_bytealign_S (w[ 3], w[ 4], offset); w[50] = amd_bytealign_S (w[ 2], w[ 3], offset); w[49] = amd_bytealign_S (w[ 1], w[ 2], offset); w[48] = amd_bytealign_S (w[ 0], w[ 1], offset); w[47] = amd_bytealign_S ( 0, w[ 0], offset); w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 48: w[63] = amd_bytealign_S (w[14], w[15], offset); w[62] = amd_bytealign_S (w[13], w[14], offset); w[61] = amd_bytealign_S (w[12], w[13], offset); w[60] = amd_bytealign_S (w[11], w[12], offset); w[59] = amd_bytealign_S (w[10], w[11], offset); w[58] = amd_bytealign_S (w[ 9], w[10], offset); w[57] = amd_bytealign_S (w[ 8], w[ 9], offset); w[56] = amd_bytealign_S (w[ 7], w[ 8], offset); w[55] = amd_bytealign_S (w[ 6], w[ 7], offset); w[54] = amd_bytealign_S (w[ 5], w[ 6], offset); w[53] = amd_bytealign_S (w[ 4], w[ 5], offset); w[52] = amd_bytealign_S (w[ 3], w[ 4], offset); w[51] = amd_bytealign_S (w[ 2], w[ 3], offset); w[50] = amd_bytealign_S (w[ 1], w[ 2], offset); w[49] = amd_bytealign_S (w[ 0], w[ 1], offset); w[48] = amd_bytealign_S ( 0, w[ 0], offset); w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 49: w[63] = amd_bytealign_S (w[13], w[14], offset); w[62] = amd_bytealign_S (w[12], w[13], offset); w[61] = amd_bytealign_S (w[11], w[12], offset); w[60] = amd_bytealign_S (w[10], w[11], offset); w[59] = amd_bytealign_S (w[ 9], w[10], offset); w[58] = amd_bytealign_S (w[ 8], w[ 9], offset); w[57] = amd_bytealign_S (w[ 7], w[ 8], offset); w[56] = amd_bytealign_S (w[ 6], w[ 7], offset); w[55] = amd_bytealign_S (w[ 5], w[ 6], offset); w[54] = amd_bytealign_S (w[ 4], w[ 5], offset); w[53] = amd_bytealign_S (w[ 3], w[ 4], offset); w[52] = amd_bytealign_S (w[ 2], w[ 3], offset); w[51] = amd_bytealign_S (w[ 1], w[ 2], offset); w[50] = amd_bytealign_S (w[ 0], w[ 1], offset); w[49] = amd_bytealign_S ( 0, w[ 0], offset); w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 50: w[63] = amd_bytealign_S (w[12], w[13], offset); w[62] = amd_bytealign_S (w[11], w[12], offset); w[61] = amd_bytealign_S (w[10], w[11], offset); w[60] = amd_bytealign_S (w[ 9], w[10], offset); w[59] = amd_bytealign_S (w[ 8], w[ 9], offset); w[58] = amd_bytealign_S (w[ 7], w[ 8], offset); w[57] = amd_bytealign_S (w[ 6], w[ 7], offset); w[56] = amd_bytealign_S (w[ 5], w[ 6], offset); w[55] = amd_bytealign_S (w[ 4], w[ 5], offset); w[54] = amd_bytealign_S (w[ 3], w[ 4], offset); w[53] = amd_bytealign_S (w[ 2], w[ 3], offset); w[52] = amd_bytealign_S (w[ 1], w[ 2], offset); w[51] = amd_bytealign_S (w[ 0], w[ 1], offset); w[50] = amd_bytealign_S ( 0, w[ 0], offset); w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 51: w[63] = amd_bytealign_S (w[11], w[12], offset); w[62] = amd_bytealign_S (w[10], w[11], offset); w[61] = amd_bytealign_S (w[ 9], w[10], offset); w[60] = amd_bytealign_S (w[ 8], w[ 9], offset); w[59] = amd_bytealign_S (w[ 7], w[ 8], offset); w[58] = amd_bytealign_S (w[ 6], w[ 7], offset); w[57] = amd_bytealign_S (w[ 5], w[ 6], offset); w[56] = amd_bytealign_S (w[ 4], w[ 5], offset); w[55] = amd_bytealign_S (w[ 3], w[ 4], offset); w[54] = amd_bytealign_S (w[ 2], w[ 3], offset); w[53] = amd_bytealign_S (w[ 1], w[ 2], offset); w[52] = amd_bytealign_S (w[ 0], w[ 1], offset); w[51] = amd_bytealign_S ( 0, w[ 0], offset); w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 52: w[63] = amd_bytealign_S (w[10], w[11], offset); w[62] = amd_bytealign_S (w[ 9], w[10], offset); w[61] = amd_bytealign_S (w[ 8], w[ 9], offset); w[60] = amd_bytealign_S (w[ 7], w[ 8], offset); w[59] = amd_bytealign_S (w[ 6], w[ 7], offset); w[58] = amd_bytealign_S (w[ 5], w[ 6], offset); w[57] = amd_bytealign_S (w[ 4], w[ 5], offset); w[56] = amd_bytealign_S (w[ 3], w[ 4], offset); w[55] = amd_bytealign_S (w[ 2], w[ 3], offset); w[54] = amd_bytealign_S (w[ 1], w[ 2], offset); w[53] = amd_bytealign_S (w[ 0], w[ 1], offset); w[52] = amd_bytealign_S ( 0, w[ 0], offset); w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 53: w[63] = amd_bytealign_S (w[ 9], w[10], offset); w[62] = amd_bytealign_S (w[ 8], w[ 9], offset); w[61] = amd_bytealign_S (w[ 7], w[ 8], offset); w[60] = amd_bytealign_S (w[ 6], w[ 7], offset); w[59] = amd_bytealign_S (w[ 5], w[ 6], offset); w[58] = amd_bytealign_S (w[ 4], w[ 5], offset); w[57] = amd_bytealign_S (w[ 3], w[ 4], offset); w[56] = amd_bytealign_S (w[ 2], w[ 3], offset); w[55] = amd_bytealign_S (w[ 1], w[ 2], offset); w[54] = amd_bytealign_S (w[ 0], w[ 1], offset); w[53] = amd_bytealign_S ( 0, w[ 0], offset); w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 54: w[63] = amd_bytealign_S (w[ 8], w[ 9], offset); w[62] = amd_bytealign_S (w[ 7], w[ 8], offset); w[61] = amd_bytealign_S (w[ 6], w[ 7], offset); w[60] = amd_bytealign_S (w[ 5], w[ 6], offset); w[59] = amd_bytealign_S (w[ 4], w[ 5], offset); w[58] = amd_bytealign_S (w[ 3], w[ 4], offset); w[57] = amd_bytealign_S (w[ 2], w[ 3], offset); w[56] = amd_bytealign_S (w[ 1], w[ 2], offset); w[55] = amd_bytealign_S (w[ 0], w[ 1], offset); w[54] = amd_bytealign_S ( 0, w[ 0], offset); w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 55: w[63] = amd_bytealign_S (w[ 7], w[ 8], offset); w[62] = amd_bytealign_S (w[ 6], w[ 7], offset); w[61] = amd_bytealign_S (w[ 5], w[ 6], offset); w[60] = amd_bytealign_S (w[ 4], w[ 5], offset); w[59] = amd_bytealign_S (w[ 3], w[ 4], offset); w[58] = amd_bytealign_S (w[ 2], w[ 3], offset); w[57] = amd_bytealign_S (w[ 1], w[ 2], offset); w[56] = amd_bytealign_S (w[ 0], w[ 1], offset); w[55] = amd_bytealign_S ( 0, w[ 0], offset); w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 56: w[63] = amd_bytealign_S (w[ 6], w[ 7], offset); w[62] = amd_bytealign_S (w[ 5], w[ 6], offset); w[61] = amd_bytealign_S (w[ 4], w[ 5], offset); w[60] = amd_bytealign_S (w[ 3], w[ 4], offset); w[59] = amd_bytealign_S (w[ 2], w[ 3], offset); w[58] = amd_bytealign_S (w[ 1], w[ 2], offset); w[57] = amd_bytealign_S (w[ 0], w[ 1], offset); w[56] = amd_bytealign_S ( 0, w[ 0], offset); w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 57: w[63] = amd_bytealign_S (w[ 5], w[ 6], offset); w[62] = amd_bytealign_S (w[ 4], w[ 5], offset); w[61] = amd_bytealign_S (w[ 3], w[ 4], offset); w[60] = amd_bytealign_S (w[ 2], w[ 3], offset); w[59] = amd_bytealign_S (w[ 1], w[ 2], offset); w[58] = amd_bytealign_S (w[ 0], w[ 1], offset); w[57] = amd_bytealign_S ( 0, w[ 0], offset); w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 58: w[63] = amd_bytealign_S (w[ 4], w[ 5], offset); w[62] = amd_bytealign_S (w[ 3], w[ 4], offset); w[61] = amd_bytealign_S (w[ 2], w[ 3], offset); w[60] = amd_bytealign_S (w[ 1], w[ 2], offset); w[59] = amd_bytealign_S (w[ 0], w[ 1], offset); w[58] = amd_bytealign_S ( 0, w[ 0], offset); w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 59: w[63] = amd_bytealign_S (w[ 3], w[ 4], offset); w[62] = amd_bytealign_S (w[ 2], w[ 3], offset); w[61] = amd_bytealign_S (w[ 1], w[ 2], offset); w[60] = amd_bytealign_S (w[ 0], w[ 1], offset); w[59] = amd_bytealign_S ( 0, w[ 0], offset); w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 60: w[63] = amd_bytealign_S (w[ 2], w[ 3], offset); w[62] = amd_bytealign_S (w[ 1], w[ 2], offset); w[61] = amd_bytealign_S (w[ 0], w[ 1], offset); w[60] = amd_bytealign_S ( 0, w[ 0], offset); w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 61: w[63] = amd_bytealign_S (w[ 1], w[ 2], offset); w[62] = amd_bytealign_S (w[ 0], w[ 1], offset); w[61] = amd_bytealign_S ( 0, w[ 0], offset); w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 62: w[63] = amd_bytealign_S (w[ 0], w[ 1], offset); w[62] = amd_bytealign_S ( 0, w[ 0], offset); w[61] = 0; w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 63: w[63] = amd_bytealign_S ( 0, w[ 0], offset); w[62] = 0; w[61] = 0; w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; } #endif #if (defined IS_AMD && AMD_GCN >= 3) || defined IS_NV #if defined IS_NV const int selector = (0x76543210 >> ((offset & 3) * 4)) & 0xffff; #endif #if defined IS_AMD const int selector = 0x0706050403020100 >> ((offset & 3) * 8); #endif switch (offset_switch) { case 0: w[63] = __byte_perm_S (w[63], w[62], selector); w[62] = __byte_perm_S (w[62], w[61], selector); w[61] = __byte_perm_S (w[61], w[60], selector); w[60] = __byte_perm_S (w[60], w[59], selector); w[59] = __byte_perm_S (w[59], w[58], selector); w[58] = __byte_perm_S (w[58], w[57], selector); w[57] = __byte_perm_S (w[57], w[56], selector); w[56] = __byte_perm_S (w[56], w[55], selector); w[55] = __byte_perm_S (w[55], w[54], selector); w[54] = __byte_perm_S (w[54], w[53], selector); w[53] = __byte_perm_S (w[53], w[52], selector); w[52] = __byte_perm_S (w[52], w[51], selector); w[51] = __byte_perm_S (w[51], w[50], selector); w[50] = __byte_perm_S (w[50], w[49], selector); w[49] = __byte_perm_S (w[49], w[48], selector); w[48] = __byte_perm_S (w[48], w[47], selector); w[47] = __byte_perm_S (w[47], w[46], selector); w[46] = __byte_perm_S (w[46], w[45], selector); w[45] = __byte_perm_S (w[45], w[44], selector); w[44] = __byte_perm_S (w[44], w[43], selector); w[43] = __byte_perm_S (w[43], w[42], selector); w[42] = __byte_perm_S (w[42], w[41], selector); w[41] = __byte_perm_S (w[41], w[40], selector); w[40] = __byte_perm_S (w[40], w[39], selector); w[39] = __byte_perm_S (w[39], w[38], selector); w[38] = __byte_perm_S (w[38], w[37], selector); w[37] = __byte_perm_S (w[37], w[36], selector); w[36] = __byte_perm_S (w[36], w[35], selector); w[35] = __byte_perm_S (w[35], w[34], selector); w[34] = __byte_perm_S (w[34], w[33], selector); w[33] = __byte_perm_S (w[33], w[32], selector); w[32] = __byte_perm_S (w[32], w[31], selector); w[31] = __byte_perm_S (w[31], w[30], selector); w[30] = __byte_perm_S (w[30], w[29], selector); w[29] = __byte_perm_S (w[29], w[28], selector); w[28] = __byte_perm_S (w[28], w[27], selector); w[27] = __byte_perm_S (w[27], w[26], selector); w[26] = __byte_perm_S (w[26], w[25], selector); w[25] = __byte_perm_S (w[25], w[24], selector); w[24] = __byte_perm_S (w[24], w[23], selector); w[23] = __byte_perm_S (w[23], w[22], selector); w[22] = __byte_perm_S (w[22], w[21], selector); w[21] = __byte_perm_S (w[21], w[20], selector); w[20] = __byte_perm_S (w[20], w[19], selector); w[19] = __byte_perm_S (w[19], w[18], selector); w[18] = __byte_perm_S (w[18], w[17], selector); w[17] = __byte_perm_S (w[17], w[16], selector); w[16] = __byte_perm_S (w[16], w[15], selector); w[15] = __byte_perm_S (w[15], w[14], selector); w[14] = __byte_perm_S (w[14], w[13], selector); w[13] = __byte_perm_S (w[13], w[12], selector); w[12] = __byte_perm_S (w[12], w[11], selector); w[11] = __byte_perm_S (w[11], w[10], selector); w[10] = __byte_perm_S (w[10], w[ 9], selector); w[ 9] = __byte_perm_S (w[ 9], w[ 8], selector); w[ 8] = __byte_perm_S (w[ 8], w[ 7], selector); w[ 7] = __byte_perm_S (w[ 7], w[ 6], selector); w[ 6] = __byte_perm_S (w[ 6], w[ 5], selector); w[ 5] = __byte_perm_S (w[ 5], w[ 4], selector); w[ 4] = __byte_perm_S (w[ 4], w[ 3], selector); w[ 3] = __byte_perm_S (w[ 3], w[ 2], selector); w[ 2] = __byte_perm_S (w[ 2], w[ 1], selector); w[ 1] = __byte_perm_S (w[ 1], w[ 0], selector); w[ 0] = __byte_perm_S (w[ 0], 0, selector); break; case 1: w[63] = __byte_perm_S (w[62], w[61], selector); w[62] = __byte_perm_S (w[61], w[60], selector); w[61] = __byte_perm_S (w[60], w[59], selector); w[60] = __byte_perm_S (w[59], w[58], selector); w[59] = __byte_perm_S (w[58], w[57], selector); w[58] = __byte_perm_S (w[57], w[56], selector); w[57] = __byte_perm_S (w[56], w[55], selector); w[56] = __byte_perm_S (w[55], w[54], selector); w[55] = __byte_perm_S (w[54], w[53], selector); w[54] = __byte_perm_S (w[53], w[52], selector); w[53] = __byte_perm_S (w[52], w[51], selector); w[52] = __byte_perm_S (w[51], w[50], selector); w[51] = __byte_perm_S (w[50], w[49], selector); w[50] = __byte_perm_S (w[49], w[48], selector); w[49] = __byte_perm_S (w[48], w[47], selector); w[48] = __byte_perm_S (w[47], w[46], selector); w[47] = __byte_perm_S (w[46], w[45], selector); w[46] = __byte_perm_S (w[45], w[44], selector); w[45] = __byte_perm_S (w[44], w[43], selector); w[44] = __byte_perm_S (w[43], w[42], selector); w[43] = __byte_perm_S (w[42], w[41], selector); w[42] = __byte_perm_S (w[41], w[40], selector); w[41] = __byte_perm_S (w[40], w[39], selector); w[40] = __byte_perm_S (w[39], w[38], selector); w[39] = __byte_perm_S (w[38], w[37], selector); w[38] = __byte_perm_S (w[37], w[36], selector); w[37] = __byte_perm_S (w[36], w[35], selector); w[36] = __byte_perm_S (w[35], w[34], selector); w[35] = __byte_perm_S (w[34], w[33], selector); w[34] = __byte_perm_S (w[33], w[32], selector); w[33] = __byte_perm_S (w[32], w[31], selector); w[32] = __byte_perm_S (w[31], w[30], selector); w[31] = __byte_perm_S (w[30], w[29], selector); w[30] = __byte_perm_S (w[29], w[28], selector); w[29] = __byte_perm_S (w[28], w[27], selector); w[28] = __byte_perm_S (w[27], w[26], selector); w[27] = __byte_perm_S (w[26], w[25], selector); w[26] = __byte_perm_S (w[25], w[24], selector); w[25] = __byte_perm_S (w[24], w[23], selector); w[24] = __byte_perm_S (w[23], w[22], selector); w[23] = __byte_perm_S (w[22], w[21], selector); w[22] = __byte_perm_S (w[21], w[20], selector); w[21] = __byte_perm_S (w[20], w[19], selector); w[20] = __byte_perm_S (w[19], w[18], selector); w[19] = __byte_perm_S (w[18], w[17], selector); w[18] = __byte_perm_S (w[17], w[16], selector); w[17] = __byte_perm_S (w[16], w[15], selector); w[16] = __byte_perm_S (w[15], w[14], selector); w[15] = __byte_perm_S (w[14], w[13], selector); w[14] = __byte_perm_S (w[13], w[12], selector); w[13] = __byte_perm_S (w[12], w[11], selector); w[12] = __byte_perm_S (w[11], w[10], selector); w[11] = __byte_perm_S (w[10], w[ 9], selector); w[10] = __byte_perm_S (w[ 9], w[ 8], selector); w[ 9] = __byte_perm_S (w[ 8], w[ 7], selector); w[ 8] = __byte_perm_S (w[ 7], w[ 6], selector); w[ 7] = __byte_perm_S (w[ 6], w[ 5], selector); w[ 6] = __byte_perm_S (w[ 5], w[ 4], selector); w[ 5] = __byte_perm_S (w[ 4], w[ 3], selector); w[ 4] = __byte_perm_S (w[ 3], w[ 2], selector); w[ 3] = __byte_perm_S (w[ 2], w[ 1], selector); w[ 2] = __byte_perm_S (w[ 1], w[ 0], selector); w[ 1] = __byte_perm_S (w[ 0], 0, selector); w[ 0] = 0; break; case 2: w[63] = __byte_perm_S (w[61], w[60], selector); w[62] = __byte_perm_S (w[60], w[59], selector); w[61] = __byte_perm_S (w[59], w[58], selector); w[60] = __byte_perm_S (w[58], w[57], selector); w[59] = __byte_perm_S (w[57], w[56], selector); w[58] = __byte_perm_S (w[56], w[55], selector); w[57] = __byte_perm_S (w[55], w[54], selector); w[56] = __byte_perm_S (w[54], w[53], selector); w[55] = __byte_perm_S (w[53], w[52], selector); w[54] = __byte_perm_S (w[52], w[51], selector); w[53] = __byte_perm_S (w[51], w[50], selector); w[52] = __byte_perm_S (w[50], w[49], selector); w[51] = __byte_perm_S (w[49], w[48], selector); w[50] = __byte_perm_S (w[48], w[47], selector); w[49] = __byte_perm_S (w[47], w[46], selector); w[48] = __byte_perm_S (w[46], w[45], selector); w[47] = __byte_perm_S (w[45], w[44], selector); w[46] = __byte_perm_S (w[44], w[43], selector); w[45] = __byte_perm_S (w[43], w[42], selector); w[44] = __byte_perm_S (w[42], w[41], selector); w[43] = __byte_perm_S (w[41], w[40], selector); w[42] = __byte_perm_S (w[40], w[39], selector); w[41] = __byte_perm_S (w[39], w[38], selector); w[40] = __byte_perm_S (w[38], w[37], selector); w[39] = __byte_perm_S (w[37], w[36], selector); w[38] = __byte_perm_S (w[36], w[35], selector); w[37] = __byte_perm_S (w[35], w[34], selector); w[36] = __byte_perm_S (w[34], w[33], selector); w[35] = __byte_perm_S (w[33], w[32], selector); w[34] = __byte_perm_S (w[32], w[31], selector); w[33] = __byte_perm_S (w[31], w[30], selector); w[32] = __byte_perm_S (w[30], w[29], selector); w[31] = __byte_perm_S (w[29], w[28], selector); w[30] = __byte_perm_S (w[28], w[27], selector); w[29] = __byte_perm_S (w[27], w[26], selector); w[28] = __byte_perm_S (w[26], w[25], selector); w[27] = __byte_perm_S (w[25], w[24], selector); w[26] = __byte_perm_S (w[24], w[23], selector); w[25] = __byte_perm_S (w[23], w[22], selector); w[24] = __byte_perm_S (w[22], w[21], selector); w[23] = __byte_perm_S (w[21], w[20], selector); w[22] = __byte_perm_S (w[20], w[19], selector); w[21] = __byte_perm_S (w[19], w[18], selector); w[20] = __byte_perm_S (w[18], w[17], selector); w[19] = __byte_perm_S (w[17], w[16], selector); w[18] = __byte_perm_S (w[16], w[15], selector); w[17] = __byte_perm_S (w[15], w[14], selector); w[16] = __byte_perm_S (w[14], w[13], selector); w[15] = __byte_perm_S (w[13], w[12], selector); w[14] = __byte_perm_S (w[12], w[11], selector); w[13] = __byte_perm_S (w[11], w[10], selector); w[12] = __byte_perm_S (w[10], w[ 9], selector); w[11] = __byte_perm_S (w[ 9], w[ 8], selector); w[10] = __byte_perm_S (w[ 8], w[ 7], selector); w[ 9] = __byte_perm_S (w[ 7], w[ 6], selector); w[ 8] = __byte_perm_S (w[ 6], w[ 5], selector); w[ 7] = __byte_perm_S (w[ 5], w[ 4], selector); w[ 6] = __byte_perm_S (w[ 4], w[ 3], selector); w[ 5] = __byte_perm_S (w[ 3], w[ 2], selector); w[ 4] = __byte_perm_S (w[ 2], w[ 1], selector); w[ 3] = __byte_perm_S (w[ 1], w[ 0], selector); w[ 2] = __byte_perm_S (w[ 0], 0, selector); w[ 1] = 0; w[ 0] = 0; break; case 3: w[63] = __byte_perm_S (w[60], w[59], selector); w[62] = __byte_perm_S (w[59], w[58], selector); w[61] = __byte_perm_S (w[58], w[57], selector); w[60] = __byte_perm_S (w[57], w[56], selector); w[59] = __byte_perm_S (w[56], w[55], selector); w[58] = __byte_perm_S (w[55], w[54], selector); w[57] = __byte_perm_S (w[54], w[53], selector); w[56] = __byte_perm_S (w[53], w[52], selector); w[55] = __byte_perm_S (w[52], w[51], selector); w[54] = __byte_perm_S (w[51], w[50], selector); w[53] = __byte_perm_S (w[50], w[49], selector); w[52] = __byte_perm_S (w[49], w[48], selector); w[51] = __byte_perm_S (w[48], w[47], selector); w[50] = __byte_perm_S (w[47], w[46], selector); w[49] = __byte_perm_S (w[46], w[45], selector); w[48] = __byte_perm_S (w[45], w[44], selector); w[47] = __byte_perm_S (w[44], w[43], selector); w[46] = __byte_perm_S (w[43], w[42], selector); w[45] = __byte_perm_S (w[42], w[41], selector); w[44] = __byte_perm_S (w[41], w[40], selector); w[43] = __byte_perm_S (w[40], w[39], selector); w[42] = __byte_perm_S (w[39], w[38], selector); w[41] = __byte_perm_S (w[38], w[37], selector); w[40] = __byte_perm_S (w[37], w[36], selector); w[39] = __byte_perm_S (w[36], w[35], selector); w[38] = __byte_perm_S (w[35], w[34], selector); w[37] = __byte_perm_S (w[34], w[33], selector); w[36] = __byte_perm_S (w[33], w[32], selector); w[35] = __byte_perm_S (w[32], w[31], selector); w[34] = __byte_perm_S (w[31], w[30], selector); w[33] = __byte_perm_S (w[30], w[29], selector); w[32] = __byte_perm_S (w[29], w[28], selector); w[31] = __byte_perm_S (w[28], w[27], selector); w[30] = __byte_perm_S (w[27], w[26], selector); w[29] = __byte_perm_S (w[26], w[25], selector); w[28] = __byte_perm_S (w[25], w[24], selector); w[27] = __byte_perm_S (w[24], w[23], selector); w[26] = __byte_perm_S (w[23], w[22], selector); w[25] = __byte_perm_S (w[22], w[21], selector); w[24] = __byte_perm_S (w[21], w[20], selector); w[23] = __byte_perm_S (w[20], w[19], selector); w[22] = __byte_perm_S (w[19], w[18], selector); w[21] = __byte_perm_S (w[18], w[17], selector); w[20] = __byte_perm_S (w[17], w[16], selector); w[19] = __byte_perm_S (w[16], w[15], selector); w[18] = __byte_perm_S (w[15], w[14], selector); w[17] = __byte_perm_S (w[14], w[13], selector); w[16] = __byte_perm_S (w[13], w[12], selector); w[15] = __byte_perm_S (w[12], w[11], selector); w[14] = __byte_perm_S (w[11], w[10], selector); w[13] = __byte_perm_S (w[10], w[ 9], selector); w[12] = __byte_perm_S (w[ 9], w[ 8], selector); w[11] = __byte_perm_S (w[ 8], w[ 7], selector); w[10] = __byte_perm_S (w[ 7], w[ 6], selector); w[ 9] = __byte_perm_S (w[ 6], w[ 5], selector); w[ 8] = __byte_perm_S (w[ 5], w[ 4], selector); w[ 7] = __byte_perm_S (w[ 4], w[ 3], selector); w[ 6] = __byte_perm_S (w[ 3], w[ 2], selector); w[ 5] = __byte_perm_S (w[ 2], w[ 1], selector); w[ 4] = __byte_perm_S (w[ 1], w[ 0], selector); w[ 3] = __byte_perm_S (w[ 0], 0, selector); w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 4: w[63] = __byte_perm_S (w[59], w[58], selector); w[62] = __byte_perm_S (w[58], w[57], selector); w[61] = __byte_perm_S (w[57], w[56], selector); w[60] = __byte_perm_S (w[56], w[55], selector); w[59] = __byte_perm_S (w[55], w[54], selector); w[58] = __byte_perm_S (w[54], w[53], selector); w[57] = __byte_perm_S (w[53], w[52], selector); w[56] = __byte_perm_S (w[52], w[51], selector); w[55] = __byte_perm_S (w[51], w[50], selector); w[54] = __byte_perm_S (w[50], w[49], selector); w[53] = __byte_perm_S (w[49], w[48], selector); w[52] = __byte_perm_S (w[48], w[47], selector); w[51] = __byte_perm_S (w[47], w[46], selector); w[50] = __byte_perm_S (w[46], w[45], selector); w[49] = __byte_perm_S (w[45], w[44], selector); w[48] = __byte_perm_S (w[44], w[43], selector); w[47] = __byte_perm_S (w[43], w[42], selector); w[46] = __byte_perm_S (w[42], w[41], selector); w[45] = __byte_perm_S (w[41], w[40], selector); w[44] = __byte_perm_S (w[40], w[39], selector); w[43] = __byte_perm_S (w[39], w[38], selector); w[42] = __byte_perm_S (w[38], w[37], selector); w[41] = __byte_perm_S (w[37], w[36], selector); w[40] = __byte_perm_S (w[36], w[35], selector); w[39] = __byte_perm_S (w[35], w[34], selector); w[38] = __byte_perm_S (w[34], w[33], selector); w[37] = __byte_perm_S (w[33], w[32], selector); w[36] = __byte_perm_S (w[32], w[31], selector); w[35] = __byte_perm_S (w[31], w[30], selector); w[34] = __byte_perm_S (w[30], w[29], selector); w[33] = __byte_perm_S (w[29], w[28], selector); w[32] = __byte_perm_S (w[28], w[27], selector); w[31] = __byte_perm_S (w[27], w[26], selector); w[30] = __byte_perm_S (w[26], w[25], selector); w[29] = __byte_perm_S (w[25], w[24], selector); w[28] = __byte_perm_S (w[24], w[23], selector); w[27] = __byte_perm_S (w[23], w[22], selector); w[26] = __byte_perm_S (w[22], w[21], selector); w[25] = __byte_perm_S (w[21], w[20], selector); w[24] = __byte_perm_S (w[20], w[19], selector); w[23] = __byte_perm_S (w[19], w[18], selector); w[22] = __byte_perm_S (w[18], w[17], selector); w[21] = __byte_perm_S (w[17], w[16], selector); w[20] = __byte_perm_S (w[16], w[15], selector); w[19] = __byte_perm_S (w[15], w[14], selector); w[18] = __byte_perm_S (w[14], w[13], selector); w[17] = __byte_perm_S (w[13], w[12], selector); w[16] = __byte_perm_S (w[12], w[11], selector); w[15] = __byte_perm_S (w[11], w[10], selector); w[14] = __byte_perm_S (w[10], w[ 9], selector); w[13] = __byte_perm_S (w[ 9], w[ 8], selector); w[12] = __byte_perm_S (w[ 8], w[ 7], selector); w[11] = __byte_perm_S (w[ 7], w[ 6], selector); w[10] = __byte_perm_S (w[ 6], w[ 5], selector); w[ 9] = __byte_perm_S (w[ 5], w[ 4], selector); w[ 8] = __byte_perm_S (w[ 4], w[ 3], selector); w[ 7] = __byte_perm_S (w[ 3], w[ 2], selector); w[ 6] = __byte_perm_S (w[ 2], w[ 1], selector); w[ 5] = __byte_perm_S (w[ 1], w[ 0], selector); w[ 4] = __byte_perm_S (w[ 0], 0, selector); w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 5: w[63] = __byte_perm_S (w[58], w[57], selector); w[62] = __byte_perm_S (w[57], w[56], selector); w[61] = __byte_perm_S (w[56], w[55], selector); w[60] = __byte_perm_S (w[55], w[54], selector); w[59] = __byte_perm_S (w[54], w[53], selector); w[58] = __byte_perm_S (w[53], w[52], selector); w[57] = __byte_perm_S (w[52], w[51], selector); w[56] = __byte_perm_S (w[51], w[50], selector); w[55] = __byte_perm_S (w[50], w[49], selector); w[54] = __byte_perm_S (w[49], w[48], selector); w[53] = __byte_perm_S (w[48], w[47], selector); w[52] = __byte_perm_S (w[47], w[46], selector); w[51] = __byte_perm_S (w[46], w[45], selector); w[50] = __byte_perm_S (w[45], w[44], selector); w[49] = __byte_perm_S (w[44], w[43], selector); w[48] = __byte_perm_S (w[43], w[42], selector); w[47] = __byte_perm_S (w[42], w[41], selector); w[46] = __byte_perm_S (w[41], w[40], selector); w[45] = __byte_perm_S (w[40], w[39], selector); w[44] = __byte_perm_S (w[39], w[38], selector); w[43] = __byte_perm_S (w[38], w[37], selector); w[42] = __byte_perm_S (w[37], w[36], selector); w[41] = __byte_perm_S (w[36], w[35], selector); w[40] = __byte_perm_S (w[35], w[34], selector); w[39] = __byte_perm_S (w[34], w[33], selector); w[38] = __byte_perm_S (w[33], w[32], selector); w[37] = __byte_perm_S (w[32], w[31], selector); w[36] = __byte_perm_S (w[31], w[30], selector); w[35] = __byte_perm_S (w[30], w[29], selector); w[34] = __byte_perm_S (w[29], w[28], selector); w[33] = __byte_perm_S (w[28], w[27], selector); w[32] = __byte_perm_S (w[27], w[26], selector); w[31] = __byte_perm_S (w[26], w[25], selector); w[30] = __byte_perm_S (w[25], w[24], selector); w[29] = __byte_perm_S (w[24], w[23], selector); w[28] = __byte_perm_S (w[23], w[22], selector); w[27] = __byte_perm_S (w[22], w[21], selector); w[26] = __byte_perm_S (w[21], w[20], selector); w[25] = __byte_perm_S (w[20], w[19], selector); w[24] = __byte_perm_S (w[19], w[18], selector); w[23] = __byte_perm_S (w[18], w[17], selector); w[22] = __byte_perm_S (w[17], w[16], selector); w[21] = __byte_perm_S (w[16], w[15], selector); w[20] = __byte_perm_S (w[15], w[14], selector); w[19] = __byte_perm_S (w[14], w[13], selector); w[18] = __byte_perm_S (w[13], w[12], selector); w[17] = __byte_perm_S (w[12], w[11], selector); w[16] = __byte_perm_S (w[11], w[10], selector); w[15] = __byte_perm_S (w[10], w[ 9], selector); w[14] = __byte_perm_S (w[ 9], w[ 8], selector); w[13] = __byte_perm_S (w[ 8], w[ 7], selector); w[12] = __byte_perm_S (w[ 7], w[ 6], selector); w[11] = __byte_perm_S (w[ 6], w[ 5], selector); w[10] = __byte_perm_S (w[ 5], w[ 4], selector); w[ 9] = __byte_perm_S (w[ 4], w[ 3], selector); w[ 8] = __byte_perm_S (w[ 3], w[ 2], selector); w[ 7] = __byte_perm_S (w[ 2], w[ 1], selector); w[ 6] = __byte_perm_S (w[ 1], w[ 0], selector); w[ 5] = __byte_perm_S (w[ 0], 0, selector); w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 6: w[63] = __byte_perm_S (w[57], w[56], selector); w[62] = __byte_perm_S (w[56], w[55], selector); w[61] = __byte_perm_S (w[55], w[54], selector); w[60] = __byte_perm_S (w[54], w[53], selector); w[59] = __byte_perm_S (w[53], w[52], selector); w[58] = __byte_perm_S (w[52], w[51], selector); w[57] = __byte_perm_S (w[51], w[50], selector); w[56] = __byte_perm_S (w[50], w[49], selector); w[55] = __byte_perm_S (w[49], w[48], selector); w[54] = __byte_perm_S (w[48], w[47], selector); w[53] = __byte_perm_S (w[47], w[46], selector); w[52] = __byte_perm_S (w[46], w[45], selector); w[51] = __byte_perm_S (w[45], w[44], selector); w[50] = __byte_perm_S (w[44], w[43], selector); w[49] = __byte_perm_S (w[43], w[42], selector); w[48] = __byte_perm_S (w[42], w[41], selector); w[47] = __byte_perm_S (w[41], w[40], selector); w[46] = __byte_perm_S (w[40], w[39], selector); w[45] = __byte_perm_S (w[39], w[38], selector); w[44] = __byte_perm_S (w[38], w[37], selector); w[43] = __byte_perm_S (w[37], w[36], selector); w[42] = __byte_perm_S (w[36], w[35], selector); w[41] = __byte_perm_S (w[35], w[34], selector); w[40] = __byte_perm_S (w[34], w[33], selector); w[39] = __byte_perm_S (w[33], w[32], selector); w[38] = __byte_perm_S (w[32], w[31], selector); w[37] = __byte_perm_S (w[31], w[30], selector); w[36] = __byte_perm_S (w[30], w[29], selector); w[35] = __byte_perm_S (w[29], w[28], selector); w[34] = __byte_perm_S (w[28], w[27], selector); w[33] = __byte_perm_S (w[27], w[26], selector); w[32] = __byte_perm_S (w[26], w[25], selector); w[31] = __byte_perm_S (w[25], w[24], selector); w[30] = __byte_perm_S (w[24], w[23], selector); w[29] = __byte_perm_S (w[23], w[22], selector); w[28] = __byte_perm_S (w[22], w[21], selector); w[27] = __byte_perm_S (w[21], w[20], selector); w[26] = __byte_perm_S (w[20], w[19], selector); w[25] = __byte_perm_S (w[19], w[18], selector); w[24] = __byte_perm_S (w[18], w[17], selector); w[23] = __byte_perm_S (w[17], w[16], selector); w[22] = __byte_perm_S (w[16], w[15], selector); w[21] = __byte_perm_S (w[15], w[14], selector); w[20] = __byte_perm_S (w[14], w[13], selector); w[19] = __byte_perm_S (w[13], w[12], selector); w[18] = __byte_perm_S (w[12], w[11], selector); w[17] = __byte_perm_S (w[11], w[10], selector); w[16] = __byte_perm_S (w[10], w[ 9], selector); w[15] = __byte_perm_S (w[ 9], w[ 8], selector); w[14] = __byte_perm_S (w[ 8], w[ 7], selector); w[13] = __byte_perm_S (w[ 7], w[ 6], selector); w[12] = __byte_perm_S (w[ 6], w[ 5], selector); w[11] = __byte_perm_S (w[ 5], w[ 4], selector); w[10] = __byte_perm_S (w[ 4], w[ 3], selector); w[ 9] = __byte_perm_S (w[ 3], w[ 2], selector); w[ 8] = __byte_perm_S (w[ 2], w[ 1], selector); w[ 7] = __byte_perm_S (w[ 1], w[ 0], selector); w[ 6] = __byte_perm_S (w[ 0], 0, selector); w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 7: w[63] = __byte_perm_S (w[56], w[55], selector); w[62] = __byte_perm_S (w[55], w[54], selector); w[61] = __byte_perm_S (w[54], w[53], selector); w[60] = __byte_perm_S (w[53], w[52], selector); w[59] = __byte_perm_S (w[52], w[51], selector); w[58] = __byte_perm_S (w[51], w[50], selector); w[57] = __byte_perm_S (w[50], w[49], selector); w[56] = __byte_perm_S (w[49], w[48], selector); w[55] = __byte_perm_S (w[48], w[47], selector); w[54] = __byte_perm_S (w[47], w[46], selector); w[53] = __byte_perm_S (w[46], w[45], selector); w[52] = __byte_perm_S (w[45], w[44], selector); w[51] = __byte_perm_S (w[44], w[43], selector); w[50] = __byte_perm_S (w[43], w[42], selector); w[49] = __byte_perm_S (w[42], w[41], selector); w[48] = __byte_perm_S (w[41], w[40], selector); w[47] = __byte_perm_S (w[40], w[39], selector); w[46] = __byte_perm_S (w[39], w[38], selector); w[45] = __byte_perm_S (w[38], w[37], selector); w[44] = __byte_perm_S (w[37], w[36], selector); w[43] = __byte_perm_S (w[36], w[35], selector); w[42] = __byte_perm_S (w[35], w[34], selector); w[41] = __byte_perm_S (w[34], w[33], selector); w[40] = __byte_perm_S (w[33], w[32], selector); w[39] = __byte_perm_S (w[32], w[31], selector); w[38] = __byte_perm_S (w[31], w[30], selector); w[37] = __byte_perm_S (w[30], w[29], selector); w[36] = __byte_perm_S (w[29], w[28], selector); w[35] = __byte_perm_S (w[28], w[27], selector); w[34] = __byte_perm_S (w[27], w[26], selector); w[33] = __byte_perm_S (w[26], w[25], selector); w[32] = __byte_perm_S (w[25], w[24], selector); w[31] = __byte_perm_S (w[24], w[23], selector); w[30] = __byte_perm_S (w[23], w[22], selector); w[29] = __byte_perm_S (w[22], w[21], selector); w[28] = __byte_perm_S (w[21], w[20], selector); w[27] = __byte_perm_S (w[20], w[19], selector); w[26] = __byte_perm_S (w[19], w[18], selector); w[25] = __byte_perm_S (w[18], w[17], selector); w[24] = __byte_perm_S (w[17], w[16], selector); w[23] = __byte_perm_S (w[16], w[15], selector); w[22] = __byte_perm_S (w[15], w[14], selector); w[21] = __byte_perm_S (w[14], w[13], selector); w[20] = __byte_perm_S (w[13], w[12], selector); w[19] = __byte_perm_S (w[12], w[11], selector); w[18] = __byte_perm_S (w[11], w[10], selector); w[17] = __byte_perm_S (w[10], w[ 9], selector); w[16] = __byte_perm_S (w[ 9], w[ 8], selector); w[15] = __byte_perm_S (w[ 8], w[ 7], selector); w[14] = __byte_perm_S (w[ 7], w[ 6], selector); w[13] = __byte_perm_S (w[ 6], w[ 5], selector); w[12] = __byte_perm_S (w[ 5], w[ 4], selector); w[11] = __byte_perm_S (w[ 4], w[ 3], selector); w[10] = __byte_perm_S (w[ 3], w[ 2], selector); w[ 9] = __byte_perm_S (w[ 2], w[ 1], selector); w[ 8] = __byte_perm_S (w[ 1], w[ 0], selector); w[ 7] = __byte_perm_S (w[ 0], 0, selector); w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 8: w[63] = __byte_perm_S (w[55], w[54], selector); w[62] = __byte_perm_S (w[54], w[53], selector); w[61] = __byte_perm_S (w[53], w[52], selector); w[60] = __byte_perm_S (w[52], w[51], selector); w[59] = __byte_perm_S (w[51], w[50], selector); w[58] = __byte_perm_S (w[50], w[49], selector); w[57] = __byte_perm_S (w[49], w[48], selector); w[56] = __byte_perm_S (w[48], w[47], selector); w[55] = __byte_perm_S (w[47], w[46], selector); w[54] = __byte_perm_S (w[46], w[45], selector); w[53] = __byte_perm_S (w[45], w[44], selector); w[52] = __byte_perm_S (w[44], w[43], selector); w[51] = __byte_perm_S (w[43], w[42], selector); w[50] = __byte_perm_S (w[42], w[41], selector); w[49] = __byte_perm_S (w[41], w[40], selector); w[48] = __byte_perm_S (w[40], w[39], selector); w[47] = __byte_perm_S (w[39], w[38], selector); w[46] = __byte_perm_S (w[38], w[37], selector); w[45] = __byte_perm_S (w[37], w[36], selector); w[44] = __byte_perm_S (w[36], w[35], selector); w[43] = __byte_perm_S (w[35], w[34], selector); w[42] = __byte_perm_S (w[34], w[33], selector); w[41] = __byte_perm_S (w[33], w[32], selector); w[40] = __byte_perm_S (w[32], w[31], selector); w[39] = __byte_perm_S (w[31], w[30], selector); w[38] = __byte_perm_S (w[30], w[29], selector); w[37] = __byte_perm_S (w[29], w[28], selector); w[36] = __byte_perm_S (w[28], w[27], selector); w[35] = __byte_perm_S (w[27], w[26], selector); w[34] = __byte_perm_S (w[26], w[25], selector); w[33] = __byte_perm_S (w[25], w[24], selector); w[32] = __byte_perm_S (w[24], w[23], selector); w[31] = __byte_perm_S (w[23], w[22], selector); w[30] = __byte_perm_S (w[22], w[21], selector); w[29] = __byte_perm_S (w[21], w[20], selector); w[28] = __byte_perm_S (w[20], w[19], selector); w[27] = __byte_perm_S (w[19], w[18], selector); w[26] = __byte_perm_S (w[18], w[17], selector); w[25] = __byte_perm_S (w[17], w[16], selector); w[24] = __byte_perm_S (w[16], w[15], selector); w[23] = __byte_perm_S (w[15], w[14], selector); w[22] = __byte_perm_S (w[14], w[13], selector); w[21] = __byte_perm_S (w[13], w[12], selector); w[20] = __byte_perm_S (w[12], w[11], selector); w[19] = __byte_perm_S (w[11], w[10], selector); w[18] = __byte_perm_S (w[10], w[ 9], selector); w[17] = __byte_perm_S (w[ 9], w[ 8], selector); w[16] = __byte_perm_S (w[ 8], w[ 7], selector); w[15] = __byte_perm_S (w[ 7], w[ 6], selector); w[14] = __byte_perm_S (w[ 6], w[ 5], selector); w[13] = __byte_perm_S (w[ 5], w[ 4], selector); w[12] = __byte_perm_S (w[ 4], w[ 3], selector); w[11] = __byte_perm_S (w[ 3], w[ 2], selector); w[10] = __byte_perm_S (w[ 2], w[ 1], selector); w[ 9] = __byte_perm_S (w[ 1], w[ 0], selector); w[ 8] = __byte_perm_S (w[ 0], 0, selector); w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 9: w[63] = __byte_perm_S (w[54], w[53], selector); w[62] = __byte_perm_S (w[53], w[52], selector); w[61] = __byte_perm_S (w[52], w[51], selector); w[60] = __byte_perm_S (w[51], w[50], selector); w[59] = __byte_perm_S (w[50], w[49], selector); w[58] = __byte_perm_S (w[49], w[48], selector); w[57] = __byte_perm_S (w[48], w[47], selector); w[56] = __byte_perm_S (w[47], w[46], selector); w[55] = __byte_perm_S (w[46], w[45], selector); w[54] = __byte_perm_S (w[45], w[44], selector); w[53] = __byte_perm_S (w[44], w[43], selector); w[52] = __byte_perm_S (w[43], w[42], selector); w[51] = __byte_perm_S (w[42], w[41], selector); w[50] = __byte_perm_S (w[41], w[40], selector); w[49] = __byte_perm_S (w[40], w[39], selector); w[48] = __byte_perm_S (w[39], w[38], selector); w[47] = __byte_perm_S (w[38], w[37], selector); w[46] = __byte_perm_S (w[37], w[36], selector); w[45] = __byte_perm_S (w[36], w[35], selector); w[44] = __byte_perm_S (w[35], w[34], selector); w[43] = __byte_perm_S (w[34], w[33], selector); w[42] = __byte_perm_S (w[33], w[32], selector); w[41] = __byte_perm_S (w[32], w[31], selector); w[40] = __byte_perm_S (w[31], w[30], selector); w[39] = __byte_perm_S (w[30], w[29], selector); w[38] = __byte_perm_S (w[29], w[28], selector); w[37] = __byte_perm_S (w[28], w[27], selector); w[36] = __byte_perm_S (w[27], w[26], selector); w[35] = __byte_perm_S (w[26], w[25], selector); w[34] = __byte_perm_S (w[25], w[24], selector); w[33] = __byte_perm_S (w[24], w[23], selector); w[32] = __byte_perm_S (w[23], w[22], selector); w[31] = __byte_perm_S (w[22], w[21], selector); w[30] = __byte_perm_S (w[21], w[20], selector); w[29] = __byte_perm_S (w[20], w[19], selector); w[28] = __byte_perm_S (w[19], w[18], selector); w[27] = __byte_perm_S (w[18], w[17], selector); w[26] = __byte_perm_S (w[17], w[16], selector); w[25] = __byte_perm_S (w[16], w[15], selector); w[24] = __byte_perm_S (w[15], w[14], selector); w[23] = __byte_perm_S (w[14], w[13], selector); w[22] = __byte_perm_S (w[13], w[12], selector); w[21] = __byte_perm_S (w[12], w[11], selector); w[20] = __byte_perm_S (w[11], w[10], selector); w[19] = __byte_perm_S (w[10], w[ 9], selector); w[18] = __byte_perm_S (w[ 9], w[ 8], selector); w[17] = __byte_perm_S (w[ 8], w[ 7], selector); w[16] = __byte_perm_S (w[ 7], w[ 6], selector); w[15] = __byte_perm_S (w[ 6], w[ 5], selector); w[14] = __byte_perm_S (w[ 5], w[ 4], selector); w[13] = __byte_perm_S (w[ 4], w[ 3], selector); w[12] = __byte_perm_S (w[ 3], w[ 2], selector); w[11] = __byte_perm_S (w[ 2], w[ 1], selector); w[10] = __byte_perm_S (w[ 1], w[ 0], selector); w[ 9] = __byte_perm_S (w[ 0], 0, selector); w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 10: w[63] = __byte_perm_S (w[53], w[52], selector); w[62] = __byte_perm_S (w[52], w[51], selector); w[61] = __byte_perm_S (w[51], w[50], selector); w[60] = __byte_perm_S (w[50], w[49], selector); w[59] = __byte_perm_S (w[49], w[48], selector); w[58] = __byte_perm_S (w[48], w[47], selector); w[57] = __byte_perm_S (w[47], w[46], selector); w[56] = __byte_perm_S (w[46], w[45], selector); w[55] = __byte_perm_S (w[45], w[44], selector); w[54] = __byte_perm_S (w[44], w[43], selector); w[53] = __byte_perm_S (w[43], w[42], selector); w[52] = __byte_perm_S (w[42], w[41], selector); w[51] = __byte_perm_S (w[41], w[40], selector); w[50] = __byte_perm_S (w[40], w[39], selector); w[49] = __byte_perm_S (w[39], w[38], selector); w[48] = __byte_perm_S (w[38], w[37], selector); w[47] = __byte_perm_S (w[37], w[36], selector); w[46] = __byte_perm_S (w[36], w[35], selector); w[45] = __byte_perm_S (w[35], w[34], selector); w[44] = __byte_perm_S (w[34], w[33], selector); w[43] = __byte_perm_S (w[33], w[32], selector); w[42] = __byte_perm_S (w[32], w[31], selector); w[41] = __byte_perm_S (w[31], w[30], selector); w[40] = __byte_perm_S (w[30], w[29], selector); w[39] = __byte_perm_S (w[29], w[28], selector); w[38] = __byte_perm_S (w[28], w[27], selector); w[37] = __byte_perm_S (w[27], w[26], selector); w[36] = __byte_perm_S (w[26], w[25], selector); w[35] = __byte_perm_S (w[25], w[24], selector); w[34] = __byte_perm_S (w[24], w[23], selector); w[33] = __byte_perm_S (w[23], w[22], selector); w[32] = __byte_perm_S (w[22], w[21], selector); w[31] = __byte_perm_S (w[21], w[20], selector); w[30] = __byte_perm_S (w[20], w[19], selector); w[29] = __byte_perm_S (w[19], w[18], selector); w[28] = __byte_perm_S (w[18], w[17], selector); w[27] = __byte_perm_S (w[17], w[16], selector); w[26] = __byte_perm_S (w[16], w[15], selector); w[25] = __byte_perm_S (w[15], w[14], selector); w[24] = __byte_perm_S (w[14], w[13], selector); w[23] = __byte_perm_S (w[13], w[12], selector); w[22] = __byte_perm_S (w[12], w[11], selector); w[21] = __byte_perm_S (w[11], w[10], selector); w[20] = __byte_perm_S (w[10], w[ 9], selector); w[19] = __byte_perm_S (w[ 9], w[ 8], selector); w[18] = __byte_perm_S (w[ 8], w[ 7], selector); w[17] = __byte_perm_S (w[ 7], w[ 6], selector); w[16] = __byte_perm_S (w[ 6], w[ 5], selector); w[15] = __byte_perm_S (w[ 5], w[ 4], selector); w[14] = __byte_perm_S (w[ 4], w[ 3], selector); w[13] = __byte_perm_S (w[ 3], w[ 2], selector); w[12] = __byte_perm_S (w[ 2], w[ 1], selector); w[11] = __byte_perm_S (w[ 1], w[ 0], selector); w[10] = __byte_perm_S (w[ 0], 0, selector); w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 11: w[63] = __byte_perm_S (w[52], w[51], selector); w[62] = __byte_perm_S (w[51], w[50], selector); w[61] = __byte_perm_S (w[50], w[49], selector); w[60] = __byte_perm_S (w[49], w[48], selector); w[59] = __byte_perm_S (w[48], w[47], selector); w[58] = __byte_perm_S (w[47], w[46], selector); w[57] = __byte_perm_S (w[46], w[45], selector); w[56] = __byte_perm_S (w[45], w[44], selector); w[55] = __byte_perm_S (w[44], w[43], selector); w[54] = __byte_perm_S (w[43], w[42], selector); w[53] = __byte_perm_S (w[42], w[41], selector); w[52] = __byte_perm_S (w[41], w[40], selector); w[51] = __byte_perm_S (w[40], w[39], selector); w[50] = __byte_perm_S (w[39], w[38], selector); w[49] = __byte_perm_S (w[38], w[37], selector); w[48] = __byte_perm_S (w[37], w[36], selector); w[47] = __byte_perm_S (w[36], w[35], selector); w[46] = __byte_perm_S (w[35], w[34], selector); w[45] = __byte_perm_S (w[34], w[33], selector); w[44] = __byte_perm_S (w[33], w[32], selector); w[43] = __byte_perm_S (w[32], w[31], selector); w[42] = __byte_perm_S (w[31], w[30], selector); w[41] = __byte_perm_S (w[30], w[29], selector); w[40] = __byte_perm_S (w[29], w[28], selector); w[39] = __byte_perm_S (w[28], w[27], selector); w[38] = __byte_perm_S (w[27], w[26], selector); w[37] = __byte_perm_S (w[26], w[25], selector); w[36] = __byte_perm_S (w[25], w[24], selector); w[35] = __byte_perm_S (w[24], w[23], selector); w[34] = __byte_perm_S (w[23], w[22], selector); w[33] = __byte_perm_S (w[22], w[21], selector); w[32] = __byte_perm_S (w[21], w[20], selector); w[31] = __byte_perm_S (w[20], w[19], selector); w[30] = __byte_perm_S (w[19], w[18], selector); w[29] = __byte_perm_S (w[18], w[17], selector); w[28] = __byte_perm_S (w[17], w[16], selector); w[27] = __byte_perm_S (w[16], w[15], selector); w[26] = __byte_perm_S (w[15], w[14], selector); w[25] = __byte_perm_S (w[14], w[13], selector); w[24] = __byte_perm_S (w[13], w[12], selector); w[23] = __byte_perm_S (w[12], w[11], selector); w[22] = __byte_perm_S (w[11], w[10], selector); w[21] = __byte_perm_S (w[10], w[ 9], selector); w[20] = __byte_perm_S (w[ 9], w[ 8], selector); w[19] = __byte_perm_S (w[ 8], w[ 7], selector); w[18] = __byte_perm_S (w[ 7], w[ 6], selector); w[17] = __byte_perm_S (w[ 6], w[ 5], selector); w[16] = __byte_perm_S (w[ 5], w[ 4], selector); w[15] = __byte_perm_S (w[ 4], w[ 3], selector); w[14] = __byte_perm_S (w[ 3], w[ 2], selector); w[13] = __byte_perm_S (w[ 2], w[ 1], selector); w[12] = __byte_perm_S (w[ 1], w[ 0], selector); w[11] = __byte_perm_S (w[ 0], 0, selector); w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 12: w[63] = __byte_perm_S (w[51], w[50], selector); w[62] = __byte_perm_S (w[50], w[49], selector); w[61] = __byte_perm_S (w[49], w[48], selector); w[60] = __byte_perm_S (w[48], w[47], selector); w[59] = __byte_perm_S (w[47], w[46], selector); w[58] = __byte_perm_S (w[46], w[45], selector); w[57] = __byte_perm_S (w[45], w[44], selector); w[56] = __byte_perm_S (w[44], w[43], selector); w[55] = __byte_perm_S (w[43], w[42], selector); w[54] = __byte_perm_S (w[42], w[41], selector); w[53] = __byte_perm_S (w[41], w[40], selector); w[52] = __byte_perm_S (w[40], w[39], selector); w[51] = __byte_perm_S (w[39], w[38], selector); w[50] = __byte_perm_S (w[38], w[37], selector); w[49] = __byte_perm_S (w[37], w[36], selector); w[48] = __byte_perm_S (w[36], w[35], selector); w[47] = __byte_perm_S (w[35], w[34], selector); w[46] = __byte_perm_S (w[34], w[33], selector); w[45] = __byte_perm_S (w[33], w[32], selector); w[44] = __byte_perm_S (w[32], w[31], selector); w[43] = __byte_perm_S (w[31], w[30], selector); w[42] = __byte_perm_S (w[30], w[29], selector); w[41] = __byte_perm_S (w[29], w[28], selector); w[40] = __byte_perm_S (w[28], w[27], selector); w[39] = __byte_perm_S (w[27], w[26], selector); w[38] = __byte_perm_S (w[26], w[25], selector); w[37] = __byte_perm_S (w[25], w[24], selector); w[36] = __byte_perm_S (w[24], w[23], selector); w[35] = __byte_perm_S (w[23], w[22], selector); w[34] = __byte_perm_S (w[22], w[21], selector); w[33] = __byte_perm_S (w[21], w[20], selector); w[32] = __byte_perm_S (w[20], w[19], selector); w[31] = __byte_perm_S (w[19], w[18], selector); w[30] = __byte_perm_S (w[18], w[17], selector); w[29] = __byte_perm_S (w[17], w[16], selector); w[28] = __byte_perm_S (w[16], w[15], selector); w[27] = __byte_perm_S (w[15], w[14], selector); w[26] = __byte_perm_S (w[14], w[13], selector); w[25] = __byte_perm_S (w[13], w[12], selector); w[24] = __byte_perm_S (w[12], w[11], selector); w[23] = __byte_perm_S (w[11], w[10], selector); w[22] = __byte_perm_S (w[10], w[ 9], selector); w[21] = __byte_perm_S (w[ 9], w[ 8], selector); w[20] = __byte_perm_S (w[ 8], w[ 7], selector); w[19] = __byte_perm_S (w[ 7], w[ 6], selector); w[18] = __byte_perm_S (w[ 6], w[ 5], selector); w[17] = __byte_perm_S (w[ 5], w[ 4], selector); w[16] = __byte_perm_S (w[ 4], w[ 3], selector); w[15] = __byte_perm_S (w[ 3], w[ 2], selector); w[14] = __byte_perm_S (w[ 2], w[ 1], selector); w[13] = __byte_perm_S (w[ 1], w[ 0], selector); w[12] = __byte_perm_S (w[ 0], 0, selector); w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 13: w[63] = __byte_perm_S (w[50], w[49], selector); w[62] = __byte_perm_S (w[49], w[48], selector); w[61] = __byte_perm_S (w[48], w[47], selector); w[60] = __byte_perm_S (w[47], w[46], selector); w[59] = __byte_perm_S (w[46], w[45], selector); w[58] = __byte_perm_S (w[45], w[44], selector); w[57] = __byte_perm_S (w[44], w[43], selector); w[56] = __byte_perm_S (w[43], w[42], selector); w[55] = __byte_perm_S (w[42], w[41], selector); w[54] = __byte_perm_S (w[41], w[40], selector); w[53] = __byte_perm_S (w[40], w[39], selector); w[52] = __byte_perm_S (w[39], w[38], selector); w[51] = __byte_perm_S (w[38], w[37], selector); w[50] = __byte_perm_S (w[37], w[36], selector); w[49] = __byte_perm_S (w[36], w[35], selector); w[48] = __byte_perm_S (w[35], w[34], selector); w[47] = __byte_perm_S (w[34], w[33], selector); w[46] = __byte_perm_S (w[33], w[32], selector); w[45] = __byte_perm_S (w[32], w[31], selector); w[44] = __byte_perm_S (w[31], w[30], selector); w[43] = __byte_perm_S (w[30], w[29], selector); w[42] = __byte_perm_S (w[29], w[28], selector); w[41] = __byte_perm_S (w[28], w[27], selector); w[40] = __byte_perm_S (w[27], w[26], selector); w[39] = __byte_perm_S (w[26], w[25], selector); w[38] = __byte_perm_S (w[25], w[24], selector); w[37] = __byte_perm_S (w[24], w[23], selector); w[36] = __byte_perm_S (w[23], w[22], selector); w[35] = __byte_perm_S (w[22], w[21], selector); w[34] = __byte_perm_S (w[21], w[20], selector); w[33] = __byte_perm_S (w[20], w[19], selector); w[32] = __byte_perm_S (w[19], w[18], selector); w[31] = __byte_perm_S (w[18], w[17], selector); w[30] = __byte_perm_S (w[17], w[16], selector); w[29] = __byte_perm_S (w[16], w[15], selector); w[28] = __byte_perm_S (w[15], w[14], selector); w[27] = __byte_perm_S (w[14], w[13], selector); w[26] = __byte_perm_S (w[13], w[12], selector); w[25] = __byte_perm_S (w[12], w[11], selector); w[24] = __byte_perm_S (w[11], w[10], selector); w[23] = __byte_perm_S (w[10], w[ 9], selector); w[22] = __byte_perm_S (w[ 9], w[ 8], selector); w[21] = __byte_perm_S (w[ 8], w[ 7], selector); w[20] = __byte_perm_S (w[ 7], w[ 6], selector); w[19] = __byte_perm_S (w[ 6], w[ 5], selector); w[18] = __byte_perm_S (w[ 5], w[ 4], selector); w[17] = __byte_perm_S (w[ 4], w[ 3], selector); w[16] = __byte_perm_S (w[ 3], w[ 2], selector); w[15] = __byte_perm_S (w[ 2], w[ 1], selector); w[14] = __byte_perm_S (w[ 1], w[ 0], selector); w[13] = __byte_perm_S (w[ 0], 0, selector); w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 14: w[63] = __byte_perm_S (w[49], w[48], selector); w[62] = __byte_perm_S (w[48], w[47], selector); w[61] = __byte_perm_S (w[47], w[46], selector); w[60] = __byte_perm_S (w[46], w[45], selector); w[59] = __byte_perm_S (w[45], w[44], selector); w[58] = __byte_perm_S (w[44], w[43], selector); w[57] = __byte_perm_S (w[43], w[42], selector); w[56] = __byte_perm_S (w[42], w[41], selector); w[55] = __byte_perm_S (w[41], w[40], selector); w[54] = __byte_perm_S (w[40], w[39], selector); w[53] = __byte_perm_S (w[39], w[38], selector); w[52] = __byte_perm_S (w[38], w[37], selector); w[51] = __byte_perm_S (w[37], w[36], selector); w[50] = __byte_perm_S (w[36], w[35], selector); w[49] = __byte_perm_S (w[35], w[34], selector); w[48] = __byte_perm_S (w[34], w[33], selector); w[47] = __byte_perm_S (w[33], w[32], selector); w[46] = __byte_perm_S (w[32], w[31], selector); w[45] = __byte_perm_S (w[31], w[30], selector); w[44] = __byte_perm_S (w[30], w[29], selector); w[43] = __byte_perm_S (w[29], w[28], selector); w[42] = __byte_perm_S (w[28], w[27], selector); w[41] = __byte_perm_S (w[27], w[26], selector); w[40] = __byte_perm_S (w[26], w[25], selector); w[39] = __byte_perm_S (w[25], w[24], selector); w[38] = __byte_perm_S (w[24], w[23], selector); w[37] = __byte_perm_S (w[23], w[22], selector); w[36] = __byte_perm_S (w[22], w[21], selector); w[35] = __byte_perm_S (w[21], w[20], selector); w[34] = __byte_perm_S (w[20], w[19], selector); w[33] = __byte_perm_S (w[19], w[18], selector); w[32] = __byte_perm_S (w[18], w[17], selector); w[31] = __byte_perm_S (w[17], w[16], selector); w[30] = __byte_perm_S (w[16], w[15], selector); w[29] = __byte_perm_S (w[15], w[14], selector); w[28] = __byte_perm_S (w[14], w[13], selector); w[27] = __byte_perm_S (w[13], w[12], selector); w[26] = __byte_perm_S (w[12], w[11], selector); w[25] = __byte_perm_S (w[11], w[10], selector); w[24] = __byte_perm_S (w[10], w[ 9], selector); w[23] = __byte_perm_S (w[ 9], w[ 8], selector); w[22] = __byte_perm_S (w[ 8], w[ 7], selector); w[21] = __byte_perm_S (w[ 7], w[ 6], selector); w[20] = __byte_perm_S (w[ 6], w[ 5], selector); w[19] = __byte_perm_S (w[ 5], w[ 4], selector); w[18] = __byte_perm_S (w[ 4], w[ 3], selector); w[17] = __byte_perm_S (w[ 3], w[ 2], selector); w[16] = __byte_perm_S (w[ 2], w[ 1], selector); w[15] = __byte_perm_S (w[ 1], w[ 0], selector); w[14] = __byte_perm_S (w[ 0], 0, selector); w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 15: w[63] = __byte_perm_S (w[48], w[47], selector); w[62] = __byte_perm_S (w[47], w[46], selector); w[61] = __byte_perm_S (w[46], w[45], selector); w[60] = __byte_perm_S (w[45], w[44], selector); w[59] = __byte_perm_S (w[44], w[43], selector); w[58] = __byte_perm_S (w[43], w[42], selector); w[57] = __byte_perm_S (w[42], w[41], selector); w[56] = __byte_perm_S (w[41], w[40], selector); w[55] = __byte_perm_S (w[40], w[39], selector); w[54] = __byte_perm_S (w[39], w[38], selector); w[53] = __byte_perm_S (w[38], w[37], selector); w[52] = __byte_perm_S (w[37], w[36], selector); w[51] = __byte_perm_S (w[36], w[35], selector); w[50] = __byte_perm_S (w[35], w[34], selector); w[49] = __byte_perm_S (w[34], w[33], selector); w[48] = __byte_perm_S (w[33], w[32], selector); w[47] = __byte_perm_S (w[32], w[31], selector); w[46] = __byte_perm_S (w[31], w[30], selector); w[45] = __byte_perm_S (w[30], w[29], selector); w[44] = __byte_perm_S (w[29], w[28], selector); w[43] = __byte_perm_S (w[28], w[27], selector); w[42] = __byte_perm_S (w[27], w[26], selector); w[41] = __byte_perm_S (w[26], w[25], selector); w[40] = __byte_perm_S (w[25], w[24], selector); w[39] = __byte_perm_S (w[24], w[23], selector); w[38] = __byte_perm_S (w[23], w[22], selector); w[37] = __byte_perm_S (w[22], w[21], selector); w[36] = __byte_perm_S (w[21], w[20], selector); w[35] = __byte_perm_S (w[20], w[19], selector); w[34] = __byte_perm_S (w[19], w[18], selector); w[33] = __byte_perm_S (w[18], w[17], selector); w[32] = __byte_perm_S (w[17], w[16], selector); w[31] = __byte_perm_S (w[16], w[15], selector); w[30] = __byte_perm_S (w[15], w[14], selector); w[29] = __byte_perm_S (w[14], w[13], selector); w[28] = __byte_perm_S (w[13], w[12], selector); w[27] = __byte_perm_S (w[12], w[11], selector); w[26] = __byte_perm_S (w[11], w[10], selector); w[25] = __byte_perm_S (w[10], w[ 9], selector); w[24] = __byte_perm_S (w[ 9], w[ 8], selector); w[23] = __byte_perm_S (w[ 8], w[ 7], selector); w[22] = __byte_perm_S (w[ 7], w[ 6], selector); w[21] = __byte_perm_S (w[ 6], w[ 5], selector); w[20] = __byte_perm_S (w[ 5], w[ 4], selector); w[19] = __byte_perm_S (w[ 4], w[ 3], selector); w[18] = __byte_perm_S (w[ 3], w[ 2], selector); w[17] = __byte_perm_S (w[ 2], w[ 1], selector); w[16] = __byte_perm_S (w[ 1], w[ 0], selector); w[15] = __byte_perm_S (w[ 0], 0, selector); w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 16: w[63] = __byte_perm_S (w[47], w[46], selector); w[62] = __byte_perm_S (w[46], w[45], selector); w[61] = __byte_perm_S (w[45], w[44], selector); w[60] = __byte_perm_S (w[44], w[43], selector); w[59] = __byte_perm_S (w[43], w[42], selector); w[58] = __byte_perm_S (w[42], w[41], selector); w[57] = __byte_perm_S (w[41], w[40], selector); w[56] = __byte_perm_S (w[40], w[39], selector); w[55] = __byte_perm_S (w[39], w[38], selector); w[54] = __byte_perm_S (w[38], w[37], selector); w[53] = __byte_perm_S (w[37], w[36], selector); w[52] = __byte_perm_S (w[36], w[35], selector); w[51] = __byte_perm_S (w[35], w[34], selector); w[50] = __byte_perm_S (w[34], w[33], selector); w[49] = __byte_perm_S (w[33], w[32], selector); w[48] = __byte_perm_S (w[32], w[31], selector); w[47] = __byte_perm_S (w[31], w[30], selector); w[46] = __byte_perm_S (w[30], w[29], selector); w[45] = __byte_perm_S (w[29], w[28], selector); w[44] = __byte_perm_S (w[28], w[27], selector); w[43] = __byte_perm_S (w[27], w[26], selector); w[42] = __byte_perm_S (w[26], w[25], selector); w[41] = __byte_perm_S (w[25], w[24], selector); w[40] = __byte_perm_S (w[24], w[23], selector); w[39] = __byte_perm_S (w[23], w[22], selector); w[38] = __byte_perm_S (w[22], w[21], selector); w[37] = __byte_perm_S (w[21], w[20], selector); w[36] = __byte_perm_S (w[20], w[19], selector); w[35] = __byte_perm_S (w[19], w[18], selector); w[34] = __byte_perm_S (w[18], w[17], selector); w[33] = __byte_perm_S (w[17], w[16], selector); w[32] = __byte_perm_S (w[16], w[15], selector); w[31] = __byte_perm_S (w[15], w[14], selector); w[30] = __byte_perm_S (w[14], w[13], selector); w[29] = __byte_perm_S (w[13], w[12], selector); w[28] = __byte_perm_S (w[12], w[11], selector); w[27] = __byte_perm_S (w[11], w[10], selector); w[26] = __byte_perm_S (w[10], w[ 9], selector); w[25] = __byte_perm_S (w[ 9], w[ 8], selector); w[24] = __byte_perm_S (w[ 8], w[ 7], selector); w[23] = __byte_perm_S (w[ 7], w[ 6], selector); w[22] = __byte_perm_S (w[ 6], w[ 5], selector); w[21] = __byte_perm_S (w[ 5], w[ 4], selector); w[20] = __byte_perm_S (w[ 4], w[ 3], selector); w[19] = __byte_perm_S (w[ 3], w[ 2], selector); w[18] = __byte_perm_S (w[ 2], w[ 1], selector); w[17] = __byte_perm_S (w[ 1], w[ 0], selector); w[16] = __byte_perm_S (w[ 0], 0, selector); w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 17: w[63] = __byte_perm_S (w[46], w[45], selector); w[62] = __byte_perm_S (w[45], w[44], selector); w[61] = __byte_perm_S (w[44], w[43], selector); w[60] = __byte_perm_S (w[43], w[42], selector); w[59] = __byte_perm_S (w[42], w[41], selector); w[58] = __byte_perm_S (w[41], w[40], selector); w[57] = __byte_perm_S (w[40], w[39], selector); w[56] = __byte_perm_S (w[39], w[38], selector); w[55] = __byte_perm_S (w[38], w[37], selector); w[54] = __byte_perm_S (w[37], w[36], selector); w[53] = __byte_perm_S (w[36], w[35], selector); w[52] = __byte_perm_S (w[35], w[34], selector); w[51] = __byte_perm_S (w[34], w[33], selector); w[50] = __byte_perm_S (w[33], w[32], selector); w[49] = __byte_perm_S (w[32], w[31], selector); w[48] = __byte_perm_S (w[31], w[30], selector); w[47] = __byte_perm_S (w[30], w[29], selector); w[46] = __byte_perm_S (w[29], w[28], selector); w[45] = __byte_perm_S (w[28], w[27], selector); w[44] = __byte_perm_S (w[27], w[26], selector); w[43] = __byte_perm_S (w[26], w[25], selector); w[42] = __byte_perm_S (w[25], w[24], selector); w[41] = __byte_perm_S (w[24], w[23], selector); w[40] = __byte_perm_S (w[23], w[22], selector); w[39] = __byte_perm_S (w[22], w[21], selector); w[38] = __byte_perm_S (w[21], w[20], selector); w[37] = __byte_perm_S (w[20], w[19], selector); w[36] = __byte_perm_S (w[19], w[18], selector); w[35] = __byte_perm_S (w[18], w[17], selector); w[34] = __byte_perm_S (w[17], w[16], selector); w[33] = __byte_perm_S (w[16], w[15], selector); w[32] = __byte_perm_S (w[15], w[14], selector); w[31] = __byte_perm_S (w[14], w[13], selector); w[30] = __byte_perm_S (w[13], w[12], selector); w[29] = __byte_perm_S (w[12], w[11], selector); w[28] = __byte_perm_S (w[11], w[10], selector); w[27] = __byte_perm_S (w[10], w[ 9], selector); w[26] = __byte_perm_S (w[ 9], w[ 8], selector); w[25] = __byte_perm_S (w[ 8], w[ 7], selector); w[24] = __byte_perm_S (w[ 7], w[ 6], selector); w[23] = __byte_perm_S (w[ 6], w[ 5], selector); w[22] = __byte_perm_S (w[ 5], w[ 4], selector); w[21] = __byte_perm_S (w[ 4], w[ 3], selector); w[20] = __byte_perm_S (w[ 3], w[ 2], selector); w[19] = __byte_perm_S (w[ 2], w[ 1], selector); w[18] = __byte_perm_S (w[ 1], w[ 0], selector); w[17] = __byte_perm_S (w[ 0], 0, selector); w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 18: w[63] = __byte_perm_S (w[45], w[44], selector); w[62] = __byte_perm_S (w[44], w[43], selector); w[61] = __byte_perm_S (w[43], w[42], selector); w[60] = __byte_perm_S (w[42], w[41], selector); w[59] = __byte_perm_S (w[41], w[40], selector); w[58] = __byte_perm_S (w[40], w[39], selector); w[57] = __byte_perm_S (w[39], w[38], selector); w[56] = __byte_perm_S (w[38], w[37], selector); w[55] = __byte_perm_S (w[37], w[36], selector); w[54] = __byte_perm_S (w[36], w[35], selector); w[53] = __byte_perm_S (w[35], w[34], selector); w[52] = __byte_perm_S (w[34], w[33], selector); w[51] = __byte_perm_S (w[33], w[32], selector); w[50] = __byte_perm_S (w[32], w[31], selector); w[49] = __byte_perm_S (w[31], w[30], selector); w[48] = __byte_perm_S (w[30], w[29], selector); w[47] = __byte_perm_S (w[29], w[28], selector); w[46] = __byte_perm_S (w[28], w[27], selector); w[45] = __byte_perm_S (w[27], w[26], selector); w[44] = __byte_perm_S (w[26], w[25], selector); w[43] = __byte_perm_S (w[25], w[24], selector); w[42] = __byte_perm_S (w[24], w[23], selector); w[41] = __byte_perm_S (w[23], w[22], selector); w[40] = __byte_perm_S (w[22], w[21], selector); w[39] = __byte_perm_S (w[21], w[20], selector); w[38] = __byte_perm_S (w[20], w[19], selector); w[37] = __byte_perm_S (w[19], w[18], selector); w[36] = __byte_perm_S (w[18], w[17], selector); w[35] = __byte_perm_S (w[17], w[16], selector); w[34] = __byte_perm_S (w[16], w[15], selector); w[33] = __byte_perm_S (w[15], w[14], selector); w[32] = __byte_perm_S (w[14], w[13], selector); w[31] = __byte_perm_S (w[13], w[12], selector); w[30] = __byte_perm_S (w[12], w[11], selector); w[29] = __byte_perm_S (w[11], w[10], selector); w[28] = __byte_perm_S (w[10], w[ 9], selector); w[27] = __byte_perm_S (w[ 9], w[ 8], selector); w[26] = __byte_perm_S (w[ 8], w[ 7], selector); w[25] = __byte_perm_S (w[ 7], w[ 6], selector); w[24] = __byte_perm_S (w[ 6], w[ 5], selector); w[23] = __byte_perm_S (w[ 5], w[ 4], selector); w[22] = __byte_perm_S (w[ 4], w[ 3], selector); w[21] = __byte_perm_S (w[ 3], w[ 2], selector); w[20] = __byte_perm_S (w[ 2], w[ 1], selector); w[19] = __byte_perm_S (w[ 1], w[ 0], selector); w[18] = __byte_perm_S (w[ 0], 0, selector); w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 19: w[63] = __byte_perm_S (w[44], w[43], selector); w[62] = __byte_perm_S (w[43], w[42], selector); w[61] = __byte_perm_S (w[42], w[41], selector); w[60] = __byte_perm_S (w[41], w[40], selector); w[59] = __byte_perm_S (w[40], w[39], selector); w[58] = __byte_perm_S (w[39], w[38], selector); w[57] = __byte_perm_S (w[38], w[37], selector); w[56] = __byte_perm_S (w[37], w[36], selector); w[55] = __byte_perm_S (w[36], w[35], selector); w[54] = __byte_perm_S (w[35], w[34], selector); w[53] = __byte_perm_S (w[34], w[33], selector); w[52] = __byte_perm_S (w[33], w[32], selector); w[51] = __byte_perm_S (w[32], w[31], selector); w[50] = __byte_perm_S (w[31], w[30], selector); w[49] = __byte_perm_S (w[30], w[29], selector); w[48] = __byte_perm_S (w[29], w[28], selector); w[47] = __byte_perm_S (w[28], w[27], selector); w[46] = __byte_perm_S (w[27], w[26], selector); w[45] = __byte_perm_S (w[26], w[25], selector); w[44] = __byte_perm_S (w[25], w[24], selector); w[43] = __byte_perm_S (w[24], w[23], selector); w[42] = __byte_perm_S (w[23], w[22], selector); w[41] = __byte_perm_S (w[22], w[21], selector); w[40] = __byte_perm_S (w[21], w[20], selector); w[39] = __byte_perm_S (w[20], w[19], selector); w[38] = __byte_perm_S (w[19], w[18], selector); w[37] = __byte_perm_S (w[18], w[17], selector); w[36] = __byte_perm_S (w[17], w[16], selector); w[35] = __byte_perm_S (w[16], w[15], selector); w[34] = __byte_perm_S (w[15], w[14], selector); w[33] = __byte_perm_S (w[14], w[13], selector); w[32] = __byte_perm_S (w[13], w[12], selector); w[31] = __byte_perm_S (w[12], w[11], selector); w[30] = __byte_perm_S (w[11], w[10], selector); w[29] = __byte_perm_S (w[10], w[ 9], selector); w[28] = __byte_perm_S (w[ 9], w[ 8], selector); w[27] = __byte_perm_S (w[ 8], w[ 7], selector); w[26] = __byte_perm_S (w[ 7], w[ 6], selector); w[25] = __byte_perm_S (w[ 6], w[ 5], selector); w[24] = __byte_perm_S (w[ 5], w[ 4], selector); w[23] = __byte_perm_S (w[ 4], w[ 3], selector); w[22] = __byte_perm_S (w[ 3], w[ 2], selector); w[21] = __byte_perm_S (w[ 2], w[ 1], selector); w[20] = __byte_perm_S (w[ 1], w[ 0], selector); w[19] = __byte_perm_S (w[ 0], 0, selector); w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 20: w[63] = __byte_perm_S (w[43], w[42], selector); w[62] = __byte_perm_S (w[42], w[41], selector); w[61] = __byte_perm_S (w[41], w[40], selector); w[60] = __byte_perm_S (w[40], w[39], selector); w[59] = __byte_perm_S (w[39], w[38], selector); w[58] = __byte_perm_S (w[38], w[37], selector); w[57] = __byte_perm_S (w[37], w[36], selector); w[56] = __byte_perm_S (w[36], w[35], selector); w[55] = __byte_perm_S (w[35], w[34], selector); w[54] = __byte_perm_S (w[34], w[33], selector); w[53] = __byte_perm_S (w[33], w[32], selector); w[52] = __byte_perm_S (w[32], w[31], selector); w[51] = __byte_perm_S (w[31], w[30], selector); w[50] = __byte_perm_S (w[30], w[29], selector); w[49] = __byte_perm_S (w[29], w[28], selector); w[48] = __byte_perm_S (w[28], w[27], selector); w[47] = __byte_perm_S (w[27], w[26], selector); w[46] = __byte_perm_S (w[26], w[25], selector); w[45] = __byte_perm_S (w[25], w[24], selector); w[44] = __byte_perm_S (w[24], w[23], selector); w[43] = __byte_perm_S (w[23], w[22], selector); w[42] = __byte_perm_S (w[22], w[21], selector); w[41] = __byte_perm_S (w[21], w[20], selector); w[40] = __byte_perm_S (w[20], w[19], selector); w[39] = __byte_perm_S (w[19], w[18], selector); w[38] = __byte_perm_S (w[18], w[17], selector); w[37] = __byte_perm_S (w[17], w[16], selector); w[36] = __byte_perm_S (w[16], w[15], selector); w[35] = __byte_perm_S (w[15], w[14], selector); w[34] = __byte_perm_S (w[14], w[13], selector); w[33] = __byte_perm_S (w[13], w[12], selector); w[32] = __byte_perm_S (w[12], w[11], selector); w[31] = __byte_perm_S (w[11], w[10], selector); w[30] = __byte_perm_S (w[10], w[ 9], selector); w[29] = __byte_perm_S (w[ 9], w[ 8], selector); w[28] = __byte_perm_S (w[ 8], w[ 7], selector); w[27] = __byte_perm_S (w[ 7], w[ 6], selector); w[26] = __byte_perm_S (w[ 6], w[ 5], selector); w[25] = __byte_perm_S (w[ 5], w[ 4], selector); w[24] = __byte_perm_S (w[ 4], w[ 3], selector); w[23] = __byte_perm_S (w[ 3], w[ 2], selector); w[22] = __byte_perm_S (w[ 2], w[ 1], selector); w[21] = __byte_perm_S (w[ 1], w[ 0], selector); w[20] = __byte_perm_S (w[ 0], 0, selector); w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 21: w[63] = __byte_perm_S (w[42], w[41], selector); w[62] = __byte_perm_S (w[41], w[40], selector); w[61] = __byte_perm_S (w[40], w[39], selector); w[60] = __byte_perm_S (w[39], w[38], selector); w[59] = __byte_perm_S (w[38], w[37], selector); w[58] = __byte_perm_S (w[37], w[36], selector); w[57] = __byte_perm_S (w[36], w[35], selector); w[56] = __byte_perm_S (w[35], w[34], selector); w[55] = __byte_perm_S (w[34], w[33], selector); w[54] = __byte_perm_S (w[33], w[32], selector); w[53] = __byte_perm_S (w[32], w[31], selector); w[52] = __byte_perm_S (w[31], w[30], selector); w[51] = __byte_perm_S (w[30], w[29], selector); w[50] = __byte_perm_S (w[29], w[28], selector); w[49] = __byte_perm_S (w[28], w[27], selector); w[48] = __byte_perm_S (w[27], w[26], selector); w[47] = __byte_perm_S (w[26], w[25], selector); w[46] = __byte_perm_S (w[25], w[24], selector); w[45] = __byte_perm_S (w[24], w[23], selector); w[44] = __byte_perm_S (w[23], w[22], selector); w[43] = __byte_perm_S (w[22], w[21], selector); w[42] = __byte_perm_S (w[21], w[20], selector); w[41] = __byte_perm_S (w[20], w[19], selector); w[40] = __byte_perm_S (w[19], w[18], selector); w[39] = __byte_perm_S (w[18], w[17], selector); w[38] = __byte_perm_S (w[17], w[16], selector); w[37] = __byte_perm_S (w[16], w[15], selector); w[36] = __byte_perm_S (w[15], w[14], selector); w[35] = __byte_perm_S (w[14], w[13], selector); w[34] = __byte_perm_S (w[13], w[12], selector); w[33] = __byte_perm_S (w[12], w[11], selector); w[32] = __byte_perm_S (w[11], w[10], selector); w[31] = __byte_perm_S (w[10], w[ 9], selector); w[30] = __byte_perm_S (w[ 9], w[ 8], selector); w[29] = __byte_perm_S (w[ 8], w[ 7], selector); w[28] = __byte_perm_S (w[ 7], w[ 6], selector); w[27] = __byte_perm_S (w[ 6], w[ 5], selector); w[26] = __byte_perm_S (w[ 5], w[ 4], selector); w[25] = __byte_perm_S (w[ 4], w[ 3], selector); w[24] = __byte_perm_S (w[ 3], w[ 2], selector); w[23] = __byte_perm_S (w[ 2], w[ 1], selector); w[22] = __byte_perm_S (w[ 1], w[ 0], selector); w[21] = __byte_perm_S (w[ 0], 0, selector); w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 22: w[63] = __byte_perm_S (w[41], w[40], selector); w[62] = __byte_perm_S (w[40], w[39], selector); w[61] = __byte_perm_S (w[39], w[38], selector); w[60] = __byte_perm_S (w[38], w[37], selector); w[59] = __byte_perm_S (w[37], w[36], selector); w[58] = __byte_perm_S (w[36], w[35], selector); w[57] = __byte_perm_S (w[35], w[34], selector); w[56] = __byte_perm_S (w[34], w[33], selector); w[55] = __byte_perm_S (w[33], w[32], selector); w[54] = __byte_perm_S (w[32], w[31], selector); w[53] = __byte_perm_S (w[31], w[30], selector); w[52] = __byte_perm_S (w[30], w[29], selector); w[51] = __byte_perm_S (w[29], w[28], selector); w[50] = __byte_perm_S (w[28], w[27], selector); w[49] = __byte_perm_S (w[27], w[26], selector); w[48] = __byte_perm_S (w[26], w[25], selector); w[47] = __byte_perm_S (w[25], w[24], selector); w[46] = __byte_perm_S (w[24], w[23], selector); w[45] = __byte_perm_S (w[23], w[22], selector); w[44] = __byte_perm_S (w[22], w[21], selector); w[43] = __byte_perm_S (w[21], w[20], selector); w[42] = __byte_perm_S (w[20], w[19], selector); w[41] = __byte_perm_S (w[19], w[18], selector); w[40] = __byte_perm_S (w[18], w[17], selector); w[39] = __byte_perm_S (w[17], w[16], selector); w[38] = __byte_perm_S (w[16], w[15], selector); w[37] = __byte_perm_S (w[15], w[14], selector); w[36] = __byte_perm_S (w[14], w[13], selector); w[35] = __byte_perm_S (w[13], w[12], selector); w[34] = __byte_perm_S (w[12], w[11], selector); w[33] = __byte_perm_S (w[11], w[10], selector); w[32] = __byte_perm_S (w[10], w[ 9], selector); w[31] = __byte_perm_S (w[ 9], w[ 8], selector); w[30] = __byte_perm_S (w[ 8], w[ 7], selector); w[29] = __byte_perm_S (w[ 7], w[ 6], selector); w[28] = __byte_perm_S (w[ 6], w[ 5], selector); w[27] = __byte_perm_S (w[ 5], w[ 4], selector); w[26] = __byte_perm_S (w[ 4], w[ 3], selector); w[25] = __byte_perm_S (w[ 3], w[ 2], selector); w[24] = __byte_perm_S (w[ 2], w[ 1], selector); w[23] = __byte_perm_S (w[ 1], w[ 0], selector); w[22] = __byte_perm_S (w[ 0], 0, selector); w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 23: w[63] = __byte_perm_S (w[40], w[39], selector); w[62] = __byte_perm_S (w[39], w[38], selector); w[61] = __byte_perm_S (w[38], w[37], selector); w[60] = __byte_perm_S (w[37], w[36], selector); w[59] = __byte_perm_S (w[36], w[35], selector); w[58] = __byte_perm_S (w[35], w[34], selector); w[57] = __byte_perm_S (w[34], w[33], selector); w[56] = __byte_perm_S (w[33], w[32], selector); w[55] = __byte_perm_S (w[32], w[31], selector); w[54] = __byte_perm_S (w[31], w[30], selector); w[53] = __byte_perm_S (w[30], w[29], selector); w[52] = __byte_perm_S (w[29], w[28], selector); w[51] = __byte_perm_S (w[28], w[27], selector); w[50] = __byte_perm_S (w[27], w[26], selector); w[49] = __byte_perm_S (w[26], w[25], selector); w[48] = __byte_perm_S (w[25], w[24], selector); w[47] = __byte_perm_S (w[24], w[23], selector); w[46] = __byte_perm_S (w[23], w[22], selector); w[45] = __byte_perm_S (w[22], w[21], selector); w[44] = __byte_perm_S (w[21], w[20], selector); w[43] = __byte_perm_S (w[20], w[19], selector); w[42] = __byte_perm_S (w[19], w[18], selector); w[41] = __byte_perm_S (w[18], w[17], selector); w[40] = __byte_perm_S (w[17], w[16], selector); w[39] = __byte_perm_S (w[16], w[15], selector); w[38] = __byte_perm_S (w[15], w[14], selector); w[37] = __byte_perm_S (w[14], w[13], selector); w[36] = __byte_perm_S (w[13], w[12], selector); w[35] = __byte_perm_S (w[12], w[11], selector); w[34] = __byte_perm_S (w[11], w[10], selector); w[33] = __byte_perm_S (w[10], w[ 9], selector); w[32] = __byte_perm_S (w[ 9], w[ 8], selector); w[31] = __byte_perm_S (w[ 8], w[ 7], selector); w[30] = __byte_perm_S (w[ 7], w[ 6], selector); w[29] = __byte_perm_S (w[ 6], w[ 5], selector); w[28] = __byte_perm_S (w[ 5], w[ 4], selector); w[27] = __byte_perm_S (w[ 4], w[ 3], selector); w[26] = __byte_perm_S (w[ 3], w[ 2], selector); w[25] = __byte_perm_S (w[ 2], w[ 1], selector); w[24] = __byte_perm_S (w[ 1], w[ 0], selector); w[23] = __byte_perm_S (w[ 0], 0, selector); w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 24: w[63] = __byte_perm_S (w[39], w[38], selector); w[62] = __byte_perm_S (w[38], w[37], selector); w[61] = __byte_perm_S (w[37], w[36], selector); w[60] = __byte_perm_S (w[36], w[35], selector); w[59] = __byte_perm_S (w[35], w[34], selector); w[58] = __byte_perm_S (w[34], w[33], selector); w[57] = __byte_perm_S (w[33], w[32], selector); w[56] = __byte_perm_S (w[32], w[31], selector); w[55] = __byte_perm_S (w[31], w[30], selector); w[54] = __byte_perm_S (w[30], w[29], selector); w[53] = __byte_perm_S (w[29], w[28], selector); w[52] = __byte_perm_S (w[28], w[27], selector); w[51] = __byte_perm_S (w[27], w[26], selector); w[50] = __byte_perm_S (w[26], w[25], selector); w[49] = __byte_perm_S (w[25], w[24], selector); w[48] = __byte_perm_S (w[24], w[23], selector); w[47] = __byte_perm_S (w[23], w[22], selector); w[46] = __byte_perm_S (w[22], w[21], selector); w[45] = __byte_perm_S (w[21], w[20], selector); w[44] = __byte_perm_S (w[20], w[19], selector); w[43] = __byte_perm_S (w[19], w[18], selector); w[42] = __byte_perm_S (w[18], w[17], selector); w[41] = __byte_perm_S (w[17], w[16], selector); w[40] = __byte_perm_S (w[16], w[15], selector); w[39] = __byte_perm_S (w[15], w[14], selector); w[38] = __byte_perm_S (w[14], w[13], selector); w[37] = __byte_perm_S (w[13], w[12], selector); w[36] = __byte_perm_S (w[12], w[11], selector); w[35] = __byte_perm_S (w[11], w[10], selector); w[34] = __byte_perm_S (w[10], w[ 9], selector); w[33] = __byte_perm_S (w[ 9], w[ 8], selector); w[32] = __byte_perm_S (w[ 8], w[ 7], selector); w[31] = __byte_perm_S (w[ 7], w[ 6], selector); w[30] = __byte_perm_S (w[ 6], w[ 5], selector); w[29] = __byte_perm_S (w[ 5], w[ 4], selector); w[28] = __byte_perm_S (w[ 4], w[ 3], selector); w[27] = __byte_perm_S (w[ 3], w[ 2], selector); w[26] = __byte_perm_S (w[ 2], w[ 1], selector); w[25] = __byte_perm_S (w[ 1], w[ 0], selector); w[24] = __byte_perm_S (w[ 0], 0, selector); w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 25: w[63] = __byte_perm_S (w[38], w[37], selector); w[62] = __byte_perm_S (w[37], w[36], selector); w[61] = __byte_perm_S (w[36], w[35], selector); w[60] = __byte_perm_S (w[35], w[34], selector); w[59] = __byte_perm_S (w[34], w[33], selector); w[58] = __byte_perm_S (w[33], w[32], selector); w[57] = __byte_perm_S (w[32], w[31], selector); w[56] = __byte_perm_S (w[31], w[30], selector); w[55] = __byte_perm_S (w[30], w[29], selector); w[54] = __byte_perm_S (w[29], w[28], selector); w[53] = __byte_perm_S (w[28], w[27], selector); w[52] = __byte_perm_S (w[27], w[26], selector); w[51] = __byte_perm_S (w[26], w[25], selector); w[50] = __byte_perm_S (w[25], w[24], selector); w[49] = __byte_perm_S (w[24], w[23], selector); w[48] = __byte_perm_S (w[23], w[22], selector); w[47] = __byte_perm_S (w[22], w[21], selector); w[46] = __byte_perm_S (w[21], w[20], selector); w[45] = __byte_perm_S (w[20], w[19], selector); w[44] = __byte_perm_S (w[19], w[18], selector); w[43] = __byte_perm_S (w[18], w[17], selector); w[42] = __byte_perm_S (w[17], w[16], selector); w[41] = __byte_perm_S (w[16], w[15], selector); w[40] = __byte_perm_S (w[15], w[14], selector); w[39] = __byte_perm_S (w[14], w[13], selector); w[38] = __byte_perm_S (w[13], w[12], selector); w[37] = __byte_perm_S (w[12], w[11], selector); w[36] = __byte_perm_S (w[11], w[10], selector); w[35] = __byte_perm_S (w[10], w[ 9], selector); w[34] = __byte_perm_S (w[ 9], w[ 8], selector); w[33] = __byte_perm_S (w[ 8], w[ 7], selector); w[32] = __byte_perm_S (w[ 7], w[ 6], selector); w[31] = __byte_perm_S (w[ 6], w[ 5], selector); w[30] = __byte_perm_S (w[ 5], w[ 4], selector); w[29] = __byte_perm_S (w[ 4], w[ 3], selector); w[28] = __byte_perm_S (w[ 3], w[ 2], selector); w[27] = __byte_perm_S (w[ 2], w[ 1], selector); w[26] = __byte_perm_S (w[ 1], w[ 0], selector); w[25] = __byte_perm_S (w[ 0], 0, selector); w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 26: w[63] = __byte_perm_S (w[37], w[36], selector); w[62] = __byte_perm_S (w[36], w[35], selector); w[61] = __byte_perm_S (w[35], w[34], selector); w[60] = __byte_perm_S (w[34], w[33], selector); w[59] = __byte_perm_S (w[33], w[32], selector); w[58] = __byte_perm_S (w[32], w[31], selector); w[57] = __byte_perm_S (w[31], w[30], selector); w[56] = __byte_perm_S (w[30], w[29], selector); w[55] = __byte_perm_S (w[29], w[28], selector); w[54] = __byte_perm_S (w[28], w[27], selector); w[53] = __byte_perm_S (w[27], w[26], selector); w[52] = __byte_perm_S (w[26], w[25], selector); w[51] = __byte_perm_S (w[25], w[24], selector); w[50] = __byte_perm_S (w[24], w[23], selector); w[49] = __byte_perm_S (w[23], w[22], selector); w[48] = __byte_perm_S (w[22], w[21], selector); w[47] = __byte_perm_S (w[21], w[20], selector); w[46] = __byte_perm_S (w[20], w[19], selector); w[45] = __byte_perm_S (w[19], w[18], selector); w[44] = __byte_perm_S (w[18], w[17], selector); w[43] = __byte_perm_S (w[17], w[16], selector); w[42] = __byte_perm_S (w[16], w[15], selector); w[41] = __byte_perm_S (w[15], w[14], selector); w[40] = __byte_perm_S (w[14], w[13], selector); w[39] = __byte_perm_S (w[13], w[12], selector); w[38] = __byte_perm_S (w[12], w[11], selector); w[37] = __byte_perm_S (w[11], w[10], selector); w[36] = __byte_perm_S (w[10], w[ 9], selector); w[35] = __byte_perm_S (w[ 9], w[ 8], selector); w[34] = __byte_perm_S (w[ 8], w[ 7], selector); w[33] = __byte_perm_S (w[ 7], w[ 6], selector); w[32] = __byte_perm_S (w[ 6], w[ 5], selector); w[31] = __byte_perm_S (w[ 5], w[ 4], selector); w[30] = __byte_perm_S (w[ 4], w[ 3], selector); w[29] = __byte_perm_S (w[ 3], w[ 2], selector); w[28] = __byte_perm_S (w[ 2], w[ 1], selector); w[27] = __byte_perm_S (w[ 1], w[ 0], selector); w[26] = __byte_perm_S (w[ 0], 0, selector); w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 27: w[63] = __byte_perm_S (w[36], w[35], selector); w[62] = __byte_perm_S (w[35], w[34], selector); w[61] = __byte_perm_S (w[34], w[33], selector); w[60] = __byte_perm_S (w[33], w[32], selector); w[59] = __byte_perm_S (w[32], w[31], selector); w[58] = __byte_perm_S (w[31], w[30], selector); w[57] = __byte_perm_S (w[30], w[29], selector); w[56] = __byte_perm_S (w[29], w[28], selector); w[55] = __byte_perm_S (w[28], w[27], selector); w[54] = __byte_perm_S (w[27], w[26], selector); w[53] = __byte_perm_S (w[26], w[25], selector); w[52] = __byte_perm_S (w[25], w[24], selector); w[51] = __byte_perm_S (w[24], w[23], selector); w[50] = __byte_perm_S (w[23], w[22], selector); w[49] = __byte_perm_S (w[22], w[21], selector); w[48] = __byte_perm_S (w[21], w[20], selector); w[47] = __byte_perm_S (w[20], w[19], selector); w[46] = __byte_perm_S (w[19], w[18], selector); w[45] = __byte_perm_S (w[18], w[17], selector); w[44] = __byte_perm_S (w[17], w[16], selector); w[43] = __byte_perm_S (w[16], w[15], selector); w[42] = __byte_perm_S (w[15], w[14], selector); w[41] = __byte_perm_S (w[14], w[13], selector); w[40] = __byte_perm_S (w[13], w[12], selector); w[39] = __byte_perm_S (w[12], w[11], selector); w[38] = __byte_perm_S (w[11], w[10], selector); w[37] = __byte_perm_S (w[10], w[ 9], selector); w[36] = __byte_perm_S (w[ 9], w[ 8], selector); w[35] = __byte_perm_S (w[ 8], w[ 7], selector); w[34] = __byte_perm_S (w[ 7], w[ 6], selector); w[33] = __byte_perm_S (w[ 6], w[ 5], selector); w[32] = __byte_perm_S (w[ 5], w[ 4], selector); w[31] = __byte_perm_S (w[ 4], w[ 3], selector); w[30] = __byte_perm_S (w[ 3], w[ 2], selector); w[29] = __byte_perm_S (w[ 2], w[ 1], selector); w[28] = __byte_perm_S (w[ 1], w[ 0], selector); w[27] = __byte_perm_S (w[ 0], 0, selector); w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 28: w[63] = __byte_perm_S (w[35], w[34], selector); w[62] = __byte_perm_S (w[34], w[33], selector); w[61] = __byte_perm_S (w[33], w[32], selector); w[60] = __byte_perm_S (w[32], w[31], selector); w[59] = __byte_perm_S (w[31], w[30], selector); w[58] = __byte_perm_S (w[30], w[29], selector); w[57] = __byte_perm_S (w[29], w[28], selector); w[56] = __byte_perm_S (w[28], w[27], selector); w[55] = __byte_perm_S (w[27], w[26], selector); w[54] = __byte_perm_S (w[26], w[25], selector); w[53] = __byte_perm_S (w[25], w[24], selector); w[52] = __byte_perm_S (w[24], w[23], selector); w[51] = __byte_perm_S (w[23], w[22], selector); w[50] = __byte_perm_S (w[22], w[21], selector); w[49] = __byte_perm_S (w[21], w[20], selector); w[48] = __byte_perm_S (w[20], w[19], selector); w[47] = __byte_perm_S (w[19], w[18], selector); w[46] = __byte_perm_S (w[18], w[17], selector); w[45] = __byte_perm_S (w[17], w[16], selector); w[44] = __byte_perm_S (w[16], w[15], selector); w[43] = __byte_perm_S (w[15], w[14], selector); w[42] = __byte_perm_S (w[14], w[13], selector); w[41] = __byte_perm_S (w[13], w[12], selector); w[40] = __byte_perm_S (w[12], w[11], selector); w[39] = __byte_perm_S (w[11], w[10], selector); w[38] = __byte_perm_S (w[10], w[ 9], selector); w[37] = __byte_perm_S (w[ 9], w[ 8], selector); w[36] = __byte_perm_S (w[ 8], w[ 7], selector); w[35] = __byte_perm_S (w[ 7], w[ 6], selector); w[34] = __byte_perm_S (w[ 6], w[ 5], selector); w[33] = __byte_perm_S (w[ 5], w[ 4], selector); w[32] = __byte_perm_S (w[ 4], w[ 3], selector); w[31] = __byte_perm_S (w[ 3], w[ 2], selector); w[30] = __byte_perm_S (w[ 2], w[ 1], selector); w[29] = __byte_perm_S (w[ 1], w[ 0], selector); w[28] = __byte_perm_S (w[ 0], 0, selector); w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 29: w[63] = __byte_perm_S (w[34], w[33], selector); w[62] = __byte_perm_S (w[33], w[32], selector); w[61] = __byte_perm_S (w[32], w[31], selector); w[60] = __byte_perm_S (w[31], w[30], selector); w[59] = __byte_perm_S (w[30], w[29], selector); w[58] = __byte_perm_S (w[29], w[28], selector); w[57] = __byte_perm_S (w[28], w[27], selector); w[56] = __byte_perm_S (w[27], w[26], selector); w[55] = __byte_perm_S (w[26], w[25], selector); w[54] = __byte_perm_S (w[25], w[24], selector); w[53] = __byte_perm_S (w[24], w[23], selector); w[52] = __byte_perm_S (w[23], w[22], selector); w[51] = __byte_perm_S (w[22], w[21], selector); w[50] = __byte_perm_S (w[21], w[20], selector); w[49] = __byte_perm_S (w[20], w[19], selector); w[48] = __byte_perm_S (w[19], w[18], selector); w[47] = __byte_perm_S (w[18], w[17], selector); w[46] = __byte_perm_S (w[17], w[16], selector); w[45] = __byte_perm_S (w[16], w[15], selector); w[44] = __byte_perm_S (w[15], w[14], selector); w[43] = __byte_perm_S (w[14], w[13], selector); w[42] = __byte_perm_S (w[13], w[12], selector); w[41] = __byte_perm_S (w[12], w[11], selector); w[40] = __byte_perm_S (w[11], w[10], selector); w[39] = __byte_perm_S (w[10], w[ 9], selector); w[38] = __byte_perm_S (w[ 9], w[ 8], selector); w[37] = __byte_perm_S (w[ 8], w[ 7], selector); w[36] = __byte_perm_S (w[ 7], w[ 6], selector); w[35] = __byte_perm_S (w[ 6], w[ 5], selector); w[34] = __byte_perm_S (w[ 5], w[ 4], selector); w[33] = __byte_perm_S (w[ 4], w[ 3], selector); w[32] = __byte_perm_S (w[ 3], w[ 2], selector); w[31] = __byte_perm_S (w[ 2], w[ 1], selector); w[30] = __byte_perm_S (w[ 1], w[ 0], selector); w[29] = __byte_perm_S (w[ 0], 0, selector); w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 30: w[63] = __byte_perm_S (w[33], w[32], selector); w[62] = __byte_perm_S (w[32], w[31], selector); w[61] = __byte_perm_S (w[31], w[30], selector); w[60] = __byte_perm_S (w[30], w[29], selector); w[59] = __byte_perm_S (w[29], w[28], selector); w[58] = __byte_perm_S (w[28], w[27], selector); w[57] = __byte_perm_S (w[27], w[26], selector); w[56] = __byte_perm_S (w[26], w[25], selector); w[55] = __byte_perm_S (w[25], w[24], selector); w[54] = __byte_perm_S (w[24], w[23], selector); w[53] = __byte_perm_S (w[23], w[22], selector); w[52] = __byte_perm_S (w[22], w[21], selector); w[51] = __byte_perm_S (w[21], w[20], selector); w[50] = __byte_perm_S (w[20], w[19], selector); w[49] = __byte_perm_S (w[19], w[18], selector); w[48] = __byte_perm_S (w[18], w[17], selector); w[47] = __byte_perm_S (w[17], w[16], selector); w[46] = __byte_perm_S (w[16], w[15], selector); w[45] = __byte_perm_S (w[15], w[14], selector); w[44] = __byte_perm_S (w[14], w[13], selector); w[43] = __byte_perm_S (w[13], w[12], selector); w[42] = __byte_perm_S (w[12], w[11], selector); w[41] = __byte_perm_S (w[11], w[10], selector); w[40] = __byte_perm_S (w[10], w[ 9], selector); w[39] = __byte_perm_S (w[ 9], w[ 8], selector); w[38] = __byte_perm_S (w[ 8], w[ 7], selector); w[37] = __byte_perm_S (w[ 7], w[ 6], selector); w[36] = __byte_perm_S (w[ 6], w[ 5], selector); w[35] = __byte_perm_S (w[ 5], w[ 4], selector); w[34] = __byte_perm_S (w[ 4], w[ 3], selector); w[33] = __byte_perm_S (w[ 3], w[ 2], selector); w[32] = __byte_perm_S (w[ 2], w[ 1], selector); w[31] = __byte_perm_S (w[ 1], w[ 0], selector); w[30] = __byte_perm_S (w[ 0], 0, selector); w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 31: w[63] = __byte_perm_S (w[32], w[31], selector); w[62] = __byte_perm_S (w[31], w[30], selector); w[61] = __byte_perm_S (w[30], w[29], selector); w[60] = __byte_perm_S (w[29], w[28], selector); w[59] = __byte_perm_S (w[28], w[27], selector); w[58] = __byte_perm_S (w[27], w[26], selector); w[57] = __byte_perm_S (w[26], w[25], selector); w[56] = __byte_perm_S (w[25], w[24], selector); w[55] = __byte_perm_S (w[24], w[23], selector); w[54] = __byte_perm_S (w[23], w[22], selector); w[53] = __byte_perm_S (w[22], w[21], selector); w[52] = __byte_perm_S (w[21], w[20], selector); w[51] = __byte_perm_S (w[20], w[19], selector); w[50] = __byte_perm_S (w[19], w[18], selector); w[49] = __byte_perm_S (w[18], w[17], selector); w[48] = __byte_perm_S (w[17], w[16], selector); w[47] = __byte_perm_S (w[16], w[15], selector); w[46] = __byte_perm_S (w[15], w[14], selector); w[45] = __byte_perm_S (w[14], w[13], selector); w[44] = __byte_perm_S (w[13], w[12], selector); w[43] = __byte_perm_S (w[12], w[11], selector); w[42] = __byte_perm_S (w[11], w[10], selector); w[41] = __byte_perm_S (w[10], w[ 9], selector); w[40] = __byte_perm_S (w[ 9], w[ 8], selector); w[39] = __byte_perm_S (w[ 8], w[ 7], selector); w[38] = __byte_perm_S (w[ 7], w[ 6], selector); w[37] = __byte_perm_S (w[ 6], w[ 5], selector); w[36] = __byte_perm_S (w[ 5], w[ 4], selector); w[35] = __byte_perm_S (w[ 4], w[ 3], selector); w[34] = __byte_perm_S (w[ 3], w[ 2], selector); w[33] = __byte_perm_S (w[ 2], w[ 1], selector); w[32] = __byte_perm_S (w[ 1], w[ 0], selector); w[31] = __byte_perm_S (w[ 0], 0, selector); w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 32: w[63] = __byte_perm_S (w[31], w[30], selector); w[62] = __byte_perm_S (w[30], w[29], selector); w[61] = __byte_perm_S (w[29], w[28], selector); w[60] = __byte_perm_S (w[28], w[27], selector); w[59] = __byte_perm_S (w[27], w[26], selector); w[58] = __byte_perm_S (w[26], w[25], selector); w[57] = __byte_perm_S (w[25], w[24], selector); w[56] = __byte_perm_S (w[24], w[23], selector); w[55] = __byte_perm_S (w[23], w[22], selector); w[54] = __byte_perm_S (w[22], w[21], selector); w[53] = __byte_perm_S (w[21], w[20], selector); w[52] = __byte_perm_S (w[20], w[19], selector); w[51] = __byte_perm_S (w[19], w[18], selector); w[50] = __byte_perm_S (w[18], w[17], selector); w[49] = __byte_perm_S (w[17], w[16], selector); w[48] = __byte_perm_S (w[16], w[15], selector); w[47] = __byte_perm_S (w[15], w[14], selector); w[46] = __byte_perm_S (w[14], w[13], selector); w[45] = __byte_perm_S (w[13], w[12], selector); w[44] = __byte_perm_S (w[12], w[11], selector); w[43] = __byte_perm_S (w[11], w[10], selector); w[42] = __byte_perm_S (w[10], w[ 9], selector); w[41] = __byte_perm_S (w[ 9], w[ 8], selector); w[40] = __byte_perm_S (w[ 8], w[ 7], selector); w[39] = __byte_perm_S (w[ 7], w[ 6], selector); w[38] = __byte_perm_S (w[ 6], w[ 5], selector); w[37] = __byte_perm_S (w[ 5], w[ 4], selector); w[36] = __byte_perm_S (w[ 4], w[ 3], selector); w[35] = __byte_perm_S (w[ 3], w[ 2], selector); w[34] = __byte_perm_S (w[ 2], w[ 1], selector); w[33] = __byte_perm_S (w[ 1], w[ 0], selector); w[32] = __byte_perm_S (w[ 0], 0, selector); w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 33: w[63] = __byte_perm_S (w[30], w[29], selector); w[62] = __byte_perm_S (w[29], w[28], selector); w[61] = __byte_perm_S (w[28], w[27], selector); w[60] = __byte_perm_S (w[27], w[26], selector); w[59] = __byte_perm_S (w[26], w[25], selector); w[58] = __byte_perm_S (w[25], w[24], selector); w[57] = __byte_perm_S (w[24], w[23], selector); w[56] = __byte_perm_S (w[23], w[22], selector); w[55] = __byte_perm_S (w[22], w[21], selector); w[54] = __byte_perm_S (w[21], w[20], selector); w[53] = __byte_perm_S (w[20], w[19], selector); w[52] = __byte_perm_S (w[19], w[18], selector); w[51] = __byte_perm_S (w[18], w[17], selector); w[50] = __byte_perm_S (w[17], w[16], selector); w[49] = __byte_perm_S (w[16], w[15], selector); w[48] = __byte_perm_S (w[15], w[14], selector); w[47] = __byte_perm_S (w[14], w[13], selector); w[46] = __byte_perm_S (w[13], w[12], selector); w[45] = __byte_perm_S (w[12], w[11], selector); w[44] = __byte_perm_S (w[11], w[10], selector); w[43] = __byte_perm_S (w[10], w[ 9], selector); w[42] = __byte_perm_S (w[ 9], w[ 8], selector); w[41] = __byte_perm_S (w[ 8], w[ 7], selector); w[40] = __byte_perm_S (w[ 7], w[ 6], selector); w[39] = __byte_perm_S (w[ 6], w[ 5], selector); w[38] = __byte_perm_S (w[ 5], w[ 4], selector); w[37] = __byte_perm_S (w[ 4], w[ 3], selector); w[36] = __byte_perm_S (w[ 3], w[ 2], selector); w[35] = __byte_perm_S (w[ 2], w[ 1], selector); w[34] = __byte_perm_S (w[ 1], w[ 0], selector); w[33] = __byte_perm_S (w[ 0], 0, selector); w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 34: w[63] = __byte_perm_S (w[29], w[28], selector); w[62] = __byte_perm_S (w[28], w[27], selector); w[61] = __byte_perm_S (w[27], w[26], selector); w[60] = __byte_perm_S (w[26], w[25], selector); w[59] = __byte_perm_S (w[25], w[24], selector); w[58] = __byte_perm_S (w[24], w[23], selector); w[57] = __byte_perm_S (w[23], w[22], selector); w[56] = __byte_perm_S (w[22], w[21], selector); w[55] = __byte_perm_S (w[21], w[20], selector); w[54] = __byte_perm_S (w[20], w[19], selector); w[53] = __byte_perm_S (w[19], w[18], selector); w[52] = __byte_perm_S (w[18], w[17], selector); w[51] = __byte_perm_S (w[17], w[16], selector); w[50] = __byte_perm_S (w[16], w[15], selector); w[49] = __byte_perm_S (w[15], w[14], selector); w[48] = __byte_perm_S (w[14], w[13], selector); w[47] = __byte_perm_S (w[13], w[12], selector); w[46] = __byte_perm_S (w[12], w[11], selector); w[45] = __byte_perm_S (w[11], w[10], selector); w[44] = __byte_perm_S (w[10], w[ 9], selector); w[43] = __byte_perm_S (w[ 9], w[ 8], selector); w[42] = __byte_perm_S (w[ 8], w[ 7], selector); w[41] = __byte_perm_S (w[ 7], w[ 6], selector); w[40] = __byte_perm_S (w[ 6], w[ 5], selector); w[39] = __byte_perm_S (w[ 5], w[ 4], selector); w[38] = __byte_perm_S (w[ 4], w[ 3], selector); w[37] = __byte_perm_S (w[ 3], w[ 2], selector); w[36] = __byte_perm_S (w[ 2], w[ 1], selector); w[35] = __byte_perm_S (w[ 1], w[ 0], selector); w[34] = __byte_perm_S (w[ 0], 0, selector); w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 35: w[63] = __byte_perm_S (w[28], w[27], selector); w[62] = __byte_perm_S (w[27], w[26], selector); w[61] = __byte_perm_S (w[26], w[25], selector); w[60] = __byte_perm_S (w[25], w[24], selector); w[59] = __byte_perm_S (w[24], w[23], selector); w[58] = __byte_perm_S (w[23], w[22], selector); w[57] = __byte_perm_S (w[22], w[21], selector); w[56] = __byte_perm_S (w[21], w[20], selector); w[55] = __byte_perm_S (w[20], w[19], selector); w[54] = __byte_perm_S (w[19], w[18], selector); w[53] = __byte_perm_S (w[18], w[17], selector); w[52] = __byte_perm_S (w[17], w[16], selector); w[51] = __byte_perm_S (w[16], w[15], selector); w[50] = __byte_perm_S (w[15], w[14], selector); w[49] = __byte_perm_S (w[14], w[13], selector); w[48] = __byte_perm_S (w[13], w[12], selector); w[47] = __byte_perm_S (w[12], w[11], selector); w[46] = __byte_perm_S (w[11], w[10], selector); w[45] = __byte_perm_S (w[10], w[ 9], selector); w[44] = __byte_perm_S (w[ 9], w[ 8], selector); w[43] = __byte_perm_S (w[ 8], w[ 7], selector); w[42] = __byte_perm_S (w[ 7], w[ 6], selector); w[41] = __byte_perm_S (w[ 6], w[ 5], selector); w[40] = __byte_perm_S (w[ 5], w[ 4], selector); w[39] = __byte_perm_S (w[ 4], w[ 3], selector); w[38] = __byte_perm_S (w[ 3], w[ 2], selector); w[37] = __byte_perm_S (w[ 2], w[ 1], selector); w[36] = __byte_perm_S (w[ 1], w[ 0], selector); w[35] = __byte_perm_S (w[ 0], 0, selector); w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 36: w[63] = __byte_perm_S (w[27], w[26], selector); w[62] = __byte_perm_S (w[26], w[25], selector); w[61] = __byte_perm_S (w[25], w[24], selector); w[60] = __byte_perm_S (w[24], w[23], selector); w[59] = __byte_perm_S (w[23], w[22], selector); w[58] = __byte_perm_S (w[22], w[21], selector); w[57] = __byte_perm_S (w[21], w[20], selector); w[56] = __byte_perm_S (w[20], w[19], selector); w[55] = __byte_perm_S (w[19], w[18], selector); w[54] = __byte_perm_S (w[18], w[17], selector); w[53] = __byte_perm_S (w[17], w[16], selector); w[52] = __byte_perm_S (w[16], w[15], selector); w[51] = __byte_perm_S (w[15], w[14], selector); w[50] = __byte_perm_S (w[14], w[13], selector); w[49] = __byte_perm_S (w[13], w[12], selector); w[48] = __byte_perm_S (w[12], w[11], selector); w[47] = __byte_perm_S (w[11], w[10], selector); w[46] = __byte_perm_S (w[10], w[ 9], selector); w[45] = __byte_perm_S (w[ 9], w[ 8], selector); w[44] = __byte_perm_S (w[ 8], w[ 7], selector); w[43] = __byte_perm_S (w[ 7], w[ 6], selector); w[42] = __byte_perm_S (w[ 6], w[ 5], selector); w[41] = __byte_perm_S (w[ 5], w[ 4], selector); w[40] = __byte_perm_S (w[ 4], w[ 3], selector); w[39] = __byte_perm_S (w[ 3], w[ 2], selector); w[38] = __byte_perm_S (w[ 2], w[ 1], selector); w[37] = __byte_perm_S (w[ 1], w[ 0], selector); w[36] = __byte_perm_S (w[ 0], 0, selector); w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 37: w[63] = __byte_perm_S (w[26], w[25], selector); w[62] = __byte_perm_S (w[25], w[24], selector); w[61] = __byte_perm_S (w[24], w[23], selector); w[60] = __byte_perm_S (w[23], w[22], selector); w[59] = __byte_perm_S (w[22], w[21], selector); w[58] = __byte_perm_S (w[21], w[20], selector); w[57] = __byte_perm_S (w[20], w[19], selector); w[56] = __byte_perm_S (w[19], w[18], selector); w[55] = __byte_perm_S (w[18], w[17], selector); w[54] = __byte_perm_S (w[17], w[16], selector); w[53] = __byte_perm_S (w[16], w[15], selector); w[52] = __byte_perm_S (w[15], w[14], selector); w[51] = __byte_perm_S (w[14], w[13], selector); w[50] = __byte_perm_S (w[13], w[12], selector); w[49] = __byte_perm_S (w[12], w[11], selector); w[48] = __byte_perm_S (w[11], w[10], selector); w[47] = __byte_perm_S (w[10], w[ 9], selector); w[46] = __byte_perm_S (w[ 9], w[ 8], selector); w[45] = __byte_perm_S (w[ 8], w[ 7], selector); w[44] = __byte_perm_S (w[ 7], w[ 6], selector); w[43] = __byte_perm_S (w[ 6], w[ 5], selector); w[42] = __byte_perm_S (w[ 5], w[ 4], selector); w[41] = __byte_perm_S (w[ 4], w[ 3], selector); w[40] = __byte_perm_S (w[ 3], w[ 2], selector); w[39] = __byte_perm_S (w[ 2], w[ 1], selector); w[38] = __byte_perm_S (w[ 1], w[ 0], selector); w[37] = __byte_perm_S (w[ 0], 0, selector); w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 38: w[63] = __byte_perm_S (w[25], w[24], selector); w[62] = __byte_perm_S (w[24], w[23], selector); w[61] = __byte_perm_S (w[23], w[22], selector); w[60] = __byte_perm_S (w[22], w[21], selector); w[59] = __byte_perm_S (w[21], w[20], selector); w[58] = __byte_perm_S (w[20], w[19], selector); w[57] = __byte_perm_S (w[19], w[18], selector); w[56] = __byte_perm_S (w[18], w[17], selector); w[55] = __byte_perm_S (w[17], w[16], selector); w[54] = __byte_perm_S (w[16], w[15], selector); w[53] = __byte_perm_S (w[15], w[14], selector); w[52] = __byte_perm_S (w[14], w[13], selector); w[51] = __byte_perm_S (w[13], w[12], selector); w[50] = __byte_perm_S (w[12], w[11], selector); w[49] = __byte_perm_S (w[11], w[10], selector); w[48] = __byte_perm_S (w[10], w[ 9], selector); w[47] = __byte_perm_S (w[ 9], w[ 8], selector); w[46] = __byte_perm_S (w[ 8], w[ 7], selector); w[45] = __byte_perm_S (w[ 7], w[ 6], selector); w[44] = __byte_perm_S (w[ 6], w[ 5], selector); w[43] = __byte_perm_S (w[ 5], w[ 4], selector); w[42] = __byte_perm_S (w[ 4], w[ 3], selector); w[41] = __byte_perm_S (w[ 3], w[ 2], selector); w[40] = __byte_perm_S (w[ 2], w[ 1], selector); w[39] = __byte_perm_S (w[ 1], w[ 0], selector); w[38] = __byte_perm_S (w[ 0], 0, selector); w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 39: w[63] = __byte_perm_S (w[24], w[23], selector); w[62] = __byte_perm_S (w[23], w[22], selector); w[61] = __byte_perm_S (w[22], w[21], selector); w[60] = __byte_perm_S (w[21], w[20], selector); w[59] = __byte_perm_S (w[20], w[19], selector); w[58] = __byte_perm_S (w[19], w[18], selector); w[57] = __byte_perm_S (w[18], w[17], selector); w[56] = __byte_perm_S (w[17], w[16], selector); w[55] = __byte_perm_S (w[16], w[15], selector); w[54] = __byte_perm_S (w[15], w[14], selector); w[53] = __byte_perm_S (w[14], w[13], selector); w[52] = __byte_perm_S (w[13], w[12], selector); w[51] = __byte_perm_S (w[12], w[11], selector); w[50] = __byte_perm_S (w[11], w[10], selector); w[49] = __byte_perm_S (w[10], w[ 9], selector); w[48] = __byte_perm_S (w[ 9], w[ 8], selector); w[47] = __byte_perm_S (w[ 8], w[ 7], selector); w[46] = __byte_perm_S (w[ 7], w[ 6], selector); w[45] = __byte_perm_S (w[ 6], w[ 5], selector); w[44] = __byte_perm_S (w[ 5], w[ 4], selector); w[43] = __byte_perm_S (w[ 4], w[ 3], selector); w[42] = __byte_perm_S (w[ 3], w[ 2], selector); w[41] = __byte_perm_S (w[ 2], w[ 1], selector); w[40] = __byte_perm_S (w[ 1], w[ 0], selector); w[39] = __byte_perm_S (w[ 0], 0, selector); w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 40: w[63] = __byte_perm_S (w[23], w[22], selector); w[62] = __byte_perm_S (w[22], w[21], selector); w[61] = __byte_perm_S (w[21], w[20], selector); w[60] = __byte_perm_S (w[20], w[19], selector); w[59] = __byte_perm_S (w[19], w[18], selector); w[58] = __byte_perm_S (w[18], w[17], selector); w[57] = __byte_perm_S (w[17], w[16], selector); w[56] = __byte_perm_S (w[16], w[15], selector); w[55] = __byte_perm_S (w[15], w[14], selector); w[54] = __byte_perm_S (w[14], w[13], selector); w[53] = __byte_perm_S (w[13], w[12], selector); w[52] = __byte_perm_S (w[12], w[11], selector); w[51] = __byte_perm_S (w[11], w[10], selector); w[50] = __byte_perm_S (w[10], w[ 9], selector); w[49] = __byte_perm_S (w[ 9], w[ 8], selector); w[48] = __byte_perm_S (w[ 8], w[ 7], selector); w[47] = __byte_perm_S (w[ 7], w[ 6], selector); w[46] = __byte_perm_S (w[ 6], w[ 5], selector); w[45] = __byte_perm_S (w[ 5], w[ 4], selector); w[44] = __byte_perm_S (w[ 4], w[ 3], selector); w[43] = __byte_perm_S (w[ 3], w[ 2], selector); w[42] = __byte_perm_S (w[ 2], w[ 1], selector); w[41] = __byte_perm_S (w[ 1], w[ 0], selector); w[40] = __byte_perm_S (w[ 0], 0, selector); w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 41: w[63] = __byte_perm_S (w[22], w[21], selector); w[62] = __byte_perm_S (w[21], w[20], selector); w[61] = __byte_perm_S (w[20], w[19], selector); w[60] = __byte_perm_S (w[19], w[18], selector); w[59] = __byte_perm_S (w[18], w[17], selector); w[58] = __byte_perm_S (w[17], w[16], selector); w[57] = __byte_perm_S (w[16], w[15], selector); w[56] = __byte_perm_S (w[15], w[14], selector); w[55] = __byte_perm_S (w[14], w[13], selector); w[54] = __byte_perm_S (w[13], w[12], selector); w[53] = __byte_perm_S (w[12], w[11], selector); w[52] = __byte_perm_S (w[11], w[10], selector); w[51] = __byte_perm_S (w[10], w[ 9], selector); w[50] = __byte_perm_S (w[ 9], w[ 8], selector); w[49] = __byte_perm_S (w[ 8], w[ 7], selector); w[48] = __byte_perm_S (w[ 7], w[ 6], selector); w[47] = __byte_perm_S (w[ 6], w[ 5], selector); w[46] = __byte_perm_S (w[ 5], w[ 4], selector); w[45] = __byte_perm_S (w[ 4], w[ 3], selector); w[44] = __byte_perm_S (w[ 3], w[ 2], selector); w[43] = __byte_perm_S (w[ 2], w[ 1], selector); w[42] = __byte_perm_S (w[ 1], w[ 0], selector); w[41] = __byte_perm_S (w[ 0], 0, selector); w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 42: w[63] = __byte_perm_S (w[21], w[20], selector); w[62] = __byte_perm_S (w[20], w[19], selector); w[61] = __byte_perm_S (w[19], w[18], selector); w[60] = __byte_perm_S (w[18], w[17], selector); w[59] = __byte_perm_S (w[17], w[16], selector); w[58] = __byte_perm_S (w[16], w[15], selector); w[57] = __byte_perm_S (w[15], w[14], selector); w[56] = __byte_perm_S (w[14], w[13], selector); w[55] = __byte_perm_S (w[13], w[12], selector); w[54] = __byte_perm_S (w[12], w[11], selector); w[53] = __byte_perm_S (w[11], w[10], selector); w[52] = __byte_perm_S (w[10], w[ 9], selector); w[51] = __byte_perm_S (w[ 9], w[ 8], selector); w[50] = __byte_perm_S (w[ 8], w[ 7], selector); w[49] = __byte_perm_S (w[ 7], w[ 6], selector); w[48] = __byte_perm_S (w[ 6], w[ 5], selector); w[47] = __byte_perm_S (w[ 5], w[ 4], selector); w[46] = __byte_perm_S (w[ 4], w[ 3], selector); w[45] = __byte_perm_S (w[ 3], w[ 2], selector); w[44] = __byte_perm_S (w[ 2], w[ 1], selector); w[43] = __byte_perm_S (w[ 1], w[ 0], selector); w[42] = __byte_perm_S (w[ 0], 0, selector); w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 43: w[63] = __byte_perm_S (w[20], w[19], selector); w[62] = __byte_perm_S (w[19], w[18], selector); w[61] = __byte_perm_S (w[18], w[17], selector); w[60] = __byte_perm_S (w[17], w[16], selector); w[59] = __byte_perm_S (w[16], w[15], selector); w[58] = __byte_perm_S (w[15], w[14], selector); w[57] = __byte_perm_S (w[14], w[13], selector); w[56] = __byte_perm_S (w[13], w[12], selector); w[55] = __byte_perm_S (w[12], w[11], selector); w[54] = __byte_perm_S (w[11], w[10], selector); w[53] = __byte_perm_S (w[10], w[ 9], selector); w[52] = __byte_perm_S (w[ 9], w[ 8], selector); w[51] = __byte_perm_S (w[ 8], w[ 7], selector); w[50] = __byte_perm_S (w[ 7], w[ 6], selector); w[49] = __byte_perm_S (w[ 6], w[ 5], selector); w[48] = __byte_perm_S (w[ 5], w[ 4], selector); w[47] = __byte_perm_S (w[ 4], w[ 3], selector); w[46] = __byte_perm_S (w[ 3], w[ 2], selector); w[45] = __byte_perm_S (w[ 2], w[ 1], selector); w[44] = __byte_perm_S (w[ 1], w[ 0], selector); w[43] = __byte_perm_S (w[ 0], 0, selector); w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 44: w[63] = __byte_perm_S (w[19], w[18], selector); w[62] = __byte_perm_S (w[18], w[17], selector); w[61] = __byte_perm_S (w[17], w[16], selector); w[60] = __byte_perm_S (w[16], w[15], selector); w[59] = __byte_perm_S (w[15], w[14], selector); w[58] = __byte_perm_S (w[14], w[13], selector); w[57] = __byte_perm_S (w[13], w[12], selector); w[56] = __byte_perm_S (w[12], w[11], selector); w[55] = __byte_perm_S (w[11], w[10], selector); w[54] = __byte_perm_S (w[10], w[ 9], selector); w[53] = __byte_perm_S (w[ 9], w[ 8], selector); w[52] = __byte_perm_S (w[ 8], w[ 7], selector); w[51] = __byte_perm_S (w[ 7], w[ 6], selector); w[50] = __byte_perm_S (w[ 6], w[ 5], selector); w[49] = __byte_perm_S (w[ 5], w[ 4], selector); w[48] = __byte_perm_S (w[ 4], w[ 3], selector); w[47] = __byte_perm_S (w[ 3], w[ 2], selector); w[46] = __byte_perm_S (w[ 2], w[ 1], selector); w[45] = __byte_perm_S (w[ 1], w[ 0], selector); w[44] = __byte_perm_S (w[ 0], 0, selector); w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 45: w[63] = __byte_perm_S (w[18], w[17], selector); w[62] = __byte_perm_S (w[17], w[16], selector); w[61] = __byte_perm_S (w[16], w[15], selector); w[60] = __byte_perm_S (w[15], w[14], selector); w[59] = __byte_perm_S (w[14], w[13], selector); w[58] = __byte_perm_S (w[13], w[12], selector); w[57] = __byte_perm_S (w[12], w[11], selector); w[56] = __byte_perm_S (w[11], w[10], selector); w[55] = __byte_perm_S (w[10], w[ 9], selector); w[54] = __byte_perm_S (w[ 9], w[ 8], selector); w[53] = __byte_perm_S (w[ 8], w[ 7], selector); w[52] = __byte_perm_S (w[ 7], w[ 6], selector); w[51] = __byte_perm_S (w[ 6], w[ 5], selector); w[50] = __byte_perm_S (w[ 5], w[ 4], selector); w[49] = __byte_perm_S (w[ 4], w[ 3], selector); w[48] = __byte_perm_S (w[ 3], w[ 2], selector); w[47] = __byte_perm_S (w[ 2], w[ 1], selector); w[46] = __byte_perm_S (w[ 1], w[ 0], selector); w[45] = __byte_perm_S (w[ 0], 0, selector); w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 46: w[63] = __byte_perm_S (w[17], w[16], selector); w[62] = __byte_perm_S (w[16], w[15], selector); w[61] = __byte_perm_S (w[15], w[14], selector); w[60] = __byte_perm_S (w[14], w[13], selector); w[59] = __byte_perm_S (w[13], w[12], selector); w[58] = __byte_perm_S (w[12], w[11], selector); w[57] = __byte_perm_S (w[11], w[10], selector); w[56] = __byte_perm_S (w[10], w[ 9], selector); w[55] = __byte_perm_S (w[ 9], w[ 8], selector); w[54] = __byte_perm_S (w[ 8], w[ 7], selector); w[53] = __byte_perm_S (w[ 7], w[ 6], selector); w[52] = __byte_perm_S (w[ 6], w[ 5], selector); w[51] = __byte_perm_S (w[ 5], w[ 4], selector); w[50] = __byte_perm_S (w[ 4], w[ 3], selector); w[49] = __byte_perm_S (w[ 3], w[ 2], selector); w[48] = __byte_perm_S (w[ 2], w[ 1], selector); w[47] = __byte_perm_S (w[ 1], w[ 0], selector); w[46] = __byte_perm_S (w[ 0], 0, selector); w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 47: w[63] = __byte_perm_S (w[16], w[15], selector); w[62] = __byte_perm_S (w[15], w[14], selector); w[61] = __byte_perm_S (w[14], w[13], selector); w[60] = __byte_perm_S (w[13], w[12], selector); w[59] = __byte_perm_S (w[12], w[11], selector); w[58] = __byte_perm_S (w[11], w[10], selector); w[57] = __byte_perm_S (w[10], w[ 9], selector); w[56] = __byte_perm_S (w[ 9], w[ 8], selector); w[55] = __byte_perm_S (w[ 8], w[ 7], selector); w[54] = __byte_perm_S (w[ 7], w[ 6], selector); w[53] = __byte_perm_S (w[ 6], w[ 5], selector); w[52] = __byte_perm_S (w[ 5], w[ 4], selector); w[51] = __byte_perm_S (w[ 4], w[ 3], selector); w[50] = __byte_perm_S (w[ 3], w[ 2], selector); w[49] = __byte_perm_S (w[ 2], w[ 1], selector); w[48] = __byte_perm_S (w[ 1], w[ 0], selector); w[47] = __byte_perm_S (w[ 0], 0, selector); w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 48: w[63] = __byte_perm_S (w[15], w[14], selector); w[62] = __byte_perm_S (w[14], w[13], selector); w[61] = __byte_perm_S (w[13], w[12], selector); w[60] = __byte_perm_S (w[12], w[11], selector); w[59] = __byte_perm_S (w[11], w[10], selector); w[58] = __byte_perm_S (w[10], w[ 9], selector); w[57] = __byte_perm_S (w[ 9], w[ 8], selector); w[56] = __byte_perm_S (w[ 8], w[ 7], selector); w[55] = __byte_perm_S (w[ 7], w[ 6], selector); w[54] = __byte_perm_S (w[ 6], w[ 5], selector); w[53] = __byte_perm_S (w[ 5], w[ 4], selector); w[52] = __byte_perm_S (w[ 4], w[ 3], selector); w[51] = __byte_perm_S (w[ 3], w[ 2], selector); w[50] = __byte_perm_S (w[ 2], w[ 1], selector); w[49] = __byte_perm_S (w[ 1], w[ 0], selector); w[48] = __byte_perm_S (w[ 0], 0, selector); w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 49: w[63] = __byte_perm_S (w[14], w[13], selector); w[62] = __byte_perm_S (w[13], w[12], selector); w[61] = __byte_perm_S (w[12], w[11], selector); w[60] = __byte_perm_S (w[11], w[10], selector); w[59] = __byte_perm_S (w[10], w[ 9], selector); w[58] = __byte_perm_S (w[ 9], w[ 8], selector); w[57] = __byte_perm_S (w[ 8], w[ 7], selector); w[56] = __byte_perm_S (w[ 7], w[ 6], selector); w[55] = __byte_perm_S (w[ 6], w[ 5], selector); w[54] = __byte_perm_S (w[ 5], w[ 4], selector); w[53] = __byte_perm_S (w[ 4], w[ 3], selector); w[52] = __byte_perm_S (w[ 3], w[ 2], selector); w[51] = __byte_perm_S (w[ 2], w[ 1], selector); w[50] = __byte_perm_S (w[ 1], w[ 0], selector); w[49] = __byte_perm_S (w[ 0], 0, selector); w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 50: w[63] = __byte_perm_S (w[13], w[12], selector); w[62] = __byte_perm_S (w[12], w[11], selector); w[61] = __byte_perm_S (w[11], w[10], selector); w[60] = __byte_perm_S (w[10], w[ 9], selector); w[59] = __byte_perm_S (w[ 9], w[ 8], selector); w[58] = __byte_perm_S (w[ 8], w[ 7], selector); w[57] = __byte_perm_S (w[ 7], w[ 6], selector); w[56] = __byte_perm_S (w[ 6], w[ 5], selector); w[55] = __byte_perm_S (w[ 5], w[ 4], selector); w[54] = __byte_perm_S (w[ 4], w[ 3], selector); w[53] = __byte_perm_S (w[ 3], w[ 2], selector); w[52] = __byte_perm_S (w[ 2], w[ 1], selector); w[51] = __byte_perm_S (w[ 1], w[ 0], selector); w[50] = __byte_perm_S (w[ 0], 0, selector); w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 51: w[63] = __byte_perm_S (w[12], w[11], selector); w[62] = __byte_perm_S (w[11], w[10], selector); w[61] = __byte_perm_S (w[10], w[ 9], selector); w[60] = __byte_perm_S (w[ 9], w[ 8], selector); w[59] = __byte_perm_S (w[ 8], w[ 7], selector); w[58] = __byte_perm_S (w[ 7], w[ 6], selector); w[57] = __byte_perm_S (w[ 6], w[ 5], selector); w[56] = __byte_perm_S (w[ 5], w[ 4], selector); w[55] = __byte_perm_S (w[ 4], w[ 3], selector); w[54] = __byte_perm_S (w[ 3], w[ 2], selector); w[53] = __byte_perm_S (w[ 2], w[ 1], selector); w[52] = __byte_perm_S (w[ 1], w[ 0], selector); w[51] = __byte_perm_S (w[ 0], 0, selector); w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 52: w[63] = __byte_perm_S (w[11], w[10], selector); w[62] = __byte_perm_S (w[10], w[ 9], selector); w[61] = __byte_perm_S (w[ 9], w[ 8], selector); w[60] = __byte_perm_S (w[ 8], w[ 7], selector); w[59] = __byte_perm_S (w[ 7], w[ 6], selector); w[58] = __byte_perm_S (w[ 6], w[ 5], selector); w[57] = __byte_perm_S (w[ 5], w[ 4], selector); w[56] = __byte_perm_S (w[ 4], w[ 3], selector); w[55] = __byte_perm_S (w[ 3], w[ 2], selector); w[54] = __byte_perm_S (w[ 2], w[ 1], selector); w[53] = __byte_perm_S (w[ 1], w[ 0], selector); w[52] = __byte_perm_S (w[ 0], 0, selector); w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 53: w[63] = __byte_perm_S (w[10], w[ 9], selector); w[62] = __byte_perm_S (w[ 9], w[ 8], selector); w[61] = __byte_perm_S (w[ 8], w[ 7], selector); w[60] = __byte_perm_S (w[ 7], w[ 6], selector); w[59] = __byte_perm_S (w[ 6], w[ 5], selector); w[58] = __byte_perm_S (w[ 5], w[ 4], selector); w[57] = __byte_perm_S (w[ 4], w[ 3], selector); w[56] = __byte_perm_S (w[ 3], w[ 2], selector); w[55] = __byte_perm_S (w[ 2], w[ 1], selector); w[54] = __byte_perm_S (w[ 1], w[ 0], selector); w[53] = __byte_perm_S (w[ 0], 0, selector); w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 54: w[63] = __byte_perm_S (w[ 9], w[ 8], selector); w[62] = __byte_perm_S (w[ 8], w[ 7], selector); w[61] = __byte_perm_S (w[ 7], w[ 6], selector); w[60] = __byte_perm_S (w[ 6], w[ 5], selector); w[59] = __byte_perm_S (w[ 5], w[ 4], selector); w[58] = __byte_perm_S (w[ 4], w[ 3], selector); w[57] = __byte_perm_S (w[ 3], w[ 2], selector); w[56] = __byte_perm_S (w[ 2], w[ 1], selector); w[55] = __byte_perm_S (w[ 1], w[ 0], selector); w[54] = __byte_perm_S (w[ 0], 0, selector); w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 55: w[63] = __byte_perm_S (w[ 8], w[ 7], selector); w[62] = __byte_perm_S (w[ 7], w[ 6], selector); w[61] = __byte_perm_S (w[ 6], w[ 5], selector); w[60] = __byte_perm_S (w[ 5], w[ 4], selector); w[59] = __byte_perm_S (w[ 4], w[ 3], selector); w[58] = __byte_perm_S (w[ 3], w[ 2], selector); w[57] = __byte_perm_S (w[ 2], w[ 1], selector); w[56] = __byte_perm_S (w[ 1], w[ 0], selector); w[55] = __byte_perm_S (w[ 0], 0, selector); w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 56: w[63] = __byte_perm_S (w[ 7], w[ 6], selector); w[62] = __byte_perm_S (w[ 6], w[ 5], selector); w[61] = __byte_perm_S (w[ 5], w[ 4], selector); w[60] = __byte_perm_S (w[ 4], w[ 3], selector); w[59] = __byte_perm_S (w[ 3], w[ 2], selector); w[58] = __byte_perm_S (w[ 2], w[ 1], selector); w[57] = __byte_perm_S (w[ 1], w[ 0], selector); w[56] = __byte_perm_S (w[ 0], 0, selector); w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 57: w[63] = __byte_perm_S (w[ 6], w[ 5], selector); w[62] = __byte_perm_S (w[ 5], w[ 4], selector); w[61] = __byte_perm_S (w[ 4], w[ 3], selector); w[60] = __byte_perm_S (w[ 3], w[ 2], selector); w[59] = __byte_perm_S (w[ 2], w[ 1], selector); w[58] = __byte_perm_S (w[ 1], w[ 0], selector); w[57] = __byte_perm_S (w[ 0], 0, selector); w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 58: w[63] = __byte_perm_S (w[ 5], w[ 4], selector); w[62] = __byte_perm_S (w[ 4], w[ 3], selector); w[61] = __byte_perm_S (w[ 3], w[ 2], selector); w[60] = __byte_perm_S (w[ 2], w[ 1], selector); w[59] = __byte_perm_S (w[ 1], w[ 0], selector); w[58] = __byte_perm_S (w[ 0], 0, selector); w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 59: w[63] = __byte_perm_S (w[ 4], w[ 3], selector); w[62] = __byte_perm_S (w[ 3], w[ 2], selector); w[61] = __byte_perm_S (w[ 2], w[ 1], selector); w[60] = __byte_perm_S (w[ 1], w[ 0], selector); w[59] = __byte_perm_S (w[ 0], 0, selector); w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 60: w[63] = __byte_perm_S (w[ 3], w[ 2], selector); w[62] = __byte_perm_S (w[ 2], w[ 1], selector); w[61] = __byte_perm_S (w[ 1], w[ 0], selector); w[60] = __byte_perm_S (w[ 0], 0, selector); w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 61: w[63] = __byte_perm_S (w[ 2], w[ 1], selector); w[62] = __byte_perm_S (w[ 1], w[ 0], selector); w[61] = __byte_perm_S (w[ 0], 0, selector); w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 62: w[63] = __byte_perm_S (w[ 1], w[ 0], selector); w[62] = __byte_perm_S (w[ 0], 0, selector); w[61] = 0; w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; case 63: w[63] = __byte_perm_S (w[ 0], 0, selector); w[62] = 0; w[61] = 0; w[60] = 0; w[59] = 0; w[58] = 0; w[57] = 0; w[56] = 0; w[55] = 0; w[54] = 0; w[53] = 0; w[52] = 0; w[51] = 0; w[50] = 0; w[49] = 0; w[48] = 0; w[47] = 0; w[46] = 0; w[45] = 0; w[44] = 0; w[43] = 0; w[42] = 0; w[41] = 0; w[40] = 0; w[39] = 0; w[38] = 0; w[37] = 0; w[36] = 0; w[35] = 0; w[34] = 0; w[33] = 0; w[32] = 0; w[31] = 0; w[30] = 0; w[29] = 0; w[28] = 0; w[27] = 0; w[26] = 0; w[25] = 0; w[24] = 0; w[23] = 0; w[22] = 0; w[21] = 0; w[20] = 0; w[19] = 0; w[18] = 0; w[17] = 0; w[16] = 0; w[15] = 0; w[14] = 0; w[13] = 0; w[12] = 0; w[11] = 0; w[10] = 0; w[ 9] = 0; w[ 8] = 0; w[ 7] = 0; w[ 6] = 0; w[ 5] = 0; w[ 4] = 0; w[ 3] = 0; w[ 2] = 0; w[ 1] = 0; w[ 0] = 0; break; } #endif } /** * vector functions on scalar types (for inner loop usage) */ #define PACKVS2(sn,vn,e) \ sn[0] = vn[0].s##e; \ sn[1] = vn[1].s##e; #define PACKSV2(sn,vn,e) \ vn[0].s##e = sn[0]; \ vn[1].s##e = sn[1]; #define PACKVS24(s0,s1,v0,v1,e) \ PACKVS4 (s0, v0, e); \ PACKVS4 (s1, v1, e); #define PACKSV24(s0,s1,v0,v1,e) \ PACKSV4 (s0, v0, e); \ PACKSV4 (s1, v1, e); #define PACKVS4(sn,vn,e) \ sn[0] = vn[0].s##e; \ sn[1] = vn[1].s##e; \ sn[2] = vn[2].s##e; \ sn[3] = vn[3].s##e; #define PACKSV4(sn,vn,e) \ vn[0].s##e = sn[0]; \ vn[1].s##e = sn[1]; \ vn[2].s##e = sn[2]; \ vn[3].s##e = sn[3]; #define PACKVS44(s0,s1,s2,s3,v0,v1,v2,v3,e) \ PACKVS4 (s0, v0, e); \ PACKVS4 (s1, v1, e); \ PACKVS4 (s2, v2, e); \ PACKVS4 (s3, v3, e); #define PACKSV44(s0,s1,s2,s3,v0,v1,v2,v3,e) \ PACKSV4 (s0, v0, e); \ PACKSV4 (s1, v1, e); \ PACKSV4 (s2, v2, e); \ PACKSV4 (s3, v3, e); #define PACKVS84(s0,s1,s2,s3,s4,s5,s6,s7,v0,v1,v2,v3,v4,v5,v6,v7,e) \ PACKVS4 (s0, v0, e); \ PACKVS4 (s1, v1, e); \ PACKVS4 (s2, v2, e); \ PACKVS4 (s3, v3, e); \ PACKVS4 (s4, v4, e); \ PACKVS4 (s5, v5, e); \ PACKVS4 (s6, v6, e); \ PACKVS4 (s7, v7, e); #define PACKSV84(s0,s1,s2,s3,s4,s5,s6,s7,v0,v1,v2,v3,v4,v5,v6,v7,e) \ PACKSV4 (s0, v0, e); \ PACKSV4 (s1, v1, e); \ PACKSV4 (s2, v2, e); \ PACKSV4 (s3, v3, e); \ PACKSV4 (s4, v4, e); \ PACKSV4 (s5, v5, e); \ PACKSV4 (s6, v6, e); \ PACKSV4 (s7, v7, e); void switch_buffer_by_offset_le_VV (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32x offset) { #if VECT_SIZE == 1 switch_buffer_by_offset_le_S (w0, w1, w2, w3, offset); #else u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; #endif #if VECT_SIZE == 2 PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 0); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s0); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 0); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 1); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s1); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 1); #elif VECT_SIZE == 4 PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 0); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s0); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 0); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 1); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s1); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 1); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 2); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s2); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 2); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 3); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s3); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 3); #elif VECT_SIZE == 8 PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 0); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s0); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 0); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 1); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s1); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 1); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 2); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s2); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 2); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 3); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s3); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 3); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 4); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s4); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 4); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 5); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s5); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 5); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 6); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s6); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 6); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 7); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s7); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 7); #elif VECT_SIZE == 16 PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 0); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s0); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 0); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 1); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s1); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 1); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 2); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s2); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 2); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 3); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s3); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 3); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 4); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s4); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 4); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 5); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s5); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 5); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 6); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s6); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 6); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 7); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s7); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 7); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 8); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s8); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 8); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 9); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.s9); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 9); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, a); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.sa); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, a); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, b); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.sb); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, b); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, c); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.sc); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, c); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, d); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.sd); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, d); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, e); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.se); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, e); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, f); switch_buffer_by_offset_le_S (t0, t1, t2, t3, offset.sf); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, f); #endif } void switch_buffer_by_offset_8x4_le_VV (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 u32x offset) { #if VECT_SIZE == 1 switch_buffer_by_offset_8x4_le_S (w0, w1, w2, w3, w4, w5, w6, w7, offset); #else u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; u32 t4[4]; u32 t5[4]; u32 t6[4]; u32 t7[4]; #endif #if VECT_SIZE == 2 // 1 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 0); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s0); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 0); // 2 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 1); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s1); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 1); #elif VECT_SIZE == 4 // 1 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 0); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s0); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 0); // 2 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 1); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s1); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 1); // 3 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 2); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s2); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 2); // 4 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 3); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s3); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 3); #elif VECT_SIZE == 8 // 1 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 0); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s0); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 0); // 2 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 1); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s1); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 1); // 3 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 2); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s2); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 2); // 4 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 3); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s3); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 3); // 5 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 4); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s4); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 4); // 6 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 5); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s5); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 5); // 7 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 6); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s6); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 6); // 8 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 7); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s7); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 7); #elif VECT_SIZE == 16 // 1 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 0); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s0); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 0); // 2 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 1); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s1); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 1); // 3 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 2); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s2); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 2); // 4 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 3); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s3); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 3); // 5 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 4); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s4); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 4); // 6 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 5); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s5); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 5); // 7 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 6); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s6); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 6); // 8 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 7); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s7); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 7); // 9 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 8); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s8); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 8); // 10 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 9); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.s9); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, 9); // 11 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, a); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.sa); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, a); // 12 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, b); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.sb); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, b); // 13 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, c); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.sc); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, c); // 14 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, d); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.sd); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, d); // 15 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, e); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.se); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, e); // 16 PACKVS84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, f); switch_buffer_by_offset_8x4_le_S (t0, t1, t2, t3, t4, t5, t6, t7, offset.sf); PACKSV84 (t0, t1, t2, t3, t4, t5, t6, t7, w0, w1, w2, w3, w4, w5, w6, w7, f); #endif } void append_0x01_2x4_VV (u32x w0[4], u32x w1[4], const u32x offset) { #if VECT_SIZE == 1 append_0x01_2x4_S (w0, w1, offset); #else u32 t0[4]; u32 t1[4]; #endif #if VECT_SIZE == 2 PACKVS24 (t0, t1, w0, w1, 0); append_0x01_2x4_S (t0, t1, offset.s0); PACKSV24 (t0, t1, w0, w1, 0); PACKVS24 (t0, t1, w0, w1, 1); append_0x01_2x4_S (t0, t1, offset.s1); PACKSV24 (t0, t1, w0, w1, 1); #elif VECT_SIZE == 4 PACKVS24 (t0, t1, w0, w1, 0); append_0x01_2x4_S (t0, t1, offset.s0); PACKSV24 (t0, t1, w0, w1, 0); PACKVS24 (t0, t1, w0, w1, 1); append_0x01_2x4_S (t0, t1, offset.s1); PACKSV24 (t0, t1, w0, w1, 1); PACKVS24 (t0, t1, w0, w1, 2); append_0x01_2x4_S (t0, t1, offset.s2); PACKSV24 (t0, t1, w0, w1, 2); PACKVS24 (t0, t1, w0, w1, 3); append_0x01_2x4_S (t0, t1, offset.s3); PACKSV24 (t0, t1, w0, w1, 3); #elif VECT_SIZE == 8 PACKVS24 (t0, t1, w0, w1, 0); append_0x01_2x4_S (t0, t1, offset.s0); PACKSV24 (t0, t1, w0, w1, 0); PACKVS24 (t0, t1, w0, w1, 1); append_0x01_2x4_S (t0, t1, offset.s1); PACKSV24 (t0, t1, w0, w1, 1); PACKVS24 (t0, t1, w0, w1, 2); append_0x01_2x4_S (t0, t1, offset.s2); PACKSV24 (t0, t1, w0, w1, 2); PACKVS24 (t0, t1, w0, w1, 3); append_0x01_2x4_S (t0, t1, offset.s3); PACKSV24 (t0, t1, w0, w1, 3); PACKVS24 (t0, t1, w0, w1, 4); append_0x01_2x4_S (t0, t1, offset.s4); PACKSV24 (t0, t1, w0, w1, 4); PACKVS24 (t0, t1, w0, w1, 5); append_0x01_2x4_S (t0, t1, offset.s5); PACKSV24 (t0, t1, w0, w1, 5); PACKVS24 (t0, t1, w0, w1, 6); append_0x01_2x4_S (t0, t1, offset.s6); PACKSV24 (t0, t1, w0, w1, 6); PACKVS24 (t0, t1, w0, w1, 7); append_0x01_2x4_S (t0, t1, offset.s7); PACKSV24 (t0, t1, w0, w1, 7); #elif VECT_SIZE == 16 PACKVS24 (t0, t1, w0, w1, 0); append_0x01_2x4_S (t0, t1, offset.s0); PACKSV24 (t0, t1, w0, w1, 0); PACKVS24 (t0, t1, w0, w1, 1); append_0x01_2x4_S (t0, t1, offset.s1); PACKSV24 (t0, t1, w0, w1, 1); PACKVS24 (t0, t1, w0, w1, 2); append_0x01_2x4_S (t0, t1, offset.s2); PACKSV24 (t0, t1, w0, w1, 2); PACKVS24 (t0, t1, w0, w1, 3); append_0x01_2x4_S (t0, t1, offset.s3); PACKSV24 (t0, t1, w0, w1, 3); PACKVS24 (t0, t1, w0, w1, 4); append_0x01_2x4_S (t0, t1, offset.s4); PACKSV24 (t0, t1, w0, w1, 4); PACKVS24 (t0, t1, w0, w1, 5); append_0x01_2x4_S (t0, t1, offset.s5); PACKSV24 (t0, t1, w0, w1, 5); PACKVS24 (t0, t1, w0, w1, 6); append_0x01_2x4_S (t0, t1, offset.s6); PACKSV24 (t0, t1, w0, w1, 6); PACKVS24 (t0, t1, w0, w1, 7); append_0x01_2x4_S (t0, t1, offset.s7); PACKSV24 (t0, t1, w0, w1, 7); PACKVS24 (t0, t1, w0, w1, 8); append_0x01_2x4_S (t0, t1, offset.s8); PACKSV24 (t0, t1, w0, w1, 8); PACKVS24 (t0, t1, w0, w1, 9); append_0x01_2x4_S (t0, t1, offset.s9); PACKSV24 (t0, t1, w0, w1, 9); PACKVS24 (t0, t1, w0, w1, a); append_0x01_2x4_S (t0, t1, offset.sa); PACKSV24 (t0, t1, w0, w1, a); PACKVS24 (t0, t1, w0, w1, b); append_0x01_2x4_S (t0, t1, offset.sb); PACKSV24 (t0, t1, w0, w1, b); PACKVS24 (t0, t1, w0, w1, c); append_0x01_2x4_S (t0, t1, offset.sc); PACKSV24 (t0, t1, w0, w1, c); PACKVS24 (t0, t1, w0, w1, d); append_0x01_2x4_S (t0, t1, offset.sd); PACKSV24 (t0, t1, w0, w1, d); PACKVS24 (t0, t1, w0, w1, e); append_0x01_2x4_S (t0, t1, offset.se); PACKSV24 (t0, t1, w0, w1, e); PACKVS24 (t0, t1, w0, w1, f); append_0x01_2x4_S (t0, t1, offset.sf); PACKSV24 (t0, t1, w0, w1, f); #endif } void append_0x80_2x4_VV (u32x w0[4], u32x w1[4], const u32x offset) { #if VECT_SIZE == 1 append_0x80_2x4_S (w0, w1, offset); #else u32 t0[4]; u32 t1[4]; #endif #if VECT_SIZE == 2 PACKVS24 (t0, t1, w0, w1, 0); append_0x80_2x4_S (t0, t1, offset.s0); PACKSV24 (t0, t1, w0, w1, 0); PACKVS24 (t0, t1, w0, w1, 1); append_0x80_2x4_S (t0, t1, offset.s1); PACKSV24 (t0, t1, w0, w1, 1); #elif VECT_SIZE == 4 PACKVS24 (t0, t1, w0, w1, 0); append_0x80_2x4_S (t0, t1, offset.s0); PACKSV24 (t0, t1, w0, w1, 0); PACKVS24 (t0, t1, w0, w1, 1); append_0x80_2x4_S (t0, t1, offset.s1); PACKSV24 (t0, t1, w0, w1, 1); PACKVS24 (t0, t1, w0, w1, 2); append_0x80_2x4_S (t0, t1, offset.s2); PACKSV24 (t0, t1, w0, w1, 2); PACKVS24 (t0, t1, w0, w1, 3); append_0x80_2x4_S (t0, t1, offset.s3); PACKSV24 (t0, t1, w0, w1, 3); #elif VECT_SIZE == 8 PACKVS24 (t0, t1, w0, w1, 0); append_0x80_2x4_S (t0, t1, offset.s0); PACKSV24 (t0, t1, w0, w1, 0); PACKVS24 (t0, t1, w0, w1, 1); append_0x80_2x4_S (t0, t1, offset.s1); PACKSV24 (t0, t1, w0, w1, 1); PACKVS24 (t0, t1, w0, w1, 2); append_0x80_2x4_S (t0, t1, offset.s2); PACKSV24 (t0, t1, w0, w1, 2); PACKVS24 (t0, t1, w0, w1, 3); append_0x80_2x4_S (t0, t1, offset.s3); PACKSV24 (t0, t1, w0, w1, 3); PACKVS24 (t0, t1, w0, w1, 4); append_0x80_2x4_S (t0, t1, offset.s4); PACKSV24 (t0, t1, w0, w1, 4); PACKVS24 (t0, t1, w0, w1, 5); append_0x80_2x4_S (t0, t1, offset.s5); PACKSV24 (t0, t1, w0, w1, 5); PACKVS24 (t0, t1, w0, w1, 6); append_0x80_2x4_S (t0, t1, offset.s6); PACKSV24 (t0, t1, w0, w1, 6); PACKVS24 (t0, t1, w0, w1, 7); append_0x80_2x4_S (t0, t1, offset.s7); PACKSV24 (t0, t1, w0, w1, 7); #elif VECT_SIZE == 16 PACKVS24 (t0, t1, w0, w1, 0); append_0x80_2x4_S (t0, t1, offset.s0); PACKSV24 (t0, t1, w0, w1, 0); PACKVS24 (t0, t1, w0, w1, 1); append_0x80_2x4_S (t0, t1, offset.s1); PACKSV24 (t0, t1, w0, w1, 1); PACKVS24 (t0, t1, w0, w1, 2); append_0x80_2x4_S (t0, t1, offset.s2); PACKSV24 (t0, t1, w0, w1, 2); PACKVS24 (t0, t1, w0, w1, 3); append_0x80_2x4_S (t0, t1, offset.s3); PACKSV24 (t0, t1, w0, w1, 3); PACKVS24 (t0, t1, w0, w1, 4); append_0x80_2x4_S (t0, t1, offset.s4); PACKSV24 (t0, t1, w0, w1, 4); PACKVS24 (t0, t1, w0, w1, 5); append_0x80_2x4_S (t0, t1, offset.s5); PACKSV24 (t0, t1, w0, w1, 5); PACKVS24 (t0, t1, w0, w1, 6); append_0x80_2x4_S (t0, t1, offset.s6); PACKSV24 (t0, t1, w0, w1, 6); PACKVS24 (t0, t1, w0, w1, 7); append_0x80_2x4_S (t0, t1, offset.s7); PACKSV24 (t0, t1, w0, w1, 7); PACKVS24 (t0, t1, w0, w1, 8); append_0x80_2x4_S (t0, t1, offset.s8); PACKSV24 (t0, t1, w0, w1, 8); PACKVS24 (t0, t1, w0, w1, 9); append_0x80_2x4_S (t0, t1, offset.s9); PACKSV24 (t0, t1, w0, w1, 9); PACKVS24 (t0, t1, w0, w1, a); append_0x80_2x4_S (t0, t1, offset.sa); PACKSV24 (t0, t1, w0, w1, a); PACKVS24 (t0, t1, w0, w1, b); append_0x80_2x4_S (t0, t1, offset.sb); PACKSV24 (t0, t1, w0, w1, b); PACKVS24 (t0, t1, w0, w1, c); append_0x80_2x4_S (t0, t1, offset.sc); PACKSV24 (t0, t1, w0, w1, c); PACKVS24 (t0, t1, w0, w1, d); append_0x80_2x4_S (t0, t1, offset.sd); PACKSV24 (t0, t1, w0, w1, d); PACKVS24 (t0, t1, w0, w1, e); append_0x80_2x4_S (t0, t1, offset.se); PACKSV24 (t0, t1, w0, w1, e); PACKVS24 (t0, t1, w0, w1, f); append_0x80_2x4_S (t0, t1, offset.sf); PACKSV24 (t0, t1, w0, w1, f); #endif } void append_0x80_4x4_VV (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32x offset) { #if VECT_SIZE == 1 append_0x80_4x4_S (w0, w1, w2, w3, offset); #else u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; #endif #if VECT_SIZE == 2 PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 0); append_0x80_4x4_S (t0, t1, t2, t3, offset.s0); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 0); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 1); append_0x80_4x4_S (t0, t1, t2, t3, offset.s1); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 1); #elif VECT_SIZE == 4 PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 0); append_0x80_4x4_S (t0, t1, t2, t3, offset.s0); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 0); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 1); append_0x80_4x4_S (t0, t1, t2, t3, offset.s1); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 1); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 2); append_0x80_4x4_S (t0, t1, t2, t3, offset.s2); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 2); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 3); append_0x80_4x4_S (t0, t1, t2, t3, offset.s3); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 3); #elif VECT_SIZE == 8 PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 0); append_0x80_4x4_S (t0, t1, t2, t3, offset.s0); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 0); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 1); append_0x80_4x4_S (t0, t1, t2, t3, offset.s1); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 1); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 2); append_0x80_4x4_S (t0, t1, t2, t3, offset.s2); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 2); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 3); append_0x80_4x4_S (t0, t1, t2, t3, offset.s3); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 3); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 4); append_0x80_4x4_S (t0, t1, t2, t3, offset.s4); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 4); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 5); append_0x80_4x4_S (t0, t1, t2, t3, offset.s5); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 5); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 6); append_0x80_4x4_S (t0, t1, t2, t3, offset.s6); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 6); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 7); append_0x80_4x4_S (t0, t1, t2, t3, offset.s7); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 7); #elif VECT_SIZE == 16 PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 0); append_0x80_4x4_S (t0, t1, t2, t3, offset.s0); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 0); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 1); append_0x80_4x4_S (t0, t1, t2, t3, offset.s1); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 1); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 2); append_0x80_4x4_S (t0, t1, t2, t3, offset.s2); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 2); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 3); append_0x80_4x4_S (t0, t1, t2, t3, offset.s3); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 3); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 4); append_0x80_4x4_S (t0, t1, t2, t3, offset.s4); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 4); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 5); append_0x80_4x4_S (t0, t1, t2, t3, offset.s5); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 5); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 6); append_0x80_4x4_S (t0, t1, t2, t3, offset.s6); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 6); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 7); append_0x80_4x4_S (t0, t1, t2, t3, offset.s7); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 7); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 8); append_0x80_4x4_S (t0, t1, t2, t3, offset.s8); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 8); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, 9); append_0x80_4x4_S (t0, t1, t2, t3, offset.s9); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, 9); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, a); append_0x80_4x4_S (t0, t1, t2, t3, offset.sa); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, a); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, b); append_0x80_4x4_S (t0, t1, t2, t3, offset.sb); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, b); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, c); append_0x80_4x4_S (t0, t1, t2, t3, offset.sc); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, c); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, d); append_0x80_4x4_S (t0, t1, t2, t3, offset.sd); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, d); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, e); append_0x80_4x4_S (t0, t1, t2, t3, offset.se); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, e); PACKVS44 (t0, t1, t2, t3, w0, w1, w2, w3, f); append_0x80_4x4_S (t0, t1, t2, t3, offset.sf); PACKSV44 (t0, t1, t2, t3, w0, w1, w2, w3, f); #endif } __kernel void gpu_memset (__global uint4 *buf, const u32 value, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; buf[gid] = (uint4) (value); } hashcat-4.0.1/OpenCL/inc_comp_multi.cl000066400000000000000000000014511320027462700175740ustar00rootroot00000000000000u32 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 digest_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); if (digest_pos != -1) { const u32 final_hash_pos = digests_offset + digest_pos; if (atomic_inc (&hashes_shown[final_hash_pos]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos); } } } hashcat-4.0.1/OpenCL/inc_comp_multi_bs.cl000066400000000000000000000015521320027462700202620ustar00rootroot00000000000000u32 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 digest_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); if (digest_pos != -1) { if ((il_pos + slice) < il_cnt) { const u32 final_hash_pos = digests_offset + digest_pos; if (atomic_inc (&hashes_shown[final_hash_pos]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + slice); } } } } hashcat-4.0.1/OpenCL/inc_comp_single.cl000066400000000000000000000004571320027462700177300ustar00rootroot00000000000000if ((r0 == search[0]) && (r1 == search[1]) && (r2 == search[2]) && (r3 == search[3])) { const u32 final_hash_pos = digests_offset + 0; if (atomic_inc (&hashes_shown[final_hash_pos]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos); } } hashcat-4.0.1/OpenCL/inc_comp_single_bs.cl000066400000000000000000000003761320027462700204140ustar00rootroot00000000000000 if ((il_pos + slice) < il_cnt) { const u32 final_hash_pos = digests_offset + 0; if (atomic_inc (&hashes_shown[final_hash_pos]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + slice); } } hashcat-4.0.1/OpenCL/inc_hash_constants.h000066400000000000000000000334051320027462700203000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ typedef enum siphash_constants { SIPHASHM_0=0x736f6d6570736575, SIPHASHM_1=0x646f72616e646f6d, SIPHASHM_2=0x6c7967656e657261, SIPHASHM_3=0x7465646279746573 } siphash_constants_t; typedef enum bcrypt_constants { BCRYPTM_0=0x4F727068, BCRYPTM_1=0x65616E42, BCRYPTM_2=0x65686F6C, BCRYPTM_3=0x64657253, BCRYPTM_4=0x63727944, BCRYPTM_5=0x6F756274u } bcrypt_constants_t; typedef enum md4_constants { MD4M_A=0x67452301, MD4M_B=0xefcdab89, MD4M_C=0x98badcfe, MD4M_D=0x10325476, MD4S00=3, MD4S01=7, MD4S02=11, MD4S03=19, MD4S10=3, MD4S11=5, MD4S12=9, MD4S13=13, MD4S20=3, MD4S21=9, MD4S22=11, MD4S23=15, MD4C00=0x00000000, MD4C01=0x5a827999, MD4C02=0x6ed9eba1u } md4_constants_t; typedef enum md5_constants { MD5M_A=0x67452301, MD5M_B=0xefcdab89, MD5M_C=0x98badcfe, MD5M_D=0x10325476, MD5S00=7, MD5S01=12, MD5S02=17, MD5S03=22, MD5S10=5, MD5S11=9, MD5S12=14, MD5S13=20, MD5S20=4, MD5S21=11, MD5S22=16, MD5S23=23, MD5S30=6, MD5S31=10, MD5S32=15, MD5S33=21, MD5C00=0xd76aa478, MD5C01=0xe8c7b756, MD5C02=0x242070db, MD5C03=0xc1bdceee, MD5C04=0xf57c0faf, MD5C05=0x4787c62a, MD5C06=0xa8304613, MD5C07=0xfd469501, MD5C08=0x698098d8, MD5C09=0x8b44f7af, MD5C0a=0xffff5bb1, MD5C0b=0x895cd7be, MD5C0c=0x6b901122, MD5C0d=0xfd987193, MD5C0e=0xa679438e, MD5C0f=0x49b40821, MD5C10=0xf61e2562, MD5C11=0xc040b340, MD5C12=0x265e5a51, MD5C13=0xe9b6c7aa, MD5C14=0xd62f105d, MD5C15=0x02441453, MD5C16=0xd8a1e681, MD5C17=0xe7d3fbc8, MD5C18=0x21e1cde6, MD5C19=0xc33707d6, MD5C1a=0xf4d50d87, MD5C1b=0x455a14ed, MD5C1c=0xa9e3e905, MD5C1d=0xfcefa3f8, MD5C1e=0x676f02d9, MD5C1f=0x8d2a4c8a, MD5C20=0xfffa3942, MD5C21=0x8771f681, MD5C22=0x6d9d6122, MD5C23=0xfde5380c, MD5C24=0xa4beea44, MD5C25=0x4bdecfa9, MD5C26=0xf6bb4b60, MD5C27=0xbebfbc70, MD5C28=0x289b7ec6, MD5C29=0xeaa127fa, MD5C2a=0xd4ef3085, MD5C2b=0x04881d05, MD5C2c=0xd9d4d039, MD5C2d=0xe6db99e5, MD5C2e=0x1fa27cf8, MD5C2f=0xc4ac5665, MD5C30=0xf4292244, MD5C31=0x432aff97, MD5C32=0xab9423a7, MD5C33=0xfc93a039, MD5C34=0x655b59c3, MD5C35=0x8f0ccc92, MD5C36=0xffeff47d, MD5C37=0x85845dd1, MD5C38=0x6fa87e4f, MD5C39=0xfe2ce6e0, MD5C3a=0xa3014314, MD5C3b=0x4e0811a1, MD5C3c=0xf7537e82, MD5C3d=0xbd3af235, MD5C3e=0x2ad7d2bb, MD5C3f=0xeb86d391u } md5_constants_t; typedef enum sha1_constants { SHA1M_A=0x67452301, SHA1M_B=0xefcdab89, SHA1M_C=0x98badcfe, SHA1M_D=0x10325476, SHA1M_E=0xc3d2e1f0, SHA1C00=0x5a827999, SHA1C01=0x6ed9eba1, SHA1C02=0x8f1bbcdc, SHA1C03=0xca62c1d6u } sha1_constants_t; typedef enum sha2_32_constants { // SHA-224 Initial Hash Values SHA224M_A=0xc1059ed8, SHA224M_B=0x367cd507, SHA224M_C=0x3070dd17, SHA224M_D=0xf70e5939, SHA224M_E=0xffc00b31, SHA224M_F=0x68581511, SHA224M_G=0x64f98fa7, SHA224M_H=0xbefa4fa4, // SHA-256 Initial Hash Values SHA256M_A=0x6a09e667, SHA256M_B=0xbb67ae85, SHA256M_C=0x3c6ef372, SHA256M_D=0xa54ff53a, SHA256M_E=0x510e527f, SHA256M_F=0x9b05688c, SHA256M_G=0x1f83d9ab, SHA256M_H=0x5be0cd19, // SHA-224/256 Constants SHA256C00=0x428a2f98, SHA256C01=0x71374491, SHA256C02=0xb5c0fbcf, SHA256C03=0xe9b5dba5, SHA256C04=0x3956c25b, SHA256C05=0x59f111f1, SHA256C06=0x923f82a4, SHA256C07=0xab1c5ed5, SHA256C08=0xd807aa98, SHA256C09=0x12835b01, SHA256C0a=0x243185be, SHA256C0b=0x550c7dc3, SHA256C0c=0x72be5d74, SHA256C0d=0x80deb1fe, SHA256C0e=0x9bdc06a7, SHA256C0f=0xc19bf174, SHA256C10=0xe49b69c1, SHA256C11=0xefbe4786, SHA256C12=0x0fc19dc6, SHA256C13=0x240ca1cc, SHA256C14=0x2de92c6f, SHA256C15=0x4a7484aa, SHA256C16=0x5cb0a9dc, SHA256C17=0x76f988da, SHA256C18=0x983e5152, SHA256C19=0xa831c66d, SHA256C1a=0xb00327c8, SHA256C1b=0xbf597fc7, SHA256C1c=0xc6e00bf3, SHA256C1d=0xd5a79147, SHA256C1e=0x06ca6351, SHA256C1f=0x14292967, SHA256C20=0x27b70a85, SHA256C21=0x2e1b2138, SHA256C22=0x4d2c6dfc, SHA256C23=0x53380d13, SHA256C24=0x650a7354, SHA256C25=0x766a0abb, SHA256C26=0x81c2c92e, SHA256C27=0x92722c85, SHA256C28=0xa2bfe8a1, SHA256C29=0xa81a664b, SHA256C2a=0xc24b8b70, SHA256C2b=0xc76c51a3, SHA256C2c=0xd192e819, SHA256C2d=0xd6990624, SHA256C2e=0xf40e3585, SHA256C2f=0x106aa070, SHA256C30=0x19a4c116, SHA256C31=0x1e376c08, SHA256C32=0x2748774c, SHA256C33=0x34b0bcb5, SHA256C34=0x391c0cb3, SHA256C35=0x4ed8aa4a, SHA256C36=0x5b9cca4f, SHA256C37=0x682e6ff3, SHA256C38=0x748f82ee, SHA256C39=0x78a5636f, SHA256C3a=0x84c87814, SHA256C3b=0x8cc70208, SHA256C3c=0x90befffa, SHA256C3d=0xa4506ceb, SHA256C3e=0xbef9a3f7, SHA256C3f=0xc67178f2 } sha2_32_constants_t; typedef enum sha2_64_constants { // SHA-384 Initial Hash Values SHA384M_A=0xcbbb9d5dc1059ed8, SHA384M_B=0x629a292a367cd507, SHA384M_C=0x9159015a3070dd17, SHA384M_D=0x152fecd8f70e5939, SHA384M_E=0x67332667ffc00b31, SHA384M_F=0x8eb44a8768581511, SHA384M_G=0xdb0c2e0d64f98fa7, SHA384M_H=0x47b5481dbefa4fa4, // SHA-512 Initial Hash Values SHA512M_A=0x6a09e667f3bcc908, SHA512M_B=0xbb67ae8584caa73b, SHA512M_C=0x3c6ef372fe94f82b, SHA512M_D=0xa54ff53a5f1d36f1, SHA512M_E=0x510e527fade682d1, SHA512M_F=0x9b05688c2b3e6c1f, SHA512M_G=0x1f83d9abfb41bd6b, SHA512M_H=0x5be0cd19137e2179, // SHA-384/512 Constants SHA512C00=0x428a2f98d728ae22, SHA512C01=0x7137449123ef65cd, SHA512C02=0xb5c0fbcfec4d3b2f, SHA512C03=0xe9b5dba58189dbbc, SHA512C04=0x3956c25bf348b538, SHA512C05=0x59f111f1b605d019, SHA512C06=0x923f82a4af194f9b, SHA512C07=0xab1c5ed5da6d8118, SHA512C08=0xd807aa98a3030242, SHA512C09=0x12835b0145706fbe, SHA512C0a=0x243185be4ee4b28c, SHA512C0b=0x550c7dc3d5ffb4e2, SHA512C0c=0x72be5d74f27b896f, SHA512C0d=0x80deb1fe3b1696b1, SHA512C0e=0x9bdc06a725c71235, SHA512C0f=0xc19bf174cf692694, SHA512C10=0xe49b69c19ef14ad2, SHA512C11=0xefbe4786384f25e3, SHA512C12=0x0fc19dc68b8cd5b5, SHA512C13=0x240ca1cc77ac9c65, SHA512C14=0x2de92c6f592b0275, SHA512C15=0x4a7484aa6ea6e483, SHA512C16=0x5cb0a9dcbd41fbd4, SHA512C17=0x76f988da831153b5, SHA512C18=0x983e5152ee66dfab, SHA512C19=0xa831c66d2db43210, SHA512C1a=0xb00327c898fb213f, SHA512C1b=0xbf597fc7beef0ee4, SHA512C1c=0xc6e00bf33da88fc2, SHA512C1d=0xd5a79147930aa725, SHA512C1e=0x06ca6351e003826f, SHA512C1f=0x142929670a0e6e70, SHA512C20=0x27b70a8546d22ffc, SHA512C21=0x2e1b21385c26c926, SHA512C22=0x4d2c6dfc5ac42aed, SHA512C23=0x53380d139d95b3df, SHA512C24=0x650a73548baf63de, SHA512C25=0x766a0abb3c77b2a8, SHA512C26=0x81c2c92e47edaee6, SHA512C27=0x92722c851482353b, SHA512C28=0xa2bfe8a14cf10364, SHA512C29=0xa81a664bbc423001, SHA512C2a=0xc24b8b70d0f89791, SHA512C2b=0xc76c51a30654be30, SHA512C2c=0xd192e819d6ef5218, SHA512C2d=0xd69906245565a910, SHA512C2e=0xf40e35855771202a, SHA512C2f=0x106aa07032bbd1b8, SHA512C30=0x19a4c116b8d2d0c8, SHA512C31=0x1e376c085141ab53, SHA512C32=0x2748774cdf8eeb99, SHA512C33=0x34b0bcb5e19b48a8, SHA512C34=0x391c0cb3c5c95a63, SHA512C35=0x4ed8aa4ae3418acb, SHA512C36=0x5b9cca4f7763e373, SHA512C37=0x682e6ff3d6b2b8a3, SHA512C38=0x748f82ee5defb2fc, SHA512C39=0x78a5636f43172f60, SHA512C3a=0x84c87814a1f0ab72, SHA512C3b=0x8cc702081a6439ec, SHA512C3c=0x90befffa23631e28, SHA512C3d=0xa4506cebde82bde9, SHA512C3e=0xbef9a3f7b2c67915, SHA512C3f=0xc67178f2e372532b, SHA512C40=0xca273eceea26619c, SHA512C41=0xd186b8c721c0c207, SHA512C42=0xeada7dd6cde0eb1e, SHA512C43=0xf57d4f7fee6ed178, SHA512C44=0x06f067aa72176fba, SHA512C45=0x0a637dc5a2c898a6, SHA512C46=0x113f9804bef90dae, SHA512C47=0x1b710b35131c471b, SHA512C48=0x28db77f523047d84, SHA512C49=0x32caab7b40c72493, SHA512C4a=0x3c9ebe0a15c9bebc, SHA512C4b=0x431d67c49c100d4c, SHA512C4c=0x4cc5d4becb3e42b6, SHA512C4d=0x597f299cfc657e2a, SHA512C4e=0x5fcb6fab3ad6faec, SHA512C4f=0x6c44198c4a475817 } sha2_64_constants_t; typedef enum ripemd160_constants { RIPEMD160M_A=0x67452301, RIPEMD160M_B=0xefcdab89, RIPEMD160M_C=0x98badcfe, RIPEMD160M_D=0x10325476, RIPEMD160M_E=0xc3d2e1f0, RIPEMD160C00=0x00000000, RIPEMD160C10=0x5a827999, RIPEMD160C20=0x6ed9eba1, RIPEMD160C30=0x8f1bbcdc, RIPEMD160C40=0xa953fd4e, RIPEMD160C50=0x50a28be6, RIPEMD160C60=0x5c4dd124, RIPEMD160C70=0x6d703ef3, RIPEMD160C80=0x7a6d76e9, RIPEMD160C90=0x00000000, RIPEMD160S00=11, RIPEMD160S01=14, RIPEMD160S02=15, RIPEMD160S03=12, RIPEMD160S04=5, RIPEMD160S05=8, RIPEMD160S06=7, RIPEMD160S07=9, RIPEMD160S08=11, RIPEMD160S09=13, RIPEMD160S0A=14, RIPEMD160S0B=15, RIPEMD160S0C=6, RIPEMD160S0D=7, RIPEMD160S0E=9, RIPEMD160S0F=8, RIPEMD160S10=7, RIPEMD160S11=6, RIPEMD160S12=8, RIPEMD160S13=13, RIPEMD160S14=11, RIPEMD160S15=9, RIPEMD160S16=7, RIPEMD160S17=15, RIPEMD160S18=7, RIPEMD160S19=12, RIPEMD160S1A=15, RIPEMD160S1B=9, RIPEMD160S1C=11, RIPEMD160S1D=7, RIPEMD160S1E=13, RIPEMD160S1F=12, RIPEMD160S20=11, RIPEMD160S21=13, RIPEMD160S22=6, RIPEMD160S23=7, RIPEMD160S24=14, RIPEMD160S25=9, RIPEMD160S26=13, RIPEMD160S27=15, RIPEMD160S28=14, RIPEMD160S29=8, RIPEMD160S2A=13, RIPEMD160S2B=6, RIPEMD160S2C=5, RIPEMD160S2D=12, RIPEMD160S2E=7, RIPEMD160S2F=5, RIPEMD160S30=11, RIPEMD160S31=12, RIPEMD160S32=14, RIPEMD160S33=15, RIPEMD160S34=14, RIPEMD160S35=15, RIPEMD160S36=9, RIPEMD160S37=8, RIPEMD160S38=9, RIPEMD160S39=14, RIPEMD160S3A=5, RIPEMD160S3B=6, RIPEMD160S3C=8, RIPEMD160S3D=6, RIPEMD160S3E=5, RIPEMD160S3F=12, RIPEMD160S40=9, RIPEMD160S41=15, RIPEMD160S42=5, RIPEMD160S43=11, RIPEMD160S44=6, RIPEMD160S45=8, RIPEMD160S46=13, RIPEMD160S47=12, RIPEMD160S48=5, RIPEMD160S49=12, RIPEMD160S4A=13, RIPEMD160S4B=14, RIPEMD160S4C=11, RIPEMD160S4D=8, RIPEMD160S4E=5, RIPEMD160S4F=6, RIPEMD160S50=8, RIPEMD160S51=9, RIPEMD160S52=9, RIPEMD160S53=11, RIPEMD160S54=13, RIPEMD160S55=15, RIPEMD160S56=15, RIPEMD160S57=5, RIPEMD160S58=7, RIPEMD160S59=7, RIPEMD160S5A=8, RIPEMD160S5B=11, RIPEMD160S5C=14, RIPEMD160S5D=14, RIPEMD160S5E=12, RIPEMD160S5F=6, RIPEMD160S60=9, RIPEMD160S61=13, RIPEMD160S62=15, RIPEMD160S63=7, RIPEMD160S64=12, RIPEMD160S65=8, RIPEMD160S66=9, RIPEMD160S67=11, RIPEMD160S68=7, RIPEMD160S69=7, RIPEMD160S6A=12, RIPEMD160S6B=7, RIPEMD160S6C=6, RIPEMD160S6D=15, RIPEMD160S6E=13, RIPEMD160S6F=11, RIPEMD160S70=9, RIPEMD160S71=7, RIPEMD160S72=15, RIPEMD160S73=11, RIPEMD160S74=8, RIPEMD160S75=6, RIPEMD160S76=6, RIPEMD160S77=14, RIPEMD160S78=12, RIPEMD160S79=13, RIPEMD160S7A=5, RIPEMD160S7B=14, RIPEMD160S7C=13, RIPEMD160S7D=13, RIPEMD160S7E=7, RIPEMD160S7F=5, RIPEMD160S80=15, RIPEMD160S81=5, RIPEMD160S82=8, RIPEMD160S83=11, RIPEMD160S84=14, RIPEMD160S85=14, RIPEMD160S86=6, RIPEMD160S87=14, RIPEMD160S88=6, RIPEMD160S89=9, RIPEMD160S8A=12, RIPEMD160S8B=9, RIPEMD160S8C=12, RIPEMD160S8D=5, RIPEMD160S8E=15, RIPEMD160S8F=8, RIPEMD160S90=8, RIPEMD160S91=5, RIPEMD160S92=12, RIPEMD160S93=9, RIPEMD160S94=12, RIPEMD160S95=5, RIPEMD160S96=14, RIPEMD160S97=6, RIPEMD160S98=8, RIPEMD160S99=13, RIPEMD160S9A=6, RIPEMD160S9B=5, RIPEMD160S9C=15, RIPEMD160S9D=13, RIPEMD160S9E=11, RIPEMD160S9F=11u } ripemd160_constants_t; typedef enum keccak_constants { KECCAK_RNDC_00=0x0000000000000001, KECCAK_RNDC_01=0x0000000000008082, KECCAK_RNDC_02=0x000000000000808a, KECCAK_RNDC_03=0x0000000080008000, KECCAK_RNDC_04=0x000000000000808b, KECCAK_RNDC_05=0x0000000080000001, KECCAK_RNDC_06=0x0000000080008081, KECCAK_RNDC_07=0x0000000000008009, KECCAK_RNDC_08=0x000000000000008a, KECCAK_RNDC_09=0x0000000000000088, KECCAK_RNDC_10=0x0000000080008009, KECCAK_RNDC_11=0x000000008000000a, KECCAK_RNDC_12=0x000000008000808b, KECCAK_RNDC_13=0x000000000000008b, KECCAK_RNDC_14=0x0000000000008089, KECCAK_RNDC_15=0x0000000000008003, KECCAK_RNDC_16=0x0000000000008002, KECCAK_RNDC_17=0x0000000000000080, KECCAK_RNDC_18=0x000000000000800a, KECCAK_RNDC_19=0x000000008000000a, KECCAK_RNDC_20=0x0000000080008081, KECCAK_RNDC_21=0x0000000000008080, KECCAK_RNDC_22=0x0000000080000001, KECCAK_RNDC_23=0x0000000080008008, KECCAK_PILN_00=10, KECCAK_PILN_01=7, KECCAK_PILN_02=11, KECCAK_PILN_03=17, KECCAK_PILN_04=18, KECCAK_PILN_05=3, KECCAK_PILN_06=5, KECCAK_PILN_07=16, KECCAK_PILN_08=8, KECCAK_PILN_09=21, KECCAK_PILN_10=24, KECCAK_PILN_11=4, KECCAK_PILN_12=15, KECCAK_PILN_13=23, KECCAK_PILN_14=19, KECCAK_PILN_15=13, KECCAK_PILN_16=12, KECCAK_PILN_17=2, KECCAK_PILN_18=20, KECCAK_PILN_19=14, KECCAK_PILN_20=22, KECCAK_PILN_21=9, KECCAK_PILN_22=6, KECCAK_PILN_23=1, KECCAK_ROTC_00=1, KECCAK_ROTC_01=3, KECCAK_ROTC_02=6, KECCAK_ROTC_03=10, KECCAK_ROTC_04=15, KECCAK_ROTC_05=21, KECCAK_ROTC_06=28, KECCAK_ROTC_07=36, KECCAK_ROTC_08=45, KECCAK_ROTC_09=55, KECCAK_ROTC_10=2, KECCAK_ROTC_11=14, KECCAK_ROTC_12=27, KECCAK_ROTC_13=41, KECCAK_ROTC_14=56, KECCAK_ROTC_15=8, KECCAK_ROTC_16=25, KECCAK_ROTC_17=43, KECCAK_ROTC_18=62, KECCAK_ROTC_19=18, KECCAK_ROTC_20=39, KECCAK_ROTC_21=61, KECCAK_ROTC_22=20, KECCAK_ROTC_23=44, } keccak_constants_t; typedef enum mysql323_constants { MYSQL323_A=0x50305735, MYSQL323_B=0x12345671u } mysql323_constants_t; typedef enum fortigate_constants { FORTIGATE_A=0x2eba88a3, FORTIGATE_B=0x4ab04c42, FORTIGATE_C=0xc1307953, FORTIGATE_D=0x3fcc0731, FORTIGATE_E=0x299032a1, FORTIGATE_F=0x705b81a9 } fortigate_constants_t; typedef enum blake2b_constants { BLAKE2B_IV_00=0x6a09e667f3bcc908, BLAKE2B_IV_01=0xbb67ae8584caa73b, BLAKE2B_IV_02=0x3c6ef372fe94f82b, BLAKE2B_IV_03=0xa54ff53a5f1d36f1, BLAKE2B_IV_04=0x510e527fade682d1, BLAKE2B_IV_05=0x9b05688c2b3e6c1f, BLAKE2B_IV_06=0x1f83d9abfb41bd6b, BLAKE2B_IV_07=0x5be0cd19137e2179 } blake2b_constants_t; hashcat-4.0.1/OpenCL/inc_hash_functions.cl000066400000000000000000000355201320027462700204430ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define MD4_F_S(x,y,z) (((x) & (y)) | ((~(x)) & (z))) #define MD4_G_S(x,y,z) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) #define MD4_H_S(x,y,z) ((x) ^ (y) ^ (z)) #ifdef IS_NV #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_Fo(x,y,z) (bitselect ((z), (y), (x))) #define MD4_Go(x,y,z) (bitselect ((x), (y), ((x) ^ (z)))) #endif #ifdef IS_AMD #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_Fo(x,y,z) (bitselect ((z), (y), (x))) #define MD4_Go(x,y,z) (bitselect ((x), (y), ((x) ^ (z)))) #endif #ifdef IS_GENERIC #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_Fo(x,y,z) (MD4_F((x), (y), (z))) #define MD4_Go(x,y,z) (MD4_G((x), (y), (z))) #endif #define MD4_STEP_S(f,a,b,c,d,x,K,s) \ { \ a += K; \ a = __add3_S (a, x, f (b, c, d)); \ a = rotl32_S (a, s); \ } #define MD4_STEP(f,a,b,c,d,x,K,s) \ { \ a += K; \ a = __add3 (a, x, f (b, c, d)); \ a = rotl32 (a, s); \ } #define MD4_STEP0(f,a,b,c,d,K,s) \ { \ a = __add3 (a, K, f (b, c, d)); \ a = rotl32 (a, s); \ } #define MD5_F_S(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) #define MD5_G_S(x,y,z) ((y) ^ ((z) & ((x) ^ (y)))) #define MD5_H_S(x,y,z) ((x) ^ (y) ^ (z)) #define MD5_I_S(x,y,z) ((y) ^ ((x) | ~(z))) #ifdef IS_NV #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) ((t = (x) ^ (y)) ^ (z)) #define MD5_H2(x,y,z) ((x) ^ t) #define MD5_I(x,y,z) ((y) ^ ((x) | ~(z))) #define MD5_Fo(x,y,z) (MD5_F((x), (y), (z))) #define MD5_Go(x,y,z) (MD5_G((x), (y), (z))) #endif #ifdef IS_AMD #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) ((t = (x) ^ (y)) ^ (z)) #define MD5_H2(x,y,z) ((x) ^ t) #define MD5_I(x,y,z) ((y) ^ ((x) | ~(z))) #define MD5_Fo(x,y,z) (bitselect ((z), (y), (x))) #define MD5_Go(x,y,z) (bitselect ((y), (x), (z))) #endif #ifdef IS_GENERIC #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) ((t = (x) ^ (y)) ^ (z)) #define MD5_H2(x,y,z) ((x) ^ t) #define MD5_I(x,y,z) ((y) ^ ((x) | ~(z))) #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_S(f,a,b,c,d,x,K,s) \ { \ a += K; \ a = __add3_S (a, x, f (b, c, d)); \ a = rotl32_S (a, s); \ a += b; \ } #define MD5_STEP(f,a,b,c,d,x,K,s) \ { \ a += K; \ a = __add3 (a, x, f (b, c, d)); \ a = rotl32 (a, s); \ a += b; \ } #define MD5_STEP0(f,a,b,c,d,K,s) \ { \ a = __add3 (a, K, f (b, c, d)); \ a = rotl32 (a, s); \ a += b; \ } #ifdef IS_NV #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)))) #define SHA1_F0o(x,y,z) (bitselect ((z), (y), (x))) #define SHA1_F2o(x,y,z) (bitselect ((x), (y), ((x) ^ (z)))) #endif #ifdef IS_AMD #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)))) #define SHA1_F0o(x,y,z) (bitselect ((z), (y), (x))) #define SHA1_F2o(x,y,z) (bitselect ((x), (y), ((x) ^ (z)))) #endif #ifdef IS_GENERIC #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)))) #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_S(f,a,b,c,d,e,x) \ { \ e = __add3_S (e, x, f (b, c, d)); \ e = __add3_S (e, K, rotl32_S (a, 5u)); \ b = rotl32_S (b, 30u); \ } #define SHA1_STEP(f,a,b,c,d,e,x) \ { \ e = __add3 (e, x, f (b, c, d)); \ e = __add3 (e, K, rotl32 (a, 5u)); \ b = rotl32 (b, 30u); \ } #define SHA1_STEP0(f,a,b,c,d,e,x) \ { \ e = __add3 (e, K, f (b, c, d)); \ e += rotl32 (a, 5u); \ b = rotl32 (b, 30u); \ } #define SHA1_STEPX(f,a,b,c,d,e,x) \ { \ e = __add3 (e, x, f (b, c, d)); \ e += rotl32 (a, 5u); \ b = rotl32 (b, 30u); \ } #define SHIFT_RIGHT_32(x,n) ((x) >> (n)) #define SHA256_S0_S(x) (rotl32_S ((x), 25u) ^ rotl32_S ((x), 14u) ^ SHIFT_RIGHT_32 ((x), 3u)) #define SHA256_S1_S(x) (rotl32_S ((x), 15u) ^ rotl32_S ((x), 13u) ^ SHIFT_RIGHT_32 ((x), 10u)) #define SHA256_S2_S(x) (rotl32_S ((x), 30u) ^ rotl32_S ((x), 19u) ^ rotl32_S ((x), 10u)) #define SHA256_S3_S(x) (rotl32_S ((x), 26u) ^ rotl32_S ((x), 21u) ^ rotl32_S ((x), 7u)) #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)) #ifdef IS_NV #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) (bitselect ((x), (y), ((x) ^ (z)))) #define SHA256_F1o(x,y,z) (bitselect ((z), (y), (x))) #endif #ifdef IS_AMD #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) (bitselect ((x), (y), ((x) ^ (z)))) #define SHA256_F1o(x,y,z) (bitselect ((z), (y), (x))) #endif #ifdef IS_GENERIC #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))) #endif #define SHA256_STEP_S(F0,F1,a,b,c,d,e,f,g,h,x,K) \ { \ h = __add3_S (h, K, x); \ h = __add3_S (h, SHA256_S3_S (e), F1 (e,f,g)); \ d += h; \ h = __add3_S (h, SHA256_S2_S (a), F0 (a,b,c)); \ } #define SHA256_EXPAND_S(x,y,z,w) (SHA256_S1_S (x) + y + SHA256_S0_S (z) + w) #define SHA256_STEP(F0,F1,a,b,c,d,e,f,g,h,x,K) \ { \ h = __add3 (h, K, x); \ h = __add3 (h, SHA256_S3 (e), F1 (e,f,g)); \ d += h; \ h = __add3 (h, SHA256_S2 (a), F0 (a,b,c)); \ } #define SHA256_EXPAND(x,y,z,w) (SHA256_S1 (x) + y + SHA256_S0 (z) + w) #define SHIFT_RIGHT_64(x,n) ((x) >> (n)) #define SHA384_S0_S(x) (rotr64_S ((x), 28) ^ rotr64_S ((x), 34) ^ rotr64_S ((x), 39)) #define SHA384_S1_S(x) (rotr64_S ((x), 14) ^ rotr64_S ((x), 18) ^ rotr64_S ((x), 41)) #define SHA384_S2_S(x) (rotr64_S ((x), 1) ^ rotr64_S ((x), 8) ^ SHIFT_RIGHT_64 ((x), 7)) #define SHA384_S3_S(x) (rotr64_S ((x), 19) ^ rotr64_S ((x), 61) ^ SHIFT_RIGHT_64 ((x), 6)) #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_NV #define SHA384_F0o(x,y,z) (bitselect ((z), (y), (x))) #define SHA384_F1o(x,y,z) (bitselect ((x), (y), ((x) ^ (z)))) #endif #ifdef IS_AMD #define SHA384_F0o(x,y,z) (bitselect ((z), (y), (x))) #define SHA384_F1o(x,y,z) (bitselect ((x), (y), ((x) ^ (z)))) #endif #ifdef IS_GENERIC #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_S(F0,F1,a,b,c,d,e,f,g,h,x,K) \ { \ h += K; \ h += x; \ h += SHA384_S1_S (e); \ h += F0 (e, f, g); \ d += h; \ h += SHA384_S0_S (a); \ h += F1 (a, b, c); \ } #define SHA384_EXPAND_S(x,y,z,w) (SHA384_S3_S (x) + y + SHA384_S2_S (z) + w) #define SHA384_STEP(F0,F1,a,b,c,d,e,f,g,h,x,K) \ { \ h += K; \ h += x; \ h += SHA384_S1 (e); \ h += F0 (e, f, g); \ d += h; \ h += SHA384_S0 (a); \ h += F1 (a, b, c); \ } #define SHA384_EXPAND(x,y,z,w) (SHA384_S3 (x) + y + SHA384_S2 (z) + w) #define SHIFT_RIGHT_64(x,n) ((x) >> (n)) #define SHA512_S0_S(x) (rotr64_S ((x), 28) ^ rotr64_S ((x), 34) ^ rotr64_S ((x), 39)) #define SHA512_S1_S(x) (rotr64_S ((x), 14) ^ rotr64_S ((x), 18) ^ rotr64_S ((x), 41)) #define SHA512_S2_S(x) (rotr64_S ((x), 1) ^ rotr64_S ((x), 8) ^ SHIFT_RIGHT_64 ((x), 7)) #define SHA512_S3_S(x) (rotr64_S ((x), 19) ^ rotr64_S ((x), 61) ^ SHIFT_RIGHT_64 ((x), 6)) #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_NV #define SHA512_F0o(x,y,z) (bitselect ((z), (y), (x))) #define SHA512_F1o(x,y,z) (bitselect ((x), (y), ((x) ^ (z)))) #endif #ifdef IS_AMD #define SHA512_F0o(x,y,z) (bitselect ((z), (y), (x))) #define SHA512_F1o(x,y,z) (bitselect ((x), (y), ((x) ^ (z)))) #endif #ifdef IS_GENERIC #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_S(F0,F1,a,b,c,d,e,f,g,h,x,K) \ { \ h += K; \ h += x; \ h += SHA512_S1_S (e); \ h += F0 (e, f, g); \ d += h; \ h += SHA512_S0_S (a); \ h += F1 (a, b, c); \ } #define SHA512_EXPAND_S(x,y,z,w) (SHA512_S3_S (x) + y + SHA512_S2_S (z) + w) #define SHA512_STEP(F0,F1,a,b,c,d,e,f,g,h,x,K) \ { \ h += K; \ h += x; \ h += SHA512_S1 (e); \ h += F0 (e, f, g); \ d += h; \ h += SHA512_S0 (a); \ h += F1 (a, b, c); \ } #define SHA512_EXPAND(x,y,z,w) (SHA512_S3 (x) + y + SHA512_S2 (z) + w) #ifdef IS_NV #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))) #define RIPEMD160_Go(x,y,z) (bitselect ((z), (y), (x))) #define RIPEMD160_Io(x,y,z) (bitselect ((y), (x), (z))) #endif #ifdef IS_AMD #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))) #define RIPEMD160_Go(x,y,z) (bitselect ((z), (y), (x))) #define RIPEMD160_Io(x,y,z) (bitselect ((y), (x), (z))) #endif #ifdef IS_GENERIC #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))) #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_S(f,a,b,c,d,e,x,K,s) \ { \ a += K; \ a += x; \ a += f (b, c, d); \ a = rotl32_S (a, s); \ a += e; \ c = rotl32_S (c, 10u); \ } #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_S_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_S (c, 10u); \ } #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); \ } hashcat-4.0.1/OpenCL/inc_hash_md4.cl000066400000000000000000001175301320027462700171210ustar00rootroot00000000000000 // important notes on this: // input buf unused bytes needs to be set to zero // input buf needs to be in algorithm native byte order (md5 = LE, sha1 = BE, etc) // input buf needs to be 64 byte aligned when using md5_update() typedef struct md4_ctx { u32 h[4]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int len; } md4_ctx_t; void md4_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[4]) { u32 a = digest[0]; u32 b = digest[1]; u32 c = digest[2]; u32 d = digest[3]; MD4_STEP_S (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); MD4_STEP_S (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); MD4_STEP_S (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); MD4_STEP_S (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); MD4_STEP_S (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); MD4_STEP_S (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); MD4_STEP_S (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); MD4_STEP_S (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); MD4_STEP_S (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); MD4_STEP_S (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); MD4_STEP_S (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); MD4_STEP_S (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); MD4_STEP_S (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); MD4_STEP_S (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); MD4_STEP_S (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); MD4_STEP_S (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); MD4_STEP_S (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); MD4_STEP_S (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); MD4_STEP_S (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); MD4_STEP_S (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); MD4_STEP_S (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); MD4_STEP_S (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); MD4_STEP_S (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); MD4_STEP_S (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); MD4_STEP_S (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); MD4_STEP_S (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); MD4_STEP_S (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); MD4_STEP_S (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); MD4_STEP_S (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); MD4_STEP_S (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); MD4_STEP_S (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); MD4_STEP_S (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); MD4_STEP_S (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); MD4_STEP_S (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); MD4_STEP_S (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); MD4_STEP_S (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); MD4_STEP_S (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); MD4_STEP_S (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); MD4_STEP_S (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); MD4_STEP_S (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); MD4_STEP_S (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); MD4_STEP_S (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); MD4_STEP_S (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); MD4_STEP_S (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); MD4_STEP_S (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); MD4_STEP_S (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); MD4_STEP_S (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); MD4_STEP_S (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); digest[0] += a; digest[1] += b; digest[2] += c; digest[3] += d; } void md4_init (md4_ctx_t *ctx) { ctx->h[0] = MD4M_A; ctx->h[1] = MD4M_B; ctx->h[2] = MD4M_C; ctx->h[3] = MD4M_D; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->len = 0; } void md4_update_64 (md4_ctx_t *ctx, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 63; #else const int pos = ctx->len & 63; #endif ctx->len += len; if ((pos + len) < 64) { switch_buffer_by_offset_le_S (w0, w1, w2, w3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; } else { u32 c0[4] = { 0 }; u32 c1[4] = { 0 }; u32 c2[4] = { 0 }; u32 c3[4] = { 0 }; switch_buffer_by_offset_carry_le_S (w0, w1, w2, w3, c0, c1, c2, c3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; md4_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; } } void md4_update (md4_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; md4_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; md4_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void md4_update_swap (md4_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); md4_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); md4_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void md4_update_utf16le (md4_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); md4_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); md4_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void md4_update_utf16le_swap (md4_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); md4_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); md4_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void md4_update_global (md4_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; md4_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; md4_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void md4_update_global_swap (md4_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); md4_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); md4_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void md4_update_global_utf16le (md4_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); md4_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); md4_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void md4_update_global_utf16le_swap (md4_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); md4_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); md4_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void md4_final (md4_ctx_t *ctx) { const int pos = ctx->len & 63; append_0x80_4x4_S (ctx->w0, ctx->w1, ctx->w2, ctx->w3, pos); if (pos >= 56) { md4_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; } ctx->w3[2] = ctx->len * 8; ctx->w3[3] = 0; md4_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); } // md4_hmac typedef struct md4_hmac_ctx { md4_ctx_t ipad; md4_ctx_t opad; } md4_hmac_ctx_t; void md4_hmac_init_64 (md4_hmac_ctx_t *ctx, const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4]) { u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; md4_init (&ctx->ipad); md4_update_64 (&ctx->ipad, t0, t1, t2, t3, 64); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; md4_init (&ctx->opad); md4_update_64 (&ctx->opad, t0, t1, t2, t3, 64); } void md4_hmac_init (md4_hmac_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { md4_ctx_t tmp; md4_init (&tmp); md4_update (&tmp, w, len); md4_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } md4_hmac_init_64 (ctx, w0, w1, w2, w3); } void md4_hmac_init_swap (md4_hmac_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { md4_ctx_t tmp; md4_init (&tmp); md4_update_swap (&tmp, w, len); md4_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[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; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); } md4_hmac_init_64 (ctx, w0, w1, w2, w3); } void md4_hmac_init_global (md4_hmac_ctx_t *ctx, __global const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { md4_ctx_t tmp; md4_init (&tmp); md4_update_global (&tmp, w, len); md4_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } md4_hmac_init_64 (ctx, w0, w1, w2, w3); } void md4_hmac_init_global_swap (md4_hmac_ctx_t *ctx, __global const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { md4_ctx_t tmp; md4_init (&tmp); md4_update_global_swap (&tmp, w, len); md4_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[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; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); } md4_hmac_init_64 (ctx, w0, w1, w2, w3); } void md4_hmac_update_64 (md4_hmac_ctx_t *ctx, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const int len) { md4_update_64 (&ctx->ipad, w0, w1, w2, w3, len); } void md4_hmac_update (md4_hmac_ctx_t *ctx, const u32 *w, const int len) { md4_update (&ctx->ipad, w, len); } void md4_hmac_update_swap (md4_hmac_ctx_t *ctx, const u32 *w, const int len) { md4_update_swap (&ctx->ipad, w, len); } void md4_hmac_update_utf16le (md4_hmac_ctx_t *ctx, const u32 *w, const int len) { md4_update_utf16le (&ctx->ipad, w, len); } void md4_hmac_update_utf16le_swap (md4_hmac_ctx_t *ctx, const u32 *w, const int len) { md4_update_utf16le_swap (&ctx->ipad, w, len); } void md4_hmac_update_global (md4_hmac_ctx_t *ctx, const __global u32 *w, const int len) { md4_update_global (&ctx->ipad, w, len); } void md4_hmac_update_global_swap (md4_hmac_ctx_t *ctx, const __global u32 *w, const int len) { md4_update_global_swap (&ctx->ipad, w, len); } void md4_hmac_update_global_utf16le (md4_hmac_ctx_t *ctx, const __global u32 *w, const int len) { md4_update_global_utf16le (&ctx->ipad, w, len); } void md4_hmac_update_global_utf16le_swap (md4_hmac_ctx_t *ctx, const __global u32 *w, const int len) { md4_update_global_utf16le_swap (&ctx->ipad, w, len); } void md4_hmac_final (md4_hmac_ctx_t *ctx) { md4_final (&ctx->ipad); u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; t0[0] = ctx->ipad.h[0]; t0[1] = ctx->ipad.h[1]; t0[2] = ctx->ipad.h[2]; t0[3] = ctx->ipad.h[3]; t1[0] = 0; t1[1] = 0; t1[2] = 0; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; md4_update_64 (&ctx->opad, t0, t1, t2, t3, 16); md4_final (&ctx->opad); } // while input buf can be a vector datatype, the length of the different elements can not typedef struct md4_ctx_vector { u32x h[4]; u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int len; } md4_ctx_vector_t; void md4_transform_vector (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; } void md4_init_vector (md4_ctx_vector_t *ctx) { ctx->h[0] = MD4M_A; ctx->h[1] = MD4M_B; ctx->h[2] = MD4M_C; ctx->h[3] = MD4M_D; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->len = 0; } void md4_init_vector_from_scalar (md4_ctx_vector_t *ctx, md4_ctx_t *ctx0) { ctx->h[0] = ctx0->h[0]; ctx->h[1] = ctx0->h[1]; ctx->h[2] = ctx0->h[2]; ctx->h[3] = ctx0->h[3]; ctx->w0[0] = ctx0->w0[0]; ctx->w0[1] = ctx0->w0[1]; ctx->w0[2] = ctx0->w0[2]; ctx->w0[3] = ctx0->w0[3]; ctx->w1[0] = ctx0->w1[0]; ctx->w1[1] = ctx0->w1[1]; ctx->w1[2] = ctx0->w1[2]; ctx->w1[3] = ctx0->w1[3]; ctx->w2[0] = ctx0->w2[0]; ctx->w2[1] = ctx0->w2[1]; ctx->w2[2] = ctx0->w2[2]; ctx->w2[3] = ctx0->w2[3]; ctx->w3[0] = ctx0->w3[0]; ctx->w3[1] = ctx0->w3[1]; ctx->w3[2] = ctx0->w3[2]; ctx->w3[3] = ctx0->w3[3]; ctx->len = ctx0->len; } void md4_update_vector_64 (md4_ctx_vector_t *ctx, u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 63; #else const int pos = ctx->len & 63; #endif ctx->len += len; if ((pos + len) < 64) { switch_buffer_by_offset_le (w0, w1, w2, w3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; } else { u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_le (w0, w1, w2, w3, c0, c1, c2, c3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; md4_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; } } void md4_update_vector (md4_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; md4_update_vector_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; md4_update_vector_64 (ctx, w0, w1, w2, w3, len - pos1); } void md4_update_vector_swap (md4_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); md4_update_vector_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); md4_update_vector_64 (ctx, w0, w1, w2, w3, len - pos1); } void md4_update_vector_utf16le (md4_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); md4_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); md4_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void md4_update_vector_utf16le_swap (md4_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); md4_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); md4_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void md4_final_vector (md4_ctx_vector_t *ctx) { const int pos = ctx->len & 63; append_0x80_4x4 (ctx->w0, ctx->w1, ctx->w2, ctx->w3, pos); if (pos >= 56) { md4_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; } ctx->w3[2] = ctx->len * 8; ctx->w3[3] = 0; md4_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); } // HMAC + Vector typedef struct md4_hmac_ctx_vector { md4_ctx_vector_t ipad; md4_ctx_vector_t opad; } md4_hmac_ctx_vector_t; void md4_hmac_init_vector_64 (md4_hmac_ctx_vector_t *ctx, const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4]) { u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; md4_init_vector (&ctx->ipad); md4_update_vector_64 (&ctx->ipad, t0, t1, t2, t3, 64); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; md4_init_vector (&ctx->opad); md4_update_vector_64 (&ctx->opad, t0, t1, t2, t3, 64); } void md4_hmac_init_vector (md4_hmac_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; if (len > 64) { md4_ctx_vector_t tmp; md4_init_vector (&tmp); md4_update_vector (&tmp, w, len); md4_final_vector (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } md4_hmac_init_vector_64 (ctx, w0, w1, w2, w3); } void md4_hmac_update_vector_64 (md4_hmac_ctx_vector_t *ctx, u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const int len) { md4_update_vector_64 (&ctx->ipad, w0, w1, w2, w3, len); } void md4_hmac_update_vector (md4_hmac_ctx_vector_t *ctx, const u32x *w, const int len) { md4_update_vector (&ctx->ipad, w, len); } void md4_hmac_final_vector (md4_hmac_ctx_vector_t *ctx) { md4_final_vector (&ctx->ipad); u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = ctx->ipad.h[0]; t0[1] = ctx->ipad.h[1]; t0[2] = ctx->ipad.h[2]; t0[3] = ctx->ipad.h[3]; t1[0] = 0; t1[1] = 0; t1[2] = 0; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; md4_update_vector_64 (&ctx->opad, t0, t1, t2, t3, 16); md4_final_vector (&ctx->opad); } hashcat-4.0.1/OpenCL/inc_hash_md5.cl000066400000000000000000001242411320027462700171170ustar00rootroot00000000000000 // important notes on this: // input buf unused bytes needs to be set to zero // input buf needs to be in algorithm native byte order (md5 = LE, sha1 = BE, etc) // input buf needs to be 64 byte aligned when using md5_update() typedef struct md5_ctx { u32 h[4]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int len; } md5_ctx_t; void md5_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[4]) { u32 a = digest[0]; u32 b = digest[1]; u32 c = digest[2]; u32 d = digest[3]; u32 w0_t = w0[0]; u32 w1_t = w0[1]; u32 w2_t = w0[2]; u32 w3_t = w0[3]; u32 w4_t = w1[0]; u32 w5_t = w1[1]; u32 w6_t = w1[2]; u32 w7_t = w1[3]; u32 w8_t = w2[0]; u32 w9_t = w2[1]; u32 wa_t = w2[2]; u32 wb_t = w2[3]; u32 wc_t = w3[0]; u32 wd_t = w3[1]; u32 we_t = w3[2]; u32 wf_t = w3[3]; MD5_STEP_S (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); MD5_STEP_S (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); MD5_STEP_S (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); MD5_STEP_S (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); MD5_STEP_S (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); MD5_STEP_S (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); MD5_STEP_S (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); MD5_STEP_S (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); MD5_STEP_S (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); MD5_STEP_S (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); MD5_STEP_S (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); MD5_STEP_S (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); MD5_STEP_S (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); MD5_STEP_S (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); MD5_STEP_S (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); MD5_STEP_S (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); MD5_STEP_S (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); MD5_STEP_S (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); MD5_STEP_S (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); MD5_STEP_S (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); MD5_STEP_S (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); MD5_STEP_S (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); MD5_STEP_S (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); MD5_STEP_S (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); MD5_STEP_S (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); MD5_STEP_S (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); MD5_STEP_S (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); MD5_STEP_S (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); MD5_STEP_S (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); MD5_STEP_S (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); MD5_STEP_S (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); MD5_STEP_S (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); u32 t; MD5_STEP_S (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); MD5_STEP_S (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); MD5_STEP_S (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); MD5_STEP_S (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); MD5_STEP_S (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); MD5_STEP_S (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); MD5_STEP_S (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); MD5_STEP_S (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); MD5_STEP_S (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); MD5_STEP_S (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); MD5_STEP_S (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); MD5_STEP_S (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); MD5_STEP_S (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); MD5_STEP_S (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); MD5_STEP_S (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); MD5_STEP_S (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); MD5_STEP_S (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); MD5_STEP_S (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); MD5_STEP_S (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); MD5_STEP_S (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); MD5_STEP_S (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); MD5_STEP_S (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); MD5_STEP_S (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); MD5_STEP_S (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); MD5_STEP_S (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); MD5_STEP_S (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); MD5_STEP_S (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); MD5_STEP_S (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); MD5_STEP_S (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); MD5_STEP_S (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); MD5_STEP_S (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); MD5_STEP_S (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); digest[0] += a; digest[1] += b; digest[2] += c; digest[3] += d; } void md5_init (md5_ctx_t *ctx) { ctx->h[0] = MD5M_A; ctx->h[1] = MD5M_B; ctx->h[2] = MD5M_C; ctx->h[3] = MD5M_D; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->len = 0; } void md5_update_64 (md5_ctx_t *ctx, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 63; #else const int pos = ctx->len & 63; #endif ctx->len += len; if ((pos + len) < 64) { switch_buffer_by_offset_le_S (w0, w1, w2, w3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; } else { u32 c0[4] = { 0 }; u32 c1[4] = { 0 }; u32 c2[4] = { 0 }; u32 c3[4] = { 0 }; switch_buffer_by_offset_carry_le_S (w0, w1, w2, w3, c0, c1, c2, c3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; md5_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; } } void md5_update (md5_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; md5_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; md5_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void md5_update_swap (md5_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); md5_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); md5_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void md5_update_utf16le (md5_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); md5_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); md5_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void md5_update_utf16le_swap (md5_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); md5_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); md5_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void md5_update_global (md5_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; md5_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; md5_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void md5_update_global_swap (md5_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); md5_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); md5_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void md5_update_global_utf16le (md5_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); md5_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); md5_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void md5_update_global_utf16le_swap (md5_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); md5_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); md5_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void md5_final (md5_ctx_t *ctx) { const int pos = ctx->len & 63; append_0x80_4x4_S (ctx->w0, ctx->w1, ctx->w2, ctx->w3, pos); if (pos >= 56) { md5_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; } ctx->w3[2] = ctx->len * 8; ctx->w3[3] = 0; md5_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); } // md5_hmac typedef struct md5_hmac_ctx { md5_ctx_t ipad; md5_ctx_t opad; } md5_hmac_ctx_t; void md5_hmac_init_64 (md5_hmac_ctx_t *ctx, const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4]) { u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; md5_init (&ctx->ipad); md5_update_64 (&ctx->ipad, t0, t1, t2, t3, 64); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; md5_init (&ctx->opad); md5_update_64 (&ctx->opad, t0, t1, t2, t3, 64); } void md5_hmac_init (md5_hmac_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { md5_ctx_t tmp; md5_init (&tmp); md5_update (&tmp, w, len); md5_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } md5_hmac_init_64 (ctx, w0, w1, w2, w3); } void md5_hmac_init_swap (md5_hmac_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { md5_ctx_t tmp; md5_init (&tmp); md5_update_swap (&tmp, w, len); md5_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[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; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); } md5_hmac_init_64 (ctx, w0, w1, w2, w3); } void md5_hmac_init_global (md5_hmac_ctx_t *ctx, __global const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { md5_ctx_t tmp; md5_init (&tmp); md5_update_global (&tmp, w, len); md5_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } md5_hmac_init_64 (ctx, w0, w1, w2, w3); } void md5_hmac_init_global_swap (md5_hmac_ctx_t *ctx, __global const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { md5_ctx_t tmp; md5_init (&tmp); md5_update_global_swap (&tmp, w, len); md5_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[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; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); } md5_hmac_init_64 (ctx, w0, w1, w2, w3); } void md5_hmac_update_64 (md5_hmac_ctx_t *ctx, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const int len) { md5_update_64 (&ctx->ipad, w0, w1, w2, w3, len); } void md5_hmac_update (md5_hmac_ctx_t *ctx, const u32 *w, const int len) { md5_update (&ctx->ipad, w, len); } void md5_hmac_update_swap (md5_hmac_ctx_t *ctx, const u32 *w, const int len) { md5_update_swap (&ctx->ipad, w, len); } void md5_hmac_update_utf16le (md5_hmac_ctx_t *ctx, const u32 *w, const int len) { md5_update_utf16le (&ctx->ipad, w, len); } void md5_hmac_update_utf16le_swap (md5_hmac_ctx_t *ctx, const u32 *w, const int len) { md5_update_utf16le_swap (&ctx->ipad, w, len); } void md5_hmac_update_global (md5_hmac_ctx_t *ctx, const __global u32 *w, const int len) { md5_update_global (&ctx->ipad, w, len); } void md5_hmac_update_global_swap (md5_hmac_ctx_t *ctx, const __global u32 *w, const int len) { md5_update_global_swap (&ctx->ipad, w, len); } void md5_hmac_update_global_utf16le (md5_hmac_ctx_t *ctx, const __global u32 *w, const int len) { md5_update_global_utf16le (&ctx->ipad, w, len); } void md5_hmac_update_global_utf16le_swap (md5_hmac_ctx_t *ctx, const __global u32 *w, const int len) { md5_update_global_utf16le_swap (&ctx->ipad, w, len); } void md5_hmac_final (md5_hmac_ctx_t *ctx) { md5_final (&ctx->ipad); u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; t0[0] = ctx->ipad.h[0]; t0[1] = ctx->ipad.h[1]; t0[2] = ctx->ipad.h[2]; t0[3] = ctx->ipad.h[3]; t1[0] = 0; t1[1] = 0; t1[2] = 0; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; md5_update_64 (&ctx->opad, t0, t1, t2, t3, 16); md5_final (&ctx->opad); } // while input buf can be a vector datatype, the length of the different elements can not typedef struct md5_ctx_vector { u32x h[4]; u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int len; } md5_ctx_vector_t; void md5_transform_vector (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); u32x t; 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; } void md5_init_vector (md5_ctx_vector_t *ctx) { ctx->h[0] = MD5M_A; ctx->h[1] = MD5M_B; ctx->h[2] = MD5M_C; ctx->h[3] = MD5M_D; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->len = 0; } void md5_init_vector_from_scalar (md5_ctx_vector_t *ctx, md5_ctx_t *ctx0) { ctx->h[0] = ctx0->h[0]; ctx->h[1] = ctx0->h[1]; ctx->h[2] = ctx0->h[2]; ctx->h[3] = ctx0->h[3]; ctx->w0[0] = ctx0->w0[0]; ctx->w0[1] = ctx0->w0[1]; ctx->w0[2] = ctx0->w0[2]; ctx->w0[3] = ctx0->w0[3]; ctx->w1[0] = ctx0->w1[0]; ctx->w1[1] = ctx0->w1[1]; ctx->w1[2] = ctx0->w1[2]; ctx->w1[3] = ctx0->w1[3]; ctx->w2[0] = ctx0->w2[0]; ctx->w2[1] = ctx0->w2[1]; ctx->w2[2] = ctx0->w2[2]; ctx->w2[3] = ctx0->w2[3]; ctx->w3[0] = ctx0->w3[0]; ctx->w3[1] = ctx0->w3[1]; ctx->w3[2] = ctx0->w3[2]; ctx->w3[3] = ctx0->w3[3]; ctx->len = ctx0->len; } void md5_update_vector_64 (md5_ctx_vector_t *ctx, u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 63; #else const int pos = ctx->len & 63; #endif ctx->len += len; if ((pos + len) < 64) { switch_buffer_by_offset_le (w0, w1, w2, w3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; } else { u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_le (w0, w1, w2, w3, c0, c1, c2, c3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; md5_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; } } void md5_update_vector (md5_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; md5_update_vector_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; md5_update_vector_64 (ctx, w0, w1, w2, w3, len - pos1); } void md5_update_vector_swap (md5_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); md5_update_vector_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); md5_update_vector_64 (ctx, w0, w1, w2, w3, len - pos1); } void md5_update_vector_utf16le (md5_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); md5_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); md5_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void md5_update_vector_utf16le_swap (md5_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); md5_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); md5_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void md5_final_vector (md5_ctx_vector_t *ctx) { const int pos = ctx->len & 63; append_0x80_4x4 (ctx->w0, ctx->w1, ctx->w2, ctx->w3, pos); if (pos >= 56) { md5_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; } ctx->w3[2] = ctx->len * 8; ctx->w3[3] = 0; md5_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); } // HMAC + Vector typedef struct md5_hmac_ctx_vector { md5_ctx_vector_t ipad; md5_ctx_vector_t opad; } md5_hmac_ctx_vector_t; void md5_hmac_init_vector_64 (md5_hmac_ctx_vector_t *ctx, const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4]) { u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; md5_init_vector (&ctx->ipad); md5_update_vector_64 (&ctx->ipad, t0, t1, t2, t3, 64); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; md5_init_vector (&ctx->opad); md5_update_vector_64 (&ctx->opad, t0, t1, t2, t3, 64); } void md5_hmac_init_vector (md5_hmac_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; if (len > 64) { md5_ctx_vector_t tmp; md5_init_vector (&tmp); md5_update_vector (&tmp, w, len); md5_final_vector (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } md5_hmac_init_vector_64 (ctx, w0, w1, w2, w3); } void md5_hmac_update_vector_64 (md5_hmac_ctx_vector_t *ctx, u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const int len) { md5_update_vector_64 (&ctx->ipad, w0, w1, w2, w3, len); } void md5_hmac_update_vector (md5_hmac_ctx_vector_t *ctx, const u32x *w, const int len) { md5_update_vector (&ctx->ipad, w, len); } void md5_hmac_final_vector (md5_hmac_ctx_vector_t *ctx) { md5_final_vector (&ctx->ipad); u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = ctx->ipad.h[0]; t0[1] = ctx->ipad.h[1]; t0[2] = ctx->ipad.h[2]; t0[3] = ctx->ipad.h[3]; t1[0] = 0; t1[1] = 0; t1[2] = 0; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; md5_update_vector_64 (&ctx->opad, t0, t1, t2, t3, 16); md5_final_vector (&ctx->opad); } hashcat-4.0.1/OpenCL/inc_hash_ripemd160.cl000066400000000000000000002003561320027462700201430ustar00rootroot00000000000000 // important notes on this: // input buf unused bytes needs to be set to zero // input buf needs to be in algorithm native byte order (ripemd160 = LE, sha1 = BE, etc) // input buf needs to be 64 byte aligned when using ripemd160_update() typedef struct ripemd160_ctx { u32 h[5]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int len; } ripemd160_ctx_t; void ripemd160_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[5]) { u32 a1 = digest[0]; u32 b1 = digest[1]; u32 c1 = digest[2]; u32 d1 = digest[3]; u32 e1 = digest[4]; RIPEMD160_STEP_S (RIPEMD160_F , a1, b1, c1, d1, e1, w0[0], RIPEMD160C00, RIPEMD160S00); RIPEMD160_STEP_S (RIPEMD160_F , e1, a1, b1, c1, d1, w0[1], RIPEMD160C00, RIPEMD160S01); RIPEMD160_STEP_S (RIPEMD160_F , d1, e1, a1, b1, c1, w0[2], RIPEMD160C00, RIPEMD160S02); RIPEMD160_STEP_S (RIPEMD160_F , c1, d1, e1, a1, b1, w0[3], RIPEMD160C00, RIPEMD160S03); RIPEMD160_STEP_S (RIPEMD160_F , b1, c1, d1, e1, a1, w1[0], RIPEMD160C00, RIPEMD160S04); RIPEMD160_STEP_S (RIPEMD160_F , a1, b1, c1, d1, e1, w1[1], RIPEMD160C00, RIPEMD160S05); RIPEMD160_STEP_S (RIPEMD160_F , e1, a1, b1, c1, d1, w1[2], RIPEMD160C00, RIPEMD160S06); RIPEMD160_STEP_S (RIPEMD160_F , d1, e1, a1, b1, c1, w1[3], RIPEMD160C00, RIPEMD160S07); RIPEMD160_STEP_S (RIPEMD160_F , c1, d1, e1, a1, b1, w2[0], RIPEMD160C00, RIPEMD160S08); RIPEMD160_STEP_S (RIPEMD160_F , b1, c1, d1, e1, a1, w2[1], RIPEMD160C00, RIPEMD160S09); RIPEMD160_STEP_S (RIPEMD160_F , a1, b1, c1, d1, e1, w2[2], RIPEMD160C00, RIPEMD160S0A); RIPEMD160_STEP_S (RIPEMD160_F , e1, a1, b1, c1, d1, w2[3], RIPEMD160C00, RIPEMD160S0B); RIPEMD160_STEP_S (RIPEMD160_F , d1, e1, a1, b1, c1, w3[0], RIPEMD160C00, RIPEMD160S0C); RIPEMD160_STEP_S (RIPEMD160_F , c1, d1, e1, a1, b1, w3[1], RIPEMD160C00, RIPEMD160S0D); RIPEMD160_STEP_S (RIPEMD160_F , b1, c1, d1, e1, a1, w3[2], RIPEMD160C00, RIPEMD160S0E); RIPEMD160_STEP_S (RIPEMD160_F , a1, b1, c1, d1, e1, w3[3], RIPEMD160C00, RIPEMD160S0F); RIPEMD160_STEP_S (RIPEMD160_Go, e1, a1, b1, c1, d1, w1[3], RIPEMD160C10, RIPEMD160S10); RIPEMD160_STEP_S (RIPEMD160_Go, d1, e1, a1, b1, c1, w1[0], RIPEMD160C10, RIPEMD160S11); RIPEMD160_STEP_S (RIPEMD160_Go, c1, d1, e1, a1, b1, w3[1], RIPEMD160C10, RIPEMD160S12); RIPEMD160_STEP_S (RIPEMD160_Go, b1, c1, d1, e1, a1, w0[1], RIPEMD160C10, RIPEMD160S13); RIPEMD160_STEP_S (RIPEMD160_Go, a1, b1, c1, d1, e1, w2[2], RIPEMD160C10, RIPEMD160S14); RIPEMD160_STEP_S (RIPEMD160_Go, e1, a1, b1, c1, d1, w1[2], RIPEMD160C10, RIPEMD160S15); RIPEMD160_STEP_S (RIPEMD160_Go, d1, e1, a1, b1, c1, w3[3], RIPEMD160C10, RIPEMD160S16); RIPEMD160_STEP_S (RIPEMD160_Go, c1, d1, e1, a1, b1, w0[3], RIPEMD160C10, RIPEMD160S17); RIPEMD160_STEP_S (RIPEMD160_Go, b1, c1, d1, e1, a1, w3[0], RIPEMD160C10, RIPEMD160S18); RIPEMD160_STEP_S (RIPEMD160_Go, a1, b1, c1, d1, e1, w0[0], RIPEMD160C10, RIPEMD160S19); RIPEMD160_STEP_S (RIPEMD160_Go, e1, a1, b1, c1, d1, w2[1], RIPEMD160C10, RIPEMD160S1A); RIPEMD160_STEP_S (RIPEMD160_Go, d1, e1, a1, b1, c1, w1[1], RIPEMD160C10, RIPEMD160S1B); RIPEMD160_STEP_S (RIPEMD160_Go, c1, d1, e1, a1, b1, w0[2], RIPEMD160C10, RIPEMD160S1C); RIPEMD160_STEP_S (RIPEMD160_Go, b1, c1, d1, e1, a1, w3[2], RIPEMD160C10, RIPEMD160S1D); RIPEMD160_STEP_S (RIPEMD160_Go, a1, b1, c1, d1, e1, w2[3], RIPEMD160C10, RIPEMD160S1E); RIPEMD160_STEP_S (RIPEMD160_Go, e1, a1, b1, c1, d1, w2[0], RIPEMD160C10, RIPEMD160S1F); RIPEMD160_STEP_S (RIPEMD160_H , d1, e1, a1, b1, c1, w0[3], RIPEMD160C20, RIPEMD160S20); RIPEMD160_STEP_S (RIPEMD160_H , c1, d1, e1, a1, b1, w2[2], RIPEMD160C20, RIPEMD160S21); RIPEMD160_STEP_S (RIPEMD160_H , b1, c1, d1, e1, a1, w3[2], RIPEMD160C20, RIPEMD160S22); RIPEMD160_STEP_S (RIPEMD160_H , a1, b1, c1, d1, e1, w1[0], RIPEMD160C20, RIPEMD160S23); RIPEMD160_STEP_S (RIPEMD160_H , e1, a1, b1, c1, d1, w2[1], RIPEMD160C20, RIPEMD160S24); RIPEMD160_STEP_S (RIPEMD160_H , d1, e1, a1, b1, c1, w3[3], RIPEMD160C20, RIPEMD160S25); RIPEMD160_STEP_S (RIPEMD160_H , c1, d1, e1, a1, b1, w2[0], RIPEMD160C20, RIPEMD160S26); RIPEMD160_STEP_S (RIPEMD160_H , b1, c1, d1, e1, a1, w0[1], RIPEMD160C20, RIPEMD160S27); RIPEMD160_STEP_S (RIPEMD160_H , a1, b1, c1, d1, e1, w0[2], RIPEMD160C20, RIPEMD160S28); RIPEMD160_STEP_S (RIPEMD160_H , e1, a1, b1, c1, d1, w1[3], RIPEMD160C20, RIPEMD160S29); RIPEMD160_STEP_S (RIPEMD160_H , d1, e1, a1, b1, c1, w0[0], RIPEMD160C20, RIPEMD160S2A); RIPEMD160_STEP_S (RIPEMD160_H , c1, d1, e1, a1, b1, w1[2], RIPEMD160C20, RIPEMD160S2B); RIPEMD160_STEP_S (RIPEMD160_H , b1, c1, d1, e1, a1, w3[1], RIPEMD160C20, RIPEMD160S2C); RIPEMD160_STEP_S (RIPEMD160_H , a1, b1, c1, d1, e1, w2[3], RIPEMD160C20, RIPEMD160S2D); RIPEMD160_STEP_S (RIPEMD160_H , e1, a1, b1, c1, d1, w1[1], RIPEMD160C20, RIPEMD160S2E); RIPEMD160_STEP_S (RIPEMD160_H , d1, e1, a1, b1, c1, w3[0], RIPEMD160C20, RIPEMD160S2F); RIPEMD160_STEP_S (RIPEMD160_Io, c1, d1, e1, a1, b1, w0[1], RIPEMD160C30, RIPEMD160S30); RIPEMD160_STEP_S (RIPEMD160_Io, b1, c1, d1, e1, a1, w2[1], RIPEMD160C30, RIPEMD160S31); RIPEMD160_STEP_S (RIPEMD160_Io, a1, b1, c1, d1, e1, w2[3], RIPEMD160C30, RIPEMD160S32); RIPEMD160_STEP_S (RIPEMD160_Io, e1, a1, b1, c1, d1, w2[2], RIPEMD160C30, RIPEMD160S33); RIPEMD160_STEP_S (RIPEMD160_Io, d1, e1, a1, b1, c1, w0[0], RIPEMD160C30, RIPEMD160S34); RIPEMD160_STEP_S (RIPEMD160_Io, c1, d1, e1, a1, b1, w2[0], RIPEMD160C30, RIPEMD160S35); RIPEMD160_STEP_S (RIPEMD160_Io, b1, c1, d1, e1, a1, w3[0], RIPEMD160C30, RIPEMD160S36); RIPEMD160_STEP_S (RIPEMD160_Io, a1, b1, c1, d1, e1, w1[0], RIPEMD160C30, RIPEMD160S37); RIPEMD160_STEP_S (RIPEMD160_Io, e1, a1, b1, c1, d1, w3[1], RIPEMD160C30, RIPEMD160S38); RIPEMD160_STEP_S (RIPEMD160_Io, d1, e1, a1, b1, c1, w0[3], RIPEMD160C30, RIPEMD160S39); RIPEMD160_STEP_S (RIPEMD160_Io, c1, d1, e1, a1, b1, w1[3], RIPEMD160C30, RIPEMD160S3A); RIPEMD160_STEP_S (RIPEMD160_Io, b1, c1, d1, e1, a1, w3[3], RIPEMD160C30, RIPEMD160S3B); RIPEMD160_STEP_S (RIPEMD160_Io, a1, b1, c1, d1, e1, w3[2], RIPEMD160C30, RIPEMD160S3C); RIPEMD160_STEP_S (RIPEMD160_Io, e1, a1, b1, c1, d1, w1[1], RIPEMD160C30, RIPEMD160S3D); RIPEMD160_STEP_S (RIPEMD160_Io, d1, e1, a1, b1, c1, w1[2], RIPEMD160C30, RIPEMD160S3E); RIPEMD160_STEP_S (RIPEMD160_Io, c1, d1, e1, a1, b1, w0[2], RIPEMD160C30, RIPEMD160S3F); RIPEMD160_STEP_S (RIPEMD160_J , b1, c1, d1, e1, a1, w1[0], RIPEMD160C40, RIPEMD160S40); RIPEMD160_STEP_S (RIPEMD160_J , a1, b1, c1, d1, e1, w0[0], RIPEMD160C40, RIPEMD160S41); RIPEMD160_STEP_S (RIPEMD160_J , e1, a1, b1, c1, d1, w1[1], RIPEMD160C40, RIPEMD160S42); RIPEMD160_STEP_S (RIPEMD160_J , d1, e1, a1, b1, c1, w2[1], RIPEMD160C40, RIPEMD160S43); RIPEMD160_STEP_S (RIPEMD160_J , c1, d1, e1, a1, b1, w1[3], RIPEMD160C40, RIPEMD160S44); RIPEMD160_STEP_S (RIPEMD160_J , b1, c1, d1, e1, a1, w3[0], RIPEMD160C40, RIPEMD160S45); RIPEMD160_STEP_S (RIPEMD160_J , a1, b1, c1, d1, e1, w0[2], RIPEMD160C40, RIPEMD160S46); RIPEMD160_STEP_S (RIPEMD160_J , e1, a1, b1, c1, d1, w2[2], RIPEMD160C40, RIPEMD160S47); RIPEMD160_STEP_S (RIPEMD160_J , d1, e1, a1, b1, c1, w3[2], RIPEMD160C40, RIPEMD160S48); RIPEMD160_STEP_S (RIPEMD160_J , c1, d1, e1, a1, b1, w0[1], RIPEMD160C40, RIPEMD160S49); RIPEMD160_STEP_S (RIPEMD160_J , b1, c1, d1, e1, a1, w0[3], RIPEMD160C40, RIPEMD160S4A); RIPEMD160_STEP_S (RIPEMD160_J , a1, b1, c1, d1, e1, w2[0], RIPEMD160C40, RIPEMD160S4B); RIPEMD160_STEP_S (RIPEMD160_J , e1, a1, b1, c1, d1, w2[3], RIPEMD160C40, RIPEMD160S4C); RIPEMD160_STEP_S (RIPEMD160_J , d1, e1, a1, b1, c1, w1[2], RIPEMD160C40, RIPEMD160S4D); RIPEMD160_STEP_S (RIPEMD160_J , c1, d1, e1, a1, b1, w3[3], RIPEMD160C40, RIPEMD160S4E); RIPEMD160_STEP_S (RIPEMD160_J , b1, c1, d1, e1, a1, w3[1], RIPEMD160C40, RIPEMD160S4F); u32 a2 = digest[0]; u32 b2 = digest[1]; u32 c2 = digest[2]; u32 d2 = digest[3]; u32 e2 = digest[4]; RIPEMD160_STEP_S_WORKAROUND_BUG (RIPEMD160_J , a2, b2, c2, d2, e2, w1[1], RIPEMD160C50, RIPEMD160S50); RIPEMD160_STEP_S (RIPEMD160_J , e2, a2, b2, c2, d2, w3[2], RIPEMD160C50, RIPEMD160S51); RIPEMD160_STEP_S (RIPEMD160_J , d2, e2, a2, b2, c2, w1[3], RIPEMD160C50, RIPEMD160S52); RIPEMD160_STEP_S (RIPEMD160_J , c2, d2, e2, a2, b2, w0[0], RIPEMD160C50, RIPEMD160S53); RIPEMD160_STEP_S (RIPEMD160_J , b2, c2, d2, e2, a2, w2[1], RIPEMD160C50, RIPEMD160S54); RIPEMD160_STEP_S (RIPEMD160_J , a2, b2, c2, d2, e2, w0[2], RIPEMD160C50, RIPEMD160S55); RIPEMD160_STEP_S (RIPEMD160_J , e2, a2, b2, c2, d2, w2[3], RIPEMD160C50, RIPEMD160S56); RIPEMD160_STEP_S (RIPEMD160_J , d2, e2, a2, b2, c2, w1[0], RIPEMD160C50, RIPEMD160S57); RIPEMD160_STEP_S (RIPEMD160_J , c2, d2, e2, a2, b2, w3[1], RIPEMD160C50, RIPEMD160S58); RIPEMD160_STEP_S (RIPEMD160_J , b2, c2, d2, e2, a2, w1[2], RIPEMD160C50, RIPEMD160S59); RIPEMD160_STEP_S (RIPEMD160_J , a2, b2, c2, d2, e2, w3[3], RIPEMD160C50, RIPEMD160S5A); RIPEMD160_STEP_S (RIPEMD160_J , e2, a2, b2, c2, d2, w2[0], RIPEMD160C50, RIPEMD160S5B); RIPEMD160_STEP_S (RIPEMD160_J , d2, e2, a2, b2, c2, w0[1], RIPEMD160C50, RIPEMD160S5C); RIPEMD160_STEP_S (RIPEMD160_J , c2, d2, e2, a2, b2, w2[2], RIPEMD160C50, RIPEMD160S5D); RIPEMD160_STEP_S (RIPEMD160_J , b2, c2, d2, e2, a2, w0[3], RIPEMD160C50, RIPEMD160S5E); RIPEMD160_STEP_S (RIPEMD160_J , a2, b2, c2, d2, e2, w3[0], RIPEMD160C50, RIPEMD160S5F); RIPEMD160_STEP_S (RIPEMD160_Io, e2, a2, b2, c2, d2, w1[2], RIPEMD160C60, RIPEMD160S60); RIPEMD160_STEP_S (RIPEMD160_Io, d2, e2, a2, b2, c2, w2[3], RIPEMD160C60, RIPEMD160S61); RIPEMD160_STEP_S (RIPEMD160_Io, c2, d2, e2, a2, b2, w0[3], RIPEMD160C60, RIPEMD160S62); RIPEMD160_STEP_S (RIPEMD160_Io, b2, c2, d2, e2, a2, w1[3], RIPEMD160C60, RIPEMD160S63); RIPEMD160_STEP_S (RIPEMD160_Io, a2, b2, c2, d2, e2, w0[0], RIPEMD160C60, RIPEMD160S64); RIPEMD160_STEP_S (RIPEMD160_Io, e2, a2, b2, c2, d2, w3[1], RIPEMD160C60, RIPEMD160S65); RIPEMD160_STEP_S (RIPEMD160_Io, d2, e2, a2, b2, c2, w1[1], RIPEMD160C60, RIPEMD160S66); RIPEMD160_STEP_S (RIPEMD160_Io, c2, d2, e2, a2, b2, w2[2], RIPEMD160C60, RIPEMD160S67); RIPEMD160_STEP_S (RIPEMD160_Io, b2, c2, d2, e2, a2, w3[2], RIPEMD160C60, RIPEMD160S68); RIPEMD160_STEP_S (RIPEMD160_Io, a2, b2, c2, d2, e2, w3[3], RIPEMD160C60, RIPEMD160S69); RIPEMD160_STEP_S (RIPEMD160_Io, e2, a2, b2, c2, d2, w2[0], RIPEMD160C60, RIPEMD160S6A); RIPEMD160_STEP_S (RIPEMD160_Io, d2, e2, a2, b2, c2, w3[0], RIPEMD160C60, RIPEMD160S6B); RIPEMD160_STEP_S (RIPEMD160_Io, c2, d2, e2, a2, b2, w1[0], RIPEMD160C60, RIPEMD160S6C); RIPEMD160_STEP_S (RIPEMD160_Io, b2, c2, d2, e2, a2, w2[1], RIPEMD160C60, RIPEMD160S6D); RIPEMD160_STEP_S (RIPEMD160_Io, a2, b2, c2, d2, e2, w0[1], RIPEMD160C60, RIPEMD160S6E); RIPEMD160_STEP_S (RIPEMD160_Io, e2, a2, b2, c2, d2, w0[2], RIPEMD160C60, RIPEMD160S6F); RIPEMD160_STEP_S (RIPEMD160_H , d2, e2, a2, b2, c2, w3[3], RIPEMD160C70, RIPEMD160S70); RIPEMD160_STEP_S (RIPEMD160_H , c2, d2, e2, a2, b2, w1[1], RIPEMD160C70, RIPEMD160S71); RIPEMD160_STEP_S (RIPEMD160_H , b2, c2, d2, e2, a2, w0[1], RIPEMD160C70, RIPEMD160S72); RIPEMD160_STEP_S (RIPEMD160_H , a2, b2, c2, d2, e2, w0[3], RIPEMD160C70, RIPEMD160S73); RIPEMD160_STEP_S (RIPEMD160_H , e2, a2, b2, c2, d2, w1[3], RIPEMD160C70, RIPEMD160S74); RIPEMD160_STEP_S (RIPEMD160_H , d2, e2, a2, b2, c2, w3[2], RIPEMD160C70, RIPEMD160S75); RIPEMD160_STEP_S (RIPEMD160_H , c2, d2, e2, a2, b2, w1[2], RIPEMD160C70, RIPEMD160S76); RIPEMD160_STEP_S (RIPEMD160_H , b2, c2, d2, e2, a2, w2[1], RIPEMD160C70, RIPEMD160S77); RIPEMD160_STEP_S (RIPEMD160_H , a2, b2, c2, d2, e2, w2[3], RIPEMD160C70, RIPEMD160S78); RIPEMD160_STEP_S (RIPEMD160_H , e2, a2, b2, c2, d2, w2[0], RIPEMD160C70, RIPEMD160S79); RIPEMD160_STEP_S (RIPEMD160_H , d2, e2, a2, b2, c2, w3[0], RIPEMD160C70, RIPEMD160S7A); RIPEMD160_STEP_S (RIPEMD160_H , c2, d2, e2, a2, b2, w0[2], RIPEMD160C70, RIPEMD160S7B); RIPEMD160_STEP_S (RIPEMD160_H , b2, c2, d2, e2, a2, w2[2], RIPEMD160C70, RIPEMD160S7C); RIPEMD160_STEP_S (RIPEMD160_H , a2, b2, c2, d2, e2, w0[0], RIPEMD160C70, RIPEMD160S7D); RIPEMD160_STEP_S (RIPEMD160_H , e2, a2, b2, c2, d2, w1[0], RIPEMD160C70, RIPEMD160S7E); RIPEMD160_STEP_S (RIPEMD160_H , d2, e2, a2, b2, c2, w3[1], RIPEMD160C70, RIPEMD160S7F); RIPEMD160_STEP_S (RIPEMD160_Go, c2, d2, e2, a2, b2, w2[0], RIPEMD160C80, RIPEMD160S80); RIPEMD160_STEP_S (RIPEMD160_Go, b2, c2, d2, e2, a2, w1[2], RIPEMD160C80, RIPEMD160S81); RIPEMD160_STEP_S (RIPEMD160_Go, a2, b2, c2, d2, e2, w1[0], RIPEMD160C80, RIPEMD160S82); RIPEMD160_STEP_S (RIPEMD160_Go, e2, a2, b2, c2, d2, w0[1], RIPEMD160C80, RIPEMD160S83); RIPEMD160_STEP_S (RIPEMD160_Go, d2, e2, a2, b2, c2, w0[3], RIPEMD160C80, RIPEMD160S84); RIPEMD160_STEP_S (RIPEMD160_Go, c2, d2, e2, a2, b2, w2[3], RIPEMD160C80, RIPEMD160S85); RIPEMD160_STEP_S (RIPEMD160_Go, b2, c2, d2, e2, a2, w3[3], RIPEMD160C80, RIPEMD160S86); RIPEMD160_STEP_S (RIPEMD160_Go, a2, b2, c2, d2, e2, w0[0], RIPEMD160C80, RIPEMD160S87); RIPEMD160_STEP_S (RIPEMD160_Go, e2, a2, b2, c2, d2, w1[1], RIPEMD160C80, RIPEMD160S88); RIPEMD160_STEP_S (RIPEMD160_Go, d2, e2, a2, b2, c2, w3[0], RIPEMD160C80, RIPEMD160S89); RIPEMD160_STEP_S (RIPEMD160_Go, c2, d2, e2, a2, b2, w0[2], RIPEMD160C80, RIPEMD160S8A); RIPEMD160_STEP_S (RIPEMD160_Go, b2, c2, d2, e2, a2, w3[1], RIPEMD160C80, RIPEMD160S8B); RIPEMD160_STEP_S (RIPEMD160_Go, a2, b2, c2, d2, e2, w2[1], RIPEMD160C80, RIPEMD160S8C); RIPEMD160_STEP_S (RIPEMD160_Go, e2, a2, b2, c2, d2, w1[3], RIPEMD160C80, RIPEMD160S8D); RIPEMD160_STEP_S (RIPEMD160_Go, d2, e2, a2, b2, c2, w2[2], RIPEMD160C80, RIPEMD160S8E); RIPEMD160_STEP_S (RIPEMD160_Go, c2, d2, e2, a2, b2, w3[2], RIPEMD160C80, RIPEMD160S8F); RIPEMD160_STEP_S (RIPEMD160_F , b2, c2, d2, e2, a2, w3[0], RIPEMD160C90, RIPEMD160S90); RIPEMD160_STEP_S (RIPEMD160_F , a2, b2, c2, d2, e2, w3[3], RIPEMD160C90, RIPEMD160S91); RIPEMD160_STEP_S (RIPEMD160_F , e2, a2, b2, c2, d2, w2[2], RIPEMD160C90, RIPEMD160S92); RIPEMD160_STEP_S (RIPEMD160_F , d2, e2, a2, b2, c2, w1[0], RIPEMD160C90, RIPEMD160S93); RIPEMD160_STEP_S (RIPEMD160_F , c2, d2, e2, a2, b2, w0[1], RIPEMD160C90, RIPEMD160S94); RIPEMD160_STEP_S (RIPEMD160_F , b2, c2, d2, e2, a2, w1[1], RIPEMD160C90, RIPEMD160S95); RIPEMD160_STEP_S (RIPEMD160_F , a2, b2, c2, d2, e2, w2[0], RIPEMD160C90, RIPEMD160S96); RIPEMD160_STEP_S (RIPEMD160_F , e2, a2, b2, c2, d2, w1[3], RIPEMD160C90, RIPEMD160S97); RIPEMD160_STEP_S (RIPEMD160_F , d2, e2, a2, b2, c2, w1[2], RIPEMD160C90, RIPEMD160S98); RIPEMD160_STEP_S (RIPEMD160_F , c2, d2, e2, a2, b2, w0[2], RIPEMD160C90, RIPEMD160S99); RIPEMD160_STEP_S (RIPEMD160_F , b2, c2, d2, e2, a2, w3[1], RIPEMD160C90, RIPEMD160S9A); RIPEMD160_STEP_S (RIPEMD160_F , a2, b2, c2, d2, e2, w3[2], RIPEMD160C90, RIPEMD160S9B); RIPEMD160_STEP_S (RIPEMD160_F , e2, a2, b2, c2, d2, w0[0], RIPEMD160C90, RIPEMD160S9C); RIPEMD160_STEP_S (RIPEMD160_F , d2, e2, a2, b2, c2, w0[3], RIPEMD160C90, RIPEMD160S9D); RIPEMD160_STEP_S (RIPEMD160_F , c2, d2, e2, a2, b2, w2[1], RIPEMD160C90, RIPEMD160S9E); RIPEMD160_STEP_S (RIPEMD160_F , b2, c2, d2, e2, a2, w2[3], RIPEMD160C90, RIPEMD160S9F); const u32 a = digest[1] + c1 + d2; const u32 b = digest[2] + d1 + e2; const u32 c = digest[3] + e1 + a2; const u32 d = digest[4] + a1 + b2; const u32 e = digest[0] + b1 + c2; digest[0] = a; digest[1] = b; digest[2] = c; digest[3] = d; digest[4] = e; } void ripemd160_init (ripemd160_ctx_t *ctx) { ctx->h[0] = RIPEMD160M_A; ctx->h[1] = RIPEMD160M_B; ctx->h[2] = RIPEMD160M_C; ctx->h[3] = RIPEMD160M_D; ctx->h[4] = RIPEMD160M_E; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->len = 0; } void ripemd160_update_64 (ripemd160_ctx_t *ctx, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 63; #else const int pos = ctx->len & 63; #endif ctx->len += len; if ((pos + len) < 64) { switch_buffer_by_offset_le_S (w0, w1, w2, w3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; } else { u32 c0[4] = { 0 }; u32 c1[4] = { 0 }; u32 c2[4] = { 0 }; u32 c3[4] = { 0 }; switch_buffer_by_offset_carry_le_S (w0, w1, w2, w3, c0, c1, c2, c3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; ripemd160_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; } } void ripemd160_update (ripemd160_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; ripemd160_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; ripemd160_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void ripemd160_update_swap (ripemd160_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); ripemd160_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); ripemd160_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void ripemd160_update_utf16le (ripemd160_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); ripemd160_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); ripemd160_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void ripemd160_update_utf16le_swap (ripemd160_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); ripemd160_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); ripemd160_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void ripemd160_update_global (ripemd160_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; ripemd160_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; ripemd160_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void ripemd160_update_global_swap (ripemd160_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); ripemd160_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); ripemd160_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void ripemd160_update_global_utf16le (ripemd160_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); ripemd160_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); ripemd160_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void ripemd160_update_global_utf16le_swap (ripemd160_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); ripemd160_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); ripemd160_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void ripemd160_final (ripemd160_ctx_t *ctx) { const int pos = ctx->len & 63; append_0x80_4x4_S (ctx->w0, ctx->w1, ctx->w2, ctx->w3, pos); if (pos >= 56) { ripemd160_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; } ctx->w3[2] = ctx->len * 8; ctx->w3[3] = 0; ripemd160_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); } // ripemd160_hmac typedef struct ripemd160_hmac_ctx { ripemd160_ctx_t ipad; ripemd160_ctx_t opad; } ripemd160_hmac_ctx_t; void ripemd160_hmac_init_64 (ripemd160_hmac_ctx_t *ctx, const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4]) { u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; ripemd160_init (&ctx->ipad); ripemd160_update_64 (&ctx->ipad, t0, t1, t2, t3, 64); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; ripemd160_init (&ctx->opad); ripemd160_update_64 (&ctx->opad, t0, t1, t2, t3, 64); } void ripemd160_hmac_init (ripemd160_hmac_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { ripemd160_ctx_t tmp; ripemd160_init (&tmp); ripemd160_update (&tmp, w, len); ripemd160_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; 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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } ripemd160_hmac_init_64 (ctx, w0, w1, w2, w3); } void ripemd160_hmac_init_swap (ripemd160_hmac_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { ripemd160_ctx_t tmp; ripemd160_init (&tmp); ripemd160_update_swap (&tmp, w, len); ripemd160_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; 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; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); } ripemd160_hmac_init_64 (ctx, w0, w1, w2, w3); } void ripemd160_hmac_init_global (ripemd160_hmac_ctx_t *ctx, __global const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { ripemd160_ctx_t tmp; ripemd160_init (&tmp); ripemd160_update_global (&tmp, w, len); ripemd160_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; 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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } ripemd160_hmac_init_64 (ctx, w0, w1, w2, w3); } void ripemd160_hmac_init_global_swap (ripemd160_hmac_ctx_t *ctx, __global const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { ripemd160_ctx_t tmp; ripemd160_init (&tmp); ripemd160_update_global_swap (&tmp, w, len); ripemd160_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; 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; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); } ripemd160_hmac_init_64 (ctx, w0, w1, w2, w3); } void ripemd160_hmac_update_64 (ripemd160_hmac_ctx_t *ctx, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const int len) { ripemd160_update_64 (&ctx->ipad, w0, w1, w2, w3, len); } void ripemd160_hmac_update (ripemd160_hmac_ctx_t *ctx, const u32 *w, const int len) { ripemd160_update (&ctx->ipad, w, len); } void ripemd160_hmac_update_swap (ripemd160_hmac_ctx_t *ctx, const u32 *w, const int len) { ripemd160_update_swap (&ctx->ipad, w, len); } void ripemd160_hmac_update_utf16le (ripemd160_hmac_ctx_t *ctx, const u32 *w, const int len) { ripemd160_update_utf16le (&ctx->ipad, w, len); } void ripemd160_hmac_update_utf16le_swap (ripemd160_hmac_ctx_t *ctx, const u32 *w, const int len) { ripemd160_update_utf16le_swap (&ctx->ipad, w, len); } void ripemd160_hmac_update_global (ripemd160_hmac_ctx_t *ctx, const __global u32 *w, const int len) { ripemd160_update_global (&ctx->ipad, w, len); } void ripemd160_hmac_update_global_swap (ripemd160_hmac_ctx_t *ctx, const __global u32 *w, const int len) { ripemd160_update_global_swap (&ctx->ipad, w, len); } void ripemd160_hmac_update_global_utf16le (ripemd160_hmac_ctx_t *ctx, const __global u32 *w, const int len) { ripemd160_update_global_utf16le (&ctx->ipad, w, len); } void ripemd160_hmac_update_global_utf16le_swap (ripemd160_hmac_ctx_t *ctx, const __global u32 *w, const int len) { ripemd160_update_global_utf16le_swap (&ctx->ipad, w, len); } void ripemd160_hmac_final (ripemd160_hmac_ctx_t *ctx) { ripemd160_final (&ctx->ipad); u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; t0[0] = ctx->ipad.h[0]; t0[1] = ctx->ipad.h[1]; t0[2] = ctx->ipad.h[2]; t0[3] = ctx->ipad.h[3]; t1[0] = ctx->ipad.h[4]; t1[1] = 0; t1[2] = 0; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; ripemd160_update_64 (&ctx->opad, t0, t1, t2, t3, 20); ripemd160_final (&ctx->opad); } // while input buf can be a vector datatype, the length of the different elements can not typedef struct ripemd160_ctx_vector { u32x h[5]; u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int len; } ripemd160_ctx_vector_t; void ripemd160_transform_vector (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) { u32x a1 = digest[0]; u32x b1 = digest[1]; u32x c1 = digest[2]; u32x d1 = digest[3]; u32x e1 = digest[4]; RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w0[0], RIPEMD160C00, RIPEMD160S00); RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w0[1], RIPEMD160C00, RIPEMD160S01); RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w0[2], RIPEMD160C00, RIPEMD160S02); RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w0[3], RIPEMD160C00, RIPEMD160S03); RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w1[0], RIPEMD160C00, RIPEMD160S04); RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w1[1], RIPEMD160C00, RIPEMD160S05); RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w1[2], RIPEMD160C00, RIPEMD160S06); RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w1[3], RIPEMD160C00, RIPEMD160S07); RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w2[0], RIPEMD160C00, RIPEMD160S08); RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w2[1], RIPEMD160C00, RIPEMD160S09); RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w2[2], RIPEMD160C00, RIPEMD160S0A); RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w2[3], RIPEMD160C00, RIPEMD160S0B); RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w3[0], RIPEMD160C00, RIPEMD160S0C); RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w3[1], RIPEMD160C00, RIPEMD160S0D); RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w3[2], RIPEMD160C00, RIPEMD160S0E); RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w3[3], RIPEMD160C00, RIPEMD160S0F); RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w1[3], RIPEMD160C10, RIPEMD160S10); RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w1[0], RIPEMD160C10, RIPEMD160S11); RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w3[1], RIPEMD160C10, RIPEMD160S12); RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w0[1], RIPEMD160C10, RIPEMD160S13); RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w2[2], RIPEMD160C10, RIPEMD160S14); RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w1[2], RIPEMD160C10, RIPEMD160S15); RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w3[3], RIPEMD160C10, RIPEMD160S16); RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w0[3], RIPEMD160C10, RIPEMD160S17); RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w3[0], RIPEMD160C10, RIPEMD160S18); RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w0[0], RIPEMD160C10, RIPEMD160S19); RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w2[1], RIPEMD160C10, RIPEMD160S1A); RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w1[1], RIPEMD160C10, RIPEMD160S1B); RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w0[2], RIPEMD160C10, RIPEMD160S1C); RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w3[2], RIPEMD160C10, RIPEMD160S1D); RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w2[3], RIPEMD160C10, RIPEMD160S1E); RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w2[0], RIPEMD160C10, RIPEMD160S1F); RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w0[3], RIPEMD160C20, RIPEMD160S20); RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w2[2], RIPEMD160C20, RIPEMD160S21); RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w3[2], RIPEMD160C20, RIPEMD160S22); RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w1[0], RIPEMD160C20, RIPEMD160S23); RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w2[1], RIPEMD160C20, RIPEMD160S24); RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w3[3], RIPEMD160C20, RIPEMD160S25); RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w2[0], RIPEMD160C20, RIPEMD160S26); RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w0[1], RIPEMD160C20, RIPEMD160S27); RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w0[2], RIPEMD160C20, RIPEMD160S28); RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w1[3], RIPEMD160C20, RIPEMD160S29); RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w0[0], RIPEMD160C20, RIPEMD160S2A); RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w1[2], RIPEMD160C20, RIPEMD160S2B); RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w3[1], RIPEMD160C20, RIPEMD160S2C); RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w2[3], RIPEMD160C20, RIPEMD160S2D); RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w1[1], RIPEMD160C20, RIPEMD160S2E); RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w3[0], RIPEMD160C20, RIPEMD160S2F); RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w0[1], RIPEMD160C30, RIPEMD160S30); RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w2[1], RIPEMD160C30, RIPEMD160S31); RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w2[3], RIPEMD160C30, RIPEMD160S32); RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w2[2], RIPEMD160C30, RIPEMD160S33); RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w0[0], RIPEMD160C30, RIPEMD160S34); RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w2[0], RIPEMD160C30, RIPEMD160S35); RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w3[0], RIPEMD160C30, RIPEMD160S36); RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w1[0], RIPEMD160C30, RIPEMD160S37); RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w3[1], RIPEMD160C30, RIPEMD160S38); RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w0[3], RIPEMD160C30, RIPEMD160S39); RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w1[3], RIPEMD160C30, RIPEMD160S3A); RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w3[3], RIPEMD160C30, RIPEMD160S3B); RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w3[2], RIPEMD160C30, RIPEMD160S3C); RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w1[1], RIPEMD160C30, RIPEMD160S3D); RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w1[2], RIPEMD160C30, RIPEMD160S3E); RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w0[2], RIPEMD160C30, RIPEMD160S3F); RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w1[0], RIPEMD160C40, RIPEMD160S40); RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w0[0], RIPEMD160C40, RIPEMD160S41); RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w1[1], RIPEMD160C40, RIPEMD160S42); RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w2[1], RIPEMD160C40, RIPEMD160S43); RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w1[3], RIPEMD160C40, RIPEMD160S44); RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w3[0], RIPEMD160C40, RIPEMD160S45); RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w0[2], RIPEMD160C40, RIPEMD160S46); RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w2[2], RIPEMD160C40, RIPEMD160S47); RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w3[2], RIPEMD160C40, RIPEMD160S48); RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w0[1], RIPEMD160C40, RIPEMD160S49); RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w0[3], RIPEMD160C40, RIPEMD160S4A); RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w2[0], RIPEMD160C40, RIPEMD160S4B); RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w2[3], RIPEMD160C40, RIPEMD160S4C); RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w1[2], RIPEMD160C40, RIPEMD160S4D); RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w3[3], RIPEMD160C40, RIPEMD160S4E); RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w3[1], RIPEMD160C40, RIPEMD160S4F); u32x a2 = digest[0]; u32x b2 = digest[1]; u32x c2 = digest[2]; u32x d2 = digest[3]; u32x e2 = digest[4]; RIPEMD160_STEP_WORKAROUND_BUG (RIPEMD160_J , a2, b2, c2, d2, e2, w1[1], RIPEMD160C50, RIPEMD160S50); RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w3[2], RIPEMD160C50, RIPEMD160S51); RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w1[3], RIPEMD160C50, RIPEMD160S52); RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w0[0], RIPEMD160C50, RIPEMD160S53); RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w2[1], RIPEMD160C50, RIPEMD160S54); RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w0[2], RIPEMD160C50, RIPEMD160S55); RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w2[3], RIPEMD160C50, RIPEMD160S56); RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w1[0], RIPEMD160C50, RIPEMD160S57); RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w3[1], RIPEMD160C50, RIPEMD160S58); RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w1[2], RIPEMD160C50, RIPEMD160S59); RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w3[3], RIPEMD160C50, RIPEMD160S5A); RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w2[0], RIPEMD160C50, RIPEMD160S5B); RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w0[1], RIPEMD160C50, RIPEMD160S5C); RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w2[2], RIPEMD160C50, RIPEMD160S5D); RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w0[3], RIPEMD160C50, RIPEMD160S5E); RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w3[0], RIPEMD160C50, RIPEMD160S5F); RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w1[2], RIPEMD160C60, RIPEMD160S60); RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w2[3], RIPEMD160C60, RIPEMD160S61); RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w0[3], RIPEMD160C60, RIPEMD160S62); RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w1[3], RIPEMD160C60, RIPEMD160S63); RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w0[0], RIPEMD160C60, RIPEMD160S64); RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w3[1], RIPEMD160C60, RIPEMD160S65); RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w1[1], RIPEMD160C60, RIPEMD160S66); RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w2[2], RIPEMD160C60, RIPEMD160S67); RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w3[2], RIPEMD160C60, RIPEMD160S68); RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w3[3], RIPEMD160C60, RIPEMD160S69); RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w2[0], RIPEMD160C60, RIPEMD160S6A); RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w3[0], RIPEMD160C60, RIPEMD160S6B); RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w1[0], RIPEMD160C60, RIPEMD160S6C); RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w2[1], RIPEMD160C60, RIPEMD160S6D); RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w0[1], RIPEMD160C60, RIPEMD160S6E); RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w0[2], RIPEMD160C60, RIPEMD160S6F); RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w3[3], RIPEMD160C70, RIPEMD160S70); RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w1[1], RIPEMD160C70, RIPEMD160S71); RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w0[1], RIPEMD160C70, RIPEMD160S72); RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w0[3], RIPEMD160C70, RIPEMD160S73); RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w1[3], RIPEMD160C70, RIPEMD160S74); RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w3[2], RIPEMD160C70, RIPEMD160S75); RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w1[2], RIPEMD160C70, RIPEMD160S76); RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w2[1], RIPEMD160C70, RIPEMD160S77); RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w2[3], RIPEMD160C70, RIPEMD160S78); RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w2[0], RIPEMD160C70, RIPEMD160S79); RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w3[0], RIPEMD160C70, RIPEMD160S7A); RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w0[2], RIPEMD160C70, RIPEMD160S7B); RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w2[2], RIPEMD160C70, RIPEMD160S7C); RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w0[0], RIPEMD160C70, RIPEMD160S7D); RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w1[0], RIPEMD160C70, RIPEMD160S7E); RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w3[1], RIPEMD160C70, RIPEMD160S7F); RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w2[0], RIPEMD160C80, RIPEMD160S80); RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w1[2], RIPEMD160C80, RIPEMD160S81); RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w1[0], RIPEMD160C80, RIPEMD160S82); RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w0[1], RIPEMD160C80, RIPEMD160S83); RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w0[3], RIPEMD160C80, RIPEMD160S84); RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w2[3], RIPEMD160C80, RIPEMD160S85); RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w3[3], RIPEMD160C80, RIPEMD160S86); RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w0[0], RIPEMD160C80, RIPEMD160S87); RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w1[1], RIPEMD160C80, RIPEMD160S88); RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w3[0], RIPEMD160C80, RIPEMD160S89); RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w0[2], RIPEMD160C80, RIPEMD160S8A); RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w3[1], RIPEMD160C80, RIPEMD160S8B); RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w2[1], RIPEMD160C80, RIPEMD160S8C); RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w1[3], RIPEMD160C80, RIPEMD160S8D); RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w2[2], RIPEMD160C80, RIPEMD160S8E); RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w3[2], RIPEMD160C80, RIPEMD160S8F); RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w3[0], RIPEMD160C90, RIPEMD160S90); RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w3[3], RIPEMD160C90, RIPEMD160S91); RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w2[2], RIPEMD160C90, RIPEMD160S92); RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w1[0], RIPEMD160C90, RIPEMD160S93); RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w0[1], RIPEMD160C90, RIPEMD160S94); RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w1[1], RIPEMD160C90, RIPEMD160S95); RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w2[0], RIPEMD160C90, RIPEMD160S96); RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w1[3], RIPEMD160C90, RIPEMD160S97); RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w1[2], RIPEMD160C90, RIPEMD160S98); RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w0[2], RIPEMD160C90, RIPEMD160S99); RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w3[1], RIPEMD160C90, RIPEMD160S9A); RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w3[2], RIPEMD160C90, RIPEMD160S9B); RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w0[0], RIPEMD160C90, RIPEMD160S9C); RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w0[3], RIPEMD160C90, RIPEMD160S9D); RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w2[1], RIPEMD160C90, RIPEMD160S9E); RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w2[3], RIPEMD160C90, RIPEMD160S9F); const u32x a = digest[1] + c1 + d2; const u32x b = digest[2] + d1 + e2; const u32x c = digest[3] + e1 + a2; const u32x d = digest[4] + a1 + b2; const u32x e = digest[0] + b1 + c2; digest[0] = a; digest[1] = b; digest[2] = c; digest[3] = d; digest[4] = e; } void ripemd160_init_vector (ripemd160_ctx_vector_t *ctx) { ctx->h[0] = RIPEMD160M_A; ctx->h[1] = RIPEMD160M_B; ctx->h[2] = RIPEMD160M_C; ctx->h[3] = RIPEMD160M_D; ctx->h[4] = RIPEMD160M_E; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->len = 0; } void ripemd160_init_vector_from_scalar (ripemd160_ctx_vector_t *ctx, ripemd160_ctx_t *ctx0) { ctx->h[0] = ctx0->h[0]; ctx->h[1] = ctx0->h[1]; ctx->h[2] = ctx0->h[2]; ctx->h[3] = ctx0->h[3]; ctx->h[4] = ctx0->h[4]; ctx->w0[0] = ctx0->w0[0]; ctx->w0[1] = ctx0->w0[1]; ctx->w0[2] = ctx0->w0[2]; ctx->w0[3] = ctx0->w0[3]; ctx->w1[0] = ctx0->w1[0]; ctx->w1[1] = ctx0->w1[1]; ctx->w1[2] = ctx0->w1[2]; ctx->w1[3] = ctx0->w1[3]; ctx->w2[0] = ctx0->w2[0]; ctx->w2[1] = ctx0->w2[1]; ctx->w2[2] = ctx0->w2[2]; ctx->w2[3] = ctx0->w2[3]; ctx->w3[0] = ctx0->w3[0]; ctx->w3[1] = ctx0->w3[1]; ctx->w3[2] = ctx0->w3[2]; ctx->w3[3] = ctx0->w3[3]; ctx->len = ctx0->len; } void ripemd160_update_vector_64 (ripemd160_ctx_vector_t *ctx, u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 63; #else const int pos = ctx->len & 63; #endif ctx->len += len; if ((pos + len) < 64) { switch_buffer_by_offset_le (w0, w1, w2, w3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; } else { u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_le (w0, w1, w2, w3, c0, c1, c2, c3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; ripemd160_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; } } void ripemd160_update_vector (ripemd160_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; ripemd160_update_vector_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; ripemd160_update_vector_64 (ctx, w0, w1, w2, w3, len - pos1); } void ripemd160_update_vector_swap (ripemd160_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); ripemd160_update_vector_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); ripemd160_update_vector_64 (ctx, w0, w1, w2, w3, len - pos1); } void ripemd160_update_vector_utf16le (ripemd160_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); ripemd160_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); ripemd160_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void ripemd160_update_vector_utf16le_swap (ripemd160_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); ripemd160_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); ripemd160_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void ripemd160_final_vector (ripemd160_ctx_vector_t *ctx) { const int pos = ctx->len & 63; append_0x80_4x4 (ctx->w0, ctx->w1, ctx->w2, ctx->w3, pos); if (pos >= 56) { ripemd160_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; } ctx->w3[2] = ctx->len * 8; ctx->w3[3] = 0; ripemd160_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); } // HMAC + Vector typedef struct ripemd160_hmac_ctx_vector { ripemd160_ctx_vector_t ipad; ripemd160_ctx_vector_t opad; } ripemd160_hmac_ctx_vector_t; void ripemd160_hmac_init_vector_64 (ripemd160_hmac_ctx_vector_t *ctx, const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4]) { u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; ripemd160_init_vector (&ctx->ipad); ripemd160_update_vector_64 (&ctx->ipad, t0, t1, t2, t3, 64); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; ripemd160_init_vector (&ctx->opad); ripemd160_update_vector_64 (&ctx->opad, t0, t1, t2, t3, 64); } void ripemd160_hmac_init_vector (ripemd160_hmac_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; if (len > 64) { ripemd160_ctx_vector_t tmp; ripemd160_init_vector (&tmp); ripemd160_update_vector (&tmp, w, len); ripemd160_final_vector (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; 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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } ripemd160_hmac_init_vector_64 (ctx, w0, w1, w2, w3); } void ripemd160_hmac_update_vector_64 (ripemd160_hmac_ctx_vector_t *ctx, u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const int len) { ripemd160_update_vector_64 (&ctx->ipad, w0, w1, w2, w3, len); } void ripemd160_hmac_update_vector (ripemd160_hmac_ctx_vector_t *ctx, const u32x *w, const int len) { ripemd160_update_vector (&ctx->ipad, w, len); } void ripemd160_hmac_final_vector (ripemd160_hmac_ctx_vector_t *ctx) { ripemd160_final_vector (&ctx->ipad); u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = ctx->ipad.h[0]; t0[1] = ctx->ipad.h[1]; t0[2] = ctx->ipad.h[2]; t0[3] = ctx->ipad.h[3]; t1[0] = ctx->ipad.h[4]; t1[1] = 0; t1[2] = 0; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; ripemd160_update_vector_64 (&ctx->opad, t0, t1, t2, t3, 20); ripemd160_final_vector (&ctx->opad); } hashcat-4.0.1/OpenCL/inc_hash_sha1.cl000066400000000000000000001601041320027462700172640ustar00rootroot00000000000000 // important notes on this: // input buf unused bytes needs to be set to zero // input buf needs to be in algorithm native byte order (md5 = LE, sha1 = BE, etc) // input buf needs to be 64 byte aligned when using md5_update() typedef struct sha1_ctx { u32 h[5]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int len; } sha1_ctx_t; void sha1_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[5]) { u32 a = digest[0]; u32 b = digest[1]; u32 c = digest[2]; u32 d = digest[3]; u32 e = digest[4]; u32 w0_t = w0[0]; u32 w1_t = w0[1]; u32 w2_t = w0[2]; u32 w3_t = w0[3]; u32 w4_t = w1[0]; u32 w5_t = w1[1]; u32 w6_t = w1[2]; u32 w7_t = w1[3]; u32 w8_t = w2[0]; u32 w9_t = w2[1]; u32 wa_t = w2[2]; u32 wb_t = w2[3]; u32 wc_t = w3[0]; u32 wd_t = w3[1]; u32 we_t = w3[2]; u32 wf_t = w3[3]; #define K SHA1C00 SHA1_STEP_S (SHA1_F0o, a, b, c, d, e, w0_t); SHA1_STEP_S (SHA1_F0o, e, a, b, c, d, w1_t); SHA1_STEP_S (SHA1_F0o, d, e, a, b, c, w2_t); SHA1_STEP_S (SHA1_F0o, c, d, e, a, b, w3_t); SHA1_STEP_S (SHA1_F0o, b, c, d, e, a, w4_t); SHA1_STEP_S (SHA1_F0o, a, b, c, d, e, w5_t); SHA1_STEP_S (SHA1_F0o, e, a, b, c, d, w6_t); SHA1_STEP_S (SHA1_F0o, d, e, a, b, c, w7_t); SHA1_STEP_S (SHA1_F0o, c, d, e, a, b, w8_t); SHA1_STEP_S (SHA1_F0o, b, c, d, e, a, w9_t); SHA1_STEP_S (SHA1_F0o, a, b, c, d, e, wa_t); SHA1_STEP_S (SHA1_F0o, e, a, b, c, d, wb_t); SHA1_STEP_S (SHA1_F0o, d, e, a, b, c, wc_t); SHA1_STEP_S (SHA1_F0o, c, d, e, a, b, wd_t); SHA1_STEP_S (SHA1_F0o, b, c, d, e, a, we_t); SHA1_STEP_S (SHA1_F0o, a, b, c, d, e, wf_t); w0_t = rotl32_S ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP_S (SHA1_F0o, e, a, b, c, d, w0_t); w1_t = rotl32_S ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP_S (SHA1_F0o, d, e, a, b, c, w1_t); w2_t = rotl32_S ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP_S (SHA1_F0o, c, d, e, a, b, w2_t); w3_t = rotl32_S ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP_S (SHA1_F0o, b, c, d, e, a, w3_t); #undef K #define K SHA1C01 w4_t = rotl32_S ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP_S (SHA1_F1, a, b, c, d, e, w4_t); w5_t = rotl32_S ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP_S (SHA1_F1, e, a, b, c, d, w5_t); w6_t = rotl32_S ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP_S (SHA1_F1, d, e, a, b, c, w6_t); w7_t = rotl32_S ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP_S (SHA1_F1, c, d, e, a, b, w7_t); w8_t = rotl32_S ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP_S (SHA1_F1, b, c, d, e, a, w8_t); w9_t = rotl32_S ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP_S (SHA1_F1, a, b, c, d, e, w9_t); wa_t = rotl32_S ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP_S (SHA1_F1, e, a, b, c, d, wa_t); wb_t = rotl32_S ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP_S (SHA1_F1, d, e, a, b, c, wb_t); wc_t = rotl32_S ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP_S (SHA1_F1, c, d, e, a, b, wc_t); wd_t = rotl32_S ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP_S (SHA1_F1, b, c, d, e, a, wd_t); we_t = rotl32_S ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP_S (SHA1_F1, a, b, c, d, e, we_t); wf_t = rotl32_S ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP_S (SHA1_F1, e, a, b, c, d, wf_t); w0_t = rotl32_S ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP_S (SHA1_F1, d, e, a, b, c, w0_t); w1_t = rotl32_S ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP_S (SHA1_F1, c, d, e, a, b, w1_t); w2_t = rotl32_S ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP_S (SHA1_F1, b, c, d, e, a, w2_t); w3_t = rotl32_S ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP_S (SHA1_F1, a, b, c, d, e, w3_t); w4_t = rotl32_S ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP_S (SHA1_F1, e, a, b, c, d, w4_t); w5_t = rotl32_S ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP_S (SHA1_F1, d, e, a, b, c, w5_t); w6_t = rotl32_S ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP_S (SHA1_F1, c, d, e, a, b, w6_t); w7_t = rotl32_S ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP_S (SHA1_F1, b, c, d, e, a, w7_t); #undef K #define K SHA1C02 w8_t = rotl32_S ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP_S (SHA1_F2o, a, b, c, d, e, w8_t); w9_t = rotl32_S ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP_S (SHA1_F2o, e, a, b, c, d, w9_t); wa_t = rotl32_S ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP_S (SHA1_F2o, d, e, a, b, c, wa_t); wb_t = rotl32_S ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP_S (SHA1_F2o, c, d, e, a, b, wb_t); wc_t = rotl32_S ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP_S (SHA1_F2o, b, c, d, e, a, wc_t); wd_t = rotl32_S ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP_S (SHA1_F2o, a, b, c, d, e, wd_t); we_t = rotl32_S ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP_S (SHA1_F2o, e, a, b, c, d, we_t); wf_t = rotl32_S ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP_S (SHA1_F2o, d, e, a, b, c, wf_t); w0_t = rotl32_S ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP_S (SHA1_F2o, c, d, e, a, b, w0_t); w1_t = rotl32_S ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP_S (SHA1_F2o, b, c, d, e, a, w1_t); w2_t = rotl32_S ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP_S (SHA1_F2o, a, b, c, d, e, w2_t); w3_t = rotl32_S ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP_S (SHA1_F2o, e, a, b, c, d, w3_t); w4_t = rotl32_S ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP_S (SHA1_F2o, d, e, a, b, c, w4_t); w5_t = rotl32_S ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP_S (SHA1_F2o, c, d, e, a, b, w5_t); w6_t = rotl32_S ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP_S (SHA1_F2o, b, c, d, e, a, w6_t); w7_t = rotl32_S ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP_S (SHA1_F2o, a, b, c, d, e, w7_t); w8_t = rotl32_S ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP_S (SHA1_F2o, e, a, b, c, d, w8_t); w9_t = rotl32_S ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP_S (SHA1_F2o, d, e, a, b, c, w9_t); wa_t = rotl32_S ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP_S (SHA1_F2o, c, d, e, a, b, wa_t); wb_t = rotl32_S ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP_S (SHA1_F2o, b, c, d, e, a, wb_t); #undef K #define K SHA1C03 wc_t = rotl32_S ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP_S (SHA1_F1, a, b, c, d, e, wc_t); wd_t = rotl32_S ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP_S (SHA1_F1, e, a, b, c, d, wd_t); we_t = rotl32_S ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP_S (SHA1_F1, d, e, a, b, c, we_t); wf_t = rotl32_S ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP_S (SHA1_F1, c, d, e, a, b, wf_t); w0_t = rotl32_S ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP_S (SHA1_F1, b, c, d, e, a, w0_t); w1_t = rotl32_S ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP_S (SHA1_F1, a, b, c, d, e, w1_t); w2_t = rotl32_S ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP_S (SHA1_F1, e, a, b, c, d, w2_t); w3_t = rotl32_S ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP_S (SHA1_F1, d, e, a, b, c, w3_t); w4_t = rotl32_S ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP_S (SHA1_F1, c, d, e, a, b, w4_t); w5_t = rotl32_S ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP_S (SHA1_F1, b, c, d, e, a, w5_t); w6_t = rotl32_S ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP_S (SHA1_F1, a, b, c, d, e, w6_t); w7_t = rotl32_S ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP_S (SHA1_F1, e, a, b, c, d, w7_t); w8_t = rotl32_S ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP_S (SHA1_F1, d, e, a, b, c, w8_t); w9_t = rotl32_S ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP_S (SHA1_F1, c, d, e, a, b, w9_t); wa_t = rotl32_S ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP_S (SHA1_F1, b, c, d, e, a, wa_t); wb_t = rotl32_S ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP_S (SHA1_F1, a, b, c, d, e, wb_t); wc_t = rotl32_S ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP_S (SHA1_F1, e, a, b, c, d, wc_t); wd_t = rotl32_S ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP_S (SHA1_F1, d, e, a, b, c, wd_t); we_t = rotl32_S ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP_S (SHA1_F1, c, d, e, a, b, we_t); wf_t = rotl32_S ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP_S (SHA1_F1, b, c, d, e, a, wf_t); #undef K digest[0] += a; digest[1] += b; digest[2] += c; digest[3] += d; digest[4] += e; } void sha1_init (sha1_ctx_t *ctx) { ctx->h[0] = SHA1M_A; ctx->h[1] = SHA1M_B; ctx->h[2] = SHA1M_C; ctx->h[3] = SHA1M_D; ctx->h[4] = SHA1M_E; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->len = 0; } void sha1_update_64 (sha1_ctx_t *ctx, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 63; #else const int pos = ctx->len & 63; #endif ctx->len += len; if ((pos + len) < 64) { switch_buffer_by_offset_be_S (w0, w1, w2, w3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; } else { u32 c0[4] = { 0 }; u32 c1[4] = { 0 }; u32 c2[4] = { 0 }; u32 c3[4] = { 0 }; switch_buffer_by_offset_carry_be_S (w0, w1, w2, w3, c0, c1, c2, c3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; sha1_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; } } void sha1_update (sha1_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha1_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha1_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha1_update_swap (sha1_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha1_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha1_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha1_update_utf16le (sha1_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha1_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha1_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha1_update_utf16le_swap (sha1_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha1_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha1_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha1_update_utf16be (sha1_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16be_S (w1, w2, w3); make_utf16be_S (w0, w0, w1); sha1_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16be_S (w1, w2, w3); make_utf16be_S (w0, w0, w1); sha1_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha1_update_utf16be_swap (sha1_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16be_S (w1, w2, w3); make_utf16be_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha1_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16be_S (w1, w2, w3); make_utf16be_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha1_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha1_update_global (sha1_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha1_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha1_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha1_update_global_swap (sha1_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha1_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha1_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha1_update_global_utf16le (sha1_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha1_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha1_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha1_update_global_utf16le_swap (sha1_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha1_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha1_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha1_update_global_utf16be (sha1_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16be_S (w1, w2, w3); make_utf16be_S (w0, w0, w1); sha1_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16be_S (w1, w2, w3); make_utf16be_S (w0, w0, w1); sha1_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha1_update_global_utf16be_swap (sha1_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16be_S (w1, w2, w3); make_utf16be_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha1_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16be_S (w1, w2, w3); make_utf16be_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha1_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha1_final (sha1_ctx_t *ctx) { const int pos = ctx->len & 63; append_0x80_4x4_S (ctx->w0, ctx->w1, ctx->w2, ctx->w3, pos ^ 3); if (pos >= 56) { sha1_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; } ctx->w3[2] = 0; ctx->w3[3] = ctx->len * 8; sha1_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); } // sha1_hmac typedef struct sha1_hmac_ctx { sha1_ctx_t ipad; sha1_ctx_t opad; } sha1_hmac_ctx_t; void sha1_hmac_init_64 (sha1_hmac_ctx_t *ctx, const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4]) { u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; sha1_init (&ctx->ipad); sha1_update_64 (&ctx->ipad, t0, t1, t2, t3, 64); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; sha1_init (&ctx->opad); sha1_update_64 (&ctx->opad, t0, t1, t2, t3, 64); } void sha1_hmac_init (sha1_hmac_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { sha1_ctx_t tmp; sha1_init (&tmp); sha1_update (&tmp, w, len); sha1_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; 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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } sha1_hmac_init_64 (ctx, w0, w1, w2, w3); } void sha1_hmac_init_swap (sha1_hmac_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { sha1_ctx_t tmp; sha1_init (&tmp); sha1_update_swap (&tmp, w, len); sha1_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; 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; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); } sha1_hmac_init_64 (ctx, w0, w1, w2, w3); } void sha1_hmac_init_global (sha1_hmac_ctx_t *ctx, __global const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { sha1_ctx_t tmp; sha1_init (&tmp); sha1_update_global (&tmp, w, len); sha1_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; 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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } sha1_hmac_init_64 (ctx, w0, w1, w2, w3); } void sha1_hmac_init_global_swap (sha1_hmac_ctx_t *ctx, __global const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { sha1_ctx_t tmp; sha1_init (&tmp); sha1_update_global_swap (&tmp, w, len); sha1_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; 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; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); } sha1_hmac_init_64 (ctx, w0, w1, w2, w3); } void sha1_hmac_update_64 (sha1_hmac_ctx_t *ctx, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const int len) { sha1_update_64 (&ctx->ipad, w0, w1, w2, w3, len); } void sha1_hmac_update (sha1_hmac_ctx_t *ctx, const u32 *w, const int len) { sha1_update (&ctx->ipad, w, len); } void sha1_hmac_update_swap (sha1_hmac_ctx_t *ctx, const u32 *w, const int len) { sha1_update_swap (&ctx->ipad, w, len); } void sha1_hmac_update_utf16le (sha1_hmac_ctx_t *ctx, const u32 *w, const int len) { sha1_update_utf16le (&ctx->ipad, w, len); } void sha1_hmac_update_utf16le_swap (sha1_hmac_ctx_t *ctx, const u32 *w, const int len) { sha1_update_utf16le_swap (&ctx->ipad, w, len); } void sha1_hmac_update_global (sha1_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha1_update_global (&ctx->ipad, w, len); } void sha1_hmac_update_global_swap (sha1_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha1_update_global_swap (&ctx->ipad, w, len); } void sha1_hmac_update_global_utf16le (sha1_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha1_update_global_utf16le (&ctx->ipad, w, len); } void sha1_hmac_update_global_utf16le_swap (sha1_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha1_update_global_utf16le_swap (&ctx->ipad, w, len); } void sha1_hmac_final (sha1_hmac_ctx_t *ctx) { sha1_final (&ctx->ipad); u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; t0[0] = ctx->ipad.h[0]; t0[1] = ctx->ipad.h[1]; t0[2] = ctx->ipad.h[2]; t0[3] = ctx->ipad.h[3]; t1[0] = ctx->ipad.h[4]; t1[1] = 0; t1[2] = 0; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; sha1_update_64 (&ctx->opad, t0, t1, t2, t3, 20); sha1_final (&ctx->opad); } // while input buf can be a vector datatype, the length of the different elements can not typedef struct sha1_ctx_vector { u32x h[5]; u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int len; } sha1_ctx_vector_t; void sha1_transform_vector (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]; #define K SHA1C00 SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); #undef K #define K SHA1C01 w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); #undef K #define K SHA1C02 w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); #undef K #define K SHA1C03 wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_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); #undef K digest[0] += a; digest[1] += b; digest[2] += c; digest[3] += d; digest[4] += e; } void sha1_init_vector (sha1_ctx_vector_t *ctx) { ctx->h[0] = SHA1M_A; ctx->h[1] = SHA1M_B; ctx->h[2] = SHA1M_C; ctx->h[3] = SHA1M_D; ctx->h[4] = SHA1M_E; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->len = 0; } void sha1_init_vector_from_scalar (sha1_ctx_vector_t *ctx, sha1_ctx_t *ctx0) { ctx->h[0] = ctx0->h[0]; ctx->h[1] = ctx0->h[1]; ctx->h[2] = ctx0->h[2]; ctx->h[3] = ctx0->h[3]; ctx->h[4] = ctx0->h[4]; ctx->w0[0] = ctx0->w0[0]; ctx->w0[1] = ctx0->w0[1]; ctx->w0[2] = ctx0->w0[2]; ctx->w0[3] = ctx0->w0[3]; ctx->w1[0] = ctx0->w1[0]; ctx->w1[1] = ctx0->w1[1]; ctx->w1[2] = ctx0->w1[2]; ctx->w1[3] = ctx0->w1[3]; ctx->w2[0] = ctx0->w2[0]; ctx->w2[1] = ctx0->w2[1]; ctx->w2[2] = ctx0->w2[2]; ctx->w2[3] = ctx0->w2[3]; ctx->w3[0] = ctx0->w3[0]; ctx->w3[1] = ctx0->w3[1]; ctx->w3[2] = ctx0->w3[2]; ctx->w3[3] = ctx0->w3[3]; ctx->len = ctx0->len; } void sha1_update_vector_64 (sha1_ctx_vector_t *ctx, u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 63; #else const int pos = ctx->len & 63; #endif ctx->len += len; if ((pos + len) < 64) { switch_buffer_by_offset_be (w0, w1, w2, w3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; } else { u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_be (w0, w1, w2, w3, c0, c1, c2, c3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; sha1_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; } } void sha1_update_vector (sha1_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha1_update_vector_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha1_update_vector_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha1_update_vector_swap (sha1_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); sha1_update_vector_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); sha1_update_vector_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha1_update_vector_utf16le (sha1_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); sha1_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); sha1_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha1_update_vector_utf16le_swap (sha1_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); sha1_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); sha1_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha1_update_vector_utf16leN (sha1_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16leN (w1, w2, w3); make_utf16leN (w0, w0, w1); sha1_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16leN (w1, w2, w3); make_utf16leN (w0, w0, w1); sha1_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha1_update_vector_utf16beN (sha1_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16beN (w1, w2, w3); make_utf16beN (w0, w0, w1); sha1_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16beN (w1, w2, w3); make_utf16beN (w0, w0, w1); sha1_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha1_final_vector (sha1_ctx_vector_t *ctx) { const int pos = ctx->len & 63; append_0x80_4x4 (ctx->w0, ctx->w1, ctx->w2, ctx->w3, pos ^ 3); if (pos >= 56) { sha1_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; } ctx->w3[2] = 0; ctx->w3[3] = ctx->len * 8; sha1_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); } // HMAC + Vector typedef struct sha1_hmac_ctx_vector { sha1_ctx_vector_t ipad; sha1_ctx_vector_t opad; } sha1_hmac_ctx_vector_t; void sha1_hmac_init_vector_64 (sha1_hmac_ctx_vector_t *ctx, const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4]) { u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; sha1_init_vector (&ctx->ipad); sha1_update_vector_64 (&ctx->ipad, t0, t1, t2, t3, 64); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; sha1_init_vector (&ctx->opad); sha1_update_vector_64 (&ctx->opad, t0, t1, t2, t3, 64); } void sha1_hmac_init_vector (sha1_hmac_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; if (len > 64) { sha1_ctx_vector_t tmp; sha1_init_vector (&tmp); sha1_update_vector (&tmp, w, len); sha1_final_vector (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; 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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } sha1_hmac_init_vector_64 (ctx, w0, w1, w2, w3); } void sha1_hmac_update_vector_64 (sha1_hmac_ctx_vector_t *ctx, u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const int len) { sha1_update_vector_64 (&ctx->ipad, w0, w1, w2, w3, len); } void sha1_hmac_update_vector (sha1_hmac_ctx_vector_t *ctx, const u32x *w, const int len) { sha1_update_vector (&ctx->ipad, w, len); } void sha1_hmac_final_vector (sha1_hmac_ctx_vector_t *ctx) { sha1_final_vector (&ctx->ipad); u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = ctx->ipad.h[0]; t0[1] = ctx->ipad.h[1]; t0[2] = ctx->ipad.h[2]; t0[3] = ctx->ipad.h[3]; t1[0] = ctx->ipad.h[4]; t1[1] = 0; t1[2] = 0; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; sha1_update_vector_64 (&ctx->opad, t0, t1, t2, t3, 20); sha1_final_vector (&ctx->opad); } hashcat-4.0.1/OpenCL/inc_hash_sha224.cl000066400000000000000000001272711320027462700174430ustar00rootroot00000000000000 // important notes on this: // input buf unused bytes needs to be set to zero // input buf needs to be in algorithm native byte order (md5 = LE, sha256 = BE, etc) // input buf needs to be 64 byte aligned when using md5_update() __constant u32a 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, }; typedef struct sha224_ctx { u32 h[8]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int len; } sha224_ctx_t; void sha224_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[8]) { u32 a = digest[0]; u32 b = digest[1]; u32 c = digest[2]; u32 d = digest[3]; u32 e = digest[4]; u32 f = digest[5]; u32 g = digest[6]; u32 h = digest[7]; u32 w0_t = w0[0]; u32 w1_t = w0[1]; u32 w2_t = w0[2]; u32 w3_t = w0[3]; u32 w4_t = w1[0]; u32 w5_t = w1[1]; u32 w6_t = w1[2]; u32 w7_t = w1[3]; u32 w8_t = w2[0]; u32 w9_t = w2[1]; u32 wa_t = w2[2]; u32 wb_t = w2[3]; u32 wc_t = w3[0]; u32 wd_t = w3[1]; u32 we_t = w3[2]; u32 wf_t = w3[3]; #define ROUND_EXPAND_S() \ { \ w0_t = SHA256_EXPAND_S (we_t, w9_t, w1_t, w0_t); \ w1_t = SHA256_EXPAND_S (wf_t, wa_t, w2_t, w1_t); \ w2_t = SHA256_EXPAND_S (w0_t, wb_t, w3_t, w2_t); \ w3_t = SHA256_EXPAND_S (w1_t, wc_t, w4_t, w3_t); \ w4_t = SHA256_EXPAND_S (w2_t, wd_t, w5_t, w4_t); \ w5_t = SHA256_EXPAND_S (w3_t, we_t, w6_t, w5_t); \ w6_t = SHA256_EXPAND_S (w4_t, wf_t, w7_t, w6_t); \ w7_t = SHA256_EXPAND_S (w5_t, w0_t, w8_t, w7_t); \ w8_t = SHA256_EXPAND_S (w6_t, w1_t, w9_t, w8_t); \ w9_t = SHA256_EXPAND_S (w7_t, w2_t, wa_t, w9_t); \ wa_t = SHA256_EXPAND_S (w8_t, w3_t, wb_t, wa_t); \ wb_t = SHA256_EXPAND_S (w9_t, w4_t, wc_t, wb_t); \ wc_t = SHA256_EXPAND_S (wa_t, w5_t, wd_t, wc_t); \ wd_t = SHA256_EXPAND_S (wb_t, w6_t, we_t, wd_t); \ we_t = SHA256_EXPAND_S (wc_t, w7_t, wf_t, we_t); \ wf_t = SHA256_EXPAND_S (wd_t, w8_t, w0_t, wf_t); \ } #define ROUND_STEP_S(i) \ { \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ } ROUND_STEP_S (0); #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i += 16) { ROUND_EXPAND_S (); ROUND_STEP_S (i); } #undef ROUND_EXPAND_S #undef ROUND_STEP_S digest[0] += a; digest[1] += b; digest[2] += c; digest[3] += d; digest[4] += e; digest[5] += f; digest[6] += g; digest[7] += h; } void sha224_init (sha224_ctx_t *ctx) { ctx->h[0] = SHA224M_A; ctx->h[1] = SHA224M_B; ctx->h[2] = SHA224M_C; ctx->h[3] = SHA224M_D; ctx->h[4] = SHA224M_E; ctx->h[5] = SHA224M_F; ctx->h[6] = SHA224M_G; ctx->h[7] = SHA224M_H; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->len = 0; } void sha224_update_64 (sha224_ctx_t *ctx, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 63; #else const int pos = ctx->len & 63; #endif ctx->len += len; if ((pos + len) < 64) { switch_buffer_by_offset_be_S (w0, w1, w2, w3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; } else { u32 c0[4] = { 0 }; u32 c1[4] = { 0 }; u32 c2[4] = { 0 }; u32 c3[4] = { 0 }; switch_buffer_by_offset_carry_be_S (w0, w1, w2, w3, c0, c1, c2, c3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; sha224_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; } } void sha224_update (sha224_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha224_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha224_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha224_update_swap (sha224_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha224_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha224_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha224_update_utf16le (sha224_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha224_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha224_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha224_update_utf16le_swap (sha224_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha224_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha224_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha224_update_global (sha224_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha224_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha224_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha224_update_global_swap (sha224_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha224_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha224_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha224_update_global_utf16le (sha224_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha224_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha224_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha224_update_global_utf16le_swap (sha224_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha224_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha224_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha224_final (sha224_ctx_t *ctx) { const int pos = ctx->len & 63; append_0x80_4x4_S (ctx->w0, ctx->w1, ctx->w2, ctx->w3, pos ^ 3); if (pos >= 56) { sha224_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; } ctx->w3[2] = 0; ctx->w3[3] = ctx->len * 8; sha224_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); } // sha224_hmac typedef struct sha224_hmac_ctx { sha224_ctx_t ipad; sha224_ctx_t opad; } sha224_hmac_ctx_t; void sha224_hmac_init_64 (sha224_hmac_ctx_t *ctx, const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4]) { u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; sha224_init (&ctx->ipad); sha224_update_64 (&ctx->ipad, t0, t1, t2, t3, 64); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; sha224_init (&ctx->opad); sha224_update_64 (&ctx->opad, t0, t1, t2, t3, 64); } void sha224_hmac_init (sha224_hmac_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { sha224_ctx_t tmp; sha224_init (&tmp); sha224_update (&tmp, w, len); sha224_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; w1[1] = tmp.h[5]; w1[2] = tmp.h[6]; 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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } sha224_hmac_init_64 (ctx, w0, w1, w2, w3); } void sha224_hmac_init_swap (sha224_hmac_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { sha224_ctx_t tmp; sha224_init (&tmp); sha224_update_swap (&tmp, w, len); sha224_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; w1[1] = tmp.h[5]; w1[2] = tmp.h[6]; 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; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); } sha224_hmac_init_64 (ctx, w0, w1, w2, w3); } void sha224_hmac_init_global (sha224_hmac_ctx_t *ctx, __global const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { sha224_ctx_t tmp; sha224_init (&tmp); sha224_update_global (&tmp, w, len); sha224_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; w1[1] = tmp.h[5]; w1[2] = tmp.h[6]; 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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } sha224_hmac_init_64 (ctx, w0, w1, w2, w3); } void sha224_hmac_init_global_swap (sha224_hmac_ctx_t *ctx, __global const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { sha224_ctx_t tmp; sha224_init (&tmp); sha224_update_global_swap (&tmp, w, len); sha224_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; w1[1] = tmp.h[5]; w1[2] = tmp.h[6]; 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; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); } sha224_hmac_init_64 (ctx, w0, w1, w2, w3); } void sha224_hmac_update_64 (sha224_hmac_ctx_t *ctx, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const int len) { sha224_update_64 (&ctx->ipad, w0, w1, w2, w3, len); } void sha224_hmac_update (sha224_hmac_ctx_t *ctx, const u32 *w, const int len) { sha224_update (&ctx->ipad, w, len); } void sha224_hmac_update_swap (sha224_hmac_ctx_t *ctx, const u32 *w, const int len) { sha224_update_swap (&ctx->ipad, w, len); } void sha224_hmac_update_utf16le (sha224_hmac_ctx_t *ctx, const u32 *w, const int len) { sha224_update_utf16le (&ctx->ipad, w, len); } void sha224_hmac_update_utf16le_swap (sha224_hmac_ctx_t *ctx, const u32 *w, const int len) { sha224_update_utf16le_swap (&ctx->ipad, w, len); } void sha224_hmac_update_global (sha224_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha224_update_global (&ctx->ipad, w, len); } void sha224_hmac_update_global_swap (sha224_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha224_update_global_swap (&ctx->ipad, w, len); } void sha224_hmac_update_global_utf16le (sha224_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha224_update_global_utf16le (&ctx->ipad, w, len); } void sha224_hmac_update_global_utf16le_swap (sha224_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha224_update_global_utf16le_swap (&ctx->ipad, w, len); } void sha224_hmac_final (sha224_hmac_ctx_t *ctx) { sha224_final (&ctx->ipad); u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; t0[0] = ctx->ipad.h[0]; t0[1] = ctx->ipad.h[1]; t0[2] = ctx->ipad.h[2]; t0[3] = ctx->ipad.h[3]; t1[0] = ctx->ipad.h[4]; t1[1] = ctx->ipad.h[5]; t1[2] = ctx->ipad.h[6]; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; sha224_update_64 (&ctx->opad, t0, t1, t2, t3, 28); sha224_final (&ctx->opad); } // while input buf can be a vector datatype, the length of the different elements can not typedef struct sha224_ctx_vector { u32x h[8]; u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int len; } sha224_ctx_vector_t; void sha224_transform_vector (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); #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i += 16) { ROUND_EXPAND (); ROUND_STEP (i); } #undef ROUND_EXPAND #undef ROUND_STEP digest[0] += a; digest[1] += b; digest[2] += c; digest[3] += d; digest[4] += e; digest[5] += f; digest[6] += g; digest[7] += h; } void sha224_init_vector (sha224_ctx_vector_t *ctx) { ctx->h[0] = SHA224M_A; ctx->h[1] = SHA224M_B; ctx->h[2] = SHA224M_C; ctx->h[3] = SHA224M_D; ctx->h[4] = SHA224M_E; ctx->h[5] = SHA224M_F; ctx->h[6] = SHA224M_G; ctx->h[7] = SHA224M_H; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->len = 0; } void sha224_init_vector_from_scalar (sha224_ctx_vector_t *ctx, sha224_ctx_t *ctx0) { ctx->h[0] = ctx0->h[0]; ctx->h[1] = ctx0->h[1]; ctx->h[2] = ctx0->h[2]; ctx->h[3] = ctx0->h[3]; ctx->h[4] = ctx0->h[4]; ctx->h[5] = ctx0->h[5]; ctx->h[6] = ctx0->h[6]; ctx->h[7] = ctx0->h[7]; ctx->w0[0] = ctx0->w0[0]; ctx->w0[1] = ctx0->w0[1]; ctx->w0[2] = ctx0->w0[2]; ctx->w0[3] = ctx0->w0[3]; ctx->w1[0] = ctx0->w1[0]; ctx->w1[1] = ctx0->w1[1]; ctx->w1[2] = ctx0->w1[2]; ctx->w1[3] = ctx0->w1[3]; ctx->w2[0] = ctx0->w2[0]; ctx->w2[1] = ctx0->w2[1]; ctx->w2[2] = ctx0->w2[2]; ctx->w2[3] = ctx0->w2[3]; ctx->w3[0] = ctx0->w3[0]; ctx->w3[1] = ctx0->w3[1]; ctx->w3[2] = ctx0->w3[2]; ctx->w3[3] = ctx0->w3[3]; ctx->len = ctx0->len; } void sha224_update_vector_64 (sha224_ctx_vector_t *ctx, u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 63; #else const int pos = ctx->len & 63; #endif ctx->len += len; if ((pos + len) < 64) { switch_buffer_by_offset_be (w0, w1, w2, w3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; } else { u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_be (w0, w1, w2, w3, c0, c1, c2, c3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; sha224_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; } } void sha224_update_vector (sha224_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha224_update_vector_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha224_update_vector_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha224_update_vector_swap (sha224_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); sha224_update_vector_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); sha224_update_vector_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha224_update_vector_utf16le (sha224_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); sha224_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); sha224_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha224_update_vector_utf16le_swap (sha224_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); sha224_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); sha224_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha224_update_vector_utf16beN (sha224_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16beN (w1, w2, w3); make_utf16beN (w0, w0, w1); sha224_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16beN (w1, w2, w3); make_utf16beN (w0, w0, w1); sha224_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha224_final_vector (sha224_ctx_vector_t *ctx) { const int pos = ctx->len & 63; append_0x80_4x4 (ctx->w0, ctx->w1, ctx->w2, ctx->w3, pos ^ 3); if (pos >= 56) { sha224_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; } ctx->w3[2] = 0; ctx->w3[3] = ctx->len * 8; sha224_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); } // HMAC + Vector typedef struct sha224_hmac_ctx_vector { sha224_ctx_vector_t ipad; sha224_ctx_vector_t opad; } sha224_hmac_ctx_vector_t; void sha224_hmac_init_vector_64 (sha224_hmac_ctx_vector_t *ctx, const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4]) { u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; sha224_init_vector (&ctx->ipad); sha224_update_vector_64 (&ctx->ipad, t0, t1, t2, t3, 64); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; sha224_init_vector (&ctx->opad); sha224_update_vector_64 (&ctx->opad, t0, t1, t2, t3, 64); } void sha224_hmac_init_vector (sha224_hmac_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; if (len > 64) { sha224_ctx_vector_t tmp; sha224_init_vector (&tmp); sha224_update_vector (&tmp, w, len); sha224_final_vector (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; w1[1] = tmp.h[5]; w1[2] = tmp.h[6]; 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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } sha224_hmac_init_vector_64 (ctx, w0, w1, w2, w3); } void sha224_hmac_update_vector_64 (sha224_hmac_ctx_vector_t *ctx, u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const int len) { sha224_update_vector_64 (&ctx->ipad, w0, w1, w2, w3, len); } void sha224_hmac_update_vector (sha224_hmac_ctx_vector_t *ctx, const u32x *w, const int len) { sha224_update_vector (&ctx->ipad, w, len); } void sha224_hmac_final_vector (sha224_hmac_ctx_vector_t *ctx) { sha224_final_vector (&ctx->ipad); u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = ctx->ipad.h[0]; t0[1] = ctx->ipad.h[1]; t0[2] = ctx->ipad.h[2]; t0[3] = ctx->ipad.h[3]; t1[0] = ctx->ipad.h[4]; t1[1] = ctx->ipad.h[5]; t1[2] = ctx->ipad.h[6]; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; sha224_update_vector_64 (&ctx->opad, t0, t1, t2, t3, 28); sha224_final_vector (&ctx->opad); } hashcat-4.0.1/OpenCL/inc_hash_sha256.cl000066400000000000000000001273661320027462700174550ustar00rootroot00000000000000 // important notes on this: // input buf unused bytes needs to be set to zero // input buf needs to be in algorithm native byte order (md5 = LE, sha256 = BE, etc) // input buf needs to be 64 byte aligned when using md5_update() __constant u32a 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, }; typedef struct sha256_ctx { u32 h[8]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int len; } sha256_ctx_t; void sha256_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[8]) { u32 a = digest[0]; u32 b = digest[1]; u32 c = digest[2]; u32 d = digest[3]; u32 e = digest[4]; u32 f = digest[5]; u32 g = digest[6]; u32 h = digest[7]; u32 w0_t = w0[0]; u32 w1_t = w0[1]; u32 w2_t = w0[2]; u32 w3_t = w0[3]; u32 w4_t = w1[0]; u32 w5_t = w1[1]; u32 w6_t = w1[2]; u32 w7_t = w1[3]; u32 w8_t = w2[0]; u32 w9_t = w2[1]; u32 wa_t = w2[2]; u32 wb_t = w2[3]; u32 wc_t = w3[0]; u32 wd_t = w3[1]; u32 we_t = w3[2]; u32 wf_t = w3[3]; #define ROUND_EXPAND_S() \ { \ w0_t = SHA256_EXPAND_S (we_t, w9_t, w1_t, w0_t); \ w1_t = SHA256_EXPAND_S (wf_t, wa_t, w2_t, w1_t); \ w2_t = SHA256_EXPAND_S (w0_t, wb_t, w3_t, w2_t); \ w3_t = SHA256_EXPAND_S (w1_t, wc_t, w4_t, w3_t); \ w4_t = SHA256_EXPAND_S (w2_t, wd_t, w5_t, w4_t); \ w5_t = SHA256_EXPAND_S (w3_t, we_t, w6_t, w5_t); \ w6_t = SHA256_EXPAND_S (w4_t, wf_t, w7_t, w6_t); \ w7_t = SHA256_EXPAND_S (w5_t, w0_t, w8_t, w7_t); \ w8_t = SHA256_EXPAND_S (w6_t, w1_t, w9_t, w8_t); \ w9_t = SHA256_EXPAND_S (w7_t, w2_t, wa_t, w9_t); \ wa_t = SHA256_EXPAND_S (w8_t, w3_t, wb_t, wa_t); \ wb_t = SHA256_EXPAND_S (w9_t, w4_t, wc_t, wb_t); \ wc_t = SHA256_EXPAND_S (wa_t, w5_t, wd_t, wc_t); \ wd_t = SHA256_EXPAND_S (wb_t, w6_t, we_t, wd_t); \ we_t = SHA256_EXPAND_S (wc_t, w7_t, wf_t, we_t); \ wf_t = SHA256_EXPAND_S (wd_t, w8_t, w0_t, wf_t); \ } #define ROUND_STEP_S(i) \ { \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ } ROUND_STEP_S (0); #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i += 16) { ROUND_EXPAND_S (); ROUND_STEP_S (i); } #undef ROUND_EXPAND_S #undef ROUND_STEP_S digest[0] += a; digest[1] += b; digest[2] += c; digest[3] += d; digest[4] += e; digest[5] += f; digest[6] += g; digest[7] += h; } void sha256_init (sha256_ctx_t *ctx) { ctx->h[0] = SHA256M_A; ctx->h[1] = SHA256M_B; ctx->h[2] = SHA256M_C; ctx->h[3] = SHA256M_D; ctx->h[4] = SHA256M_E; ctx->h[5] = SHA256M_F; ctx->h[6] = SHA256M_G; ctx->h[7] = SHA256M_H; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->len = 0; } void sha256_update_64 (sha256_ctx_t *ctx, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 63; #else const int pos = ctx->len & 63; #endif ctx->len += len; if ((pos + len) < 64) { switch_buffer_by_offset_be_S (w0, w1, w2, w3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; } else { u32 c0[4] = { 0 }; u32 c1[4] = { 0 }; u32 c2[4] = { 0 }; u32 c3[4] = { 0 }; switch_buffer_by_offset_carry_be_S (w0, w1, w2, w3, c0, c1, c2, c3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; sha256_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; } } void sha256_update (sha256_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha256_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha256_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha256_update_swap (sha256_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha256_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha256_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha256_update_utf16le (sha256_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha256_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha256_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha256_update_utf16le_swap (sha256_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha256_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha256_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha256_update_global (sha256_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha256_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha256_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha256_update_global_swap (sha256_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha256_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha256_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha256_update_global_utf16le (sha256_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha256_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha256_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha256_update_global_utf16le_swap (sha256_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha256_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha256_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha256_final (sha256_ctx_t *ctx) { const int pos = ctx->len & 63; append_0x80_4x4_S (ctx->w0, ctx->w1, ctx->w2, ctx->w3, pos ^ 3); if (pos >= 56) { sha256_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; } ctx->w3[2] = 0; ctx->w3[3] = ctx->len * 8; sha256_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); } // sha256_hmac typedef struct sha256_hmac_ctx { sha256_ctx_t ipad; sha256_ctx_t opad; } sha256_hmac_ctx_t; void sha256_hmac_init_64 (sha256_hmac_ctx_t *ctx, const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4]) { u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; sha256_init (&ctx->ipad); sha256_update_64 (&ctx->ipad, t0, t1, t2, t3, 64); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; sha256_init (&ctx->opad); sha256_update_64 (&ctx->opad, t0, t1, t2, t3, 64); } void sha256_hmac_init (sha256_hmac_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { sha256_ctx_t tmp; sha256_init (&tmp); sha256_update (&tmp, w, len); sha256_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; w1[1] = tmp.h[5]; w1[2] = tmp.h[6]; w1[3] = tmp.h[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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } sha256_hmac_init_64 (ctx, w0, w1, w2, w3); } void sha256_hmac_init_swap (sha256_hmac_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { sha256_ctx_t tmp; sha256_init (&tmp); sha256_update_swap (&tmp, w, len); sha256_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; w1[1] = tmp.h[5]; w1[2] = tmp.h[6]; w1[3] = tmp.h[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; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); } sha256_hmac_init_64 (ctx, w0, w1, w2, w3); } void sha256_hmac_init_global (sha256_hmac_ctx_t *ctx, __global const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { sha256_ctx_t tmp; sha256_init (&tmp); sha256_update_global (&tmp, w, len); sha256_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; w1[1] = tmp.h[5]; w1[2] = tmp.h[6]; w1[3] = tmp.h[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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } sha256_hmac_init_64 (ctx, w0, w1, w2, w3); } void sha256_hmac_init_global_swap (sha256_hmac_ctx_t *ctx, __global const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { sha256_ctx_t tmp; sha256_init (&tmp); sha256_update_global_swap (&tmp, w, len); sha256_final (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; w1[1] = tmp.h[5]; w1[2] = tmp.h[6]; w1[3] = tmp.h[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; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); } sha256_hmac_init_64 (ctx, w0, w1, w2, w3); } void sha256_hmac_update_64 (sha256_hmac_ctx_t *ctx, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const int len) { sha256_update_64 (&ctx->ipad, w0, w1, w2, w3, len); } void sha256_hmac_update (sha256_hmac_ctx_t *ctx, const u32 *w, const int len) { sha256_update (&ctx->ipad, w, len); } void sha256_hmac_update_swap (sha256_hmac_ctx_t *ctx, const u32 *w, const int len) { sha256_update_swap (&ctx->ipad, w, len); } void sha256_hmac_update_utf16le (sha256_hmac_ctx_t *ctx, const u32 *w, const int len) { sha256_update_utf16le (&ctx->ipad, w, len); } void sha256_hmac_update_utf16le_swap (sha256_hmac_ctx_t *ctx, const u32 *w, const int len) { sha256_update_utf16le_swap (&ctx->ipad, w, len); } void sha256_hmac_update_global (sha256_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha256_update_global (&ctx->ipad, w, len); } void sha256_hmac_update_global_swap (sha256_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha256_update_global_swap (&ctx->ipad, w, len); } void sha256_hmac_update_global_utf16le (sha256_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha256_update_global_utf16le (&ctx->ipad, w, len); } void sha256_hmac_update_global_utf16le_swap (sha256_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha256_update_global_utf16le_swap (&ctx->ipad, w, len); } void sha256_hmac_final (sha256_hmac_ctx_t *ctx) { sha256_final (&ctx->ipad); u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; t0[0] = ctx->ipad.h[0]; t0[1] = ctx->ipad.h[1]; t0[2] = ctx->ipad.h[2]; t0[3] = ctx->ipad.h[3]; t1[0] = ctx->ipad.h[4]; t1[1] = ctx->ipad.h[5]; t1[2] = ctx->ipad.h[6]; t1[3] = ctx->ipad.h[7]; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; sha256_update_64 (&ctx->opad, t0, t1, t2, t3, 32); sha256_final (&ctx->opad); } // while input buf can be a vector datatype, the length of the different elements can not typedef struct sha256_ctx_vector { u32x h[8]; u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int len; } sha256_ctx_vector_t; void sha256_transform_vector (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); #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i += 16) { ROUND_EXPAND (); ROUND_STEP (i); } #undef ROUND_EXPAND #undef ROUND_STEP digest[0] += a; digest[1] += b; digest[2] += c; digest[3] += d; digest[4] += e; digest[5] += f; digest[6] += g; digest[7] += h; } void sha256_init_vector (sha256_ctx_vector_t *ctx) { ctx->h[0] = SHA256M_A; ctx->h[1] = SHA256M_B; ctx->h[2] = SHA256M_C; ctx->h[3] = SHA256M_D; ctx->h[4] = SHA256M_E; ctx->h[5] = SHA256M_F; ctx->h[6] = SHA256M_G; ctx->h[7] = SHA256M_H; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->len = 0; } void sha256_init_vector_from_scalar (sha256_ctx_vector_t *ctx, sha256_ctx_t *ctx0) { ctx->h[0] = ctx0->h[0]; ctx->h[1] = ctx0->h[1]; ctx->h[2] = ctx0->h[2]; ctx->h[3] = ctx0->h[3]; ctx->h[4] = ctx0->h[4]; ctx->h[5] = ctx0->h[5]; ctx->h[6] = ctx0->h[6]; ctx->h[7] = ctx0->h[7]; ctx->w0[0] = ctx0->w0[0]; ctx->w0[1] = ctx0->w0[1]; ctx->w0[2] = ctx0->w0[2]; ctx->w0[3] = ctx0->w0[3]; ctx->w1[0] = ctx0->w1[0]; ctx->w1[1] = ctx0->w1[1]; ctx->w1[2] = ctx0->w1[2]; ctx->w1[3] = ctx0->w1[3]; ctx->w2[0] = ctx0->w2[0]; ctx->w2[1] = ctx0->w2[1]; ctx->w2[2] = ctx0->w2[2]; ctx->w2[3] = ctx0->w2[3]; ctx->w3[0] = ctx0->w3[0]; ctx->w3[1] = ctx0->w3[1]; ctx->w3[2] = ctx0->w3[2]; ctx->w3[3] = ctx0->w3[3]; ctx->len = ctx0->len; } void sha256_update_vector_64 (sha256_ctx_vector_t *ctx, u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 63; #else const int pos = ctx->len & 63; #endif ctx->len += len; if ((pos + len) < 64) { switch_buffer_by_offset_be (w0, w1, w2, w3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; } else { u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_be (w0, w1, w2, w3, c0, c1, c2, c3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; sha256_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; } } void sha256_update_vector (sha256_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha256_update_vector_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha256_update_vector_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha256_update_vector_swap (sha256_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); sha256_update_vector_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); sha256_update_vector_64 (ctx, w0, w1, w2, w3, len - pos1); } void sha256_update_vector_utf16le (sha256_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); sha256_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); sha256_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha256_update_vector_utf16le_swap (sha256_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); sha256_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); sha256_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha256_update_vector_utf16beN (sha256_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16beN (w1, w2, w3); make_utf16beN (w0, w0, w1); sha256_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16beN (w1, w2, w3); make_utf16beN (w0, w0, w1); sha256_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void sha256_final_vector (sha256_ctx_vector_t *ctx) { const int pos = ctx->len & 63; append_0x80_4x4 (ctx->w0, ctx->w1, ctx->w2, ctx->w3, pos ^ 3); if (pos >= 56) { sha256_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; } ctx->w3[2] = 0; ctx->w3[3] = ctx->len * 8; sha256_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); } // HMAC + Vector typedef struct sha256_hmac_ctx_vector { sha256_ctx_vector_t ipad; sha256_ctx_vector_t opad; } sha256_hmac_ctx_vector_t; void sha256_hmac_init_vector_64 (sha256_hmac_ctx_vector_t *ctx, const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4]) { u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; sha256_init_vector (&ctx->ipad); sha256_update_vector_64 (&ctx->ipad, t0, t1, t2, t3, 64); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; sha256_init_vector (&ctx->opad); sha256_update_vector_64 (&ctx->opad, t0, t1, t2, t3, 64); } void sha256_hmac_init_vector (sha256_hmac_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; if (len > 64) { sha256_ctx_vector_t tmp; sha256_init_vector (&tmp); sha256_update_vector (&tmp, w, len); sha256_final_vector (&tmp); w0[0] = tmp.h[0]; w0[1] = tmp.h[1]; w0[2] = tmp.h[2]; w0[3] = tmp.h[3]; w1[0] = tmp.h[4]; w1[1] = tmp.h[5]; w1[2] = tmp.h[6]; w1[3] = tmp.h[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; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } sha256_hmac_init_vector_64 (ctx, w0, w1, w2, w3); } void sha256_hmac_update_vector_64 (sha256_hmac_ctx_vector_t *ctx, u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const int len) { sha256_update_vector_64 (&ctx->ipad, w0, w1, w2, w3, len); } void sha256_hmac_update_vector (sha256_hmac_ctx_vector_t *ctx, const u32x *w, const int len) { sha256_update_vector (&ctx->ipad, w, len); } void sha256_hmac_final_vector (sha256_hmac_ctx_vector_t *ctx) { sha256_final_vector (&ctx->ipad); u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = ctx->ipad.h[0]; t0[1] = ctx->ipad.h[1]; t0[2] = ctx->ipad.h[2]; t0[3] = ctx->ipad.h[3]; t1[0] = ctx->ipad.h[4]; t1[1] = ctx->ipad.h[5]; t1[2] = ctx->ipad.h[6]; t1[3] = ctx->ipad.h[7]; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; sha256_update_vector_64 (&ctx->opad, t0, t1, t2, t3, 32); sha256_final_vector (&ctx->opad); } hashcat-4.0.1/OpenCL/inc_hash_sha384.cl000066400000000000000000002177511320027462700174550ustar00rootroot00000000000000 // important notes on this: // input buf unused bytes needs to be set to zero // input buf needs to be in algorithm native byte order (md5 = LE, sha1 = BE, etc) // input buf needs to be 128 byte aligned when using sha512_update() __constant u64a k_sha384[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, }; typedef struct sha384_ctx { u64 h[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]; int len; } sha384_ctx_t; void sha384_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], const u32 w4[4], const u32 w5[4], const u32 w6[4], const u32 w7[4], u64 digest[8]) { u64 a = digest[0]; u64 b = digest[1]; u64 c = digest[2]; u64 d = digest[3]; u64 e = digest[4]; u64 f = digest[5]; u64 g = digest[6]; u64 h = digest[7]; u64 w0_t = hl32_to_64_S (w0[0], w0[1]); u64 w1_t = hl32_to_64_S (w0[2], w0[3]); u64 w2_t = hl32_to_64_S (w1[0], w1[1]); u64 w3_t = hl32_to_64_S (w1[2], w1[3]); u64 w4_t = hl32_to_64_S (w2[0], w2[1]); u64 w5_t = hl32_to_64_S (w2[2], w2[3]); u64 w6_t = hl32_to_64_S (w3[0], w3[1]); u64 w7_t = hl32_to_64_S (w3[2], w3[3]); u64 w8_t = hl32_to_64_S (w4[0], w4[1]); u64 w9_t = hl32_to_64_S (w4[2], w4[3]); u64 wa_t = hl32_to_64_S (w5[0], w5[1]); u64 wb_t = hl32_to_64_S (w5[2], w5[3]); u64 wc_t = hl32_to_64_S (w6[0], w6[1]); u64 wd_t = hl32_to_64_S (w6[2], w6[3]); u64 we_t = hl32_to_64_S (w7[0], w7[1]); u64 wf_t = hl32_to_64_S (w7[2], w7[3]); #define ROUND_EXPAND_S() \ { \ w0_t = SHA512_EXPAND_S (we_t, w9_t, w1_t, w0_t); \ w1_t = SHA512_EXPAND_S (wf_t, wa_t, w2_t, w1_t); \ w2_t = SHA512_EXPAND_S (w0_t, wb_t, w3_t, w2_t); \ w3_t = SHA512_EXPAND_S (w1_t, wc_t, w4_t, w3_t); \ w4_t = SHA512_EXPAND_S (w2_t, wd_t, w5_t, w4_t); \ w5_t = SHA512_EXPAND_S (w3_t, we_t, w6_t, w5_t); \ w6_t = SHA512_EXPAND_S (w4_t, wf_t, w7_t, w6_t); \ w7_t = SHA512_EXPAND_S (w5_t, w0_t, w8_t, w7_t); \ w8_t = SHA512_EXPAND_S (w6_t, w1_t, w9_t, w8_t); \ w9_t = SHA512_EXPAND_S (w7_t, w2_t, wa_t, w9_t); \ wa_t = SHA512_EXPAND_S (w8_t, w3_t, wb_t, wa_t); \ wb_t = SHA512_EXPAND_S (w9_t, w4_t, wc_t, wb_t); \ wc_t = SHA512_EXPAND_S (wa_t, w5_t, wd_t, wc_t); \ wd_t = SHA512_EXPAND_S (wb_t, w6_t, we_t, wd_t); \ we_t = SHA512_EXPAND_S (wc_t, w7_t, wf_t, we_t); \ wf_t = SHA512_EXPAND_S (wd_t, w8_t, w0_t, wf_t); \ } #define ROUND_STEP_S(i) \ { \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha384[i + 0]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha384[i + 1]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha384[i + 2]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha384[i + 3]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha384[i + 4]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha384[i + 5]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha384[i + 6]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha384[i + 7]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha384[i + 8]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha384[i + 9]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha384[i + 10]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha384[i + 11]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha384[i + 12]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha384[i + 13]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha384[i + 14]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha384[i + 15]); \ } ROUND_STEP_S (0); #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 80; i += 16) { ROUND_EXPAND_S (); ROUND_STEP_S (i); } #undef ROUND_EXPAND_S #undef ROUND_STEP_S digest[0] += a; digest[1] += b; digest[2] += c; digest[3] += d; digest[4] += e; digest[5] += f; digest[6] += g; digest[7] += h; } void sha384_init (sha384_ctx_t *ctx) { ctx->h[0] = SHA384M_A; ctx->h[1] = SHA384M_B; ctx->h[2] = SHA384M_C; ctx->h[3] = SHA384M_D; ctx->h[4] = SHA384M_E; ctx->h[5] = SHA384M_F; ctx->h[6] = SHA384M_G; ctx->h[7] = SHA384M_H; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->w4[0] = 0; ctx->w4[1] = 0; ctx->w4[2] = 0; ctx->w4[3] = 0; ctx->w5[0] = 0; ctx->w5[1] = 0; ctx->w5[2] = 0; ctx->w5[3] = 0; ctx->w6[0] = 0; ctx->w6[1] = 0; ctx->w6[2] = 0; ctx->w6[3] = 0; ctx->w7[0] = 0; ctx->w7[1] = 0; ctx->w7[2] = 0; ctx->w7[3] = 0; ctx->len = 0; } void sha384_update_128 (sha384_ctx_t *ctx, 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 int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 127; #else const int pos = ctx->len & 127; #endif ctx->len += len; if ((pos + len) < 128) { switch_buffer_by_offset_8x4_be_S (w0, w1, w2, w3, w4, w5, w6, w7, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; ctx->w4[0] |= w4[0]; ctx->w4[1] |= w4[1]; ctx->w4[2] |= w4[2]; ctx->w4[3] |= w4[3]; ctx->w5[0] |= w5[0]; ctx->w5[1] |= w5[1]; ctx->w5[2] |= w5[2]; ctx->w5[3] |= w5[3]; ctx->w6[0] |= w6[0]; ctx->w6[1] |= w6[1]; ctx->w6[2] |= w6[2]; ctx->w6[3] |= w6[3]; ctx->w7[0] |= w7[0]; ctx->w7[1] |= w7[1]; ctx->w7[2] |= w7[2]; ctx->w7[3] |= w7[3]; } else { u32 c0[4] = { 0 }; u32 c1[4] = { 0 }; u32 c2[4] = { 0 }; u32 c3[4] = { 0 }; u32 c4[4] = { 0 }; u32 c5[4] = { 0 }; u32 c6[4] = { 0 }; u32 c7[4] = { 0 }; switch_buffer_by_offset_8x4_carry_be_S (w0, w1, w2, w3, w4, w5, w6, w7, c0, c1, c2, c3, c4, c5, c6, c7, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; ctx->w4[0] |= w4[0]; ctx->w4[1] |= w4[1]; ctx->w4[2] |= w4[2]; ctx->w4[3] |= w4[3]; ctx->w5[0] |= w5[0]; ctx->w5[1] |= w5[1]; ctx->w5[2] |= w5[2]; ctx->w5[3] |= w5[3]; ctx->w6[0] |= w6[0]; ctx->w6[1] |= w6[1]; ctx->w6[2] |= w6[2]; ctx->w6[3] |= w6[3]; ctx->w7[0] |= w7[0]; ctx->w7[1] |= w7[1]; ctx->w7[2] |= w7[2]; ctx->w7[3] |= w7[3]; sha384_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; ctx->w4[0] = c4[0]; ctx->w4[1] = c4[1]; ctx->w4[2] = c4[2]; ctx->w4[3] = c4[3]; ctx->w5[0] = c5[0]; ctx->w5[1] = c5[1]; ctx->w5[2] = c5[2]; ctx->w5[3] = c5[3]; ctx->w6[0] = c6[0]; ctx->w6[1] = c6[1]; ctx->w6[2] = c6[2]; ctx->w6[3] = c6[3]; ctx->w7[0] = c7[0]; ctx->w7[1] = c7[1]; ctx->w7[2] = c7[2]; ctx->w7[3] = c7[3]; } } void sha384_update (sha384_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 128; pos1 += 128, pos4 += 32) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; sha384_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; sha384_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - pos1); } void sha384_update_swap (sha384_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 128; pos1 += 128, pos4 += 32) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha384_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha384_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - pos1); } void sha384_update_utf16le (sha384_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le_S (w3, w6, w7); make_utf16le_S (w2, w4, w5); make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha384_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le_S (w3, w6, w7); make_utf16le_S (w2, w4, w5); make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha384_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, (len - pos1) * 2); } void sha384_update_utf16le_swap (sha384_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le_S (w3, w6, w7); make_utf16le_S (w2, w4, w5); make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha384_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le_S (w3, w6, w7); make_utf16le_S (w2, w4, w5); make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha384_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, (len - pos1) * 2); } void sha384_update_global (sha384_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 128; pos1 += 128, pos4 += 32) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; sha384_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; sha384_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - pos1); } void sha384_update_global_swap (sha384_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 128; pos1 += 128, pos4 += 32) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha384_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha384_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - pos1); } void sha384_update_global_utf16le (sha384_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le_S (w3, w6, w7); make_utf16le_S (w2, w4, w5); make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha384_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le_S (w3, w6, w7); make_utf16le_S (w2, w4, w5); make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha384_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, (len - pos1) * 2); } void sha384_update_global_utf16le_swap (sha384_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le_S (w3, w6, w7); make_utf16le_S (w2, w4, w5); make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha384_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le_S (w3, w6, w7); make_utf16le_S (w2, w4, w5); make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha384_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, (len - pos1) * 2); } void sha384_final (sha384_ctx_t *ctx) { const int pos = ctx->len & 127; append_0x80_8x4_S (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, pos ^ 3); if (pos >= 112) { sha384_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->w4[0] = 0; ctx->w4[1] = 0; ctx->w4[2] = 0; ctx->w4[3] = 0; ctx->w5[0] = 0; ctx->w5[1] = 0; ctx->w5[2] = 0; ctx->w5[3] = 0; ctx->w6[0] = 0; ctx->w6[1] = 0; ctx->w6[2] = 0; ctx->w6[3] = 0; ctx->w7[0] = 0; ctx->w7[1] = 0; ctx->w7[2] = 0; ctx->w7[3] = 0; } ctx->w7[2] = 0; ctx->w7[3] = ctx->len * 8; sha384_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); } // sha384_hmac typedef struct sha384_hmac_ctx { sha384_ctx_t ipad; sha384_ctx_t opad; } sha384_hmac_ctx_t; void sha384_hmac_init_128 (sha384_hmac_ctx_t *ctx, const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], const u32 w4[4], const u32 w5[4], const u32 w6[4], const u32 w7[4]) { u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; u32 t4[4]; u32 t5[4]; u32 t6[4]; u32 t7[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; t4[0] = w4[0] ^ 0x36363636; t4[1] = w4[1] ^ 0x36363636; t4[2] = w4[2] ^ 0x36363636; t4[3] = w4[3] ^ 0x36363636; t5[0] = w5[0] ^ 0x36363636; t5[1] = w5[1] ^ 0x36363636; t5[2] = w5[2] ^ 0x36363636; t5[3] = w5[3] ^ 0x36363636; t6[0] = w6[0] ^ 0x36363636; t6[1] = w6[1] ^ 0x36363636; t6[2] = w6[2] ^ 0x36363636; t6[3] = w6[3] ^ 0x36363636; t7[0] = w7[0] ^ 0x36363636; t7[1] = w7[1] ^ 0x36363636; t7[2] = w7[2] ^ 0x36363636; t7[3] = w7[3] ^ 0x36363636; sha384_init (&ctx->ipad); sha384_update_128 (&ctx->ipad, t0, t1, t2, t3, t4, t5, t6, t7, 128); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; t4[0] = w4[0] ^ 0x5c5c5c5c; t4[1] = w4[1] ^ 0x5c5c5c5c; t4[2] = w4[2] ^ 0x5c5c5c5c; t4[3] = w4[3] ^ 0x5c5c5c5c; t5[0] = w5[0] ^ 0x5c5c5c5c; t5[1] = w5[1] ^ 0x5c5c5c5c; t5[2] = w5[2] ^ 0x5c5c5c5c; t5[3] = w5[3] ^ 0x5c5c5c5c; t6[0] = w6[0] ^ 0x5c5c5c5c; t6[1] = w6[1] ^ 0x5c5c5c5c; t6[2] = w6[2] ^ 0x5c5c5c5c; t6[3] = w6[3] ^ 0x5c5c5c5c; t7[0] = w7[0] ^ 0x5c5c5c5c; t7[1] = w7[1] ^ 0x5c5c5c5c; t7[2] = w7[2] ^ 0x5c5c5c5c; t7[3] = w7[3] ^ 0x5c5c5c5c; sha384_init (&ctx->opad); sha384_update_128 (&ctx->opad, t0, t1, t2, t3, t4, t5, t6, t7, 128); } void sha384_hmac_init (sha384_hmac_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; if (len > 128) { sha384_ctx_t tmp; sha384_init (&tmp); sha384_update (&tmp, w, len); sha384_final (&tmp); w0[0] = h32_from_64_S (tmp.h[0]); w0[1] = l32_from_64_S (tmp.h[0]); w0[2] = h32_from_64_S (tmp.h[1]); w0[3] = l32_from_64_S (tmp.h[1]); w1[0] = h32_from_64_S (tmp.h[2]); w1[1] = l32_from_64_S (tmp.h[2]); w1[2] = h32_from_64_S (tmp.h[3]); w1[3] = l32_from_64_S (tmp.h[3]); w2[0] = h32_from_64_S (tmp.h[4]); w2[1] = l32_from_64_S (tmp.h[4]); w2[2] = h32_from_64_S (tmp.h[5]); w2[3] = l32_from_64_S (tmp.h[5]); w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; w4[0] = w[16]; w4[1] = w[17]; w4[2] = w[18]; w4[3] = w[19]; w5[0] = w[20]; w5[1] = w[21]; w5[2] = w[22]; w5[3] = w[23]; w6[0] = w[24]; w6[1] = w[25]; w6[2] = w[26]; w6[3] = w[27]; w7[0] = w[28]; w7[1] = w[29]; w7[2] = w[30]; w7[3] = w[31]; } sha384_hmac_init_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7); } void sha384_hmac_init_swap (sha384_hmac_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; if (len > 128) { sha384_ctx_t tmp; sha384_init (&tmp); sha384_update_swap (&tmp, w, len); sha384_final (&tmp); w0[0] = h32_from_64_S (tmp.h[0]); w0[1] = l32_from_64_S (tmp.h[0]); w0[2] = h32_from_64_S (tmp.h[1]); w0[3] = l32_from_64_S (tmp.h[1]); w1[0] = h32_from_64_S (tmp.h[2]); w1[1] = l32_from_64_S (tmp.h[2]); w1[2] = h32_from_64_S (tmp.h[3]); w1[3] = l32_from_64_S (tmp.h[3]); w2[0] = h32_from_64_S (tmp.h[4]); w2[1] = l32_from_64_S (tmp.h[4]); w2[2] = h32_from_64_S (tmp.h[5]); w2[3] = l32_from_64_S (tmp.h[5]); w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); w4[0] = swap32_S (w[16]); w4[1] = swap32_S (w[17]); w4[2] = swap32_S (w[18]); w4[3] = swap32_S (w[19]); w5[0] = swap32_S (w[20]); w5[1] = swap32_S (w[21]); w5[2] = swap32_S (w[22]); w5[3] = swap32_S (w[23]); w6[0] = swap32_S (w[24]); w6[1] = swap32_S (w[25]); w6[2] = swap32_S (w[26]); w6[3] = swap32_S (w[27]); w7[0] = swap32_S (w[28]); w7[1] = swap32_S (w[29]); w7[2] = swap32_S (w[30]); w7[3] = swap32_S (w[31]); } sha384_hmac_init_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7); } void sha384_hmac_init_global (sha384_hmac_ctx_t *ctx, __global const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; if (len > 128) { sha384_ctx_t tmp; sha384_init (&tmp); sha384_update_global (&tmp, w, len); sha384_final (&tmp); w0[0] = h32_from_64_S (tmp.h[0]); w0[1] = l32_from_64_S (tmp.h[0]); w0[2] = h32_from_64_S (tmp.h[1]); w0[3] = l32_from_64_S (tmp.h[1]); w1[0] = h32_from_64_S (tmp.h[2]); w1[1] = l32_from_64_S (tmp.h[2]); w1[2] = h32_from_64_S (tmp.h[3]); w1[3] = l32_from_64_S (tmp.h[3]); w2[0] = h32_from_64_S (tmp.h[4]); w2[1] = l32_from_64_S (tmp.h[4]); w2[2] = h32_from_64_S (tmp.h[5]); w2[3] = l32_from_64_S (tmp.h[5]); w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; w4[0] = w[16]; w4[1] = w[17]; w4[2] = w[18]; w4[3] = w[19]; w5[0] = w[20]; w5[1] = w[21]; w5[2] = w[22]; w5[3] = w[23]; w6[0] = w[24]; w6[1] = w[25]; w6[2] = w[26]; w6[3] = w[27]; w7[0] = w[28]; w7[1] = w[29]; w7[2] = w[30]; w7[3] = w[31]; } sha384_hmac_init_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7); } void sha384_hmac_init_global_swap (sha384_hmac_ctx_t *ctx, __global const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; if (len > 128) { sha384_ctx_t tmp; sha384_init (&tmp); sha384_update_global_swap (&tmp, w, len); sha384_final (&tmp); w0[0] = h32_from_64_S (tmp.h[0]); w0[1] = l32_from_64_S (tmp.h[0]); w0[2] = h32_from_64_S (tmp.h[1]); w0[3] = l32_from_64_S (tmp.h[1]); w1[0] = h32_from_64_S (tmp.h[2]); w1[1] = l32_from_64_S (tmp.h[2]); w1[2] = h32_from_64_S (tmp.h[3]); w1[3] = l32_from_64_S (tmp.h[3]); w2[0] = h32_from_64_S (tmp.h[4]); w2[1] = l32_from_64_S (tmp.h[4]); w2[2] = h32_from_64_S (tmp.h[5]); w2[3] = l32_from_64_S (tmp.h[5]); w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); w4[0] = swap32_S (w[16]); w4[1] = swap32_S (w[17]); w4[2] = swap32_S (w[18]); w4[3] = swap32_S (w[19]); w5[0] = swap32_S (w[20]); w5[1] = swap32_S (w[21]); w5[2] = swap32_S (w[22]); w5[3] = swap32_S (w[23]); w6[0] = swap32_S (w[24]); w6[1] = swap32_S (w[25]); w6[2] = swap32_S (w[26]); w6[3] = swap32_S (w[27]); w7[0] = swap32_S (w[28]); w7[1] = swap32_S (w[29]); w7[2] = swap32_S (w[30]); w7[3] = swap32_S (w[31]); } sha384_hmac_init_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7); } void sha384_hmac_update_128 (sha384_hmac_ctx_t *ctx, 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 int len) { sha384_update_128 (&ctx->ipad, w0, w1, w2, w3, w4, w5, w6, w7, len); } void sha384_hmac_update (sha384_hmac_ctx_t *ctx, const u32 *w, const int len) { sha384_update (&ctx->ipad, w, len); } void sha384_hmac_update_swap (sha384_hmac_ctx_t *ctx, const u32 *w, const int len) { sha384_update_swap (&ctx->ipad, w, len); } void sha384_hmac_update_utf16le (sha384_hmac_ctx_t *ctx, const u32 *w, const int len) { sha384_update_utf16le (&ctx->ipad, w, len); } void sha384_hmac_update_utf16le_swap (sha384_hmac_ctx_t *ctx, const u32 *w, const int len) { sha384_update_utf16le_swap (&ctx->ipad, w, len); } void sha384_hmac_update_global (sha384_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha384_update_global (&ctx->ipad, w, len); } void sha384_hmac_update_global_swap (sha384_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha384_update_global_swap (&ctx->ipad, w, len); } void sha384_hmac_update_global_utf16le (sha384_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha384_update_global_utf16le (&ctx->ipad, w, len); } void sha384_hmac_update_global_utf16le_swap (sha384_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha384_update_global_utf16le_swap (&ctx->ipad, w, len); } void sha384_hmac_final (sha384_hmac_ctx_t *ctx) { sha384_final (&ctx->ipad); u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; u32 t4[4]; u32 t5[4]; u32 t6[4]; u32 t7[4]; t0[0] = h32_from_64_S (ctx->ipad.h[0]); t0[1] = l32_from_64_S (ctx->ipad.h[0]); t0[2] = h32_from_64_S (ctx->ipad.h[1]); t0[3] = l32_from_64_S (ctx->ipad.h[1]); t1[0] = h32_from_64_S (ctx->ipad.h[2]); t1[1] = l32_from_64_S (ctx->ipad.h[2]); t1[2] = h32_from_64_S (ctx->ipad.h[3]); t1[3] = l32_from_64_S (ctx->ipad.h[3]); t2[0] = h32_from_64_S (ctx->ipad.h[4]); t2[1] = l32_from_64_S (ctx->ipad.h[4]); t2[2] = h32_from_64_S (ctx->ipad.h[5]); t2[3] = l32_from_64_S (ctx->ipad.h[5]); t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; t4[0] = 0; t4[1] = 0; t4[2] = 0; t4[3] = 0; t5[0] = 0; t5[1] = 0; t5[2] = 0; t5[3] = 0; t6[0] = 0; t6[1] = 0; t6[2] = 0; t6[3] = 0; t7[0] = 0; t7[1] = 0; t7[2] = 0; t7[3] = 0; sha384_update_128 (&ctx->opad, t0, t1, t2, t3, t4, t5, t6, t7, 48); sha384_final (&ctx->opad); } // while input buf can be a vector datatype, the length of the different elements can not typedef struct sha384_ctx_vector { u64x h[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]; int len; } sha384_ctx_vector_t; void sha384_transform_vector (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], const u32x w4[4], const u32x w5[4], const u32x w6[4], const u32x w7[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 = 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 = hl32_to_64 (w3[2], w3[3]); u64x w8_t = hl32_to_64 (w4[0], w4[1]); u64x w9_t = hl32_to_64 (w4[2], w4[3]); u64x wa_t = hl32_to_64 (w5[0], w5[1]); u64x wb_t = hl32_to_64 (w5[2], w5[3]); u64x wc_t = hl32_to_64 (w6[0], w6[1]); u64x wd_t = hl32_to_64 (w6[2], w6[3]); u64x we_t = hl32_to_64 (w7[0], w7[1]); u64x wf_t = hl32_to_64 (w7[2], w7[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_sha384[i + 0]); \ SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha384[i + 1]); \ SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha384[i + 2]); \ SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha384[i + 3]); \ SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha384[i + 4]); \ SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha384[i + 5]); \ SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha384[i + 6]); \ SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha384[i + 7]); \ SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha384[i + 8]); \ SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha384[i + 9]); \ SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha384[i + 10]); \ SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha384[i + 11]); \ SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha384[i + 12]); \ SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha384[i + 13]); \ SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha384[i + 14]); \ SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha384[i + 15]); \ } ROUND_STEP (0); #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 80; i += 16) { ROUND_EXPAND (); ROUND_STEP (i); } #undef ROUND_EXPAND #undef ROUND_STEP digest[0] += a; digest[1] += b; digest[2] += c; digest[3] += d; digest[4] += e; digest[5] += f; digest[6] += g; digest[7] += h; } void sha384_init_vector (sha384_ctx_vector_t *ctx) { ctx->h[0] = SHA384M_A; ctx->h[1] = SHA384M_B; ctx->h[2] = SHA384M_C; ctx->h[3] = SHA384M_D; ctx->h[4] = SHA384M_E; ctx->h[5] = SHA384M_F; ctx->h[6] = SHA384M_G; ctx->h[7] = SHA384M_H; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->w4[0] = 0; ctx->w4[1] = 0; ctx->w4[2] = 0; ctx->w4[3] = 0; ctx->w5[0] = 0; ctx->w5[1] = 0; ctx->w5[2] = 0; ctx->w5[3] = 0; ctx->w6[0] = 0; ctx->w6[1] = 0; ctx->w6[2] = 0; ctx->w6[3] = 0; ctx->w7[0] = 0; ctx->w7[1] = 0; ctx->w7[2] = 0; ctx->w7[3] = 0; ctx->len = 0; } void sha384_init_vector_from_scalar (sha384_ctx_vector_t *ctx, sha384_ctx_t *ctx0) { ctx->h[0] = ctx0->h[0]; ctx->h[1] = ctx0->h[1]; ctx->h[2] = ctx0->h[2]; ctx->h[3] = ctx0->h[3]; ctx->h[4] = ctx0->h[4]; ctx->h[5] = ctx0->h[5]; ctx->h[6] = ctx0->h[6]; ctx->h[7] = ctx0->h[7]; ctx->w0[0] = ctx0->w0[0]; ctx->w0[1] = ctx0->w0[1]; ctx->w0[2] = ctx0->w0[2]; ctx->w0[3] = ctx0->w0[3]; ctx->w1[0] = ctx0->w1[0]; ctx->w1[1] = ctx0->w1[1]; ctx->w1[2] = ctx0->w1[2]; ctx->w1[3] = ctx0->w1[3]; ctx->w2[0] = ctx0->w2[0]; ctx->w2[1] = ctx0->w2[1]; ctx->w2[2] = ctx0->w2[2]; ctx->w2[3] = ctx0->w2[3]; ctx->w3[0] = ctx0->w3[0]; ctx->w3[1] = ctx0->w3[1]; ctx->w3[2] = ctx0->w3[2]; ctx->w3[3] = ctx0->w3[3]; ctx->w4[0] = ctx0->w4[0]; ctx->w4[1] = ctx0->w4[1]; ctx->w4[2] = ctx0->w4[2]; ctx->w4[3] = ctx0->w4[3]; ctx->w5[0] = ctx0->w5[0]; ctx->w5[1] = ctx0->w5[1]; ctx->w5[2] = ctx0->w5[2]; ctx->w5[3] = ctx0->w5[3]; ctx->w6[0] = ctx0->w6[0]; ctx->w6[1] = ctx0->w6[1]; ctx->w6[2] = ctx0->w6[2]; ctx->w6[3] = ctx0->w6[3]; ctx->w7[0] = ctx0->w7[0]; ctx->w7[1] = ctx0->w7[1]; ctx->w7[2] = ctx0->w7[2]; ctx->w7[3] = ctx0->w7[3]; ctx->len = ctx0->len; } void sha384_update_vector_128 (sha384_ctx_vector_t *ctx, 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 int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 127; #else const int pos = ctx->len & 127; #endif ctx->len += len; if ((pos + len) < 128) { switch_buffer_by_offset_8x4_be (w0, w1, w2, w3, w4, w5, w6, w7, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; ctx->w4[0] |= w4[0]; ctx->w4[1] |= w4[1]; ctx->w4[2] |= w4[2]; ctx->w4[3] |= w4[3]; ctx->w5[0] |= w5[0]; ctx->w5[1] |= w5[1]; ctx->w5[2] |= w5[2]; ctx->w5[3] |= w5[3]; ctx->w6[0] |= w6[0]; ctx->w6[1] |= w6[1]; ctx->w6[2] |= w6[2]; ctx->w6[3] |= w6[3]; ctx->w7[0] |= w7[0]; ctx->w7[1] |= w7[1]; ctx->w7[2] |= w7[2]; ctx->w7[3] |= w7[3]; } else { u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; u32x c4[4] = { 0 }; u32x c5[4] = { 0 }; u32x c6[4] = { 0 }; u32x c7[4] = { 0 }; switch_buffer_by_offset_8x4_carry_be (w0, w1, w2, w3, w4, w5, w6, w7, c0, c1, c2, c3, c4, c5, c6, c7, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; ctx->w4[0] |= w4[0]; ctx->w4[1] |= w4[1]; ctx->w4[2] |= w4[2]; ctx->w4[3] |= w4[3]; ctx->w5[0] |= w5[0]; ctx->w5[1] |= w5[1]; ctx->w5[2] |= w5[2]; ctx->w5[3] |= w5[3]; ctx->w6[0] |= w6[0]; ctx->w6[1] |= w6[1]; ctx->w6[2] |= w6[2]; ctx->w6[3] |= w6[3]; ctx->w7[0] |= w7[0]; ctx->w7[1] |= w7[1]; ctx->w7[2] |= w7[2]; ctx->w7[3] |= w7[3]; sha384_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; ctx->w4[0] = c4[0]; ctx->w4[1] = c4[1]; ctx->w4[2] = c4[2]; ctx->w4[3] = c4[3]; ctx->w5[0] = c5[0]; ctx->w5[1] = c5[1]; ctx->w5[2] = c5[2]; ctx->w5[3] = c5[3]; ctx->w6[0] = c6[0]; ctx->w6[1] = c6[1]; ctx->w6[2] = c6[2]; ctx->w6[3] = c6[3]; ctx->w7[0] = c7[0]; ctx->w7[1] = c7[1]; ctx->w7[2] = c7[2]; ctx->w7[3] = c7[3]; } } void sha384_update_vector (sha384_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 128; pos1 += 128, pos4 += 32) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; sha384_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; sha384_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - pos1); } void sha384_update_vector_swap (sha384_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 128; pos1 += 128, pos4 += 32) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); w4[0] = swap32 (w4[0]); w4[1] = swap32 (w4[1]); w4[2] = swap32 (w4[2]); w4[3] = swap32 (w4[3]); w5[0] = swap32 (w5[0]); w5[1] = swap32 (w5[1]); w5[2] = swap32 (w5[2]); w5[3] = swap32 (w5[3]); w6[0] = swap32 (w6[0]); w6[1] = swap32 (w6[1]); w6[2] = swap32 (w6[2]); w6[3] = swap32 (w6[3]); w7[0] = swap32 (w7[0]); w7[1] = swap32 (w7[1]); w7[2] = swap32 (w7[2]); w7[3] = swap32 (w7[3]); sha384_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); w4[0] = swap32 (w4[0]); w4[1] = swap32 (w4[1]); w4[2] = swap32 (w4[2]); w4[3] = swap32 (w4[3]); w5[0] = swap32 (w5[0]); w5[1] = swap32 (w5[1]); w5[2] = swap32 (w5[2]); w5[3] = swap32 (w5[3]); w6[0] = swap32 (w6[0]); w6[1] = swap32 (w6[1]); w6[2] = swap32 (w6[2]); w6[3] = swap32 (w6[3]); w7[0] = swap32 (w7[0]); w7[1] = swap32 (w7[1]); w7[2] = swap32 (w7[2]); w7[3] = swap32 (w7[3]); sha384_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - pos1); } void sha384_update_vector_utf16le (sha384_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le (w3, w6, w7); make_utf16le (w2, w4, w5); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); sha384_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le (w3, w6, w7); make_utf16le (w2, w4, w5); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); sha384_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, (len - pos1) * 2); } void sha384_update_vector_utf16le_swap (sha384_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le (w3, w6, w7); make_utf16le (w2, w4, w5); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); w4[0] = swap32 (w4[0]); w4[1] = swap32 (w4[1]); w4[2] = swap32 (w4[2]); w4[3] = swap32 (w4[3]); w5[0] = swap32 (w5[0]); w5[1] = swap32 (w5[1]); w5[2] = swap32 (w5[2]); w5[3] = swap32 (w5[3]); w6[0] = swap32 (w6[0]); w6[1] = swap32 (w6[1]); w6[2] = swap32 (w6[2]); w6[3] = swap32 (w6[3]); w7[0] = swap32 (w7[0]); w7[1] = swap32 (w7[1]); w7[2] = swap32 (w7[2]); w7[3] = swap32 (w7[3]); sha384_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le (w3, w6, w7); make_utf16le (w2, w4, w5); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); w4[0] = swap32 (w4[0]); w4[1] = swap32 (w4[1]); w4[2] = swap32 (w4[2]); w4[3] = swap32 (w4[3]); w5[0] = swap32 (w5[0]); w5[1] = swap32 (w5[1]); w5[2] = swap32 (w5[2]); w5[3] = swap32 (w5[3]); w6[0] = swap32 (w6[0]); w6[1] = swap32 (w6[1]); w6[2] = swap32 (w6[2]); w6[3] = swap32 (w6[3]); w7[0] = swap32 (w7[0]); w7[1] = swap32 (w7[1]); w7[2] = swap32 (w7[2]); w7[3] = swap32 (w7[3]); sha384_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, (len - pos1) * 2); } void sha384_update_vector_utf16beN (sha384_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16beN (w3, w6, w7); make_utf16beN (w2, w4, w5); make_utf16beN (w1, w2, w3); make_utf16beN (w0, w0, w1); sha384_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16beN (w3, w6, w7); make_utf16beN (w2, w4, w5); make_utf16beN (w1, w2, w3); make_utf16beN (w0, w0, w1); sha384_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, (len - pos1) * 2); } void sha384_final_vector (sha384_ctx_vector_t *ctx) { const int pos = ctx->len & 127; append_0x80_8x4 (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, pos ^ 3); if (pos >= 112) { sha384_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->w4[0] = 0; ctx->w4[1] = 0; ctx->w4[2] = 0; ctx->w4[3] = 0; ctx->w5[0] = 0; ctx->w5[1] = 0; ctx->w5[2] = 0; ctx->w5[3] = 0; ctx->w6[0] = 0; ctx->w6[1] = 0; ctx->w6[2] = 0; ctx->w6[3] = 0; ctx->w7[0] = 0; ctx->w7[1] = 0; ctx->w7[2] = 0; ctx->w7[3] = 0; } ctx->w7[2] = 0; ctx->w7[3] = ctx->len * 8; sha384_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); } // HMAC + Vector typedef struct sha384_hmac_ctx_vector { sha384_ctx_vector_t ipad; sha384_ctx_vector_t opad; } sha384_hmac_ctx_vector_t; void sha384_hmac_init_vector_128 (sha384_hmac_ctx_vector_t *ctx, const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], const u32x w4[4], const u32x w5[4], const u32x w6[4], const u32x w7[4]) { u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; u32x t4[4]; u32x t5[4]; u32x t6[4]; u32x t7[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; t4[0] = w4[0] ^ 0x36363636; t4[1] = w4[1] ^ 0x36363636; t4[2] = w4[2] ^ 0x36363636; t4[3] = w4[3] ^ 0x36363636; t5[0] = w5[0] ^ 0x36363636; t5[1] = w5[1] ^ 0x36363636; t5[2] = w5[2] ^ 0x36363636; t5[3] = w5[3] ^ 0x36363636; t6[0] = w6[0] ^ 0x36363636; t6[1] = w6[1] ^ 0x36363636; t6[2] = w6[2] ^ 0x36363636; t6[3] = w6[3] ^ 0x36363636; t7[0] = w7[0] ^ 0x36363636; t7[1] = w7[1] ^ 0x36363636; t7[2] = w7[2] ^ 0x36363636; t7[3] = w7[3] ^ 0x36363636; sha384_init_vector (&ctx->ipad); sha384_update_vector_128 (&ctx->ipad, t0, t1, t2, t3, t4, t5, t6, t7, 128); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; t4[0] = w4[0] ^ 0x5c5c5c5c; t4[1] = w4[1] ^ 0x5c5c5c5c; t4[2] = w4[2] ^ 0x5c5c5c5c; t4[3] = w4[3] ^ 0x5c5c5c5c; t5[0] = w5[0] ^ 0x5c5c5c5c; t5[1] = w5[1] ^ 0x5c5c5c5c; t5[2] = w5[2] ^ 0x5c5c5c5c; t5[3] = w5[3] ^ 0x5c5c5c5c; t6[0] = w6[0] ^ 0x5c5c5c5c; t6[1] = w6[1] ^ 0x5c5c5c5c; t6[2] = w6[2] ^ 0x5c5c5c5c; t6[3] = w6[3] ^ 0x5c5c5c5c; t7[0] = w7[0] ^ 0x5c5c5c5c; t7[1] = w7[1] ^ 0x5c5c5c5c; t7[2] = w7[2] ^ 0x5c5c5c5c; t7[3] = w7[3] ^ 0x5c5c5c5c; sha384_init_vector (&ctx->opad); sha384_update_vector_128 (&ctx->opad, t0, t1, t2, t3, t4, t5, t6, t7, 128); } void sha384_hmac_init_vector (sha384_hmac_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; if (len > 128) { sha384_ctx_vector_t tmp; sha384_init_vector (&tmp); sha384_update_vector (&tmp, w, len); sha384_final_vector (&tmp); w0[0] = h32_from_64 (tmp.h[0]); w0[1] = l32_from_64 (tmp.h[0]); w0[2] = h32_from_64 (tmp.h[1]); w0[3] = l32_from_64 (tmp.h[1]); w1[0] = h32_from_64 (tmp.h[2]); w1[1] = l32_from_64 (tmp.h[2]); w1[2] = h32_from_64 (tmp.h[3]); w1[3] = l32_from_64 (tmp.h[3]); w2[0] = h32_from_64 (tmp.h[4]); w2[1] = l32_from_64 (tmp.h[4]); w2[2] = h32_from_64 (tmp.h[5]); w2[3] = l32_from_64 (tmp.h[5]); w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; w4[0] = w[16]; w4[1] = w[17]; w4[2] = w[18]; w4[3] = w[19]; w5[0] = w[20]; w5[1] = w[21]; w5[2] = w[22]; w5[3] = w[23]; w6[0] = w[24]; w6[1] = w[25]; w6[2] = w[26]; w6[3] = w[27]; w7[0] = w[28]; w7[1] = w[29]; w7[2] = w[30]; w7[3] = w[31]; } sha384_hmac_init_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7); } void sha384_hmac_update_vector_128 (sha384_hmac_ctx_vector_t *ctx, 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 int len) { sha384_update_vector_128 (&ctx->ipad, w0, w1, w2, w3, w4, w5, w6, w7, len); } void sha384_hmac_update_vector (sha384_hmac_ctx_vector_t *ctx, const u32x *w, const int len) { sha384_update_vector (&ctx->ipad, w, len); } void sha384_hmac_final_vector (sha384_hmac_ctx_vector_t *ctx) { sha384_final_vector (&ctx->ipad); u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; u32x t4[4]; u32x t5[4]; u32x t6[4]; u32x t7[4]; t0[0] = h32_from_64 (ctx->ipad.h[0]); t0[1] = l32_from_64 (ctx->ipad.h[0]); t0[2] = h32_from_64 (ctx->ipad.h[1]); t0[3] = l32_from_64 (ctx->ipad.h[1]); t1[0] = h32_from_64 (ctx->ipad.h[2]); t1[1] = l32_from_64 (ctx->ipad.h[2]); t1[2] = h32_from_64 (ctx->ipad.h[3]); t1[3] = l32_from_64 (ctx->ipad.h[3]); t2[0] = h32_from_64 (ctx->ipad.h[4]); t2[1] = l32_from_64 (ctx->ipad.h[4]); t2[2] = h32_from_64 (ctx->ipad.h[5]); t2[3] = l32_from_64 (ctx->ipad.h[5]); t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; t4[0] = 0; t4[1] = 0; t4[2] = 0; t4[3] = 0; t5[0] = 0; t5[1] = 0; t5[2] = 0; t5[3] = 0; t6[0] = 0; t6[1] = 0; t6[2] = 0; t6[3] = 0; t7[0] = 0; t7[1] = 0; t7[2] = 0; t7[3] = 0; sha384_update_vector_128 (&ctx->opad, t0, t1, t2, t3, t4, t5, t6, t7, 48); sha384_final_vector (&ctx->opad); } hashcat-4.0.1/OpenCL/inc_hash_sha512.cl000066400000000000000000002212151320027462700174340ustar00rootroot00000000000000 // important notes on this: // input buf unused bytes needs to be set to zero // input buf needs to be in algorithm native byte order (md5 = LE, sha1 = BE, etc) // input buf needs to be 128 byte aligned when using sha512_update() __constant u64a 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, }; typedef struct sha512_ctx { u64 h[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]; int len; } sha512_ctx_t; void sha512_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], const u32 w4[4], const u32 w5[4], const u32 w6[4], const u32 w7[4], u64 digest[8]) { u64 a = digest[0]; u64 b = digest[1]; u64 c = digest[2]; u64 d = digest[3]; u64 e = digest[4]; u64 f = digest[5]; u64 g = digest[6]; u64 h = digest[7]; u64 w0_t = hl32_to_64_S (w0[0], w0[1]); u64 w1_t = hl32_to_64_S (w0[2], w0[3]); u64 w2_t = hl32_to_64_S (w1[0], w1[1]); u64 w3_t = hl32_to_64_S (w1[2], w1[3]); u64 w4_t = hl32_to_64_S (w2[0], w2[1]); u64 w5_t = hl32_to_64_S (w2[2], w2[3]); u64 w6_t = hl32_to_64_S (w3[0], w3[1]); u64 w7_t = hl32_to_64_S (w3[2], w3[3]); u64 w8_t = hl32_to_64_S (w4[0], w4[1]); u64 w9_t = hl32_to_64_S (w4[2], w4[3]); u64 wa_t = hl32_to_64_S (w5[0], w5[1]); u64 wb_t = hl32_to_64_S (w5[2], w5[3]); u64 wc_t = hl32_to_64_S (w6[0], w6[1]); u64 wd_t = hl32_to_64_S (w6[2], w6[3]); u64 we_t = hl32_to_64_S (w7[0], w7[1]); u64 wf_t = hl32_to_64_S (w7[2], w7[3]); #define ROUND_EXPAND_S() \ { \ w0_t = SHA512_EXPAND_S (we_t, w9_t, w1_t, w0_t); \ w1_t = SHA512_EXPAND_S (wf_t, wa_t, w2_t, w1_t); \ w2_t = SHA512_EXPAND_S (w0_t, wb_t, w3_t, w2_t); \ w3_t = SHA512_EXPAND_S (w1_t, wc_t, w4_t, w3_t); \ w4_t = SHA512_EXPAND_S (w2_t, wd_t, w5_t, w4_t); \ w5_t = SHA512_EXPAND_S (w3_t, we_t, w6_t, w5_t); \ w6_t = SHA512_EXPAND_S (w4_t, wf_t, w7_t, w6_t); \ w7_t = SHA512_EXPAND_S (w5_t, w0_t, w8_t, w7_t); \ w8_t = SHA512_EXPAND_S (w6_t, w1_t, w9_t, w8_t); \ w9_t = SHA512_EXPAND_S (w7_t, w2_t, wa_t, w9_t); \ wa_t = SHA512_EXPAND_S (w8_t, w3_t, wb_t, wa_t); \ wb_t = SHA512_EXPAND_S (w9_t, w4_t, wc_t, wb_t); \ wc_t = SHA512_EXPAND_S (wa_t, w5_t, wd_t, wc_t); \ wd_t = SHA512_EXPAND_S (wb_t, w6_t, we_t, wd_t); \ we_t = SHA512_EXPAND_S (wc_t, w7_t, wf_t, we_t); \ wf_t = SHA512_EXPAND_S (wd_t, w8_t, w0_t, wf_t); \ } #define ROUND_STEP_S(i) \ { \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ } ROUND_STEP_S (0); #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 80; i += 16) { ROUND_EXPAND_S (); ROUND_STEP_S (i); } #undef ROUND_EXPAND_S #undef ROUND_STEP_S digest[0] += a; digest[1] += b; digest[2] += c; digest[3] += d; digest[4] += e; digest[5] += f; digest[6] += g; digest[7] += h; } void sha512_init (sha512_ctx_t *ctx) { ctx->h[0] = SHA512M_A; ctx->h[1] = SHA512M_B; ctx->h[2] = SHA512M_C; ctx->h[3] = SHA512M_D; ctx->h[4] = SHA512M_E; ctx->h[5] = SHA512M_F; ctx->h[6] = SHA512M_G; ctx->h[7] = SHA512M_H; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->w4[0] = 0; ctx->w4[1] = 0; ctx->w4[2] = 0; ctx->w4[3] = 0; ctx->w5[0] = 0; ctx->w5[1] = 0; ctx->w5[2] = 0; ctx->w5[3] = 0; ctx->w6[0] = 0; ctx->w6[1] = 0; ctx->w6[2] = 0; ctx->w6[3] = 0; ctx->w7[0] = 0; ctx->w7[1] = 0; ctx->w7[2] = 0; ctx->w7[3] = 0; ctx->len = 0; } void sha512_update_128 (sha512_ctx_t *ctx, 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 int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 127; #else const int pos = ctx->len & 127; #endif ctx->len += len; if ((pos + len) < 128) { switch_buffer_by_offset_8x4_be_S (w0, w1, w2, w3, w4, w5, w6, w7, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; ctx->w4[0] |= w4[0]; ctx->w4[1] |= w4[1]; ctx->w4[2] |= w4[2]; ctx->w4[3] |= w4[3]; ctx->w5[0] |= w5[0]; ctx->w5[1] |= w5[1]; ctx->w5[2] |= w5[2]; ctx->w5[3] |= w5[3]; ctx->w6[0] |= w6[0]; ctx->w6[1] |= w6[1]; ctx->w6[2] |= w6[2]; ctx->w6[3] |= w6[3]; ctx->w7[0] |= w7[0]; ctx->w7[1] |= w7[1]; ctx->w7[2] |= w7[2]; ctx->w7[3] |= w7[3]; } else { u32 c0[4] = { 0 }; u32 c1[4] = { 0 }; u32 c2[4] = { 0 }; u32 c3[4] = { 0 }; u32 c4[4] = { 0 }; u32 c5[4] = { 0 }; u32 c6[4] = { 0 }; u32 c7[4] = { 0 }; switch_buffer_by_offset_8x4_carry_be_S (w0, w1, w2, w3, w4, w5, w6, w7, c0, c1, c2, c3, c4, c5, c6, c7, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; ctx->w4[0] |= w4[0]; ctx->w4[1] |= w4[1]; ctx->w4[2] |= w4[2]; ctx->w4[3] |= w4[3]; ctx->w5[0] |= w5[0]; ctx->w5[1] |= w5[1]; ctx->w5[2] |= w5[2]; ctx->w5[3] |= w5[3]; ctx->w6[0] |= w6[0]; ctx->w6[1] |= w6[1]; ctx->w6[2] |= w6[2]; ctx->w6[3] |= w6[3]; ctx->w7[0] |= w7[0]; ctx->w7[1] |= w7[1]; ctx->w7[2] |= w7[2]; ctx->w7[3] |= w7[3]; sha512_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; ctx->w4[0] = c4[0]; ctx->w4[1] = c4[1]; ctx->w4[2] = c4[2]; ctx->w4[3] = c4[3]; ctx->w5[0] = c5[0]; ctx->w5[1] = c5[1]; ctx->w5[2] = c5[2]; ctx->w5[3] = c5[3]; ctx->w6[0] = c6[0]; ctx->w6[1] = c6[1]; ctx->w6[2] = c6[2]; ctx->w6[3] = c6[3]; ctx->w7[0] = c7[0]; ctx->w7[1] = c7[1]; ctx->w7[2] = c7[2]; ctx->w7[3] = c7[3]; } } void sha512_update (sha512_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 128; pos1 += 128, pos4 += 32) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; sha512_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; sha512_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - pos1); } void sha512_update_swap (sha512_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 128; pos1 += 128, pos4 += 32) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha512_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha512_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - pos1); } void sha512_update_utf16le (sha512_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le_S (w3, w6, w7); make_utf16le_S (w2, w4, w5); make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha512_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le_S (w3, w6, w7); make_utf16le_S (w2, w4, w5); make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha512_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, (len - pos1) * 2); } void sha512_update_utf16le_swap (sha512_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le_S (w3, w6, w7); make_utf16le_S (w2, w4, w5); make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha512_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le_S (w3, w6, w7); make_utf16le_S (w2, w4, w5); make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha512_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, (len - pos1) * 2); } void sha512_update_global (sha512_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 128; pos1 += 128, pos4 += 32) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; sha512_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; sha512_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - pos1); } void sha512_update_global_swap (sha512_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 128; pos1 += 128, pos4 += 32) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha512_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha512_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - pos1); } void sha512_update_global_utf16le (sha512_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le_S (w3, w6, w7); make_utf16le_S (w2, w4, w5); make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha512_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le_S (w3, w6, w7); make_utf16le_S (w2, w4, w5); make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); sha512_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, (len - pos1) * 2); } void sha512_update_global_utf16le_swap (sha512_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le_S (w3, w6, w7); make_utf16le_S (w2, w4, w5); make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha512_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le_S (w3, w6, w7); make_utf16le_S (w2, w4, w5); make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha512_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, (len - pos1) * 2); } void sha512_final (sha512_ctx_t *ctx) { const int pos = ctx->len & 127; append_0x80_8x4_S (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, pos ^ 3); if (pos >= 112) { sha512_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->w4[0] = 0; ctx->w4[1] = 0; ctx->w4[2] = 0; ctx->w4[3] = 0; ctx->w5[0] = 0; ctx->w5[1] = 0; ctx->w5[2] = 0; ctx->w5[3] = 0; ctx->w6[0] = 0; ctx->w6[1] = 0; ctx->w6[2] = 0; ctx->w6[3] = 0; ctx->w7[0] = 0; ctx->w7[1] = 0; ctx->w7[2] = 0; ctx->w7[3] = 0; } ctx->w7[2] = 0; ctx->w7[3] = ctx->len * 8; sha512_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); } // sha512_hmac typedef struct sha512_hmac_ctx { sha512_ctx_t ipad; sha512_ctx_t opad; } sha512_hmac_ctx_t; void sha512_hmac_init_128 (sha512_hmac_ctx_t *ctx, const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], const u32 w4[4], const u32 w5[4], const u32 w6[4], const u32 w7[4]) { u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; u32 t4[4]; u32 t5[4]; u32 t6[4]; u32 t7[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; t4[0] = w4[0] ^ 0x36363636; t4[1] = w4[1] ^ 0x36363636; t4[2] = w4[2] ^ 0x36363636; t4[3] = w4[3] ^ 0x36363636; t5[0] = w5[0] ^ 0x36363636; t5[1] = w5[1] ^ 0x36363636; t5[2] = w5[2] ^ 0x36363636; t5[3] = w5[3] ^ 0x36363636; t6[0] = w6[0] ^ 0x36363636; t6[1] = w6[1] ^ 0x36363636; t6[2] = w6[2] ^ 0x36363636; t6[3] = w6[3] ^ 0x36363636; t7[0] = w7[0] ^ 0x36363636; t7[1] = w7[1] ^ 0x36363636; t7[2] = w7[2] ^ 0x36363636; t7[3] = w7[3] ^ 0x36363636; sha512_init (&ctx->ipad); sha512_update_128 (&ctx->ipad, t0, t1, t2, t3, t4, t5, t6, t7, 128); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; t4[0] = w4[0] ^ 0x5c5c5c5c; t4[1] = w4[1] ^ 0x5c5c5c5c; t4[2] = w4[2] ^ 0x5c5c5c5c; t4[3] = w4[3] ^ 0x5c5c5c5c; t5[0] = w5[0] ^ 0x5c5c5c5c; t5[1] = w5[1] ^ 0x5c5c5c5c; t5[2] = w5[2] ^ 0x5c5c5c5c; t5[3] = w5[3] ^ 0x5c5c5c5c; t6[0] = w6[0] ^ 0x5c5c5c5c; t6[1] = w6[1] ^ 0x5c5c5c5c; t6[2] = w6[2] ^ 0x5c5c5c5c; t6[3] = w6[3] ^ 0x5c5c5c5c; t7[0] = w7[0] ^ 0x5c5c5c5c; t7[1] = w7[1] ^ 0x5c5c5c5c; t7[2] = w7[2] ^ 0x5c5c5c5c; t7[3] = w7[3] ^ 0x5c5c5c5c; sha512_init (&ctx->opad); sha512_update_128 (&ctx->opad, t0, t1, t2, t3, t4, t5, t6, t7, 128); } void sha512_hmac_init (sha512_hmac_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; if (len > 128) { sha512_ctx_t tmp; sha512_init (&tmp); sha512_update (&tmp, w, len); sha512_final (&tmp); w0[0] = h32_from_64_S (tmp.h[0]); w0[1] = l32_from_64_S (tmp.h[0]); w0[2] = h32_from_64_S (tmp.h[1]); w0[3] = l32_from_64_S (tmp.h[1]); w1[0] = h32_from_64_S (tmp.h[2]); w1[1] = l32_from_64_S (tmp.h[2]); w1[2] = h32_from_64_S (tmp.h[3]); w1[3] = l32_from_64_S (tmp.h[3]); w2[0] = h32_from_64_S (tmp.h[4]); w2[1] = l32_from_64_S (tmp.h[4]); w2[2] = h32_from_64_S (tmp.h[5]); w2[3] = l32_from_64_S (tmp.h[5]); w3[0] = h32_from_64_S (tmp.h[6]); w3[1] = l32_from_64_S (tmp.h[6]); w3[2] = h32_from_64_S (tmp.h[7]); w3[3] = l32_from_64_S (tmp.h[7]); w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; w4[0] = w[16]; w4[1] = w[17]; w4[2] = w[18]; w4[3] = w[19]; w5[0] = w[20]; w5[1] = w[21]; w5[2] = w[22]; w5[3] = w[23]; w6[0] = w[24]; w6[1] = w[25]; w6[2] = w[26]; w6[3] = w[27]; w7[0] = w[28]; w7[1] = w[29]; w7[2] = w[30]; w7[3] = w[31]; } sha512_hmac_init_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7); } void sha512_hmac_init_swap (sha512_hmac_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; if (len > 128) { sha512_ctx_t tmp; sha512_init (&tmp); sha512_update_swap (&tmp, w, len); sha512_final (&tmp); w0[0] = h32_from_64_S (tmp.h[0]); w0[1] = l32_from_64_S (tmp.h[0]); w0[2] = h32_from_64_S (tmp.h[1]); w0[3] = l32_from_64_S (tmp.h[1]); w1[0] = h32_from_64_S (tmp.h[2]); w1[1] = l32_from_64_S (tmp.h[2]); w1[2] = h32_from_64_S (tmp.h[3]); w1[3] = l32_from_64_S (tmp.h[3]); w2[0] = h32_from_64_S (tmp.h[4]); w2[1] = l32_from_64_S (tmp.h[4]); w2[2] = h32_from_64_S (tmp.h[5]); w2[3] = l32_from_64_S (tmp.h[5]); w3[0] = h32_from_64_S (tmp.h[6]); w3[1] = l32_from_64_S (tmp.h[6]); w3[2] = h32_from_64_S (tmp.h[7]); w3[3] = l32_from_64_S (tmp.h[7]); w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); w4[0] = swap32_S (w[16]); w4[1] = swap32_S (w[17]); w4[2] = swap32_S (w[18]); w4[3] = swap32_S (w[19]); w5[0] = swap32_S (w[20]); w5[1] = swap32_S (w[21]); w5[2] = swap32_S (w[22]); w5[3] = swap32_S (w[23]); w6[0] = swap32_S (w[24]); w6[1] = swap32_S (w[25]); w6[2] = swap32_S (w[26]); w6[3] = swap32_S (w[27]); w7[0] = swap32_S (w[28]); w7[1] = swap32_S (w[29]); w7[2] = swap32_S (w[30]); w7[3] = swap32_S (w[31]); } sha512_hmac_init_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7); } void sha512_hmac_init_global (sha512_hmac_ctx_t *ctx, __global const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; if (len > 128) { sha512_ctx_t tmp; sha512_init (&tmp); sha512_update_global (&tmp, w, len); sha512_final (&tmp); w0[0] = h32_from_64_S (tmp.h[0]); w0[1] = l32_from_64_S (tmp.h[0]); w0[2] = h32_from_64_S (tmp.h[1]); w0[3] = l32_from_64_S (tmp.h[1]); w1[0] = h32_from_64_S (tmp.h[2]); w1[1] = l32_from_64_S (tmp.h[2]); w1[2] = h32_from_64_S (tmp.h[3]); w1[3] = l32_from_64_S (tmp.h[3]); w2[0] = h32_from_64_S (tmp.h[4]); w2[1] = l32_from_64_S (tmp.h[4]); w2[2] = h32_from_64_S (tmp.h[5]); w2[3] = l32_from_64_S (tmp.h[5]); w3[0] = h32_from_64_S (tmp.h[6]); w3[1] = l32_from_64_S (tmp.h[6]); w3[2] = h32_from_64_S (tmp.h[7]); w3[3] = l32_from_64_S (tmp.h[7]); w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; w4[0] = w[16]; w4[1] = w[17]; w4[2] = w[18]; w4[3] = w[19]; w5[0] = w[20]; w5[1] = w[21]; w5[2] = w[22]; w5[3] = w[23]; w6[0] = w[24]; w6[1] = w[25]; w6[2] = w[26]; w6[3] = w[27]; w7[0] = w[28]; w7[1] = w[29]; w7[2] = w[30]; w7[3] = w[31]; } sha512_hmac_init_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7); } void sha512_hmac_init_global_swap (sha512_hmac_ctx_t *ctx, __global const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; if (len > 128) { sha512_ctx_t tmp; sha512_init (&tmp); sha512_update_global_swap (&tmp, w, len); sha512_final (&tmp); w0[0] = h32_from_64_S (tmp.h[0]); w0[1] = l32_from_64_S (tmp.h[0]); w0[2] = h32_from_64_S (tmp.h[1]); w0[3] = l32_from_64_S (tmp.h[1]); w1[0] = h32_from_64_S (tmp.h[2]); w1[1] = l32_from_64_S (tmp.h[2]); w1[2] = h32_from_64_S (tmp.h[3]); w1[3] = l32_from_64_S (tmp.h[3]); w2[0] = h32_from_64_S (tmp.h[4]); w2[1] = l32_from_64_S (tmp.h[4]); w2[2] = h32_from_64_S (tmp.h[5]); w2[3] = l32_from_64_S (tmp.h[5]); w3[0] = h32_from_64_S (tmp.h[6]); w3[1] = l32_from_64_S (tmp.h[6]); w3[2] = h32_from_64_S (tmp.h[7]); w3[3] = l32_from_64_S (tmp.h[7]); w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); w4[0] = swap32_S (w[16]); w4[1] = swap32_S (w[17]); w4[2] = swap32_S (w[18]); w4[3] = swap32_S (w[19]); w5[0] = swap32_S (w[20]); w5[1] = swap32_S (w[21]); w5[2] = swap32_S (w[22]); w5[3] = swap32_S (w[23]); w6[0] = swap32_S (w[24]); w6[1] = swap32_S (w[25]); w6[2] = swap32_S (w[26]); w6[3] = swap32_S (w[27]); w7[0] = swap32_S (w[28]); w7[1] = swap32_S (w[29]); w7[2] = swap32_S (w[30]); w7[3] = swap32_S (w[31]); } sha512_hmac_init_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7); } void sha512_hmac_update_128 (sha512_hmac_ctx_t *ctx, 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 int len) { sha512_update_128 (&ctx->ipad, w0, w1, w2, w3, w4, w5, w6, w7, len); } void sha512_hmac_update (sha512_hmac_ctx_t *ctx, const u32 *w, const int len) { sha512_update (&ctx->ipad, w, len); } void sha512_hmac_update_swap (sha512_hmac_ctx_t *ctx, const u32 *w, const int len) { sha512_update_swap (&ctx->ipad, w, len); } void sha512_hmac_update_utf16le (sha512_hmac_ctx_t *ctx, const u32 *w, const int len) { sha512_update_utf16le (&ctx->ipad, w, len); } void sha512_hmac_update_utf16le_swap (sha512_hmac_ctx_t *ctx, const u32 *w, const int len) { sha512_update_utf16le_swap (&ctx->ipad, w, len); } void sha512_hmac_update_global (sha512_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha512_update_global (&ctx->ipad, w, len); } void sha512_hmac_update_global_swap (sha512_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha512_update_global_swap (&ctx->ipad, w, len); } void sha512_hmac_update_global_utf16le (sha512_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha512_update_global_utf16le (&ctx->ipad, w, len); } void sha512_hmac_update_global_utf16le_swap (sha512_hmac_ctx_t *ctx, const __global u32 *w, const int len) { sha512_update_global_utf16le_swap (&ctx->ipad, w, len); } void sha512_hmac_final (sha512_hmac_ctx_t *ctx) { sha512_final (&ctx->ipad); u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; u32 t4[4]; u32 t5[4]; u32 t6[4]; u32 t7[4]; t0[0] = h32_from_64_S (ctx->ipad.h[0]); t0[1] = l32_from_64_S (ctx->ipad.h[0]); t0[2] = h32_from_64_S (ctx->ipad.h[1]); t0[3] = l32_from_64_S (ctx->ipad.h[1]); t1[0] = h32_from_64_S (ctx->ipad.h[2]); t1[1] = l32_from_64_S (ctx->ipad.h[2]); t1[2] = h32_from_64_S (ctx->ipad.h[3]); t1[3] = l32_from_64_S (ctx->ipad.h[3]); t2[0] = h32_from_64_S (ctx->ipad.h[4]); t2[1] = l32_from_64_S (ctx->ipad.h[4]); t2[2] = h32_from_64_S (ctx->ipad.h[5]); t2[3] = l32_from_64_S (ctx->ipad.h[5]); t3[0] = h32_from_64_S (ctx->ipad.h[6]); t3[1] = l32_from_64_S (ctx->ipad.h[6]); t3[2] = h32_from_64_S (ctx->ipad.h[7]); t3[3] = l32_from_64_S (ctx->ipad.h[7]); t4[0] = 0; t4[1] = 0; t4[2] = 0; t4[3] = 0; t5[0] = 0; t5[1] = 0; t5[2] = 0; t5[3] = 0; t6[0] = 0; t6[1] = 0; t6[2] = 0; t6[3] = 0; t7[0] = 0; t7[1] = 0; t7[2] = 0; t7[3] = 0; sha512_update_128 (&ctx->opad, t0, t1, t2, t3, t4, t5, t6, t7, 64); sha512_final (&ctx->opad); } // while input buf can be a vector datatype, the length of the different elements can not typedef struct sha512_ctx_vector { u64x h[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]; int len; } sha512_ctx_vector_t; void sha512_transform_vector (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], const u32x w4[4], const u32x w5[4], const u32x w6[4], const u32x w7[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 = 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 = hl32_to_64 (w3[2], w3[3]); u64x w8_t = hl32_to_64 (w4[0], w4[1]); u64x w9_t = hl32_to_64 (w4[2], w4[3]); u64x wa_t = hl32_to_64 (w5[0], w5[1]); u64x wb_t = hl32_to_64 (w5[2], w5[3]); u64x wc_t = hl32_to_64 (w6[0], w6[1]); u64x wd_t = hl32_to_64 (w6[2], w6[3]); u64x we_t = hl32_to_64 (w7[0], w7[1]); u64x wf_t = hl32_to_64 (w7[2], w7[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); #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 80; i += 16) { ROUND_EXPAND (); ROUND_STEP (i); } #undef ROUND_EXPAND #undef ROUND_STEP digest[0] += a; digest[1] += b; digest[2] += c; digest[3] += d; digest[4] += e; digest[5] += f; digest[6] += g; digest[7] += h; } void sha512_init_vector (sha512_ctx_vector_t *ctx) { ctx->h[0] = SHA512M_A; ctx->h[1] = SHA512M_B; ctx->h[2] = SHA512M_C; ctx->h[3] = SHA512M_D; ctx->h[4] = SHA512M_E; ctx->h[5] = SHA512M_F; ctx->h[6] = SHA512M_G; ctx->h[7] = SHA512M_H; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->w4[0] = 0; ctx->w4[1] = 0; ctx->w4[2] = 0; ctx->w4[3] = 0; ctx->w5[0] = 0; ctx->w5[1] = 0; ctx->w5[2] = 0; ctx->w5[3] = 0; ctx->w6[0] = 0; ctx->w6[1] = 0; ctx->w6[2] = 0; ctx->w6[3] = 0; ctx->w7[0] = 0; ctx->w7[1] = 0; ctx->w7[2] = 0; ctx->w7[3] = 0; ctx->len = 0; } void sha512_init_vector_from_scalar (sha512_ctx_vector_t *ctx, sha512_ctx_t *ctx0) { ctx->h[0] = ctx0->h[0]; ctx->h[1] = ctx0->h[1]; ctx->h[2] = ctx0->h[2]; ctx->h[3] = ctx0->h[3]; ctx->h[4] = ctx0->h[4]; ctx->h[5] = ctx0->h[5]; ctx->h[6] = ctx0->h[6]; ctx->h[7] = ctx0->h[7]; ctx->w0[0] = ctx0->w0[0]; ctx->w0[1] = ctx0->w0[1]; ctx->w0[2] = ctx0->w0[2]; ctx->w0[3] = ctx0->w0[3]; ctx->w1[0] = ctx0->w1[0]; ctx->w1[1] = ctx0->w1[1]; ctx->w1[2] = ctx0->w1[2]; ctx->w1[3] = ctx0->w1[3]; ctx->w2[0] = ctx0->w2[0]; ctx->w2[1] = ctx0->w2[1]; ctx->w2[2] = ctx0->w2[2]; ctx->w2[3] = ctx0->w2[3]; ctx->w3[0] = ctx0->w3[0]; ctx->w3[1] = ctx0->w3[1]; ctx->w3[2] = ctx0->w3[2]; ctx->w3[3] = ctx0->w3[3]; ctx->w4[0] = ctx0->w4[0]; ctx->w4[1] = ctx0->w4[1]; ctx->w4[2] = ctx0->w4[2]; ctx->w4[3] = ctx0->w4[3]; ctx->w5[0] = ctx0->w5[0]; ctx->w5[1] = ctx0->w5[1]; ctx->w5[2] = ctx0->w5[2]; ctx->w5[3] = ctx0->w5[3]; ctx->w6[0] = ctx0->w6[0]; ctx->w6[1] = ctx0->w6[1]; ctx->w6[2] = ctx0->w6[2]; ctx->w6[3] = ctx0->w6[3]; ctx->w7[0] = ctx0->w7[0]; ctx->w7[1] = ctx0->w7[1]; ctx->w7[2] = ctx0->w7[2]; ctx->w7[3] = ctx0->w7[3]; ctx->len = ctx0->len; } void sha512_update_vector_128 (sha512_ctx_vector_t *ctx, 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 int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 127; #else const int pos = ctx->len & 127; #endif ctx->len += len; if ((pos + len) < 128) { switch_buffer_by_offset_8x4_be (w0, w1, w2, w3, w4, w5, w6, w7, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; ctx->w4[0] |= w4[0]; ctx->w4[1] |= w4[1]; ctx->w4[2] |= w4[2]; ctx->w4[3] |= w4[3]; ctx->w5[0] |= w5[0]; ctx->w5[1] |= w5[1]; ctx->w5[2] |= w5[2]; ctx->w5[3] |= w5[3]; ctx->w6[0] |= w6[0]; ctx->w6[1] |= w6[1]; ctx->w6[2] |= w6[2]; ctx->w6[3] |= w6[3]; ctx->w7[0] |= w7[0]; ctx->w7[1] |= w7[1]; ctx->w7[2] |= w7[2]; ctx->w7[3] |= w7[3]; } else { u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; u32x c4[4] = { 0 }; u32x c5[4] = { 0 }; u32x c6[4] = { 0 }; u32x c7[4] = { 0 }; switch_buffer_by_offset_8x4_carry_be (w0, w1, w2, w3, w4, w5, w6, w7, c0, c1, c2, c3, c4, c5, c6, c7, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; ctx->w4[0] |= w4[0]; ctx->w4[1] |= w4[1]; ctx->w4[2] |= w4[2]; ctx->w4[3] |= w4[3]; ctx->w5[0] |= w5[0]; ctx->w5[1] |= w5[1]; ctx->w5[2] |= w5[2]; ctx->w5[3] |= w5[3]; ctx->w6[0] |= w6[0]; ctx->w6[1] |= w6[1]; ctx->w6[2] |= w6[2]; ctx->w6[3] |= w6[3]; ctx->w7[0] |= w7[0]; ctx->w7[1] |= w7[1]; ctx->w7[2] |= w7[2]; ctx->w7[3] |= w7[3]; sha512_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; ctx->w4[0] = c4[0]; ctx->w4[1] = c4[1]; ctx->w4[2] = c4[2]; ctx->w4[3] = c4[3]; ctx->w5[0] = c5[0]; ctx->w5[1] = c5[1]; ctx->w5[2] = c5[2]; ctx->w5[3] = c5[3]; ctx->w6[0] = c6[0]; ctx->w6[1] = c6[1]; ctx->w6[2] = c6[2]; ctx->w6[3] = c6[3]; ctx->w7[0] = c7[0]; ctx->w7[1] = c7[1]; ctx->w7[2] = c7[2]; ctx->w7[3] = c7[3]; } } void sha512_update_vector (sha512_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 128; pos1 += 128, pos4 += 32) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; sha512_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; sha512_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - pos1); } void sha512_update_vector_swap (sha512_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 128; pos1 += 128, pos4 += 32) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); w4[0] = swap32 (w4[0]); w4[1] = swap32 (w4[1]); w4[2] = swap32 (w4[2]); w4[3] = swap32 (w4[3]); w5[0] = swap32 (w5[0]); w5[1] = swap32 (w5[1]); w5[2] = swap32 (w5[2]); w5[3] = swap32 (w5[3]); w6[0] = swap32 (w6[0]); w6[1] = swap32 (w6[1]); w6[2] = swap32 (w6[2]); w6[3] = swap32 (w6[3]); w7[0] = swap32 (w7[0]); w7[1] = swap32 (w7[1]); w7[2] = swap32 (w7[2]); w7[3] = swap32 (w7[3]); sha512_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); w4[0] = swap32 (w4[0]); w4[1] = swap32 (w4[1]); w4[2] = swap32 (w4[2]); w4[3] = swap32 (w4[3]); w5[0] = swap32 (w5[0]); w5[1] = swap32 (w5[1]); w5[2] = swap32 (w5[2]); w5[3] = swap32 (w5[3]); w6[0] = swap32 (w6[0]); w6[1] = swap32 (w6[1]); w6[2] = swap32 (w6[2]); w6[3] = swap32 (w6[3]); w7[0] = swap32 (w7[0]); w7[1] = swap32 (w7[1]); w7[2] = swap32 (w7[2]); w7[3] = swap32 (w7[3]); sha512_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - pos1); } void sha512_update_vector_utf16le (sha512_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le (w3, w6, w7); make_utf16le (w2, w4, w5); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); sha512_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le (w3, w6, w7); make_utf16le (w2, w4, w5); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); sha512_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, (len - pos1) * 2); } void sha512_update_vector_utf16le_swap (sha512_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le (w3, w6, w7); make_utf16le (w2, w4, w5); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); w4[0] = swap32 (w4[0]); w4[1] = swap32 (w4[1]); w4[2] = swap32 (w4[2]); w4[3] = swap32 (w4[3]); w5[0] = swap32 (w5[0]); w5[1] = swap32 (w5[1]); w5[2] = swap32 (w5[2]); w5[3] = swap32 (w5[3]); w6[0] = swap32 (w6[0]); w6[1] = swap32 (w6[1]); w6[2] = swap32 (w6[2]); w6[3] = swap32 (w6[3]); w7[0] = swap32 (w7[0]); w7[1] = swap32 (w7[1]); w7[2] = swap32 (w7[2]); w7[3] = swap32 (w7[3]); sha512_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16le (w3, w6, w7); make_utf16le (w2, w4, w5); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); w4[0] = swap32 (w4[0]); w4[1] = swap32 (w4[1]); w4[2] = swap32 (w4[2]); w4[3] = swap32 (w4[3]); w5[0] = swap32 (w5[0]); w5[1] = swap32 (w5[1]); w5[2] = swap32 (w5[2]); w5[3] = swap32 (w5[3]); w6[0] = swap32 (w6[0]); w6[1] = swap32 (w6[1]); w6[2] = swap32 (w6[2]); w6[3] = swap32 (w6[3]); w7[0] = swap32 (w7[0]); w7[1] = swap32 (w7[1]); w7[2] = swap32 (w7[2]); w7[3] = swap32 (w7[3]); sha512_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, (len - pos1) * 2); } void sha512_update_vector_utf16beN (sha512_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16beN (w3, w6, w7); make_utf16beN (w2, w4, w5); make_utf16beN (w1, w2, w3); make_utf16beN (w0, w0, w1); sha512_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; make_utf16beN (w3, w6, w7); make_utf16beN (w2, w4, w5); make_utf16beN (w1, w2, w3); make_utf16beN (w0, w0, w1); sha512_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, (len - pos1) * 2); } void sha512_final_vector (sha512_ctx_vector_t *ctx) { const int pos = ctx->len & 127; append_0x80_8x4 (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, pos ^ 3); if (pos >= 112) { sha512_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->w4[0] = 0; ctx->w4[1] = 0; ctx->w4[2] = 0; ctx->w4[3] = 0; ctx->w5[0] = 0; ctx->w5[1] = 0; ctx->w5[2] = 0; ctx->w5[3] = 0; ctx->w6[0] = 0; ctx->w6[1] = 0; ctx->w6[2] = 0; ctx->w6[3] = 0; ctx->w7[0] = 0; ctx->w7[1] = 0; ctx->w7[2] = 0; ctx->w7[3] = 0; } ctx->w7[2] = 0; ctx->w7[3] = ctx->len * 8; sha512_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); } // HMAC + Vector typedef struct sha512_hmac_ctx_vector { sha512_ctx_vector_t ipad; sha512_ctx_vector_t opad; } sha512_hmac_ctx_vector_t; void sha512_hmac_init_vector_128 (sha512_hmac_ctx_vector_t *ctx, const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], const u32x w4[4], const u32x w5[4], const u32x w6[4], const u32x w7[4]) { u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; u32x t4[4]; u32x t5[4]; u32x t6[4]; u32x t7[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; t4[0] = w4[0] ^ 0x36363636; t4[1] = w4[1] ^ 0x36363636; t4[2] = w4[2] ^ 0x36363636; t4[3] = w4[3] ^ 0x36363636; t5[0] = w5[0] ^ 0x36363636; t5[1] = w5[1] ^ 0x36363636; t5[2] = w5[2] ^ 0x36363636; t5[3] = w5[3] ^ 0x36363636; t6[0] = w6[0] ^ 0x36363636; t6[1] = w6[1] ^ 0x36363636; t6[2] = w6[2] ^ 0x36363636; t6[3] = w6[3] ^ 0x36363636; t7[0] = w7[0] ^ 0x36363636; t7[1] = w7[1] ^ 0x36363636; t7[2] = w7[2] ^ 0x36363636; t7[3] = w7[3] ^ 0x36363636; sha512_init_vector (&ctx->ipad); sha512_update_vector_128 (&ctx->ipad, t0, t1, t2, t3, t4, t5, t6, t7, 128); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; t4[0] = w4[0] ^ 0x5c5c5c5c; t4[1] = w4[1] ^ 0x5c5c5c5c; t4[2] = w4[2] ^ 0x5c5c5c5c; t4[3] = w4[3] ^ 0x5c5c5c5c; t5[0] = w5[0] ^ 0x5c5c5c5c; t5[1] = w5[1] ^ 0x5c5c5c5c; t5[2] = w5[2] ^ 0x5c5c5c5c; t5[3] = w5[3] ^ 0x5c5c5c5c; t6[0] = w6[0] ^ 0x5c5c5c5c; t6[1] = w6[1] ^ 0x5c5c5c5c; t6[2] = w6[2] ^ 0x5c5c5c5c; t6[3] = w6[3] ^ 0x5c5c5c5c; t7[0] = w7[0] ^ 0x5c5c5c5c; t7[1] = w7[1] ^ 0x5c5c5c5c; t7[2] = w7[2] ^ 0x5c5c5c5c; t7[3] = w7[3] ^ 0x5c5c5c5c; sha512_init_vector (&ctx->opad); sha512_update_vector_128 (&ctx->opad, t0, t1, t2, t3, t4, t5, t6, t7, 128); } void sha512_hmac_init_vector (sha512_hmac_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; if (len > 128) { sha512_ctx_vector_t tmp; sha512_init_vector (&tmp); sha512_update_vector (&tmp, w, len); sha512_final_vector (&tmp); w0[0] = h32_from_64 (tmp.h[0]); w0[1] = l32_from_64 (tmp.h[0]); w0[2] = h32_from_64 (tmp.h[1]); w0[3] = l32_from_64 (tmp.h[1]); w1[0] = h32_from_64 (tmp.h[2]); w1[1] = l32_from_64 (tmp.h[2]); w1[2] = h32_from_64 (tmp.h[3]); w1[3] = l32_from_64 (tmp.h[3]); w2[0] = h32_from_64 (tmp.h[4]); w2[1] = l32_from_64 (tmp.h[4]); w2[2] = h32_from_64 (tmp.h[5]); w2[3] = l32_from_64 (tmp.h[5]); w3[0] = h32_from_64 (tmp.h[6]); w3[1] = l32_from_64 (tmp.h[6]); w3[2] = h32_from_64 (tmp.h[7]); w3[3] = l32_from_64 (tmp.h[7]); w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; w4[0] = w[16]; w4[1] = w[17]; w4[2] = w[18]; w4[3] = w[19]; w5[0] = w[20]; w5[1] = w[21]; w5[2] = w[22]; w5[3] = w[23]; w6[0] = w[24]; w6[1] = w[25]; w6[2] = w[26]; w6[3] = w[27]; w7[0] = w[28]; w7[1] = w[29]; w7[2] = w[30]; w7[3] = w[31]; } sha512_hmac_init_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7); } void sha512_hmac_update_vector_128 (sha512_hmac_ctx_vector_t *ctx, 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 int len) { sha512_update_vector_128 (&ctx->ipad, w0, w1, w2, w3, w4, w5, w6, w7, len); } void sha512_hmac_update_vector (sha512_hmac_ctx_vector_t *ctx, const u32x *w, const int len) { sha512_update_vector (&ctx->ipad, w, len); } void sha512_hmac_final_vector (sha512_hmac_ctx_vector_t *ctx) { sha512_final_vector (&ctx->ipad); u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; u32x t4[4]; u32x t5[4]; u32x t6[4]; u32x t7[4]; t0[0] = h32_from_64 (ctx->ipad.h[0]); t0[1] = l32_from_64 (ctx->ipad.h[0]); t0[2] = h32_from_64 (ctx->ipad.h[1]); t0[3] = l32_from_64 (ctx->ipad.h[1]); t1[0] = h32_from_64 (ctx->ipad.h[2]); t1[1] = l32_from_64 (ctx->ipad.h[2]); t1[2] = h32_from_64 (ctx->ipad.h[3]); t1[3] = l32_from_64 (ctx->ipad.h[3]); t2[0] = h32_from_64 (ctx->ipad.h[4]); t2[1] = l32_from_64 (ctx->ipad.h[4]); t2[2] = h32_from_64 (ctx->ipad.h[5]); t2[3] = l32_from_64 (ctx->ipad.h[5]); t3[0] = h32_from_64 (ctx->ipad.h[6]); t3[1] = l32_from_64 (ctx->ipad.h[6]); t3[2] = h32_from_64 (ctx->ipad.h[7]); t3[3] = l32_from_64 (ctx->ipad.h[7]); t4[0] = 0; t4[1] = 0; t4[2] = 0; t4[3] = 0; t5[0] = 0; t5[1] = 0; t5[2] = 0; t5[3] = 0; t6[0] = 0; t6[1] = 0; t6[2] = 0; t6[3] = 0; t7[0] = 0; t7[1] = 0; t7[2] = 0; t7[3] = 0; sha512_update_vector_128 (&ctx->opad, t0, t1, t2, t3, t4, t5, t6, t7, 64); sha512_final_vector (&ctx->opad); } hashcat-4.0.1/OpenCL/inc_hash_whirlpool.cl000066400000000000000000003105111320027462700204460ustar00rootroot00000000000000 // important notes on this: // input buf unused bytes needs to be set to zero // input buf needs to be in algorithm native byte order (md5 = LE, sha256 = BE, etc) // input buf needs to be 64 byte aligned when using md5_update() #define R 10 __constant u32a 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 u32a 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 u32a rch[R + 1] = { 0x00000000, 0x1823c6e8, 0x36a6d2f5, 0x60bc9b8e, 0x1de0d7c2, 0x157737e5, 0x58c9290a, 0xbd5d10f4, 0xe427418b, 0xfbee7c66, 0xca2dbf07, }; __constant u32a rcl[R + 1] = { 0x00000000, 0x87b8014f, 0x796f9152, 0xa30c7b35, 0x2e4bfe57, 0x9ff04ada, 0xb1a06b85, 0xcb3e0567, 0xa77d95d8, 0xdd17479e, 0xad5a8333, }; #if VECT_SIZE == 1 #define BOX(S,n,i) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(S,n,i) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(S,n,i) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(S,n,i) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(S,n,i) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif #define BOX_S(S,n,i) (S)[(n)][(i)] typedef struct whirlpool_ctx { u32 h[16]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int len; SHM_TYPE u32 (*s_Ch)[256]; SHM_TYPE u32 (*s_Cl)[256]; } whirlpool_ctx_t; void whirlpool_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[16], SHM_TYPE u32 (*s_Ch)[256], SHM_TYPE u32 (*s_Cl)[256]) { u32 Kh[8]; u32 Kl[8]; Kh[0] = digest[ 0]; Kl[0] = digest[ 1]; Kh[1] = digest[ 2]; Kl[1] = digest[ 3]; Kh[2] = digest[ 4]; Kl[2] = digest[ 5]; Kh[3] = digest[ 6]; Kl[3] = digest[ 7]; Kh[4] = digest[ 8]; Kl[4] = digest[ 9]; Kh[5] = digest[10]; Kl[5] = digest[11]; Kh[6] = digest[12]; Kl[6] = digest[13]; Kh[7] = digest[14]; Kl[7] = digest[15]; u32 stateh[8]; u32 statel[8]; stateh[0] = w0[0] ^ Kh[0]; statel[0] = w0[1] ^ Kl[0]; stateh[1] = w0[2] ^ Kh[1]; statel[1] = w0[3] ^ Kl[1]; stateh[2] = w1[0] ^ Kh[2]; statel[2] = w1[1] ^ Kl[2]; stateh[3] = w1[2] ^ Kh[3]; statel[3] = w1[3] ^ Kl[3]; stateh[4] = w2[0] ^ Kh[4]; statel[4] = w2[1] ^ Kl[4]; stateh[5] = w2[2] ^ Kh[5]; statel[5] = w2[3] ^ Kl[5]; stateh[6] = w3[0] ^ Kh[6]; statel[6] = w3[1] ^ Kl[6]; stateh[7] = w3[2] ^ Kh[7]; statel[7] = w3[3] ^ Kl[7]; u32 r; for (r = 1; r <= R; r++) { u32 Lh[8]; u32 Ll[8]; u32 i; #ifdef _unroll #pragma unroll #endif for (i = 0; i < 8; i++) { const u32 Lp0 = Kh[(i + 8) & 7] >> 24; const u32 Lp1 = Kh[(i + 7) & 7] >> 16; const u32 Lp2 = Kh[(i + 6) & 7] >> 8; const u32 Lp3 = Kh[(i + 5) & 7] >> 0; const u32 Lp4 = Kl[(i + 4) & 7] >> 24; const u32 Lp5 = Kl[(i + 3) & 7] >> 16; const u32 Lp6 = Kl[(i + 2) & 7] >> 8; const u32 Lp7 = Kl[(i + 1) & 7] >> 0; Lh[i] = BOX_S (s_Ch, 0, Lp0 & 0xff) ^ BOX_S (s_Ch, 1, Lp1 & 0xff) ^ BOX_S (s_Ch, 2, Lp2 & 0xff) ^ BOX_S (s_Ch, 3, Lp3 & 0xff) ^ BOX_S (s_Ch, 4, Lp4 & 0xff) ^ BOX_S (s_Ch, 5, Lp5 & 0xff) ^ BOX_S (s_Ch, 6, Lp6 & 0xff) ^ BOX_S (s_Ch, 7, Lp7 & 0xff); Ll[i] = BOX_S (s_Cl, 0, Lp0 & 0xff) ^ BOX_S (s_Cl, 1, Lp1 & 0xff) ^ BOX_S (s_Cl, 2, Lp2 & 0xff) ^ BOX_S (s_Cl, 3, Lp3 & 0xff) ^ BOX_S (s_Cl, 4, Lp4 & 0xff) ^ BOX_S (s_Cl, 5, Lp5 & 0xff) ^ BOX_S (s_Cl, 6, Lp6 & 0xff) ^ BOX_S (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]; #ifdef _unroll #pragma unroll #endif for (i = 0; i < 8; i++) { const u32 Lp0 = stateh[(i + 8) & 7] >> 24; const u32 Lp1 = stateh[(i + 7) & 7] >> 16; const u32 Lp2 = stateh[(i + 6) & 7] >> 8; const u32 Lp3 = stateh[(i + 5) & 7] >> 0; const u32 Lp4 = statel[(i + 4) & 7] >> 24; const u32 Lp5 = statel[(i + 3) & 7] >> 16; const u32 Lp6 = statel[(i + 2) & 7] >> 8; const u32 Lp7 = statel[(i + 1) & 7] >> 0; Lh[i] = BOX_S (s_Ch, 0, Lp0 & 0xff) ^ BOX_S (s_Ch, 1, Lp1 & 0xff) ^ BOX_S (s_Ch, 2, Lp2 & 0xff) ^ BOX_S (s_Ch, 3, Lp3 & 0xff) ^ BOX_S (s_Ch, 4, Lp4 & 0xff) ^ BOX_S (s_Ch, 5, Lp5 & 0xff) ^ BOX_S (s_Ch, 6, Lp6 & 0xff) ^ BOX_S (s_Ch, 7, Lp7 & 0xff); Ll[i] = BOX_S (s_Cl, 0, Lp0 & 0xff) ^ BOX_S (s_Cl, 1, Lp1 & 0xff) ^ BOX_S (s_Cl, 2, Lp2 & 0xff) ^ BOX_S (s_Cl, 3, Lp3 & 0xff) ^ BOX_S (s_Cl, 4, Lp4 & 0xff) ^ BOX_S (s_Cl, 5, Lp5 & 0xff) ^ BOX_S (s_Cl, 6, Lp6 & 0xff) ^ BOX_S (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]; } digest[ 0] ^= stateh[0] ^ w0[0]; digest[ 1] ^= statel[0] ^ w0[1]; digest[ 2] ^= stateh[1] ^ w0[2]; digest[ 3] ^= statel[1] ^ w0[3]; digest[ 4] ^= stateh[2] ^ w1[0]; digest[ 5] ^= statel[2] ^ w1[1]; digest[ 6] ^= stateh[3] ^ w1[2]; digest[ 7] ^= statel[3] ^ w1[3]; digest[ 8] ^= stateh[4] ^ w2[0]; digest[ 9] ^= statel[4] ^ w2[1]; digest[10] ^= stateh[5] ^ w2[2]; digest[11] ^= statel[5] ^ w2[3]; digest[12] ^= stateh[6] ^ w3[0]; digest[13] ^= statel[6] ^ w3[1]; digest[14] ^= stateh[7] ^ w3[2]; digest[15] ^= statel[7] ^ w3[3]; } void whirlpool_init (whirlpool_ctx_t *ctx, SHM_TYPE u32 (*s_Ch)[256], SHM_TYPE u32 (*s_Cl)[256]) { ctx->h[ 0] = 0; ctx->h[ 1] = 0; ctx->h[ 2] = 0; ctx->h[ 3] = 0; ctx->h[ 4] = 0; ctx->h[ 5] = 0; ctx->h[ 6] = 0; ctx->h[ 7] = 0; ctx->h[ 8] = 0; ctx->h[ 9] = 0; ctx->h[10] = 0; ctx->h[11] = 0; ctx->h[12] = 0; ctx->h[13] = 0; ctx->h[14] = 0; ctx->h[15] = 0; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->len = 0; ctx->s_Ch = s_Ch; ctx->s_Cl = s_Cl; } void whirlpool_update_64 (whirlpool_ctx_t *ctx, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 63; #else const int pos = ctx->len & 63; #endif ctx->len += len; if ((pos + len) < 64) { switch_buffer_by_offset_be_S (w0, w1, w2, w3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; } else { u32 c0[4] = { 0 }; u32 c1[4] = { 0 }; u32 c2[4] = { 0 }; u32 c3[4] = { 0 }; switch_buffer_by_offset_carry_be_S (w0, w1, w2, w3, c0, c1, c2, c3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; whirlpool_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h, ctx->s_Ch, ctx->s_Cl); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; } } void whirlpool_update (whirlpool_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; whirlpool_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; whirlpool_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void whirlpool_update_swap (whirlpool_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); whirlpool_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); whirlpool_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void whirlpool_update_utf16le (whirlpool_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); whirlpool_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); whirlpool_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void whirlpool_update_utf16le_swap (whirlpool_ctx_t *ctx, const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); whirlpool_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); whirlpool_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void whirlpool_update_global (whirlpool_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; whirlpool_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; whirlpool_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void whirlpool_update_global_swap (whirlpool_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); whirlpool_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); whirlpool_update_64 (ctx, w0, w1, w2, w3, len - pos1); } void whirlpool_update_global_utf16le (whirlpool_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); whirlpool_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); whirlpool_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void whirlpool_update_global_utf16le_swap (whirlpool_ctx_t *ctx, const __global u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); whirlpool_update_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); whirlpool_update_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void whirlpool_final (whirlpool_ctx_t *ctx) { const int pos = ctx->len & 63; append_0x80_4x4_S (ctx->w0, ctx->w1, ctx->w2, ctx->w3, pos ^ 3); if (pos >= 56) { whirlpool_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h, ctx->s_Ch, ctx->s_Cl); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; } ctx->w3[2] = 0; ctx->w3[3] = ctx->len * 8; whirlpool_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h, ctx->s_Ch, ctx->s_Cl); } // whirlpool_hmac typedef struct whirlpool_hmac_ctx { whirlpool_ctx_t ipad; whirlpool_ctx_t opad; } whirlpool_hmac_ctx_t; void whirlpool_hmac_init_64 (whirlpool_hmac_ctx_t *ctx, const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], SHM_TYPE u32 (*s_Ch)[256], SHM_TYPE u32 (*s_Cl)[256]) { u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; whirlpool_init (&ctx->ipad, s_Ch, s_Cl); whirlpool_update_64 (&ctx->ipad, t0, t1, t2, t3, 64); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; whirlpool_init (&ctx->opad, s_Ch, s_Cl); whirlpool_update_64 (&ctx->opad, t0, t1, t2, t3, 64); } void whirlpool_hmac_init (whirlpool_hmac_ctx_t *ctx, const u32 *w, const int len, SHM_TYPE u32 (*s_Ch)[256], SHM_TYPE u32 (*s_Cl)[256]) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { whirlpool_ctx_t tmp; whirlpool_init (&tmp, s_Ch, s_Cl); whirlpool_update (&tmp, w, len); whirlpool_final (&tmp); w0[0] = tmp.h[ 0]; w0[1] = tmp.h[ 1]; w0[2] = tmp.h[ 2]; w0[3] = tmp.h[ 3]; w1[0] = tmp.h[ 4]; w1[1] = tmp.h[ 5]; w1[2] = tmp.h[ 6]; w1[3] = tmp.h[ 7]; w2[0] = tmp.h[ 8]; w2[1] = tmp.h[ 9]; w2[2] = tmp.h[10]; w2[3] = tmp.h[11]; w3[0] = tmp.h[12]; w3[1] = tmp.h[13]; w3[2] = tmp.h[14]; w3[3] = tmp.h[15]; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } whirlpool_hmac_init_64 (ctx, w0, w1, w2, w3, s_Ch, s_Cl); } void whirlpool_hmac_init_swap (whirlpool_hmac_ctx_t *ctx, const u32 *w, const int len, SHM_TYPE u32 (*s_Ch)[256], SHM_TYPE u32 (*s_Cl)[256]) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { whirlpool_ctx_t tmp; whirlpool_init (&tmp, s_Ch, s_Cl); whirlpool_update_swap (&tmp, w, len); whirlpool_final (&tmp); w0[0] = tmp.h[ 0]; w0[1] = tmp.h[ 1]; w0[2] = tmp.h[ 2]; w0[3] = tmp.h[ 3]; w1[0] = tmp.h[ 4]; w1[1] = tmp.h[ 5]; w1[2] = tmp.h[ 6]; w1[3] = tmp.h[ 7]; w2[0] = tmp.h[ 8]; w2[1] = tmp.h[ 9]; w2[2] = tmp.h[10]; w2[3] = tmp.h[11]; w3[0] = tmp.h[12]; w3[1] = tmp.h[13]; w3[2] = tmp.h[14]; w3[3] = tmp.h[15]; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); } whirlpool_hmac_init_64 (ctx, w0, w1, w2, w3, s_Ch, s_Cl); } void whirlpool_hmac_init_global (whirlpool_hmac_ctx_t *ctx, __global const u32 *w, const int len, SHM_TYPE u32 (*s_Ch)[256], SHM_TYPE u32 (*s_Cl)[256]) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { whirlpool_ctx_t tmp; whirlpool_init (&tmp, s_Ch, s_Cl); whirlpool_update_global (&tmp, w, len); whirlpool_final (&tmp); w0[0] = tmp.h[ 0]; w0[1] = tmp.h[ 1]; w0[2] = tmp.h[ 2]; w0[3] = tmp.h[ 3]; w1[0] = tmp.h[ 4]; w1[1] = tmp.h[ 5]; w1[2] = tmp.h[ 6]; w1[3] = tmp.h[ 7]; w2[0] = tmp.h[ 8]; w2[1] = tmp.h[ 9]; w2[2] = tmp.h[10]; w2[3] = tmp.h[11]; w3[0] = tmp.h[12]; w3[1] = tmp.h[13]; w3[2] = tmp.h[14]; w3[3] = tmp.h[15]; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } whirlpool_hmac_init_64 (ctx, w0, w1, w2, w3, s_Ch, s_Cl); } void whirlpool_hmac_init_global_swap (whirlpool_hmac_ctx_t *ctx, __global const u32 *w, const int len, SHM_TYPE u32 (*s_Ch)[256], SHM_TYPE u32 (*s_Cl)[256]) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; if (len > 64) { whirlpool_ctx_t tmp; whirlpool_init (&tmp, s_Ch, s_Cl); whirlpool_update_global_swap (&tmp, w, len); whirlpool_final (&tmp); w0[0] = tmp.h[ 0]; w0[1] = tmp.h[ 1]; w0[2] = tmp.h[ 2]; w0[3] = tmp.h[ 3]; w1[0] = tmp.h[ 4]; w1[1] = tmp.h[ 5]; w1[2] = tmp.h[ 6]; w1[3] = tmp.h[ 7]; w2[0] = tmp.h[ 8]; w2[1] = tmp.h[ 9]; w2[2] = tmp.h[10]; w2[3] = tmp.h[11]; w3[0] = tmp.h[12]; w3[1] = tmp.h[13]; w3[2] = tmp.h[14]; w3[3] = tmp.h[15]; } else { w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); } whirlpool_hmac_init_64 (ctx, w0, w1, w2, w3, s_Ch, s_Cl); } void whirlpool_hmac_update_64 (whirlpool_hmac_ctx_t *ctx, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const int len) { whirlpool_update_64 (&ctx->ipad, w0, w1, w2, w3, len); } void whirlpool_hmac_update (whirlpool_hmac_ctx_t *ctx, const u32 *w, const int len) { whirlpool_update (&ctx->ipad, w, len); } void whirlpool_hmac_update_swap (whirlpool_hmac_ctx_t *ctx, const u32 *w, const int len) { whirlpool_update_swap (&ctx->ipad, w, len); } void whirlpool_hmac_update_utf16le (whirlpool_hmac_ctx_t *ctx, const u32 *w, const int len) { whirlpool_update_utf16le (&ctx->ipad, w, len); } void whirlpool_hmac_update_utf16le_swap (whirlpool_hmac_ctx_t *ctx, const u32 *w, const int len) { whirlpool_update_utf16le_swap (&ctx->ipad, w, len); } void whirlpool_hmac_update_global (whirlpool_hmac_ctx_t *ctx, const __global u32 *w, const int len) { whirlpool_update_global (&ctx->ipad, w, len); } void whirlpool_hmac_update_global_swap (whirlpool_hmac_ctx_t *ctx, const __global u32 *w, const int len) { whirlpool_update_global_swap (&ctx->ipad, w, len); } void whirlpool_hmac_update_global_utf16le (whirlpool_hmac_ctx_t *ctx, const __global u32 *w, const int len) { whirlpool_update_global_utf16le (&ctx->ipad, w, len); } void whirlpool_hmac_update_global_utf16le_swap (whirlpool_hmac_ctx_t *ctx, const __global u32 *w, const int len) { whirlpool_update_global_utf16le_swap (&ctx->ipad, w, len); } void whirlpool_hmac_final (whirlpool_hmac_ctx_t *ctx) { whirlpool_final (&ctx->ipad); u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; t0[0] = ctx->ipad.h[ 0]; t0[1] = ctx->ipad.h[ 1]; t0[2] = ctx->ipad.h[ 2]; t0[3] = ctx->ipad.h[ 3]; t1[0] = ctx->ipad.h[ 4]; t1[1] = ctx->ipad.h[ 5]; t1[2] = ctx->ipad.h[ 6]; t1[3] = ctx->ipad.h[ 7]; t2[0] = ctx->ipad.h[ 8]; t2[1] = ctx->ipad.h[ 9]; t2[2] = ctx->ipad.h[10]; t2[3] = ctx->ipad.h[11]; t3[0] = ctx->ipad.h[12]; t3[1] = ctx->ipad.h[13]; t3[2] = ctx->ipad.h[14]; t3[3] = ctx->ipad.h[15]; whirlpool_update_64 (&ctx->opad, t0, t1, t2, t3, 64); whirlpool_final (&ctx->opad); } // while input buf can be a vector datatype, the length of the different elements can not typedef struct whirlpool_ctx_vector { u32x h[16]; u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int len; SHM_TYPE u32 (*s_Ch)[256]; SHM_TYPE u32 (*s_Cl)[256]; } whirlpool_ctx_vector_t; void whirlpool_transform_vector (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[16], SHM_TYPE u32 (*s_Ch)[256], SHM_TYPE u32 (*s_Cl)[256]) { u32x Kh[8]; u32x Kl[8]; Kh[0] = digest[ 0]; Kl[0] = digest[ 1]; Kh[1] = digest[ 2]; Kl[1] = digest[ 3]; Kh[2] = digest[ 4]; Kl[2] = digest[ 5]; Kh[3] = digest[ 6]; Kl[3] = digest[ 7]; Kh[4] = digest[ 8]; Kl[4] = digest[ 9]; Kh[5] = digest[10]; Kl[5] = digest[11]; Kh[6] = digest[12]; Kl[6] = digest[13]; Kh[7] = digest[14]; Kl[7] = digest[15]; u32x stateh[8]; u32x statel[8]; stateh[0] = w0[0] ^ Kh[0]; statel[0] = w0[1] ^ Kl[0]; stateh[1] = w0[2] ^ Kh[1]; statel[1] = w0[3] ^ Kl[1]; stateh[2] = w1[0] ^ Kh[2]; statel[2] = w1[1] ^ Kl[2]; stateh[3] = w1[2] ^ Kh[3]; statel[3] = w1[3] ^ Kl[3]; stateh[4] = w2[0] ^ Kh[4]; statel[4] = w2[1] ^ Kl[4]; stateh[5] = w2[2] ^ Kh[5]; statel[5] = w2[3] ^ Kl[5]; stateh[6] = w3[0] ^ Kh[6]; statel[6] = w3[1] ^ Kl[6]; stateh[7] = w3[2] ^ Kh[7]; statel[7] = w3[3] ^ Kl[7]; u32 r; for (r = 1; r <= R; r++) { u32x Lh[8]; u32x Ll[8]; u32 i; #ifdef _unroll #pragma unroll #endif for (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]; #ifdef _unroll #pragma unroll #endif for (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]; } digest[ 0] ^= stateh[0] ^ w0[0]; digest[ 1] ^= statel[0] ^ w0[1]; digest[ 2] ^= stateh[1] ^ w0[2]; digest[ 3] ^= statel[1] ^ w0[3]; digest[ 4] ^= stateh[2] ^ w1[0]; digest[ 5] ^= statel[2] ^ w1[1]; digest[ 6] ^= stateh[3] ^ w1[2]; digest[ 7] ^= statel[3] ^ w1[3]; digest[ 8] ^= stateh[4] ^ w2[0]; digest[ 9] ^= statel[4] ^ w2[1]; digest[10] ^= stateh[5] ^ w2[2]; digest[11] ^= statel[5] ^ w2[3]; digest[12] ^= stateh[6] ^ w3[0]; digest[13] ^= statel[6] ^ w3[1]; digest[14] ^= stateh[7] ^ w3[2]; digest[15] ^= statel[7] ^ w3[3]; } void whirlpool_init_vector (whirlpool_ctx_vector_t *ctx, SHM_TYPE u32 (*s_Ch)[256], SHM_TYPE u32 (*s_Cl)[256]) { ctx->h[ 0] = 0; ctx->h[ 1] = 0; ctx->h[ 2] = 0; ctx->h[ 3] = 0; ctx->h[ 4] = 0; ctx->h[ 5] = 0; ctx->h[ 6] = 0; ctx->h[ 7] = 0; ctx->h[ 8] = 0; ctx->h[ 9] = 0; ctx->h[10] = 0; ctx->h[11] = 0; ctx->h[12] = 0; ctx->h[13] = 0; ctx->h[14] = 0; ctx->h[15] = 0; ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->len = 0; ctx->s_Ch = s_Ch; ctx->s_Cl = s_Cl; } void whirlpool_init_vector_from_scalar (whirlpool_ctx_vector_t *ctx, whirlpool_ctx_t *ctx0) { ctx->h[ 0] = ctx0->h[ 0]; ctx->h[ 1] = ctx0->h[ 1]; ctx->h[ 2] = ctx0->h[ 2]; ctx->h[ 3] = ctx0->h[ 3]; ctx->h[ 4] = ctx0->h[ 4]; ctx->h[ 5] = ctx0->h[ 5]; ctx->h[ 6] = ctx0->h[ 6]; ctx->h[ 7] = ctx0->h[ 7]; ctx->h[ 8] = ctx0->h[ 8]; ctx->h[ 9] = ctx0->h[ 9]; ctx->h[10] = ctx0->h[10]; ctx->h[11] = ctx0->h[11]; ctx->h[12] = ctx0->h[12]; ctx->h[13] = ctx0->h[13]; ctx->h[14] = ctx0->h[14]; ctx->h[15] = ctx0->h[15]; ctx->w0[0] = ctx0->w0[0]; ctx->w0[1] = ctx0->w0[1]; ctx->w0[2] = ctx0->w0[2]; ctx->w0[3] = ctx0->w0[3]; ctx->w1[0] = ctx0->w1[0]; ctx->w1[1] = ctx0->w1[1]; ctx->w1[2] = ctx0->w1[2]; ctx->w1[3] = ctx0->w1[3]; ctx->w2[0] = ctx0->w2[0]; ctx->w2[1] = ctx0->w2[1]; ctx->w2[2] = ctx0->w2[2]; ctx->w2[3] = ctx0->w2[3]; ctx->w3[0] = ctx0->w3[0]; ctx->w3[1] = ctx0->w3[1]; ctx->w3[2] = ctx0->w3[2]; ctx->w3[3] = ctx0->w3[3]; ctx->len = ctx0->len; ctx->s_Ch = ctx0->s_Ch; ctx->s_Cl = ctx0->s_Cl; } void whirlpool_update_vector_64 (whirlpool_ctx_vector_t *ctx, u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const int len) { #ifdef IS_AMD volatile const int pos = ctx->len & 63; #else const int pos = ctx->len & 63; #endif ctx->len += len; if ((pos + len) < 64) { switch_buffer_by_offset_be (w0, w1, w2, w3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; } else { u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_be (w0, w1, w2, w3, c0, c1, c2, c3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; whirlpool_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h, ctx->s_Ch, ctx->s_Cl); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; } } void whirlpool_update_vector (whirlpool_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; whirlpool_update_vector_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; whirlpool_update_vector_64 (ctx, w0, w1, w2, w3, len - pos1); } void whirlpool_update_vector_swap (whirlpool_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); whirlpool_update_vector_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); whirlpool_update_vector_64 (ctx, w0, w1, w2, w3, len - pos1); } void whirlpool_update_vector_utf16le (whirlpool_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); whirlpool_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); whirlpool_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void whirlpool_update_vector_utf16le_swap (whirlpool_ctx_vector_t *ctx, const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 32; pos1 += 32, pos4 += 8) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); whirlpool_update_vector_64 (ctx, w0, w1, w2, w3, 32 * 2); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); whirlpool_update_vector_64 (ctx, w0, w1, w2, w3, (len - pos1) * 2); } void whirlpool_final_vector (whirlpool_ctx_vector_t *ctx) { const int pos = ctx->len & 63; append_0x80_4x4 (ctx->w0, ctx->w1, ctx->w2, ctx->w3, pos ^ 3); if (pos >= 56) { whirlpool_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h, ctx->s_Ch, ctx->s_Cl); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; } ctx->w3[2] = 0; ctx->w3[3] = ctx->len * 8; whirlpool_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h, ctx->s_Ch, ctx->s_Cl); } // HMAC + Vector typedef struct whirlpool_hmac_ctx_vector { whirlpool_ctx_vector_t ipad; whirlpool_ctx_vector_t opad; } whirlpool_hmac_ctx_vector_t; void whirlpool_hmac_init_vector_64 (whirlpool_hmac_ctx_vector_t *ctx, const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], SHM_TYPE u32 (*s_Ch)[256], SHM_TYPE u32 (*s_Cl)[256]) { u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; // ipad t0[0] = w0[0] ^ 0x36363636; t0[1] = w0[1] ^ 0x36363636; t0[2] = w0[2] ^ 0x36363636; t0[3] = w0[3] ^ 0x36363636; t1[0] = w1[0] ^ 0x36363636; t1[1] = w1[1] ^ 0x36363636; t1[2] = w1[2] ^ 0x36363636; t1[3] = w1[3] ^ 0x36363636; t2[0] = w2[0] ^ 0x36363636; t2[1] = w2[1] ^ 0x36363636; t2[2] = w2[2] ^ 0x36363636; t2[3] = w2[3] ^ 0x36363636; t3[0] = w3[0] ^ 0x36363636; t3[1] = w3[1] ^ 0x36363636; t3[2] = w3[2] ^ 0x36363636; t3[3] = w3[3] ^ 0x36363636; whirlpool_init_vector (&ctx->ipad, s_Ch, s_Cl); whirlpool_update_vector_64 (&ctx->ipad, t0, t1, t2, t3, 64); // opad t0[0] = w0[0] ^ 0x5c5c5c5c; t0[1] = w0[1] ^ 0x5c5c5c5c; t0[2] = w0[2] ^ 0x5c5c5c5c; t0[3] = w0[3] ^ 0x5c5c5c5c; t1[0] = w1[0] ^ 0x5c5c5c5c; t1[1] = w1[1] ^ 0x5c5c5c5c; t1[2] = w1[2] ^ 0x5c5c5c5c; t1[3] = w1[3] ^ 0x5c5c5c5c; t2[0] = w2[0] ^ 0x5c5c5c5c; t2[1] = w2[1] ^ 0x5c5c5c5c; t2[2] = w2[2] ^ 0x5c5c5c5c; t2[3] = w2[3] ^ 0x5c5c5c5c; t3[0] = w3[0] ^ 0x5c5c5c5c; t3[1] = w3[1] ^ 0x5c5c5c5c; t3[2] = w3[2] ^ 0x5c5c5c5c; t3[3] = w3[3] ^ 0x5c5c5c5c; whirlpool_init_vector (&ctx->opad, s_Ch, s_Cl); whirlpool_update_vector_64 (&ctx->opad, t0, t1, t2, t3, 64); } void whirlpool_hmac_init_vector (whirlpool_hmac_ctx_vector_t *ctx, const u32x *w, const int len, SHM_TYPE u32 (*s_Ch)[256], SHM_TYPE u32 (*s_Cl)[256]) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; if (len > 64) { whirlpool_ctx_vector_t tmp; whirlpool_init_vector (&tmp, s_Ch, s_Cl); whirlpool_update_vector (&tmp, w, len); whirlpool_final_vector (&tmp); w0[0] = tmp.h[ 0]; w0[1] = tmp.h[ 1]; w0[2] = tmp.h[ 2]; w0[3] = tmp.h[ 3]; w1[0] = tmp.h[ 4]; w1[1] = tmp.h[ 5]; w1[2] = tmp.h[ 6]; w1[3] = tmp.h[ 7]; w2[0] = tmp.h[ 8]; w2[1] = tmp.h[ 9]; w2[2] = tmp.h[10]; w2[3] = tmp.h[11]; w3[0] = tmp.h[12]; w3[1] = tmp.h[13]; w3[2] = tmp.h[14]; w3[3] = tmp.h[15]; } else { w0[0] = w[ 0]; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; } whirlpool_hmac_init_vector_64 (ctx, w0, w1, w2, w3, s_Ch, s_Cl); } void whirlpool_hmac_update_vector_64 (whirlpool_hmac_ctx_vector_t *ctx, u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const int len) { whirlpool_update_vector_64 (&ctx->ipad, w0, w1, w2, w3, len); } void whirlpool_hmac_update_vector (whirlpool_hmac_ctx_vector_t *ctx, const u32x *w, const int len) { whirlpool_update_vector (&ctx->ipad, w, len); } void whirlpool_hmac_final_vector (whirlpool_hmac_ctx_vector_t *ctx) { whirlpool_final_vector (&ctx->ipad); u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = ctx->ipad.h[ 0]; t0[1] = ctx->ipad.h[ 1]; t0[2] = ctx->ipad.h[ 2]; t0[3] = ctx->ipad.h[ 3]; t1[0] = ctx->ipad.h[ 4]; t1[1] = ctx->ipad.h[ 5]; t1[2] = ctx->ipad.h[ 6]; t1[3] = ctx->ipad.h[ 7]; t2[0] = ctx->ipad.h[ 8]; t2[1] = ctx->ipad.h[ 9]; t2[2] = ctx->ipad.h[10]; t2[3] = ctx->ipad.h[11]; t3[0] = ctx->ipad.h[12]; t3[1] = ctx->ipad.h[13]; t3[2] = ctx->ipad.h[14]; t3[3] = ctx->ipad.h[15]; whirlpool_update_vector_64 (&ctx->opad, t0, t1, t2, t3, 64); whirlpool_final_vector (&ctx->opad); } #undef R #undef BOX #undef BOX_S hashcat-4.0.1/OpenCL/inc_luks_aes.cl000066400000000000000000003473331320027462700172460ustar00rootroot00000000000000 // cbc-essiv void aes128_decrypt_cbc (const u32 *ks1, const u32 *in, u32 *out, u32 *essiv, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { aes128_decrypt (ks1, in, out, s_td0, s_td1, s_td2, s_td3, s_td4); out[0] ^= essiv[0]; out[1] ^= essiv[1]; out[2] ^= essiv[2]; out[3] ^= essiv[3]; essiv[0] = in[0]; essiv[1] = in[1]; essiv[2] = in[2]; essiv[3] = in[3]; } void aes256_decrypt_cbc (const u32 *ks1, const u32 *in, u32 *out, u32 *essiv, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { aes256_decrypt (ks1, in, out, s_td0, s_td1, s_td2, s_td3, s_td4); out[0] ^= essiv[0]; out[1] ^= essiv[1]; out[2] ^= essiv[2]; out[3] ^= essiv[3]; essiv[0] = in[0]; essiv[1] = in[1]; essiv[2] = in[2]; essiv[3] = in[3]; } void luks_decrypt_sector_aes_cbc_essiv128 (__global const u32 *in, u32 *out, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; int idx_out = 0; for (int i = 0; i < 32; i++) { for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_aes_cbc_essiv128_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse16 (mk); } } void luks_decrypt_sector_aes_cbc_essiv128_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse16 (mk); } // this one has no AF_sha1_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_cbc_essiv128_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse16 (mk); } } void luks_decrypt_sector_aes_cbc_essiv128_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse16 (mk); } // this one has no AF_sha256_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_cbc_essiv128_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse16 (mk); } } void luks_decrypt_sector_aes_cbc_essiv128_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse16 (mk); } // this one has no AF_sha512_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_cbc_essiv128_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse16 (mk); } } void luks_decrypt_sector_aes_cbc_essiv128_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse16 (mk); } // this one has no AF_ripemd160_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_cbc_essiv256 (__global const u32 *in, u32 *out, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; int idx_out = 0; for (int i = 0; i < 16; i++) { for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_aes_cbc_essiv256_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } } void luks_decrypt_sector_aes_cbc_essiv256_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } // this one has no AF_sha1_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_cbc_essiv256_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } } void luks_decrypt_sector_aes_cbc_essiv256_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } // this one has no AF_sha256_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_cbc_essiv256_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } } void luks_decrypt_sector_aes_cbc_essiv256_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } // this one has no AF_sha512_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_cbc_essiv256_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } } void luks_decrypt_sector_aes_cbc_essiv256_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; aes256_encrypt (ks2, S, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } // this one has no AF_ripemd160_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, essiv, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } // cbc-plain void luks_decrypt_sector_aes_cbc_plain128 (__global const u32 *in, u32 *out, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; int idx_out = 0; for (int i = 0; i < 32; i++) { for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_aes_cbc_plain128_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse16 (mk); } } void luks_decrypt_sector_aes_cbc_plain128_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse16 (mk); } // this one has no AF_sha1_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_cbc_plain128_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse16 (mk); } } void luks_decrypt_sector_aes_cbc_plain128_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse16 (mk); } // this one has no AF_sha256_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_cbc_plain128_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse16 (mk); } } void luks_decrypt_sector_aes_cbc_plain128_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse16 (mk); } // this one has no AF_sha512_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_cbc_plain128_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse16 (mk); } } void luks_decrypt_sector_aes_cbc_plain128_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse16 (mk); } // this one has no AF_ripemd160_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_cbc_plain256 (__global const u32 *in, u32 *out, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; int idx_out = 0; for (int i = 0; i < 16; i++) { for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_aes_cbc_plain256_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } } void luks_decrypt_sector_aes_cbc_plain256_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } // this one has no AF_sha1_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_cbc_plain256_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } } void luks_decrypt_sector_aes_cbc_plain256_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } // this one has no AF_sha256_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_cbc_plain256_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } } void luks_decrypt_sector_aes_cbc_plain256_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } // this one has no AF_sha512_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_cbc_plain256_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } } void luks_decrypt_sector_aes_cbc_plain256_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } // this one has no AF_ripemd160_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_cbc (ks1, data_in, data_out, S, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } // xts-plain void aes128_decrypt_xts (const u32 *ks1, const u32 *in, u32 *out, u32 *T, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { out[0] = in[0]; out[1] = in[1]; out[2] = in[2]; out[3] = in[3]; out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; aes128_decrypt (ks1, out, out, s_td0, s_td1, s_td2, s_td3, s_td4); out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; xts_mul2 (T, T); } void aes256_decrypt_xts (const u32 *ks1, const u32 *in, u32 *out, u32 *T, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { out[0] = in[0]; out[1] = in[1]; out[2] = in[2]; out[3] = in[3]; out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; aes256_decrypt (ks1, out, out, s_td0, s_td1, s_td2, s_td3, s_td4); out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; xts_mul2 (T, T); } void luks_decrypt_sector_aes_xts_plain256 (__global const u32 *in, u32 *out, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes128_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; int idx_out = 0; for (int i = 0; i < 16; i++) { for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_aes_xts_plain256_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes128_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } } void luks_decrypt_sector_aes_xts_plain256_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes128_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } // this one has no AF_sha1_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_xts_plain256_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes128_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } } void luks_decrypt_sector_aes_xts_plain256_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes128_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } // this one has no AF_sha256_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_xts_plain256_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes128_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } } void luks_decrypt_sector_aes_xts_plain256_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes128_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } // this one has no AF_sha512_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_xts_plain256_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes128_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } } void luks_decrypt_sector_aes_xts_plain256_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes128_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } // this one has no AF_ripemd160_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes128_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_xts_plain512 (__global const u32 *in, u32 *out, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes256_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; int idx_out = 0; for (int i = 0; i < 8; i++) { for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_aes_xts_plain512_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes256_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 8; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse64 (mk); } } void luks_decrypt_sector_aes_xts_plain512_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes256_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 8 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse64 (mk); } // this one has no AF_sha1_diffuse64() int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_xts_plain512_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes256_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 8; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse64 (mk); } } void luks_decrypt_sector_aes_xts_plain512_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes256_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 8 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse64 (mk); } // this one has no AF_sha256_diffuse64() int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_xts_plain512_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes256_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 8; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse64 (mk); } } void luks_decrypt_sector_aes_xts_plain512_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes256_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 8 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse64 (mk); } // this one has no AF_sha512_diffuse64() int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_aes_xts_plain512_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes256_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 8; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse64 (mk); } } void luks_decrypt_sector_aes_xts_plain512_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, const u32 sector, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; aes256_encrypt (ks2, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); int idx_in = 0; for (int i = 0; i < 8 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse64 (mk); } // this one has no AF_ripemd160_diffuse64() int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; aes256_decrypt_xts (ks1, data_in, data_out, T, s_td0, s_td1, s_td2, s_td3, s_td4); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } // luks helper void luks_af_sha1_then_aes_decrypt (__global const luks_t *luks_bufs, __global luks_tmp_t *tmps, u32 *pt_buf, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { const u32 key_size = luks_bufs->key_size; const u32 cipher_mode = luks_bufs->cipher_mode; #define BITS_PER_AF (key_size * LUKS_STRIPES) #define BITS_PER_SECTOR (512 * 8) #define SECTOR_PER_AF (BITS_PER_AF / BITS_PER_SECTOR) #define BLOCKS_PER_SECTOR (512 / 16) #define OFFSET_PER_BLOCK (16 / 4) #define OFFSET_PER_SECTOR (BLOCKS_PER_SECTOR * OFFSET_PER_BLOCK) // decrypt AF data and do the AF merge inline u32 mk[16] = { 0 }; if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 ks1[44]; u32 ks2[60]; aes128_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, essivhash, s_te0, s_te1, s_te2, s_te3, s_te4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_cbc_essiv128_mk_sha1 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_cbc_essiv128_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); ukey[4] = swap32_S (tmps->out32[4]); ukey[5] = swap32_S (tmps->out32[5]); ukey[6] = swap32_S (tmps->out32[6]); ukey[7] = swap32_S (tmps->out32[7]); u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 ks1[60]; u32 ks2[60]; aes256_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, essivhash, s_te0, s_te1, s_te2, s_te3, s_te4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_cbc_essiv256_mk_sha1 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_cbc_essiv256_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); u32 ks1[44]; aes128_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_cbc_plain128_mk_sha1 (luks_bufs->af_src_buf + offset, mk, ks1, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_cbc_plain128_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, ks1, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); ukey[4] = swap32_S (tmps->out32[4]); ukey[5] = swap32_S (tmps->out32[5]); ukey[6] = swap32_S (tmps->out32[6]); ukey[7] = swap32_S (tmps->out32[7]); u32 ks1[60]; aes256_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_cbc_plain256_mk_sha1 (luks_bufs->af_src_buf + offset, mk, ks1, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_cbc_plain256_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, ks1, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = swap32_S (tmps->out32[0]); ukey1[1] = swap32_S (tmps->out32[1]); ukey1[2] = swap32_S (tmps->out32[2]); ukey1[3] = swap32_S (tmps->out32[3]); u32 ukey2[4]; ukey2[0] = swap32_S (tmps->out32[4]); ukey2[1] = swap32_S (tmps->out32[5]); ukey2[2] = swap32_S (tmps->out32[6]); ukey2[3] = swap32_S (tmps->out32[7]); u32 ks1[44]; u32 ks2[44]; aes128_set_decrypt_key (ks1, ukey1, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes128_set_encrypt_key (ks2, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_xts_plain256_mk_sha1 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_xts_plain256_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = swap32_S (tmps->out32[ 0]); ukey1[1] = swap32_S (tmps->out32[ 1]); ukey1[2] = swap32_S (tmps->out32[ 2]); ukey1[3] = swap32_S (tmps->out32[ 3]); ukey1[4] = swap32_S (tmps->out32[ 4]); ukey1[5] = swap32_S (tmps->out32[ 5]); ukey1[6] = swap32_S (tmps->out32[ 6]); ukey1[7] = swap32_S (tmps->out32[ 7]); u32 ukey2[8]; ukey2[0] = swap32_S (tmps->out32[ 8]); ukey2[1] = swap32_S (tmps->out32[ 9]); ukey2[2] = swap32_S (tmps->out32[10]); ukey2[3] = swap32_S (tmps->out32[11]); ukey2[4] = swap32_S (tmps->out32[12]); ukey2[5] = swap32_S (tmps->out32[13]); ukey2[6] = swap32_S (tmps->out32[14]); ukey2[7] = swap32_S (tmps->out32[15]); u32 ks1[60]; u32 ks2[60]; aes256_set_decrypt_key (ks1, ukey1, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_xts_plain512_mk_sha1 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_xts_plain512_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } // decrypt payload data if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { #if defined (IS_APPLE) && defined (IS_GPU) volatile u32 ukey[4]; #else u32 ukey[4]; #endif ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 ks1[44]; u32 ks2[60]; aes128_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, essivhash, s_te0, s_te1, s_te2, s_te3, s_te4); luks_decrypt_sector_aes_cbc_essiv128 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_256) { #if defined (IS_APPLE) && defined (IS_GPU) volatile u32 ukey[8]; #else u32 ukey[8]; #endif ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 ks1[60]; u32 ks2[60]; aes256_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, essivhash, s_te0, s_te1, s_te2, s_te3, s_te4); luks_decrypt_sector_aes_cbc_essiv256 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { #if defined (IS_APPLE) && defined (IS_GPU) volatile u32 ukey[4]; #else u32 ukey[4]; #endif ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 ks1[44]; aes128_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); luks_decrypt_sector_aes_cbc_plain128 (luks_bufs->ct_buf, pt_buf, ks1, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_256) { #if defined (IS_APPLE) && defined (IS_GPU) volatile u32 ukey[8]; #else u32 ukey[8]; #endif ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 ks1[60]; aes256_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); luks_decrypt_sector_aes_cbc_plain256 (luks_bufs->ct_buf, pt_buf, ks1, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { #if defined (IS_APPLE) && defined (IS_GPU) volatile u32 ukey1[4]; #else u32 ukey1[4]; #endif ukey1[0] = mk[0]; ukey1[1] = mk[1]; ukey1[2] = mk[2]; ukey1[3] = mk[3]; #if defined (IS_APPLE) && defined (IS_GPU) volatile u32 ukey2[4]; #else u32 ukey2[4]; #endif ukey2[0] = mk[4]; ukey2[1] = mk[5]; ukey2[2] = mk[6]; ukey2[3] = mk[7]; u32 ks1[44]; u32 ks2[44]; aes128_set_decrypt_key (ks1, ukey1, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes128_set_encrypt_key (ks2, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4); luks_decrypt_sector_aes_xts_plain256 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_512) { #if defined (IS_APPLE) && defined (IS_GPU) volatile u32 ukey1[8]; #else u32 ukey1[8]; #endif ukey1[0] = mk[ 0]; ukey1[1] = mk[ 1]; ukey1[2] = mk[ 2]; ukey1[3] = mk[ 3]; ukey1[4] = mk[ 4]; ukey1[5] = mk[ 5]; ukey1[6] = mk[ 6]; ukey1[7] = mk[ 7]; #if defined (IS_APPLE) && defined (IS_GPU) volatile u32 ukey2[8]; #else u32 ukey2[8]; #endif ukey2[0] = mk[ 8]; ukey2[1] = mk[ 9]; ukey2[2] = mk[10]; ukey2[3] = mk[11]; ukey2[4] = mk[12]; ukey2[5] = mk[13]; ukey2[6] = mk[14]; ukey2[7] = mk[15]; u32 ks1[60]; u32 ks2[60]; aes256_set_decrypt_key (ks1, ukey1, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4); luks_decrypt_sector_aes_xts_plain512 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } } void luks_af_sha256_then_aes_decrypt (__global const luks_t *luks_bufs, __global luks_tmp_t *tmps, u32 *pt_buf, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { const u32 key_size = luks_bufs->key_size; const u32 cipher_mode = luks_bufs->cipher_mode; #define BITS_PER_AF (key_size * LUKS_STRIPES) #define BITS_PER_SECTOR (512 * 8) #define SECTOR_PER_AF (BITS_PER_AF / BITS_PER_SECTOR) #define BLOCKS_PER_SECTOR (512 / 16) #define OFFSET_PER_BLOCK (16 / 4) #define OFFSET_PER_SECTOR (BLOCKS_PER_SECTOR * OFFSET_PER_BLOCK) // decrypt AF data and do the AF merge inline u32 mk[16] = { 0 }; if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 ks1[44]; u32 ks2[60]; aes128_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, essivhash, s_te0, s_te1, s_te2, s_te3, s_te4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_cbc_essiv128_mk_sha256 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_cbc_essiv128_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); ukey[4] = swap32_S (tmps->out32[4]); ukey[5] = swap32_S (tmps->out32[5]); ukey[6] = swap32_S (tmps->out32[6]); ukey[7] = swap32_S (tmps->out32[7]); u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 ks1[60]; u32 ks2[60]; aes256_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, essivhash, s_te0, s_te1, s_te2, s_te3, s_te4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_cbc_essiv256_mk_sha256 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_cbc_essiv256_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); u32 ks1[44]; aes128_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_cbc_plain128_mk_sha256 (luks_bufs->af_src_buf + offset, mk, ks1, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_cbc_plain128_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, ks1, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); ukey[4] = swap32_S (tmps->out32[4]); ukey[5] = swap32_S (tmps->out32[5]); ukey[6] = swap32_S (tmps->out32[6]); ukey[7] = swap32_S (tmps->out32[7]); u32 ks1[60]; aes256_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_cbc_plain256_mk_sha256 (luks_bufs->af_src_buf + offset, mk, ks1, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_cbc_plain256_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, ks1, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = swap32_S (tmps->out32[0]); ukey1[1] = swap32_S (tmps->out32[1]); ukey1[2] = swap32_S (tmps->out32[2]); ukey1[3] = swap32_S (tmps->out32[3]); u32 ukey2[4]; ukey2[0] = swap32_S (tmps->out32[4]); ukey2[1] = swap32_S (tmps->out32[5]); ukey2[2] = swap32_S (tmps->out32[6]); ukey2[3] = swap32_S (tmps->out32[7]); u32 ks1[44]; u32 ks2[44]; aes128_set_decrypt_key (ks1, ukey1, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes128_set_encrypt_key (ks2, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_xts_plain256_mk_sha256 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_xts_plain256_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = swap32_S (tmps->out32[ 0]); ukey1[1] = swap32_S (tmps->out32[ 1]); ukey1[2] = swap32_S (tmps->out32[ 2]); ukey1[3] = swap32_S (tmps->out32[ 3]); ukey1[4] = swap32_S (tmps->out32[ 4]); ukey1[5] = swap32_S (tmps->out32[ 5]); ukey1[6] = swap32_S (tmps->out32[ 6]); ukey1[7] = swap32_S (tmps->out32[ 7]); u32 ukey2[8]; ukey2[0] = swap32_S (tmps->out32[ 8]); ukey2[1] = swap32_S (tmps->out32[ 9]); ukey2[2] = swap32_S (tmps->out32[10]); ukey2[3] = swap32_S (tmps->out32[11]); ukey2[4] = swap32_S (tmps->out32[12]); ukey2[5] = swap32_S (tmps->out32[13]); ukey2[6] = swap32_S (tmps->out32[14]); ukey2[7] = swap32_S (tmps->out32[15]); u32 ks1[60]; u32 ks2[60]; aes256_set_decrypt_key (ks1, ukey1, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_xts_plain512_mk_sha256 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_xts_plain512_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } // decrypt payload data if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 ks1[44]; u32 ks2[60]; aes128_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, essivhash, s_te0, s_te1, s_te2, s_te3, s_te4); luks_decrypt_sector_aes_cbc_essiv128 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 ks1[60]; u32 ks2[60]; aes256_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, essivhash, s_te0, s_te1, s_te2, s_te3, s_te4); luks_decrypt_sector_aes_cbc_essiv256 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 ks1[44]; aes128_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); luks_decrypt_sector_aes_cbc_plain128 (luks_bufs->ct_buf, pt_buf, ks1, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 ks1[60]; aes256_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); luks_decrypt_sector_aes_cbc_plain256 (luks_bufs->ct_buf, pt_buf, ks1, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = mk[0]; ukey1[1] = mk[1]; ukey1[2] = mk[2]; ukey1[3] = mk[3]; u32 ukey2[4]; ukey2[0] = mk[4]; ukey2[1] = mk[5]; ukey2[2] = mk[6]; ukey2[3] = mk[7]; u32 ks1[44]; u32 ks2[44]; aes128_set_decrypt_key (ks1, ukey1, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes128_set_encrypt_key (ks2, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4); luks_decrypt_sector_aes_xts_plain256 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = mk[ 0]; ukey1[1] = mk[ 1]; ukey1[2] = mk[ 2]; ukey1[3] = mk[ 3]; ukey1[4] = mk[ 4]; ukey1[5] = mk[ 5]; ukey1[6] = mk[ 6]; ukey1[7] = mk[ 7]; u32 ukey2[8]; ukey2[0] = mk[ 8]; ukey2[1] = mk[ 9]; ukey2[2] = mk[10]; ukey2[3] = mk[11]; ukey2[4] = mk[12]; ukey2[5] = mk[13]; ukey2[6] = mk[14]; ukey2[7] = mk[15]; u32 ks1[60]; u32 ks2[60]; aes256_set_decrypt_key (ks1, ukey1, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4); luks_decrypt_sector_aes_xts_plain512 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } } void luks_af_sha512_then_aes_decrypt (__global const luks_t *luks_bufs, __global luks_tmp_t *tmps, u32 *pt_buf, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { const u32 key_size = luks_bufs->key_size; const u32 cipher_mode = luks_bufs->cipher_mode; #define BITS_PER_AF (key_size * LUKS_STRIPES) #define BITS_PER_SECTOR (512 * 8) #define SECTOR_PER_AF (BITS_PER_AF / BITS_PER_SECTOR) #define BLOCKS_PER_SECTOR (512 / 16) #define OFFSET_PER_BLOCK (16 / 4) #define OFFSET_PER_SECTOR (BLOCKS_PER_SECTOR * OFFSET_PER_BLOCK) // move data from out64 to out32 tmps->out32[ 0] = l32_from_64_S (tmps->out64[0]); tmps->out32[ 1] = h32_from_64_S (tmps->out64[0]); tmps->out32[ 2] = l32_from_64_S (tmps->out64[1]); tmps->out32[ 3] = h32_from_64_S (tmps->out64[1]); tmps->out32[ 4] = l32_from_64_S (tmps->out64[2]); tmps->out32[ 5] = h32_from_64_S (tmps->out64[2]); tmps->out32[ 6] = l32_from_64_S (tmps->out64[3]); tmps->out32[ 7] = h32_from_64_S (tmps->out64[3]); tmps->out32[ 8] = l32_from_64_S (tmps->out64[4]); tmps->out32[ 9] = h32_from_64_S (tmps->out64[4]); tmps->out32[10] = l32_from_64_S (tmps->out64[5]); tmps->out32[11] = h32_from_64_S (tmps->out64[5]); tmps->out32[12] = l32_from_64_S (tmps->out64[6]); tmps->out32[13] = h32_from_64_S (tmps->out64[6]); tmps->out32[14] = l32_from_64_S (tmps->out64[7]); tmps->out32[15] = h32_from_64_S (tmps->out64[7]); // decrypt AF data and do the AF merge inline u32 mk[16] = { 0 }; if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[1]); ukey[1] = swap32_S (tmps->out32[0]); ukey[2] = swap32_S (tmps->out32[3]); ukey[3] = swap32_S (tmps->out32[2]); u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 ks1[44]; u32 ks2[60]; aes128_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, essivhash, s_te0, s_te1, s_te2, s_te3, s_te4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_cbc_essiv128_mk_sha512 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_cbc_essiv128_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[1]); ukey[1] = swap32_S (tmps->out32[0]); ukey[2] = swap32_S (tmps->out32[3]); ukey[3] = swap32_S (tmps->out32[2]); ukey[4] = swap32_S (tmps->out32[5]); ukey[5] = swap32_S (tmps->out32[4]); ukey[6] = swap32_S (tmps->out32[7]); ukey[7] = swap32_S (tmps->out32[6]); u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 ks1[60]; u32 ks2[60]; aes256_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, essivhash, s_te0, s_te1, s_te2, s_te3, s_te4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_cbc_essiv256_mk_sha512 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_cbc_essiv256_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[1]); ukey[1] = swap32_S (tmps->out32[0]); ukey[2] = swap32_S (tmps->out32[3]); ukey[3] = swap32_S (tmps->out32[2]); u32 ks1[44]; aes128_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_cbc_plain128_mk_sha512 (luks_bufs->af_src_buf + offset, mk, ks1, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_cbc_plain128_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, ks1, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[1]); ukey[1] = swap32_S (tmps->out32[0]); ukey[2] = swap32_S (tmps->out32[3]); ukey[3] = swap32_S (tmps->out32[2]); ukey[4] = swap32_S (tmps->out32[5]); ukey[5] = swap32_S (tmps->out32[4]); ukey[6] = swap32_S (tmps->out32[7]); ukey[7] = swap32_S (tmps->out32[6]); u32 ks1[60]; aes256_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_cbc_plain256_mk_sha512 (luks_bufs->af_src_buf + offset, mk, ks1, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_cbc_plain256_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, ks1, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = swap32_S (tmps->out32[1]); ukey1[1] = swap32_S (tmps->out32[0]); ukey1[2] = swap32_S (tmps->out32[3]); ukey1[3] = swap32_S (tmps->out32[2]); u32 ukey2[4]; ukey2[0] = swap32_S (tmps->out32[5]); ukey2[1] = swap32_S (tmps->out32[4]); ukey2[2] = swap32_S (tmps->out32[7]); ukey2[3] = swap32_S (tmps->out32[6]); u32 ks1[44]; u32 ks2[44]; aes128_set_decrypt_key (ks1, ukey1, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes128_set_encrypt_key (ks2, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_xts_plain256_mk_sha512 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_xts_plain256_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = swap32_S (tmps->out32[ 1]); ukey1[1] = swap32_S (tmps->out32[ 0]); ukey1[2] = swap32_S (tmps->out32[ 3]); ukey1[3] = swap32_S (tmps->out32[ 2]); ukey1[4] = swap32_S (tmps->out32[ 5]); ukey1[5] = swap32_S (tmps->out32[ 4]); ukey1[6] = swap32_S (tmps->out32[ 7]); ukey1[7] = swap32_S (tmps->out32[ 6]); u32 ukey2[8]; ukey2[0] = swap32_S (tmps->out32[ 9]); ukey2[1] = swap32_S (tmps->out32[ 8]); ukey2[2] = swap32_S (tmps->out32[11]); ukey2[3] = swap32_S (tmps->out32[10]); ukey2[4] = swap32_S (tmps->out32[13]); ukey2[5] = swap32_S (tmps->out32[12]); ukey2[6] = swap32_S (tmps->out32[15]); ukey2[7] = swap32_S (tmps->out32[14]); u32 ks1[60]; u32 ks2[60]; aes256_set_decrypt_key (ks1, ukey1, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_xts_plain512_mk_sha512 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_xts_plain512_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } // decrypt payload data if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 ks1[44]; u32 ks2[60]; aes128_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, essivhash, s_te0, s_te1, s_te2, s_te3, s_te4); luks_decrypt_sector_aes_cbc_essiv128 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 ks1[60]; u32 ks2[60]; aes256_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, essivhash, s_te0, s_te1, s_te2, s_te3, s_te4); luks_decrypt_sector_aes_cbc_essiv256 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 ks1[44]; aes128_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); luks_decrypt_sector_aes_cbc_plain128 (luks_bufs->ct_buf, pt_buf, ks1, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 ks1[60]; aes256_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); luks_decrypt_sector_aes_cbc_plain256 (luks_bufs->ct_buf, pt_buf, ks1, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = mk[0]; ukey1[1] = mk[1]; ukey1[2] = mk[2]; ukey1[3] = mk[3]; u32 ukey2[4]; ukey2[0] = mk[4]; ukey2[1] = mk[5]; ukey2[2] = mk[6]; ukey2[3] = mk[7]; u32 ks1[44]; u32 ks2[44]; aes128_set_decrypt_key (ks1, ukey1, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes128_set_encrypt_key (ks2, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4); luks_decrypt_sector_aes_xts_plain256 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = mk[ 0]; ukey1[1] = mk[ 1]; ukey1[2] = mk[ 2]; ukey1[3] = mk[ 3]; ukey1[4] = mk[ 4]; ukey1[5] = mk[ 5]; ukey1[6] = mk[ 6]; ukey1[7] = mk[ 7]; u32 ukey2[8]; ukey2[0] = mk[ 8]; ukey2[1] = mk[ 9]; ukey2[2] = mk[10]; ukey2[3] = mk[11]; ukey2[4] = mk[12]; ukey2[5] = mk[13]; ukey2[6] = mk[14]; ukey2[7] = mk[15]; u32 ks1[60]; u32 ks2[60]; aes256_set_decrypt_key (ks1, ukey1, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4); luks_decrypt_sector_aes_xts_plain512 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } } void luks_af_ripemd160_then_aes_decrypt (__global const luks_t *luks_bufs, __global luks_tmp_t *tmps, u32 *pt_buf, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { const u32 key_size = luks_bufs->key_size; const u32 cipher_mode = luks_bufs->cipher_mode; #define BITS_PER_AF (key_size * LUKS_STRIPES) #define BITS_PER_SECTOR (512 * 8) #define SECTOR_PER_AF (BITS_PER_AF / BITS_PER_SECTOR) #define BLOCKS_PER_SECTOR (512 / 16) #define OFFSET_PER_BLOCK (16 / 4) #define OFFSET_PER_SECTOR (BLOCKS_PER_SECTOR * OFFSET_PER_BLOCK) // decrypt AF data and do the AF merge inline u32 mk[16] = { 0 }; if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = tmps->out32[0]; ukey[1] = tmps->out32[1]; ukey[2] = tmps->out32[2]; ukey[3] = tmps->out32[3]; u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 ks1[44]; u32 ks2[60]; aes128_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, essivhash, s_te0, s_te1, s_te2, s_te3, s_te4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_cbc_essiv128_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_cbc_essiv128_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = tmps->out32[0]; ukey[1] = tmps->out32[1]; ukey[2] = tmps->out32[2]; ukey[3] = tmps->out32[3]; ukey[4] = tmps->out32[4]; ukey[5] = tmps->out32[5]; ukey[6] = tmps->out32[6]; ukey[7] = tmps->out32[7]; u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 ks1[60]; u32 ks2[60]; aes256_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, essivhash, s_te0, s_te1, s_te2, s_te3, s_te4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_cbc_essiv256_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_cbc_essiv256_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = tmps->out32[0]; ukey[1] = tmps->out32[1]; ukey[2] = tmps->out32[2]; ukey[3] = tmps->out32[3]; u32 ks1[44]; aes128_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_cbc_plain128_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, ks1, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_cbc_plain128_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, ks1, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = tmps->out32[0]; ukey[1] = tmps->out32[1]; ukey[2] = tmps->out32[2]; ukey[3] = tmps->out32[3]; ukey[4] = tmps->out32[4]; ukey[5] = tmps->out32[5]; ukey[6] = tmps->out32[6]; ukey[7] = tmps->out32[7]; u32 ks1[60]; aes256_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_cbc_plain256_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, ks1, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_cbc_plain256_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, ks1, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = tmps->out32[0]; ukey1[1] = tmps->out32[1]; ukey1[2] = tmps->out32[2]; ukey1[3] = tmps->out32[3]; u32 ukey2[4]; ukey2[0] = tmps->out32[4]; ukey2[1] = tmps->out32[5]; ukey2[2] = tmps->out32[6]; ukey2[3] = tmps->out32[7]; u32 ks1[44]; u32 ks2[44]; aes128_set_decrypt_key (ks1, ukey1, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes128_set_encrypt_key (ks2, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_xts_plain256_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_xts_plain256_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = tmps->out32[ 0]; ukey1[1] = tmps->out32[ 1]; ukey1[2] = tmps->out32[ 2]; ukey1[3] = tmps->out32[ 3]; ukey1[4] = tmps->out32[ 4]; ukey1[5] = tmps->out32[ 5]; ukey1[6] = tmps->out32[ 6]; ukey1[7] = tmps->out32[ 7]; u32 ukey2[8]; ukey2[0] = tmps->out32[ 8]; ukey2[1] = tmps->out32[ 9]; ukey2[2] = tmps->out32[10]; ukey2[3] = tmps->out32[11]; ukey2[4] = tmps->out32[12]; ukey2[5] = tmps->out32[13]; ukey2[6] = tmps->out32[14]; ukey2[7] = tmps->out32[15]; u32 ks1[60]; u32 ks2[60]; aes256_set_decrypt_key (ks1, ukey1, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_aes_xts_plain512_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } luks_decrypt_sector_aes_xts_plain512_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } // decrypt payload data if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 ks1[44]; u32 ks2[60]; aes128_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, essivhash, s_te0, s_te1, s_te2, s_te3, s_te4); luks_decrypt_sector_aes_cbc_essiv128 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 ks1[60]; u32 ks2[60]; aes256_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, essivhash, s_te0, s_te1, s_te2, s_te3, s_te4); luks_decrypt_sector_aes_cbc_essiv256 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 ks1[44]; aes128_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); luks_decrypt_sector_aes_cbc_plain128 (luks_bufs->ct_buf, pt_buf, ks1, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 ks1[60]; aes256_set_decrypt_key (ks1, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); luks_decrypt_sector_aes_cbc_plain256 (luks_bufs->ct_buf, pt_buf, ks1, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = mk[0]; ukey1[1] = mk[1]; ukey1[2] = mk[2]; ukey1[3] = mk[3]; u32 ukey2[4]; ukey2[0] = mk[4]; ukey2[1] = mk[5]; ukey2[2] = mk[6]; ukey2[3] = mk[7]; u32 ks1[44]; u32 ks2[44]; aes128_set_decrypt_key (ks1, ukey1, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes128_set_encrypt_key (ks2, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4); luks_decrypt_sector_aes_xts_plain256 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = mk[ 0]; ukey1[1] = mk[ 1]; ukey1[2] = mk[ 2]; ukey1[3] = mk[ 3]; ukey1[4] = mk[ 4]; ukey1[5] = mk[ 5]; ukey1[6] = mk[ 6]; ukey1[7] = mk[ 7]; u32 ukey2[8]; ukey2[0] = mk[ 8]; ukey2[1] = mk[ 9]; ukey2[2] = mk[10]; ukey2[3] = mk[11]; ukey2[4] = mk[12]; ukey2[5] = mk[13]; ukey2[6] = mk[14]; ukey2[7] = mk[15]; u32 ks1[60]; u32 ks2[60]; aes256_set_decrypt_key (ks1, ukey1, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_set_encrypt_key (ks2, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4); luks_decrypt_sector_aes_xts_plain512 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); } } } hashcat-4.0.1/OpenCL/inc_luks_af.cl000066400000000000000000001366461320027462700170670ustar00rootroot00000000000000 // basically normal XXX_transform() but with a different name to avoid collisions with function nameing __constant u32a AF_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 u64a AF_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, }; void AF_sha1_transform_S (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[5]) { u32 A = digest[0]; u32 B = digest[1]; u32 C = digest[2]; u32 D = digest[3]; u32 E = digest[4]; u32 w0_t = w0[0]; u32 w1_t = w0[1]; u32 w2_t = w0[2]; u32 w3_t = w0[3]; u32 w4_t = w1[0]; u32 w5_t = w1[1]; u32 w6_t = w1[2]; u32 w7_t = w1[3]; u32 w8_t = w2[0]; u32 w9_t = w2[1]; u32 wa_t = w2[2]; u32 wb_t = w2[3]; u32 wc_t = w3[0]; u32 wd_t = w3[1]; u32 we_t = w3[2]; u32 wf_t = w3[3]; #undef K #define K SHA1C00 SHA1_STEP_S (SHA1_F0o, A, B, C, D, E, w0_t); SHA1_STEP_S (SHA1_F0o, E, A, B, C, D, w1_t); SHA1_STEP_S (SHA1_F0o, D, E, A, B, C, w2_t); SHA1_STEP_S (SHA1_F0o, C, D, E, A, B, w3_t); SHA1_STEP_S (SHA1_F0o, B, C, D, E, A, w4_t); SHA1_STEP_S (SHA1_F0o, A, B, C, D, E, w5_t); SHA1_STEP_S (SHA1_F0o, E, A, B, C, D, w6_t); SHA1_STEP_S (SHA1_F0o, D, E, A, B, C, w7_t); SHA1_STEP_S (SHA1_F0o, C, D, E, A, B, w8_t); SHA1_STEP_S (SHA1_F0o, B, C, D, E, A, w9_t); SHA1_STEP_S (SHA1_F0o, A, B, C, D, E, wa_t); SHA1_STEP_S (SHA1_F0o, E, A, B, C, D, wb_t); SHA1_STEP_S (SHA1_F0o, D, E, A, B, C, wc_t); SHA1_STEP_S (SHA1_F0o, C, D, E, A, B, wd_t); SHA1_STEP_S (SHA1_F0o, B, C, D, E, A, we_t); SHA1_STEP_S (SHA1_F0o, A, B, C, D, E, wf_t); w0_t = rotl32_S ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP_S (SHA1_F0o, E, A, B, C, D, w0_t); w1_t = rotl32_S ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP_S (SHA1_F0o, D, E, A, B, C, w1_t); w2_t = rotl32_S ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP_S (SHA1_F0o, C, D, E, A, B, w2_t); w3_t = rotl32_S ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP_S (SHA1_F0o, B, C, D, E, A, w3_t); #undef K #define K SHA1C01 w4_t = rotl32_S ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP_S (SHA1_F1, A, B, C, D, E, w4_t); w5_t = rotl32_S ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP_S (SHA1_F1, E, A, B, C, D, w5_t); w6_t = rotl32_S ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP_S (SHA1_F1, D, E, A, B, C, w6_t); w7_t = rotl32_S ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP_S (SHA1_F1, C, D, E, A, B, w7_t); w8_t = rotl32_S ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP_S (SHA1_F1, B, C, D, E, A, w8_t); w9_t = rotl32_S ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP_S (SHA1_F1, A, B, C, D, E, w9_t); wa_t = rotl32_S ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP_S (SHA1_F1, E, A, B, C, D, wa_t); wb_t = rotl32_S ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP_S (SHA1_F1, D, E, A, B, C, wb_t); wc_t = rotl32_S ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP_S (SHA1_F1, C, D, E, A, B, wc_t); wd_t = rotl32_S ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP_S (SHA1_F1, B, C, D, E, A, wd_t); we_t = rotl32_S ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP_S (SHA1_F1, A, B, C, D, E, we_t); wf_t = rotl32_S ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP_S (SHA1_F1, E, A, B, C, D, wf_t); w0_t = rotl32_S ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP_S (SHA1_F1, D, E, A, B, C, w0_t); w1_t = rotl32_S ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP_S (SHA1_F1, C, D, E, A, B, w1_t); w2_t = rotl32_S ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP_S (SHA1_F1, B, C, D, E, A, w2_t); w3_t = rotl32_S ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP_S (SHA1_F1, A, B, C, D, E, w3_t); w4_t = rotl32_S ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP_S (SHA1_F1, E, A, B, C, D, w4_t); w5_t = rotl32_S ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP_S (SHA1_F1, D, E, A, B, C, w5_t); w6_t = rotl32_S ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP_S (SHA1_F1, C, D, E, A, B, w6_t); w7_t = rotl32_S ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP_S (SHA1_F1, B, C, D, E, A, w7_t); #undef K #define K SHA1C02 w8_t = rotl32_S ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP_S (SHA1_F2o, A, B, C, D, E, w8_t); w9_t = rotl32_S ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP_S (SHA1_F2o, E, A, B, C, D, w9_t); wa_t = rotl32_S ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP_S (SHA1_F2o, D, E, A, B, C, wa_t); wb_t = rotl32_S ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP_S (SHA1_F2o, C, D, E, A, B, wb_t); wc_t = rotl32_S ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP_S (SHA1_F2o, B, C, D, E, A, wc_t); wd_t = rotl32_S ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP_S (SHA1_F2o, A, B, C, D, E, wd_t); we_t = rotl32_S ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP_S (SHA1_F2o, E, A, B, C, D, we_t); wf_t = rotl32_S ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP_S (SHA1_F2o, D, E, A, B, C, wf_t); w0_t = rotl32_S ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP_S (SHA1_F2o, C, D, E, A, B, w0_t); w1_t = rotl32_S ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP_S (SHA1_F2o, B, C, D, E, A, w1_t); w2_t = rotl32_S ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP_S (SHA1_F2o, A, B, C, D, E, w2_t); w3_t = rotl32_S ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP_S (SHA1_F2o, E, A, B, C, D, w3_t); w4_t = rotl32_S ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP_S (SHA1_F2o, D, E, A, B, C, w4_t); w5_t = rotl32_S ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP_S (SHA1_F2o, C, D, E, A, B, w5_t); w6_t = rotl32_S ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP_S (SHA1_F2o, B, C, D, E, A, w6_t); w7_t = rotl32_S ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP_S (SHA1_F2o, A, B, C, D, E, w7_t); w8_t = rotl32_S ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP_S (SHA1_F2o, E, A, B, C, D, w8_t); w9_t = rotl32_S ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP_S (SHA1_F2o, D, E, A, B, C, w9_t); wa_t = rotl32_S ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP_S (SHA1_F2o, C, D, E, A, B, wa_t); wb_t = rotl32_S ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP_S (SHA1_F2o, B, C, D, E, A, wb_t); #undef K #define K SHA1C03 wc_t = rotl32_S ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP_S (SHA1_F1, A, B, C, D, E, wc_t); wd_t = rotl32_S ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP_S (SHA1_F1, E, A, B, C, D, wd_t); we_t = rotl32_S ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP_S (SHA1_F1, D, E, A, B, C, we_t); wf_t = rotl32_S ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP_S (SHA1_F1, C, D, E, A, B, wf_t); w0_t = rotl32_S ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP_S (SHA1_F1, B, C, D, E, A, w0_t); w1_t = rotl32_S ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP_S (SHA1_F1, A, B, C, D, E, w1_t); w2_t = rotl32_S ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP_S (SHA1_F1, E, A, B, C, D, w2_t); w3_t = rotl32_S ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP_S (SHA1_F1, D, E, A, B, C, w3_t); w4_t = rotl32_S ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP_S (SHA1_F1, C, D, E, A, B, w4_t); w5_t = rotl32_S ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP_S (SHA1_F1, B, C, D, E, A, w5_t); w6_t = rotl32_S ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP_S (SHA1_F1, A, B, C, D, E, w6_t); w7_t = rotl32_S ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP_S (SHA1_F1, E, A, B, C, D, w7_t); w8_t = rotl32_S ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP_S (SHA1_F1, D, E, A, B, C, w8_t); w9_t = rotl32_S ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP_S (SHA1_F1, C, D, E, A, B, w9_t); wa_t = rotl32_S ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP_S (SHA1_F1, B, C, D, E, A, wa_t); wb_t = rotl32_S ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP_S (SHA1_F1, A, B, C, D, E, wb_t); wc_t = rotl32_S ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP_S (SHA1_F1, E, A, B, C, D, wc_t); wd_t = rotl32_S ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP_S (SHA1_F1, D, E, A, B, C, wd_t); we_t = rotl32_S ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP_S (SHA1_F1, C, D, E, A, B, we_t); wf_t = rotl32_S ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP_S (SHA1_F1, B, C, D, E, A, wf_t); digest[0] += A; digest[1] += B; digest[2] += C; digest[3] += D; digest[4] += E; } void AF_sha256_transform_S (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[8]) { u32 a = digest[0]; u32 b = digest[1]; u32 c = digest[2]; u32 d = digest[3]; u32 e = digest[4]; u32 f = digest[5]; u32 g = digest[6]; u32 h = digest[7]; u32 w0_t = w0[0]; u32 w1_t = w0[1]; u32 w2_t = w0[2]; u32 w3_t = w0[3]; u32 w4_t = w1[0]; u32 w5_t = w1[1]; u32 w6_t = w1[2]; u32 w7_t = w1[3]; u32 w8_t = w2[0]; u32 w9_t = w2[1]; u32 wa_t = w2[2]; u32 wb_t = w2[3]; u32 wc_t = w3[0]; u32 wd_t = w3[1]; u32 we_t = w3[2]; u32 wf_t = w3[3]; #define SHA256_ROUND_EXPAND_S() \ { \ w0_t = SHA256_EXPAND_S (we_t, w9_t, w1_t, w0_t); \ w1_t = SHA256_EXPAND_S (wf_t, wa_t, w2_t, w1_t); \ w2_t = SHA256_EXPAND_S (w0_t, wb_t, w3_t, w2_t); \ w3_t = SHA256_EXPAND_S (w1_t, wc_t, w4_t, w3_t); \ w4_t = SHA256_EXPAND_S (w2_t, wd_t, w5_t, w4_t); \ w5_t = SHA256_EXPAND_S (w3_t, we_t, w6_t, w5_t); \ w6_t = SHA256_EXPAND_S (w4_t, wf_t, w7_t, w6_t); \ w7_t = SHA256_EXPAND_S (w5_t, w0_t, w8_t, w7_t); \ w8_t = SHA256_EXPAND_S (w6_t, w1_t, w9_t, w8_t); \ w9_t = SHA256_EXPAND_S (w7_t, w2_t, wa_t, w9_t); \ wa_t = SHA256_EXPAND_S (w8_t, w3_t, wb_t, wa_t); \ wb_t = SHA256_EXPAND_S (w9_t, w4_t, wc_t, wb_t); \ wc_t = SHA256_EXPAND_S (wa_t, w5_t, wd_t, wc_t); \ wd_t = SHA256_EXPAND_S (wb_t, w6_t, we_t, wd_t); \ we_t = SHA256_EXPAND_S (wc_t, w7_t, wf_t, we_t); \ wf_t = SHA256_EXPAND_S (wd_t, w8_t, w0_t, wf_t); \ } #define SHA256_ROUND_STEP_S(i) \ { \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, AF_k_sha256[i + 0]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, AF_k_sha256[i + 1]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, AF_k_sha256[i + 2]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, AF_k_sha256[i + 3]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, AF_k_sha256[i + 4]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, AF_k_sha256[i + 5]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, AF_k_sha256[i + 6]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, AF_k_sha256[i + 7]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, AF_k_sha256[i + 8]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, AF_k_sha256[i + 9]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, AF_k_sha256[i + 10]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, AF_k_sha256[i + 11]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, AF_k_sha256[i + 12]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, AF_k_sha256[i + 13]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, AF_k_sha256[i + 14]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, AF_k_sha256[i + 15]); \ } SHA256_ROUND_STEP_S (0); #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i += 16) { SHA256_ROUND_EXPAND_S (); SHA256_ROUND_STEP_S (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; } void AF_sha512_transform_S (const u64 w0[4], const u64 w1[4], const u64 w2[4], const u64 w3[4], u64 digest[8]) { u64 a = digest[0]; u64 b = digest[1]; u64 c = digest[2]; u64 d = digest[3]; u64 e = digest[4]; u64 f = digest[5]; u64 g = digest[6]; u64 h = digest[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 SHA512_ROUND_EXPAND_S() \ { \ w0_t = SHA512_EXPAND_S (we_t, w9_t, w1_t, w0_t); \ w1_t = SHA512_EXPAND_S (wf_t, wa_t, w2_t, w1_t); \ w2_t = SHA512_EXPAND_S (w0_t, wb_t, w3_t, w2_t); \ w3_t = SHA512_EXPAND_S (w1_t, wc_t, w4_t, w3_t); \ w4_t = SHA512_EXPAND_S (w2_t, wd_t, w5_t, w4_t); \ w5_t = SHA512_EXPAND_S (w3_t, we_t, w6_t, w5_t); \ w6_t = SHA512_EXPAND_S (w4_t, wf_t, w7_t, w6_t); \ w7_t = SHA512_EXPAND_S (w5_t, w0_t, w8_t, w7_t); \ w8_t = SHA512_EXPAND_S (w6_t, w1_t, w9_t, w8_t); \ w9_t = SHA512_EXPAND_S (w7_t, w2_t, wa_t, w9_t); \ wa_t = SHA512_EXPAND_S (w8_t, w3_t, wb_t, wa_t); \ wb_t = SHA512_EXPAND_S (w9_t, w4_t, wc_t, wb_t); \ wc_t = SHA512_EXPAND_S (wa_t, w5_t, wd_t, wc_t); \ wd_t = SHA512_EXPAND_S (wb_t, w6_t, we_t, wd_t); \ we_t = SHA512_EXPAND_S (wc_t, w7_t, wf_t, we_t); \ wf_t = SHA512_EXPAND_S (wd_t, w8_t, w0_t, wf_t); \ } #define SHA512_ROUND_STEP_S(i) \ { \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, AF_k_sha512[i + 0]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, AF_k_sha512[i + 1]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, AF_k_sha512[i + 2]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, AF_k_sha512[i + 3]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, AF_k_sha512[i + 4]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, AF_k_sha512[i + 5]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, AF_k_sha512[i + 6]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, AF_k_sha512[i + 7]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, AF_k_sha512[i + 8]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, AF_k_sha512[i + 9]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, AF_k_sha512[i + 10]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, AF_k_sha512[i + 11]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, AF_k_sha512[i + 12]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, AF_k_sha512[i + 13]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, AF_k_sha512[i + 14]); \ SHA512_STEP_S (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, AF_k_sha512[i + 15]); \ } SHA512_ROUND_STEP_S (0); #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 80; i += 16) { SHA512_ROUND_EXPAND_S (); SHA512_ROUND_STEP_S (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; } void AF_ripemd160_transform_S (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[5]) { u32 w0_t = w0[0]; u32 w1_t = w0[1]; u32 w2_t = w0[2]; u32 w3_t = w0[3]; u32 w4_t = w1[0]; u32 w5_t = w1[1]; u32 w6_t = w1[2]; u32 w7_t = w1[3]; u32 w8_t = w2[0]; u32 w9_t = w2[1]; u32 wa_t = w2[2]; u32 wb_t = w2[3]; u32 wc_t = w3[0]; u32 wd_t = w3[1]; u32 we_t = w3[2]; u32 wf_t = w3[3]; u32 a1 = digest[0]; u32 b1 = digest[1]; u32 c1 = digest[2]; u32 d1 = digest[3]; u32 e1 = digest[4]; RIPEMD160_STEP_S (RIPEMD160_F , a1, b1, c1, d1, e1, w0_t, RIPEMD160C00, RIPEMD160S00); RIPEMD160_STEP_S (RIPEMD160_F , e1, a1, b1, c1, d1, w1_t, RIPEMD160C00, RIPEMD160S01); RIPEMD160_STEP_S (RIPEMD160_F , d1, e1, a1, b1, c1, w2_t, RIPEMD160C00, RIPEMD160S02); RIPEMD160_STEP_S (RIPEMD160_F , c1, d1, e1, a1, b1, w3_t, RIPEMD160C00, RIPEMD160S03); RIPEMD160_STEP_S (RIPEMD160_F , b1, c1, d1, e1, a1, w4_t, RIPEMD160C00, RIPEMD160S04); RIPEMD160_STEP_S (RIPEMD160_F , a1, b1, c1, d1, e1, w5_t, RIPEMD160C00, RIPEMD160S05); RIPEMD160_STEP_S (RIPEMD160_F , e1, a1, b1, c1, d1, w6_t, RIPEMD160C00, RIPEMD160S06); RIPEMD160_STEP_S (RIPEMD160_F , d1, e1, a1, b1, c1, w7_t, RIPEMD160C00, RIPEMD160S07); RIPEMD160_STEP_S (RIPEMD160_F , c1, d1, e1, a1, b1, w8_t, RIPEMD160C00, RIPEMD160S08); RIPEMD160_STEP_S (RIPEMD160_F , b1, c1, d1, e1, a1, w9_t, RIPEMD160C00, RIPEMD160S09); RIPEMD160_STEP_S (RIPEMD160_F , a1, b1, c1, d1, e1, wa_t, RIPEMD160C00, RIPEMD160S0A); RIPEMD160_STEP_S (RIPEMD160_F , e1, a1, b1, c1, d1, wb_t, RIPEMD160C00, RIPEMD160S0B); RIPEMD160_STEP_S (RIPEMD160_F , d1, e1, a1, b1, c1, wc_t, RIPEMD160C00, RIPEMD160S0C); RIPEMD160_STEP_S (RIPEMD160_F , c1, d1, e1, a1, b1, wd_t, RIPEMD160C00, RIPEMD160S0D); RIPEMD160_STEP_S (RIPEMD160_F , b1, c1, d1, e1, a1, we_t, RIPEMD160C00, RIPEMD160S0E); RIPEMD160_STEP_S (RIPEMD160_F , a1, b1, c1, d1, e1, wf_t, RIPEMD160C00, RIPEMD160S0F); RIPEMD160_STEP_S (RIPEMD160_Go, e1, a1, b1, c1, d1, w7_t, RIPEMD160C10, RIPEMD160S10); RIPEMD160_STEP_S (RIPEMD160_Go, d1, e1, a1, b1, c1, w4_t, RIPEMD160C10, RIPEMD160S11); RIPEMD160_STEP_S (RIPEMD160_Go, c1, d1, e1, a1, b1, wd_t, RIPEMD160C10, RIPEMD160S12); RIPEMD160_STEP_S (RIPEMD160_Go, b1, c1, d1, e1, a1, w1_t, RIPEMD160C10, RIPEMD160S13); RIPEMD160_STEP_S (RIPEMD160_Go, a1, b1, c1, d1, e1, wa_t, RIPEMD160C10, RIPEMD160S14); RIPEMD160_STEP_S (RIPEMD160_Go, e1, a1, b1, c1, d1, w6_t, RIPEMD160C10, RIPEMD160S15); RIPEMD160_STEP_S (RIPEMD160_Go, d1, e1, a1, b1, c1, wf_t, RIPEMD160C10, RIPEMD160S16); RIPEMD160_STEP_S (RIPEMD160_Go, c1, d1, e1, a1, b1, w3_t, RIPEMD160C10, RIPEMD160S17); RIPEMD160_STEP_S (RIPEMD160_Go, b1, c1, d1, e1, a1, wc_t, RIPEMD160C10, RIPEMD160S18); RIPEMD160_STEP_S (RIPEMD160_Go, a1, b1, c1, d1, e1, w0_t, RIPEMD160C10, RIPEMD160S19); RIPEMD160_STEP_S (RIPEMD160_Go, e1, a1, b1, c1, d1, w9_t, RIPEMD160C10, RIPEMD160S1A); RIPEMD160_STEP_S (RIPEMD160_Go, d1, e1, a1, b1, c1, w5_t, RIPEMD160C10, RIPEMD160S1B); RIPEMD160_STEP_S (RIPEMD160_Go, c1, d1, e1, a1, b1, w2_t, RIPEMD160C10, RIPEMD160S1C); RIPEMD160_STEP_S (RIPEMD160_Go, b1, c1, d1, e1, a1, we_t, RIPEMD160C10, RIPEMD160S1D); RIPEMD160_STEP_S (RIPEMD160_Go, a1, b1, c1, d1, e1, wb_t, RIPEMD160C10, RIPEMD160S1E); RIPEMD160_STEP_S (RIPEMD160_Go, e1, a1, b1, c1, d1, w8_t, RIPEMD160C10, RIPEMD160S1F); RIPEMD160_STEP_S (RIPEMD160_H , d1, e1, a1, b1, c1, w3_t, RIPEMD160C20, RIPEMD160S20); RIPEMD160_STEP_S (RIPEMD160_H , c1, d1, e1, a1, b1, wa_t, RIPEMD160C20, RIPEMD160S21); RIPEMD160_STEP_S (RIPEMD160_H , b1, c1, d1, e1, a1, we_t, RIPEMD160C20, RIPEMD160S22); RIPEMD160_STEP_S (RIPEMD160_H , a1, b1, c1, d1, e1, w4_t, RIPEMD160C20, RIPEMD160S23); RIPEMD160_STEP_S (RIPEMD160_H , e1, a1, b1, c1, d1, w9_t, RIPEMD160C20, RIPEMD160S24); RIPEMD160_STEP_S (RIPEMD160_H , d1, e1, a1, b1, c1, wf_t, RIPEMD160C20, RIPEMD160S25); RIPEMD160_STEP_S (RIPEMD160_H , c1, d1, e1, a1, b1, w8_t, RIPEMD160C20, RIPEMD160S26); RIPEMD160_STEP_S (RIPEMD160_H , b1, c1, d1, e1, a1, w1_t, RIPEMD160C20, RIPEMD160S27); RIPEMD160_STEP_S (RIPEMD160_H , a1, b1, c1, d1, e1, w2_t, RIPEMD160C20, RIPEMD160S28); RIPEMD160_STEP_S (RIPEMD160_H , e1, a1, b1, c1, d1, w7_t, RIPEMD160C20, RIPEMD160S29); RIPEMD160_STEP_S (RIPEMD160_H , d1, e1, a1, b1, c1, w0_t, RIPEMD160C20, RIPEMD160S2A); RIPEMD160_STEP_S (RIPEMD160_H , c1, d1, e1, a1, b1, w6_t, RIPEMD160C20, RIPEMD160S2B); RIPEMD160_STEP_S (RIPEMD160_H , b1, c1, d1, e1, a1, wd_t, RIPEMD160C20, RIPEMD160S2C); RIPEMD160_STEP_S (RIPEMD160_H , a1, b1, c1, d1, e1, wb_t, RIPEMD160C20, RIPEMD160S2D); RIPEMD160_STEP_S (RIPEMD160_H , e1, a1, b1, c1, d1, w5_t, RIPEMD160C20, RIPEMD160S2E); RIPEMD160_STEP_S (RIPEMD160_H , d1, e1, a1, b1, c1, wc_t, RIPEMD160C20, RIPEMD160S2F); RIPEMD160_STEP_S (RIPEMD160_Io, c1, d1, e1, a1, b1, w1_t, RIPEMD160C30, RIPEMD160S30); RIPEMD160_STEP_S (RIPEMD160_Io, b1, c1, d1, e1, a1, w9_t, RIPEMD160C30, RIPEMD160S31); RIPEMD160_STEP_S (RIPEMD160_Io, a1, b1, c1, d1, e1, wb_t, RIPEMD160C30, RIPEMD160S32); RIPEMD160_STEP_S (RIPEMD160_Io, e1, a1, b1, c1, d1, wa_t, RIPEMD160C30, RIPEMD160S33); RIPEMD160_STEP_S (RIPEMD160_Io, d1, e1, a1, b1, c1, w0_t, RIPEMD160C30, RIPEMD160S34); RIPEMD160_STEP_S (RIPEMD160_Io, c1, d1, e1, a1, b1, w8_t, RIPEMD160C30, RIPEMD160S35); RIPEMD160_STEP_S (RIPEMD160_Io, b1, c1, d1, e1, a1, wc_t, RIPEMD160C30, RIPEMD160S36); RIPEMD160_STEP_S (RIPEMD160_Io, a1, b1, c1, d1, e1, w4_t, RIPEMD160C30, RIPEMD160S37); RIPEMD160_STEP_S (RIPEMD160_Io, e1, a1, b1, c1, d1, wd_t, RIPEMD160C30, RIPEMD160S38); RIPEMD160_STEP_S (RIPEMD160_Io, d1, e1, a1, b1, c1, w3_t, RIPEMD160C30, RIPEMD160S39); RIPEMD160_STEP_S (RIPEMD160_Io, c1, d1, e1, a1, b1, w7_t, RIPEMD160C30, RIPEMD160S3A); RIPEMD160_STEP_S (RIPEMD160_Io, b1, c1, d1, e1, a1, wf_t, RIPEMD160C30, RIPEMD160S3B); RIPEMD160_STEP_S (RIPEMD160_Io, a1, b1, c1, d1, e1, we_t, RIPEMD160C30, RIPEMD160S3C); RIPEMD160_STEP_S (RIPEMD160_Io, e1, a1, b1, c1, d1, w5_t, RIPEMD160C30, RIPEMD160S3D); RIPEMD160_STEP_S (RIPEMD160_Io, d1, e1, a1, b1, c1, w6_t, RIPEMD160C30, RIPEMD160S3E); RIPEMD160_STEP_S (RIPEMD160_Io, c1, d1, e1, a1, b1, w2_t, RIPEMD160C30, RIPEMD160S3F); RIPEMD160_STEP_S (RIPEMD160_J , b1, c1, d1, e1, a1, w4_t, RIPEMD160C40, RIPEMD160S40); RIPEMD160_STEP_S (RIPEMD160_J , a1, b1, c1, d1, e1, w0_t, RIPEMD160C40, RIPEMD160S41); RIPEMD160_STEP_S (RIPEMD160_J , e1, a1, b1, c1, d1, w5_t, RIPEMD160C40, RIPEMD160S42); RIPEMD160_STEP_S (RIPEMD160_J , d1, e1, a1, b1, c1, w9_t, RIPEMD160C40, RIPEMD160S43); RIPEMD160_STEP_S (RIPEMD160_J , c1, d1, e1, a1, b1, w7_t, RIPEMD160C40, RIPEMD160S44); RIPEMD160_STEP_S (RIPEMD160_J , b1, c1, d1, e1, a1, wc_t, RIPEMD160C40, RIPEMD160S45); RIPEMD160_STEP_S (RIPEMD160_J , a1, b1, c1, d1, e1, w2_t, RIPEMD160C40, RIPEMD160S46); RIPEMD160_STEP_S (RIPEMD160_J , e1, a1, b1, c1, d1, wa_t, RIPEMD160C40, RIPEMD160S47); RIPEMD160_STEP_S (RIPEMD160_J , d1, e1, a1, b1, c1, we_t, RIPEMD160C40, RIPEMD160S48); RIPEMD160_STEP_S (RIPEMD160_J , c1, d1, e1, a1, b1, w1_t, RIPEMD160C40, RIPEMD160S49); RIPEMD160_STEP_S (RIPEMD160_J , b1, c1, d1, e1, a1, w3_t, RIPEMD160C40, RIPEMD160S4A); RIPEMD160_STEP_S (RIPEMD160_J , a1, b1, c1, d1, e1, w8_t, RIPEMD160C40, RIPEMD160S4B); RIPEMD160_STEP_S (RIPEMD160_J , e1, a1, b1, c1, d1, wb_t, RIPEMD160C40, RIPEMD160S4C); RIPEMD160_STEP_S (RIPEMD160_J , d1, e1, a1, b1, c1, w6_t, RIPEMD160C40, RIPEMD160S4D); RIPEMD160_STEP_S (RIPEMD160_J , c1, d1, e1, a1, b1, wf_t, RIPEMD160C40, RIPEMD160S4E); RIPEMD160_STEP_S (RIPEMD160_J , b1, c1, d1, e1, a1, wd_t, RIPEMD160C40, RIPEMD160S4F); u32 a2 = digest[0]; u32 b2 = digest[1]; u32 c2 = digest[2]; u32 d2 = digest[3]; u32 e2 = digest[4]; RIPEMD160_STEP_S_WORKAROUND_BUG (RIPEMD160_J , a2, b2, c2, d2, e2, w5_t, RIPEMD160C50, RIPEMD160S50); RIPEMD160_STEP_S (RIPEMD160_J , e2, a2, b2, c2, d2, we_t, RIPEMD160C50, RIPEMD160S51); RIPEMD160_STEP_S (RIPEMD160_J , d2, e2, a2, b2, c2, w7_t, RIPEMD160C50, RIPEMD160S52); RIPEMD160_STEP_S (RIPEMD160_J , c2, d2, e2, a2, b2, w0_t, RIPEMD160C50, RIPEMD160S53); RIPEMD160_STEP_S (RIPEMD160_J , b2, c2, d2, e2, a2, w9_t, RIPEMD160C50, RIPEMD160S54); RIPEMD160_STEP_S (RIPEMD160_J , a2, b2, c2, d2, e2, w2_t, RIPEMD160C50, RIPEMD160S55); RIPEMD160_STEP_S (RIPEMD160_J , e2, a2, b2, c2, d2, wb_t, RIPEMD160C50, RIPEMD160S56); RIPEMD160_STEP_S (RIPEMD160_J , d2, e2, a2, b2, c2, w4_t, RIPEMD160C50, RIPEMD160S57); RIPEMD160_STEP_S (RIPEMD160_J , c2, d2, e2, a2, b2, wd_t, RIPEMD160C50, RIPEMD160S58); RIPEMD160_STEP_S (RIPEMD160_J , b2, c2, d2, e2, a2, w6_t, RIPEMD160C50, RIPEMD160S59); RIPEMD160_STEP_S (RIPEMD160_J , a2, b2, c2, d2, e2, wf_t, RIPEMD160C50, RIPEMD160S5A); RIPEMD160_STEP_S (RIPEMD160_J , e2, a2, b2, c2, d2, w8_t, RIPEMD160C50, RIPEMD160S5B); RIPEMD160_STEP_S (RIPEMD160_J , d2, e2, a2, b2, c2, w1_t, RIPEMD160C50, RIPEMD160S5C); RIPEMD160_STEP_S (RIPEMD160_J , c2, d2, e2, a2, b2, wa_t, RIPEMD160C50, RIPEMD160S5D); RIPEMD160_STEP_S (RIPEMD160_J , b2, c2, d2, e2, a2, w3_t, RIPEMD160C50, RIPEMD160S5E); RIPEMD160_STEP_S (RIPEMD160_J , a2, b2, c2, d2, e2, wc_t, RIPEMD160C50, RIPEMD160S5F); RIPEMD160_STEP_S (RIPEMD160_Io, e2, a2, b2, c2, d2, w6_t, RIPEMD160C60, RIPEMD160S60); RIPEMD160_STEP_S (RIPEMD160_Io, d2, e2, a2, b2, c2, wb_t, RIPEMD160C60, RIPEMD160S61); RIPEMD160_STEP_S (RIPEMD160_Io, c2, d2, e2, a2, b2, w3_t, RIPEMD160C60, RIPEMD160S62); RIPEMD160_STEP_S (RIPEMD160_Io, b2, c2, d2, e2, a2, w7_t, RIPEMD160C60, RIPEMD160S63); RIPEMD160_STEP_S (RIPEMD160_Io, a2, b2, c2, d2, e2, w0_t, RIPEMD160C60, RIPEMD160S64); RIPEMD160_STEP_S (RIPEMD160_Io, e2, a2, b2, c2, d2, wd_t, RIPEMD160C60, RIPEMD160S65); RIPEMD160_STEP_S (RIPEMD160_Io, d2, e2, a2, b2, c2, w5_t, RIPEMD160C60, RIPEMD160S66); RIPEMD160_STEP_S (RIPEMD160_Io, c2, d2, e2, a2, b2, wa_t, RIPEMD160C60, RIPEMD160S67); RIPEMD160_STEP_S (RIPEMD160_Io, b2, c2, d2, e2, a2, we_t, RIPEMD160C60, RIPEMD160S68); RIPEMD160_STEP_S (RIPEMD160_Io, a2, b2, c2, d2, e2, wf_t, RIPEMD160C60, RIPEMD160S69); RIPEMD160_STEP_S (RIPEMD160_Io, e2, a2, b2, c2, d2, w8_t, RIPEMD160C60, RIPEMD160S6A); RIPEMD160_STEP_S (RIPEMD160_Io, d2, e2, a2, b2, c2, wc_t, RIPEMD160C60, RIPEMD160S6B); RIPEMD160_STEP_S (RIPEMD160_Io, c2, d2, e2, a2, b2, w4_t, RIPEMD160C60, RIPEMD160S6C); RIPEMD160_STEP_S (RIPEMD160_Io, b2, c2, d2, e2, a2, w9_t, RIPEMD160C60, RIPEMD160S6D); RIPEMD160_STEP_S (RIPEMD160_Io, a2, b2, c2, d2, e2, w1_t, RIPEMD160C60, RIPEMD160S6E); RIPEMD160_STEP_S (RIPEMD160_Io, e2, a2, b2, c2, d2, w2_t, RIPEMD160C60, RIPEMD160S6F); RIPEMD160_STEP_S (RIPEMD160_H , d2, e2, a2, b2, c2, wf_t, RIPEMD160C70, RIPEMD160S70); RIPEMD160_STEP_S (RIPEMD160_H , c2, d2, e2, a2, b2, w5_t, RIPEMD160C70, RIPEMD160S71); RIPEMD160_STEP_S (RIPEMD160_H , b2, c2, d2, e2, a2, w1_t, RIPEMD160C70, RIPEMD160S72); RIPEMD160_STEP_S (RIPEMD160_H , a2, b2, c2, d2, e2, w3_t, RIPEMD160C70, RIPEMD160S73); RIPEMD160_STEP_S (RIPEMD160_H , e2, a2, b2, c2, d2, w7_t, RIPEMD160C70, RIPEMD160S74); RIPEMD160_STEP_S (RIPEMD160_H , d2, e2, a2, b2, c2, we_t, RIPEMD160C70, RIPEMD160S75); RIPEMD160_STEP_S (RIPEMD160_H , c2, d2, e2, a2, b2, w6_t, RIPEMD160C70, RIPEMD160S76); RIPEMD160_STEP_S (RIPEMD160_H , b2, c2, d2, e2, a2, w9_t, RIPEMD160C70, RIPEMD160S77); RIPEMD160_STEP_S (RIPEMD160_H , a2, b2, c2, d2, e2, wb_t, RIPEMD160C70, RIPEMD160S78); RIPEMD160_STEP_S (RIPEMD160_H , e2, a2, b2, c2, d2, w8_t, RIPEMD160C70, RIPEMD160S79); RIPEMD160_STEP_S (RIPEMD160_H , d2, e2, a2, b2, c2, wc_t, RIPEMD160C70, RIPEMD160S7A); RIPEMD160_STEP_S (RIPEMD160_H , c2, d2, e2, a2, b2, w2_t, RIPEMD160C70, RIPEMD160S7B); RIPEMD160_STEP_S (RIPEMD160_H , b2, c2, d2, e2, a2, wa_t, RIPEMD160C70, RIPEMD160S7C); RIPEMD160_STEP_S (RIPEMD160_H , a2, b2, c2, d2, e2, w0_t, RIPEMD160C70, RIPEMD160S7D); RIPEMD160_STEP_S (RIPEMD160_H , e2, a2, b2, c2, d2, w4_t, RIPEMD160C70, RIPEMD160S7E); RIPEMD160_STEP_S (RIPEMD160_H , d2, e2, a2, b2, c2, wd_t, RIPEMD160C70, RIPEMD160S7F); RIPEMD160_STEP_S (RIPEMD160_Go, c2, d2, e2, a2, b2, w8_t, RIPEMD160C80, RIPEMD160S80); RIPEMD160_STEP_S (RIPEMD160_Go, b2, c2, d2, e2, a2, w6_t, RIPEMD160C80, RIPEMD160S81); RIPEMD160_STEP_S (RIPEMD160_Go, a2, b2, c2, d2, e2, w4_t, RIPEMD160C80, RIPEMD160S82); RIPEMD160_STEP_S (RIPEMD160_Go, e2, a2, b2, c2, d2, w1_t, RIPEMD160C80, RIPEMD160S83); RIPEMD160_STEP_S (RIPEMD160_Go, d2, e2, a2, b2, c2, w3_t, RIPEMD160C80, RIPEMD160S84); RIPEMD160_STEP_S (RIPEMD160_Go, c2, d2, e2, a2, b2, wb_t, RIPEMD160C80, RIPEMD160S85); RIPEMD160_STEP_S (RIPEMD160_Go, b2, c2, d2, e2, a2, wf_t, RIPEMD160C80, RIPEMD160S86); RIPEMD160_STEP_S (RIPEMD160_Go, a2, b2, c2, d2, e2, w0_t, RIPEMD160C80, RIPEMD160S87); RIPEMD160_STEP_S (RIPEMD160_Go, e2, a2, b2, c2, d2, w5_t, RIPEMD160C80, RIPEMD160S88); RIPEMD160_STEP_S (RIPEMD160_Go, d2, e2, a2, b2, c2, wc_t, RIPEMD160C80, RIPEMD160S89); RIPEMD160_STEP_S (RIPEMD160_Go, c2, d2, e2, a2, b2, w2_t, RIPEMD160C80, RIPEMD160S8A); RIPEMD160_STEP_S (RIPEMD160_Go, b2, c2, d2, e2, a2, wd_t, RIPEMD160C80, RIPEMD160S8B); RIPEMD160_STEP_S (RIPEMD160_Go, a2, b2, c2, d2, e2, w9_t, RIPEMD160C80, RIPEMD160S8C); RIPEMD160_STEP_S (RIPEMD160_Go, e2, a2, b2, c2, d2, w7_t, RIPEMD160C80, RIPEMD160S8D); RIPEMD160_STEP_S (RIPEMD160_Go, d2, e2, a2, b2, c2, wa_t, RIPEMD160C80, RIPEMD160S8E); RIPEMD160_STEP_S (RIPEMD160_Go, c2, d2, e2, a2, b2, we_t, RIPEMD160C80, RIPEMD160S8F); RIPEMD160_STEP_S (RIPEMD160_F , b2, c2, d2, e2, a2, wc_t, RIPEMD160C90, RIPEMD160S90); RIPEMD160_STEP_S (RIPEMD160_F , a2, b2, c2, d2, e2, wf_t, RIPEMD160C90, RIPEMD160S91); RIPEMD160_STEP_S (RIPEMD160_F , e2, a2, b2, c2, d2, wa_t, RIPEMD160C90, RIPEMD160S92); RIPEMD160_STEP_S (RIPEMD160_F , d2, e2, a2, b2, c2, w4_t, RIPEMD160C90, RIPEMD160S93); RIPEMD160_STEP_S (RIPEMD160_F , c2, d2, e2, a2, b2, w1_t, RIPEMD160C90, RIPEMD160S94); RIPEMD160_STEP_S (RIPEMD160_F , b2, c2, d2, e2, a2, w5_t, RIPEMD160C90, RIPEMD160S95); RIPEMD160_STEP_S (RIPEMD160_F , a2, b2, c2, d2, e2, w8_t, RIPEMD160C90, RIPEMD160S96); RIPEMD160_STEP_S (RIPEMD160_F , e2, a2, b2, c2, d2, w7_t, RIPEMD160C90, RIPEMD160S97); RIPEMD160_STEP_S (RIPEMD160_F , d2, e2, a2, b2, c2, w6_t, RIPEMD160C90, RIPEMD160S98); RIPEMD160_STEP_S (RIPEMD160_F , c2, d2, e2, a2, b2, w2_t, RIPEMD160C90, RIPEMD160S99); RIPEMD160_STEP_S (RIPEMD160_F , b2, c2, d2, e2, a2, wd_t, RIPEMD160C90, RIPEMD160S9A); RIPEMD160_STEP_S (RIPEMD160_F , a2, b2, c2, d2, e2, we_t, RIPEMD160C90, RIPEMD160S9B); RIPEMD160_STEP_S (RIPEMD160_F , e2, a2, b2, c2, d2, w0_t, RIPEMD160C90, RIPEMD160S9C); RIPEMD160_STEP_S (RIPEMD160_F , d2, e2, a2, b2, c2, w3_t, RIPEMD160C90, RIPEMD160S9D); RIPEMD160_STEP_S (RIPEMD160_F , c2, d2, e2, a2, b2, w9_t, RIPEMD160C90, RIPEMD160S9E); RIPEMD160_STEP_S (RIPEMD160_F , b2, c2, d2, e2, a2, wb_t, RIPEMD160C90, RIPEMD160S9F); const u32 a = digest[1] + c1 + d2; const u32 b = digest[2] + d1 + e2; const u32 c = digest[3] + e1 + a2; const u32 d = digest[4] + a1 + b2; const u32 e = digest[0] + b1 + c2; digest[0] = a; digest[1] = b; digest[2] = c; digest[3] = d; digest[4] = e; } // diffuse functions void AF_sha1_diffuse16 (u32 *out) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 digest[5]; // 0 - 15 w0[0] = 0; w0[1] = swap32_S (out[0]); w0[2] = swap32_S (out[1]); w0[3] = swap32_S (out[2]); w1[0] = swap32_S (out[3]); 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] = 20 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; AF_sha1_transform_S (w0, w1, w2, w3, digest); out[0] = swap32_S (digest[0]); out[1] = swap32_S (digest[1]); out[2] = swap32_S (digest[2]); out[3] = swap32_S (digest[3]); } void AF_sha1_diffuse32 (u32 *out) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 digest[5]; // 0 - 19 w0[0] = 0; w0[1] = swap32_S (out[0]); w0[2] = swap32_S (out[1]); w0[3] = swap32_S (out[2]); w1[0] = swap32_S (out[3]); w1[1] = swap32_S (out[4]); w1[2] = 0x80000000; 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] = 24 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; AF_sha1_transform_S (w0, w1, w2, w3, digest); out[0] = swap32_S (digest[0]); out[1] = swap32_S (digest[1]); out[2] = swap32_S (digest[2]); out[3] = swap32_S (digest[3]); out[4] = swap32_S (digest[4]); // 20 - 31 w0[0] = 1; w0[1] = swap32_S (out[5]); w0[2] = swap32_S (out[6]); w0[3] = swap32_S (out[7]); 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; AF_sha1_transform_S (w0, w1, w2, w3, digest); out[5] = swap32_S (digest[0]); out[6] = swap32_S (digest[1]); out[7] = swap32_S (digest[2]); } void AF_sha1_diffuse64 (u32 *out) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 digest[5]; // 0 - 19 w0[0] = 0; w0[1] = swap32_S (out[0]); w0[2] = swap32_S (out[1]); w0[3] = swap32_S (out[2]); w1[0] = swap32_S (out[3]); w1[1] = swap32_S (out[4]); w1[2] = 0x80000000; 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] = 24 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; AF_sha1_transform_S (w0, w1, w2, w3, digest); out[0] = swap32_S (digest[0]); out[1] = swap32_S (digest[1]); out[2] = swap32_S (digest[2]); out[3] = swap32_S (digest[3]); out[4] = swap32_S (digest[4]); // 20 - 39 w0[0] = 1; w0[1] = swap32_S (out[5]); w0[2] = swap32_S (out[6]); w0[3] = swap32_S (out[7]); w1[0] = swap32_S (out[8]); w1[1] = swap32_S (out[9]); w1[2] = 0x80000000; 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] = 24 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; AF_sha1_transform_S (w0, w1, w2, w3, digest); out[5] = swap32_S (digest[0]); out[6] = swap32_S (digest[1]); out[7] = swap32_S (digest[2]); out[8] = swap32_S (digest[3]); out[9] = swap32_S (digest[4]); // 40 - 59 w0[0] = 2; w0[1] = swap32_S (out[10]); w0[2] = swap32_S (out[11]); w0[3] = swap32_S (out[12]); w1[0] = swap32_S (out[13]); w1[1] = swap32_S (out[14]); w1[2] = 0x80000000; 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] = 24 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; AF_sha1_transform_S (w0, w1, w2, w3, digest); out[10] = swap32_S (digest[0]); out[11] = swap32_S (digest[1]); out[12] = swap32_S (digest[2]); out[13] = swap32_S (digest[3]); out[14] = swap32_S (digest[4]); // 60 - 63 w0[0] = 3; w0[1] = swap32_S (out[15]); w0[2] = 0x80000000; 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 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; AF_sha1_transform_S (w0, w1, w2, w3, digest); out[15] = swap32_S (digest[0]); } void AF_sha256_diffuse16 (u32 *out) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 digest[8]; // 0 - 15 w0[0] = 0; w0[1] = swap32_S (out[0]); w0[2] = swap32_S (out[1]); w0[3] = swap32_S (out[2]); w1[0] = swap32_S (out[3]); 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] = 20 * 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; AF_sha256_transform_S (w0, w1, w2, w3, digest); out[0] = swap32_S (digest[0]); out[1] = swap32_S (digest[1]); out[2] = swap32_S (digest[2]); out[3] = swap32_S (digest[3]); } void AF_sha256_diffuse32 (u32 *out) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 digest[8]; // 0 - 31 w0[0] = 0; w0[1] = swap32_S (out[0]); w0[2] = swap32_S (out[1]); w0[3] = swap32_S (out[2]); w1[0] = swap32_S (out[3]); w1[1] = swap32_S (out[4]); w1[2] = swap32_S (out[5]); w1[3] = swap32_S (out[6]); w2[0] = swap32_S (out[7]); w2[1] = 0x80000000; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 36 * 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; AF_sha256_transform_S (w0, w1, w2, w3, digest); out[0] = swap32_S (digest[0]); out[1] = swap32_S (digest[1]); out[2] = swap32_S (digest[2]); out[3] = swap32_S (digest[3]); out[4] = swap32_S (digest[4]); out[5] = swap32_S (digest[5]); out[6] = swap32_S (digest[6]); out[7] = swap32_S (digest[7]); } void AF_sha256_diffuse64 (u32 *out) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 digest[8]; // 0 - 31 w0[0] = 0; w0[1] = swap32_S (out[0]); w0[2] = swap32_S (out[1]); w0[3] = swap32_S (out[2]); w1[0] = swap32_S (out[3]); w1[1] = swap32_S (out[4]); w1[2] = swap32_S (out[5]); w1[3] = swap32_S (out[6]); w2[0] = swap32_S (out[7]); w2[1] = 0x80000000; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 36 * 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; AF_sha256_transform_S (w0, w1, w2, w3, digest); out[0] = swap32_S (digest[0]); out[1] = swap32_S (digest[1]); out[2] = swap32_S (digest[2]); out[3] = swap32_S (digest[3]); out[4] = swap32_S (digest[4]); out[5] = swap32_S (digest[5]); out[6] = swap32_S (digest[6]); out[7] = swap32_S (digest[7]); // 32 - 63 w0[0] = 1; w0[1] = swap32_S (out[ 8]); w0[2] = swap32_S (out[ 9]); w0[3] = swap32_S (out[10]); w1[0] = swap32_S (out[11]); w1[1] = swap32_S (out[12]); w1[2] = swap32_S (out[13]); w1[3] = swap32_S (out[14]); w2[0] = swap32_S (out[15]); w2[1] = 0x80000000; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 36 * 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; AF_sha256_transform_S (w0, w1, w2, w3, digest); out[ 8] = swap32_S (digest[0]); out[ 9] = swap32_S (digest[1]); out[10] = swap32_S (digest[2]); out[11] = swap32_S (digest[3]); out[12] = swap32_S (digest[4]); out[13] = swap32_S (digest[5]); out[14] = swap32_S (digest[6]); out[15] = swap32_S (digest[7]); } void AF_sha512_diffuse16 (u32 *out) { u64 w0[4]; u64 w1[4]; u64 w2[4]; u64 w3[4]; u64 digest[8]; // 0 - 15 w0[0] = hl32_to_64_S ( 0, swap32_S (out[0])); w0[1] = hl32_to_64_S (swap32_S (out[1]), swap32_S (out[2])); w0[2] = hl32_to_64_S (swap32_S (out[3]), 0x80000000); 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] = 20 * 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; AF_sha512_transform_S (w0, w1, w2, w3, digest); out[0] = swap32_S (h32_from_64_S (digest[0])); out[1] = swap32_S (l32_from_64_S (digest[0])); out[2] = swap32_S (h32_from_64_S (digest[1])); out[3] = swap32_S (l32_from_64_S (digest[1])); } void AF_sha512_diffuse32 (u32 *out) { u64 w0[4]; u64 w1[4]; u64 w2[4]; u64 w3[4]; u64 digest[8]; // 0 - 31 w0[0] = hl32_to_64_S ( 0, swap32_S (out[0])); w0[1] = hl32_to_64_S (swap32_S (out[1]), swap32_S (out[2])); w0[2] = hl32_to_64_S (swap32_S (out[3]), swap32_S (out[4])); w0[3] = hl32_to_64_S (swap32_S (out[5]), swap32_S (out[6])); w1[0] = hl32_to_64_S (swap32_S (out[7]), 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] = 36 * 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; AF_sha512_transform_S (w0, w1, w2, w3, digest); out[0] = swap32_S (h32_from_64_S (digest[0])); out[1] = swap32_S (l32_from_64_S (digest[0])); out[2] = swap32_S (h32_from_64_S (digest[1])); out[3] = swap32_S (l32_from_64_S (digest[1])); out[4] = swap32_S (h32_from_64_S (digest[2])); out[5] = swap32_S (l32_from_64_S (digest[2])); out[6] = swap32_S (h32_from_64_S (digest[3])); out[7] = swap32_S (l32_from_64_S (digest[3])); } void AF_sha512_diffuse64 (u32 *out) { u64 w0[4]; u64 w1[4]; u64 w2[4]; u64 w3[4]; u64 digest[8]; // 0 - 63 w0[0] = hl32_to_64_S ( 0, swap32_S (out[ 0])); w0[1] = hl32_to_64_S (swap32_S (out[ 1]), swap32_S (out[ 2])); w0[2] = hl32_to_64_S (swap32_S (out[ 3]), swap32_S (out[ 4])); w0[3] = hl32_to_64_S (swap32_S (out[ 5]), swap32_S (out[ 6])); w1[0] = hl32_to_64_S (swap32_S (out[ 7]), swap32_S (out[ 8])); w1[1] = hl32_to_64_S (swap32_S (out[ 9]), swap32_S (out[10])); w1[2] = hl32_to_64_S (swap32_S (out[11]), swap32_S (out[12])); w1[3] = hl32_to_64_S (swap32_S (out[13]), swap32_S (out[14])); w2[0] = hl32_to_64_S (swap32_S (out[15]), 0x80000000); w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 68 * 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; AF_sha512_transform_S (w0, w1, w2, w3, digest); out[ 0] = swap32_S (h32_from_64_S (digest[0])); out[ 1] = swap32_S (l32_from_64_S (digest[0])); out[ 2] = swap32_S (h32_from_64_S (digest[1])); out[ 3] = swap32_S (l32_from_64_S (digest[1])); out[ 4] = swap32_S (h32_from_64_S (digest[2])); out[ 5] = swap32_S (l32_from_64_S (digest[2])); out[ 6] = swap32_S (h32_from_64_S (digest[3])); out[ 7] = swap32_S (l32_from_64_S (digest[3])); out[ 8] = swap32_S (h32_from_64_S (digest[4])); out[ 9] = swap32_S (l32_from_64_S (digest[4])); out[10] = swap32_S (h32_from_64_S (digest[5])); out[11] = swap32_S (l32_from_64_S (digest[5])); out[12] = swap32_S (h32_from_64_S (digest[6])); out[13] = swap32_S (l32_from_64_S (digest[6])); out[14] = swap32_S (h32_from_64_S (digest[7])); out[15] = swap32_S (l32_from_64_S (digest[7])); } void AF_ripemd160_diffuse16 (u32 *out) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 digest[5]; // 0 - 15 w0[0] = 0 << 24; w0[1] = out[0]; w0[2] = out[1]; w0[3] = out[2]; w1[0] = out[3]; w1[1] = 0x80; 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] = 20 * 8; w3[3] = 0; digest[0] = RIPEMD160M_A; digest[1] = RIPEMD160M_B; digest[2] = RIPEMD160M_C; digest[3] = RIPEMD160M_D; digest[4] = RIPEMD160M_E; AF_ripemd160_transform_S (w0, w1, w2, w3, digest); out[0] = digest[0]; out[1] = digest[1]; out[2] = digest[2]; out[3] = digest[3]; } void AF_ripemd160_diffuse32 (u32 *out) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 digest[5]; // 0 - 19 w0[0] = 0 << 24; w0[1] = out[0]; w0[2] = out[1]; w0[3] = out[2]; w1[0] = out[3]; w1[1] = out[4]; w1[2] = 0x80; w1[3] = 0; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 24 * 8; w3[3] = 0; digest[0] = RIPEMD160M_A; digest[1] = RIPEMD160M_B; digest[2] = RIPEMD160M_C; digest[3] = RIPEMD160M_D; digest[4] = RIPEMD160M_E; AF_ripemd160_transform_S (w0, w1, w2, w3, digest); out[0] = digest[0]; out[1] = digest[1]; out[2] = digest[2]; out[3] = digest[3]; out[4] = digest[4]; // 20 - 31 w0[0] = 1 << 24; w0[1] = out[5]; w0[2] = out[6]; w0[3] = out[7]; 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] = 16 * 8; w3[3] = 0; digest[0] = RIPEMD160M_A; digest[1] = RIPEMD160M_B; digest[2] = RIPEMD160M_C; digest[3] = RIPEMD160M_D; digest[4] = RIPEMD160M_E; AF_ripemd160_transform_S (w0, w1, w2, w3, digest); out[5] = digest[0]; out[6] = digest[1]; out[7] = digest[2]; } void AF_ripemd160_diffuse64 (u32 *out) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 digest[5]; // 0 - 19 w0[0] = 0 << 24; w0[1] = out[0]; w0[2] = out[1]; w0[3] = out[2]; w1[0] = out[3]; w1[1] = out[4]; w1[2] = 0x80; w1[3] = 0; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 24 * 8; w3[3] = 0; digest[0] = RIPEMD160M_A; digest[1] = RIPEMD160M_B; digest[2] = RIPEMD160M_C; digest[3] = RIPEMD160M_D; digest[4] = RIPEMD160M_E; AF_ripemd160_transform_S (w0, w1, w2, w3, digest); out[0] = digest[0]; out[1] = digest[1]; out[2] = digest[2]; out[3] = digest[3]; out[4] = digest[4]; // 20 - 39 w0[0] = 1 << 24; w0[1] = out[5]; w0[2] = out[6]; w0[3] = out[7]; w1[0] = out[8]; w1[1] = out[9]; w1[2] = 0x80; w1[3] = 0; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 24 * 8; w3[3] = 0; digest[0] = RIPEMD160M_A; digest[1] = RIPEMD160M_B; digest[2] = RIPEMD160M_C; digest[3] = RIPEMD160M_D; digest[4] = RIPEMD160M_E; AF_ripemd160_transform_S (w0, w1, w2, w3, digest); out[5] = digest[0]; out[6] = digest[1]; out[7] = digest[2]; out[8] = digest[3]; out[9] = digest[4]; // 40 - 59 w0[0] = 2 << 24; w0[1] = out[10]; w0[2] = out[11]; w0[3] = out[12]; w1[0] = out[13]; w1[1] = out[14]; w1[2] = 0x80; w1[3] = 0; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 24 * 8; w3[3] = 0; digest[0] = RIPEMD160M_A; digest[1] = RIPEMD160M_B; digest[2] = RIPEMD160M_C; digest[3] = RIPEMD160M_D; digest[4] = RIPEMD160M_E; AF_ripemd160_transform_S (w0, w1, w2, w3, digest); out[10] = digest[0]; out[11] = digest[1]; out[12] = digest[2]; out[13] = digest[3]; out[14] = digest[4]; // 60 - 63 w0[0] = 3 << 24; w0[1] = out[15]; w0[2] = 0x80; 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] = 8 * 8; w3[3] = 0; digest[0] = RIPEMD160M_A; digest[1] = RIPEMD160M_B; digest[2] = RIPEMD160M_C; digest[3] = RIPEMD160M_D; digest[4] = RIPEMD160M_E; AF_ripemd160_transform_S (w0, w1, w2, w3, digest); out[15] = digest[0]; } hashcat-4.0.1/OpenCL/inc_luks_essiv.cl000066400000000000000000000151021320027462700176110ustar00rootroot00000000000000__constant u32a ESSIV_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, }; // basically a normal sha256_transform() but with a different name to avoid collisions with function nameing void ESSIV_sha256_transform_S (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[8]) { u32 a = digest[0]; u32 b = digest[1]; u32 c = digest[2]; u32 d = digest[3]; u32 e = digest[4]; u32 f = digest[5]; u32 g = digest[6]; u32 h = digest[7]; u32 w0_t = w0[0]; u32 w1_t = w0[1]; u32 w2_t = w0[2]; u32 w3_t = w0[3]; u32 w4_t = w1[0]; u32 w5_t = w1[1]; u32 w6_t = w1[2]; u32 w7_t = w1[3]; u32 w8_t = w2[0]; u32 w9_t = w2[1]; u32 wa_t = w2[2]; u32 wb_t = w2[3]; u32 wc_t = w3[0]; u32 wd_t = w3[1]; u32 we_t = w3[2]; u32 wf_t = w3[3]; #define ESSIV_ROUND_EXPAND_S() \ { \ w0_t = SHA256_EXPAND_S (we_t, w9_t, w1_t, w0_t); \ w1_t = SHA256_EXPAND_S (wf_t, wa_t, w2_t, w1_t); \ w2_t = SHA256_EXPAND_S (w0_t, wb_t, w3_t, w2_t); \ w3_t = SHA256_EXPAND_S (w1_t, wc_t, w4_t, w3_t); \ w4_t = SHA256_EXPAND_S (w2_t, wd_t, w5_t, w4_t); \ w5_t = SHA256_EXPAND_S (w3_t, we_t, w6_t, w5_t); \ w6_t = SHA256_EXPAND_S (w4_t, wf_t, w7_t, w6_t); \ w7_t = SHA256_EXPAND_S (w5_t, w0_t, w8_t, w7_t); \ w8_t = SHA256_EXPAND_S (w6_t, w1_t, w9_t, w8_t); \ w9_t = SHA256_EXPAND_S (w7_t, w2_t, wa_t, w9_t); \ wa_t = SHA256_EXPAND_S (w8_t, w3_t, wb_t, wa_t); \ wb_t = SHA256_EXPAND_S (w9_t, w4_t, wc_t, wb_t); \ wc_t = SHA256_EXPAND_S (wa_t, w5_t, wd_t, wc_t); \ wd_t = SHA256_EXPAND_S (wb_t, w6_t, we_t, wd_t); \ we_t = SHA256_EXPAND_S (wc_t, w7_t, wf_t, we_t); \ wf_t = SHA256_EXPAND_S (wd_t, w8_t, w0_t, wf_t); \ } #define ESSIV_ROUND_STEP_S(i) \ { \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, ESSIV_k_sha256[i + 0]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, ESSIV_k_sha256[i + 1]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, ESSIV_k_sha256[i + 2]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, ESSIV_k_sha256[i + 3]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, ESSIV_k_sha256[i + 4]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, ESSIV_k_sha256[i + 5]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, ESSIV_k_sha256[i + 6]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, ESSIV_k_sha256[i + 7]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, ESSIV_k_sha256[i + 8]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, ESSIV_k_sha256[i + 9]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, ESSIV_k_sha256[i + 10]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, ESSIV_k_sha256[i + 11]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, ESSIV_k_sha256[i + 12]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, ESSIV_k_sha256[i + 13]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, ESSIV_k_sha256[i + 14]); \ SHA256_STEP_S (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, ESSIV_k_sha256[i + 15]); \ } ESSIV_ROUND_STEP_S (0); #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i += 16) { ESSIV_ROUND_EXPAND_S (); ESSIV_ROUND_STEP_S (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; } void ESSIV_sha256_init128 (u32 *key, u32 *essivhash) { 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; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = swap32_S (key[0]); w0[1] = swap32_S (key[1]); w0[2] = swap32_S (key[2]); w0[3] = swap32_S (key[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; ESSIV_sha256_transform_S (w0, w1, w2, w3, essivhash); essivhash[0] = swap32_S (essivhash[0]); essivhash[1] = swap32_S (essivhash[1]); essivhash[2] = swap32_S (essivhash[2]); essivhash[3] = swap32_S (essivhash[3]); essivhash[4] = swap32_S (essivhash[4]); essivhash[5] = swap32_S (essivhash[5]); essivhash[6] = swap32_S (essivhash[6]); essivhash[7] = swap32_S (essivhash[7]); } void ESSIV_sha256_init256 (u32 *key, u32 *essivhash) { 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; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = swap32_S (key[0]); w0[1] = swap32_S (key[1]); w0[2] = swap32_S (key[2]); w0[3] = swap32_S (key[3]); w1[0] = swap32_S (key[4]); w1[1] = swap32_S (key[5]); w1[2] = swap32_S (key[6]); w1[3] = swap32_S (key[7]); w2[0] = 0x80000000; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 32 * 8; ESSIV_sha256_transform_S (w0, w1, w2, w3, essivhash); essivhash[0] = swap32_S (essivhash[0]); essivhash[1] = swap32_S (essivhash[1]); essivhash[2] = swap32_S (essivhash[2]); essivhash[3] = swap32_S (essivhash[3]); essivhash[4] = swap32_S (essivhash[4]); essivhash[5] = swap32_S (essivhash[5]); essivhash[6] = swap32_S (essivhash[6]); essivhash[7] = swap32_S (essivhash[7]); } hashcat-4.0.1/OpenCL/inc_luks_serpent.cl000066400000000000000000002650031320027462700201470ustar00rootroot00000000000000 // cbc-essiv void serpent128_decrypt_cbc (const u32 *ks1, const u32 *in, u32 *out, u32 *essiv) { serpent128_decrypt (ks1, in, out); out[0] ^= essiv[0]; out[1] ^= essiv[1]; out[2] ^= essiv[2]; out[3] ^= essiv[3]; essiv[0] = in[0]; essiv[1] = in[1]; essiv[2] = in[2]; essiv[3] = in[3]; } void serpent256_decrypt_cbc (const u32 *ks1, const u32 *in, u32 *out, u32 *essiv) { serpent256_decrypt (ks1, in, out); out[0] ^= essiv[0]; out[1] ^= essiv[1]; out[2] ^= essiv[2]; out[3] ^= essiv[3]; essiv[0] = in[0]; essiv[1] = in[1]; essiv[2] = in[2]; essiv[3] = in[3]; } void luks_decrypt_sector_serpent_cbc_essiv128 (__global const u32 *in, u32 *out, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; int idx_out = 0; for (int i = 0; i < 32; i++) { for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, essiv); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_serpent_cbc_essiv128_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse16 (mk); } } void luks_decrypt_sector_serpent_cbc_essiv128_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse16 (mk); } // this one has no AF_sha1_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_cbc_essiv128_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse16 (mk); } } void luks_decrypt_sector_serpent_cbc_essiv128_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse16 (mk); } // this one has no AF_sha256_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_cbc_essiv128_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse16 (mk); } } void luks_decrypt_sector_serpent_cbc_essiv128_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse16 (mk); } // this one has no AF_sha512_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_cbc_essiv128_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse16 (mk); } } void luks_decrypt_sector_serpent_cbc_essiv128_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse16 (mk); } // this one has no AF_ripemd160_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_cbc_essiv256 (__global const u32 *in, u32 *out, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; int idx_out = 0; for (int i = 0; i < 16; i++) { for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, essiv); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_serpent_cbc_essiv256_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } } void luks_decrypt_sector_serpent_cbc_essiv256_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } // this one has no AF_sha1_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_cbc_essiv256_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } } void luks_decrypt_sector_serpent_cbc_essiv256_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } // this one has no AF_sha256_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_cbc_essiv256_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } } void luks_decrypt_sector_serpent_cbc_essiv256_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } // this one has no AF_sha512_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_cbc_essiv256_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } } void luks_decrypt_sector_serpent_cbc_essiv256_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; serpent256_encrypt (ks2, S, essiv); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } // this one has no AF_ripemd160_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } // cbc-plain void luks_decrypt_sector_serpent_cbc_plain128 (__global const u32 *in, u32 *out, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; int idx_out = 0; for (int i = 0; i < 32; i++) { for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, S); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_serpent_cbc_plain128_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse16 (mk); } } void luks_decrypt_sector_serpent_cbc_plain128_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse16 (mk); } // this one has no AF_sha1_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_cbc_plain128_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse16 (mk); } } void luks_decrypt_sector_serpent_cbc_plain128_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse16 (mk); } // this one has no AF_sha256_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_cbc_plain128_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse16 (mk); } } void luks_decrypt_sector_serpent_cbc_plain128_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse16 (mk); } // this one has no AF_sha512_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_cbc_plain128_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse16 (mk); } } void luks_decrypt_sector_serpent_cbc_plain128_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse16 (mk); } // this one has no AF_ripemd160_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_cbc_plain256 (__global const u32 *in, u32 *out, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; int idx_out = 0; for (int i = 0; i < 16; i++) { for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, S); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_serpent_cbc_plain256_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } } void luks_decrypt_sector_serpent_cbc_plain256_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } // this one has no AF_sha1_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_cbc_plain256_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } } void luks_decrypt_sector_serpent_cbc_plain256_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } // this one has no AF_sha256_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_cbc_plain256_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } } void luks_decrypt_sector_serpent_cbc_plain256_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } // this one has no AF_sha512_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_cbc_plain256_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } } void luks_decrypt_sector_serpent_cbc_plain256_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *ks1, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } // this one has no AF_ripemd160_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_cbc (ks1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } // xts-plain void serpent128_decrypt_xts (const u32 *ks1, const u32 *in, u32 *out, u32 *T) { out[0] = in[0]; out[1] = in[1]; out[2] = in[2]; out[3] = in[3]; out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; serpent128_decrypt (ks1, out, out); out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; xts_mul2 (T, T); } void serpent256_decrypt_xts (const u32 *ks1, const u32 *in, u32 *out, u32 *T) { out[0] = in[0]; out[1] = in[1]; out[2] = in[2]; out[3] = in[3]; out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; serpent256_decrypt (ks1, out, out); out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; xts_mul2 (T, T); } void luks_decrypt_sector_serpent_xts_plain256 (__global const u32 *in, u32 *out, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent128_encrypt (ks2, S, T); int idx_in = 0; int idx_out = 0; for (int i = 0; i < 16; i++) { for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_xts (ks1, data_in, data_out, T); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_serpent_xts_plain256_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent128_encrypt (ks2, S, T); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } } void luks_decrypt_sector_serpent_xts_plain256_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent128_encrypt (ks2, S, T); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } // this one has no AF_sha1_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_xts_plain256_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent128_encrypt (ks2, S, T); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } } void luks_decrypt_sector_serpent_xts_plain256_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent128_encrypt (ks2, S, T); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } // this one has no AF_sha256_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_xts_plain256_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent128_encrypt (ks2, S, T); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } } void luks_decrypt_sector_serpent_xts_plain256_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent128_encrypt (ks2, S, T); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } // this one has no AF_sha512_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_xts_plain256_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent128_encrypt (ks2, S, T); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } } void luks_decrypt_sector_serpent_xts_plain256_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent128_encrypt (ks2, S, T); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } // this one has no AF_ripemd160_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent128_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_xts_plain512 (__global const u32 *in, u32 *out, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent256_encrypt (ks2, S, T); int idx_in = 0; int idx_out = 0; for (int i = 0; i < 8; i++) { for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_xts (ks1, data_in, data_out, T); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_serpent_xts_plain512_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent256_encrypt (ks2, S, T); int idx_in = 0; for (int i = 0; i < 8; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse64 (mk); } } void luks_decrypt_sector_serpent_xts_plain512_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent256_encrypt (ks2, S, T); int idx_in = 0; for (int i = 0; i < 8 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse64 (mk); } // this one has no AF_sha1_diffuse64() int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_xts_plain512_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent256_encrypt (ks2, S, T); int idx_in = 0; for (int i = 0; i < 8; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse64 (mk); } } void luks_decrypt_sector_serpent_xts_plain512_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent256_encrypt (ks2, S, T); int idx_in = 0; for (int i = 0; i < 8 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse64 (mk); } // this one has no AF_sha256_diffuse64() int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_xts_plain512_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent256_encrypt (ks2, S, T); int idx_in = 0; for (int i = 0; i < 8; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse64 (mk); } } void luks_decrypt_sector_serpent_xts_plain512_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent256_encrypt (ks2, S, T); int idx_in = 0; for (int i = 0; i < 8 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse64 (mk); } // this one has no AF_sha512_diffuse64() int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_serpent_xts_plain512_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent256_encrypt (ks2, S, T); int idx_in = 0; for (int i = 0; i < 8; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse64 (mk); } } void luks_decrypt_sector_serpent_xts_plain512_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *ks1, const u32 *ks2, volatile const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; serpent256_encrypt (ks2, S, T); int idx_in = 0; for (int i = 0; i < 8 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse64 (mk); } // this one has no AF_ripemd160_diffuse64() int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; serpent256_decrypt_xts (ks1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } // luks helper void luks_af_sha1_then_serpent_decrypt (__global const luks_t *luks_bufs, __global luks_tmp_t *tmps, u32 *pt_buf) { const u32 key_size = luks_bufs->key_size; const u32 cipher_mode = luks_bufs->cipher_mode; #define BITS_PER_AF (key_size * LUKS_STRIPES) #define BITS_PER_SECTOR (512 * 8) #define SECTOR_PER_AF (BITS_PER_AF / BITS_PER_SECTOR) #define BLOCKS_PER_SECTOR (512 / 16) #define OFFSET_PER_BLOCK (16 / 4) #define OFFSET_PER_SECTOR (BLOCKS_PER_SECTOR * OFFSET_PER_BLOCK) // decrypt AF data and do the AF merge inline u32 mk[16] = { 0 }; if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 ks1[140]; u32 ks2[140]; serpent128_set_key (ks1, ukey); serpent256_set_key (ks2, essivhash); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_cbc_essiv128_mk_sha1 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } luks_decrypt_sector_serpent_cbc_essiv128_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); ukey[4] = swap32_S (tmps->out32[4]); ukey[5] = swap32_S (tmps->out32[5]); ukey[6] = swap32_S (tmps->out32[6]); ukey[7] = swap32_S (tmps->out32[7]); u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 ks1[140]; u32 ks2[140]; serpent256_set_key (ks1, ukey); serpent256_set_key (ks2, essivhash); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_cbc_essiv256_mk_sha1 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } luks_decrypt_sector_serpent_cbc_essiv256_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); u32 ks1[140]; serpent128_set_key (ks1, ukey); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_cbc_plain128_mk_sha1 (luks_bufs->af_src_buf + offset, mk, ks1, sector); } luks_decrypt_sector_serpent_cbc_plain128_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, ks1, sector); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); ukey[4] = swap32_S (tmps->out32[4]); ukey[5] = swap32_S (tmps->out32[5]); ukey[6] = swap32_S (tmps->out32[6]); ukey[7] = swap32_S (tmps->out32[7]); u32 ks1[140]; serpent256_set_key (ks1, ukey); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_cbc_plain256_mk_sha1 (luks_bufs->af_src_buf + offset, mk, ks1, sector); } luks_decrypt_sector_serpent_cbc_plain256_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, ks1, sector); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = swap32_S (tmps->out32[0]); ukey1[1] = swap32_S (tmps->out32[1]); ukey1[2] = swap32_S (tmps->out32[2]); ukey1[3] = swap32_S (tmps->out32[3]); u32 ukey2[4]; ukey2[0] = swap32_S (tmps->out32[4]); ukey2[1] = swap32_S (tmps->out32[5]); ukey2[2] = swap32_S (tmps->out32[6]); ukey2[3] = swap32_S (tmps->out32[7]); u32 ks1[140]; u32 ks2[140]; serpent128_set_key (ks1, ukey1); serpent128_set_key (ks2, ukey2); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_xts_plain256_mk_sha1 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } luks_decrypt_sector_serpent_xts_plain256_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = swap32_S (tmps->out32[ 0]); ukey1[1] = swap32_S (tmps->out32[ 1]); ukey1[2] = swap32_S (tmps->out32[ 2]); ukey1[3] = swap32_S (tmps->out32[ 3]); ukey1[4] = swap32_S (tmps->out32[ 4]); ukey1[5] = swap32_S (tmps->out32[ 5]); ukey1[6] = swap32_S (tmps->out32[ 6]); ukey1[7] = swap32_S (tmps->out32[ 7]); u32 ukey2[8]; ukey2[0] = swap32_S (tmps->out32[ 8]); ukey2[1] = swap32_S (tmps->out32[ 9]); ukey2[2] = swap32_S (tmps->out32[10]); ukey2[3] = swap32_S (tmps->out32[11]); ukey2[4] = swap32_S (tmps->out32[12]); ukey2[5] = swap32_S (tmps->out32[13]); ukey2[6] = swap32_S (tmps->out32[14]); ukey2[7] = swap32_S (tmps->out32[15]); u32 ks1[140]; u32 ks2[140]; serpent256_set_key (ks1, ukey1); serpent256_set_key (ks2, ukey2); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_xts_plain512_mk_sha1 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } luks_decrypt_sector_serpent_xts_plain512_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } } // decrypt payload data if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 ks1[140]; u32 ks2[140]; serpent128_set_key (ks1, ukey); serpent256_set_key (ks2, essivhash); luks_decrypt_sector_serpent_cbc_essiv128 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 ks1[140]; u32 ks2[140]; serpent256_set_key (ks1, ukey); serpent256_set_key (ks2, essivhash); luks_decrypt_sector_serpent_cbc_essiv256 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 ks1[140]; serpent128_set_key (ks1, ukey); luks_decrypt_sector_serpent_cbc_plain128 (luks_bufs->ct_buf, pt_buf, ks1, 0); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 ks1[140]; serpent256_set_key (ks1, ukey); luks_decrypt_sector_serpent_cbc_plain256 (luks_bufs->ct_buf, pt_buf, ks1, 0); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = mk[0]; ukey1[1] = mk[1]; ukey1[2] = mk[2]; ukey1[3] = mk[3]; u32 ukey2[4]; ukey2[0] = mk[4]; ukey2[1] = mk[5]; ukey2[2] = mk[6]; ukey2[3] = mk[7]; u32 ks1[140]; u32 ks2[140]; serpent128_set_key (ks1, ukey1); serpent128_set_key (ks2, ukey2); luks_decrypt_sector_serpent_xts_plain256 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = mk[ 0]; ukey1[1] = mk[ 1]; ukey1[2] = mk[ 2]; ukey1[3] = mk[ 3]; ukey1[4] = mk[ 4]; ukey1[5] = mk[ 5]; ukey1[6] = mk[ 6]; ukey1[7] = mk[ 7]; u32 ukey2[8]; ukey2[0] = mk[ 8]; ukey2[1] = mk[ 9]; ukey2[2] = mk[10]; ukey2[3] = mk[11]; ukey2[4] = mk[12]; ukey2[5] = mk[13]; ukey2[6] = mk[14]; ukey2[7] = mk[15]; u32 ks1[140]; u32 ks2[140]; serpent256_set_key (ks1, ukey1); serpent256_set_key (ks2, ukey2); luks_decrypt_sector_serpent_xts_plain512 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0); } } } void luks_af_sha256_then_serpent_decrypt (__global const luks_t *luks_bufs, __global luks_tmp_t *tmps, u32 *pt_buf) { const u32 key_size = luks_bufs->key_size; const u32 cipher_mode = luks_bufs->cipher_mode; #define BITS_PER_AF (key_size * LUKS_STRIPES) #define BITS_PER_SECTOR (512 * 8) #define SECTOR_PER_AF (BITS_PER_AF / BITS_PER_SECTOR) #define BLOCKS_PER_SECTOR (512 / 16) #define OFFSET_PER_BLOCK (16 / 4) #define OFFSET_PER_SECTOR (BLOCKS_PER_SECTOR * OFFSET_PER_BLOCK) // decrypt AF data and do the AF merge inline u32 mk[16] = { 0 }; if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 ks1[140]; u32 ks2[140]; serpent128_set_key (ks1, ukey); serpent256_set_key (ks2, essivhash); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_cbc_essiv128_mk_sha256 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } luks_decrypt_sector_serpent_cbc_essiv128_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); ukey[4] = swap32_S (tmps->out32[4]); ukey[5] = swap32_S (tmps->out32[5]); ukey[6] = swap32_S (tmps->out32[6]); ukey[7] = swap32_S (tmps->out32[7]); u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 ks1[140]; u32 ks2[140]; serpent256_set_key (ks1, ukey); serpent256_set_key (ks2, essivhash); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_cbc_essiv256_mk_sha256 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } luks_decrypt_sector_serpent_cbc_essiv256_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); u32 ks1[140]; serpent128_set_key (ks1, ukey); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_cbc_plain128_mk_sha256 (luks_bufs->af_src_buf + offset, mk, ks1, sector); } luks_decrypt_sector_serpent_cbc_plain128_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, ks1, sector); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); ukey[4] = swap32_S (tmps->out32[4]); ukey[5] = swap32_S (tmps->out32[5]); ukey[6] = swap32_S (tmps->out32[6]); ukey[7] = swap32_S (tmps->out32[7]); u32 ks1[140]; serpent256_set_key (ks1, ukey); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_cbc_plain256_mk_sha256 (luks_bufs->af_src_buf + offset, mk, ks1, sector); } luks_decrypt_sector_serpent_cbc_plain256_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, ks1, sector); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = swap32_S (tmps->out32[0]); ukey1[1] = swap32_S (tmps->out32[1]); ukey1[2] = swap32_S (tmps->out32[2]); ukey1[3] = swap32_S (tmps->out32[3]); u32 ukey2[4]; ukey2[0] = swap32_S (tmps->out32[4]); ukey2[1] = swap32_S (tmps->out32[5]); ukey2[2] = swap32_S (tmps->out32[6]); ukey2[3] = swap32_S (tmps->out32[7]); u32 ks1[140]; u32 ks2[140]; serpent128_set_key (ks1, ukey1); serpent128_set_key (ks2, ukey2); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_xts_plain256_mk_sha256 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } luks_decrypt_sector_serpent_xts_plain256_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = swap32_S (tmps->out32[ 0]); ukey1[1] = swap32_S (tmps->out32[ 1]); ukey1[2] = swap32_S (tmps->out32[ 2]); ukey1[3] = swap32_S (tmps->out32[ 3]); ukey1[4] = swap32_S (tmps->out32[ 4]); ukey1[5] = swap32_S (tmps->out32[ 5]); ukey1[6] = swap32_S (tmps->out32[ 6]); ukey1[7] = swap32_S (tmps->out32[ 7]); u32 ukey2[8]; ukey2[0] = swap32_S (tmps->out32[ 8]); ukey2[1] = swap32_S (tmps->out32[ 9]); ukey2[2] = swap32_S (tmps->out32[10]); ukey2[3] = swap32_S (tmps->out32[11]); ukey2[4] = swap32_S (tmps->out32[12]); ukey2[5] = swap32_S (tmps->out32[13]); ukey2[6] = swap32_S (tmps->out32[14]); ukey2[7] = swap32_S (tmps->out32[15]); u32 ks1[140]; u32 ks2[140]; serpent256_set_key (ks1, ukey1); serpent256_set_key (ks2, ukey2); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_xts_plain512_mk_sha256 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } luks_decrypt_sector_serpent_xts_plain512_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } } // decrypt payload data if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 ks1[140]; u32 ks2[140]; serpent128_set_key (ks1, ukey); serpent256_set_key (ks2, essivhash); luks_decrypt_sector_serpent_cbc_essiv128 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 ks1[140]; u32 ks2[140]; serpent256_set_key (ks1, ukey); serpent256_set_key (ks2, essivhash); luks_decrypt_sector_serpent_cbc_essiv256 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 ks1[140]; serpent128_set_key (ks1, ukey); luks_decrypt_sector_serpent_cbc_plain128 (luks_bufs->ct_buf, pt_buf, ks1, 0); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 ks1[140]; serpent256_set_key (ks1, ukey); luks_decrypt_sector_serpent_cbc_plain256 (luks_bufs->ct_buf, pt_buf, ks1, 0); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = mk[0]; ukey1[1] = mk[1]; ukey1[2] = mk[2]; ukey1[3] = mk[3]; u32 ukey2[4]; ukey2[0] = mk[4]; ukey2[1] = mk[5]; ukey2[2] = mk[6]; ukey2[3] = mk[7]; u32 ks1[140]; u32 ks2[140]; serpent128_set_key (ks1, ukey1); serpent128_set_key (ks2, ukey2); luks_decrypt_sector_serpent_xts_plain256 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = mk[ 0]; ukey1[1] = mk[ 1]; ukey1[2] = mk[ 2]; ukey1[3] = mk[ 3]; ukey1[4] = mk[ 4]; ukey1[5] = mk[ 5]; ukey1[6] = mk[ 6]; ukey1[7] = mk[ 7]; u32 ukey2[8]; ukey2[0] = mk[ 8]; ukey2[1] = mk[ 9]; ukey2[2] = mk[10]; ukey2[3] = mk[11]; ukey2[4] = mk[12]; ukey2[5] = mk[13]; ukey2[6] = mk[14]; ukey2[7] = mk[15]; u32 ks1[140]; u32 ks2[140]; serpent256_set_key (ks1, ukey1); serpent256_set_key (ks2, ukey2); luks_decrypt_sector_serpent_xts_plain512 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0); } } } void luks_af_sha512_then_serpent_decrypt (__global const luks_t *luks_bufs, __global luks_tmp_t *tmps, u32 *pt_buf) { const u32 key_size = luks_bufs->key_size; const u32 cipher_mode = luks_bufs->cipher_mode; #define BITS_PER_AF (key_size * LUKS_STRIPES) #define BITS_PER_SECTOR (512 * 8) #define SECTOR_PER_AF (BITS_PER_AF / BITS_PER_SECTOR) #define BLOCKS_PER_SECTOR (512 / 16) #define OFFSET_PER_BLOCK (16 / 4) #define OFFSET_PER_SECTOR (BLOCKS_PER_SECTOR * OFFSET_PER_BLOCK) // move data from out64 to out32 tmps->out32[ 0] = l32_from_64_S (tmps->out64[0]); tmps->out32[ 1] = h32_from_64_S (tmps->out64[0]); tmps->out32[ 2] = l32_from_64_S (tmps->out64[1]); tmps->out32[ 3] = h32_from_64_S (tmps->out64[1]); tmps->out32[ 4] = l32_from_64_S (tmps->out64[2]); tmps->out32[ 5] = h32_from_64_S (tmps->out64[2]); tmps->out32[ 6] = l32_from_64_S (tmps->out64[3]); tmps->out32[ 7] = h32_from_64_S (tmps->out64[3]); tmps->out32[ 8] = l32_from_64_S (tmps->out64[4]); tmps->out32[ 9] = h32_from_64_S (tmps->out64[4]); tmps->out32[10] = l32_from_64_S (tmps->out64[5]); tmps->out32[11] = h32_from_64_S (tmps->out64[5]); tmps->out32[12] = l32_from_64_S (tmps->out64[6]); tmps->out32[13] = h32_from_64_S (tmps->out64[6]); tmps->out32[14] = l32_from_64_S (tmps->out64[7]); tmps->out32[15] = h32_from_64_S (tmps->out64[7]); // decrypt AF data and do the AF merge inline u32 mk[16] = { 0 }; if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[1]); ukey[1] = swap32_S (tmps->out32[0]); ukey[2] = swap32_S (tmps->out32[3]); ukey[3] = swap32_S (tmps->out32[2]); u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 ks1[140]; u32 ks2[140]; serpent128_set_key (ks1, ukey); serpent256_set_key (ks2, essivhash); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_cbc_essiv128_mk_sha512 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } luks_decrypt_sector_serpent_cbc_essiv128_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[1]); ukey[1] = swap32_S (tmps->out32[0]); ukey[2] = swap32_S (tmps->out32[3]); ukey[3] = swap32_S (tmps->out32[2]); ukey[4] = swap32_S (tmps->out32[5]); ukey[5] = swap32_S (tmps->out32[4]); ukey[6] = swap32_S (tmps->out32[7]); ukey[7] = swap32_S (tmps->out32[6]); u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 ks1[140]; u32 ks2[140]; serpent256_set_key (ks1, ukey); serpent256_set_key (ks2, essivhash); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_cbc_essiv256_mk_sha512 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } luks_decrypt_sector_serpent_cbc_essiv256_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[1]); ukey[1] = swap32_S (tmps->out32[0]); ukey[2] = swap32_S (tmps->out32[3]); ukey[3] = swap32_S (tmps->out32[2]); u32 ks1[140]; serpent128_set_key (ks1, ukey); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_cbc_plain128_mk_sha512 (luks_bufs->af_src_buf + offset, mk, ks1, sector); } luks_decrypt_sector_serpent_cbc_plain128_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, ks1, sector); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[1]); ukey[1] = swap32_S (tmps->out32[0]); ukey[2] = swap32_S (tmps->out32[3]); ukey[3] = swap32_S (tmps->out32[2]); ukey[4] = swap32_S (tmps->out32[5]); ukey[5] = swap32_S (tmps->out32[4]); ukey[6] = swap32_S (tmps->out32[7]); ukey[7] = swap32_S (tmps->out32[6]); u32 ks1[140]; serpent256_set_key (ks1, ukey); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_cbc_plain256_mk_sha512 (luks_bufs->af_src_buf + offset, mk, ks1, sector); } luks_decrypt_sector_serpent_cbc_plain256_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, ks1, sector); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = swap32_S (tmps->out32[1]); ukey1[1] = swap32_S (tmps->out32[0]); ukey1[2] = swap32_S (tmps->out32[3]); ukey1[3] = swap32_S (tmps->out32[2]); u32 ukey2[4]; ukey2[0] = swap32_S (tmps->out32[5]); ukey2[1] = swap32_S (tmps->out32[4]); ukey2[2] = swap32_S (tmps->out32[7]); ukey2[3] = swap32_S (tmps->out32[6]); u32 ks1[140]; u32 ks2[140]; serpent128_set_key (ks1, ukey1); serpent128_set_key (ks2, ukey2); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_xts_plain256_mk_sha512 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } luks_decrypt_sector_serpent_xts_plain256_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = swap32_S (tmps->out32[ 1]); ukey1[1] = swap32_S (tmps->out32[ 0]); ukey1[2] = swap32_S (tmps->out32[ 3]); ukey1[3] = swap32_S (tmps->out32[ 2]); ukey1[4] = swap32_S (tmps->out32[ 5]); ukey1[5] = swap32_S (tmps->out32[ 4]); ukey1[6] = swap32_S (tmps->out32[ 7]); ukey1[7] = swap32_S (tmps->out32[ 6]); u32 ukey2[8]; ukey2[0] = swap32_S (tmps->out32[ 9]); ukey2[1] = swap32_S (tmps->out32[ 8]); ukey2[2] = swap32_S (tmps->out32[11]); ukey2[3] = swap32_S (tmps->out32[10]); ukey2[4] = swap32_S (tmps->out32[13]); ukey2[5] = swap32_S (tmps->out32[12]); ukey2[6] = swap32_S (tmps->out32[15]); ukey2[7] = swap32_S (tmps->out32[14]); u32 ks1[140]; u32 ks2[140]; serpent256_set_key (ks1, ukey1); serpent256_set_key (ks2, ukey2); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_xts_plain512_mk_sha512 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } luks_decrypt_sector_serpent_xts_plain512_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } } // decrypt payload data if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 ks1[140]; u32 ks2[140]; serpent128_set_key (ks1, ukey); serpent256_set_key (ks2, essivhash); luks_decrypt_sector_serpent_cbc_essiv128 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 ks1[140]; u32 ks2[140]; serpent256_set_key (ks1, ukey); serpent256_set_key (ks2, essivhash); luks_decrypt_sector_serpent_cbc_essiv256 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 ks1[140]; serpent128_set_key (ks1, ukey); luks_decrypt_sector_serpent_cbc_plain128 (luks_bufs->ct_buf, pt_buf, ks1, 0); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 ks1[140]; serpent256_set_key (ks1, ukey); luks_decrypt_sector_serpent_cbc_plain256 (luks_bufs->ct_buf, pt_buf, ks1, 0); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = mk[0]; ukey1[1] = mk[1]; ukey1[2] = mk[2]; ukey1[3] = mk[3]; u32 ukey2[4]; ukey2[0] = mk[4]; ukey2[1] = mk[5]; ukey2[2] = mk[6]; ukey2[3] = mk[7]; u32 ks1[140]; u32 ks2[140]; serpent128_set_key (ks1, ukey1); serpent128_set_key (ks2, ukey2); luks_decrypt_sector_serpent_xts_plain256 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = mk[ 0]; ukey1[1] = mk[ 1]; ukey1[2] = mk[ 2]; ukey1[3] = mk[ 3]; ukey1[4] = mk[ 4]; ukey1[5] = mk[ 5]; ukey1[6] = mk[ 6]; ukey1[7] = mk[ 7]; u32 ukey2[8]; ukey2[0] = mk[ 8]; ukey2[1] = mk[ 9]; ukey2[2] = mk[10]; ukey2[3] = mk[11]; ukey2[4] = mk[12]; ukey2[5] = mk[13]; ukey2[6] = mk[14]; ukey2[7] = mk[15]; u32 ks1[140]; u32 ks2[140]; serpent256_set_key (ks1, ukey1); serpent256_set_key (ks2, ukey2); luks_decrypt_sector_serpent_xts_plain512 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0); } } } void luks_af_ripemd160_then_serpent_decrypt (__global const luks_t *luks_bufs, __global luks_tmp_t *tmps, u32 *pt_buf) { const u32 key_size = luks_bufs->key_size; const u32 cipher_mode = luks_bufs->cipher_mode; #define BITS_PER_AF (key_size * LUKS_STRIPES) #define BITS_PER_SECTOR (512 * 8) #define SECTOR_PER_AF (BITS_PER_AF / BITS_PER_SECTOR) #define BLOCKS_PER_SECTOR (512 / 16) #define OFFSET_PER_BLOCK (16 / 4) #define OFFSET_PER_SECTOR (BLOCKS_PER_SECTOR * OFFSET_PER_BLOCK) // decrypt AF data and do the AF merge inline u32 mk[16] = { 0 }; if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = tmps->out32[0]; ukey[1] = tmps->out32[1]; ukey[2] = tmps->out32[2]; ukey[3] = tmps->out32[3]; u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 ks1[140]; u32 ks2[140]; serpent128_set_key (ks1, ukey); serpent256_set_key (ks2, essivhash); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_cbc_essiv128_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } luks_decrypt_sector_serpent_cbc_essiv128_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = tmps->out32[0]; ukey[1] = tmps->out32[1]; ukey[2] = tmps->out32[2]; ukey[3] = tmps->out32[3]; ukey[4] = tmps->out32[4]; ukey[5] = tmps->out32[5]; ukey[6] = tmps->out32[6]; ukey[7] = tmps->out32[7]; u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 ks1[140]; u32 ks2[140]; serpent256_set_key (ks1, ukey); serpent256_set_key (ks2, essivhash); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_cbc_essiv256_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } luks_decrypt_sector_serpent_cbc_essiv256_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = tmps->out32[0]; ukey[1] = tmps->out32[1]; ukey[2] = tmps->out32[2]; ukey[3] = tmps->out32[3]; u32 ks1[140]; serpent128_set_key (ks1, ukey); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_cbc_plain128_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, ks1, sector); } luks_decrypt_sector_serpent_cbc_plain128_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, ks1, sector); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = tmps->out32[0]; ukey[1] = tmps->out32[1]; ukey[2] = tmps->out32[2]; ukey[3] = tmps->out32[3]; ukey[4] = tmps->out32[4]; ukey[5] = tmps->out32[5]; ukey[6] = tmps->out32[6]; ukey[7] = tmps->out32[7]; u32 ks1[140]; serpent256_set_key (ks1, ukey); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_cbc_plain256_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, ks1, sector); } luks_decrypt_sector_serpent_cbc_plain256_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, ks1, sector); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = tmps->out32[0]; ukey1[1] = tmps->out32[1]; ukey1[2] = tmps->out32[2]; ukey1[3] = tmps->out32[3]; u32 ukey2[4]; ukey2[0] = tmps->out32[4]; ukey2[1] = tmps->out32[5]; ukey2[2] = tmps->out32[6]; ukey2[3] = tmps->out32[7]; u32 ks1[140]; u32 ks2[140]; serpent128_set_key (ks1, ukey1); serpent128_set_key (ks2, ukey2); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_xts_plain256_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } luks_decrypt_sector_serpent_xts_plain256_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = tmps->out32[ 0]; ukey1[1] = tmps->out32[ 1]; ukey1[2] = tmps->out32[ 2]; ukey1[3] = tmps->out32[ 3]; ukey1[4] = tmps->out32[ 4]; ukey1[5] = tmps->out32[ 5]; ukey1[6] = tmps->out32[ 6]; ukey1[7] = tmps->out32[ 7]; u32 ukey2[8]; ukey2[0] = tmps->out32[ 8]; ukey2[1] = tmps->out32[ 9]; ukey2[2] = tmps->out32[10]; ukey2[3] = tmps->out32[11]; ukey2[4] = tmps->out32[12]; ukey2[5] = tmps->out32[13]; ukey2[6] = tmps->out32[14]; ukey2[7] = tmps->out32[15]; u32 ks1[140]; u32 ks2[140]; serpent256_set_key (ks1, ukey1); serpent256_set_key (ks2, ukey2); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_serpent_xts_plain512_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } luks_decrypt_sector_serpent_xts_plain512_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, ks1, ks2, sector); } } // decrypt payload data if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 ks1[140]; u32 ks2[140]; serpent128_set_key (ks1, ukey); serpent256_set_key (ks2, essivhash); luks_decrypt_sector_serpent_cbc_essiv128 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 ks1[140]; u32 ks2[140]; serpent256_set_key (ks1, ukey); serpent256_set_key (ks2, essivhash); luks_decrypt_sector_serpent_cbc_essiv256 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 ks1[140]; serpent128_set_key (ks1, ukey); luks_decrypt_sector_serpent_cbc_plain128 (luks_bufs->ct_buf, pt_buf, ks1, 0); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 ks1[140]; serpent256_set_key (ks1, ukey); luks_decrypt_sector_serpent_cbc_plain256 (luks_bufs->ct_buf, pt_buf, ks1, 0); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = mk[0]; ukey1[1] = mk[1]; ukey1[2] = mk[2]; ukey1[3] = mk[3]; u32 ukey2[4]; ukey2[0] = mk[4]; ukey2[1] = mk[5]; ukey2[2] = mk[6]; ukey2[3] = mk[7]; u32 ks1[140]; u32 ks2[140]; serpent128_set_key (ks1, ukey1); serpent128_set_key (ks2, ukey2); luks_decrypt_sector_serpent_xts_plain256 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = mk[ 0]; ukey1[1] = mk[ 1]; ukey1[2] = mk[ 2]; ukey1[3] = mk[ 3]; ukey1[4] = mk[ 4]; ukey1[5] = mk[ 5]; ukey1[6] = mk[ 6]; ukey1[7] = mk[ 7]; u32 ukey2[8]; ukey2[0] = mk[ 8]; ukey2[1] = mk[ 9]; ukey2[2] = mk[10]; ukey2[3] = mk[11]; ukey2[4] = mk[12]; ukey2[5] = mk[13]; ukey2[6] = mk[14]; ukey2[7] = mk[15]; u32 ks1[140]; u32 ks2[140]; serpent256_set_key (ks1, ukey1); serpent256_set_key (ks2, ukey2); luks_decrypt_sector_serpent_xts_plain512 (luks_bufs->ct_buf, pt_buf, ks1, ks2, 0); } } } hashcat-4.0.1/OpenCL/inc_luks_twofish.cl000066400000000000000000002736431320027462700201630ustar00rootroot00000000000000 // cbc-essiv void twofish128_decrypt_cbc (const u32 *sk1, const u32 *lk1, const u32 *in, u32 *out, u32 *essiv) { twofish128_decrypt (sk1, lk1, in, out); out[0] ^= essiv[0]; out[1] ^= essiv[1]; out[2] ^= essiv[2]; out[3] ^= essiv[3]; essiv[0] = in[0]; essiv[1] = in[1]; essiv[2] = in[2]; essiv[3] = in[3]; } void twofish256_decrypt_cbc (const u32 *sk1, const u32 *lk1, const u32 *in, u32 *out, u32 *essiv) { twofish256_decrypt (sk1, lk1, in, out); out[0] ^= essiv[0]; out[1] ^= essiv[1]; out[2] ^= essiv[2]; out[3] ^= essiv[3]; essiv[0] = in[0]; essiv[1] = in[1]; essiv[2] = in[2]; essiv[3] = in[3]; } void luks_decrypt_sector_twofish_cbc_essiv128 (__global const u32 *in, u32 *out, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; int idx_out = 0; for (int i = 0; i < 32; i++) { for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_twofish_cbc_essiv128_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse16 (mk); } } void luks_decrypt_sector_twofish_cbc_essiv128_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse16 (mk); } // this one has no AF_sha1_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_cbc_essiv128_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse16 (mk); } } void luks_decrypt_sector_twofish_cbc_essiv128_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse16 (mk); } // this one has no AF_sha256_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_cbc_essiv128_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse16 (mk); } } void luks_decrypt_sector_twofish_cbc_essiv128_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse16 (mk); } // this one has no AF_sha512_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_cbc_essiv128_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse16 (mk); } } void luks_decrypt_sector_twofish_cbc_essiv128_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse16 (mk); } // this one has no AF_ripemd160_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_cbc_essiv256 (__global const u32 *in, u32 *out, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; int idx_out = 0; for (int i = 0; i < 16; i++) { for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_twofish_cbc_essiv256_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } } void luks_decrypt_sector_twofish_cbc_essiv256_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } // this one has no AF_sha1_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_cbc_essiv256_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } } void luks_decrypt_sector_twofish_cbc_essiv256_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } // this one has no AF_sha256_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_cbc_essiv256_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } } void luks_decrypt_sector_twofish_cbc_essiv256_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } // this one has no AF_sha512_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_cbc_essiv256_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } } void luks_decrypt_sector_twofish_cbc_essiv256_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 essiv[4]; twofish256_encrypt (sk2, lk2, S, essiv); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } // this one has no AF_ripemd160_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, essiv); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } // cbc-plain void luks_decrypt_sector_twofish_cbc_plain128 (__global const u32 *in, u32 *out, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; int idx_out = 0; for (int i = 0; i < 32; i++) { for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, S); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_twofish_cbc_plain128_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse16 (mk); } } void luks_decrypt_sector_twofish_cbc_plain128_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse16 (mk); } // this one has no AF_sha1_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_cbc_plain128_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse16 (mk); } } void luks_decrypt_sector_twofish_cbc_plain128_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse16 (mk); } // this one has no AF_sha256_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_cbc_plain128_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse16 (mk); } } void luks_decrypt_sector_twofish_cbc_plain128_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse16 (mk); } // this one has no AF_sha512_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_cbc_plain128_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse16 (mk); } } void luks_decrypt_sector_twofish_cbc_plain128_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 32 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse16 (mk); } // this one has no AF_ripemd160_diffuse16() int idx_mk = 0; for (int block = 0; block < 1; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_cbc_plain256 (__global const u32 *in, u32 *out, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; int idx_out = 0; for (int i = 0; i < 16; i++) { for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, S); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_twofish_cbc_plain256_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } } void luks_decrypt_sector_twofish_cbc_plain256_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } // this one has no AF_sha1_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_cbc_plain256_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } } void luks_decrypt_sector_twofish_cbc_plain256_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } // this one has no AF_sha256_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_cbc_plain256_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } } void luks_decrypt_sector_twofish_cbc_plain256_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } // this one has no AF_sha512_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_cbc_plain256_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } } void luks_decrypt_sector_twofish_cbc_plain256_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } // this one has no AF_ripemd160_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_cbc (sk1, lk1, data_in, data_out, S); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } // xts-plain void twofish128_decrypt_xts (const u32 *sk1, const u32 *lk1, const u32 *in, u32 *out, u32 *T) { out[0] = in[0]; out[1] = in[1]; out[2] = in[2]; out[3] = in[3]; out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; twofish128_decrypt (sk1, lk1, out, out); out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; xts_mul2 (T, T); } void twofish256_decrypt_xts (const u32 *sk1, const u32 *lk1, const u32 *in, u32 *out, u32 *T) { out[0] = in[0]; out[1] = in[1]; out[2] = in[2]; out[3] = in[3]; out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; twofish256_decrypt (sk1, lk1, out, out); out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; xts_mul2 (T, T); } void luks_decrypt_sector_twofish_xts_plain256 (__global const u32 *in, u32 *out, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish128_encrypt (sk2, lk2, S, T); int idx_in = 0; int idx_out = 0; for (int i = 0; i < 16; i++) { for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_xts (sk1, lk1, data_in, data_out, T); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_twofish_xts_plain256_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish128_encrypt (sk2, lk2, S, T); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } } void luks_decrypt_sector_twofish_xts_plain256_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish128_encrypt (sk2, lk2, S, T); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse32 (mk); } // this one has no AF_sha1_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_xts_plain256_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish128_encrypt (sk2, lk2, S, T); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } } void luks_decrypt_sector_twofish_xts_plain256_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish128_encrypt (sk2, lk2, S, T); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse32 (mk); } // this one has no AF_sha256_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_xts_plain256_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish128_encrypt (sk2, lk2, S, T); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } } void luks_decrypt_sector_twofish_xts_plain256_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish128_encrypt (sk2, lk2, S, T); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse32 (mk); } // this one has no AF_sha512_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_xts_plain256_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish128_encrypt (sk2, lk2, S, T); int idx_in = 0; for (int i = 0; i < 16; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } } void luks_decrypt_sector_twofish_xts_plain256_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish128_encrypt (sk2, lk2, S, T); int idx_in = 0; for (int i = 0; i < 16 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse32 (mk); } // this one has no AF_ripemd160_diffuse32() int idx_mk = 0; for (int block = 0; block < 2; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish128_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_xts_plain512 (__global const u32 *in, u32 *out, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish256_encrypt (sk2, lk2, S, T); int idx_in = 0; int idx_out = 0; for (int i = 0; i < 8; i++) { for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_xts (sk1, lk1, data_in, data_out, T); out[idx_out++] = data_out[0]; out[idx_out++] = data_out[1]; out[idx_out++] = data_out[2]; out[idx_out++] = data_out[3]; } } } void luks_decrypt_sector_twofish_xts_plain512_mk_sha1 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish256_encrypt (sk2, lk2, S, T); int idx_in = 0; for (int i = 0; i < 8; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse64 (mk); } } void luks_decrypt_sector_twofish_xts_plain512_mk_sha1_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish256_encrypt (sk2, lk2, S, T); int idx_in = 0; for (int i = 0; i < 8 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha1_diffuse64 (mk); } // this one has no AF_sha1_diffuse64() int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_xts_plain512_mk_sha256 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish256_encrypt (sk2, lk2, S, T); int idx_in = 0; for (int i = 0; i < 8; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse64 (mk); } } void luks_decrypt_sector_twofish_xts_plain512_mk_sha256_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish256_encrypt (sk2, lk2, S, T); int idx_in = 0; for (int i = 0; i < 8 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha256_diffuse64 (mk); } // this one has no AF_sha256_diffuse64() int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_xts_plain512_mk_sha512 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish256_encrypt (sk2, lk2, S, T); int idx_in = 0; for (int i = 0; i < 8; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse64 (mk); } } void luks_decrypt_sector_twofish_xts_plain512_mk_sha512_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish256_encrypt (sk2, lk2, S, T); int idx_in = 0; for (int i = 0; i < 8 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_sha512_diffuse64 (mk); } // this one has no AF_sha512_diffuse64() int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } void luks_decrypt_sector_twofish_xts_plain512_mk_ripemd160 (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish256_encrypt (sk2, lk2, S, T); int idx_in = 0; for (int i = 0; i < 8; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse64 (mk); } } void luks_decrypt_sector_twofish_xts_plain512_mk_ripemd160_final (__global const u32 *in, u32 *mk, const u32 *sk1, const u32 *lk1, const u32 *sk2, const u32 *lk2, const u32 sector) { u32 S[4] = { sector, 0, 0, 0 }; u32 T[4]; twofish256_encrypt (sk2, lk2, S, T); int idx_in = 0; for (int i = 0; i < 8 - 1; i++) { int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } AF_ripemd160_diffuse64 (mk); } // this one has no AF_ripemd160_diffuse64() int idx_mk = 0; for (int block = 0; block < 4; block++) { u32 data_in[4]; data_in[0] = in[idx_in++]; data_in[1] = in[idx_in++]; data_in[2] = in[idx_in++]; data_in[3] = in[idx_in++]; u32 data_out[4]; twofish256_decrypt_xts (sk1, lk1, data_in, data_out, T); mk[idx_mk++] ^= data_out[0]; mk[idx_mk++] ^= data_out[1]; mk[idx_mk++] ^= data_out[2]; mk[idx_mk++] ^= data_out[3]; } } // luks helper void luks_af_sha1_then_twofish_decrypt (__global const luks_t *luks_bufs, __global luks_tmp_t *tmps, u32 *pt_buf) { const u32 key_size = luks_bufs->key_size; const u32 cipher_mode = luks_bufs->cipher_mode; #define BITS_PER_AF (key_size * LUKS_STRIPES) #define BITS_PER_SECTOR (512 * 8) #define SECTOR_PER_AF (BITS_PER_AF / BITS_PER_SECTOR) #define BLOCKS_PER_SECTOR (512 / 16) #define OFFSET_PER_BLOCK (16 / 4) #define OFFSET_PER_SECTOR (BLOCKS_PER_SECTOR * OFFSET_PER_BLOCK) // decrypt AF data and do the AF merge inline u32 mk[16] = { 0 }; if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish128_set_key (sk1, lk1, ukey); twofish256_set_key (sk2, lk2, essivhash); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_cbc_essiv128_mk_sha1 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } luks_decrypt_sector_twofish_cbc_essiv128_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); ukey[4] = swap32_S (tmps->out32[4]); ukey[5] = swap32_S (tmps->out32[5]); ukey[6] = swap32_S (tmps->out32[6]); ukey[7] = swap32_S (tmps->out32[7]); u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish256_set_key (sk1, lk1, ukey); twofish256_set_key (sk2, lk2, essivhash); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_cbc_essiv256_mk_sha1 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } luks_decrypt_sector_twofish_cbc_essiv256_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); u32 sk1[4]; u32 lk1[40]; twofish128_set_key (sk1, lk1, ukey); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_cbc_plain128_mk_sha1 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sector); } luks_decrypt_sector_twofish_cbc_plain128_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sector); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); ukey[4] = swap32_S (tmps->out32[4]); ukey[5] = swap32_S (tmps->out32[5]); ukey[6] = swap32_S (tmps->out32[6]); ukey[7] = swap32_S (tmps->out32[7]); u32 sk1[4]; u32 lk1[40]; twofish256_set_key (sk1, lk1, ukey); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_cbc_plain256_mk_sha1 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sector); } luks_decrypt_sector_twofish_cbc_plain256_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sector); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = swap32_S (tmps->out32[0]); ukey1[1] = swap32_S (tmps->out32[1]); ukey1[2] = swap32_S (tmps->out32[2]); ukey1[3] = swap32_S (tmps->out32[3]); u32 ukey2[4]; ukey2[0] = swap32_S (tmps->out32[4]); ukey2[1] = swap32_S (tmps->out32[5]); ukey2[2] = swap32_S (tmps->out32[6]); ukey2[3] = swap32_S (tmps->out32[7]); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish128_set_key (sk1, lk1, ukey1); twofish128_set_key (sk2, lk2, ukey2); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_xts_plain256_mk_sha1 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } luks_decrypt_sector_twofish_xts_plain256_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = swap32_S (tmps->out32[ 0]); ukey1[1] = swap32_S (tmps->out32[ 1]); ukey1[2] = swap32_S (tmps->out32[ 2]); ukey1[3] = swap32_S (tmps->out32[ 3]); ukey1[4] = swap32_S (tmps->out32[ 4]); ukey1[5] = swap32_S (tmps->out32[ 5]); ukey1[6] = swap32_S (tmps->out32[ 6]); ukey1[7] = swap32_S (tmps->out32[ 7]); u32 ukey2[8]; ukey2[0] = swap32_S (tmps->out32[ 8]); ukey2[1] = swap32_S (tmps->out32[ 9]); ukey2[2] = swap32_S (tmps->out32[10]); ukey2[3] = swap32_S (tmps->out32[11]); ukey2[4] = swap32_S (tmps->out32[12]); ukey2[5] = swap32_S (tmps->out32[13]); ukey2[6] = swap32_S (tmps->out32[14]); ukey2[7] = swap32_S (tmps->out32[15]); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish256_set_key (sk1, lk1, ukey1); twofish256_set_key (sk2, lk2, ukey2); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_xts_plain512_mk_sha1 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } luks_decrypt_sector_twofish_xts_plain512_mk_sha1_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } } // decrypt payload data if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish128_set_key (sk1, lk1, ukey); twofish256_set_key (sk2, lk2, essivhash); luks_decrypt_sector_twofish_cbc_essiv128 (luks_bufs->ct_buf, pt_buf, sk1, lk1, sk2, lk2, 0); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish256_set_key (sk1, lk1, ukey); twofish256_set_key (sk2, lk2, essivhash); luks_decrypt_sector_twofish_cbc_essiv256 (luks_bufs->ct_buf, pt_buf, sk1, lk1, sk2, lk2, 0); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 sk1[4]; u32 lk1[40]; twofish128_set_key (sk1, lk1, ukey); luks_decrypt_sector_twofish_cbc_plain128 (luks_bufs->ct_buf, pt_buf, sk1, lk1, 0); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 sk1[4]; u32 lk1[40]; twofish256_set_key (sk1, lk1, ukey); luks_decrypt_sector_twofish_cbc_plain256 (luks_bufs->ct_buf, pt_buf, sk1, lk1, 0); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = mk[0]; ukey1[1] = mk[1]; ukey1[2] = mk[2]; ukey1[3] = mk[3]; u32 ukey2[4]; ukey2[0] = mk[4]; ukey2[1] = mk[5]; ukey2[2] = mk[6]; ukey2[3] = mk[7]; u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish128_set_key (sk1, lk1, ukey1); twofish128_set_key (sk2, lk2, ukey2); luks_decrypt_sector_twofish_xts_plain256 (luks_bufs->ct_buf, pt_buf, sk1, lk1, sk2, lk2, 0); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = mk[ 0]; ukey1[1] = mk[ 1]; ukey1[2] = mk[ 2]; ukey1[3] = mk[ 3]; ukey1[4] = mk[ 4]; ukey1[5] = mk[ 5]; ukey1[6] = mk[ 6]; ukey1[7] = mk[ 7]; u32 ukey2[8]; ukey2[0] = mk[ 8]; ukey2[1] = mk[ 9]; ukey2[2] = mk[10]; ukey2[3] = mk[11]; ukey2[4] = mk[12]; ukey2[5] = mk[13]; ukey2[6] = mk[14]; ukey2[7] = mk[15]; u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish256_set_key (sk1, lk1, ukey1); twofish256_set_key (sk2, lk2, ukey2); luks_decrypt_sector_twofish_xts_plain512 (luks_bufs->ct_buf, pt_buf, sk1, lk1, sk2, lk2, 0); } } } void luks_af_sha256_then_twofish_decrypt (__global const luks_t *luks_bufs, __global luks_tmp_t *tmps, u32 *pt_buf) { const u32 key_size = luks_bufs->key_size; const u32 cipher_mode = luks_bufs->cipher_mode; #define BITS_PER_AF (key_size * LUKS_STRIPES) #define BITS_PER_SECTOR (512 * 8) #define SECTOR_PER_AF (BITS_PER_AF / BITS_PER_SECTOR) #define BLOCKS_PER_SECTOR (512 / 16) #define OFFSET_PER_BLOCK (16 / 4) #define OFFSET_PER_SECTOR (BLOCKS_PER_SECTOR * OFFSET_PER_BLOCK) // decrypt AF data and do the AF merge inline u32 mk[16] = { 0 }; if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish128_set_key (sk1, lk1, ukey); twofish256_set_key (sk2, lk2, essivhash); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_cbc_essiv128_mk_sha256 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } luks_decrypt_sector_twofish_cbc_essiv128_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); ukey[4] = swap32_S (tmps->out32[4]); ukey[5] = swap32_S (tmps->out32[5]); ukey[6] = swap32_S (tmps->out32[6]); ukey[7] = swap32_S (tmps->out32[7]); u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish256_set_key (sk1, lk1, ukey); twofish256_set_key (sk2, lk2, essivhash); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_cbc_essiv256_mk_sha256 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } luks_decrypt_sector_twofish_cbc_essiv256_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); u32 sk1[4]; u32 lk1[40]; twofish128_set_key (sk1, lk1, ukey); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_cbc_plain128_mk_sha256 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sector); } luks_decrypt_sector_twofish_cbc_plain128_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sector); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[0]); ukey[1] = swap32_S (tmps->out32[1]); ukey[2] = swap32_S (tmps->out32[2]); ukey[3] = swap32_S (tmps->out32[3]); ukey[4] = swap32_S (tmps->out32[4]); ukey[5] = swap32_S (tmps->out32[5]); ukey[6] = swap32_S (tmps->out32[6]); ukey[7] = swap32_S (tmps->out32[7]); u32 sk1[4]; u32 lk1[40]; twofish256_set_key (sk1, lk1, ukey); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_cbc_plain256_mk_sha256 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sector); } luks_decrypt_sector_twofish_cbc_plain256_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sector); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = swap32_S (tmps->out32[0]); ukey1[1] = swap32_S (tmps->out32[1]); ukey1[2] = swap32_S (tmps->out32[2]); ukey1[3] = swap32_S (tmps->out32[3]); u32 ukey2[4]; ukey2[0] = swap32_S (tmps->out32[4]); ukey2[1] = swap32_S (tmps->out32[5]); ukey2[2] = swap32_S (tmps->out32[6]); ukey2[3] = swap32_S (tmps->out32[7]); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish128_set_key (sk1, lk1, ukey1); twofish128_set_key (sk2, lk2, ukey2); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_xts_plain256_mk_sha256 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } luks_decrypt_sector_twofish_xts_plain256_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = swap32_S (tmps->out32[ 0]); ukey1[1] = swap32_S (tmps->out32[ 1]); ukey1[2] = swap32_S (tmps->out32[ 2]); ukey1[3] = swap32_S (tmps->out32[ 3]); ukey1[4] = swap32_S (tmps->out32[ 4]); ukey1[5] = swap32_S (tmps->out32[ 5]); ukey1[6] = swap32_S (tmps->out32[ 6]); ukey1[7] = swap32_S (tmps->out32[ 7]); u32 ukey2[8]; ukey2[0] = swap32_S (tmps->out32[ 8]); ukey2[1] = swap32_S (tmps->out32[ 9]); ukey2[2] = swap32_S (tmps->out32[10]); ukey2[3] = swap32_S (tmps->out32[11]); ukey2[4] = swap32_S (tmps->out32[12]); ukey2[5] = swap32_S (tmps->out32[13]); ukey2[6] = swap32_S (tmps->out32[14]); ukey2[7] = swap32_S (tmps->out32[15]); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish256_set_key (sk1, lk1, ukey1); twofish256_set_key (sk2, lk2, ukey2); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_xts_plain512_mk_sha256 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } luks_decrypt_sector_twofish_xts_plain512_mk_sha256_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } } // decrypt payload data if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish128_set_key (sk1, lk1, ukey); twofish256_set_key (sk2, lk2, essivhash); luks_decrypt_sector_twofish_cbc_essiv128 (luks_bufs->ct_buf, pt_buf, sk1, lk1, sk2, lk2, 0); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish256_set_key (sk1, lk1, ukey); twofish256_set_key (sk2, lk2, essivhash); luks_decrypt_sector_twofish_cbc_essiv256 (luks_bufs->ct_buf, pt_buf, sk1, lk1, sk2, lk2, 0); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 sk1[4]; u32 lk1[40]; twofish128_set_key (sk1, lk1, ukey); luks_decrypt_sector_twofish_cbc_plain128 (luks_bufs->ct_buf, pt_buf, sk1, lk1, 0); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 sk1[4]; u32 lk1[40]; twofish256_set_key (sk1, lk1, ukey); luks_decrypt_sector_twofish_cbc_plain256 (luks_bufs->ct_buf, pt_buf, sk1, lk1, 0); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = mk[0]; ukey1[1] = mk[1]; ukey1[2] = mk[2]; ukey1[3] = mk[3]; u32 ukey2[4]; ukey2[0] = mk[4]; ukey2[1] = mk[5]; ukey2[2] = mk[6]; ukey2[3] = mk[7]; u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish128_set_key (sk1, lk1, ukey1); twofish128_set_key (sk2, lk2, ukey2); luks_decrypt_sector_twofish_xts_plain256 (luks_bufs->ct_buf, pt_buf, sk1, lk1, sk2, lk2, 0); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = mk[ 0]; ukey1[1] = mk[ 1]; ukey1[2] = mk[ 2]; ukey1[3] = mk[ 3]; ukey1[4] = mk[ 4]; ukey1[5] = mk[ 5]; ukey1[6] = mk[ 6]; ukey1[7] = mk[ 7]; u32 ukey2[8]; ukey2[0] = mk[ 8]; ukey2[1] = mk[ 9]; ukey2[2] = mk[10]; ukey2[3] = mk[11]; ukey2[4] = mk[12]; ukey2[5] = mk[13]; ukey2[6] = mk[14]; ukey2[7] = mk[15]; u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish256_set_key (sk1, lk1, ukey1); twofish256_set_key (sk2, lk2, ukey2); luks_decrypt_sector_twofish_xts_plain512 (luks_bufs->ct_buf, pt_buf, sk1, lk1, sk2, lk2, 0); } } } void luks_af_sha512_then_twofish_decrypt (__global const luks_t *luks_bufs, __global luks_tmp_t *tmps, u32 *pt_buf) { const u32 key_size = luks_bufs->key_size; const u32 cipher_mode = luks_bufs->cipher_mode; #define BITS_PER_AF (key_size * LUKS_STRIPES) #define BITS_PER_SECTOR (512 * 8) #define SECTOR_PER_AF (BITS_PER_AF / BITS_PER_SECTOR) #define BLOCKS_PER_SECTOR (512 / 16) #define OFFSET_PER_BLOCK (16 / 4) #define OFFSET_PER_SECTOR (BLOCKS_PER_SECTOR * OFFSET_PER_BLOCK) // move data from out64 to out32 tmps->out32[ 0] = l32_from_64_S (tmps->out64[0]); tmps->out32[ 1] = h32_from_64_S (tmps->out64[0]); tmps->out32[ 2] = l32_from_64_S (tmps->out64[1]); tmps->out32[ 3] = h32_from_64_S (tmps->out64[1]); tmps->out32[ 4] = l32_from_64_S (tmps->out64[2]); tmps->out32[ 5] = h32_from_64_S (tmps->out64[2]); tmps->out32[ 6] = l32_from_64_S (tmps->out64[3]); tmps->out32[ 7] = h32_from_64_S (tmps->out64[3]); tmps->out32[ 8] = l32_from_64_S (tmps->out64[4]); tmps->out32[ 9] = h32_from_64_S (tmps->out64[4]); tmps->out32[10] = l32_from_64_S (tmps->out64[5]); tmps->out32[11] = h32_from_64_S (tmps->out64[5]); tmps->out32[12] = l32_from_64_S (tmps->out64[6]); tmps->out32[13] = h32_from_64_S (tmps->out64[6]); tmps->out32[14] = l32_from_64_S (tmps->out64[7]); tmps->out32[15] = h32_from_64_S (tmps->out64[7]); // decrypt AF data and do the AF merge inline u32 mk[16] = { 0 }; if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[1]); ukey[1] = swap32_S (tmps->out32[0]); ukey[2] = swap32_S (tmps->out32[3]); ukey[3] = swap32_S (tmps->out32[2]); u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish128_set_key (sk1, lk1, ukey); twofish256_set_key (sk2, lk2, essivhash); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_cbc_essiv128_mk_sha512 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } luks_decrypt_sector_twofish_cbc_essiv128_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[1]); ukey[1] = swap32_S (tmps->out32[0]); ukey[2] = swap32_S (tmps->out32[3]); ukey[3] = swap32_S (tmps->out32[2]); ukey[4] = swap32_S (tmps->out32[5]); ukey[5] = swap32_S (tmps->out32[4]); ukey[6] = swap32_S (tmps->out32[7]); ukey[7] = swap32_S (tmps->out32[6]); u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish256_set_key (sk1, lk1, ukey); twofish256_set_key (sk2, lk2, essivhash); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_cbc_essiv256_mk_sha512 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } luks_decrypt_sector_twofish_cbc_essiv256_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = swap32_S (tmps->out32[1]); ukey[1] = swap32_S (tmps->out32[0]); ukey[2] = swap32_S (tmps->out32[3]); ukey[3] = swap32_S (tmps->out32[2]); u32 sk1[4]; u32 lk1[40]; twofish128_set_key (sk1, lk1, ukey); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_cbc_plain128_mk_sha512 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sector); } luks_decrypt_sector_twofish_cbc_plain128_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sector); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = swap32_S (tmps->out32[1]); ukey[1] = swap32_S (tmps->out32[0]); ukey[2] = swap32_S (tmps->out32[3]); ukey[3] = swap32_S (tmps->out32[2]); ukey[4] = swap32_S (tmps->out32[5]); ukey[5] = swap32_S (tmps->out32[4]); ukey[6] = swap32_S (tmps->out32[7]); ukey[7] = swap32_S (tmps->out32[6]); u32 sk1[4]; u32 lk1[40]; twofish256_set_key (sk1, lk1, ukey); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_cbc_plain256_mk_sha512 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sector); } luks_decrypt_sector_twofish_cbc_plain256_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sector); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = swap32_S (tmps->out32[1]); ukey1[1] = swap32_S (tmps->out32[0]); ukey1[2] = swap32_S (tmps->out32[3]); ukey1[3] = swap32_S (tmps->out32[2]); u32 ukey2[4]; ukey2[0] = swap32_S (tmps->out32[5]); ukey2[1] = swap32_S (tmps->out32[4]); ukey2[2] = swap32_S (tmps->out32[7]); ukey2[3] = swap32_S (tmps->out32[6]); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish128_set_key (sk1, lk1, ukey1); twofish128_set_key (sk2, lk2, ukey2); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_xts_plain256_mk_sha512 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } luks_decrypt_sector_twofish_xts_plain256_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = swap32_S (tmps->out32[ 1]); ukey1[1] = swap32_S (tmps->out32[ 0]); ukey1[2] = swap32_S (tmps->out32[ 3]); ukey1[3] = swap32_S (tmps->out32[ 2]); ukey1[4] = swap32_S (tmps->out32[ 5]); ukey1[5] = swap32_S (tmps->out32[ 4]); ukey1[6] = swap32_S (tmps->out32[ 7]); ukey1[7] = swap32_S (tmps->out32[ 6]); u32 ukey2[8]; ukey2[0] = swap32_S (tmps->out32[ 9]); ukey2[1] = swap32_S (tmps->out32[ 8]); ukey2[2] = swap32_S (tmps->out32[11]); ukey2[3] = swap32_S (tmps->out32[10]); ukey2[4] = swap32_S (tmps->out32[13]); ukey2[5] = swap32_S (tmps->out32[12]); ukey2[6] = swap32_S (tmps->out32[15]); ukey2[7] = swap32_S (tmps->out32[14]); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish256_set_key (sk1, lk1, ukey1); twofish256_set_key (sk2, lk2, ukey2); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_xts_plain512_mk_sha512 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } luks_decrypt_sector_twofish_xts_plain512_mk_sha512_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } } // decrypt payload data if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish128_set_key (sk1, lk1, ukey); twofish256_set_key (sk2, lk2, essivhash); luks_decrypt_sector_twofish_cbc_essiv128 (luks_bufs->ct_buf, pt_buf, sk1, lk1, sk2, lk2, 0); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish256_set_key (sk1, lk1, ukey); twofish256_set_key (sk2, lk2, essivhash); luks_decrypt_sector_twofish_cbc_essiv256 (luks_bufs->ct_buf, pt_buf, sk1, lk1, sk2, lk2, 0); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 sk1[4]; u32 lk1[40]; twofish128_set_key (sk1, lk1, ukey); luks_decrypt_sector_twofish_cbc_plain128 (luks_bufs->ct_buf, pt_buf, sk1, lk1, 0); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 sk1[4]; u32 lk1[40]; twofish256_set_key (sk1, lk1, ukey); luks_decrypt_sector_twofish_cbc_plain256 (luks_bufs->ct_buf, pt_buf, sk1, lk1, 0); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = mk[0]; ukey1[1] = mk[1]; ukey1[2] = mk[2]; ukey1[3] = mk[3]; u32 ukey2[4]; ukey2[0] = mk[4]; ukey2[1] = mk[5]; ukey2[2] = mk[6]; ukey2[3] = mk[7]; u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish128_set_key (sk1, lk1, ukey1); twofish128_set_key (sk2, lk2, ukey2); luks_decrypt_sector_twofish_xts_plain256 (luks_bufs->ct_buf, pt_buf, sk1, lk1, sk2, lk2, 0); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = mk[ 0]; ukey1[1] = mk[ 1]; ukey1[2] = mk[ 2]; ukey1[3] = mk[ 3]; ukey1[4] = mk[ 4]; ukey1[5] = mk[ 5]; ukey1[6] = mk[ 6]; ukey1[7] = mk[ 7]; u32 ukey2[8]; ukey2[0] = mk[ 8]; ukey2[1] = mk[ 9]; ukey2[2] = mk[10]; ukey2[3] = mk[11]; ukey2[4] = mk[12]; ukey2[5] = mk[13]; ukey2[6] = mk[14]; ukey2[7] = mk[15]; u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish256_set_key (sk1, lk1, ukey1); twofish256_set_key (sk2, lk2, ukey2); luks_decrypt_sector_twofish_xts_plain512 (luks_bufs->ct_buf, pt_buf, sk1, lk1, sk2, lk2, 0); } } } void luks_af_ripemd160_then_twofish_decrypt (__global const luks_t *luks_bufs, __global luks_tmp_t *tmps, u32 *pt_buf) { const u32 key_size = luks_bufs->key_size; const u32 cipher_mode = luks_bufs->cipher_mode; #define BITS_PER_AF (key_size * LUKS_STRIPES) #define BITS_PER_SECTOR (512 * 8) #define SECTOR_PER_AF (BITS_PER_AF / BITS_PER_SECTOR) #define BLOCKS_PER_SECTOR (512 / 16) #define OFFSET_PER_BLOCK (16 / 4) #define OFFSET_PER_SECTOR (BLOCKS_PER_SECTOR * OFFSET_PER_BLOCK) // decrypt AF data and do the AF merge inline u32 mk[16] = { 0 }; if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = tmps->out32[0]; ukey[1] = tmps->out32[1]; ukey[2] = tmps->out32[2]; ukey[3] = tmps->out32[3]; u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish128_set_key (sk1, lk1, ukey); twofish256_set_key (sk2, lk2, essivhash); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_cbc_essiv128_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } luks_decrypt_sector_twofish_cbc_essiv128_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = tmps->out32[0]; ukey[1] = tmps->out32[1]; ukey[2] = tmps->out32[2]; ukey[3] = tmps->out32[3]; ukey[4] = tmps->out32[4]; ukey[5] = tmps->out32[5]; ukey[6] = tmps->out32[6]; ukey[7] = tmps->out32[7]; u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish256_set_key (sk1, lk1, ukey); twofish256_set_key (sk2, lk2, essivhash); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_cbc_essiv256_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } luks_decrypt_sector_twofish_cbc_essiv256_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = tmps->out32[0]; ukey[1] = tmps->out32[1]; ukey[2] = tmps->out32[2]; ukey[3] = tmps->out32[3]; u32 sk1[4]; u32 lk1[40]; twofish128_set_key (sk1, lk1, ukey); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_cbc_plain128_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sector); } luks_decrypt_sector_twofish_cbc_plain128_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sector); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = tmps->out32[0]; ukey[1] = tmps->out32[1]; ukey[2] = tmps->out32[2]; ukey[3] = tmps->out32[3]; ukey[4] = tmps->out32[4]; ukey[5] = tmps->out32[5]; ukey[6] = tmps->out32[6]; ukey[7] = tmps->out32[7]; u32 sk1[4]; u32 lk1[40]; twofish256_set_key (sk1, lk1, ukey); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_cbc_plain256_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sector); } luks_decrypt_sector_twofish_cbc_plain256_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sector); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = tmps->out32[0]; ukey1[1] = tmps->out32[1]; ukey1[2] = tmps->out32[2]; ukey1[3] = tmps->out32[3]; u32 ukey2[4]; ukey2[0] = tmps->out32[4]; ukey2[1] = tmps->out32[5]; ukey2[2] = tmps->out32[6]; ukey2[3] = tmps->out32[7]; u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish128_set_key (sk1, lk1, ukey1); twofish128_set_key (sk2, lk2, ukey2); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_xts_plain256_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } luks_decrypt_sector_twofish_xts_plain256_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = tmps->out32[ 0]; ukey1[1] = tmps->out32[ 1]; ukey1[2] = tmps->out32[ 2]; ukey1[3] = tmps->out32[ 3]; ukey1[4] = tmps->out32[ 4]; ukey1[5] = tmps->out32[ 5]; ukey1[6] = tmps->out32[ 6]; ukey1[7] = tmps->out32[ 7]; u32 ukey2[8]; ukey2[0] = tmps->out32[ 8]; ukey2[1] = tmps->out32[ 9]; ukey2[2] = tmps->out32[10]; ukey2[3] = tmps->out32[11]; ukey2[4] = tmps->out32[12]; ukey2[5] = tmps->out32[13]; ukey2[6] = tmps->out32[14]; ukey2[7] = tmps->out32[15]; u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish256_set_key (sk1, lk1, ukey1); twofish256_set_key (sk2, lk2, ukey2); int sector = 0; int offset = 0; for (sector = 0; sector < SECTOR_PER_AF - 1; sector++, offset += OFFSET_PER_SECTOR) { luks_decrypt_sector_twofish_xts_plain512_mk_ripemd160 (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } luks_decrypt_sector_twofish_xts_plain512_mk_ripemd160_final (luks_bufs->af_src_buf + offset, mk, sk1, lk1, sk2, lk2, sector); } } // decrypt payload data if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_ESSIV) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 essivhash[8]; ESSIV_sha256_init128 (ukey, essivhash); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish128_set_key (sk1, lk1, ukey); twofish256_set_key (sk2, lk2, essivhash); luks_decrypt_sector_twofish_cbc_essiv128 (luks_bufs->ct_buf, pt_buf, sk1, lk1, sk2, lk2, 0); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 essivhash[8]; ESSIV_sha256_init256 (ukey, essivhash); u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish256_set_key (sk1, lk1, ukey); twofish256_set_key (sk2, lk2, essivhash); luks_decrypt_sector_twofish_cbc_essiv256 (luks_bufs->ct_buf, pt_buf, sk1, lk1, sk2, lk2, 0); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_CBC_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_128) { u32 ukey[4]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; u32 sk1[4]; u32 lk1[40]; twofish128_set_key (sk1, lk1, ukey); luks_decrypt_sector_twofish_cbc_plain128 (luks_bufs->ct_buf, pt_buf, sk1, lk1, 0); } else if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey[8]; ukey[0] = mk[0]; ukey[1] = mk[1]; ukey[2] = mk[2]; ukey[3] = mk[3]; ukey[4] = mk[4]; ukey[5] = mk[5]; ukey[6] = mk[6]; ukey[7] = mk[7]; u32 sk1[4]; u32 lk1[40]; twofish256_set_key (sk1, lk1, ukey); luks_decrypt_sector_twofish_cbc_plain256 (luks_bufs->ct_buf, pt_buf, sk1, lk1, 0); } } else if (cipher_mode == HC_LUKS_CIPHER_MODE_XTS_PLAIN) { if (key_size == HC_LUKS_KEY_SIZE_256) { u32 ukey1[4]; ukey1[0] = mk[0]; ukey1[1] = mk[1]; ukey1[2] = mk[2]; ukey1[3] = mk[3]; u32 ukey2[4]; ukey2[0] = mk[4]; ukey2[1] = mk[5]; ukey2[2] = mk[6]; ukey2[3] = mk[7]; u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish128_set_key (sk1, lk1, ukey1); twofish128_set_key (sk2, lk2, ukey2); luks_decrypt_sector_twofish_xts_plain256 (luks_bufs->ct_buf, pt_buf, sk1, lk1, sk2, lk2, 0); } else if (key_size == HC_LUKS_KEY_SIZE_512) { u32 ukey1[8]; ukey1[0] = mk[ 0]; ukey1[1] = mk[ 1]; ukey1[2] = mk[ 2]; ukey1[3] = mk[ 3]; ukey1[4] = mk[ 4]; ukey1[5] = mk[ 5]; ukey1[6] = mk[ 6]; ukey1[7] = mk[ 7]; u32 ukey2[8]; ukey2[0] = mk[ 8]; ukey2[1] = mk[ 9]; ukey2[2] = mk[10]; ukey2[3] = mk[11]; ukey2[4] = mk[12]; ukey2[5] = mk[13]; ukey2[6] = mk[14]; ukey2[7] = mk[15]; u32 sk1[4]; u32 lk1[40]; u32 sk2[4]; u32 lk2[40]; twofish256_set_key (sk1, lk1, ukey1); twofish256_set_key (sk2, lk2, ukey2); luks_decrypt_sector_twofish_xts_plain512 (luks_bufs->ct_buf, pt_buf, sk1, lk1, sk2, lk2, 0); } } } hashcat-4.0.1/OpenCL/inc_luks_xts.cl000066400000000000000000000003571320027462700173040ustar00rootroot00000000000000void xts_mul2 (u32 *in, u32 *out) { const u32 c = in[3] >> 31; out[3] = (in[3] << 1) | (in[2] >> 31); out[2] = (in[2] << 1) | (in[1] >> 31); out[1] = (in[1] << 1) | (in[0] >> 31); out[0] = (in[0] << 1); out[0] ^= c * 0x87; } hashcat-4.0.1/OpenCL/inc_rp.cl000066400000000000000000000452101320027462700160460ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define MAYBE_UNUSED u32 generate_cmask (const u32 value) { const u32 rmask = ((value & 0x40404040u) >> 1u) & ~((value & 0x80808080u) >> 2u); const u32 hmask = (value & 0x1f1f1f1fu) + 0x05050505u; const u32 lmask = (value & 0x1f1f1f1fu) + 0x1f1f1f1fu; return rmask & ~hmask & lmask; } void append_four_byte (const u32 *buf_src, const int off_src, u32 *buf_dst, const int off_dst) { const int sd = off_src / 4; const int sm = off_src & 3; const int sm8 = sm * 8; const int dd = off_dst / 4; const int dm = off_dst & 3; const int dm8 = dm * 8; u64 t64 = hl32_to_64 (buf_src[sd + 1], buf_src[sd + 0]); t64 >>= sm8; t64 &= 0xffffffff; t64 <<= dm8; const u32 t0 = l32_from_64_S (t64); const u32 t1 = h32_from_64_S (t64); buf_dst[dd + 0] |= t0; buf_dst[dd + 1] |= t1; } void append_three_byte (const u32 *buf_src, const int off_src, u32 *buf_dst, const int off_dst) { const int sd = off_src / 4; const int sm = off_src & 3; const int sm8 = sm * 8; const int dd = off_dst / 4; const int dm = off_dst & 3; const int dm8 = dm * 8; u64 t64 = hl32_to_64 (buf_src[sd + 1], buf_src[sd + 0]); t64 >>= sm8; t64 &= 0x00ffffff; t64 <<= dm8; const u32 t0 = l32_from_64_S (t64); const u32 t1 = h32_from_64_S (t64); buf_dst[dd + 0] |= t0; buf_dst[dd + 1] |= t1; } void append_two_byte (const u32 *buf_src, const int off_src, u32 *buf_dst, const int off_dst) { const int sd = off_src / 4; const int sm = off_src & 3; const int sm8 = sm * 8; const int dd = off_dst / 4; const int dm = off_dst & 3; const int dm8 = dm * 8; u64 t64 = hl32_to_64 (buf_src[sd + 1], buf_src[sd + 0]); t64 >>= sm8; t64 &= 0x0000ffff; t64 <<= dm8; const u32 t0 = l32_from_64_S (t64); const u32 t1 = h32_from_64_S (t64); buf_dst[dd + 0] |= t0; buf_dst[dd + 1] |= t1; } void append_one_byte (const u32 *buf_src, const int off_src, u32 *buf_dst, const int off_dst) { const int sd = off_src / 4; const int sm = off_src & 3; const int sm8 = sm * 8; const int dd = off_dst / 4; const int dm = off_dst & 3; const int dm8 = dm * 8; u32 t = buf_src[sd]; t >>= sm8; t &= 0xff; t <<= dm8; buf_dst[dd] |= t; } void append_block (const u32 *buf_src, const int off_src, u32 *buf_dst, const int off_dst, const int len) { int i; for (i = 0; i < len - 3; i += 4) { append_four_byte (buf_src, off_src + i, buf_dst, off_dst + i); } const int left = len - i; switch (left) { case 3: append_three_byte (buf_src, off_src + i, buf_dst, off_dst + i); break; case 2: append_two_byte (buf_src, off_src + i, buf_dst, off_dst + i); break; case 1: append_one_byte (buf_src, off_src + i, buf_dst, off_dst + i); break; } } void exchange_byte (u32 *buf, const int off_src, const int off_dst) { u8 *ptr = (u8 *) buf; const u8 tmp = ptr[off_src]; ptr[off_src] = ptr[off_dst]; ptr[off_dst] = tmp; /* something tells me we do this faster const int sd = off_src / 4; const int sm = off_src & 3; const int sm8 = sm * 8; const int dd = off_dst / 4; const int dm = off_dst & 3; const int dm8 = dm * 8; u32 ts = buf[sd]; u32 td = buf[dd]; ts >>= sm8; td >>= dm8; ts &= 0xff; td &= 0xff; const u32 x = ts ^ td; const u32 xs = x << sm8; const u32 xd = x << dm8; buf[sd] ^= xs; buf[dd] ^= xd; */ } int mangle_lrest (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { for (int i = 0, idx = 0; i < len; i += 4, idx += 1) { const u32 t = buf[idx]; buf[idx] = t | generate_cmask (t); } return (len); } int mangle_lrest_ufirst (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { for (int i = 0, idx = 0; i < len; i += 4, idx += 1) { const u32 t = buf[idx]; buf[idx] = t | generate_cmask (t); } const u32 t = buf[0]; buf[0] = t & ~(0x00000020 & generate_cmask (t)); return (len); } int mangle_urest (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { for (int i = 0, idx = 0; i < len; i += 4, idx += 1) { const u32 t = buf[idx]; buf[idx] = t & ~(generate_cmask (t)); } return (len); } int mangle_urest_lfirst (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { for (int i = 0, idx = 0; i < len; i += 4, idx += 1) { const u32 t = buf[idx]; buf[idx] = t & ~(generate_cmask (t)); } const u32 t = buf[0]; buf[0] = t | (0x00000020 & generate_cmask (t)); return (len); } int mangle_trest (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { for (int i = 0, idx = 0; i < len; i += 4, idx += 1) { const u32 t = buf[idx]; buf[idx] = t ^ generate_cmask (t); } return (len); } int mangle_toggle_at (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { if (p0 >= len) return (len); const u8 p0d = p0 / 4; const u8 p0m = p0 & 3; const u32 tmp = 0x20u << (p0m * 8); const u32 t = buf[p0d]; buf[p0d] = t ^ (generate_cmask (t) & tmp); return (len); } int mangle_reverse (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { for (int l = 0; l < len / 2; l++) { const int r = len - 1 - l; exchange_byte (buf, l, r); } return (len); } int mangle_dupeword (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { const int out_len = len * 2; if (out_len >= RP_PASSWORD_SIZE) return (len); append_block (buf, 0, buf, len, len); return (out_len); } int mangle_dupeword_times (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { const int out_len = (len * p0) + len; if (out_len >= RP_PASSWORD_SIZE) return (len); u8 *out = buf + len; for (int t = 0; t < p0; t++) for (int i = 0; i < len; i++) *out++ = *buf++; return (out_len); } int mangle_reflect (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { const int out_len = len * 2; if (out_len >= RP_PASSWORD_SIZE) return (len); append_block (buf, 0, buf, len, len); for (int l = 0; l < len / 2; l++) { const int r = len - 1 - l; exchange_byte (buf, len + l, len + r); } return out_len; } int mangle_append (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { const int out_len = len + 1; if (out_len >= RP_PASSWORD_SIZE) return (len); buf[len] = p0; return (out_len); } int mangle_prepend (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { const int out_len = len + 1; if (out_len >= RP_PASSWORD_SIZE) return (len); for (int pos = len - 1; pos >= 0; pos--) { buf[pos + 1] = buf[pos]; } buf[0] = p0; return (out_len); } int mangle_rotate_left (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { for (int l = 0, r = len - 1; r > l; r--) { exchange_byte (buf, l, r); } return (len); } int mangle_rotate_right (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { for (int l = 0, r = len - 1; l < r; l++) { exchange_byte (buf, l, r); } return (len); } int mangle_delete_at (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); for (int pos = p0; pos < len - 1; pos++) { buf[pos] = buf[pos + 1]; } buf[len - 1] = 0; return (len - 1); } int mangle_delete_first (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { return mangle_delete_at (0, p1, buf, len); } int mangle_delete_last (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (len == 0) return 0; return mangle_delete_at (len - 1, p1, buf, len); } int mangle_extract (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); if ((p0 + p1) > len) return (len); for (int pos = 0; pos < p1; pos++) { buf[pos] = buf[p0 + pos]; } for (int pos = p1; pos < len; pos++) { buf[pos] = 0; } return (p1); } int mangle_omit (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); if ((p0 + p1) > len) return (len); for (int pos = p0; pos < len - p1; pos++) { buf[pos] = buf[pos + p1]; } for (int pos = len - p1; pos < len; pos++) { buf[pos] = 0; } return (len - p1); } int mangle_insert (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len + 1) return (len); const int out_len = len + 1; if (out_len >= RP_PASSWORD_SIZE) return (len); for (int pos = len - 1; pos > p0 - 1; pos--) { buf[pos + 1] = buf[pos]; } buf[p0] = p1; return (out_len); } int mangle_overstrike (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); buf[p0] = p1; return (len); } int mangle_truncate_at (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); for (int pos = p0; pos < len; pos++) { buf[pos] = 0; } return (p0); } int mangle_replace (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { for (int pos = 0; pos < len; pos++) { if (buf[pos] != p0) continue; buf[pos] = p1; } return (len); } int mangle_purgechar (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { int out_len = 0; for (int pos = 0; pos < len; pos++) { if (buf[pos] == p0) continue; buf[out_len] = buf[pos]; out_len++; } for (int pos = out_len; pos < len; pos++) { buf[pos] = 0; } return (out_len); } int mangle_dupechar_first (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { const int out_len = len + p0; if (out_len >= RP_PASSWORD_SIZE) return (len); const u8 c = buf[0]; for (int i = 0; i < p0; i++) { mangle_prepend (c, 0, buf, len + i); } return (out_len); } int mangle_dupechar_last (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { const int out_len = len + p0; if (len == 0) return (len); if (out_len >= RP_PASSWORD_SIZE) return (len); const u8 c = buf[len - 1]; for (int i = 0; i < p0; i++) { mangle_append (c, 0, buf, len + i); } return (out_len); } int mangle_dupechar_all (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { const int out_len = len + len; if (out_len >= RP_PASSWORD_SIZE) return (len); for (int pos = len - 1; pos >= 0; pos--) { int new_pos = pos * 2; buf[new_pos] = buf[pos]; buf[new_pos + 1] = buf[pos]; } return (out_len); } int mangle_switch_first (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { if (len < 2) return (len); exchange_byte (buf, 0, 1); return (len); } int mangle_switch_last (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { if (len < 2) return (len); exchange_byte (buf, len - 2, len - 1); return (len); } int mangle_switch_at (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { if (p0 >= len) return (len); if (p1 >= len) return (len); exchange_byte (buf, p0, p1); return (len); } int mangle_chr_shiftl (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); buf[p0] <<= 1; return (len); } int mangle_chr_shiftr (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); buf[p0] >>= 1; return (len); } int mangle_chr_incr (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); buf[p0]++; return (len); } int mangle_chr_decr (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); buf[p0]--; return (len); } int mangle_replace_np1 (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if ((p0 + 1) >= len) return (len); buf[p0] = buf[p0 + 1]; return (len); } int mangle_replace_nm1 (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 == 0) return (len); if (p0 >= len) return (len); buf[p0] = buf[p0 - 1]; return (len); } int mangle_dupeblock_first (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); const int out_len = len + p0; if (out_len >= RP_PASSWORD_SIZE) return (len); for (int i = 0; i < p0; i++) { const u8 c = buf[i * 2]; mangle_insert (i, c, buf, len + i); } return (out_len); } int mangle_dupeblock_last (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); const int out_len = len + p0; if (out_len >= RP_PASSWORD_SIZE) return (len); for (int i = 0; i < p0; i++) { const u8 c = buf[len - p0 + i]; mangle_append (c, 0, buf, len + i); } return (out_len); } int mangle_title_sep (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { if ((len + 4) >= RP_PASSWORD_SIZE) return (len); // cheap way to not need to check for overflow of i + 1 mangle_lrest_ufirst (0, 0, buf, len); for (int i = 0, idx = 0; i < len; i += 4, idx += 1) { const u32 v = buf[idx]; u32 out0 = 0; u32 out1 = 0; if (((v >> 0) & 0xff) == p0) out0 |= 0x0000ff00; if (((v >> 8) & 0xff) == p0) out0 |= 0x00ff0000; if (((v >> 16) & 0xff) == p0) out0 |= 0xff000000; if (((v >> 24) & 0xff) == p0) out1 |= 0x000000ff; buf[idx + 0] &= ~(generate_cmask (buf[idx + 0]) & out0); buf[idx + 1] &= ~(generate_cmask (buf[idx + 1]) & out1); } return (len); } int apply_rule (const u32 name, MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int in_len) { int out_len = in_len; switch (name) { case RULE_OP_MANGLE_LREST: out_len = mangle_lrest (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_LREST_UFIRST: out_len = mangle_lrest_ufirst (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_UREST: out_len = mangle_urest (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_UREST_LFIRST: out_len = mangle_urest_lfirst (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_TREST: out_len = mangle_trest (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_TOGGLE_AT: out_len = mangle_toggle_at (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_REVERSE: out_len = mangle_reverse (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_DUPEWORD: out_len = mangle_dupeword (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_DUPEWORD_TIMES: out_len = mangle_dupeword_times (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_REFLECT: out_len = mangle_reflect (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_APPEND: out_len = mangle_append (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_PREPEND: out_len = mangle_prepend (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_ROTATE_LEFT: out_len = mangle_rotate_left (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_ROTATE_RIGHT: out_len = mangle_rotate_right (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_DELETE_FIRST: out_len = mangle_delete_first (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_DELETE_LAST: out_len = mangle_delete_last (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_DELETE_AT: out_len = mangle_delete_at (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_EXTRACT: out_len = mangle_extract (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_OMIT: out_len = mangle_omit (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_INSERT: out_len = mangle_insert (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_OVERSTRIKE: out_len = mangle_overstrike (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_TRUNCATE_AT: out_len = mangle_truncate_at (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_REPLACE: out_len = mangle_replace (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_PURGECHAR: out_len = mangle_purgechar (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_DUPECHAR_FIRST: out_len = mangle_dupechar_first (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_DUPECHAR_LAST: out_len = mangle_dupechar_last (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_DUPECHAR_ALL: out_len = mangle_dupechar_all (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_SWITCH_FIRST: out_len = mangle_switch_first (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_SWITCH_LAST: out_len = mangle_switch_last (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_SWITCH_AT: out_len = mangle_switch_at (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_CHR_SHIFTL: out_len = mangle_chr_shiftl (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_CHR_SHIFTR: out_len = mangle_chr_shiftr (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_CHR_INCR: out_len = mangle_chr_incr (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_CHR_DECR: out_len = mangle_chr_decr (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_REPLACE_NP1: out_len = mangle_replace_np1 (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_REPLACE_NM1: out_len = mangle_replace_nm1 (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_DUPEBLOCK_FIRST: out_len = mangle_dupeblock_first (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_DUPEBLOCK_LAST: out_len = mangle_dupeblock_last (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_TITLE_SEP: out_len = mangle_title_sep (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_TITLE: out_len = mangle_title_sep (' ', p1, buf, out_len); break; } return out_len; } int apply_rules (__constant const u32 *cmds, u32 *buf, const int in_len) { int out_len = in_len; for (u32 i = 0; cmds[i] != 0; i++) { const u32 cmd = cmds[i]; const u8 name = (cmd >> 0) & 0xff; const u8 p0 = (cmd >> 8) & 0xff; const u8 p1 = (cmd >> 16) & 0xff; out_len = apply_rule (name, p0, p1, buf, out_len); } return out_len; } hashcat-4.0.1/OpenCL/inc_rp.h000066400000000000000000000050111320027462700156720ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * 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_MANGLE_TITLE_SEP 'e' #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' #define RP_PASSWORD_SIZE 256 #ifdef IS_NV #define COPY_PW(x) \ pw_t pw = (x); #else #define COPY_PW(x) \ __local pw_t s_pws[64]; \ s_pws[get_local_id(0)] = (x); #endif #ifdef IS_NV #define PASTE_PW pw; #else #define PASTE_PW s_pws[get_local_id(0)]; #endif hashcat-4.0.1/OpenCL/inc_rp_optimized.cl000066400000000000000000002317261320027462700201430ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define MAYBE_UNUSED u32 generate_cmask (const u32 value) { const u32 rmask = ((value & 0x40404040u) >> 1u) & ~((value & 0x80808080u) >> 2u); const u32 hmask = (value & 0x1f1f1f1fu) + 0x05050505u; const u32 lmask = (value & 0x1f1f1f1fu) + 0x1f1f1f1fu; return rmask & ~hmask & lmask; } void truncate_right (u32 buf0[4], u32 buf1[4], const u32 offset) { const u32 tmp = (1u << ((offset & 3u) * 8u)) - 1u; #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif switch (offset_switch) { case 0: buf0[0] &= tmp; buf0[1] = 0; buf0[2] = 0; buf0[3] = 0; buf1[0] = 0; buf1[1] = 0; buf1[2] = 0; buf1[3] = 0; break; case 1: buf0[1] &= tmp; buf0[2] = 0; buf0[3] = 0; buf1[0] = 0; buf1[1] = 0; buf1[2] = 0; buf1[3] = 0; break; case 2: buf0[2] &= tmp; buf0[3] = 0; buf1[0] = 0; buf1[1] = 0; buf1[2] = 0; buf1[3] = 0; break; case 3: buf0[3] &= tmp; buf1[0] = 0; buf1[1] = 0; buf1[2] = 0; buf1[3] = 0; break; case 4: buf1[0] &= tmp; buf1[1] = 0; buf1[2] = 0; buf1[3] = 0; break; case 5: buf1[1] &= tmp; buf1[2] = 0; buf1[3] = 0; break; case 6: buf1[2] &= tmp; buf1[3] = 0; break; case 7: buf1[3] &= tmp; break; } } void truncate_left (u32 buf0[4], u32 buf1[4], const u32 offset) { const u32 tmp = ~((1u << ((offset & 3u) * 8u)) - 1u); #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif switch (offset_switch) { case 0: buf0[0] &= tmp; break; case 1: buf0[0] = 0; buf0[1] &= tmp; break; case 2: buf0[0] = 0; buf0[1] = 0; buf0[2] &= tmp; break; case 3: buf0[0] = 0; buf0[1] = 0; buf0[2] = 0; buf0[3] &= tmp; break; case 4: buf0[0] = 0; buf0[1] = 0; buf0[2] = 0; buf0[3] = 0; buf1[0] &= tmp; break; case 5: buf0[0] = 0; buf0[1] = 0; buf0[2] = 0; buf0[3] = 0; buf1[0] = 0; buf1[1] &= tmp; break; case 6: buf0[0] = 0; buf0[1] = 0; buf0[2] = 0; buf0[3] = 0; buf1[0] = 0; buf1[1] = 0; buf1[2] &= tmp; break; case 7: buf0[0] = 0; buf0[1] = 0; buf0[2] = 0; buf0[3] = 0; buf1[0] = 0; buf1[1] = 0; buf1[2] = 0; buf1[3] &= tmp; break; } } void lshift_block (const u32 in0[4], const u32 in1[4], u32 out0[4], u32 out1[4]) { out0[0] = amd_bytealign_S (in0[1], in0[0], 1); out0[1] = amd_bytealign_S (in0[2], in0[1], 1); out0[2] = amd_bytealign_S (in0[3], in0[2], 1); out0[3] = amd_bytealign_S (in1[0], in0[3], 1); out1[0] = amd_bytealign_S (in1[1], in1[0], 1); out1[1] = amd_bytealign_S (in1[2], in1[1], 1); out1[2] = amd_bytealign_S (in1[3], in1[2], 1); out1[3] = amd_bytealign_S ( 0, in1[3], 1); } void rshift_block (const u32 in0[4], const u32 in1[4], u32 out0[4], u32 out1[4]) { out1[3] = amd_bytealign_S (in1[3], in1[2], 3); out1[2] = amd_bytealign_S (in1[2], in1[1], 3); out1[1] = amd_bytealign_S (in1[1], in1[0], 3); out1[0] = amd_bytealign_S (in1[0], in0[3], 3); out0[3] = amd_bytealign_S (in0[3], in0[2], 3); out0[2] = amd_bytealign_S (in0[2], in0[1], 3); out0[1] = amd_bytealign_S (in0[1], in0[0], 3); out0[0] = amd_bytealign_S (in0[0], 0, 3); } void lshift_block_N (const u32 in0[4], const u32 in1[4], u32 out0[4], u32 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_S (in0[1], in0[0], 1); out0[1] = amd_bytealign_S (in0[2], in0[1], 1); out0[2] = amd_bytealign_S (in0[3], in0[2], 1); out0[3] = amd_bytealign_S (in1[0], in0[3], 1); out1[0] = amd_bytealign_S (in1[1], in1[0], 1); out1[1] = amd_bytealign_S (in1[2], in1[1], 1); out1[2] = amd_bytealign_S (in1[3], in1[2], 1); out1[3] = amd_bytealign_S ( 0, in1[3], 1); break; case 2: out0[0] = amd_bytealign_S (in0[1], in0[0], 2); out0[1] = amd_bytealign_S (in0[2], in0[1], 2); out0[2] = amd_bytealign_S (in0[3], in0[2], 2); out0[3] = amd_bytealign_S (in1[0], in0[3], 2); out1[0] = amd_bytealign_S (in1[1], in1[0], 2); out1[1] = amd_bytealign_S (in1[2], in1[1], 2); out1[2] = amd_bytealign_S (in1[3], in1[2], 2); out1[3] = amd_bytealign_S ( 0, in1[3], 2); break; case 3: out0[0] = amd_bytealign_S (in0[1], in0[0], 3); out0[1] = amd_bytealign_S (in0[2], in0[1], 3); out0[2] = amd_bytealign_S (in0[3], in0[2], 3); out0[3] = amd_bytealign_S (in1[0], in0[3], 3); out1[0] = amd_bytealign_S (in1[1], in1[0], 3); out1[1] = amd_bytealign_S (in1[2], in1[1], 3); out1[2] = amd_bytealign_S (in1[3], in1[2], 3); out1[3] = amd_bytealign_S ( 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_S (in0[2], in0[1], 1); out0[1] = amd_bytealign_S (in0[3], in0[2], 1); out0[2] = amd_bytealign_S (in1[0], in0[3], 1); out0[3] = amd_bytealign_S (in1[1], in1[0], 1); out1[0] = amd_bytealign_S (in1[2], in1[1], 1); out1[1] = amd_bytealign_S (in1[3], in1[2], 1); out1[2] = amd_bytealign_S ( 0, in1[3], 1); out1[3] = 0; break; case 6: out0[0] = amd_bytealign_S (in0[2], in0[1], 2); out0[1] = amd_bytealign_S (in0[3], in0[2], 2); out0[2] = amd_bytealign_S (in1[0], in0[3], 2); out0[3] = amd_bytealign_S (in1[1], in1[0], 2); out1[0] = amd_bytealign_S (in1[2], in1[1], 2); out1[1] = amd_bytealign_S (in1[3], in1[2], 2); out1[2] = amd_bytealign_S ( 0, in1[3], 2); out1[3] = 0; break; case 7: out0[0] = amd_bytealign_S (in0[2], in0[1], 3); out0[1] = amd_bytealign_S (in0[3], in0[2], 3); out0[2] = amd_bytealign_S (in1[0], in0[3], 3); out0[3] = amd_bytealign_S (in1[1], in1[0], 3); out1[0] = amd_bytealign_S (in1[2], in1[1], 3); out1[1] = amd_bytealign_S (in1[3], in1[2], 3); out1[2] = amd_bytealign_S ( 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_S (in0[3], in0[2], 1); out0[1] = amd_bytealign_S (in1[0], in0[3], 1); out0[2] = amd_bytealign_S (in1[1], in1[0], 1); out0[3] = amd_bytealign_S (in1[2], in1[1], 1); out1[0] = amd_bytealign_S (in1[3], in1[2], 1); out1[1] = amd_bytealign_S ( 0, in1[3], 1); out1[2] = 0; out1[3] = 0; break; case 10: out0[0] = amd_bytealign_S (in0[3], in0[2], 2); out0[1] = amd_bytealign_S (in1[0], in0[3], 2); out0[2] = amd_bytealign_S (in1[1], in1[0], 2); out0[3] = amd_bytealign_S (in1[2], in1[1], 2); out1[0] = amd_bytealign_S (in1[3], in1[2], 2); out1[1] = amd_bytealign_S ( 0, in1[3], 2); out1[2] = 0; out1[3] = 0; break; case 11: out0[0] = amd_bytealign_S (in0[3], in0[2], 3); out0[1] = amd_bytealign_S (in1[0], in0[3], 3); out0[2] = amd_bytealign_S (in1[1], in1[0], 3); out0[3] = amd_bytealign_S (in1[2], in1[1], 3); out1[0] = amd_bytealign_S (in1[3], in1[2], 3); out1[1] = amd_bytealign_S ( 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_S (in1[0], in0[3], 1); out0[1] = amd_bytealign_S (in1[1], in1[0], 1); out0[2] = amd_bytealign_S (in1[2], in1[1], 1); out0[3] = amd_bytealign_S (in1[3], in1[2], 1); out1[0] = amd_bytealign_S ( 0, in1[3], 1); out1[1] = 0; out1[2] = 0; out1[3] = 0; break; case 14: out0[0] = amd_bytealign_S (in1[0], in0[3], 2); out0[1] = amd_bytealign_S (in1[1], in1[0], 2); out0[2] = amd_bytealign_S (in1[2], in1[1], 2); out0[3] = amd_bytealign_S (in1[3], in1[2], 2); out1[0] = amd_bytealign_S ( 0, in1[3], 2); out1[1] = 0; out1[2] = 0; out1[3] = 0; break; case 15: out0[0] = amd_bytealign_S (in1[0], in0[3], 3); out0[1] = amd_bytealign_S (in1[1], in1[0], 3); out0[2] = amd_bytealign_S (in1[2], in1[1], 3); out0[3] = amd_bytealign_S (in1[3], in1[2], 3); out1[0] = amd_bytealign_S ( 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_S (in1[1], in1[0], 1); out0[1] = amd_bytealign_S (in1[2], in1[1], 1); out0[2] = amd_bytealign_S (in1[3], in1[2], 1); out0[3] = amd_bytealign_S ( 0, in1[3], 1); out1[0] = 0; out1[1] = 0; out1[2] = 0; out1[3] = 0; break; case 18: out0[0] = amd_bytealign_S (in1[1], in1[0], 2); out0[1] = amd_bytealign_S (in1[2], in1[1], 2); out0[2] = amd_bytealign_S (in1[3], in1[2], 2); out0[3] = amd_bytealign_S ( 0, in1[3], 2); out1[0] = 0; out1[1] = 0; out1[2] = 0; out1[3] = 0; break; case 19: out0[0] = amd_bytealign_S (in1[1], in1[0], 3); out0[1] = amd_bytealign_S (in1[2], in1[1], 3); out0[2] = amd_bytealign_S (in1[3], in1[2], 3); out0[3] = amd_bytealign_S ( 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_S (in1[2], in1[1], 1); out0[1] = amd_bytealign_S (in1[3], in1[2], 1); out0[2] = amd_bytealign_S ( 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_S (in1[2], in1[1], 2); out0[1] = amd_bytealign_S (in1[3], in1[2], 2); out0[2] = amd_bytealign_S ( 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_S (in1[2], in1[1], 3); out0[1] = amd_bytealign_S (in1[3], in1[2], 3); out0[2] = amd_bytealign_S ( 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_S (in1[3], in1[2], 1); out0[1] = amd_bytealign_S ( 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_S (in1[3], in1[2], 2); out0[1] = amd_bytealign_S ( 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_S (in1[3], in1[2], 3); out0[1] = amd_bytealign_S ( 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_S ( 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_S ( 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_S ( 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; } } void rshift_block_N (const u32 in0[4], const u32 in1[4], u32 out0[4], u32 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_S (in1[3], in1[2], 3); out1[2] = amd_bytealign_S (in1[2], in1[1], 3); out1[1] = amd_bytealign_S (in1[1], in1[0], 3); out1[0] = amd_bytealign_S (in1[0], in0[3], 3); out0[3] = amd_bytealign_S (in0[3], in0[2], 3); out0[2] = amd_bytealign_S (in0[2], in0[1], 3); out0[1] = amd_bytealign_S (in0[1], in0[0], 3); out0[0] = amd_bytealign_S (in0[0], 0, 3); break; case 2: out1[3] = amd_bytealign_S (in1[3], in1[2], 2); out1[2] = amd_bytealign_S (in1[2], in1[1], 2); out1[1] = amd_bytealign_S (in1[1], in1[0], 2); out1[0] = amd_bytealign_S (in1[0], in0[3], 2); out0[3] = amd_bytealign_S (in0[3], in0[2], 2); out0[2] = amd_bytealign_S (in0[2], in0[1], 2); out0[1] = amd_bytealign_S (in0[1], in0[0], 2); out0[0] = amd_bytealign_S (in0[0], 0, 2); break; case 3: out1[3] = amd_bytealign_S (in1[3], in1[2], 1); out1[2] = amd_bytealign_S (in1[2], in1[1], 1); out1[1] = amd_bytealign_S (in1[1], in1[0], 1); out1[0] = amd_bytealign_S (in1[0], in0[3], 1); out0[3] = amd_bytealign_S (in0[3], in0[2], 1); out0[2] = amd_bytealign_S (in0[2], in0[1], 1); out0[1] = amd_bytealign_S (in0[1], in0[0], 1); out0[0] = amd_bytealign_S (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_S (in1[2], in1[1], 3); out1[2] = amd_bytealign_S (in1[1], in1[0], 3); out1[1] = amd_bytealign_S (in1[0], in0[3], 3); out1[0] = amd_bytealign_S (in0[3], in0[2], 3); out0[3] = amd_bytealign_S (in0[2], in0[1], 3); out0[2] = amd_bytealign_S (in0[1], in0[0], 3); out0[1] = amd_bytealign_S (in0[0], 0, 3); out0[0] = 0; break; case 6: out1[3] = amd_bytealign_S (in1[2], in1[1], 2); out1[2] = amd_bytealign_S (in1[1], in1[0], 2); out1[1] = amd_bytealign_S (in1[0], in0[3], 2); out1[0] = amd_bytealign_S (in0[3], in0[2], 2); out0[3] = amd_bytealign_S (in0[2], in0[1], 2); out0[2] = amd_bytealign_S (in0[1], in0[0], 2); out0[1] = amd_bytealign_S (in0[0], 0, 2); out0[0] = 0; break; case 7: out1[3] = amd_bytealign_S (in1[2], in1[1], 1); out1[2] = amd_bytealign_S (in1[1], in1[0], 1); out1[1] = amd_bytealign_S (in1[0], in0[3], 1); out1[0] = amd_bytealign_S (in0[3], in0[2], 1); out0[3] = amd_bytealign_S (in0[2], in0[1], 1); out0[2] = amd_bytealign_S (in0[1], in0[0], 1); out0[1] = amd_bytealign_S (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_S (in1[1], in1[0], 3); out1[2] = amd_bytealign_S (in1[0], in0[3], 3); out1[1] = amd_bytealign_S (in0[3], in0[2], 3); out1[0] = amd_bytealign_S (in0[2], in0[1], 3); out0[3] = amd_bytealign_S (in0[1], in0[0], 3); out0[2] = amd_bytealign_S (in0[0], 0, 3); out0[1] = 0; out0[0] = 0; break; case 10: out1[3] = amd_bytealign_S (in1[1], in1[0], 2); out1[2] = amd_bytealign_S (in1[0], in0[3], 2); out1[1] = amd_bytealign_S (in0[3], in0[2], 2); out1[0] = amd_bytealign_S (in0[2], in0[1], 2); out0[3] = amd_bytealign_S (in0[1], in0[0], 2); out0[2] = amd_bytealign_S (in0[0], 0, 2); out0[1] = 0; out0[0] = 0; break; case 11: out1[3] = amd_bytealign_S (in1[1], in1[0], 1); out1[2] = amd_bytealign_S (in1[0], in0[3], 1); out1[1] = amd_bytealign_S (in0[3], in0[2], 1); out1[0] = amd_bytealign_S (in0[2], in0[1], 1); out0[3] = amd_bytealign_S (in0[1], in0[0], 1); out0[2] = amd_bytealign_S (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_S (in1[0], in0[3], 3); out1[2] = amd_bytealign_S (in0[3], in0[2], 3); out1[1] = amd_bytealign_S (in0[2], in0[1], 3); out1[0] = amd_bytealign_S (in0[1], in0[0], 3); out0[3] = amd_bytealign_S (in0[0], 0, 3); out0[2] = 0; out0[1] = 0; out0[0] = 0; break; case 14: out1[3] = amd_bytealign_S (in1[0], in0[3], 2); out1[2] = amd_bytealign_S (in0[3], in0[2], 2); out1[1] = amd_bytealign_S (in0[2], in0[1], 2); out1[0] = amd_bytealign_S (in0[1], in0[0], 2); out0[3] = amd_bytealign_S (in0[0], 0, 2); out0[2] = 0; out0[1] = 0; out0[0] = 0; break; case 15: out1[3] = amd_bytealign_S (in1[0], in0[3], 1); out1[2] = amd_bytealign_S (in0[3], in0[2], 1); out1[1] = amd_bytealign_S (in0[2], in0[1], 1); out1[0] = amd_bytealign_S (in0[1], in0[0], 1); out0[3] = amd_bytealign_S (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_S (in0[3], in0[2], 3); out1[2] = amd_bytealign_S (in0[2], in0[1], 3); out1[1] = amd_bytealign_S (in0[1], in0[0], 3); out1[0] = amd_bytealign_S (in0[0], 0, 3); out0[3] = 0; out0[2] = 0; out0[1] = 0; out0[0] = 0; break; case 18: out1[3] = amd_bytealign_S (in0[3], in0[2], 2); out1[2] = amd_bytealign_S (in0[2], in0[1], 2); out1[1] = amd_bytealign_S (in0[1], in0[0], 2); out1[0] = amd_bytealign_S (in0[0], 0, 2); out0[3] = 0; out0[2] = 0; out0[1] = 0; out0[0] = 0; break; case 19: out1[3] = amd_bytealign_S (in0[3], in0[2], 1); out1[2] = amd_bytealign_S (in0[2], in0[1], 1); out1[1] = amd_bytealign_S (in0[1], in0[0], 1); out1[0] = amd_bytealign_S (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_S (in0[2], in0[1], 3); out1[2] = amd_bytealign_S (in0[1], in0[0], 3); out1[1] = amd_bytealign_S (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_S (in0[2], in0[1], 2); out1[2] = amd_bytealign_S (in0[1], in0[0], 2); out1[1] = amd_bytealign_S (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_S (in0[2], in0[1], 1); out1[2] = amd_bytealign_S (in0[1], in0[0], 1); out1[1] = amd_bytealign_S (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_S (in0[1], in0[0], 3); out1[2] = amd_bytealign_S (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_S (in0[1], in0[0], 2); out1[2] = amd_bytealign_S (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_S (in0[1], in0[0], 1); out1[2] = amd_bytealign_S (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_S (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_S (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_S (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; } } void append_block1 (const u32 offset, u32 buf0[4], u32 buf1[4], const u32 src_r0) { // this version works with 1 byte append only const u32 value = src_r0 & 0xff; const u32 tmp = value << 0 | value << 8 | value << 16 | value << 24; buf0[0] |= tmp & c_append_helper[offset][0]; buf0[1] |= tmp & c_append_helper[offset][1]; buf0[2] |= tmp & c_append_helper[offset][2]; buf0[3] |= tmp & c_append_helper[offset][3]; buf1[0] |= tmp & c_append_helper[offset][4]; buf1[1] |= tmp & c_append_helper[offset][5]; buf1[2] |= tmp & c_append_helper[offset][6]; buf1[3] |= tmp & c_append_helper[offset][7]; } void append_block8 (const u32 offset, u32 buf0[4], u32 buf1[4], const u32 src_l0[4], const u32 src_l1[4], const u32 src_r0[4], const u32 src_r1[4]) { u32 s0 = 0; u32 s1 = 0; u32 s2 = 0; u32 s3 = 0; u32 s4 = 0; u32 s5 = 0; u32 s6 = 0; u32 s7 = 0; #ifdef IS_AMD volatile const int offset_switch = offset / 4; #else const int offset_switch = offset / 4; #endif #if (defined IS_AMD && AMD_GCN < 3) || defined IS_GENERIC const u32 src_r00 = swap32_S (src_r0[0]); const u32 src_r01 = swap32_S (src_r0[1]); const u32 src_r02 = swap32_S (src_r0[2]); const u32 src_r03 = swap32_S (src_r0[3]); const u32 src_r10 = swap32_S (src_r1[0]); const u32 src_r11 = swap32_S (src_r1[1]); const u32 src_r12 = swap32_S (src_r1[2]); const u32 src_r13 = swap32_S (src_r1[3]); switch (offset_switch) { case 0: s7 = amd_bytealign_S (src_r12, src_r13, offset); s6 = amd_bytealign_S (src_r11, src_r12, offset); s5 = amd_bytealign_S (src_r10, src_r11, offset); s4 = amd_bytealign_S (src_r03, src_r10, offset); s3 = amd_bytealign_S (src_r02, src_r03, offset); s2 = amd_bytealign_S (src_r01, src_r02, offset); s1 = amd_bytealign_S (src_r00, src_r01, offset); s0 = amd_bytealign_S ( 0, src_r00, offset); break; case 1: s7 = amd_bytealign_S (src_r11, src_r12, offset); s6 = amd_bytealign_S (src_r10, src_r11, offset); s5 = amd_bytealign_S (src_r03, src_r10, offset); s4 = amd_bytealign_S (src_r02, src_r03, offset); s3 = amd_bytealign_S (src_r01, src_r02, offset); s2 = amd_bytealign_S (src_r00, src_r01, offset); s1 = amd_bytealign_S ( 0, src_r00, offset); s0 = 0; break; case 2: s7 = amd_bytealign_S (src_r10, src_r11, offset); s6 = amd_bytealign_S (src_r03, src_r10, offset); s5 = amd_bytealign_S (src_r02, src_r03, offset); s4 = amd_bytealign_S (src_r01, src_r02, offset); s3 = amd_bytealign_S (src_r00, src_r01, offset); s2 = amd_bytealign_S ( 0, src_r00, offset); s1 = 0; s0 = 0; break; case 3: s7 = amd_bytealign_S (src_r03, src_r10, offset); s6 = amd_bytealign_S (src_r02, src_r03, offset); s5 = amd_bytealign_S (src_r01, src_r02, offset); s4 = amd_bytealign_S (src_r00, src_r01, offset); s3 = amd_bytealign_S ( 0, src_r00, offset); s2 = 0; s1 = 0; s0 = 0; break; case 4: s7 = amd_bytealign_S (src_r02, src_r03, offset); s6 = amd_bytealign_S (src_r01, src_r02, offset); s5 = amd_bytealign_S (src_r00, src_r01, offset); s4 = amd_bytealign_S ( 0, src_r00, offset); s3 = 0; s2 = 0; s1 = 0; s0 = 0; break; case 5: s7 = amd_bytealign_S (src_r01, src_r02, offset); s6 = amd_bytealign_S (src_r00, src_r01, offset); s5 = amd_bytealign_S ( 0, src_r00, offset); s4 = 0; s3 = 0; s2 = 0; s1 = 0; s0 = 0; break; case 6: s7 = amd_bytealign_S (src_r00, src_r01, offset); s6 = amd_bytealign_S ( 0, src_r00, offset); s5 = 0; s4 = 0; s3 = 0; s2 = 0; s1 = 0; s0 = 0; break; case 7: s7 = amd_bytealign_S ( 0, src_r00, offset); s6 = 0; s5 = 0; s4 = 0; s3 = 0; s2 = 0; s1 = 0; s0 = 0; break; } s0 = swap32_S (s0); s1 = swap32_S (s1); s2 = swap32_S (s2); s3 = swap32_S (s3); s4 = swap32_S (s4); s5 = swap32_S (s5); s6 = swap32_S (s6); s7 = swap32_S (s7); #endif #if (defined IS_AMD && AMD_GCN >= 3) || defined IS_NV const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #if defined IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; #endif #if defined IS_AMD const int selector = 0x0706050403020100 >> (offset_minus_4 * 8); #endif const u32 src_r00 = src_r0[0]; const u32 src_r01 = src_r0[1]; const u32 src_r02 = src_r0[2]; const u32 src_r03 = src_r0[3]; const u32 src_r10 = src_r1[0]; const u32 src_r11 = src_r1[1]; const u32 src_r12 = src_r1[2]; const u32 src_r13 = src_r1[3]; switch (offset_switch) { case 0: s7 = __byte_perm_S (src_r12, src_r13, selector); s6 = __byte_perm_S (src_r11, src_r12, selector); s5 = __byte_perm_S (src_r10, src_r11, selector); s4 = __byte_perm_S (src_r03, src_r10, selector); s3 = __byte_perm_S (src_r02, src_r03, selector); s2 = __byte_perm_S (src_r01, src_r02, selector); s1 = __byte_perm_S (src_r00, src_r01, selector); s0 = __byte_perm_S ( 0, src_r00, selector); break; case 1: s7 = __byte_perm_S (src_r11, src_r12, selector); s6 = __byte_perm_S (src_r10, src_r11, selector); s5 = __byte_perm_S (src_r03, src_r10, selector); s4 = __byte_perm_S (src_r02, src_r03, selector); s3 = __byte_perm_S (src_r01, src_r02, selector); s2 = __byte_perm_S (src_r00, src_r01, selector); s1 = __byte_perm_S ( 0, src_r00, selector); s0 = 0; break; case 2: s7 = __byte_perm_S (src_r10, src_r11, selector); s6 = __byte_perm_S (src_r03, src_r10, selector); s5 = __byte_perm_S (src_r02, src_r03, selector); s4 = __byte_perm_S (src_r01, src_r02, selector); s3 = __byte_perm_S (src_r00, src_r01, selector); s2 = __byte_perm_S ( 0, src_r00, selector); s1 = 0; s0 = 0; break; case 3: s7 = __byte_perm_S (src_r03, src_r10, selector); s6 = __byte_perm_S (src_r02, src_r03, selector); s5 = __byte_perm_S (src_r01, src_r02, selector); s4 = __byte_perm_S (src_r00, src_r01, selector); s3 = __byte_perm_S ( 0, src_r00, selector); s2 = 0; s1 = 0; s0 = 0; break; case 4: s7 = __byte_perm_S (src_r02, src_r03, selector); s6 = __byte_perm_S (src_r01, src_r02, selector); s5 = __byte_perm_S (src_r00, src_r01, selector); s4 = __byte_perm_S ( 0, src_r00, selector); s3 = 0; s2 = 0; s1 = 0; s0 = 0; break; case 5: s7 = __byte_perm_S (src_r01, src_r02, selector); s6 = __byte_perm_S (src_r00, src_r01, selector); s5 = __byte_perm_S ( 0, src_r00, selector); s4 = 0; s3 = 0; s2 = 0; s1 = 0; s0 = 0; break; case 6: s7 = __byte_perm_S (src_r00, src_r01, selector); s6 = __byte_perm_S ( 0, src_r00, selector); s5 = 0; s4 = 0; s3 = 0; s2 = 0; s1 = 0; s0 = 0; break; case 7: s7 = __byte_perm_S ( 0, src_r00, selector); s6 = 0; s5 = 0; s4 = 0; s3 = 0; s2 = 0; s1 = 0; s0 = 0; break; } #endif buf0[0] = src_l0[0] | s0; buf0[1] = src_l0[1] | s1; buf0[2] = src_l0[2] | s2; buf0[3] = src_l0[3] | s3; buf1[0] = src_l1[0] | s4; buf1[1] = src_l1[1] | s5; buf1[2] = src_l1[2] | s6; buf1[3] = src_l1[3] | s7; } void reverse_block (u32 in0[4], u32 in1[4], u32 out0[4], u32 out1[4], const u32 len) { rshift_block_N (in0, in1, out0, out1, 32 - len); u32 tib40[4]; u32 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] = swap32_S (tib40[0]); out0[1] = swap32_S (tib40[1]); out0[2] = swap32_S (tib40[2]); out0[3] = swap32_S (tib40[3]); out1[0] = swap32_S (tib41[0]); out1[1] = swap32_S (tib41[1]); out1[2] = swap32_S (tib41[2]); out1[3] = swap32_S (tib41[3]); } void exchange_byte (u32 *buf, const int off_src, const int off_dst) { u8 *ptr = (u8 *) buf; const u8 tmp = ptr[off_src]; ptr[off_src] = ptr[off_dst]; ptr[off_dst] = tmp; } u32 rule_op_mangle_lrest (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { u32 t; t = buf0[0]; buf0[0] = t | generate_cmask (t); t = buf0[1]; buf0[1] = t | generate_cmask (t); t = buf0[2]; buf0[2] = t | generate_cmask (t); t = buf0[3]; buf0[3] = t | generate_cmask (t); t = buf1[0]; buf1[0] = t | generate_cmask (t); t = buf1[1]; buf1[1] = t | generate_cmask (t); t = buf1[2]; buf1[2] = t | generate_cmask (t); t = buf1[3]; buf1[3] = t | generate_cmask (t); return in_len; } u32 rule_op_mangle_urest (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { u32 t; t = buf0[0]; buf0[0] = t & ~(generate_cmask (t)); t = buf0[1]; buf0[1] = t & ~(generate_cmask (t)); t = buf0[2]; buf0[2] = t & ~(generate_cmask (t)); t = buf0[3]; buf0[3] = t & ~(generate_cmask (t)); t = buf1[0]; buf1[0] = t & ~(generate_cmask (t)); t = buf1[1]; buf1[1] = t & ~(generate_cmask (t)); t = buf1[2]; buf1[2] = t & ~(generate_cmask (t)); t = buf1[3]; buf1[3] = t & ~(generate_cmask (t)); return in_len; } u32 rule_op_mangle_lrest_ufirst (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { u32 t; t = buf0[0]; buf0[0] = t | generate_cmask (t); t = buf0[1]; buf0[1] = t | generate_cmask (t); t = buf0[2]; buf0[2] = t | generate_cmask (t); t = buf0[3]; buf0[3] = t | generate_cmask (t); t = buf1[0]; buf1[0] = t | generate_cmask (t); t = buf1[1]; buf1[1] = t | generate_cmask (t); t = buf1[2]; buf1[2] = t | generate_cmask (t); t = buf1[3]; buf1[3] = t | generate_cmask (t); t = buf0[0]; buf0[0] = t & ~(0x00000020 & generate_cmask (t)); return in_len; } u32 rule_op_mangle_urest_lfirst (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { u32 t; t = buf0[0]; buf0[0] = t & ~(generate_cmask (t)); t = buf0[1]; buf0[1] = t & ~(generate_cmask (t)); t = buf0[2]; buf0[2] = t & ~(generate_cmask (t)); t = buf0[3]; buf0[3] = t & ~(generate_cmask (t)); t = buf1[0]; buf1[0] = t & ~(generate_cmask (t)); t = buf1[1]; buf1[1] = t & ~(generate_cmask (t)); t = buf1[2]; buf1[2] = t & ~(generate_cmask (t)); t = buf1[3]; buf1[3] = t & ~(generate_cmask (t)); t = buf0[0]; buf0[0] = t | (0x00000020 & generate_cmask (t)); return in_len; } u32 rule_op_mangle_trest (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { u32 t; t = buf0[0]; buf0[0] = t ^ generate_cmask (t); t = buf0[1]; buf0[1] = t ^ generate_cmask (t); t = buf0[2]; buf0[2] = t ^ generate_cmask (t); t = buf0[3]; buf0[3] = t ^ generate_cmask (t); t = buf1[0]; buf1[0] = t ^ generate_cmask (t); t = buf1[1]; buf1[1] = t ^ generate_cmask (t); t = buf1[2]; buf1[2] = t ^ generate_cmask (t); t = buf1[3]; buf1[3] = t ^ generate_cmask (t); return in_len; } u32 rule_op_mangle_toggle_at (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 >= in_len) return in_len; u32 t[8]; t[0] = buf0[0]; t[1] = buf0[1]; t[2] = buf0[2]; t[3] = buf0[3]; t[4] = buf1[0]; t[5] = buf1[1]; t[6] = buf1[2]; t[7] = buf1[3]; const u32 tmp = t[p0 / 4]; const u32 m = 0x20u << ((p0 & 3) * 8); t[p0 / 4] = tmp ^ (m & generate_cmask (tmp)); buf0[0] = t[0]; buf0[1] = t[1]; buf0[2] = t[2]; buf0[3] = t[3]; buf1[0] = t[4]; buf1[1] = t[5]; buf1[2] = t[6]; buf1[3] = t[7]; return (in_len); } u32 rule_op_mangle_reverse (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { reverse_block (buf0, buf1, buf0, buf1, in_len); return in_len; } u32 rule_op_mangle_dupeword (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if ((in_len + in_len) >= 32) return in_len; u32 out_len = in_len; append_block8 (out_len, buf0, buf1, buf0, buf1, buf0, buf1); out_len += in_len; return out_len; } u32 rule_op_mangle_dupeword_times (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (((in_len * p0) + in_len) >= 32) return in_len; u32 out_len = in_len; u32 tib40[4]; u32 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; } u32 rule_op_mangle_reflect (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if ((in_len + in_len) >= 32) return in_len; u32 out_len = in_len; u32 tib40[4] = { 0 }; u32 tib41[4] = { 0 }; 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; } u32 rule_op_mangle_append (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; } u32 rule_op_mangle_prepend (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; } u32 rule_op_mangle_rotate_left (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (in_len == 0) return in_len; const u32 in_len1 = in_len - 1; const u32 tmp = buf0[0]; lshift_block (buf0, buf1, buf0, buf1); append_block1 (in_len1, buf0, buf1, tmp); return in_len; } u32 rule_op_mangle_rotate_right (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; u32 tmp = 0; tmp |= buf0[0] & c_append_helper[in_len1][0]; tmp |= buf0[1] & c_append_helper[in_len1][1]; tmp |= buf0[2] & c_append_helper[in_len1][2]; tmp |= buf0[3] & c_append_helper[in_len1][3]; tmp |= buf1[0] & c_append_helper[in_len1][4]; tmp |= buf1[1] & c_append_helper[in_len1][5]; tmp |= buf1[2] & c_append_helper[in_len1][6]; tmp |= buf1[3] & c_append_helper[in_len1][7]; tmp = (tmp >> sh) & 0xff; rshift_block (buf0, buf1, buf0, buf1); buf0[0] |= tmp; truncate_right (buf0, buf1, in_len); return in_len; } u32 rule_op_mangle_delete_first (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; } u32 rule_op_mangle_delete_last (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (in_len == 0) return in_len; const u32 in_len1 = in_len - 1; const u32 mask = (1 << ((in_len1 & 3) * 8)) - 1; buf0[0] &= (in_len1 < 4) ? mask : 0xffffffff; buf0[1] &= ((in_len1 >= 4) && (in_len1 < 8)) ? mask : 0xffffffff; buf0[2] &= ((in_len1 >= 8) && (in_len1 < 12)) ? mask : 0xffffffff; buf0[3] &= ((in_len1 >= 12) && (in_len1 < 16)) ? mask : 0xffffffff; buf1[0] &= ((in_len1 >= 16) && (in_len1 < 20)) ? mask : 0xffffffff; buf1[1] &= ((in_len1 >= 20) && (in_len1 < 24)) ? mask : 0xffffffff; buf1[2] &= ((in_len1 >= 24) && (in_len1 < 28)) ? mask : 0xffffffff; buf1[3] &= (in_len1 >= 28) ? mask : 0xffffffff; return in_len1; } u32 rule_op_mangle_delete_at (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 >= in_len) return in_len; u32 out_len = in_len; u32 tib40[4]; u32 tib41[4]; lshift_block (buf0, buf1, tib40, tib41); const u32 ml = (1 << ((p0 & 3) * 8)) - 1; const u32 mr = ~ml; #ifdef IS_AMD volatile const int p0_switch = p0 / 4; #else const int p0_switch = p0 / 4; #endif switch (p0_switch) { 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; } u32 rule_op_mangle_extract (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; } u32 rule_op_mangle_omit (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; u32 tib40[4]; u32 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; #ifdef IS_AMD volatile const int p0_switch = p0 / 4; #else const int p0_switch = p0 / 4; #endif switch (p0_switch) { 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; } u32 rule_op_mangle_insert (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; u32 tib40[4]; u32 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); #ifdef IS_AMD volatile const int p0_switch = p0 / 4; #else const int p0_switch = p0 / 4; #endif switch (p0_switch) { 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; } u32 rule_op_mangle_overstrike (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 >= in_len) return in_len; const u32 p1n = p1 << ((p0 & 3) * 8); const u32 m = ~(0xffu << ((p0 & 3) * 8)); u32 t[8]; t[0] = buf0[0]; t[1] = buf0[1]; t[2] = buf0[2]; t[3] = buf0[3]; t[4] = buf1[0]; t[5] = buf1[1]; t[6] = buf1[2]; t[7] = buf1[3]; const u32 tmp = t[p0 / 4]; t[p0 / 4] = (tmp & m) | p1n; buf0[0] = t[0]; buf0[1] = t[1]; buf0[2] = t[2]; buf0[3] = t[3]; buf1[0] = t[4]; buf1[1] = t[5]; buf1[2] = t[6]; buf1[3] = t[7]; return in_len; } u32 rule_op_mangle_truncate_at (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 >= in_len) return in_len; truncate_right (buf0, buf1, p0); return p0; } u32 search_on_register (const u32 in, const u32 p0) { u32 r = 0; if (__bfe_S (in, 0, 8) == p0) r |= 1; if (__bfe_S (in, 8, 8) == p0) r |= 2; if (__bfe_S (in, 16, 8) == p0) r |= 4; if (__bfe_S (in, 24, 8) == p0) r |= 8; return r; } u32 replace_on_register (const u32 in, const u32 r, const u32 p1) { u32 out = in; if (r & 1) out = (out & 0xffffff00) | (p1 << 0); if (r & 2) out = (out & 0xffff00ff) | (p1 << 8); if (r & 4) out = (out & 0xff00ffff) | (p1 << 16); if (r & 8) out = (out & 0x00ffffff) | (p1 << 24); return out; } u32 rule_op_mangle_replace (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { const u32 r0 = search_on_register (buf0[0], p0); const u32 r1 = search_on_register (buf0[1], p0); const u32 r2 = search_on_register (buf0[2], p0); const u32 r3 = search_on_register (buf0[3], p0); const u32 r4 = search_on_register (buf1[0], p0); const u32 r5 = search_on_register (buf1[1], p0); const u32 r6 = search_on_register (buf1[2], p0); const u32 r7 = search_on_register (buf1[3], p0); const u32 rn = r0 + r1 + r2 + r3 + r4 + r5 + r6 + r7; if (rn == 0) return in_len; buf0[0] = replace_on_register (buf0[0], r0, p1); buf0[1] = replace_on_register (buf0[1], r1, p1); buf0[2] = replace_on_register (buf0[2], r2, p1); buf0[3] = replace_on_register (buf0[3], r3, p1); buf1[0] = replace_on_register (buf1[0], r4, p1); buf1[1] = replace_on_register (buf1[1], r5, p1); buf1[2] = replace_on_register (buf1[2], r6, p1); buf1[3] = replace_on_register (buf1[3], r7, p1); return in_len; } u32 rule_op_mangle_purgechar (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { const u32 r0 = search_on_register (buf0[0], p0); const u32 r1 = search_on_register (buf0[1], p0); const u32 r2 = search_on_register (buf0[2], p0); const u32 r3 = search_on_register (buf0[3], p0); const u32 r4 = search_on_register (buf1[0], p0); const u32 r5 = search_on_register (buf1[1], p0); const u32 r6 = search_on_register (buf1[2], p0); const u32 r7 = search_on_register (buf1[3], p0); const u32 rn = r0 + r1 + r2 + r3 + r4 + r5 + r6 + r7; if (rn == 0) return in_len; u32 out_len = 0; u32 buf_in[8]; buf_in[0] = buf0[0]; buf_in[1] = buf0[1]; buf_in[2] = buf0[2]; buf_in[3] = buf0[3]; buf_in[4] = buf1[0]; buf_in[5] = buf1[1]; buf_in[6] = buf1[2]; buf_in[7] = buf1[3]; u32 buf_out[8] = { 0 }; u8 *in = (u8 *) buf_in; u8 *out = (u8 *) buf_out; for (u32 pos = 0; pos < in_len; pos++) { if (in[pos] == (u8) p0) continue; out[out_len] = in[pos]; out_len++; } buf0[0] = buf_out[0]; buf0[1] = buf_out[1]; buf0[2] = buf_out[2]; buf0[3] = buf_out[3]; buf1[0] = buf_out[4]; buf1[1] = buf_out[5]; buf1[2] = buf_out[6]; buf1[3] = buf_out[7]; return out_len; } u32 rule_op_mangle_dupechar_first (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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 u32 tmp = buf0[0] & 0xFF; const u32 tmp32 = tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; rshift_block_N (buf0, buf1, buf0, buf1, p0); u32 t0[4] = { tmp32, tmp32, tmp32, tmp32 }; u32 t1[4] = { tmp32, tmp32, tmp32, tmp32 }; truncate_right (t0, t1, p0); buf0[0] |= t0[0]; buf0[1] |= t0[1]; buf0[2] |= t0[2]; buf0[3] |= t0[3]; buf1[0] |= t1[0]; buf1[1] |= t1[1]; buf1[2] |= t1[2]; buf1[3] |= t1[3]; out_len += p0; return out_len; } u32 rule_op_mangle_dupechar_last (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; u32 tmp = 0; tmp |= buf0[0] & c_append_helper[in_len1][0]; tmp |= buf0[1] & c_append_helper[in_len1][1]; tmp |= buf0[2] & c_append_helper[in_len1][2]; tmp |= buf0[3] & c_append_helper[in_len1][3]; tmp |= buf1[0] & c_append_helper[in_len1][4]; tmp |= buf1[1] & c_append_helper[in_len1][5]; tmp |= buf1[2] & c_append_helper[in_len1][6]; tmp |= buf1[3] & c_append_helper[in_len1][7]; tmp = (tmp >> sh) & 0xff; u32 out_len = in_len; for (u32 i = 0; i < p0; i++) { append_block1 (out_len, buf0, buf1, tmp); out_len++; } return out_len; } u32 rule_op_mangle_dupechar_all (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; u32 tib40[4]; u32 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; } u32 rule_op_mangle_switch_first (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; } u32 rule_op_mangle_switch_last (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (in_len < 2) return in_len; u32 t[8]; t[0] = buf0[0]; t[1] = buf0[1]; t[2] = buf0[2]; t[3] = buf0[3]; t[4] = buf1[0]; t[5] = buf1[1]; t[6] = buf1[2]; t[7] = buf1[3]; exchange_byte (t, in_len - 2, in_len - 1); buf0[0] = t[0]; buf0[1] = t[1]; buf0[2] = t[2]; buf0[3] = t[3]; buf1[0] = t[4]; buf1[1] = t[5]; buf1[2] = t[6]; buf1[3] = t[7]; return in_len; } u32 rule_op_mangle_switch_at (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 >= in_len) return in_len; if (p1 >= in_len) return in_len; u32 t[8]; t[0] = buf0[0]; t[1] = buf0[1]; t[2] = buf0[2]; t[3] = buf0[3]; t[4] = buf1[0]; t[5] = buf1[1]; t[6] = buf1[2]; t[7] = buf1[3]; exchange_byte (t, p0, p1); buf0[0] = t[0]; buf0[1] = t[1]; buf0[2] = t[2]; buf0[3] = t[3]; buf1[0] = t[4]; buf1[1] = t[5]; buf1[2] = t[6]; buf1[3] = t[7]; return in_len; } u32 rule_op_mangle_chr_shiftl (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 >= in_len) return in_len; const u32 mr = 0xffu << ((p0 & 3) * 8); const u32 ml = ~mr; u32 t[8]; t[0] = buf0[0]; t[1] = buf0[1]; t[2] = buf0[2]; t[3] = buf0[3]; t[4] = buf1[0]; t[5] = buf1[1]; t[6] = buf1[2]; t[7] = buf1[3]; const u32 tmp = t[p0 / 4]; t[p0 / 4] = (tmp & ml) | (((tmp & mr) << 1) & mr); buf0[0] = t[0]; buf0[1] = t[1]; buf0[2] = t[2]; buf0[3] = t[3]; buf1[0] = t[4]; buf1[1] = t[5]; buf1[2] = t[6]; buf1[3] = t[7]; return in_len; } u32 rule_op_mangle_chr_shiftr (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 >= in_len) return in_len; const u32 mr = 0xffu << ((p0 & 3) * 8); const u32 ml = ~mr; u32 t[8]; t[0] = buf0[0]; t[1] = buf0[1]; t[2] = buf0[2]; t[3] = buf0[3]; t[4] = buf1[0]; t[5] = buf1[1]; t[6] = buf1[2]; t[7] = buf1[3]; const u32 tmp = t[p0 / 4]; t[p0 / 4] = (tmp & ml) | (((tmp & mr) >> 1) & mr); buf0[0] = t[0]; buf0[1] = t[1]; buf0[2] = t[2]; buf0[3] = t[3]; buf1[0] = t[4]; buf1[1] = t[5]; buf1[2] = t[6]; buf1[3] = t[7]; return in_len; } u32 rule_op_mangle_chr_incr (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 >= in_len) return in_len; const u32 mr = 0xffu << ((p0 & 3) * 8); const u32 ml = ~mr; const u32 n = 0x01010101 & mr; u32 t[8]; t[0] = buf0[0]; t[1] = buf0[1]; t[2] = buf0[2]; t[3] = buf0[3]; t[4] = buf1[0]; t[5] = buf1[1]; t[6] = buf1[2]; t[7] = buf1[3]; const u32 tmp = t[p0 / 4]; t[p0 / 4] = (tmp & ml) | (((tmp & mr) + n) & mr); buf0[0] = t[0]; buf0[1] = t[1]; buf0[2] = t[2]; buf0[3] = t[3]; buf1[0] = t[4]; buf1[1] = t[5]; buf1[2] = t[6]; buf1[3] = t[7]; return in_len; } u32 rule_op_mangle_chr_decr (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 >= in_len) return in_len; const u32 mr = 0xffu << ((p0 & 3) * 8); const u32 ml = ~mr; const u32 n = 0x01010101 & mr; u32 t[8]; t[0] = buf0[0]; t[1] = buf0[1]; t[2] = buf0[2]; t[3] = buf0[3]; t[4] = buf1[0]; t[5] = buf1[1]; t[6] = buf1[2]; t[7] = buf1[3]; const u32 tmp = t[p0 / 4]; t[p0 / 4] = (tmp & ml) | (((tmp & mr) - n) & mr); buf0[0] = t[0]; buf0[1] = t[1]; buf0[2] = t[2]; buf0[3] = t[3]; buf1[0] = t[4]; buf1[1] = t[5]; buf1[2] = t[6]; buf1[3] = t[7]; return in_len; } u32 rule_op_mangle_replace_np1 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if ((p0 + 1) >= in_len) return in_len; u32 tib4x[8]; lshift_block (buf0, buf1, tib4x + 0, tib4x + 4); const u32 mr = 0xffu << ((p0 & 3) * 8); const u32 ml = ~mr; u32 t[8]; t[0] = buf0[0]; t[1] = buf0[1]; t[2] = buf0[2]; t[3] = buf0[3]; t[4] = buf1[0]; t[5] = buf1[1]; t[6] = buf1[2]; t[7] = buf1[3]; const u32 tmp = t[p0 / 4]; const u32 tmp2 = tib4x[p0 / 4]; t[p0 / 4] = (tmp & ml) | (tmp2 & mr); buf0[0] = t[0]; buf0[1] = t[1]; buf0[2] = t[2]; buf0[3] = t[3]; buf1[0] = t[4]; buf1[1] = t[5]; buf1[2] = t[6]; buf1[3] = t[7]; return in_len; } u32 rule_op_mangle_replace_nm1 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 == 0) return in_len; if (p0 >= in_len) return in_len; u32 tib4x[8]; rshift_block (buf0, buf1, tib4x + 0, tib4x + 4); const u32 mr = 0xffu << ((p0 & 3) * 8); const u32 ml = ~mr; u32 t[8]; t[0] = buf0[0]; t[1] = buf0[1]; t[2] = buf0[2]; t[3] = buf0[3]; t[4] = buf1[0]; t[5] = buf1[1]; t[6] = buf1[2]; t[7] = buf1[3]; const u32 tmp = t[p0 / 4]; const u32 tmp2 = tib4x[p0 / 4]; t[p0 / 4] = (tmp & ml) | (tmp2 & mr); buf0[0] = t[0]; buf0[1] = t[1]; buf0[2] = t[2]; buf0[3] = t[3]; buf1[0] = t[4]; buf1[1] = t[5]; buf1[2] = t[6]; buf1[3] = t[7]; return in_len; } u32 rule_op_mangle_dupeblock_first (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; u32 tib40[4]; u32 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; } u32 rule_op_mangle_dupeblock_last (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; u32 tib40[4]; u32 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; } u32 toggle_on_register (const u32 in, const u32 r) { u32 out = in; const u32 cmask = generate_cmask (out); if (r & 1) out = out ^ (0x00000020 & cmask); if (r & 2) out = out ^ (0x00002000 & cmask); if (r & 4) out = out ^ (0x00200000 & cmask); if (r & 8) out = out ^ (0x20000000 & cmask); return out; } u32 rule_op_mangle_title_sep (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (in_len == 0) return in_len; u32 r0 = search_on_register (buf0[0], p0); u32 r1 = search_on_register (buf0[1], p0); u32 r2 = search_on_register (buf0[2], p0); u32 r3 = search_on_register (buf0[3], p0); u32 r4 = search_on_register (buf1[0], p0); u32 r5 = search_on_register (buf1[1], p0); u32 r6 = search_on_register (buf1[2], p0); u32 r7 = search_on_register (buf1[3], p0); rule_op_mangle_lrest_ufirst (p0, p1, buf0, buf1, in_len); const u32 rn = r0 + r1 + r2 + r3 + r4 + r5 + r6 + r7; if (rn == 0) return in_len; r0 <<= 1; r1 <<= 1; r1 |= r0 >> 4; r2 <<= 1; r2 |= r1 >> 4; r3 <<= 1; r3 |= r2 >> 4; r4 <<= 1; r4 |= r3 >> 4; r5 <<= 1; r5 |= r4 >> 4; r6 <<= 1; r6 |= r5 >> 4; r7 <<= 1; r7 |= r6 >> 4; buf0[0] = toggle_on_register (buf0[0], r0); buf0[1] = toggle_on_register (buf0[1], r1); buf0[2] = toggle_on_register (buf0[2], r2); buf0[3] = toggle_on_register (buf0[3], r3); buf1[0] = toggle_on_register (buf1[0], r0); buf1[1] = toggle_on_register (buf1[1], r1); buf1[2] = toggle_on_register (buf1[2], r2); buf1[3] = toggle_on_register (buf1[3], r3); return in_len; } u32 apply_rule (const u32 name, const u32 p0, const u32 p1, u32 buf0[4], u32 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_SEP: out_len = rule_op_mangle_title_sep (p0, p1, buf0, buf1, out_len); break; case RULE_OP_MANGLE_TITLE: out_len = rule_op_mangle_title_sep (' ', p1, buf0, buf1, out_len); break; } return out_len; } u32 apply_rules (__constant const u32 *cmds, u32 buf0[4], u32 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; } u32x apply_rules_vect (const u32 pw_buf0[4], const u32 pw_buf1[4], const u32 pw_len, __constant const kernel_rule_t *rules_buf, const u32 il_pos, u32x buf0[4], u32x buf1[4]) { #if VECT_SIZE == 1 buf0[0] = pw_buf0[0]; buf0[1] = pw_buf0[1]; buf0[2] = pw_buf0[2]; buf0[3] = pw_buf0[3]; buf1[0] = pw_buf1[0]; buf1[1] = pw_buf1[1]; buf1[2] = pw_buf1[2]; buf1[3] = pw_buf1[3]; return apply_rules (rules_buf[il_pos].cmds, buf0, buf1, pw_len); #else u32x out_len = 0; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < VECT_SIZE; i++) { u32 tmp0[4]; u32 tmp1[4]; tmp0[0] = pw_buf0[0]; tmp0[1] = pw_buf0[1]; tmp0[2] = pw_buf0[2]; tmp0[3] = pw_buf0[3]; tmp1[0] = pw_buf1[0]; tmp1[1] = pw_buf1[1]; tmp1[2] = pw_buf1[2]; tmp1[3] = pw_buf1[3]; const u32 tmp_len = apply_rules (rules_buf[il_pos + i].cmds, tmp0, tmp1, pw_len); switch (i) { #if VECT_SIZE >= 2 case 0: buf0[0].s0 = tmp0[0]; buf0[1].s0 = tmp0[1]; buf0[2].s0 = tmp0[2]; buf0[3].s0 = tmp0[3]; buf1[0].s0 = tmp1[0]; buf1[1].s0 = tmp1[1]; buf1[2].s0 = tmp1[2]; buf1[3].s0 = tmp1[3]; out_len.s0 = tmp_len; break; case 1: buf0[0].s1 = tmp0[0]; buf0[1].s1 = tmp0[1]; buf0[2].s1 = tmp0[2]; buf0[3].s1 = tmp0[3]; buf1[0].s1 = tmp1[0]; buf1[1].s1 = tmp1[1]; buf1[2].s1 = tmp1[2]; buf1[3].s1 = tmp1[3]; out_len.s1 = tmp_len; break; #endif #if VECT_SIZE >= 4 case 2: buf0[0].s2 = tmp0[0]; buf0[1].s2 = tmp0[1]; buf0[2].s2 = tmp0[2]; buf0[3].s2 = tmp0[3]; buf1[0].s2 = tmp1[0]; buf1[1].s2 = tmp1[1]; buf1[2].s2 = tmp1[2]; buf1[3].s2 = tmp1[3]; out_len.s2 = tmp_len; break; case 3: buf0[0].s3 = tmp0[0]; buf0[1].s3 = tmp0[1]; buf0[2].s3 = tmp0[2]; buf0[3].s3 = tmp0[3]; buf1[0].s3 = tmp1[0]; buf1[1].s3 = tmp1[1]; buf1[2].s3 = tmp1[2]; buf1[3].s3 = tmp1[3]; out_len.s3 = tmp_len; break; #endif #if VECT_SIZE >= 8 case 4: buf0[0].s4 = tmp0[0]; buf0[1].s4 = tmp0[1]; buf0[2].s4 = tmp0[2]; buf0[3].s4 = tmp0[3]; buf1[0].s4 = tmp1[0]; buf1[1].s4 = tmp1[1]; buf1[2].s4 = tmp1[2]; buf1[3].s4 = tmp1[3]; out_len.s4 = tmp_len; break; case 5: buf0[0].s5 = tmp0[0]; buf0[1].s5 = tmp0[1]; buf0[2].s5 = tmp0[2]; buf0[3].s5 = tmp0[3]; buf1[0].s5 = tmp1[0]; buf1[1].s5 = tmp1[1]; buf1[2].s5 = tmp1[2]; buf1[3].s5 = tmp1[3]; out_len.s5 = tmp_len; break; case 6: buf0[0].s6 = tmp0[0]; buf0[1].s6 = tmp0[1]; buf0[2].s6 = tmp0[2]; buf0[3].s6 = tmp0[3]; buf1[0].s6 = tmp1[0]; buf1[1].s6 = tmp1[1]; buf1[2].s6 = tmp1[2]; buf1[3].s6 = tmp1[3]; out_len.s6 = tmp_len; break; case 7: buf0[0].s7 = tmp0[0]; buf0[1].s7 = tmp0[1]; buf0[2].s7 = tmp0[2]; buf0[3].s7 = tmp0[3]; buf1[0].s7 = tmp1[0]; buf1[1].s7 = tmp1[1]; buf1[2].s7 = tmp1[2]; buf1[3].s7 = tmp1[3]; out_len.s7 = tmp_len; break; #endif #if VECT_SIZE >= 16 case 8: buf0[0].s8 = tmp0[0]; buf0[1].s8 = tmp0[1]; buf0[2].s8 = tmp0[2]; buf0[3].s8 = tmp0[3]; buf1[0].s8 = tmp1[0]; buf1[1].s8 = tmp1[1]; buf1[2].s8 = tmp1[2]; buf1[3].s8 = tmp1[3]; out_len.s8 = tmp_len; break; case 9: buf0[0].s9 = tmp0[0]; buf0[1].s9 = tmp0[1]; buf0[2].s9 = tmp0[2]; buf0[3].s9 = tmp0[3]; buf1[0].s9 = tmp1[0]; buf1[1].s9 = tmp1[1]; buf1[2].s9 = tmp1[2]; buf1[3].s9 = tmp1[3]; out_len.s9 = tmp_len; break; case 10: buf0[0].sa = tmp0[0]; buf0[1].sa = tmp0[1]; buf0[2].sa = tmp0[2]; buf0[3].sa = tmp0[3]; buf1[0].sa = tmp1[0]; buf1[1].sa = tmp1[1]; buf1[2].sa = tmp1[2]; buf1[3].sa = tmp1[3]; out_len.sa = tmp_len; break; case 11: buf0[0].sb = tmp0[0]; buf0[1].sb = tmp0[1]; buf0[2].sb = tmp0[2]; buf0[3].sb = tmp0[3]; buf1[0].sb = tmp1[0]; buf1[1].sb = tmp1[1]; buf1[2].sb = tmp1[2]; buf1[3].sb = tmp1[3]; out_len.sb = tmp_len; break; case 12: buf0[0].sc = tmp0[0]; buf0[1].sc = tmp0[1]; buf0[2].sc = tmp0[2]; buf0[3].sc = tmp0[3]; buf1[0].sc = tmp1[0]; buf1[1].sc = tmp1[1]; buf1[2].sc = tmp1[2]; buf1[3].sc = tmp1[3]; out_len.sc = tmp_len; break; case 13: buf0[0].sd = tmp0[0]; buf0[1].sd = tmp0[1]; buf0[2].sd = tmp0[2]; buf0[3].sd = tmp0[3]; buf1[0].sd = tmp1[0]; buf1[1].sd = tmp1[1]; buf1[2].sd = tmp1[2]; buf1[3].sd = tmp1[3]; out_len.sd = tmp_len; break; case 14: buf0[0].se = tmp0[0]; buf0[1].se = tmp0[1]; buf0[2].se = tmp0[2]; buf0[3].se = tmp0[3]; buf1[0].se = tmp1[0]; buf1[1].se = tmp1[1]; buf1[2].se = tmp1[2]; buf1[3].se = tmp1[3]; out_len.se = tmp_len; break; case 15: buf0[0].sf = tmp0[0]; buf0[1].sf = tmp0[1]; buf0[2].sf = tmp0[2]; buf0[3].sf = tmp0[3]; buf1[0].sf = tmp1[0]; buf1[1].sf = tmp1[1]; buf1[2].sf = tmp1[2]; buf1[3].sf = tmp1[3]; out_len.sf = tmp_len; break; #endif } } return out_len; #endif } hashcat-4.0.1/OpenCL/inc_rp_optimized.h000066400000000000000000000043621320027462700177660ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * 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_MANGLE_TITLE_SEP 'e' #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' hashcat-4.0.1/OpenCL/inc_scalar.cl000066400000000000000000000073621320027462700167000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define COMPARE_S_SCALAR(h0,h1,h2,h3) \ { \ if (((h0) == search[0]) && ((h1) == search[1]) && ((h2) == search[2]) && ((h3) == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (atomic_inc (&hashes_shown[final_hash_pos]) == 0) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos); \ } \ } \ } #define COMPARE_M_SCALAR(h0,h1,h2,h3) \ { \ const u32 digest_tp0[4] = { h0, h1, h2, h3 }; \ \ if (check (digest_tp0, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp0, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (atomic_inc (&hashes_shown[final_hash_pos]) == 0) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos); \ } \ } \ } \ } hashcat-4.0.1/OpenCL/inc_simd.cl000066400000000000000000003615471320027462700163770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ // vliw1 #if VECT_SIZE == 1 #define MATCHES_ONE_VV(a,b) ((a) == (b)) #define MATCHES_ONE_VS(a,b) ((a) == (b)) #define COMPARE_S_SIMD(h0,h1,h2,h3) \ { \ if (((h0) == search[0]) && ((h1) == search[1]) && ((h2) == search[2]) && ((h3) == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (atomic_inc (&hashes_shown[final_hash_pos]) == 0) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos); \ } \ } \ } #define COMPARE_M_SIMD(h0,h1,h2,h3) \ { \ const u32 digest_tp0[4] = { h0, h1, h2, h3 }; \ \ if (check (digest_tp0, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp0, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (atomic_inc (&hashes_shown[final_hash_pos]) == 0) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos); \ } \ } \ } \ } #endif // vliw2 #define vector_accessible(p,c,e) (((p) + (e)) < (c)) #if VECT_SIZE == 2 #define MATCHES_ONE_VV(a,b) (((a).s0 == (b).s0) || ((a).s1 == (b).s1)) #define MATCHES_ONE_VS(a,b) (((a).s0 == (b) ) || ((a).s1 == (b) )) #define COMPARE_S_SIMD(h0,h1,h2,h3) \ { \ if (((h0).s0 == search[0]) && ((h1).s0 == search[1]) && ((h2).s0 == search[2]) && ((h3).s0 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 0) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 0); \ } \ } \ \ if (((h0).s1 == search[0]) && ((h1).s1 == search[1]) && ((h2).s1 == search[2]) && ((h3).s1 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 1) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 1); \ } \ } \ } #define COMPARE_M_SIMD(h0,h1,h2,h3) \ { \ const u32 digest_tp0[4] = { h0.s0, h1.s0, h2.s0, h3.s0 }; \ const u32 digest_tp1[4] = { h0.s1, h1.s1, h2.s1, h3.s1 }; \ \ if (check (digest_tp0, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp0, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 0) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 0); \ } \ } \ } \ \ if (check (digest_tp1, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp1, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 1) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 1); \ } \ } \ } \ } #endif // vliw4 #if VECT_SIZE == 4 #define MATCHES_ONE_VV(a,b) (((a).s0 == (b).s0) || ((a).s1 == (b).s1) || ((a).s2 == (b).s2) || ((a).s3 == (b).s3)) #define MATCHES_ONE_VS(a,b) (((a).s0 == (b) ) || ((a).s1 == (b) ) || ((a).s2 == (b) ) || ((a).s3 == (b) )) #define COMPARE_S_SIMD(h0,h1,h2,h3) \ { \ if (((h0).s0 == search[0]) && ((h1).s0 == search[1]) && ((h2).s0 == search[2]) && ((h3).s0 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 0) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 0); \ } \ } \ \ if (((h0).s1 == search[0]) && ((h1).s1 == search[1]) && ((h2).s1 == search[2]) && ((h3).s1 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 1) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 1); \ } \ } \ \ if (((h0).s2 == search[0]) && ((h1).s2 == search[1]) && ((h2).s2 == search[2]) && ((h3).s2 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 2) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 2); \ } \ } \ \ if (((h0).s3 == search[0]) && ((h1).s3 == search[1]) && ((h2).s3 == search[2]) && ((h3).s3 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 3) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 3); \ } \ } \ } #define COMPARE_M_SIMD(h0,h1,h2,h3) \ { \ const u32 digest_tp0[4] = { h0.s0, h1.s0, h2.s0, h3.s0 }; \ const u32 digest_tp1[4] = { h0.s1, h1.s1, h2.s1, h3.s1 }; \ const u32 digest_tp2[4] = { h0.s2, h1.s2, h2.s2, h3.s2 }; \ const u32 digest_tp3[4] = { h0.s3, h1.s3, h2.s3, h3.s3 }; \ \ if (check (digest_tp0, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp0, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 0) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 0); \ } \ } \ } \ \ if (check (digest_tp1, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp1, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 1) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 1); \ } \ } \ } \ \ if (check (digest_tp2, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp2, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 2) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 2); \ } \ } \ } \ \ if (check (digest_tp3, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp3, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 3) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 3); \ } \ } \ } \ } #endif // vliw8 #if VECT_SIZE == 8 #define MATCHES_ONE_VV(a,b) (((a).s0 == (b).s0) || ((a).s1 == (b).s1) || ((a).s2 == (b).s2) || ((a).s3 == (b).s3) || ((a).s4 == (b).s4) || ((a).s5 == (b).s5) || ((a).s6 == (b).s6) || ((a).s7 == (b).s7)) #define MATCHES_ONE_VS(a,b) (((a).s0 == (b) ) || ((a).s1 == (b) ) || ((a).s2 == (b) ) || ((a).s3 == (b) ) || ((a).s4 == (b) ) || ((a).s5 == (b) ) || ((a).s6 == (b) ) || ((a).s7 == (b) )) #define COMPARE_S_SIMD(h0,h1,h2,h3) \ { \ if (((h0).s0 == search[0]) && ((h1).s0 == search[1]) && ((h2).s0 == search[2]) && ((h3).s0 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 0) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 0); \ } \ } \ \ if (((h0).s1 == search[0]) && ((h1).s1 == search[1]) && ((h2).s1 == search[2]) && ((h3).s1 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 1) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 1); \ } \ } \ \ if (((h0).s2 == search[0]) && ((h1).s2 == search[1]) && ((h2).s2 == search[2]) && ((h3).s2 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 2) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 2); \ } \ } \ \ if (((h0).s3 == search[0]) && ((h1).s3 == search[1]) && ((h2).s3 == search[2]) && ((h3).s3 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 3) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 3); \ } \ } \ if (((h0).s4 == search[0]) && ((h1).s4 == search[1]) && ((h2).s4 == search[2]) && ((h3).s4 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 4) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 4); \ } \ } \ \ if (((h0).s5 == search[0]) && ((h1).s5 == search[1]) && ((h2).s5 == search[2]) && ((h3).s5 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 5) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 5); \ } \ } \ \ if (((h0).s6 == search[0]) && ((h1).s6 == search[1]) && ((h2).s6 == search[2]) && ((h3).s6 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 6) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 6); \ } \ } \ \ if (((h0).s7 == search[0]) && ((h1).s7 == search[1]) && ((h2).s7 == search[2]) && ((h3).s7 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 7) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 7); \ } \ } \ } #define COMPARE_M_SIMD(h0,h1,h2,h3) \ { \ const u32 digest_tp0[4] = { h0.s0, h1.s0, h2.s0, h3.s0 }; \ const u32 digest_tp1[4] = { h0.s1, h1.s1, h2.s1, h3.s1 }; \ const u32 digest_tp2[4] = { h0.s2, h1.s2, h2.s2, h3.s2 }; \ const u32 digest_tp3[4] = { h0.s3, h1.s3, h2.s3, h3.s3 }; \ const u32 digest_tp4[4] = { h0.s4, h1.s4, h2.s4, h3.s4 }; \ const u32 digest_tp5[4] = { h0.s5, h1.s5, h2.s5, h3.s5 }; \ const u32 digest_tp6[4] = { h0.s6, h1.s6, h2.s6, h3.s6 }; \ const u32 digest_tp7[4] = { h0.s7, h1.s7, h2.s7, h3.s7 }; \ \ if (check (digest_tp0, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp0, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 0) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 0); \ } \ } \ } \ \ if (check (digest_tp1, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp1, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 1) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 1); \ } \ } \ } \ \ if (check (digest_tp2, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp2, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 2) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 2); \ } \ } \ } \ \ if (check (digest_tp3, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp3, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 3) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 3); \ } \ } \ } \ if (check (digest_tp4, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp4, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 4) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 4); \ } \ } \ } \ \ if (check (digest_tp5, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp5, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 5) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 5); \ } \ } \ } \ \ if (check (digest_tp6, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp6, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 6) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 6); \ } \ } \ } \ \ if (check (digest_tp7, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp7, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 7) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 7); \ } \ } \ } \ } #endif // vliw16 #if VECT_SIZE == 16 #define MATCHES_ONE_VV(a,b) (((a).s0 == (b).s0) || ((a).s1 == (b).s1) || ((a).s2 == (b).s2) || ((a).s3 == (b).s3) || ((a).s4 == (b).s4) || ((a).s5 == (b).s5) || ((a).s6 == (b).s6) || ((a).s7 == (b).s7) || ((a).s8 == (b).s8) || ((a).s9 == (b).s9) || ((a).sa == (b).sa) || ((a).sb == (b).sb) || ((a).sc == (b).sc) || ((a).sd == (b).sd) || ((a).se == (b).se) || ((a).sf == (b).sf)) #define MATCHES_ONE_VS(a,b) (((a).s0 == (b) ) || ((a).s1 == (b) ) || ((a).s2 == (b) ) || ((a).s3 == (b) ) || ((a).s4 == (b) ) || ((a).s5 == (b) ) || ((a).s6 == (b) ) || ((a).s7 == (b) ) || ((a).s8 == (b) ) || ((a).s9 == (b) ) || ((a).sa == (b) ) || ((a).sb == (b) ) || ((a).sc == (b) ) || ((a).sd == (b) ) || ((a).se == (b) ) || ((a).sf == (b) )) #define COMPARE_S_SIMD(h0,h1,h2,h3) \ { \ if (((h0).s0 == search[0]) && ((h1).s0 == search[1]) && ((h2).s0 == search[2]) && ((h3).s0 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 0) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 0); \ } \ } \ \ if (((h0).s1 == search[0]) && ((h1).s1 == search[1]) && ((h2).s1 == search[2]) && ((h3).s1 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 1) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 1); \ } \ } \ \ if (((h0).s2 == search[0]) && ((h1).s2 == search[1]) && ((h2).s2 == search[2]) && ((h3).s2 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 2) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 2); \ } \ } \ \ if (((h0).s3 == search[0]) && ((h1).s3 == search[1]) && ((h2).s3 == search[2]) && ((h3).s3 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 3) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 3); \ } \ } \ if (((h0).s4 == search[0]) && ((h1).s4 == search[1]) && ((h2).s4 == search[2]) && ((h3).s4 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 4) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 4); \ } \ } \ \ if (((h0).s5 == search[0]) && ((h1).s5 == search[1]) && ((h2).s5 == search[2]) && ((h3).s5 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 5) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 5); \ } \ } \ \ if (((h0).s6 == search[0]) && ((h1).s6 == search[1]) && ((h2).s6 == search[2]) && ((h3).s6 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 6) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 6); \ } \ } \ \ if (((h0).s7 == search[0]) && ((h1).s7 == search[1]) && ((h2).s7 == search[2]) && ((h3).s7 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 7) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 7); \ } \ } \ \ if (((h0).s8 == search[0]) && ((h1).s8 == search[1]) && ((h2).s8 == search[2]) && ((h3).s8 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 8) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 8); \ } \ } \ \ if (((h0).s9 == search[0]) && ((h1).s9 == search[1]) && ((h2).s9 == search[2]) && ((h3).s9 == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 9) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 9); \ } \ } \ \ if (((h0).sa == search[0]) && ((h1).sa == search[1]) && ((h2).sa == search[2]) && ((h3).sa == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 10) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 10); \ } \ } \ \ if (((h0).sb == search[0]) && ((h1).sb == search[1]) && ((h2).sb == search[2]) && ((h3).sb == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 11) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 11); \ } \ } \ \ if (((h0).sc == search[0]) && ((h1).sc == search[1]) && ((h2).sc == search[2]) && ((h3).sc == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 12) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 12); \ } \ } \ \ if (((h0).sd == search[0]) && ((h1).sd == search[1]) && ((h2).sd == search[2]) && ((h3).sd == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 13) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 13); \ } \ } \ \ if (((h0).se == search[0]) && ((h1).se == search[1]) && ((h2).se == search[2]) && ((h3).se == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 14) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 14); \ } \ } \ \ if (((h0).sf == search[0]) && ((h1).sf == search[1]) && ((h2).sf == search[2]) && ((h3).sf == search[3])) \ { \ const u32 final_hash_pos = digests_offset + 0; \ \ if (vector_accessible (il_pos, il_cnt, 15) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, final_hash_pos, gid, il_pos + 15); \ } \ } \ } #define COMPARE_M_SIMD(h0,h1,h2,h3) \ { \ const u32 digest_tp00[4] = { h0.s0, h1.s0, h2.s0, h3.s0 }; \ const u32 digest_tp01[4] = { h0.s1, h1.s1, h2.s1, h3.s1 }; \ const u32 digest_tp02[4] = { h0.s2, h1.s2, h2.s2, h3.s2 }; \ const u32 digest_tp03[4] = { h0.s3, h1.s3, h2.s3, h3.s3 }; \ const u32 digest_tp04[4] = { h0.s4, h1.s4, h2.s4, h3.s4 }; \ const u32 digest_tp05[4] = { h0.s5, h1.s5, h2.s5, h3.s5 }; \ const u32 digest_tp06[4] = { h0.s6, h1.s6, h2.s6, h3.s6 }; \ const u32 digest_tp07[4] = { h0.s7, h1.s7, h2.s7, h3.s7 }; \ const u32 digest_tp08[4] = { h0.s8, h1.s8, h2.s8, h3.s8 }; \ const u32 digest_tp09[4] = { h0.s9, h1.s9, h2.s9, h3.s9 }; \ const u32 digest_tp10[4] = { h0.sa, h1.sa, h2.sa, h3.sa }; \ const u32 digest_tp11[4] = { h0.sb, h1.sb, h2.sb, h3.sb }; \ const u32 digest_tp12[4] = { h0.sc, h1.sc, h2.sc, h3.sc }; \ const u32 digest_tp13[4] = { h0.sd, h1.sd, h2.sd, h3.sd }; \ const u32 digest_tp14[4] = { h0.se, h1.se, h2.se, h3.se }; \ const u32 digest_tp15[4] = { h0.sf, h1.sf, h2.sf, h3.sf }; \ \ if (check (digest_tp00, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp00, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 0) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 0); \ } \ } \ } \ \ if (check (digest_tp01, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp01, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 1) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 1); \ } \ } \ } \ \ if (check (digest_tp02, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp02, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 2) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 2); \ } \ } \ } \ \ if (check (digest_tp03, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp03, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 3) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 3); \ } \ } \ } \ \ if (check (digest_tp04, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp04, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 4) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 4); \ } \ } \ } \ \ if (check (digest_tp05, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp05, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 5) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 5); \ } \ } \ } \ \ if (check (digest_tp06, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp06, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 6) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 6); \ } \ } \ } \ \ if (check (digest_tp07, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp07, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 7) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 7); \ } \ } \ } \ \ if (check (digest_tp08, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp08, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 8) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 8); \ } \ } \ } \ \ if (check (digest_tp09, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp09, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 9) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 9); \ } \ } \ } \ \ if (check (digest_tp10, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp10, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 10) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 10); \ } \ } \ } \ \ if (check (digest_tp11, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp11, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 11) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 11); \ } \ } \ } \ \ if (check (digest_tp12, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp12, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 12) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 12); \ } \ } \ } \ \ if (check (digest_tp13, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp13, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 13) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 13); \ } \ } \ } \ \ if (check (digest_tp14, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp14, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 14) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 14); \ } \ } \ } \ \ if (check (digest_tp15, \ bitmaps_buf_s1_a, bitmaps_buf_s1_b, 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 digest_pos = find_hash (digest_tp15, digests_cnt, &digests_buf[digests_offset]); \ \ if (digest_pos != -1) \ { \ const u32 final_hash_pos = digests_offset + digest_pos; \ \ if (vector_accessible (il_pos, il_cnt, 15) && (atomic_inc (&hashes_shown[final_hash_pos]) == 0)) \ { \ mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, final_hash_pos, gid, il_pos + 15); \ } \ } \ } \ } #endif #define MATCHES_NONE_VV(a,b) !(MATCHES_ONE_VV ((a), (b))) #define MATCHES_NONE_VS(a,b) !(MATCHES_ONE_VS ((a), (b))) // attack-mode 0 u32x ix_create_bft (__global const bf_t *bfs_buf, const u32 il_pos) { #if VECT_SIZE == 1 const u32x ix = (u32x) (bfs_buf[il_pos + 0].i); #elif VECT_SIZE == 2 const u32x ix = (u32x) (bfs_buf[il_pos + 0].i, bfs_buf[il_pos + 1].i); #elif VECT_SIZE == 4 const u32x ix = (u32x) (bfs_buf[il_pos + 0].i, bfs_buf[il_pos + 1].i, bfs_buf[il_pos + 2].i, bfs_buf[il_pos + 3].i); #elif VECT_SIZE == 8 const u32x ix = (u32x) (bfs_buf[il_pos + 0].i, bfs_buf[il_pos + 1].i, bfs_buf[il_pos + 2].i, bfs_buf[il_pos + 3].i, bfs_buf[il_pos + 4].i, bfs_buf[il_pos + 5].i, bfs_buf[il_pos + 6].i, bfs_buf[il_pos + 7].i); #elif VECT_SIZE == 16 const u32x ix = (u32x) (bfs_buf[il_pos + 0].i, bfs_buf[il_pos + 1].i, bfs_buf[il_pos + 2].i, bfs_buf[il_pos + 3].i, bfs_buf[il_pos + 4].i, bfs_buf[il_pos + 5].i, bfs_buf[il_pos + 6].i, bfs_buf[il_pos + 7].i, bfs_buf[il_pos + 8].i, bfs_buf[il_pos + 9].i, bfs_buf[il_pos + 10].i, bfs_buf[il_pos + 11].i, bfs_buf[il_pos + 12].i, bfs_buf[il_pos + 13].i, bfs_buf[il_pos + 14].i, bfs_buf[il_pos + 15].i); #endif return ix; } // attack-mode 1 u32x pwlenx_create_combt (__global const pw_t *combs_buf, const u32 il_pos) { #if VECT_SIZE == 1 const u32x pw_lenx = (u32x) (combs_buf[il_pos + 0].pw_len); #elif VECT_SIZE == 2 const u32x pw_lenx = (u32x) (combs_buf[il_pos + 0].pw_len, combs_buf[il_pos + 1].pw_len); #elif VECT_SIZE == 4 const u32x pw_lenx = (u32x) (combs_buf[il_pos + 0].pw_len, combs_buf[il_pos + 1].pw_len, combs_buf[il_pos + 2].pw_len, combs_buf[il_pos + 3].pw_len); #elif VECT_SIZE == 8 const u32x pw_lenx = (u32x) (combs_buf[il_pos + 0].pw_len, combs_buf[il_pos + 1].pw_len, combs_buf[il_pos + 2].pw_len, combs_buf[il_pos + 3].pw_len, combs_buf[il_pos + 4].pw_len, combs_buf[il_pos + 5].pw_len, combs_buf[il_pos + 6].pw_len, combs_buf[il_pos + 7].pw_len); #elif VECT_SIZE == 16 const u32x pw_lenx = (u32x) (combs_buf[il_pos + 0].pw_len, combs_buf[il_pos + 1].pw_len, combs_buf[il_pos + 2].pw_len, combs_buf[il_pos + 3].pw_len, combs_buf[il_pos + 4].pw_len, combs_buf[il_pos + 5].pw_len, combs_buf[il_pos + 6].pw_len, combs_buf[il_pos + 7].pw_len, combs_buf[il_pos + 8].pw_len, combs_buf[il_pos + 9].pw_len, combs_buf[il_pos + 10].pw_len, combs_buf[il_pos + 11].pw_len, combs_buf[il_pos + 12].pw_len, combs_buf[il_pos + 13].pw_len, combs_buf[il_pos + 14].pw_len, combs_buf[il_pos + 15].pw_len); #endif return pw_lenx; } u32x ix_create_combt (__global const pw_t *combs_buf, const u32 il_pos, const int idx) { #if VECT_SIZE == 1 const u32x ix = (u32x) (combs_buf[il_pos + 0].i[idx]); #elif VECT_SIZE == 2 const u32x ix = (u32x) (combs_buf[il_pos + 0].i[idx], combs_buf[il_pos + 1].i[idx]); #elif VECT_SIZE == 4 const u32x ix = (u32x) (combs_buf[il_pos + 0].i[idx], combs_buf[il_pos + 1].i[idx], combs_buf[il_pos + 2].i[idx], combs_buf[il_pos + 3].i[idx]); #elif VECT_SIZE == 8 const u32x ix = (u32x) (combs_buf[il_pos + 0].i[idx], combs_buf[il_pos + 1].i[idx], combs_buf[il_pos + 2].i[idx], combs_buf[il_pos + 3].i[idx], combs_buf[il_pos + 4].i[idx], combs_buf[il_pos + 5].i[idx], combs_buf[il_pos + 6].i[idx], combs_buf[il_pos + 7].i[idx]); #elif VECT_SIZE == 16 const u32x ix = (u32x) (combs_buf[il_pos + 0].i[idx], combs_buf[il_pos + 1].i[idx], combs_buf[il_pos + 2].i[idx], combs_buf[il_pos + 3].i[idx], combs_buf[il_pos + 4].i[idx], combs_buf[il_pos + 5].i[idx], combs_buf[il_pos + 6].i[idx], combs_buf[il_pos + 7].i[idx], combs_buf[il_pos + 8].i[idx], combs_buf[il_pos + 9].i[idx], combs_buf[il_pos + 10].i[idx], combs_buf[il_pos + 11].i[idx], combs_buf[il_pos + 12].i[idx], combs_buf[il_pos + 13].i[idx], combs_buf[il_pos + 14].i[idx], combs_buf[il_pos + 15].i[idx]); #endif return ix; } #if VECT_SIZE == 1 #define packv(arr,var,gid,idx) (u32x) ((arr)[((gid) * 1) + 0].var[(idx)]) #elif VECT_SIZE == 2 #define packv(arr,var,gid,idx) (u32x) ((arr)[((gid) * 2) + 0].var[(idx)], (arr)[((gid) * 2) + 1].var[(idx)]) #elif VECT_SIZE == 4 #define packv(arr,var,gid,idx) (u32x) ((arr)[((gid) * 4) + 0].var[(idx)], (arr)[((gid) * 4) + 1].var[(idx)], (arr)[((gid) * 4) + 2].var[(idx)], (arr)[((gid) * 4) + 3].var[(idx)]) #elif VECT_SIZE == 8 #define packv(arr,var,gid,idx) (u32x) ((arr)[((gid) * 8) + 0].var[(idx)], (arr)[((gid) * 8) + 1].var[(idx)], (arr)[((gid) * 8) + 2].var[(idx)], (arr)[((gid) * 8) + 3].var[(idx)], (arr)[((gid) * 8) + 4].var[(idx)], (arr)[((gid) * 8) + 5].var[(idx)], (arr)[((gid) * 8) + 6].var[(idx)], (arr)[((gid) * 8) + 7].var[(idx)]) #elif VECT_SIZE == 16 #define packv(arr,var,gid,idx) (u32x) ((arr)[((gid) * 16) + 0].var[(idx)], (arr)[((gid) * 16) + 1].var[(idx)], (arr)[((gid) * 16) + 2].var[(idx)], (arr)[((gid) * 16) + 3].var[(idx)], (arr)[((gid) * 16) + 4].var[(idx)], (arr)[((gid) * 16) + 5].var[(idx)], (arr)[((gid) * 16) + 6].var[(idx)], (arr)[((gid) * 16) + 7].var[(idx)], (arr)[((gid) * 16) + 8].var[(idx)], (arr)[((gid) * 16) + 9].var[(idx)], (arr)[((gid) * 16) + 10].var[(idx)], (arr)[((gid) * 16) + 11].var[(idx)], (arr)[((gid) * 16) + 12].var[(idx)], (arr)[((gid) * 16) + 13].var[(idx)], (arr)[((gid) * 16) + 14].var[(idx)], (arr)[((gid) * 16) + 15].var[(idx)]) #endif #if VECT_SIZE == 1 #define pack64v(arr,var,gid,idx) (u64x) ((arr)[((gid) * 1) + 0].var[(idx)]) #elif VECT_SIZE == 2 #define pack64v(arr,var,gid,idx) (u64x) ((arr)[((gid) * 2) + 0].var[(idx)], (arr)[((gid) * 2) + 1].var[(idx)]) #elif VECT_SIZE == 4 #define pack64v(arr,var,gid,idx) (u64x) ((arr)[((gid) * 4) + 0].var[(idx)], (arr)[((gid) * 4) + 1].var[(idx)], (arr)[((gid) * 4) + 2].var[(idx)], (arr)[((gid) * 4) + 3].var[(idx)]) #elif VECT_SIZE == 8 #define pack64v(arr,var,gid,idx) (u64x) ((arr)[((gid) * 8) + 0].var[(idx)], (arr)[((gid) * 8) + 1].var[(idx)], (arr)[((gid) * 8) + 2].var[(idx)], (arr)[((gid) * 8) + 3].var[(idx)], (arr)[((gid) * 8) + 4].var[(idx)], (arr)[((gid) * 8) + 5].var[(idx)], (arr)[((gid) * 8) + 6].var[(idx)], (arr)[((gid) * 8) + 7].var[(idx)]) #elif VECT_SIZE == 16 #define pack64v(arr,var,gid,idx) (u64x) ((arr)[((gid) * 16) + 0].var[(idx)], (arr)[((gid) * 16) + 1].var[(idx)], (arr)[((gid) * 16) + 2].var[(idx)], (arr)[((gid) * 16) + 3].var[(idx)], (arr)[((gid) * 16) + 4].var[(idx)], (arr)[((gid) * 16) + 5].var[(idx)], (arr)[((gid) * 16) + 6].var[(idx)], (arr)[((gid) * 16) + 7].var[(idx)], (arr)[((gid) * 16) + 8].var[(idx)], (arr)[((gid) * 16) + 9].var[(idx)], (arr)[((gid) * 16) + 10].var[(idx)], (arr)[((gid) * 16) + 11].var[(idx)], (arr)[((gid) * 16) + 12].var[(idx)], (arr)[((gid) * 16) + 13].var[(idx)], (arr)[((gid) * 16) + 14].var[(idx)], (arr)[((gid) * 16) + 15].var[(idx)]) #endif #if VECT_SIZE == 1 #define packvf(arr,var,gid) (u32x) ((arr)[((gid) * 1) + 0].var) #elif VECT_SIZE == 2 #define packvf(arr,var,gid) (u32x) ((arr)[((gid) * 2) + 0].var, (arr)[((gid) * 2) + 1].var) #elif VECT_SIZE == 4 #define packvf(arr,var,gid) (u32x) ((arr)[((gid) * 4) + 0].var, (arr)[((gid) * 4) + 1].var, (arr)[((gid) * 4) + 2].var, (arr)[((gid) * 4) + 3].var) #elif VECT_SIZE == 8 #define packvf(arr,var,gid) (u32x) ((arr)[((gid) * 8) + 0].var, (arr)[((gid) * 8) + 1].var, (arr)[((gid) * 8) + 2].var, (arr)[((gid) * 8) + 3].var, (arr)[((gid) * 8) + 4].var, (arr)[((gid) * 8) + 5].var, (arr)[((gid) * 8) + 6].var, (arr)[((gid) * 8) + 7].var) #elif VECT_SIZE == 16 #define packvf(arr,var,gid) (u32x) ((arr)[((gid) * 16) + 0].var, (arr)[((gid) * 16) + 1].var, (arr)[((gid) * 16) + 2].var, (arr)[((gid) * 16) + 3].var, (arr)[((gid) * 16) + 4].var, (arr)[((gid) * 16) + 5].var, (arr)[((gid) * 16) + 6].var, (arr)[((gid) * 16) + 7].var, (arr)[((gid) * 16) + 8].var, (arr)[((gid) * 16) + 9].var, (arr)[((gid) * 16) + 10].var, (arr)[((gid) * 16) + 11].var, (arr)[((gid) * 16) + 12].var, (arr)[((gid) * 16) + 13].var, (arr)[((gid) * 16) + 14].var, (arr)[((gid) * 16) + 15].var) #endif #if VECT_SIZE == 1 #define pack64vf(arr,var,gid) (u64x) ((arr)[((gid) * 1) + 0].var) #elif VECT_SIZE == 2 #define pack64vf(arr,var,gid) (u64x) ((arr)[((gid) * 2) + 0].var, (arr)[((gid) * 2) + 1].var) #elif VECT_SIZE == 4 #define pack64vf(arr,var,gid) (u64x) ((arr)[((gid) * 4) + 0].var, (arr)[((gid) * 4) + 1].var, (arr)[((gid) * 4) + 2].var, (arr)[((gid) * 4) + 3].var) #elif VECT_SIZE == 8 #define pack64vf(arr,var,gid) (u64x) ((arr)[((gid) * 8) + 0].var, (arr)[((gid) * 8) + 1].var, (arr)[((gid) * 8) + 2].var, (arr)[((gid) * 8) + 3].var, (arr)[((gid) * 8) + 4].var, (arr)[((gid) * 8) + 5].var, (arr)[((gid) * 8) + 6].var, (arr)[((gid) * 8) + 7].var) #elif VECT_SIZE == 16 #define pack64vf(arr,var,gid) (u64x) ((arr)[((gid) * 16) + 0].var, (arr)[((gid) * 16) + 1].var, (arr)[((gid) * 16) + 2].var, (arr)[((gid) * 16) + 3].var, (arr)[((gid) * 16) + 4].var, (arr)[((gid) * 16) + 5].var, (arr)[((gid) * 16) + 6].var, (arr)[((gid) * 16) + 7].var, (arr)[((gid) * 16) + 8].var, (arr)[((gid) * 16) + 9].var, (arr)[((gid) * 16) + 10].var, (arr)[((gid) * 16) + 11].var, (arr)[((gid) * 16) + 12].var, (arr)[((gid) * 16) + 13].var, (arr)[((gid) * 16) + 14].var, (arr)[((gid) * 16) + 15].var) #endif #if VECT_SIZE == 1 #define unpackv(arr,var,gid,idx,val) (arr)[((gid) * 1) + 0].var[(idx)] = val; #elif VECT_SIZE == 2 #define unpackv(arr,var,gid,idx,val) (arr)[((gid) * 2) + 0].var[(idx)] = val.s0; (arr)[((gid) * 2) + 1].var[(idx)] = val.s1; #elif VECT_SIZE == 4 #define unpackv(arr,var,gid,idx,val) (arr)[((gid) * 4) + 0].var[(idx)] = val.s0; (arr)[((gid) * 4) + 1].var[(idx)] = val.s1; (arr)[((gid) * 4) + 2].var[(idx)] = val.s2; (arr)[((gid) * 4) + 3].var[(idx)] = val.s3; #elif VECT_SIZE == 8 #define unpackv(arr,var,gid,idx,val) (arr)[((gid) * 8) + 0].var[(idx)] = val.s0; (arr)[((gid) * 8) + 1].var[(idx)] = val.s1; (arr)[((gid) * 8) + 2].var[(idx)] = val.s2; (arr)[((gid) * 8) + 3].var[(idx)] = val.s3; (arr)[((gid) * 8) + 4].var[(idx)] = val.s4; (arr)[((gid) * 8) + 5].var[(idx)] = val.s5; (arr)[((gid) * 8) + 6].var[(idx)] = val.s6; (arr)[((gid) * 8) + 7].var[(idx)] = val.s7; #elif VECT_SIZE == 16 #define unpackv(arr,var,gid,idx,val) (arr)[((gid) * 16) + 0].var[(idx)] = val.s0; (arr)[((gid) * 16) + 1].var[(idx)] = val.s1; (arr)[((gid) * 16) + 2].var[(idx)] = val.s2; (arr)[((gid) * 16) + 3].var[(idx)] = val.s3; (arr)[((gid) * 16) + 4].var[(idx)] = val.s4; (arr)[((gid) * 16) + 5].var[(idx)] = val.s5; (arr)[((gid) * 16) + 6].var[(idx)] = val.s6; (arr)[((gid) * 16) + 7].var[(idx)] = val.s7; (arr)[((gid) * 16) + 8].var[(idx)] = val.s8; (arr)[((gid) * 16) + 9].var[(idx)] = val.s9; (arr)[((gid) * 16) + 10].var[(idx)] = val.sa; (arr)[((gid) * 16) + 11].var[(idx)] = val.sb; (arr)[((gid) * 16) + 12].var[(idx)] = val.sc; (arr)[((gid) * 16) + 13].var[(idx)] = val.sd; (arr)[((gid) * 16) + 14].var[(idx)] = val.se; (arr)[((gid) * 16) + 15].var[(idx)] = val.sf; #endif #if VECT_SIZE == 1 #define unpack64v(arr,var,gid,idx,val) (arr)[((gid) * 1) + 0].var[(idx)] = val; #elif VECT_SIZE == 2 #define unpack64v(arr,var,gid,idx,val) (arr)[((gid) * 2) + 0].var[(idx)] = val.s0; (arr)[((gid) * 2) + 1].var[(idx)] = val.s1; #elif VECT_SIZE == 4 #define unpack64v(arr,var,gid,idx,val) (arr)[((gid) * 4) + 0].var[(idx)] = val.s0; (arr)[((gid) * 4) + 1].var[(idx)] = val.s1; (arr)[((gid) * 4) + 2].var[(idx)] = val.s2; (arr)[((gid) * 4) + 3].var[(idx)] = val.s3; #elif VECT_SIZE == 8 #define unpack64v(arr,var,gid,idx,val) (arr)[((gid) * 8) + 0].var[(idx)] = val.s0; (arr)[((gid) * 8) + 1].var[(idx)] = val.s1; (arr)[((gid) * 8) + 2].var[(idx)] = val.s2; (arr)[((gid) * 8) + 3].var[(idx)] = val.s3; (arr)[((gid) * 8) + 4].var[(idx)] = val.s4; (arr)[((gid) * 8) + 5].var[(idx)] = val.s5; (arr)[((gid) * 8) + 6].var[(idx)] = val.s6; (arr)[((gid) * 8) + 7].var[(idx)] = val.s7; #elif VECT_SIZE == 16 #define unpack64v(arr,var,gid,idx,val) (arr)[((gid) * 16) + 0].var[(idx)] = val.s0; (arr)[((gid) * 16) + 1].var[(idx)] = val.s1; (arr)[((gid) * 16) + 2].var[(idx)] = val.s2; (arr)[((gid) * 16) + 3].var[(idx)] = val.s3; (arr)[((gid) * 16) + 4].var[(idx)] = val.s4; (arr)[((gid) * 16) + 5].var[(idx)] = val.s5; (arr)[((gid) * 16) + 6].var[(idx)] = val.s6; (arr)[((gid) * 16) + 7].var[(idx)] = val.s7; (arr)[((gid) * 16) + 8].var[(idx)] = val.s8; (arr)[((gid) * 16) + 9].var[(idx)] = val.s9; (arr)[((gid) * 16) + 10].var[(idx)] = val.sa; (arr)[((gid) * 16) + 11].var[(idx)] = val.sb; (arr)[((gid) * 16) + 12].var[(idx)] = val.sc; (arr)[((gid) * 16) + 13].var[(idx)] = val.sd; (arr)[((gid) * 16) + 14].var[(idx)] = val.se; (arr)[((gid) * 16) + 15].var[(idx)] = val.sf; #endif #if VECT_SIZE == 1 #define unpackv_xor(arr,var,gid,idx,val) (arr)[((gid) * 1) + 0].var[(idx)] ^= val; #elif VECT_SIZE == 2 #define unpackv_xor(arr,var,gid,idx,val) (arr)[((gid) * 2) + 0].var[(idx)] ^= val.s0; (arr)[((gid) * 2) + 1].var[(idx)] ^= val.s1; #elif VECT_SIZE == 4 #define unpackv_xor(arr,var,gid,idx,val) (arr)[((gid) * 4) + 0].var[(idx)] ^= val.s0; (arr)[((gid) * 4) + 1].var[(idx)] ^= val.s1; (arr)[((gid) * 4) + 2].var[(idx)] ^= val.s2; (arr)[((gid) * 4) + 3].var[(idx)] ^= val.s3; #elif VECT_SIZE == 8 #define unpackv_xor(arr,var,gid,idx,val) (arr)[((gid) * 8) + 0].var[(idx)] ^= val.s0; (arr)[((gid) * 8) + 1].var[(idx)] ^= val.s1; (arr)[((gid) * 8) + 2].var[(idx)] ^= val.s2; (arr)[((gid) * 8) + 3].var[(idx)] ^= val.s3; (arr)[((gid) * 8) + 4].var[(idx)] ^= val.s4; (arr)[((gid) * 8) + 5].var[(idx)] ^= val.s5; (arr)[((gid) * 8) + 6].var[(idx)] ^= val.s6; (arr)[((gid) * 8) + 7].var[(idx)] ^= val.s7; #elif VECT_SIZE == 16 #define unpackv_xor(arr,var,gid,idx,val) (arr)[((gid) * 16) + 0].var[(idx)] ^= val.s0; (arr)[((gid) * 16) + 1].var[(idx)] ^= val.s1; (arr)[((gid) * 16) + 2].var[(idx)] ^= val.s2; (arr)[((gid) * 16) + 3].var[(idx)] ^= val.s3; (arr)[((gid) * 16) + 4].var[(idx)] ^= val.s4; (arr)[((gid) * 16) + 5].var[(idx)] ^= val.s5; (arr)[((gid) * 16) + 6].var[(idx)] ^= val.s6; (arr)[((gid) * 16) + 7].var[(idx)] ^= val.s7; (arr)[((gid) * 16) + 8].var[(idx)] ^= val.s8; (arr)[((gid) * 16) + 9].var[(idx)] ^= val.s9; (arr)[((gid) * 16) + 10].var[(idx)] ^= val.sa; (arr)[((gid) * 16) + 11].var[(idx)] ^= val.sb; (arr)[((gid) * 16) + 12].var[(idx)] ^= val.sc; (arr)[((gid) * 16) + 13].var[(idx)] ^= val.sd; (arr)[((gid) * 16) + 14].var[(idx)] ^= val.se; (arr)[((gid) * 16) + 15].var[(idx)] ^= val.sf; #endif hashcat-4.0.1/OpenCL/inc_truecrypt_crc32.cl000066400000000000000000000070041320027462700204610ustar00rootroot00000000000000__constant u32a 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 }; u32 round_crc32 (u32 a, const u32 v) { const u32 k = (a ^ v) & 0xff; const u32 s = a >> 8; a = crc32tab[k]; a ^= s; return a; } u32 round_crc32_4 (const u32 w, const u32 iv) { u32 a = iv; a = round_crc32 (a, w >> 0); a = round_crc32 (a, w >> 8); a = round_crc32 (a, w >> 16); a = round_crc32 (a, w >> 24); return a; } hashcat-4.0.1/OpenCL/inc_truecrypt_xts.cl000066400000000000000000000414031320027462700203640ustar00rootroot00000000000000void xts_mul2 (u32 *in, u32 *out) { const u32 c = in[3] >> 31; out[3] = (in[3] << 1) | (in[2] >> 31); out[2] = (in[2] << 1) | (in[1] >> 31); out[1] = (in[1] << 1) | (in[0] >> 31); out[0] = (in[0] << 1); out[0] ^= c * 0x87; } void aes256_decrypt_xts_first (const u32 *ukey1, const u32 *ukey2, const u32 *in, u32 *out, u32 *S, u32 *T, u32 *ks, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { out[0] = in[0]; out[1] = in[1]; out[2] = in[2]; out[3] = in[3]; aes256_set_encrypt_key (ks, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4); aes256_encrypt (ks, S, T, s_te0, s_te1, s_te2, s_te3, s_te4); out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; aes256_set_decrypt_key (ks, ukey1, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); aes256_decrypt (ks, out, out, s_td0, s_td1, s_td2, s_td3, s_td4); out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; } void aes256_decrypt_xts_next (const u32 *in, u32 *out, u32 *T, u32 *ks, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { out[0] = in[0]; out[1] = in[1]; out[2] = in[2]; out[3] = in[3]; xts_mul2 (T, T); out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; aes256_decrypt (ks, out, out, s_td0, s_td1, s_td2, s_td3, s_td4); out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; } void serpent256_decrypt_xts_first (const u32 *ukey1, const u32 *ukey2, const u32 *in, u32 *out, u32 *S, u32 *T, u32 *ks) { out[0] = in[0]; out[1] = in[1]; out[2] = in[2]; out[3] = in[3]; serpent256_set_key (ks, ukey2); serpent256_encrypt (ks, S, 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]; } void serpent256_decrypt_xts_next (const u32 *in, u32 *out, u32 *T, u32 *ks) { out[0] = in[0]; out[1] = in[1]; out[2] = in[2]; out[3] = in[3]; xts_mul2 (T, T); out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; serpent256_decrypt (ks, out, out); out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; } void twofish256_decrypt_xts_first (const u32 *ukey1, const u32 *ukey2, const u32 *in, u32 *out, u32 *S, u32 *T, u32 *sk, u32 *lk) { out[0] = in[0]; out[1] = in[1]; out[2] = in[2]; out[3] = in[3]; twofish256_set_key (sk, lk, ukey2); twofish256_encrypt (sk, lk, S, 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]; } void twofish256_decrypt_xts_next (const u32 *in, u32 *out, u32 *T, u32 *sk, u32 *lk) { out[0] = in[0]; out[1] = in[1]; out[2] = in[2]; out[3] = in[3]; xts_mul2 (T, T); out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; twofish256_decrypt (sk, lk, out, out); out[0] ^= T[0]; out[1] ^= T[1]; out[2] ^= T[2]; out[3] ^= T[3]; } // 512 bit int verify_header_aes (__global const tc_t *esalt_bufs, const u32 *ukey1, const u32 *ukey2, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 ks_aes[60]; u32 S[4] = { 0 }; u32 T_aes[4] = { 0 }; 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]; aes256_decrypt_xts_first (ukey1, ukey2, data, tmp, S, T_aes, ks_aes, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); const u32 signature = esalt_bufs[0].signature; if (tmp[0] != signature) return 0; const u32 crc32_save = swap32_S (~tmp[2]); // seek to byte 256 for (int i = 4; i < 64 - 16; i += 4) { xts_mul2 (T_aes, T_aes); } // calculate crc32 from here u32 crc32 = ~0; for (int i = 64 - 16; i < 128 - 16; i += 4) { data[0] = esalt_bufs[0].data_buf[i + 0]; data[1] = esalt_bufs[0].data_buf[i + 1]; data[2] = esalt_bufs[0].data_buf[i + 2]; data[3] = esalt_bufs[0].data_buf[i + 3]; aes256_decrypt_xts_next (data, tmp, T_aes, ks_aes, s_td0, s_td1, s_td2, s_td3, s_td4); crc32 = round_crc32_4 (tmp[0], crc32); crc32 = round_crc32_4 (tmp[1], crc32); crc32 = round_crc32_4 (tmp[2], crc32); crc32 = round_crc32_4 (tmp[3], crc32); } if (crc32 != crc32_save) return 0; return 1; } int verify_header_serpent (__global const tc_t *esalt_bufs, const u32 *ukey1, const u32 *ukey2) { u32 ks_serpent[140]; u32 S[4] = { 0 }; u32 T_serpent[4] = { 0 }; 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]; serpent256_decrypt_xts_first (ukey1, ukey2, data, tmp, S, T_serpent, ks_serpent); const u32 signature = esalt_bufs[0].signature; if (tmp[0] != signature) return 0; const u32 crc32_save = swap32_S (~tmp[2]); // seek to byte 256 for (int i = 4; i < 64 - 16; i += 4) { xts_mul2 (T_serpent, T_serpent); } // calculate crc32 from here u32 crc32 = ~0; for (int i = 64 - 16; i < 128 - 16; i += 4) { data[0] = esalt_bufs[0].data_buf[i + 0]; data[1] = esalt_bufs[0].data_buf[i + 1]; data[2] = esalt_bufs[0].data_buf[i + 2]; data[3] = esalt_bufs[0].data_buf[i + 3]; serpent256_decrypt_xts_next (data, tmp, T_serpent, ks_serpent); crc32 = round_crc32_4 (tmp[0], crc32); crc32 = round_crc32_4 (tmp[1], crc32); crc32 = round_crc32_4 (tmp[2], crc32); crc32 = round_crc32_4 (tmp[3], crc32); } if (crc32 != crc32_save) return 0; return 1; } int verify_header_twofish (__global const tc_t *esalt_bufs, const u32 *ukey1, const u32 *ukey2) { u32 sk_twofish[4]; u32 lk_twofish[40]; u32 S[4] = { 0 }; u32 T_twofish[4] = { 0 }; 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]; twofish256_decrypt_xts_first (ukey1, ukey2, data, tmp, S, T_twofish, sk_twofish, lk_twofish); const u32 signature = esalt_bufs[0].signature; if (tmp[0] != signature) return 0; const u32 crc32_save = swap32_S (~tmp[2]); // seek to byte 256 for (int i = 4; i < 64 - 16; i += 4) { xts_mul2 (T_twofish, T_twofish); } // calculate crc32 from here u32 crc32 = ~0; for (int i = 64 - 16; i < 128 - 16; i += 4) { data[0] = esalt_bufs[0].data_buf[i + 0]; data[1] = esalt_bufs[0].data_buf[i + 1]; data[2] = esalt_bufs[0].data_buf[i + 2]; data[3] = esalt_bufs[0].data_buf[i + 3]; twofish256_decrypt_xts_next (data, tmp, T_twofish, sk_twofish, lk_twofish); crc32 = round_crc32_4 (tmp[0], crc32); crc32 = round_crc32_4 (tmp[1], crc32); crc32 = round_crc32_4 (tmp[2], crc32); crc32 = round_crc32_4 (tmp[3], crc32); } if (crc32 != crc32_save) return 0; return 1; } // 1024 bit int verify_header_aes_twofish (__global const tc_t *esalt_bufs, const u32 *ukey1, const u32 *ukey2, const u32 *ukey3, const u32 *ukey4, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 ks_aes[60]; u32 sk_twofish[4]; u32 lk_twofish[40]; u32 S[4] = { 0 }; u32 T_aes[4] = { 0 }; u32 T_twofish[4] = { 0 }; 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]; aes256_decrypt_xts_first (ukey2, ukey4, data, tmp, S, T_aes, ks_aes, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); twofish256_decrypt_xts_first (ukey1, ukey3, tmp, tmp, S, T_twofish, sk_twofish, lk_twofish); const u32 signature = esalt_bufs[0].signature; if (tmp[0] != signature) return 0; const u32 crc32_save = swap32_S (~tmp[2]); // seek to byte 256 for (int i = 4; i < 64 - 16; i += 4) { xts_mul2 (T_aes, T_aes); xts_mul2 (T_twofish, T_twofish); } // calculate crc32 from here u32 crc32 = ~0; for (int i = 64 - 16; i < 128 - 16; i += 4) { data[0] = esalt_bufs[0].data_buf[i + 0]; data[1] = esalt_bufs[0].data_buf[i + 1]; data[2] = esalt_bufs[0].data_buf[i + 2]; data[3] = esalt_bufs[0].data_buf[i + 3]; aes256_decrypt_xts_next (data, tmp, T_aes, ks_aes, s_td0, s_td1, s_td2, s_td3, s_td4); twofish256_decrypt_xts_next (tmp, tmp, T_twofish, sk_twofish, lk_twofish); crc32 = round_crc32_4 (tmp[0], crc32); crc32 = round_crc32_4 (tmp[1], crc32); crc32 = round_crc32_4 (tmp[2], crc32); crc32 = round_crc32_4 (tmp[3], crc32); } if (crc32 != crc32_save) return 0; return 1; } int verify_header_serpent_aes (__global const tc_t *esalt_bufs, const u32 *ukey1, const u32 *ukey2, const u32 *ukey3, const u32 *ukey4, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 ks_serpent[140]; u32 ks_aes[60]; u32 S[4] = { 0 }; u32 T_serpent[4] = { 0 }; u32 T_aes[4] = { 0 }; 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]; serpent256_decrypt_xts_first (ukey2, ukey4, data, tmp, S, T_serpent, ks_serpent); aes256_decrypt_xts_first (ukey1, ukey3, tmp, tmp, S, T_aes, ks_aes, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); const u32 signature = esalt_bufs[0].signature; if (tmp[0] != signature) return 0; const u32 crc32_save = swap32_S (~tmp[2]); // seek to byte 256 for (int i = 4; i < 64 - 16; i += 4) { xts_mul2 (T_serpent, T_serpent); xts_mul2 (T_aes, T_aes); } // calculate crc32 from here u32 crc32 = ~0; for (int i = 64 - 16; i < 128 - 16; i += 4) { data[0] = esalt_bufs[0].data_buf[i + 0]; data[1] = esalt_bufs[0].data_buf[i + 1]; data[2] = esalt_bufs[0].data_buf[i + 2]; data[3] = esalt_bufs[0].data_buf[i + 3]; serpent256_decrypt_xts_next (data, tmp, T_serpent, ks_serpent); aes256_decrypt_xts_next (tmp, tmp, T_aes, ks_aes, s_td0, s_td1, s_td2, s_td3, s_td4); crc32 = round_crc32_4 (tmp[0], crc32); crc32 = round_crc32_4 (tmp[1], crc32); crc32 = round_crc32_4 (tmp[2], crc32); crc32 = round_crc32_4 (tmp[3], crc32); } if (crc32 != crc32_save) return 0; return 1; } int verify_header_twofish_serpent (__global const tc_t *esalt_bufs, const u32 *ukey1, const u32 *ukey2, const u32 *ukey3, const u32 *ukey4) { u32 sk_twofish[4]; u32 lk_twofish[40]; u32 ks_serpent[140]; u32 S[4] = { 0 }; u32 T_twofish[4] = { 0 }; u32 T_serpent[4] = { 0 }; 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]; twofish256_decrypt_xts_first (ukey2, ukey4, data, tmp, S, T_twofish, sk_twofish, lk_twofish); serpent256_decrypt_xts_first (ukey1, ukey3, tmp, tmp, S, T_serpent, ks_serpent); const u32 signature = esalt_bufs[0].signature; if (tmp[0] != signature) return 0; const u32 crc32_save = swap32_S (~tmp[2]); // seek to byte 256 for (int i = 4; i < 64 - 16; i += 4) { xts_mul2 (T_twofish, T_twofish); xts_mul2 (T_serpent, T_serpent); } // calculate crc32 from here u32 crc32 = ~0; for (int i = 64 - 16; i < 128 - 16; i += 4) { data[0] = esalt_bufs[0].data_buf[i + 0]; data[1] = esalt_bufs[0].data_buf[i + 1]; data[2] = esalt_bufs[0].data_buf[i + 2]; data[3] = esalt_bufs[0].data_buf[i + 3]; twofish256_decrypt_xts_next (data, tmp, T_twofish, sk_twofish, lk_twofish); serpent256_decrypt_xts_next (tmp, tmp, T_serpent, ks_serpent); crc32 = round_crc32_4 (tmp[0], crc32); crc32 = round_crc32_4 (tmp[1], crc32); crc32 = round_crc32_4 (tmp[2], crc32); crc32 = round_crc32_4 (tmp[3], crc32); } if (crc32 != crc32_save) return 0; return 1; } // 1536 bit int verify_header_aes_twofish_serpent (__global const tc_t *esalt_bufs, const u32 *ukey1, const u32 *ukey2, const u32 *ukey3, const u32 *ukey4, const u32 *ukey5, const u32 *ukey6, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 ks_aes[60]; u32 sk_twofish[4]; u32 lk_twofish[40]; u32 ks_serpent[140]; u32 S[4] = { 0 }; u32 T_aes[4] = { 0 }; u32 T_twofish[4] = { 0 }; u32 T_serpent[4] = { 0 }; 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]; aes256_decrypt_xts_first (ukey3, ukey6, data, tmp, S, T_aes, ks_aes, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); twofish256_decrypt_xts_first (ukey2, ukey5, tmp, tmp, S, T_twofish, sk_twofish, lk_twofish); serpent256_decrypt_xts_first (ukey1, ukey4, tmp, tmp, S, T_serpent, ks_serpent); const u32 signature = esalt_bufs[0].signature; if (tmp[0] != signature) return 0; const u32 crc32_save = swap32_S (~tmp[2]); // seek to byte 256 for (int i = 4; i < 64 - 16; i += 4) { xts_mul2 (T_aes, T_aes); xts_mul2 (T_twofish, T_twofish); xts_mul2 (T_serpent, T_serpent); } // calculate crc32 from here u32 crc32 = ~0; for (int i = 64 - 16; i < 128 - 16; i += 4) { data[0] = esalt_bufs[0].data_buf[i + 0]; data[1] = esalt_bufs[0].data_buf[i + 1]; data[2] = esalt_bufs[0].data_buf[i + 2]; data[3] = esalt_bufs[0].data_buf[i + 3]; aes256_decrypt_xts_next (data, tmp, T_aes, ks_aes, s_td0, s_td1, s_td2, s_td3, s_td4); twofish256_decrypt_xts_next (tmp, tmp, T_twofish, sk_twofish, lk_twofish); serpent256_decrypt_xts_next (tmp, tmp, T_serpent, ks_serpent); crc32 = round_crc32_4 (tmp[0], crc32); crc32 = round_crc32_4 (tmp[1], crc32); crc32 = round_crc32_4 (tmp[2], crc32); crc32 = round_crc32_4 (tmp[3], crc32); } if (crc32 != crc32_save) return 0; return 1; } int verify_header_serpent_twofish_aes (__global const tc_t *esalt_bufs, const u32 *ukey1, const u32 *ukey2, const u32 *ukey3, const u32 *ukey4, const u32 *ukey5, const u32 *ukey6, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) { u32 ks_serpent[140]; u32 sk_twofish[4]; u32 lk_twofish[40]; u32 ks_aes[60]; u32 S[4] = { 0 }; u32 T_serpent[4] = { 0 }; u32 T_twofish[4] = { 0 }; u32 T_aes[4] = { 0 }; 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]; serpent256_decrypt_xts_first (ukey3, ukey6, data, tmp, S, T_serpent, ks_serpent); twofish256_decrypt_xts_first (ukey2, ukey5, tmp, tmp, S, T_twofish, sk_twofish, lk_twofish); aes256_decrypt_xts_first (ukey1, ukey4, tmp, tmp, S, T_aes, ks_aes, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); const u32 signature = esalt_bufs[0].signature; if (tmp[0] != signature) return 0; const u32 crc32_save = swap32_S (~tmp[2]); // seek to byte 256 for (int i = 4; i < 64 - 16; i += 4) { xts_mul2 (T_serpent, T_serpent); xts_mul2 (T_twofish, T_twofish); xts_mul2 (T_aes, T_aes); } // calculate crc32 from here u32 crc32 = ~0; for (int i = 64 - 16; i < 128 - 16; i += 4) { data[0] = esalt_bufs[0].data_buf[i + 0]; data[1] = esalt_bufs[0].data_buf[i + 1]; data[2] = esalt_bufs[0].data_buf[i + 2]; data[3] = esalt_bufs[0].data_buf[i + 3]; serpent256_decrypt_xts_next (data, tmp, T_serpent, ks_serpent); twofish256_decrypt_xts_next (tmp, tmp, T_twofish, sk_twofish, lk_twofish); aes256_decrypt_xts_next (tmp, tmp, T_aes, ks_aes, s_td0, s_td1, s_td2, s_td3, s_td4); crc32 = round_crc32_4 (tmp[0], crc32); crc32 = round_crc32_4 (tmp[1], crc32); crc32 = round_crc32_4 (tmp[2], crc32); crc32 = round_crc32_4 (tmp[3], crc32); } if (crc32 != crc32_save) return 0; return 1; } hashcat-4.0.1/OpenCL/inc_types.cl000066400000000000000000001303461320027462700165760ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ typedef uchar u8; typedef ushort u16; typedef uint u32; typedef ulong u64; typedef u8 u8a __attribute__ ((aligned (8))); typedef u16 u16a __attribute__ ((aligned (8))); typedef u32 u32a __attribute__ ((aligned (8))); typedef u64 u64a __attribute__ ((aligned (8))); #ifndef NEW_SIMD_CODE #undef VECT_SIZE #define VECT_SIZE 1 #endif #define CONCAT(a, b) a##b #define VTYPE(type, width) CONCAT(type, width) #if VECT_SIZE == 1 typedef uchar u8x; typedef ushort u16x; typedef uint u32x; typedef ulong u64x; #else typedef VTYPE(uchar, VECT_SIZE) u8x; typedef VTYPE(ushort, VECT_SIZE) u16x; typedef VTYPE(uint, VECT_SIZE) u32x; typedef VTYPE(ulong, VECT_SIZE) u64x; #endif u32 l32_from_64_S (u64 a) { const u32 r = (u32) (a); return r; } u32 h32_from_64_S (u64 a) { a >>= 32; const u32 r = (u32) (a); return r; } u64 hl32_to_64_S (const u32 a, const u32 b) { return as_ulong ((uint2) (b, a)); } u32x l32_from_64 (u64x a) { u32x r; #if VECT_SIZE == 1 r = (u32) a; #endif #if VECT_SIZE >= 2 r.s0 = (u32) a.s0; r.s1 = (u32) a.s1; #endif #if VECT_SIZE >= 4 r.s2 = (u32) a.s2; r.s3 = (u32) a.s3; #endif #if VECT_SIZE >= 8 r.s4 = (u32) a.s4; r.s5 = (u32) a.s5; r.s6 = (u32) a.s6; r.s7 = (u32) a.s7; #endif #if VECT_SIZE >= 16 r.s8 = (u32) a.s8; r.s9 = (u32) a.s9; r.sa = (u32) a.sa; r.sb = (u32) a.sb; r.sc = (u32) a.sc; r.sd = (u32) a.sd; r.se = (u32) a.se; r.sf = (u32) a.sf; #endif return r; } u32x h32_from_64 (u64x a) { a >>= 32; u32x r; #if VECT_SIZE == 1 r = (u32) a; #endif #if VECT_SIZE >= 2 r.s0 = (u32) a.s0; r.s1 = (u32) a.s1; #endif #if VECT_SIZE >= 4 r.s2 = (u32) a.s2; r.s3 = (u32) a.s3; #endif #if VECT_SIZE >= 8 r.s4 = (u32) a.s4; r.s5 = (u32) a.s5; r.s6 = (u32) a.s6; r.s7 = (u32) a.s7; #endif #if VECT_SIZE >= 16 r.s8 = (u32) a.s8; r.s9 = (u32) a.s9; r.sa = (u32) a.sa; r.sb = (u32) a.sb; r.sc = (u32) a.sc; r.sd = (u32) a.sd; r.se = (u32) a.se; r.sf = (u32) a.sf; #endif return r; } u64x hl32_to_64 (const u32x a, const u32x b) { u64x r; #if VECT_SIZE == 1 r = as_ulong ((uint2) (b, a)); #endif #if VECT_SIZE >= 2 r.s0 = as_ulong ((uint2) (b.s0, a.s0)); r.s1 = as_ulong ((uint2) (b.s1, a.s1)); #endif #if VECT_SIZE >= 4 r.s2 = as_ulong ((uint2) (b.s2, a.s2)); r.s3 = as_ulong ((uint2) (b.s3, a.s3)); #endif #if VECT_SIZE >= 8 r.s4 = as_ulong ((uint2) (b.s4, a.s4)); r.s5 = as_ulong ((uint2) (b.s5, a.s5)); r.s6 = as_ulong ((uint2) (b.s6, a.s6)); r.s7 = as_ulong ((uint2) (b.s7, a.s7)); #endif #if VECT_SIZE >= 16 r.s8 = as_ulong ((uint2) (b.s8, a.s8)); r.s9 = as_ulong ((uint2) (b.s9, a.s9)); r.sa = as_ulong ((uint2) (b.sa, a.sa)); r.sb = as_ulong ((uint2) (b.sb, a.sb)); r.sc = as_ulong ((uint2) (b.sc, a.sc)); r.sd = as_ulong ((uint2) (b.sd, a.sd)); r.se = as_ulong ((uint2) (b.se, a.se)); r.sf = as_ulong ((uint2) (b.sf, a.sf)); #endif return r; } #ifdef IS_AMD #if AMD_GCN >= 3 u32 swap32_S (const u32 v) { u32 r; __asm__ ("V_PERM_B32 %0, 0, %1, %2;" : "=v"(r) : "v"(v), "v"(0x00010203)); return r; } u64 swap64_S (const u64 v) { const u32 v0 = h32_from_64_S (v); const u32 v1 = l32_from_64_S (v); u32 t0; u32 t1; __asm__ ("V_PERM_B32 %0, 0, %1, %2;" : "=v"(t0) : "v"(v0), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, 0, %1, %2;" : "=v"(t1) : "v"(v1), "v"(0x00010203)); const u64 r = hl32_to_64_S (t1, t0); return r; } #else u32 swap32_S (const u32 v) { return as_uint (as_uchar4 (v).s3210); } u64 swap64_S (const u64 v) { return (as_ulong (as_uchar8 (v).s76543210)); } #endif u32 rotr32_S (const u32 a, const u32 n) { return rotate (a, (32 - n)); } u32 rotl32_S (const u32 a, const u32 n) { return rotate (a, n); } u64 rotr64_S (const u64 a, const u32 n) { const u32 a0 = h32_from_64_S (a); const u32 a1 = l32_from_64_S (a); const u32 t0 = (n >= 32) ? amd_bitalign (a0, a1, n - 32) : amd_bitalign (a1, a0, n); const u32 t1 = (n >= 32) ? amd_bitalign (a1, a0, n - 32) : amd_bitalign (a0, a1, n); const u64 r = hl32_to_64_S (t0, t1); return r; } u64 rotl64_S (const u64 a, const u32 n) { return rotr64_S (a, 64 - n); } #if AMD_GCN >= 3 u32x swap32 (const u32x v) { return bitselect (rotate (v, 24u), rotate (v, 8u), 0x00ff00ffu); } u64x swap64 (const u64x v) { const u32x a0 = h32_from_64 (v); const u32x a1 = l32_from_64 (v); u32x t0; u32x t1; #if VECT_SIZE == 1 __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t0) : "v"(0), "v"(a0), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t1) : "v"(0), "v"(a1), "v"(0x00010203)); #endif #if VECT_SIZE >= 2 __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t0.s0) : "v"(0), "v"(a0.s0), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t1.s0) : "v"(0), "v"(a1.s0), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t0.s1) : "v"(0), "v"(a0.s1), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t1.s1) : "v"(0), "v"(a1.s1), "v"(0x00010203)); #endif #if VECT_SIZE >= 4 __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t0.s2) : "v"(0), "v"(a0.s2), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t1.s2) : "v"(0), "v"(a1.s2), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t0.s3) : "v"(0), "v"(a0.s3), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t1.s3) : "v"(0), "v"(a1.s3), "v"(0x00010203)); #endif #if VECT_SIZE >= 8 __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t0.s4) : "v"(0), "v"(a0.s4), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t1.s4) : "v"(0), "v"(a1.s4), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t0.s5) : "v"(0), "v"(a0.s5), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t1.s5) : "v"(0), "v"(a1.s5), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t0.s6) : "v"(0), "v"(a0.s6), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t1.s6) : "v"(0), "v"(a1.s6), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t0.s7) : "v"(0), "v"(a0.s7), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t1.s7) : "v"(0), "v"(a1.s7), "v"(0x00010203)); #endif #if VECT_SIZE >= 16 __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t0.s8) : "v"(0), "v"(a0.s8), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t1.s8) : "v"(0), "v"(a1.s8), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t0.s9) : "v"(0), "v"(a0.s9), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t1.s9) : "v"(0), "v"(a1.s9), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t0.sa) : "v"(0), "v"(a0.sa), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t1.sa) : "v"(0), "v"(a1.sa), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t0.sb) : "v"(0), "v"(a0.sb), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t1.sb) : "v"(0), "v"(a1.sb), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t0.sc) : "v"(0), "v"(a0.sc), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t1.sc) : "v"(0), "v"(a1.sc), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t0.sd) : "v"(0), "v"(a0.sd), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t1.sd) : "v"(0), "v"(a1.sd), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t0.se) : "v"(0), "v"(a0.se), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t1.se) : "v"(0), "v"(a1.se), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t0.sf) : "v"(0), "v"(a0.sf), "v"(0x00010203)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(t1.sf) : "v"(0), "v"(a1.sf), "v"(0x00010203)); #endif const u64x r = hl32_to_64 (t1, t0); return r; } #else u32x swap32 (const u32x v) { return bitselect (rotate (v, 24u), rotate (v, 8u), 0x00ff00ffu); } u64x swap64 (const u64x v) { return bitselect (bitselect (rotate (v, 24ul), rotate (v, 8ul), 0x000000ff000000fful), bitselect (rotate (v, 56ul), rotate (v, 40ul), 0x00ff000000ff0000ul), 0xffff0000ffff0000ul); } #endif u32x rotr32 (const u32x a, const u32 n) { return rotate (a, (32 - n)); } u32x rotl32 (const u32x a, const u32 n) { return rotate (a, n); } u64x rotr64 (const u64x a, const u32 n) { const u32x a0 = h32_from_64 (a); const u32x a1 = l32_from_64 (a); const u32x t0 = (n >= 32) ? amd_bitalign (a0, a1, n - 32) : amd_bitalign (a1, a0, n); const u32x t1 = (n >= 32) ? amd_bitalign (a1, a0, n - 32) : amd_bitalign (a0, a1, n); const u64x r = hl32_to_64 (t0, t1); return r; } u64x rotl64 (const u64x a, const u32 n) { return rotr64 (a, 64 - n); } u32x __bfe (const u32x a, const u32x b, const u32x c) { return amd_bfe (a, b, c); } u32 __bfe_S (const u32 a, const u32 b, const u32 c) { return amd_bfe (a, b, c); } u32 amd_bytealign_S (const u32 a, const u32 b, const u32 c) { return amd_bytealign (a, b, c); } #if AMD_GCN >= 3 u32x __byte_perm (const u32x a, const u32x b, const u32x c) { u32x r; #if VECT_SIZE == 1 __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r) : "v"(b), "v"(a), "v"(c)); #endif #if VECT_SIZE >= 2 __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s0) : "v"(b.s0), "v"(a.s0), "v"(c.s0)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s1) : "v"(b.s1), "v"(a.s1), "v"(c.s1)); #endif #if VECT_SIZE >= 4 __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s0) : "v"(b.s0), "v"(a.s0), "v"(c.s0)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s1) : "v"(b.s1), "v"(a.s1), "v"(c.s1)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s2) : "v"(b.s2), "v"(a.s2), "v"(c.s2)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s3) : "v"(b.s3), "v"(a.s3), "v"(c.s3)); #endif #if VECT_SIZE >= 8 __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s0) : "v"(b.s0), "v"(a.s0), "v"(c.s0)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s1) : "v"(b.s1), "v"(a.s1), "v"(c.s1)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s2) : "v"(b.s2), "v"(a.s2), "v"(c.s2)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s3) : "v"(b.s3), "v"(a.s3), "v"(c.s3)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s4) : "v"(b.s4), "v"(a.s4), "v"(c.s4)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s5) : "v"(b.s5), "v"(a.s5), "v"(c.s5)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s6) : "v"(b.s6), "v"(a.s6), "v"(c.s6)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s7) : "v"(b.s7), "v"(a.s7), "v"(c.s7)); #endif #if VECT_SIZE >= 16 __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s0) : "v"(b.s0), "v"(a.s0), "v"(c.s0)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s1) : "v"(b.s1), "v"(a.s1), "v"(c.s1)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s2) : "v"(b.s2), "v"(a.s2), "v"(c.s2)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s3) : "v"(b.s3), "v"(a.s3), "v"(c.s3)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s4) : "v"(b.s4), "v"(a.s4), "v"(c.s4)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s5) : "v"(b.s5), "v"(a.s5), "v"(c.s5)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s6) : "v"(b.s6), "v"(a.s6), "v"(c.s6)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s7) : "v"(b.s7), "v"(a.s7), "v"(c.s7)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s8) : "v"(b.s8), "v"(a.s8), "v"(c.s8)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.s9) : "v"(b.s9), "v"(a.s9), "v"(c.s9)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.sa) : "v"(b.sa), "v"(a.sa), "v"(c.sa)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.sb) : "v"(b.sb), "v"(a.sb), "v"(c.sb)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.sc) : "v"(b.sc), "v"(a.sc), "v"(c.sc)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.sd) : "v"(b.sd), "v"(a.sd), "v"(c.sd)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.se) : "v"(b.se), "v"(a.se), "v"(c.se)); __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r.sf) : "v"(b.sf), "v"(a.sf), "v"(c.sf)); #endif return r; } u32 __byte_perm_S (const u32 a, const u32 b, const u32 c) { u32 r; __asm__ ("V_PERM_B32 %0, %1, %2, %3;" : "=v"(r) : "v"(b), "v"(a), "v"(c)); return r; } #endif #if AMD_GCN >= 5 u32x __add3 (const u32x a, const u32x b, const u32x c) { u32x r; #if VECT_SIZE == 1 __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r) : "v"(b), "v"(a), "v"(c)); #endif #if VECT_SIZE >= 2 __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s0) : "v"(b.s0), "v"(a.s0), "v"(c.s0)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s1) : "v"(b.s1), "v"(a.s1), "v"(c.s1)); #endif #if VECT_SIZE >= 4 __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s0) : "v"(b.s0), "v"(a.s0), "v"(c.s0)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s1) : "v"(b.s1), "v"(a.s1), "v"(c.s1)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s2) : "v"(b.s2), "v"(a.s2), "v"(c.s2)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s3) : "v"(b.s3), "v"(a.s3), "v"(c.s3)); #endif #if VECT_SIZE >= 8 __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s0) : "v"(b.s0), "v"(a.s0), "v"(c.s0)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s1) : "v"(b.s1), "v"(a.s1), "v"(c.s1)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s2) : "v"(b.s2), "v"(a.s2), "v"(c.s2)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s3) : "v"(b.s3), "v"(a.s3), "v"(c.s3)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s4) : "v"(b.s4), "v"(a.s4), "v"(c.s4)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s5) : "v"(b.s5), "v"(a.s5), "v"(c.s5)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s6) : "v"(b.s6), "v"(a.s6), "v"(c.s6)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s7) : "v"(b.s7), "v"(a.s7), "v"(c.s7)); #endif #if VECT_SIZE >= 16 __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s0) : "v"(b.s0), "v"(a.s0), "v"(c.s0)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s1) : "v"(b.s1), "v"(a.s1), "v"(c.s1)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s2) : "v"(b.s2), "v"(a.s2), "v"(c.s2)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s3) : "v"(b.s3), "v"(a.s3), "v"(c.s3)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s4) : "v"(b.s4), "v"(a.s4), "v"(c.s4)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s5) : "v"(b.s5), "v"(a.s5), "v"(c.s5)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s6) : "v"(b.s6), "v"(a.s6), "v"(c.s6)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s7) : "v"(b.s7), "v"(a.s7), "v"(c.s7)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s8) : "v"(b.s8), "v"(a.s8), "v"(c.s8)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.s9) : "v"(b.s9), "v"(a.s9), "v"(c.s9)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.sa) : "v"(b.sa), "v"(a.sa), "v"(c.sa)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.sb) : "v"(b.sb), "v"(a.sb), "v"(c.sb)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.sc) : "v"(b.sc), "v"(a.sc), "v"(c.sc)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.sd) : "v"(b.sd), "v"(a.sd), "v"(c.sd)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.se) : "v"(b.se), "v"(a.se), "v"(c.se)); __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r.sf) : "v"(b.sf), "v"(a.sf), "v"(c.sf)); #endif return r; } u32 __add3_S (const u32 a, const u32 b, const u32 c) { u32 r; __asm__ ("V_ADD3_U32 %0, %1, %2, %3;" : "=v"(r) : "v"(b), "v"(a), "v"(c)); return r; } #else u32x __add3 (const u32x a, const u32x b, const u32x c) { return a + b + c; } u32 __add3_S (const u32 a, const u32 b, const u32 c) { return a + b + c; } #endif #endif #ifdef IS_NV u32 swap32_S (const u32 v) { u32 r; asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r) : "r"(v)); return r; } u64 swap64_S (const u64 v) { u32 il; u32 ir; asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il), "=r"(ir) : "l"(v)); u32 tl; u32 tr; asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl) : "r"(il)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr) : "r"(ir)); u64 r; asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r) : "r"(tr), "r"(tl)); return r; } u32 rotr32_S (const u32 a, const u32 n) { return rotate (a, (32 - n)); } u32 rotl32_S (const u32 a, const u32 n) { return rotate (a, n); } u64 rotr64_S (const u64 a, const u32 n) { return rotate (a, (u64) (64 - n)); } u64 rotl64_S (const u64 a, const u32 n) { return rotate (a, (u64) n); } u32x swap32 (const u32x v) { u32x r; #if VECT_SIZE == 1 asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r) : "r"(v)); #endif #if VECT_SIZE >= 2 asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r.s0) : "r"(v.s0)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r.s1) : "r"(v.s1)); #endif #if VECT_SIZE >= 4 asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r.s2) : "r"(v.s2)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r.s3) : "r"(v.s3)); #endif #if VECT_SIZE >= 8 asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r.s4) : "r"(v.s4)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r.s5) : "r"(v.s5)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r.s6) : "r"(v.s6)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r.s7) : "r"(v.s7)); #endif #if VECT_SIZE >= 16 asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r.s8) : "r"(v.s8)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r.s9) : "r"(v.s9)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r.sa) : "r"(v.sa)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r.sb) : "r"(v.sb)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r.sc) : "r"(v.sc)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r.sd) : "r"(v.sd)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r.se) : "r"(v.se)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r.sf) : "r"(v.sf)); #endif return r; } u64x swap64 (const u64x v) { u32x il; u32x ir; #if VECT_SIZE == 1 asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il), "=r"(ir) : "l"(v)); #endif #if VECT_SIZE >= 2 asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il.s0), "=r"(ir.s0) : "l"(v.s0)); asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il.s1), "=r"(ir.s1) : "l"(v.s1)); #endif #if VECT_SIZE >= 4 asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il.s2), "=r"(ir.s2) : "l"(v.s2)); asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il.s3), "=r"(ir.s3) : "l"(v.s3)); #endif #if VECT_SIZE >= 8 asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il.s4), "=r"(ir.s4) : "l"(v.s4)); asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il.s5), "=r"(ir.s5) : "l"(v.s5)); asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il.s6), "=r"(ir.s6) : "l"(v.s6)); asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il.s7), "=r"(ir.s7) : "l"(v.s7)); #endif #if VECT_SIZE >= 16 asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il.s8), "=r"(ir.s8) : "l"(v.s8)); asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il.s9), "=r"(ir.s9) : "l"(v.s9)); asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il.sa), "=r"(ir.sa) : "l"(v.sa)); asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il.sb), "=r"(ir.sb) : "l"(v.sb)); asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il.sc), "=r"(ir.sc) : "l"(v.sc)); asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il.sd), "=r"(ir.sd) : "l"(v.sd)); asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il.se), "=r"(ir.se) : "l"(v.se)); asm volatile ("mov.b64 {%0, %1}, %2;" : "=r"(il.sf), "=r"(ir.sf) : "l"(v.sf)); #endif u32x tl; u32x tr; #if VECT_SIZE == 1 asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl) : "r"(il)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr) : "r"(ir)); #endif #if VECT_SIZE >= 2 asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl.s0) : "r"(il.s0)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr.s0) : "r"(ir.s0)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl.s1) : "r"(il.s1)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr.s1) : "r"(ir.s1)); #endif #if VECT_SIZE >= 4 asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl.s2) : "r"(il.s2)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr.s2) : "r"(ir.s2)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl.s3) : "r"(il.s3)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr.s3) : "r"(ir.s3)); #endif #if VECT_SIZE >= 8 asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl.s4) : "r"(il.s4)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr.s4) : "r"(ir.s4)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl.s5) : "r"(il.s5)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr.s5) : "r"(ir.s5)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl.s6) : "r"(il.s6)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr.s6) : "r"(ir.s6)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl.s7) : "r"(il.s7)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr.s7) : "r"(ir.s7)); #endif #if VECT_SIZE >= 16 asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl.s8) : "r"(il.s8)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr.s8) : "r"(ir.s8)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl.s9) : "r"(il.s9)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr.s9) : "r"(ir.s9)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl.sa) : "r"(il.sa)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr.sa) : "r"(ir.sa)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl.sb) : "r"(il.sb)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr.sb) : "r"(ir.sb)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl.sc) : "r"(il.sc)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr.sc) : "r"(ir.sc)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl.sd) : "r"(il.sd)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr.sd) : "r"(ir.sd)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl.se) : "r"(il.se)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr.se) : "r"(ir.se)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl.sf) : "r"(il.sf)); asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr.sf) : "r"(ir.sf)); #endif u64x r; #if VECT_SIZE == 1 asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r) : "r"(tr), "r"(tl)); #endif #if VECT_SIZE >= 2 asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.s0) : "r"(tr.s0), "r"(tl.s0)); asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.s1) : "r"(tr.s1), "r"(tl.s1)); #endif #if VECT_SIZE >= 4 asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.s2) : "r"(tr.s2), "r"(tl.s2)); asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.s3) : "r"(tr.s3), "r"(tl.s3)); #endif #if VECT_SIZE >= 8 asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.s4) : "r"(tr.s4), "r"(tl.s4)); asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.s5) : "r"(tr.s5), "r"(tl.s5)); asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.s6) : "r"(tr.s6), "r"(tl.s6)); asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.s7) : "r"(tr.s7), "r"(tl.s7)); #endif #if VECT_SIZE >= 16 asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.s8) : "r"(tr.s8), "r"(tl.s8)); asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.s9) : "r"(tr.s9), "r"(tl.s9)); asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.sa) : "r"(tr.sa), "r"(tl.sa)); asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.sb) : "r"(tr.sb), "r"(tl.sb)); asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.sc) : "r"(tr.sc), "r"(tl.sc)); asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.sd) : "r"(tr.sd), "r"(tl.sd)); asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.se) : "r"(tr.se), "r"(tl.se)); asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.sf) : "r"(tr.sf), "r"(tl.sf)); #endif return r; } u32x rotr32 (const u32x a, const u32 n) { return rotate (a, (32 - n)); } u32x rotl32 (const u32x a, const u32 n) { return rotate (a, n); } u64x rotr64 (const u64x a, const u32 n) { return rotate (a, (u64x) (64 - n)); } u64x rotl64 (const u64x a, const u32 n) { return rotate (a, (u64x) n); } u32x __byte_perm (const u32x a, const u32x b, const u32x c) { u32x r; #if VECT_SIZE == 1 asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(c) ); #endif #if VECT_SIZE >= 2 asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s0) : "r"(a.s0), "r"(b.s0), "r"(c.s0)); asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s1) : "r"(a.s1), "r"(b.s1), "r"(c.s1)); #endif #if VECT_SIZE >= 4 asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s2) : "r"(a.s2), "r"(b.s2), "r"(c.s2)); asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s3) : "r"(a.s3), "r"(b.s3), "r"(c.s3)); #endif #if VECT_SIZE >= 8 asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s4) : "r"(a.s4), "r"(b.s4), "r"(c.s4)); asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s5) : "r"(a.s5), "r"(b.s5), "r"(c.s5)); asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s6) : "r"(a.s6), "r"(b.s6), "r"(c.s6)); asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s7) : "r"(a.s7), "r"(b.s7), "r"(c.s7)); #endif #if VECT_SIZE >= 16 asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s8) : "r"(a.s8), "r"(b.s8), "r"(c.s8)); asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s9) : "r"(a.s9), "r"(b.s9), "r"(c.s9)); asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.sa) : "r"(a.sa), "r"(b.sa), "r"(c.sa)); asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.sb) : "r"(a.sb), "r"(b.sb), "r"(c.sb)); asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.sc) : "r"(a.sc), "r"(b.sc), "r"(c.sc)); asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.sd) : "r"(a.sd), "r"(b.sd), "r"(c.sd)); asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.se) : "r"(a.se), "r"(b.se), "r"(c.se)); asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.sf) : "r"(a.sf), "r"(b.sf), "r"(c.sf)); #endif return r; } u32 __byte_perm_S (const u32 a, const u32 b, const u32 c) { u32 r; asm volatile ("prmt.b32 %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(c)); return r; } u32x __bfe (const u32x a, const u32x b, const u32x c) { u32x r; #if VECT_SIZE == 1 asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(c)); #endif #if VECT_SIZE >= 2 asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r.s0) : "r"(a.s0), "r"(b.s0), "r"(c.s0)); asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r.s1) : "r"(a.s1), "r"(b.s1), "r"(c.s1)); #endif #if VECT_SIZE >= 4 asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r.s2) : "r"(a.s2), "r"(b.s2), "r"(c.s2)); asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r.s3) : "r"(a.s3), "r"(b.s3), "r"(c.s3)); #endif #if VECT_SIZE >= 8 asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r.s4) : "r"(a.s4), "r"(b.s4), "r"(c.s4)); asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r.s5) : "r"(a.s5), "r"(b.s5), "r"(c.s5)); asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r.s6) : "r"(a.s6), "r"(b.s6), "r"(c.s6)); asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r.s7) : "r"(a.s7), "r"(b.s7), "r"(c.s7)); #endif #if VECT_SIZE >= 16 asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r.s8) : "r"(a.s8), "r"(b.s8), "r"(c.s8)); asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r.s9) : "r"(a.s9), "r"(b.s9), "r"(c.s9)); asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r.sa) : "r"(a.sa), "r"(b.sa), "r"(c.sa)); asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r.sb) : "r"(a.sb), "r"(b.sb), "r"(c.sb)); asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r.sc) : "r"(a.sc), "r"(b.sc), "r"(c.sc)); asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r.sd) : "r"(a.sd), "r"(b.sd), "r"(c.sd)); asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r.se) : "r"(a.se), "r"(b.se), "r"(c.se)); asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r.sf) : "r"(a.sf), "r"(b.sf), "r"(c.sf)); #endif return r; } u32 __bfe_S (const u32 a, const u32 b, const u32 c) { u32 r; asm volatile ("bfe.u32 %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(c)); return r; } u32x amd_bytealign (const u32x a, const u32x b, const u32x c) { u32x r; #if CUDA_ARCH >= 350 #if VECT_SIZE == 1 asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r) : "r"(b), "r"(a), "r"((c & 3) * 8)); #endif #if VECT_SIZE >= 2 asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r.s0) : "r"(b.s0), "r"(a.s0), "r"((c.s0 & 3) * 8)); asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r.s1) : "r"(b.s1), "r"(a.s1), "r"((c.s1 & 3) * 8)); #endif #if VECT_SIZE >= 4 asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r.s2) : "r"(b.s2), "r"(a.s2), "r"((c.s2 & 3) * 8)); asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r.s3) : "r"(b.s3), "r"(a.s3), "r"((c.s3 & 3) * 8)); #endif #if VECT_SIZE >= 8 asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r.s4) : "r"(b.s4), "r"(a.s4), "r"((c.s4 & 3) * 8)); asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r.s5) : "r"(b.s5), "r"(a.s5), "r"((c.s5 & 3) * 8)); asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r.s6) : "r"(b.s6), "r"(a.s6), "r"((c.s6 & 3) * 8)); asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r.s7) : "r"(b.s7), "r"(a.s7), "r"((c.s7 & 3) * 8)); #endif #if VECT_SIZE >= 16 asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r.s8) : "r"(b.s8), "r"(a.s8), "r"((c.s8 & 3) * 8)); asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r.s9) : "r"(b.s9), "r"(a.s9), "r"((c.s9 & 3) * 8)); asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r.sa) : "r"(b.sa), "r"(a.sa), "r"((c.sa & 3) * 8)); asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r.sb) : "r"(b.sb), "r"(a.sb), "r"((c.sb & 3) * 8)); asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r.sc) : "r"(b.sc), "r"(a.sc), "r"((c.sc & 3) * 8)); asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r.sd) : "r"(b.sd), "r"(a.sd), "r"((c.sd & 3) * 8)); asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r.se) : "r"(b.se), "r"(a.se), "r"((c.se & 3) * 8)); asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r.sf) : "r"(b.sf), "r"(a.sf), "r"((c.sf & 3) * 8)); #endif #else r = __byte_perm (b, a, ((u32x) (0x76543210) >> ((c & 3) * 4)) & 0xffff); #endif return r; } u32 amd_bytealign_S (const u32 a, const u32 b, const u32 c) { u32 r; #if CUDA_ARCH >= 350 asm volatile ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r) : "r"(b), "r"(a), "r"((c & 3) * 8)); #else r = __byte_perm_S (b, a, (0x76543210 >> ((c & 3) * 4)) & 0xffff); #endif return r; } u32x __add3 (const u32x a, const u32x b, const u32x c) { return a + b + c; } u32 __add3_S (const u32 a, const u32 b, const u32 c) { return a + b + c; } #endif #ifdef IS_GENERIC u32 swap32_S (const u32 v) { return (as_uint (as_uchar4 (v).s3210)); } u64 swap64_S (const u64 v) { return (as_ulong (as_uchar8 (v).s76543210)); } u32 rotr32_S (const u32 a, const u32 n) { return rotate (a, (32 - n)); } u32 rotl32_S (const u32 a, const u32 n) { return rotate (a, n); } u64 rotr64_S (const u64 a, const u32 n) { return rotate (a, (u64) (64 - n)); } u64 rotl64_S (const u64 a, const u32 n) { return rotate (a, (u64) n); } u32x swap32 (const u32x v) { return ((v >> 24) & 0x000000ff) | ((v >> 8) & 0x0000ff00) | ((v << 8) & 0x00ff0000) | ((v << 24) & 0xff000000); } u64x swap64 (const u64x v) { return ((v >> 56) & 0x00000000000000ff) | ((v >> 40) & 0x000000000000ff00) | ((v >> 24) & 0x0000000000ff0000) | ((v >> 8) & 0x00000000ff000000) | ((v << 8) & 0x000000ff00000000) | ((v << 24) & 0x0000ff0000000000) | ((v << 40) & 0x00ff000000000000) | ((v << 56) & 0xff00000000000000); } u32x rotr32 (const u32x a, const u32 n) { return rotate (a, (32 - n)); } u32x rotl32 (const u32x a, const u32 n) { return rotate (a, n); } u64x rotr64 (const u64x a, const u32 n) { return rotate (a, (u64x) (64 - n)); } u64x rotl64 (const u64x a, const u32 n) { return rotate (a, (u64x) n); } u32x __bfe (const u32x a, const u32x b, const u32x c) { #define BIT(x) ((u32x) (1u) << (x)) #define BIT_MASK(x) (BIT (x) - 1) #define BFE(x,y,z) (((x) >> (y)) & BIT_MASK (z)) return BFE (a, b, c); #undef BIT #undef BIT_MASK #undef BFE } u32 __bfe_S (const u32 a, const u32 b, const u32 c) { #define BIT(x) (1u << (x)) #define BIT_MASK(x) (BIT (x) - 1) #define BFE(x,y,z) (((x) >> (y)) & BIT_MASK (z)) return BFE (a, b, c); #undef BIT #undef BIT_MASK #undef BFE } u32x amd_bytealign (const u32x a, const u32x b, const u32 c) { #if VECT_SIZE == 1 const u64x tmp = ((((u64x) (a)) << 32) | ((u64x) (b))) >> ((c & 3) * 8); return (u32x) (tmp); #endif #if VECT_SIZE == 2 const u64x tmp = ((((u64x) (a.s0, a.s1)) << 32) | ((u64x) (b.s0, b.s1))) >> ((c & 3) * 8); return (u32x) (tmp.s0, tmp.s1); #endif #if VECT_SIZE == 4 const u64x tmp = ((((u64x) (a.s0, a.s1, a.s2, a.s3)) << 32) | ((u64x) (b.s0, b.s1, b.s2, b.s3))) >> ((c & 3) * 8); return (u32x) (tmp.s0, tmp.s1, tmp.s2, tmp.s3); #endif #if VECT_SIZE == 8 const u64x tmp = ((((u64x) (a.s0, a.s1, a.s2, a.s3, a.s4, a.s5, a.s6, a.s7)) << 32) | ((u64x) (b.s0, b.s1, b.s2, b.s3, b.s4, b.s5, b.s6, b.s7))) >> ((c & 3) * 8); return (u32x) (tmp.s0, tmp.s1, tmp.s2, tmp.s3, tmp.s4, tmp.s5, tmp.s6, tmp.s7); #endif #if VECT_SIZE == 16 const u64x tmp = ((((u64x) (a.s0, a.s1, a.s2, a.s3, a.s4, a.s5, a.s6, a.s7, a.s8, a.s9, a.sa, a.sb, a.sc, a.sd, a.se, a.sf)) << 32) | ((u64x) (b.s0, b.s1, b.s2, b.s3, b.s4, b.s5, b.s6, b.s7, b.s8, b.s9, b.sa, b.sb, b.sc, b.sd, b.se, b.sf))) >> ((c & 3) * 8); return (u32x) (tmp.s0, tmp.s1, tmp.s2, tmp.s3, tmp.s4, tmp.s5, tmp.s6, tmp.s7, tmp.s8, tmp.s9, tmp.sa, tmp.sb, tmp.sc, tmp.sd, tmp.se, tmp.sf); #endif } u32 amd_bytealign_S (const u32 a, const u32 b, const u32 c) { const u64 tmp = ((((u64) a) << 32) | ((u64) b)) >> ((c & 3) * 8); return (u32) (tmp); } u32x __add3 (const u32x a, const u32x b, const u32x c) { return a + b + c; } u32 __add3_S (const u32 a, const u32 b, const u32 c) { return a + b + c; } #endif typedef struct digest { u32 digest_buf[DGST_ELEM]; } digest_t; typedef struct salt { u32 salt_buf[64]; u32 salt_buf_pc[64]; u32 salt_len; u32 salt_len_pc; u32 salt_iter; u32 salt_iter2; u32 salt_sign[2]; u32 keccak_mdlen; u32 digests_cnt; u32 digests_done; u32 digests_offset; u32 scrypt_N; u32 scrypt_r; u32 scrypt_p; } salt_t; #define LUKS_STRIPES 4000 typedef enum hc_luks_hash_type { HC_LUKS_HASH_TYPE_SHA1 = 1, HC_LUKS_HASH_TYPE_SHA256 = 2, HC_LUKS_HASH_TYPE_SHA512 = 3, HC_LUKS_HASH_TYPE_RIPEMD160 = 4, HC_LUKS_HASH_TYPE_WHIRLPOOL = 5, } hc_luks_hash_type_t; typedef enum hc_luks_key_size { HC_LUKS_KEY_SIZE_128 = 128, HC_LUKS_KEY_SIZE_256 = 256, HC_LUKS_KEY_SIZE_512 = 512, } hc_luks_key_size_t; typedef enum hc_luks_cipher_type { HC_LUKS_CIPHER_TYPE_AES = 1, HC_LUKS_CIPHER_TYPE_SERPENT = 2, HC_LUKS_CIPHER_TYPE_TWOFISH = 3, } hc_luks_cipher_type_t; typedef enum hc_luks_cipher_mode { HC_LUKS_CIPHER_MODE_CBC_ESSIV = 1, HC_LUKS_CIPHER_MODE_CBC_PLAIN = 2, HC_LUKS_CIPHER_MODE_XTS_PLAIN = 3, } hc_luks_cipher_mode_t; typedef struct luks { int hash_type; // hc_luks_hash_type_t int key_size; // hc_luks_key_size_t int cipher_type; // hc_luks_cipher_type_t int cipher_mode; // hc_luks_cipher_mode_t u32 ct_buf[128]; u32 af_src_buf[((HC_LUKS_KEY_SIZE_512 / 8) * LUKS_STRIPES) / 4]; } luks_t; typedef struct itunes_backup { u32 wpky[10]; u32 dpsl[5]; } itunes_backup_t; typedef struct blake2 { u64 h[8]; u64 t[2]; u64 f[2]; u32 buflen; u32 outlen; u8 last_node; } blake2_t; typedef struct chacha20 { u32 iv[2]; u32 plain[2]; u32 position[2]; u32 offset; } chacha20_t; typedef struct pdf { 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 wpa { u32 pke[32]; u32 eapol[64 + 16]; u16 eapol_len; u8 message_pair; int message_pair_chgd; u8 keyver; u8 orig_mac_ap[6]; u8 orig_mac_sta[6]; u8 orig_nonce_ap[32]; u8 orig_nonce_sta[32]; u8 essid_len; u8 essid[32]; u32 keymic[4]; u32 hash[4]; int nonce_compare; int nonce_error_corrections; } wpa_t; typedef struct bitcoin_wallet { 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 sip { u32 salt_buf[32]; u32 salt_len; u32 esalt_buf[48]; u32 esalt_len; } sip_t; typedef struct androidfde { u32 data[384]; } androidfde_t; typedef struct ikepsk { u32 nr_buf[16]; u32 nr_len; u32 msg_buf[128]; u32 msg_len; } ikepsk_t; typedef struct netntlm { u32 user_len; u32 domain_len; u32 srvchall_len; u32 clichall_len; u32 userdomain_buf[64]; u32 chall_buf[256]; } netntlm_t; typedef struct krb5pa { u32 user[16]; u32 realm[16]; u32 salt[32]; u32 timestamp[16]; u32 checksum[4]; } krb5pa_t; typedef struct krb5tgs { u32 account_info[512]; u32 checksum[4]; u32 edata2[2560]; u32 edata2_len; } krb5tgs_t; typedef struct tc { u32 salt_buf[32]; u32 data_buf[112]; u32 keyfile_buf[16]; u32 signature; } tc_t; typedef struct pbkdf2_md5 { u32 salt_buf[16]; } pbkdf2_md5_t; typedef struct pbkdf2_sha1 { u32 salt_buf[16]; } pbkdf2_sha1_t; typedef struct pbkdf2_sha256 { u32 salt_buf[16]; } pbkdf2_sha256_t; typedef struct pbkdf2_sha512 { u32 salt_buf[32]; } pbkdf2_sha512_t; typedef struct rakp { u32 salt_buf[128]; u32 salt_len; } rakp_t; typedef struct cloudkey { u32 data_len; u32 data_buf[512]; } cloudkey_t; typedef struct office2007 { u32 encryptedVerifier[4]; u32 encryptedVerifierHash[5]; u32 keySize; } office2007_t; typedef struct office2010 { u32 encryptedVerifier[4]; u32 encryptedVerifierHash[8]; } office2010_t; typedef struct office2013 { u32 encryptedVerifier[4]; u32 encryptedVerifierHash[8]; } office2013_t; typedef struct oldoffice01 { u32 version; u32 encryptedVerifier[4]; u32 encryptedVerifierHash[4]; u32 rc4key[2]; } oldoffice01_t; typedef struct oldoffice34 { u32 version; u32 encryptedVerifier[4]; u32 encryptedVerifierHash[5]; u32 rc4key[2]; } oldoffice34_t; typedef struct pstoken { u32 salt_buf[128]; u32 salt_len; u32 pc_digest[5]; u32 pc_offset; } pstoken_t; typedef struct zip2 { u32 type; u32 mode; u32 magic; u32 salt_len; u32 salt_buf[4]; u32 verify_bytes; u32 compress_length; u32 data_len; u32 data_buf[2048]; u32 auth_len; u32 auth_buf[4]; } zip2_t; typedef struct win8phone { u32 salt_buf[32]; } win8phone_t; typedef struct keepass { u32 version; u32 algorithm; /* key-file handling */ u32 keyfile_len; u32 keyfile[8]; u32 final_random_seed[8]; u32 transf_random_seed[8]; u32 enc_iv[4]; u32 contents_hash[8]; /* specific to version 1 */ u32 contents_len; u32 contents[75000]; /* specific to version 2 */ u32 expected_bytes[8]; } keepass_t; typedef struct dpapimk { u32 context; u32 SID[32]; u32 SID_len; u32 SID_offset; /* here only for possible forward compatibiliy */ // u8 cipher_algo[16]; // u8 hash_algo[16]; u32 iv[4]; u32 contents_len; u32 contents[128]; } dpapimk_t; typedef struct jks_sha1 { u32 checksum[5]; u32 iv[5]; u32 enc_key_buf[4096]; u32 enc_key_len; u32 der[5]; u32 alias[16]; } jks_sha1_t; typedef struct ethereum_pbkdf2 { u32 salt_buf[16]; u32 ciphertext[8]; } ethereum_pbkdf2_t; typedef struct ethereum_scrypt { u32 salt_buf[16]; u32 ciphertext[8]; } ethereum_scrypt_t; typedef struct pdf14_tmp { u32 digest[4]; u32 out[4]; } pdf14_tmp_t; typedef struct luks_tmp { u32 ipad32[8]; u64 ipad64[8]; u32 opad32[8]; u64 opad64[8]; u32 dgst32[32]; u64 dgst64[16]; u32 out32[32]; u64 out64[16]; } luks_tmp_t; typedef struct pdf17l8_tmp { union { u32 dgst32[16]; u64 dgst64[8]; }; u32 dgst_len; u32 W_len; } pdf17l8_tmp_t; typedef struct phpass_tmp { u32 digest_buf[4]; } phpass_tmp_t; typedef struct md5crypt_tmp { u32 digest_buf[4]; } md5crypt_tmp_t; typedef struct sha256crypt_tmp { // pure version u32 alt_result[8]; u32 p_bytes[64]; u32 s_bytes[64]; } sha256crypt_tmp_t; typedef struct sha512crypt_tmp { u64 l_alt_result[8]; u64 l_p_bytes[2]; u64 l_s_bytes[2]; // pure version u32 alt_result[16]; u32 p_bytes[64]; u32 s_bytes[64]; } sha512crypt_tmp_t; typedef struct wpa_tmp { u32 ipad[5]; u32 opad[5]; u32 dgst[10]; u32 out[10]; } wpa_tmp_t; typedef struct wpapmk_tmp { u32 out[8]; } wpapmk_tmp_t; typedef struct bitcoin_wallet_tmp { u64 dgst[8]; } bitcoin_wallet_tmp_t; typedef struct dcc2_tmp { u32 ipad[5]; u32 opad[5]; u32 dgst[5]; u32 out[4]; } dcc2_tmp_t; typedef struct bcrypt_tmp { u32 E[18]; u32 P[18]; u32 S0[256]; u32 S1[256]; u32 S2[256]; u32 S3[256]; } bcrypt_tmp_t; typedef struct pwsafe2_tmp { u32 digest[2]; u32 P[18]; u32 S0[256]; u32 S1[256]; u32 S2[256]; u32 S3[256]; } pwsafe2_tmp_t; typedef struct pwsafe3_tmp { u32 digest_buf[8]; } pwsafe3_tmp_t; typedef struct androidpin_tmp { u32 digest_buf[5]; } androidpin_tmp_t; typedef struct androidfde_tmp { u32 ipad[5]; u32 opad[5]; u32 dgst[10]; u32 out[10]; } androidfde_tmp_t; typedef struct tc_tmp { u32 ipad[16]; u32 opad[16]; u32 dgst[64]; u32 out[64]; } tc_tmp_t; typedef struct tc64_tmp { u64 ipad[8]; u64 opad[8]; u64 dgst[32]; u64 out[32]; } tc64_tmp_t; typedef struct pbkdf1_sha1_tmp { // pbkdf1-sha1 is limited to 160 bits u32 ipad[5]; u32 opad[5]; u32 out[5]; } pbkdf1_sha1_tmp_t; typedef struct pbkdf2_md5_tmp { u32 ipad[4]; u32 opad[4]; u32 dgst[32]; u32 out[32]; } pbkdf2_md5_tmp_t; typedef struct pbkdf2_sha1_tmp { u32 ipad[5]; u32 opad[5]; u32 dgst[32]; u32 out[32]; } pbkdf2_sha1_tmp_t; typedef struct pbkdf2_sha256_tmp { u32 ipad[8]; u32 opad[8]; u32 dgst[32]; u32 out[32]; } pbkdf2_sha256_tmp_t; typedef struct pbkdf2_sha512_tmp { u64 ipad[8]; u64 opad[8]; u64 dgst[16]; u64 out[16]; } pbkdf2_sha512_tmp_t; typedef struct ecryptfs_tmp { u64 out[8]; } ecryptfs_tmp_t; typedef struct oraclet_tmp { u64 ipad[8]; u64 opad[8]; u64 dgst[16]; u64 out[16]; } oraclet_tmp_t; typedef struct agilekey_tmp { u32 ipad[5]; u32 opad[5]; u32 dgst[5]; u32 out[5]; } agilekey_tmp_t; typedef struct mywallet_tmp { u32 ipad[5]; u32 opad[5]; u32 dgst[10]; u32 out[10]; } mywallet_tmp_t; typedef struct sha1aix_tmp { u32 ipad[5]; u32 opad[5]; u32 dgst[5]; u32 out[5]; } sha1aix_tmp_t; typedef struct sha256aix_tmp { u32 ipad[8]; u32 opad[8]; u32 dgst[8]; u32 out[8]; } sha256aix_tmp_t; typedef struct sha512aix_tmp { u64 ipad[8]; u64 opad[8]; u64 dgst[8]; u64 out[8]; } sha512aix_tmp_t; typedef struct lastpass_tmp { u32 ipad[8]; u32 opad[8]; u32 dgst[8]; u32 out[8]; } lastpass_tmp_t; typedef struct drupal7_tmp { u64 digest_buf[8]; } drupal7_tmp_t; typedef struct lotus8_tmp { u32 ipad[5]; u32 opad[5]; u32 dgst[5]; u32 out[5]; } lotus8_tmp_t; typedef struct office2007_tmp { u32 out[5]; } office2007_tmp_t; typedef struct office2010_tmp { u32 out[5]; } office2010_tmp_t; typedef struct office2013_tmp { u64 out[8]; } office2013_tmp_t; typedef struct saph_sha1_tmp { u32 digest_buf[5]; } saph_sha1_tmp_t; typedef struct seven_zip_tmp { u32 h[8]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int len; } seven_zip_tmp_t; typedef struct axcrypt_tmp { u32 KEK[4]; u32 lsb[4]; u32 cipher[4]; } axcrypt_tmp_t; typedef struct keepass_tmp { u32 tmp_digest[8]; } keepass_tmp_t; typedef struct dpapimk_tmp_v1 { u32 ipad[5]; u32 opad[5]; u32 dgst[10]; u32 out[10]; u32 userKey[5]; } dpapimk_tmp_v1_t; typedef struct dpapimk_tmp_v2 { u64 ipad64[8]; u64 opad64[8]; u64 dgst64[16]; u64 out64[16]; u32 userKey[5]; } dpapimk_tmp_v2_t; typedef struct bsdicrypt_tmp { u32 Kc[16]; u32 Kd[16]; u32 iv[2]; } bsdicrypt_tmp_t; typedef struct rar3_tmp { u32 dgst[17][5]; } rar3_tmp_t; typedef struct { u32 ukey[8]; u32 hook_success; } seven_zip_hook_t; typedef struct cram_md5 { u32 user[16]; } cram_md5_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[32]; } kernel_rule_t; typedef struct pw { u32 i[64]; u32 pw_len; } pw_t; typedef struct bf { u32 i; } bf_t; typedef struct bs_word { u32 b[32]; } bs_word_t; typedef struct { u32 salt_pos; u32 digest_pos; u32 hash_pos; u32 gidvid; u32 il_pos; } plain_t; typedef struct { #ifndef SCRYPT_TMP_ELEM #define SCRYPT_TMP_ELEM 1 #endif uint4 P[SCRYPT_TMP_ELEM]; } scrypt_tmp_t; typedef enum combinator_mode { COMBINATOR_MODE_BASE_LEFT = 10001, COMBINATOR_MODE_BASE_RIGHT = 10002 } combinator_mode_t; hashcat-4.0.1/OpenCL/inc_vendor.cl000066400000000000000000000076331320027462700167310ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ /** * device type */ #define DEVICE_TYPE_CPU 2 #define DEVICE_TYPE_GPU 4 #define DEVICE_TYPE_ACCEL 8 #if DEVICE_TYPE == DEVICE_TYPE_CPU #define IS_CPU #elif DEVICE_TYPE == DEVICE_TYPE_GPU #define IS_GPU #elif DEVICE_TYPE == DEVICE_TYPE_ACCEL #define IS_ACCEL #endif #if DEVICE_TYPE == DEVICE_TYPE_CPU #elif DEVICE_TYPE == DEVICE_TYPE_GPU #define REAL_SHM #elif DEVICE_TYPE == DEVICE_TYPE_ACCEL #endif #ifdef REAL_SHM #define SHM_TYPE __local #define SCR_TYPE __local #else #define SHM_TYPE __constant #define SCR_TYPE #endif /** * vendor specific */ #if VENDOR_ID == (1 << 0) #if AMD_ROCM == 0 #define IS_AMD #define AMD_GCN 0 #else #define IS_AMD #if defined __gfx600__ || defined __gfx601__ #define AMD_GCN 1 #elif defined __gfx700__ || defined __gfx701__ || defined __gfx702__ || defined __gfx703__ #define AMD_GCN 2 #elif defined __gfx800__ || defined __gfx801__ || defined __gfx802__ || defined __gfx803__ || defined __gfx804__ || defined __gfx810__ #define AMD_GCN 3 // According to AMD docs, GCN 3 and 4 are the same #elif defined __gfx900__ || defined __gfx901__ || defined __gfx902__ || defined __gfx903__ #define AMD_GCN 5 #else #define AMD_GCN 0 #endif #endif #elif VENDOR_ID == (1 << 1) #define IS_APPLE #define IS_GENERIC #elif VENDOR_ID == (1 << 2) #define IS_INTEL_BEIGNET #define IS_GENERIC #elif VENDOR_ID == (1 << 3) #define IS_INTEL_SDK #define IS_GENERIC #elif VENDOR_ID == (1 << 4) #define IS_MESA #define IS_GENERIC #elif VENDOR_ID == (1 << 5) #define IS_NV #elif VENDOR_ID == (1 << 6) #define IS_POCL #define IS_GENERIC #else #define IS_GENERIC #endif /** * AMD specific */ #ifdef IS_AMD #pragma OPENCL EXTENSION cl_amd_media_ops : enable #pragma OPENCL EXTENSION cl_amd_media_ops2 : enable #endif /** * Unrolling is generally enabled, for all device types and hash modes * There's a few exception when it's better not to unroll * Some algorithms run into too much register pressure due to loop unrolling */ // generic vendors: those algos have shown that they produce better results on both amd and nv when not unrolled // so we can assume they will produce better results on other vendors as well #if KERN_TYPE == 1420 #undef _unroll #endif #if KERN_TYPE == 1450 #undef _unroll #endif #if KERN_TYPE == 1460 #undef _unroll #endif #if KERN_TYPE == 1720 #undef _unroll #endif #if KERN_TYPE == 1750 #undef _unroll #endif #if KERN_TYPE == 1760 #undef _unroll #endif #if KERN_TYPE == 1800 #undef _unroll #endif #if KERN_TYPE == 6221 #undef _unroll #endif #if KERN_TYPE == 6222 #undef _unroll #endif #if KERN_TYPE == 6223 #undef _unroll #endif #if KERN_TYPE == 6400 #undef _unroll #endif #if KERN_TYPE == 6500 #undef _unroll #endif #if KERN_TYPE == 6800 #undef _unroll #endif #if KERN_TYPE == 7100 #undef _unroll #endif #if KERN_TYPE == 7400 #undef _unroll #endif #if KERN_TYPE == 7900 #undef _unroll #endif #if KERN_TYPE == 8900 #undef _unroll #endif #if KERN_TYPE == 10700 #undef _unroll #endif #if KERN_TYPE == 13721 #undef _unroll #endif #if KERN_TYPE == 13722 #undef _unroll #endif #if KERN_TYPE == 13723 #undef _unroll #endif #if KERN_TYPE == 13751 #undef _unroll #endif #if KERN_TYPE == 13752 #undef _unroll #endif #if KERN_TYPE == 13753 #undef _unroll #endif #if KERN_TYPE == 13800 #undef _unroll #endif #if KERN_TYPE == 15700 #undef _unroll #endif // nvidia specific #ifdef IS_NV #ifdef IS_GPU #if KERN_TYPE == 1500 #undef _unroll #endif #if KERN_TYPE == 3000 #undef _unroll #endif #if KERN_TYPE == 14000 #undef _unroll #endif #endif #endif // amd specific #ifdef IS_AMD #ifdef IS_GPU #if KERN_TYPE == 8000 #undef _unroll #endif #if KERN_TYPE == 8200 #undef _unroll #endif #if KERN_TYPE == 12300 #undef _unroll #endif #if KERN_TYPE == 14100 #undef _unroll #endif #if KERN_TYPE == 15300 #undef _unroll #endif #if KERN_TYPE == 15900 #undef _unroll #endif #endif #endif // apple specific #ifdef IS_APPLE #if KERN_TYPE == 5000 #undef _unroll #endif #endif hashcat-4.0.1/OpenCL/m00000_a0-optimized.cl000066400000000000000000000377341320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m00000_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m00000_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00000_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00000_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00000_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00000_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00000_a0.cl000066400000000000000000000076411320027462700157760ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m00000_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx; md5_init (&ctx); md5_update (&ctx, tmp.i, tmp.pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00000_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx; md5_init (&ctx); md5_update (&ctx, tmp.i, tmp.pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00000_a1-optimized.cl000066400000000000000000000462611320027462700200020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __kernel void m00000_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = 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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m00000_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00000_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00000_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = 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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00000_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00000_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00000_a1.cl000066400000000000000000000075521320027462700160000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m00000_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00000_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00000_a3-optimized.cl000066400000000000000000000731211320027462700177770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #define MD5_STEP_REV(f,a,b,c,d,x,t,s) \ { \ a -= b; \ a = rotr32_S (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_S (a, s); \ a -= x; \ a -= t; \ } void m00000m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ const u32 F_w0c00 = 0u + 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 = 0u + 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 = 0u + 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 = 0u + 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } void m00000s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ const u32 F_w0c00 = 0u + 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 = 0u + 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 = 0u + 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 = 0u + 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_S, b_rev, c_rev, d_rev, a_rev, w[ 9], MD5C3f, MD5S33); MD5_STEP_REV (MD5_I_S, c_rev, d_rev, a_rev, b_rev, w[ 2], MD5C3e, MD5S32); MD5_STEP_REV (MD5_I_S, d_rev, a_rev, b_rev, c_rev, w[11], MD5C3d, MD5S31); MD5_STEP_REV (MD5_I_S, a_rev, b_rev, c_rev, d_rev, w[ 4], MD5C3c, MD5S30); MD5_STEP_REV (MD5_I_S, b_rev, c_rev, d_rev, a_rev, w[13], MD5C3b, MD5S33); MD5_STEP_REV (MD5_I_S, c_rev, d_rev, a_rev, b_rev, w[ 6], MD5C3a, MD5S32); MD5_STEP_REV (MD5_I_S, d_rev, a_rev, b_rev, c_rev, w[15], MD5C39, MD5S31); MD5_STEP_REV (MD5_I_S, a_rev, b_rev, c_rev, d_rev, w[ 8], MD5C38, MD5S30); MD5_STEP_REV (MD5_I_S, b_rev, c_rev, d_rev, a_rev, w[ 1], MD5C37, MD5S33); MD5_STEP_REV (MD5_I_S, c_rev, d_rev, a_rev, b_rev, w[10], MD5C36, MD5S32); MD5_STEP_REV (MD5_I_S, d_rev, a_rev, b_rev, c_rev, w[ 3], MD5C35, MD5S31); MD5_STEP_REV (MD5_I_S, a_rev, b_rev, c_rev, d_rev, w[12], MD5C34, MD5S30); MD5_STEP_REV (MD5_I_S, b_rev, c_rev, d_rev, a_rev, w[ 5], MD5C33, MD5S33); MD5_STEP_REV (MD5_I_S, c_rev, d_rev, a_rev, b_rev, w[14], MD5C32, MD5S32); MD5_STEP_REV (MD5_I_S, d_rev, a_rev, b_rev, c_rev, w[ 7], MD5C31, MD5S31); MD5_STEP_REV (MD5_I_S, a_rev, b_rev, c_rev, d_rev, 0, MD5C30, MD5S30); const u32 pre_cd = c_rev ^ d_rev; MD5_STEP_REV1(MD5_H_S, b_rev, c_rev, d_rev, a_rev, w[ 2], MD5C2f, MD5S23); MD5_STEP_REV1(MD5_H_S, c_rev, d_rev, a_rev, b_rev, w[15], MD5C2e, MD5S22); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); u32x t; 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); if (MATCHES_NONE_VV (pre_c, c)) 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); if (MATCHES_NONE_VV (pre_d, d)) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00000_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00000_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00000_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00000_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00000_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00000_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m00000_a3.cl000066400000000000000000000103701320027462700157720ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __kernel void m00000_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector (&ctx); md5_update_vector (&ctx, w, pw_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m00000_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector (&ctx); md5_update_vector (&ctx, w, pw_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00010_a0-optimized.cl000066400000000000000000000472041320027462700200000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m00010_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); const u32x 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; /** * 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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m00010_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00010_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00010_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); const u32x 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; /** * 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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00010_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00010_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00010_a0.cl000066400000000000000000000105531320027462700157730ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m00010_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx; md5_init (&ctx); md5_update (&ctx, tmp.i, tmp.pw_len); md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00010_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx; md5_init (&ctx); md5_update (&ctx, tmp.i, tmp.pw_len); md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00010_a1-optimized.cl000066400000000000000000000557171320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m00010_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); const u32x 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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m00010_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00010_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00010_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); const u32x 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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00010_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00010_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00010_a1.cl000066400000000000000000000104641320027462700157750ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m00010_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00010_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00010_a3-optimized.cl000066400000000000000000000757701320027462700200140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define MD5_STEP_REV(f,a,b,c,d,x,t,s) \ { \ a -= b; \ a = rotr32_S (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_S (a, s); \ a -= x; \ a -= t; \ } void m00010m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 pw_salt_len = pw_len + salt_len; switch_buffer_by_offset_le_S (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] = pw_salt_len * 8; w[15] = 0; /** * base */ const u32 F_w0c00 = 0u + 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 = 0u + 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 = 0u + 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 = 0u + 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } void m00010s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ const u32 F_w0c00 = 0u + 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 = 0u + 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 = 0u + 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 = 0u + 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_S, b_rev, c_rev, d_rev, a_rev, w[ 9], MD5C3f, MD5S33); MD5_STEP_REV (MD5_I_S, c_rev, d_rev, a_rev, b_rev, w[ 2], MD5C3e, MD5S32); MD5_STEP_REV (MD5_I_S, d_rev, a_rev, b_rev, c_rev, w[11], MD5C3d, MD5S31); MD5_STEP_REV (MD5_I_S, a_rev, b_rev, c_rev, d_rev, w[ 4], MD5C3c, MD5S30); MD5_STEP_REV (MD5_I_S, b_rev, c_rev, d_rev, a_rev, w[13], MD5C3b, MD5S33); MD5_STEP_REV (MD5_I_S, c_rev, d_rev, a_rev, b_rev, w[ 6], MD5C3a, MD5S32); MD5_STEP_REV (MD5_I_S, d_rev, a_rev, b_rev, c_rev, w[15], MD5C39, MD5S31); MD5_STEP_REV (MD5_I_S, a_rev, b_rev, c_rev, d_rev, w[ 8], MD5C38, MD5S30); MD5_STEP_REV (MD5_I_S, b_rev, c_rev, d_rev, a_rev, w[ 1], MD5C37, MD5S33); MD5_STEP_REV (MD5_I_S, c_rev, d_rev, a_rev, b_rev, w[10], MD5C36, MD5S32); MD5_STEP_REV (MD5_I_S, d_rev, a_rev, b_rev, c_rev, w[ 3], MD5C35, MD5S31); MD5_STEP_REV (MD5_I_S, a_rev, b_rev, c_rev, d_rev, w[12], MD5C34, MD5S30); MD5_STEP_REV (MD5_I_S, b_rev, c_rev, d_rev, a_rev, w[ 5], MD5C33, MD5S33); MD5_STEP_REV (MD5_I_S, c_rev, d_rev, a_rev, b_rev, w[14], MD5C32, MD5S32); MD5_STEP_REV (MD5_I_S, d_rev, a_rev, b_rev, c_rev, w[ 7], MD5C31, MD5S31); MD5_STEP_REV (MD5_I_S, a_rev, b_rev, c_rev, d_rev, 0, MD5C30, MD5S30); const u32 pre_cd = c_rev ^ d_rev; MD5_STEP_REV1(MD5_H_S, b_rev, c_rev, d_rev, a_rev, w[ 2], MD5C2f, MD5S23); MD5_STEP_REV1(MD5_H_S, c_rev, d_rev, a_rev, b_rev, w[15], MD5C2e, MD5S22); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); u32x t; 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); if (MATCHES_NONE_VV (pre_c, c)) 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); if (MATCHES_NONE_VV (pre_d, d)) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00010_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00010_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00010_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00010_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00010_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00010_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m00010_a3.cl000066400000000000000000000113221320027462700157710ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __kernel void m00010_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector (&ctx); md5_update_vector (&ctx, w, pw_len); md5_update_vector (&ctx, s, salt_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m00010_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector (&ctx); md5_update_vector (&ctx, w, pw_len); md5_update_vector (&ctx, s, salt_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00020_a0-optimized.cl000066400000000000000000000457661320027462700200140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m00020_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * prepend salt */ const u32x out_salt_len = out_len + salt_len; switch_buffer_by_offset_le (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]; 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] = out_salt_len * 8; w3[3] = 0; append_0x80_4x4_VV (w0, w1, w2, w3, out_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, 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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m00020_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00020_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00020_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * prepend salt */ const u32x out_salt_len = out_len + salt_len; switch_buffer_by_offset_le (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]; 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] = out_salt_len * 8; w3[3] = 0; append_0x80_4x4_VV (w0, w1, w2, w3, out_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, 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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00020_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00020_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00020_a0.cl000066400000000000000000000102071320027462700157700ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m00020_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx = ctx0; md5_update (&ctx, tmp.i, tmp.pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00020_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx = ctx0; md5_update (&ctx, tmp.i, tmp.pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00020_a1-optimized.cl000066400000000000000000000543171320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m00020_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len + 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]; 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] = 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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m00020_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00020_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00020_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len + 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]; 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] = 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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00020_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00020_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00020_a1.cl000066400000000000000000000100361320027462700157710ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m00020_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00020_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00020_a3-optimized.cl000066400000000000000000000651171320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m00020m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; switch_buffer_by_offset_le (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = pw_salt_len * 8; t3[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, 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); u32x t; MD5_STEP (MD5_H1, a, b, c, d, t1[1], MD5C20, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t2[0], MD5C21, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t2[3], MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t3[2], MD5C23, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t0[1], MD5C24, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t1[0], MD5C25, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t1[3], MD5C26, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t2[2], MD5C27, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t3[1], MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t0[0], MD5C29, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t0[3], MD5C2a, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t1[2], MD5C2b, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t2[1], MD5C2c, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t3[0], MD5C2d, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t3[3], MD5C2e, MD5S22); MD5_STEP (MD5_H2, 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); COMPARE_M_SIMD (a, d, c, b); } } void m00020s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; switch_buffer_by_offset_le (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = pw_salt_len * 8; t3[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, 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); u32x t; MD5_STEP (MD5_H1, a, b, c, d, t1[1], MD5C20, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t2[0], MD5C21, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t2[3], MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t3[2], MD5C23, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t0[1], MD5C24, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t1[0], MD5C25, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t1[3], MD5C26, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t2[2], MD5C27, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t3[1], MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t0[0], MD5C29, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t0[3], MD5C2a, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t1[2], MD5C2b, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t2[1], MD5C2c, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t3[0], MD5C2d, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t3[3], MD5C2e, MD5S22); MD5_STEP (MD5_H2, 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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00020_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00020_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00020_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00020_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00020_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00020_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m00020_a3.cl000066400000000000000000000110421320027462700157710ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __kernel void m00020_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector_from_scalar (&ctx, &ctx0); md5_update_vector (&ctx, w, pw_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m00020_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector_from_scalar (&ctx, &ctx0); md5_update_vector (&ctx, w, pw_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00030_a0-optimized.cl000066400000000000000000000475261320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m00030_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len2); const u32x pw_salt_len = out_len2 + 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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m00030_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00030_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00030_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len2); const u32x pw_salt_len = out_len2 + 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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00030_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00030_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00030_a0.cl000066400000000000000000000105731320027462700157770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m00030_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx; md5_init (&ctx); md5_update_utf16le (&ctx, tmp.i, tmp.pw_len); md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00030_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx; md5_init (&ctx); md5_update_utf16le (&ctx, tmp.i, tmp.pw_len); md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00030_a1-optimized.cl000066400000000000000000000562351320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m00030_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len2); const u32x pw_salt_len = pw_len2 + 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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m00030_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00030_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00030_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len2); const u32x pw_salt_len = pw_len2 + 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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00030_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00030_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00030_a1.cl000066400000000000000000000105241320027462700157740ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m00030_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global_utf16le (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global_utf16le (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00030_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global_utf16le (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global_utf16le (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00030_a3-optimized.cl000066400000000000000000000760221320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define MD5_STEP_REV(f,a,b,c,d,x,t,s) \ { \ a -= b; \ a = rotr32_S (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_S (a, s); \ a -= x; \ a -= t; \ } void m00030m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 pw_salt_len = pw_len + salt_len; switch_buffer_by_offset_le_S (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] = pw_salt_len * 8; w[15] = 0; /** * base */ const u32 F_w0c00 = 0u + 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 = 0u + 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 = 0u + 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 = 0u + 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } void m00030s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ const u32 F_w0c00 = 0u + 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 = 0u + 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 = 0u + 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 = 0u + 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_S, b_rev, c_rev, d_rev, a_rev, w[ 9], MD5C3f, MD5S33); MD5_STEP_REV (MD5_I_S, c_rev, d_rev, a_rev, b_rev, w[ 2], MD5C3e, MD5S32); MD5_STEP_REV (MD5_I_S, d_rev, a_rev, b_rev, c_rev, w[11], MD5C3d, MD5S31); MD5_STEP_REV (MD5_I_S, a_rev, b_rev, c_rev, d_rev, w[ 4], MD5C3c, MD5S30); MD5_STEP_REV (MD5_I_S, b_rev, c_rev, d_rev, a_rev, w[13], MD5C3b, MD5S33); MD5_STEP_REV (MD5_I_S, c_rev, d_rev, a_rev, b_rev, w[ 6], MD5C3a, MD5S32); MD5_STEP_REV (MD5_I_S, d_rev, a_rev, b_rev, c_rev, w[15], MD5C39, MD5S31); MD5_STEP_REV (MD5_I_S, a_rev, b_rev, c_rev, d_rev, w[ 8], MD5C38, MD5S30); MD5_STEP_REV (MD5_I_S, b_rev, c_rev, d_rev, a_rev, w[ 1], MD5C37, MD5S33); MD5_STEP_REV (MD5_I_S, c_rev, d_rev, a_rev, b_rev, w[10], MD5C36, MD5S32); MD5_STEP_REV (MD5_I_S, d_rev, a_rev, b_rev, c_rev, w[ 3], MD5C35, MD5S31); MD5_STEP_REV (MD5_I_S, a_rev, b_rev, c_rev, d_rev, w[12], MD5C34, MD5S30); MD5_STEP_REV (MD5_I_S, b_rev, c_rev, d_rev, a_rev, w[ 5], MD5C33, MD5S33); MD5_STEP_REV (MD5_I_S, c_rev, d_rev, a_rev, b_rev, w[14], MD5C32, MD5S32); MD5_STEP_REV (MD5_I_S, d_rev, a_rev, b_rev, c_rev, w[ 7], MD5C31, MD5S31); MD5_STEP_REV (MD5_I_S, a_rev, b_rev, c_rev, d_rev, 0, MD5C30, MD5S30); const u32 pre_cd = c_rev ^ d_rev; MD5_STEP_REV1(MD5_H_S, b_rev, c_rev, d_rev, a_rev, w[ 2], MD5C2f, MD5S23); MD5_STEP_REV1(MD5_H_S, c_rev, d_rev, a_rev, b_rev, w[15], MD5C2e, MD5S22); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); u32x t; 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); if (MATCHES_NONE_VV (pre_c, c)) 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); if (MATCHES_NONE_VV (pre_d, d)) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00030_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00030_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00030_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00030_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00030_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00030_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m00030_a3.cl000066400000000000000000000113421320027462700157750ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __kernel void m00030_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector (&ctx); md5_update_vector_utf16le (&ctx, w, pw_len); md5_update_vector (&ctx, s, salt_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m00030_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector (&ctx); md5_update_vector_utf16le (&ctx, w, pw_len); md5_update_vector (&ctx, s, salt_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00040_a0-optimized.cl000066400000000000000000000463141320027462700200040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m00040_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * prepend salt */ const u32x out_salt_len = out_len2 + salt_len; switch_buffer_by_offset_le_VV (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]; 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] = out_salt_len * 8; w3[3] = 0; append_0x80_4x4_VV (w0, w1, w2, w3, out_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, 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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m00040_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00040_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00040_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * prepend salt */ const u32x out_salt_len = out_len2 + salt_len; switch_buffer_by_offset_le_VV (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]; 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] = out_salt_len * 8; w3[3] = 0; append_0x80_4x4_VV (w0, w1, w2, w3, out_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, 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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00040_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00040_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00040_a0.cl000066400000000000000000000102271320027462700157740ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m00040_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx = ctx0; md5_update_utf16le (&ctx, tmp.i, tmp.pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00040_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx = ctx0; md5_update_utf16le (&ctx, tmp.i, tmp.pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00040_a1-optimized.cl000066400000000000000000000546331320027462700200100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m00040_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len2 + 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]; 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] = 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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m00040_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00040_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00040_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len2 + 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]; 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] = 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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00040_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00040_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00040_a1.cl000066400000000000000000000100761320027462700157770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m00040_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); md5_update_global_utf16le (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global_utf16le (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00040_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); md5_update_global_utf16le (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global_utf16le (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00040_a3-optimized.cl000066400000000000000000000651171320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m00040m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; switch_buffer_by_offset_le (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = pw_salt_len * 8; t3[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, 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); u32x t; MD5_STEP (MD5_H1, a, b, c, d, t1[1], MD5C20, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t2[0], MD5C21, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t2[3], MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t3[2], MD5C23, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t0[1], MD5C24, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t1[0], MD5C25, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t1[3], MD5C26, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t2[2], MD5C27, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t3[1], MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t0[0], MD5C29, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t0[3], MD5C2a, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t1[2], MD5C2b, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t2[1], MD5C2c, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t3[0], MD5C2d, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t3[3], MD5C2e, MD5S22); MD5_STEP (MD5_H2, 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); COMPARE_M_SIMD (a, d, c, b); } } void m00040s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; switch_buffer_by_offset_le (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = pw_salt_len * 8; t3[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, 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); u32x t; MD5_STEP (MD5_H1, a, b, c, d, t1[1], MD5C20, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t2[0], MD5C21, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t2[3], MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t3[2], MD5C23, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t0[1], MD5C24, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t1[0], MD5C25, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t1[3], MD5C26, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t2[2], MD5C27, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t3[1], MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t0[0], MD5C29, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t0[3], MD5C2a, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t1[2], MD5C2b, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t2[1], MD5C2c, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t3[0], MD5C2d, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t3[3], MD5C2e, MD5S22); MD5_STEP (MD5_H2, 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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00040_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00040_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00040_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00040_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00040_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00040_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m00040_a3.cl000066400000000000000000000110621320027462700157750ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __kernel void m00040_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector_from_scalar (&ctx, &ctx0); md5_update_vector_utf16le (&ctx, w, pw_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m00040_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector_from_scalar (&ctx, &ctx0); md5_update_vector_utf16le (&ctx, w, pw_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00050_a0-optimized.cl000066400000000000000000000325631320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m00050_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * pads */ u32x ipad[4]; u32x opad[4]; hmac_md5_pad (w0, w1, w2, w3, ipad, opad); 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] = (64 + salt_len) * 8; w3[3] = 0; u32x digest[4]; hmac_md5_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_M_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m00050_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00050_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00050_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * pads */ u32x ipad[4]; u32x opad[4]; hmac_md5_pad (w0, w1, w2, w3, ipad, opad); 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] = (64 + salt_len) * 8; w3[3] = 0; u32x digest[4]; hmac_md5_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_S_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m00050_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00050_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00050_a0.cl000066400000000000000000000106131320027462700157740ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m00050_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_hmac_ctx_t ctx; md5_hmac_init (&ctx, tmp.i, tmp.pw_len); md5_hmac_update (&ctx, s, salt_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00050_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_hmac_ctx_t ctx; md5_hmac_init (&ctx, tmp.i, tmp.pw_len); md5_hmac_update (&ctx, s, salt_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00050_a1-optimized.cl000066400000000000000000000413541320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m00050_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * pads */ u32x ipad[4]; u32x opad[4]; hmac_md5_pad (w0, w1, w2, w3, ipad, opad); 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] = (64 + salt_len) * 8; w3[3] = 0; u32x digest[4]; hmac_md5_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_M_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m00050_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00050_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00050_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * pads */ u32x ipad[4]; u32x opad[4]; hmac_md5_pad (w0, w1, w2, w3, ipad, opad); 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] = (64 + salt_len) * 8; w3[3] = 0; u32x digest[4]; hmac_md5_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_S_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m00050_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00050_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00050_a1.cl000066400000000000000000000122301320027462700157720ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m00050_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = combs_buf[il_pos].i[idx]; } switch_buffer_by_offset_1x64_le_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } md5_hmac_ctx_t ctx; md5_hmac_init (&ctx, c, pw_len + comb_len); md5_hmac_update (&ctx, s, salt_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00050_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = combs_buf[il_pos].i[idx]; } switch_buffer_by_offset_1x64_le_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } md5_hmac_ctx_t ctx; md5_hmac_init (&ctx, c, pw_len + comb_len); md5_hmac_update (&ctx, s, salt_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00050_a3-optimized.cl000066400000000000000000000525401320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } void m00050m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * pads */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; 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); COMPARE_M_SIMD (digest[0], digest[3], digest[2], digest[1]); } } void m00050s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * pads */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; 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); COMPARE_S_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m00050_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00050_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00050_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00050_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00050_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00050_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m00050_a3.cl000066400000000000000000000113441320027462700160010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __kernel void m00050_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_hmac_ctx_vector_t ctx; md5_hmac_init_vector (&ctx, w, pw_len); md5_hmac_update_vector (&ctx, s, salt_len); md5_hmac_final_vector (&ctx); const u32x r0 = ctx.opad.h[DGST_R0]; const u32x r1 = ctx.opad.h[DGST_R1]; const u32x r2 = ctx.opad.h[DGST_R2]; const u32x r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m00050_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_hmac_ctx_vector_t ctx; md5_hmac_init_vector (&ctx, w, pw_len); md5_hmac_update_vector (&ctx, s, salt_len); md5_hmac_final_vector (&ctx); const u32x r0 = ctx.opad.h[DGST_R0]; const u32x r1 = ctx.opad.h[DGST_R1]; const u32x r2 = ctx.opad.h[DGST_R2]; const u32x r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00060_a0-optimized.cl000066400000000000000000000344111320027462700200010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m00060_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (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); COMPARE_M_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m00060_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00060_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00060_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (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); COMPARE_S_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m00060_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00060_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00060_a0.cl000066400000000000000000000107071320027462700160010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m00060_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_hmac_ctx_t ctx0; md5_hmac_init (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_hmac_ctx_t ctx = ctx0; md5_hmac_update (&ctx, tmp.i, tmp.pw_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00060_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_hmac_ctx_t ctx0; md5_hmac_init (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_hmac_ctx_t ctx = ctx0; md5_hmac_update (&ctx, tmp.i, tmp.pw_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00060_a1-optimized.cl000066400000000000000000000414761320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m00060_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = (64 + pw_len) * 8; w3[3] = 0; u32x digest[4]; hmac_md5_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_M_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m00060_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00060_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00060_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = (64 + pw_len) * 8; w3[3] = 0; u32x digest[4]; hmac_md5_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_S_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m00060_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00060_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00060_a1.cl000066400000000000000000000123241320027462700157770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m00060_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_hmac_ctx_t ctx0; md5_hmac_init (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = combs_buf[il_pos].i[idx]; } switch_buffer_by_offset_1x64_le_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } md5_hmac_ctx_t ctx = ctx0; md5_hmac_update (&ctx, c, pw_len + comb_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00060_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_hmac_ctx_t ctx0; md5_hmac_init (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = combs_buf[il_pos].i[idx]; } switch_buffer_by_offset_1x64_le_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } md5_hmac_ctx_t ctx = ctx0; md5_hmac_update (&ctx, c, pw_len + comb_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00060_a3-optimized.cl000066400000000000000000000524171320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } void m00060m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esal_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; u32x ipad[4]; u32x opad[4]; hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; w0_t[0] = w0lr; 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); COMPARE_M_SIMD (digest[0], digest[3], digest[2], digest[1]); } } void m00060s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; w0_t[0] = w0lr; 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); COMPARE_S_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m00060_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00060_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00060_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00060_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00060_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00060_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m00060_a3.cl000066400000000000000000000114561320027462700160060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __kernel void m00060_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_hmac_ctx_vector_t ctx0; md5_hmac_init_vector (&ctx0, s, salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_hmac_ctx_vector_t ctx = ctx0; md5_hmac_update_vector (&ctx, w, pw_len); md5_hmac_final_vector (&ctx); const u32x r0 = ctx.opad.h[DGST_R0]; const u32x r1 = ctx.opad.h[DGST_R1]; const u32x r2 = ctx.opad.h[DGST_R2]; const u32x r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m00060_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_hmac_ctx_vector_t ctx0; md5_hmac_init_vector (&ctx0, s, salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_hmac_ctx_vector_t ctx = ctx0; md5_hmac_update_vector (&ctx, w, pw_len); md5_hmac_final_vector (&ctx); const u32x r0 = ctx.opad.h[DGST_R0]; const u32x r1 = ctx.opad.h[DGST_R1]; const u32x r2 = ctx.opad.h[DGST_R2]; const u32x r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00100_a0-optimized.cl000066400000000000000000000566651320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m00100_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m00100_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00100_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00100_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00100_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00100_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00100_a0.cl000066400000000000000000000076641320027462700160040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m00100_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_swap (&ctx, tmp.i, tmp.pw_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00100_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_swap (&ctx, tmp.i, tmp.pw_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00100_a1-optimized.cl000066400000000000000000000652541320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m00100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m00100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00100_a1.cl000066400000000000000000000076131320027462700157770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m00100_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00100_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00100_a3-optimized.cl000066400000000000000000001120121320027462700177710ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m00100m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ const u32 c_16s = rotl32_S ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); const u32 c_17s = rotl32_S ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); const u32 c_18s = rotl32_S ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); const u32 c_19s = rotl32_S ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); const u32 c_20s = rotl32_S ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); const u32 c_21s = rotl32_S ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); const u32 c_22s = rotl32_S ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); const u32 c_23s = rotl32_S ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); const u32 c_24s = rotl32_S ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); const u32 c_25s = rotl32_S ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); const u32 c_26s = rotl32_S ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); const u32 c_27s = rotl32_S ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); const u32 c_28s = rotl32_S ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); const u32 c_29s = rotl32_S ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); const u32 c_30s = rotl32_S ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); const u32 c_31s = rotl32_S ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); const u32 c_32s = rotl32_S ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); const u32 c_33s = rotl32_S ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); const u32 c_34s = rotl32_S ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); const u32 c_35s = rotl32_S ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); const u32 c_36s = rotl32_S ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); const u32 c_37s = rotl32_S ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); const u32 c_38s = rotl32_S ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); const u32 c_39s = rotl32_S ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); const u32 c_40s = rotl32_S ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); const u32 c_41s = rotl32_S ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); const u32 c_42s = rotl32_S ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); const u32 c_43s = rotl32_S ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); const u32 c_44s = rotl32_S ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); const u32 c_45s = rotl32_S ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); const u32 c_46s = rotl32_S ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); const u32 c_47s = rotl32_S ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); const u32 c_48s = rotl32_S ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); const u32 c_49s = rotl32_S ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); const u32 c_50s = rotl32_S ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); const u32 c_51s = rotl32_S ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); const u32 c_52s = rotl32_S ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); const u32 c_53s = rotl32_S ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); const u32 c_54s = rotl32_S ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); const u32 c_55s = rotl32_S ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); const u32 c_56s = rotl32_S ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); const u32 c_57s = rotl32_S ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); const u32 c_58s = rotl32_S ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); const u32 c_59s = rotl32_S ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); const u32 c_60s = rotl32_S ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); const u32 c_61s = rotl32_S ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); const u32 c_62s = rotl32_S ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); const u32 c_63s = rotl32_S ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); const u32 c_64s = rotl32_S ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); const u32 c_65s = rotl32_S ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); const u32 c_66s = rotl32_S ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); const u32 c_67s = rotl32_S ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); const u32 c_68s = rotl32_S ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); const u32 c_69s = rotl32_S ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); const u32 c_70s = rotl32_S ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); const u32 c_71s = rotl32_S ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); const u32 c_72s = rotl32_S ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); const u32 c_73s = rotl32_S ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); const u32 c_74s = rotl32_S ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); const u32 c_75s = rotl32_S ((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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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 u32x c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); const u32x c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); const u32x c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); const u32x 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)); COMPARE_M_SIMD (d, e, c, b); } } void m00100s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ const u32 c_16s = rotl32_S ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); const u32 c_17s = rotl32_S ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); const u32 c_18s = rotl32_S ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); const u32 c_19s = rotl32_S ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); const u32 c_20s = rotl32_S ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); const u32 c_21s = rotl32_S ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); const u32 c_22s = rotl32_S ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); const u32 c_23s = rotl32_S ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); const u32 c_24s = rotl32_S ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); const u32 c_25s = rotl32_S ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); const u32 c_26s = rotl32_S ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); const u32 c_27s = rotl32_S ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); const u32 c_28s = rotl32_S ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); const u32 c_29s = rotl32_S ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); const u32 c_30s = rotl32_S ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); const u32 c_31s = rotl32_S ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); const u32 c_32s = rotl32_S ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); const u32 c_33s = rotl32_S ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); const u32 c_34s = rotl32_S ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); const u32 c_35s = rotl32_S ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); const u32 c_36s = rotl32_S ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); const u32 c_37s = rotl32_S ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); const u32 c_38s = rotl32_S ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); const u32 c_39s = rotl32_S ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); const u32 c_40s = rotl32_S ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); const u32 c_41s = rotl32_S ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); const u32 c_42s = rotl32_S ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); const u32 c_43s = rotl32_S ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); const u32 c_44s = rotl32_S ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); const u32 c_45s = rotl32_S ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); const u32 c_46s = rotl32_S ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); const u32 c_47s = rotl32_S ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); const u32 c_48s = rotl32_S ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); const u32 c_49s = rotl32_S ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); const u32 c_50s = rotl32_S ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); const u32 c_51s = rotl32_S ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); const u32 c_52s = rotl32_S ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); const u32 c_53s = rotl32_S ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); const u32 c_54s = rotl32_S ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); const u32 c_55s = rotl32_S ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); const u32 c_56s = rotl32_S ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); const u32 c_57s = rotl32_S ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); const u32 c_58s = rotl32_S ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); const u32 c_59s = rotl32_S ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); const u32 c_60s = rotl32_S ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); const u32 c_61s = rotl32_S ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); const u32 c_62s = rotl32_S ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); const u32 c_63s = rotl32_S ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); const u32 c_64s = rotl32_S ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); const u32 c_65s = rotl32_S ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); const u32 c_66s = rotl32_S ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); const u32 c_67s = rotl32_S ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); const u32 c_68s = rotl32_S ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); const u32 c_69s = rotl32_S ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); const u32 c_70s = rotl32_S ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); const u32 c_71s = rotl32_S ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); const u32 c_72s = rotl32_S ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); const u32 c_73s = rotl32_S ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); const u32 c_74s = rotl32_S ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); const u32 c_75s = rotl32_S ((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_S (search[1], 2u); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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)); if (MATCHES_NONE_VS (e, e_rev)) continue; const u32x c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); const u32x c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); const u32x c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); const u32x 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)); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m00100_a3.cl000066400000000000000000000104011320027462700157660ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m00100_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); sha1_update_vector (&ctx, w, pw_len); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m00100_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); sha1_update_vector (&ctx, w, pw_len); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00110_a0-optimized.cl000066400000000000000000000661631320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m00110_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); const u32x 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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m00110_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00110_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00110_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * reverse */ const u32 e_rev = rotl32_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); const u32x 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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00110_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00110_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00110_a0.cl000066400000000000000000000106261320027462700157750ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m00110_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_swap (&ctx, tmp.i, tmp.pw_len); sha1_update (&ctx, s, salt_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00110_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_swap (&ctx, tmp.i, tmp.pw_len); sha1_update (&ctx, s, salt_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00110_a1-optimized.cl000066400000000000000000000746761320027462700200170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m00110_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); const u32x 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] |= s3[2]; w3[3] |= s3[3]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m00110_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00110_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00110_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * reverse */ const u32 e_rev = rotl32_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); const u32x 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] |= s3[2]; w3[3] |= s3[3]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00110_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00110_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00110_a1.cl000066400000000000000000000105551320027462700157770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m00110_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_update (&ctx, s, salt_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00110_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_update (&ctx, s, salt_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00110_a3-optimized.cl000066400000000000000000001152631320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m00110m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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]; switch_buffer_by_offset_le_S (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); w[ 0] |= swap32_S (salt_buf0[0]); w[ 1] |= swap32_S (salt_buf0[1]); w[ 2] |= swap32_S (salt_buf0[2]); w[ 3] |= swap32_S (salt_buf0[3]); w[ 4] |= swap32_S (salt_buf1[0]); w[ 5] |= swap32_S (salt_buf1[1]); w[ 6] |= swap32_S (salt_buf1[2]); w[ 7] |= swap32_S (salt_buf1[3]); w[ 8] |= swap32_S (salt_buf2[0]); w[ 9] |= swap32_S (salt_buf2[1]); w[10] |= swap32_S (salt_buf2[2]); w[11] |= swap32_S (salt_buf2[3]); w[12] |= swap32_S (salt_buf3[0]); w[13] |= swap32_S (salt_buf3[1]); w[14] |= swap32_S (salt_buf3[2]); w[15] |= swap32_S (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_S ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); const u32 c_17s = rotl32_S ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); const u32 c_18s = rotl32_S ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); const u32 c_19s = rotl32_S ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); const u32 c_20s = rotl32_S ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); const u32 c_21s = rotl32_S ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); const u32 c_22s = rotl32_S ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); const u32 c_23s = rotl32_S ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); const u32 c_24s = rotl32_S ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); const u32 c_25s = rotl32_S ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); const u32 c_26s = rotl32_S ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); const u32 c_27s = rotl32_S ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); const u32 c_28s = rotl32_S ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); const u32 c_29s = rotl32_S ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); const u32 c_30s = rotl32_S ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); const u32 c_31s = rotl32_S ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); const u32 c_32s = rotl32_S ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); const u32 c_33s = rotl32_S ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); const u32 c_34s = rotl32_S ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); const u32 c_35s = rotl32_S ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); const u32 c_36s = rotl32_S ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); const u32 c_37s = rotl32_S ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); const u32 c_38s = rotl32_S ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); const u32 c_39s = rotl32_S ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); const u32 c_40s = rotl32_S ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); const u32 c_41s = rotl32_S ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); const u32 c_42s = rotl32_S ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); const u32 c_43s = rotl32_S ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); const u32 c_44s = rotl32_S ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); const u32 c_45s = rotl32_S ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); const u32 c_46s = rotl32_S ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); const u32 c_47s = rotl32_S ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); const u32 c_48s = rotl32_S ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); const u32 c_49s = rotl32_S ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); const u32 c_50s = rotl32_S ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); const u32 c_51s = rotl32_S ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); const u32 c_52s = rotl32_S ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); const u32 c_53s = rotl32_S ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); const u32 c_54s = rotl32_S ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); const u32 c_55s = rotl32_S ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); const u32 c_56s = rotl32_S ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); const u32 c_57s = rotl32_S ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); const u32 c_58s = rotl32_S ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); const u32 c_59s = rotl32_S ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); const u32 c_60s = rotl32_S ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); const u32 c_61s = rotl32_S ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); const u32 c_62s = rotl32_S ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); const u32 c_63s = rotl32_S ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); const u32 c_64s = rotl32_S ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); const u32 c_65s = rotl32_S ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); const u32 c_66s = rotl32_S ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); const u32 c_67s = rotl32_S ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); const u32 c_68s = rotl32_S ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); const u32 c_69s = rotl32_S ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); const u32 c_70s = rotl32_S ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); const u32 c_71s = rotl32_S ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); const u32 c_72s = rotl32_S ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); const u32 c_73s = rotl32_S ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); const u32 c_74s = rotl32_S ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); const u32 c_75s = rotl32_S ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); const u32 c_76s = rotl32_S ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); const u32 c_77s = rotl32_S ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); const u32 c_78s = rotl32_S ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); const u32 c_79s = rotl32_S ((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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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)); COMPARE_M_SIMD (d, e, c, b); } } void m00110s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ const u32 c_16s = rotl32_S ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); const u32 c_17s = rotl32_S ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); const u32 c_18s = rotl32_S ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); const u32 c_19s = rotl32_S ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); const u32 c_20s = rotl32_S ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); const u32 c_21s = rotl32_S ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); const u32 c_22s = rotl32_S ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); const u32 c_23s = rotl32_S ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); const u32 c_24s = rotl32_S ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); const u32 c_25s = rotl32_S ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); const u32 c_26s = rotl32_S ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); const u32 c_27s = rotl32_S ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); const u32 c_28s = rotl32_S ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); const u32 c_29s = rotl32_S ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); const u32 c_30s = rotl32_S ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); const u32 c_31s = rotl32_S ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); const u32 c_32s = rotl32_S ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); const u32 c_33s = rotl32_S ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); const u32 c_34s = rotl32_S ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); const u32 c_35s = rotl32_S ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); const u32 c_36s = rotl32_S ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); const u32 c_37s = rotl32_S ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); const u32 c_38s = rotl32_S ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); const u32 c_39s = rotl32_S ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); const u32 c_40s = rotl32_S ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); const u32 c_41s = rotl32_S ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); const u32 c_42s = rotl32_S ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); const u32 c_43s = rotl32_S ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); const u32 c_44s = rotl32_S ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); const u32 c_45s = rotl32_S ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); const u32 c_46s = rotl32_S ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); const u32 c_47s = rotl32_S ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); const u32 c_48s = rotl32_S ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); const u32 c_49s = rotl32_S ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); const u32 c_50s = rotl32_S ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); const u32 c_51s = rotl32_S ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); const u32 c_52s = rotl32_S ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); const u32 c_53s = rotl32_S ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); const u32 c_54s = rotl32_S ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); const u32 c_55s = rotl32_S ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); const u32 c_56s = rotl32_S ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); const u32 c_57s = rotl32_S ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); const u32 c_58s = rotl32_S ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); const u32 c_59s = rotl32_S ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); const u32 c_60s = rotl32_S ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); const u32 c_61s = rotl32_S ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); const u32 c_62s = rotl32_S ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); const u32 c_63s = rotl32_S ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); const u32 c_64s = rotl32_S ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); const u32 c_65s = rotl32_S ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); const u32 c_66s = rotl32_S ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); const u32 c_67s = rotl32_S ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); const u32 c_68s = rotl32_S ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); const u32 c_69s = rotl32_S ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); const u32 c_70s = rotl32_S ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); const u32 c_71s = rotl32_S ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); const u32 c_72s = rotl32_S ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); const u32 c_73s = rotl32_S ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); const u32 c_74s = rotl32_S ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); const u32 c_75s = rotl32_S ((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_S (search[1], 2u); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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)); if (MATCHES_NONE_VS (e, e_rev)) continue; const u32x c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); const u32x c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); const u32x c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); const u32x 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)); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00110_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00110_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00110_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00110_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00110_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00110_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m00110_a3.cl000066400000000000000000000113631320027462700157770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m00110_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); sha1_update_vector (&ctx, w, pw_len); sha1_update_vector (&ctx, s, salt_len); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m00110_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); sha1_update_vector (&ctx, w, pw_len); sha1_update_vector (&ctx, s, salt_len); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00120_a0-optimized.cl000066400000000000000000000654251320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m00120_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * prepend salt */ const u32x out_salt_len = out_len + salt_len; switch_buffer_by_offset_le_VV (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]; 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]; append_0x80_4x4_VV (w0, w1, w2, w3, out_salt_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); u32x we_t = 0; u32x wf_t = out_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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m00120_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00120_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00120_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * reverse */ const u32 e_rev = rotl32_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * prepend salt */ const u32x out_salt_len = out_len + salt_len; switch_buffer_by_offset_le_VV (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]; 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]; append_0x80_4x4_VV (w0, w1, w2, w3, out_salt_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); u32x we_t = 0; u32x wf_t = out_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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00120_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00120_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00120_a0.cl000066400000000000000000000102501320027462700157670ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m00120_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx = ctx0; sha1_update_swap (&ctx, tmp.i, tmp.pw_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00120_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx = ctx0; sha1_update_swap (&ctx, tmp.i, tmp.pw_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00120_a1-optimized.cl000066400000000000000000000737501320027462700200100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m00120_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len + 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]; 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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m00120_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00120_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00120_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * reverse */ const u32 e_rev = rotl32_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len + 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]; 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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00120_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00120_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00120_a1.cl000066400000000000000000000101131320027462700157660ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m00120_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00120_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00120_a3-optimized.cl000066400000000000000000001042561320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m00120m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; switch_buffer_by_offset_be (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = 0; t3[3] = pw_salt_len * 8; /** * sha1 */ u32x w0_t = t0[0]; u32x w1_t = t0[1]; u32x w2_t = t0[2]; u32x w3_t = t0[3]; u32x w4_t = t1[0]; u32x w5_t = t1[1]; u32x w6_t = t1[2]; u32x w7_t = t1[3]; u32x w8_t = t2[0]; u32x w9_t = t2[1]; u32x wa_t = t2[2]; u32x wb_t = t2[3]; u32x wc_t = t3[0]; u32x wd_t = t3[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); COMPARE_M_SIMD (d, e, c, b); } } void m00120s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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_S (search[1], 2u); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; switch_buffer_by_offset_be (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = 0; t3[3] = pw_salt_len * 8; /** * sha1 */ u32x w0_t = t0[0]; u32x w1_t = t0[1]; u32x w2_t = t0[2]; u32x w3_t = t0[3]; u32x w4_t = t1[0]; u32x w5_t = t1[1]; u32x w6_t = t1[2]; u32x w7_t = t1[3]; u32x w8_t = t2[0]; u32x w9_t = t2[1]; u32x wa_t = t2[2]; u32x wb_t = t2[3]; u32x wc_t = t3[0]; u32x wd_t = t3[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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00120_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00120_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00120_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00120_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00120_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00120_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m00120_a3.cl000066400000000000000000000110731320027462700157760ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m00120_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); sha1_update_vector (&ctx, w, pw_len); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m00120_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); sha1_update_vector (&ctx, w, pw_len); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00130_a0-optimized.cl000066400000000000000000000665051320027462700200100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m00130_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len2); const u32x pw_salt_len = out_len2 + 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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m00130_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00130_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00130_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * reverse */ const u32 e_rev = rotl32_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len2); const u32x pw_salt_len = out_len2 + 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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00130_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00130_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00130_a0.cl000066400000000000000000000106461320027462700160010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m00130_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_utf16le_swap (&ctx, tmp.i, tmp.pw_len); sha1_update (&ctx, s, salt_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00130_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_utf16le_swap (&ctx, tmp.i, tmp.pw_len); sha1_update (&ctx, s, salt_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00130_a1-optimized.cl000066400000000000000000000752141320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m00130_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len2); const u32x pw_salt_len = pw_len2 + 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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m00130_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00130_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00130_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * reverse */ const u32 e_rev = rotl32_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len2); const u32x pw_salt_len = pw_len2 + 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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00130_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00130_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00130_a1.cl000066400000000000000000000106151320027462700157760ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m00130_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_utf16le_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_utf16le_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_update (&ctx, s, salt_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00130_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_utf16le_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_utf16le_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_update (&ctx, s, salt_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00130_a3-optimized.cl000066400000000000000000001152631320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m00130m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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]; switch_buffer_by_offset_le_S (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); w[ 0] |= swap32_S (salt_buf0[0]); w[ 1] |= swap32_S (salt_buf0[1]); w[ 2] |= swap32_S (salt_buf0[2]); w[ 3] |= swap32_S (salt_buf0[3]); w[ 4] |= swap32_S (salt_buf1[0]); w[ 5] |= swap32_S (salt_buf1[1]); w[ 6] |= swap32_S (salt_buf1[2]); w[ 7] |= swap32_S (salt_buf1[3]); w[ 8] |= swap32_S (salt_buf2[0]); w[ 9] |= swap32_S (salt_buf2[1]); w[10] |= swap32_S (salt_buf2[2]); w[11] |= swap32_S (salt_buf2[3]); w[12] |= swap32_S (salt_buf3[0]); w[13] |= swap32_S (salt_buf3[1]); w[14] |= swap32_S (salt_buf3[2]); w[15] |= swap32_S (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_S ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); const u32 c_17s = rotl32_S ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); const u32 c_18s = rotl32_S ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); const u32 c_19s = rotl32_S ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); const u32 c_20s = rotl32_S ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); const u32 c_21s = rotl32_S ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); const u32 c_22s = rotl32_S ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); const u32 c_23s = rotl32_S ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); const u32 c_24s = rotl32_S ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); const u32 c_25s = rotl32_S ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); const u32 c_26s = rotl32_S ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); const u32 c_27s = rotl32_S ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); const u32 c_28s = rotl32_S ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); const u32 c_29s = rotl32_S ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); const u32 c_30s = rotl32_S ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); const u32 c_31s = rotl32_S ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); const u32 c_32s = rotl32_S ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); const u32 c_33s = rotl32_S ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); const u32 c_34s = rotl32_S ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); const u32 c_35s = rotl32_S ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); const u32 c_36s = rotl32_S ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); const u32 c_37s = rotl32_S ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); const u32 c_38s = rotl32_S ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); const u32 c_39s = rotl32_S ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); const u32 c_40s = rotl32_S ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); const u32 c_41s = rotl32_S ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); const u32 c_42s = rotl32_S ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); const u32 c_43s = rotl32_S ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); const u32 c_44s = rotl32_S ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); const u32 c_45s = rotl32_S ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); const u32 c_46s = rotl32_S ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); const u32 c_47s = rotl32_S ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); const u32 c_48s = rotl32_S ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); const u32 c_49s = rotl32_S ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); const u32 c_50s = rotl32_S ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); const u32 c_51s = rotl32_S ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); const u32 c_52s = rotl32_S ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); const u32 c_53s = rotl32_S ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); const u32 c_54s = rotl32_S ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); const u32 c_55s = rotl32_S ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); const u32 c_56s = rotl32_S ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); const u32 c_57s = rotl32_S ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); const u32 c_58s = rotl32_S ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); const u32 c_59s = rotl32_S ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); const u32 c_60s = rotl32_S ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); const u32 c_61s = rotl32_S ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); const u32 c_62s = rotl32_S ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); const u32 c_63s = rotl32_S ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); const u32 c_64s = rotl32_S ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); const u32 c_65s = rotl32_S ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); const u32 c_66s = rotl32_S ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); const u32 c_67s = rotl32_S ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); const u32 c_68s = rotl32_S ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); const u32 c_69s = rotl32_S ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); const u32 c_70s = rotl32_S ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); const u32 c_71s = rotl32_S ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); const u32 c_72s = rotl32_S ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); const u32 c_73s = rotl32_S ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); const u32 c_74s = rotl32_S ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); const u32 c_75s = rotl32_S ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); const u32 c_76s = rotl32_S ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); const u32 c_77s = rotl32_S ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); const u32 c_78s = rotl32_S ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); const u32 c_79s = rotl32_S ((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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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)); COMPARE_M_SIMD (d, e, c, b); } } void m00130s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ const u32 c_16s = rotl32_S ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); const u32 c_17s = rotl32_S ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); const u32 c_18s = rotl32_S ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); const u32 c_19s = rotl32_S ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); const u32 c_20s = rotl32_S ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); const u32 c_21s = rotl32_S ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); const u32 c_22s = rotl32_S ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); const u32 c_23s = rotl32_S ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); const u32 c_24s = rotl32_S ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); const u32 c_25s = rotl32_S ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); const u32 c_26s = rotl32_S ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); const u32 c_27s = rotl32_S ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); const u32 c_28s = rotl32_S ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); const u32 c_29s = rotl32_S ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); const u32 c_30s = rotl32_S ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); const u32 c_31s = rotl32_S ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); const u32 c_32s = rotl32_S ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); const u32 c_33s = rotl32_S ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); const u32 c_34s = rotl32_S ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); const u32 c_35s = rotl32_S ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); const u32 c_36s = rotl32_S ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); const u32 c_37s = rotl32_S ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); const u32 c_38s = rotl32_S ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); const u32 c_39s = rotl32_S ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); const u32 c_40s = rotl32_S ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); const u32 c_41s = rotl32_S ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); const u32 c_42s = rotl32_S ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); const u32 c_43s = rotl32_S ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); const u32 c_44s = rotl32_S ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); const u32 c_45s = rotl32_S ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); const u32 c_46s = rotl32_S ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); const u32 c_47s = rotl32_S ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); const u32 c_48s = rotl32_S ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); const u32 c_49s = rotl32_S ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); const u32 c_50s = rotl32_S ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); const u32 c_51s = rotl32_S ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); const u32 c_52s = rotl32_S ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); const u32 c_53s = rotl32_S ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); const u32 c_54s = rotl32_S ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); const u32 c_55s = rotl32_S ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); const u32 c_56s = rotl32_S ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); const u32 c_57s = rotl32_S ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); const u32 c_58s = rotl32_S ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); const u32 c_59s = rotl32_S ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); const u32 c_60s = rotl32_S ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); const u32 c_61s = rotl32_S ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); const u32 c_62s = rotl32_S ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); const u32 c_63s = rotl32_S ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); const u32 c_64s = rotl32_S ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); const u32 c_65s = rotl32_S ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); const u32 c_66s = rotl32_S ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); const u32 c_67s = rotl32_S ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); const u32 c_68s = rotl32_S ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); const u32 c_69s = rotl32_S ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); const u32 c_70s = rotl32_S ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); const u32 c_71s = rotl32_S ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); const u32 c_72s = rotl32_S ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); const u32 c_73s = rotl32_S ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); const u32 c_74s = rotl32_S ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); const u32 c_75s = rotl32_S ((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_S (search[1], 2u); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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)); if (MATCHES_NONE_VS (e, e_rev)) continue; const u32x c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); const u32x c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); const u32x c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); const u32x 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)); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00130_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00130_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00130_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00130_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00130_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00130_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m00130_a3.cl000066400000000000000000000114051320027462700157760ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m00130_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); sha1_update_vector_utf16beN (&ctx, w, pw_len); sha1_update_vector (&ctx, s, salt_len); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m00130_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); sha1_update_vector_utf16beN (&ctx, w, pw_len); sha1_update_vector (&ctx, s, salt_len); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00140_a0-optimized.cl000066400000000000000000000653271320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m00140_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * prepend salt */ const u32x out_salt_len = out_len2 + salt_len; switch_buffer_by_offset_le_VV (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]; 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]; append_0x80_4x4_VV (w0, w1, w2, w3, out_salt_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); u32x we_t = 0; u32x wf_t = out_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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m00140_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00140_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00140_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * reverse */ const u32 e_rev = rotl32_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * prepend salt */ const u32x out_salt_len = out_len2 + salt_len; switch_buffer_by_offset_le_VV (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]; 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]; append_0x80_4x4_VV (w0, w1, w2, w3, out_salt_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); u32x we_t = 0; u32x wf_t = out_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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00140_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00140_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00140_a0.cl000066400000000000000000000102701320027462700157730ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m00140_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx = ctx0; sha1_update_utf16le_swap (&ctx, tmp.i, tmp.pw_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00140_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx = ctx0; sha1_update_utf16le_swap (&ctx, tmp.i, tmp.pw_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00140_a1-optimized.cl000066400000000000000000000736461320027462700200160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m00140_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len2 + 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]; 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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m00140_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00140_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00140_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * reverse */ const u32 e_rev = rotl32_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len2 + 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]; 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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00140_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00140_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00140_a1.cl000066400000000000000000000101531320027462700157740ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m00140_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_update_global_utf16le_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_utf16le_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00140_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_update_global_utf16le_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_utf16le_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00140_a3-optimized.cl000066400000000000000000001042561320027462700200100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m00140m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; switch_buffer_by_offset_be (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = 0; t3[3] = pw_salt_len * 8; /** * sha1 */ u32x w0_t = t0[0]; u32x w1_t = t0[1]; u32x w2_t = t0[2]; u32x w3_t = t0[3]; u32x w4_t = t1[0]; u32x w5_t = t1[1]; u32x w6_t = t1[2]; u32x w7_t = t1[3]; u32x w8_t = t2[0]; u32x w9_t = t2[1]; u32x wa_t = t2[2]; u32x wb_t = t2[3]; u32x wc_t = t3[0]; u32x wd_t = t3[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); COMPARE_M_SIMD (d, e, c, b); } } void m00140s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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_S (search[1], 2u); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; switch_buffer_by_offset_be (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = 0; t3[3] = pw_salt_len * 8; /** * sha1 */ u32x w0_t = t0[0]; u32x w1_t = t0[1]; u32x w2_t = t0[2]; u32x w3_t = t0[3]; u32x w4_t = t1[0]; u32x w5_t = t1[1]; u32x w6_t = t1[2]; u32x w7_t = t1[3]; u32x w8_t = t2[0]; u32x w9_t = t2[1]; u32x wa_t = t2[2]; u32x wb_t = t2[3]; u32x wc_t = t3[0]; u32x wd_t = t3[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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00140_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00140_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00140_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00140_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00140_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00140_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m00140_a3.cl000066400000000000000000000111151320027462700157750ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m00140_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); sha1_update_vector_utf16beN (&ctx, w, pw_len); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m00140_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); sha1_update_vector_utf16beN (&ctx, w, pw_len); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00150_a0-optimized.cl000066400000000000000000000344161320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m00150_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); /** * pads */ u32x ipad[5]; u32x opad[5]; hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); 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] = 0; w3[3] = (64 + salt_len) * 8; u32x digest[5]; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m00150_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00150_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00150_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); /** * pads */ u32x ipad[5]; u32x opad[5]; hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); 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] = 0; w3[3] = (64 + salt_len) * 8; u32x digest[5]; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m00150_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00150_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00150_a0.cl000066400000000000000000000106641320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m00150_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_hmac_ctx_t ctx; sha1_hmac_init_swap (&ctx, tmp.i, tmp.pw_len); sha1_hmac_update (&ctx, s, salt_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00150_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_hmac_ctx_t ctx; sha1_hmac_init_swap (&ctx, tmp.i, tmp.pw_len); sha1_hmac_update (&ctx, s, salt_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00150_a1-optimized.cl000066400000000000000000000441071320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m00150_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); /** * pads */ u32x ipad[5]; u32x opad[5]; hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); 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] = 0; w3[3] = (64 + salt_len) * 8; u32x digest[5]; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m00150_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00150_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00150_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); /** * pads */ u32x ipad[5]; u32x opad[5]; hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); 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] = 0; w3[3] = (64 + salt_len) * 8; u32x digest[5]; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m00150_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00150_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00150_a1.cl000066400000000000000000000123431320027462700160000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m00150_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (pws[gid].i[idx]); } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = swap32_S (combs_buf[il_pos].i[idx]); } switch_buffer_by_offset_1x64_be_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } sha1_hmac_ctx_t ctx; sha1_hmac_init (&ctx, c, pw_len + comb_len); sha1_hmac_update (&ctx, s, salt_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00150_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (pws[gid].i[idx]); } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = swap32_S (combs_buf[il_pos].i[idx]); } switch_buffer_by_offset_1x64_be_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } sha1_hmac_ctx_t ctx; sha1_hmac_init (&ctx, c, pw_len + comb_len); sha1_hmac_update (&ctx, s, salt_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00150_a3-optimized.cl000066400000000000000000000534711320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } void m00150m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * pads */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; 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 + salt_len) * 8; u32x digest[5]; hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } void m00150s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * pads */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; 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 + salt_len) * 8; u32x digest[5]; hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m00150_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00150_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00150_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00150_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00150_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00150_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m00150_a3.cl000066400000000000000000000114031320027462700157760ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m00150_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_hmac_ctx_vector_t ctx; sha1_hmac_init_vector (&ctx, w, pw_len); sha1_hmac_update_vector (&ctx, s, salt_len); sha1_hmac_final_vector (&ctx); const u32x r0 = ctx.opad.h[DGST_R0]; const u32x r1 = ctx.opad.h[DGST_R1]; const u32x r2 = ctx.opad.h[DGST_R2]; const u32x r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m00150_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_hmac_ctx_vector_t ctx; sha1_hmac_init_vector (&ctx, w, pw_len); sha1_hmac_update_vector (&ctx, s, salt_len); sha1_hmac_final_vector (&ctx); const u32x r0 = ctx.opad.h[DGST_R0]; const u32x r1 = ctx.opad.h[DGST_R1]; const u32x r2 = ctx.opad.h[DGST_R2]; const u32x r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00160_a0-optimized.cl000066400000000000000000000355621320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m00160_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (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); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m00160_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00160_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00160_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (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); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m00160_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00160_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00160_a0.cl000066400000000000000000000107621320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m00160_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha1_hmac_ctx_t ctx0; sha1_hmac_init (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_hmac_ctx_t ctx = ctx0; sha1_hmac_update_swap (&ctx, tmp.i, tmp.pw_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00160_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha1_hmac_ctx_t ctx0; sha1_hmac_init (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_hmac_ctx_t ctx = ctx0; sha1_hmac_update_swap (&ctx, tmp.i, tmp.pw_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00160_a1-optimized.cl000066400000000000000000000444311320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m00160_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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_4x4_VV (w0, w1, w2, w3, pw_len); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = 0; w3[3] = (64 + pw_len) * 8; u32x digest[5]; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m00160_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00160_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00160_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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_4x4_VV (w0, w1, w2, w3, pw_len); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = 0; w3[3] = (64 + pw_len) * 8; u32x digest[5]; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m00160_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00160_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00160_a1.cl000066400000000000000000000124411320027462700160000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m00160_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (pws[gid].i[idx]); } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha1_hmac_ctx_t ctx0; sha1_hmac_init (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = swap32_S (combs_buf[il_pos].i[idx]); } switch_buffer_by_offset_1x64_be_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } sha1_hmac_ctx_t ctx = ctx0; sha1_hmac_update (&ctx, c, pw_len + comb_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00160_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (pws[gid].i[idx]); } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha1_hmac_ctx_t ctx0; sha1_hmac_init (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = swap32_S (combs_buf[il_pos].i[idx]); } switch_buffer_by_offset_1x64_be_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } sha1_hmac_ctx_t ctx = ctx0; sha1_hmac_update (&ctx, c, pw_len + comb_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00160_a3-optimized.cl000066400000000000000000000533501320027462700200100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } void m00160m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esal_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; u32x ipad[5]; u32x opad[5]; hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; w0_t[0] = w0lr; 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); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } void m00160s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; w0_t[0] = w0lr; 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); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m00160_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00160_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00160_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00160_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00160_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00160_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m00160_a3.cl000066400000000000000000000115171320027462700160050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m00160_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha1_hmac_ctx_vector_t ctx0; sha1_hmac_init_vector (&ctx0, s, salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_hmac_ctx_vector_t ctx = ctx0; sha1_hmac_update_vector (&ctx, w, pw_len); sha1_hmac_final_vector (&ctx); const u32x r0 = ctx.opad.h[DGST_R0]; const u32x r1 = ctx.opad.h[DGST_R1]; const u32x r2 = ctx.opad.h[DGST_R2]; const u32x r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m00160_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha1_hmac_ctx_vector_t ctx0; sha1_hmac_init_vector (&ctx0, s, salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_hmac_ctx_vector_t ctx = ctx0; sha1_hmac_update_vector (&ctx, w, pw_len); sha1_hmac_final_vector (&ctx); const u32x r0 = ctx.opad.h[DGST_R0]; const u32x r1 = ctx.opad.h[DGST_R1]; const u32x r2 = ctx.opad.h[DGST_R2]; const u32x r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00200_a0-optimized.cl000066400000000000000000000256631320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //incompatible //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m00200_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); 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 c = 0; u32x d = 0; 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; u32x z = 0; COMPARE_M_SIMD (a, b, z, z); } } __kernel void m00200_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00200_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00200_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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], 0, 0 }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); 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 c = 0; u32x d = 0; 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; u32x z = 0; COMPARE_S_SIMD (a, b, z, z); } } __kernel void m00200_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00200_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00200_a1-optimized.cl000066400000000000000000000343341320027462700200020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //incompatible //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m00200_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = pw_len * 8; w3[3] = 0; /** * mysql */ 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) 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; u32x z = 0; COMPARE_M_SIMD (a, b, z, z); } } __kernel void m00200_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00200_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00200_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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], 0, 0 }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = pw_len * 8; w3[3] = 0; /** * mysql */ 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 c = 0; u32x d = 0; 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; u32x z = 0; COMPARE_S_SIMD (a, b, z, z); } } __kernel void m00200_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00200_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00200_a3-optimized.cl000066400000000000000000000731621320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define ROUND(v) \ { \ a ^= (((a & 0x3f) + add) * (v)) + (a << 8); \ b += (b << 8) ^ a; \ add += v; \ } #define CODE_PRE \ { \ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) \ { \ const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; \ \ const u32x w0 = w0l | w0r; \ \ u32x a = MYSQL323_A; \ u32x b = MYSQL323_B; \ \ u32x add = 7; \ #define CODE_LOOP(rest) \ \ int i; \ int j; \ \ for (i = 0, j = 1; i <= (int) (rest) - 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 = (rest) - 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); \ } #define CODE_POST_M \ \ a &= 0x7fffffff; \ b &= 0x7fffffff; \ \ u32x z = 0; \ \ COMPARE_M_SIMD (a, b, z, z); \ } \ } #define CODE_POST_S \ \ a &= 0x7fffffff; \ b &= 0x7fffffff; \ \ u32x z = 0; \ \ COMPARE_S_SIMD (a, b, z, z); \ } \ } void m00200m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * loop */ u32 w0l = w[0]; switch (pw_len) { case 1: CODE_PRE; ROUND ((w0 >> 0) & 0xff); CODE_POST_M; break; case 2: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); CODE_POST_M; break; case 3: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); CODE_POST_M; break; case 4: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); CODE_POST_M; break; case 5: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); CODE_POST_M; break; case 6: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); CODE_POST_M; break; case 7: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); CODE_POST_M; break; case 8: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); CODE_POST_M; break; case 9: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); ROUND ((w[2] >> 0) & 0xff); CODE_POST_M; break; case 10: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); ROUND ((w[2] >> 0) & 0xff); ROUND ((w[2] >> 8) & 0xff); CODE_POST_M; break; case 11: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); ROUND ((w[2] >> 0) & 0xff); ROUND ((w[2] >> 8) & 0xff); ROUND ((w[2] >> 16) & 0xff); CODE_POST_M; break; case 12: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); ROUND ((w[2] >> 0) & 0xff); ROUND ((w[2] >> 8) & 0xff); ROUND ((w[2] >> 16) & 0xff); ROUND ((w[2] >> 24) & 0xff); CODE_POST_M; break; case 13: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); ROUND ((w[2] >> 0) & 0xff); ROUND ((w[2] >> 8) & 0xff); ROUND ((w[2] >> 16) & 0xff); ROUND ((w[2] >> 24) & 0xff); ROUND ((w[3] >> 0) & 0xff); CODE_POST_M; break; case 14: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); ROUND ((w[2] >> 0) & 0xff); ROUND ((w[2] >> 8) & 0xff); ROUND ((w[2] >> 16) & 0xff); ROUND ((w[2] >> 24) & 0xff); ROUND ((w[3] >> 0) & 0xff); ROUND ((w[3] >> 8) & 0xff); CODE_POST_M; break; case 15: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); ROUND ((w[2] >> 0) & 0xff); ROUND ((w[2] >> 8) & 0xff); ROUND ((w[2] >> 16) & 0xff); ROUND ((w[2] >> 24) & 0xff); ROUND ((w[3] >> 0) & 0xff); ROUND ((w[3] >> 8) & 0xff); ROUND ((w[3] >> 16) & 0xff); CODE_POST_M; break; case 16: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); ROUND ((w[2] >> 0) & 0xff); ROUND ((w[2] >> 8) & 0xff); ROUND ((w[2] >> 16) & 0xff); ROUND ((w[2] >> 24) & 0xff); ROUND ((w[3] >> 0) & 0xff); ROUND ((w[3] >> 8) & 0xff); ROUND ((w[3] >> 16) & 0xff); ROUND ((w[3] >> 24) & 0xff); CODE_POST_M; break; default: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); CODE_LOOP (pw_len - 4); CODE_POST_M; break; } } void m00200s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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], 0, 0 }; /** * loop */ u32 w0l = w[0]; switch (pw_len) { case 1: CODE_PRE; ROUND ((w0 >> 0) & 0xff); CODE_POST_S; break; case 2: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); CODE_POST_S; break; case 3: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); CODE_POST_S; break; case 4: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); CODE_POST_S; break; case 5: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); CODE_POST_S; break; case 6: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); CODE_POST_S; break; case 7: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); CODE_POST_S; break; case 8: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); CODE_POST_S; break; case 9: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); ROUND ((w[2] >> 0) & 0xff); CODE_POST_S; break; case 10: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); ROUND ((w[2] >> 0) & 0xff); ROUND ((w[2] >> 8) & 0xff); CODE_POST_S; break; case 11: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); ROUND ((w[2] >> 0) & 0xff); ROUND ((w[2] >> 8) & 0xff); ROUND ((w[2] >> 16) & 0xff); CODE_POST_S; break; case 12: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); ROUND ((w[2] >> 0) & 0xff); ROUND ((w[2] >> 8) & 0xff); ROUND ((w[2] >> 16) & 0xff); ROUND ((w[2] >> 24) & 0xff); CODE_POST_S; break; case 13: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); ROUND ((w[2] >> 0) & 0xff); ROUND ((w[2] >> 8) & 0xff); ROUND ((w[2] >> 16) & 0xff); ROUND ((w[2] >> 24) & 0xff); ROUND ((w[3] >> 0) & 0xff); CODE_POST_S; break; case 14: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); ROUND ((w[2] >> 0) & 0xff); ROUND ((w[2] >> 8) & 0xff); ROUND ((w[2] >> 16) & 0xff); ROUND ((w[2] >> 24) & 0xff); ROUND ((w[3] >> 0) & 0xff); ROUND ((w[3] >> 8) & 0xff); CODE_POST_S; break; case 15: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); ROUND ((w[2] >> 0) & 0xff); ROUND ((w[2] >> 8) & 0xff); ROUND ((w[2] >> 16) & 0xff); ROUND ((w[2] >> 24) & 0xff); ROUND ((w[3] >> 0) & 0xff); ROUND ((w[3] >> 8) & 0xff); ROUND ((w[3] >> 16) & 0xff); CODE_POST_S; break; case 16: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); ROUND ((w[1] >> 0) & 0xff); ROUND ((w[1] >> 8) & 0xff); ROUND ((w[1] >> 16) & 0xff); ROUND ((w[1] >> 24) & 0xff); ROUND ((w[2] >> 0) & 0xff); ROUND ((w[2] >> 8) & 0xff); ROUND ((w[2] >> 16) & 0xff); ROUND ((w[2] >> 24) & 0xff); ROUND ((w[3] >> 0) & 0xff); ROUND ((w[3] >> 8) & 0xff); ROUND ((w[3] >> 16) & 0xff); ROUND ((w[3] >> 24) & 0xff); CODE_POST_S; break; default: CODE_PRE; ROUND ((w0 >> 0) & 0xff); ROUND ((w0 >> 8) & 0xff); ROUND ((w0 >> 16) & 0xff); ROUND ((w0 >> 24) & 0xff); CODE_LOOP (pw_len - 4); CODE_POST_S; break; } } __kernel void m00200_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00200_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00200_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00200_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00200_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00200_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m00300_a0-optimized.cl000066400000000000000000001136551320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m00300_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m00300_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00300_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00300_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00300_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00300_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00300_a0.cl000066400000000000000000000115341320027462700157750ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m00300_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_swap (&ctx0, tmp.i, tmp.pw_len); sha1_final (&ctx0); sha1_ctx_t ctx; sha1_init (&ctx); ctx.w0[0] = ctx0.h[0]; ctx.w0[1] = ctx0.h[1]; ctx.w0[2] = ctx0.h[2]; ctx.w0[3] = ctx0.h[3]; ctx.w1[0] = ctx0.h[4]; ctx.w1[1] = 0x80000000; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 20 * 8; sha1_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00300_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_swap (&ctx0, tmp.i, tmp.pw_len); sha1_final (&ctx0); sha1_ctx_t ctx; sha1_init (&ctx); ctx.w0[0] = ctx0.h[0]; ctx.w0[1] = ctx0.h[1]; ctx.w0[2] = ctx0.h[2]; ctx.w0[3] = ctx0.h[3]; ctx.w1[0] = ctx0.h[4]; ctx.w1[1] = 0x80000000; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 20 * 8; sha1_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00300_a1-optimized.cl000066400000000000000000001222441320027462700200010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m00300_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m00300_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00300_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00300_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00300_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00300_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00300_a1.cl000066400000000000000000000114611320027462700157750ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m00300_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1 = ctx0; sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx1); sha1_ctx_t ctx; sha1_init (&ctx); ctx.w0[0] = ctx1.h[0]; ctx.w0[1] = ctx1.h[1]; ctx.w0[2] = ctx1.h[2]; ctx.w0[3] = ctx1.h[3]; ctx.w1[0] = ctx1.h[4]; ctx.w1[1] = 0x80000000; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 20 * 8; sha1_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00300_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1 = ctx0; sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx1); sha1_ctx_t ctx; sha1_init (&ctx); ctx.w0[0] = ctx1.h[0]; ctx.w0[1] = ctx1.h[1]; ctx.w0[2] = ctx1.h[2]; ctx.w0[3] = ctx1.h[3]; ctx.w1[0] = ctx1.h[4]; ctx.w1[1] = 0x80000000; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 20 * 8; sha1_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00300_a3-optimized.cl000066400000000000000000001472441320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m00300m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ const u32 c_16s = rotl32_S ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); const u32 c_17s = rotl32_S ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); const u32 c_18s = rotl32_S ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); const u32 c_19s = rotl32_S ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); const u32 c_20s = rotl32_S ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); const u32 c_21s = rotl32_S ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); const u32 c_22s = rotl32_S ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); const u32 c_23s = rotl32_S ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); const u32 c_24s = rotl32_S ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); const u32 c_25s = rotl32_S ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); const u32 c_26s = rotl32_S ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); const u32 c_27s = rotl32_S ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); const u32 c_28s = rotl32_S ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); const u32 c_29s = rotl32_S ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); const u32 c_30s = rotl32_S ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); const u32 c_31s = rotl32_S ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); const u32 c_32s = rotl32_S ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); const u32 c_33s = rotl32_S ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); const u32 c_34s = rotl32_S ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); const u32 c_35s = rotl32_S ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); const u32 c_36s = rotl32_S ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); const u32 c_37s = rotl32_S ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); const u32 c_38s = rotl32_S ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); const u32 c_39s = rotl32_S ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); const u32 c_40s = rotl32_S ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); const u32 c_41s = rotl32_S ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); const u32 c_42s = rotl32_S ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); const u32 c_43s = rotl32_S ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); const u32 c_44s = rotl32_S ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); const u32 c_45s = rotl32_S ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); const u32 c_46s = rotl32_S ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); const u32 c_47s = rotl32_S ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); const u32 c_48s = rotl32_S ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); const u32 c_49s = rotl32_S ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); const u32 c_50s = rotl32_S ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); const u32 c_51s = rotl32_S ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); const u32 c_52s = rotl32_S ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); const u32 c_53s = rotl32_S ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); const u32 c_54s = rotl32_S ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); const u32 c_55s = rotl32_S ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); const u32 c_56s = rotl32_S ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); const u32 c_57s = rotl32_S ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); const u32 c_58s = rotl32_S ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); const u32 c_59s = rotl32_S ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); const u32 c_60s = rotl32_S ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); const u32 c_61s = rotl32_S ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); const u32 c_62s = rotl32_S ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); const u32 c_63s = rotl32_S ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); const u32 c_64s = rotl32_S ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); const u32 c_65s = rotl32_S ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); const u32 c_66s = rotl32_S ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); const u32 c_67s = rotl32_S ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); const u32 c_68s = rotl32_S ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); const u32 c_69s = rotl32_S ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); const u32 c_70s = rotl32_S ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); const u32 c_71s = rotl32_S ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); const u32 c_72s = rotl32_S ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); const u32 c_73s = rotl32_S ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); const u32 c_74s = rotl32_S ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); const u32 c_75s = rotl32_S ((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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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 u32x c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); const u32x c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); const u32x c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); const u32x 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); wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); COMPARE_M_SIMD (d, e, c, b); } } void m00300s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ const u32 c_16s = rotl32_S ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); const u32 c_17s = rotl32_S ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); const u32 c_18s = rotl32_S ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); const u32 c_19s = rotl32_S ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); const u32 c_20s = rotl32_S ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); const u32 c_21s = rotl32_S ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); const u32 c_22s = rotl32_S ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); const u32 c_23s = rotl32_S ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); const u32 c_24s = rotl32_S ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); const u32 c_25s = rotl32_S ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); const u32 c_26s = rotl32_S ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); const u32 c_27s = rotl32_S ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); const u32 c_28s = rotl32_S ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); const u32 c_29s = rotl32_S ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); const u32 c_30s = rotl32_S ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); const u32 c_31s = rotl32_S ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); const u32 c_32s = rotl32_S ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); const u32 c_33s = rotl32_S ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); const u32 c_34s = rotl32_S ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); const u32 c_35s = rotl32_S ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); const u32 c_36s = rotl32_S ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); const u32 c_37s = rotl32_S ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); const u32 c_38s = rotl32_S ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); const u32 c_39s = rotl32_S ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); const u32 c_40s = rotl32_S ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); const u32 c_41s = rotl32_S ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); const u32 c_42s = rotl32_S ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); const u32 c_43s = rotl32_S ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); const u32 c_44s = rotl32_S ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); const u32 c_45s = rotl32_S ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); const u32 c_46s = rotl32_S ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); const u32 c_47s = rotl32_S ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); const u32 c_48s = rotl32_S ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); const u32 c_49s = rotl32_S ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); const u32 c_50s = rotl32_S ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); const u32 c_51s = rotl32_S ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); const u32 c_52s = rotl32_S ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); const u32 c_53s = rotl32_S ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); const u32 c_54s = rotl32_S ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); const u32 c_55s = rotl32_S ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); const u32 c_56s = rotl32_S ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); const u32 c_57s = rotl32_S ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); const u32 c_58s = rotl32_S ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); const u32 c_59s = rotl32_S ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); const u32 c_60s = rotl32_S ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); const u32 c_61s = rotl32_S ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); const u32 c_62s = rotl32_S ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); const u32 c_63s = rotl32_S ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); const u32 c_64s = rotl32_S ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); const u32 c_65s = rotl32_S ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); const u32 c_66s = rotl32_S ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); const u32 c_67s = rotl32_S ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); const u32 c_68s = rotl32_S ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); const u32 c_69s = rotl32_S ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); const u32 c_70s = rotl32_S ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); const u32 c_71s = rotl32_S ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); const u32 c_72s = rotl32_S ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); const u32 c_73s = rotl32_S ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); const u32 c_74s = rotl32_S ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); const u32 c_75s = rotl32_S ((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_S (search[1], 2u); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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 u32x c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); const u32x c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); const u32x c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); const u32x 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); if (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m00300_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00300_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00300_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00300_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00300_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00300_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m00300_a3.cl000066400000000000000000000123231320027462700157750ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m00300_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx0; sha1_init_vector (&ctx0); sha1_update_vector (&ctx0, w, pw_len); sha1_final_vector (&ctx0); sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); ctx.w0[0] = ctx0.h[0]; ctx.w0[1] = ctx0.h[1]; ctx.w0[2] = ctx0.h[2]; ctx.w0[3] = ctx0.h[3]; ctx.w1[0] = ctx0.h[4]; ctx.w1[1] = 0x80000000; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 20 * 8; sha1_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m00300_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx0; sha1_init_vector (&ctx0); sha1_update_vector (&ctx0, w, pw_len); sha1_final_vector (&ctx0); sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); ctx.w0[0] = ctx0.h[0]; ctx.w0[1] = ctx0.h[1]; ctx.w0[2] = ctx0.h[2]; ctx.w0[3] = ctx0.h[3]; ctx.w1[0] = ctx0.h[4]; ctx.w1[1] = 0x80000000; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 20 * 8; sha1_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00400-optimized.cl000066400000000000000000000161301320027462700174150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" __kernel void m00400_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global phpass_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 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; u32 block0[4]; block0[0] = salt_buf[0]; block0[1] = salt_buf[1]; block0[2] = w0[0]; block0[3] = w0[1]; u32 block1[4]; block1[0] = w0[2]; block1[1] = w0[3]; block1[2] = w1[0]; block1[3] = w1[1]; u32 block2[4]; block2[0] = w1[2]; block2[1] = w1[3]; block2[2] = w2[0]; block2[3] = w2[1]; u32 block3[4]; block3[0] = 0; block3[1] = 0; block3[2] = block_len * 8; block3[3] = 0; append_0x80_4x4_S (block0, block1, block2, block3, block_len); /** * init */ u32 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 m00400_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global phpass_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x w0[4]; u32x w1[4]; u32x w2[4]; w0[0] = packv (pws, i, gid, 0); w0[1] = packv (pws, i, gid, 1); w0[2] = packv (pws, i, gid, 2); w0[3] = packv (pws, i, gid, 3); w1[0] = packv (pws, i, gid, 4); w1[1] = packv (pws, i, gid, 5); w1[2] = packv (pws, i, gid, 6); w1[3] = packv (pws, i, gid, 7); w2[0] = packv (pws, i, gid, 8); w2[1] = packv (pws, i, gid, 9); w2[2] = 0; w2[3] = 0; u32x pw_len = packvf (pws, pw_len, gid); u32x digest[4]; digest[0] = packv (tmps, digest_buf, gid, 0); digest[1] = packv (tmps, digest_buf, gid, 1); digest[2] = packv (tmps, digest_buf, gid, 2); digest[3] = packv (tmps, digest_buf, gid, 3); /** * loop */ u32x block_len = (16 + pw_len); u32x block0[4]; u32x block1[4]; u32x block2[4]; u32x block3[4]; block0[0] = 0; block0[1] = 0; block0[2] = 0; block0[3] = 0; block1[0] = w0[0]; block1[1] = w0[1]; block1[2] = w0[2]; block1[3] = w0[3]; block2[0] = w1[0]; block2[1] = w1[1]; block2[2] = w1[2]; block2[3] = w1[3]; block3[0] = w2[0]; block3[1] = w2[1]; block3[2] = block_len * 8; block3[3] = 0; append_0x80_4x4_VV (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_vector (block0, block1, block2, block3, digest); } unpackv (tmps, digest_buf, gid, 0, digest[0]); unpackv (tmps, digest_buf, gid, 1, digest[1]); unpackv (tmps, digest_buf, gid, 2, digest[2]); unpackv (tmps, digest_buf, gid, 3, digest[3]); } __kernel void m00400_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global phpass_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; /** * digest */ const u32 r0 = tmps[gid].digest_buf[DGST_R0]; const u32 r1 = tmps[gid].digest_buf[DGST_R1]; const u32 r2 = tmps[gid].digest_buf[DGST_R2]; const u32 r3 = tmps[gid].digest_buf[DGST_R3]; #define il_pos 0 #include COMPARE_M }hashcat-4.0.1/OpenCL/m00400.cl000066400000000000000000000144071320027462700154200ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" __kernel void m00400_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global phpass_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * init */ md5_ctx_t md5_ctx; md5_init (&md5_ctx); md5_update_global (&md5_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); md5_update_global (&md5_ctx, pws[gid].i, pws[gid].pw_len); md5_final (&md5_ctx); u32 digest[4]; digest[0] = md5_ctx.h[0]; digest[1] = md5_ctx.h[1]; digest[2] = md5_ctx.h[2]; digest[3] = md5_ctx.h[3]; 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 m00400_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global phpass_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * init */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } u32 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 */ md5_ctx_t md5_ctx; md5_init (&md5_ctx); md5_ctx.w0[0] = digest[0]; md5_ctx.w0[1] = digest[1]; md5_ctx.w0[2] = digest[2]; md5_ctx.w0[3] = digest[3]; md5_ctx.len = 16; md5_update (&md5_ctx, w, pw_len); md5_final (&md5_ctx); digest[0] = md5_ctx.h[0]; digest[1] = md5_ctx.h[1]; digest[2] = md5_ctx.h[2]; digest[3] = md5_ctx.h[3]; if ((16 + pw_len + 1) >= 56) { for (u32 i = 1; i < loop_cnt; i++) { md5_init (&md5_ctx); md5_ctx.w0[0] = digest[0]; md5_ctx.w0[1] = digest[1]; md5_ctx.w0[2] = digest[2]; md5_ctx.w0[3] = digest[3]; md5_ctx.len = 16; md5_update (&md5_ctx, w, pw_len); md5_final (&md5_ctx); digest[0] = md5_ctx.h[0]; digest[1] = md5_ctx.h[1]; digest[2] = md5_ctx.h[2]; digest[3] = md5_ctx.h[3]; } } else { for (u32 i = 1; i < loop_cnt; i++) { md5_ctx.w0[0] = digest[0]; md5_ctx.w0[1] = digest[1]; md5_ctx.w0[2] = digest[2]; md5_ctx.w0[3] = digest[3]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (md5_ctx.w0, md5_ctx.w1, md5_ctx.w2, md5_ctx.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]; } __kernel void m00400_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global phpass_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; /** * digest */ const u32 r0 = tmps[gid].digest_buf[DGST_R0]; const u32 r1 = tmps[gid].digest_buf[DGST_R1]; const u32 r2 = tmps[gid].digest_buf[DGST_R2]; const u32 r3 = tmps[gid].digest_buf[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m00500-optimized.cl000066400000000000000000000577601320027462700174340ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_md5.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #define md5crypt_magic 0x00243124u void memcat16 (u32 block0[4], u32 block1[4], u32 block2[4], u32 block3[4], const u32 offset, const u32 append[4]) { u32 tmp0; u32 tmp1; u32 tmp2; u32 tmp3; u32 tmp4; const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #if defined IS_AMD || defined IS_GENERIC u32 in0 = swap32_S (append[0]); u32 in1 = swap32_S (append[1]); u32 in2 = swap32_S (append[2]); u32 in3 = swap32_S (append[3]); tmp0 = amd_bytealign ( 0, in0, offset); tmp1 = amd_bytealign (in0, in1, offset); tmp2 = amd_bytealign (in1, in2, offset); tmp3 = amd_bytealign (in2, in3, offset); tmp4 = amd_bytealign (in3, 0, offset); tmp0 = swap32_S (tmp0); tmp1 = swap32_S (tmp1); tmp2 = swap32_S (tmp2); tmp3 = swap32_S (tmp3); tmp4 = swap32_S (tmp4); #endif #ifdef IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; u32 in0 = append[0]; u32 in1 = append[1]; u32 in2 = append[2]; u32 in3 = append[3]; tmp0 = __byte_perm ( 0, in0, selector); tmp1 = __byte_perm (in0, in1, selector); tmp2 = __byte_perm (in1, in2, selector); tmp3 = __byte_perm (in2, in3, selector); tmp4 = __byte_perm (in3, 0, selector); #endif const u32 div = offset / 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; } } void memcat16_x80 (u32 block0[4], u32 block1[4], u32 block2[4], u32 block3[4], const u32 offset, const u32 append[4]) { u32 tmp0; u32 tmp1; u32 tmp2; u32 tmp3; u32 tmp4; const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #if defined IS_AMD || defined IS_GENERIC u32 in0 = swap32_S (append[0]); u32 in1 = swap32_S (append[1]); u32 in2 = swap32_S (append[2]); u32 in3 = swap32_S (append[3]); u32 in4 = 0x80000000; tmp0 = amd_bytealign ( 0, in0, offset); tmp1 = amd_bytealign (in0, in1, offset); tmp2 = amd_bytealign (in1, in2, offset); tmp3 = amd_bytealign (in2, in3, offset); tmp4 = amd_bytealign (in3, in4, offset); tmp0 = swap32_S (tmp0); tmp1 = swap32_S (tmp1); tmp2 = swap32_S (tmp2); tmp3 = swap32_S (tmp3); tmp4 = swap32_S (tmp4); #endif #ifdef IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; u32 in0 = append[0]; u32 in1 = append[1]; u32 in2 = append[2]; u32 in3 = append[3]; u32 in4 = 0x80; tmp0 = __byte_perm ( 0, in0, selector); tmp1 = __byte_perm (in0, in1, selector); tmp2 = __byte_perm (in1, in2, selector); tmp3 = __byte_perm (in2, in3, selector); tmp4 = __byte_perm (in3, in4, selector); #endif const u32 div = offset / 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; } } void memcat8 (u32 block0[4], u32 block1[4], u32 block2[4], u32 block3[4], const u32 offset, const u32 append[2]) { u32 tmp0; u32 tmp1; u32 tmp2; const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #if defined IS_AMD || defined IS_GENERIC u32 in0 = swap32_S (append[0]); u32 in1 = swap32_S (append[1]); tmp0 = amd_bytealign ( 0, in0, offset); tmp1 = amd_bytealign (in0, in1, offset); tmp2 = amd_bytealign (in1, 0, offset); tmp0 = swap32_S (tmp0); tmp1 = swap32_S (tmp1); tmp2 = swap32_S (tmp2); #endif #ifdef IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; u32 in0 = append[0]; u32 in1 = append[1]; tmp0 = __byte_perm ( 0, in0, selector); tmp1 = __byte_perm (in0, in1, selector); tmp2 = __byte_perm (in1, 0, selector); #endif const u32 div = offset / 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; } } void append_sign (u32 block0[4], u32 block1[4], const u32 block_len) { switch (block_len) { case 0: block0[0] = md5crypt_magic; break; case 1: block0[0] = block0[0] | md5crypt_magic << 8u; block0[1] = md5crypt_magic >> 24u; break; case 2: block0[0] = block0[0] | md5crypt_magic << 16u; block0[1] = md5crypt_magic >> 16u; break; case 3: block0[0] = block0[0] | md5crypt_magic << 24u; block0[1] = md5crypt_magic >> 8u; break; case 4: block0[1] = md5crypt_magic; break; case 5: block0[1] = block0[1] | md5crypt_magic << 8u; block0[2] = md5crypt_magic >> 24u; break; case 6: block0[1] = block0[1] | md5crypt_magic << 16u; block0[2] = md5crypt_magic >> 16u; break; case 7: block0[1] = block0[1] | md5crypt_magic << 24u; block0[2] = md5crypt_magic >> 8u; break; case 8: block0[2] = md5crypt_magic; break; case 9: block0[2] = block0[2] | md5crypt_magic << 8u; block0[3] = md5crypt_magic >> 24u; break; case 10: block0[2] = block0[2] | md5crypt_magic << 16u; block0[3] = md5crypt_magic >> 16u; break; case 11: block0[2] = block0[2] | md5crypt_magic << 24u; block0[3] = md5crypt_magic >> 8u; break; case 12: block0[3] = md5crypt_magic; break; case 13: block0[3] = block0[3] | md5crypt_magic << 8u; block1[0] = md5crypt_magic >> 24u; break; case 14: block0[3] = block0[3] | md5crypt_magic << 16u; block1[0] = md5crypt_magic >> 16u; break; case 15: block0[3] = block0[3] | md5crypt_magic << 24u; block1[0] = md5crypt_magic >> 8u; break; } } void append_1st (u32 block0[4], u32 block1[4], u32 block2[4], u32 block3[4], const u32 block_len, const u32 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 m00500_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; 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; u32 block0[4]; block0[0] = w0[0]; block0[1] = w0[1]; block0[2] = w0[2]; block0[3] = w0[3]; u32 block1[4]; block1[0] = 0; block1[1] = 0; block1[2] = 0; block1[3] = 0; u32 block2[4]; block2[0] = 0; block2[1] = 0; block2[2] = 0; block2[3] = 0; u32 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_4x4 (block0, block1, block2, block3, block_len); block3[2] = block_len * 8; u32 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_4x4_le_S (digest, pw_len); memcat16 (block0, block1, block2, block3, block_len, digest); block_len += pw_len; /* Then something really weird... */ u32 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_4x4 (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 m00500_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; 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; u32 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_1x4 (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 */ u32 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; u32 block0[4]; block0[0] = 0; block0[1] = 0; block0[2] = 0; block0[3] = 0; u32 block1[4]; block1[0] = 0; block1[1] = 0; block1[2] = 0; block1[3] = 0; u32 block2[4]; block2[0] = 0; block2[1] = 0; block2[2] = 0; block2[3] = 0; u32 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 m00500_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ const u32 r0 = tmps[gid].digest_buf[DGST_R0]; const u32 r1 = tmps[gid].digest_buf[DGST_R1]; const u32 r2 = tmps[gid].digest_buf[DGST_R2]; const u32 r3 = tmps[gid].digest_buf[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m00500.cl000066400000000000000000000156661320027462700154310ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_md5.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #define md5crypt_magic 0x00243124u __kernel void m00500_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * init */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * prepare */ md5_ctx_t md5_ctx1; md5_init (&md5_ctx1); md5_update (&md5_ctx1, w, pw_len); md5_update (&md5_ctx1, s, salt_len); md5_update (&md5_ctx1, w, pw_len); md5_final (&md5_ctx1); u32 final[16] = { 0 }; final[0] = md5_ctx1.h[0]; final[1] = md5_ctx1.h[1]; final[2] = md5_ctx1.h[2]; final[3] = md5_ctx1.h[3]; md5_ctx_t md5_ctx; md5_init (&md5_ctx); md5_update (&md5_ctx, w, pw_len); u32 m[16] = { 0 }; m[0] = md5crypt_magic; md5_update (&md5_ctx, m, 3); md5_update (&md5_ctx, s, salt_len); int pl; for (pl = pw_len; pl > 16; pl -= 16) { md5_update (&md5_ctx, final, 16); } truncate_block_4x4_le_S (final, pl); md5_update (&md5_ctx, final, pl); /* Then something really weird... */ for (int i = pw_len; i != 0; i >>= 1) { u32 t[16] = { 0 }; if (i & 1) { t[0] = 0; } else { t[0] = w[0] & 0xff; } md5_update (&md5_ctx, t, 1); } md5_final (&md5_ctx); tmps[gid].digest_buf[0] = md5_ctx.h[0]; tmps[gid].digest_buf[1] = md5_ctx.h[1]; tmps[gid].digest_buf[2] = md5_ctx.h[2]; tmps[gid].digest_buf[3] = md5_ctx.h[3]; } __kernel void m00500_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * init */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * digest */ u32 digest[16] = { 0 }; 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 */ for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) { md5_ctx_t md5_ctx; md5_init (&md5_ctx); if (j & 1) { md5_update (&md5_ctx, w, pw_len); } else { md5_update (&md5_ctx, digest, 16); } if (j % 3) { md5_update (&md5_ctx, s, salt_len); } if (j % 7) { md5_update (&md5_ctx, w, pw_len); } if (j & 1) { md5_update (&md5_ctx, digest, 16); } else { md5_update (&md5_ctx, w, pw_len); } md5_final (&md5_ctx); digest[0] = md5_ctx.h[0]; digest[1] = md5_ctx.h[1]; digest[2] = md5_ctx.h[2]; digest[3] = md5_ctx.h[3]; } 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 m00500_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ const u32 r0 = tmps[gid].digest_buf[DGST_R0]; const u32 r1 = tmps[gid].digest_buf[DGST_R1]; const u32 r2 = tmps[gid].digest_buf[DGST_R2]; const u32 r3 = tmps[gid].digest_buf[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m00600_a0-optimized.cl000066400000000000000000000345601320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #define BLAKE2B_FINAL 1 #define BLAKE2B_UPDATE 0 #define BLAKE2B_G(r,i,a,b,c,d) \ do { \ a = a + b + m[blake2b_sigma[r][2*i+0]]; \ d = rotr64 (d ^ a, 32); \ c = c + d; \ b = rotr64 (b ^ c, 24); \ a = a + b + m[blake2b_sigma[r][2*i+1]]; \ d = rotr64 (d ^ a, 16); \ c = c + d; \ b = rotr64 (b ^ c, 63); \ } while(0) #define BLAKE2B_ROUND(r) \ do { \ BLAKE2B_G (r,0,v[ 0],v[ 4],v[ 8],v[12]); \ BLAKE2B_G (r,1,v[ 1],v[ 5],v[ 9],v[13]); \ BLAKE2B_G (r,2,v[ 2],v[ 6],v[10],v[14]); \ BLAKE2B_G (r,3,v[ 3],v[ 7],v[11],v[15]); \ BLAKE2B_G (r,4,v[ 0],v[ 5],v[10],v[15]); \ BLAKE2B_G (r,5,v[ 1],v[ 6],v[11],v[12]); \ BLAKE2B_G (r,6,v[ 2],v[ 7],v[ 8],v[13]); \ BLAKE2B_G (r,7,v[ 3],v[ 4],v[ 9],v[14]); \ } while(0) void blake2b_transform (u64x h[8], u64x t[2], u64x f[2], u64x m[16], u64x v[16], const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], const u32x out_len, const u8 isFinal) { if (isFinal) f[0] = -1; t[0] += hl32_to_64 (0, out_len); m[ 0] = hl32_to_64 (w0[1], w0[0]); m[ 1] = hl32_to_64 (w0[3], w0[2]); m[ 2] = hl32_to_64 (w1[1], w1[0]); m[ 3] = hl32_to_64 (w1[3], w1[2]); m[ 4] = hl32_to_64 (w2[1], w2[0]); m[ 5] = hl32_to_64 (w2[3], w2[2]); m[ 6] = hl32_to_64 (w3[1], w3[0]); m[ 7] = hl32_to_64 (w3[3], w3[2]); m[ 8] = 0; m[ 9] = 0; m[10] = 0; m[11] = 0; m[12] = 0; m[13] = 0; m[14] = 0; m[15] = 0; v[ 0] = h[0]; v[ 1] = h[1]; v[ 2] = h[2]; v[ 3] = h[3]; v[ 4] = h[4]; v[ 5] = h[5]; v[ 6] = h[6]; v[ 7] = h[7]; v[ 8] = BLAKE2B_IV_00; v[ 9] = BLAKE2B_IV_01; v[10] = BLAKE2B_IV_02; v[11] = BLAKE2B_IV_03; v[12] = BLAKE2B_IV_04 ^ t[0]; v[13] = BLAKE2B_IV_05 ^ t[1]; v[14] = BLAKE2B_IV_06 ^ f[0]; v[15] = BLAKE2B_IV_07 ^ f[1]; const int blake2b_sigma[12][16] = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } , { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 } , { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 } , { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 } , { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 } , { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 } , { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 } , { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 } , { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0 } , { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } }; BLAKE2B_ROUND ( 0); BLAKE2B_ROUND ( 1); BLAKE2B_ROUND ( 2); BLAKE2B_ROUND ( 3); BLAKE2B_ROUND ( 4); BLAKE2B_ROUND ( 5); BLAKE2B_ROUND ( 6); BLAKE2B_ROUND ( 7); BLAKE2B_ROUND ( 8); BLAKE2B_ROUND ( 9); BLAKE2B_ROUND (10); BLAKE2B_ROUND (11); h[0] = h[0] ^ v[0] ^ v[ 8]; h[1] = h[1] ^ v[1] ^ v[ 9]; h[2] = h[2] ^ v[2] ^ v[10]; h[3] = h[3] ^ v[3] ^ v[11]; h[4] = h[4] ^ v[4] ^ v[12]; h[5] = h[5] ^ v[5] ^ v[13]; h[6] = h[6] ^ v[6] ^ v[14]; h[7] = h[7] ^ v[7] ^ v[15]; } __kernel void m00600_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_len = pws[gid].pw_len; u64 tmp_h[8]; u64 tmp_t[2]; u64 tmp_f[2]; tmp_h[0] = esalt_bufs[digests_offset].h[0]; tmp_h[1] = esalt_bufs[digests_offset].h[1]; tmp_h[2] = esalt_bufs[digests_offset].h[2]; tmp_h[3] = esalt_bufs[digests_offset].h[3]; tmp_h[4] = esalt_bufs[digests_offset].h[4]; tmp_h[5] = esalt_bufs[digests_offset].h[5]; tmp_h[6] = esalt_bufs[digests_offset].h[6]; tmp_h[7] = esalt_bufs[digests_offset].h[7]; tmp_t[0] = esalt_bufs[digests_offset].t[0]; tmp_t[1] = esalt_bufs[digests_offset].t[1]; tmp_f[0] = esalt_bufs[digests_offset].f[0]; tmp_f[1] = esalt_bufs[digests_offset].f[1]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect(pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); u64x digest[8]; u64x m[16]; u64x v[16]; u64x h[8]; u64x t[2]; u64x f[2]; h[0] = tmp_h[0]; h[1] = tmp_h[1]; h[2] = tmp_h[2]; h[3] = tmp_h[3]; h[4] = tmp_h[4]; h[5] = tmp_h[5]; h[6] = tmp_h[6]; h[7] = tmp_h[7]; t[0] = tmp_t[0]; t[1] = tmp_t[1]; f[0] = tmp_f[0]; f[1] = tmp_f[1]; blake2b_transform(h, t, f, m, v, w0, w1, w2, w3, out_len, BLAKE2B_FINAL); digest[0] = h[0]; digest[1] = h[1]; digest[2] = h[2]; digest[3] = h[3]; digest[4] = h[4]; digest[5] = h[5]; digest[6] = h[6]; digest[7] = h[7]; const u32x r0 = h32_from_64(digest[0]); const u32x r1 = l32_from_64(digest[0]); const u32x r2 = h32_from_64(digest[1]); const u32x r3 = l32_from_64(digest[1]); COMPARE_M_SIMD(r0, r1, r2, r3); } } __kernel void m00600_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00600_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00600_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_len = pws[gid].pw_len; u64 tmp_h[8]; u64 tmp_t[2]; u64 tmp_f[2]; tmp_h[0] = esalt_bufs[digests_offset].h[0]; tmp_h[1] = esalt_bufs[digests_offset].h[1]; tmp_h[2] = esalt_bufs[digests_offset].h[2]; tmp_h[3] = esalt_bufs[digests_offset].h[3]; tmp_h[4] = esalt_bufs[digests_offset].h[4]; tmp_h[5] = esalt_bufs[digests_offset].h[5]; tmp_h[6] = esalt_bufs[digests_offset].h[6]; tmp_h[7] = esalt_bufs[digests_offset].h[7]; tmp_t[0] = esalt_bufs[digests_offset].t[0]; tmp_t[1] = esalt_bufs[digests_offset].t[1]; tmp_f[0] = esalt_bufs[digests_offset].f[0]; tmp_f[1] = esalt_bufs[digests_offset].f[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect(pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); u64x digest[8]; u64x m[16]; u64x v[16]; u64x h[8]; u64x t[2]; u64x f[2]; h[0] = tmp_h[0]; h[1] = tmp_h[1]; h[2] = tmp_h[2]; h[3] = tmp_h[3]; h[4] = tmp_h[4]; h[5] = tmp_h[5]; h[6] = tmp_h[6]; h[7] = tmp_h[7]; t[0] = tmp_t[0]; t[1] = tmp_t[1]; f[0] = tmp_f[0]; f[1] = tmp_f[1]; blake2b_transform(h, t, f, m, v, w0, w1, w2, w3, out_len, BLAKE2B_FINAL); digest[0] = h[0]; digest[1] = h[1]; digest[2] = h[2]; digest[3] = h[3]; digest[4] = h[4]; digest[5] = h[5]; digest[6] = h[6]; digest[7] = h[7]; const u32x r0 = h32_from_64(digest[0]); const u32x r1 = l32_from_64(digest[0]); const u32x r2 = h32_from_64(digest[1]); const u32x r3 = l32_from_64(digest[1]); COMPARE_S_SIMD(r0, r1, r2, r3); } } __kernel void m00600_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00600_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00600_a1-optimized.cl000066400000000000000000000433771320027462700200150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #define BLAKE2B_FINAL 1 #define BLAKE2B_UPDATE 0 #define BLAKE2B_G(r,i,a,b,c,d) \ do { \ a = a + b + m[blake2b_sigma[r][2*i+0]]; \ d = rotr64 (d ^ a, 32); \ c = c + d; \ b = rotr64 (b ^ c, 24); \ a = a + b + m[blake2b_sigma[r][2*i+1]]; \ d = rotr64 (d ^ a, 16); \ c = c + d; \ b = rotr64 (b ^ c, 63); \ } while(0) #define BLAKE2B_ROUND(r) \ do { \ BLAKE2B_G (r,0,v[ 0],v[ 4],v[ 8],v[12]); \ BLAKE2B_G (r,1,v[ 1],v[ 5],v[ 9],v[13]); \ BLAKE2B_G (r,2,v[ 2],v[ 6],v[10],v[14]); \ BLAKE2B_G (r,3,v[ 3],v[ 7],v[11],v[15]); \ BLAKE2B_G (r,4,v[ 0],v[ 5],v[10],v[15]); \ BLAKE2B_G (r,5,v[ 1],v[ 6],v[11],v[12]); \ BLAKE2B_G (r,6,v[ 2],v[ 7],v[ 8],v[13]); \ BLAKE2B_G (r,7,v[ 3],v[ 4],v[ 9],v[14]); \ } while(0) void blake2b_transform (u64x h[8], u64x t[2], u64x f[2], u64x m[16], u64x v[16], const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], const u32x out_len, const u8 isFinal) { if (isFinal) f[0] = -1; t[0] += hl32_to_64 (0, out_len); m[ 0] = hl32_to_64 (w0[1], w0[0]); m[ 1] = hl32_to_64 (w0[3], w0[2]); m[ 2] = hl32_to_64 (w1[1], w1[0]); m[ 3] = hl32_to_64 (w1[3], w1[2]); m[ 4] = hl32_to_64 (w2[1], w2[0]); m[ 5] = hl32_to_64 (w2[3], w2[2]); m[ 6] = hl32_to_64 (w3[1], w3[0]); m[ 7] = hl32_to_64 (w3[3], w3[2]); m[ 8] = 0; m[ 9] = 0; m[10] = 0; m[11] = 0; m[12] = 0; m[13] = 0; m[14] = 0; m[15] = 0; v[ 0] = h[0]; v[ 1] = h[1]; v[ 2] = h[2]; v[ 3] = h[3]; v[ 4] = h[4]; v[ 5] = h[5]; v[ 6] = h[6]; v[ 7] = h[7]; v[ 8] = BLAKE2B_IV_00; v[ 9] = BLAKE2B_IV_01; v[10] = BLAKE2B_IV_02; v[11] = BLAKE2B_IV_03; v[12] = BLAKE2B_IV_04 ^ t[0]; v[13] = BLAKE2B_IV_05 ^ t[1]; v[14] = BLAKE2B_IV_06 ^ f[0]; v[15] = BLAKE2B_IV_07 ^ f[1]; const int blake2b_sigma[12][16] = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } , { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 } , { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 } , { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 } , { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 } , { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 } , { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 } , { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 } , { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0 } , { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } }; BLAKE2B_ROUND ( 0); BLAKE2B_ROUND ( 1); BLAKE2B_ROUND ( 2); BLAKE2B_ROUND ( 3); BLAKE2B_ROUND ( 4); BLAKE2B_ROUND ( 5); BLAKE2B_ROUND ( 6); BLAKE2B_ROUND ( 7); BLAKE2B_ROUND ( 8); BLAKE2B_ROUND ( 9); BLAKE2B_ROUND (10); BLAKE2B_ROUND (11); h[0] = h[0] ^ v[0] ^ v[ 8]; h[1] = h[1] ^ v[1] ^ v[ 9]; h[2] = h[2] ^ v[2] ^ v[10]; h[3] = h[3] ^ v[3] ^ v[11]; h[4] = h[4] ^ v[4] ^ v[12]; h[5] = h[5] ^ v[5] ^ v[13]; h[6] = h[6] ^ v[6] ^ v[14]; h[7] = h[7] ^ v[7] ^ v[15]; } __kernel void m00600_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; u64 tmp_h[8]; u64 tmp_t[2]; u64 tmp_f[2]; tmp_h[0] = esalt_bufs[digests_offset].h[0]; tmp_h[1] = esalt_bufs[digests_offset].h[1]; tmp_h[2] = esalt_bufs[digests_offset].h[2]; tmp_h[3] = esalt_bufs[digests_offset].h[3]; tmp_h[4] = esalt_bufs[digests_offset].h[4]; tmp_h[5] = esalt_bufs[digests_offset].h[5]; tmp_h[6] = esalt_bufs[digests_offset].h[6]; tmp_h[7] = esalt_bufs[digests_offset].h[7]; tmp_t[0] = esalt_bufs[digests_offset].t[0]; tmp_t[1] = esalt_bufs[digests_offset].t[1]; tmp_f[0] = esalt_bufs[digests_offset].f[0]; tmp_f[1] = esalt_bufs[digests_offset].f[1]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x out_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; u64x digest[8]; u64x m[16]; u64x v[16]; u64x h[8]; u64x t[2]; u64x f[2]; h[0] = tmp_h[0]; h[1] = tmp_h[1]; h[2] = tmp_h[2]; h[3] = tmp_h[3]; h[4] = tmp_h[4]; h[5] = tmp_h[5]; h[6] = tmp_h[6]; h[7] = tmp_h[7]; t[0] = tmp_t[0]; t[1] = tmp_t[1]; f[0] = tmp_f[0]; f[1] = tmp_f[1]; blake2b_transform(h, t, f, m, v, w0, w1, w2, w3, out_len, BLAKE2B_FINAL); digest[0] = h[0]; digest[1] = h[1]; digest[2] = h[2]; digest[3] = h[3]; digest[4] = h[4]; digest[5] = h[5]; digest[6] = h[6]; digest[7] = h[7]; const u32x r0 = h32_from_64(digest[0]); const u32x r1 = l32_from_64(digest[0]); const u32x r2 = h32_from_64(digest[1]); const u32x r3 = l32_from_64(digest[1]); COMPARE_M_SIMD(r0, r1, r2, r3); } } __kernel void m00600_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00600_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00600_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; u64 tmp_h[8]; u64 tmp_t[2]; u64 tmp_f[2]; tmp_h[0] = esalt_bufs[digests_offset].h[0]; tmp_h[1] = esalt_bufs[digests_offset].h[1]; tmp_h[2] = esalt_bufs[digests_offset].h[2]; tmp_h[3] = esalt_bufs[digests_offset].h[3]; tmp_h[4] = esalt_bufs[digests_offset].h[4]; tmp_h[5] = esalt_bufs[digests_offset].h[5]; tmp_h[6] = esalt_bufs[digests_offset].h[6]; tmp_h[7] = esalt_bufs[digests_offset].h[7]; tmp_t[0] = esalt_bufs[digests_offset].t[0]; tmp_t[1] = esalt_bufs[digests_offset].t[1]; tmp_f[0] = esalt_bufs[digests_offset].f[0]; tmp_f[1] = esalt_bufs[digests_offset].f[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x out_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; u64x digest[8]; u64x m[16]; u64x v[16]; u64x h[8]; u64x t[2]; u64x f[2]; h[0] = tmp_h[0]; h[1] = tmp_h[1]; h[2] = tmp_h[2]; h[3] = tmp_h[3]; h[4] = tmp_h[4]; h[5] = tmp_h[5]; h[6] = tmp_h[6]; h[7] = tmp_h[7]; t[0] = tmp_t[0]; t[1] = tmp_t[1]; f[0] = tmp_f[0]; f[1] = tmp_f[1]; blake2b_transform(h, t, f, m, v, w0, w1, w2, w3, out_len, BLAKE2B_FINAL); digest[0] = h[0]; digest[1] = h[1]; digest[2] = h[2]; digest[3] = h[3]; digest[4] = h[4]; digest[5] = h[5]; digest[6] = h[6]; digest[7] = h[7]; const u32x r0 = h32_from_64(digest[0]); const u32x r1 = l32_from_64(digest[0]); const u32x r2 = h32_from_64(digest[1]); const u32x r3 = l32_from_64(digest[1]); COMPARE_S_SIMD(r0, r1, r2, r3); } } __kernel void m00600_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00600_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00600_a3-optimized.cl000066400000000000000000000350631320027462700200100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl", #define BLAKE2B_FINAL 1 #define BLAKE2B_UPDATE 0 #define BLAKE2B_G(r,i,a,b,c,d) \ do { \ a = a + b + m[blake2b_sigma[r][2*i+0]]; \ d = rotr64 (d ^ a, 32); \ c = c + d; \ b = rotr64 (b ^ c, 24); \ a = a + b + m[blake2b_sigma[r][2*i+1]]; \ d = rotr64 (d ^ a, 16); \ c = c + d; \ b = rotr64 (b ^ c, 63); \ } while(0) #define BLAKE2B_ROUND(r) \ do { \ BLAKE2B_G (r,0,v[ 0],v[ 4],v[ 8],v[12]); \ BLAKE2B_G (r,1,v[ 1],v[ 5],v[ 9],v[13]); \ BLAKE2B_G (r,2,v[ 2],v[ 6],v[10],v[14]); \ BLAKE2B_G (r,3,v[ 3],v[ 7],v[11],v[15]); \ BLAKE2B_G (r,4,v[ 0],v[ 5],v[10],v[15]); \ BLAKE2B_G (r,5,v[ 1],v[ 6],v[11],v[12]); \ BLAKE2B_G (r,6,v[ 2],v[ 7],v[ 8],v[13]); \ BLAKE2B_G (r,7,v[ 3],v[ 4],v[ 9],v[14]); \ } while(0) void blake2b_transform (u64x h[8], u64x t[2], u64x f[2], u64x m[16], u64x v[16], const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], const u32x out_len, const u8 isFinal) { if (isFinal) f[0] = -1; t[0] += hl32_to_64 (0, out_len); m[ 0] = hl32_to_64 (w0[1], w0[0]); m[ 1] = hl32_to_64 (w0[3], w0[2]); m[ 2] = hl32_to_64 (w1[1], w1[0]); m[ 3] = hl32_to_64 (w1[3], w1[2]); m[ 4] = hl32_to_64 (w2[1], w2[0]); m[ 5] = hl32_to_64 (w2[3], w2[2]); m[ 6] = hl32_to_64 (w3[1], w3[0]); m[ 7] = hl32_to_64 (w3[3], w3[2]); m[ 8] = 0; m[ 9] = 0; m[10] = 0; m[11] = 0; m[12] = 0; m[13] = 0; m[14] = 0; m[15] = 0; v[ 0] = h[0]; v[ 1] = h[1]; v[ 2] = h[2]; v[ 3] = h[3]; v[ 4] = h[4]; v[ 5] = h[5]; v[ 6] = h[6]; v[ 7] = h[7]; v[ 8] = BLAKE2B_IV_00; v[ 9] = BLAKE2B_IV_01; v[10] = BLAKE2B_IV_02; v[11] = BLAKE2B_IV_03; v[12] = BLAKE2B_IV_04 ^ t[0]; v[13] = BLAKE2B_IV_05 ^ t[1]; v[14] = BLAKE2B_IV_06 ^ f[0]; v[15] = BLAKE2B_IV_07 ^ f[1]; const int blake2b_sigma[12][16] = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } , { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 } , { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 } , { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 } , { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 } , { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 } , { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 } , { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 } , { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0 } , { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } }; BLAKE2B_ROUND ( 0); BLAKE2B_ROUND ( 1); BLAKE2B_ROUND ( 2); BLAKE2B_ROUND ( 3); BLAKE2B_ROUND ( 4); BLAKE2B_ROUND ( 5); BLAKE2B_ROUND ( 6); BLAKE2B_ROUND ( 7); BLAKE2B_ROUND ( 8); BLAKE2B_ROUND ( 9); BLAKE2B_ROUND (10); BLAKE2B_ROUND (11); h[0] = h[0] ^ v[0] ^ v[ 8]; h[1] = h[1] ^ v[1] ^ v[ 9]; h[2] = h[2] ^ v[2] ^ v[10]; h[3] = h[3] ^ v[3] ^ v[11]; h[4] = h[4] ^ v[4] ^ v[12]; h[5] = h[5] ^ v[5] ^ v[13]; h[6] = h[6] ^ v[6] ^ v[14]; h[7] = h[7] ^ v[7] ^ v[15]; } __kernel void m00600_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); u64 tmp_h[8]; u64 tmp_t[2]; u64 tmp_f[2]; tmp_h[0] = esalt_bufs[digests_offset].h[0]; tmp_h[1] = esalt_bufs[digests_offset].h[1]; tmp_h[2] = esalt_bufs[digests_offset].h[2]; tmp_h[3] = esalt_bufs[digests_offset].h[3]; tmp_h[4] = esalt_bufs[digests_offset].h[4]; tmp_h[5] = esalt_bufs[digests_offset].h[5]; tmp_h[6] = esalt_bufs[digests_offset].h[6]; tmp_h[7] = esalt_bufs[digests_offset].h[7]; tmp_t[0] = esalt_bufs[digests_offset].t[0]; tmp_t[1] = esalt_bufs[digests_offset].t[1]; tmp_f[0] = esalt_bufs[digests_offset].f[0]; tmp_f[1] = esalt_bufs[digests_offset].f[1]; /** * loop */ u32 w0l = pws[gid].i[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0x = w0l | w0r; u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = w0x; 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]; u32x out_len = pws[gid].pw_len; u64x digest[8]; u64x m[16]; u64x v[16]; u64x h[8]; u64x t[2]; u64x f[2]; h[0] = tmp_h[0]; h[1] = tmp_h[1]; h[2] = tmp_h[2]; h[3] = tmp_h[3]; h[4] = tmp_h[4]; h[5] = tmp_h[5]; h[6] = tmp_h[6]; h[7] = tmp_h[7]; t[0] = tmp_t[0]; t[1] = tmp_t[1]; f[0] = tmp_f[0]; f[1] = tmp_f[1]; blake2b_transform(h, t, f, m, v, w0, w1, w2, w3, out_len, BLAKE2B_FINAL); digest[0] = h[0]; digest[1] = h[1]; digest[2] = h[2]; digest[3] = h[3]; digest[4] = h[4]; digest[5] = h[5]; digest[6] = h[6]; digest[7] = h[7]; const u32x r0 = h32_from_64(digest[0]); const u32x r1 = l32_from_64(digest[0]); const u32x r2 = h32_from_64(digest[1]); const u32x r3 = l32_from_64(digest[1]); COMPARE_M_SIMD(r0, r1, r2, r3); } } __kernel void m00600_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00600_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00600_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); u64 tmp_h[8]; u64 tmp_t[2]; u64 tmp_f[2]; tmp_h[0] = esalt_bufs[digests_offset].h[0]; tmp_h[1] = esalt_bufs[digests_offset].h[1]; tmp_h[2] = esalt_bufs[digests_offset].h[2]; tmp_h[3] = esalt_bufs[digests_offset].h[3]; tmp_h[4] = esalt_bufs[digests_offset].h[4]; tmp_h[5] = esalt_bufs[digests_offset].h[5]; tmp_h[6] = esalt_bufs[digests_offset].h[6]; tmp_h[7] = esalt_bufs[digests_offset].h[7]; tmp_t[0] = esalt_bufs[digests_offset].t[0]; tmp_t[1] = esalt_bufs[digests_offset].t[1]; tmp_f[0] = esalt_bufs[digests_offset].f[0]; tmp_f[1] = esalt_bufs[digests_offset].f[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 */ u32 w0l = pws[gid].i[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0x = w0l | w0r; u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = w0x; 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]; u32x out_len = pws[gid].pw_len; u64x digest[8]; u64x m[16]; u64x v[16]; u64x h[8]; u64x t[2]; u64x f[2]; h[0] = tmp_h[0]; h[1] = tmp_h[1]; h[2] = tmp_h[2]; h[3] = tmp_h[3]; h[4] = tmp_h[4]; h[5] = tmp_h[5]; h[6] = tmp_h[6]; h[7] = tmp_h[7]; t[0] = tmp_t[0]; t[1] = tmp_t[1]; f[0] = tmp_f[0]; f[1] = tmp_f[1]; blake2b_transform(h, t, f, m, v, w0, w1, w2, w3, out_len, BLAKE2B_FINAL); digest[0] = h[0]; digest[1] = h[1]; digest[2] = h[2]; digest[3] = h[3]; digest[4] = h[4]; digest[5] = h[5]; digest[6] = h[6]; digest[7] = h[7]; const u32x r0 = h32_from_64(digest[0]); const u32x r1 = l32_from_64(digest[0]); const u32x r2 = h32_from_64(digest[1]); const u32x r3 = l32_from_64(digest[1]); COMPARE_S_SIMD(r0, r1, r2, r3); } } __kernel void m00600_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00600_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const blake2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00900_a0-optimized.cl000066400000000000000000000342001320027462700200000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m00900_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m00900_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00900_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00900_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); if (MATCHES_NONE_VS (a, search[0])) continue; 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00900_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00900_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00900_a0.cl000066400000000000000000000076411320027462700160070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md4.cl" __kernel void m00900_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md4_ctx_t ctx; md4_init (&ctx); md4_update (&ctx, tmp.i, tmp.pw_len); md4_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00900_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md4_ctx_t ctx; md4_init (&ctx); md4_update (&ctx, tmp.i, tmp.pw_len); md4_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00900_a1-optimized.cl000066400000000000000000000424411320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m00900_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = pw_len * 8; w3[3] = 0; /** * md4 */ 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m00900_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00900_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00900_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = pw_len * 8; w3[3] = 0; /** * md4 */ 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); if (MATCHES_NONE_VS (a, search[0])) continue; 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00900_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m00900_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m00900_a1.cl000066400000000000000000000075521320027462700160110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md4.cl" __kernel void m00900_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ md4_ctx_t ctx0; md4_init (&ctx0); md4_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md4_ctx_t ctx = ctx0; md4_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md4_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m00900_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ md4_ctx_t ctx0; md4_init (&ctx0); md4_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md4_ctx_t ctx = ctx0; md4_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md4_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m00900_a3-optimized.cl000066400000000000000000000651151320027462700200140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define MD4_STEP_REV(f,a,b,c,d,x,t,s) \ { \ a = rotr32_S (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_S (a, s); \ a -= x; \ a -= t; \ } void m00900m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); COMPARE_M_SIMD (a, d, c, b); } } void m00900s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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_S, b_rev, c_rev, d_rev, a_rev, w[15], MD4C02, MD4S23); MD4_STEP_REV (MD4_H_S, c_rev, d_rev, a_rev, b_rev, w[ 7], MD4C02, MD4S22); MD4_STEP_REV (MD4_H_S, d_rev, a_rev, b_rev, c_rev, w[11], MD4C02, MD4S21); MD4_STEP_REV (MD4_H_S, a_rev, b_rev, c_rev, d_rev, w[ 3], MD4C02, MD4S20); MD4_STEP_REV (MD4_H_S, b_rev, c_rev, d_rev, a_rev, w[13], MD4C02, MD4S23); MD4_STEP_REV (MD4_H_S, c_rev, d_rev, a_rev, b_rev, w[ 5], MD4C02, MD4S22); MD4_STEP_REV (MD4_H_S, d_rev, a_rev, b_rev, c_rev, w[ 9], MD4C02, MD4S21); MD4_STEP_REV (MD4_H_S, a_rev, b_rev, c_rev, d_rev, w[ 1], MD4C02, MD4S20); MD4_STEP_REV (MD4_H_S, b_rev, c_rev, d_rev, a_rev, w[14], MD4C02, MD4S23); MD4_STEP_REV (MD4_H_S, c_rev, d_rev, a_rev, b_rev, w[ 6], MD4C02, MD4S22); MD4_STEP_REV (MD4_H_S, d_rev, a_rev, b_rev, c_rev, w[10], MD4C02, MD4S21); MD4_STEP_REV (MD4_H_S, a_rev, b_rev, c_rev, d_rev, w[ 2], MD4C02, MD4S20); MD4_STEP_REV (MD4_H_S, b_rev, c_rev, d_rev, a_rev, w[12], MD4C02, MD4S23); MD4_STEP_REV (MD4_H_S, c_rev, d_rev, a_rev, b_rev, w[ 4], MD4C02, MD4S22); MD4_STEP_REV (MD4_H_S, d_rev, a_rev, b_rev, c_rev, w[ 8], MD4C02, MD4S21); MD4_STEP_REV (MD4_H_S, a_rev, b_rev, c_rev, d_rev, 0, MD4C02, MD4S20); const u32 sav_c = c_rev; const u32 sav_d = d_rev; MD4_STEP_REV1(MD4_G_S, b_rev, c_rev, d_rev, a_rev, w[15], MD4C01, MD4S13); MD4_STEP_REV1(MD4_G_S, c_rev, d_rev, a_rev, b_rev, w[11], MD4C01, MD4S12); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); if (MATCHES_NONE_VV (c, pre_c)) continue; MD4_STEP0(MD4_Go, b, c, d, a, G_wec01, MD4S13); if (MATCHES_NONE_VV (b, pre_b)) continue; MD4_STEP0(MD4_Go, a, b, c, d, G_w3c01, MD4S10); if (MATCHES_NONE_VV (a, pre_a)) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m00900_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00900_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00900_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00900_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00900_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m00900_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m00900_a3.cl000066400000000000000000000103701320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md4.cl" __kernel void m00900_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md4_ctx_vector_t ctx; md4_init_vector (&ctx); md4_update_vector (&ctx, w, pw_len); md4_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m00900_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md4_ctx_vector_t ctx; md4_init_vector (&ctx); md4_update_vector (&ctx, w, pw_len); md4_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01000_a0-optimized.cl000066400000000000000000000344061320027462700200000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m01000_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w3[2] = out_len * 8 * 2; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m01000_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01000_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01000_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w3[2] = out_len * 8 * 2; 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); if (MATCHES_NONE_VS (a, search[0])) continue; 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m01000_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01000_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01000_a0.cl000066400000000000000000000076611320027462700160010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md4.cl" __kernel void m01000_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md4_ctx_t ctx; md4_init (&ctx); md4_update_utf16le (&ctx, tmp.i, tmp.pw_len); md4_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01000_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md4_ctx_t ctx; md4_init (&ctx); md4_update_utf16le (&ctx, tmp.i, tmp.pw_len); md4_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01000_a1-optimized.cl000066400000000000000000000430651320027462700200020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m01000_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w3[2] = pw_len * 8 * 2; w3[3] = 0; /** * md4 */ 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m01000_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01000_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01000_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w3[2] = pw_len * 8 * 2; w3[3] = 0; /** * md4 */ 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); if (MATCHES_NONE_VS (a, search[0])) continue; 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m01000_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01000_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01000_a1.cl000066400000000000000000000076121320027462700157760ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md4.cl" __kernel void m01000_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ md4_ctx_t ctx0; md4_init (&ctx0); md4_update_global_utf16le (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md4_ctx_t ctx = ctx0; md4_update_global_utf16le (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md4_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01000_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ md4_ctx_t ctx0; md4_init (&ctx0); md4_update_global_utf16le (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md4_ctx_t ctx = ctx0; md4_update_global_utf16le (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md4_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01000_a3-optimized.cl000066400000000000000000000650571320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define MD4_STEP_REV(f,a,b,c,d,x,t,s) \ { \ a = rotr32_S (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_S (a, s); \ a -= x; \ a -= t; \ } void m01000m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); COMPARE_M_SIMD (a, d, c, b); } } void m01000s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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_S, b_rev, c_rev, d_rev, a_rev, w[15], MD4C02, MD4S23); MD4_STEP_REV (MD4_H_S, c_rev, d_rev, a_rev, b_rev, w[ 7], MD4C02, MD4S22); MD4_STEP_REV (MD4_H_S, d_rev, a_rev, b_rev, c_rev, w[11], MD4C02, MD4S21); MD4_STEP_REV (MD4_H_S, a_rev, b_rev, c_rev, d_rev, w[ 3], MD4C02, MD4S20); MD4_STEP_REV (MD4_H_S, b_rev, c_rev, d_rev, a_rev, w[13], MD4C02, MD4S23); MD4_STEP_REV (MD4_H_S, c_rev, d_rev, a_rev, b_rev, w[ 5], MD4C02, MD4S22); MD4_STEP_REV (MD4_H_S, d_rev, a_rev, b_rev, c_rev, w[ 9], MD4C02, MD4S21); MD4_STEP_REV (MD4_H_S, a_rev, b_rev, c_rev, d_rev, w[ 1], MD4C02, MD4S20); MD4_STEP_REV (MD4_H_S, b_rev, c_rev, d_rev, a_rev, w[14], MD4C02, MD4S23); MD4_STEP_REV (MD4_H_S, c_rev, d_rev, a_rev, b_rev, w[ 6], MD4C02, MD4S22); MD4_STEP_REV (MD4_H_S, d_rev, a_rev, b_rev, c_rev, w[10], MD4C02, MD4S21); MD4_STEP_REV (MD4_H_S, a_rev, b_rev, c_rev, d_rev, w[ 2], MD4C02, MD4S20); MD4_STEP_REV (MD4_H_S, b_rev, c_rev, d_rev, a_rev, w[12], MD4C02, MD4S23); MD4_STEP_REV (MD4_H_S, c_rev, d_rev, a_rev, b_rev, w[ 4], MD4C02, MD4S22); MD4_STEP_REV (MD4_H_S, d_rev, a_rev, b_rev, c_rev, w[ 8], MD4C02, MD4S21); MD4_STEP_REV (MD4_H_S, a_rev, b_rev, c_rev, d_rev, 0, MD4C02, MD4S20); const u32 sav_c = c_rev; const u32 sav_d = d_rev; MD4_STEP_REV1(MD4_G_S, b_rev, c_rev, d_rev, a_rev, w[15], MD4C01, MD4S13); MD4_STEP_REV1(MD4_G_S, c_rev, d_rev, a_rev, b_rev, w[11], MD4C01, MD4S12); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); if (MATCHES_NONE_VV (c, pre_c)) continue; MD4_STEP0(MD4_Go, b, c, d, a, G_wec01, MD4S13); MD4_STEP0(MD4_Go, a, b, c, d, G_w3c01, MD4S10); if (MATCHES_NONE_VV (a, pre_a)) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m01000_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01000_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01000_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01000_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01000_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01000_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m01000_a3.cl000066400000000000000000000104101320027462700157660ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md4.cl" __kernel void m01000_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md4_ctx_vector_t ctx; md4_init_vector (&ctx); md4_update_vector_utf16le (&ctx, w, pw_len); md4_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01000_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md4_ctx_vector_t ctx; md4_init_vector (&ctx); md4_update_vector_utf16le (&ctx, w, pw_len); md4_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01100_a0-optimized.cl000066400000000000000000000540541320027462700200020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m01100_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 salt_t s_salt_buf[1]; if (lid == 0) { s_salt_buf[0] = salt_bufs[salt_pos]; s_salt_buf[0].salt_buf[10] = (16 + s_salt_buf[0].salt_len) * 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; #define salt_buf00 s_salt_buf[0].salt_buf[ 0] #define salt_buf01 s_salt_buf[0].salt_buf[ 1] #define salt_buf02 s_salt_buf[0].salt_buf[ 2] #define salt_buf03 s_salt_buf[0].salt_buf[ 3] #define salt_buf04 s_salt_buf[0].salt_buf[ 4] #define salt_buf05 s_salt_buf[0].salt_buf[ 5] #define salt_buf06 s_salt_buf[0].salt_buf[ 6] #define salt_buf07 s_salt_buf[0].salt_buf[ 7] #define salt_buf08 s_salt_buf[0].salt_buf[ 8] #define salt_buf09 s_salt_buf[0].salt_buf[ 9] #define salt_buf10 s_salt_buf[0].salt_buf[10] /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w3[2] = out_len * 2 * 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); a += MD4M_A; b += MD4M_B; c += MD4M_C; d += MD4M_D; w0[0] = a; w0[1] = b; w0[2] = c; w0[3] = d; w1[0] = salt_buf00; w1[1] = salt_buf01; w1[2] = salt_buf02; w1[3] = salt_buf03; w2[0] = salt_buf04; w2[1] = salt_buf05; w2[2] = salt_buf06; w2[3] = salt_buf07; w3[0] = salt_buf08; w3[1] = salt_buf09; w3[2] = salt_buf10; w3[3] = 0; a = MD4M_A; b = MD4M_B; c = MD4M_C; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m01100_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01100_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01100_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 salt_t s_salt_buf[1]; if (lid == 0) { s_salt_buf[0] = salt_bufs[salt_pos]; s_salt_buf[0].salt_buf[10] = (16 + s_salt_buf[0].salt_len) * 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; #define salt_buf00 s_salt_buf[0].salt_buf[ 0] #define salt_buf01 s_salt_buf[0].salt_buf[ 1] #define salt_buf02 s_salt_buf[0].salt_buf[ 2] #define salt_buf03 s_salt_buf[0].salt_buf[ 3] #define salt_buf04 s_salt_buf[0].salt_buf[ 4] #define salt_buf05 s_salt_buf[0].salt_buf[ 5] #define salt_buf06 s_salt_buf[0].salt_buf[ 6] #define salt_buf07 s_salt_buf[0].salt_buf[ 7] #define salt_buf08 s_salt_buf[0].salt_buf[ 8] #define salt_buf09 s_salt_buf[0].salt_buf[ 9] #define salt_buf10 s_salt_buf[0].salt_buf[10] /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w3[2] = out_len * 2 * 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); a += MD4M_A; b += MD4M_B; c += MD4M_C; d += MD4M_D; w0[0] = a; w0[1] = b; w0[2] = c; w0[3] = d; w1[0] = salt_buf00; w1[1] = salt_buf01; w1[2] = salt_buf02; w1[3] = salt_buf03; w2[0] = salt_buf04; w2[1] = salt_buf05; w2[2] = salt_buf06; w2[3] = salt_buf07; w3[0] = salt_buf08; w3[1] = salt_buf09; w3[2] = salt_buf10; w3[3] = 0; a = MD4M_A; b = MD4M_B; c = MD4M_C; 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); if (MATCHES_NONE_VS (a, search[0])) continue; 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m01100_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01100_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01100_a0.cl000066400000000000000000000114251320027462700157730ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md4.cl" __kernel void m01100_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md4_ctx_t ctx0; md4_init (&ctx0); md4_update_utf16le (&ctx0, tmp.i, tmp.pw_len); md4_final (&ctx0); md4_ctx_t ctx; md4_init (&ctx); ctx.w0[0] = ctx0.h[0]; ctx.w0[1] = ctx0.h[1]; ctx.w0[2] = ctx0.h[2]; ctx.w0[3] = ctx0.h[3]; ctx.len = 16; md4_update_utf16le (&ctx, s, salt_len); md4_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01100_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md4_ctx_t ctx0; md4_init (&ctx0); md4_update_utf16le (&ctx0, tmp.i, tmp.pw_len); md4_final (&ctx0); md4_ctx_t ctx; md4_init (&ctx); ctx.w0[0] = ctx0.h[0]; ctx.w0[1] = ctx0.h[1]; ctx.w0[2] = ctx0.h[2]; ctx.w0[3] = ctx0.h[3]; ctx.len = 16; md4_update_utf16le (&ctx, s, salt_len); md4_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01100_a1-optimized.cl000066400000000000000000000625331320027462700200040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m01100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ __local salt_t s_salt_buf[1]; if (lid == 0) { s_salt_buf[0] = salt_bufs[salt_pos]; s_salt_buf[0].salt_buf[10] = (16 + s_salt_buf[0].salt_len) * 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; #define salt_buf00 s_salt_buf[0].salt_buf[ 0] #define salt_buf01 s_salt_buf[0].salt_buf[ 1] #define salt_buf02 s_salt_buf[0].salt_buf[ 2] #define salt_buf03 s_salt_buf[0].salt_buf[ 3] #define salt_buf04 s_salt_buf[0].salt_buf[ 4] #define salt_buf05 s_salt_buf[0].salt_buf[ 5] #define salt_buf06 s_salt_buf[0].salt_buf[ 6] #define salt_buf07 s_salt_buf[0].salt_buf[ 7] #define salt_buf08 s_salt_buf[0].salt_buf[ 8] #define salt_buf09 s_salt_buf[0].salt_buf[ 9] #define salt_buf10 s_salt_buf[0].salt_buf[10] /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w3[2] = pw_len * 2 * 8; w3[3] = 0; /** * md4 */ 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); a += MD4M_A; b += MD4M_B; c += MD4M_C; d += MD4M_D; w0[0] = a; w0[1] = b; w0[2] = c; w0[3] = d; w1[0] = salt_buf00; w1[1] = salt_buf01; w1[2] = salt_buf02; w1[3] = salt_buf03; w2[0] = salt_buf04; w2[1] = salt_buf05; w2[2] = salt_buf06; w2[3] = salt_buf07; w3[0] = salt_buf08; w3[1] = salt_buf09; w3[2] = salt_buf10; w3[3] = 0; a = MD4M_A; b = MD4M_B; c = MD4M_C; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m01100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ __local salt_t s_salt_buf[1]; if (lid == 0) { s_salt_buf[0] = salt_bufs[salt_pos]; s_salt_buf[0].salt_buf[10] = (16 + s_salt_buf[0].salt_len) * 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; #define salt_buf00 s_salt_buf[0].salt_buf[ 0] #define salt_buf01 s_salt_buf[0].salt_buf[ 1] #define salt_buf02 s_salt_buf[0].salt_buf[ 2] #define salt_buf03 s_salt_buf[0].salt_buf[ 3] #define salt_buf04 s_salt_buf[0].salt_buf[ 4] #define salt_buf05 s_salt_buf[0].salt_buf[ 5] #define salt_buf06 s_salt_buf[0].salt_buf[ 6] #define salt_buf07 s_salt_buf[0].salt_buf[ 7] #define salt_buf08 s_salt_buf[0].salt_buf[ 8] #define salt_buf09 s_salt_buf[0].salt_buf[ 9] #define salt_buf10 s_salt_buf[0].salt_buf[10] /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w3[2] = pw_len * 2 * 8; w3[3] = 0; /** * md4 */ 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); a += MD4M_A; b += MD4M_B; c += MD4M_C; d += MD4M_D; w0[0] = a; w0[1] = b; w0[2] = c; w0[3] = d; w1[0] = salt_buf00; w1[1] = salt_buf01; w1[2] = salt_buf02; w1[3] = salt_buf03; w2[0] = salt_buf04; w2[1] = salt_buf05; w2[2] = salt_buf06; w2[3] = salt_buf07; w3[0] = salt_buf08; w3[1] = salt_buf09; w3[2] = salt_buf10; w3[3] = 0; a = MD4M_A; b = MD4M_B; c = MD4M_C; 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); if (MATCHES_NONE_VS (a, search[0])) continue; 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m01100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01100_a1.cl000066400000000000000000000113541320027462700157750ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md4.cl" __kernel void m01100_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md4_ctx_t ctx0; md4_init (&ctx0); md4_update_global_utf16le (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md4_ctx_t ctx1 = ctx0; md4_update_global_utf16le (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md4_final (&ctx1); md4_ctx_t ctx; md4_init (&ctx); ctx.w0[0] = ctx1.h[0]; ctx.w0[1] = ctx1.h[1]; ctx.w0[2] = ctx1.h[2]; ctx.w0[3] = ctx1.h[3]; ctx.len = 16; md4_update_utf16le (&ctx, s, salt_len); md4_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01100_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md4_ctx_t ctx0; md4_init (&ctx0); md4_update_global_utf16le (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md4_ctx_t ctx1 = ctx0; md4_update_global_utf16le (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md4_final (&ctx1); md4_ctx_t ctx; md4_init (&ctx); ctx.w0[0] = ctx1.h[0]; ctx.w0[1] = ctx1.h[1]; ctx.w0[2] = ctx1.h[2]; ctx.w0[3] = ctx1.h[3]; ctx.len = 16; md4_update_utf16le (&ctx, s, salt_len); md4_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01100_a3-optimized.cl000066400000000000000000000761431320027462700200100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m01100m (__local salt_t *s_salt_buf, u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ #define salt_buf00 s_salt_buf[0].salt_buf[ 0] #define salt_buf01 s_salt_buf[0].salt_buf[ 1] #define salt_buf02 s_salt_buf[0].salt_buf[ 2] #define salt_buf03 s_salt_buf[0].salt_buf[ 3] #define salt_buf04 s_salt_buf[0].salt_buf[ 4] #define salt_buf05 s_salt_buf[0].salt_buf[ 5] #define salt_buf06 s_salt_buf[0].salt_buf[ 6] #define salt_buf07 s_salt_buf[0].salt_buf[ 7] #define salt_buf08 s_salt_buf[0].salt_buf[ 8] #define salt_buf09 s_salt_buf[0].salt_buf[ 9] #define salt_buf10 s_salt_buf[0].salt_buf[10] /** * 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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_buf00; w1_t[1] = salt_buf01; w1_t[2] = salt_buf02; w1_t[3] = salt_buf03; w2_t[0] = salt_buf04; w2_t[1] = salt_buf05; w2_t[2] = salt_buf06; w2_t[3] = salt_buf07; w3_t[0] = salt_buf08; w3_t[1] = salt_buf09; w3_t[2] = salt_buf10; 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); COMPARE_M_SIMD (a, d, c, b); } } void m01100s (__local salt_t *s_salt_buf, u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ #define salt_buf00 s_salt_buf[0].salt_buf[ 0] #define salt_buf01 s_salt_buf[0].salt_buf[ 1] #define salt_buf02 s_salt_buf[0].salt_buf[ 2] #define salt_buf03 s_salt_buf[0].salt_buf[ 3] #define salt_buf04 s_salt_buf[0].salt_buf[ 4] #define salt_buf05 s_salt_buf[0].salt_buf[ 5] #define salt_buf06 s_salt_buf[0].salt_buf[ 6] #define salt_buf07 s_salt_buf[0].salt_buf[ 7] #define salt_buf08 s_salt_buf[0].salt_buf[ 8] #define salt_buf09 s_salt_buf[0].salt_buf[ 9] #define salt_buf10 s_salt_buf[0].salt_buf[10] /** * 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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_buf00; w1_t[1] = salt_buf01; w1_t[2] = salt_buf02; w1_t[3] = salt_buf03; w2_t[0] = salt_buf04; w2_t[1] = salt_buf05; w2_t[2] = salt_buf06; w2_t[3] = salt_buf07; w3_t[0] = salt_buf08; w3_t[1] = salt_buf09; w3_t[2] = salt_buf10; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m01100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 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; /** * salt */ __local salt_t s_salt_buf[1]; if (lid == 0) { s_salt_buf[0] = salt_bufs[salt_pos]; s_salt_buf[0].salt_buf[10] = (16 + s_salt_buf[0].salt_len) * 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m01100m (s_salt_buf, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 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; /** * salt */ __local salt_t s_salt_buf[1]; if (lid == 0) { s_salt_buf[0] = salt_bufs[salt_pos]; s_salt_buf[0].salt_buf[10] = (16 + s_salt_buf[0].salt_len) * 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m01100m (s_salt_buf, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 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; /** * salt */ __local salt_t s_salt_buf[1]; if (lid == 0) { s_salt_buf[0] = salt_bufs[salt_pos]; s_salt_buf[0].salt_buf[10] = (16 + s_salt_buf[0].salt_len) * 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m01100s (s_salt_buf, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 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; /** * salt */ __local salt_t s_salt_buf[1]; if (lid == 0) { s_salt_buf[0] = salt_bufs[salt_pos]; s_salt_buf[0].salt_buf[10] = (16 + s_salt_buf[0].salt_len) * 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m01100s (s_salt_buf, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01100_a3.cl000066400000000000000000000122461320027462700160000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md4.cl" __kernel void m01100_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md4_ctx_vector_t ctx0; md4_init_vector (&ctx0); md4_update_vector_utf16le (&ctx0, w, pw_len); md4_final_vector (&ctx0); md4_ctx_vector_t ctx; md4_init_vector (&ctx); ctx.w0[0] = ctx0.h[0]; ctx.w0[1] = ctx0.h[1]; ctx.w0[2] = ctx0.h[2]; ctx.w0[3] = ctx0.h[3]; ctx.len = 16; md4_update_vector_utf16le (&ctx, s, salt_len); md4_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01100_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md4_ctx_vector_t ctx0; md4_init_vector (&ctx0); md4_update_vector_utf16le (&ctx0, w, pw_len); md4_final_vector (&ctx0); md4_ctx_vector_t ctx; md4_init_vector (&ctx); ctx.w0[0] = ctx0.h[0]; ctx.w0[1] = ctx0.h[1]; ctx.w0[2] = ctx0.h[2]; ctx.w0[3] = ctx0.h[3]; ctx.len = 16; md4_update_vector_utf16le (&ctx, s, salt_len); md4_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01300_a0-optimized.cl000066400000000000000000000634471320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #define SHA224_STEP_REV(a,b,c,d,e,f,g) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = 0; \ } __kernel void m01300_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha224 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); u32x we_t = 0; u32x wf_t = out_len * 8; u32x a = SHA224M_A; u32x b = SHA224M_B; u32x c = SHA224M_C; u32x d = SHA224M_D; u32x e = SHA224M_E; u32x f = SHA224M_F; u32x g = SHA224M_G; u32x h = SHA224M_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); COMPARE_M_SIMD (d, f, c, g); } } __kernel void m01300_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01300_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01300_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 */ 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; SHA224_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev); SHA224_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev); SHA224_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha224 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); u32x we_t = 0; u32x wf_t = out_len * 8; u32x a = SHA224M_A; u32x b = SHA224M_B; u32x c = SHA224M_C; u32x d = SHA224M_D; u32x e = SHA224M_E; u32x f = SHA224M_F; u32x g = SHA224M_G; u32x h = SHA224M_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); if (MATCHES_NONE_VS (g, d_rev)) continue; 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); COMPARE_S_SIMD (d, f, c, g); } } __kernel void m01300_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01300_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01300_a0.cl000066400000000000000000000077061320027462700160040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha224.cl" __kernel void m01300_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha224_ctx_t ctx; sha224_init (&ctx); sha224_update_swap (&ctx, tmp.i, tmp.pw_len); sha224_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01300_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha224_ctx_t ctx; sha224_init (&ctx); sha224_update_swap (&ctx, tmp.i, tmp.pw_len); sha224_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01300_a1-optimized.cl000066400000000000000000000720361320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define SHA224_STEP_REV(a,b,c,d,e,f,g) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = 0; \ } __kernel void m01300_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha224 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); u32x we_t = 0; u32x wf_t = pw_len * 8; u32x a = SHA224M_A; u32x b = SHA224M_B; u32x c = SHA224M_C; u32x d = SHA224M_D; u32x e = SHA224M_E; u32x f = SHA224M_F; u32x g = SHA224M_G; u32x h = SHA224M_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); COMPARE_M_SIMD (d, f, c, g); } } __kernel void m01300_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01300_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01300_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 */ 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; SHA224_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev); SHA224_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev); SHA224_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha224 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); u32x we_t = 0; u32x wf_t = pw_len * 8; u32x a = SHA224M_A; u32x b = SHA224M_B; u32x c = SHA224M_C; u32x d = SHA224M_D; u32x e = SHA224M_E; u32x f = SHA224M_F; u32x g = SHA224M_G; u32x h = SHA224M_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); if (MATCHES_NONE_VS (g, d_rev)) continue; 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); COMPARE_S_SIMD (d, f, c, g); } } __kernel void m01300_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01300_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01300_a1.cl000066400000000000000000000076451320027462700160070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha224.cl" __kernel void m01300_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ sha224_ctx_t ctx0; sha224_init (&ctx0); sha224_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha224_ctx_t ctx = ctx0; sha224_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha224_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01300_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ sha224_ctx_t ctx0; sha224_init (&ctx0); sha224_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha224_ctx_t ctx = ctx0; sha224_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha224_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01300_a3-optimized.cl000066400000000000000000001003121320027462700177740ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define SHA224_STEP_REV(a,b,c,d,e,f,g) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = 0; \ } void m01300m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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 = SHA224M_A; u32x b = SHA224M_B; u32x c = SHA224M_C; u32x d = SHA224M_D; u32x e = SHA224M_E; u32x f = SHA224M_F; u32x g = SHA224M_G; u32x h = SHA224M_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); COMPARE_M_SIMD (d, f, c, g); } } void m01300s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; SHA224_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev); SHA224_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev); SHA224_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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 = SHA224M_A; u32x b = SHA224M_B; u32x c = SHA224M_C; u32x d = SHA224M_D; u32x e = SHA224M_E; u32x f = SHA224M_F; u32x g = SHA224M_G; u32x h = SHA224M_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); if (MATCHES_NONE_VS (g, d_rev)) continue; 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); COMPARE_S_SIMD (d, f, c, g); } } __kernel void m01300_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m01300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01300_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m01300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01300_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m01300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01300_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m01300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01300_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m01300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01300_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m01300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m01300_a3.cl000066400000000000000000000104231320027462700157750ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha224.cl" __kernel void m01300_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha224_ctx_vector_t ctx; sha224_init_vector (&ctx); sha224_update_vector (&ctx, w, pw_len); sha224_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01300_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha224_ctx_vector_t ctx; sha224_init_vector (&ctx); sha224_update_vector (&ctx, w, pw_len); sha224_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01400_a0-optimized.cl000066400000000000000000000637631320027462700200140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = h; \ h = 0; \ } __kernel void m01400_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); 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); COMPARE_M_SIMD (d, h, c, g); } } __kernel void m01400_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01400_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01400_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 */ 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; u32 h_rev = digests_buf[digests_offset].digest_buf[7]; SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); 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); if (MATCHES_NONE_VS (h, d_rev)) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m01400_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01400_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01400_a0.cl000066400000000000000000000077061320027462700160050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha256.cl" __kernel void m01400_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha256_ctx_t ctx; sha256_init (&ctx); sha256_update_swap (&ctx, tmp.i, tmp.pw_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01400_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha256_ctx_t ctx; sha256_init (&ctx); sha256_update_swap (&ctx, tmp.i, tmp.pw_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01400_a1-optimized.cl000066400000000000000000000723521320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = h; \ h = 0; \ } __kernel void m01400_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, h, c, g); } } __kernel void m01400_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01400_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01400_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 */ 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; u32 h_rev = digests_buf[digests_offset].digest_buf[7]; SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); if (MATCHES_NONE_VS (h, d_rev)) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m01400_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01400_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01400_a1.cl000066400000000000000000000076451320027462700160100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha256.cl" __kernel void m01400_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha256_ctx_t ctx = ctx0; sha256_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01400_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha256_ctx_t ctx = ctx0; sha256_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01400_a3-optimized.cl000066400000000000000000001006261320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = h; \ h = 0; \ } void m01400m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); COMPARE_M_SIMD (d, h, c, g); } } void m01400s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; u32 h_rev = digests_buf[digests_offset].digest_buf[7]; SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); if (MATCHES_NONE_VS (h, d_rev)) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m01400_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01400_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01400_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01400_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01400_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01400_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m01400_a3.cl000066400000000000000000000104231320027462700157760ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" __kernel void m01400_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha256_ctx_vector_t ctx; sha256_init_vector (&ctx); sha256_update_vector (&ctx, w, pw_len); sha256_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01400_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha256_ctx_vector_t ctx; sha256_init_vector (&ctx); sha256_update_vector (&ctx, w, pw_len); sha256_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01410_a0-optimized.cl000066400000000000000000000732611320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = h; \ h = 0; \ } __kernel void m01410_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); const u32x 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]; /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, h, c, g); } } __kernel void m01410_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01410_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01410_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; u32 h_rev = digests_buf[digests_offset].digest_buf[7]; SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); const u32x 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]; /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); if (MATCHES_NONE_VS (h, d_rev)) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m01410_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01410_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01410_a0.cl000066400000000000000000000106541320027462700160020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha256.cl" __kernel void m01410_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha256_ctx_t ctx; sha256_init (&ctx); sha256_update_swap (&ctx, tmp.i, tmp.pw_len); sha256_update (&ctx, s, salt_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01410_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha256_ctx_t ctx; sha256_init (&ctx); sha256_update_swap (&ctx, tmp.i, tmp.pw_len); sha256_update (&ctx, s, salt_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01410_a1-optimized.cl000066400000000000000000001017741320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = h; \ h = 0; \ } __kernel void m01410_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); const u32x 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] |= s3[2]; w3[3] |= s3[3]; /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, h, c, g); } } __kernel void m01410_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01410_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01410_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; u32 h_rev = digests_buf[digests_offset].digest_buf[7]; SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); const u32x 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] |= s3[2]; w3[3] |= s3[3]; /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); if (MATCHES_NONE_VS (h, d_rev)) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m01410_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01410_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01410_a1.cl000066400000000000000000000106131320027462700157760ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha256.cl" __kernel void m01410_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha256_ctx_t ctx = ctx0; sha256_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha256_update (&ctx, s, salt_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01410_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha256_ctx_t ctx = ctx0; sha256_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha256_update (&ctx, s, salt_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01410_a3-optimized.cl000066400000000000000000001041061320027462700200030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = h; \ h = 0; \ } void m01410m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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]; switch_buffer_by_offset_le_S (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); w[ 0] |= swap32_S (salt_buf0[0]); w[ 1] |= swap32_S (salt_buf0[1]); w[ 2] |= swap32_S (salt_buf0[2]); w[ 3] |= swap32_S (salt_buf0[3]); w[ 4] |= swap32_S (salt_buf1[0]); w[ 5] |= swap32_S (salt_buf1[1]); w[ 6] |= swap32_S (salt_buf1[2]); w[ 7] |= swap32_S (salt_buf1[3]); w[ 8] |= swap32_S (salt_buf2[0]); w[ 9] |= swap32_S (salt_buf2[1]); w[10] |= swap32_S (salt_buf2[2]); w[11] |= swap32_S (salt_buf2[3]); w[12] |= swap32_S (salt_buf3[0]); w[13] |= swap32_S (salt_buf3[1]); w[14] |= swap32_S (salt_buf3[2]); w[15] |= swap32_S (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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); COMPARE_M_SIMD (d, h, c, g); } } void m01410s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; u32 h_rev = digests_buf[digests_offset].digest_buf[7]; SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); if (MATCHES_NONE_VS (h, d_rev)) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m01410_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01410_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01410_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01410_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01410_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01410_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m01410_a3.cl000066400000000000000000000114111320027462700157750ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" __kernel void m01410_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha256_ctx_vector_t ctx; sha256_init_vector (&ctx); sha256_update_vector (&ctx, w, pw_len); sha256_update_vector (&ctx, s, salt_len); sha256_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01410_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha256_ctx_vector_t ctx; sha256_init_vector (&ctx); sha256_update_vector (&ctx, w, pw_len); sha256_update_vector (&ctx, s, salt_len); sha256_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01420_a0-optimized.cl000066400000000000000000000721051320027462700200040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = h; \ h = 0; \ } __kernel void m01420_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * prepend salt */ const u32x out_salt_len = out_len + salt_len; switch_buffer_by_offset_le_VV (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]; 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]; append_0x80_4x4_VV (w0, w1, w2, w3, out_salt_len); /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, h, c, g); } } __kernel void m01420_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01420_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01420_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; u32 h_rev = digests_buf[digests_offset].digest_buf[7]; SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * prepend salt */ const u32x out_salt_len = out_len + salt_len; switch_buffer_by_offset_le_VV (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]; 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]; append_0x80_4x4_VV (w0, w1, w2, w3, out_salt_len); /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); if (MATCHES_NONE_VS (h, d_rev)) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m01420_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01420_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01420_a0.cl000066400000000000000000000103021320027462700157710ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha256.cl" __kernel void m01420_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha256_ctx_t ctx = ctx0; sha256_update_swap (&ctx, tmp.i, tmp.pw_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01420_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha256_ctx_t ctx = ctx0; sha256_update_swap (&ctx, tmp.i, tmp.pw_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01420_a1-optimized.cl000066400000000000000000001004301320027462700177760ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = h; \ h = 0; \ } __kernel void m01420_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len + 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]; 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]; /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, h, c, g); } } __kernel void m01420_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01420_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01420_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; u32 h_rev = digests_buf[digests_offset].digest_buf[7]; SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len + 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]; 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]; /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); if (MATCHES_NONE_VS (h, d_rev)) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m01420_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01420_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01420_a1.cl000066400000000000000000000101511320027462700157740ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha256.cl" __kernel void m01420_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha256_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha256_ctx_t ctx = ctx0; sha256_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01420_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha256_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha256_ctx_t ctx = ctx0; sha256_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01420_a3-optimized.cl000066400000000000000000001113541320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = h; \ h = 0; \ } void m01420m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; switch_buffer_by_offset_be (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = 0; t3[3] = pw_salt_len * 8; /** * sha256 */ u32x w0_t = t0[0]; u32x w1_t = t0[1]; u32x w2_t = t0[2]; u32x w3_t = t0[3]; u32x w4_t = t1[0]; u32x w5_t = t1[1]; u32x w6_t = t1[2]; u32x w7_t = t1[3]; u32x w8_t = t2[0]; u32x w9_t = t2[1]; u32x wa_t = t2[2]; u32x wb_t = t2[3]; u32x wc_t = t3[0]; u32x wd_t = t3[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); COMPARE_M_SIMD (d, h, c, g); } } void m01420s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; u32 h_rev = digests_buf[digests_offset].digest_buf[7]; SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; switch_buffer_by_offset_be (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = 0; t3[3] = pw_salt_len * 8; /** * sha256 */ u32x w0_t = t0[0]; u32x w1_t = t0[1]; u32x w2_t = t0[2]; u32x w3_t = t0[3]; u32x w4_t = t1[0]; u32x w5_t = t1[1]; u32x w6_t = t1[2]; u32x w7_t = t1[3]; u32x w8_t = t2[0]; u32x w9_t = t2[1]; u32x wa_t = t2[2]; u32x wb_t = t2[3]; u32x wc_t = t3[0]; u32x wd_t = t3[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); if (MATCHES_NONE_VS (h, d_rev)) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m01420_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01420_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01420_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01420_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01420_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01420_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m01420_a3.cl000066400000000000000000000111311320027462700157750ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" __kernel void m01420_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha256_ctx_vector_t ctx; sha256_init_vector_from_scalar (&ctx, &ctx0); sha256_update_vector (&ctx, w, pw_len); sha256_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01420_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha256_ctx_vector_t ctx; sha256_init_vector_from_scalar (&ctx, &ctx0); sha256_update_vector (&ctx, w, pw_len); sha256_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01430_a0-optimized.cl000066400000000000000000000736031320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = h; \ h = 0; \ } __kernel void m01430_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len2); const u32x pw_salt_len = out_len2 + 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]; /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, h, c, g); } } __kernel void m01430_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01430_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01430_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; u32 h_rev = digests_buf[digests_offset].digest_buf[7]; SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len2); const u32x pw_salt_len = out_len2 + 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]; /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); if (MATCHES_NONE_VS (h, d_rev)) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m01430_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01430_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01430_a0.cl000066400000000000000000000106741320027462700160060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha256.cl" __kernel void m01430_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha256_ctx_t ctx; sha256_init (&ctx); sha256_update_utf16le_swap (&ctx, tmp.i, tmp.pw_len); sha256_update (&ctx, s, salt_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01430_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha256_ctx_t ctx; sha256_init (&ctx); sha256_update_utf16le_swap (&ctx, tmp.i, tmp.pw_len); sha256_update (&ctx, s, salt_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01430_a1-optimized.cl000066400000000000000000001023121320027462700200000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = h; \ h = 0; \ } __kernel void m01430_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len2); const u32x pw_salt_len = pw_len2 + 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]; /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, h, c, g); } } __kernel void m01430_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01430_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01430_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; u32 h_rev = digests_buf[digests_offset].digest_buf[7]; SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len2); const u32x pw_salt_len = pw_len2 + 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]; /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); if (MATCHES_NONE_VS (h, d_rev)) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m01430_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01430_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01430_a1.cl000066400000000000000000000106531320027462700160040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha256.cl" __kernel void m01430_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_utf16le_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha256_ctx_t ctx = ctx0; sha256_update_global_utf16le_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha256_update (&ctx, s, salt_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01430_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_utf16le_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha256_ctx_t ctx = ctx0; sha256_update_global_utf16le_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha256_update (&ctx, s, salt_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01430_a3-optimized.cl000066400000000000000000001041061320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = h; \ h = 0; \ } void m01430m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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]; switch_buffer_by_offset_le_S (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); w[ 0] |= swap32_S (salt_buf0[0]); w[ 1] |= swap32_S (salt_buf0[1]); w[ 2] |= swap32_S (salt_buf0[2]); w[ 3] |= swap32_S (salt_buf0[3]); w[ 4] |= swap32_S (salt_buf1[0]); w[ 5] |= swap32_S (salt_buf1[1]); w[ 6] |= swap32_S (salt_buf1[2]); w[ 7] |= swap32_S (salt_buf1[3]); w[ 8] |= swap32_S (salt_buf2[0]); w[ 9] |= swap32_S (salt_buf2[1]); w[10] |= swap32_S (salt_buf2[2]); w[11] |= swap32_S (salt_buf2[3]); w[12] |= swap32_S (salt_buf3[0]); w[13] |= swap32_S (salt_buf3[1]); w[14] |= swap32_S (salt_buf3[2]); w[15] |= swap32_S (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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); COMPARE_M_SIMD (d, h, c, g); } } void m01430s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; u32 h_rev = digests_buf[digests_offset].digest_buf[7]; SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); if (MATCHES_NONE_VS (h, d_rev)) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m01430_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01430_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01430_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01430_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01430_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01430_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m01430_a3.cl000066400000000000000000000114331320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" __kernel void m01430_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha256_ctx_vector_t ctx; sha256_init_vector (&ctx); sha256_update_vector_utf16beN (&ctx, w, pw_len); sha256_update_vector (&ctx, s, salt_len); sha256_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01430_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha256_ctx_vector_t ctx; sha256_init_vector (&ctx); sha256_update_vector_utf16beN (&ctx, w, pw_len); sha256_update_vector (&ctx, s, salt_len); sha256_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01440_a0-optimized.cl000066400000000000000000000724251320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = h; \ h = 0; \ } __kernel void m01440_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * prepend salt */ const u32x out_salt_len = out_len2 + salt_len; switch_buffer_by_offset_le_VV (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]; 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]; append_0x80_4x4_VV (w0, w1, w2, w3, out_salt_len); /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, h, c, g); } } __kernel void m01440_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01440_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01440_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; u32 h_rev = digests_buf[digests_offset].digest_buf[7]; SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * prepend salt */ const u32x out_salt_len = out_len2 + salt_len; switch_buffer_by_offset_le_VV (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]; 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]; append_0x80_4x4_VV (w0, w1, w2, w3, out_salt_len); /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); if (MATCHES_NONE_VS (h, d_rev)) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m01440_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01440_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01440_a0.cl000066400000000000000000000103221320027462700157750ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha256.cl" __kernel void m01440_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha256_ctx_t ctx = ctx0; sha256_update_utf16le_swap (&ctx, tmp.i, tmp.pw_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01440_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha256_ctx_t ctx = ctx0; sha256_update_utf16le_swap (&ctx, tmp.i, tmp.pw_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01440_a1-optimized.cl000066400000000000000000001007441320027462700200100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = h; \ h = 0; \ } __kernel void m01440_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len2 + 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]; 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]; /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, h, c, g); } } __kernel void m01440_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01440_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01440_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; u32 h_rev = digests_buf[digests_offset].digest_buf[7]; SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len2 + 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]; 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]; /** * sha256 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); if (MATCHES_NONE_VS (h, d_rev)) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m01440_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01440_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01440_a1.cl000066400000000000000000000102111320027462700157730ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha256.cl" __kernel void m01440_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha256_update_global_utf16le_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha256_ctx_t ctx = ctx0; sha256_update_global_utf16le_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01440_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha256_update_global_utf16le_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha256_ctx_t ctx = ctx0; sha256_update_global_utf16le_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01440_a3-optimized.cl000066400000000000000000001113541320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ { \ u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ u32 t1 = a - t2; \ a = b; \ b = c; \ c = d; \ d = e - t1; \ e = f; \ f = g; \ g = h; \ h = 0; \ } void m01440m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; switch_buffer_by_offset_be (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = 0; t3[3] = pw_salt_len * 8; /** * sha256 */ u32x w0_t = t0[0]; u32x w1_t = t0[1]; u32x w2_t = t0[2]; u32x w3_t = t0[3]; u32x w4_t = t1[0]; u32x w5_t = t1[1]; u32x w6_t = t1[2]; u32x w7_t = t1[3]; u32x w8_t = t2[0]; u32x w9_t = t2[1]; u32x wa_t = t2[2]; u32x wb_t = t2[3]; u32x wc_t = t3[0]; u32x wd_t = t3[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); COMPARE_M_SIMD (d, h, c, g); } } void m01440s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ 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]; u32 e_rev = digests_buf[digests_offset].digest_buf[4]; u32 f_rev = digests_buf[digests_offset].digest_buf[5]; u32 g_rev = digests_buf[digests_offset].digest_buf[6]; u32 h_rev = digests_buf[digests_offset].digest_buf[7]; SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); SHA256_STEP_REV (a_rev, b_rev, c_rev, d_rev, e_rev, f_rev, g_rev, h_rev); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; switch_buffer_by_offset_be (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = 0; t3[3] = pw_salt_len * 8; /** * sha256 */ u32x w0_t = t0[0]; u32x w1_t = t0[1]; u32x w2_t = t0[2]; u32x w3_t = t0[3]; u32x w4_t = t1[0]; u32x w5_t = t1[1]; u32x w6_t = t1[2]; u32x w7_t = t1[3]; u32x w8_t = t2[0]; u32x w9_t = t2[1]; u32x wa_t = t2[2]; u32x wb_t = t2[3]; u32x wc_t = t3[0]; u32x wd_t = t3[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); if (MATCHES_NONE_VS (h, d_rev)) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m01440_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01440_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01440_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01440_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01440_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01440_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m01440_a3.cl000066400000000000000000000111531320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" __kernel void m01440_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha256_ctx_vector_t ctx; sha256_init_vector_from_scalar (&ctx, &ctx0); sha256_update_vector_utf16beN (&ctx, w, pw_len); sha256_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01440_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha256_ctx_vector_t ctx; sha256_init_vector_from_scalar (&ctx, &ctx0); sha256_update_vector_utf16beN (&ctx, w, pw_len); sha256_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01450_a0-optimized.cl000066400000000000000000000351441320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m01450_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); /** * pads */ u32x ipad[8]; u32x opad[8]; hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); 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] = 0; w3[3] = (64 + salt_len) * 8; u32x digest[8]; hmac_sha256_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_M_SIMD (digest[3], digest[7], digest[2], digest[6]); } } __kernel void m01450_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01450_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01450_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); /** * pads */ u32x ipad[8]; u32x opad[8]; hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); 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] = 0; w3[3] = (64 + salt_len) * 8; u32x digest[8]; hmac_sha256_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_S_SIMD (digest[3], digest[7], digest[2], digest[6]); } } __kernel void m01450_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01450_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01450_a0.cl000066400000000000000000000107061320027462700160040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha256.cl" __kernel void m01450_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha256_hmac_ctx_t ctx; sha256_hmac_init_swap (&ctx, tmp.i, tmp.pw_len); sha256_hmac_update (&ctx, s, salt_len); sha256_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01450_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha256_hmac_ctx_t ctx; sha256_hmac_init_swap (&ctx, tmp.i, tmp.pw_len); sha256_hmac_update (&ctx, s, salt_len); sha256_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01450_a1-optimized.cl000066400000000000000000000446351320027462700200170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m01450_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); /** * pads */ u32x ipad[8]; u32x opad[8]; hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); 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] = 0; w3[3] = (64 + salt_len) * 8; u32x digest[8]; hmac_sha256_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_M_SIMD (digest[3], digest[7], digest[2], digest[6]); } } __kernel void m01450_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01450_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01450_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); /** * pads */ u32x ipad[8]; u32x opad[8]; hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); 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] = 0; w3[3] = (64 + salt_len) * 8; u32x digest[8]; hmac_sha256_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_S_SIMD (digest[3], digest[7], digest[2], digest[6]); } } __kernel void m01450_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01450_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01450_a1.cl000066400000000000000000000123651320027462700160100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha256.cl" __kernel void m01450_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (pws[gid].i[idx]); } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = swap32_S (combs_buf[il_pos].i[idx]); } switch_buffer_by_offset_1x64_be_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } sha256_hmac_ctx_t ctx; sha256_hmac_init (&ctx, c, pw_len + comb_len); sha256_hmac_update (&ctx, s, salt_len); sha256_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01450_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (pws[gid].i[idx]); } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = swap32_S (combs_buf[il_pos].i[idx]); } switch_buffer_by_offset_1x64_be_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } sha256_hmac_ctx_t ctx; sha256_hmac_init (&ctx, c, pw_len + comb_len); sha256_hmac_update (&ctx, s, salt_len); sha256_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01450_a3-optimized.cl000066400000000000000000000542171320027462700200160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } void m01450m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * pads */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; u32x ipad[8]; u32x opad[8]; hmac_sha256_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 + salt_len) * 8; u32x digest[8]; hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); COMPARE_M_SIMD (digest[3], digest[7], digest[2], digest[6]); } } void m01450s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * pads */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; u32x ipad[8]; u32x opad[8]; hmac_sha256_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 + salt_len) * 8; u32x digest[8]; hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); COMPARE_S_SIMD (digest[3], digest[7], digest[2], digest[6]); } } __kernel void m01450_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01450_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01450_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01450_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01450_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01450_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m01450_a3.cl000066400000000000000000000114251320027462700160060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" __kernel void m01450_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha256_hmac_ctx_vector_t ctx; sha256_hmac_init_vector (&ctx, w, pw_len); sha256_hmac_update_vector (&ctx, s, salt_len); sha256_hmac_final_vector (&ctx); const u32x r0 = ctx.opad.h[DGST_R0]; const u32x r1 = ctx.opad.h[DGST_R1]; const u32x r2 = ctx.opad.h[DGST_R2]; const u32x r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01450_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha256_hmac_ctx_vector_t ctx; sha256_hmac_init_vector (&ctx, w, pw_len); sha256_hmac_update_vector (&ctx, s, salt_len); sha256_hmac_final_vector (&ctx); const u32x r0 = ctx.opad.h[DGST_R0]; const u32x r1 = ctx.opad.h[DGST_R1]; const u32x r2 = ctx.opad.h[DGST_R2]; const u32x r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01460_a0-optimized.cl000066400000000000000000000363101320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m01460_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (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); COMPARE_M_SIMD (digest[3], digest[7], digest[2], digest[6]); } } __kernel void m01460_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01460_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01460_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (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); COMPARE_S_SIMD (digest[3], digest[7], digest[2], digest[6]); } } __kernel void m01460_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01460_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01460_a0.cl000066400000000000000000000110101320027462700157720ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha256.cl" __kernel void m01460_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha256_hmac_ctx_t ctx0; sha256_hmac_init (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha256_hmac_ctx_t ctx = ctx0; sha256_hmac_update_swap (&ctx, tmp.i, tmp.pw_len); sha256_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01460_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha256_hmac_ctx_t ctx0; sha256_hmac_init (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha256_hmac_ctx_t ctx = ctx0; sha256_hmac_update_swap (&ctx, tmp.i, tmp.pw_len); sha256_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01460_a1-optimized.cl000066400000000000000000000451571320027462700200200ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m01460_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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_4x4_VV (w0, w1, w2, w3, pw_len); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = 0; w3[3] = (64 + pw_len) * 8; u32x digest[8]; hmac_sha256_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_M_SIMD (digest[3], digest[7], digest[2], digest[6]); } } __kernel void m01460_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01460_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01460_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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_4x4_VV (w0, w1, w2, w3, pw_len); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = 0; w3[3] = (64 + pw_len) * 8; u32x digest[8]; hmac_sha256_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_S_SIMD (digest[3], digest[7], digest[2], digest[6]); } } __kernel void m01460_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01460_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01460_a1.cl000066400000000000000000000124671320027462700160140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha256.cl" __kernel void m01460_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (pws[gid].i[idx]); } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha256_hmac_ctx_t ctx0; sha256_hmac_init (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = swap32_S (combs_buf[il_pos].i[idx]); } switch_buffer_by_offset_1x64_be_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } sha256_hmac_ctx_t ctx = ctx0; sha256_hmac_update (&ctx, c, pw_len + comb_len); sha256_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01460_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (pws[gid].i[idx]); } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha256_hmac_ctx_t ctx0; sha256_hmac_init (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = swap32_S (combs_buf[il_pos].i[idx]); } switch_buffer_by_offset_1x64_be_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } sha256_hmac_ctx_t ctx = ctx0; sha256_hmac_update (&ctx, c, pw_len + comb_len); sha256_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01460_a3-optimized.cl000066400000000000000000000540771320027462700200230ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } void m01460m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; u32x ipad[8]; u32x opad[8]; hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; w0_t[0] = w0lr; 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); COMPARE_M_SIMD (digest[3], digest[7], digest[2], digest[6]); } } void m01460s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; w0_t[0] = w0lr; 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); COMPARE_S_SIMD (digest[3], digest[7], digest[2], digest[6]); } } __kernel void m01460_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01460_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01460_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01460_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01460_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01460_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m01460_a3.cl000066400000000000000000000115451320027462700160120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" __kernel void m01460_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha256_hmac_ctx_vector_t ctx0; sha256_hmac_init_vector (&ctx0, s, salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha256_hmac_ctx_vector_t ctx = ctx0; sha256_hmac_update_vector (&ctx, w, pw_len); sha256_hmac_final_vector (&ctx); const u32x r0 = ctx.opad.h[DGST_R0]; const u32x r1 = ctx.opad.h[DGST_R1]; const u32x r2 = ctx.opad.h[DGST_R2]; const u32x r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01460_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha256_hmac_ctx_vector_t ctx0; sha256_hmac_init_vector (&ctx0, s, salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha256_hmac_ctx_vector_t ctx = ctx0; sha256_hmac_update_vector (&ctx, w, pw_len); sha256_hmac_final_vector (&ctx); const u32x r0 = ctx.opad.h[DGST_R0]; const u32x r1 = ctx.opad.h[DGST_R1]; const u32x r2 = ctx.opad.h[DGST_R2]; const u32x r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01500_a0.cl000066400000000000000000000571221320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_simd.cl" #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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 }, }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif void _des_crypt_keysetup (u32 c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[64]) { u32 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; #ifdef _unroll #pragma unroll #endif 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 u32 c00 = (c >> 0) & 0x0000003f; const u32 c06 = (c >> 6) & 0x00383003; const u32 c07 = (c >> 7) & 0x0000003c; const u32 c13 = (c >> 13) & 0x0000060f; const u32 c20 = (c >> 20) & 0x00000001; u32 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 u32 d00 = (d >> 0) & 0x00003c3f; const u32 d07 = (d >> 7) & 0x00003f03; const u32 d21 = (d >> 21) & 0x0000000f; const u32 d22 = (d >> 22) & 0x00000030; u32 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)); } } void _des_crypt_encrypt (u32 iv[2], u32 mask, u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64]) { const u32 E1 = (mask >> 2) & 0x3f0; const u32 E0 = mask & 0x3f; u32 r = 0; u32 l = 0; for (u32 i = 0; i < 25; i++) { #ifdef _unroll #pragma unroll #endif for (u32 j = 0; j < 16; j += 2) { u32 t; u32 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); } u32 tt; tt = l; l = r; r = tt; } iv[0] = rotl32 (r, 31); iv[1] = rotl32 (l, 31); } __kernel void m01500_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * salt */ const u32 mask = salt_bufs[salt_pos].salt_buf[0]; /** * main */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); u32 data[2]; data[0] = (tmp.i[0] << 1) & 0xfefefefe; data[1] = (tmp.i[1] << 1) & 0xfefefefe; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (data[0], data[1], Kc, Kd, s_skb); u32 iv[2]; _des_crypt_encrypt (iv, mask, Kc, Kd, s_SPtrans); u32 z = 0; COMPARE_M_SIMD (iv[0], iv[1], z, z); } } __kernel void m01500_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * 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], 0, 0 }; /** * main */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); u32 data[2]; data[0] = (tmp.i[0] << 1) & 0xfefefefe; data[1] = (tmp.i[1] << 1) & 0xfefefefe; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (data[0], data[1], Kc, Kd, s_skb); u32 iv[2]; _des_crypt_encrypt (iv, mask, Kc, Kd, s_SPtrans); u32 z = 0; COMPARE_S_SIMD (iv[0], iv[1], z, z); } } hashcat-4.0.1/OpenCL/m01500_a1.cl000066400000000000000000000673251320027462700160120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 }, }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif void _des_crypt_keysetup (u32 c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[64]) { u32 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; #ifdef _unroll #pragma unroll #endif 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 u32 c00 = (c >> 0) & 0x0000003f; const u32 c06 = (c >> 6) & 0x00383003; const u32 c07 = (c >> 7) & 0x0000003c; const u32 c13 = (c >> 13) & 0x0000060f; const u32 c20 = (c >> 20) & 0x00000001; u32 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 u32 d00 = (d >> 0) & 0x00003c3f; const u32 d07 = (d >> 7) & 0x00003f03; const u32 d21 = (d >> 21) & 0x0000000f; const u32 d22 = (d >> 22) & 0x00000030; u32 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)); } } void _des_crypt_encrypt (u32 iv[2], u32 mask, u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64]) { const u32 E1 = (mask >> 2) & 0x3f0; const u32 E0 = mask & 0x3f; u32 r = 0; u32 l = 0; for (u32 i = 0; i < 25; i++) { #ifdef _unroll #pragma unroll #endif for (u32 j = 0; j < 16; j += 2) { u32 t; u32 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); } u32 tt; tt = l; l = r; r = tt; } iv[0] = rotl32 (r, 31); iv[1] = rotl32 (l, 31); } __kernel void m01500_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ const u32 mask = salt_bufs[salt_pos].salt_buf[0]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32 pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32 wordl0[4] = { 0 }; u32 wordl1[4] = { 0 }; u32 wordl2[4] = { 0 }; u32 wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32 wordr0[4] = { 0 }; u32 wordr1[4] = { 0 }; u32 wordr2[4] = { 0 }; u32 wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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]; /** * DES */ u32 data[2]; data[0] = (w0[0] << 1) & 0xfefefefe; data[1] = (w0[1] << 1) & 0xfefefefe; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (data[0], data[1], Kc, Kd, s_skb); u32 iv[2]; _des_crypt_encrypt (iv, mask, Kc, Kd, s_SPtrans); u32 z = 0; COMPARE_M_SIMD (iv[0], iv[1], z, z); } } __kernel void m01500_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * 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], 0, 0 }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32 pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32 wordl0[4] = { 0 }; u32 wordl1[4] = { 0 }; u32 wordl2[4] = { 0 }; u32 wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32 wordr0[4] = { 0 }; u32 wordr1[4] = { 0 }; u32 wordr2[4] = { 0 }; u32 wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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]; /** * DES */ u32 data[2]; data[0] = (w0[0] << 1) & 0xfefefefe; data[1] = (w0[1] << 1) & 0xfefefefe; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (data[0], data[1], Kc, Kd, s_skb); u32 iv[2]; _des_crypt_encrypt (iv, mask, Kc, Kd, s_SPtrans); u32 z = 0; COMPARE_S_SIMD (iv[0], iv[1], z, z); } } hashcat-4.0.1/OpenCL/m01500_a3.cl000066400000000000000000003717651320027462700160220ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT * NOTE........: sboxes for maxwell were taken from DeepLearningJohnDoe, license below * : sboxes for others were takes fron JtR, license below */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #define COMPARE_S "inc_comp_single_bs.cl" #define COMPARE_M "inc_comp_multi_bs.cl" #ifdef IS_NV #define KXX_DECL #define sXXX_DECL #endif #ifdef IS_AMD #define KXX_DECL #define sXXX_DECL #endif #ifdef IS_GENERIC #define KXX_DECL #define sXXX_DECL #endif #ifdef IS_NV #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 volatile ("lop3.b32 %0, %1, %2, %3, "#e";" : "=r"(a): "r"(b), "r"(c), "r"(d)); 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; } 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; } 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; } 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; } 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; } 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; } 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; } 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 */ 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; } 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; } 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; } 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; } 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; } 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; } 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; } 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 #endif #if defined IS_AMD || defined IS_GENERIC /* * 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 */ 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; } 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; } 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; } 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; } 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; } 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; } 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; } 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 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; } #define myselx(a,b,c) ((c) ? (b) : (a)) #ifdef DESCRYPT_SALT 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 & DESCRYPT_SALT) ? 1 : 0; sXXX_DECL u32 s002 = (0x002 & DESCRYPT_SALT) ? 1 : 0; sXXX_DECL u32 s004 = (0x004 & DESCRYPT_SALT) ? 1 : 0; sXXX_DECL u32 s008 = (0x008 & DESCRYPT_SALT) ? 1 : 0; sXXX_DECL u32 s010 = (0x010 & DESCRYPT_SALT) ? 1 : 0; sXXX_DECL u32 s020 = (0x020 & DESCRYPT_SALT) ? 1 : 0; sXXX_DECL u32 s040 = (0x040 & DESCRYPT_SALT) ? 1 : 0; sXXX_DECL u32 s080 = (0x080 & DESCRYPT_SALT) ? 1 : 0; sXXX_DECL u32 s100 = (0x100 & DESCRYPT_SALT) ? 1 : 0; sXXX_DECL u32 s200 = (0x200 & DESCRYPT_SALT) ? 1 : 0; sXXX_DECL u32 s400 = (0x400 & DESCRYPT_SALT) ? 1 : 0; sXXX_DECL u32 s800 = (0x800 & DESCRYPT_SALT) ? 1 : 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++) { #ifdef _unroll #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; } #else 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++) { #ifdef _unroll #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; } #endif 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); } void m01500m (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bs_word_t *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 salt = salt_bufs[salt_pos].salt_buf[0]; /** * base */ 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; #define K00 (((w0s >> ( 0 + 7)) & 1) ? -1 : 0) #define K01 (((w0s >> ( 0 + 6)) & 1) ? -1 : 0) #define K02 (((w0s >> ( 0 + 5)) & 1) ? -1 : 0) #define K03 (((w0s >> ( 0 + 4)) & 1) ? -1 : 0) #define K04 (((w0s >> ( 0 + 3)) & 1) ? -1 : 0) #define K05 (((w0s >> ( 0 + 2)) & 1) ? -1 : 0) #define K06 (((w0s >> ( 0 + 1)) & 1) ? -1 : 0) #define K07 (((w0s >> ( 8 + 7)) & 1) ? -1 : 0) #define K08 (((w0s >> ( 8 + 6)) & 1) ? -1 : 0) #define K09 (((w0s >> ( 8 + 5)) & 1) ? -1 : 0) #define K10 (((w0s >> ( 8 + 4)) & 1) ? -1 : 0) #define K11 (((w0s >> ( 8 + 3)) & 1) ? -1 : 0) #define K12 (((w0s >> ( 8 + 2)) & 1) ? -1 : 0) #define K13 (((w0s >> ( 8 + 1)) & 1) ? -1 : 0) #define K14 (((w0s >> (16 + 7)) & 1) ? -1 : 0) #define K15 (((w0s >> (16 + 6)) & 1) ? -1 : 0) #define K16 (((w0s >> (16 + 5)) & 1) ? -1 : 0) #define K17 (((w0s >> (16 + 4)) & 1) ? -1 : 0) #define K18 (((w0s >> (16 + 3)) & 1) ? -1 : 0) #define K19 (((w0s >> (16 + 2)) & 1) ? -1 : 0) #define K20 (((w0s >> (16 + 1)) & 1) ? -1 : 0) #define K21 (((w0s >> (24 + 7)) & 1) ? -1 : 0) #define K22 (((w0s >> (24 + 6)) & 1) ? -1 : 0) #define K23 (((w0s >> (24 + 5)) & 1) ? -1 : 0) #define K24 (((w0s >> (24 + 4)) & 1) ? -1 : 0) #define K25 (((w0s >> (24 + 3)) & 1) ? -1 : 0) #define K26 (((w0s >> (24 + 2)) & 1) ? -1 : 0) #define K27 (((w0s >> (24 + 1)) & 1) ? -1 : 0) #define K28 (((w1s >> ( 0 + 7)) & 1) ? -1 : 0) #define K29 (((w1s >> ( 0 + 6)) & 1) ? -1 : 0) #define K30 (((w1s >> ( 0 + 5)) & 1) ? -1 : 0) #define K31 (((w1s >> ( 0 + 4)) & 1) ? -1 : 0) #define K32 (((w1s >> ( 0 + 3)) & 1) ? -1 : 0) #define K33 (((w1s >> ( 0 + 2)) & 1) ? -1 : 0) #define K34 (((w1s >> ( 0 + 1)) & 1) ? -1 : 0) #define K35 (((w1s >> ( 8 + 7)) & 1) ? -1 : 0) #define K36 (((w1s >> ( 8 + 6)) & 1) ? -1 : 0) #define K37 (((w1s >> ( 8 + 5)) & 1) ? -1 : 0) #define K38 (((w1s >> ( 8 + 4)) & 1) ? -1 : 0) #define K39 (((w1s >> ( 8 + 3)) & 1) ? -1 : 0) #define K40 (((w1s >> ( 8 + 2)) & 1) ? -1 : 0) #define K41 (((w1s >> ( 8 + 1)) & 1) ? -1 : 0) #define K42 (((w1s >> (16 + 7)) & 1) ? -1 : 0) #define K43 (((w1s >> (16 + 6)) & 1) ? -1 : 0) #define K44 (((w1s >> (16 + 5)) & 1) ? -1 : 0) #define K45 (((w1s >> (16 + 4)) & 1) ? -1 : 0) #define K46 (((w1s >> (16 + 3)) & 1) ? -1 : 0) #define K47 (((w1s >> (16 + 2)) & 1) ? -1 : 0) #define K48 (((w1s >> (16 + 1)) & 1) ? -1 : 0) #define K49 (((w1s >> (24 + 7)) & 1) ? -1 : 0) #define K50 (((w1s >> (24 + 6)) & 1) ? -1 : 0) #define K51 (((w1s >> (24 + 5)) & 1) ? -1 : 0) #define K52 (((w1s >> (24 + 4)) & 1) ? -1 : 0) #define K53 (((w1s >> (24 + 3)) & 1) ? -1 : 0) #define K54 (((w1s >> (24 + 2)) & 1) ? -1 : 0) #define K55 (((w1s >> (24 + 1)) & 1) ? -1 : 0) /** * 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 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; #ifdef _unroll #pragma unroll #endif 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 = ffz (tmpResult); const u32 r0 = search[0]; const u32 r1 = search[1]; const u32 r2 = 0; const u32 r3 = 0; #include COMPARE_M } } else { u32 out0[32]; u32 out1[32]; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 32; i++) { out0[i] = out[ 0 + 31 - i]; out1[i] = out[32 + 31 - i]; } transpose32c (out0); transpose32c (out1); #ifdef _unroll #pragma unroll #endif for (int slice = 0; slice < 32; slice++) { const u32 r0 = out0[31 - slice]; const u32 r1 = out1[31 - slice]; const u32 r2 = 0; const u32 r3 = 0; #include COMPARE_M } } } void m01500s (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bs_word_t *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 salt = salt_bufs[salt_pos].salt_buf[0]; /** * digest */ const u32 s0 = digests_buf[0].digest_buf[0]; const u32 s1 = digests_buf[0].digest_buf[1]; #define S00 (((s0 >> 0) & 1) ? -1 : 0) #define S01 (((s0 >> 1) & 1) ? -1 : 0) #define S02 (((s0 >> 2) & 1) ? -1 : 0) #define S03 (((s0 >> 3) & 1) ? -1 : 0) #define S04 (((s0 >> 4) & 1) ? -1 : 0) #define S05 (((s0 >> 5) & 1) ? -1 : 0) #define S06 (((s0 >> 6) & 1) ? -1 : 0) #define S07 (((s0 >> 7) & 1) ? -1 : 0) #define S08 (((s0 >> 8) & 1) ? -1 : 0) #define S09 (((s0 >> 9) & 1) ? -1 : 0) #define S10 (((s0 >> 10) & 1) ? -1 : 0) #define S11 (((s0 >> 11) & 1) ? -1 : 0) #define S12 (((s0 >> 12) & 1) ? -1 : 0) #define S13 (((s0 >> 13) & 1) ? -1 : 0) #define S14 (((s0 >> 14) & 1) ? -1 : 0) #define S15 (((s0 >> 15) & 1) ? -1 : 0) #define S16 (((s0 >> 16) & 1) ? -1 : 0) #define S17 (((s0 >> 17) & 1) ? -1 : 0) #define S18 (((s0 >> 18) & 1) ? -1 : 0) #define S19 (((s0 >> 19) & 1) ? -1 : 0) #define S20 (((s0 >> 20) & 1) ? -1 : 0) #define S21 (((s0 >> 21) & 1) ? -1 : 0) #define S22 (((s0 >> 22) & 1) ? -1 : 0) #define S23 (((s0 >> 23) & 1) ? -1 : 0) #define S24 (((s0 >> 24) & 1) ? -1 : 0) #define S25 (((s0 >> 25) & 1) ? -1 : 0) #define S26 (((s0 >> 26) & 1) ? -1 : 0) #define S27 (((s0 >> 27) & 1) ? -1 : 0) #define S28 (((s0 >> 28) & 1) ? -1 : 0) #define S29 (((s0 >> 29) & 1) ? -1 : 0) #define S30 (((s0 >> 30) & 1) ? -1 : 0) #define S31 (((s0 >> 31) & 1) ? -1 : 0) #define S32 (((s1 >> 0) & 1) ? -1 : 0) #define S33 (((s1 >> 1) & 1) ? -1 : 0) #define S34 (((s1 >> 2) & 1) ? -1 : 0) #define S35 (((s1 >> 3) & 1) ? -1 : 0) #define S36 (((s1 >> 4) & 1) ? -1 : 0) #define S37 (((s1 >> 5) & 1) ? -1 : 0) #define S38 (((s1 >> 6) & 1) ? -1 : 0) #define S39 (((s1 >> 7) & 1) ? -1 : 0) #define S40 (((s1 >> 8) & 1) ? -1 : 0) #define S41 (((s1 >> 9) & 1) ? -1 : 0) #define S42 (((s1 >> 10) & 1) ? -1 : 0) #define S43 (((s1 >> 11) & 1) ? -1 : 0) #define S44 (((s1 >> 12) & 1) ? -1 : 0) #define S45 (((s1 >> 13) & 1) ? -1 : 0) #define S46 (((s1 >> 14) & 1) ? -1 : 0) #define S47 (((s1 >> 15) & 1) ? -1 : 0) #define S48 (((s1 >> 16) & 1) ? -1 : 0) #define S49 (((s1 >> 17) & 1) ? -1 : 0) #define S50 (((s1 >> 18) & 1) ? -1 : 0) #define S51 (((s1 >> 19) & 1) ? -1 : 0) #define S52 (((s1 >> 20) & 1) ? -1 : 0) #define S53 (((s1 >> 21) & 1) ? -1 : 0) #define S54 (((s1 >> 22) & 1) ? -1 : 0) #define S55 (((s1 >> 23) & 1) ? -1 : 0) #define S56 (((s1 >> 24) & 1) ? -1 : 0) #define S57 (((s1 >> 25) & 1) ? -1 : 0) #define S58 (((s1 >> 26) & 1) ? -1 : 0) #define S59 (((s1 >> 27) & 1) ? -1 : 0) #define S60 (((s1 >> 28) & 1) ? -1 : 0) #define S61 (((s1 >> 29) & 1) ? -1 : 0) #define S62 (((s1 >> 30) & 1) ? -1 : 0) #define S63 (((s1 >> 31) & 1) ? -1 : 0) /** * base */ 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; #define K00 (((w0s >> ( 0 + 7)) & 1) ? -1 : 0) #define K01 (((w0s >> ( 0 + 6)) & 1) ? -1 : 0) #define K02 (((w0s >> ( 0 + 5)) & 1) ? -1 : 0) #define K03 (((w0s >> ( 0 + 4)) & 1) ? -1 : 0) #define K04 (((w0s >> ( 0 + 3)) & 1) ? -1 : 0) #define K05 (((w0s >> ( 0 + 2)) & 1) ? -1 : 0) #define K06 (((w0s >> ( 0 + 1)) & 1) ? -1 : 0) #define K07 (((w0s >> ( 8 + 7)) & 1) ? -1 : 0) #define K08 (((w0s >> ( 8 + 6)) & 1) ? -1 : 0) #define K09 (((w0s >> ( 8 + 5)) & 1) ? -1 : 0) #define K10 (((w0s >> ( 8 + 4)) & 1) ? -1 : 0) #define K11 (((w0s >> ( 8 + 3)) & 1) ? -1 : 0) #define K12 (((w0s >> ( 8 + 2)) & 1) ? -1 : 0) #define K13 (((w0s >> ( 8 + 1)) & 1) ? -1 : 0) #define K14 (((w0s >> (16 + 7)) & 1) ? -1 : 0) #define K15 (((w0s >> (16 + 6)) & 1) ? -1 : 0) #define K16 (((w0s >> (16 + 5)) & 1) ? -1 : 0) #define K17 (((w0s >> (16 + 4)) & 1) ? -1 : 0) #define K18 (((w0s >> (16 + 3)) & 1) ? -1 : 0) #define K19 (((w0s >> (16 + 2)) & 1) ? -1 : 0) #define K20 (((w0s >> (16 + 1)) & 1) ? -1 : 0) #define K21 (((w0s >> (24 + 7)) & 1) ? -1 : 0) #define K22 (((w0s >> (24 + 6)) & 1) ? -1 : 0) #define K23 (((w0s >> (24 + 5)) & 1) ? -1 : 0) #define K24 (((w0s >> (24 + 4)) & 1) ? -1 : 0) #define K25 (((w0s >> (24 + 3)) & 1) ? -1 : 0) #define K26 (((w0s >> (24 + 2)) & 1) ? -1 : 0) #define K27 (((w0s >> (24 + 1)) & 1) ? -1 : 0) #define K28 (((w1s >> ( 0 + 7)) & 1) ? -1 : 0) #define K29 (((w1s >> ( 0 + 6)) & 1) ? -1 : 0) #define K30 (((w1s >> ( 0 + 5)) & 1) ? -1 : 0) #define K31 (((w1s >> ( 0 + 4)) & 1) ? -1 : 0) #define K32 (((w1s >> ( 0 + 3)) & 1) ? -1 : 0) #define K33 (((w1s >> ( 0 + 2)) & 1) ? -1 : 0) #define K34 (((w1s >> ( 0 + 1)) & 1) ? -1 : 0) #define K35 (((w1s >> ( 8 + 7)) & 1) ? -1 : 0) #define K36 (((w1s >> ( 8 + 6)) & 1) ? -1 : 0) #define K37 (((w1s >> ( 8 + 5)) & 1) ? -1 : 0) #define K38 (((w1s >> ( 8 + 4)) & 1) ? -1 : 0) #define K39 (((w1s >> ( 8 + 3)) & 1) ? -1 : 0) #define K40 (((w1s >> ( 8 + 2)) & 1) ? -1 : 0) #define K41 (((w1s >> ( 8 + 1)) & 1) ? -1 : 0) #define K42 (((w1s >> (16 + 7)) & 1) ? -1 : 0) #define K43 (((w1s >> (16 + 6)) & 1) ? -1 : 0) #define K44 (((w1s >> (16 + 5)) & 1) ? -1 : 0) #define K45 (((w1s >> (16 + 4)) & 1) ? -1 : 0) #define K46 (((w1s >> (16 + 3)) & 1) ? -1 : 0) #define K47 (((w1s >> (16 + 2)) & 1) ? -1 : 0) #define K48 (((w1s >> (16 + 1)) & 1) ? -1 : 0) #define K49 (((w1s >> (24 + 7)) & 1) ? -1 : 0) #define K50 (((w1s >> (24 + 6)) & 1) ? -1 : 0) #define K51 (((w1s >> (24 + 5)) & 1) ? -1 : 0) #define K52 (((w1s >> (24 + 4)) & 1) ? -1 : 0) #define K53 (((w1s >> (24 + 3)) & 1) ? -1 : 0) #define K54 (((w1s >> (24 + 2)) & 1) ? -1 : 0) #define K55 (((w1s >> (24 + 1)) & 1) ? -1 : 0) /** * 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; 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 = ffz (tmpResult); #include COMPARE_S } // // transpose bitslice mod : attention race conditions, need different buffers for *in and *out // __kernel void m01500_tm (__global u32 *mod, __global bs_word_t *words_buf_r) { const u64 gid = get_global_id (0); const u32 block = gid / 32; const u32 slice = gid % 32; const u32 w0 = mod[gid]; const u32 w0s = (w0 << 1) & 0xfefefefe; #ifdef _unroll #pragma unroll #endif 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 m01500_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bs_word_t *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01500_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bs_word_t *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m01600-optimized.cl000066400000000000000000000616321320027462700174270ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_md5.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #define md5apr1_magic0 0x72706124u #define md5apr1_magic1 0x00002431u void memcat16 (u32 block0[4], u32 block1[4], u32 block2[4], u32 block3[4], const u32 offset, const u32 append[4]) { u32 tmp0; u32 tmp1; u32 tmp2; u32 tmp3; u32 tmp4; const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #if defined IS_AMD || defined IS_GENERIC u32 in0 = swap32_S (append[0]); u32 in1 = swap32_S (append[1]); u32 in2 = swap32_S (append[2]); u32 in3 = swap32_S (append[3]); tmp0 = amd_bytealign ( 0, in0, offset); tmp1 = amd_bytealign (in0, in1, offset); tmp2 = amd_bytealign (in1, in2, offset); tmp3 = amd_bytealign (in2, in3, offset); tmp4 = amd_bytealign (in3, 0, offset); tmp0 = swap32_S (tmp0); tmp1 = swap32_S (tmp1); tmp2 = swap32_S (tmp2); tmp3 = swap32_S (tmp3); tmp4 = swap32_S (tmp4); #endif #ifdef IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; u32 in0 = append[0]; u32 in1 = append[1]; u32 in2 = append[2]; u32 in3 = append[3]; tmp0 = __byte_perm ( 0, in0, selector); tmp1 = __byte_perm (in0, in1, selector); tmp2 = __byte_perm (in1, in2, selector); tmp3 = __byte_perm (in2, in3, selector); tmp4 = __byte_perm (in3, 0, selector); #endif const u32 div = offset / 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; } } void memcat16_x80 (u32 block0[4], u32 block1[4], u32 block2[4], u32 block3[4], const u32 offset, const u32 append[4]) { u32 tmp0; u32 tmp1; u32 tmp2; u32 tmp3; u32 tmp4; const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #if defined IS_AMD || defined IS_GENERIC u32 in0 = swap32_S (append[0]); u32 in1 = swap32_S (append[1]); u32 in2 = swap32_S (append[2]); u32 in3 = swap32_S (append[3]); u32 in4 = 0x80000000; tmp0 = amd_bytealign ( 0, in0, offset); tmp1 = amd_bytealign (in0, in1, offset); tmp2 = amd_bytealign (in1, in2, offset); tmp3 = amd_bytealign (in2, in3, offset); tmp4 = amd_bytealign (in3, in4, offset); tmp0 = swap32_S (tmp0); tmp1 = swap32_S (tmp1); tmp2 = swap32_S (tmp2); tmp3 = swap32_S (tmp3); tmp4 = swap32_S (tmp4); #endif #ifdef IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; u32 in0 = append[0]; u32 in1 = append[1]; u32 in2 = append[2]; u32 in3 = append[3]; u32 in4 = 0x80; tmp0 = __byte_perm ( 0, in0, selector); tmp1 = __byte_perm (in0, in1, selector); tmp2 = __byte_perm (in1, in2, selector); tmp3 = __byte_perm (in2, in3, selector); tmp4 = __byte_perm (in3, in4, selector); #endif const u32 div = offset / 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; } } void memcat8 (u32 block0[4], u32 block1[4], u32 block2[4], u32 block3[4], const u32 offset, const u32 append[2]) { u32 tmp0; u32 tmp1; u32 tmp2; const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #if defined IS_AMD || defined IS_GENERIC u32 in0 = swap32_S (append[0]); u32 in1 = swap32_S (append[1]); tmp0 = amd_bytealign ( 0, in0, offset); tmp1 = amd_bytealign (in0, in1, offset); tmp2 = amd_bytealign (in1, 0, offset); tmp0 = swap32_S (tmp0); tmp1 = swap32_S (tmp1); tmp2 = swap32_S (tmp2); #endif #ifdef IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; u32 in0 = append[0]; u32 in1 = append[1]; tmp0 = __byte_perm ( 0, in0, selector); tmp1 = __byte_perm (in0, in1, selector); tmp2 = __byte_perm (in1, 0, selector); #endif const u32 div = offset / 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; } } void append_sign (u32 block0[4], u32 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 << 8u; block0[1] = md5apr1_magic0 >> 24u | md5apr1_magic1 << 8u; block0[2] = md5apr1_magic1 >> 24u; break; case 2: block0[0] = block0[0] | md5apr1_magic0 << 16u; block0[1] = md5apr1_magic0 >> 16u | md5apr1_magic1 << 16u; block0[2] = md5apr1_magic1 >> 16u; break; case 3: block0[0] = block0[0] | md5apr1_magic0 << 24u; block0[1] = md5apr1_magic0 >> 8u | md5apr1_magic1 << 24u; block0[2] = md5apr1_magic1 >> 8u; break; case 4: block0[1] = md5apr1_magic0; block0[2] = md5apr1_magic1; break; case 5: block0[1] = block0[1] | md5apr1_magic0 << 8u; block0[2] = md5apr1_magic0 >> 24u | md5apr1_magic1 << 8u; block0[3] = md5apr1_magic1 >> 24u; break; case 6: block0[1] = block0[1] | md5apr1_magic0 << 16u; block0[2] = md5apr1_magic0 >> 16u | md5apr1_magic1 << 16u; block0[3] = md5apr1_magic1 >> 16u; break; case 7: block0[1] = block0[1] | md5apr1_magic0 << 24u; block0[2] = md5apr1_magic0 >> 8u | md5apr1_magic1 << 24u; block0[3] = md5apr1_magic1 >> 8u; break; case 8: block0[2] = md5apr1_magic0; block0[3] = md5apr1_magic1; break; case 9: block0[2] = block0[2] | md5apr1_magic0 << 8u; block0[3] = md5apr1_magic0 >> 24u | md5apr1_magic1 << 8u; block1[0] = md5apr1_magic1 >> 24u; break; case 10: block0[2] = block0[2] | md5apr1_magic0 << 16u; block0[3] = md5apr1_magic0 >> 16u | md5apr1_magic1 << 16u; block1[0] = md5apr1_magic1 >> 16u; break; case 11: block0[2] = block0[2] | md5apr1_magic0 << 24u; block0[3] = md5apr1_magic0 >> 8u | md5apr1_magic1 << 24u; block1[0] = md5apr1_magic1 >> 8u; break; case 12: block0[3] = md5apr1_magic0; block1[0] = md5apr1_magic1; break; case 13: block0[3] = block0[3] | md5apr1_magic0 << 8u; block1[0] = md5apr1_magic0 >> 24u | md5apr1_magic1 << 8u; block1[1] = md5apr1_magic1 >> 24u; break; case 14: block0[3] = block0[3] | md5apr1_magic0 << 16u; block1[0] = md5apr1_magic0 >> 16u | md5apr1_magic1 << 16u; block1[1] = md5apr1_magic1 >> 16u; break; case 15: block0[3] = block0[3] | md5apr1_magic0 << 24u; block1[0] = md5apr1_magic0 >> 8u | md5apr1_magic1 << 24u; block1[1] = md5apr1_magic1 >> 8u; break; } } void append_1st (u32 block0[4], u32 block1[4], u32 block2[4], u32 block3[4], const u32 block_len, const u32 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 m01600_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; 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; u32 block0[4]; block0[0] = w0[0]; block0[1] = w0[1]; block0[2] = w0[2]; block0[3] = w0[3]; u32 block1[4]; block1[0] = 0; block1[1] = 0; block1[2] = 0; block1[3] = 0; u32 block2[4]; block2[0] = 0; block2[1] = 0; block2[2] = 0; block2[3] = 0; u32 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_4x4 (block0, block1, block2, block3, block_len); block3[2] = block_len * 8; u32 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_4x4_le_S (digest, pw_len); memcat16 (block0, block1, block2, block3, block_len, digest); block_len += pw_len; /* Then something really weird... */ u32 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_4x4 (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 m01600_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; 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; u32 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_1x4 (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 */ u32 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; u32 block0[4]; block0[0] = 0; block0[1] = 0; block0[2] = 0; block0[3] = 0; u32 block1[4]; block1[0] = 0; block1[1] = 0; block1[2] = 0; block1[3] = 0; u32 block2[4]; block2[0] = 0; block2[1] = 0; block2[2] = 0; block2[3] = 0; u32 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 m01600_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ const u32 r0 = tmps[gid].digest_buf[DGST_R0]; const u32 r1 = tmps[gid].digest_buf[DGST_R1]; const u32 r2 = tmps[gid].digest_buf[DGST_R2]; const u32 r3 = tmps[gid].digest_buf[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m01600.cl000066400000000000000000000157621320027462700154300ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_md5.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #define md5apr1_magic0 0x72706124u #define md5apr1_magic1 0x00002431u __kernel void m01600_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * init */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * prepare */ md5_ctx_t md5_ctx1; md5_init (&md5_ctx1); md5_update (&md5_ctx1, w, pw_len); md5_update (&md5_ctx1, s, salt_len); md5_update (&md5_ctx1, w, pw_len); md5_final (&md5_ctx1); u32 final[16] = { 0 }; final[0] = md5_ctx1.h[0]; final[1] = md5_ctx1.h[1]; final[2] = md5_ctx1.h[2]; final[3] = md5_ctx1.h[3]; md5_ctx_t md5_ctx; md5_init (&md5_ctx); md5_update (&md5_ctx, w, pw_len); u32 m[16] = { 0 }; m[0] = md5apr1_magic0; m[1] = md5apr1_magic1; md5_update (&md5_ctx, m, 6); md5_update (&md5_ctx, s, salt_len); int pl; for (pl = pw_len; pl > 16; pl -= 16) { md5_update (&md5_ctx, final, 16); } truncate_block_4x4_le_S (final, pl); md5_update (&md5_ctx, final, pl); /* Then something really weird... */ for (int i = pw_len; i != 0; i >>= 1) { u32 t[16] = { 0 }; if (i & 1) { t[0] = 0; } else { t[0] = w[0] & 0xff; } md5_update (&md5_ctx, t, 1); } md5_final (&md5_ctx); tmps[gid].digest_buf[0] = md5_ctx.h[0]; tmps[gid].digest_buf[1] = md5_ctx.h[1]; tmps[gid].digest_buf[2] = md5_ctx.h[2]; tmps[gid].digest_buf[3] = md5_ctx.h[3]; } __kernel void m01600_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * init */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * digest */ u32 digest[16] = { 0 }; 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 */ for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) { md5_ctx_t md5_ctx; md5_init (&md5_ctx); if (j & 1) { md5_update (&md5_ctx, w, pw_len); } else { md5_update (&md5_ctx, digest, 16); } if (j % 3) { md5_update (&md5_ctx, s, salt_len); } if (j % 7) { md5_update (&md5_ctx, w, pw_len); } if (j & 1) { md5_update (&md5_ctx, digest, 16); } else { md5_update (&md5_ctx, w, pw_len); } md5_final (&md5_ctx); digest[0] = md5_ctx.h[0]; digest[1] = md5_ctx.h[1]; digest[2] = md5_ctx.h[2]; digest[3] = md5_ctx.h[3]; } 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 m01600_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ const u32 r0 = tmps[gid].digest_buf[DGST_R0]; const u32 r1 = tmps[gid].digest_buf[DGST_R1]; const u32 r2 = tmps[gid].digest_buf[DGST_R2]; const u32 r3 = tmps[gid].digest_buf[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m01700_a0-optimized.cl000066400000000000000000000361621320027462700200100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __constant u64a 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, }; 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); #ifdef _unroll #pragma unroll #endif 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 m01700_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha512 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01700_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01700_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01700_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha512 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01700_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01700_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01700_a0.cl000066400000000000000000000100261320027462700157750ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha512.cl" __kernel void m01700_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha512_ctx_t ctx; sha512_init (&ctx); sha512_update_swap (&ctx, tmp.i, tmp.pw_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01700_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha512_ctx_t ctx; sha512_init (&ctx); sha512_update_swap (&ctx, tmp.i, tmp.pw_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01700_a1-optimized.cl000066400000000000000000000445511320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u64a 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, }; 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); #ifdef _unroll #pragma unroll #endif 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 m01700_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01700_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01700_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01700_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01700_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01700_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01700_a1.cl000066400000000000000000000077651320027462700160160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha512.cl" __kernel void m01700_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha512_ctx_t ctx = ctx0; sha512_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01700_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha512_ctx_t ctx = ctx0; sha512_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01700_a3-optimized.cl000066400000000000000000000530251320027462700200100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u64a 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, }; 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); #ifdef _unroll #pragma unroll #endif 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; } void m01700m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } void m01700s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01700_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01700_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01700_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01700_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01700_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01700_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m01700_a3.cl000066400000000000000000000105231320027462700160020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" __kernel void m01700_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha512_ctx_vector_t ctx; sha512_init_vector (&ctx); sha512_update_vector (&ctx, w, pw_len); sha512_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.h[7]); const u32x r1 = h32_from_64 (ctx.h[7]); const u32x r2 = l32_from_64 (ctx.h[3]); const u32x r3 = h32_from_64 (ctx.h[3]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01700_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha512_ctx_vector_t ctx; sha512_init_vector (&ctx); sha512_update_vector (&ctx, w, pw_len); sha512_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.h[7]); const u32x r1 = h32_from_64 (ctx.h[7]); const u32x r2 = l32_from_64 (ctx.h[3]); const u32x r3 = h32_from_64 (ctx.h[3]); COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01710_a0-optimized.cl000066400000000000000000000454601320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __constant u64a 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, }; 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); #ifdef _unroll #pragma unroll #endif 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 m01710_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); const u32x 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]; /** * sha512 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01710_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01710_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01710_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); const u32x 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]; /** * sha512 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01710_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01710_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01710_a0.cl000066400000000000000000000107741320027462700160100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha512.cl" __kernel void m01710_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha512_ctx_t ctx; sha512_init (&ctx); sha512_update_swap (&ctx, tmp.i, tmp.pw_len); sha512_update (&ctx, s, salt_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01710_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha512_ctx_t ctx; sha512_init (&ctx); sha512_update_swap (&ctx, tmp.i, tmp.pw_len); sha512_update (&ctx, s, salt_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01710_a1-optimized.cl000066400000000000000000000541731320027462700200140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u64a 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, }; 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); #ifdef _unroll #pragma unroll #endif 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 m01710_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); const u32x 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] |= s3[2]; w3[3] |= s3[3]; /** * sha512 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01710_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01710_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01710_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); const u32x 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] |= s3[2]; w3[3] |= s3[3]; /** * sha512 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01710_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01710_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01710_a1.cl000066400000000000000000000107331320027462700160040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha512.cl" __kernel void m01710_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha512_ctx_t ctx = ctx0; sha512_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha512_update (&ctx, s, salt_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01710_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha512_ctx_t ctx = ctx0; sha512_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha512_update (&ctx, s, salt_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01710_a3-optimized.cl000066400000000000000000000563051320027462700200150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u64a 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, }; 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); #ifdef _unroll #pragma unroll #endif 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; } void m01710m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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]; switch_buffer_by_offset_le_S (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); w[ 0] |= swap32_S (salt_buf0[0]); w[ 1] |= swap32_S (salt_buf0[1]); w[ 2] |= swap32_S (salt_buf0[2]); w[ 3] |= swap32_S (salt_buf0[3]); w[ 4] |= swap32_S (salt_buf1[0]); w[ 5] |= swap32_S (salt_buf1[1]); w[ 6] |= swap32_S (salt_buf1[2]); w[ 7] |= swap32_S (salt_buf1[3]); w[ 8] |= swap32_S (salt_buf2[0]); w[ 9] |= swap32_S (salt_buf2[1]); w[10] |= swap32_S (salt_buf2[2]); w[11] |= swap32_S (salt_buf2[3]); w[12] |= swap32_S (salt_buf3[0]); w[13] |= swap32_S (salt_buf3[1]); w[14] |= swap32_S (salt_buf3[2]); w[15] |= swap32_S (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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } void m01710s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01710_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01710_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01710_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01710_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01710_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01710_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m01710_a3.cl000066400000000000000000000115111320027462700160010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" __kernel void m01710_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha512_ctx_vector_t ctx; sha512_init_vector (&ctx); sha512_update_vector (&ctx, w, pw_len); sha512_update_vector (&ctx, s, salt_len); sha512_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.h[7]); const u32x r1 = h32_from_64 (ctx.h[7]); const u32x r2 = l32_from_64 (ctx.h[3]); const u32x r3 = h32_from_64 (ctx.h[3]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01710_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha512_ctx_vector_t ctx; sha512_init_vector (&ctx); sha512_update_vector (&ctx, w, pw_len); sha512_update_vector (&ctx, s, salt_len); sha512_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.h[7]); const u32x r1 = h32_from_64 (ctx.h[7]); const u32x r2 = l32_from_64 (ctx.h[3]); const u32x r3 = h32_from_64 (ctx.h[3]); COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01720_a0-optimized.cl000066400000000000000000000443041320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __constant u64a 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, }; 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); #ifdef _unroll #pragma unroll #endif 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 m01720_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * prepend salt */ const u32x out_salt_len = out_len + salt_len; switch_buffer_by_offset_le_VV (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]; 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]; append_0x80_4x4_VV (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] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01720_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01720_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01720_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * prepend salt */ const u32x out_salt_len = out_len + salt_len; switch_buffer_by_offset_le_VV (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]; 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]; append_0x80_4x4_VV (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] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01720_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01720_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01720_a0.cl000066400000000000000000000104221320027462700157770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha512.cl" __kernel void m01720_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha512_ctx_t ctx = ctx0; sha512_update_swap (&ctx, tmp.i, tmp.pw_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01720_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha512_ctx_t ctx = ctx0; sha512_update_swap (&ctx, tmp.i, tmp.pw_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01720_a1-optimized.cl000066400000000000000000000526271320027462700200170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u64a 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, }; 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); #ifdef _unroll #pragma unroll #endif 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 m01720_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len + 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]; 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]; /** * sha512 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01720_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01720_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01720_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len + 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]; 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]; /** * sha512 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01720_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01720_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01720_a1.cl000066400000000000000000000102711320027462700160020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha512.cl" __kernel void m01720_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha512_ctx_t ctx = ctx0; sha512_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01720_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha512_ctx_t ctx = ctx0; sha512_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01720_a3-optimized.cl000066400000000000000000000620331320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u64a 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, }; 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); #ifdef _unroll #pragma unroll #endif 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; } void m01720m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; switch_buffer_by_offset_be (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = 0; t3[3] = pw_salt_len * 8; /** * sha512 */ 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); 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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } void m01720s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; switch_buffer_by_offset_be (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = 0; t3[3] = pw_salt_len * 8; /** * sha512 */ 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); 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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01720_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01720_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01720_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01720_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01720_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01720_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m01720_a3.cl000066400000000000000000000112311320027462700160010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" __kernel void m01720_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha512_ctx_vector_t ctx; sha512_init_vector_from_scalar (&ctx, &ctx0); sha512_update_vector (&ctx, w, pw_len); sha512_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.h[7]); const u32x r1 = h32_from_64 (ctx.h[7]); const u32x r2 = l32_from_64 (ctx.h[3]); const u32x r3 = h32_from_64 (ctx.h[3]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01720_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha512_ctx_vector_t ctx; sha512_init_vector_from_scalar (&ctx, &ctx0); sha512_update_vector (&ctx, w, pw_len); sha512_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.h[7]); const u32x r1 = h32_from_64 (ctx.h[7]); const u32x r2 = l32_from_64 (ctx.h[3]); const u32x r3 = h32_from_64 (ctx.h[3]); COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01730_a0-optimized.cl000066400000000000000000000460021320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __constant u64a 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, }; 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); #ifdef _unroll #pragma unroll #endif 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 m01730_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len2); const u32x pw_salt_len = out_len2 + 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]; /** * sha512 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01730_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01730_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01730_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len2); const u32x pw_salt_len = out_len2 + 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]; /** * sha512 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01730_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01730_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01730_a0.cl000066400000000000000000000110141320027462700157760ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha512.cl" __kernel void m01730_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha512_ctx_t ctx; sha512_init (&ctx); sha512_update_utf16le_swap (&ctx, tmp.i, tmp.pw_len); sha512_update (&ctx, s, salt_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01730_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha512_ctx_t ctx; sha512_init (&ctx); sha512_update_utf16le_swap (&ctx, tmp.i, tmp.pw_len); sha512_update (&ctx, s, salt_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01730_a1-optimized.cl000066400000000000000000000545111320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u64a 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, }; 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); #ifdef _unroll #pragma unroll #endif 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 m01730_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len2); const u32x pw_salt_len = pw_len2 + 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]; /** * sha512 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01730_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01730_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01730_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len2); const u32x pw_salt_len = pw_len2 + 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]; /** * sha512 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01730_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01730_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01730_a1.cl000066400000000000000000000107731320027462700160120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha512.cl" __kernel void m01730_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_utf16le_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha512_ctx_t ctx = ctx0; sha512_update_global_utf16le_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha512_update (&ctx, s, salt_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01730_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_utf16le_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha512_ctx_t ctx = ctx0; sha512_update_global_utf16le_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha512_update (&ctx, s, salt_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01730_a3-optimized.cl000066400000000000000000000563051320027462700200170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u64a 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, }; 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); #ifdef _unroll #pragma unroll #endif 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; } void m01730m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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]; switch_buffer_by_offset_le_S (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); w[ 0] |= swap32_S (salt_buf0[0]); w[ 1] |= swap32_S (salt_buf0[1]); w[ 2] |= swap32_S (salt_buf0[2]); w[ 3] |= swap32_S (salt_buf0[3]); w[ 4] |= swap32_S (salt_buf1[0]); w[ 5] |= swap32_S (salt_buf1[1]); w[ 6] |= swap32_S (salt_buf1[2]); w[ 7] |= swap32_S (salt_buf1[3]); w[ 8] |= swap32_S (salt_buf2[0]); w[ 9] |= swap32_S (salt_buf2[1]); w[10] |= swap32_S (salt_buf2[2]); w[11] |= swap32_S (salt_buf2[3]); w[12] |= swap32_S (salt_buf3[0]); w[13] |= swap32_S (salt_buf3[1]); w[14] |= swap32_S (salt_buf3[2]); w[15] |= swap32_S (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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } void m01730s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01730_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01730_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01730_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01730_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01730_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01730_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m01730_a3.cl000066400000000000000000000115331320027462700160070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" __kernel void m01730_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha512_ctx_vector_t ctx; sha512_init_vector (&ctx); sha512_update_vector_utf16beN (&ctx, w, pw_len); sha512_update_vector (&ctx, s, salt_len); sha512_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.h[7]); const u32x r1 = h32_from_64 (ctx.h[7]); const u32x r2 = l32_from_64 (ctx.h[3]); const u32x r3 = h32_from_64 (ctx.h[3]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01730_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha512_ctx_vector_t ctx; sha512_init_vector (&ctx); sha512_update_vector_utf16beN (&ctx, w, pw_len); sha512_update_vector (&ctx, s, salt_len); sha512_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.h[7]); const u32x r1 = h32_from_64 (ctx.h[7]); const u32x r2 = l32_from_64 (ctx.h[3]); const u32x r3 = h32_from_64 (ctx.h[3]); COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01740_a0-optimized.cl000066400000000000000000000446241320027462700200160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __constant u64a 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, }; 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); #ifdef _unroll #pragma unroll #endif 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 m01740_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * prepend salt */ const u32x out_salt_len = out_len2 + salt_len; switch_buffer_by_offset_le_VV (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]; 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]; append_0x80_4x4_VV (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] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01740_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01740_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01740_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * prepend salt */ const u32x out_salt_len = out_len2 + salt_len; switch_buffer_by_offset_le_VV (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]; 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]; append_0x80_4x4_VV (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] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01740_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01740_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01740_a0.cl000066400000000000000000000104421320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha512.cl" __kernel void m01740_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha512_ctx_t ctx = ctx0; sha512_update_utf16le_swap (&ctx, tmp.i, tmp.pw_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01740_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha512_ctx_t ctx = ctx0; sha512_update_utf16le_swap (&ctx, tmp.i, tmp.pw_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01740_a1-optimized.cl000066400000000000000000000531431320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u64a 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, }; 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); #ifdef _unroll #pragma unroll #endif 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 m01740_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len2 + 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]; 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]; /** * sha512 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01740_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01740_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01740_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len2 + 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]; 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]; /** * sha512 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01740_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01740_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01740_a1.cl000066400000000000000000000103311320027462700160010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha512.cl" __kernel void m01740_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha512_update_global_utf16le_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha512_ctx_t ctx = ctx0; sha512_update_global_utf16le_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01740_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha512_update_global_utf16le_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha512_ctx_t ctx = ctx0; sha512_update_global_utf16le_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01740_a3-optimized.cl000066400000000000000000000620331320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u64a 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, }; 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); #ifdef _unroll #pragma unroll #endif 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; } void m01740m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; switch_buffer_by_offset_be (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = 0; t3[3] = pw_salt_len * 8; /** * sha512 */ 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); 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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } void m01740s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; switch_buffer_by_offset_be (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = 0; t3[3] = pw_salt_len * 8; /** * sha512 */ 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); 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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01740_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01740_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01740_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01740_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01740_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01740_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m01740_a3.cl000066400000000000000000000112531320027462700160070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" __kernel void m01740_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha512_ctx_vector_t ctx; sha512_init_vector_from_scalar (&ctx, &ctx0); sha512_update_vector_utf16beN (&ctx, w, pw_len); sha512_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.h[7]); const u32x r1 = h32_from_64 (ctx.h[7]); const u32x r2 = l32_from_64 (ctx.h[3]); const u32x r3 = h32_from_64 (ctx.h[3]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01740_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha512_ctx_vector_t ctx; sha512_init_vector_from_scalar (&ctx, &ctx0); sha512_update_vector_utf16beN (&ctx, w, pw_len); sha512_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.h[7]); const u32x r1 = h32_from_64 (ctx.h[7]); const u32x r2 = l32_from_64 (ctx.h[3]); const u32x r3 = h32_from_64 (ctx.h[3]); COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01750_a0-optimized.cl000066400000000000000000000437671320027462700200260ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" void sha512_transform_transport_vector (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) { u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; u32x t4[4]; u32x t5[4]; u32x t6[4]; u32x t7[4]; t0[0] = h32_from_64 (w0[0]); t0[1] = l32_from_64 (w0[0]); t0[2] = h32_from_64 (w0[1]); t0[3] = l32_from_64 (w0[1]); t1[0] = h32_from_64 (w0[2]); t1[1] = l32_from_64 (w0[2]); t1[2] = h32_from_64 (w0[3]); t1[3] = l32_from_64 (w0[3]); t2[0] = h32_from_64 (w1[0]); t2[1] = l32_from_64 (w1[0]); t2[2] = h32_from_64 (w1[1]); t2[3] = l32_from_64 (w1[1]); t3[0] = h32_from_64 (w1[2]); t3[1] = l32_from_64 (w1[2]); t3[2] = h32_from_64 (w1[3]); t3[3] = l32_from_64 (w1[3]); t4[0] = h32_from_64 (w2[0]); t4[1] = l32_from_64 (w2[0]); t4[2] = h32_from_64 (w2[1]); t4[3] = l32_from_64 (w2[1]); t5[0] = h32_from_64 (w2[2]); t5[1] = l32_from_64 (w2[2]); t5[2] = h32_from_64 (w2[3]); t5[3] = l32_from_64 (w2[3]); t6[0] = h32_from_64 (w3[0]); t6[1] = l32_from_64 (w3[0]); t6[2] = h32_from_64 (w3[1]); t6[3] = l32_from_64 (w3[1]); t7[0] = h32_from_64 (w3[2]); t7[1] = l32_from_64 (w3[2]); t7[2] = h32_from_64 (w3[3]); t7[3] = l32_from_64 (w3[3]); sha512_transform_vector (t0, t1, t2, t3, t4, t5, t6, t7, digest); } 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]) ^ (u64x) 0x3636363636363636; w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ (u64x) 0x3636363636363636; w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ (u64x) 0x3636363636363636; w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ (u64x) 0x3636363636363636; w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ (u64x) 0x3636363636363636; w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ (u64x) 0x3636363636363636; w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ (u64x) 0x3636363636363636; w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ (u64x) 0x3636363636363636; w2_t[0] = (u64x) 0x3636363636363636; w2_t[1] = (u64x) 0x3636363636363636; w2_t[2] = (u64x) 0x3636363636363636; w2_t[3] = (u64x) 0x3636363636363636; w3_t[0] = (u64x) 0x3636363636363636; w3_t[1] = (u64x) 0x3636363636363636; w3_t[2] = (u64x) 0x3636363636363636; w3_t[3] = (u64x) 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_transport_vector (w0_t, w1_t, w2_t, w3_t, ipad); w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[0] = (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[1] = (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[2] = (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[3] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[0] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[1] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[2] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[3] = (u64x) 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_transport_vector (w0_t, w1_t, w2_t, w3_t, opad); } 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_transport_vector (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_transport_vector (w0_t, w1_t, w2_t, w3_t, digest); } __kernel void m01750_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); /** * pads */ u64x ipad[8]; u64x opad[8]; hmac_sha512_pad (w0, w1, w2, w3, ipad, opad); 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] = 0; w3[3] = (128 + salt_len) * 8; u64x digest[8]; hmac_sha512_run (w0, w1, w2, w3, 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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01750_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01750_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01750_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); /** * pads */ u64x ipad[8]; u64x opad[8]; hmac_sha512_pad (w0, w1, w2, w3, ipad, opad); 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] = 0; w3[3] = (128 + salt_len) * 8; u64x digest[8]; hmac_sha512_run (w0, w1, w2, w3, 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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01750_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01750_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01750_a0.cl000066400000000000000000000110261320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha512.cl" __kernel void m01750_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha512_hmac_ctx_t ctx; sha512_hmac_init_swap (&ctx, tmp.i, tmp.pw_len); sha512_hmac_update (&ctx, s, salt_len); sha512_hmac_final (&ctx); const u32 r0 = l32_from_64_S (ctx.opad.h[7]); const u32 r1 = h32_from_64_S (ctx.opad.h[7]); const u32 r2 = l32_from_64_S (ctx.opad.h[3]); const u32 r3 = h32_from_64_S (ctx.opad.h[3]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01750_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha512_hmac_ctx_t ctx; sha512_hmac_init_swap (&ctx, tmp.i, tmp.pw_len); sha512_hmac_update (&ctx, s, salt_len); sha512_hmac_final (&ctx); const u32 r0 = l32_from_64_S (ctx.opad.h[7]); const u32 r1 = h32_from_64_S (ctx.opad.h[7]); const u32 r2 = l32_from_64_S (ctx.opad.h[3]); const u32 r3 = h32_from_64_S (ctx.opad.h[3]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01750_a1-optimized.cl000066400000000000000000000534601320027462700200160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" void sha512_transform_transport_vector (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) { u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; u32x t4[4]; u32x t5[4]; u32x t6[4]; u32x t7[4]; t0[0] = h32_from_64 (w0[0]); t0[1] = l32_from_64 (w0[0]); t0[2] = h32_from_64 (w0[1]); t0[3] = l32_from_64 (w0[1]); t1[0] = h32_from_64 (w0[2]); t1[1] = l32_from_64 (w0[2]); t1[2] = h32_from_64 (w0[3]); t1[3] = l32_from_64 (w0[3]); t2[0] = h32_from_64 (w1[0]); t2[1] = l32_from_64 (w1[0]); t2[2] = h32_from_64 (w1[1]); t2[3] = l32_from_64 (w1[1]); t3[0] = h32_from_64 (w1[2]); t3[1] = l32_from_64 (w1[2]); t3[2] = h32_from_64 (w1[3]); t3[3] = l32_from_64 (w1[3]); t4[0] = h32_from_64 (w2[0]); t4[1] = l32_from_64 (w2[0]); t4[2] = h32_from_64 (w2[1]); t4[3] = l32_from_64 (w2[1]); t5[0] = h32_from_64 (w2[2]); t5[1] = l32_from_64 (w2[2]); t5[2] = h32_from_64 (w2[3]); t5[3] = l32_from_64 (w2[3]); t6[0] = h32_from_64 (w3[0]); t6[1] = l32_from_64 (w3[0]); t6[2] = h32_from_64 (w3[1]); t6[3] = l32_from_64 (w3[1]); t7[0] = h32_from_64 (w3[2]); t7[1] = l32_from_64 (w3[2]); t7[2] = h32_from_64 (w3[3]); t7[3] = l32_from_64 (w3[3]); sha512_transform_vector (t0, t1, t2, t3, t4, t5, t6, t7, digest); } 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]) ^ (u64x) 0x3636363636363636; w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ (u64x) 0x3636363636363636; w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ (u64x) 0x3636363636363636; w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ (u64x) 0x3636363636363636; w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ (u64x) 0x3636363636363636; w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ (u64x) 0x3636363636363636; w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ (u64x) 0x3636363636363636; w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ (u64x) 0x3636363636363636; w2_t[0] = (u64x) 0x3636363636363636; w2_t[1] = (u64x) 0x3636363636363636; w2_t[2] = (u64x) 0x3636363636363636; w2_t[3] = (u64x) 0x3636363636363636; w3_t[0] = (u64x) 0x3636363636363636; w3_t[1] = (u64x) 0x3636363636363636; w3_t[2] = (u64x) 0x3636363636363636; w3_t[3] = (u64x) 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_transport_vector (w0_t, w1_t, w2_t, w3_t, ipad); w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[0] = (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[1] = (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[2] = (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[3] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[0] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[1] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[2] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[3] = (u64x) 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_transport_vector (w0_t, w1_t, w2_t, w3_t, opad); } 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_transport_vector (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_transport_vector (w0_t, w1_t, w2_t, w3_t, digest); } __kernel void m01750_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); /** * pads */ u64x ipad[8]; u64x opad[8]; hmac_sha512_pad (w0, w1, w2, w3, ipad, opad); 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] = 0; w3[3] = (128 + salt_len) * 8; u64x digest[8]; hmac_sha512_run (w0, w1, w2, w3, 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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01750_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01750_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01750_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); /** * pads */ u64x ipad[8]; u64x opad[8]; hmac_sha512_pad (w0, w1, w2, w3, ipad, opad); 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] = 0; w3[3] = (128 + salt_len) * 8; u64x digest[8]; hmac_sha512_run (w0, w1, w2, w3, 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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01750_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01750_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01750_a1.cl000066400000000000000000000125051320027462700160070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha512.cl" __kernel void m01750_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (pws[gid].i[idx]); } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = swap32_S (combs_buf[il_pos].i[idx]); } switch_buffer_by_offset_1x64_be_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } sha512_hmac_ctx_t ctx; sha512_hmac_init (&ctx, c, pw_len + comb_len); sha512_hmac_update (&ctx, s, salt_len); sha512_hmac_final (&ctx); const u32 r0 = l32_from_64_S (ctx.opad.h[7]); const u32 r1 = h32_from_64_S (ctx.opad.h[7]); const u32 r2 = l32_from_64_S (ctx.opad.h[3]); const u32 r3 = h32_from_64_S (ctx.opad.h[3]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01750_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (pws[gid].i[idx]); } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = swap32_S (combs_buf[il_pos].i[idx]); } switch_buffer_by_offset_1x64_be_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } sha512_hmac_ctx_t ctx; sha512_hmac_init (&ctx, c, pw_len + comb_len); sha512_hmac_update (&ctx, s, salt_len); sha512_hmac_final (&ctx); const u32 r0 = l32_from_64_S (ctx.opad.h[7]); const u32 r1 = h32_from_64_S (ctx.opad.h[7]); const u32 r2 = l32_from_64_S (ctx.opad.h[3]); const u32 r3 = h32_from_64_S (ctx.opad.h[3]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01750_a3-optimized.cl000066400000000000000000000625021320027462700200150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" void sha512_transform_transport_vector (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) { u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; u32x t4[4]; u32x t5[4]; u32x t6[4]; u32x t7[4]; t0[0] = h32_from_64 (w0[0]); t0[1] = l32_from_64 (w0[0]); t0[2] = h32_from_64 (w0[1]); t0[3] = l32_from_64 (w0[1]); t1[0] = h32_from_64 (w0[2]); t1[1] = l32_from_64 (w0[2]); t1[2] = h32_from_64 (w0[3]); t1[3] = l32_from_64 (w0[3]); t2[0] = h32_from_64 (w1[0]); t2[1] = l32_from_64 (w1[0]); t2[2] = h32_from_64 (w1[1]); t2[3] = l32_from_64 (w1[1]); t3[0] = h32_from_64 (w1[2]); t3[1] = l32_from_64 (w1[2]); t3[2] = h32_from_64 (w1[3]); t3[3] = l32_from_64 (w1[3]); t4[0] = h32_from_64 (w2[0]); t4[1] = l32_from_64 (w2[0]); t4[2] = h32_from_64 (w2[1]); t4[3] = l32_from_64 (w2[1]); t5[0] = h32_from_64 (w2[2]); t5[1] = l32_from_64 (w2[2]); t5[2] = h32_from_64 (w2[3]); t5[3] = l32_from_64 (w2[3]); t6[0] = h32_from_64 (w3[0]); t6[1] = l32_from_64 (w3[0]); t6[2] = h32_from_64 (w3[1]); t6[3] = l32_from_64 (w3[1]); t7[0] = h32_from_64 (w3[2]); t7[1] = l32_from_64 (w3[2]); t7[2] = h32_from_64 (w3[3]); t7[3] = l32_from_64 (w3[3]); sha512_transform_vector (t0, t1, t2, t3, t4, t5, t6, t7, digest); } 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_transport_vector (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_transport_vector (w0_t, w1_t, w2_t, w3_t, opad); } 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_transport_vector (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_transport_vector (w0_t, w1_t, w2_t, w3_t, digest); } void m01750m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * pads */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; u64x ipad[8]; u64x opad[8]; hmac_sha512_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] = (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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } void m01750s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * pads */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; u64x ipad[8]; u64x opad[8]; hmac_sha512_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] = (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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01750_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01750_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01750_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01750_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01750_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01750_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m01750_a3.cl000066400000000000000000000115251320027462700160120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" __kernel void m01750_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha512_hmac_ctx_vector_t ctx; sha512_hmac_init_vector (&ctx, w, pw_len); sha512_hmac_update_vector (&ctx, s, salt_len); sha512_hmac_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.opad.h[7]); const u32x r1 = h32_from_64 (ctx.opad.h[7]); const u32x r2 = l32_from_64 (ctx.opad.h[3]); const u32x r3 = h32_from_64 (ctx.opad.h[3]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01750_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha512_hmac_ctx_vector_t ctx; sha512_hmac_init_vector (&ctx, w, pw_len); sha512_hmac_update_vector (&ctx, s, salt_len); sha512_hmac_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.opad.h[7]); const u32x r1 = h32_from_64 (ctx.opad.h[7]); const u32x r2 = l32_from_64 (ctx.opad.h[3]); const u32x r3 = h32_from_64 (ctx.opad.h[3]); COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01760_a0-optimized.cl000066400000000000000000000451331320027462700200140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" void sha512_transform_transport_vector (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) { u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; u32x t4[4]; u32x t5[4]; u32x t6[4]; u32x t7[4]; t0[0] = h32_from_64 (w0[0]); t0[1] = l32_from_64 (w0[0]); t0[2] = h32_from_64 (w0[1]); t0[3] = l32_from_64 (w0[1]); t1[0] = h32_from_64 (w0[2]); t1[1] = l32_from_64 (w0[2]); t1[2] = h32_from_64 (w0[3]); t1[3] = l32_from_64 (w0[3]); t2[0] = h32_from_64 (w1[0]); t2[1] = l32_from_64 (w1[0]); t2[2] = h32_from_64 (w1[1]); t2[3] = l32_from_64 (w1[1]); t3[0] = h32_from_64 (w1[2]); t3[1] = l32_from_64 (w1[2]); t3[2] = h32_from_64 (w1[3]); t3[3] = l32_from_64 (w1[3]); t4[0] = h32_from_64 (w2[0]); t4[1] = l32_from_64 (w2[0]); t4[2] = h32_from_64 (w2[1]); t4[3] = l32_from_64 (w2[1]); t5[0] = h32_from_64 (w2[2]); t5[1] = l32_from_64 (w2[2]); t5[2] = h32_from_64 (w2[3]); t5[3] = l32_from_64 (w2[3]); t6[0] = h32_from_64 (w3[0]); t6[1] = l32_from_64 (w3[0]); t6[2] = h32_from_64 (w3[1]); t6[3] = l32_from_64 (w3[1]); t7[0] = h32_from_64 (w3[2]); t7[1] = l32_from_64 (w3[2]); t7[2] = h32_from_64 (w3[3]); t7[3] = l32_from_64 (w3[3]); sha512_transform_vector (t0, t1, t2, t3, t4, t5, t6, t7, digest); } 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]) ^ (u64x) 0x3636363636363636; w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ (u64x) 0x3636363636363636; w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ (u64x) 0x3636363636363636; w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ (u64x) 0x3636363636363636; w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ (u64x) 0x3636363636363636; w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ (u64x) 0x3636363636363636; w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ (u64x) 0x3636363636363636; w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ (u64x) 0x3636363636363636; w2_t[0] = (u64x) 0x3636363636363636; w2_t[1] = (u64x) 0x3636363636363636; w2_t[2] = (u64x) 0x3636363636363636; w2_t[3] = (u64x) 0x3636363636363636; w3_t[0] = (u64x) 0x3636363636363636; w3_t[1] = (u64x) 0x3636363636363636; w3_t[2] = (u64x) 0x3636363636363636; w3_t[3] = (u64x) 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_transport_vector (w0_t, w1_t, w2_t, w3_t, ipad); w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[0] = (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[1] = (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[2] = (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[3] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[0] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[1] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[2] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[3] = (u64x) 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_transport_vector (w0_t, w1_t, w2_t, w3_t, opad); } 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_transport_vector (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_transport_vector (w0_t, w1_t, w2_t, w3_t, digest); } __kernel void m01760_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01760_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01760_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01760_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01760_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01760_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01760_a0.cl000066400000000000000000000111301320027462700160000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha512.cl" __kernel void m01760_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha512_hmac_ctx_t ctx0; sha512_hmac_init (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha512_hmac_ctx_t ctx = ctx0; sha512_hmac_update_swap (&ctx, tmp.i, tmp.pw_len); sha512_hmac_final (&ctx); const u32 r0 = l32_from_64_S (ctx.opad.h[7]); const u32 r1 = h32_from_64_S (ctx.opad.h[7]); const u32 r2 = l32_from_64_S (ctx.opad.h[3]); const u32 r3 = h32_from_64_S (ctx.opad.h[3]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01760_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha512_hmac_ctx_t ctx0; sha512_hmac_init (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha512_hmac_ctx_t ctx = ctx0; sha512_hmac_update_swap (&ctx, tmp.i, tmp.pw_len); sha512_hmac_final (&ctx); const u32 r0 = l32_from_64_S (ctx.opad.h[7]); const u32 r1 = h32_from_64_S (ctx.opad.h[7]); const u32 r2 = l32_from_64_S (ctx.opad.h[3]); const u32 r3 = h32_from_64_S (ctx.opad.h[3]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01760_a1-optimized.cl000066400000000000000000000540021320027462700200100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" void sha512_transform_transport_vector (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) { u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; u32x t4[4]; u32x t5[4]; u32x t6[4]; u32x t7[4]; t0[0] = h32_from_64 (w0[0]); t0[1] = l32_from_64 (w0[0]); t0[2] = h32_from_64 (w0[1]); t0[3] = l32_from_64 (w0[1]); t1[0] = h32_from_64 (w0[2]); t1[1] = l32_from_64 (w0[2]); t1[2] = h32_from_64 (w0[3]); t1[3] = l32_from_64 (w0[3]); t2[0] = h32_from_64 (w1[0]); t2[1] = l32_from_64 (w1[0]); t2[2] = h32_from_64 (w1[1]); t2[3] = l32_from_64 (w1[1]); t3[0] = h32_from_64 (w1[2]); t3[1] = l32_from_64 (w1[2]); t3[2] = h32_from_64 (w1[3]); t3[3] = l32_from_64 (w1[3]); t4[0] = h32_from_64 (w2[0]); t4[1] = l32_from_64 (w2[0]); t4[2] = h32_from_64 (w2[1]); t4[3] = l32_from_64 (w2[1]); t5[0] = h32_from_64 (w2[2]); t5[1] = l32_from_64 (w2[2]); t5[2] = h32_from_64 (w2[3]); t5[3] = l32_from_64 (w2[3]); t6[0] = h32_from_64 (w3[0]); t6[1] = l32_from_64 (w3[0]); t6[2] = h32_from_64 (w3[1]); t6[3] = l32_from_64 (w3[1]); t7[0] = h32_from_64 (w3[2]); t7[1] = l32_from_64 (w3[2]); t7[2] = h32_from_64 (w3[3]); t7[3] = l32_from_64 (w3[3]); sha512_transform_vector (t0, t1, t2, t3, t4, t5, t6, t7, digest); } 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]) ^ (u64x) 0x3636363636363636; w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ (u64x) 0x3636363636363636; w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ (u64x) 0x3636363636363636; w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ (u64x) 0x3636363636363636; w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ (u64x) 0x3636363636363636; w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ (u64x) 0x3636363636363636; w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ (u64x) 0x3636363636363636; w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ (u64x) 0x3636363636363636; w2_t[0] = (u64x) 0x3636363636363636; w2_t[1] = (u64x) 0x3636363636363636; w2_t[2] = (u64x) 0x3636363636363636; w2_t[3] = (u64x) 0x3636363636363636; w3_t[0] = (u64x) 0x3636363636363636; w3_t[1] = (u64x) 0x3636363636363636; w3_t[2] = (u64x) 0x3636363636363636; w3_t[3] = (u64x) 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_transport_vector (w0_t, w1_t, w2_t, w3_t, ipad); w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[0] = (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[1] = (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[2] = (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[3] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[0] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[1] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[2] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[3] = (u64x) 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_transport_vector (w0_t, w1_t, w2_t, w3_t, opad); } 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_transport_vector (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_transport_vector (w0_t, w1_t, w2_t, w3_t, digest); } __kernel void m01760_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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_4x4_VV (w0, w1, w2, w3, pw_len); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = 0; w3[3] = (128 + pw_len) * 8; u64x digest[8]; hmac_sha512_run (w0, w1, w2, w3, 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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01760_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01760_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01760_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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_4x4_VV (w0, w1, w2, w3, pw_len); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = 0; w3[3] = (128 + pw_len) * 8; u64x digest[8]; hmac_sha512_run (w0, w1, w2, w3, 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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01760_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m01760_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m01760_a1.cl000066400000000000000000000126071320027462700160130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha512.cl" __kernel void m01760_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (pws[gid].i[idx]); } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha512_hmac_ctx_t ctx0; sha512_hmac_init (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = swap32_S (combs_buf[il_pos].i[idx]); } switch_buffer_by_offset_1x64_be_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } sha512_hmac_ctx_t ctx = ctx0; sha512_hmac_update (&ctx, c, pw_len + comb_len); sha512_hmac_final (&ctx); const u32 r0 = l32_from_64_S (ctx.opad.h[7]); const u32 r1 = h32_from_64_S (ctx.opad.h[7]); const u32 r2 = l32_from_64_S (ctx.opad.h[3]); const u32 r3 = h32_from_64_S (ctx.opad.h[3]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m01760_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (pws[gid].i[idx]); } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha512_hmac_ctx_t ctx0; sha512_hmac_init (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = swap32_S (combs_buf[il_pos].i[idx]); } switch_buffer_by_offset_1x64_be_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } sha512_hmac_ctx_t ctx = ctx0; sha512_hmac_update (&ctx, c, pw_len + comb_len); sha512_hmac_final (&ctx); const u32 r0 = l32_from_64_S (ctx.opad.h[7]); const u32 r1 = h32_from_64_S (ctx.opad.h[7]); const u32 r2 = l32_from_64_S (ctx.opad.h[3]); const u32 r3 = h32_from_64_S (ctx.opad.h[3]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01760_a3-optimized.cl000066400000000000000000000627211320027462700200210ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" void sha512_transform_transport_vector (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) { u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; u32x t4[4]; u32x t5[4]; u32x t6[4]; u32x t7[4]; t0[0] = h32_from_64 (w0[0]); t0[1] = l32_from_64 (w0[0]); t0[2] = h32_from_64 (w0[1]); t0[3] = l32_from_64 (w0[1]); t1[0] = h32_from_64 (w0[2]); t1[1] = l32_from_64 (w0[2]); t1[2] = h32_from_64 (w0[3]); t1[3] = l32_from_64 (w0[3]); t2[0] = h32_from_64 (w1[0]); t2[1] = l32_from_64 (w1[0]); t2[2] = h32_from_64 (w1[1]); t2[3] = l32_from_64 (w1[1]); t3[0] = h32_from_64 (w1[2]); t3[1] = l32_from_64 (w1[2]); t3[2] = h32_from_64 (w1[3]); t3[3] = l32_from_64 (w1[3]); t4[0] = h32_from_64 (w2[0]); t4[1] = l32_from_64 (w2[0]); t4[2] = h32_from_64 (w2[1]); t4[3] = l32_from_64 (w2[1]); t5[0] = h32_from_64 (w2[2]); t5[1] = l32_from_64 (w2[2]); t5[2] = h32_from_64 (w2[3]); t5[3] = l32_from_64 (w2[3]); t6[0] = h32_from_64 (w3[0]); t6[1] = l32_from_64 (w3[0]); t6[2] = h32_from_64 (w3[1]); t6[3] = l32_from_64 (w3[1]); t7[0] = h32_from_64 (w3[2]); t7[1] = l32_from_64 (w3[2]); t7[2] = h32_from_64 (w3[3]); t7[3] = l32_from_64 (w3[3]); sha512_transform_vector (t0, t1, t2, t3, t4, t5, t6, t7, digest); } 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]) ^ (u64x) 0x3636363636363636; w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ (u64x) 0x3636363636363636; w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ (u64x) 0x3636363636363636; w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ (u64x) 0x3636363636363636; w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ (u64x) 0x3636363636363636; w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ (u64x) 0x3636363636363636; w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ (u64x) 0x3636363636363636; w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ (u64x) 0x3636363636363636; w2_t[0] = (u64x) 0x3636363636363636; w2_t[1] = (u64x) 0x3636363636363636; w2_t[2] = (u64x) 0x3636363636363636; w2_t[3] = (u64x) 0x3636363636363636; w3_t[0] = (u64x) 0x3636363636363636; w3_t[1] = (u64x) 0x3636363636363636; w3_t[2] = (u64x) 0x3636363636363636; w3_t[3] = (u64x) 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_transport_vector (w0_t, w1_t, w2_t, w3_t, ipad); w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[0] = (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[1] = (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[2] = (u64x) 0x5c5c5c5c5c5c5c5c; w2_t[3] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[0] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[1] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[2] = (u64x) 0x5c5c5c5c5c5c5c5c; w3_t[3] = (u64x) 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_transport_vector (w0_t, w1_t, w2_t, w3_t, opad); } 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_transport_vector (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_transport_vector (w0_t, w1_t, w2_t, w3_t, digest); } void m01760m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esal_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; u64x ipad[8]; u64x opad[8]; hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; w0_t[0] = w0lr; 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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } void m01760s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 9]); salt_buf2[2] = swap32_S (salt_bufs[salt_pos].salt_buf[10]); salt_buf2[3] = swap32_S (salt_bufs[salt_pos].salt_buf[11]); salt_buf3[0] = swap32_S (salt_bufs[salt_pos].salt_buf[12]); salt_buf3[1] = swap32_S (salt_bufs[salt_pos].salt_buf[13]); salt_buf3[2] = swap32_S (salt_bufs[salt_pos].salt_buf[14]); salt_buf3[3] = swap32_S (salt_bufs[salt_pos].salt_buf[15]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * pads */ 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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; w0_t[0] = w0lr; 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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m01760_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01760_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01760_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01760_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01760_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m01760_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m01760_a3.cl000066400000000000000000000116451320027462700160160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" __kernel void m01760_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha512_hmac_ctx_vector_t ctx0; sha512_hmac_init_vector (&ctx0, s, salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha512_hmac_ctx_vector_t ctx = ctx0; sha512_hmac_update_vector (&ctx, w, pw_len); sha512_hmac_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.opad.h[7]); const u32x r1 = h32_from_64 (ctx.opad.h[7]); const u32x r2 = l32_from_64 (ctx.opad.h[3]); const u32x r3 = h32_from_64 (ctx.opad.h[3]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m01760_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha512_hmac_ctx_vector_t ctx0; sha512_hmac_init_vector (&ctx0, s, salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha512_hmac_ctx_vector_t ctx = ctx0; sha512_hmac_update_vector (&ctx, w, pw_len); sha512_hmac_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.opad.h[7]); const u32x r1 = h32_from_64 (ctx.opad.h[7]); const u32x r2 = l32_from_64 (ctx.opad.h[3]); const u32x r3 = h32_from_64 (ctx.opad.h[3]); COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m01800-optimized.cl000066400000000000000000000336641320027462700174350ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_sha512.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #define PUTCHAR64_BE(a,p,c) ((u8 *)(a))[(p) ^ 7] = (u8) (c) #define GETCHAR64_BE(a,p) ((u8 *)(a))[(p) ^ 7] typedef struct { u64 state[8]; u64 buf[16]; int len; } orig_sha512_ctx_t; void sha512_transform_transport (const u64 *w, u64 *digest) { u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; u32 t4[4]; u32 t5[4]; u32 t6[4]; u32 t7[4]; t0[0] = h32_from_64_S (w[ 0]); t0[1] = l32_from_64_S (w[ 0]); t0[2] = h32_from_64_S (w[ 1]); t0[3] = l32_from_64_S (w[ 1]); t1[0] = h32_from_64_S (w[ 2]); t1[1] = l32_from_64_S (w[ 2]); t1[2] = h32_from_64_S (w[ 3]); t1[3] = l32_from_64_S (w[ 3]); t2[0] = h32_from_64_S (w[ 4]); t2[1] = l32_from_64_S (w[ 4]); t2[2] = h32_from_64_S (w[ 5]); t2[3] = l32_from_64_S (w[ 5]); t3[0] = h32_from_64_S (w[ 6]); t3[1] = l32_from_64_S (w[ 6]); t3[2] = h32_from_64_S (w[ 7]); t3[3] = l32_from_64_S (w[ 7]); t4[0] = h32_from_64_S (w[ 8]); t4[1] = l32_from_64_S (w[ 8]); t4[2] = h32_from_64_S (w[ 9]); t4[3] = l32_from_64_S (w[ 9]); t5[0] = h32_from_64_S (w[10]); t5[1] = l32_from_64_S (w[10]); t5[2] = h32_from_64_S (w[11]); t5[3] = l32_from_64_S (w[11]); t6[0] = h32_from_64_S (w[12]); t6[1] = l32_from_64_S (w[12]); t6[2] = h32_from_64_S (w[13]); t6[3] = l32_from_64_S (w[13]); t7[0] = h32_from_64_S (w[14]); t7[1] = l32_from_64_S (w[14]); t7[2] = h32_from_64_S (w[15]); t7[3] = l32_from_64_S (w[15]); sha512_transform (t0, t1, t2, t3, t4, t5, t6, t7, digest); } void orig_sha512_init (orig_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; } void orig_sha512_update (orig_sha512_ctx_t *sha512_ctx, const u64 *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_transport (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)); } } void orig_sha512_final (orig_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_transport (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_transport (sha512_ctx->buf, sha512_ctx->state); } __kernel void m01800_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha512crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; 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 */ u64 pw[2]; pw[0] = swap64 (hl32_to_64 (w0[1], w0[0])); pw[1] = swap64 (hl32_to_64 (w0[3], w0[2])); u64 salt[2]; salt[0] = swap64 (hl32_to_64 (salt_buf[1], salt_buf[0])); salt[1] = swap64 (hl32_to_64 (salt_buf[3], salt_buf[2])); /** * begin */ orig_sha512_ctx_t sha512_ctx; orig_sha512_init (&sha512_ctx); orig_sha512_update (&sha512_ctx, pw, pw_len); orig_sha512_update (&sha512_ctx, salt, salt_len); orig_sha512_update (&sha512_ctx, pw, pw_len); orig_sha512_final (&sha512_ctx); u64 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]; orig_sha512_init (&sha512_ctx); orig_sha512_update (&sha512_ctx, pw, pw_len); orig_sha512_update (&sha512_ctx, salt, salt_len); orig_sha512_update (&sha512_ctx, tmp, pw_len); for (u32 j = pw_len; j; j >>= 1) { if (j & 1) { orig_sha512_update (&sha512_ctx, tmp, 64); } else { orig_sha512_update (&sha512_ctx, pw, pw_len); } } orig_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 orig_sha512_init (&sha512_ctx); for (u32 j = 0; j < pw_len; j++) { orig_sha512_update (&sha512_ctx, pw, pw_len); } orig_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 orig_sha512_init (&sha512_ctx); for (u32 j = 0; j < 16 + ((tmps[gid].l_alt_result[0] >> 56) & 0xff); j++) { orig_sha512_update (&sha512_ctx, salt, salt_len); } orig_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 m01800_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha512crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u64 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; u64 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 */ u64 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]; #ifdef _unroll #pragma unroll #endif 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_transport (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 m01800_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha512crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); const u64 a = swap64 (tmps[gid].l_alt_result[0]); const u64 b = swap64 (tmps[gid].l_alt_result[1]); const u32 r0 = l32_from_64_S (a); const u32 r1 = h32_from_64_S (a); const u32 r2 = l32_from_64_S (b); const u32 r3 = h32_from_64_S (b); #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m01800.cl000066400000000000000000000317061320027462700154260ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_sha512.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" __kernel void m01800_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha512crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * init */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32 (w[idx]); } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32 (s[idx]); } /** * prepare */ sha512_ctx_t ctx; sha512_init (&ctx); sha512_update (&ctx, w, pw_len); sha512_update (&ctx, s, salt_len); sha512_update (&ctx, w, pw_len); sha512_final (&ctx); u32 final[32] = { 0 }; final[ 0] = h32_from_64_S (ctx.h[0]); final[ 1] = l32_from_64_S (ctx.h[0]); final[ 2] = h32_from_64_S (ctx.h[1]); final[ 3] = l32_from_64_S (ctx.h[1]); final[ 4] = h32_from_64_S (ctx.h[2]); final[ 5] = l32_from_64_S (ctx.h[2]); final[ 6] = h32_from_64_S (ctx.h[3]); final[ 7] = l32_from_64_S (ctx.h[3]); final[ 8] = h32_from_64_S (ctx.h[4]); final[ 9] = l32_from_64_S (ctx.h[4]); final[10] = h32_from_64_S (ctx.h[5]); final[11] = l32_from_64_S (ctx.h[5]); final[12] = h32_from_64_S (ctx.h[6]); final[13] = l32_from_64_S (ctx.h[6]); final[14] = h32_from_64_S (ctx.h[7]); final[15] = l32_from_64_S (ctx.h[7]); // alt_result sha512_init (&ctx); sha512_update (&ctx, w, pw_len); sha512_update (&ctx, s, salt_len); int pl; for (pl = pw_len; pl > 64; pl -= 64) { sha512_update (&ctx, final, 64); } u32 t_final[32] = { 0 }; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 16; i++) t_final[i] = final[i]; truncate_block_16x4_be_S (t_final + 0, t_final + 4, t_final + 8, t_final + 12, pl); sha512_update (&ctx, t_final, pl); for (int cnt = pw_len; cnt > 0; cnt >>= 1) { if ((cnt & 1) != 0) { sha512_update (&ctx, final, 64); } else { sha512_update (&ctx, w, pw_len); } } sha512_final (&ctx); tmps[gid].alt_result[ 0] = h32_from_64_S (ctx.h[0]); tmps[gid].alt_result[ 1] = l32_from_64_S (ctx.h[0]); tmps[gid].alt_result[ 2] = h32_from_64_S (ctx.h[1]); tmps[gid].alt_result[ 3] = l32_from_64_S (ctx.h[1]); tmps[gid].alt_result[ 4] = h32_from_64_S (ctx.h[2]); tmps[gid].alt_result[ 5] = l32_from_64_S (ctx.h[2]); tmps[gid].alt_result[ 6] = h32_from_64_S (ctx.h[3]); tmps[gid].alt_result[ 7] = l32_from_64_S (ctx.h[3]); tmps[gid].alt_result[ 8] = h32_from_64_S (ctx.h[4]); tmps[gid].alt_result[ 9] = l32_from_64_S (ctx.h[4]); tmps[gid].alt_result[10] = h32_from_64_S (ctx.h[5]); tmps[gid].alt_result[11] = l32_from_64_S (ctx.h[5]); tmps[gid].alt_result[12] = h32_from_64_S (ctx.h[6]); tmps[gid].alt_result[13] = l32_from_64_S (ctx.h[6]); tmps[gid].alt_result[14] = h32_from_64_S (ctx.h[7]); tmps[gid].alt_result[15] = l32_from_64_S (ctx.h[7]); // p_bytes sha512_init (&ctx); for (u32 j = 0; j < pw_len; j++) { sha512_update (&ctx, w, pw_len); } sha512_final (&ctx); final[ 0] = h32_from_64_S (ctx.h[0]); final[ 1] = l32_from_64_S (ctx.h[0]); final[ 2] = h32_from_64_S (ctx.h[1]); final[ 3] = l32_from_64_S (ctx.h[1]); final[ 4] = h32_from_64_S (ctx.h[2]); final[ 5] = l32_from_64_S (ctx.h[2]); final[ 6] = h32_from_64_S (ctx.h[3]); final[ 7] = l32_from_64_S (ctx.h[3]); final[ 8] = h32_from_64_S (ctx.h[4]); final[ 9] = l32_from_64_S (ctx.h[4]); final[10] = h32_from_64_S (ctx.h[5]); final[11] = l32_from_64_S (ctx.h[5]); final[12] = h32_from_64_S (ctx.h[6]); final[13] = l32_from_64_S (ctx.h[6]); final[14] = h32_from_64_S (ctx.h[7]); final[15] = l32_from_64_S (ctx.h[7]); u32 p_final[64] = { 0 }; int idx; for (pl = pw_len, idx = 0; pl > 64; pl -= 64, idx += 16) { p_final[idx + 0] = final[ 0]; p_final[idx + 1] = final[ 1]; p_final[idx + 2] = final[ 2]; p_final[idx + 3] = final[ 3]; p_final[idx + 4] = final[ 4]; p_final[idx + 5] = final[ 5]; p_final[idx + 6] = final[ 6]; p_final[idx + 7] = final[ 7]; p_final[idx + 8] = final[ 8]; p_final[idx + 9] = final[ 9]; p_final[idx + 10] = final[10]; p_final[idx + 11] = final[11]; p_final[idx + 12] = final[12]; p_final[idx + 13] = final[13]; p_final[idx + 14] = final[14]; p_final[idx + 15] = final[15]; } truncate_block_16x4_be_S (final + 0, final + 4, final + 8, final + 12, pl); p_final[idx + 0] = final[ 0]; p_final[idx + 1] = final[ 1]; p_final[idx + 2] = final[ 2]; p_final[idx + 3] = final[ 3]; p_final[idx + 4] = final[ 4]; p_final[idx + 5] = final[ 5]; p_final[idx + 6] = final[ 6]; p_final[idx + 7] = final[ 7]; p_final[idx + 8] = final[ 8]; p_final[idx + 9] = final[ 9]; p_final[idx + 10] = final[10]; p_final[idx + 11] = final[11]; p_final[idx + 12] = final[12]; p_final[idx + 13] = final[13]; p_final[idx + 14] = final[14]; p_final[idx + 15] = final[15]; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) tmps[gid].p_bytes[i] = p_final[i]; // s_bytes sha512_init (&ctx); for (u32 j = 0; j < 16 + (tmps[gid].alt_result[0] >> 24); j++) { sha512_update (&ctx, s, salt_len); } sha512_final (&ctx); final[ 0] = h32_from_64_S (ctx.h[0]); final[ 1] = l32_from_64_S (ctx.h[0]); final[ 2] = h32_from_64_S (ctx.h[1]); final[ 3] = l32_from_64_S (ctx.h[1]); final[ 4] = h32_from_64_S (ctx.h[2]); final[ 5] = l32_from_64_S (ctx.h[2]); final[ 6] = h32_from_64_S (ctx.h[3]); final[ 7] = l32_from_64_S (ctx.h[3]); final[ 8] = h32_from_64_S (ctx.h[4]); final[ 9] = l32_from_64_S (ctx.h[4]); final[10] = h32_from_64_S (ctx.h[5]); final[11] = l32_from_64_S (ctx.h[5]); final[12] = h32_from_64_S (ctx.h[6]); final[13] = l32_from_64_S (ctx.h[6]); final[14] = h32_from_64_S (ctx.h[7]); final[15] = l32_from_64_S (ctx.h[7]); u32 s_final[64] = { 0 }; for (pl = salt_len, idx = 0; pl > 64; pl -= 64, idx += 16) { s_final[idx + 0] = final[ 0]; s_final[idx + 1] = final[ 1]; s_final[idx + 2] = final[ 2]; s_final[idx + 3] = final[ 3]; s_final[idx + 4] = final[ 4]; s_final[idx + 5] = final[ 5]; s_final[idx + 6] = final[ 6]; s_final[idx + 7] = final[ 7]; s_final[idx + 8] = final[ 8]; s_final[idx + 9] = final[ 9]; s_final[idx + 10] = final[10]; s_final[idx + 11] = final[11]; s_final[idx + 12] = final[12]; s_final[idx + 13] = final[13]; s_final[idx + 14] = final[14]; s_final[idx + 15] = final[15]; } truncate_block_16x4_be_S (final + 0, final + 4, final + 8, final + 12, pl); s_final[idx + 0] = final[ 0]; s_final[idx + 1] = final[ 1]; s_final[idx + 2] = final[ 2]; s_final[idx + 3] = final[ 3]; s_final[idx + 4] = final[ 4]; s_final[idx + 5] = final[ 5]; s_final[idx + 6] = final[ 6]; s_final[idx + 7] = final[ 7]; s_final[idx + 8] = final[ 8]; s_final[idx + 9] = final[ 9]; s_final[idx + 10] = final[10]; s_final[idx + 11] = final[11]; s_final[idx + 12] = final[12]; s_final[idx + 13] = final[13]; s_final[idx + 14] = final[14]; s_final[idx + 15] = final[15]; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) tmps[gid].s_bytes[i] = s_final[i]; } __kernel void m01800_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha512crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u32 pw_len = pws[gid].pw_len; const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 alt_result[32] = { 0 }; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 16; i++) alt_result[i] = tmps[gid].alt_result[i]; /* Repeatedly run the collected hash value through SHA512 to burn CPU cycles. */ for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) { sha512_ctx_t ctx; sha512_init (&ctx); if (j & 1) { sha512_update_global (&ctx, tmps[gid].p_bytes, pw_len); } else { sha512_update (&ctx, alt_result, 64); } if (j % 3) { sha512_update_global (&ctx, tmps[gid].s_bytes, salt_len); } if (j % 7) { sha512_update_global (&ctx, tmps[gid].p_bytes, pw_len); } if (j & 1) { sha512_update (&ctx, alt_result, 64); } else { sha512_update_global (&ctx, tmps[gid].p_bytes, pw_len); } sha512_final (&ctx); alt_result[ 0] = h32_from_64_S (ctx.h[0]); alt_result[ 1] = l32_from_64_S (ctx.h[0]); alt_result[ 2] = h32_from_64_S (ctx.h[1]); alt_result[ 3] = l32_from_64_S (ctx.h[1]); alt_result[ 4] = h32_from_64_S (ctx.h[2]); alt_result[ 5] = l32_from_64_S (ctx.h[2]); alt_result[ 6] = h32_from_64_S (ctx.h[3]); alt_result[ 7] = l32_from_64_S (ctx.h[3]); alt_result[ 8] = h32_from_64_S (ctx.h[4]); alt_result[ 9] = l32_from_64_S (ctx.h[4]); alt_result[10] = h32_from_64_S (ctx.h[5]); alt_result[11] = l32_from_64_S (ctx.h[5]); alt_result[12] = h32_from_64_S (ctx.h[6]); alt_result[13] = l32_from_64_S (ctx.h[6]); alt_result[14] = h32_from_64_S (ctx.h[7]); alt_result[15] = l32_from_64_S (ctx.h[7]); } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 16; i++) tmps[gid].alt_result[i] = alt_result[i]; } __kernel void m01800_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha512crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); const u32 r0 = swap32 (tmps[gid].alt_result[0]); const u32 r1 = swap32 (tmps[gid].alt_result[1]); const u32 r2 = swap32 (tmps[gid].alt_result[2]); const u32 r3 = swap32 (tmps[gid].alt_result[3]); #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m02000_a0.cl000066400000000000000000000043071320027462700157740ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ typedef uint u32; typedef ulong u64; __kernel void gpu_memset (__global uint4 *buf, const u32 value, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; buf[gid] = (uint4) (value); } __kernel void m02000_mxx (__global void *pws, __global void *rules_buf, __global void *combs_buf, __global void * words_buf_r, __global void *tmps, __global void *hooks, __global void *bitmaps_buf_s1_a, __global void *bitmaps_buf_s1_b, __global void *bitmaps_buf_s1_c, __global void *bitmaps_buf_s1_d, __global void *bitmaps_buf_s2_a, __global void *bitmaps_buf_s2_b, __global void *bitmaps_buf_s2_c, __global void *bitmaps_buf_s2_d, __global void *plains_buf, __global void *digests_buf, __global void *hashes_shown, __global void *salt_bufs, __global const void *esalt_bufs, __global void *d_return_buf, __global void *d_scryptV0_buf, __global void *d_scryptV1_buf, __global void *d_scryptV2_buf, __global void *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02000_sxx (__global void *pws, __global void *rules_buf, __global void *combs_buf, __global void * words_buf_r, __global void *tmps, __global void *hooks, __global void *bitmaps_buf_s1_a, __global void *bitmaps_buf_s1_b, __global void *bitmaps_buf_s1_c, __global void *bitmaps_buf_s1_d, __global void *bitmaps_buf_s2_a, __global void *bitmaps_buf_s2_b, __global void *bitmaps_buf_s2_c, __global void *bitmaps_buf_s2_d, __global void *plains_buf, __global void *digests_buf, __global void *hashes_shown, __global void *salt_bufs, __global const void *esalt_bufs, __global void *d_return_buf, __global void *d_scryptV0_buf, __global void *d_scryptV1_buf, __global void *d_scryptV2_buf, __global void *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m02000_a1.cl000066400000000000000000000043071320027462700157750ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ typedef uint u32; typedef ulong u64; __kernel void gpu_memset (__global uint4 *buf, const u32 value, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; buf[gid] = (uint4) (value); } __kernel void m02000_mxx (__global void *pws, __global void *rules_buf, __global void *combs_buf, __global void * words_buf_r, __global void *tmps, __global void *hooks, __global void *bitmaps_buf_s1_a, __global void *bitmaps_buf_s1_b, __global void *bitmaps_buf_s1_c, __global void *bitmaps_buf_s1_d, __global void *bitmaps_buf_s2_a, __global void *bitmaps_buf_s2_b, __global void *bitmaps_buf_s2_c, __global void *bitmaps_buf_s2_d, __global void *plains_buf, __global void *digests_buf, __global void *hashes_shown, __global void *salt_bufs, __global const void *esalt_bufs, __global void *d_return_buf, __global void *d_scryptV0_buf, __global void *d_scryptV1_buf, __global void *d_scryptV2_buf, __global void *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02000_sxx (__global void *pws, __global void *rules_buf, __global void *combs_buf, __global void * words_buf_r, __global void *tmps, __global void *hooks, __global void *bitmaps_buf_s1_a, __global void *bitmaps_buf_s1_b, __global void *bitmaps_buf_s1_c, __global void *bitmaps_buf_s1_d, __global void *bitmaps_buf_s2_a, __global void *bitmaps_buf_s2_b, __global void *bitmaps_buf_s2_c, __global void *bitmaps_buf_s2_d, __global void *plains_buf, __global void *digests_buf, __global void *hashes_shown, __global void *salt_bufs, __global const void *esalt_bufs, __global void *d_return_buf, __global void *d_scryptV0_buf, __global void *d_scryptV1_buf, __global void *d_scryptV2_buf, __global void *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m02000_a3.cl000066400000000000000000000043071320027462700157770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ typedef uint u32; typedef ulong u64; __kernel void gpu_memset (__global uint4 *buf, const u32 value, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; buf[gid] = (uint4) (value); } __kernel void m02000_mxx (__global void *pws, __global void *rules_buf, __global void *combs_buf, __global void * words_buf_r, __global void *tmps, __global void *hooks, __global void *bitmaps_buf_s1_a, __global void *bitmaps_buf_s1_b, __global void *bitmaps_buf_s1_c, __global void *bitmaps_buf_s1_d, __global void *bitmaps_buf_s2_a, __global void *bitmaps_buf_s2_b, __global void *bitmaps_buf_s2_c, __global void *bitmaps_buf_s2_d, __global void *plains_buf, __global void *digests_buf, __global void *hashes_shown, __global void *salt_bufs, __global const void *esalt_bufs, __global void *d_return_buf, __global void *d_scryptV0_buf, __global void *d_scryptV1_buf, __global void *d_scryptV2_buf, __global void *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02000_sxx (__global void *pws, __global void *rules_buf, __global void *combs_buf, __global void * words_buf_r, __global void *tmps, __global void *hooks, __global void *bitmaps_buf_s1_a, __global void *bitmaps_buf_s1_b, __global void *bitmaps_buf_s1_c, __global void *bitmaps_buf_s1_d, __global void *bitmaps_buf_s2_a, __global void *bitmaps_buf_s2_b, __global void *bitmaps_buf_s2_c, __global void *bitmaps_buf_s2_d, __global void *plains_buf, __global void *digests_buf, __global void *hashes_shown, __global void *salt_bufs, __global const void *esalt_bufs, __global void *d_return_buf, __global void *d_scryptV0_buf, __global void *d_scryptV1_buf, __global void *d_scryptV2_buf, __global void *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m02100.cl000066400000000000000000000213661320027462700154210ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md4.cl" #include "inc_hash_sha1.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha1_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m02100_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global dcc2_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; // dcc1 md4_ctx_t md4_ctx1; md4_init (&md4_ctx1); md4_update_global_utf16le (&md4_ctx1, pws[gid].i, pws[gid].pw_len); md4_final (&md4_ctx1); md4_ctx_t md4_ctx2; md4_init (&md4_ctx2); md4_ctx2.w0[0] = md4_ctx1.h[0]; md4_ctx2.w0[1] = md4_ctx1.h[1]; md4_ctx2.w0[2] = md4_ctx1.h[2]; md4_ctx2.w0[3] = md4_ctx1.h[3]; md4_ctx2.len = 16; md4_update_global_utf16le (&md4_ctx2, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); md4_final (&md4_ctx2); md4_ctx2.h[0] = swap32_S (md4_ctx2.h[0]); md4_ctx2.h[1] = swap32_S (md4_ctx2.h[1]); md4_ctx2.h[2] = swap32_S (md4_ctx2.h[2]); md4_ctx2.h[3] = swap32_S (md4_ctx2.h[3]); // dcc2 u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = md4_ctx2.h[0]; w0[1] = md4_ctx2.h[1]; w0[2] = md4_ctx2.h[2]; w0[3] = md4_ctx2.h[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; sha1_hmac_ctx_t sha1_hmac_ctx; sha1_hmac_init_64 (&sha1_hmac_ctx, w0, w1, w2, w3); tmps[gid].ipad[0] = sha1_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha1_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha1_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha1_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha1_hmac_ctx.ipad.h[4]; tmps[gid].opad[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha1_hmac_ctx.opad.h[4]; sha1_hmac_update_global_utf16le_swap (&sha1_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); w0[0] = 1; 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] = 0; sha1_hmac_update_64 (&sha1_hmac_ctx, w0, w1, w2, w3, 4); sha1_hmac_final (&sha1_hmac_ctx); tmps[gid].dgst[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].dgst[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].dgst[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].dgst[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].dgst[4] = sha1_hmac_ctx.opad.h[4]; tmps[gid].out[0] = tmps[gid].dgst[0]; tmps[gid].out[1] = tmps[gid].dgst[1]; tmps[gid].out[2] = tmps[gid].dgst[2]; tmps[gid].out[3] = tmps[gid].dgst[3]; } __kernel void m02100_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global dcc2_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); /** * iter1 */ u32x dgst[5]; u32x out[4]; dgst[0] = packv (tmps, dgst, gid, 0); dgst[1] = packv (tmps, dgst, gid, 1); dgst[2] = packv (tmps, dgst, gid, 2); dgst[3] = packv (tmps, dgst, gid, 3); dgst[4] = packv (tmps, dgst, gid, 4); out[0] = packv (tmps, out, gid, 0); out[1] = packv (tmps, out, gid, 1); out[2] = packv (tmps, out, gid, 2); out[3] = packv (tmps, out, gid, 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_V (w0, w1, w2, w3, ipad, opad, dgst); out[0] ^= dgst[0]; out[1] ^= dgst[1]; out[2] ^= dgst[2]; out[3] ^= dgst[3]; } unpackv (tmps, dgst, gid, 0, dgst[0]); unpackv (tmps, dgst, gid, 1, dgst[1]); unpackv (tmps, dgst, gid, 2, dgst[2]); unpackv (tmps, dgst, gid, 3, dgst[3]); unpackv (tmps, dgst, gid, 4, dgst[4]); unpackv (tmps, out, gid, 0, out[0]); unpackv (tmps, out, gid, 1, out[1]); unpackv (tmps, out, gid, 2, out[2]); unpackv (tmps, out, gid, 3, out[3]); } __kernel void m02100_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global dcc2_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); const u32 r0 = tmps[gid].out[DGST_R0]; const u32 r1 = tmps[gid].out[DGST_R1]; const u32 r2 = tmps[gid].out[DGST_R2]; const u32 r3 = tmps[gid].out[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m02400_a0-optimized.cl000066400000000000000000000405471320027462700200100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m02400_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); 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] = 16 * 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); u32x t; 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; COMPARE_M_SIMD (a, d, c, b); } } __kernel void m02400_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02400_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02400_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); 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] = 16 * 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); u32x t; 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); if (MATCHES_NONE_VS ((a & 0x00ffffff), search[0])) 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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m02400_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02400_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m02400_a1-optimized.cl000066400000000000000000000473561320027462700200160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m02400_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * md5 */ 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] = 16 * 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); u32x t; 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; COMPARE_M_SIMD (a, d, c, b); } } __kernel void m02400_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02400_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02400_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * md5 */ 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] = 16 * 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); u32x t; 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); if (MATCHES_NONE_VS ((a & 0x00ffffff), search[0])) 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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m02400_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02400_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m02400_a3-optimized.cl000066400000000000000000000574241320027462700200150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m02400m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * algorithm specific */ 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; /** * base */ const u32 F_w0c00 = 0u + 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 = 0u + 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 = 0u + 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 = 0u + 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); u32x t; 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; COMPARE_M_SIMD (a, d, c, b); } } void m02400s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * algorithm specific */ 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; /** * base */ const u32 F_w0c00 = 0u + 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 = 0u + 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 = 0u + 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 = 0u + 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); u32x t; 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); if (MATCHES_NONE_VS ((a & 0x00ffffff), search[0])) 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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m02400_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m02400_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02400_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02400_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m02400_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02400_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m02410_a0-optimized.cl000066400000000000000000000460711320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m02410_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = 0; salt_buf0[2] = 0; salt_buf0[3] = 0; salt_buf1[0] = 0; salt_buf1[1] = 0; salt_buf1[2] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; salt_buf3[0] = 0; salt_buf3[1] = 0; salt_buf3[2] = 0; salt_buf3[3] = 0; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (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] |= s3[2]; w3[3] |= s3[3]; /** * md5 */ 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] = 16 * 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); u32x t; 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; COMPARE_M_SIMD (a, d, c, b); } } __kernel void m02410_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02410_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02410_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = 0; salt_buf0[2] = 0; salt_buf0[3] = 0; salt_buf1[0] = 0; salt_buf1[1] = 0; salt_buf1[2] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; salt_buf3[0] = 0; salt_buf3[1] = 0; 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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (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] |= s3[2]; w3[3] |= s3[3]; /** * md5 */ 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] = 16 * 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); u32x t; 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); if (MATCHES_NONE_VS ((a & 0x00ffffff), search[0])) 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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m02410_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02410_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m02410_a1-optimized.cl000066400000000000000000000546061320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m02410_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = 0; salt_buf0[2] = 0; salt_buf0[3] = 0; salt_buf1[0] = 0; salt_buf1[1] = 0; salt_buf1[2] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; salt_buf3[0] = 0; salt_buf3[1] = 0; salt_buf3[2] = 0; salt_buf3[3] = 0; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_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]; /** * md5 */ 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] = 16 * 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); u32x t; 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; COMPARE_M_SIMD (a, d, c, b); } } __kernel void m02410_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02410_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02410_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = 0; salt_buf0[2] = 0; salt_buf0[3] = 0; salt_buf1[0] = 0; salt_buf1[1] = 0; salt_buf1[2] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; salt_buf3[0] = 0; salt_buf3[1] = 0; 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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_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]; /** * md5 */ 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] = 16 * 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); u32x t; 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); if (MATCHES_NONE_VS ((a & 0x00ffffff), search[0])) 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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m02410_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02410_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m02410_a3-optimized.cl000066400000000000000000000631621320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m02410m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = 0; salt_buf0[2] = 0; salt_buf0[3] = 0; salt_buf1[0] = 0; salt_buf1[1] = 0; salt_buf1[2] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; salt_buf3[0] = 0; salt_buf3[1] = 0; salt_buf3[2] = 0; salt_buf3[3] = 0; switch_buffer_by_offset_le_S (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]; /** * algorithm specific */ 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; /** * base */ const u32 F_w0c00 = 0u + 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 = 0u + 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 = 0u + 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 = 0u + 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); u32x t; 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; COMPARE_M_SIMD (a, d, c, b); } } void m02410s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = 0; salt_buf0[2] = 0; salt_buf0[3] = 0; salt_buf1[0] = 0; salt_buf1[1] = 0; salt_buf1[2] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; salt_buf3[0] = 0; salt_buf3[1] = 0; salt_buf3[2] = 0; salt_buf3[3] = 0; switch_buffer_by_offset_le_S (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]; /** * algorithm specific */ 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; /** * base */ const u32 F_w0c00 = 0u + 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 = 0u + 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 = 0u + 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 = 0u + 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); u32x t; 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); if (MATCHES_NONE_VS ((a & 0x00ffffff), search[0])) 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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m02410_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m02410_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02410_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02410_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m02410_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02410_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m02500.cl000066400000000000000000000531031320027462700154170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #include "inc_hash_sha1.cl" #include "inc_hash_sha256.cl" #include "inc_cipher_aes.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void make_kn (u32 *k) { u32 kl[4]; u32 kr[4]; kl[0] = (k[0] << 1) & 0xfefefefe; kl[1] = (k[1] << 1) & 0xfefefefe; kl[2] = (k[2] << 1) & 0xfefefefe; kl[3] = (k[3] << 1) & 0xfefefefe; kr[0] = (k[0] >> 7) & 0x01010101; kr[1] = (k[1] >> 7) & 0x01010101; kr[2] = (k[2] >> 7) & 0x01010101; kr[3] = (k[3] >> 7) & 0x01010101; const u32 c = kr[0] & 1; kr[0] = kr[0] >> 8 | kr[1] << 24; kr[1] = kr[1] >> 8 | kr[2] << 24; kr[2] = kr[2] >> 8 | kr[3] << 24; kr[3] = kr[3] >> 8; k[0] = kl[0] | kr[0]; k[1] = kl[1] | kr[1]; k[2] = kl[2] | kr[2]; k[3] = kl[3] | kr[3]; k[3] ^= c * 0x87000000; } void hmac_sha1_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m02500_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global wpa_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha1_hmac_ctx_t sha1_hmac_ctx; sha1_hmac_init_global_swap (&sha1_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha1_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha1_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha1_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha1_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha1_hmac_ctx.ipad.h[4]; tmps[gid].opad[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha1_hmac_ctx.opad.h[4]; sha1_hmac_update_global_swap (&sha1_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 8; i += 5, j += 1) { sha1_hmac_ctx_t sha1_hmac_ctx2 = sha1_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha1_hmac_update_64 (&sha1_hmac_ctx2, w0, w1, w2, w3, 4); sha1_hmac_final (&sha1_hmac_ctx2); tmps[gid].dgst[i + 0] = sha1_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha1_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha1_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha1_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha1_hmac_ctx2.opad.h[4]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; } } __kernel void m02500_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global wpa_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); for (u32 i = 0; i < 8; i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); } } __kernel void m02500_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global wpa_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; u32 out[8]; 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]; const u32 digest_pos = loop_pos; const u32 digest_cur = digests_offset + digest_pos; __global const wpa_t *wpa = &wpa_bufs[digest_cur]; u32 pke[32]; pke[ 0] = wpa->pke[ 0]; pke[ 1] = wpa->pke[ 1]; pke[ 2] = wpa->pke[ 2]; pke[ 3] = wpa->pke[ 3]; pke[ 4] = wpa->pke[ 4]; pke[ 5] = wpa->pke[ 5]; pke[ 6] = wpa->pke[ 6]; pke[ 7] = wpa->pke[ 7]; pke[ 8] = wpa->pke[ 8]; pke[ 9] = wpa->pke[ 9]; pke[10] = wpa->pke[10]; pke[11] = wpa->pke[11]; pke[12] = wpa->pke[12]; pke[13] = wpa->pke[13]; pke[14] = wpa->pke[14]; pke[15] = wpa->pke[15]; pke[16] = wpa->pke[16]; pke[17] = wpa->pke[17]; pke[18] = wpa->pke[18]; pke[19] = wpa->pke[19]; pke[20] = wpa->pke[20]; pke[21] = wpa->pke[21]; pke[22] = wpa->pke[22]; pke[23] = wpa->pke[23]; pke[24] = wpa->pke[24]; pke[25] = wpa->pke[25]; pke[26] = wpa->pke[26]; pke[27] = wpa->pke[27]; pke[28] = wpa->pke[28]; pke[29] = wpa->pke[29]; pke[30] = wpa->pke[30]; pke[31] = wpa->pke[31]; u32 to; if (wpa->nonce_compare < 0) { to = pke[15] << 24 | pke[16] >> 8; } else { to = pke[23] << 24 | pke[24] >> 8; } const u32 nonce_error_corrections = wpa->nonce_error_corrections; for (u32 nonce_error_correction = 0; nonce_error_correction <= nonce_error_corrections; nonce_error_correction++) { u32 t = to; t = swap32_S (t); t -= nonce_error_corrections / 2; t += nonce_error_correction; t = swap32_S (t); if (wpa->nonce_compare < 0) { pke[15] = (pke[15] & ~0x000000ff) | (t >> 24); pke[16] = (pke[16] & ~0xffffff00) | (t << 8); } else { pke[23] = (pke[23] & ~0x000000ff) | (t >> 24); pke[24] = (pke[24] & ~0xffffff00) | (t << 8); } u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[3]; w1[0] = out[4]; w1[1] = out[5]; w1[2] = out[6]; w1[3] = 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; u32 keymic[4]; keymic[0] = 0; keymic[1] = 0; keymic[2] = 0; keymic[3] = 0; if (wpa->keyver == 1) { sha1_hmac_ctx_t ctx1; sha1_hmac_init_64 (&ctx1, w0, w1, w2, w3); sha1_hmac_update (&ctx1, pke, 100); sha1_hmac_final (&ctx1); u32 digest[4]; digest[0] = ctx1.opad.h[0]; digest[1] = ctx1.opad.h[1]; digest[2] = ctx1.opad.h[2]; digest[3] = ctx1.opad.h[3]; u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; t0[0] = swap32_S (digest[0]); t0[1] = swap32_S (digest[1]); t0[2] = swap32_S (digest[2]); t0[3] = swap32_S (digest[3]); t1[0] = 0; t1[1] = 0; t1[2] = 0; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; md5_hmac_ctx_t ctx2; md5_hmac_init_64 (&ctx2, t0, t1, t2, t3); md5_hmac_update_global (&ctx2, wpa->eapol, wpa->eapol_len); md5_hmac_final (&ctx2); keymic[0] = ctx2.opad.h[0]; keymic[1] = ctx2.opad.h[1]; keymic[2] = ctx2.opad.h[2]; keymic[3] = ctx2.opad.h[3]; } else if (wpa->keyver == 2) { sha1_hmac_ctx_t ctx1; sha1_hmac_init_64 (&ctx1, w0, w1, w2, w3); sha1_hmac_update (&ctx1, pke, 100); sha1_hmac_final (&ctx1); u32 digest[4]; digest[0] = ctx1.opad.h[0]; digest[1] = ctx1.opad.h[1]; digest[2] = ctx1.opad.h[2]; digest[3] = ctx1.opad.h[3]; u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; t0[0] = digest[0]; t0[1] = digest[1]; t0[2] = digest[2]; t0[3] = digest[3]; t1[0] = 0; t1[1] = 0; t1[2] = 0; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; sha1_hmac_ctx_t ctx2; sha1_hmac_init_64 (&ctx2, t0, t1, t2, t3); sha1_hmac_update_global (&ctx2, wpa->eapol, wpa->eapol_len); sha1_hmac_final (&ctx2); keymic[0] = ctx2.opad.h[0]; keymic[1] = ctx2.opad.h[1]; keymic[2] = ctx2.opad.h[2]; keymic[3] = ctx2.opad.h[3]; } else if (wpa->keyver == 3) { sha256_hmac_ctx_t ctx1; sha256_hmac_init_64 (&ctx1, w0, w1, w2, w3); sha256_hmac_update (&ctx1, pke, 102); sha256_hmac_final (&ctx1); u32 digest[4]; digest[0] = swap32_S (ctx1.opad.h[0]); digest[1] = swap32_S (ctx1.opad.h[1]); digest[2] = swap32_S (ctx1.opad.h[2]); digest[3] = swap32_S (ctx1.opad.h[3]); // AES CMAC u32 ks[44]; aes128_set_encrypt_key (ks, digest, s_te0, s_te1, s_te2, s_te3, s_te4); u32 m[4]; m[0] = 0; m[1] = 0; m[2] = 0; m[3] = 0; u32 iv[4]; iv[0] = 0; iv[1] = 0; iv[2] = 0; iv[3] = 0; int eapol_left; int eapol_idx; for (eapol_left = wpa->eapol_len, eapol_idx = 0; eapol_left > 16; eapol_left -= 16, eapol_idx += 4) { m[0] = wpa->eapol[eapol_idx + 0] ^ iv[0]; m[1] = wpa->eapol[eapol_idx + 1] ^ iv[1]; m[2] = wpa->eapol[eapol_idx + 2] ^ iv[2]; m[3] = wpa->eapol[eapol_idx + 3] ^ iv[3]; aes128_encrypt (ks, m, iv, s_te0, s_te1, s_te2, s_te3, s_te4); } m[0] = wpa->eapol[eapol_idx + 0]; m[1] = wpa->eapol[eapol_idx + 1]; m[2] = wpa->eapol[eapol_idx + 2]; m[3] = wpa->eapol[eapol_idx + 3]; u32 k[4]; k[0] = 0; k[1] = 0; k[2] = 0; k[3] = 0; aes128_encrypt (ks, k, k, s_te0, s_te1, s_te2, s_te3, s_te4); make_kn (k); if (eapol_left < 16) { make_kn (k); } m[0] ^= k[0]; m[1] ^= k[1]; m[2] ^= k[2]; m[3] ^= k[3]; m[0] ^= iv[0]; m[1] ^= iv[1]; m[2] ^= iv[2]; m[3] ^= iv[3]; aes128_encrypt (ks, m, keymic, s_te0, s_te1, s_te2, s_te3, s_te4); } /** * final compare */ if ((keymic[0] == wpa->keymic[0]) && (keymic[1] == wpa->keymic[1]) && (keymic[2] == wpa->keymic[2]) && (keymic[3] == wpa->keymic[3])) { if (atomic_inc (&hashes_shown[digest_cur]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, digest_cur, gid, 0); } } } // the same code again, but with BE order for the t++ for (u32 nonce_error_correction = 0; nonce_error_correction <= nonce_error_corrections; nonce_error_correction++) { u32 t = to; t -= nonce_error_corrections / 2; t += nonce_error_correction; if (t == to) continue; // we already had this checked in the LE loop if (wpa->nonce_compare < 0) { pke[15] = (pke[15] & ~0x000000ff) | (t >> 24); pke[16] = (pke[16] & ~0xffffff00) | (t << 8); } else { pke[23] = (pke[23] & ~0x000000ff) | (t >> 24); pke[24] = (pke[24] & ~0xffffff00) | (t << 8); } u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[3]; w1[0] = out[4]; w1[1] = out[5]; w1[2] = out[6]; w1[3] = 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; u32 keymic[4]; keymic[0] = 0; keymic[1] = 0; keymic[2] = 0; keymic[3] = 0; if (wpa->keyver == 1) { sha1_hmac_ctx_t ctx1; sha1_hmac_init_64 (&ctx1, w0, w1, w2, w3); sha1_hmac_update (&ctx1, pke, 100); sha1_hmac_final (&ctx1); u32 digest[4]; digest[0] = ctx1.opad.h[0]; digest[1] = ctx1.opad.h[1]; digest[2] = ctx1.opad.h[2]; digest[3] = ctx1.opad.h[3]; u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; t0[0] = swap32_S (digest[0]); t0[1] = swap32_S (digest[1]); t0[2] = swap32_S (digest[2]); t0[3] = swap32_S (digest[3]); t1[0] = 0; t1[1] = 0; t1[2] = 0; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; md5_hmac_ctx_t ctx2; md5_hmac_init_64 (&ctx2, t0, t1, t2, t3); md5_hmac_update_global (&ctx2, wpa->eapol, wpa->eapol_len); md5_hmac_final (&ctx2); keymic[0] = ctx2.opad.h[0]; keymic[1] = ctx2.opad.h[1]; keymic[2] = ctx2.opad.h[2]; keymic[3] = ctx2.opad.h[3]; } else if (wpa->keyver == 2) { sha1_hmac_ctx_t ctx1; sha1_hmac_init_64 (&ctx1, w0, w1, w2, w3); sha1_hmac_update (&ctx1, pke, 100); sha1_hmac_final (&ctx1); u32 digest[4]; digest[0] = ctx1.opad.h[0]; digest[1] = ctx1.opad.h[1]; digest[2] = ctx1.opad.h[2]; digest[3] = ctx1.opad.h[3]; u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; t0[0] = digest[0]; t0[1] = digest[1]; t0[2] = digest[2]; t0[3] = digest[3]; t1[0] = 0; t1[1] = 0; t1[2] = 0; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; sha1_hmac_ctx_t ctx2; sha1_hmac_init_64 (&ctx2, t0, t1, t2, t3); sha1_hmac_update_global (&ctx2, wpa->eapol, wpa->eapol_len); sha1_hmac_final (&ctx2); keymic[0] = ctx2.opad.h[0]; keymic[1] = ctx2.opad.h[1]; keymic[2] = ctx2.opad.h[2]; keymic[3] = ctx2.opad.h[3]; } else if (wpa->keyver == 3) { sha256_hmac_ctx_t ctx1; sha256_hmac_init_64 (&ctx1, w0, w1, w2, w3); sha256_hmac_update (&ctx1, pke, 102); sha256_hmac_final (&ctx1); u32 digest[4]; digest[0] = swap32_S (ctx1.opad.h[0]); digest[1] = swap32_S (ctx1.opad.h[1]); digest[2] = swap32_S (ctx1.opad.h[2]); digest[3] = swap32_S (ctx1.opad.h[3]); // AES CMAC u32 ks[44]; aes128_set_encrypt_key (ks, digest, s_te0, s_te1, s_te2, s_te3, s_te4); u32 m[4]; m[0] = 0; m[1] = 0; m[2] = 0; m[3] = 0; u32 iv[4]; iv[0] = 0; iv[1] = 0; iv[2] = 0; iv[3] = 0; int eapol_left; int eapol_idx; for (eapol_left = wpa->eapol_len, eapol_idx = 0; eapol_left > 16; eapol_left -= 16, eapol_idx += 4) { m[0] = wpa->eapol[eapol_idx + 0] ^ iv[0]; m[1] = wpa->eapol[eapol_idx + 1] ^ iv[1]; m[2] = wpa->eapol[eapol_idx + 2] ^ iv[2]; m[3] = wpa->eapol[eapol_idx + 3] ^ iv[3]; aes128_encrypt (ks, m, iv, s_te0, s_te1, s_te2, s_te3, s_te4); } m[0] = wpa->eapol[eapol_idx + 0]; m[1] = wpa->eapol[eapol_idx + 1]; m[2] = wpa->eapol[eapol_idx + 2]; m[3] = wpa->eapol[eapol_idx + 3]; u32 k[4]; k[0] = 0; k[1] = 0; k[2] = 0; k[3] = 0; aes128_encrypt (ks, k, k, s_te0, s_te1, s_te2, s_te3, s_te4); make_kn (k); if (eapol_left < 16) { make_kn (k); } m[0] ^= k[0]; m[1] ^= k[1]; m[2] ^= k[2]; m[3] ^= k[3]; m[0] ^= iv[0]; m[1] ^= iv[1]; m[2] ^= iv[2]; m[3] ^= iv[3]; aes128_encrypt (ks, m, keymic, s_te0, s_te1, s_te2, s_te3, s_te4); } /** * final compare */ if ((keymic[0] == wpa->keymic[0]) && (keymic[1] == wpa->keymic[1]) && (keymic[2] == wpa->keymic[2]) && (keymic[3] == wpa->keymic[3])) { if (atomic_inc (&hashes_shown[digest_cur]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, digest_cur, gid, 0); } } } } hashcat-4.0.1/OpenCL/m02501.cl000066400000000000000000000444111320027462700154220ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #include "inc_hash_sha1.cl" #include "inc_hash_sha256.cl" #include "inc_cipher_aes.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" u8 hex_convert (const u8 c) { return (c & 15) + (c >> 6) * 9; } u8 hex_to_u8 (const u8 hex[2]) { u8 v = 0; v |= ((u8) hex_convert (hex[1]) << 0); v |= ((u8) hex_convert (hex[0]) << 4); return (v); } void make_kn (u32 *k) { u32 kl[4]; u32 kr[4]; kl[0] = (k[0] << 1) & 0xfefefefe; kl[1] = (k[1] << 1) & 0xfefefefe; kl[2] = (k[2] << 1) & 0xfefefefe; kl[3] = (k[3] << 1) & 0xfefefefe; kr[0] = (k[0] >> 7) & 0x01010101; kr[1] = (k[1] >> 7) & 0x01010101; kr[2] = (k[2] >> 7) & 0x01010101; kr[3] = (k[3] >> 7) & 0x01010101; const u32 c = kr[0] & 1; kr[0] = kr[0] >> 8 | kr[1] << 24; kr[1] = kr[1] >> 8 | kr[2] << 24; kr[2] = kr[2] >> 8 | kr[3] << 24; kr[3] = kr[3] >> 8; k[0] = kl[0] | kr[0]; k[1] = kl[1] | kr[1]; k[2] = kl[2] | kr[2]; k[3] = kl[3] | kr[3]; k[3] ^= c * 0x87000000; } __kernel void m02501_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global wpapmk_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 in[16]; in[ 0] = pws[gid].i[ 0]; in[ 1] = pws[gid].i[ 1]; in[ 2] = pws[gid].i[ 2]; in[ 3] = pws[gid].i[ 3]; in[ 4] = pws[gid].i[ 4]; in[ 5] = pws[gid].i[ 5]; in[ 6] = pws[gid].i[ 6]; in[ 7] = pws[gid].i[ 7]; in[ 8] = pws[gid].i[ 8]; in[ 9] = pws[gid].i[ 9]; in[10] = pws[gid].i[10]; in[11] = pws[gid].i[11]; in[12] = pws[gid].i[12]; in[13] = pws[gid].i[13]; in[14] = pws[gid].i[14]; in[15] = pws[gid].i[15]; u8 *in_ptr = (u8 *) in; u32 out[8]; u8 *out_ptr = (u8 *) out; for (int i = 0, j = 0; i < 32; i += 1, j += 2) { out_ptr[i] = hex_to_u8 (in_ptr + j); } tmps[gid].out[0] = swap32_S (out[0]); tmps[gid].out[1] = swap32_S (out[1]); tmps[gid].out[2] = swap32_S (out[2]); tmps[gid].out[3] = swap32_S (out[3]); tmps[gid].out[4] = swap32_S (out[4]); tmps[gid].out[5] = swap32_S (out[5]); tmps[gid].out[6] = swap32_S (out[6]); tmps[gid].out[7] = swap32_S (out[7]); } __kernel void m02501_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global wpapmk_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; } __kernel void m02501_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global wpapmk_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; u32 out[8]; 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]; const u32 digest_pos = loop_pos; const u32 digest_cur = digests_offset + digest_pos; __global const wpa_t *wpa = &wpa_bufs[digest_cur]; u32 pke[32]; pke[ 0] = wpa->pke[ 0]; pke[ 1] = wpa->pke[ 1]; pke[ 2] = wpa->pke[ 2]; pke[ 3] = wpa->pke[ 3]; pke[ 4] = wpa->pke[ 4]; pke[ 5] = wpa->pke[ 5]; pke[ 6] = wpa->pke[ 6]; pke[ 7] = wpa->pke[ 7]; pke[ 8] = wpa->pke[ 8]; pke[ 9] = wpa->pke[ 9]; pke[10] = wpa->pke[10]; pke[11] = wpa->pke[11]; pke[12] = wpa->pke[12]; pke[13] = wpa->pke[13]; pke[14] = wpa->pke[14]; pke[15] = wpa->pke[15]; pke[16] = wpa->pke[16]; pke[17] = wpa->pke[17]; pke[18] = wpa->pke[18]; pke[19] = wpa->pke[19]; pke[20] = wpa->pke[20]; pke[21] = wpa->pke[21]; pke[22] = wpa->pke[22]; pke[23] = wpa->pke[23]; pke[24] = wpa->pke[24]; pke[25] = wpa->pke[25]; pke[26] = wpa->pke[26]; pke[27] = wpa->pke[27]; pke[28] = wpa->pke[28]; pke[29] = wpa->pke[29]; pke[30] = wpa->pke[30]; pke[31] = wpa->pke[31]; u32 to; if (wpa->nonce_compare < 0) { to = pke[15] << 24 | pke[16] >> 8; } else { to = pke[23] << 24 | pke[24] >> 8; } const u32 nonce_error_corrections = wpa->nonce_error_corrections; for (u32 nonce_error_correction = 0; nonce_error_correction <= nonce_error_corrections; nonce_error_correction++) { u32 t = to; t = swap32_S (t); t -= nonce_error_corrections / 2; t += nonce_error_correction; t = swap32_S (t); if (wpa->nonce_compare < 0) { pke[15] = (pke[15] & ~0x000000ff) | (t >> 24); pke[16] = (pke[16] & ~0xffffff00) | (t << 8); } else { pke[23] = (pke[23] & ~0x000000ff) | (t >> 24); pke[24] = (pke[24] & ~0xffffff00) | (t << 8); } u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[3]; w1[0] = out[4]; w1[1] = out[5]; w1[2] = out[6]; w1[3] = 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; u32 keymic[4]; keymic[0] = 0; keymic[1] = 0; keymic[2] = 0; keymic[3] = 0; if (wpa->keyver == 1) { sha1_hmac_ctx_t ctx1; sha1_hmac_init_64 (&ctx1, w0, w1, w2, w3); sha1_hmac_update (&ctx1, pke, 100); sha1_hmac_final (&ctx1); u32 digest[4]; digest[0] = ctx1.opad.h[0]; digest[1] = ctx1.opad.h[1]; digest[2] = ctx1.opad.h[2]; digest[3] = ctx1.opad.h[3]; u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; t0[0] = swap32_S (digest[0]); t0[1] = swap32_S (digest[1]); t0[2] = swap32_S (digest[2]); t0[3] = swap32_S (digest[3]); t1[0] = 0; t1[1] = 0; t1[2] = 0; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; md5_hmac_ctx_t ctx2; md5_hmac_init_64 (&ctx2, t0, t1, t2, t3); md5_hmac_update_global (&ctx2, wpa->eapol, wpa->eapol_len); md5_hmac_final (&ctx2); keymic[0] = ctx2.opad.h[0]; keymic[1] = ctx2.opad.h[1]; keymic[2] = ctx2.opad.h[2]; keymic[3] = ctx2.opad.h[3]; } else if (wpa->keyver == 2) { sha1_hmac_ctx_t ctx1; sha1_hmac_init_64 (&ctx1, w0, w1, w2, w3); sha1_hmac_update (&ctx1, pke, 100); sha1_hmac_final (&ctx1); u32 digest[4]; digest[0] = ctx1.opad.h[0]; digest[1] = ctx1.opad.h[1]; digest[2] = ctx1.opad.h[2]; digest[3] = ctx1.opad.h[3]; u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; t0[0] = digest[0]; t0[1] = digest[1]; t0[2] = digest[2]; t0[3] = digest[3]; t1[0] = 0; t1[1] = 0; t1[2] = 0; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; sha1_hmac_ctx_t ctx2; sha1_hmac_init_64 (&ctx2, t0, t1, t2, t3); sha1_hmac_update_global (&ctx2, wpa->eapol, wpa->eapol_len); sha1_hmac_final (&ctx2); keymic[0] = ctx2.opad.h[0]; keymic[1] = ctx2.opad.h[1]; keymic[2] = ctx2.opad.h[2]; keymic[3] = ctx2.opad.h[3]; } else if (wpa->keyver == 3) { sha256_hmac_ctx_t ctx1; sha256_hmac_init_64 (&ctx1, w0, w1, w2, w3); sha256_hmac_update (&ctx1, pke, 102); sha256_hmac_final (&ctx1); u32 digest[4]; digest[0] = swap32_S (ctx1.opad.h[0]); digest[1] = swap32_S (ctx1.opad.h[1]); digest[2] = swap32_S (ctx1.opad.h[2]); digest[3] = swap32_S (ctx1.opad.h[3]); // AES CMAC u32 ks[44]; aes128_set_encrypt_key (ks, digest, s_te0, s_te1, s_te2, s_te3, s_te4); u32 m[4]; m[0] = 0; m[1] = 0; m[2] = 0; m[3] = 0; u32 iv[4]; iv[0] = 0; iv[1] = 0; iv[2] = 0; iv[3] = 0; int eapol_left; int eapol_idx; for (eapol_left = wpa->eapol_len, eapol_idx = 0; eapol_left > 16; eapol_left -= 16, eapol_idx += 4) { m[0] = wpa->eapol[eapol_idx + 0] ^ iv[0]; m[1] = wpa->eapol[eapol_idx + 1] ^ iv[1]; m[2] = wpa->eapol[eapol_idx + 2] ^ iv[2]; m[3] = wpa->eapol[eapol_idx + 3] ^ iv[3]; aes128_encrypt (ks, m, iv, s_te0, s_te1, s_te2, s_te3, s_te4); } m[0] = wpa->eapol[eapol_idx + 0]; m[1] = wpa->eapol[eapol_idx + 1]; m[2] = wpa->eapol[eapol_idx + 2]; m[3] = wpa->eapol[eapol_idx + 3]; u32 k[4]; k[0] = 0; k[1] = 0; k[2] = 0; k[3] = 0; aes128_encrypt (ks, k, k, s_te0, s_te1, s_te2, s_te3, s_te4); make_kn (k); if (eapol_left < 16) { make_kn (k); } m[0] ^= k[0]; m[1] ^= k[1]; m[2] ^= k[2]; m[3] ^= k[3]; m[0] ^= iv[0]; m[1] ^= iv[1]; m[2] ^= iv[2]; m[3] ^= iv[3]; aes128_encrypt (ks, m, keymic, s_te0, s_te1, s_te2, s_te3, s_te4); } /** * final compare */ if ((keymic[0] == wpa->keymic[0]) && (keymic[1] == wpa->keymic[1]) && (keymic[2] == wpa->keymic[2]) && (keymic[3] == wpa->keymic[3])) { if (atomic_inc (&hashes_shown[digest_cur]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, digest_cur, gid, 0); } } } // the same code again, but with BE order for the t++ for (u32 nonce_error_correction = 0; nonce_error_correction <= nonce_error_corrections; nonce_error_correction++) { u32 t = to; t -= nonce_error_corrections / 2; t += nonce_error_correction; if (t == to) continue; // we already had this checked in the LE loop if (wpa->nonce_compare < 0) { pke[15] = (pke[15] & ~0x000000ff) | (t >> 24); pke[16] = (pke[16] & ~0xffffff00) | (t << 8); } else { pke[23] = (pke[23] & ~0x000000ff) | (t >> 24); pke[24] = (pke[24] & ~0xffffff00) | (t << 8); } u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[3]; w1[0] = out[4]; w1[1] = out[5]; w1[2] = out[6]; w1[3] = 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; u32 keymic[4]; keymic[0] = 0; keymic[1] = 0; keymic[2] = 0; keymic[3] = 0; if (wpa->keyver == 1) { sha1_hmac_ctx_t ctx1; sha1_hmac_init_64 (&ctx1, w0, w1, w2, w3); sha1_hmac_update (&ctx1, pke, 100); sha1_hmac_final (&ctx1); u32 digest[4]; digest[0] = ctx1.opad.h[0]; digest[1] = ctx1.opad.h[1]; digest[2] = ctx1.opad.h[2]; digest[3] = ctx1.opad.h[3]; u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; t0[0] = swap32_S (digest[0]); t0[1] = swap32_S (digest[1]); t0[2] = swap32_S (digest[2]); t0[3] = swap32_S (digest[3]); t1[0] = 0; t1[1] = 0; t1[2] = 0; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; md5_hmac_ctx_t ctx2; md5_hmac_init_64 (&ctx2, t0, t1, t2, t3); md5_hmac_update_global (&ctx2, wpa->eapol, wpa->eapol_len); md5_hmac_final (&ctx2); keymic[0] = ctx2.opad.h[0]; keymic[1] = ctx2.opad.h[1]; keymic[2] = ctx2.opad.h[2]; keymic[3] = ctx2.opad.h[3]; } else if (wpa->keyver == 2) { sha1_hmac_ctx_t ctx1; sha1_hmac_init_64 (&ctx1, w0, w1, w2, w3); sha1_hmac_update (&ctx1, pke, 100); sha1_hmac_final (&ctx1); u32 digest[4]; digest[0] = ctx1.opad.h[0]; digest[1] = ctx1.opad.h[1]; digest[2] = ctx1.opad.h[2]; digest[3] = ctx1.opad.h[3]; u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; t0[0] = digest[0]; t0[1] = digest[1]; t0[2] = digest[2]; t0[3] = digest[3]; t1[0] = 0; t1[1] = 0; t1[2] = 0; t1[3] = 0; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; sha1_hmac_ctx_t ctx2; sha1_hmac_init_64 (&ctx2, t0, t1, t2, t3); sha1_hmac_update_global (&ctx2, wpa->eapol, wpa->eapol_len); sha1_hmac_final (&ctx2); keymic[0] = ctx2.opad.h[0]; keymic[1] = ctx2.opad.h[1]; keymic[2] = ctx2.opad.h[2]; keymic[3] = ctx2.opad.h[3]; } else if (wpa->keyver == 3) { sha256_hmac_ctx_t ctx1; sha256_hmac_init_64 (&ctx1, w0, w1, w2, w3); sha256_hmac_update (&ctx1, pke, 102); sha256_hmac_final (&ctx1); u32 digest[4]; digest[0] = swap32_S (ctx1.opad.h[0]); digest[1] = swap32_S (ctx1.opad.h[1]); digest[2] = swap32_S (ctx1.opad.h[2]); digest[3] = swap32_S (ctx1.opad.h[3]); // AES CMAC u32 ks[44]; aes128_set_encrypt_key (ks, digest, s_te0, s_te1, s_te2, s_te3, s_te4); u32 m[4]; m[0] = 0; m[1] = 0; m[2] = 0; m[3] = 0; u32 iv[4]; iv[0] = 0; iv[1] = 0; iv[2] = 0; iv[3] = 0; int eapol_left; int eapol_idx; for (eapol_left = wpa->eapol_len, eapol_idx = 0; eapol_left > 16; eapol_left -= 16, eapol_idx += 4) { m[0] = wpa->eapol[eapol_idx + 0] ^ iv[0]; m[1] = wpa->eapol[eapol_idx + 1] ^ iv[1]; m[2] = wpa->eapol[eapol_idx + 2] ^ iv[2]; m[3] = wpa->eapol[eapol_idx + 3] ^ iv[3]; aes128_encrypt (ks, m, iv, s_te0, s_te1, s_te2, s_te3, s_te4); } m[0] = wpa->eapol[eapol_idx + 0]; m[1] = wpa->eapol[eapol_idx + 1]; m[2] = wpa->eapol[eapol_idx + 2]; m[3] = wpa->eapol[eapol_idx + 3]; u32 k[4]; k[0] = 0; k[1] = 0; k[2] = 0; k[3] = 0; aes128_encrypt (ks, k, k, s_te0, s_te1, s_te2, s_te3, s_te4); make_kn (k); if (eapol_left < 16) { make_kn (k); } m[0] ^= k[0]; m[1] ^= k[1]; m[2] ^= k[2]; m[3] ^= k[3]; m[0] ^= iv[0]; m[1] ^= iv[1]; m[2] ^= iv[2]; m[3] ^= iv[3]; aes128_encrypt (ks, m, keymic, s_te0, s_te1, s_te2, s_te3, s_te4); } /** * final compare */ if ((keymic[0] == wpa->keymic[0]) && (keymic[1] == wpa->keymic[1]) && (keymic[2] == wpa->keymic[2]) && (keymic[3] == wpa->keymic[3])) { if (atomic_inc (&hashes_shown[digest_cur]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, digest_pos, digest_cur, gid, 0); } } } } hashcat-4.0.1/OpenCL/m02610_a0-optimized.cl000066400000000000000000000710201320027462700200010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m02610_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = salt_buf0[0]; w2[1] = salt_buf0[1]; w2[2] = salt_buf0[2]; w2[3] = salt_buf0[3]; w3[0] = salt_buf1[0]; w3[1] = salt_buf1[1]; w3[2] = (32 + salt_len) * 8; w3[3] = 0; a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m02610_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02610_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02610_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = salt_buf0[0]; w2[1] = salt_buf0[1]; w2[2] = salt_buf0[2]; w2[3] = salt_buf0[3]; w3[0] = salt_buf1[0]; w3[1] = salt_buf1[1]; w3[2] = (32 + salt_len) * 8; w3[3] = 0; a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m02610_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02610_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m02610_a0.cl000066400000000000000000000203471320027462700160050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m02610_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, tmp.i, tmp.pw_len); md5_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m02610_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, tmp.i, tmp.pw_len); md5_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m02610_a1-optimized.cl000066400000000000000000000772611320027462700200170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m02610_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = salt_buf0[0]; w2[1] = salt_buf0[1]; w2[2] = salt_buf0[2]; w2[3] = salt_buf0[3]; w3[0] = salt_buf1[0]; w3[1] = salt_buf1[1]; w3[2] = (32 + salt_len) * 8; w3[3] = 0; a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m02610_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02610_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02610_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = salt_buf0[0]; w2[1] = salt_buf0[1]; w2[2] = salt_buf0[2]; w2[3] = salt_buf0[3]; w3[0] = salt_buf1[0]; w3[1] = salt_buf1[1]; w3[2] = (32 + salt_len) * 8; w3[3] = 0; a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m02610_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02610_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m02610_a1.cl000066400000000000000000000202561320027462700160050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m02610_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m02610_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m02610_a3-optimized.cl000066400000000000000000001156461320027462700200210ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void m02610m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * 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); u32x t; 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; 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] = salt_buf0[0]; w2_t[1] = salt_buf0[1]; w2_t[2] = salt_buf0[2]; w2_t[3] = salt_buf0[3]; w3_t[0] = salt_buf1[0]; w3_t[1] = salt_buf1[1]; w3_t[2] = (32 + salt_len) * 8; w3_t[3] = 0; 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); COMPARE_M_SIMD (a, d, c, b); } } void m02610s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * 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); u32x t; 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; 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] = salt_buf0[0]; w2_t[1] = salt_buf0[1]; w2_t[2] = salt_buf0[2]; w2_t[3] = salt_buf0[3]; w3_t[0] = salt_buf1[0]; w3_t[1] = salt_buf1[1]; w3_t[2] = (32 + salt_len) * 8; w3_t[3] = 0; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m02610_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m02610_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m02610_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m02610_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m02610_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m02610_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } hashcat-4.0.1/OpenCL/m02610_a3.cl000066400000000000000000000212001320027462700157750ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m02610_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx0; md5_init_vector (&ctx0); md5_update_vector (&ctx0, w, pw_len); md5_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; md5_ctx_vector_t ctx; md5_init_vector (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update_vector (&ctx, s, salt_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m02610_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx0; md5_init_vector (&ctx0); md5_update_vector (&ctx0, w, pw_len); md5_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; md5_ctx_vector_t ctx; md5_init_vector (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update_vector (&ctx, s, salt_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m02710_a0-optimized.cl000066400000000000000000001105361320027462700200100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m02710_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = salt_buf0[0]; w2[1] = salt_buf0[1]; w2[2] = salt_buf0[2]; w2[3] = salt_buf0[3]; w3[0] = salt_buf1[0]; w3[1] = salt_buf1[1]; w3[2] = salt_buf1[2]; w3[3] = salt_buf1[3]; a = MD5M_A; b = MD5M_B; c = MD5M_C; 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 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; const u32x r_14 = (32 + salt_len) * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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; COMPARE_M_SIMD (a, d, c, b); } } __kernel void m02710_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02710_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02710_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = salt_buf0[0]; w2[1] = salt_buf0[1]; w2[2] = salt_buf0[2]; w2[3] = salt_buf0[3]; w3[0] = salt_buf1[0]; w3[1] = salt_buf1[1]; w3[2] = salt_buf1[2]; w3[3] = salt_buf1[3]; a = MD5M_A; b = MD5M_B; c = MD5M_C; 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 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; const u32x r_14 = (32 + salt_len) * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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 (MATCHES_NONE_VS ((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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m02710_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02710_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m02710_a1-optimized.cl000066400000000000000000001167771320027462700200260ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m02710_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = salt_buf0[0]; w2[1] = salt_buf0[1]; w2[2] = salt_buf0[2]; w2[3] = salt_buf0[3]; w3[0] = salt_buf1[0]; w3[1] = salt_buf1[1]; w3[2] = salt_buf1[2]; w3[3] = salt_buf1[3]; a = MD5M_A; b = MD5M_B; c = MD5M_C; 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 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; const u32x r_14 = (32 + salt_len) * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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; COMPARE_M_SIMD (a, d, c, b); } } __kernel void m02710_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02710_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02710_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = salt_buf0[0]; w2[1] = salt_buf0[1]; w2[2] = salt_buf0[2]; w2[3] = salt_buf0[3]; w3[0] = salt_buf1[0]; w3[1] = salt_buf1[1]; w3[2] = salt_buf1[2]; w3[3] = salt_buf1[3]; a = MD5M_A; b = MD5M_B; c = MD5M_C; 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 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; const u32x r_14 = (32 + salt_len) * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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 (MATCHES_NONE_VS ((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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m02710_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02710_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m02710_a3-optimized.cl000066400000000000000000001353631320027462700200200ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void m02710m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * 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); u32x t; 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; 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] = salt_buf0[0]; w2_t[1] = salt_buf0[1]; w2_t[2] = salt_buf0[2]; w2_t[3] = salt_buf0[3]; w3_t[0] = salt_buf1[0]; w3_t[1] = salt_buf1[1]; w3_t[2] = salt_buf1[2]; w3_t[3] = salt_buf1[3]; 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); 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; const u32x r_14 = (32 + salt_len) * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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; COMPARE_M_SIMD (a, d, c, b); } } void m02710s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * 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); u32x t; 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; 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] = salt_buf0[0]; w2_t[1] = salt_buf0[1]; w2_t[2] = salt_buf0[2]; w2_t[3] = salt_buf0[3]; w3_t[0] = salt_buf1[0]; w3_t[1] = salt_buf1[1]; w3_t[2] = salt_buf1[2]; w3_t[3] = salt_buf1[3]; 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); 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; const u32x r_14 = (32 + salt_len) * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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 (MATCHES_NONE_VS ((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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m02710_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m02710_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m02710_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m02710_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m02710_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m02710_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } hashcat-4.0.1/OpenCL/m02810_a0-optimized.cl000066400000000000000000001106541320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m02810_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; salt_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[2]; salt_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[3]; salt_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[4]; salt_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[5]; salt_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[6]; salt_buf1[3] = salt_bufs[salt_pos].salt_buf_pc[7]; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; 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] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w2[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w2[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w2[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w3[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w3[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w3[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w3[3] = 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[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 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; const u32x r_00 = 0x80; const u32x r_14 = 64 * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, r_00, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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; COMPARE_M_SIMD (a, d, c, b); } } __kernel void m02810_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02810_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02810_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; salt_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[2]; salt_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[3]; salt_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[4]; salt_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[5]; salt_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[6]; salt_buf1[3] = salt_bufs[salt_pos].salt_buf_pc[7]; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; 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] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w2[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w2[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w2[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w3[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w3[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w3[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w3[3] = 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[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 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; const u32x r_00 = 0x80; const u32x r_14 = 64 * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, r_00, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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 (MATCHES_NONE_VS ((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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m02810_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02810_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m02810_a0.cl000066400000000000000000000223331320027462700160040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m02810_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = 32; u32 s[8] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf_pc[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, tmp.i, tmp.pw_len); md5_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = s[0]; ctx.w0[1] = s[1]; ctx.w0[2] = s[2]; ctx.w0[3] = s[3]; ctx.w1[0] = s[4]; ctx.w1[1] = s[5]; ctx.w1[2] = s[6]; ctx.w1[3] = s[7]; ctx.w2[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w2[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w2[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w3[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w3[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w3[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w3[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); ctx.w0[0] = 0x80; ctx.w0[1] = 0; ctx.w0[2] = 0; ctx.w0[3] = 0; ctx.w1[0] = 0; ctx.w1[1] = 0; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 64 * 8; ctx.w3[3] = 0; md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m02810_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = 32; u32 s[8] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf_pc[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, tmp.i, tmp.pw_len); md5_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = s[0]; ctx.w0[1] = s[1]; ctx.w0[2] = s[2]; ctx.w0[3] = s[3]; ctx.w1[0] = s[4]; ctx.w1[1] = s[5]; ctx.w1[2] = s[6]; ctx.w1[3] = s[7]; ctx.w2[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w2[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w2[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w3[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w3[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w3[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w3[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); ctx.w0[0] = 0x80; ctx.w0[1] = 0; ctx.w0[2] = 0; ctx.w0[3] = 0; ctx.w1[0] = 0; ctx.w1[1] = 0; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 64 * 8; ctx.w3[3] = 0; md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m02810_a1-optimized.cl000066400000000000000000001171151320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m02810_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; salt_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[2]; salt_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[3]; salt_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[4]; salt_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[5]; salt_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[6]; salt_buf1[3] = salt_bufs[salt_pos].salt_buf_pc[7]; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; 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] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w2[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w2[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w2[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w3[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w3[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w3[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w3[3] = 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[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 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; const u32x r_00 = 0x80; const u32x r_14 = 64 * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, r_00, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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; COMPARE_M_SIMD (a, d, c, b); } } __kernel void m02810_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02810_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02810_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; salt_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[2]; salt_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[3]; salt_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[4]; salt_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[5]; salt_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[6]; salt_buf1[3] = salt_bufs[salt_pos].salt_buf_pc[7]; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; 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] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w2[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w2[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w2[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w3[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w3[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w3[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w3[3] = 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[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 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; const u32x r_00 = 0x80; const u32x r_14 = 64 * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, r_00, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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 (MATCHES_NONE_VS ((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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m02810_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m02810_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m02810_a1.cl000066400000000000000000000222421320027462700160040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m02810_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 salt_len = 32; u32 s[8] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf_pc[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = s[0]; ctx.w0[1] = s[1]; ctx.w0[2] = s[2]; ctx.w0[3] = s[3]; ctx.w1[0] = s[4]; ctx.w1[1] = s[5]; ctx.w1[2] = s[6]; ctx.w1[3] = s[7]; ctx.w2[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w2[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w2[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w3[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w3[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w3[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w3[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); ctx.w0[0] = 0x80; ctx.w0[1] = 0; ctx.w0[2] = 0; ctx.w0[3] = 0; ctx.w1[0] = 0; ctx.w1[1] = 0; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 64 * 8; ctx.w3[3] = 0; md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m02810_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 salt_len = 32; u32 s[8] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf_pc[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = s[0]; ctx.w0[1] = s[1]; ctx.w0[2] = s[2]; ctx.w0[3] = s[3]; ctx.w1[0] = s[4]; ctx.w1[1] = s[5]; ctx.w1[2] = s[6]; ctx.w1[3] = s[7]; ctx.w2[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w2[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w2[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w3[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w3[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w3[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w3[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); ctx.w0[0] = 0x80; ctx.w0[1] = 0; ctx.w0[2] = 0; ctx.w0[3] = 0; ctx.w1[0] = 0; ctx.w1[1] = 0; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 64 * 8; ctx.w3[3] = 0; md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m02810_a3-optimized.cl000066400000000000000000001355011320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void m02810m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; salt_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[2]; salt_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[3]; salt_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[4]; salt_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[5]; salt_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[6]; salt_buf1[3] = salt_bufs[salt_pos].salt_buf_pc[7]; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * 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); u32x t; 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; 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] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w2_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w2_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w2_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w3_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w3_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w3_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w3_t[3] = 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[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 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; const u32x r_00 = 0x80; const u32x r_14 = 64 * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, r_00, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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; COMPARE_M_SIMD (a, d, c, b); } } void m02810s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; salt_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[2]; salt_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[3]; salt_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[4]; salt_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[5]; salt_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[6]; salt_buf1[3] = salt_bufs[salt_pos].salt_buf_pc[7]; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * 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); u32x t; 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; 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] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w2_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w2_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w2_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w3_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w3_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w3_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w3_t[3] = 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[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 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; const u32x r_00 = 0x80; const u32x r_14 = 64 * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, r_00, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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 (MATCHES_NONE_VS ((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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m02810_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m02810_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m02810_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m02810_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m02810_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m02810_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } hashcat-4.0.1/OpenCL/m02810_a3.cl000066400000000000000000000231721320027462700160110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m02810_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = 32; u32 s[8] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf_pc[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; md5_ctx_vector_t ctx0; md5_init_vector (&ctx0); md5_update_vector (&ctx0, w, pw_len); md5_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; md5_ctx_vector_t ctx; md5_init_vector (&ctx); ctx.w0[0] = s[0]; ctx.w0[1] = s[1]; ctx.w0[2] = s[2]; ctx.w0[3] = s[3]; ctx.w1[0] = s[4]; ctx.w1[1] = s[5]; ctx.w1[2] = s[6]; ctx.w1[3] = s[7]; ctx.w2[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w2[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w2[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w3[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w3[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w3[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w3[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; md5_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); ctx.w0[0] = 0x80; ctx.w0[1] = 0; ctx.w0[2] = 0; ctx.w0[3] = 0; ctx.w1[0] = 0; ctx.w1[1] = 0; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 64 * 8; ctx.w3[3] = 0; md5_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m02810_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = 32; u32 s[8] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf_pc[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; md5_ctx_vector_t ctx0; md5_init_vector (&ctx0); md5_update_vector (&ctx0, w, pw_len); md5_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; md5_ctx_vector_t ctx; md5_init_vector (&ctx); ctx.w0[0] = s[0]; ctx.w0[1] = s[1]; ctx.w0[2] = s[2]; ctx.w0[3] = s[3]; ctx.w1[0] = s[4]; ctx.w1[1] = s[5]; ctx.w1[2] = s[6]; ctx.w1[3] = s[7]; ctx.w2[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w2[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w2[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w3[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w3[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w3[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w3[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; md5_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); ctx.w0[0] = 0x80; ctx.w0[1] = 0; ctx.w0[2] = 0; ctx.w0[3] = 0; ctx.w1[0] = 0; ctx.w1[1] = 0; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 64 * 8; ctx.w3[3] = 0; md5_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m03000_a0.cl000066400000000000000000000600511320027462700157730ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_simd.cl" #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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif void _des_crypt_encrypt (u32 iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64]) { u32 r = data[0]; u32 l = data[1]; #ifdef _unroll #pragma unroll #endif for (u32 i = 0; i < 16; i += 2) { u32 u; u32 t; u = Kc[i + 0] ^ rotl32 (r, 30u); t = Kd[i + 0] ^ rotl32 (r, 26u); 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); u = Kc[i + 1] ^ rotl32 (l, 30u); t = Kd[i + 1] ^ rotl32 (l, 26u); 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); } iv[0] = rotl32 (l, 29); iv[1] = rotl32 (r, 29); } void _des_crypt_keysetup (u32 c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[64]) { u32 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; #ifdef _unroll #pragma unroll #endif 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 u32 c00 = (c >> 0) & 0x0000003f; const u32 c06 = (c >> 6) & 0x00383003; const u32 c07 = (c >> 7) & 0x0000003c; const u32 c13 = (c >> 13) & 0x0000060f; const u32 c20 = (c >> 20) & 0x00000001; u32 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 u32 d00 = (d >> 0) & 0x00003c3f; const u32 d07 = (d >> 7) & 0x00003f03; const u32 d21 = (d >> 21) & 0x0000000f; const u32 d22 = (d >> 22) & 0x00000030; u32 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)); } } void transform_netntlmv1_key (const u32 w0, const u32x w1, u32x out[2]) { u32 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; u32 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); } __kernel void m03000_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * main */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); u32 key[2]; transform_netntlmv1_key (tmp.i[0], tmp.i[1], key); const u32 c = key[0]; const u32 d = key[1]; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32 data[2]; data[0] = LM_IV_0_IP_RR3; data[1] = LM_IV_1_IP_RR3; u32 iv[2]; _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); u32 z = 0; COMPARE_M_SIMD (iv[0], iv[1], z, z); } } __kernel void m03000_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_buf[digests_offset].digest_buf[DGST_R1], 0, 0 }; /** * main */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); u32 key[2]; transform_netntlmv1_key (tmp.i[0], tmp.i[1], key); const u32 c = key[0]; const u32 d = key[1]; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32 data[2]; data[0] = LM_IV_0_IP_RR3; data[1] = LM_IV_1_IP_RR3; u32 iv[2]; _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); u32 z = 0; COMPARE_S_SIMD (iv[0], iv[1], z, z); } } hashcat-4.0.1/OpenCL/m03000_a1.cl000066400000000000000000000702541320027462700160020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif void _des_crypt_encrypt (u32 iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64]) { u32 r = data[0]; u32 l = data[1]; #ifdef _unroll #pragma unroll #endif for (u32 i = 0; i < 16; i += 2) { u32 u; u32 t; u = Kc[i + 0] ^ rotl32 (r, 30u); t = Kd[i + 0] ^ rotl32 (r, 26u); 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); u = Kc[i + 1] ^ rotl32 (l, 30u); t = Kd[i + 1] ^ rotl32 (l, 26u); 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); } iv[0] = rotl32 (l, 29); iv[1] = rotl32 (r, 29); } void _des_crypt_keysetup (u32 c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[64]) { u32 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; #ifdef _unroll #pragma unroll #endif 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 u32 c00 = (c >> 0) & 0x0000003f; const u32 c06 = (c >> 6) & 0x00383003; const u32 c07 = (c >> 7) & 0x0000003c; const u32 c13 = (c >> 13) & 0x0000060f; const u32 c20 = (c >> 20) & 0x00000001; u32 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 u32 d00 = (d >> 0) & 0x00003c3f; const u32 d07 = (d >> 7) & 0x00003f03; const u32 d21 = (d >> 21) & 0x0000000f; const u32 d22 = (d >> 22) & 0x00000030; u32 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)); } } void transform_netntlmv1_key (const u32 w0, const u32x w1, u32x out[2]) { u32 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; u32 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); } __kernel void m03000_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32 pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32 wordl0[4] = { 0 }; u32 wordl1[4] = { 0 }; u32 wordl2[4] = { 0 }; u32 wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32 wordr0[4] = { 0 }; u32 wordr1[4] = { 0 }; u32 wordr2[4] = { 0 }; u32 wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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]; /** * DES */ u32 key[2]; transform_netntlmv1_key (w0[0], w0[1], key); const u32 c = key[0]; const u32 d = key[1]; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32 data[2]; data[0] = LM_IV_0_IP_RR3; data[1] = LM_IV_1_IP_RR3; u32 iv[2]; _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); u32 z = 0; COMPARE_M_SIMD (iv[0], iv[1], z, z); } } __kernel void m03000_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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], 0, 0 }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32 pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32 wordl0[4] = { 0 }; u32 wordl1[4] = { 0 }; u32 wordl2[4] = { 0 }; u32 wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32 wordr0[4] = { 0 }; u32 wordr1[4] = { 0 }; u32 wordr2[4] = { 0 }; u32 wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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]; /** * DES */ u32 key[2]; transform_netntlmv1_key (w0[0], w0[1], key); const u32 c = key[0]; const u32 d = key[1]; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32 data[2]; data[0] = LM_IV_0_IP_RR3; data[1] = LM_IV_1_IP_RR3; u32 iv[2]; _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); u32 z = 0; COMPARE_S_SIMD (iv[0], iv[1], z, z); } } hashcat-4.0.1/OpenCL/m03000_a3.cl000066400000000000000000003065461320027462700160120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT * NOTE........: sboxes for maxwell were taken from DeepLearningJohnDoe, license below * : sboxes for others were takes fron JtR, license below */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #define COMPARE_S "inc_comp_single_bs.cl" #define COMPARE_M "inc_comp_multi_bs.cl" #ifdef IS_NV #define KXX_DECL #endif #ifdef IS_AMD #define KXX_DECL #endif #ifdef IS_GENERIC #define KXX_DECL #endif #ifdef IS_NV #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 volatile ("lop3.b32 %0, %1, %2, %3, "#e";" : "=r"(a): "r"(b), "r"(c), "r"(d)); 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; } 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; } 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; } 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; } 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; } 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; } 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; } 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 */ 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; } 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; } 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; } 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; } 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; } 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; } 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; } 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 #endif #if defined IS_AMD || defined IS_GENERIC /* * 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 */ 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; } 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; } 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; } 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; } 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; } 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; } 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; } 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; } 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; #ifdef _unroll #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); } } 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); } void m03000m (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bs_word_t *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ const u32 w0s = pws[gid].i[0]; const u32 w1s = pws[gid].i[1]; #define K00 (((w0s >> ( 0 + 7)) & 1) ? -1 : 0) #define K01 (((w0s >> ( 0 + 6)) & 1) ? -1 : 0) #define K02 (((w0s >> ( 0 + 5)) & 1) ? -1 : 0) #define K03 (((w0s >> ( 0 + 4)) & 1) ? -1 : 0) #define K04 (((w0s >> ( 0 + 3)) & 1) ? -1 : 0) #define K05 (((w0s >> ( 0 + 2)) & 1) ? -1 : 0) #define K06 (((w0s >> ( 0 + 1)) & 1) ? -1 : 0) #define K07 (((w0s >> ( 0 + 0)) & 1) ? -1 : 0) #define K08 (((w0s >> ( 8 + 7)) & 1) ? -1 : 0) #define K09 (((w0s >> ( 8 + 6)) & 1) ? -1 : 0) #define K10 (((w0s >> ( 8 + 5)) & 1) ? -1 : 0) #define K11 (((w0s >> ( 8 + 4)) & 1) ? -1 : 0) #define K12 (((w0s >> ( 8 + 3)) & 1) ? -1 : 0) #define K13 (((w0s >> ( 8 + 2)) & 1) ? -1 : 0) #define K14 (((w0s >> ( 8 + 1)) & 1) ? -1 : 0) #define K15 (((w0s >> ( 8 + 0)) & 1) ? -1 : 0) #define K16 (((w0s >> (16 + 7)) & 1) ? -1 : 0) #define K17 (((w0s >> (16 + 6)) & 1) ? -1 : 0) #define K18 (((w0s >> (16 + 5)) & 1) ? -1 : 0) #define K19 (((w0s >> (16 + 4)) & 1) ? -1 : 0) #define K20 (((w0s >> (16 + 3)) & 1) ? -1 : 0) #define K21 (((w0s >> (16 + 2)) & 1) ? -1 : 0) #define K22 (((w0s >> (16 + 1)) & 1) ? -1 : 0) #define K23 (((w0s >> (16 + 0)) & 1) ? -1 : 0) #define K24 (((w0s >> (24 + 7)) & 1) ? -1 : 0) #define K25 (((w0s >> (24 + 6)) & 1) ? -1 : 0) #define K26 (((w0s >> (24 + 5)) & 1) ? -1 : 0) #define K27 (((w0s >> (24 + 4)) & 1) ? -1 : 0) #define K28 (((w0s >> (24 + 3)) & 1) ? -1 : 0) #define K29 (((w0s >> (24 + 2)) & 1) ? -1 : 0) #define K30 (((w0s >> (24 + 1)) & 1) ? -1 : 0) #define K31 (((w0s >> (24 + 0)) & 1) ? -1 : 0) #define K32 (((w1s >> ( 0 + 7)) & 1) ? -1 : 0) #define K33 (((w1s >> ( 0 + 6)) & 1) ? -1 : 0) #define K34 (((w1s >> ( 0 + 5)) & 1) ? -1 : 0) #define K35 (((w1s >> ( 0 + 4)) & 1) ? -1 : 0) #define K36 (((w1s >> ( 0 + 3)) & 1) ? -1 : 0) #define K37 (((w1s >> ( 0 + 2)) & 1) ? -1 : 0) #define K38 (((w1s >> ( 0 + 1)) & 1) ? -1 : 0) #define K39 (((w1s >> ( 0 + 0)) & 1) ? -1 : 0) #define K40 (((w1s >> ( 8 + 7)) & 1) ? -1 : 0) #define K41 (((w1s >> ( 8 + 6)) & 1) ? -1 : 0) #define K42 (((w1s >> ( 8 + 5)) & 1) ? -1 : 0) #define K43 (((w1s >> ( 8 + 4)) & 1) ? -1 : 0) #define K44 (((w1s >> ( 8 + 3)) & 1) ? -1 : 0) #define K45 (((w1s >> ( 8 + 2)) & 1) ? -1 : 0) #define K46 (((w1s >> ( 8 + 1)) & 1) ? -1 : 0) #define K47 (((w1s >> ( 8 + 0)) & 1) ? -1 : 0) #define K48 (((w1s >> (16 + 7)) & 1) ? -1 : 0) #define K49 (((w1s >> (16 + 6)) & 1) ? -1 : 0) #define K50 (((w1s >> (16 + 5)) & 1) ? -1 : 0) #define K51 (((w1s >> (16 + 4)) & 1) ? -1 : 0) #define K52 (((w1s >> (16 + 3)) & 1) ? -1 : 0) #define K53 (((w1s >> (16 + 2)) & 1) ? -1 : 0) #define K54 (((w1s >> (16 + 1)) & 1) ? -1 : 0) #define K55 (((w1s >> (16 + 0)) & 1) ? -1 : 0) /** * 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; 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; #ifdef _unroll #pragma unroll #endif 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 = ffz (tmpResult); const u32 r0 = search[0]; const u32 r1 = search[1]; const u32 r2 = 0; const u32 r3 = 0; #include COMPARE_M } } else { u32 out0[32]; u32 out1[32]; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 32; i++) { out0[i] = out[ 0 + 31 - i]; out1[i] = out[32 + 31 - i]; } transpose32c (out0); transpose32c (out1); #ifdef _unroll #pragma unroll #endif for (int slice = 0; slice < 32; slice++) { const u32 r0 = out0[31 - slice]; const u32 r1 = out1[31 - slice]; const u32 r2 = 0; const u32 r3 = 0; #include COMPARE_M } } } void m03000s (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bs_word_t *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * digest */ const u32 s0 = digests_buf[0].digest_buf[0]; const u32 s1 = digests_buf[0].digest_buf[1]; #define S00 (((s0 >> 0) & 1) ? -1 : 0) #define S01 (((s0 >> 1) & 1) ? -1 : 0) #define S02 (((s0 >> 2) & 1) ? -1 : 0) #define S03 (((s0 >> 3) & 1) ? -1 : 0) #define S04 (((s0 >> 4) & 1) ? -1 : 0) #define S05 (((s0 >> 5) & 1) ? -1 : 0) #define S06 (((s0 >> 6) & 1) ? -1 : 0) #define S07 (((s0 >> 7) & 1) ? -1 : 0) #define S08 (((s0 >> 8) & 1) ? -1 : 0) #define S09 (((s0 >> 9) & 1) ? -1 : 0) #define S10 (((s0 >> 10) & 1) ? -1 : 0) #define S11 (((s0 >> 11) & 1) ? -1 : 0) #define S12 (((s0 >> 12) & 1) ? -1 : 0) #define S13 (((s0 >> 13) & 1) ? -1 : 0) #define S14 (((s0 >> 14) & 1) ? -1 : 0) #define S15 (((s0 >> 15) & 1) ? -1 : 0) #define S16 (((s0 >> 16) & 1) ? -1 : 0) #define S17 (((s0 >> 17) & 1) ? -1 : 0) #define S18 (((s0 >> 18) & 1) ? -1 : 0) #define S19 (((s0 >> 19) & 1) ? -1 : 0) #define S20 (((s0 >> 20) & 1) ? -1 : 0) #define S21 (((s0 >> 21) & 1) ? -1 : 0) #define S22 (((s0 >> 22) & 1) ? -1 : 0) #define S23 (((s0 >> 23) & 1) ? -1 : 0) #define S24 (((s0 >> 24) & 1) ? -1 : 0) #define S25 (((s0 >> 25) & 1) ? -1 : 0) #define S26 (((s0 >> 26) & 1) ? -1 : 0) #define S27 (((s0 >> 27) & 1) ? -1 : 0) #define S28 (((s0 >> 28) & 1) ? -1 : 0) #define S29 (((s0 >> 29) & 1) ? -1 : 0) #define S30 (((s0 >> 30) & 1) ? -1 : 0) #define S31 (((s0 >> 31) & 1) ? -1 : 0) #define S32 (((s1 >> 0) & 1) ? -1 : 0) #define S33 (((s1 >> 1) & 1) ? -1 : 0) #define S34 (((s1 >> 2) & 1) ? -1 : 0) #define S35 (((s1 >> 3) & 1) ? -1 : 0) #define S36 (((s1 >> 4) & 1) ? -1 : 0) #define S37 (((s1 >> 5) & 1) ? -1 : 0) #define S38 (((s1 >> 6) & 1) ? -1 : 0) #define S39 (((s1 >> 7) & 1) ? -1 : 0) #define S40 (((s1 >> 8) & 1) ? -1 : 0) #define S41 (((s1 >> 9) & 1) ? -1 : 0) #define S42 (((s1 >> 10) & 1) ? -1 : 0) #define S43 (((s1 >> 11) & 1) ? -1 : 0) #define S44 (((s1 >> 12) & 1) ? -1 : 0) #define S45 (((s1 >> 13) & 1) ? -1 : 0) #define S46 (((s1 >> 14) & 1) ? -1 : 0) #define S47 (((s1 >> 15) & 1) ? -1 : 0) #define S48 (((s1 >> 16) & 1) ? -1 : 0) #define S49 (((s1 >> 17) & 1) ? -1 : 0) #define S50 (((s1 >> 18) & 1) ? -1 : 0) #define S51 (((s1 >> 19) & 1) ? -1 : 0) #define S52 (((s1 >> 20) & 1) ? -1 : 0) #define S53 (((s1 >> 21) & 1) ? -1 : 0) #define S54 (((s1 >> 22) & 1) ? -1 : 0) #define S55 (((s1 >> 23) & 1) ? -1 : 0) #define S56 (((s1 >> 24) & 1) ? -1 : 0) #define S57 (((s1 >> 25) & 1) ? -1 : 0) #define S58 (((s1 >> 26) & 1) ? -1 : 0) #define S59 (((s1 >> 27) & 1) ? -1 : 0) #define S60 (((s1 >> 28) & 1) ? -1 : 0) #define S61 (((s1 >> 29) & 1) ? -1 : 0) #define S62 (((s1 >> 30) & 1) ? -1 : 0) #define S63 (((s1 >> 31) & 1) ? -1 : 0) /** * base */ const u32 w0s = pws[gid].i[0]; const u32 w1s = pws[gid].i[1]; #define K00 (((w0s >> ( 0 + 7)) & 1) ? -1 : 0) #define K01 (((w0s >> ( 0 + 6)) & 1) ? -1 : 0) #define K02 (((w0s >> ( 0 + 5)) & 1) ? -1 : 0) #define K03 (((w0s >> ( 0 + 4)) & 1) ? -1 : 0) #define K04 (((w0s >> ( 0 + 3)) & 1) ? -1 : 0) #define K05 (((w0s >> ( 0 + 2)) & 1) ? -1 : 0) #define K06 (((w0s >> ( 0 + 1)) & 1) ? -1 : 0) #define K07 (((w0s >> ( 0 + 0)) & 1) ? -1 : 0) #define K08 (((w0s >> ( 8 + 7)) & 1) ? -1 : 0) #define K09 (((w0s >> ( 8 + 6)) & 1) ? -1 : 0) #define K10 (((w0s >> ( 8 + 5)) & 1) ? -1 : 0) #define K11 (((w0s >> ( 8 + 4)) & 1) ? -1 : 0) #define K12 (((w0s >> ( 8 + 3)) & 1) ? -1 : 0) #define K13 (((w0s >> ( 8 + 2)) & 1) ? -1 : 0) #define K14 (((w0s >> ( 8 + 1)) & 1) ? -1 : 0) #define K15 (((w0s >> ( 8 + 0)) & 1) ? -1 : 0) #define K16 (((w0s >> (16 + 7)) & 1) ? -1 : 0) #define K17 (((w0s >> (16 + 6)) & 1) ? -1 : 0) #define K18 (((w0s >> (16 + 5)) & 1) ? -1 : 0) #define K19 (((w0s >> (16 + 4)) & 1) ? -1 : 0) #define K20 (((w0s >> (16 + 3)) & 1) ? -1 : 0) #define K21 (((w0s >> (16 + 2)) & 1) ? -1 : 0) #define K22 (((w0s >> (16 + 1)) & 1) ? -1 : 0) #define K23 (((w0s >> (16 + 0)) & 1) ? -1 : 0) #define K24 (((w0s >> (24 + 7)) & 1) ? -1 : 0) #define K25 (((w0s >> (24 + 6)) & 1) ? -1 : 0) #define K26 (((w0s >> (24 + 5)) & 1) ? -1 : 0) #define K27 (((w0s >> (24 + 4)) & 1) ? -1 : 0) #define K28 (((w0s >> (24 + 3)) & 1) ? -1 : 0) #define K29 (((w0s >> (24 + 2)) & 1) ? -1 : 0) #define K30 (((w0s >> (24 + 1)) & 1) ? -1 : 0) #define K31 (((w0s >> (24 + 0)) & 1) ? -1 : 0) #define K32 (((w1s >> ( 0 + 7)) & 1) ? -1 : 0) #define K33 (((w1s >> ( 0 + 6)) & 1) ? -1 : 0) #define K34 (((w1s >> ( 0 + 5)) & 1) ? -1 : 0) #define K35 (((w1s >> ( 0 + 4)) & 1) ? -1 : 0) #define K36 (((w1s >> ( 0 + 3)) & 1) ? -1 : 0) #define K37 (((w1s >> ( 0 + 2)) & 1) ? -1 : 0) #define K38 (((w1s >> ( 0 + 1)) & 1) ? -1 : 0) #define K39 (((w1s >> ( 0 + 0)) & 1) ? -1 : 0) #define K40 (((w1s >> ( 8 + 7)) & 1) ? -1 : 0) #define K41 (((w1s >> ( 8 + 6)) & 1) ? -1 : 0) #define K42 (((w1s >> ( 8 + 5)) & 1) ? -1 : 0) #define K43 (((w1s >> ( 8 + 4)) & 1) ? -1 : 0) #define K44 (((w1s >> ( 8 + 3)) & 1) ? -1 : 0) #define K45 (((w1s >> ( 8 + 2)) & 1) ? -1 : 0) #define K46 (((w1s >> ( 8 + 1)) & 1) ? -1 : 0) #define K47 (((w1s >> ( 8 + 0)) & 1) ? -1 : 0) #define K48 (((w1s >> (16 + 7)) & 1) ? -1 : 0) #define K49 (((w1s >> (16 + 6)) & 1) ? -1 : 0) #define K50 (((w1s >> (16 + 5)) & 1) ? -1 : 0) #define K51 (((w1s >> (16 + 4)) & 1) ? -1 : 0) #define K52 (((w1s >> (16 + 3)) & 1) ? -1 : 0) #define K53 (((w1s >> (16 + 2)) & 1) ? -1 : 0) #define K54 (((w1s >> (16 + 1)) & 1) ? -1 : 0) #define K55 (((w1s >> (16 + 0)) & 1) ? -1 : 0) /** * 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; 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 = ffz (tmpResult); #include COMPARE_S } // // transpose bitslice mod : attention race conditions, need different buffers for *in and *out // __kernel void m03000_tm (__global u32 *mod, __global bs_word_t *words_buf_r) { const u64 gid = get_global_id (0); const u32 block = gid / 32; const u32 slice = gid % 32; const u32 w0 = mod[gid]; 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 m03000_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bs_word_t *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m03000_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bs_word_t *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m03100_a0-optimized.cl000066400000000000000000001040741320027462700200020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //incompatible //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64]) { u32x tt; u32x r = data[0]; u32x l = data[1]; IP (r, l, tt); r = rotl32 (r, 3u); l = rotl32 (l, 3u); #ifdef _unroll #pragma unroll #endif 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 ^= 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); u = Kc[i + 1] ^ l; t = Kd[i + 1] ^ rotl32 (l, 28u); r ^= 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); } l = rotl32 (l, 29u); r = rotl32 (r, 29u); FP (r, l, tt); iv[0] = l; iv[1] = r; } void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[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; #ifdef _unroll #pragma unroll #endif 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); Kc[i] = ((t << 16) | (s & 0x0000ffff)); Kd[i] = ((s >> 16) | (t & 0xffff0000)); Kc[i] = rotl32 (Kc[i], 2u); Kd[i] = rotl32 (Kd[i], 2u); } } __kernel void m03100_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; 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]; const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * main */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); const u32x salt_word_len = (salt_len + out_len) * 2; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); u32x dst[16]; dst[ 0] = w0[0] | salt_buf0[0]; dst[ 1] = w0[1] | salt_buf0[1]; dst[ 2] = w0[2] | salt_buf0[2]; dst[ 3] = w0[3] | salt_buf0[3]; dst[ 4] = w1[0] | salt_buf1[0]; dst[ 5] = w1[1] | salt_buf1[1]; dst[ 6] = w1[2] | salt_buf1[2]; dst[ 7] = w1[3] | salt_buf1[3]; dst[ 8] = w2[0]; dst[ 9] = w2[1]; dst[10] = w2[2]; dst[11] = w2[3]; dst[12] = w3[0]; dst[13] = w3[1]; dst[14] = w3[2]; dst[15] = w3[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 */ u32x z = 0; COMPARE_M_SIMD (iv[0], iv[1], z, z); } } __kernel void m03100_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03100_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03100_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; 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]; 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], 0, 0 }; /** * main */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); const u32x salt_word_len = (salt_len + out_len) * 2; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); u32x dst[16]; dst[ 0] = w0[0] | salt_buf0[0]; dst[ 1] = w0[1] | salt_buf0[1]; dst[ 2] = w0[2] | salt_buf0[2]; dst[ 3] = w0[3] | salt_buf0[3]; dst[ 4] = w1[0] | salt_buf1[0]; dst[ 5] = w1[1] | salt_buf1[1]; dst[ 6] = w1[2] | salt_buf1[2]; dst[ 7] = w1[3] | salt_buf1[3]; dst[ 8] = w2[0]; dst[ 9] = w2[1]; dst[10] = w2[2]; dst[11] = w2[3]; dst[12] = w3[0]; dst[13] = w3[1]; dst[14] = w3[2]; dst[15] = w3[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 */ u32x z = 0; COMPARE_S_SIMD (iv[0], iv[1], z, z); } } __kernel void m03100_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03100_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m03100_a1-optimized.cl000066400000000000000000001126111320027462700177770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //incompatible //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64]) { u32x tt; u32x r = data[0]; u32x l = data[1]; IP (r, l, tt); r = rotl32 (r, 3u); l = rotl32 (l, 3u); #ifdef _unroll #pragma unroll #endif 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 ^= 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); u = Kc[i + 1] ^ l; t = Kd[i + 1] ^ rotl32 (l, 28u); r ^= 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); } l = rotl32 (l, 29u); r = rotl32 (r, 29u); FP (r, l, tt); iv[0] = l; iv[1] = r; } void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[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; #ifdef _unroll #pragma unroll #endif 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); Kc[i] = ((t << 16) | (s & 0x0000ffff)); Kd[i] = ((s >> 16) | (t & 0xffff0000)); Kc[i] = rotl32 (Kc[i], 2u); Kd[i] = rotl32 (Kd[i], 2u); } } __kernel void m03100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ 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]; const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; const u32x salt_word_len = (salt_len + pw_len) * 2; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); u32x dst[16]; dst[ 0] = w0[0] | salt_buf0[0]; dst[ 1] = w0[1] | salt_buf0[1]; dst[ 2] = w0[2] | salt_buf0[2]; dst[ 3] = w0[3] | salt_buf0[3]; dst[ 4] = w1[0] | salt_buf1[0]; dst[ 5] = w1[1] | salt_buf1[1]; dst[ 6] = w1[2] | salt_buf1[2]; dst[ 7] = w1[3] | salt_buf1[3]; dst[ 8] = w2[0]; dst[ 9] = w2[1]; dst[10] = w2[2]; dst[11] = w2[3]; dst[12] = w3[0]; dst[13] = w3[1]; dst[14] = w3[2]; dst[15] = w3[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 */ u32x z = 0; COMPARE_M_SIMD (iv[0], iv[1], z, z); } } __kernel void m03100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ 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]; 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], 0, 0 }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; const u32x salt_word_len = (salt_len + pw_len) * 2; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); u32x dst[16]; dst[ 0] = w0[0] | salt_buf0[0]; dst[ 1] = w0[1] | salt_buf0[1]; dst[ 2] = w0[2] | salt_buf0[2]; dst[ 3] = w0[3] | salt_buf0[3]; dst[ 4] = w1[0] | salt_buf1[0]; dst[ 5] = w1[1] | salt_buf1[1]; dst[ 6] = w1[2] | salt_buf1[2]; dst[ 7] = w1[3] | salt_buf1[3]; dst[ 8] = w2[0]; dst[ 9] = w2[1]; dst[10] = w2[2]; dst[11] = w2[3]; dst[12] = w3[0]; dst[13] = w3[1]; dst[14] = w3[2]; dst[15] = w3[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 */ u32x z = 0; COMPARE_S_SIMD (iv[0], iv[1], z, z); } } __kernel void m03100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m03100_a3-optimized.cl000066400000000000000000001225041320027462700200030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64]) { u32x tt; u32x r = data[0]; u32x l = data[1]; IP (r, l, tt); r = rotl32 (r, 3u); l = rotl32 (l, 3u); #ifdef _unroll #pragma unroll #endif 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 ^= 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); u = Kc[i + 1] ^ l; t = Kd[i + 1] ^ rotl32 (l, 28u); r ^= 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); } l = rotl32 (l, 29u); r = rotl32 (r, 29u); FP (r, l, tt); iv[0] = l; iv[1] = r; } void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[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; #ifdef _unroll #pragma unroll #endif 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); Kc[i] = ((t << 16) | (s & 0x0000ffff)); Kd[i] = ((s >> 16) | (t & 0xffff0000)); Kc[i] = rotl32 (Kc[i], 2u); Kd[i] = rotl32 (Kd[i], 2u); } } void m03100m (__local u32 (*s_SPtrans)[64], __local u32 (*s_skb)[64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ 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]; const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 salt_word_len = (salt_len + pw_len) * 2; /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = w0lr; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); u32x dst[16]; dst[ 0] = w0[0] | salt_buf0[0]; dst[ 1] = w0[1] | salt_buf0[1]; dst[ 2] = w0[2] | salt_buf0[2]; dst[ 3] = w0[3] | salt_buf0[3]; dst[ 4] = w1[0] | salt_buf1[0]; dst[ 5] = w1[1] | salt_buf1[1]; dst[ 6] = w1[2] | salt_buf1[2]; dst[ 7] = w1[3] | salt_buf1[3]; dst[ 8] = w2[0]; dst[ 9] = w2[1]; dst[10] = w2[2]; dst[11] = w2[3]; dst[12] = w3[0]; dst[13] = w3[1]; dst[14] = w3[2]; dst[15] = w3[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 */ u32x z = 0; COMPARE_M_SIMD (iv[0], iv[1], z, z); } } void m03100s (__local u32 (*s_SPtrans)[64], __local u32 (*s_skb)[64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ 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]; const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 salt_word_len = (salt_len + pw_len) * 2; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_buf[digests_offset].digest_buf[DGST_R1], 0, 0 }; /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = w0lr; w0[1] = w[ 1]; w0[2] = w[ 2]; w0[3] = w[ 3]; w1[0] = w[ 4]; w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; w2[0] = w[ 8]; w2[1] = w[ 9]; w2[2] = w[10]; w2[3] = w[11]; w3[0] = w[12]; w3[1] = w[13]; w3[2] = w[14]; w3[3] = w[15]; switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); u32x dst[16]; dst[ 0] = w0[0] | salt_buf0[0]; dst[ 1] = w0[1] | salt_buf0[1]; dst[ 2] = w0[2] | salt_buf0[2]; dst[ 3] = w0[3] | salt_buf0[3]; dst[ 4] = w1[0] | salt_buf1[0]; dst[ 5] = w1[1] | salt_buf1[1]; dst[ 6] = w1[2] | salt_buf1[2]; dst[ 7] = w1[3] | salt_buf1[3]; dst[ 8] = w2[0]; dst[ 9] = w2[1]; dst[10] = w2[2]; dst[11] = w2[3]; dst[12] = w3[0]; dst[13] = w3[1]; dst[14] = w3[2]; dst[15] = w3[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 */ u32x z = 0; COMPARE_S_SIMD (iv[0], iv[1], z, z); } } __kernel void m03100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * base */ u32 w[16]; w[ 0] = 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 */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m03100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * base */ u32 w[16]; w[ 0] = 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 */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m03100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * base */ u32 w[16]; w[ 0] = 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 */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m03100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * base */ u32 w[16]; w[ 0] = 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 */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m03100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m03200.cl000066400000000000000000000645061320027462700154260ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" // http://www.schneier.com/code/constants.txt __constant u32a 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 u32a 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 u32a 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 u32a 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 }; #ifdef IS_AMD #define BF_ROUND(L,R,N) \ { \ uchar4 c = as_uchar4 ((L)); \ \ u32 tmp; \ \ tmp = S0[c.s3]; \ tmp += S1[c.s2]; \ tmp ^= S2[c.s1]; \ tmp += S3[c.s0]; \ \ (R) ^= tmp ^ P[(N)]; \ } #endif #ifdef IS_NV #define BF_ROUND(L,R,N) \ { \ u32 tmp; \ \ tmp = S0[__bfe ((L), 24, 8)]; \ tmp += S1[__bfe ((L), 16, 8)]; \ tmp ^= S2[__bfe ((L), 8, 8)]; \ tmp += S3[__bfe ((L), 0, 8)]; \ \ (R) ^= tmp ^ P[(N)]; \ } #endif #ifdef IS_GENERIC #define BF_ROUND(L,R,N) \ { \ uchar4 c = as_uchar4 ((L)); \ \ u32 tmp; \ \ tmp = S0[c.s3]; \ tmp += S1[c.s2]; \ tmp ^= S2[c.s1]; \ tmp += S3[c.s0]; \ \ (R) ^= tmp ^ P[(N)]; \ } #endif // temporary hack for Apple Iris GPUs (with as little performance drop as possible) #if defined (IS_APPLE) && defined (IS_GPU) #define TMP_TYPE volatile u32 #else #define TMP_TYPE u32 #endif #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_TYPE tmp; \ \ tmp = R; \ R = L; \ L = tmp; \ \ L ^= P[17]; \ } void expand_key (u32 E[18], const u32 W[18], 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++; if (E_cur == E_stop) return; } *E_cur++ = 0; } } __kernel void m03200_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global bcrypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; const u32 pw_len = pws[gid].pw_len; u32 w[18]; w[ 0] = 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]; w[16] = pws[gid].i[16]; w[17] = pws[gid].i[17]; u32 E[18]; expand_key (E, w, pw_len); E[ 0] = swap32 (E[ 0]); E[ 1] = swap32 (E[ 1]); E[ 2] = swap32 (E[ 2]); E[ 3] = swap32 (E[ 3]); E[ 4] = swap32 (E[ 4]); E[ 5] = swap32 (E[ 5]); E[ 6] = swap32 (E[ 6]); E[ 7] = swap32 (E[ 7]); E[ 8] = swap32 (E[ 8]); E[ 9] = swap32 (E[ 9]); E[10] = swap32 (E[10]); E[11] = swap32 (E[11]); E[12] = swap32 (E[12]); E[13] = swap32 (E[13]); E[14] = swap32 (E[14]); E[15] = swap32 (E[15]); E[16] = swap32 (E[16]); E[17] = swap32 (E[17]); for (u32 i = 0; i < 18; i++) { tmps[gid].E[i] = E[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]; /** * do the key setup */ __local u32 S0_all[8][256]; __local u32 S1_all[8][256]; __local u32 S2_all[8][256]; __local u32 S3_all[8][256]; __local u32 *S0 = S0_all[lid]; __local u32 *S1 = S1_all[lid]; __local u32 *S2 = S2_all[lid]; __local u32 *S3 = S3_all[lid]; // initstate u32 P[18] = { 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b }; 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 m03200_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global bcrypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; // load u32 E[18]; for (u32 i = 0; i < 18; i++) { E[i] = tmps[gid].E[i]; } u32 P[18]; for (u32 i = 0; i < 18; i++) { P[i] = tmps[gid].P[i]; } __local u32 S0_all[8][256]; __local u32 S1_all[8][256]; __local u32 S2_all[8][256]; __local u32 S3_all[8][256]; __local u32 *S0 = S0_all[lid]; __local u32 *S1 = S1_all[lid]; __local u32 *S2 = S2_all[lid]; __local u32 *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; #ifdef _unroll #pragma unroll #endif 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; #ifdef _unroll #pragma unroll #endif 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 m03200_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global bcrypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; // load u32 P[18]; for (u32 i = 0; i < 18; i++) { P[i] = tmps[gid].P[i]; } __local u32 S0_all[8][256]; __local u32 S1_all[8][256]; __local u32 S2_all[8][256]; __local u32 S3_all[8][256]; __local u32 *S0 = S0_all[lid]; __local u32 *S1 = S1_all[lid]; __local u32 *S2 = S2_all[lid]; __local u32 *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 u32 r0 = L0; const u32 r1 = R0; L0 = BCRYPTM_2; R0 = BCRYPTM_3; for (u32 i = 0; i < 64; i++) { BF_ENCRYPT (L0, R0); } const u32 r2 = L0; const u32 r3 = R0; /* e = L0; f = R0; f &= ~0xff; // its just 23 not 24 ! */ #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m03710_a0-optimized.cl000066400000000000000000000743561320027462700200220ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m03710_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 pw_salt_len = 32 + salt_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0x80; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); w3[2] = pw_salt_len * 8; w3[3] = 0; 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]; /** * md5 */ a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m03710_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03710_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03710_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; 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] }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0x80; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); w3[2] = pw_salt_len * 8; w3[3] = 0; 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]; /** * md5 */ a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m03710_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03710_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m03710_a0.cl000066400000000000000000000210111320027462700157740ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m03710_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, tmp.i, tmp.pw_len); md5_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; md5_ctx_t ctx; md5_init (&ctx); md5_update (&ctx, s, salt_len); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_update_64 (&ctx, w0, w1, w2, w3, 32); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m03710_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, tmp.i, tmp.pw_len); md5_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; md5_ctx_t ctx; md5_init (&ctx); md5_update (&ctx, s, salt_len); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_update_64 (&ctx, w0, w1, w2, w3, 32); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m03710_a1-optimized.cl000066400000000000000000001026171320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m03710_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 pw_salt_len = 32 + salt_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0x80; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); w3[2] = pw_salt_len * 8; w3[3] = 0; 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]; /** * md5 */ a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m03710_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03710_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03710_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; 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] }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0x80; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); w3[2] = pw_salt_len * 8; w3[3] = 0; 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]; /** * md5 */ a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m03710_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03710_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m03710_a1.cl000066400000000000000000000207201320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m03710_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); md5_update (&ctx, s, salt_len); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_update_64 (&ctx, w0, w1, w2, w3, 32); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m03710_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); md5_update (&ctx, s, salt_len); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_update_64 (&ctx, w0, w1, w2, w3, 32); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m03710_a3-optimized.cl000066400000000000000000001213331320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void m03710m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 pw_salt_len = 32 + salt_len; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * 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); u32x t; 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; 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] = 0x80; w2_t[1] = 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_le (w0_t, w1_t, w2_t, w3_t, salt_len); w3_t[2] = pw_salt_len * 8; w3_t[3] = 0; 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_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); COMPARE_M_SIMD (a, d, c, b); } } void m03710s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; 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] }; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * 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); u32x t; 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; 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] = 0x80; w2_t[1] = 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_le (w0_t, w1_t, w2_t, w3_t, salt_len); w3_t[2] = pw_salt_len * 8; w3_t[3] = 0; 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_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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m03710_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m03710_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m03710_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m03710_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m03710_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m03710_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } hashcat-4.0.1/OpenCL/m03710_a3.cl000066400000000000000000000217001320027462700160040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m03710_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; md5_ctx_vector_t ctx0; md5_init_vector (&ctx0); md5_update_vector (&ctx0, w, pw_len); md5_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; md5_ctx_vector_t ctx; md5_init_vector (&ctx); md5_update_vector (&ctx, s, salt_len); u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_update_vector_64 (&ctx, w0, w1, w2, w3, 32); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m03710_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; md5_ctx_vector_t ctx0; md5_init_vector (&ctx0); md5_update_vector (&ctx0, w, pw_len); md5_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; md5_ctx_vector_t ctx; md5_init_vector (&ctx); md5_update_vector (&ctx, s, salt_len); u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_update_vector_64 (&ctx, w0, w1, w2, w3, 32); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m03800_a0-optimized.cl000066400000000000000000000520241320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m03800_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * prepend salt */ const u32x out_salt_len = out_len + salt_len; switch_buffer_by_offset_le_VV (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]; 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]; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_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]; const u32x salt_out_salt_len = salt_len + out_len + salt_len; append_0x80_4x4_VV (w0, w1, w2, w3, salt_out_salt_len); w3[2] = salt_out_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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m03800_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03800_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03800_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * prepend salt */ const u32x out_salt_len = out_len + salt_len; switch_buffer_by_offset_le_VV (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]; 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]; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_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]; const u32x salt_out_salt_len = salt_len + out_len + salt_len; append_0x80_4x4_VV (w0, w1, w2, w3, salt_out_salt_len); w3[2] = salt_out_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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m03800_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03800_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m03800_a0.cl000066400000000000000000000107451320027462700160100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m03800_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx = ctx0; md5_update (&ctx, tmp.i, tmp.pw_len); md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m03800_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx = ctx0; md5_update (&ctx, tmp.i, tmp.pw_len); md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m03800_a1-optimized.cl000066400000000000000000000605171320027462700200150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m03800_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len + 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]; 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]; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_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]; const u32x salt_pw_salt_len = salt_len + pw_len + salt_len; append_0x80_4x4_VV (w0, w1, w2, w3, salt_pw_salt_len); w3[2] = salt_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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m03800_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03800_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03800_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len + 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]; 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]; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_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]; const u32x salt_pw_salt_len = salt_len + pw_len + salt_len; append_0x80_4x4_VV (w0, w1, w2, w3, salt_pw_salt_len); w3[2] = salt_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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m03800_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03800_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m03800_a1.cl000066400000000000000000000105741320027462700160110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m03800_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, s, salt_len); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m03800_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, s, salt_len); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m03800_a3-optimized.cl000066400000000000000000000751511320027462700200170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m03800m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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]; u32 salt_buf0_t[4]; u32 salt_buf1_t[4]; u32 salt_buf2_t[4]; u32 salt_buf3_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]; 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]; salt_buf2_t[0] = salt_bufs[salt_pos].salt_buf[ 8]; salt_buf2_t[1] = salt_bufs[salt_pos].salt_buf[ 9]; salt_buf2_t[2] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2_t[3] = salt_bufs[salt_pos].salt_buf[11]; salt_buf3_t[0] = salt_bufs[salt_pos].salt_buf[12]; salt_buf3_t[1] = salt_bufs[salt_pos].salt_buf[13]; salt_buf3_t[2] = salt_bufs[salt_pos].salt_buf[14]; salt_buf3_t[3] = salt_bufs[salt_pos].salt_buf[15]; const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 pw_salt_len = pw_len + salt_len; const u32 salt_pw_salt_len = salt_len + pw_len + salt_len; switch_buffer_by_offset_le_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, pw_salt_len); 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_4x4_S (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_pw_salt_len); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; /** * put the password after the first salt but before the second salt */ switch_buffer_by_offset_le (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = salt_pw_salt_len * 8; t3[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, 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); u32x t; MD5_STEP (MD5_H1, a, b, c, d, t1[1], MD5C20, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t2[0], MD5C21, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t2[3], MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t3[2], MD5C23, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t0[1], MD5C24, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t1[0], MD5C25, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t1[3], MD5C26, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t2[2], MD5C27, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t3[1], MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t0[0], MD5C29, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t0[3], MD5C2a, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t1[2], MD5C2b, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t2[1], MD5C2c, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t3[0], MD5C2d, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t3[3], MD5C2e, MD5S22); MD5_STEP (MD5_H2, 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); COMPARE_M_SIMD (a, d, c, b); } } void m03800s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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]; u32 salt_buf0_t[4]; u32 salt_buf1_t[4]; u32 salt_buf2_t[4]; u32 salt_buf3_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]; 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]; salt_buf2_t[0] = salt_bufs[salt_pos].salt_buf[ 8]; salt_buf2_t[1] = salt_bufs[salt_pos].salt_buf[ 9]; salt_buf2_t[2] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2_t[3] = salt_bufs[salt_pos].salt_buf[11]; salt_buf3_t[0] = salt_bufs[salt_pos].salt_buf[12]; salt_buf3_t[1] = salt_bufs[salt_pos].salt_buf[13]; salt_buf3_t[2] = salt_bufs[salt_pos].salt_buf[14]; salt_buf3_t[3] = salt_bufs[salt_pos].salt_buf[15]; const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 pw_salt_len = pw_len + salt_len; const u32 salt_pw_salt_len = salt_len + pw_len + salt_len; switch_buffer_by_offset_le_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, pw_salt_len); 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_4x4_S (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_pw_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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; /** * put the password after the first salt but before the second salt */ switch_buffer_by_offset_le (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] = salt_pw_salt_len * 8; t3[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, 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); u32x t; MD5_STEP (MD5_H1, a, b, c, d, t1[1], MD5C20, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t2[0], MD5C21, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t2[3], MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t3[2], MD5C23, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t0[1], MD5C24, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t1[0], MD5C25, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t1[3], MD5C26, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t2[2], MD5C27, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t3[1], MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t0[0], MD5C29, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t0[3], MD5C2a, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t1[2], MD5C2b, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t2[1], MD5C2c, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t3[0], MD5C2d, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t3[3], MD5C2e, MD5S22); MD5_STEP (MD5_H2, 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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m03800_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m03800_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m03800_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m03800_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m03800_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m03800_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m03800_a3.cl000066400000000000000000000117741320027462700160160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __kernel void m03800_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector_from_scalar (&ctx, &ctx0); md5_update_vector (&ctx, w, pw_len); md5_update_vector (&ctx, s, salt_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m03800_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector_from_scalar (&ctx, &ctx0); md5_update_vector (&ctx, w, pw_len); md5_update_vector (&ctx, s, salt_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m03910_a0-optimized.cl000066400000000000000000001106541320027462700200140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m03910_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; salt_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[2]; salt_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[3]; salt_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[4]; salt_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[5]; salt_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[6]; salt_buf1[3] = salt_bufs[salt_pos].salt_buf_pc[7]; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = salt_buf0[0]; w2[1] = salt_buf0[1]; w2[2] = salt_buf0[2]; w2[3] = salt_buf0[3]; w3[0] = salt_buf1[0]; w3[1] = salt_buf1[1]; w3[2] = salt_buf1[2]; w3[3] = salt_buf1[3]; a = MD5M_A; b = MD5M_B; c = MD5M_C; 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 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; const u32x r_00 = 0x80; const u32x r_14 = 64 * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, r_00, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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; COMPARE_M_SIMD (a, d, c, b); } } __kernel void m03910_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03910_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03910_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; salt_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[2]; salt_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[3]; salt_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[4]; salt_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[5]; salt_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[6]; salt_buf1[3] = salt_bufs[salt_pos].salt_buf_pc[7]; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = salt_buf0[0]; w2[1] = salt_buf0[1]; w2[2] = salt_buf0[2]; w2[3] = salt_buf0[3]; w3[0] = salt_buf1[0]; w3[1] = salt_buf1[1]; w3[2] = salt_buf1[2]; w3[3] = salt_buf1[3]; a = MD5M_A; b = MD5M_B; c = MD5M_C; 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 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; const u32x r_00 = 0x80; const u32x r_14 = 64 * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, r_00, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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 (MATCHES_NONE_VS ((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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m03910_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03910_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m03910_a0.cl000066400000000000000000000223331320027462700160060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m03910_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = 32; u32 s[8] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf_pc[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, tmp.i, tmp.pw_len); md5_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.w2[0] = s[0]; ctx.w2[1] = s[1]; ctx.w2[2] = s[2]; ctx.w2[3] = s[3]; ctx.w3[0] = s[4]; ctx.w3[1] = s[5]; ctx.w3[2] = s[6]; ctx.w3[3] = s[7]; md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); ctx.w0[0] = 0x80; ctx.w0[1] = 0; ctx.w0[2] = 0; ctx.w0[3] = 0; ctx.w1[0] = 0; ctx.w1[1] = 0; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 64 * 8; ctx.w3[3] = 0; md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m03910_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = 32; u32 s[8] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf_pc[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, tmp.i, tmp.pw_len); md5_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.w2[0] = s[0]; ctx.w2[1] = s[1]; ctx.w2[2] = s[2]; ctx.w2[3] = s[3]; ctx.w3[0] = s[4]; ctx.w3[1] = s[5]; ctx.w3[2] = s[6]; ctx.w3[3] = s[7]; md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); ctx.w0[0] = 0x80; ctx.w0[1] = 0; ctx.w0[2] = 0; ctx.w0[3] = 0; ctx.w1[0] = 0; ctx.w1[1] = 0; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 64 * 8; ctx.w3[3] = 0; md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m03910_a1-optimized.cl000066400000000000000000001171151320027462700200140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m03910_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; salt_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[2]; salt_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[3]; salt_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[4]; salt_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[5]; salt_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[6]; salt_buf1[3] = salt_bufs[salt_pos].salt_buf_pc[7]; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = salt_buf0[0]; w2[1] = salt_buf0[1]; w2[2] = salt_buf0[2]; w2[3] = salt_buf0[3]; w3[0] = salt_buf1[0]; w3[1] = salt_buf1[1]; w3[2] = salt_buf1[2]; w3[3] = salt_buf1[3]; a = MD5M_A; b = MD5M_B; c = MD5M_C; 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 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; const u32x r_00 = 0x80; const u32x r_14 = 64 * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, r_00, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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; COMPARE_M_SIMD (a, d, c, b); } } __kernel void m03910_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03910_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03910_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; salt_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[2]; salt_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[3]; salt_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[4]; salt_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[5]; salt_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[6]; salt_buf1[3] = salt_bufs[salt_pos].salt_buf_pc[7]; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = salt_buf0[0]; w2[1] = salt_buf0[1]; w2[2] = salt_buf0[2]; w2[3] = salt_buf0[3]; w3[0] = salt_buf1[0]; w3[1] = salt_buf1[1]; w3[2] = salt_buf1[2]; w3[3] = salt_buf1[3]; a = MD5M_A; b = MD5M_B; c = MD5M_C; 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 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; const u32x r_00 = 0x80; const u32x r_14 = 64 * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, r_00, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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 (MATCHES_NONE_VS ((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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m03910_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m03910_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m03910_a1.cl000066400000000000000000000222421320027462700160060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m03910_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 salt_len = 32; u32 s[8] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf_pc[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.w2[0] = s[0]; ctx.w2[1] = s[1]; ctx.w2[2] = s[2]; ctx.w2[3] = s[3]; ctx.w3[0] = s[4]; ctx.w3[1] = s[5]; ctx.w3[2] = s[6]; ctx.w3[3] = s[7]; md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); ctx.w0[0] = 0x80; ctx.w0[1] = 0; ctx.w0[2] = 0; ctx.w0[3] = 0; ctx.w1[0] = 0; ctx.w1[1] = 0; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 64 * 8; ctx.w3[3] = 0; md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m03910_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 salt_len = 32; u32 s[8] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf_pc[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.w2[0] = s[0]; ctx.w2[1] = s[1]; ctx.w2[2] = s[2]; ctx.w2[3] = s[3]; ctx.w3[0] = s[4]; ctx.w3[1] = s[5]; ctx.w3[2] = s[6]; ctx.w3[3] = s[7]; md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); ctx.w0[0] = 0x80; ctx.w0[1] = 0; ctx.w0[2] = 0; ctx.w0[3] = 0; ctx.w1[0] = 0; ctx.w1[1] = 0; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 64 * 8; ctx.w3[3] = 0; md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m03910_a3-optimized.cl000066400000000000000000001355011320027462700200150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void m03910m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; salt_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[2]; salt_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[3]; salt_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[4]; salt_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[5]; salt_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[6]; salt_buf1[3] = salt_bufs[salt_pos].salt_buf_pc[7]; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * 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); u32x t; 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; 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] = salt_buf0[0]; w2_t[1] = salt_buf0[1]; w2_t[2] = salt_buf0[2]; w2_t[3] = salt_buf0[3]; w3_t[0] = salt_buf1[0]; w3_t[1] = salt_buf1[1]; w3_t[2] = salt_buf1[2]; w3_t[3] = salt_buf1[3]; 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); 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; const u32x r_00 = 0x80; const u32x r_14 = 64 * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, r_00, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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; COMPARE_M_SIMD (a, d, c, b); } } void m03910s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; salt_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[2]; salt_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[3]; salt_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[4]; salt_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[5]; salt_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[6]; salt_buf1[3] = salt_bufs[salt_pos].salt_buf_pc[7]; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * 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); u32x t; 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; 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] = salt_buf0[0]; w2_t[1] = salt_buf0[1]; w2_t[2] = salt_buf0[2]; w2_t[3] = salt_buf0[3]; w3_t[0] = salt_buf1[0]; w3_t[1] = salt_buf1[1]; w3_t[2] = salt_buf1[2]; w3_t[3] = salt_buf1[3]; 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); 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; const u32x r_00 = 0x80; const u32x r_14 = 64 * 8; 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_H1, a, b, c, d, MD5C20, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C21, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, r_14, MD5C23, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C24, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C25, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C26, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C27, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, r_00, MD5C29, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2a, MD5S22); MD5_STEP0(MD5_H2, b, c, d, a, MD5C2b, MD5S23); MD5_STEP0(MD5_H1, a, b, c, d, MD5C2c, MD5S20); MD5_STEP0(MD5_H2, d, a, b, c, MD5C2d, MD5S21); MD5_STEP0(MD5_H1, c, d, a, b, MD5C2e, MD5S22); MD5_STEP0(MD5_H2, 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 (MATCHES_NONE_VS ((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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m03910_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m03910m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m03910_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m03910m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m03910_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m03910m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m03910_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m03910s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m03910_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m03910s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m03910_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m03910s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } hashcat-4.0.1/OpenCL/m03910_a3.cl000066400000000000000000000231741320027462700160150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m03910_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = 32; u32x s[8] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf_pc[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; md5_ctx_vector_t ctx0; md5_init_vector (&ctx0); md5_update_vector (&ctx0, w, pw_len); md5_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; md5_ctx_vector_t ctx; md5_init_vector (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.w2[0] = s[0]; ctx.w2[1] = s[1]; ctx.w2[2] = s[2]; ctx.w2[3] = s[3]; ctx.w3[0] = s[4]; ctx.w3[1] = s[5]; ctx.w3[2] = s[6]; ctx.w3[3] = s[7]; md5_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); ctx.w0[0] = 0x80; ctx.w0[1] = 0; ctx.w0[2] = 0; ctx.w0[3] = 0; ctx.w1[0] = 0; ctx.w1[1] = 0; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 64 * 8; ctx.w3[3] = 0; md5_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m03910_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = 32; u32x s[8] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf_pc[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; md5_ctx_vector_t ctx0; md5_init_vector (&ctx0); md5_update_vector (&ctx0, w, pw_len); md5_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; md5_ctx_vector_t ctx; md5_init_vector (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.w2[0] = s[0]; ctx.w2[1] = s[1]; ctx.w2[2] = s[2]; ctx.w2[3] = s[3]; ctx.w3[0] = s[4]; ctx.w3[1] = s[5]; ctx.w3[2] = s[6]; ctx.w3[3] = s[7]; md5_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); ctx.w0[0] = 0x80; ctx.w0[1] = 0; ctx.w0[2] = 0; ctx.w0[3] = 0; ctx.w1[0] = 0; ctx.w1[1] = 0; ctx.w1[2] = 0; ctx.w1[3] = 0; ctx.w2[0] = 0; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 64 * 8; ctx.w3[3] = 0; md5_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04010_a0-optimized.cl000066400000000000000000000765521320027462700200140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04010_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 pw_salt_len = 32 + salt_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * prepend salt */ const u32x out_salt_len = salt_len + out_len; switch_buffer_by_offset_le (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]; 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] = out_salt_len * 8; w3[3] = 0; append_0x80_4x4_VV (w0, w1, w2, w3, out_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, 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0x80; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); w3[2] = pw_salt_len * 8; w3[3] = 0; 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]; /** * md5 */ a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m04010_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04010_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04010_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; 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] }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * prepend salt */ const u32x out_salt_len = salt_len + out_len; switch_buffer_by_offset_le (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]; 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] = out_salt_len * 8; w3[3] = 0; append_0x80_4x4_VV (w0, w1, w2, w3, out_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, 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0x80; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); w3[2] = pw_salt_len * 8; w3[3] = 0; 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]; /** * md5 */ a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m04010_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04010_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04010_a0.cl000066400000000000000000000204051320027462700157740ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04010_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx1 = ctx0; md5_update (&ctx1, tmp.i, tmp.pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_ctx_t ctx = ctx0; md5_update_64 (&ctx, w0, w1, w2, w3, 32); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04010_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ COPY_PW (pws[gid]); md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx1 = ctx0; md5_update (&ctx1, tmp.i, tmp.pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_ctx_t ctx = ctx0; md5_update_64 (&ctx, w0, w1, w2, w3, 32); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04010_a1-optimized.cl000066400000000000000000001047751320027462700200140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04010_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 final_len = salt_len + 32; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = pw_len * 8; w3[3] = 0; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len + 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]; 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] = 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0x80; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); w3[2] = final_len * 8; w3[3] = 0; 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]; /** * md5 */ a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m04010_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04010_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04010_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 final_len = salt_len + 32; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = pw_len * 8; w3[3] = 0; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len + 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]; 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] = 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0x80; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); w3[2] = final_len * 8; w3[3] = 0; 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]; /** * md5 */ a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m04010_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04010_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04010_a1.cl000066400000000000000000000203261320027462700157770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04010_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); md5_ctx_t ctx0t = ctx0; md5_update_global (&ctx0t, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0t; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_ctx_t ctx = ctx0; md5_update_64 (&ctx, w0, w1, w2, w3, 32); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04010_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); md5_ctx_t ctx0t = ctx0; md5_update_global (&ctx0t, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0t; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_ctx_t ctx = ctx0; md5_update_64 (&ctx, w0, w1, w2, w3, 32); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04010_a3-optimized.cl000066400000000000000000001235271320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void m04010m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 pw_salt_len = pw_len + salt_len; const u32 final_len = salt_len + 32; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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_le (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] = pw_salt_len * 8; w3_t[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_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); u32x t; 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; 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] = 0x80; w2_t[1] = 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_le (w0_t, w1_t, w2_t, w3_t, salt_len); w3_t[2] = final_len * 8; w3_t[3] = 0; 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_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); COMPARE_M_SIMD (a, d, c, b); } } void m04010s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 pw_salt_len = pw_len + salt_len; const u32 final_len = salt_len + 32; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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_le (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] = pw_salt_len * 8; w3_t[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_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); u32x t; 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; 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] = 0x80; w2_t[1] = 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_le (w0_t, w1_t, w2_t, w3_t, salt_len); w3_t[2] = final_len * 8; w3_t[3] = 0; 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_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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m04010_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ m04010m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04010_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m04010m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04010_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m04010m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04010_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m04010s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04010_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m04010s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04010_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ m04010s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } hashcat-4.0.1/OpenCL/m04010_a3.cl000066400000000000000000000214661320027462700160070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04010_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; md5_ctx_vector_t ctx1; md5_init_vector_from_scalar (&ctx1, &ctx0); md5_update_vector (&ctx1, w, pw_len); md5_final_vector (&ctx1); const u32x a = ctx1.h[0]; const u32x b = ctx1.h[1]; const u32x c = ctx1.h[2]; const u32x d = ctx1.h[3]; u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_ctx_vector_t ctx; md5_init_vector_from_scalar (&ctx, &ctx0); md5_update_vector_64 (&ctx, w0, w1, w2, w3, 32); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m04010_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; md5_ctx_vector_t ctx1; md5_init_vector_from_scalar (&ctx1, &ctx0); md5_update_vector (&ctx1, w, pw_len); md5_final_vector (&ctx1); const u32x a = ctx1.h[0]; const u32x b = ctx1.h[1]; const u32x c = ctx1.h[2]; const u32x d = ctx1.h[3]; u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_ctx_vector_t ctx; md5_init_vector_from_scalar (&ctx, &ctx0); md5_update_vector_64 (&ctx, w0, w1, w2, w3, 32); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04110_a0-optimized.cl000066400000000000000000001042001320027462700177730ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04110_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 final_len = salt_len + 32; // salt version 2: with 0x80 appended u32 salt_buf0_t[4]; u32 salt_buf1_t[4]; u32 salt_buf2_t[4]; u32 salt_buf3_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]; 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]; salt_buf2_t[0] = salt_bufs[salt_pos].salt_buf[ 8]; salt_buf2_t[1] = salt_bufs[salt_pos].salt_buf[ 9]; salt_buf2_t[2] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2_t[3] = salt_bufs[salt_pos].salt_buf[11]; salt_buf3_t[0] = salt_bufs[salt_pos].salt_buf[12]; salt_buf3_t[1] = salt_bufs[salt_pos].salt_buf[13]; salt_buf3_t[2] = salt_bufs[salt_pos].salt_buf[14]; salt_buf3_t[3] = salt_bufs[salt_pos].salt_buf[15]; append_0x80_4x4_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0_t[0]; s0[1] = salt_buf0_t[1]; s0[2] = salt_buf0_t[2]; s0[3] = salt_buf0_t[3]; s1[0] = salt_buf1_t[0]; s1[1] = salt_buf1_t[1]; s1[2] = salt_buf1_t[2]; s1[3] = salt_buf1_t[3]; s2[0] = salt_buf2_t[0]; s2[1] = salt_buf2_t[1]; s2[2] = salt_buf2_t[2]; s2[3] = salt_buf2_t[3]; s3[0] = salt_buf3_t[0]; s3[1] = salt_buf3_t[1]; s3[2] = salt_buf3_t[2]; s3[3] = salt_buf3_t[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); const u32x 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; /** * 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0x80; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); w3[2] = final_len * 8; w3[3] = 0; 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]; /** * md5 */ a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m04110_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04110_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04110_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 final_len = salt_len + 32; // salt version 2: with 0x80 appended u32 salt_buf0_t[4]; u32 salt_buf1_t[4]; u32 salt_buf2_t[4]; u32 salt_buf3_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]; 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]; salt_buf2_t[0] = salt_bufs[salt_pos].salt_buf[ 8]; salt_buf2_t[1] = salt_bufs[salt_pos].salt_buf[ 9]; salt_buf2_t[2] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2_t[3] = salt_bufs[salt_pos].salt_buf[11]; salt_buf3_t[0] = salt_bufs[salt_pos].salt_buf[12]; salt_buf3_t[1] = salt_bufs[salt_pos].salt_buf[13]; salt_buf3_t[2] = salt_bufs[salt_pos].salt_buf[14]; salt_buf3_t[3] = salt_bufs[salt_pos].salt_buf[15]; append_0x80_4x4_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0_t[0]; s0[1] = salt_buf0_t[1]; s0[2] = salt_buf0_t[2]; s0[3] = salt_buf0_t[3]; s1[0] = salt_buf1_t[0]; s1[1] = salt_buf1_t[1]; s1[2] = salt_buf1_t[2]; s1[3] = salt_buf1_t[3]; s2[0] = salt_buf2_t[0]; s2[1] = salt_buf2_t[1]; s2[2] = salt_buf2_t[2]; s2[3] = salt_buf2_t[3]; s3[0] = salt_buf3_t[0]; s3[1] = salt_buf3_t[1]; s3[2] = salt_buf3_t[2]; s3[3] = salt_buf3_t[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); const u32x 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; /** * 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0x80; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); w3[2] = final_len * 8; w3[3] = 0; 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]; /** * md5 */ a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m04110_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04110_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04110_a0.cl000066400000000000000000000212051320027462700157740ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04110_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx1; md5_init (&ctx1); md5_update (&ctx1, tmp.i, tmp.pw_len); md5_update (&ctx1, s, salt_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_ctx_t ctx = ctx0; md5_update_64 (&ctx, w0, w1, w2, w3, 32); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04110_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx1; md5_init (&ctx1); md5_update (&ctx1, tmp.i, tmp.pw_len); md5_update (&ctx1, s, salt_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_ctx_t ctx = ctx0; md5_update_64 (&ctx, w0, w1, w2, w3, 32); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04110_a1-optimized.cl000066400000000000000000001126151320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04110_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 final_len = salt_len + 32; // salt version 2: with 0x80 appended u32 salt_buf0_t[4]; u32 salt_buf1_t[4]; u32 salt_buf2_t[4]; u32 salt_buf3_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]; 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]; salt_buf2_t[0] = salt_bufs[salt_pos].salt_buf[ 8]; salt_buf2_t[1] = salt_bufs[salt_pos].salt_buf[ 9]; salt_buf2_t[2] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2_t[3] = salt_bufs[salt_pos].salt_buf[11]; salt_buf3_t[0] = salt_bufs[salt_pos].salt_buf[12]; salt_buf3_t[1] = salt_bufs[salt_pos].salt_buf[13]; salt_buf3_t[2] = salt_bufs[salt_pos].salt_buf[14]; salt_buf3_t[3] = salt_bufs[salt_pos].salt_buf[15]; append_0x80_4x4_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = pw_len * 8; w3[3] = 0; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0_t[0]; s0[1] = salt_buf0_t[1]; s0[2] = salt_buf0_t[2]; s0[3] = salt_buf0_t[3]; s1[0] = salt_buf1_t[0]; s1[1] = salt_buf1_t[1]; s1[2] = salt_buf1_t[2]; s1[3] = salt_buf1_t[3]; s2[0] = salt_buf2_t[0]; s2[1] = salt_buf2_t[1]; s2[2] = salt_buf2_t[2]; s2[3] = salt_buf2_t[3]; s3[0] = salt_buf3_t[0]; s3[1] = salt_buf3_t[1]; s3[2] = salt_buf3_t[2]; s3[3] = salt_buf3_t[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); const u32x 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0x80; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); w3[2] = final_len * 8; w3[3] = 0; 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]; /** * md5 */ a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m04110_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04110_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04110_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 final_len = salt_len + 32; // salt version 2: with 0x80 appended u32 salt_buf0_t[4]; u32 salt_buf1_t[4]; u32 salt_buf2_t[4]; u32 salt_buf3_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]; 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]; salt_buf2_t[0] = salt_bufs[salt_pos].salt_buf[ 8]; salt_buf2_t[1] = salt_bufs[salt_pos].salt_buf[ 9]; salt_buf2_t[2] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2_t[3] = salt_bufs[salt_pos].salt_buf[11]; salt_buf3_t[0] = salt_bufs[salt_pos].salt_buf[12]; salt_buf3_t[1] = salt_bufs[salt_pos].salt_buf[13]; salt_buf3_t[2] = salt_bufs[salt_pos].salt_buf[14]; salt_buf3_t[3] = salt_bufs[salt_pos].salt_buf[15]; append_0x80_4x4_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = pw_len * 8; w3[3] = 0; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0_t[0]; s0[1] = salt_buf0_t[1]; s0[2] = salt_buf0_t[2]; s0[3] = salt_buf0_t[3]; s1[0] = salt_buf1_t[0]; s1[1] = salt_buf1_t[1]; s1[2] = salt_buf1_t[2]; s1[3] = salt_buf1_t[3]; s2[0] = salt_buf2_t[0]; s2[1] = salt_buf2_t[1]; s2[2] = salt_buf2_t[2]; s2[3] = salt_buf2_t[3]; s3[0] = salt_buf3_t[0]; s3[1] = salt_buf3_t[1]; s3[2] = salt_buf3_t[2]; s3[3] = salt_buf3_t[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); const u32x 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0x80; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; /** * prepend salt */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); w3[2] = final_len * 8; w3[3] = 0; 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]; /** * md5 */ a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m04110_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04110_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04110_a1.cl000066400000000000000000000211241320027462700157750ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04110_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, s, salt_len); md5_ctx_t ctx0t; md5_init (&ctx0t); md5_update_global (&ctx0t, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0t; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_update (&ctx1, s, salt_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_ctx_t ctx = ctx0; md5_update_64 (&ctx, w0, w1, w2, w3, 32); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04110_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, s, salt_len); md5_ctx_t ctx0t; md5_init (&ctx0t); md5_update_global (&ctx0t, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0t; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_update (&ctx1, s, salt_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_ctx_t ctx = ctx0; md5_update_64 (&ctx, w0, w1, w2, w3, 32); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04110_a3-optimized.cl000066400000000000000000001263611320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void m04110m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 pw_salt_len = pw_len + salt_len; const u32 final_len = salt_len + 32; /** * append salt */ u32 salt_buf0_t[4]; u32 salt_buf1_t[4]; u32 salt_buf2_t[4]; u32 salt_buf3_t[4]; salt_buf0_t[0] = salt_buf0[0]; salt_buf0_t[1] = salt_buf0[1]; salt_buf0_t[2] = salt_buf0[2]; salt_buf0_t[3] = salt_buf0[3]; salt_buf1_t[0] = salt_buf1[0]; salt_buf1_t[1] = salt_buf1[1]; salt_buf1_t[2] = salt_buf1[2]; salt_buf1_t[3] = salt_buf1[3]; salt_buf2_t[0] = salt_buf2[0]; salt_buf2_t[1] = salt_buf2[1]; salt_buf2_t[2] = salt_buf2[2]; salt_buf2_t[3] = salt_buf2[3]; salt_buf3_t[0] = salt_buf3[0]; salt_buf3_t[1] = salt_buf3[1]; salt_buf3_t[2] = salt_buf3[2]; salt_buf3_t[3] = salt_buf3[3]; append_0x80_4x4_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, salt_len); switch_buffer_by_offset_le_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, pw_len); w0[0] |= salt_buf0_t[0]; w0[1] |= salt_buf0_t[1]; w0[2] |= salt_buf0_t[2]; w0[3] |= salt_buf0_t[3]; w1[0] |= salt_buf1_t[0]; w1[1] |= salt_buf1_t[1]; w1[2] |= salt_buf1_t[2]; w1[3] |= salt_buf1_t[3]; w2[0] |= salt_buf2_t[0]; w2[1] |= salt_buf2_t[1]; w2[2] |= salt_buf2_t[2]; w2[3] |= salt_buf2_t[3]; w3[0] |= salt_buf3_t[0]; w3[1] |= salt_buf3_t[1]; w3[2] = pw_salt_len * 8; w3[3] = 0; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * 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); u32x t; 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; 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] = 0x80; w2_t[1] = 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_le (w0_t, w1_t, w2_t, w3_t, salt_len); w3_t[2] = final_len * 8; w3_t[3] = 0; 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_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); COMPARE_M_SIMD (a, d, c, b); } } void m04110s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 pw_salt_len = pw_len + salt_len; const u32 final_len = salt_len + 32; /** * append salt */ u32 salt_buf0_t[4]; u32 salt_buf1_t[4]; u32 salt_buf2_t[4]; u32 salt_buf3_t[4]; salt_buf0_t[0] = salt_buf0[0]; salt_buf0_t[1] = salt_buf0[1]; salt_buf0_t[2] = salt_buf0[2]; salt_buf0_t[3] = salt_buf0[3]; salt_buf1_t[0] = salt_buf1[0]; salt_buf1_t[1] = salt_buf1[1]; salt_buf1_t[2] = salt_buf1[2]; salt_buf1_t[3] = salt_buf1[3]; salt_buf2_t[0] = salt_buf2[0]; salt_buf2_t[1] = salt_buf2[1]; salt_buf2_t[2] = salt_buf2[2]; salt_buf2_t[3] = salt_buf2[3]; salt_buf3_t[0] = salt_buf3[0]; salt_buf3_t[1] = salt_buf3[1]; salt_buf3_t[2] = salt_buf3[2]; salt_buf3_t[3] = salt_buf3[3]; append_0x80_4x4_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, salt_len); switch_buffer_by_offset_le_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, pw_len); w0[0] |= salt_buf0_t[0]; w0[1] |= salt_buf0_t[1]; w0[2] |= salt_buf0_t[2]; w0[3] |= salt_buf0_t[3]; w1[0] |= salt_buf1_t[0]; w1[1] |= salt_buf1_t[1]; w1[2] |= salt_buf1_t[2]; w1[3] |= salt_buf1_t[3]; w2[0] |= salt_buf2_t[0]; w2[1] |= salt_buf2_t[1]; w2[2] |= salt_buf2_t[2]; w2[3] |= salt_buf2_t[3]; w3[0] |= salt_buf3_t[0]; w3[1] |= salt_buf3_t[1]; w3[2] = pw_salt_len * 8; w3[3] = 0; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * 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); u32x t; 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; 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] = 0x80; w2_t[1] = 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_le (w0_t, w1_t, w2_t, w3_t, salt_len); w3_t[2] = final_len * 8; w3_t[3] = 0; 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_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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m04110_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ m04110m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04110_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m04110m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04110_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m04110m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04110_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m04110s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04110_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m04110s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04110_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ m04110s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } hashcat-4.0.1/OpenCL/m04110_a3.cl000066400000000000000000000223541320027462700160050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04110_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; md5_ctx_vector_t ctx1; md5_init_vector (&ctx1); md5_update_vector (&ctx1, w, pw_len); md5_update_vector (&ctx1, s, salt_len); md5_final_vector (&ctx1); const u32x a = ctx1.h[0]; const u32x b = ctx1.h[1]; const u32x c = ctx1.h[2]; const u32x d = ctx1.h[3]; u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_ctx_vector_t ctx; md5_init_vector_from_scalar (&ctx, &ctx0); md5_update_vector_64 (&ctx, w0, w1, w2, w3, 32); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m04110_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; md5_ctx_vector_t ctx1; md5_init_vector (&ctx1); md5_update_vector (&ctx1, w, pw_len); md5_update_vector (&ctx1, s, salt_len); md5_final_vector (&ctx1); const u32x a = ctx1.h[0]; const u32x b = ctx1.h[1]; const u32x c = ctx1.h[2]; const u32x d = ctx1.h[3]; u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_ctx_vector_t ctx; md5_init_vector_from_scalar (&ctx, &ctx0); md5_update_vector_64 (&ctx, w0, w1, w2, w3, 32); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04310_a0-optimized.cl000066400000000000000000000710201320027462700200000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04310_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_upper8 ((a >> 0) & 255) << 0 | uint_to_hex_upper8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_upper8 ((a >> 16) & 255) << 0 | uint_to_hex_upper8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_upper8 ((b >> 0) & 255) << 0 | uint_to_hex_upper8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_upper8 ((b >> 16) & 255) << 0 | uint_to_hex_upper8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_upper8 ((c >> 0) & 255) << 0 | uint_to_hex_upper8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_upper8 ((c >> 16) & 255) << 0 | uint_to_hex_upper8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_upper8 ((d >> 0) & 255) << 0 | uint_to_hex_upper8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_upper8 ((d >> 16) & 255) << 0 | uint_to_hex_upper8 ((d >> 24) & 255) << 16; w2[0] = salt_buf0[0]; w2[1] = salt_buf0[1]; w2[2] = salt_buf0[2]; w2[3] = salt_buf0[3]; w3[0] = salt_buf1[0]; w3[1] = salt_buf1[1]; w3[2] = (32 + salt_len) * 8; w3[3] = 0; a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m04310_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04310_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04310_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_upper8 ((a >> 0) & 255) << 0 | uint_to_hex_upper8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_upper8 ((a >> 16) & 255) << 0 | uint_to_hex_upper8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_upper8 ((b >> 0) & 255) << 0 | uint_to_hex_upper8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_upper8 ((b >> 16) & 255) << 0 | uint_to_hex_upper8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_upper8 ((c >> 0) & 255) << 0 | uint_to_hex_upper8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_upper8 ((c >> 16) & 255) << 0 | uint_to_hex_upper8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_upper8 ((d >> 0) & 255) << 0 | uint_to_hex_upper8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_upper8 ((d >> 16) & 255) << 0 | uint_to_hex_upper8 ((d >> 24) & 255) << 16; w2[0] = salt_buf0[0]; w2[1] = salt_buf0[1]; w2[2] = salt_buf0[2]; w2[3] = salt_buf0[3]; w3[0] = salt_buf1[0]; w3[1] = salt_buf1[1]; w3[2] = (32 + salt_len) * 8; w3[3] = 0; a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m04310_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04310_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04310_a0.cl000066400000000000000000000203471320027462700160040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04310_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, tmp.i, tmp.pw_len); md5_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_upper8 ((a >> 0) & 255) << 0 | uint_to_hex_upper8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_upper8 ((a >> 16) & 255) << 0 | uint_to_hex_upper8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_upper8 ((b >> 0) & 255) << 0 | uint_to_hex_upper8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_upper8 ((b >> 16) & 255) << 0 | uint_to_hex_upper8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_upper8 ((c >> 0) & 255) << 0 | uint_to_hex_upper8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_upper8 ((c >> 16) & 255) << 0 | uint_to_hex_upper8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_upper8 ((d >> 0) & 255) << 0 | uint_to_hex_upper8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_upper8 ((d >> 16) & 255) << 0 | uint_to_hex_upper8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04310_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, tmp.i, tmp.pw_len); md5_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_upper8 ((a >> 0) & 255) << 0 | uint_to_hex_upper8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_upper8 ((a >> 16) & 255) << 0 | uint_to_hex_upper8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_upper8 ((b >> 0) & 255) << 0 | uint_to_hex_upper8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_upper8 ((b >> 16) & 255) << 0 | uint_to_hex_upper8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_upper8 ((c >> 0) & 255) << 0 | uint_to_hex_upper8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_upper8 ((c >> 16) & 255) << 0 | uint_to_hex_upper8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_upper8 ((d >> 0) & 255) << 0 | uint_to_hex_upper8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_upper8 ((d >> 16) & 255) << 0 | uint_to_hex_upper8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04310_a1-optimized.cl000066400000000000000000000772611320027462700200160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04310_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_upper8 ((a >> 0) & 255) << 0 | uint_to_hex_upper8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_upper8 ((a >> 16) & 255) << 0 | uint_to_hex_upper8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_upper8 ((b >> 0) & 255) << 0 | uint_to_hex_upper8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_upper8 ((b >> 16) & 255) << 0 | uint_to_hex_upper8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_upper8 ((c >> 0) & 255) << 0 | uint_to_hex_upper8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_upper8 ((c >> 16) & 255) << 0 | uint_to_hex_upper8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_upper8 ((d >> 0) & 255) << 0 | uint_to_hex_upper8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_upper8 ((d >> 16) & 255) << 0 | uint_to_hex_upper8 ((d >> 24) & 255) << 16; w2[0] = salt_buf0[0]; w2[1] = salt_buf0[1]; w2[2] = salt_buf0[2]; w2[3] = salt_buf0[3]; w3[0] = salt_buf1[0]; w3[1] = salt_buf1[1]; w3[2] = (32 + salt_len) * 8; w3[3] = 0; a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m04310_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04310_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04310_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_upper8 ((a >> 0) & 255) << 0 | uint_to_hex_upper8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_upper8 ((a >> 16) & 255) << 0 | uint_to_hex_upper8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_upper8 ((b >> 0) & 255) << 0 | uint_to_hex_upper8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_upper8 ((b >> 16) & 255) << 0 | uint_to_hex_upper8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_upper8 ((c >> 0) & 255) << 0 | uint_to_hex_upper8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_upper8 ((c >> 16) & 255) << 0 | uint_to_hex_upper8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_upper8 ((d >> 0) & 255) << 0 | uint_to_hex_upper8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_upper8 ((d >> 16) & 255) << 0 | uint_to_hex_upper8 ((d >> 24) & 255) << 16; w2[0] = salt_buf0[0]; w2[1] = salt_buf0[1]; w2[2] = salt_buf0[2]; w2[3] = salt_buf0[3]; w3[0] = salt_buf1[0]; w3[1] = salt_buf1[1]; w3[2] = (32 + salt_len) * 8; w3[3] = 0; a = MD5M_A; b = MD5M_B; c = MD5M_C; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m04310_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04310_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04310_a1.cl000066400000000000000000000202561320027462700160040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04310_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_upper8 ((a >> 0) & 255) << 0 | uint_to_hex_upper8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_upper8 ((a >> 16) & 255) << 0 | uint_to_hex_upper8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_upper8 ((b >> 0) & 255) << 0 | uint_to_hex_upper8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_upper8 ((b >> 16) & 255) << 0 | uint_to_hex_upper8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_upper8 ((c >> 0) & 255) << 0 | uint_to_hex_upper8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_upper8 ((c >> 16) & 255) << 0 | uint_to_hex_upper8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_upper8 ((d >> 0) & 255) << 0 | uint_to_hex_upper8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_upper8 ((d >> 16) & 255) << 0 | uint_to_hex_upper8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04310_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_upper8 ((a >> 0) & 255) << 0 | uint_to_hex_upper8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_upper8 ((a >> 16) & 255) << 0 | uint_to_hex_upper8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_upper8 ((b >> 0) & 255) << 0 | uint_to_hex_upper8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_upper8 ((b >> 16) & 255) << 0 | uint_to_hex_upper8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_upper8 ((c >> 0) & 255) << 0 | uint_to_hex_upper8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_upper8 ((c >> 16) & 255) << 0 | uint_to_hex_upper8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_upper8 ((d >> 0) & 255) << 0 | uint_to_hex_upper8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_upper8 ((d >> 16) & 255) << 0 | uint_to_hex_upper8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04310_a3-optimized.cl000066400000000000000000001156461320027462700200200ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void m04310m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * 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); u32x t; 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; w0_t[0] = uint_to_hex_upper8 ((a >> 0) & 255) << 0 | uint_to_hex_upper8 ((a >> 8) & 255) << 16; w0_t[1] = uint_to_hex_upper8 ((a >> 16) & 255) << 0 | uint_to_hex_upper8 ((a >> 24) & 255) << 16; w0_t[2] = uint_to_hex_upper8 ((b >> 0) & 255) << 0 | uint_to_hex_upper8 ((b >> 8) & 255) << 16; w0_t[3] = uint_to_hex_upper8 ((b >> 16) & 255) << 0 | uint_to_hex_upper8 ((b >> 24) & 255) << 16; w1_t[0] = uint_to_hex_upper8 ((c >> 0) & 255) << 0 | uint_to_hex_upper8 ((c >> 8) & 255) << 16; w1_t[1] = uint_to_hex_upper8 ((c >> 16) & 255) << 0 | uint_to_hex_upper8 ((c >> 24) & 255) << 16; w1_t[2] = uint_to_hex_upper8 ((d >> 0) & 255) << 0 | uint_to_hex_upper8 ((d >> 8) & 255) << 16; w1_t[3] = uint_to_hex_upper8 ((d >> 16) & 255) << 0 | uint_to_hex_upper8 ((d >> 24) & 255) << 16; w2_t[0] = salt_buf0[0]; w2_t[1] = salt_buf0[1]; w2_t[2] = salt_buf0[2]; w2_t[3] = salt_buf0[3]; w3_t[0] = salt_buf1[0]; w3_t[1] = salt_buf1[1]; w3_t[2] = (32 + salt_len) * 8; w3_t[3] = 0; 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); COMPARE_M_SIMD (a, d, c, b); } } void m04310s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * 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); u32x t; 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; w0_t[0] = uint_to_hex_upper8 ((a >> 0) & 255) << 0 | uint_to_hex_upper8 ((a >> 8) & 255) << 16; w0_t[1] = uint_to_hex_upper8 ((a >> 16) & 255) << 0 | uint_to_hex_upper8 ((a >> 24) & 255) << 16; w0_t[2] = uint_to_hex_upper8 ((b >> 0) & 255) << 0 | uint_to_hex_upper8 ((b >> 8) & 255) << 16; w0_t[3] = uint_to_hex_upper8 ((b >> 16) & 255) << 0 | uint_to_hex_upper8 ((b >> 24) & 255) << 16; w1_t[0] = uint_to_hex_upper8 ((c >> 0) & 255) << 0 | uint_to_hex_upper8 ((c >> 8) & 255) << 16; w1_t[1] = uint_to_hex_upper8 ((c >> 16) & 255) << 0 | uint_to_hex_upper8 ((c >> 24) & 255) << 16; w1_t[2] = uint_to_hex_upper8 ((d >> 0) & 255) << 0 | uint_to_hex_upper8 ((d >> 8) & 255) << 16; w1_t[3] = uint_to_hex_upper8 ((d >> 16) & 255) << 0 | uint_to_hex_upper8 ((d >> 24) & 255) << 16; w2_t[0] = salt_buf0[0]; w2_t[1] = salt_buf0[1]; w2_t[2] = salt_buf0[2]; w2_t[3] = salt_buf0[3]; w3_t[0] = salt_buf1[0]; w3_t[1] = salt_buf1[1]; w3_t[2] = (32 + salt_len) * 8; w3_t[3] = 0; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m04310_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04310_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04310_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04310_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04310_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04310_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } hashcat-4.0.1/OpenCL/m04310_a3.cl000066400000000000000000000212001320027462700157740ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04310_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx0; md5_init_vector (&ctx0); md5_update_vector (&ctx0, w, pw_len); md5_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; md5_ctx_vector_t ctx; md5_init_vector (&ctx); ctx.w0[0] = uint_to_hex_upper8 ((a >> 0) & 255) << 0 | uint_to_hex_upper8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_upper8 ((a >> 16) & 255) << 0 | uint_to_hex_upper8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_upper8 ((b >> 0) & 255) << 0 | uint_to_hex_upper8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_upper8 ((b >> 16) & 255) << 0 | uint_to_hex_upper8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_upper8 ((c >> 0) & 255) << 0 | uint_to_hex_upper8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_upper8 ((c >> 16) & 255) << 0 | uint_to_hex_upper8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_upper8 ((d >> 0) & 255) << 0 | uint_to_hex_upper8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_upper8 ((d >> 16) & 255) << 0 | uint_to_hex_upper8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update_vector (&ctx, s, salt_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m04310_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx0; md5_init_vector (&ctx0); md5_update_vector (&ctx0, w, pw_len); md5_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; md5_ctx_vector_t ctx; md5_init_vector (&ctx); ctx.w0[0] = uint_to_hex_upper8 ((a >> 0) & 255) << 0 | uint_to_hex_upper8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_upper8 ((a >> 16) & 255) << 0 | uint_to_hex_upper8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_upper8 ((b >> 0) & 255) << 0 | uint_to_hex_upper8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_upper8 ((b >> 16) & 255) << 0 | uint_to_hex_upper8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_upper8 ((c >> 0) & 255) << 0 | uint_to_hex_upper8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_upper8 ((c >> 16) & 255) << 0 | uint_to_hex_upper8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_upper8 ((d >> 0) & 255) << 0 | uint_to_hex_upper8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_upper8 ((d >> 16) & 255) << 0 | uint_to_hex_upper8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update_vector (&ctx, s, salt_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04400_a0-optimized.cl000066400000000000000000001054601320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04400_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m04400_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04400_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04400_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) continue; 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m04400_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04400_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04400_a0.cl000066400000000000000000000205411320027462700160000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04400_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_swap (&ctx0, tmp.i, tmp.pw_len); sha1_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; const u32 e = ctx0.h[4]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 | uint_to_hex_lower8 ((a >> 16) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 | uint_to_hex_lower8 ((a >> 0) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 | uint_to_hex_lower8 ((b >> 16) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 | uint_to_hex_lower8 ((b >> 0) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 | uint_to_hex_lower8 ((c >> 16) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 | uint_to_hex_lower8 ((c >> 0) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 | uint_to_hex_lower8 ((d >> 16) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 | uint_to_hex_lower8 ((d >> 0) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 | uint_to_hex_lower8 ((e >> 16) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 | uint_to_hex_lower8 ((e >> 0) & 255) << 16; ctx.len = 40; md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04400_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_swap (&ctx0, tmp.i, tmp.pw_len); sha1_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; const u32 e = ctx0.h[4]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 | uint_to_hex_lower8 ((a >> 16) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 | uint_to_hex_lower8 ((a >> 0) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 | uint_to_hex_lower8 ((b >> 16) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 | uint_to_hex_lower8 ((b >> 0) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 | uint_to_hex_lower8 ((c >> 16) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 | uint_to_hex_lower8 ((c >> 0) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 | uint_to_hex_lower8 ((d >> 16) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 | uint_to_hex_lower8 ((d >> 0) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 | uint_to_hex_lower8 ((e >> 16) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 | uint_to_hex_lower8 ((e >> 0) & 255) << 16; ctx.len = 40; md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04400_a1-optimized.cl000066400000000000000000001140471320027462700200100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04400_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m04400_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04400_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04400_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) continue; 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m04400_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04400_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04400_a1.cl000066400000000000000000000204661320027462700160070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04400_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1 = ctx0; sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; const u32 e = ctx1.h[4]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 | uint_to_hex_lower8 ((a >> 16) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 | uint_to_hex_lower8 ((a >> 0) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 | uint_to_hex_lower8 ((b >> 16) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 | uint_to_hex_lower8 ((b >> 0) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 | uint_to_hex_lower8 ((c >> 16) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 | uint_to_hex_lower8 ((c >> 0) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 | uint_to_hex_lower8 ((d >> 16) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 | uint_to_hex_lower8 ((d >> 0) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 | uint_to_hex_lower8 ((e >> 16) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 | uint_to_hex_lower8 ((e >> 0) & 255) << 16; ctx.len = 40; md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04400_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1 = ctx0; sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; const u32 e = ctx1.h[4]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 | uint_to_hex_lower8 ((a >> 16) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 | uint_to_hex_lower8 ((a >> 0) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 | uint_to_hex_lower8 ((b >> 16) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 | uint_to_hex_lower8 ((b >> 0) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 | uint_to_hex_lower8 ((c >> 16) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 | uint_to_hex_lower8 ((c >> 0) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 | uint_to_hex_lower8 ((d >> 16) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 | uint_to_hex_lower8 ((d >> 0) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 | uint_to_hex_lower8 ((e >> 16) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 | uint_to_hex_lower8 ((e >> 0) & 255) << 16; ctx.len = 40; md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04400_a3-optimized.cl000066400000000000000000001271151320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void m04400m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * sha1 */ u32x w0_t = w0lr; 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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } void m04400s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * sha1 */ u32x w0_t = w0lr; 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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) continue; 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m04400_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04400_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04400_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04400_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04400_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04400_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } hashcat-4.0.1/OpenCL/m04400_a3.cl000066400000000000000000000213421320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04400_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx0; sha1_init_vector (&ctx0); sha1_update_vector (&ctx0, w, pw_len); sha1_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; const u32x e = ctx0.h[4]; md5_ctx_vector_t ctx; md5_init_vector (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 | uint_to_hex_lower8 ((a >> 16) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 | uint_to_hex_lower8 ((a >> 0) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 | uint_to_hex_lower8 ((b >> 16) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 | uint_to_hex_lower8 ((b >> 0) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 | uint_to_hex_lower8 ((c >> 16) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 | uint_to_hex_lower8 ((c >> 0) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 | uint_to_hex_lower8 ((d >> 16) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 | uint_to_hex_lower8 ((d >> 0) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 | uint_to_hex_lower8 ((e >> 16) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 | uint_to_hex_lower8 ((e >> 0) & 255) << 16; ctx.len = 40; md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m04400_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx0; sha1_init_vector (&ctx0); sha1_update_vector (&ctx0, w, pw_len); sha1_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; const u32x e = ctx0.h[4]; md5_ctx_vector_t ctx; md5_init_vector (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 | uint_to_hex_lower8 ((a >> 16) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 | uint_to_hex_lower8 ((a >> 0) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 | uint_to_hex_lower8 ((b >> 16) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 | uint_to_hex_lower8 ((b >> 0) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 | uint_to_hex_lower8 ((c >> 16) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 | uint_to_hex_lower8 ((c >> 0) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 | uint_to_hex_lower8 ((d >> 16) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 | uint_to_hex_lower8 ((d >> 0) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 | uint_to_hex_lower8 ((e >> 16) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 | uint_to_hex_lower8 ((e >> 0) & 255) << 16; ctx.len = 40; md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04500_a0-optimized.cl000066400000000000000000001231221320027462700200020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04500_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m04500_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04500_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04500_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m04500_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04500_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04500_a0.cl000066400000000000000000000207231320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04500_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_swap (&ctx0, tmp.i, tmp.pw_len); sha1_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; const u32 e = ctx0.h[4]; sha1_ctx_t ctx; sha1_init (&ctx); ctx.w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; ctx.len = 40; sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04500_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_swap (&ctx0, tmp.i, tmp.pw_len); sha1_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; const u32 e = ctx0.h[4]; sha1_ctx_t ctx; sha1_init (&ctx); ctx.w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; ctx.len = 40; sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04500_a1-optimized.cl000066400000000000000000001315111320027462700200040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04500_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m04500_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04500_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04500_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m04500_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04500_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04500_a1.cl000066400000000000000000000206501320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04500_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1 = ctx0; sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; const u32 e = ctx1.h[4]; sha1_ctx_t ctx; sha1_init (&ctx); ctx.w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; ctx.len = 40; sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04500_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1 = ctx0; sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; const u32 e = ctx1.h[4]; sha1_ctx_t ctx; sha1_init (&ctx); ctx.w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; ctx.len = 40; sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04500_a3-optimized.cl000066400000000000000000001445551320027462700200220ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void m04500m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * sha1 */ u32x w0_t = w0lr; 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 = 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); COMPARE_M_SIMD (d, e, c, b); } } void m04500s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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_S (search[1], 2u); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * sha1 */ u32x w0_t = w0lr; 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 = 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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m04500_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04500_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04500_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04500_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04500_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04500_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } hashcat-4.0.1/OpenCL/m04500_a3.cl000066400000000000000000000215241320027462700160060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04500_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx0; sha1_init_vector (&ctx0); sha1_update_vector (&ctx0, w, pw_len); sha1_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; const u32x e = ctx0.h[4]; sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); ctx.w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; ctx.len = 40; sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m04500_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx0; sha1_init_vector (&ctx0); sha1_update_vector (&ctx0, w, pw_len); sha1_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; const u32x e = ctx0.h[4]; sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); ctx.w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; ctx.len = 40; sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04520_a0-optimized.cl000066400000000000000000001737041320027462700200170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04520_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[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 = 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; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 | uint_to_hex_lower8 ((a >> 16) & 255) << 16; t0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 | uint_to_hex_lower8 ((a >> 0) & 255) << 16; t0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 | uint_to_hex_lower8 ((b >> 16) & 255) << 16; t0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 | uint_to_hex_lower8 ((b >> 0) & 255) << 16; t1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 | uint_to_hex_lower8 ((c >> 16) & 255) << 16; t1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 | uint_to_hex_lower8 ((c >> 0) & 255) << 16; t1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 | uint_to_hex_lower8 ((d >> 16) & 255) << 16; t1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 | uint_to_hex_lower8 ((d >> 0) & 255) << 16; t2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 | uint_to_hex_lower8 ((e >> 16) & 255) << 16; t2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 | uint_to_hex_lower8 ((e >> 0) & 255) << 16; t2[2] = 0x80; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; a = SHA1M_A; b = SHA1M_B; c = SHA1M_C; d = SHA1M_D; e = SHA1M_E; if (salt_len > 15) { u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_le (t0, t1, t2, t3, c0, c1, c2, c3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] |= salt_buf3[2]; t3[3] |= salt_buf3[3]; w0_t = swap32 (t0[0]); w1_t = swap32 (t0[1]); w2_t = swap32 (t0[2]); w3_t = swap32 (t0[3]); w4_t = swap32 (t1[0]); w5_t = swap32 (t1[1]); w6_t = swap32 (t1[2]); w7_t = swap32 (t1[3]); w8_t = swap32 (t2[0]); w9_t = swap32 (t2[1]); wa_t = swap32 (t2[2]); wb_t = swap32 (t2[3]); wc_t = swap32 (t3[0]); wd_t = swap32 (t3[1]); we_t = swap32 (t3[2]); wf_t = swap32 (t3[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); a += SHA1M_A; b += SHA1M_B; c += SHA1M_C; d += SHA1M_D; e += SHA1M_E; t0[0] = c0[0]; t0[1] = c0[1]; t0[2] = c0[2]; t0[3] = c0[3]; t1[0] = c1[0]; t1[1] = c1[1]; t1[2] = c1[2]; t1[3] = c1[3]; t2[0] = c2[0]; t2[1] = c2[1]; t2[2] = c2[2]; t2[3] = c2[3]; t3[0] = c3[0]; t3[1] = c3[1]; t3[2] = c3[2]; t3[3] = c3[3]; } else { switch_buffer_by_offset_le (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; } // final round const u32x r_a = a; const u32x r_b = b; const u32x r_c = c; const u32x r_d = d; const u32x r_e = e; w0_t = swap32 (t0[0]); w1_t = swap32 (t0[1]); w2_t = swap32 (t0[2]); w3_t = swap32 (t0[3]); w4_t = swap32 (t1[0]); w5_t = swap32 (t1[1]); w6_t = swap32 (t1[2]); w7_t = swap32 (t1[3]); w8_t = swap32 (t2[0]); w9_t = swap32 (t2[1]); wa_t = swap32 (t2[2]); wb_t = swap32 (t2[3]); wc_t = swap32 (t3[0]); wd_t = swap32 (t3[1]); we_t = 0; wf_t = (salt_len + 40) * 8; #undef K #define K SHA1C00 SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); #undef K #define K SHA1C01 w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); #undef K #define K SHA1C02 w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); #undef K #define K SHA1C03 wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_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; COMPARE_M_SIMD (d, e, c, b); } } __kernel void m04520_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04520_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04520_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[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 = 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; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 | uint_to_hex_lower8 ((a >> 16) & 255) << 16; t0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 | uint_to_hex_lower8 ((a >> 0) & 255) << 16; t0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 | uint_to_hex_lower8 ((b >> 16) & 255) << 16; t0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 | uint_to_hex_lower8 ((b >> 0) & 255) << 16; t1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 | uint_to_hex_lower8 ((c >> 16) & 255) << 16; t1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 | uint_to_hex_lower8 ((c >> 0) & 255) << 16; t1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 | uint_to_hex_lower8 ((d >> 16) & 255) << 16; t1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 | uint_to_hex_lower8 ((d >> 0) & 255) << 16; t2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 | uint_to_hex_lower8 ((e >> 16) & 255) << 16; t2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 | uint_to_hex_lower8 ((e >> 0) & 255) << 16; t2[2] = 0x80; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; a = SHA1M_A; b = SHA1M_B; c = SHA1M_C; d = SHA1M_D; e = SHA1M_E; if (salt_len > 15) { u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_le (t0, t1, t2, t3, c0, c1, c2, c3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] |= salt_buf3[2]; t3[3] |= salt_buf3[3]; w0_t = swap32 (t0[0]); w1_t = swap32 (t0[1]); w2_t = swap32 (t0[2]); w3_t = swap32 (t0[3]); w4_t = swap32 (t1[0]); w5_t = swap32 (t1[1]); w6_t = swap32 (t1[2]); w7_t = swap32 (t1[3]); w8_t = swap32 (t2[0]); w9_t = swap32 (t2[1]); wa_t = swap32 (t2[2]); wb_t = swap32 (t2[3]); wc_t = swap32 (t3[0]); wd_t = swap32 (t3[1]); we_t = swap32 (t3[2]); wf_t = swap32 (t3[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); a += SHA1M_A; b += SHA1M_B; c += SHA1M_C; d += SHA1M_D; e += SHA1M_E; t0[0] = c0[0]; t0[1] = c0[1]; t0[2] = c0[2]; t0[3] = c0[3]; t1[0] = c1[0]; t1[1] = c1[1]; t1[2] = c1[2]; t1[3] = c1[3]; t2[0] = c2[0]; t2[1] = c2[1]; t2[2] = c2[2]; t2[3] = c2[3]; t3[0] = c3[0]; t3[1] = c3[1]; t3[2] = c3[2]; t3[3] = c3[3]; } else { switch_buffer_by_offset_le (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; } // final round const u32x r_a = a; const u32x r_b = b; const u32x r_c = c; const u32x r_d = d; const u32x r_e = e; w0_t = swap32 (t0[0]); w1_t = swap32 (t0[1]); w2_t = swap32 (t0[2]); w3_t = swap32 (t0[3]); w4_t = swap32 (t1[0]); w5_t = swap32 (t1[1]); w6_t = swap32 (t1[2]); w7_t = swap32 (t1[3]); w8_t = swap32 (t2[0]); w9_t = swap32 (t2[1]); wa_t = swap32 (t2[2]); wb_t = swap32 (t2[3]); wc_t = swap32 (t3[0]); wd_t = swap32 (t3[1]); we_t = 0; wf_t = (salt_len + 40) * 8; #undef K #define K SHA1C00 SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); #undef K #define K SHA1C01 w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); #undef K #define K SHA1C02 w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); #undef K #define K SHA1C03 wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_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; COMPARE_S_SIMD (d, e, c, b); } } __kernel void m04520_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04520_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04520_a0.cl000066400000000000000000000216171320027462700160100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04520_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx1; sha1_init (&ctx1); sha1_update_swap (&ctx1, tmp.i, tmp.pw_len); sha1_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; const u32 e = ctx1.h[4]; sha1_ctx_t ctx = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx, w0, w1, w2, w3, 40); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04520_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx1; sha1_init (&ctx1); sha1_update_swap (&ctx1, tmp.i, tmp.pw_len); sha1_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; const u32 e = ctx1.h[4]; sha1_ctx_t ctx = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx, w0, w1, w2, w3, 40); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04520_a1-optimized.cl000066400000000000000000002024751320027462700200160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04520_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 | uint_to_hex_lower8 ((a >> 16) & 255) << 16; t0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 | uint_to_hex_lower8 ((a >> 0) & 255) << 16; t0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 | uint_to_hex_lower8 ((b >> 16) & 255) << 16; t0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 | uint_to_hex_lower8 ((b >> 0) & 255) << 16; t1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 | uint_to_hex_lower8 ((c >> 16) & 255) << 16; t1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 | uint_to_hex_lower8 ((c >> 0) & 255) << 16; t1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 | uint_to_hex_lower8 ((d >> 16) & 255) << 16; t1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 | uint_to_hex_lower8 ((d >> 0) & 255) << 16; t2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 | uint_to_hex_lower8 ((e >> 16) & 255) << 16; t2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 | uint_to_hex_lower8 ((e >> 0) & 255) << 16; t2[2] = 0x80; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; a = SHA1M_A; b = SHA1M_B; c = SHA1M_C; d = SHA1M_D; e = SHA1M_E; if (salt_len > 15) { u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_le (t0, t1, t2, t3, c0, c1, c2, c3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] |= salt_buf3[2]; t3[3] |= salt_buf3[3]; w0_t = swap32 (t0[0]); w1_t = swap32 (t0[1]); w2_t = swap32 (t0[2]); w3_t = swap32 (t0[3]); w4_t = swap32 (t1[0]); w5_t = swap32 (t1[1]); w6_t = swap32 (t1[2]); w7_t = swap32 (t1[3]); w8_t = swap32 (t2[0]); w9_t = swap32 (t2[1]); wa_t = swap32 (t2[2]); wb_t = swap32 (t2[3]); wc_t = swap32 (t3[0]); wd_t = swap32 (t3[1]); we_t = swap32 (t3[2]); wf_t = swap32 (t3[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); a += SHA1M_A; b += SHA1M_B; c += SHA1M_C; d += SHA1M_D; e += SHA1M_E; t0[0] = c0[0]; t0[1] = c0[1]; t0[2] = c0[2]; t0[3] = c0[3]; t1[0] = c1[0]; t1[1] = c1[1]; t1[2] = c1[2]; t1[3] = c1[3]; t2[0] = c2[0]; t2[1] = c2[1]; t2[2] = c2[2]; t2[3] = c2[3]; t3[0] = c3[0]; t3[1] = c3[1]; t3[2] = c3[2]; t3[3] = c3[3]; } else { switch_buffer_by_offset_le (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; } // final round const u32x r_a = a; const u32x r_b = b; const u32x r_c = c; const u32x r_d = d; const u32x r_e = e; w0_t = swap32 (t0[0]); w1_t = swap32 (t0[1]); w2_t = swap32 (t0[2]); w3_t = swap32 (t0[3]); w4_t = swap32 (t1[0]); w5_t = swap32 (t1[1]); w6_t = swap32 (t1[2]); w7_t = swap32 (t1[3]); w8_t = swap32 (t2[0]); w9_t = swap32 (t2[1]); wa_t = swap32 (t2[2]); wb_t = swap32 (t2[3]); wc_t = swap32 (t3[0]); wd_t = swap32 (t3[1]); we_t = 0; wf_t = (salt_len + 40) * 8; #undef K #define K SHA1C00 SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); #undef K #define K SHA1C01 w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); #undef K #define K SHA1C02 w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); #undef K #define K SHA1C03 wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_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; COMPARE_M_SIMD (d, e, c, b); } } __kernel void m04520_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04520_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04520_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 | uint_to_hex_lower8 ((a >> 16) & 255) << 16; t0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 | uint_to_hex_lower8 ((a >> 0) & 255) << 16; t0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 | uint_to_hex_lower8 ((b >> 16) & 255) << 16; t0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 | uint_to_hex_lower8 ((b >> 0) & 255) << 16; t1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 | uint_to_hex_lower8 ((c >> 16) & 255) << 16; t1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 | uint_to_hex_lower8 ((c >> 0) & 255) << 16; t1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 | uint_to_hex_lower8 ((d >> 16) & 255) << 16; t1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 | uint_to_hex_lower8 ((d >> 0) & 255) << 16; t2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 | uint_to_hex_lower8 ((e >> 16) & 255) << 16; t2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 | uint_to_hex_lower8 ((e >> 0) & 255) << 16; t2[2] = 0x80; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; a = SHA1M_A; b = SHA1M_B; c = SHA1M_C; d = SHA1M_D; e = SHA1M_E; if (salt_len > 15) { u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_le (t0, t1, t2, t3, c0, c1, c2, c3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] |= salt_buf3[2]; t3[3] |= salt_buf3[3]; w0_t = swap32 (t0[0]); w1_t = swap32 (t0[1]); w2_t = swap32 (t0[2]); w3_t = swap32 (t0[3]); w4_t = swap32 (t1[0]); w5_t = swap32 (t1[1]); w6_t = swap32 (t1[2]); w7_t = swap32 (t1[3]); w8_t = swap32 (t2[0]); w9_t = swap32 (t2[1]); wa_t = swap32 (t2[2]); wb_t = swap32 (t2[3]); wc_t = swap32 (t3[0]); wd_t = swap32 (t3[1]); we_t = swap32 (t3[2]); wf_t = swap32 (t3[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); a += SHA1M_A; b += SHA1M_B; c += SHA1M_C; d += SHA1M_D; e += SHA1M_E; t0[0] = c0[0]; t0[1] = c0[1]; t0[2] = c0[2]; t0[3] = c0[3]; t1[0] = c1[0]; t1[1] = c1[1]; t1[2] = c1[2]; t1[3] = c1[3]; t2[0] = c2[0]; t2[1] = c2[1]; t2[2] = c2[2]; t2[3] = c2[3]; t3[0] = c3[0]; t3[1] = c3[1]; t3[2] = c3[2]; t3[3] = c3[3]; } else { switch_buffer_by_offset_le (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; } // final round const u32x r_a = a; const u32x r_b = b; const u32x r_c = c; const u32x r_d = d; const u32x r_e = e; w0_t = swap32 (t0[0]); w1_t = swap32 (t0[1]); w2_t = swap32 (t0[2]); w3_t = swap32 (t0[3]); w4_t = swap32 (t1[0]); w5_t = swap32 (t1[1]); w6_t = swap32 (t1[2]); w7_t = swap32 (t1[3]); w8_t = swap32 (t2[0]); w9_t = swap32 (t2[1]); wa_t = swap32 (t2[2]); wb_t = swap32 (t2[3]); wc_t = swap32 (t3[0]); wd_t = swap32 (t3[1]); we_t = 0; wf_t = (salt_len + 40) * 8; #undef K #define K SHA1C00 SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); #undef K #define K SHA1C01 w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); #undef K #define K SHA1C02 w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); #undef K #define K SHA1C03 wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_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; COMPARE_S_SIMD (d, e, c, b); } } __kernel void m04520_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04520_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04520_a1.cl000066400000000000000000000215541320027462700160110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04520_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_ctx_t ctx1l; sha1_init (&ctx1l); sha1_update_global_swap (&ctx1l, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1 = ctx1l; sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; const u32 e = ctx1.h[4]; sha1_ctx_t ctx = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx, w0, w1, w2, w3, 40); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04520_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_ctx_t ctx1l; sha1_init (&ctx1l); sha1_update_global_swap (&ctx1l, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1 = ctx1l; sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; const u32 e = ctx1.h[4]; sha1_ctx_t ctx = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx, w0, w1, w2, w3, 40); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04520_a3-optimized.cl000066400000000000000000002155171320027462700200210ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void m04520m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * sha1 */ u32x w0_t = w0lr; 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; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 | uint_to_hex_lower8 ((a >> 16) & 255) << 16; t0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 | uint_to_hex_lower8 ((a >> 0) & 255) << 16; t0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 | uint_to_hex_lower8 ((b >> 16) & 255) << 16; t0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 | uint_to_hex_lower8 ((b >> 0) & 255) << 16; t1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 | uint_to_hex_lower8 ((c >> 16) & 255) << 16; t1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 | uint_to_hex_lower8 ((c >> 0) & 255) << 16; t1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 | uint_to_hex_lower8 ((d >> 16) & 255) << 16; t1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 | uint_to_hex_lower8 ((d >> 0) & 255) << 16; t2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 | uint_to_hex_lower8 ((e >> 16) & 255) << 16; t2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 | uint_to_hex_lower8 ((e >> 0) & 255) << 16; t2[2] = 0x80; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; a = SHA1M_A; b = SHA1M_B; c = SHA1M_C; d = SHA1M_D; e = SHA1M_E; if (salt_len > 15) { u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_le (t0, t1, t2, t3, c0, c1, c2, c3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] |= salt_buf3[2]; t3[3] |= salt_buf3[3]; w0_t = swap32 (t0[0]); w1_t = swap32 (t0[1]); w2_t = swap32 (t0[2]); w3_t = swap32 (t0[3]); w4_t = swap32 (t1[0]); w5_t = swap32 (t1[1]); w6_t = swap32 (t1[2]); w7_t = swap32 (t1[3]); w8_t = swap32 (t2[0]); w9_t = swap32 (t2[1]); wa_t = swap32 (t2[2]); wb_t = swap32 (t2[3]); wc_t = swap32 (t3[0]); wd_t = swap32 (t3[1]); we_t = swap32 (t3[2]); wf_t = swap32 (t3[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); a += SHA1M_A; b += SHA1M_B; c += SHA1M_C; d += SHA1M_D; e += SHA1M_E; t0[0] = c0[0]; t0[1] = c0[1]; t0[2] = c0[2]; t0[3] = c0[3]; t1[0] = c1[0]; t1[1] = c1[1]; t1[2] = c1[2]; t1[3] = c1[3]; t2[0] = c2[0]; t2[1] = c2[1]; t2[2] = c2[2]; t2[3] = c2[3]; t3[0] = c3[0]; t3[1] = c3[1]; t3[2] = c3[2]; t3[3] = c3[3]; } else { switch_buffer_by_offset_le (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; } // final round const u32x r_a = a; const u32x r_b = b; const u32x r_c = c; const u32x r_d = d; const u32x r_e = e; w0_t = swap32 (t0[0]); w1_t = swap32 (t0[1]); w2_t = swap32 (t0[2]); w3_t = swap32 (t0[3]); w4_t = swap32 (t1[0]); w5_t = swap32 (t1[1]); w6_t = swap32 (t1[2]); w7_t = swap32 (t1[3]); w8_t = swap32 (t2[0]); w9_t = swap32 (t2[1]); wa_t = swap32 (t2[2]); wb_t = swap32 (t2[3]); wc_t = swap32 (t3[0]); wd_t = swap32 (t3[1]); we_t = 0; wf_t = (salt_len + 40) * 8; #undef K #define K SHA1C00 SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); #undef K #define K SHA1C01 w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); #undef K #define K SHA1C02 w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); #undef K #define K SHA1C03 wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_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; COMPARE_M_SIMD (d, e, c, b); } } void m04520s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * sha1 */ u32x w0_t = w0lr; 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; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 | uint_to_hex_lower8 ((a >> 16) & 255) << 16; t0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 | uint_to_hex_lower8 ((a >> 0) & 255) << 16; t0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 | uint_to_hex_lower8 ((b >> 16) & 255) << 16; t0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 | uint_to_hex_lower8 ((b >> 0) & 255) << 16; t1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 | uint_to_hex_lower8 ((c >> 16) & 255) << 16; t1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 | uint_to_hex_lower8 ((c >> 0) & 255) << 16; t1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 | uint_to_hex_lower8 ((d >> 16) & 255) << 16; t1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 | uint_to_hex_lower8 ((d >> 0) & 255) << 16; t2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 | uint_to_hex_lower8 ((e >> 16) & 255) << 16; t2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 | uint_to_hex_lower8 ((e >> 0) & 255) << 16; t2[2] = 0x80; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = 0; a = SHA1M_A; b = SHA1M_B; c = SHA1M_C; d = SHA1M_D; e = SHA1M_E; if (salt_len > 15) { u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_le (t0, t1, t2, t3, c0, c1, c2, c3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] |= salt_buf3[2]; t3[3] |= salt_buf3[3]; w0_t = swap32 (t0[0]); w1_t = swap32 (t0[1]); w2_t = swap32 (t0[2]); w3_t = swap32 (t0[3]); w4_t = swap32 (t1[0]); w5_t = swap32 (t1[1]); w6_t = swap32 (t1[2]); w7_t = swap32 (t1[3]); w8_t = swap32 (t2[0]); w9_t = swap32 (t2[1]); wa_t = swap32 (t2[2]); wb_t = swap32 (t2[3]); wc_t = swap32 (t3[0]); wd_t = swap32 (t3[1]); we_t = swap32 (t3[2]); wf_t = swap32 (t3[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); a += SHA1M_A; b += SHA1M_B; c += SHA1M_C; d += SHA1M_D; e += SHA1M_E; t0[0] = c0[0]; t0[1] = c0[1]; t0[2] = c0[2]; t0[3] = c0[3]; t1[0] = c1[0]; t1[1] = c1[1]; t1[2] = c1[2]; t1[3] = c1[3]; t2[0] = c2[0]; t2[1] = c2[1]; t2[2] = c2[2]; t2[3] = c2[3]; t3[0] = c3[0]; t3[1] = c3[1]; t3[2] = c3[2]; t3[3] = c3[3]; } else { switch_buffer_by_offset_le (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; } // final round const u32x r_a = a; const u32x r_b = b; const u32x r_c = c; const u32x r_d = d; const u32x r_e = e; w0_t = swap32 (t0[0]); w1_t = swap32 (t0[1]); w2_t = swap32 (t0[2]); w3_t = swap32 (t0[3]); w4_t = swap32 (t1[0]); w5_t = swap32 (t1[1]); w6_t = swap32 (t1[2]); w7_t = swap32 (t1[3]); w8_t = swap32 (t2[0]); w9_t = swap32 (t2[1]); wa_t = swap32 (t2[2]); wb_t = swap32 (t2[3]); wc_t = swap32 (t3[0]); wd_t = swap32 (t3[1]); we_t = 0; wf_t = (salt_len + 40) * 8; #undef K #define K SHA1C00 SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); #undef K #define K SHA1C01 w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); #undef K #define K SHA1C02 w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); #undef K #define K SHA1C03 wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_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; COMPARE_S_SIMD (d, e, c, b); } } __kernel void m04520_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ m04520m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04520_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ m04520m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04520_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ m04520m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04520_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ m04520s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04520_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ m04520s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04520_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ m04520s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } hashcat-4.0.1/OpenCL/m04520_a3.cl000066400000000000000000000225641320027462700160150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04520_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; sha1_ctx_vector_t ctx1; sha1_init_vector (&ctx1); sha1_update_vector (&ctx1, w, pw_len); sha1_final_vector (&ctx1); const u32x a = ctx1.h[0]; const u32x b = ctx1.h[1]; const u32x c = ctx1.h[2]; const u32x d = ctx1.h[3]; const u32x e = ctx1.h[4]; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_vector_64 (&ctx, w0, w1, w2, w3, 40); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m04520_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; sha1_ctx_vector_t ctx1; sha1_init_vector (&ctx1); sha1_update_vector (&ctx1, w, pw_len); sha1_final_vector (&ctx1); const u32x a = ctx1.h[0]; const u32x b = ctx1.h[1]; const u32x c = ctx1.h[2]; const u32x d = ctx1.h[3]; const u32x e = ctx1.h[4]; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_vector_64 (&ctx, w0, w1, w2, w3, 40); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04700_a0-optimized.cl000066400000000000000000001040721320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04700_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_len * 8; w3[3] = 0; /** * md5 */ u32x a = MD5M_A; u32x b = MD5M_B; u32x c = MD5M_C; u32x d = MD5M_D; u32x e = 0; 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); u32x t; 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 += 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; 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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m04700_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04700_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04700_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_len * 8; w3[3] = 0; /** * md5 */ u32x a = MD5M_A; u32x b = MD5M_B; u32x c = MD5M_C; u32x d = MD5M_D; u32x e = 0; 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); u32x t; 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 += 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; 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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m04700_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04700_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04700_a0.cl000066400000000000000000000176561320027462700160200ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04700_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, tmp.i, tmp.pw_len); md5_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; sha1_ctx_t ctx; sha1_init (&ctx); ctx.w0[0] = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; ctx.len = 32; sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04700_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx0; md5_init (&ctx0); md5_update (&ctx0, tmp.i, tmp.pw_len); md5_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; sha1_ctx_t ctx; sha1_init (&ctx); ctx.w0[0] = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; ctx.len = 32; sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04700_a1-optimized.cl000066400000000000000000001122431320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04700_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = pw_len * 8; w3[3] = 0; /** * md5 */ u32x a = MD5M_A; u32x b = MD5M_B; u32x c = MD5M_C; u32x d = MD5M_D; u32x e = 0; 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); u32x t; 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 += 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; 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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m04700_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04700_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04700_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = pw_len * 8; w3[3] = 0; /** * md5 */ u32x a = MD5M_A; u32x b = MD5M_B; u32x c = MD5M_C; u32x d = MD5M_D; u32x e = 0; 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); u32x t; 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 += 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; 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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m04700_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04700_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04700_a1.cl000066400000000000000000000175651320027462700160200ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04700_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; sha1_ctx_t ctx; sha1_init (&ctx); ctx.w0[0] = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; ctx.len = 32; sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04700_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; sha1_ctx_t ctx; sha1_init (&ctx); ctx.w0[0] = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; ctx.len = 32; sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04700_a3-optimized.cl000066400000000000000000001265651320027462700200250ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void m04700m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t = w0lr; 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 */ u32x a = MD5M_A; u32x b = MD5M_B; u32x c = MD5M_C; u32x d = MD5M_D; u32x e = 0; 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); u32x t; 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); a += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; /* * sha1 */ w0_t = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; w1_t = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; w2_t = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; w3_t = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; w4_t = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; w5_t = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; w6_t = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; w7_t = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; w8_t = 0x80000000; w9_t = 0; wa_t = 0; wb_t = 0; wc_t = 0; wd_t = 0; we_t = 0; wf_t = 32 * 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); COMPARE_M_SIMD (d, e, c, b); } } void m04700s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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_S (search[1], 2u); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t = w0lr; 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 */ u32x a = MD5M_A; u32x b = MD5M_B; u32x c = MD5M_C; u32x d = MD5M_D; u32x e = 0; 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); u32x t; 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); a += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; /* * sha1 */ w0_t = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; w1_t = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; w2_t = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; w3_t = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; w4_t = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; w5_t = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; w6_t = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; w7_t = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; w8_t = 0x80000000; w9_t = 0; wa_t = 0; wb_t = 0; wc_t = 0; wd_t = 0; we_t = 0; wf_t = 32 * 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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m04700_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04700_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04700_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04700_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04700_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m04700_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } hashcat-4.0.1/OpenCL/m04700_a3.cl000066400000000000000000000204671320027462700160150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04700_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx0; md5_init_vector (&ctx0); md5_update_vector (&ctx0, w, pw_len); md5_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); ctx.w0[0] = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; ctx.len = 32; sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m04700_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx0; md5_init_vector (&ctx0); md5_update_vector (&ctx0, w, pw_len); md5_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); ctx.w0[0] = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; ctx.len = 32; sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04800_a0-optimized.cl000066400000000000000000000447061320027462700200170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m04800_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); const u32x salt_out_len = salt_len + out_len; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf[0]; s0[1] = salt_buf[1]; s0[2] = salt_buf[2]; s0[3] = salt_buf[3]; s1[0] = 0x80; s1[1] = 0; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (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] |= s3[2]; w3[3] |= s3[3]; /** * add id byte */ switch_buffer_by_offset_le (w0, w1, w2, w3, 1); w0[0] |= salt_buf[4]; w3[2] = salt_out_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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m04800_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04800_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04800_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); const u32x salt_out_len = salt_len + out_len; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf[0]; s0[1] = salt_buf[1]; s0[2] = salt_buf[2]; s0[3] = salt_buf[3]; s1[0] = 0x80; s1[1] = 0; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (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] |= s3[2]; w3[3] |= s3[3]; /** * add id byte */ switch_buffer_by_offset_le (w0, w1, w2, w3, 1); w0[0] |= salt_buf[4]; w3[2] = salt_out_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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m04800_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04800_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04800_a0.cl000066400000000000000000000112231320027462700160010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m04800_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len - 1; u32 s[16] = { 0 }; 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]; md5_ctx_t ctx0; md5_init (&ctx0); ctx0.w0[0] = salt_bufs[salt_pos].salt_buf[4]; ctx0.len = 1; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx = ctx0; md5_update (&ctx, tmp.i, tmp.pw_len); md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04800_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len - 1; u32 s[16] = { 0 }; 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]; md5_ctx_t ctx0; md5_init (&ctx0); ctx0.w0[0] = salt_bufs[salt_pos].salt_buf[4]; ctx0.len = 1; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx = ctx0; md5_update (&ctx, tmp.i, tmp.pw_len); md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04800_a1-optimized.cl000066400000000000000000000552201320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m04800_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; const u32x pw_salt_len = pw_len + salt_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf[0]; s0[1] = salt_buf[1]; s0[2] = salt_buf[2]; s0[3] = salt_buf[3]; s1[0] = 0x80; s1[1] = 0; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_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]; /* * add id byte */ switch_buffer_by_offset_le (w0, w1, w2, w3, 1); w0[0] |= salt_buf[4]; 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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m04800_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04800_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04800_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; const u32x pw_salt_len = pw_len + salt_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf[0]; s0[1] = salt_buf[1]; s0[2] = salt_buf[2]; s0[3] = salt_buf[3]; s1[0] = 0x80; s1[1] = 0; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_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]; /* * add id byte */ switch_buffer_by_offset_le (w0, w1, w2, w3, 1); w0[0] |= salt_buf[4]; 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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m04800_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04800_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04800_a1.cl000066400000000000000000000110521320027462700160020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m04800_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len - 1; u32 s[16] = { 0 }; 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]; md5_ctx_t ctx0; md5_init (&ctx0); ctx0.w0[0] = salt_bufs[salt_pos].salt_buf[4]; ctx0.len = 1; md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04800_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len - 1; u32 s[16] = { 0 }; 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]; md5_ctx_t ctx0; md5_init (&ctx0); ctx0.w0[0] = salt_bufs[salt_pos].salt_buf[4]; ctx0.len = 1; md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_update (&ctx, s, salt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04800_a3-optimized.cl000066400000000000000000000644611320027462700200220ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m04800m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf[0]; s0[1] = salt_buf[1]; s0[2] = salt_buf[2]; s0[3] = salt_buf[3]; s1[0] = 0x80; s1[1] = 0; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_S (s0, s1, s2, s3, pw_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]; switch_buffer_by_offset_le_S (w0, w1, w2, w3, 1); w0[0] |= salt_buf[4]; const u32 w0l = w0[0]; const u32 w1l = w0[1]; w3[2] = pw_salt_len * 8; w3[3] = 0; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t = w0l | (w0r << 8); u32x w1_t = w1l | (w0r >> 24); 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 */ 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, 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); u32x t; 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); COMPARE_M_SIMD (a, d, c, b); } } void m04800s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf[0]; s0[1] = salt_buf[1]; s0[2] = salt_buf[2]; s0[3] = salt_buf[3]; s1[0] = 0x80; s1[1] = 0; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_S (s0, s1, s2, s3, pw_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]; switch_buffer_by_offset_le_S (w0, w1, w2, w3, 1); w0[0] |= salt_buf[4]; const u32 w0l = w0[0]; const u32 w1l = w0[1]; w3[2] = pw_salt_len * 8; w3[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t = w0l | (w0r << 8); u32x w1_t = w1l | (w0r >> 24); 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 */ 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, 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); u32x t; 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); if (MATCHES_NONE_VS (a, search[0])) continue; 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m04800_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m04800_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m04800_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m04800_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m04800_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m04800_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m04800_a3.cl000066400000000000000000000120761320027462700160130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __kernel void m04800_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len - 1; u32x s[16] = { 0 }; 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]; md5_ctx_t ctx0; md5_init (&ctx0); ctx0.w0[0] = salt_bufs[salt_pos].salt_buf[4]; ctx0.len = 1; /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector_from_scalar (&ctx, &ctx0); md5_update_vector (&ctx, w, pw_len); md5_update_vector (&ctx, s, salt_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m04800_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len - 1; u32x s[16] = { 0 }; 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]; md5_ctx_t ctx0; md5_init (&ctx0); ctx0.w0[0] = salt_bufs[salt_pos].salt_buf[4]; ctx0.len = 1; /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector_from_scalar (&ctx, &ctx0); md5_update_vector (&ctx, w, pw_len); md5_update_vector (&ctx, s, salt_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04900_a0-optimized.cl000066400000000000000000000706651320027462700200230ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m04900_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * prepend salt */ const u32x out_salt_len = out_len + salt_len; switch_buffer_by_offset_le_VV (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]; 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]; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_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]; const u32x salt_out_salt_len = salt_len + out_len + salt_len; append_0x80_4x4_VV (w0, w1, w2, w3, salt_out_salt_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); u32x we_t = 0; u32x wf_t = salt_out_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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m04900_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04900_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04900_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * reverse */ const u32 e_rev = rotl32_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * prepend salt */ const u32x out_salt_len = out_len + salt_len; switch_buffer_by_offset_le_VV (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]; 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]; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_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]; const u32x salt_out_salt_len = salt_len + out_len + salt_len; append_0x80_4x4_VV (w0, w1, w2, w3, salt_out_salt_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); u32x we_t = 0; u32x wf_t = salt_out_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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m04900_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04900_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04900_a0.cl000066400000000000000000000110241320027462700160010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m04900_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx = ctx0; sha1_update_swap (&ctx, tmp.i, tmp.pw_len); sha1_update (&ctx, s, salt_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04900_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update (&ctx0, s, salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx = ctx0; sha1_update_swap (&ctx, tmp.i, tmp.pw_len); sha1_update (&ctx, s, salt_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04900_a1-optimized.cl000066400000000000000000000773601320027462700200230ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m04900_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len + 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]; 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]; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_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]; const u32x salt_pw_salt_len = salt_len + pw_len + salt_len; append_0x80_4x4_VV (w0, w1, w2, w3, salt_pw_salt_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); u32x we_t = 0; u32x wf_t = salt_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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m04900_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04900_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04900_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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] }; /** * reverse */ const u32 e_rev = rotl32_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); const u32x pw_salt_len = pw_len + 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]; 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]; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = salt_buf2[0]; s2[1] = salt_buf2[1]; s2[2] = salt_buf2[2]; s2[3] = salt_buf2[3]; s3[0] = salt_buf3[0]; s3[1] = salt_buf3[1]; s3[2] = salt_buf3[2]; s3[3] = salt_buf3[3]; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_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]; const u32x salt_pw_salt_len = salt_len + pw_len + salt_len; append_0x80_4x4_VV (w0, w1, w2, w3, salt_pw_salt_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); u32x we_t = 0; u32x wf_t = salt_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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m04900_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m04900_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m04900_a1.cl000066400000000000000000000106671320027462700160160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m04900_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update (&ctx0, s, salt_len); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_update (&ctx, s, salt_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m04900_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update (&ctx0, s, salt_len); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_update (&ctx, s, salt_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m04900_a3-optimized.cl000066400000000000000000001140761320027462700200210ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m04900m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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]; u32 salt_buf0_t[4]; u32 salt_buf1_t[4]; u32 salt_buf2_t[4]; u32 salt_buf3_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]; 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]; salt_buf2_t[0] = salt_bufs[salt_pos].salt_buf[ 8]; salt_buf2_t[1] = salt_bufs[salt_pos].salt_buf[ 9]; salt_buf2_t[2] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2_t[3] = salt_bufs[salt_pos].salt_buf[11]; salt_buf3_t[0] = salt_bufs[salt_pos].salt_buf[12]; salt_buf3_t[1] = salt_bufs[salt_pos].salt_buf[13]; salt_buf3_t[2] = salt_bufs[salt_pos].salt_buf[14]; salt_buf3_t[3] = salt_bufs[salt_pos].salt_buf[15]; const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 pw_salt_len = pw_len + salt_len; const u32 salt_pw_salt_len = salt_len + pw_len + salt_len; switch_buffer_by_offset_le_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, pw_salt_len); 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_4x4_S (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_pw_salt_len); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; /** * put the password after the first salt but before the second salt */ switch_buffer_by_offset_le (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] |= salt_buf3[2]; /** * sha1 */ u32x w0_t = swap32 (t0[0]); u32x w1_t = swap32 (t0[1]); u32x w2_t = swap32 (t0[2]); u32x w3_t = swap32 (t0[3]); u32x w4_t = swap32 (t1[0]); u32x w5_t = swap32 (t1[1]); u32x w6_t = swap32 (t1[2]); u32x w7_t = swap32 (t1[3]); u32x w8_t = swap32 (t2[0]); u32x w9_t = swap32 (t2[1]); u32x wa_t = swap32 (t2[2]); u32x wb_t = swap32 (t2[3]); u32x wc_t = swap32 (t3[0]); u32x wd_t = swap32 (t3[1]); u32x we_t = 0; u32x wf_t = salt_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); COMPARE_M_SIMD (d, e, c, b); } } void m04900s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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]; u32 salt_buf0_t[4]; u32 salt_buf1_t[4]; u32 salt_buf2_t[4]; u32 salt_buf3_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]; 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]; salt_buf2_t[0] = salt_bufs[salt_pos].salt_buf[ 8]; salt_buf2_t[1] = salt_bufs[salt_pos].salt_buf[ 9]; salt_buf2_t[2] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2_t[3] = salt_bufs[salt_pos].salt_buf[11]; salt_buf3_t[0] = salt_bufs[salt_pos].salt_buf[12]; salt_buf3_t[1] = salt_bufs[salt_pos].salt_buf[13]; salt_buf3_t[2] = salt_bufs[salt_pos].salt_buf[14]; salt_buf3_t[3] = salt_bufs[salt_pos].salt_buf[15]; const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 pw_salt_len = pw_len + salt_len; const u32 salt_pw_salt_len = salt_len + pw_len + salt_len; switch_buffer_by_offset_le_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, pw_salt_len); 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_4x4_S (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_pw_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_S (search[1], 2u); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = w3[2]; t3[3] = w3[3]; /** * put the password after the first salt but before the second salt */ switch_buffer_by_offset_le (t0, t1, t2, t3, salt_len); t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] |= salt_buf3[2]; /** * sha1 */ u32x w0_t = swap32 (t0[0]); u32x w1_t = swap32 (t0[1]); u32x w2_t = swap32 (t0[2]); u32x w3_t = swap32 (t0[3]); u32x w4_t = swap32 (t1[0]); u32x w5_t = swap32 (t1[1]); u32x w6_t = swap32 (t1[2]); u32x w7_t = swap32 (t1[3]); u32x w8_t = swap32 (t2[0]); u32x w9_t = swap32 (t2[1]); u32x wa_t = swap32 (t2[2]); u32x wb_t = swap32 (t2[3]); u32x wc_t = swap32 (t3[0]); u32x wd_t = swap32 (t3[1]); u32x we_t = 0; u32x wf_t = salt_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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m04900_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m04900_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m04900_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m04900_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m04900_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m04900_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m04900_a3.cl000066400000000000000000000120631320027462700160100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m04900_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32 (salt_bufs[salt_pos].salt_buf[idx]); } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); sha1_update_vector_swap (&ctx, w, pw_len); sha1_update_vector (&ctx, s, salt_len); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m04900_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32 (salt_bufs[salt_pos].salt_buf[idx]); } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); sha1_update_vector_swap (&ctx, w, pw_len); sha1_update_vector (&ctx, s, salt_len); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m05000_a0-optimized.cl000066400000000000000000000427451320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __constant u64a 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 }; #ifndef KECCAK_ROUNDS #define KECCAK_ROUNDS 24 #endif __kernel void m05000_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x01_2x4_VV (w0, w1, out_len); /** * Keccak */ u64x a00 = hl32_to_64 (w0[1], w0[0]); u64x a01 = hl32_to_64 (w0[3], w0[2]); u64x a02 = hl32_to_64 (w1[1], w1[0]); u64x a03 = hl32_to_64 (w1[3], w1[2]); u64x a04 = 0; u64x a10 = 0; u64x a11 = 0; u64x a12 = 0; u64x a13 = 0; u64x a14 = 0; u64x a20 = 0; u64x a21 = 0; u64x a22 = 0; u64x a23 = 0; u64x a24 = 0; u64x a30 = 0; u64x a31 = 0x8000000000000000; u64x a32 = 0; u64x a33 = 0; u64x a34 = 0; u64x a40 = 0; u64x a41 = 0; u64x a42 = 0; u64x a43 = 0; u64x a44 = 0; #define Rho_Pi(ad,r) \ bc0 = ad; \ ad = rotl64 (t, r); \ t = bc0; \ #ifdef _unroll #pragma unroll #endif for (int round = 0; round < KECCAK_ROUNDS - 1; round++) { // Theta u64x bc0 = a00 ^ a10 ^ a20 ^ a30 ^ a40; u64x bc1 = a01 ^ a11 ^ a21 ^ a31 ^ a41; u64x bc2 = a02 ^ a12 ^ a22 ^ a32 ^ a42; u64x bc3 = a03 ^ a13 ^ a23 ^ a33 ^ a43; u64x bc4 = a04 ^ a14 ^ a24 ^ a34 ^ a44; u64x t; t = bc4 ^ rotl64 (bc1, 1); a00 ^= t; a10 ^= t; a20 ^= t; a30 ^= t; a40 ^= t; t = bc0 ^ rotl64 (bc2, 1); a01 ^= t; a11 ^= t; a21 ^= t; a31 ^= t; a41 ^= t; t = bc1 ^ rotl64 (bc3, 1); a02 ^= t; a12 ^= t; a22 ^= t; a32 ^= t; a42 ^= t; t = bc2 ^ rotl64 (bc4, 1); a03 ^= t; a13 ^= t; a23 ^= t; a33 ^= t; a43 ^= t; t = bc3 ^ rotl64 (bc0, 1); a04 ^= t; a14 ^= t; a24 ^= t; a34 ^= t; a44 ^= t; // Rho Pi t = a01; Rho_Pi (a20, 1); Rho_Pi (a12, 3); Rho_Pi (a21, 6); Rho_Pi (a32, 10); Rho_Pi (a33, 15); Rho_Pi (a03, 21); Rho_Pi (a10, 28); Rho_Pi (a31, 36); Rho_Pi (a13, 45); Rho_Pi (a41, 55); Rho_Pi (a44, 2); Rho_Pi (a04, 14); Rho_Pi (a30, 27); Rho_Pi (a43, 41); Rho_Pi (a34, 56); Rho_Pi (a23, 8); Rho_Pi (a22, 25); Rho_Pi (a02, 43); Rho_Pi (a40, 62); Rho_Pi (a24, 18); Rho_Pi (a42, 39); Rho_Pi (a14, 61); Rho_Pi (a11, 20); Rho_Pi (a01, 44); // Chi bc0 = a00; bc1 = a01; bc2 = a02; bc3 = a03; bc4 = a04; a00 ^= ~bc1 & bc2; a01 ^= ~bc2 & bc3; a02 ^= ~bc3 & bc4; a03 ^= ~bc4 & bc0; a04 ^= ~bc0 & bc1; bc0 = a10; bc1 = a11; bc2 = a12; bc3 = a13; bc4 = a14; a10 ^= ~bc1 & bc2; a11 ^= ~bc2 & bc3; a12 ^= ~bc3 & bc4; a13 ^= ~bc4 & bc0; a14 ^= ~bc0 & bc1; bc0 = a20; bc1 = a21; bc2 = a22; bc3 = a23; bc4 = a24; a20 ^= ~bc1 & bc2; a21 ^= ~bc2 & bc3; a22 ^= ~bc3 & bc4; a23 ^= ~bc4 & bc0; a24 ^= ~bc0 & bc1; bc0 = a30; bc1 = a31; bc2 = a32; bc3 = a33; bc4 = a34; a30 ^= ~bc1 & bc2; a31 ^= ~bc2 & bc3; a32 ^= ~bc3 & bc4; a33 ^= ~bc4 & bc0; a34 ^= ~bc0 & bc1; bc0 = a40; bc1 = a41; bc2 = a42; bc3 = a43; bc4 = a44; a40 ^= ~bc1 & bc2; a41 ^= ~bc2 & bc3; a42 ^= ~bc3 & bc4; a43 ^= ~bc4 & bc0; a44 ^= ~bc0 & bc1; // Iota a00 ^= keccakf_rndc[round]; } // Theta u64x bc0 = a00 ^ a10 ^ a20 ^ a30 ^ a40; u64x bc1 = a01 ^ a11 ^ a21 ^ a31 ^ a41; u64x bc2 = a02 ^ a12 ^ a22 ^ a32 ^ a42; u64x bc3 = a03 ^ a13 ^ a23 ^ a33 ^ a43; u64x bc4 = a04 ^ a14 ^ a24 ^ a34 ^ a44; u64x t; t = bc4 ^ rotl64 (bc1, 1); a00 ^= t; a10 ^= t; a20 ^= t; a30 ^= t; t = bc0 ^ rotl64 (bc2, 1); a21 ^= t; a31 ^= t; a41 ^= t; t = bc1 ^ rotl64 (bc3, 1); a02 ^= t; a12 ^= t; a22 ^= t; a32 ^= t; t = bc2 ^ rotl64 (bc4, 1); a03 ^= t; a13 ^= t; a23 ^= t; a33 ^= t; a43 ^= t; t = bc3 ^ rotl64 (bc0, 1); a04 ^= t; a34 ^= t; a44 ^= t; // Rho Pi t = a01; Rho_Pi (a20, 1); Rho_Pi (a12, 3); Rho_Pi (a21, 6); Rho_Pi (a32, 10); Rho_Pi (a33, 15); Rho_Pi (a03, 21); Rho_Pi (a10, 28); Rho_Pi (a31, 36); Rho_Pi (a13, 45); Rho_Pi (a41, 55); Rho_Pi (a44, 2); Rho_Pi (a04, 14); Rho_Pi (a30, 27); Rho_Pi (a43, 41); Rho_Pi (a34, 56); Rho_Pi (a23, 8); Rho_Pi (a22, 25); Rho_Pi (a02, 43); #undef Rho_Pi bc0 = a00; bc2 = a02; bc3 = a03; bc4 = a04; a02 ^= ~bc3 & bc4; a03 ^= ~bc4 & bc0; const u32x r0 = l32_from_64 (a03); const u32x r1 = h32_from_64 (a03); const u32x r2 = l32_from_64 (a02); const u32x r3 = h32_from_64 (a02); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m05000_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05000_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05000_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x01_2x4_VV (w0, w1, out_len); /** * Keccak */ u64x a00 = hl32_to_64 (w0[1], w0[0]); u64x a01 = hl32_to_64 (w0[3], w0[2]); u64x a02 = hl32_to_64 (w1[1], w1[0]); u64x a03 = hl32_to_64 (w1[3], w1[2]); u64x a04 = 0; u64x a10 = 0; u64x a11 = 0; u64x a12 = 0; u64x a13 = 0; u64x a14 = 0; u64x a20 = 0; u64x a21 = 0; u64x a22 = 0; u64x a23 = 0; u64x a24 = 0; u64x a30 = 0; u64x a31 = 0x8000000000000000; u64x a32 = 0; u64x a33 = 0; u64x a34 = 0; u64x a40 = 0; u64x a41 = 0; u64x a42 = 0; u64x a43 = 0; u64x a44 = 0; #define Rho_Pi(ad,r) \ bc0 = ad; \ ad = rotl64 (t, r); \ t = bc0; \ #ifdef _unroll #pragma unroll #endif for (int round = 0; round < KECCAK_ROUNDS - 1; round++) { // Theta u64x bc0 = a00 ^ a10 ^ a20 ^ a30 ^ a40; u64x bc1 = a01 ^ a11 ^ a21 ^ a31 ^ a41; u64x bc2 = a02 ^ a12 ^ a22 ^ a32 ^ a42; u64x bc3 = a03 ^ a13 ^ a23 ^ a33 ^ a43; u64x bc4 = a04 ^ a14 ^ a24 ^ a34 ^ a44; u64x t; t = bc4 ^ rotl64 (bc1, 1); a00 ^= t; a10 ^= t; a20 ^= t; a30 ^= t; a40 ^= t; t = bc0 ^ rotl64 (bc2, 1); a01 ^= t; a11 ^= t; a21 ^= t; a31 ^= t; a41 ^= t; t = bc1 ^ rotl64 (bc3, 1); a02 ^= t; a12 ^= t; a22 ^= t; a32 ^= t; a42 ^= t; t = bc2 ^ rotl64 (bc4, 1); a03 ^= t; a13 ^= t; a23 ^= t; a33 ^= t; a43 ^= t; t = bc3 ^ rotl64 (bc0, 1); a04 ^= t; a14 ^= t; a24 ^= t; a34 ^= t; a44 ^= t; // Rho Pi t = a01; Rho_Pi (a20, 1); Rho_Pi (a12, 3); Rho_Pi (a21, 6); Rho_Pi (a32, 10); Rho_Pi (a33, 15); Rho_Pi (a03, 21); Rho_Pi (a10, 28); Rho_Pi (a31, 36); Rho_Pi (a13, 45); Rho_Pi (a41, 55); Rho_Pi (a44, 2); Rho_Pi (a04, 14); Rho_Pi (a30, 27); Rho_Pi (a43, 41); Rho_Pi (a34, 56); Rho_Pi (a23, 8); Rho_Pi (a22, 25); Rho_Pi (a02, 43); Rho_Pi (a40, 62); Rho_Pi (a24, 18); Rho_Pi (a42, 39); Rho_Pi (a14, 61); Rho_Pi (a11, 20); Rho_Pi (a01, 44); // Chi bc0 = a00; bc1 = a01; bc2 = a02; bc3 = a03; bc4 = a04; a00 ^= ~bc1 & bc2; a01 ^= ~bc2 & bc3; a02 ^= ~bc3 & bc4; a03 ^= ~bc4 & bc0; a04 ^= ~bc0 & bc1; bc0 = a10; bc1 = a11; bc2 = a12; bc3 = a13; bc4 = a14; a10 ^= ~bc1 & bc2; a11 ^= ~bc2 & bc3; a12 ^= ~bc3 & bc4; a13 ^= ~bc4 & bc0; a14 ^= ~bc0 & bc1; bc0 = a20; bc1 = a21; bc2 = a22; bc3 = a23; bc4 = a24; a20 ^= ~bc1 & bc2; a21 ^= ~bc2 & bc3; a22 ^= ~bc3 & bc4; a23 ^= ~bc4 & bc0; a24 ^= ~bc0 & bc1; bc0 = a30; bc1 = a31; bc2 = a32; bc3 = a33; bc4 = a34; a30 ^= ~bc1 & bc2; a31 ^= ~bc2 & bc3; a32 ^= ~bc3 & bc4; a33 ^= ~bc4 & bc0; a34 ^= ~bc0 & bc1; bc0 = a40; bc1 = a41; bc2 = a42; bc3 = a43; bc4 = a44; a40 ^= ~bc1 & bc2; a41 ^= ~bc2 & bc3; a42 ^= ~bc3 & bc4; a43 ^= ~bc4 & bc0; a44 ^= ~bc0 & bc1; // Iota a00 ^= keccakf_rndc[round]; } // Theta u64x bc0 = a00 ^ a10 ^ a20 ^ a30 ^ a40; u64x bc1 = a01 ^ a11 ^ a21 ^ a31 ^ a41; u64x bc2 = a02 ^ a12 ^ a22 ^ a32 ^ a42; u64x bc3 = a03 ^ a13 ^ a23 ^ a33 ^ a43; u64x bc4 = a04 ^ a14 ^ a24 ^ a34 ^ a44; u64x t; t = bc4 ^ rotl64 (bc1, 1); a00 ^= t; a10 ^= t; a20 ^= t; a30 ^= t; t = bc0 ^ rotl64 (bc2, 1); a21 ^= t; a31 ^= t; a41 ^= t; t = bc1 ^ rotl64 (bc3, 1); a02 ^= t; a12 ^= t; a22 ^= t; a32 ^= t; t = bc2 ^ rotl64 (bc4, 1); a03 ^= t; a13 ^= t; a23 ^= t; a33 ^= t; a43 ^= t; t = bc3 ^ rotl64 (bc0, 1); a04 ^= t; a34 ^= t; a44 ^= t; // Rho Pi t = a01; Rho_Pi (a20, 1); Rho_Pi (a12, 3); Rho_Pi (a21, 6); Rho_Pi (a32, 10); Rho_Pi (a33, 15); Rho_Pi (a03, 21); Rho_Pi (a10, 28); Rho_Pi (a31, 36); Rho_Pi (a13, 45); Rho_Pi (a41, 55); Rho_Pi (a44, 2); Rho_Pi (a04, 14); Rho_Pi (a30, 27); Rho_Pi (a43, 41); Rho_Pi (a34, 56); Rho_Pi (a23, 8); Rho_Pi (a22, 25); Rho_Pi (a02, 43); #undef Rho_Pi bc0 = a00; bc2 = a02; bc3 = a03; bc4 = a04; a02 ^= ~bc3 & bc4; a03 ^= ~bc4 & bc0; const u32x r0 = l32_from_64 (a03); const u32x r1 = h32_from_64 (a03); const u32x r2 = l32_from_64 (a02); const u32x r3 = h32_from_64 (a02); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m05000_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05000_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m05000_a1-optimized.cl000066400000000000000000000516371320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u64a 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 }; #ifndef KECCAK_ROUNDS #define KECCAK_ROUNDS 24 #endif __kernel void m05000_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * Keccak */ u64x a00 = hl32_to_64 (w0[1], w0[0]); u64x a01 = hl32_to_64 (w0[3], w0[2]); u64x a02 = hl32_to_64 (w1[1], w1[0]); u64x a03 = hl32_to_64 (w1[3], w1[2]); u64x a04 = hl32_to_64 (w2[1], w2[0]); u64x a10 = hl32_to_64 (w2[3], w2[2]); u64x a11 = hl32_to_64 (w3[1], w3[0]); u64x a12 = hl32_to_64 (w3[3], w3[2]); u64x a13 = 0; u64x a14 = 0; u64x a20 = 0; u64x a21 = 0; u64x a22 = 0; u64x a23 = 0; u64x a24 = 0; u64x a30 = 0; u64x a31 = 0x8000000000000000; u64x a32 = 0; u64x a33 = 0; u64x a34 = 0; u64x a40 = 0; u64x a41 = 0; u64x a42 = 0; u64x a43 = 0; u64x a44 = 0; #define Rho_Pi(ad,r) \ bc0 = ad; \ ad = rotl64 (t, r); \ t = bc0; \ #ifdef _unroll #pragma unroll #endif for (int round = 0; round < KECCAK_ROUNDS - 1; round++) { // Theta u64x bc0 = a00 ^ a10 ^ a20 ^ a30 ^ a40; u64x bc1 = a01 ^ a11 ^ a21 ^ a31 ^ a41; u64x bc2 = a02 ^ a12 ^ a22 ^ a32 ^ a42; u64x bc3 = a03 ^ a13 ^ a23 ^ a33 ^ a43; u64x bc4 = a04 ^ a14 ^ a24 ^ a34 ^ a44; u64x t; t = bc4 ^ rotl64 (bc1, 1); a00 ^= t; a10 ^= t; a20 ^= t; a30 ^= t; a40 ^= t; t = bc0 ^ rotl64 (bc2, 1); a01 ^= t; a11 ^= t; a21 ^= t; a31 ^= t; a41 ^= t; t = bc1 ^ rotl64 (bc3, 1); a02 ^= t; a12 ^= t; a22 ^= t; a32 ^= t; a42 ^= t; t = bc2 ^ rotl64 (bc4, 1); a03 ^= t; a13 ^= t; a23 ^= t; a33 ^= t; a43 ^= t; t = bc3 ^ rotl64 (bc0, 1); a04 ^= t; a14 ^= t; a24 ^= t; a34 ^= t; a44 ^= t; // Rho Pi t = a01; Rho_Pi (a20, 1); Rho_Pi (a12, 3); Rho_Pi (a21, 6); Rho_Pi (a32, 10); Rho_Pi (a33, 15); Rho_Pi (a03, 21); Rho_Pi (a10, 28); Rho_Pi (a31, 36); Rho_Pi (a13, 45); Rho_Pi (a41, 55); Rho_Pi (a44, 2); Rho_Pi (a04, 14); Rho_Pi (a30, 27); Rho_Pi (a43, 41); Rho_Pi (a34, 56); Rho_Pi (a23, 8); Rho_Pi (a22, 25); Rho_Pi (a02, 43); Rho_Pi (a40, 62); Rho_Pi (a24, 18); Rho_Pi (a42, 39); Rho_Pi (a14, 61); Rho_Pi (a11, 20); Rho_Pi (a01, 44); // Chi bc0 = a00; bc1 = a01; bc2 = a02; bc3 = a03; bc4 = a04; a00 ^= ~bc1 & bc2; a01 ^= ~bc2 & bc3; a02 ^= ~bc3 & bc4; a03 ^= ~bc4 & bc0; a04 ^= ~bc0 & bc1; bc0 = a10; bc1 = a11; bc2 = a12; bc3 = a13; bc4 = a14; a10 ^= ~bc1 & bc2; a11 ^= ~bc2 & bc3; a12 ^= ~bc3 & bc4; a13 ^= ~bc4 & bc0; a14 ^= ~bc0 & bc1; bc0 = a20; bc1 = a21; bc2 = a22; bc3 = a23; bc4 = a24; a20 ^= ~bc1 & bc2; a21 ^= ~bc2 & bc3; a22 ^= ~bc3 & bc4; a23 ^= ~bc4 & bc0; a24 ^= ~bc0 & bc1; bc0 = a30; bc1 = a31; bc2 = a32; bc3 = a33; bc4 = a34; a30 ^= ~bc1 & bc2; a31 ^= ~bc2 & bc3; a32 ^= ~bc3 & bc4; a33 ^= ~bc4 & bc0; a34 ^= ~bc0 & bc1; bc0 = a40; bc1 = a41; bc2 = a42; bc3 = a43; bc4 = a44; a40 ^= ~bc1 & bc2; a41 ^= ~bc2 & bc3; a42 ^= ~bc3 & bc4; a43 ^= ~bc4 & bc0; a44 ^= ~bc0 & bc1; // Iota a00 ^= keccakf_rndc[round]; } // Theta u64x bc0 = a00 ^ a10 ^ a20 ^ a30 ^ a40; u64x bc1 = a01 ^ a11 ^ a21 ^ a31 ^ a41; u64x bc2 = a02 ^ a12 ^ a22 ^ a32 ^ a42; u64x bc3 = a03 ^ a13 ^ a23 ^ a33 ^ a43; u64x bc4 = a04 ^ a14 ^ a24 ^ a34 ^ a44; u64x t; t = bc4 ^ rotl64 (bc1, 1); a00 ^= t; a10 ^= t; a20 ^= t; a30 ^= t; t = bc0 ^ rotl64 (bc2, 1); a21 ^= t; a31 ^= t; a41 ^= t; t = bc1 ^ rotl64 (bc3, 1); a02 ^= t; a12 ^= t; a22 ^= t; a32 ^= t; t = bc2 ^ rotl64 (bc4, 1); a03 ^= t; a13 ^= t; a23 ^= t; a33 ^= t; a43 ^= t; t = bc3 ^ rotl64 (bc0, 1); a04 ^= t; a34 ^= t; a44 ^= t; // Rho Pi t = a01; Rho_Pi (a20, 1); Rho_Pi (a12, 3); Rho_Pi (a21, 6); Rho_Pi (a32, 10); Rho_Pi (a33, 15); Rho_Pi (a03, 21); Rho_Pi (a10, 28); Rho_Pi (a31, 36); Rho_Pi (a13, 45); Rho_Pi (a41, 55); Rho_Pi (a44, 2); Rho_Pi (a04, 14); Rho_Pi (a30, 27); Rho_Pi (a43, 41); Rho_Pi (a34, 56); Rho_Pi (a23, 8); Rho_Pi (a22, 25); Rho_Pi (a02, 43); #undef Rho_Pi bc0 = a00; bc2 = a02; bc3 = a03; bc4 = a04; a02 ^= ~bc3 & bc4; a03 ^= ~bc4 & bc0; const u32x r0 = l32_from_64 (a03); const u32x r1 = h32_from_64 (a03); const u32x r2 = l32_from_64 (a02); const u32x r3 = h32_from_64 (a02); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m05000_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05000_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05000_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * Keccak */ u64x a00 = hl32_to_64 (w0[1], w0[0]); u64x a01 = hl32_to_64 (w0[3], w0[2]); u64x a02 = hl32_to_64 (w1[1], w1[0]); u64x a03 = hl32_to_64 (w1[3], w1[2]); u64x a04 = hl32_to_64 (w2[1], w2[0]); u64x a10 = hl32_to_64 (w2[3], w2[2]); u64x a11 = hl32_to_64 (w3[1], w3[0]); u64x a12 = hl32_to_64 (w3[3], w3[2]); u64x a13 = 0; u64x a14 = 0; u64x a20 = 0; u64x a21 = 0; u64x a22 = 0; u64x a23 = 0; u64x a24 = 0; u64x a30 = 0; u64x a31 = 0x8000000000000000; u64x a32 = 0; u64x a33 = 0; u64x a34 = 0; u64x a40 = 0; u64x a41 = 0; u64x a42 = 0; u64x a43 = 0; u64x a44 = 0; #define Rho_Pi(ad,r) \ bc0 = ad; \ ad = rotl64 (t, r); \ t = bc0; \ #ifdef _unroll #pragma unroll #endif for (int round = 0; round < KECCAK_ROUNDS - 1; round++) { // Theta u64x bc0 = a00 ^ a10 ^ a20 ^ a30 ^ a40; u64x bc1 = a01 ^ a11 ^ a21 ^ a31 ^ a41; u64x bc2 = a02 ^ a12 ^ a22 ^ a32 ^ a42; u64x bc3 = a03 ^ a13 ^ a23 ^ a33 ^ a43; u64x bc4 = a04 ^ a14 ^ a24 ^ a34 ^ a44; u64x t; t = bc4 ^ rotl64 (bc1, 1); a00 ^= t; a10 ^= t; a20 ^= t; a30 ^= t; a40 ^= t; t = bc0 ^ rotl64 (bc2, 1); a01 ^= t; a11 ^= t; a21 ^= t; a31 ^= t; a41 ^= t; t = bc1 ^ rotl64 (bc3, 1); a02 ^= t; a12 ^= t; a22 ^= t; a32 ^= t; a42 ^= t; t = bc2 ^ rotl64 (bc4, 1); a03 ^= t; a13 ^= t; a23 ^= t; a33 ^= t; a43 ^= t; t = bc3 ^ rotl64 (bc0, 1); a04 ^= t; a14 ^= t; a24 ^= t; a34 ^= t; a44 ^= t; // Rho Pi t = a01; Rho_Pi (a20, 1); Rho_Pi (a12, 3); Rho_Pi (a21, 6); Rho_Pi (a32, 10); Rho_Pi (a33, 15); Rho_Pi (a03, 21); Rho_Pi (a10, 28); Rho_Pi (a31, 36); Rho_Pi (a13, 45); Rho_Pi (a41, 55); Rho_Pi (a44, 2); Rho_Pi (a04, 14); Rho_Pi (a30, 27); Rho_Pi (a43, 41); Rho_Pi (a34, 56); Rho_Pi (a23, 8); Rho_Pi (a22, 25); Rho_Pi (a02, 43); Rho_Pi (a40, 62); Rho_Pi (a24, 18); Rho_Pi (a42, 39); Rho_Pi (a14, 61); Rho_Pi (a11, 20); Rho_Pi (a01, 44); // Chi bc0 = a00; bc1 = a01; bc2 = a02; bc3 = a03; bc4 = a04; a00 ^= ~bc1 & bc2; a01 ^= ~bc2 & bc3; a02 ^= ~bc3 & bc4; a03 ^= ~bc4 & bc0; a04 ^= ~bc0 & bc1; bc0 = a10; bc1 = a11; bc2 = a12; bc3 = a13; bc4 = a14; a10 ^= ~bc1 & bc2; a11 ^= ~bc2 & bc3; a12 ^= ~bc3 & bc4; a13 ^= ~bc4 & bc0; a14 ^= ~bc0 & bc1; bc0 = a20; bc1 = a21; bc2 = a22; bc3 = a23; bc4 = a24; a20 ^= ~bc1 & bc2; a21 ^= ~bc2 & bc3; a22 ^= ~bc3 & bc4; a23 ^= ~bc4 & bc0; a24 ^= ~bc0 & bc1; bc0 = a30; bc1 = a31; bc2 = a32; bc3 = a33; bc4 = a34; a30 ^= ~bc1 & bc2; a31 ^= ~bc2 & bc3; a32 ^= ~bc3 & bc4; a33 ^= ~bc4 & bc0; a34 ^= ~bc0 & bc1; bc0 = a40; bc1 = a41; bc2 = a42; bc3 = a43; bc4 = a44; a40 ^= ~bc1 & bc2; a41 ^= ~bc2 & bc3; a42 ^= ~bc3 & bc4; a43 ^= ~bc4 & bc0; a44 ^= ~bc0 & bc1; // Iota a00 ^= keccakf_rndc[round]; } // Theta u64x bc0 = a00 ^ a10 ^ a20 ^ a30 ^ a40; u64x bc1 = a01 ^ a11 ^ a21 ^ a31 ^ a41; u64x bc2 = a02 ^ a12 ^ a22 ^ a32 ^ a42; u64x bc3 = a03 ^ a13 ^ a23 ^ a33 ^ a43; u64x bc4 = a04 ^ a14 ^ a24 ^ a34 ^ a44; u64x t; t = bc4 ^ rotl64 (bc1, 1); a00 ^= t; a10 ^= t; a20 ^= t; a30 ^= t; t = bc0 ^ rotl64 (bc2, 1); a21 ^= t; a31 ^= t; a41 ^= t; t = bc1 ^ rotl64 (bc3, 1); a02 ^= t; a12 ^= t; a22 ^= t; a32 ^= t; t = bc2 ^ rotl64 (bc4, 1); a03 ^= t; a13 ^= t; a23 ^= t; a33 ^= t; a43 ^= t; t = bc3 ^ rotl64 (bc0, 1); a04 ^= t; a34 ^= t; a44 ^= t; // Rho Pi t = a01; Rho_Pi (a20, 1); Rho_Pi (a12, 3); Rho_Pi (a21, 6); Rho_Pi (a32, 10); Rho_Pi (a33, 15); Rho_Pi (a03, 21); Rho_Pi (a10, 28); Rho_Pi (a31, 36); Rho_Pi (a13, 45); Rho_Pi (a41, 55); Rho_Pi (a44, 2); Rho_Pi (a04, 14); Rho_Pi (a30, 27); Rho_Pi (a43, 41); Rho_Pi (a34, 56); Rho_Pi (a23, 8); Rho_Pi (a22, 25); Rho_Pi (a02, 43); #undef Rho_Pi bc0 = a00; bc2 = a02; bc3 = a03; bc4 = a04; a02 ^= ~bc3 & bc4; a03 ^= ~bc4 & bc0; const u32x r0 = l32_from_64 (a03); const u32x r1 = h32_from_64 (a03); const u32x r2 = l32_from_64 (a02); const u32x r3 = h32_from_64 (a02); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m05000_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05000_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m05000_a3-optimized.cl000066400000000000000000000611761320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u64a 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 }; #ifndef KECCAK_ROUNDS #define KECCAK_ROUNDS 24 #endif void m05000m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * Keccak */ u64x a00 = hl32_to_64 (w0[1], w0lr); u64x a01 = hl32_to_64 (w0[3], w0[2]); u64x a02 = hl32_to_64 (w1[1], w1[0]); u64x a03 = hl32_to_64 (w1[3], w1[2]); u64x a04 = hl32_to_64 (w2[1], w2[0]); u64x a10 = hl32_to_64 (w2[3], w2[2]); u64x a11 = hl32_to_64 (w3[1], w3[0]); u64x a12 = hl32_to_64 (w3[3], w3[2]); u64x a13 = 0; u64x a14 = 0; u64x a20 = 0; u64x a21 = 0; u64x a22 = 0; u64x a23 = 0; u64x a24 = 0; u64x a30 = 0; u64x a31 = 0x8000000000000000; u64x a32 = 0; u64x a33 = 0; u64x a34 = 0; u64x a40 = 0; u64x a41 = 0; u64x a42 = 0; u64x a43 = 0; u64x a44 = 0; #define Rho_Pi(ad,r) \ bc0 = ad; \ ad = rotl64 (t, r); \ t = bc0; \ #ifdef _unroll #pragma unroll #endif for (int round = 0; round < KECCAK_ROUNDS - 1; round++) { // Theta u64x bc0 = a00 ^ a10 ^ a20 ^ a30 ^ a40; u64x bc1 = a01 ^ a11 ^ a21 ^ a31 ^ a41; u64x bc2 = a02 ^ a12 ^ a22 ^ a32 ^ a42; u64x bc3 = a03 ^ a13 ^ a23 ^ a33 ^ a43; u64x bc4 = a04 ^ a14 ^ a24 ^ a34 ^ a44; u64x t; t = bc4 ^ rotl64 (bc1, 1); a00 ^= t; a10 ^= t; a20 ^= t; a30 ^= t; a40 ^= t; t = bc0 ^ rotl64 (bc2, 1); a01 ^= t; a11 ^= t; a21 ^= t; a31 ^= t; a41 ^= t; t = bc1 ^ rotl64 (bc3, 1); a02 ^= t; a12 ^= t; a22 ^= t; a32 ^= t; a42 ^= t; t = bc2 ^ rotl64 (bc4, 1); a03 ^= t; a13 ^= t; a23 ^= t; a33 ^= t; a43 ^= t; t = bc3 ^ rotl64 (bc0, 1); a04 ^= t; a14 ^= t; a24 ^= t; a34 ^= t; a44 ^= t; // Rho Pi t = a01; Rho_Pi (a20, 1); Rho_Pi (a12, 3); Rho_Pi (a21, 6); Rho_Pi (a32, 10); Rho_Pi (a33, 15); Rho_Pi (a03, 21); Rho_Pi (a10, 28); Rho_Pi (a31, 36); Rho_Pi (a13, 45); Rho_Pi (a41, 55); Rho_Pi (a44, 2); Rho_Pi (a04, 14); Rho_Pi (a30, 27); Rho_Pi (a43, 41); Rho_Pi (a34, 56); Rho_Pi (a23, 8); Rho_Pi (a22, 25); Rho_Pi (a02, 43); Rho_Pi (a40, 62); Rho_Pi (a24, 18); Rho_Pi (a42, 39); Rho_Pi (a14, 61); Rho_Pi (a11, 20); Rho_Pi (a01, 44); // Chi bc0 = a00; bc1 = a01; bc2 = a02; bc3 = a03; bc4 = a04; a00 ^= ~bc1 & bc2; a01 ^= ~bc2 & bc3; a02 ^= ~bc3 & bc4; a03 ^= ~bc4 & bc0; a04 ^= ~bc0 & bc1; bc0 = a10; bc1 = a11; bc2 = a12; bc3 = a13; bc4 = a14; a10 ^= ~bc1 & bc2; a11 ^= ~bc2 & bc3; a12 ^= ~bc3 & bc4; a13 ^= ~bc4 & bc0; a14 ^= ~bc0 & bc1; bc0 = a20; bc1 = a21; bc2 = a22; bc3 = a23; bc4 = a24; a20 ^= ~bc1 & bc2; a21 ^= ~bc2 & bc3; a22 ^= ~bc3 & bc4; a23 ^= ~bc4 & bc0; a24 ^= ~bc0 & bc1; bc0 = a30; bc1 = a31; bc2 = a32; bc3 = a33; bc4 = a34; a30 ^= ~bc1 & bc2; a31 ^= ~bc2 & bc3; a32 ^= ~bc3 & bc4; a33 ^= ~bc4 & bc0; a34 ^= ~bc0 & bc1; bc0 = a40; bc1 = a41; bc2 = a42; bc3 = a43; bc4 = a44; a40 ^= ~bc1 & bc2; a41 ^= ~bc2 & bc3; a42 ^= ~bc3 & bc4; a43 ^= ~bc4 & bc0; a44 ^= ~bc0 & bc1; // Iota a00 ^= keccakf_rndc[round]; } // Theta u64x bc0 = a00 ^ a10 ^ a20 ^ a30 ^ a40; u64x bc1 = a01 ^ a11 ^ a21 ^ a31 ^ a41; u64x bc2 = a02 ^ a12 ^ a22 ^ a32 ^ a42; u64x bc3 = a03 ^ a13 ^ a23 ^ a33 ^ a43; u64x bc4 = a04 ^ a14 ^ a24 ^ a34 ^ a44; u64x t; t = bc4 ^ rotl64 (bc1, 1); a00 ^= t; a10 ^= t; a20 ^= t; a30 ^= t; t = bc0 ^ rotl64 (bc2, 1); a21 ^= t; a31 ^= t; a41 ^= t; t = bc1 ^ rotl64 (bc3, 1); a02 ^= t; a12 ^= t; a22 ^= t; a32 ^= t; t = bc2 ^ rotl64 (bc4, 1); a03 ^= t; a13 ^= t; a23 ^= t; a33 ^= t; a43 ^= t; t = bc3 ^ rotl64 (bc0, 1); a04 ^= t; a34 ^= t; a44 ^= t; // Rho Pi t = a01; Rho_Pi (a20, 1); Rho_Pi (a12, 3); Rho_Pi (a21, 6); Rho_Pi (a32, 10); Rho_Pi (a33, 15); Rho_Pi (a03, 21); Rho_Pi (a10, 28); Rho_Pi (a31, 36); Rho_Pi (a13, 45); Rho_Pi (a41, 55); Rho_Pi (a44, 2); Rho_Pi (a04, 14); Rho_Pi (a30, 27); Rho_Pi (a43, 41); Rho_Pi (a34, 56); Rho_Pi (a23, 8); Rho_Pi (a22, 25); Rho_Pi (a02, 43); #undef Rho_Pi bc0 = a00; bc2 = a02; bc3 = a03; bc4 = a04; a02 ^= ~bc3 & bc4; a03 ^= ~bc4 & bc0; const u32x r0 = l32_from_64 (a03); const u32x r1 = h32_from_64 (a03); const u32x r2 = l32_from_64 (a02); const u32x r3 = h32_from_64 (a02); COMPARE_M_SIMD (r0, r1, r2, r3); } } void m05000s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * Keccak */ u64x a00 = hl32_to_64 (w0[1], w0lr); u64x a01 = hl32_to_64 (w0[3], w0[2]); u64x a02 = hl32_to_64 (w1[1], w1[0]); u64x a03 = hl32_to_64 (w1[3], w1[2]); u64x a04 = hl32_to_64 (w2[1], w2[0]); u64x a10 = hl32_to_64 (w2[3], w2[2]); u64x a11 = hl32_to_64 (w3[1], w3[0]); u64x a12 = hl32_to_64 (w3[3], w3[2]); u64x a13 = 0; u64x a14 = 0; u64x a20 = 0; u64x a21 = 0; u64x a22 = 0; u64x a23 = 0; u64x a24 = 0; u64x a30 = 0; u64x a31 = 0x8000000000000000; u64x a32 = 0; u64x a33 = 0; u64x a34 = 0; u64x a40 = 0; u64x a41 = 0; u64x a42 = 0; u64x a43 = 0; u64x a44 = 0; #define Rho_Pi(ad,r) \ bc0 = ad; \ ad = rotl64 (t, r); \ t = bc0; \ #ifdef _unroll #pragma unroll #endif for (int round = 0; round < KECCAK_ROUNDS - 1; round++) { // Theta u64x bc0 = a00 ^ a10 ^ a20 ^ a30 ^ a40; u64x bc1 = a01 ^ a11 ^ a21 ^ a31 ^ a41; u64x bc2 = a02 ^ a12 ^ a22 ^ a32 ^ a42; u64x bc3 = a03 ^ a13 ^ a23 ^ a33 ^ a43; u64x bc4 = a04 ^ a14 ^ a24 ^ a34 ^ a44; u64x t; t = bc4 ^ rotl64 (bc1, 1); a00 ^= t; a10 ^= t; a20 ^= t; a30 ^= t; a40 ^= t; t = bc0 ^ rotl64 (bc2, 1); a01 ^= t; a11 ^= t; a21 ^= t; a31 ^= t; a41 ^= t; t = bc1 ^ rotl64 (bc3, 1); a02 ^= t; a12 ^= t; a22 ^= t; a32 ^= t; a42 ^= t; t = bc2 ^ rotl64 (bc4, 1); a03 ^= t; a13 ^= t; a23 ^= t; a33 ^= t; a43 ^= t; t = bc3 ^ rotl64 (bc0, 1); a04 ^= t; a14 ^= t; a24 ^= t; a34 ^= t; a44 ^= t; // Rho Pi t = a01; Rho_Pi (a20, 1); Rho_Pi (a12, 3); Rho_Pi (a21, 6); Rho_Pi (a32, 10); Rho_Pi (a33, 15); Rho_Pi (a03, 21); Rho_Pi (a10, 28); Rho_Pi (a31, 36); Rho_Pi (a13, 45); Rho_Pi (a41, 55); Rho_Pi (a44, 2); Rho_Pi (a04, 14); Rho_Pi (a30, 27); Rho_Pi (a43, 41); Rho_Pi (a34, 56); Rho_Pi (a23, 8); Rho_Pi (a22, 25); Rho_Pi (a02, 43); Rho_Pi (a40, 62); Rho_Pi (a24, 18); Rho_Pi (a42, 39); Rho_Pi (a14, 61); Rho_Pi (a11, 20); Rho_Pi (a01, 44); // Chi bc0 = a00; bc1 = a01; bc2 = a02; bc3 = a03; bc4 = a04; a00 ^= ~bc1 & bc2; a01 ^= ~bc2 & bc3; a02 ^= ~bc3 & bc4; a03 ^= ~bc4 & bc0; a04 ^= ~bc0 & bc1; bc0 = a10; bc1 = a11; bc2 = a12; bc3 = a13; bc4 = a14; a10 ^= ~bc1 & bc2; a11 ^= ~bc2 & bc3; a12 ^= ~bc3 & bc4; a13 ^= ~bc4 & bc0; a14 ^= ~bc0 & bc1; bc0 = a20; bc1 = a21; bc2 = a22; bc3 = a23; bc4 = a24; a20 ^= ~bc1 & bc2; a21 ^= ~bc2 & bc3; a22 ^= ~bc3 & bc4; a23 ^= ~bc4 & bc0; a24 ^= ~bc0 & bc1; bc0 = a30; bc1 = a31; bc2 = a32; bc3 = a33; bc4 = a34; a30 ^= ~bc1 & bc2; a31 ^= ~bc2 & bc3; a32 ^= ~bc3 & bc4; a33 ^= ~bc4 & bc0; a34 ^= ~bc0 & bc1; bc0 = a40; bc1 = a41; bc2 = a42; bc3 = a43; bc4 = a44; a40 ^= ~bc1 & bc2; a41 ^= ~bc2 & bc3; a42 ^= ~bc3 & bc4; a43 ^= ~bc4 & bc0; a44 ^= ~bc0 & bc1; // Iota a00 ^= keccakf_rndc[round]; } // Theta u64x bc0 = a00 ^ a10 ^ a20 ^ a30 ^ a40; u64x bc1 = a01 ^ a11 ^ a21 ^ a31 ^ a41; u64x bc2 = a02 ^ a12 ^ a22 ^ a32 ^ a42; u64x bc3 = a03 ^ a13 ^ a23 ^ a33 ^ a43; u64x bc4 = a04 ^ a14 ^ a24 ^ a34 ^ a44; u64x t; t = bc4 ^ rotl64 (bc1, 1); a00 ^= t; a10 ^= t; a20 ^= t; a30 ^= t; t = bc0 ^ rotl64 (bc2, 1); a21 ^= t; a31 ^= t; a41 ^= t; t = bc1 ^ rotl64 (bc3, 1); a02 ^= t; a12 ^= t; a22 ^= t; a32 ^= t; t = bc2 ^ rotl64 (bc4, 1); a03 ^= t; a13 ^= t; a23 ^= t; a33 ^= t; a43 ^= t; t = bc3 ^ rotl64 (bc0, 1); a04 ^= t; a34 ^= t; a44 ^= t; // Rho Pi t = a01; Rho_Pi (a20, 1); Rho_Pi (a12, 3); Rho_Pi (a21, 6); Rho_Pi (a32, 10); Rho_Pi (a33, 15); Rho_Pi (a03, 21); Rho_Pi (a10, 28); Rho_Pi (a31, 36); Rho_Pi (a13, 45); Rho_Pi (a41, 55); Rho_Pi (a44, 2); Rho_Pi (a04, 14); Rho_Pi (a30, 27); Rho_Pi (a43, 41); Rho_Pi (a34, 56); Rho_Pi (a23, 8); Rho_Pi (a22, 25); Rho_Pi (a02, 43); #undef Rho_Pi bc0 = a00; bc2 = a02; bc3 = a03; bc4 = a04; a02 ^= ~bc3 & bc4; a03 ^= ~bc4 & bc0; const u32x r0 = l32_from_64 (a03); const u32x r1 = h32_from_64 (a03); const u32x r2 = l32_from_64 (a02); const u32x r3 = h32_from_64 (a02); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m05000_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m05000_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m05000_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m05000_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m05000_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m05000_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m05100_a0-optimized.cl000066400000000000000000000402641320027462700200040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m05100_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; u32x z = 0; COMPARE_M_SIMD (a, b, z, z); COMPARE_M_SIMD (b, c, z, z); COMPARE_M_SIMD (c, d, z, z); } } __kernel void m05100_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05100_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05100_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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], 0, 0 }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); w3[2] = out_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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; u32x z = 0; COMPARE_S_SIMD (a, b, z, z); COMPARE_S_SIMD (b, c, z, z); COMPARE_S_SIMD (c, d, z, z); } } __kernel void m05100_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05100_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m05100_a0.cl000066400000000000000000000077651320027462700160130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m05100_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx; md5_init (&ctx); md5_update (&ctx, tmp.i, tmp.pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; u32 z = 0; COMPARE_M_SCALAR (r0, r1, z, z); COMPARE_M_SCALAR (r1, r2, z, z); COMPARE_M_SCALAR (r2, r3, z, z); } } __kernel void m05100_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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], 0, 0 }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx; md5_init (&ctx); md5_update (&ctx, tmp.i, tmp.pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; u32 z = 0; COMPARE_S_SCALAR (r0, r1, z, z); COMPARE_S_SCALAR (r1, r2, z, z); COMPARE_S_SCALAR (r2, r3, z, z); } } hashcat-4.0.1/OpenCL/m05100_a1-optimized.cl000066400000000000000000000464351320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m05100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; u32x z = 0; COMPARE_M_SIMD (a, b, z, z); COMPARE_M_SIMD (b, c, z, z); COMPARE_M_SIMD (c, d, z, z); } } __kernel void m05100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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], 0, 0 }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = 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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; u32x z = 0; COMPARE_S_SIMD (a, b, z, z); COMPARE_S_SIMD (b, c, z, z); COMPARE_S_SIMD (c, d, z, z); } } __kernel void m05100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m05100_a1.cl000066400000000000000000000076761320027462700160150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m05100_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; u32 z = 0; COMPARE_M_SCALAR (r0, r1, z, z); COMPARE_M_SCALAR (r1, r2, z, z); COMPARE_M_SCALAR (r2, r3, z, z); } } __kernel void m05100_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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], 0, 0 }; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; u32 z = 0; COMPARE_S_SCALAR (r0, r1, z, z); COMPARE_S_SCALAR (r1, r2, z, z); COMPARE_S_SCALAR (r2, r3, z, z); } } hashcat-4.0.1/OpenCL/m05100_a3-optimized.cl000066400000000000000000000574551320027462700200210ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m05100m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = pw_len * 8; t3[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, 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); u32x t; MD5_STEP (MD5_H1, a, b, c, d, t1[1], MD5C20, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t2[0], MD5C21, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t2[3], MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t3[2], MD5C23, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t0[1], MD5C24, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t1[0], MD5C25, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t1[3], MD5C26, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t2[2], MD5C27, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t3[1], MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t0[0], MD5C29, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t0[3], MD5C2a, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t1[2], MD5C2b, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t2[1], MD5C2c, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t3[0], MD5C2d, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t3[3], MD5C2e, MD5S22); MD5_STEP (MD5_H2, 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; u32x z = 0; COMPARE_M_SIMD (a, b, z, z); COMPARE_M_SIMD (b, c, z, z); COMPARE_M_SIMD (c, d, z, z); } } void m05100s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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], 0, 0 }; /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = w0lr; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = w2[0]; t2[1] = w2[1]; t2[2] = w2[2]; t2[3] = w2[3]; t3[0] = w3[0]; t3[1] = w3[1]; t3[2] = pw_len * 8; t3[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, 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); u32x t; MD5_STEP (MD5_H1, a, b, c, d, t1[1], MD5C20, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t2[0], MD5C21, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t2[3], MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t3[2], MD5C23, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t0[1], MD5C24, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t1[0], MD5C25, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t1[3], MD5C26, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t2[2], MD5C27, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t3[1], MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t0[0], MD5C29, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t0[3], MD5C2a, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t1[2], MD5C2b, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t2[1], MD5C2c, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t3[0], MD5C2d, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t3[3], MD5C2e, MD5S22); MD5_STEP (MD5_H2, 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; u32x z = 0; COMPARE_S_SIMD (a, b, z, z); COMPARE_S_SIMD (b, c, z, z); COMPARE_S_SIMD (c, d, z, z); } } __kernel void m05100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m05100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m05100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m05100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m05100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m05100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m05100_a3.cl000066400000000000000000000105061320027462700160010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __kernel void m05100_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector (&ctx); md5_update_vector (&ctx, w, pw_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; u32x z = 0; COMPARE_M_SIMD (r0, r1, z, z); COMPARE_M_SIMD (r1, r2, z, z); COMPARE_M_SIMD (r2, r3, z, z); } } __kernel void m05100_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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], 0, 0 }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector (&ctx); md5_update_vector (&ctx, w, pw_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; u32x z = 0; COMPARE_S_SIMD (r0, r1, z, z); COMPARE_S_SIMD (r1, r2, z, z); COMPARE_S_SIMD (r2, r3, z, z); } } hashcat-4.0.1/OpenCL/m05200.cl000066400000000000000000000140341320027462700154170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" __kernel void m05200_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pwsafe3_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha256_ctx_t ctx; sha256_init (&ctx); sha256_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); sha256_update_global_swap (&ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha256_final (&ctx); tmps[gid].digest_buf[0] = ctx.h[0]; tmps[gid].digest_buf[1] = ctx.h[1]; tmps[gid].digest_buf[2] = ctx.h[2]; tmps[gid].digest_buf[3] = ctx.h[3]; tmps[gid].digest_buf[4] = ctx.h[4]; tmps[gid].digest_buf[5] = ctx.h[5]; tmps[gid].digest_buf[6] = ctx.h[6]; tmps[gid].digest_buf[7] = ctx.h[7]; } __kernel void m05200_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pwsafe3_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x digest[8]; digest[0] = packv (tmps, digest_buf, gid, 0); digest[1] = packv (tmps, digest_buf, gid, 1); digest[2] = packv (tmps, digest_buf, gid, 2); digest[3] = packv (tmps, digest_buf, gid, 3); digest[4] = packv (tmps, digest_buf, gid, 4); digest[5] = packv (tmps, digest_buf, gid, 5); digest[6] = packv (tmps, digest_buf, gid, 6); digest[7] = packv (tmps, digest_buf, gid, 7); /** * init */ 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] = 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] = 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_vector (w0, w1, w2, w3, digest); } unpackv (tmps, digest_buf, gid, 0, digest[0]); unpackv (tmps, digest_buf, gid, 1, digest[1]); unpackv (tmps, digest_buf, gid, 2, digest[2]); unpackv (tmps, digest_buf, gid, 3, digest[3]); unpackv (tmps, digest_buf, gid, 4, digest[4]); unpackv (tmps, digest_buf, gid, 5, digest[5]); unpackv (tmps, digest_buf, gid, 6, digest[6]); unpackv (tmps, digest_buf, gid, 7, digest[7]); } __kernel void m05200_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pwsafe3_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ const u32 r0 = tmps[gid].digest_buf[DGST_R0]; const u32 r1 = tmps[gid].digest_buf[DGST_R1]; const u32 r2 = tmps[gid].digest_buf[DGST_R2]; const u32 r3 = tmps[gid].digest_buf[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m05300_a0-optimized.cl000066400000000000000000000372131320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m05300_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = ikepsk_bufs[digests_offset].nr_buf[i]; } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = ikepsk_bufs[digests_offset].msg_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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[digests_offset].nr_len; const u32 msg_len = ikepsk_bufs[digests_offset].msg_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * pads */ u32x ipad[4]; u32x opad[4]; hmac_md5_pad (w0, w1, w2, w3, ipad, opad); w0[0] = s_nr_buf[ 0]; w0[1] = s_nr_buf[ 1]; w0[2] = s_nr_buf[ 2]; w0[3] = s_nr_buf[ 3]; w1[0] = s_nr_buf[ 4]; w1[1] = s_nr_buf[ 5]; w1[2] = s_nr_buf[ 6]; w1[3] = s_nr_buf[ 7]; w2[0] = s_nr_buf[ 8]; w2[1] = s_nr_buf[ 9]; w2[2] = s_nr_buf[10]; w2[3] = s_nr_buf[11]; w3[0] = s_nr_buf[12]; w3[1] = s_nr_buf[13]; w3[2] = (64 + nr_len) * 8; w3[3] = 0; u32x digest[4]; hmac_md5_run (w0, w1, w2, w3, ipad, opad, digest); 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_md5_pad (w0, w1, w2, w3, ipad, opad); int left; int off; for (left = ikepsk_bufs[digests_offset].msg_len, off = 0; left >= 56; left -= 64, off += 16) { w0[0] = s_msg_buf[off + 0]; w0[1] = s_msg_buf[off + 1]; w0[2] = s_msg_buf[off + 2]; w0[3] = s_msg_buf[off + 3]; w1[0] = s_msg_buf[off + 4]; w1[1] = s_msg_buf[off + 5]; w1[2] = s_msg_buf[off + 6]; w1[3] = s_msg_buf[off + 7]; w2[0] = s_msg_buf[off + 8]; w2[1] = s_msg_buf[off + 9]; w2[2] = s_msg_buf[off + 10]; w2[3] = s_msg_buf[off + 11]; w3[0] = s_msg_buf[off + 12]; w3[1] = s_msg_buf[off + 13]; w3[2] = s_msg_buf[off + 14]; w3[3] = s_msg_buf[off + 15]; md5_transform_vector (w0, w1, w2, w3, ipad); } w0[0] = s_msg_buf[off + 0]; w0[1] = s_msg_buf[off + 1]; w0[2] = s_msg_buf[off + 2]; w0[3] = s_msg_buf[off + 3]; w1[0] = s_msg_buf[off + 4]; w1[1] = s_msg_buf[off + 5]; w1[2] = s_msg_buf[off + 6]; w1[3] = s_msg_buf[off + 7]; w2[0] = s_msg_buf[off + 8]; w2[1] = s_msg_buf[off + 9]; w2[2] = s_msg_buf[off + 10]; w2[3] = s_msg_buf[off + 11]; w3[0] = s_msg_buf[off + 12]; w3[1] = s_msg_buf[off + 13]; w3[2] = (64 + msg_len) * 8; w3[3] = 0; hmac_md5_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_M_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m05300_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05300_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05300_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = ikepsk_bufs[digests_offset].nr_buf[i]; } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = ikepsk_bufs[digests_offset].msg_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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[digests_offset].nr_len; const u32 msg_len = ikepsk_bufs[digests_offset].msg_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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * pads */ u32x ipad[4]; u32x opad[4]; hmac_md5_pad (w0, w1, w2, w3, ipad, opad); w0[0] = s_nr_buf[ 0]; w0[1] = s_nr_buf[ 1]; w0[2] = s_nr_buf[ 2]; w0[3] = s_nr_buf[ 3]; w1[0] = s_nr_buf[ 4]; w1[1] = s_nr_buf[ 5]; w1[2] = s_nr_buf[ 6]; w1[3] = s_nr_buf[ 7]; w2[0] = s_nr_buf[ 8]; w2[1] = s_nr_buf[ 9]; w2[2] = s_nr_buf[10]; w2[3] = s_nr_buf[11]; w3[0] = s_nr_buf[12]; w3[1] = s_nr_buf[13]; w3[2] = (64 + nr_len) * 8; w3[3] = 0; u32x digest[4]; hmac_md5_run (w0, w1, w2, w3, ipad, opad, digest); 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_md5_pad (w0, w1, w2, w3, ipad, opad); int left; int off; for (left = ikepsk_bufs[digests_offset].msg_len, off = 0; left >= 56; left -= 64, off += 16) { w0[0] = s_msg_buf[off + 0]; w0[1] = s_msg_buf[off + 1]; w0[2] = s_msg_buf[off + 2]; w0[3] = s_msg_buf[off + 3]; w1[0] = s_msg_buf[off + 4]; w1[1] = s_msg_buf[off + 5]; w1[2] = s_msg_buf[off + 6]; w1[3] = s_msg_buf[off + 7]; w2[0] = s_msg_buf[off + 8]; w2[1] = s_msg_buf[off + 9]; w2[2] = s_msg_buf[off + 10]; w2[3] = s_msg_buf[off + 11]; w3[0] = s_msg_buf[off + 12]; w3[1] = s_msg_buf[off + 13]; w3[2] = s_msg_buf[off + 14]; w3[3] = s_msg_buf[off + 15]; md5_transform_vector (w0, w1, w2, w3, ipad); } w0[0] = s_msg_buf[off + 0]; w0[1] = s_msg_buf[off + 1]; w0[2] = s_msg_buf[off + 2]; w0[3] = s_msg_buf[off + 3]; w1[0] = s_msg_buf[off + 4]; w1[1] = s_msg_buf[off + 5]; w1[2] = s_msg_buf[off + 6]; w1[3] = s_msg_buf[off + 7]; w2[0] = s_msg_buf[off + 8]; w2[1] = s_msg_buf[off + 9]; w2[2] = s_msg_buf[off + 10]; w2[3] = s_msg_buf[off + 11]; w3[0] = s_msg_buf[off + 12]; w3[1] = s_msg_buf[off + 13]; w3[2] = (64 + msg_len) * 8; w3[3] = 0; hmac_md5_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_S_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m05300_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05300_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m05300_a0.cl000066400000000000000000000124071320027462700160020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m05300_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_hmac_ctx_t ctx0; md5_hmac_init (&ctx0, tmp.i, tmp.pw_len); md5_hmac_update_global (&ctx0, ikepsk_bufs[digests_offset].nr_buf, ikepsk_bufs[digests_offset].nr_len); md5_hmac_final (&ctx0); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); md5_hmac_update_global (&ctx, ikepsk_bufs[digests_offset].msg_buf, ikepsk_bufs[digests_offset].msg_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m05300_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_hmac_ctx_t ctx0; md5_hmac_init (&ctx0, tmp.i, tmp.pw_len); md5_hmac_update_global (&ctx0, ikepsk_bufs[digests_offset].nr_buf, ikepsk_bufs[digests_offset].nr_len); md5_hmac_final (&ctx0); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); md5_hmac_update_global (&ctx, ikepsk_bufs[digests_offset].msg_buf, ikepsk_bufs[digests_offset].msg_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m05300_a1-optimized.cl000066400000000000000000000460041320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m05300_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = ikepsk_bufs[digests_offset].nr_buf[i]; } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = ikepsk_bufs[digests_offset].msg_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ const u32 nr_len = ikepsk_bufs[digests_offset].nr_len; const u32 msg_len = ikepsk_bufs[digests_offset].msg_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * pads */ u32x ipad[4]; u32x opad[4]; hmac_md5_pad (w0, w1, w2, w3, ipad, opad); w0[0] = s_nr_buf[ 0]; w0[1] = s_nr_buf[ 1]; w0[2] = s_nr_buf[ 2]; w0[3] = s_nr_buf[ 3]; w1[0] = s_nr_buf[ 4]; w1[1] = s_nr_buf[ 5]; w1[2] = s_nr_buf[ 6]; w1[3] = s_nr_buf[ 7]; w2[0] = s_nr_buf[ 8]; w2[1] = s_nr_buf[ 9]; w2[2] = s_nr_buf[10]; w2[3] = s_nr_buf[11]; w3[0] = s_nr_buf[12]; w3[1] = s_nr_buf[13]; w3[2] = (64 + nr_len) * 8; w3[3] = 0; u32x digest[4]; hmac_md5_run (w0, w1, w2, w3, ipad, opad, digest); 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_md5_pad (w0, w1, w2, w3, ipad, opad); int left; int off; for (left = ikepsk_bufs[digests_offset].msg_len, off = 0; left >= 56; left -= 64, off += 16) { w0[0] = s_msg_buf[off + 0]; w0[1] = s_msg_buf[off + 1]; w0[2] = s_msg_buf[off + 2]; w0[3] = s_msg_buf[off + 3]; w1[0] = s_msg_buf[off + 4]; w1[1] = s_msg_buf[off + 5]; w1[2] = s_msg_buf[off + 6]; w1[3] = s_msg_buf[off + 7]; w2[0] = s_msg_buf[off + 8]; w2[1] = s_msg_buf[off + 9]; w2[2] = s_msg_buf[off + 10]; w2[3] = s_msg_buf[off + 11]; w3[0] = s_msg_buf[off + 12]; w3[1] = s_msg_buf[off + 13]; w3[2] = s_msg_buf[off + 14]; w3[3] = s_msg_buf[off + 15]; md5_transform_vector (w0, w1, w2, w3, ipad); } w0[0] = s_msg_buf[off + 0]; w0[1] = s_msg_buf[off + 1]; w0[2] = s_msg_buf[off + 2]; w0[3] = s_msg_buf[off + 3]; w1[0] = s_msg_buf[off + 4]; w1[1] = s_msg_buf[off + 5]; w1[2] = s_msg_buf[off + 6]; w1[3] = s_msg_buf[off + 7]; w2[0] = s_msg_buf[off + 8]; w2[1] = s_msg_buf[off + 9]; w2[2] = s_msg_buf[off + 10]; w2[3] = s_msg_buf[off + 11]; w3[0] = s_msg_buf[off + 12]; w3[1] = s_msg_buf[off + 13]; w3[2] = (64 + msg_len) * 8; w3[3] = 0; hmac_md5_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_M_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m05300_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05300_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05300_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = ikepsk_bufs[digests_offset].nr_buf[i]; } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = ikepsk_bufs[digests_offset].msg_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ const u32 nr_len = ikepsk_bufs[digests_offset].nr_len; const u32 msg_len = ikepsk_bufs[digests_offset].msg_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * pads */ u32x ipad[4]; u32x opad[4]; hmac_md5_pad (w0, w1, w2, w3, ipad, opad); w0[0] = s_nr_buf[ 0]; w0[1] = s_nr_buf[ 1]; w0[2] = s_nr_buf[ 2]; w0[3] = s_nr_buf[ 3]; w1[0] = s_nr_buf[ 4]; w1[1] = s_nr_buf[ 5]; w1[2] = s_nr_buf[ 6]; w1[3] = s_nr_buf[ 7]; w2[0] = s_nr_buf[ 8]; w2[1] = s_nr_buf[ 9]; w2[2] = s_nr_buf[10]; w2[3] = s_nr_buf[11]; w3[0] = s_nr_buf[12]; w3[1] = s_nr_buf[13]; w3[2] = (64 + nr_len) * 8; w3[3] = 0; u32x digest[4]; hmac_md5_run (w0, w1, w2, w3, ipad, opad, digest); 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_md5_pad (w0, w1, w2, w3, ipad, opad); int left; int off; for (left = ikepsk_bufs[digests_offset].msg_len, off = 0; left >= 56; left -= 64, off += 16) { w0[0] = s_msg_buf[off + 0]; w0[1] = s_msg_buf[off + 1]; w0[2] = s_msg_buf[off + 2]; w0[3] = s_msg_buf[off + 3]; w1[0] = s_msg_buf[off + 4]; w1[1] = s_msg_buf[off + 5]; w1[2] = s_msg_buf[off + 6]; w1[3] = s_msg_buf[off + 7]; w2[0] = s_msg_buf[off + 8]; w2[1] = s_msg_buf[off + 9]; w2[2] = s_msg_buf[off + 10]; w2[3] = s_msg_buf[off + 11]; w3[0] = s_msg_buf[off + 12]; w3[1] = s_msg_buf[off + 13]; w3[2] = s_msg_buf[off + 14]; w3[3] = s_msg_buf[off + 15]; md5_transform_vector (w0, w1, w2, w3, ipad); } w0[0] = s_msg_buf[off + 0]; w0[1] = s_msg_buf[off + 1]; w0[2] = s_msg_buf[off + 2]; w0[3] = s_msg_buf[off + 3]; w1[0] = s_msg_buf[off + 4]; w1[1] = s_msg_buf[off + 5]; w1[2] = s_msg_buf[off + 6]; w1[3] = s_msg_buf[off + 7]; w2[0] = s_msg_buf[off + 8]; w2[1] = s_msg_buf[off + 9]; w2[2] = s_msg_buf[off + 10]; w2[3] = s_msg_buf[off + 11]; w3[0] = s_msg_buf[off + 12]; w3[1] = s_msg_buf[off + 13]; w3[2] = (64 + msg_len) * 8; w3[3] = 0; hmac_md5_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_S_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m05300_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05300_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m05300_a1.cl000066400000000000000000000140241320027462700160000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m05300_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = combs_buf[il_pos].i[idx]; } switch_buffer_by_offset_1x64_le_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } md5_hmac_ctx_t ctx0; md5_hmac_init (&ctx0, c, pw_len + comb_len); md5_hmac_update_global (&ctx0, ikepsk_bufs[digests_offset].nr_buf, ikepsk_bufs[digests_offset].nr_len); md5_hmac_final (&ctx0); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); md5_hmac_update_global (&ctx, ikepsk_bufs[digests_offset].msg_buf, ikepsk_bufs[digests_offset].msg_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m05300_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = combs_buf[il_pos].i[idx]; } switch_buffer_by_offset_1x64_le_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } md5_hmac_ctx_t ctx0; md5_hmac_init (&ctx0, c, pw_len + comb_len); md5_hmac_update_global (&ctx0, ikepsk_bufs[digests_offset].nr_buf, ikepsk_bufs[digests_offset].nr_len); md5_hmac_final (&ctx0); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); md5_hmac_update_global (&ctx, ikepsk_bufs[digests_offset].msg_buf, ikepsk_bufs[digests_offset].msg_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m05300_a3-optimized.cl000066400000000000000000000636001320027462700200100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } void m05300m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *s_msg_buf, __local u32 *s_nr_buf) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 nr_len = ikepsk_bufs[digests_offset].nr_len; const u32 msg_len = ikepsk_bufs[digests_offset].msg_len; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * pads */ u32x ipad[4]; u32x opad[4]; hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); w0_t[0] = s_nr_buf[ 0]; w0_t[1] = s_nr_buf[ 1]; w0_t[2] = s_nr_buf[ 2]; w0_t[3] = s_nr_buf[ 3]; w1_t[0] = s_nr_buf[ 4]; w1_t[1] = s_nr_buf[ 5]; w1_t[2] = s_nr_buf[ 6]; w1_t[3] = s_nr_buf[ 7]; w2_t[0] = s_nr_buf[ 8]; w2_t[1] = s_nr_buf[ 9]; w2_t[2] = s_nr_buf[10]; w2_t[3] = s_nr_buf[11]; w3_t[0] = s_nr_buf[12]; w3_t[1] = s_nr_buf[13]; 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[digests_offset].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_vector (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); COMPARE_M_SIMD (digest[0], digest[3], digest[2], digest[1]); } } void m05300s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *s_msg_buf, __local u32 *s_nr_buf) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 nr_len = ikepsk_bufs[digests_offset].nr_len; const u32 msg_len = ikepsk_bufs[digests_offset].msg_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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * pads */ u32x ipad[4]; u32x opad[4]; hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); w0_t[0] = s_nr_buf[ 0]; w0_t[1] = s_nr_buf[ 1]; w0_t[2] = s_nr_buf[ 2]; w0_t[3] = s_nr_buf[ 3]; w1_t[0] = s_nr_buf[ 4]; w1_t[1] = s_nr_buf[ 5]; w1_t[2] = s_nr_buf[ 6]; w1_t[3] = s_nr_buf[ 7]; w2_t[0] = s_nr_buf[ 8]; w2_t[1] = s_nr_buf[ 9]; w2_t[2] = s_nr_buf[10]; w2_t[3] = s_nr_buf[11]; w3_t[0] = s_nr_buf[12]; w3_t[1] = s_nr_buf[13]; 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[digests_offset].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_vector (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); COMPARE_S_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m05300_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = ikepsk_bufs[digests_offset].nr_buf[i]; } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = ikepsk_bufs[digests_offset].msg_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_msg_buf, s_nr_buf); } __kernel void m05300_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = ikepsk_bufs[digests_offset].nr_buf[i]; } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = ikepsk_bufs[digests_offset].msg_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_msg_buf, s_nr_buf); } __kernel void m05300_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = ikepsk_bufs[digests_offset].nr_buf[i]; } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = ikepsk_bufs[digests_offset].msg_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_msg_buf, s_nr_buf); } __kernel void m05300_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = ikepsk_bufs[digests_offset].nr_buf[i]; } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = ikepsk_bufs[digests_offset].msg_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_msg_buf, s_nr_buf); } __kernel void m05300_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = ikepsk_bufs[digests_offset].nr_buf[i]; } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = ikepsk_bufs[digests_offset].msg_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_msg_buf, s_nr_buf); } __kernel void m05300_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = ikepsk_bufs[digests_offset].nr_buf[i]; } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = ikepsk_bufs[digests_offset].msg_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_msg_buf, s_nr_buf); } hashcat-4.0.1/OpenCL/m05300_a3.cl000066400000000000000000000130461320027462700160050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m05300_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = words_buf_r[il_pos / VECT_SIZE]; const u32 w0lr = w0l | w0r; w[0] = w0lr; md5_hmac_ctx_t ctx0; md5_hmac_init (&ctx0, w, pw_len); md5_hmac_update_global (&ctx0, ikepsk_bufs[digests_offset].nr_buf, ikepsk_bufs[digests_offset].nr_len); md5_hmac_final (&ctx0); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); md5_hmac_update_global (&ctx, ikepsk_bufs[digests_offset].msg_buf, ikepsk_bufs[digests_offset].msg_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m05300_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = words_buf_r[il_pos / VECT_SIZE]; const u32 w0lr = w0l | w0r; w[0] = w0lr; md5_hmac_ctx_t ctx0; md5_hmac_init (&ctx0, w, pw_len); md5_hmac_update_global (&ctx0, ikepsk_bufs[digests_offset].nr_buf, ikepsk_bufs[digests_offset].nr_len); md5_hmac_final (&ctx0); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); md5_hmac_update_global (&ctx, ikepsk_bufs[digests_offset].msg_buf, ikepsk_bufs[digests_offset].msg_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m05400_a0-optimized.cl000066400000000000000000000404101320027462700200000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m05400_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = swap32_S (ikepsk_bufs[digests_offset].nr_buf[i]); } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = swap32_S (ikepsk_bufs[digests_offset].msg_buf[i]); } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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[digests_offset].nr_len; const u32 msg_len = ikepsk_bufs[digests_offset].msg_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * pads */ w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); u32x ipad[5]; u32x opad[5]; hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); w0[0] = s_nr_buf[ 0]; w0[1] = s_nr_buf[ 1]; w0[2] = s_nr_buf[ 2]; w0[3] = s_nr_buf[ 3]; w1[0] = s_nr_buf[ 4]; w1[1] = s_nr_buf[ 5]; w1[2] = s_nr_buf[ 6]; w1[3] = s_nr_buf[ 7]; w2[0] = s_nr_buf[ 8]; w2[1] = s_nr_buf[ 9]; w2[2] = s_nr_buf[10]; w2[3] = s_nr_buf[11]; w3[0] = s_nr_buf[12]; w3[1] = s_nr_buf[13]; w3[2] = 0; w3[3] = (64 + nr_len) * 8; u32x digest[5]; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); w0[0] = digest[0]; w0[1] = digest[1]; w0[2] = digest[2]; w0[3] = digest[3]; w1[0] = digest[4]; 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 left; int off; for (left = ikepsk_bufs[digests_offset].msg_len, off = 0; left >= 56; left -= 64, off += 16) { w0[0] = s_msg_buf[off + 0]; w0[1] = s_msg_buf[off + 1]; w0[2] = s_msg_buf[off + 2]; w0[3] = s_msg_buf[off + 3]; w1[0] = s_msg_buf[off + 4]; w1[1] = s_msg_buf[off + 5]; w1[2] = s_msg_buf[off + 6]; w1[3] = s_msg_buf[off + 7]; w2[0] = s_msg_buf[off + 8]; w2[1] = s_msg_buf[off + 9]; w2[2] = s_msg_buf[off + 10]; w2[3] = s_msg_buf[off + 11]; w3[0] = s_msg_buf[off + 12]; w3[1] = s_msg_buf[off + 13]; w3[2] = s_msg_buf[off + 14]; w3[3] = s_msg_buf[off + 15]; sha1_transform_vector (w0, w1, w2, w3, ipad); } w0[0] = s_msg_buf[off + 0]; w0[1] = s_msg_buf[off + 1]; w0[2] = s_msg_buf[off + 2]; w0[3] = s_msg_buf[off + 3]; w1[0] = s_msg_buf[off + 4]; w1[1] = s_msg_buf[off + 5]; w1[2] = s_msg_buf[off + 6]; w1[3] = s_msg_buf[off + 7]; w2[0] = s_msg_buf[off + 8]; w2[1] = s_msg_buf[off + 9]; w2[2] = s_msg_buf[off + 10]; w2[3] = s_msg_buf[off + 11]; w3[0] = s_msg_buf[off + 12]; w3[1] = s_msg_buf[off + 13]; w3[2] = 0; w3[3] = (64 + msg_len) * 8; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m05400_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05400_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05400_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = swap32_S (ikepsk_bufs[digests_offset].nr_buf[i]); } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = swap32_S (ikepsk_bufs[digests_offset].msg_buf[i]); } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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[digests_offset].nr_len; const u32 msg_len = ikepsk_bufs[digests_offset].msg_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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * pads */ w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); u32x ipad[5]; u32x opad[5]; hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); w0[0] = s_nr_buf[ 0]; w0[1] = s_nr_buf[ 1]; w0[2] = s_nr_buf[ 2]; w0[3] = s_nr_buf[ 3]; w1[0] = s_nr_buf[ 4]; w1[1] = s_nr_buf[ 5]; w1[2] = s_nr_buf[ 6]; w1[3] = s_nr_buf[ 7]; w2[0] = s_nr_buf[ 8]; w2[1] = s_nr_buf[ 9]; w2[2] = s_nr_buf[10]; w2[3] = s_nr_buf[11]; w3[0] = s_nr_buf[12]; w3[1] = s_nr_buf[13]; w3[2] = 0; w3[3] = (64 + nr_len) * 8; u32x digest[5]; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); w0[0] = digest[0]; w0[1] = digest[1]; w0[2] = digest[2]; w0[3] = digest[3]; w1[0] = digest[4]; 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 left; int off; for (left = ikepsk_bufs[digests_offset].msg_len, off = 0; left >= 56; left -= 64, off += 16) { w0[0] = s_msg_buf[off + 0]; w0[1] = s_msg_buf[off + 1]; w0[2] = s_msg_buf[off + 2]; w0[3] = s_msg_buf[off + 3]; w1[0] = s_msg_buf[off + 4]; w1[1] = s_msg_buf[off + 5]; w1[2] = s_msg_buf[off + 6]; w1[3] = s_msg_buf[off + 7]; w2[0] = s_msg_buf[off + 8]; w2[1] = s_msg_buf[off + 9]; w2[2] = s_msg_buf[off + 10]; w2[3] = s_msg_buf[off + 11]; w3[0] = s_msg_buf[off + 12]; w3[1] = s_msg_buf[off + 13]; w3[2] = s_msg_buf[off + 14]; w3[3] = s_msg_buf[off + 15]; sha1_transform_vector (w0, w1, w2, w3, ipad); } w0[0] = s_msg_buf[off + 0]; w0[1] = s_msg_buf[off + 1]; w0[2] = s_msg_buf[off + 2]; w0[3] = s_msg_buf[off + 3]; w1[0] = s_msg_buf[off + 4]; w1[1] = s_msg_buf[off + 5]; w1[2] = s_msg_buf[off + 6]; w1[3] = s_msg_buf[off + 7]; w2[0] = s_msg_buf[off + 8]; w2[1] = s_msg_buf[off + 9]; w2[2] = s_msg_buf[off + 10]; w2[3] = s_msg_buf[off + 11]; w3[0] = s_msg_buf[off + 12]; w3[1] = s_msg_buf[off + 13]; w3[2] = 0; w3[3] = (64 + msg_len) * 8; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m05400_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05400_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m05400_a0.cl000066400000000000000000000125201320027462700157770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m05400_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_hmac_ctx_t ctx0; sha1_hmac_init_swap (&ctx0, tmp.i, tmp.pw_len); sha1_hmac_update_global_swap (&ctx0, ikepsk_bufs[digests_offset].nr_buf, ikepsk_bufs[digests_offset].nr_len); sha1_hmac_final (&ctx0); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[3]; w1[0] = ctx0.opad.h[4]; 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; sha1_hmac_ctx_t ctx; sha1_hmac_init_64 (&ctx, w0, w1, w2, w3); sha1_hmac_update_global_swap (&ctx, ikepsk_bufs[digests_offset].msg_buf, ikepsk_bufs[digests_offset].msg_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m05400_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_hmac_ctx_t ctx0; sha1_hmac_init_swap (&ctx0, tmp.i, tmp.pw_len); sha1_hmac_update_global_swap (&ctx0, ikepsk_bufs[digests_offset].nr_buf, ikepsk_bufs[digests_offset].nr_len); sha1_hmac_final (&ctx0); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[3]; w1[0] = ctx0.opad.h[4]; 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; sha1_hmac_ctx_t ctx; sha1_hmac_init_64 (&ctx, w0, w1, w2, w3); sha1_hmac_update_global_swap (&ctx, ikepsk_bufs[digests_offset].msg_buf, ikepsk_bufs[digests_offset].msg_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m05400_a1-optimized.cl000066400000000000000000000501011320027462700177770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m05400_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = swap32_S (ikepsk_bufs[digests_offset].nr_buf[i]); } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = swap32_S (ikepsk_bufs[digests_offset].msg_buf[i]); } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ const u32 nr_len = ikepsk_bufs[digests_offset].nr_len; const u32 msg_len = ikepsk_bufs[digests_offset].msg_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * pads */ w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); u32x ipad[5]; u32x opad[5]; hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); w0[0] = s_nr_buf[ 0]; w0[1] = s_nr_buf[ 1]; w0[2] = s_nr_buf[ 2]; w0[3] = s_nr_buf[ 3]; w1[0] = s_nr_buf[ 4]; w1[1] = s_nr_buf[ 5]; w1[2] = s_nr_buf[ 6]; w1[3] = s_nr_buf[ 7]; w2[0] = s_nr_buf[ 8]; w2[1] = s_nr_buf[ 9]; w2[2] = s_nr_buf[10]; w2[3] = s_nr_buf[11]; w3[0] = s_nr_buf[12]; w3[1] = s_nr_buf[13]; w3[2] = 0; w3[3] = (64 + nr_len) * 8; u32x digest[5]; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); w0[0] = digest[0]; w0[1] = digest[1]; w0[2] = digest[2]; w0[3] = digest[3]; w1[0] = digest[4]; 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 left; int off; for (left = ikepsk_bufs[digests_offset].msg_len, off = 0; left >= 56; left -= 64, off += 16) { w0[0] = s_msg_buf[off + 0]; w0[1] = s_msg_buf[off + 1]; w0[2] = s_msg_buf[off + 2]; w0[3] = s_msg_buf[off + 3]; w1[0] = s_msg_buf[off + 4]; w1[1] = s_msg_buf[off + 5]; w1[2] = s_msg_buf[off + 6]; w1[3] = s_msg_buf[off + 7]; w2[0] = s_msg_buf[off + 8]; w2[1] = s_msg_buf[off + 9]; w2[2] = s_msg_buf[off + 10]; w2[3] = s_msg_buf[off + 11]; w3[0] = s_msg_buf[off + 12]; w3[1] = s_msg_buf[off + 13]; w3[2] = s_msg_buf[off + 14]; w3[3] = s_msg_buf[off + 15]; sha1_transform_vector (w0, w1, w2, w3, ipad); } w0[0] = s_msg_buf[off + 0]; w0[1] = s_msg_buf[off + 1]; w0[2] = s_msg_buf[off + 2]; w0[3] = s_msg_buf[off + 3]; w1[0] = s_msg_buf[off + 4]; w1[1] = s_msg_buf[off + 5]; w1[2] = s_msg_buf[off + 6]; w1[3] = s_msg_buf[off + 7]; w2[0] = s_msg_buf[off + 8]; w2[1] = s_msg_buf[off + 9]; w2[2] = s_msg_buf[off + 10]; w2[3] = s_msg_buf[off + 11]; w3[0] = s_msg_buf[off + 12]; w3[1] = s_msg_buf[off + 13]; w3[2] = 0; w3[3] = (64 + msg_len) * 8; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m05400_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05400_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05400_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = swap32_S (ikepsk_bufs[digests_offset].nr_buf[i]); } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = swap32_S (ikepsk_bufs[digests_offset].msg_buf[i]); } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ const u32 nr_len = ikepsk_bufs[digests_offset].nr_len; const u32 msg_len = ikepsk_bufs[digests_offset].msg_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * pads */ w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); u32x ipad[5]; u32x opad[5]; hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); w0[0] = s_nr_buf[ 0]; w0[1] = s_nr_buf[ 1]; w0[2] = s_nr_buf[ 2]; w0[3] = s_nr_buf[ 3]; w1[0] = s_nr_buf[ 4]; w1[1] = s_nr_buf[ 5]; w1[2] = s_nr_buf[ 6]; w1[3] = s_nr_buf[ 7]; w2[0] = s_nr_buf[ 8]; w2[1] = s_nr_buf[ 9]; w2[2] = s_nr_buf[10]; w2[3] = s_nr_buf[11]; w3[0] = s_nr_buf[12]; w3[1] = s_nr_buf[13]; w3[2] = 0; w3[3] = (64 + nr_len) * 8; u32x digest[5]; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); w0[0] = digest[0]; w0[1] = digest[1]; w0[2] = digest[2]; w0[3] = digest[3]; w1[0] = digest[4]; 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 left; int off; for (left = ikepsk_bufs[digests_offset].msg_len, off = 0; left >= 56; left -= 64, off += 16) { w0[0] = s_msg_buf[off + 0]; w0[1] = s_msg_buf[off + 1]; w0[2] = s_msg_buf[off + 2]; w0[3] = s_msg_buf[off + 3]; w1[0] = s_msg_buf[off + 4]; w1[1] = s_msg_buf[off + 5]; w1[2] = s_msg_buf[off + 6]; w1[3] = s_msg_buf[off + 7]; w2[0] = s_msg_buf[off + 8]; w2[1] = s_msg_buf[off + 9]; w2[2] = s_msg_buf[off + 10]; w2[3] = s_msg_buf[off + 11]; w3[0] = s_msg_buf[off + 12]; w3[1] = s_msg_buf[off + 13]; w3[2] = s_msg_buf[off + 14]; w3[3] = s_msg_buf[off + 15]; sha1_transform_vector (w0, w1, w2, w3, ipad); } w0[0] = s_msg_buf[off + 0]; w0[1] = s_msg_buf[off + 1]; w0[2] = s_msg_buf[off + 2]; w0[3] = s_msg_buf[off + 3]; w1[0] = s_msg_buf[off + 4]; w1[1] = s_msg_buf[off + 5]; w1[2] = s_msg_buf[off + 6]; w1[3] = s_msg_buf[off + 7]; w2[0] = s_msg_buf[off + 8]; w2[1] = s_msg_buf[off + 9]; w2[2] = s_msg_buf[off + 10]; w2[3] = s_msg_buf[off + 11]; w3[0] = s_msg_buf[off + 12]; w3[1] = s_msg_buf[off + 13]; w3[2] = 0; w3[3] = (64 + msg_len) * 8; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m05400_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05400_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m05400_a1.cl000066400000000000000000000141771320027462700160120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m05400_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (pws[gid].i[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = swap32_S (combs_buf[il_pos].i[idx]); } switch_buffer_by_offset_1x64_be_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } sha1_hmac_ctx_t ctx0; sha1_hmac_init (&ctx0, c, pw_len + comb_len); sha1_hmac_update_global_swap (&ctx0, ikepsk_bufs[digests_offset].nr_buf, ikepsk_bufs[digests_offset].nr_len); sha1_hmac_final (&ctx0); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[3]; w1[0] = ctx0.opad.h[4]; 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; sha1_hmac_ctx_t ctx; sha1_hmac_init_64 (&ctx, w0, w1, w2, w3); sha1_hmac_update_global_swap (&ctx, ikepsk_bufs[digests_offset].msg_buf, ikepsk_bufs[digests_offset].msg_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m05400_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (pws[gid].i[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = swap32_S (combs_buf[il_pos].i[idx]); } switch_buffer_by_offset_1x64_be_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } sha1_hmac_ctx_t ctx0; sha1_hmac_init (&ctx0, c, pw_len + comb_len); sha1_hmac_update_global_swap (&ctx0, ikepsk_bufs[digests_offset].nr_buf, ikepsk_bufs[digests_offset].nr_len); sha1_hmac_final (&ctx0); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[3]; w1[0] = ctx0.opad.h[4]; 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; sha1_hmac_ctx_t ctx; sha1_hmac_init_64 (&ctx, w0, w1, w2, w3); sha1_hmac_update_global_swap (&ctx, ikepsk_bufs[digests_offset].msg_buf, ikepsk_bufs[digests_offset].msg_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m05400_a3-optimized.cl000066400000000000000000000642231320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } void m05400m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *s_msg_buf, __local u32 *s_nr_buf) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 nr_len = ikepsk_bufs[digests_offset].nr_len; const u32 msg_len = ikepsk_bufs[digests_offset].msg_len; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * pads */ u32x ipad[5]; u32x opad[5]; hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); w0_t[0] = s_nr_buf[ 0]; w0_t[1] = s_nr_buf[ 1]; w0_t[2] = s_nr_buf[ 2]; w0_t[3] = s_nr_buf[ 3]; w1_t[0] = s_nr_buf[ 4]; w1_t[1] = s_nr_buf[ 5]; w1_t[2] = s_nr_buf[ 6]; w1_t[3] = s_nr_buf[ 7]; w2_t[0] = s_nr_buf[ 8]; w2_t[1] = s_nr_buf[ 9]; w2_t[2] = s_nr_buf[10]; w2_t[3] = s_nr_buf[11]; w3_t[0] = s_nr_buf[12]; w3_t[1] = s_nr_buf[13]; 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[digests_offset].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_vector (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); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } void m05400s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *s_msg_buf, __local u32 *s_nr_buf) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 nr_len = ikepsk_bufs[digests_offset].nr_len; const u32 msg_len = ikepsk_bufs[digests_offset].msg_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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * pads */ u32x ipad[5]; u32x opad[5]; hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); w0_t[0] = s_nr_buf[ 0]; w0_t[1] = s_nr_buf[ 1]; w0_t[2] = s_nr_buf[ 2]; w0_t[3] = s_nr_buf[ 3]; w1_t[0] = s_nr_buf[ 4]; w1_t[1] = s_nr_buf[ 5]; w1_t[2] = s_nr_buf[ 6]; w1_t[3] = s_nr_buf[ 7]; w2_t[0] = s_nr_buf[ 8]; w2_t[1] = s_nr_buf[ 9]; w2_t[2] = s_nr_buf[10]; w2_t[3] = s_nr_buf[11]; w3_t[0] = s_nr_buf[12]; w3_t[1] = s_nr_buf[13]; 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[digests_offset].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_vector (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); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m05400_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = swap32_S (ikepsk_bufs[digests_offset].nr_buf[i]); } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = swap32_S (ikepsk_bufs[digests_offset].msg_buf[i]); } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_msg_buf, s_nr_buf); } __kernel void m05400_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = swap32_S (ikepsk_bufs[digests_offset].nr_buf[i]); } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = swap32_S (ikepsk_bufs[digests_offset].msg_buf[i]); } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_msg_buf, s_nr_buf); } __kernel void m05400_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = swap32_S (ikepsk_bufs[digests_offset].nr_buf[i]); } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = swap32_S (ikepsk_bufs[digests_offset].msg_buf[i]); } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_msg_buf, s_nr_buf); } __kernel void m05400_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = swap32_S (ikepsk_bufs[digests_offset].nr_buf[i]); } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = swap32_S (ikepsk_bufs[digests_offset].msg_buf[i]); } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_msg_buf, s_nr_buf); } __kernel void m05400_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = swap32_S (ikepsk_bufs[digests_offset].nr_buf[i]); } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = swap32_S (ikepsk_bufs[digests_offset].msg_buf[i]); } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_msg_buf, s_nr_buf); } __kernel void m05400_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_msg */ __local u32 s_nr_buf[16]; for (u32 i = lid; i < 16; i += lsz) { s_nr_buf[i] = swap32_S (ikepsk_bufs[digests_offset].nr_buf[i]); } __local u32 s_msg_buf[128]; for (u32 i = lid; i < 128; i += lsz) { s_msg_buf[i] = swap32_S (ikepsk_bufs[digests_offset].msg_buf[i]); } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_msg_buf, s_nr_buf); } hashcat-4.0.1/OpenCL/m05400_a3.cl000066400000000000000000000131651320027462700160100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m05400_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; sha1_hmac_ctx_t ctx0; sha1_hmac_init (&ctx0, w, pw_len); sha1_hmac_update_global_swap (&ctx0, ikepsk_bufs[digests_offset].nr_buf, ikepsk_bufs[digests_offset].nr_len); sha1_hmac_final (&ctx0); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[3]; w1[0] = ctx0.opad.h[4]; 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; sha1_hmac_ctx_t ctx; sha1_hmac_init_64 (&ctx, w0, w1, w2, w3); sha1_hmac_update_global_swap (&ctx, ikepsk_bufs[digests_offset].msg_buf, ikepsk_bufs[digests_offset].msg_len); sha1_hmac_final (&ctx); const u32x r0 = ctx.opad.h[DGST_R0]; const u32x r1 = ctx.opad.h[DGST_R1]; const u32x r2 = ctx.opad.h[DGST_R2]; const u32x r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m05400_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; sha1_hmac_ctx_t ctx0; sha1_hmac_init (&ctx0, w, pw_len); sha1_hmac_update_global_swap (&ctx0, ikepsk_bufs[digests_offset].nr_buf, ikepsk_bufs[digests_offset].nr_len); sha1_hmac_final (&ctx0); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[3]; w1[0] = ctx0.opad.h[4]; 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; sha1_hmac_ctx_t ctx; sha1_hmac_init_64 (&ctx, w0, w1, w2, w3); sha1_hmac_update_global_swap (&ctx, ikepsk_bufs[digests_offset].msg_buf, ikepsk_bufs[digests_offset].msg_len); sha1_hmac_final (&ctx); const u32x r0 = ctx.opad.h[DGST_R0]; const u32x r1 = ctx.opad.h[DGST_R1]; const u32x r2 = ctx.opad.h[DGST_R2]; const u32x r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m05500_a0-optimized.cl000066400000000000000000001106251320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64]) { u32x r = data[0]; u32x l = data[1]; #ifdef _unroll #pragma unroll #endif 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 ^= 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); u = Kc[i + 1] ^ rotl32 (l, 30u); t = Kd[i + 1] ^ rotl32 (l, 26u); 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); } iv[0] = l; iv[1] = r; } void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[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; #ifdef _unroll #pragma unroll #endif 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); Kc[i] = ((t << 16) | (s & 0x0000ffff)); Kd[i] = ((s >> 16) | (t & 0xffff0000)); } } 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); } __kernel void m05500_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 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]; u32 data[2]; data[0] = s0; data[1] = s1; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; make_utf16le (w0, w0_t, w1_t); make_utf16le (w1, w2_t, w3_t); w3_t[2] = out_len * 8 * 2; w3_t[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_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 (MATCHES_NONE_VS (((d + MD4M_D) >> 16), s2)) 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 data[2]; data[0] = s0; data[1] = s1; 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 */ COMPARE_M_SIMD (iv1[0], iv1[1], iv2[0], iv2[1]); } } __kernel void m05500_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05500_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05500_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 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]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; make_utf16le (w0, w0_t, w1_t); make_utf16le (w1, w2_t, w3_t); w3_t[2] = out_len * 8 * 2; w3_t[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_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 (MATCHES_NONE_VS (((d + MD4M_D) >> 16), s2)) 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 data[2]; data[0] = s0; data[1] = s1; 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 */ COMPARE_S_SIMD (iv1[0], iv1[1], iv2[0], iv2[1]); } } __kernel void m05500_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05500_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m05500_a0.cl000066400000000000000000000627731320027462700160170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md4.cl" #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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif void _des_crypt_encrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 (*s_SPtrans)[64]) { u32 r = data[0]; u32 l = data[1]; #ifdef _unroll #pragma unroll #endif for (u32 i = 0; i < 16; i += 2) { u32 u; u32 t; u = Kc[i + 0] ^ rotl32 (r, 30u); t = Kd[i + 0] ^ rotl32 (r, 26u); 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); u = Kc[i + 1] ^ rotl32 (l, 30u); t = Kd[i + 1] ^ rotl32 (l, 26u); 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); } iv[0] = l; iv[1] = r; } void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 (*s_skb)[64]) { u32 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; #ifdef _unroll #pragma unroll #endif 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 u32 c00 = (c >> 0) & 0x0000003f; const u32 c06 = (c >> 6) & 0x00383003; const u32 c07 = (c >> 7) & 0x0000003c; const u32 c13 = (c >> 13) & 0x0000060f; const u32 c20 = (c >> 20) & 0x00000001; u32 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 u32 d00 = (d >> 0) & 0x00003c3f; const u32 d07 = (d >> 7) & 0x00003f03; const u32 d21 = (d >> 21) & 0x0000000f; const u32 d22 = (d >> 22) & 0x00000030; u32 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)); } } void transform_netntlmv1_key (const u32 w0, const u32 w1, u32 out[2]) { u32 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; u32 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); } __kernel void m05500_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } 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]; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md4_ctx_t ctx; md4_init (&ctx); md4_update_utf16le (&ctx, tmp.i, tmp.pw_len); md4_final (&ctx); const u32 a = ctx.h[0]; const u32 b = ctx.h[1]; const u32 c = ctx.h[2]; const u32 d = ctx.h[3]; if ((d >> 16) != s2) continue; /** * DES1 */ u32 key[2]; transform_netntlmv1_key (a, b, key); u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); u32 data[2]; data[0] = s0; data[1] = s1; u32 out1[2]; _des_crypt_encrypt (out1, 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); u32 out2[2]; _des_crypt_encrypt (out2, data, Kc, Kd, s_SPtrans); const u32 r0 = out1[0]; const u32 r1 = out1[1]; const u32 r2 = out2[0]; const u32 r3 = out2[1]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m05500_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } 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] }; /** * 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]; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md4_ctx_t ctx; md4_init (&ctx); md4_update_utf16le (&ctx, tmp.i, tmp.pw_len); md4_final (&ctx); const u32 a = ctx.h[0]; const u32 b = ctx.h[1]; const u32 c = ctx.h[2]; const u32 d = ctx.h[3]; if ((d >> 16) != s2) continue; /** * DES1 */ u32 key[2]; transform_netntlmv1_key (a, b, key); u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); u32 data[2]; data[0] = s0; data[1] = s1; u32 out1[2]; _des_crypt_encrypt (out1, 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); u32 out2[2]; _des_crypt_encrypt (out2, data, Kc, Kd, s_SPtrans); */ const u32 r0 = out1[0]; const u32 r1 = out1[1]; const u32 r2 = search[2]; const u32 r3 = search[3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m05500_a1-optimized.cl000066400000000000000000001171331320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64]) { u32x r = data[0]; u32x l = data[1]; #ifdef _unroll #pragma unroll #endif 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 ^= 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); u = Kc[i + 1] ^ rotl32 (l, 30u); t = Kd[i + 1] ^ rotl32 (l, 26u); 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); } iv[0] = l; iv[1] = r; } void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[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; #ifdef _unroll #pragma unroll #endif 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); Kc[i] = ((t << 16) | (s & 0x0000ffff)); Kd[i] = ((s >> 16) | (t & 0xffff0000)); } } 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); } __kernel void m05500_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * 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]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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_utf16le (w0, w0_t, w1_t); make_utf16le (w1, w2_t, w3_t); w3_t[2] = pw_len * 8 * 2; w3_t[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_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 (MATCHES_NONE_VS (((d + MD4M_D) >> 16), s2)) 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 data[2]; data[0] = s0; data[1] = s1; 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 */ COMPARE_M_SIMD (iv1[0], iv1[1], iv2[0], iv2[1]); } } __kernel void m05500_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05500_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05500_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * 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]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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_utf16le (w0, w0_t, w1_t); make_utf16le (w1, w2_t, w3_t); w3_t[2] = pw_len * 8 * 2; w3_t[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_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 (MATCHES_NONE_VS (((d + MD4M_D) >> 16), s2)) 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 data[2]; data[0] = s0; data[1] = s1; 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 */ COMPARE_S_SIMD (iv1[0], iv1[1], iv2[0], iv2[1]); } } __kernel void m05500_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05500_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m05500_a1.cl000066400000000000000000000627241320027462700160140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md4.cl" #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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif void _des_crypt_encrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 (*s_SPtrans)[64]) { u32 r = data[0]; u32 l = data[1]; #ifdef _unroll #pragma unroll #endif for (u32 i = 0; i < 16; i += 2) { u32 u; u32 t; u = Kc[i + 0] ^ rotl32 (r, 30u); t = Kd[i + 0] ^ rotl32 (r, 26u); 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); u = Kc[i + 1] ^ rotl32 (l, 30u); t = Kd[i + 1] ^ rotl32 (l, 26u); 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); } iv[0] = l; iv[1] = r; } void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 (*s_skb)[64]) { u32 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; #ifdef _unroll #pragma unroll #endif 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 u32 c00 = (c >> 0) & 0x0000003f; const u32 c06 = (c >> 6) & 0x00383003; const u32 c07 = (c >> 7) & 0x0000003c; const u32 c13 = (c >> 13) & 0x0000060f; const u32 c20 = (c >> 20) & 0x00000001; u32 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 u32 d00 = (d >> 0) & 0x00003c3f; const u32 d07 = (d >> 7) & 0x00003f03; const u32 d21 = (d >> 21) & 0x0000000f; const u32 d22 = (d >> 22) & 0x00000030; u32 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)); } } void transform_netntlmv1_key (const u32 w0, const u32 w1, u32 out[2]) { u32 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; u32 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); } __kernel void m05500_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } 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]; /** * base */ md4_ctx_t ctx0; md4_init (&ctx0); md4_update_global_utf16le (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md4_ctx_t ctx = ctx0; md4_update_global_utf16le (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md4_final (&ctx); const u32 a = ctx.h[0]; const u32 b = ctx.h[1]; const u32 c = ctx.h[2]; const u32 d = ctx.h[3]; if ((d >> 16) != s2) continue; /** * DES1 */ u32 key[2]; transform_netntlmv1_key (a, b, key); u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); u32 data[2]; data[0] = s0; data[1] = s1; u32 out1[2]; _des_crypt_encrypt (out1, 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); u32 out2[2]; _des_crypt_encrypt (out2, data, Kc, Kd, s_SPtrans); const u32 r0 = out1[0]; const u32 r1 = out1[1]; const u32 r2 = out2[0]; const u32 r3 = out2[1]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m05500_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } 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] }; /** * 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]; /** * base */ md4_ctx_t ctx0; md4_init (&ctx0); md4_update_global_utf16le (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md4_ctx_t ctx = ctx0; md4_update_global_utf16le (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md4_final (&ctx); const u32 a = ctx.h[0]; const u32 b = ctx.h[1]; const u32 c = ctx.h[2]; const u32 d = ctx.h[3]; if ((d >> 16) != s2) continue; /** * DES1 */ u32 key[2]; transform_netntlmv1_key (a, b, key); u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); u32 data[2]; data[0] = s0; data[1] = s1; u32 out1[2]; _des_crypt_encrypt (out1, 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); u32 out2[2]; _des_crypt_encrypt (out2, data, Kc, Kd, s_SPtrans); */ const u32 r0 = out1[0]; const u32 r1 = out1[1]; const u32 r2 = search[2]; const u32 r3 = search[3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m05500_a3-optimized.cl000066400000000000000000001265631320027462700200220ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64]) { u32x r = data[0]; u32x l = data[1]; #ifdef _unroll #pragma unroll #endif 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 ^= 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); u = Kc[i + 1] ^ rotl32 (l, 30u); t = Kd[i + 1] ^ rotl32 (l, 26u); 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); } iv[0] = l; iv[1] = r; } void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[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; #ifdef _unroll #pragma unroll #endif 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); Kc[i] = ((t << 16) | (s & 0x0000ffff)); Kd[i] = ((s >> 16) | (t & 0xffff0000)); } } 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); } void m05500m (__local u32 (*s_SPtrans)[64], __local u32 (*s_skb)[64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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]; /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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]; 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 (MATCHES_NONE_VS (((d + MD4M_D) >> 16), s2)) 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 data[2]; data[0] = s0; data[1] = s1; 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 */ COMPARE_M_SIMD (iv1[0], iv1[1], iv2[0], iv2[1]); } } void m05500s (__local u32 (*s_SPtrans)[64], __local u32 (*s_skb)[64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_buf[digests_offset].digest_buf[DGST_R1], digests_buf[digests_offset].digest_buf[DGST_R2], digests_buf[digests_offset].digest_buf[DGST_R3] }; /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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]; 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 (MATCHES_NONE_VS (((d + MD4M_D) >> 16), s2)) 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 data[2]; data[0] = s0; data[1] = s1; 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 */ COMPARE_S_SIMD (iv1[0], iv1[1], iv2[0], iv2[1]); } } __kernel void m05500_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m05500_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m05500_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05500_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m05500_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m05500_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m05500_a3.cl000066400000000000000000000636431320027462700160170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md4.cl" #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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64]) { u32x r = data[0]; u32x l = data[1]; #ifdef _unroll #pragma unroll #endif 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 ^= 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); u = Kc[i + 1] ^ rotl32 (l, 30u); t = Kd[i + 1] ^ rotl32 (l, 26u); 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); } iv[0] = l; iv[1] = r; } void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[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; #ifdef _unroll #pragma unroll #endif 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); Kc[i] = ((t << 16) | (s & 0x0000ffff)); Kd[i] = ((s >> 16) | (t & 0xffff0000)); } } 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); } __kernel void m05500_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } 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]; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md4_ctx_vector_t ctx; md4_init_vector (&ctx); md4_update_vector_utf16le (&ctx, w, pw_len); md4_final_vector (&ctx); const u32x a = ctx.h[0]; const u32x b = ctx.h[1]; const u32x c = ctx.h[2]; const u32x d = ctx.h[3]; if (MATCHES_NONE_VS ((d >> 16), s2)) continue; /** * 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 data[2]; data[0] = s0; data[1] = s1; u32x out1[2]; _des_crypt_encrypt (out1, 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 out2[2]; _des_crypt_encrypt (out2, data, Kc, Kd, s_SPtrans); const u32x r0 = out1[0]; const u32x r1 = out1[1]; const u32x r2 = out2[0]; const u32x r3 = out2[1]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m05500_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } 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] }; /** * 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]; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md4_ctx_vector_t ctx; md4_init_vector (&ctx); md4_update_vector_utf16le (&ctx, w, pw_len); md4_final_vector (&ctx); const u32x a = ctx.h[0]; const u32x b = ctx.h[1]; const u32x c = ctx.h[2]; const u32x d = ctx.h[3]; if (MATCHES_NONE_VS ((d >> 16), s2)) continue; /** * 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 data[2]; data[0] = s0; data[1] = s1; u32x out1[2]; _des_crypt_encrypt (out1, 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 out2[2]; _des_crypt_encrypt (out2, data, Kc, Kd, s_SPtrans); */ const u32x r0 = out1[0]; const u32x r1 = out1[1]; const u32x r2 = search[2]; const u32x r3 = search[3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m05600_a0-optimized.cl000066400000000000000000000502701320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m05600_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * salt */ __local u32 s_userdomain_buf[64]; for (u32 i = lid; i < 64; i += lsz) { s_userdomain_buf[i] = netntlm_bufs[digests_offset].userdomain_buf[i]; } __local u32 s_chall_buf[256]; for (u32 i = lid; i < 256; i += lsz) { s_chall_buf[i] = netntlm_bufs[digests_offset].chall_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; const u32 userdomain_len = netntlm_bufs[digests_offset].user_len + netntlm_bufs[digests_offset].domain_len; const u32 chall_len = netntlm_bufs[digests_offset].srvchall_len + netntlm_bufs[digests_offset].clichall_len; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; make_utf16le (w0, w0_t, w1_t); make_utf16le (w1, w2_t, w3_t); w3_t[2] = out_len * 8 * 2; w3_t[3] = 0; u32x digest[4]; digest[0] = MD4M_A; digest[1] = MD4M_B; digest[2] = MD4M_C; digest[3] = MD4M_D; md4_transform_vector (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_vector (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_vector (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); COMPARE_M_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m05600_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05600_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05600_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * salt */ __local u32 s_userdomain_buf[64]; for (u32 i = lid; i < 64; i += lsz) { s_userdomain_buf[i] = netntlm_bufs[digests_offset].userdomain_buf[i]; } __local u32 s_chall_buf[256]; for (u32 i = lid; i < 256; i += lsz) { s_chall_buf[i] = netntlm_bufs[digests_offset].chall_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; const u32 userdomain_len = netntlm_bufs[digests_offset].user_len + netntlm_bufs[digests_offset].domain_len; const u32 chall_len = netntlm_bufs[digests_offset].srvchall_len + netntlm_bufs[digests_offset].clichall_len; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; make_utf16le (w0, w0_t, w1_t); make_utf16le (w1, w2_t, w3_t); w3_t[2] = out_len * 8 * 2; w3_t[3] = 0; u32x digest[4]; digest[0] = MD4M_A; digest[1] = MD4M_B; digest[2] = MD4M_C; digest[3] = MD4M_D; md4_transform_vector (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_vector (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_vector (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); COMPARE_S_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m05600_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05600_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m05600_a0.cl000066400000000000000000000144161320027462700160070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" __kernel void m05600_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md4_ctx_t ctx1; md4_init (&ctx1); md4_update_utf16le (&ctx1, tmp.i, tmp.pw_len); md4_final (&ctx1); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx1.h[0]; w0[1] = ctx1.h[1]; w0[2] = ctx1.h[2]; w0[3] = ctx1.h[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; md5_hmac_ctx_t ctx0; md5_hmac_init_64 (&ctx0, w0, w1, w2, w3); md5_hmac_update_global (&ctx0, netntlm_bufs[digests_offset].userdomain_buf, netntlm_bufs[digests_offset].user_len + netntlm_bufs[digests_offset].domain_len); md5_hmac_final (&ctx0); w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); md5_hmac_update_global (&ctx, netntlm_bufs[digests_offset].chall_buf, netntlm_bufs[digests_offset].srvchall_len + netntlm_bufs[digests_offset].clichall_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m05600_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md4_ctx_t ctx1; md4_init (&ctx1); md4_update_utf16le (&ctx1, tmp.i, tmp.pw_len); md4_final (&ctx1); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx1.h[0]; w0[1] = ctx1.h[1]; w0[2] = ctx1.h[2]; w0[3] = ctx1.h[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; md5_hmac_ctx_t ctx0; md5_hmac_init_64 (&ctx0, w0, w1, w2, w3); md5_hmac_update_global (&ctx0, netntlm_bufs[digests_offset].userdomain_buf, netntlm_bufs[digests_offset].user_len + netntlm_bufs[digests_offset].domain_len); md5_hmac_final (&ctx0); w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); md5_hmac_update_global (&ctx, netntlm_bufs[digests_offset].chall_buf, netntlm_bufs[digests_offset].srvchall_len + netntlm_bufs[digests_offset].clichall_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m05600_a1-optimized.cl000066400000000000000000000566571320027462700200270ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m05600_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * salt */ __local u32 s_userdomain_buf[64]; for (u32 i = lid; i < 64; i += lsz) { s_userdomain_buf[i] = netntlm_bufs[digests_offset].userdomain_buf[i]; } __local u32 s_chall_buf[256]; for (u32 i = lid; i < 256; i += lsz) { s_chall_buf[i] = netntlm_bufs[digests_offset].chall_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; const u32 userdomain_len = netntlm_bufs[digests_offset].user_len + netntlm_bufs[digests_offset].domain_len; const u32 chall_len = netntlm_bufs[digests_offset].srvchall_len + netntlm_bufs[digests_offset].clichall_len; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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_utf16le (w0, w0_t, w1_t); make_utf16le (w1, w2_t, w3_t); w3_t[2] = pw_len * 8 * 2; w3_t[3] = 0; u32x digest[4]; digest[0] = MD4M_A; digest[1] = MD4M_B; digest[2] = MD4M_C; digest[3] = MD4M_D; md4_transform_vector (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_vector (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_vector (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); COMPARE_M_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m05600_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05600_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05600_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * salt */ __local u32 s_userdomain_buf[64]; for (u32 i = lid; i < 64; i += lsz) { s_userdomain_buf[i] = netntlm_bufs[digests_offset].userdomain_buf[i]; } __local u32 s_chall_buf[256]; for (u32 i = lid; i < 256; i += lsz) { s_chall_buf[i] = netntlm_bufs[digests_offset].chall_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; const u32 userdomain_len = netntlm_bufs[digests_offset].user_len + netntlm_bufs[digests_offset].domain_len; const u32 chall_len = netntlm_bufs[digests_offset].srvchall_len + netntlm_bufs[digests_offset].clichall_len; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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_utf16le (w0, w0_t, w1_t); make_utf16le (w1, w2_t, w3_t); w3_t[2] = pw_len * 8 * 2; w3_t[3] = 0; u32x digest[4]; digest[0] = MD4M_A; digest[1] = MD4M_B; digest[2] = MD4M_C; digest[3] = MD4M_D; md4_transform_vector (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_vector (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_vector (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); COMPARE_S_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m05600_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05600_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m05600_a1.cl000066400000000000000000000143551320027462700160120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" __kernel void m05600_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ md4_ctx_t ctx10; md4_init (&ctx10); md4_update_global_utf16le (&ctx10, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md4_ctx_t ctx1 = ctx10; md4_update_global_utf16le (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md4_final (&ctx1); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx1.h[0]; w0[1] = ctx1.h[1]; w0[2] = ctx1.h[2]; w0[3] = ctx1.h[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; md5_hmac_ctx_t ctx0; md5_hmac_init_64 (&ctx0, w0, w1, w2, w3); md5_hmac_update_global (&ctx0, netntlm_bufs[digests_offset].userdomain_buf, netntlm_bufs[digests_offset].user_len + netntlm_bufs[digests_offset].domain_len); md5_hmac_final (&ctx0); w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); md5_hmac_update_global (&ctx, netntlm_bufs[digests_offset].chall_buf, netntlm_bufs[digests_offset].srvchall_len + netntlm_bufs[digests_offset].clichall_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m05600_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ md4_ctx_t ctx10; md4_init (&ctx10); md4_update_global_utf16le (&ctx10, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md4_ctx_t ctx1 = ctx10; md4_update_global_utf16le (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md4_final (&ctx1); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx1.h[0]; w0[1] = ctx1.h[1]; w0[2] = ctx1.h[2]; w0[3] = ctx1.h[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; md5_hmac_ctx_t ctx0; md5_hmac_init_64 (&ctx0, w0, w1, w2, w3); md5_hmac_update_global (&ctx0, netntlm_bufs[digests_offset].userdomain_buf, netntlm_bufs[digests_offset].user_len + netntlm_bufs[digests_offset].domain_len); md5_hmac_final (&ctx0); w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); md5_hmac_update_global (&ctx, netntlm_bufs[digests_offset].chall_buf, netntlm_bufs[digests_offset].srvchall_len + netntlm_bufs[digests_offset].clichall_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m05600_a3-optimized.cl000066400000000000000000000656011320027462700200160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } void m05600m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *s_userdomain_buf, __local u32 *s_chall_buf) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * prepare */ const u32 userdomain_len = netntlm_bufs[digests_offset].user_len + netntlm_bufs[digests_offset].domain_len; const u32 chall_len = netntlm_bufs[digests_offset].srvchall_len + netntlm_bufs[digests_offset].clichall_len; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * pads */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; u32x digest[4]; digest[0] = MD4M_A; digest[1] = MD4M_B; digest[2] = MD4M_C; digest[3] = MD4M_D; md4_transform_vector (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_vector (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_vector (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); COMPARE_M_SIMD (digest[0], digest[3], digest[2], digest[1]); } } void m05600s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *s_userdomain_buf, __local u32 *s_chall_buf) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * prepare */ const u32 userdomain_len = netntlm_bufs[digests_offset].user_len + netntlm_bufs[digests_offset].domain_len; const u32 chall_len = netntlm_bufs[digests_offset].srvchall_len + netntlm_bufs[digests_offset].clichall_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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * pads */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; u32x digest[4]; digest[0] = MD4M_A; digest[1] = MD4M_B; digest[2] = MD4M_C; digest[3] = MD4M_D; md4_transform_vector (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_vector (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_vector (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); COMPARE_S_SIMD (digest[0], digest[3], digest[2], digest[1]); } } __kernel void m05600_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * salt */ __local u32 s_userdomain_buf[64]; for (u32 i = lid; i < 64; i += lsz) { s_userdomain_buf[i] = netntlm_bufs[digests_offset].userdomain_buf[i]; } __local u32 s_chall_buf[256]; for (u32 i = lid; i < 256; i += lsz) { s_chall_buf[i] = netntlm_bufs[digests_offset].chall_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_userdomain_buf, s_chall_buf); } __kernel void m05600_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * salt */ __local u32 s_userdomain_buf[64]; for (u32 i = lid; i < 64; i += lsz) { s_userdomain_buf[i] = netntlm_bufs[digests_offset].userdomain_buf[i]; } __local u32 s_chall_buf[256]; for (u32 i = lid; i < 256; i += lsz) { s_chall_buf[i] = netntlm_bufs[digests_offset].chall_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_userdomain_buf, s_chall_buf); } __kernel void m05600_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m05600_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * salt */ __local u32 s_userdomain_buf[64]; for (u32 i = lid; i < 64; i += lsz) { s_userdomain_buf[i] = netntlm_bufs[digests_offset].userdomain_buf[i]; } __local u32 s_chall_buf[256]; for (u32 i = lid; i < 256; i += lsz) { s_chall_buf[i] = netntlm_bufs[digests_offset].chall_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_userdomain_buf, s_chall_buf); } __kernel void m05600_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * salt */ __local u32 s_userdomain_buf[64]; for (u32 i = lid; i < 64; i += lsz) { s_userdomain_buf[i] = netntlm_bufs[digests_offset].userdomain_buf[i]; } __local u32 s_chall_buf[256]; for (u32 i = lid; i < 256; i += lsz) { s_chall_buf[i] = netntlm_bufs[digests_offset].chall_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_userdomain_buf, s_chall_buf); } __kernel void m05600_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m05600_a3.cl000066400000000000000000000150551320027462700160120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" __kernel void m05600_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = words_buf_r[il_pos / VECT_SIZE]; const u32 w0lr = w0l | w0r; w[0] = w0lr; md4_ctx_t ctx1; md4_init (&ctx1); md4_update_utf16le (&ctx1, w, pw_len); md4_final (&ctx1); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx1.h[0]; w0[1] = ctx1.h[1]; w0[2] = ctx1.h[2]; w0[3] = ctx1.h[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; md5_hmac_ctx_t ctx0; md5_hmac_init_64 (&ctx0, w0, w1, w2, w3); md5_hmac_update_global (&ctx0, netntlm_bufs[digests_offset].userdomain_buf, netntlm_bufs[digests_offset].user_len + netntlm_bufs[digests_offset].domain_len); md5_hmac_final (&ctx0); w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); md5_hmac_update_global (&ctx, netntlm_bufs[digests_offset].chall_buf, netntlm_bufs[digests_offset].srvchall_len + netntlm_bufs[digests_offset].clichall_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m05600_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = words_buf_r[il_pos / VECT_SIZE]; const u32 w0lr = w0l | w0r; w[0] = w0lr; md4_ctx_t ctx1; md4_init (&ctx1); md4_update_utf16le (&ctx1, w, pw_len); md4_final (&ctx1); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = ctx1.h[0]; w0[1] = ctx1.h[1]; w0[2] = ctx1.h[2]; w0[3] = ctx1.h[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; md5_hmac_ctx_t ctx0; md5_hmac_init_64 (&ctx0, w0, w1, w2, w3); md5_hmac_update_global (&ctx0, netntlm_bufs[digests_offset].userdomain_buf, netntlm_bufs[digests_offset].user_len + netntlm_bufs[digests_offset].domain_len); md5_hmac_final (&ctx0); w0[0] = ctx0.opad.h[0]; w0[1] = ctx0.opad.h[1]; w0[2] = ctx0.opad.h[2]; w0[3] = ctx0.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); md5_hmac_update_global (&ctx, netntlm_bufs[digests_offset].chall_buf, netntlm_bufs[digests_offset].srvchall_len + netntlm_bufs[digests_offset].clichall_len); md5_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m05800-optimized.cl000066400000000000000000000744161320027462700174410ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_sha1.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" __constant u32a c_pc_dec[1024] = { 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, 0x00000038, 0x00000039, 0x00003031, 0x00003131, 0x00003231, 0x00003331, 0x00003431, 0x00003531, 0x00003631, 0x00003731, 0x00003831, 0x00003931, 0x00003032, 0x00003132, 0x00003232, 0x00003332, 0x00003432, 0x00003532, 0x00003632, 0x00003732, 0x00003832, 0x00003932, 0x00003033, 0x00003133, 0x00003233, 0x00003333, 0x00003433, 0x00003533, 0x00003633, 0x00003733, 0x00003833, 0x00003933, 0x00003034, 0x00003134, 0x00003234, 0x00003334, 0x00003434, 0x00003534, 0x00003634, 0x00003734, 0x00003834, 0x00003934, 0x00003035, 0x00003135, 0x00003235, 0x00003335, 0x00003435, 0x00003535, 0x00003635, 0x00003735, 0x00003835, 0x00003935, 0x00003036, 0x00003136, 0x00003236, 0x00003336, 0x00003436, 0x00003536, 0x00003636, 0x00003736, 0x00003836, 0x00003936, 0x00003037, 0x00003137, 0x00003237, 0x00003337, 0x00003437, 0x00003537, 0x00003637, 0x00003737, 0x00003837, 0x00003937, 0x00003038, 0x00003138, 0x00003238, 0x00003338, 0x00003438, 0x00003538, 0x00003638, 0x00003738, 0x00003838, 0x00003938, 0x00003039, 0x00003139, 0x00003239, 0x00003339, 0x00003439, 0x00003539, 0x00003639, 0x00003739, 0x00003839, 0x00003939, 0x00303031, 0x00313031, 0x00323031, 0x00333031, 0x00343031, 0x00353031, 0x00363031, 0x00373031, 0x00383031, 0x00393031, 0x00303131, 0x00313131, 0x00323131, 0x00333131, 0x00343131, 0x00353131, 0x00363131, 0x00373131, 0x00383131, 0x00393131, 0x00303231, 0x00313231, 0x00323231, 0x00333231, 0x00343231, 0x00353231, 0x00363231, 0x00373231, 0x00383231, 0x00393231, 0x00303331, 0x00313331, 0x00323331, 0x00333331, 0x00343331, 0x00353331, 0x00363331, 0x00373331, 0x00383331, 0x00393331, 0x00303431, 0x00313431, 0x00323431, 0x00333431, 0x00343431, 0x00353431, 0x00363431, 0x00373431, 0x00383431, 0x00393431, 0x00303531, 0x00313531, 0x00323531, 0x00333531, 0x00343531, 0x00353531, 0x00363531, 0x00373531, 0x00383531, 0x00393531, 0x00303631, 0x00313631, 0x00323631, 0x00333631, 0x00343631, 0x00353631, 0x00363631, 0x00373631, 0x00383631, 0x00393631, 0x00303731, 0x00313731, 0x00323731, 0x00333731, 0x00343731, 0x00353731, 0x00363731, 0x00373731, 0x00383731, 0x00393731, 0x00303831, 0x00313831, 0x00323831, 0x00333831, 0x00343831, 0x00353831, 0x00363831, 0x00373831, 0x00383831, 0x00393831, 0x00303931, 0x00313931, 0x00323931, 0x00333931, 0x00343931, 0x00353931, 0x00363931, 0x00373931, 0x00383931, 0x00393931, 0x00303032, 0x00313032, 0x00323032, 0x00333032, 0x00343032, 0x00353032, 0x00363032, 0x00373032, 0x00383032, 0x00393032, 0x00303132, 0x00313132, 0x00323132, 0x00333132, 0x00343132, 0x00353132, 0x00363132, 0x00373132, 0x00383132, 0x00393132, 0x00303232, 0x00313232, 0x00323232, 0x00333232, 0x00343232, 0x00353232, 0x00363232, 0x00373232, 0x00383232, 0x00393232, 0x00303332, 0x00313332, 0x00323332, 0x00333332, 0x00343332, 0x00353332, 0x00363332, 0x00373332, 0x00383332, 0x00393332, 0x00303432, 0x00313432, 0x00323432, 0x00333432, 0x00343432, 0x00353432, 0x00363432, 0x00373432, 0x00383432, 0x00393432, 0x00303532, 0x00313532, 0x00323532, 0x00333532, 0x00343532, 0x00353532, 0x00363532, 0x00373532, 0x00383532, 0x00393532, 0x00303632, 0x00313632, 0x00323632, 0x00333632, 0x00343632, 0x00353632, 0x00363632, 0x00373632, 0x00383632, 0x00393632, 0x00303732, 0x00313732, 0x00323732, 0x00333732, 0x00343732, 0x00353732, 0x00363732, 0x00373732, 0x00383732, 0x00393732, 0x00303832, 0x00313832, 0x00323832, 0x00333832, 0x00343832, 0x00353832, 0x00363832, 0x00373832, 0x00383832, 0x00393832, 0x00303932, 0x00313932, 0x00323932, 0x00333932, 0x00343932, 0x00353932, 0x00363932, 0x00373932, 0x00383932, 0x00393932, 0x00303033, 0x00313033, 0x00323033, 0x00333033, 0x00343033, 0x00353033, 0x00363033, 0x00373033, 0x00383033, 0x00393033, 0x00303133, 0x00313133, 0x00323133, 0x00333133, 0x00343133, 0x00353133, 0x00363133, 0x00373133, 0x00383133, 0x00393133, 0x00303233, 0x00313233, 0x00323233, 0x00333233, 0x00343233, 0x00353233, 0x00363233, 0x00373233, 0x00383233, 0x00393233, 0x00303333, 0x00313333, 0x00323333, 0x00333333, 0x00343333, 0x00353333, 0x00363333, 0x00373333, 0x00383333, 0x00393333, 0x00303433, 0x00313433, 0x00323433, 0x00333433, 0x00343433, 0x00353433, 0x00363433, 0x00373433, 0x00383433, 0x00393433, 0x00303533, 0x00313533, 0x00323533, 0x00333533, 0x00343533, 0x00353533, 0x00363533, 0x00373533, 0x00383533, 0x00393533, 0x00303633, 0x00313633, 0x00323633, 0x00333633, 0x00343633, 0x00353633, 0x00363633, 0x00373633, 0x00383633, 0x00393633, 0x00303733, 0x00313733, 0x00323733, 0x00333733, 0x00343733, 0x00353733, 0x00363733, 0x00373733, 0x00383733, 0x00393733, 0x00303833, 0x00313833, 0x00323833, 0x00333833, 0x00343833, 0x00353833, 0x00363833, 0x00373833, 0x00383833, 0x00393833, 0x00303933, 0x00313933, 0x00323933, 0x00333933, 0x00343933, 0x00353933, 0x00363933, 0x00373933, 0x00383933, 0x00393933, 0x00303034, 0x00313034, 0x00323034, 0x00333034, 0x00343034, 0x00353034, 0x00363034, 0x00373034, 0x00383034, 0x00393034, 0x00303134, 0x00313134, 0x00323134, 0x00333134, 0x00343134, 0x00353134, 0x00363134, 0x00373134, 0x00383134, 0x00393134, 0x00303234, 0x00313234, 0x00323234, 0x00333234, 0x00343234, 0x00353234, 0x00363234, 0x00373234, 0x00383234, 0x00393234, 0x00303334, 0x00313334, 0x00323334, 0x00333334, 0x00343334, 0x00353334, 0x00363334, 0x00373334, 0x00383334, 0x00393334, 0x00303434, 0x00313434, 0x00323434, 0x00333434, 0x00343434, 0x00353434, 0x00363434, 0x00373434, 0x00383434, 0x00393434, 0x00303534, 0x00313534, 0x00323534, 0x00333534, 0x00343534, 0x00353534, 0x00363534, 0x00373534, 0x00383534, 0x00393534, 0x00303634, 0x00313634, 0x00323634, 0x00333634, 0x00343634, 0x00353634, 0x00363634, 0x00373634, 0x00383634, 0x00393634, 0x00303734, 0x00313734, 0x00323734, 0x00333734, 0x00343734, 0x00353734, 0x00363734, 0x00373734, 0x00383734, 0x00393734, 0x00303834, 0x00313834, 0x00323834, 0x00333834, 0x00343834, 0x00353834, 0x00363834, 0x00373834, 0x00383834, 0x00393834, 0x00303934, 0x00313934, 0x00323934, 0x00333934, 0x00343934, 0x00353934, 0x00363934, 0x00373934, 0x00383934, 0x00393934, 0x00303035, 0x00313035, 0x00323035, 0x00333035, 0x00343035, 0x00353035, 0x00363035, 0x00373035, 0x00383035, 0x00393035, 0x00303135, 0x00313135, 0x00323135, 0x00333135, 0x00343135, 0x00353135, 0x00363135, 0x00373135, 0x00383135, 0x00393135, 0x00303235, 0x00313235, 0x00323235, 0x00333235, 0x00343235, 0x00353235, 0x00363235, 0x00373235, 0x00383235, 0x00393235, 0x00303335, 0x00313335, 0x00323335, 0x00333335, 0x00343335, 0x00353335, 0x00363335, 0x00373335, 0x00383335, 0x00393335, 0x00303435, 0x00313435, 0x00323435, 0x00333435, 0x00343435, 0x00353435, 0x00363435, 0x00373435, 0x00383435, 0x00393435, 0x00303535, 0x00313535, 0x00323535, 0x00333535, 0x00343535, 0x00353535, 0x00363535, 0x00373535, 0x00383535, 0x00393535, 0x00303635, 0x00313635, 0x00323635, 0x00333635, 0x00343635, 0x00353635, 0x00363635, 0x00373635, 0x00383635, 0x00393635, 0x00303735, 0x00313735, 0x00323735, 0x00333735, 0x00343735, 0x00353735, 0x00363735, 0x00373735, 0x00383735, 0x00393735, 0x00303835, 0x00313835, 0x00323835, 0x00333835, 0x00343835, 0x00353835, 0x00363835, 0x00373835, 0x00383835, 0x00393835, 0x00303935, 0x00313935, 0x00323935, 0x00333935, 0x00343935, 0x00353935, 0x00363935, 0x00373935, 0x00383935, 0x00393935, 0x00303036, 0x00313036, 0x00323036, 0x00333036, 0x00343036, 0x00353036, 0x00363036, 0x00373036, 0x00383036, 0x00393036, 0x00303136, 0x00313136, 0x00323136, 0x00333136, 0x00343136, 0x00353136, 0x00363136, 0x00373136, 0x00383136, 0x00393136, 0x00303236, 0x00313236, 0x00323236, 0x00333236, 0x00343236, 0x00353236, 0x00363236, 0x00373236, 0x00383236, 0x00393236, 0x00303336, 0x00313336, 0x00323336, 0x00333336, 0x00343336, 0x00353336, 0x00363336, 0x00373336, 0x00383336, 0x00393336, 0x00303436, 0x00313436, 0x00323436, 0x00333436, 0x00343436, 0x00353436, 0x00363436, 0x00373436, 0x00383436, 0x00393436, 0x00303536, 0x00313536, 0x00323536, 0x00333536, 0x00343536, 0x00353536, 0x00363536, 0x00373536, 0x00383536, 0x00393536, 0x00303636, 0x00313636, 0x00323636, 0x00333636, 0x00343636, 0x00353636, 0x00363636, 0x00373636, 0x00383636, 0x00393636, 0x00303736, 0x00313736, 0x00323736, 0x00333736, 0x00343736, 0x00353736, 0x00363736, 0x00373736, 0x00383736, 0x00393736, 0x00303836, 0x00313836, 0x00323836, 0x00333836, 0x00343836, 0x00353836, 0x00363836, 0x00373836, 0x00383836, 0x00393836, 0x00303936, 0x00313936, 0x00323936, 0x00333936, 0x00343936, 0x00353936, 0x00363936, 0x00373936, 0x00383936, 0x00393936, 0x00303037, 0x00313037, 0x00323037, 0x00333037, 0x00343037, 0x00353037, 0x00363037, 0x00373037, 0x00383037, 0x00393037, 0x00303137, 0x00313137, 0x00323137, 0x00333137, 0x00343137, 0x00353137, 0x00363137, 0x00373137, 0x00383137, 0x00393137, 0x00303237, 0x00313237, 0x00323237, 0x00333237, 0x00343237, 0x00353237, 0x00363237, 0x00373237, 0x00383237, 0x00393237, 0x00303337, 0x00313337, 0x00323337, 0x00333337, 0x00343337, 0x00353337, 0x00363337, 0x00373337, 0x00383337, 0x00393337, 0x00303437, 0x00313437, 0x00323437, 0x00333437, 0x00343437, 0x00353437, 0x00363437, 0x00373437, 0x00383437, 0x00393437, 0x00303537, 0x00313537, 0x00323537, 0x00333537, 0x00343537, 0x00353537, 0x00363537, 0x00373537, 0x00383537, 0x00393537, 0x00303637, 0x00313637, 0x00323637, 0x00333637, 0x00343637, 0x00353637, 0x00363637, 0x00373637, 0x00383637, 0x00393637, 0x00303737, 0x00313737, 0x00323737, 0x00333737, 0x00343737, 0x00353737, 0x00363737, 0x00373737, 0x00383737, 0x00393737, 0x00303837, 0x00313837, 0x00323837, 0x00333837, 0x00343837, 0x00353837, 0x00363837, 0x00373837, 0x00383837, 0x00393837, 0x00303937, 0x00313937, 0x00323937, 0x00333937, 0x00343937, 0x00353937, 0x00363937, 0x00373937, 0x00383937, 0x00393937, 0x00303038, 0x00313038, 0x00323038, 0x00333038, 0x00343038, 0x00353038, 0x00363038, 0x00373038, 0x00383038, 0x00393038, 0x00303138, 0x00313138, 0x00323138, 0x00333138, 0x00343138, 0x00353138, 0x00363138, 0x00373138, 0x00383138, 0x00393138, 0x00303238, 0x00313238, 0x00323238, 0x00333238, 0x00343238, 0x00353238, 0x00363238, 0x00373238, 0x00383238, 0x00393238, 0x00303338, 0x00313338, 0x00323338, 0x00333338, 0x00343338, 0x00353338, 0x00363338, 0x00373338, 0x00383338, 0x00393338, 0x00303438, 0x00313438, 0x00323438, 0x00333438, 0x00343438, 0x00353438, 0x00363438, 0x00373438, 0x00383438, 0x00393438, 0x00303538, 0x00313538, 0x00323538, 0x00333538, 0x00343538, 0x00353538, 0x00363538, 0x00373538, 0x00383538, 0x00393538, 0x00303638, 0x00313638, 0x00323638, 0x00333638, 0x00343638, 0x00353638, 0x00363638, 0x00373638, 0x00383638, 0x00393638, 0x00303738, 0x00313738, 0x00323738, 0x00333738, 0x00343738, 0x00353738, 0x00363738, 0x00373738, 0x00383738, 0x00393738, 0x00303838, 0x00313838, 0x00323838, 0x00333838, 0x00343838, 0x00353838, 0x00363838, 0x00373838, 0x00383838, 0x00393838, 0x00303938, 0x00313938, 0x00323938, 0x00333938, 0x00343938, 0x00353938, 0x00363938, 0x00373938, 0x00383938, 0x00393938, 0x00303039, 0x00313039, 0x00323039, 0x00333039, 0x00343039, 0x00353039, 0x00363039, 0x00373039, 0x00383039, 0x00393039, 0x00303139, 0x00313139, 0x00323139, 0x00333139, 0x00343139, 0x00353139, 0x00363139, 0x00373139, 0x00383139, 0x00393139, 0x00303239, 0x00313239, 0x00323239, 0x00333239, 0x00343239, 0x00353239, 0x00363239, 0x00373239, 0x00383239, 0x00393239, 0x00303339, 0x00313339, 0x00323339, 0x00333339, 0x00343339, 0x00353339, 0x00363339, 0x00373339, 0x00383339, 0x00393339, 0x00303439, 0x00313439, 0x00323439, 0x00333439, 0x00343439, 0x00353439, 0x00363439, 0x00373439, 0x00383439, 0x00393439, 0x00303539, 0x00313539, 0x00323539, 0x00333539, 0x00343539, 0x00353539, 0x00363539, 0x00373539, 0x00383539, 0x00393539, 0x00303639, 0x00313639, 0x00323639, 0x00333639, 0x00343639, 0x00353639, 0x00363639, 0x00373639, 0x00383639, 0x00393639, 0x00303739, 0x00313739, 0x00323739, 0x00333739, 0x00343739, 0x00353739, 0x00363739, 0x00373739, 0x00383739, 0x00393739, 0x00303839, 0x00313839, 0x00323839, 0x00333839, 0x00343839, 0x00353839, 0x00363839, 0x00373839, 0x00383839, 0x00393839, 0x00303939, 0x00313939, 0x00323939, 0x00333939, 0x00343939, 0x00353939, 0x00363939, 0x00373939, 0x00383939, 0x00393939, 0x30303031, 0x31303031, 0x32303031, 0x33303031, 0x34303031, 0x35303031, 0x36303031, 0x37303031, 0x38303031, 0x39303031, 0x30313031, 0x31313031, 0x32313031, 0x33313031, 0x34313031, 0x35313031, 0x36313031, 0x37313031, 0x38313031, 0x39313031, 0x30323031, 0x31323031, 0x32323031, 0x33323031, }; __constant u32a c_pc_len[1024] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }; void append_word (u32 w0[4], u32 w1[4], const u32 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; } } void append_salt (u32 w0[4], u32 w1[4], u32 w2[4], const u32 append[5], const u32 offset) { u32 tmp0; u32 tmp1; u32 tmp2; u32 tmp3; u32 tmp4; u32 tmp5; const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #if defined IS_AMD || defined IS_GENERIC u32 in0 = swap32_S (append[0]); u32 in1 = swap32_S (append[1]); u32 in2 = swap32_S (append[2]); u32 in3 = swap32_S (append[3]); u32 in4 = swap32_S (append[4]); tmp0 = amd_bytealign ( 0, in0, offset); tmp1 = amd_bytealign (in0, in1, offset); tmp2 = amd_bytealign (in1, in2, offset); tmp3 = amd_bytealign (in2, in3, offset); tmp4 = amd_bytealign (in3, in4, offset); tmp5 = amd_bytealign (in4, 0, offset); tmp0 = swap32_S (tmp0); tmp1 = swap32_S (tmp1); tmp2 = swap32_S (tmp2); tmp3 = swap32_S (tmp3); tmp4 = swap32_S (tmp4); tmp5 = swap32_S (tmp5); #endif #ifdef IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; u32 in0 = append[0]; u32 in1 = append[1]; u32 in2 = append[2]; u32 in3 = append[3]; u32 in4 = append[4]; tmp0 = __byte_perm ( 0, in0, selector); tmp1 = __byte_perm (in0, in1, selector); tmp2 = __byte_perm (in1, in2, selector); tmp3 = __byte_perm (in2, in3, selector); tmp4 = __byte_perm (in3, in4, selector); tmp5 = __byte_perm (in4, 0, selector); #endif const u32 div = offset / 4; switch (div) { case 0: w0[0] |= tmp0; w0[1] = tmp1; w0[2] = tmp2; w0[3] = tmp3; w1[0] = tmp4; w1[1] = tmp5; break; case 1: w0[1] |= tmp0; w0[2] = tmp1; w0[3] = tmp2; w1[0] = tmp3; w1[1] = tmp4; w1[2] = tmp5; break; case 2: w0[2] |= tmp0; w0[3] = tmp1; w1[0] = tmp2; w1[1] = tmp3; w1[2] = tmp4; w1[3] = tmp5; break; case 3: w0[3] |= tmp0; w1[0] = tmp1; w1[1] = tmp2; w1[2] = tmp3; w1[3] = tmp4; w2[0] = tmp5; break; case 4: w1[0] |= tmp0; w1[1] = tmp1; w1[2] = tmp2; w1[3] = tmp3; w2[0] = tmp4; w2[1] = tmp5; break; } } __kernel void m05800_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global androidpin_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 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; u32 data0[4] = { 0, 0, 0, 0 }; u32 data1[4] = { 0, 0, 0, 0 }; u32 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); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = swap32 (data0[0]); w0[1] = swap32 (data0[1]); w0[2] = swap32 (data0[2]); w0[3] = swap32 (data0[3]); w1[0] = swap32 (data1[0]); w1[1] = swap32 (data1[1]); w1[2] = swap32 (data1[2]); w1[3] = swap32 (data1[3]); w2[0] = swap32 (data2[0]); w2[1] = swap32 (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; 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); 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 m05800_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global androidpin_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * cache precomputed conversion table in shared memory */ __local u32 s_pc_dec[1024]; __local u32 s_pc_len[1024]; for (u32 i = lid; i < 1024; i += lsz) { s_pc_dec[i] = c_pc_dec[i]; s_pc_len[i] = c_pc_len[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 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; u32 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]; /** * 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_dec = s_pc_dec[j]; const u32 pc_len = s_pc_len[j]; u32 data0[4] = { 0, 0, 0, 0 }; u32 data1[4] = { 0, 0, 0, 0 }; u32 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); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = digest[0]; w0[1] = digest[1]; w0[2] = digest[2]; w0[3] = digest[3]; w1[0] = digest[4]; w1[1] = swap32 (data0[0]); w1[2] = swap32 (data0[1]); w1[3] = swap32 (data0[2]); w2[0] = swap32 (data0[3]); w2[1] = swap32 (data1[0]); w2[2] = swap32 (data1[1]); w2[3] = swap32 (data1[2]); w3[0] = swap32 (data1[3]); w3[1] = swap32 (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 m05800_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global androidpin_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ const u32 r0 = tmps[gid].digest_buf[DGST_R0]; const u32 r1 = tmps[gid].digest_buf[DGST_R1]; const u32 r2 = tmps[gid].digest_buf[DGST_R2]; const u32 r3 = tmps[gid].digest_buf[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m05800.cl000066400000000000000000000710641320027462700154330ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_sha1.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" __constant u32a c_pc_dec[1024] = { 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, 0x00000038, 0x00000039, 0x00003031, 0x00003131, 0x00003231, 0x00003331, 0x00003431, 0x00003531, 0x00003631, 0x00003731, 0x00003831, 0x00003931, 0x00003032, 0x00003132, 0x00003232, 0x00003332, 0x00003432, 0x00003532, 0x00003632, 0x00003732, 0x00003832, 0x00003932, 0x00003033, 0x00003133, 0x00003233, 0x00003333, 0x00003433, 0x00003533, 0x00003633, 0x00003733, 0x00003833, 0x00003933, 0x00003034, 0x00003134, 0x00003234, 0x00003334, 0x00003434, 0x00003534, 0x00003634, 0x00003734, 0x00003834, 0x00003934, 0x00003035, 0x00003135, 0x00003235, 0x00003335, 0x00003435, 0x00003535, 0x00003635, 0x00003735, 0x00003835, 0x00003935, 0x00003036, 0x00003136, 0x00003236, 0x00003336, 0x00003436, 0x00003536, 0x00003636, 0x00003736, 0x00003836, 0x00003936, 0x00003037, 0x00003137, 0x00003237, 0x00003337, 0x00003437, 0x00003537, 0x00003637, 0x00003737, 0x00003837, 0x00003937, 0x00003038, 0x00003138, 0x00003238, 0x00003338, 0x00003438, 0x00003538, 0x00003638, 0x00003738, 0x00003838, 0x00003938, 0x00003039, 0x00003139, 0x00003239, 0x00003339, 0x00003439, 0x00003539, 0x00003639, 0x00003739, 0x00003839, 0x00003939, 0x00303031, 0x00313031, 0x00323031, 0x00333031, 0x00343031, 0x00353031, 0x00363031, 0x00373031, 0x00383031, 0x00393031, 0x00303131, 0x00313131, 0x00323131, 0x00333131, 0x00343131, 0x00353131, 0x00363131, 0x00373131, 0x00383131, 0x00393131, 0x00303231, 0x00313231, 0x00323231, 0x00333231, 0x00343231, 0x00353231, 0x00363231, 0x00373231, 0x00383231, 0x00393231, 0x00303331, 0x00313331, 0x00323331, 0x00333331, 0x00343331, 0x00353331, 0x00363331, 0x00373331, 0x00383331, 0x00393331, 0x00303431, 0x00313431, 0x00323431, 0x00333431, 0x00343431, 0x00353431, 0x00363431, 0x00373431, 0x00383431, 0x00393431, 0x00303531, 0x00313531, 0x00323531, 0x00333531, 0x00343531, 0x00353531, 0x00363531, 0x00373531, 0x00383531, 0x00393531, 0x00303631, 0x00313631, 0x00323631, 0x00333631, 0x00343631, 0x00353631, 0x00363631, 0x00373631, 0x00383631, 0x00393631, 0x00303731, 0x00313731, 0x00323731, 0x00333731, 0x00343731, 0x00353731, 0x00363731, 0x00373731, 0x00383731, 0x00393731, 0x00303831, 0x00313831, 0x00323831, 0x00333831, 0x00343831, 0x00353831, 0x00363831, 0x00373831, 0x00383831, 0x00393831, 0x00303931, 0x00313931, 0x00323931, 0x00333931, 0x00343931, 0x00353931, 0x00363931, 0x00373931, 0x00383931, 0x00393931, 0x00303032, 0x00313032, 0x00323032, 0x00333032, 0x00343032, 0x00353032, 0x00363032, 0x00373032, 0x00383032, 0x00393032, 0x00303132, 0x00313132, 0x00323132, 0x00333132, 0x00343132, 0x00353132, 0x00363132, 0x00373132, 0x00383132, 0x00393132, 0x00303232, 0x00313232, 0x00323232, 0x00333232, 0x00343232, 0x00353232, 0x00363232, 0x00373232, 0x00383232, 0x00393232, 0x00303332, 0x00313332, 0x00323332, 0x00333332, 0x00343332, 0x00353332, 0x00363332, 0x00373332, 0x00383332, 0x00393332, 0x00303432, 0x00313432, 0x00323432, 0x00333432, 0x00343432, 0x00353432, 0x00363432, 0x00373432, 0x00383432, 0x00393432, 0x00303532, 0x00313532, 0x00323532, 0x00333532, 0x00343532, 0x00353532, 0x00363532, 0x00373532, 0x00383532, 0x00393532, 0x00303632, 0x00313632, 0x00323632, 0x00333632, 0x00343632, 0x00353632, 0x00363632, 0x00373632, 0x00383632, 0x00393632, 0x00303732, 0x00313732, 0x00323732, 0x00333732, 0x00343732, 0x00353732, 0x00363732, 0x00373732, 0x00383732, 0x00393732, 0x00303832, 0x00313832, 0x00323832, 0x00333832, 0x00343832, 0x00353832, 0x00363832, 0x00373832, 0x00383832, 0x00393832, 0x00303932, 0x00313932, 0x00323932, 0x00333932, 0x00343932, 0x00353932, 0x00363932, 0x00373932, 0x00383932, 0x00393932, 0x00303033, 0x00313033, 0x00323033, 0x00333033, 0x00343033, 0x00353033, 0x00363033, 0x00373033, 0x00383033, 0x00393033, 0x00303133, 0x00313133, 0x00323133, 0x00333133, 0x00343133, 0x00353133, 0x00363133, 0x00373133, 0x00383133, 0x00393133, 0x00303233, 0x00313233, 0x00323233, 0x00333233, 0x00343233, 0x00353233, 0x00363233, 0x00373233, 0x00383233, 0x00393233, 0x00303333, 0x00313333, 0x00323333, 0x00333333, 0x00343333, 0x00353333, 0x00363333, 0x00373333, 0x00383333, 0x00393333, 0x00303433, 0x00313433, 0x00323433, 0x00333433, 0x00343433, 0x00353433, 0x00363433, 0x00373433, 0x00383433, 0x00393433, 0x00303533, 0x00313533, 0x00323533, 0x00333533, 0x00343533, 0x00353533, 0x00363533, 0x00373533, 0x00383533, 0x00393533, 0x00303633, 0x00313633, 0x00323633, 0x00333633, 0x00343633, 0x00353633, 0x00363633, 0x00373633, 0x00383633, 0x00393633, 0x00303733, 0x00313733, 0x00323733, 0x00333733, 0x00343733, 0x00353733, 0x00363733, 0x00373733, 0x00383733, 0x00393733, 0x00303833, 0x00313833, 0x00323833, 0x00333833, 0x00343833, 0x00353833, 0x00363833, 0x00373833, 0x00383833, 0x00393833, 0x00303933, 0x00313933, 0x00323933, 0x00333933, 0x00343933, 0x00353933, 0x00363933, 0x00373933, 0x00383933, 0x00393933, 0x00303034, 0x00313034, 0x00323034, 0x00333034, 0x00343034, 0x00353034, 0x00363034, 0x00373034, 0x00383034, 0x00393034, 0x00303134, 0x00313134, 0x00323134, 0x00333134, 0x00343134, 0x00353134, 0x00363134, 0x00373134, 0x00383134, 0x00393134, 0x00303234, 0x00313234, 0x00323234, 0x00333234, 0x00343234, 0x00353234, 0x00363234, 0x00373234, 0x00383234, 0x00393234, 0x00303334, 0x00313334, 0x00323334, 0x00333334, 0x00343334, 0x00353334, 0x00363334, 0x00373334, 0x00383334, 0x00393334, 0x00303434, 0x00313434, 0x00323434, 0x00333434, 0x00343434, 0x00353434, 0x00363434, 0x00373434, 0x00383434, 0x00393434, 0x00303534, 0x00313534, 0x00323534, 0x00333534, 0x00343534, 0x00353534, 0x00363534, 0x00373534, 0x00383534, 0x00393534, 0x00303634, 0x00313634, 0x00323634, 0x00333634, 0x00343634, 0x00353634, 0x00363634, 0x00373634, 0x00383634, 0x00393634, 0x00303734, 0x00313734, 0x00323734, 0x00333734, 0x00343734, 0x00353734, 0x00363734, 0x00373734, 0x00383734, 0x00393734, 0x00303834, 0x00313834, 0x00323834, 0x00333834, 0x00343834, 0x00353834, 0x00363834, 0x00373834, 0x00383834, 0x00393834, 0x00303934, 0x00313934, 0x00323934, 0x00333934, 0x00343934, 0x00353934, 0x00363934, 0x00373934, 0x00383934, 0x00393934, 0x00303035, 0x00313035, 0x00323035, 0x00333035, 0x00343035, 0x00353035, 0x00363035, 0x00373035, 0x00383035, 0x00393035, 0x00303135, 0x00313135, 0x00323135, 0x00333135, 0x00343135, 0x00353135, 0x00363135, 0x00373135, 0x00383135, 0x00393135, 0x00303235, 0x00313235, 0x00323235, 0x00333235, 0x00343235, 0x00353235, 0x00363235, 0x00373235, 0x00383235, 0x00393235, 0x00303335, 0x00313335, 0x00323335, 0x00333335, 0x00343335, 0x00353335, 0x00363335, 0x00373335, 0x00383335, 0x00393335, 0x00303435, 0x00313435, 0x00323435, 0x00333435, 0x00343435, 0x00353435, 0x00363435, 0x00373435, 0x00383435, 0x00393435, 0x00303535, 0x00313535, 0x00323535, 0x00333535, 0x00343535, 0x00353535, 0x00363535, 0x00373535, 0x00383535, 0x00393535, 0x00303635, 0x00313635, 0x00323635, 0x00333635, 0x00343635, 0x00353635, 0x00363635, 0x00373635, 0x00383635, 0x00393635, 0x00303735, 0x00313735, 0x00323735, 0x00333735, 0x00343735, 0x00353735, 0x00363735, 0x00373735, 0x00383735, 0x00393735, 0x00303835, 0x00313835, 0x00323835, 0x00333835, 0x00343835, 0x00353835, 0x00363835, 0x00373835, 0x00383835, 0x00393835, 0x00303935, 0x00313935, 0x00323935, 0x00333935, 0x00343935, 0x00353935, 0x00363935, 0x00373935, 0x00383935, 0x00393935, 0x00303036, 0x00313036, 0x00323036, 0x00333036, 0x00343036, 0x00353036, 0x00363036, 0x00373036, 0x00383036, 0x00393036, 0x00303136, 0x00313136, 0x00323136, 0x00333136, 0x00343136, 0x00353136, 0x00363136, 0x00373136, 0x00383136, 0x00393136, 0x00303236, 0x00313236, 0x00323236, 0x00333236, 0x00343236, 0x00353236, 0x00363236, 0x00373236, 0x00383236, 0x00393236, 0x00303336, 0x00313336, 0x00323336, 0x00333336, 0x00343336, 0x00353336, 0x00363336, 0x00373336, 0x00383336, 0x00393336, 0x00303436, 0x00313436, 0x00323436, 0x00333436, 0x00343436, 0x00353436, 0x00363436, 0x00373436, 0x00383436, 0x00393436, 0x00303536, 0x00313536, 0x00323536, 0x00333536, 0x00343536, 0x00353536, 0x00363536, 0x00373536, 0x00383536, 0x00393536, 0x00303636, 0x00313636, 0x00323636, 0x00333636, 0x00343636, 0x00353636, 0x00363636, 0x00373636, 0x00383636, 0x00393636, 0x00303736, 0x00313736, 0x00323736, 0x00333736, 0x00343736, 0x00353736, 0x00363736, 0x00373736, 0x00383736, 0x00393736, 0x00303836, 0x00313836, 0x00323836, 0x00333836, 0x00343836, 0x00353836, 0x00363836, 0x00373836, 0x00383836, 0x00393836, 0x00303936, 0x00313936, 0x00323936, 0x00333936, 0x00343936, 0x00353936, 0x00363936, 0x00373936, 0x00383936, 0x00393936, 0x00303037, 0x00313037, 0x00323037, 0x00333037, 0x00343037, 0x00353037, 0x00363037, 0x00373037, 0x00383037, 0x00393037, 0x00303137, 0x00313137, 0x00323137, 0x00333137, 0x00343137, 0x00353137, 0x00363137, 0x00373137, 0x00383137, 0x00393137, 0x00303237, 0x00313237, 0x00323237, 0x00333237, 0x00343237, 0x00353237, 0x00363237, 0x00373237, 0x00383237, 0x00393237, 0x00303337, 0x00313337, 0x00323337, 0x00333337, 0x00343337, 0x00353337, 0x00363337, 0x00373337, 0x00383337, 0x00393337, 0x00303437, 0x00313437, 0x00323437, 0x00333437, 0x00343437, 0x00353437, 0x00363437, 0x00373437, 0x00383437, 0x00393437, 0x00303537, 0x00313537, 0x00323537, 0x00333537, 0x00343537, 0x00353537, 0x00363537, 0x00373537, 0x00383537, 0x00393537, 0x00303637, 0x00313637, 0x00323637, 0x00333637, 0x00343637, 0x00353637, 0x00363637, 0x00373637, 0x00383637, 0x00393637, 0x00303737, 0x00313737, 0x00323737, 0x00333737, 0x00343737, 0x00353737, 0x00363737, 0x00373737, 0x00383737, 0x00393737, 0x00303837, 0x00313837, 0x00323837, 0x00333837, 0x00343837, 0x00353837, 0x00363837, 0x00373837, 0x00383837, 0x00393837, 0x00303937, 0x00313937, 0x00323937, 0x00333937, 0x00343937, 0x00353937, 0x00363937, 0x00373937, 0x00383937, 0x00393937, 0x00303038, 0x00313038, 0x00323038, 0x00333038, 0x00343038, 0x00353038, 0x00363038, 0x00373038, 0x00383038, 0x00393038, 0x00303138, 0x00313138, 0x00323138, 0x00333138, 0x00343138, 0x00353138, 0x00363138, 0x00373138, 0x00383138, 0x00393138, 0x00303238, 0x00313238, 0x00323238, 0x00333238, 0x00343238, 0x00353238, 0x00363238, 0x00373238, 0x00383238, 0x00393238, 0x00303338, 0x00313338, 0x00323338, 0x00333338, 0x00343338, 0x00353338, 0x00363338, 0x00373338, 0x00383338, 0x00393338, 0x00303438, 0x00313438, 0x00323438, 0x00333438, 0x00343438, 0x00353438, 0x00363438, 0x00373438, 0x00383438, 0x00393438, 0x00303538, 0x00313538, 0x00323538, 0x00333538, 0x00343538, 0x00353538, 0x00363538, 0x00373538, 0x00383538, 0x00393538, 0x00303638, 0x00313638, 0x00323638, 0x00333638, 0x00343638, 0x00353638, 0x00363638, 0x00373638, 0x00383638, 0x00393638, 0x00303738, 0x00313738, 0x00323738, 0x00333738, 0x00343738, 0x00353738, 0x00363738, 0x00373738, 0x00383738, 0x00393738, 0x00303838, 0x00313838, 0x00323838, 0x00333838, 0x00343838, 0x00353838, 0x00363838, 0x00373838, 0x00383838, 0x00393838, 0x00303938, 0x00313938, 0x00323938, 0x00333938, 0x00343938, 0x00353938, 0x00363938, 0x00373938, 0x00383938, 0x00393938, 0x00303039, 0x00313039, 0x00323039, 0x00333039, 0x00343039, 0x00353039, 0x00363039, 0x00373039, 0x00383039, 0x00393039, 0x00303139, 0x00313139, 0x00323139, 0x00333139, 0x00343139, 0x00353139, 0x00363139, 0x00373139, 0x00383139, 0x00393139, 0x00303239, 0x00313239, 0x00323239, 0x00333239, 0x00343239, 0x00353239, 0x00363239, 0x00373239, 0x00383239, 0x00393239, 0x00303339, 0x00313339, 0x00323339, 0x00333339, 0x00343339, 0x00353339, 0x00363339, 0x00373339, 0x00383339, 0x00393339, 0x00303439, 0x00313439, 0x00323439, 0x00333439, 0x00343439, 0x00353439, 0x00363439, 0x00373439, 0x00383439, 0x00393439, 0x00303539, 0x00313539, 0x00323539, 0x00333539, 0x00343539, 0x00353539, 0x00363539, 0x00373539, 0x00383539, 0x00393539, 0x00303639, 0x00313639, 0x00323639, 0x00333639, 0x00343639, 0x00353639, 0x00363639, 0x00373639, 0x00383639, 0x00393639, 0x00303739, 0x00313739, 0x00323739, 0x00333739, 0x00343739, 0x00353739, 0x00363739, 0x00373739, 0x00383739, 0x00393739, 0x00303839, 0x00313839, 0x00323839, 0x00333839, 0x00343839, 0x00353839, 0x00363839, 0x00373839, 0x00383839, 0x00393839, 0x00303939, 0x00313939, 0x00323939, 0x00333939, 0x00343939, 0x00353939, 0x00363939, 0x00373939, 0x00383939, 0x00393939, 0x30303031, 0x31303031, 0x32303031, 0x33303031, 0x34303031, 0x35303031, 0x36303031, 0x37303031, 0x38303031, 0x39303031, 0x30313031, 0x31313031, 0x32313031, 0x33313031, 0x34313031, 0x35313031, 0x36313031, 0x37313031, 0x38313031, 0x39313031, 0x30323031, 0x31323031, 0x32323031, 0x33323031, }; __constant u32a c_pc_len[1024] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }; void append_word (u32 w0[4], u32 w1[4], const u32 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; } } void append_salt (u32 w0[4], u32 w1[4], u32 w2[4], const u32 append[5], const u32 offset) { u32 tmp0; u32 tmp1; u32 tmp2; u32 tmp3; u32 tmp4; u32 tmp5; const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #if defined IS_AMD || defined IS_GENERIC u32 in0 = swap32_S (append[0]); u32 in1 = swap32_S (append[1]); u32 in2 = swap32_S (append[2]); u32 in3 = swap32_S (append[3]); u32 in4 = swap32_S (append[4]); tmp0 = amd_bytealign ( 0, in0, offset); tmp1 = amd_bytealign (in0, in1, offset); tmp2 = amd_bytealign (in1, in2, offset); tmp3 = amd_bytealign (in2, in3, offset); tmp4 = amd_bytealign (in3, in4, offset); tmp5 = amd_bytealign (in4, 0, offset); tmp0 = swap32_S (tmp0); tmp1 = swap32_S (tmp1); tmp2 = swap32_S (tmp2); tmp3 = swap32_S (tmp3); tmp4 = swap32_S (tmp4); tmp5 = swap32_S (tmp5); #endif #ifdef IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; u32 in0 = append[0]; u32 in1 = append[1]; u32 in2 = append[2]; u32 in3 = append[3]; u32 in4 = append[4]; tmp0 = __byte_perm ( 0, in0, selector); tmp1 = __byte_perm (in0, in1, selector); tmp2 = __byte_perm (in1, in2, selector); tmp3 = __byte_perm (in2, in3, selector); tmp3 = __byte_perm (in3, in4, selector); tmp4 = __byte_perm (in4, 0, selector); #endif const u32 div = offset / 4; switch (div) { case 0: w0[0] |= tmp0; w0[1] = tmp1; w0[2] = tmp2; w0[3] = tmp3; w1[0] = tmp4; w1[1] = tmp5; break; case 1: w0[1] |= tmp0; w0[2] = tmp1; w0[3] = tmp2; w1[0] = tmp3; w1[1] = tmp4; w1[2] = tmp5; break; case 2: w0[2] |= tmp0; w0[3] = tmp1; w1[0] = tmp2; w1[1] = tmp3; w1[2] = tmp4; w1[3] = tmp5; break; case 3: w0[3] |= tmp0; w1[0] = tmp1; w1[1] = tmp2; w1[2] = tmp3; w1[3] = tmp4; w2[0] = tmp5; break; case 4: w1[0] |= tmp0; w1[1] = tmp1; w1[2] = tmp2; w1[3] = tmp3; w2[0] = tmp4; w2[1] = tmp5; break; } } __kernel void m05800_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global androidpin_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha1_ctx_t ctx; sha1_init (&ctx); u32 w0[4] = { 0 }; w0[0] = 0x30000000; u32 w1[4] = { 0 }; u32 w2[4] = { 0 }; u32 w3[4] = { 0 }; sha1_update_64 (&ctx, w0, w1, w2, w3, 1); sha1_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); sha1_update_global_swap (&ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_final (&ctx); tmps[gid].digest_buf[0] = ctx.h[0]; tmps[gid].digest_buf[1] = ctx.h[1]; tmps[gid].digest_buf[2] = ctx.h[2]; tmps[gid].digest_buf[3] = ctx.h[3]; tmps[gid].digest_buf[4] = ctx.h[4]; } __kernel void m05800_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global androidpin_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * cache precomputed conversion table in shared memory */ __local u32 s_pc_dec[1024]; __local u32 s_pc_len[1024]; for (u32 i = lid; i < 1024; i += lsz) { s_pc_dec[i] = c_pc_dec[i]; s_pc_len[i] = c_pc_len[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * init */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32 (pws[gid].i[idx]); } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32 (salt_bufs[salt_pos].salt_buf[idx]); } u32 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, j = loop_pos + 1; i < loop_cnt; i++, j++) { const u32 pc_dec = s_pc_dec[j]; const u32 pc_len = s_pc_len[j]; sha1_ctx_t ctx; sha1_init (&ctx); ctx.w0[0] = digest[0]; ctx.w0[1] = digest[1]; ctx.w0[2] = digest[2]; ctx.w0[3] = digest[3]; ctx.w1[0] = digest[4]; ctx.w1[1] = swap32 (pc_dec); ctx.len = 20 + pc_len; sha1_update (&ctx, w, pw_len); sha1_update (&ctx, s, salt_len); sha1_final (&ctx); digest[0] = ctx.h[0]; digest[1] = ctx.h[1]; digest[2] = ctx.h[2]; digest[3] = ctx.h[3]; digest[4] = ctx.h[4]; } 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 m05800_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global androidpin_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ const u32 r0 = tmps[gid].digest_buf[DGST_R0]; const u32 r1 = tmps[gid].digest_buf[DGST_R1]; const u32 r2 = tmps[gid].digest_buf[DGST_R2]; const u32 r3 = tmps[gid].digest_buf[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m06000_a0-optimized.cl000066400000000000000000000232651320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_ripemd160.cl" void ripemd160_transform_transport_vector (const u32x w[16], u32x dgst[5]) { ripemd160_transform_vector (w + 0, w + 4, w + 8, w + 12, dgst); } __kernel void m06000_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_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] = out_len * 8; w[15] = 0; /** * RipeMD160 */ 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_transport_vector (w, dgst); COMPARE_M_SIMD (dgst[0], dgst[1], dgst[2], dgst[3]); } } __kernel void m06000_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06000_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06000_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_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] = out_len * 8; w[15] = 0; /** * RipeMD160 */ 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_transport_vector (w, dgst); COMPARE_S_SIMD (dgst[0], dgst[1], dgst[2], dgst[3]); } } __kernel void m06000_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06000_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m06000_a0.cl000066400000000000000000000077271320027462700160110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_ripemd160.cl" __kernel void m06000_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); ripemd160_ctx_t ctx; ripemd160_init (&ctx); ripemd160_update (&ctx, tmp.i, tmp.pw_len); ripemd160_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m06000_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); ripemd160_ctx_t ctx; ripemd160_init (&ctx); ripemd160_update (&ctx, tmp.i, tmp.pw_len); ripemd160_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m06000_a1-optimized.cl000066400000000000000000000317341320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_ripemd160.cl" void ripemd160_transform_transport_vector (const u32x w[16], u32x dgst[5]) { ripemd160_transform_vector (w + 0, w + 4, w + 8, w + 12, dgst); } __kernel void m06000_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * RipeMD160 */ 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] = pw_len * 8; w[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_transport_vector (w, dgst); COMPARE_M_SIMD (dgst[0], dgst[1], dgst[2], dgst[3]); } } __kernel void m06000_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06000_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06000_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * RipeMD160 */ 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] = pw_len * 8; w[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_transport_vector (w, dgst); COMPARE_S_SIMD (dgst[0], dgst[1], dgst[2], dgst[3]); } } __kernel void m06000_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06000_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m06000_a1.cl000066400000000000000000000076701320027462700160070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_ripemd160.cl" __kernel void m06000_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ ripemd160_ctx_t ctx0; ripemd160_init (&ctx0); ripemd160_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { ripemd160_ctx_t ctx = ctx0; ripemd160_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); ripemd160_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m06000_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ ripemd160_ctx_t ctx0; ripemd160_init (&ctx0); ripemd160_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { ripemd160_ctx_t ctx = ctx0; ripemd160_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); ripemd160_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m06000_a3-optimized.cl000066400000000000000000000412721320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_ripemd160.cl" void ripemd160_transform_transport_vector (const u32x w[16], u32x dgst[5]) { ripemd160_transform_vector (w + 0, w + 4, w + 8, w + 12, dgst); } void m06000m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w[16]; w[ 0] = w0lr; 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] = pw_len * 8; w[15] = 0; /** * RipeMD160 */ 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_transport_vector (w, dgst); COMPARE_M_SIMD (dgst[0], dgst[1], dgst[2], dgst[3]); } } void m06000s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w[16]; w[ 0] = w0lr; 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] = pw_len * 8; w[15] = 0; /** * RipeMD160 */ 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_transport_vector (w, dgst); COMPARE_S_SIMD (dgst[0], dgst[1], dgst[2], dgst[3]); } } __kernel void m06000_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m06000_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m06000_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m06000_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m06000_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m06000_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m06000_a3.cl000066400000000000000000000104561320027462700160050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_ripemd160.cl" __kernel void m06000_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; ripemd160_ctx_vector_t ctx; ripemd160_init_vector (&ctx); ripemd160_update_vector (&ctx, w, pw_len); ripemd160_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m06000_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; ripemd160_ctx_vector_t ctx; ripemd160_init_vector (&ctx); ripemd160_update_vector (&ctx, w, pw_len); ripemd160_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m06100_a0-optimized.cl000066400000000000000000000272401320027462700200040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_whirlpool.cl" void whirlpool_transform_transport_vector (const u32x w[16], u32x digest[16], SHM_TYPE u32 (*s_Ch)[256], SHM_TYPE u32 (*s_Cl)[256]) { whirlpool_transform_vector (w + 0, w + 4, w + 8, w + 12, digest, s_Ch, s_Cl); } __kernel void m06100_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); u32x w[16]; w[ 0] = swap32 (w0[0]); w[ 1] = swap32 (w0[1]); w[ 2] = swap32 (w0[2]); w[ 3] = swap32 (w0[3]); w[ 4] = swap32 (w1[0]); w[ 5] = swap32 (w1[1]); w[ 6] = swap32 (w1[2]); w[ 7] = swap32 (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] = out_len * 8; /** * Whirlpool */ 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_transport_vector (w, dgst, s_Ch, s_Cl); COMPARE_M_SIMD (dgst[0], dgst[1], dgst[2], dgst[3]); } } __kernel void m06100_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06100_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06100_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); u32x w[16]; w[ 0] = swap32 (w0[0]); w[ 1] = swap32 (w0[1]); w[ 2] = swap32 (w0[2]); w[ 3] = swap32 (w0[3]); w[ 4] = swap32 (w1[0]); w[ 5] = swap32 (w1[1]); w[ 6] = swap32 (w1[2]); w[ 7] = swap32 (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] = out_len * 8; /** * Whirlpool */ 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_transport_vector (w, dgst, s_Ch, s_Cl); COMPARE_S_SIMD (dgst[0], dgst[1], dgst[2], dgst[3]); } } __kernel void m06100_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06100_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m06100_a0.cl000066400000000000000000000127151320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_whirlpool.cl" __kernel void m06100_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); whirlpool_ctx_t ctx; whirlpool_init (&ctx, s_Ch, s_Cl); whirlpool_update_swap (&ctx, tmp.i, tmp.pw_len); whirlpool_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m06100_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); whirlpool_ctx_t ctx; whirlpool_init (&ctx, s_Ch, s_Cl); whirlpool_update_swap (&ctx, tmp.i, tmp.pw_len); whirlpool_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m06100_a1-optimized.cl000066400000000000000000000360611320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_whirlpool.cl" void whirlpool_transform_transport_vector (const u32x w[16], u32x digest[16], SHM_TYPE u32 (*s_Ch)[256], SHM_TYPE u32 (*s_Cl)[256]) { whirlpool_transform_vector (w + 0, w + 4, w + 8, w + 12, digest, s_Ch, s_Cl); } __kernel void m06100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 w[16]; w[ 0] = swap32 (w0[0]); w[ 1] = swap32 (w0[1]); w[ 2] = swap32 (w0[2]); w[ 3] = swap32 (w0[3]); w[ 4] = swap32 (w1[0]); w[ 5] = swap32 (w1[1]); w[ 6] = swap32 (w1[2]); w[ 7] = swap32 (w1[3]); w[ 8] = swap32 (w2[0]); w[ 9] = swap32 (w2[1]); w[10] = swap32 (w2[2]); w[11] = swap32 (w2[3]); w[12] = swap32 (w3[0]); w[13] = swap32 (w3[1]); w[14] = 0; w[15] = pw_len * 8; /** * Whirlool */ 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_transport_vector (w, dgst, s_Ch, s_Cl); COMPARE_M_SIMD (dgst[0], dgst[1], dgst[2], dgst[3]); } } __kernel void m06100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 w[16]; w[ 0] = swap32 (w0[0]); w[ 1] = swap32 (w0[1]); w[ 2] = swap32 (w0[2]); w[ 3] = swap32 (w0[3]); w[ 4] = swap32 (w1[0]); w[ 5] = swap32 (w1[1]); w[ 6] = swap32 (w1[2]); w[ 7] = swap32 (w1[3]); w[ 8] = swap32 (w2[0]); w[ 9] = swap32 (w2[1]); w[10] = swap32 (w2[2]); w[11] = swap32 (w2[3]); w[12] = swap32 (w3[0]); w[13] = swap32 (w3[1]); w[14] = 0; w[15] = pw_len * 8; /** * Whirlool */ 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_transport_vector (w, dgst, s_Ch, s_Cl); COMPARE_S_SIMD (dgst[0], dgst[1], dgst[2], dgst[3]); } } __kernel void m06100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m06100_a1.cl000066400000000000000000000126701320027462700160040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_whirlpool.cl" __kernel void m06100_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if (gid >= gid_max) return; /** * base */ whirlpool_ctx_t ctx0; whirlpool_init (&ctx0, s_Ch, s_Cl); whirlpool_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { whirlpool_ctx_t ctx = ctx0; whirlpool_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); whirlpool_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m06100_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif 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] }; /** * base */ whirlpool_ctx_t ctx0; whirlpool_init (&ctx0, s_Ch, s_Cl); whirlpool_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { whirlpool_ctx_t ctx = ctx0; whirlpool_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); whirlpool_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m06100_a3-optimized.cl000066400000000000000000000537531320027462700200170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_whirlpool.cl" void whirlpool_transform_transport_vector (const u32x w[16], u32x digest[16], SHM_TYPE u32 (*s_Ch)[256], SHM_TYPE u32 (*s_Cl)[256]) { whirlpool_transform_vector (w + 0, w + 4, w + 8, w + 12, digest, s_Ch, s_Cl); } void m06100m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, SHM_TYPE u32 (*s_Cl)[256], SHM_TYPE u32 (*s_Ch)[256]) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w[16]; w[ 0] = w0lr; 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] = 0; w[15] = pw_len * 8; /** * Whirlool */ 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_transport_vector (w, dgst, s_Ch, s_Cl); COMPARE_M_SIMD (dgst[0], dgst[1], dgst[2], dgst[3]); } } void m06100s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, SHM_TYPE u32 (*s_Cl)[256], SHM_TYPE u32 (*s_Ch)[256]) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w[16]; w[ 0] = w0lr; 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] = 0; w[15] = pw_len * 8; /** * Whirlool */ 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_transport_vector (w, dgst, s_Ch, s_Cl); COMPARE_S_SIMD (dgst[0], dgst[1], dgst[2], dgst[3]); } } __kernel void m06100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_Cl, s_Ch); } __kernel void m06100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_Cl, s_Ch); } __kernel void m06100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_Cl, s_Ch); } __kernel void m06100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_Cl, s_Ch); } __kernel void m06100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_Cl, s_Ch); } __kernel void m06100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_Cl, s_Ch); } hashcat-4.0.1/OpenCL/m06100_a3.cl000066400000000000000000000134321320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_whirlpool.cl" __kernel void m06100_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; whirlpool_ctx_vector_t ctx; whirlpool_init_vector (&ctx, s_Ch, s_Cl); whirlpool_update_vector (&ctx, w, pw_len); whirlpool_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m06100_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; whirlpool_ctx_vector_t ctx; whirlpool_init_vector (&ctx, s_Ch, s_Cl); whirlpool_update_vector (&ctx, w, pw_len); whirlpool_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m06211.cl000066400000000000000000000310621320027462700154220ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_ripemd160.cl" #include "inc_cipher_aes.cl" #include "inc_cipher_twofish.cl" #include "inc_cipher_serpent.cl" #include "inc_truecrypt_crc32.cl" #include "inc_truecrypt_xts.cl" 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; } void hmac_ripemd160_run_V (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]; ripemd160_transform_vector (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] = 0x80; 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 + 20) * 8; w3[3] = 0; digest[0] = opad[0]; digest[1] = opad[1]; digest[2] = opad[2]; digest[3] = opad[3]; digest[4] = opad[4]; ripemd160_transform_vector (w0, w1, w2, w3, digest); } __kernel void m06211_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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]; w0[0] = u8add (w0[0], esalt_bufs[digests_offset].keyfile_buf[ 0]); w0[1] = u8add (w0[1], esalt_bufs[digests_offset].keyfile_buf[ 1]); w0[2] = u8add (w0[2], esalt_bufs[digests_offset].keyfile_buf[ 2]); w0[3] = u8add (w0[3], esalt_bufs[digests_offset].keyfile_buf[ 3]); w1[0] = u8add (w1[0], esalt_bufs[digests_offset].keyfile_buf[ 4]); w1[1] = u8add (w1[1], esalt_bufs[digests_offset].keyfile_buf[ 5]); w1[2] = u8add (w1[2], esalt_bufs[digests_offset].keyfile_buf[ 6]); w1[3] = u8add (w1[3], esalt_bufs[digests_offset].keyfile_buf[ 7]); w2[0] = u8add (w2[0], esalt_bufs[digests_offset].keyfile_buf[ 8]); w2[1] = u8add (w2[1], esalt_bufs[digests_offset].keyfile_buf[ 9]); w2[2] = u8add (w2[2], esalt_bufs[digests_offset].keyfile_buf[10]); w2[3] = u8add (w2[3], esalt_bufs[digests_offset].keyfile_buf[11]); w3[0] = u8add (w3[0], esalt_bufs[digests_offset].keyfile_buf[12]); w3[1] = u8add (w3[1], esalt_bufs[digests_offset].keyfile_buf[13]); w3[2] = u8add (w3[2], esalt_bufs[digests_offset].keyfile_buf[14]); w3[3] = u8add (w3[3], esalt_bufs[digests_offset].keyfile_buf[15]); ripemd160_hmac_ctx_t ripemd160_hmac_ctx; ripemd160_hmac_init_64 (&ripemd160_hmac_ctx, w0, w1, w2, w3); tmps[gid].ipad[0] = ripemd160_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = ripemd160_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = ripemd160_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = ripemd160_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = ripemd160_hmac_ctx.ipad.h[4]; tmps[gid].opad[0] = ripemd160_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = ripemd160_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = ripemd160_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = ripemd160_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = ripemd160_hmac_ctx.opad.h[4]; ripemd160_hmac_update_global (&ripemd160_hmac_ctx, esalt_bufs[digests_offset].salt_buf, 64); for (u32 i = 0, j = 1; i < 16; i += 5, j += 1) { ripemd160_hmac_ctx_t ripemd160_hmac_ctx2 = ripemd160_hmac_ctx; w0[0] = j << 24; 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] = 0; ripemd160_hmac_update_64 (&ripemd160_hmac_ctx2, w0, w1, w2, w3, 4); ripemd160_hmac_final (&ripemd160_hmac_ctx2); tmps[gid].dgst[i + 0] = ripemd160_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = ripemd160_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = ripemd160_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = ripemd160_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = ripemd160_hmac_ctx2.opad.h[4]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; } } __kernel void m06211_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); for (u32 i = 0; i < 16; i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, 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] = 0x80; 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 + 20) * 8; w3[3] = 0; hmac_ripemd160_run_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); } } __kernel void m06211_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif 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]; if (verify_header_aes (esalt_bufs, ukey1, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m06212.cl000066400000000000000000000336111320027462700154250ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_ripemd160.cl" #include "inc_cipher_aes.cl" #include "inc_cipher_twofish.cl" #include "inc_cipher_serpent.cl" #include "inc_truecrypt_crc32.cl" #include "inc_truecrypt_xts.cl" 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; } void hmac_ripemd160_run_V (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]; ripemd160_transform_vector (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] = 0x80; 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 + 20) * 8; w3[3] = 0; digest[0] = opad[0]; digest[1] = opad[1]; digest[2] = opad[2]; digest[3] = opad[3]; digest[4] = opad[4]; ripemd160_transform_vector (w0, w1, w2, w3, digest); } __kernel void m06212_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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]; w0[0] = u8add (w0[0], esalt_bufs[digests_offset].keyfile_buf[ 0]); w0[1] = u8add (w0[1], esalt_bufs[digests_offset].keyfile_buf[ 1]); w0[2] = u8add (w0[2], esalt_bufs[digests_offset].keyfile_buf[ 2]); w0[3] = u8add (w0[3], esalt_bufs[digests_offset].keyfile_buf[ 3]); w1[0] = u8add (w1[0], esalt_bufs[digests_offset].keyfile_buf[ 4]); w1[1] = u8add (w1[1], esalt_bufs[digests_offset].keyfile_buf[ 5]); w1[2] = u8add (w1[2], esalt_bufs[digests_offset].keyfile_buf[ 6]); w1[3] = u8add (w1[3], esalt_bufs[digests_offset].keyfile_buf[ 7]); w2[0] = u8add (w2[0], esalt_bufs[digests_offset].keyfile_buf[ 8]); w2[1] = u8add (w2[1], esalt_bufs[digests_offset].keyfile_buf[ 9]); w2[2] = u8add (w2[2], esalt_bufs[digests_offset].keyfile_buf[10]); w2[3] = u8add (w2[3], esalt_bufs[digests_offset].keyfile_buf[11]); w3[0] = u8add (w3[0], esalt_bufs[digests_offset].keyfile_buf[12]); w3[1] = u8add (w3[1], esalt_bufs[digests_offset].keyfile_buf[13]); w3[2] = u8add (w3[2], esalt_bufs[digests_offset].keyfile_buf[14]); w3[3] = u8add (w3[3], esalt_bufs[digests_offset].keyfile_buf[15]); ripemd160_hmac_ctx_t ripemd160_hmac_ctx; ripemd160_hmac_init_64 (&ripemd160_hmac_ctx, w0, w1, w2, w3); tmps[gid].ipad[0] = ripemd160_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = ripemd160_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = ripemd160_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = ripemd160_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = ripemd160_hmac_ctx.ipad.h[4]; tmps[gid].opad[0] = ripemd160_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = ripemd160_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = ripemd160_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = ripemd160_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = ripemd160_hmac_ctx.opad.h[4]; ripemd160_hmac_update_global (&ripemd160_hmac_ctx, esalt_bufs[digests_offset].salt_buf, 64); for (u32 i = 0, j = 1; i < 32; i += 5, j += 1) { ripemd160_hmac_ctx_t ripemd160_hmac_ctx2 = ripemd160_hmac_ctx; w0[0] = j << 24; 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] = 0; ripemd160_hmac_update_64 (&ripemd160_hmac_ctx2, w0, w1, w2, w3, 4); ripemd160_hmac_final (&ripemd160_hmac_ctx2); tmps[gid].dgst[i + 0] = ripemd160_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = ripemd160_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = ripemd160_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = ripemd160_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = ripemd160_hmac_ctx2.opad.h[4]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; } } __kernel void m06212_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); for (u32 i = 0; i < 32; i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, 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] = 0x80; 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 + 20) * 8; w3[3] = 0; hmac_ripemd160_run_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); } } __kernel void m06212_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif 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]; if (verify_header_aes (esalt_bufs, ukey1, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } 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]; if (verify_header_aes_twofish (esalt_bufs, ukey1, ukey2, ukey3, ukey4, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent_aes (esalt_bufs, ukey1, ukey2, ukey3, ukey4, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish_serpent (esalt_bufs, ukey1, ukey2, ukey3, ukey4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m06213.cl000066400000000000000000000360471320027462700154340ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_ripemd160.cl" #include "inc_cipher_aes.cl" #include "inc_cipher_twofish.cl" #include "inc_cipher_serpent.cl" #include "inc_truecrypt_crc32.cl" #include "inc_truecrypt_xts.cl" 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; } void hmac_ripemd160_run_V (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]; ripemd160_transform_vector (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] = 0x80; 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 + 20) * 8; w3[3] = 0; digest[0] = opad[0]; digest[1] = opad[1]; digest[2] = opad[2]; digest[3] = opad[3]; digest[4] = opad[4]; ripemd160_transform_vector (w0, w1, w2, w3, digest); } __kernel void m06213_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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]; w0[0] = u8add (w0[0], esalt_bufs[digests_offset].keyfile_buf[ 0]); w0[1] = u8add (w0[1], esalt_bufs[digests_offset].keyfile_buf[ 1]); w0[2] = u8add (w0[2], esalt_bufs[digests_offset].keyfile_buf[ 2]); w0[3] = u8add (w0[3], esalt_bufs[digests_offset].keyfile_buf[ 3]); w1[0] = u8add (w1[0], esalt_bufs[digests_offset].keyfile_buf[ 4]); w1[1] = u8add (w1[1], esalt_bufs[digests_offset].keyfile_buf[ 5]); w1[2] = u8add (w1[2], esalt_bufs[digests_offset].keyfile_buf[ 6]); w1[3] = u8add (w1[3], esalt_bufs[digests_offset].keyfile_buf[ 7]); w2[0] = u8add (w2[0], esalt_bufs[digests_offset].keyfile_buf[ 8]); w2[1] = u8add (w2[1], esalt_bufs[digests_offset].keyfile_buf[ 9]); w2[2] = u8add (w2[2], esalt_bufs[digests_offset].keyfile_buf[10]); w2[3] = u8add (w2[3], esalt_bufs[digests_offset].keyfile_buf[11]); w3[0] = u8add (w3[0], esalt_bufs[digests_offset].keyfile_buf[12]); w3[1] = u8add (w3[1], esalt_bufs[digests_offset].keyfile_buf[13]); w3[2] = u8add (w3[2], esalt_bufs[digests_offset].keyfile_buf[14]); w3[3] = u8add (w3[3], esalt_bufs[digests_offset].keyfile_buf[15]); ripemd160_hmac_ctx_t ripemd160_hmac_ctx; ripemd160_hmac_init_64 (&ripemd160_hmac_ctx, w0, w1, w2, w3); tmps[gid].ipad[0] = ripemd160_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = ripemd160_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = ripemd160_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = ripemd160_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = ripemd160_hmac_ctx.ipad.h[4]; tmps[gid].opad[0] = ripemd160_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = ripemd160_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = ripemd160_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = ripemd160_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = ripemd160_hmac_ctx.opad.h[4]; ripemd160_hmac_update_global (&ripemd160_hmac_ctx, esalt_bufs[digests_offset].salt_buf, 64); for (u32 i = 0, j = 1; i < 48; i += 5, j += 1) { ripemd160_hmac_ctx_t ripemd160_hmac_ctx2 = ripemd160_hmac_ctx; w0[0] = j << 24; 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] = 0; ripemd160_hmac_update_64 (&ripemd160_hmac_ctx2, w0, w1, w2, w3, 4); ripemd160_hmac_final (&ripemd160_hmac_ctx2); tmps[gid].dgst[i + 0] = ripemd160_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = ripemd160_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = ripemd160_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = ripemd160_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = ripemd160_hmac_ctx2.opad.h[4]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; } } __kernel void m06213_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); for (u32 i = 0; i < 48; i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, 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] = 0x80; 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 + 20) * 8; w3[3] = 0; hmac_ripemd160_run_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); } } __kernel void m06213_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif 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]; if (verify_header_aes (esalt_bufs, ukey1, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } 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]; if (verify_header_aes_twofish (esalt_bufs, ukey1, ukey2, ukey3, ukey4, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent_aes (esalt_bufs, ukey1, ukey2, ukey3, ukey4, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish_serpent (esalt_bufs, ukey1, ukey2, ukey3, ukey4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } 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]; if (verify_header_aes_twofish_serpent (esalt_bufs, ukey1, ukey2, ukey3, ukey4, ukey5, ukey6, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent_twofish_aes (esalt_bufs, ukey1, ukey2, ukey3, ukey4, ukey5, ukey6, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m06221.cl000066400000000000000000000425641320027462700154340ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" #include "inc_cipher_aes.cl" #include "inc_cipher_twofish.cl" #include "inc_cipher_serpent.cl" #include "inc_truecrypt_crc32.cl" #include "inc_truecrypt_xts.cl" 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; } void hmac_sha512_run_V (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); w0[0] = h32_from_64 (digest[0]); w0[1] = l32_from_64 (digest[0]); w0[2] = h32_from_64 (digest[1]); w0[3] = l32_from_64 (digest[1]); w1[0] = h32_from_64 (digest[2]); w1[1] = l32_from_64 (digest[2]); w1[2] = h32_from_64 (digest[3]); w1[3] = l32_from_64 (digest[3]); w2[0] = h32_from_64 (digest[4]); w2[1] = l32_from_64 (digest[4]); w2[2] = h32_from_64 (digest[5]); w2[3] = l32_from_64 (digest[5]); w3[0] = h32_from_64 (digest[6]); w3[1] = l32_from_64 (digest[6]); w3[2] = h32_from_64 (digest[7]); w3[3] = l32_from_64 (digest[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } __kernel void m06221_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; 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]; w4[0] = pws[gid].i[16]; w4[1] = pws[gid].i[17]; w4[2] = pws[gid].i[18]; w4[3] = pws[gid].i[19]; w5[0] = pws[gid].i[20]; w5[1] = pws[gid].i[21]; w5[2] = pws[gid].i[22]; w5[3] = pws[gid].i[23]; w6[0] = pws[gid].i[24]; w6[1] = pws[gid].i[25]; w6[2] = pws[gid].i[26]; w6[3] = pws[gid].i[27]; w7[0] = pws[gid].i[28]; w7[1] = pws[gid].i[29]; w7[2] = pws[gid].i[30]; w7[3] = pws[gid].i[31]; w0[0] = u8add (w0[0], esalt_bufs[digests_offset].keyfile_buf[ 0]); w0[1] = u8add (w0[1], esalt_bufs[digests_offset].keyfile_buf[ 1]); w0[2] = u8add (w0[2], esalt_bufs[digests_offset].keyfile_buf[ 2]); w0[3] = u8add (w0[3], esalt_bufs[digests_offset].keyfile_buf[ 3]); w1[0] = u8add (w1[0], esalt_bufs[digests_offset].keyfile_buf[ 4]); w1[1] = u8add (w1[1], esalt_bufs[digests_offset].keyfile_buf[ 5]); w1[2] = u8add (w1[2], esalt_bufs[digests_offset].keyfile_buf[ 6]); w1[3] = u8add (w1[3], esalt_bufs[digests_offset].keyfile_buf[ 7]); w2[0] = u8add (w2[0], esalt_bufs[digests_offset].keyfile_buf[ 8]); w2[1] = u8add (w2[1], esalt_bufs[digests_offset].keyfile_buf[ 9]); w2[2] = u8add (w2[2], esalt_bufs[digests_offset].keyfile_buf[10]); w2[3] = u8add (w2[3], esalt_bufs[digests_offset].keyfile_buf[11]); w3[0] = u8add (w3[0], esalt_bufs[digests_offset].keyfile_buf[12]); w3[1] = u8add (w3[1], esalt_bufs[digests_offset].keyfile_buf[13]); w3[2] = u8add (w3[2], esalt_bufs[digests_offset].keyfile_buf[14]); w3[3] = u8add (w3[3], esalt_bufs[digests_offset].keyfile_buf[15]); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha512_hmac_ctx_t sha512_hmac_ctx; sha512_hmac_init_128 (&sha512_hmac_ctx, w0, w1, w2, w3, w5, w5, w6, w7); tmps[gid].ipad[0] = sha512_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha512_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha512_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha512_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha512_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha512_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha512_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha512_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha512_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha512_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha512_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha512_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha512_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha512_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha512_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha512_hmac_ctx.opad.h[7]; sha512_hmac_update_global_swap (&sha512_hmac_ctx, esalt_bufs[digests_offset].salt_buf, 64); for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) { sha512_hmac_ctx_t sha512_hmac_ctx2 = sha512_hmac_ctx; w0[0] = j; 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] = 0; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_update_128 (&sha512_hmac_ctx2, w0, w1, w2, w3, w4, w5, w6, w7, 4); sha512_hmac_final (&sha512_hmac_ctx2); tmps[gid].dgst[i + 0] = sha512_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha512_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha512_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha512_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha512_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha512_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha512_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha512_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m06221_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u64x ipad[8]; u64x opad[8]; ipad[0] = pack64v (tmps, ipad, gid, 0); ipad[1] = pack64v (tmps, ipad, gid, 1); ipad[2] = pack64v (tmps, ipad, gid, 2); ipad[3] = pack64v (tmps, ipad, gid, 3); ipad[4] = pack64v (tmps, ipad, gid, 4); ipad[5] = pack64v (tmps, ipad, gid, 5); ipad[6] = pack64v (tmps, ipad, gid, 6); ipad[7] = pack64v (tmps, ipad, gid, 7); opad[0] = pack64v (tmps, opad, gid, 0); opad[1] = pack64v (tmps, opad, gid, 1); opad[2] = pack64v (tmps, opad, gid, 2); opad[3] = pack64v (tmps, opad, gid, 3); opad[4] = pack64v (tmps, opad, gid, 4); opad[5] = pack64v (tmps, opad, gid, 5); opad[6] = pack64v (tmps, opad, gid, 6); opad[7] = pack64v (tmps, opad, gid, 7); for (u32 i = 0; i < 8; i += 8) { u64x dgst[8]; u64x out[8]; dgst[0] = pack64v (tmps, dgst, gid, i + 0); dgst[1] = pack64v (tmps, dgst, gid, i + 1); dgst[2] = pack64v (tmps, dgst, gid, i + 2); dgst[3] = pack64v (tmps, dgst, gid, i + 3); dgst[4] = pack64v (tmps, dgst, gid, i + 4); dgst[5] = pack64v (tmps, dgst, gid, i + 5); dgst[6] = pack64v (tmps, dgst, gid, i + 6); dgst[7] = pack64v (tmps, dgst, gid, i + 7); out[0] = pack64v (tmps, out, gid, i + 0); out[1] = pack64v (tmps, out, gid, i + 1); out[2] = pack64v (tmps, out, gid, i + 2); out[3] = pack64v (tmps, out, gid, i + 3); out[4] = pack64v (tmps, out, gid, i + 4); out[5] = pack64v (tmps, out, gid, i + 5); out[6] = pack64v (tmps, out, gid, i + 6); out[7] = pack64v (tmps, out, gid, i + 7); for (u32 j = 0; j < loop_cnt; j++) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; w0[0] = h32_from_64 (dgst[0]); w0[1] = l32_from_64 (dgst[0]); w0[2] = h32_from_64 (dgst[1]); w0[3] = l32_from_64 (dgst[1]); w1[0] = h32_from_64 (dgst[2]); w1[1] = l32_from_64 (dgst[2]); w1[2] = h32_from_64 (dgst[3]); w1[3] = l32_from_64 (dgst[3]); w2[0] = h32_from_64 (dgst[4]); w2[1] = l32_from_64 (dgst[4]); w2[2] = h32_from_64 (dgst[5]); w2[3] = l32_from_64 (dgst[5]); w3[0] = h32_from_64 (dgst[6]); w3[1] = l32_from_64 (dgst[6]); w3[2] = h32_from_64 (dgst[7]); w3[3] = l32_from_64 (dgst[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = (128 + 64) * 8; hmac_sha512_run_V (w0, w1, w2, w3, w4, w5, w6, w7, 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]; } unpack64v (tmps, dgst, gid, i + 0, dgst[0]); unpack64v (tmps, dgst, gid, i + 1, dgst[1]); unpack64v (tmps, dgst, gid, i + 2, dgst[2]); unpack64v (tmps, dgst, gid, i + 3, dgst[3]); unpack64v (tmps, dgst, gid, i + 4, dgst[4]); unpack64v (tmps, dgst, gid, i + 5, dgst[5]); unpack64v (tmps, dgst, gid, i + 6, dgst[6]); unpack64v (tmps, dgst, gid, i + 7, dgst[7]); unpack64v (tmps, out, gid, i + 0, out[0]); unpack64v (tmps, out, gid, i + 1, out[1]); unpack64v (tmps, out, gid, i + 2, out[2]); unpack64v (tmps, out, gid, i + 3, out[3]); unpack64v (tmps, out, gid, i + 4, out[4]); unpack64v (tmps, out, gid, i + 5, out[5]); unpack64v (tmps, out, gid, i + 6, out[6]); unpack64v (tmps, out, gid, i + 7, out[7]); } } __kernel void m06221_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; u32 ukey1[8]; ukey1[0] = swap32_S (h32_from_64_S (tmps[gid].out[0])); ukey1[1] = swap32_S (l32_from_64_S (tmps[gid].out[0])); ukey1[2] = swap32_S (h32_from_64_S (tmps[gid].out[1])); ukey1[3] = swap32_S (l32_from_64_S (tmps[gid].out[1])); ukey1[4] = swap32_S (h32_from_64_S (tmps[gid].out[2])); ukey1[5] = swap32_S (l32_from_64_S (tmps[gid].out[2])); ukey1[6] = swap32_S (h32_from_64_S (tmps[gid].out[3])); ukey1[7] = swap32_S (l32_from_64_S (tmps[gid].out[3])); u32 ukey2[8]; ukey2[0] = swap32_S (h32_from_64_S (tmps[gid].out[4])); ukey2[1] = swap32_S (l32_from_64_S (tmps[gid].out[4])); ukey2[2] = swap32_S (h32_from_64_S (tmps[gid].out[5])); ukey2[3] = swap32_S (l32_from_64_S (tmps[gid].out[5])); ukey2[4] = swap32_S (h32_from_64_S (tmps[gid].out[6])); ukey2[5] = swap32_S (l32_from_64_S (tmps[gid].out[6])); ukey2[6] = swap32_S (h32_from_64_S (tmps[gid].out[7])); ukey2[7] = swap32_S (l32_from_64_S (tmps[gid].out[7])); if (verify_header_aes (esalt_bufs, ukey1, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m06222.cl000066400000000000000000000461751320027462700154370ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" #include "inc_cipher_aes.cl" #include "inc_cipher_twofish.cl" #include "inc_cipher_serpent.cl" #include "inc_truecrypt_crc32.cl" #include "inc_truecrypt_xts.cl" 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; } void hmac_sha512_run_V (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); w0[0] = h32_from_64 (digest[0]); w0[1] = l32_from_64 (digest[0]); w0[2] = h32_from_64 (digest[1]); w0[3] = l32_from_64 (digest[1]); w1[0] = h32_from_64 (digest[2]); w1[1] = l32_from_64 (digest[2]); w1[2] = h32_from_64 (digest[3]); w1[3] = l32_from_64 (digest[3]); w2[0] = h32_from_64 (digest[4]); w2[1] = l32_from_64 (digest[4]); w2[2] = h32_from_64 (digest[5]); w2[3] = l32_from_64 (digest[5]); w3[0] = h32_from_64 (digest[6]); w3[1] = l32_from_64 (digest[6]); w3[2] = h32_from_64 (digest[7]); w3[3] = l32_from_64 (digest[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } __kernel void m06222_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; 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]; w4[0] = pws[gid].i[16]; w4[1] = pws[gid].i[17]; w4[2] = pws[gid].i[18]; w4[3] = pws[gid].i[19]; w5[0] = pws[gid].i[20]; w5[1] = pws[gid].i[21]; w5[2] = pws[gid].i[22]; w5[3] = pws[gid].i[23]; w6[0] = pws[gid].i[24]; w6[1] = pws[gid].i[25]; w6[2] = pws[gid].i[26]; w6[3] = pws[gid].i[27]; w7[0] = pws[gid].i[28]; w7[1] = pws[gid].i[29]; w7[2] = pws[gid].i[30]; w7[3] = pws[gid].i[31]; w0[0] = u8add (w0[0], esalt_bufs[digests_offset].keyfile_buf[ 0]); w0[1] = u8add (w0[1], esalt_bufs[digests_offset].keyfile_buf[ 1]); w0[2] = u8add (w0[2], esalt_bufs[digests_offset].keyfile_buf[ 2]); w0[3] = u8add (w0[3], esalt_bufs[digests_offset].keyfile_buf[ 3]); w1[0] = u8add (w1[0], esalt_bufs[digests_offset].keyfile_buf[ 4]); w1[1] = u8add (w1[1], esalt_bufs[digests_offset].keyfile_buf[ 5]); w1[2] = u8add (w1[2], esalt_bufs[digests_offset].keyfile_buf[ 6]); w1[3] = u8add (w1[3], esalt_bufs[digests_offset].keyfile_buf[ 7]); w2[0] = u8add (w2[0], esalt_bufs[digests_offset].keyfile_buf[ 8]); w2[1] = u8add (w2[1], esalt_bufs[digests_offset].keyfile_buf[ 9]); w2[2] = u8add (w2[2], esalt_bufs[digests_offset].keyfile_buf[10]); w2[3] = u8add (w2[3], esalt_bufs[digests_offset].keyfile_buf[11]); w3[0] = u8add (w3[0], esalt_bufs[digests_offset].keyfile_buf[12]); w3[1] = u8add (w3[1], esalt_bufs[digests_offset].keyfile_buf[13]); w3[2] = u8add (w3[2], esalt_bufs[digests_offset].keyfile_buf[14]); w3[3] = u8add (w3[3], esalt_bufs[digests_offset].keyfile_buf[15]); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha512_hmac_ctx_t sha512_hmac_ctx; sha512_hmac_init_128 (&sha512_hmac_ctx, w0, w1, w2, w3, w5, w5, w6, w7); tmps[gid].ipad[0] = sha512_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha512_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha512_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha512_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha512_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha512_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha512_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha512_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha512_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha512_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha512_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha512_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha512_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha512_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha512_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha512_hmac_ctx.opad.h[7]; sha512_hmac_update_global_swap (&sha512_hmac_ctx, esalt_bufs[digests_offset].salt_buf, 64); for (u32 i = 0, j = 1; i < 16; i += 8, j += 1) { sha512_hmac_ctx_t sha512_hmac_ctx2 = sha512_hmac_ctx; w0[0] = j; 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] = 0; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_update_128 (&sha512_hmac_ctx2, w0, w1, w2, w3, w4, w5, w6, w7, 4); sha512_hmac_final (&sha512_hmac_ctx2); tmps[gid].dgst[i + 0] = sha512_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha512_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha512_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha512_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha512_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha512_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha512_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha512_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m06222_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u64x ipad[8]; u64x opad[8]; ipad[0] = pack64v (tmps, ipad, gid, 0); ipad[1] = pack64v (tmps, ipad, gid, 1); ipad[2] = pack64v (tmps, ipad, gid, 2); ipad[3] = pack64v (tmps, ipad, gid, 3); ipad[4] = pack64v (tmps, ipad, gid, 4); ipad[5] = pack64v (tmps, ipad, gid, 5); ipad[6] = pack64v (tmps, ipad, gid, 6); ipad[7] = pack64v (tmps, ipad, gid, 7); opad[0] = pack64v (tmps, opad, gid, 0); opad[1] = pack64v (tmps, opad, gid, 1); opad[2] = pack64v (tmps, opad, gid, 2); opad[3] = pack64v (tmps, opad, gid, 3); opad[4] = pack64v (tmps, opad, gid, 4); opad[5] = pack64v (tmps, opad, gid, 5); opad[6] = pack64v (tmps, opad, gid, 6); opad[7] = pack64v (tmps, opad, gid, 7); for (u32 i = 0; i < 16; i += 8) { u64x dgst[8]; u64x out[8]; dgst[0] = pack64v (tmps, dgst, gid, i + 0); dgst[1] = pack64v (tmps, dgst, gid, i + 1); dgst[2] = pack64v (tmps, dgst, gid, i + 2); dgst[3] = pack64v (tmps, dgst, gid, i + 3); dgst[4] = pack64v (tmps, dgst, gid, i + 4); dgst[5] = pack64v (tmps, dgst, gid, i + 5); dgst[6] = pack64v (tmps, dgst, gid, i + 6); dgst[7] = pack64v (tmps, dgst, gid, i + 7); out[0] = pack64v (tmps, out, gid, i + 0); out[1] = pack64v (tmps, out, gid, i + 1); out[2] = pack64v (tmps, out, gid, i + 2); out[3] = pack64v (tmps, out, gid, i + 3); out[4] = pack64v (tmps, out, gid, i + 4); out[5] = pack64v (tmps, out, gid, i + 5); out[6] = pack64v (tmps, out, gid, i + 6); out[7] = pack64v (tmps, out, gid, i + 7); for (u32 j = 0; j < loop_cnt; j++) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; w0[0] = h32_from_64 (dgst[0]); w0[1] = l32_from_64 (dgst[0]); w0[2] = h32_from_64 (dgst[1]); w0[3] = l32_from_64 (dgst[1]); w1[0] = h32_from_64 (dgst[2]); w1[1] = l32_from_64 (dgst[2]); w1[2] = h32_from_64 (dgst[3]); w1[3] = l32_from_64 (dgst[3]); w2[0] = h32_from_64 (dgst[4]); w2[1] = l32_from_64 (dgst[4]); w2[2] = h32_from_64 (dgst[5]); w2[3] = l32_from_64 (dgst[5]); w3[0] = h32_from_64 (dgst[6]); w3[1] = l32_from_64 (dgst[6]); w3[2] = h32_from_64 (dgst[7]); w3[3] = l32_from_64 (dgst[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = (128 + 64) * 8; hmac_sha512_run_V (w0, w1, w2, w3, w4, w5, w6, w7, 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]; } unpack64v (tmps, dgst, gid, i + 0, dgst[0]); unpack64v (tmps, dgst, gid, i + 1, dgst[1]); unpack64v (tmps, dgst, gid, i + 2, dgst[2]); unpack64v (tmps, dgst, gid, i + 3, dgst[3]); unpack64v (tmps, dgst, gid, i + 4, dgst[4]); unpack64v (tmps, dgst, gid, i + 5, dgst[5]); unpack64v (tmps, dgst, gid, i + 6, dgst[6]); unpack64v (tmps, dgst, gid, i + 7, dgst[7]); unpack64v (tmps, out, gid, i + 0, out[0]); unpack64v (tmps, out, gid, i + 1, out[1]); unpack64v (tmps, out, gid, i + 2, out[2]); unpack64v (tmps, out, gid, i + 3, out[3]); unpack64v (tmps, out, gid, i + 4, out[4]); unpack64v (tmps, out, gid, i + 5, out[5]); unpack64v (tmps, out, gid, i + 6, out[6]); unpack64v (tmps, out, gid, i + 7, out[7]); } } __kernel void m06222_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; u32 ukey1[8]; ukey1[0] = swap32_S (h32_from_64_S (tmps[gid].out[0])); ukey1[1] = swap32_S (l32_from_64_S (tmps[gid].out[0])); ukey1[2] = swap32_S (h32_from_64_S (tmps[gid].out[1])); ukey1[3] = swap32_S (l32_from_64_S (tmps[gid].out[1])); ukey1[4] = swap32_S (h32_from_64_S (tmps[gid].out[2])); ukey1[5] = swap32_S (l32_from_64_S (tmps[gid].out[2])); ukey1[6] = swap32_S (h32_from_64_S (tmps[gid].out[3])); ukey1[7] = swap32_S (l32_from_64_S (tmps[gid].out[3])); u32 ukey2[8]; ukey2[0] = swap32_S (h32_from_64_S (tmps[gid].out[4])); ukey2[1] = swap32_S (l32_from_64_S (tmps[gid].out[4])); ukey2[2] = swap32_S (h32_from_64_S (tmps[gid].out[5])); ukey2[3] = swap32_S (l32_from_64_S (tmps[gid].out[5])); ukey2[4] = swap32_S (h32_from_64_S (tmps[gid].out[6])); ukey2[5] = swap32_S (l32_from_64_S (tmps[gid].out[6])); ukey2[6] = swap32_S (h32_from_64_S (tmps[gid].out[7])); ukey2[7] = swap32_S (l32_from_64_S (tmps[gid].out[7])); if (verify_header_aes (esalt_bufs, ukey1, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } u32 ukey3[8]; ukey3[0] = swap32_S (h32_from_64_S (tmps[gid].out[ 8])); ukey3[1] = swap32_S (l32_from_64_S (tmps[gid].out[ 8])); ukey3[2] = swap32_S (h32_from_64_S (tmps[gid].out[ 9])); ukey3[3] = swap32_S (l32_from_64_S (tmps[gid].out[ 9])); ukey3[4] = swap32_S (h32_from_64_S (tmps[gid].out[10])); ukey3[5] = swap32_S (l32_from_64_S (tmps[gid].out[10])); ukey3[6] = swap32_S (h32_from_64_S (tmps[gid].out[11])); ukey3[7] = swap32_S (l32_from_64_S (tmps[gid].out[11])); u32 ukey4[8]; ukey4[0] = swap32_S (h32_from_64_S (tmps[gid].out[12])); ukey4[1] = swap32_S (l32_from_64_S (tmps[gid].out[12])); ukey4[2] = swap32_S (h32_from_64_S (tmps[gid].out[13])); ukey4[3] = swap32_S (l32_from_64_S (tmps[gid].out[13])); ukey4[4] = swap32_S (h32_from_64_S (tmps[gid].out[14])); ukey4[5] = swap32_S (l32_from_64_S (tmps[gid].out[14])); ukey4[6] = swap32_S (h32_from_64_S (tmps[gid].out[15])); ukey4[7] = swap32_S (l32_from_64_S (tmps[gid].out[15])); if (verify_header_aes_twofish (esalt_bufs, ukey1, ukey2, ukey3, ukey4, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent_aes (esalt_bufs, ukey1, ukey2, ukey3, ukey4, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish_serpent (esalt_bufs, ukey1, ukey2, ukey3, ukey4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m06223.cl000066400000000000000000000513131320027462700154260ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" #include "inc_cipher_aes.cl" #include "inc_cipher_twofish.cl" #include "inc_cipher_serpent.cl" #include "inc_truecrypt_crc32.cl" #include "inc_truecrypt_xts.cl" 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; } void hmac_sha512_run_V (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); w0[0] = h32_from_64 (digest[0]); w0[1] = l32_from_64 (digest[0]); w0[2] = h32_from_64 (digest[1]); w0[3] = l32_from_64 (digest[1]); w1[0] = h32_from_64 (digest[2]); w1[1] = l32_from_64 (digest[2]); w1[2] = h32_from_64 (digest[3]); w1[3] = l32_from_64 (digest[3]); w2[0] = h32_from_64 (digest[4]); w2[1] = l32_from_64 (digest[4]); w2[2] = h32_from_64 (digest[5]); w2[3] = l32_from_64 (digest[5]); w3[0] = h32_from_64 (digest[6]); w3[1] = l32_from_64 (digest[6]); w3[2] = h32_from_64 (digest[7]); w3[3] = l32_from_64 (digest[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } __kernel void m06223_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; 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]; w4[0] = pws[gid].i[16]; w4[1] = pws[gid].i[17]; w4[2] = pws[gid].i[18]; w4[3] = pws[gid].i[19]; w5[0] = pws[gid].i[20]; w5[1] = pws[gid].i[21]; w5[2] = pws[gid].i[22]; w5[3] = pws[gid].i[23]; w6[0] = pws[gid].i[24]; w6[1] = pws[gid].i[25]; w6[2] = pws[gid].i[26]; w6[3] = pws[gid].i[27]; w7[0] = pws[gid].i[28]; w7[1] = pws[gid].i[29]; w7[2] = pws[gid].i[30]; w7[3] = pws[gid].i[31]; w0[0] = u8add (w0[0], esalt_bufs[digests_offset].keyfile_buf[ 0]); w0[1] = u8add (w0[1], esalt_bufs[digests_offset].keyfile_buf[ 1]); w0[2] = u8add (w0[2], esalt_bufs[digests_offset].keyfile_buf[ 2]); w0[3] = u8add (w0[3], esalt_bufs[digests_offset].keyfile_buf[ 3]); w1[0] = u8add (w1[0], esalt_bufs[digests_offset].keyfile_buf[ 4]); w1[1] = u8add (w1[1], esalt_bufs[digests_offset].keyfile_buf[ 5]); w1[2] = u8add (w1[2], esalt_bufs[digests_offset].keyfile_buf[ 6]); w1[3] = u8add (w1[3], esalt_bufs[digests_offset].keyfile_buf[ 7]); w2[0] = u8add (w2[0], esalt_bufs[digests_offset].keyfile_buf[ 8]); w2[1] = u8add (w2[1], esalt_bufs[digests_offset].keyfile_buf[ 9]); w2[2] = u8add (w2[2], esalt_bufs[digests_offset].keyfile_buf[10]); w2[3] = u8add (w2[3], esalt_bufs[digests_offset].keyfile_buf[11]); w3[0] = u8add (w3[0], esalt_bufs[digests_offset].keyfile_buf[12]); w3[1] = u8add (w3[1], esalt_bufs[digests_offset].keyfile_buf[13]); w3[2] = u8add (w3[2], esalt_bufs[digests_offset].keyfile_buf[14]); w3[3] = u8add (w3[3], esalt_bufs[digests_offset].keyfile_buf[15]); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); w4[0] = swap32_S (w4[0]); w4[1] = swap32_S (w4[1]); w4[2] = swap32_S (w4[2]); w4[3] = swap32_S (w4[3]); w5[0] = swap32_S (w5[0]); w5[1] = swap32_S (w5[1]); w5[2] = swap32_S (w5[2]); w5[3] = swap32_S (w5[3]); w6[0] = swap32_S (w6[0]); w6[1] = swap32_S (w6[1]); w6[2] = swap32_S (w6[2]); w6[3] = swap32_S (w6[3]); w7[0] = swap32_S (w7[0]); w7[1] = swap32_S (w7[1]); w7[2] = swap32_S (w7[2]); w7[3] = swap32_S (w7[3]); sha512_hmac_ctx_t sha512_hmac_ctx; sha512_hmac_init_128 (&sha512_hmac_ctx, w0, w1, w2, w3, w5, w5, w6, w7); tmps[gid].ipad[0] = sha512_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha512_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha512_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha512_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha512_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha512_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha512_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha512_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha512_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha512_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha512_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha512_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha512_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha512_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha512_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha512_hmac_ctx.opad.h[7]; sha512_hmac_update_global_swap (&sha512_hmac_ctx, esalt_bufs[digests_offset].salt_buf, 64); for (u32 i = 0, j = 1; i < 24; i += 8, j += 1) { sha512_hmac_ctx_t sha512_hmac_ctx2 = sha512_hmac_ctx; w0[0] = j; 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] = 0; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_update_128 (&sha512_hmac_ctx2, w0, w1, w2, w3, w4, w5, w6, w7, 4); sha512_hmac_final (&sha512_hmac_ctx2); tmps[gid].dgst[i + 0] = sha512_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha512_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha512_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha512_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha512_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha512_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha512_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha512_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m06223_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u64x ipad[8]; u64x opad[8]; ipad[0] = pack64v (tmps, ipad, gid, 0); ipad[1] = pack64v (tmps, ipad, gid, 1); ipad[2] = pack64v (tmps, ipad, gid, 2); ipad[3] = pack64v (tmps, ipad, gid, 3); ipad[4] = pack64v (tmps, ipad, gid, 4); ipad[5] = pack64v (tmps, ipad, gid, 5); ipad[6] = pack64v (tmps, ipad, gid, 6); ipad[7] = pack64v (tmps, ipad, gid, 7); opad[0] = pack64v (tmps, opad, gid, 0); opad[1] = pack64v (tmps, opad, gid, 1); opad[2] = pack64v (tmps, opad, gid, 2); opad[3] = pack64v (tmps, opad, gid, 3); opad[4] = pack64v (tmps, opad, gid, 4); opad[5] = pack64v (tmps, opad, gid, 5); opad[6] = pack64v (tmps, opad, gid, 6); opad[7] = pack64v (tmps, opad, gid, 7); for (u32 i = 0; i < 24; i += 8) { u64x dgst[8]; u64x out[8]; dgst[0] = pack64v (tmps, dgst, gid, i + 0); dgst[1] = pack64v (tmps, dgst, gid, i + 1); dgst[2] = pack64v (tmps, dgst, gid, i + 2); dgst[3] = pack64v (tmps, dgst, gid, i + 3); dgst[4] = pack64v (tmps, dgst, gid, i + 4); dgst[5] = pack64v (tmps, dgst, gid, i + 5); dgst[6] = pack64v (tmps, dgst, gid, i + 6); dgst[7] = pack64v (tmps, dgst, gid, i + 7); out[0] = pack64v (tmps, out, gid, i + 0); out[1] = pack64v (tmps, out, gid, i + 1); out[2] = pack64v (tmps, out, gid, i + 2); out[3] = pack64v (tmps, out, gid, i + 3); out[4] = pack64v (tmps, out, gid, i + 4); out[5] = pack64v (tmps, out, gid, i + 5); out[6] = pack64v (tmps, out, gid, i + 6); out[7] = pack64v (tmps, out, gid, i + 7); for (u32 j = 0; j < loop_cnt; j++) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; w0[0] = h32_from_64 (dgst[0]); w0[1] = l32_from_64 (dgst[0]); w0[2] = h32_from_64 (dgst[1]); w0[3] = l32_from_64 (dgst[1]); w1[0] = h32_from_64 (dgst[2]); w1[1] = l32_from_64 (dgst[2]); w1[2] = h32_from_64 (dgst[3]); w1[3] = l32_from_64 (dgst[3]); w2[0] = h32_from_64 (dgst[4]); w2[1] = l32_from_64 (dgst[4]); w2[2] = h32_from_64 (dgst[5]); w2[3] = l32_from_64 (dgst[5]); w3[0] = h32_from_64 (dgst[6]); w3[1] = l32_from_64 (dgst[6]); w3[2] = h32_from_64 (dgst[7]); w3[3] = l32_from_64 (dgst[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = (128 + 64) * 8; hmac_sha512_run_V (w0, w1, w2, w3, w4, w5, w6, w7, 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]; } unpack64v (tmps, dgst, gid, i + 0, dgst[0]); unpack64v (tmps, dgst, gid, i + 1, dgst[1]); unpack64v (tmps, dgst, gid, i + 2, dgst[2]); unpack64v (tmps, dgst, gid, i + 3, dgst[3]); unpack64v (tmps, dgst, gid, i + 4, dgst[4]); unpack64v (tmps, dgst, gid, i + 5, dgst[5]); unpack64v (tmps, dgst, gid, i + 6, dgst[6]); unpack64v (tmps, dgst, gid, i + 7, dgst[7]); unpack64v (tmps, out, gid, i + 0, out[0]); unpack64v (tmps, out, gid, i + 1, out[1]); unpack64v (tmps, out, gid, i + 2, out[2]); unpack64v (tmps, out, gid, i + 3, out[3]); unpack64v (tmps, out, gid, i + 4, out[4]); unpack64v (tmps, out, gid, i + 5, out[5]); unpack64v (tmps, out, gid, i + 6, out[6]); unpack64v (tmps, out, gid, i + 7, out[7]); } } __kernel void m06223_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; u32 ukey1[8]; ukey1[0] = swap32_S (h32_from_64_S (tmps[gid].out[0])); ukey1[1] = swap32_S (l32_from_64_S (tmps[gid].out[0])); ukey1[2] = swap32_S (h32_from_64_S (tmps[gid].out[1])); ukey1[3] = swap32_S (l32_from_64_S (tmps[gid].out[1])); ukey1[4] = swap32_S (h32_from_64_S (tmps[gid].out[2])); ukey1[5] = swap32_S (l32_from_64_S (tmps[gid].out[2])); ukey1[6] = swap32_S (h32_from_64_S (tmps[gid].out[3])); ukey1[7] = swap32_S (l32_from_64_S (tmps[gid].out[3])); u32 ukey2[8]; ukey2[0] = swap32_S (h32_from_64_S (tmps[gid].out[4])); ukey2[1] = swap32_S (l32_from_64_S (tmps[gid].out[4])); ukey2[2] = swap32_S (h32_from_64_S (tmps[gid].out[5])); ukey2[3] = swap32_S (l32_from_64_S (tmps[gid].out[5])); ukey2[4] = swap32_S (h32_from_64_S (tmps[gid].out[6])); ukey2[5] = swap32_S (l32_from_64_S (tmps[gid].out[6])); ukey2[6] = swap32_S (h32_from_64_S (tmps[gid].out[7])); ukey2[7] = swap32_S (l32_from_64_S (tmps[gid].out[7])); if (verify_header_aes (esalt_bufs, ukey1, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } u32 ukey3[8]; ukey3[0] = swap32_S (h32_from_64_S (tmps[gid].out[ 8])); ukey3[1] = swap32_S (l32_from_64_S (tmps[gid].out[ 8])); ukey3[2] = swap32_S (h32_from_64_S (tmps[gid].out[ 9])); ukey3[3] = swap32_S (l32_from_64_S (tmps[gid].out[ 9])); ukey3[4] = swap32_S (h32_from_64_S (tmps[gid].out[10])); ukey3[5] = swap32_S (l32_from_64_S (tmps[gid].out[10])); ukey3[6] = swap32_S (h32_from_64_S (tmps[gid].out[11])); ukey3[7] = swap32_S (l32_from_64_S (tmps[gid].out[11])); u32 ukey4[8]; ukey4[0] = swap32_S (h32_from_64_S (tmps[gid].out[12])); ukey4[1] = swap32_S (l32_from_64_S (tmps[gid].out[12])); ukey4[2] = swap32_S (h32_from_64_S (tmps[gid].out[13])); ukey4[3] = swap32_S (l32_from_64_S (tmps[gid].out[13])); ukey4[4] = swap32_S (h32_from_64_S (tmps[gid].out[14])); ukey4[5] = swap32_S (l32_from_64_S (tmps[gid].out[14])); ukey4[6] = swap32_S (h32_from_64_S (tmps[gid].out[15])); ukey4[7] = swap32_S (l32_from_64_S (tmps[gid].out[15])); if (verify_header_aes_twofish (esalt_bufs, ukey1, ukey2, ukey3, ukey4, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent_aes (esalt_bufs, ukey1, ukey2, ukey3, ukey4, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish_serpent (esalt_bufs, ukey1, ukey2, ukey3, ukey4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } u32 ukey5[8]; ukey5[0] = swap32_S (h32_from_64_S (tmps[gid].out[16])); ukey5[1] = swap32_S (l32_from_64_S (tmps[gid].out[16])); ukey5[2] = swap32_S (h32_from_64_S (tmps[gid].out[17])); ukey5[3] = swap32_S (l32_from_64_S (tmps[gid].out[17])); ukey5[4] = swap32_S (h32_from_64_S (tmps[gid].out[18])); ukey5[5] = swap32_S (l32_from_64_S (tmps[gid].out[18])); ukey5[6] = swap32_S (h32_from_64_S (tmps[gid].out[19])); ukey5[7] = swap32_S (l32_from_64_S (tmps[gid].out[19])); u32 ukey6[8]; ukey6[0] = swap32_S (h32_from_64_S (tmps[gid].out[20])); ukey6[1] = swap32_S (l32_from_64_S (tmps[gid].out[20])); ukey6[2] = swap32_S (h32_from_64_S (tmps[gid].out[21])); ukey6[3] = swap32_S (l32_from_64_S (tmps[gid].out[21])); ukey6[4] = swap32_S (h32_from_64_S (tmps[gid].out[22])); ukey6[5] = swap32_S (l32_from_64_S (tmps[gid].out[22])); ukey6[6] = swap32_S (h32_from_64_S (tmps[gid].out[23])); ukey6[7] = swap32_S (l32_from_64_S (tmps[gid].out[23])); if (verify_header_aes_twofish_serpent (esalt_bufs, ukey1, ukey2, ukey3, ukey4, ukey5, ukey6, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent_twofish_aes (esalt_bufs, ukey1, ukey2, ukey3, ukey4, ukey5, ukey6, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m06231.cl000066400000000000000000000535341320027462700154340ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_whirlpool.cl" #include "inc_cipher_aes.cl" #include "inc_cipher_twofish.cl" #include "inc_cipher_serpent.cl" #include "inc_truecrypt_crc32.cl" #include "inc_truecrypt_xts.cl" 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; } void hmac_whirlpool_run_V (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[16], u32x opad[16], u32x digest[16], SHM_TYPE u32 (*s_Ch)[256], SHM_TYPE u32 (*s_Cl)[256]) { 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]; digest[ 8] = ipad[ 8]; digest[ 9] = ipad[ 9]; digest[10] = ipad[10]; digest[11] = ipad[11]; digest[12] = ipad[12]; digest[13] = ipad[13]; digest[14] = ipad[14]; digest[15] = ipad[15]; whirlpool_transform_vector (w0, w1, w2, w3, digest, s_Ch, s_Cl); 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 + 64) * 8; whirlpool_transform_vector (w0, w1, w2, w3, digest, s_Ch, s_Cl); 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] = digest[ 8]; w2[1] = digest[ 9]; w2[2] = digest[10]; w2[3] = digest[11]; w3[0] = digest[12]; w3[1] = digest[13]; w3[2] = digest[14]; w3[3] = digest[15]; 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]; digest[ 8] = opad[ 8]; digest[ 9] = opad[ 9]; digest[10] = opad[10]; digest[11] = opad[11]; digest[12] = opad[12]; digest[13] = opad[13]; digest[14] = opad[14]; digest[15] = opad[15]; whirlpool_transform_vector (w0, w1, w2, w3, digest, s_Ch, s_Cl); 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 + 64) * 8; whirlpool_transform_vector (w0, w1, w2, w3, digest, s_Ch, s_Cl); } __kernel void m06231_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if (gid >= gid_max) return; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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]; w0[0] = u8add (w0[0], esalt_bufs[digests_offset].keyfile_buf[ 0]); w0[1] = u8add (w0[1], esalt_bufs[digests_offset].keyfile_buf[ 1]); w0[2] = u8add (w0[2], esalt_bufs[digests_offset].keyfile_buf[ 2]); w0[3] = u8add (w0[3], esalt_bufs[digests_offset].keyfile_buf[ 3]); w1[0] = u8add (w1[0], esalt_bufs[digests_offset].keyfile_buf[ 4]); w1[1] = u8add (w1[1], esalt_bufs[digests_offset].keyfile_buf[ 5]); w1[2] = u8add (w1[2], esalt_bufs[digests_offset].keyfile_buf[ 6]); w1[3] = u8add (w1[3], esalt_bufs[digests_offset].keyfile_buf[ 7]); w2[0] = u8add (w2[0], esalt_bufs[digests_offset].keyfile_buf[ 8]); w2[1] = u8add (w2[1], esalt_bufs[digests_offset].keyfile_buf[ 9]); w2[2] = u8add (w2[2], esalt_bufs[digests_offset].keyfile_buf[10]); w2[3] = u8add (w2[3], esalt_bufs[digests_offset].keyfile_buf[11]); w3[0] = u8add (w3[0], esalt_bufs[digests_offset].keyfile_buf[12]); w3[1] = u8add (w3[1], esalt_bufs[digests_offset].keyfile_buf[13]); w3[2] = u8add (w3[2], esalt_bufs[digests_offset].keyfile_buf[14]); w3[3] = u8add (w3[3], esalt_bufs[digests_offset].keyfile_buf[15]); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); whirlpool_hmac_ctx_t whirlpool_hmac_ctx; whirlpool_hmac_init_64 (&whirlpool_hmac_ctx, w0, w1, w2, w3, s_Ch, s_Cl); tmps[gid].ipad[ 0] = whirlpool_hmac_ctx.ipad.h[ 0]; tmps[gid].ipad[ 1] = whirlpool_hmac_ctx.ipad.h[ 1]; tmps[gid].ipad[ 2] = whirlpool_hmac_ctx.ipad.h[ 2]; tmps[gid].ipad[ 3] = whirlpool_hmac_ctx.ipad.h[ 3]; tmps[gid].ipad[ 4] = whirlpool_hmac_ctx.ipad.h[ 4]; tmps[gid].ipad[ 5] = whirlpool_hmac_ctx.ipad.h[ 5]; tmps[gid].ipad[ 6] = whirlpool_hmac_ctx.ipad.h[ 6]; tmps[gid].ipad[ 7] = whirlpool_hmac_ctx.ipad.h[ 7]; tmps[gid].ipad[ 8] = whirlpool_hmac_ctx.ipad.h[ 8]; tmps[gid].ipad[ 9] = whirlpool_hmac_ctx.ipad.h[ 9]; tmps[gid].ipad[10] = whirlpool_hmac_ctx.ipad.h[10]; tmps[gid].ipad[11] = whirlpool_hmac_ctx.ipad.h[11]; tmps[gid].ipad[12] = whirlpool_hmac_ctx.ipad.h[12]; tmps[gid].ipad[13] = whirlpool_hmac_ctx.ipad.h[13]; tmps[gid].ipad[14] = whirlpool_hmac_ctx.ipad.h[14]; tmps[gid].ipad[15] = whirlpool_hmac_ctx.ipad.h[15]; tmps[gid].opad[ 0] = whirlpool_hmac_ctx.opad.h[ 0]; tmps[gid].opad[ 1] = whirlpool_hmac_ctx.opad.h[ 1]; tmps[gid].opad[ 2] = whirlpool_hmac_ctx.opad.h[ 2]; tmps[gid].opad[ 3] = whirlpool_hmac_ctx.opad.h[ 3]; tmps[gid].opad[ 4] = whirlpool_hmac_ctx.opad.h[ 4]; tmps[gid].opad[ 5] = whirlpool_hmac_ctx.opad.h[ 5]; tmps[gid].opad[ 6] = whirlpool_hmac_ctx.opad.h[ 6]; tmps[gid].opad[ 7] = whirlpool_hmac_ctx.opad.h[ 7]; tmps[gid].opad[ 8] = whirlpool_hmac_ctx.opad.h[ 8]; tmps[gid].opad[ 9] = whirlpool_hmac_ctx.opad.h[ 9]; tmps[gid].opad[10] = whirlpool_hmac_ctx.opad.h[10]; tmps[gid].opad[11] = whirlpool_hmac_ctx.opad.h[11]; tmps[gid].opad[12] = whirlpool_hmac_ctx.opad.h[12]; tmps[gid].opad[13] = whirlpool_hmac_ctx.opad.h[13]; tmps[gid].opad[14] = whirlpool_hmac_ctx.opad.h[14]; tmps[gid].opad[15] = whirlpool_hmac_ctx.opad.h[15]; whirlpool_hmac_update_global_swap (&whirlpool_hmac_ctx, esalt_bufs[digests_offset].salt_buf, 64); for (u32 i = 0, j = 1; i < 16; i += 16, j += 1) { whirlpool_hmac_ctx_t whirlpool_hmac_ctx2 = whirlpool_hmac_ctx; w0[0] = j; 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] = 0; whirlpool_hmac_update_64 (&whirlpool_hmac_ctx2, w0, w1, w2, w3, 4); whirlpool_hmac_final (&whirlpool_hmac_ctx2); tmps[gid].dgst[i + 0] = whirlpool_hmac_ctx2.opad.h[ 0]; tmps[gid].dgst[i + 1] = whirlpool_hmac_ctx2.opad.h[ 1]; tmps[gid].dgst[i + 2] = whirlpool_hmac_ctx2.opad.h[ 2]; tmps[gid].dgst[i + 3] = whirlpool_hmac_ctx2.opad.h[ 3]; tmps[gid].dgst[i + 4] = whirlpool_hmac_ctx2.opad.h[ 4]; tmps[gid].dgst[i + 5] = whirlpool_hmac_ctx2.opad.h[ 5]; tmps[gid].dgst[i + 6] = whirlpool_hmac_ctx2.opad.h[ 6]; tmps[gid].dgst[i + 7] = whirlpool_hmac_ctx2.opad.h[ 7]; tmps[gid].dgst[i + 8] = whirlpool_hmac_ctx2.opad.h[ 8]; tmps[gid].dgst[i + 9] = whirlpool_hmac_ctx2.opad.h[ 9]; tmps[gid].dgst[i + 10] = whirlpool_hmac_ctx2.opad.h[10]; tmps[gid].dgst[i + 11] = whirlpool_hmac_ctx2.opad.h[11]; tmps[gid].dgst[i + 12] = whirlpool_hmac_ctx2.opad.h[12]; tmps[gid].dgst[i + 13] = whirlpool_hmac_ctx2.opad.h[13]; tmps[gid].dgst[i + 14] = whirlpool_hmac_ctx2.opad.h[14]; tmps[gid].dgst[i + 15] = whirlpool_hmac_ctx2.opad.h[15]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; tmps[gid].out[i + 8] = tmps[gid].dgst[i + 8]; tmps[gid].out[i + 9] = tmps[gid].dgst[i + 9]; tmps[gid].out[i + 10] = tmps[gid].dgst[i + 10]; tmps[gid].out[i + 11] = tmps[gid].dgst[i + 11]; tmps[gid].out[i + 12] = tmps[gid].dgst[i + 12]; tmps[gid].out[i + 13] = tmps[gid].dgst[i + 13]; tmps[gid].out[i + 14] = tmps[gid].dgst[i + 14]; tmps[gid].out[i + 15] = tmps[gid].dgst[i + 15]; } } __kernel void m06231_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[16]; u32x opad[16]; ipad[ 0] = packv (tmps, ipad, gid, 0); ipad[ 1] = packv (tmps, ipad, gid, 1); ipad[ 2] = packv (tmps, ipad, gid, 2); ipad[ 3] = packv (tmps, ipad, gid, 3); ipad[ 4] = packv (tmps, ipad, gid, 4); ipad[ 5] = packv (tmps, ipad, gid, 5); ipad[ 6] = packv (tmps, ipad, gid, 6); ipad[ 7] = packv (tmps, ipad, gid, 7); ipad[ 8] = packv (tmps, ipad, gid, 8); ipad[ 9] = packv (tmps, ipad, gid, 9); ipad[10] = packv (tmps, ipad, gid, 10); ipad[11] = packv (tmps, ipad, gid, 11); ipad[12] = packv (tmps, ipad, gid, 12); ipad[13] = packv (tmps, ipad, gid, 13); ipad[14] = packv (tmps, ipad, gid, 14); ipad[15] = packv (tmps, ipad, gid, 15); opad[ 0] = packv (tmps, opad, gid, 0); opad[ 1] = packv (tmps, opad, gid, 1); opad[ 2] = packv (tmps, opad, gid, 2); opad[ 3] = packv (tmps, opad, gid, 3); opad[ 4] = packv (tmps, opad, gid, 4); opad[ 5] = packv (tmps, opad, gid, 5); opad[ 6] = packv (tmps, opad, gid, 6); opad[ 7] = packv (tmps, opad, gid, 7); opad[ 8] = packv (tmps, opad, gid, 8); opad[ 9] = packv (tmps, opad, gid, 9); opad[10] = packv (tmps, opad, gid, 10); opad[11] = packv (tmps, opad, gid, 11); opad[12] = packv (tmps, opad, gid, 12); opad[13] = packv (tmps, opad, gid, 13); opad[14] = packv (tmps, opad, gid, 14); opad[15] = packv (tmps, opad, gid, 15); for (u32 i = 0; i < 16; i += 16) { u32x dgst[16]; u32x out[16]; dgst[ 0] = packv (tmps, dgst, gid, i + 0); dgst[ 1] = packv (tmps, dgst, gid, i + 1); dgst[ 2] = packv (tmps, dgst, gid, i + 2); dgst[ 3] = packv (tmps, dgst, gid, i + 3); dgst[ 4] = packv (tmps, dgst, gid, i + 4); dgst[ 5] = packv (tmps, dgst, gid, i + 5); dgst[ 6] = packv (tmps, dgst, gid, i + 6); dgst[ 7] = packv (tmps, dgst, gid, i + 7); dgst[ 8] = packv (tmps, dgst, gid, i + 8); dgst[ 9] = packv (tmps, dgst, gid, i + 9); dgst[10] = packv (tmps, dgst, gid, i + 10); dgst[11] = packv (tmps, dgst, gid, i + 11); dgst[12] = packv (tmps, dgst, gid, i + 12); dgst[13] = packv (tmps, dgst, gid, i + 13); dgst[14] = packv (tmps, dgst, gid, i + 14); dgst[15] = packv (tmps, dgst, gid, i + 15); out[ 0] = packv (tmps, out, gid, i + 0); out[ 1] = packv (tmps, out, gid, i + 1); out[ 2] = packv (tmps, out, gid, i + 2); out[ 3] = packv (tmps, out, gid, i + 3); out[ 4] = packv (tmps, out, gid, i + 4); out[ 5] = packv (tmps, out, gid, i + 5); out[ 6] = packv (tmps, out, gid, i + 6); out[ 7] = packv (tmps, out, gid, i + 7); out[ 8] = packv (tmps, out, gid, i + 8); out[ 9] = packv (tmps, out, gid, i + 9); out[10] = packv (tmps, out, gid, i + 10); out[11] = packv (tmps, out, gid, i + 11); out[12] = packv (tmps, out, gid, i + 12); out[13] = packv (tmps, out, gid, i + 13); out[14] = packv (tmps, out, gid, i + 14); out[15] = packv (tmps, out, gid, i + 15); 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] = dgst[ 8]; w2[1] = dgst[ 9]; w2[2] = dgst[10]; w2[3] = dgst[11]; w3[0] = dgst[12]; w3[1] = dgst[13]; w3[2] = dgst[14]; w3[3] = dgst[15]; hmac_whirlpool_run_V (w0, w1, w2, w3, 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]; } unpackv (tmps, dgst, gid, i + 0, dgst[ 0]); unpackv (tmps, dgst, gid, i + 1, dgst[ 1]); unpackv (tmps, dgst, gid, i + 2, dgst[ 2]); unpackv (tmps, dgst, gid, i + 3, dgst[ 3]); unpackv (tmps, dgst, gid, i + 4, dgst[ 4]); unpackv (tmps, dgst, gid, i + 5, dgst[ 5]); unpackv (tmps, dgst, gid, i + 6, dgst[ 6]); unpackv (tmps, dgst, gid, i + 7, dgst[ 7]); unpackv (tmps, dgst, gid, i + 8, dgst[ 8]); unpackv (tmps, dgst, gid, i + 9, dgst[ 9]); unpackv (tmps, dgst, gid, i + 10, dgst[10]); unpackv (tmps, dgst, gid, i + 11, dgst[11]); unpackv (tmps, dgst, gid, i + 12, dgst[12]); unpackv (tmps, dgst, gid, i + 13, dgst[13]); unpackv (tmps, dgst, gid, i + 14, dgst[14]); unpackv (tmps, dgst, gid, i + 15, dgst[15]); unpackv (tmps, out, gid, i + 0, out[ 0]); unpackv (tmps, out, gid, i + 1, out[ 1]); unpackv (tmps, out, gid, i + 2, out[ 2]); unpackv (tmps, out, gid, i + 3, out[ 3]); unpackv (tmps, out, gid, i + 4, out[ 4]); unpackv (tmps, out, gid, i + 5, out[ 5]); unpackv (tmps, out, gid, i + 6, out[ 6]); unpackv (tmps, out, gid, i + 7, out[ 7]); unpackv (tmps, out, gid, i + 8, out[ 8]); unpackv (tmps, out, gid, i + 9, out[ 9]); unpackv (tmps, out, gid, i + 10, out[10]); unpackv (tmps, out, gid, i + 11, out[11]); unpackv (tmps, out, gid, i + 12, out[12]); unpackv (tmps, out, gid, i + 13, out[13]); unpackv (tmps, out, gid, i + 14, out[14]); unpackv (tmps, out, gid, i + 15, out[15]); } } __kernel void m06231_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM SHM_TYPE u32 s_td0[256]; SHM_TYPE u32 s_td1[256]; SHM_TYPE u32 s_td2[256]; SHM_TYPE u32 s_td3[256]; SHM_TYPE u32 s_td4[256]; SHM_TYPE u32 s_te0[256]; SHM_TYPE u32 s_te1[256]; SHM_TYPE u32 s_te2[256]; SHM_TYPE u32 s_te3[256]; SHM_TYPE u32 s_te4[256]; for (u32 i = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; u32 ukey1[8]; ukey1[0] = swap32_S (tmps[gid].out[ 0]); ukey1[1] = swap32_S (tmps[gid].out[ 1]); ukey1[2] = swap32_S (tmps[gid].out[ 2]); ukey1[3] = swap32_S (tmps[gid].out[ 3]); ukey1[4] = swap32_S (tmps[gid].out[ 4]); ukey1[5] = swap32_S (tmps[gid].out[ 5]); ukey1[6] = swap32_S (tmps[gid].out[ 6]); ukey1[7] = swap32_S (tmps[gid].out[ 7]); u32 ukey2[8]; ukey2[0] = swap32_S (tmps[gid].out[ 8]); ukey2[1] = swap32_S (tmps[gid].out[ 9]); ukey2[2] = swap32_S (tmps[gid].out[10]); ukey2[3] = swap32_S (tmps[gid].out[11]); ukey2[4] = swap32_S (tmps[gid].out[12]); ukey2[5] = swap32_S (tmps[gid].out[13]); ukey2[6] = swap32_S (tmps[gid].out[14]); ukey2[7] = swap32_S (tmps[gid].out[15]); if (verify_header_aes (esalt_bufs, ukey1, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m06232.cl000066400000000000000000000565431320027462700154400ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_whirlpool.cl" #include "inc_cipher_aes.cl" #include "inc_cipher_twofish.cl" #include "inc_cipher_serpent.cl" #include "inc_truecrypt_crc32.cl" #include "inc_truecrypt_xts.cl" 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; } void hmac_whirlpool_run_V (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[16], u32x opad[16], u32x digest[16], SHM_TYPE u32 (*s_Ch)[256], SHM_TYPE u32 (*s_Cl)[256]) { 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]; digest[ 8] = ipad[ 8]; digest[ 9] = ipad[ 9]; digest[10] = ipad[10]; digest[11] = ipad[11]; digest[12] = ipad[12]; digest[13] = ipad[13]; digest[14] = ipad[14]; digest[15] = ipad[15]; whirlpool_transform_vector (w0, w1, w2, w3, digest, s_Ch, s_Cl); 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 + 64) * 8; whirlpool_transform_vector (w0, w1, w2, w3, digest, s_Ch, s_Cl); 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] = digest[ 8]; w2[1] = digest[ 9]; w2[2] = digest[10]; w2[3] = digest[11]; w3[0] = digest[12]; w3[1] = digest[13]; w3[2] = digest[14]; w3[3] = digest[15]; 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]; digest[ 8] = opad[ 8]; digest[ 9] = opad[ 9]; digest[10] = opad[10]; digest[11] = opad[11]; digest[12] = opad[12]; digest[13] = opad[13]; digest[14] = opad[14]; digest[15] = opad[15]; whirlpool_transform_vector (w0, w1, w2, w3, digest, s_Ch, s_Cl); 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 + 64) * 8; whirlpool_transform_vector (w0, w1, w2, w3, digest, s_Ch, s_Cl); } __kernel void m06232_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if (gid >= gid_max) return; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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]; w0[0] = u8add (w0[0], esalt_bufs[digests_offset].keyfile_buf[ 0]); w0[1] = u8add (w0[1], esalt_bufs[digests_offset].keyfile_buf[ 1]); w0[2] = u8add (w0[2], esalt_bufs[digests_offset].keyfile_buf[ 2]); w0[3] = u8add (w0[3], esalt_bufs[digests_offset].keyfile_buf[ 3]); w1[0] = u8add (w1[0], esalt_bufs[digests_offset].keyfile_buf[ 4]); w1[1] = u8add (w1[1], esalt_bufs[digests_offset].keyfile_buf[ 5]); w1[2] = u8add (w1[2], esalt_bufs[digests_offset].keyfile_buf[ 6]); w1[3] = u8add (w1[3], esalt_bufs[digests_offset].keyfile_buf[ 7]); w2[0] = u8add (w2[0], esalt_bufs[digests_offset].keyfile_buf[ 8]); w2[1] = u8add (w2[1], esalt_bufs[digests_offset].keyfile_buf[ 9]); w2[2] = u8add (w2[2], esalt_bufs[digests_offset].keyfile_buf[10]); w2[3] = u8add (w2[3], esalt_bufs[digests_offset].keyfile_buf[11]); w3[0] = u8add (w3[0], esalt_bufs[digests_offset].keyfile_buf[12]); w3[1] = u8add (w3[1], esalt_bufs[digests_offset].keyfile_buf[13]); w3[2] = u8add (w3[2], esalt_bufs[digests_offset].keyfile_buf[14]); w3[3] = u8add (w3[3], esalt_bufs[digests_offset].keyfile_buf[15]); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); whirlpool_hmac_ctx_t whirlpool_hmac_ctx; whirlpool_hmac_init_64 (&whirlpool_hmac_ctx, w0, w1, w2, w3, s_Ch, s_Cl); tmps[gid].ipad[ 0] = whirlpool_hmac_ctx.ipad.h[ 0]; tmps[gid].ipad[ 1] = whirlpool_hmac_ctx.ipad.h[ 1]; tmps[gid].ipad[ 2] = whirlpool_hmac_ctx.ipad.h[ 2]; tmps[gid].ipad[ 3] = whirlpool_hmac_ctx.ipad.h[ 3]; tmps[gid].ipad[ 4] = whirlpool_hmac_ctx.ipad.h[ 4]; tmps[gid].ipad[ 5] = whirlpool_hmac_ctx.ipad.h[ 5]; tmps[gid].ipad[ 6] = whirlpool_hmac_ctx.ipad.h[ 6]; tmps[gid].ipad[ 7] = whirlpool_hmac_ctx.ipad.h[ 7]; tmps[gid].ipad[ 8] = whirlpool_hmac_ctx.ipad.h[ 8]; tmps[gid].ipad[ 9] = whirlpool_hmac_ctx.ipad.h[ 9]; tmps[gid].ipad[10] = whirlpool_hmac_ctx.ipad.h[10]; tmps[gid].ipad[11] = whirlpool_hmac_ctx.ipad.h[11]; tmps[gid].ipad[12] = whirlpool_hmac_ctx.ipad.h[12]; tmps[gid].ipad[13] = whirlpool_hmac_ctx.ipad.h[13]; tmps[gid].ipad[14] = whirlpool_hmac_ctx.ipad.h[14]; tmps[gid].ipad[15] = whirlpool_hmac_ctx.ipad.h[15]; tmps[gid].opad[ 0] = whirlpool_hmac_ctx.opad.h[ 0]; tmps[gid].opad[ 1] = whirlpool_hmac_ctx.opad.h[ 1]; tmps[gid].opad[ 2] = whirlpool_hmac_ctx.opad.h[ 2]; tmps[gid].opad[ 3] = whirlpool_hmac_ctx.opad.h[ 3]; tmps[gid].opad[ 4] = whirlpool_hmac_ctx.opad.h[ 4]; tmps[gid].opad[ 5] = whirlpool_hmac_ctx.opad.h[ 5]; tmps[gid].opad[ 6] = whirlpool_hmac_ctx.opad.h[ 6]; tmps[gid].opad[ 7] = whirlpool_hmac_ctx.opad.h[ 7]; tmps[gid].opad[ 8] = whirlpool_hmac_ctx.opad.h[ 8]; tmps[gid].opad[ 9] = whirlpool_hmac_ctx.opad.h[ 9]; tmps[gid].opad[10] = whirlpool_hmac_ctx.opad.h[10]; tmps[gid].opad[11] = whirlpool_hmac_ctx.opad.h[11]; tmps[gid].opad[12] = whirlpool_hmac_ctx.opad.h[12]; tmps[gid].opad[13] = whirlpool_hmac_ctx.opad.h[13]; tmps[gid].opad[14] = whirlpool_hmac_ctx.opad.h[14]; tmps[gid].opad[15] = whirlpool_hmac_ctx.opad.h[15]; whirlpool_hmac_update_global_swap (&whirlpool_hmac_ctx, esalt_bufs[digests_offset].salt_buf, 64); for (u32 i = 0, j = 1; i < 32; i += 16, j += 1) { whirlpool_hmac_ctx_t whirlpool_hmac_ctx2 = whirlpool_hmac_ctx; w0[0] = j; 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] = 0; whirlpool_hmac_update_64 (&whirlpool_hmac_ctx2, w0, w1, w2, w3, 4); whirlpool_hmac_final (&whirlpool_hmac_ctx2); tmps[gid].dgst[i + 0] = whirlpool_hmac_ctx2.opad.h[ 0]; tmps[gid].dgst[i + 1] = whirlpool_hmac_ctx2.opad.h[ 1]; tmps[gid].dgst[i + 2] = whirlpool_hmac_ctx2.opad.h[ 2]; tmps[gid].dgst[i + 3] = whirlpool_hmac_ctx2.opad.h[ 3]; tmps[gid].dgst[i + 4] = whirlpool_hmac_ctx2.opad.h[ 4]; tmps[gid].dgst[i + 5] = whirlpool_hmac_ctx2.opad.h[ 5]; tmps[gid].dgst[i + 6] = whirlpool_hmac_ctx2.opad.h[ 6]; tmps[gid].dgst[i + 7] = whirlpool_hmac_ctx2.opad.h[ 7]; tmps[gid].dgst[i + 8] = whirlpool_hmac_ctx2.opad.h[ 8]; tmps[gid].dgst[i + 9] = whirlpool_hmac_ctx2.opad.h[ 9]; tmps[gid].dgst[i + 10] = whirlpool_hmac_ctx2.opad.h[10]; tmps[gid].dgst[i + 11] = whirlpool_hmac_ctx2.opad.h[11]; tmps[gid].dgst[i + 12] = whirlpool_hmac_ctx2.opad.h[12]; tmps[gid].dgst[i + 13] = whirlpool_hmac_ctx2.opad.h[13]; tmps[gid].dgst[i + 14] = whirlpool_hmac_ctx2.opad.h[14]; tmps[gid].dgst[i + 15] = whirlpool_hmac_ctx2.opad.h[15]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; tmps[gid].out[i + 8] = tmps[gid].dgst[i + 8]; tmps[gid].out[i + 9] = tmps[gid].dgst[i + 9]; tmps[gid].out[i + 10] = tmps[gid].dgst[i + 10]; tmps[gid].out[i + 11] = tmps[gid].dgst[i + 11]; tmps[gid].out[i + 12] = tmps[gid].dgst[i + 12]; tmps[gid].out[i + 13] = tmps[gid].dgst[i + 13]; tmps[gid].out[i + 14] = tmps[gid].dgst[i + 14]; tmps[gid].out[i + 15] = tmps[gid].dgst[i + 15]; } } __kernel void m06232_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[16]; u32x opad[16]; ipad[ 0] = packv (tmps, ipad, gid, 0); ipad[ 1] = packv (tmps, ipad, gid, 1); ipad[ 2] = packv (tmps, ipad, gid, 2); ipad[ 3] = packv (tmps, ipad, gid, 3); ipad[ 4] = packv (tmps, ipad, gid, 4); ipad[ 5] = packv (tmps, ipad, gid, 5); ipad[ 6] = packv (tmps, ipad, gid, 6); ipad[ 7] = packv (tmps, ipad, gid, 7); ipad[ 8] = packv (tmps, ipad, gid, 8); ipad[ 9] = packv (tmps, ipad, gid, 9); ipad[10] = packv (tmps, ipad, gid, 10); ipad[11] = packv (tmps, ipad, gid, 11); ipad[12] = packv (tmps, ipad, gid, 12); ipad[13] = packv (tmps, ipad, gid, 13); ipad[14] = packv (tmps, ipad, gid, 14); ipad[15] = packv (tmps, ipad, gid, 15); opad[ 0] = packv (tmps, opad, gid, 0); opad[ 1] = packv (tmps, opad, gid, 1); opad[ 2] = packv (tmps, opad, gid, 2); opad[ 3] = packv (tmps, opad, gid, 3); opad[ 4] = packv (tmps, opad, gid, 4); opad[ 5] = packv (tmps, opad, gid, 5); opad[ 6] = packv (tmps, opad, gid, 6); opad[ 7] = packv (tmps, opad, gid, 7); opad[ 8] = packv (tmps, opad, gid, 8); opad[ 9] = packv (tmps, opad, gid, 9); opad[10] = packv (tmps, opad, gid, 10); opad[11] = packv (tmps, opad, gid, 11); opad[12] = packv (tmps, opad, gid, 12); opad[13] = packv (tmps, opad, gid, 13); opad[14] = packv (tmps, opad, gid, 14); opad[15] = packv (tmps, opad, gid, 15); for (u32 i = 0; i < 32; i += 16) { u32x dgst[16]; u32x out[16]; dgst[ 0] = packv (tmps, dgst, gid, i + 0); dgst[ 1] = packv (tmps, dgst, gid, i + 1); dgst[ 2] = packv (tmps, dgst, gid, i + 2); dgst[ 3] = packv (tmps, dgst, gid, i + 3); dgst[ 4] = packv (tmps, dgst, gid, i + 4); dgst[ 5] = packv (tmps, dgst, gid, i + 5); dgst[ 6] = packv (tmps, dgst, gid, i + 6); dgst[ 7] = packv (tmps, dgst, gid, i + 7); dgst[ 8] = packv (tmps, dgst, gid, i + 8); dgst[ 9] = packv (tmps, dgst, gid, i + 9); dgst[10] = packv (tmps, dgst, gid, i + 10); dgst[11] = packv (tmps, dgst, gid, i + 11); dgst[12] = packv (tmps, dgst, gid, i + 12); dgst[13] = packv (tmps, dgst, gid, i + 13); dgst[14] = packv (tmps, dgst, gid, i + 14); dgst[15] = packv (tmps, dgst, gid, i + 15); out[ 0] = packv (tmps, out, gid, i + 0); out[ 1] = packv (tmps, out, gid, i + 1); out[ 2] = packv (tmps, out, gid, i + 2); out[ 3] = packv (tmps, out, gid, i + 3); out[ 4] = packv (tmps, out, gid, i + 4); out[ 5] = packv (tmps, out, gid, i + 5); out[ 6] = packv (tmps, out, gid, i + 6); out[ 7] = packv (tmps, out, gid, i + 7); out[ 8] = packv (tmps, out, gid, i + 8); out[ 9] = packv (tmps, out, gid, i + 9); out[10] = packv (tmps, out, gid, i + 10); out[11] = packv (tmps, out, gid, i + 11); out[12] = packv (tmps, out, gid, i + 12); out[13] = packv (tmps, out, gid, i + 13); out[14] = packv (tmps, out, gid, i + 14); out[15] = packv (tmps, out, gid, i + 15); 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] = dgst[ 8]; w2[1] = dgst[ 9]; w2[2] = dgst[10]; w2[3] = dgst[11]; w3[0] = dgst[12]; w3[1] = dgst[13]; w3[2] = dgst[14]; w3[3] = dgst[15]; hmac_whirlpool_run_V (w0, w1, w2, w3, 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]; } unpackv (tmps, dgst, gid, i + 0, dgst[ 0]); unpackv (tmps, dgst, gid, i + 1, dgst[ 1]); unpackv (tmps, dgst, gid, i + 2, dgst[ 2]); unpackv (tmps, dgst, gid, i + 3, dgst[ 3]); unpackv (tmps, dgst, gid, i + 4, dgst[ 4]); unpackv (tmps, dgst, gid, i + 5, dgst[ 5]); unpackv (tmps, dgst, gid, i + 6, dgst[ 6]); unpackv (tmps, dgst, gid, i + 7, dgst[ 7]); unpackv (tmps, dgst, gid, i + 8, dgst[ 8]); unpackv (tmps, dgst, gid, i + 9, dgst[ 9]); unpackv (tmps, dgst, gid, i + 10, dgst[10]); unpackv (tmps, dgst, gid, i + 11, dgst[11]); unpackv (tmps, dgst, gid, i + 12, dgst[12]); unpackv (tmps, dgst, gid, i + 13, dgst[13]); unpackv (tmps, dgst, gid, i + 14, dgst[14]); unpackv (tmps, dgst, gid, i + 15, dgst[15]); unpackv (tmps, out, gid, i + 0, out[ 0]); unpackv (tmps, out, gid, i + 1, out[ 1]); unpackv (tmps, out, gid, i + 2, out[ 2]); unpackv (tmps, out, gid, i + 3, out[ 3]); unpackv (tmps, out, gid, i + 4, out[ 4]); unpackv (tmps, out, gid, i + 5, out[ 5]); unpackv (tmps, out, gid, i + 6, out[ 6]); unpackv (tmps, out, gid, i + 7, out[ 7]); unpackv (tmps, out, gid, i + 8, out[ 8]); unpackv (tmps, out, gid, i + 9, out[ 9]); unpackv (tmps, out, gid, i + 10, out[10]); unpackv (tmps, out, gid, i + 11, out[11]); unpackv (tmps, out, gid, i + 12, out[12]); unpackv (tmps, out, gid, i + 13, out[13]); unpackv (tmps, out, gid, i + 14, out[14]); unpackv (tmps, out, gid, i + 15, out[15]); } } __kernel void m06232_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM SHM_TYPE u32 s_td0[256]; SHM_TYPE u32 s_td1[256]; SHM_TYPE u32 s_td2[256]; SHM_TYPE u32 s_td3[256]; SHM_TYPE u32 s_td4[256]; SHM_TYPE u32 s_te0[256]; SHM_TYPE u32 s_te1[256]; SHM_TYPE u32 s_te2[256]; SHM_TYPE u32 s_te3[256]; SHM_TYPE u32 s_te4[256]; for (u32 i = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; u32 ukey1[8]; ukey1[0] = swap32_S (tmps[gid].out[ 0]); ukey1[1] = swap32_S (tmps[gid].out[ 1]); ukey1[2] = swap32_S (tmps[gid].out[ 2]); ukey1[3] = swap32_S (tmps[gid].out[ 3]); ukey1[4] = swap32_S (tmps[gid].out[ 4]); ukey1[5] = swap32_S (tmps[gid].out[ 5]); ukey1[6] = swap32_S (tmps[gid].out[ 6]); ukey1[7] = swap32_S (tmps[gid].out[ 7]); u32 ukey2[8]; ukey2[0] = swap32_S (tmps[gid].out[ 8]); ukey2[1] = swap32_S (tmps[gid].out[ 9]); ukey2[2] = swap32_S (tmps[gid].out[10]); ukey2[3] = swap32_S (tmps[gid].out[11]); ukey2[4] = swap32_S (tmps[gid].out[12]); ukey2[5] = swap32_S (tmps[gid].out[13]); ukey2[6] = swap32_S (tmps[gid].out[14]); ukey2[7] = swap32_S (tmps[gid].out[15]); if (verify_header_aes (esalt_bufs, ukey1, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } u32 ukey3[8]; ukey3[0] = swap32_S (tmps[gid].out[16]); ukey3[1] = swap32_S (tmps[gid].out[17]); ukey3[2] = swap32_S (tmps[gid].out[18]); ukey3[3] = swap32_S (tmps[gid].out[19]); ukey3[4] = swap32_S (tmps[gid].out[20]); ukey3[5] = swap32_S (tmps[gid].out[21]); ukey3[6] = swap32_S (tmps[gid].out[22]); ukey3[7] = swap32_S (tmps[gid].out[23]); u32 ukey4[8]; ukey4[0] = swap32_S (tmps[gid].out[24]); ukey4[1] = swap32_S (tmps[gid].out[25]); ukey4[2] = swap32_S (tmps[gid].out[26]); ukey4[3] = swap32_S (tmps[gid].out[27]); ukey4[4] = swap32_S (tmps[gid].out[28]); ukey4[5] = swap32_S (tmps[gid].out[29]); ukey4[6] = swap32_S (tmps[gid].out[30]); ukey4[7] = swap32_S (tmps[gid].out[31]); if (verify_header_aes_twofish (esalt_bufs, ukey1, ukey2, ukey3, ukey4, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent_aes (esalt_bufs, ukey1, ukey2, ukey3, ukey4, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish_serpent (esalt_bufs, ukey1, ukey2, ukey3, ukey4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m06233.cl000066400000000000000000000612611320027462700154320ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_whirlpool.cl" #include "inc_cipher_aes.cl" #include "inc_cipher_twofish.cl" #include "inc_cipher_serpent.cl" #include "inc_truecrypt_crc32.cl" #include "inc_truecrypt_xts.cl" 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; } void hmac_whirlpool_run_V (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[16], u32x opad[16], u32x digest[16], SHM_TYPE u32 (*s_Ch)[256], SHM_TYPE u32 (*s_Cl)[256]) { 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]; digest[ 8] = ipad[ 8]; digest[ 9] = ipad[ 9]; digest[10] = ipad[10]; digest[11] = ipad[11]; digest[12] = ipad[12]; digest[13] = ipad[13]; digest[14] = ipad[14]; digest[15] = ipad[15]; whirlpool_transform_vector (w0, w1, w2, w3, digest, s_Ch, s_Cl); 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 + 64) * 8; whirlpool_transform_vector (w0, w1, w2, w3, digest, s_Ch, s_Cl); 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] = digest[ 8]; w2[1] = digest[ 9]; w2[2] = digest[10]; w2[3] = digest[11]; w3[0] = digest[12]; w3[1] = digest[13]; w3[2] = digest[14]; w3[3] = digest[15]; 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]; digest[ 8] = opad[ 8]; digest[ 9] = opad[ 9]; digest[10] = opad[10]; digest[11] = opad[11]; digest[12] = opad[12]; digest[13] = opad[13]; digest[14] = opad[14]; digest[15] = opad[15]; whirlpool_transform_vector (w0, w1, w2, w3, digest, s_Ch, s_Cl); 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 + 64) * 8; whirlpool_transform_vector (w0, w1, w2, w3, digest, s_Ch, s_Cl); } __kernel void m06233_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if (gid >= gid_max) return; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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]; w0[0] = u8add (w0[0], esalt_bufs[digests_offset].keyfile_buf[ 0]); w0[1] = u8add (w0[1], esalt_bufs[digests_offset].keyfile_buf[ 1]); w0[2] = u8add (w0[2], esalt_bufs[digests_offset].keyfile_buf[ 2]); w0[3] = u8add (w0[3], esalt_bufs[digests_offset].keyfile_buf[ 3]); w1[0] = u8add (w1[0], esalt_bufs[digests_offset].keyfile_buf[ 4]); w1[1] = u8add (w1[1], esalt_bufs[digests_offset].keyfile_buf[ 5]); w1[2] = u8add (w1[2], esalt_bufs[digests_offset].keyfile_buf[ 6]); w1[3] = u8add (w1[3], esalt_bufs[digests_offset].keyfile_buf[ 7]); w2[0] = u8add (w2[0], esalt_bufs[digests_offset].keyfile_buf[ 8]); w2[1] = u8add (w2[1], esalt_bufs[digests_offset].keyfile_buf[ 9]); w2[2] = u8add (w2[2], esalt_bufs[digests_offset].keyfile_buf[10]); w2[3] = u8add (w2[3], esalt_bufs[digests_offset].keyfile_buf[11]); w3[0] = u8add (w3[0], esalt_bufs[digests_offset].keyfile_buf[12]); w3[1] = u8add (w3[1], esalt_bufs[digests_offset].keyfile_buf[13]); w3[2] = u8add (w3[2], esalt_bufs[digests_offset].keyfile_buf[14]); w3[3] = u8add (w3[3], esalt_bufs[digests_offset].keyfile_buf[15]); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); whirlpool_hmac_ctx_t whirlpool_hmac_ctx; whirlpool_hmac_init_64 (&whirlpool_hmac_ctx, w0, w1, w2, w3, s_Ch, s_Cl); tmps[gid].ipad[ 0] = whirlpool_hmac_ctx.ipad.h[ 0]; tmps[gid].ipad[ 1] = whirlpool_hmac_ctx.ipad.h[ 1]; tmps[gid].ipad[ 2] = whirlpool_hmac_ctx.ipad.h[ 2]; tmps[gid].ipad[ 3] = whirlpool_hmac_ctx.ipad.h[ 3]; tmps[gid].ipad[ 4] = whirlpool_hmac_ctx.ipad.h[ 4]; tmps[gid].ipad[ 5] = whirlpool_hmac_ctx.ipad.h[ 5]; tmps[gid].ipad[ 6] = whirlpool_hmac_ctx.ipad.h[ 6]; tmps[gid].ipad[ 7] = whirlpool_hmac_ctx.ipad.h[ 7]; tmps[gid].ipad[ 8] = whirlpool_hmac_ctx.ipad.h[ 8]; tmps[gid].ipad[ 9] = whirlpool_hmac_ctx.ipad.h[ 9]; tmps[gid].ipad[10] = whirlpool_hmac_ctx.ipad.h[10]; tmps[gid].ipad[11] = whirlpool_hmac_ctx.ipad.h[11]; tmps[gid].ipad[12] = whirlpool_hmac_ctx.ipad.h[12]; tmps[gid].ipad[13] = whirlpool_hmac_ctx.ipad.h[13]; tmps[gid].ipad[14] = whirlpool_hmac_ctx.ipad.h[14]; tmps[gid].ipad[15] = whirlpool_hmac_ctx.ipad.h[15]; tmps[gid].opad[ 0] = whirlpool_hmac_ctx.opad.h[ 0]; tmps[gid].opad[ 1] = whirlpool_hmac_ctx.opad.h[ 1]; tmps[gid].opad[ 2] = whirlpool_hmac_ctx.opad.h[ 2]; tmps[gid].opad[ 3] = whirlpool_hmac_ctx.opad.h[ 3]; tmps[gid].opad[ 4] = whirlpool_hmac_ctx.opad.h[ 4]; tmps[gid].opad[ 5] = whirlpool_hmac_ctx.opad.h[ 5]; tmps[gid].opad[ 6] = whirlpool_hmac_ctx.opad.h[ 6]; tmps[gid].opad[ 7] = whirlpool_hmac_ctx.opad.h[ 7]; tmps[gid].opad[ 8] = whirlpool_hmac_ctx.opad.h[ 8]; tmps[gid].opad[ 9] = whirlpool_hmac_ctx.opad.h[ 9]; tmps[gid].opad[10] = whirlpool_hmac_ctx.opad.h[10]; tmps[gid].opad[11] = whirlpool_hmac_ctx.opad.h[11]; tmps[gid].opad[12] = whirlpool_hmac_ctx.opad.h[12]; tmps[gid].opad[13] = whirlpool_hmac_ctx.opad.h[13]; tmps[gid].opad[14] = whirlpool_hmac_ctx.opad.h[14]; tmps[gid].opad[15] = whirlpool_hmac_ctx.opad.h[15]; whirlpool_hmac_update_global_swap (&whirlpool_hmac_ctx, esalt_bufs[digests_offset].salt_buf, 64); for (u32 i = 0, j = 1; i < 48; i += 16, j += 1) { whirlpool_hmac_ctx_t whirlpool_hmac_ctx2 = whirlpool_hmac_ctx; w0[0] = j; 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] = 0; whirlpool_hmac_update_64 (&whirlpool_hmac_ctx2, w0, w1, w2, w3, 4); whirlpool_hmac_final (&whirlpool_hmac_ctx2); tmps[gid].dgst[i + 0] = whirlpool_hmac_ctx2.opad.h[ 0]; tmps[gid].dgst[i + 1] = whirlpool_hmac_ctx2.opad.h[ 1]; tmps[gid].dgst[i + 2] = whirlpool_hmac_ctx2.opad.h[ 2]; tmps[gid].dgst[i + 3] = whirlpool_hmac_ctx2.opad.h[ 3]; tmps[gid].dgst[i + 4] = whirlpool_hmac_ctx2.opad.h[ 4]; tmps[gid].dgst[i + 5] = whirlpool_hmac_ctx2.opad.h[ 5]; tmps[gid].dgst[i + 6] = whirlpool_hmac_ctx2.opad.h[ 6]; tmps[gid].dgst[i + 7] = whirlpool_hmac_ctx2.opad.h[ 7]; tmps[gid].dgst[i + 8] = whirlpool_hmac_ctx2.opad.h[ 8]; tmps[gid].dgst[i + 9] = whirlpool_hmac_ctx2.opad.h[ 9]; tmps[gid].dgst[i + 10] = whirlpool_hmac_ctx2.opad.h[10]; tmps[gid].dgst[i + 11] = whirlpool_hmac_ctx2.opad.h[11]; tmps[gid].dgst[i + 12] = whirlpool_hmac_ctx2.opad.h[12]; tmps[gid].dgst[i + 13] = whirlpool_hmac_ctx2.opad.h[13]; tmps[gid].dgst[i + 14] = whirlpool_hmac_ctx2.opad.h[14]; tmps[gid].dgst[i + 15] = whirlpool_hmac_ctx2.opad.h[15]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; tmps[gid].out[i + 8] = tmps[gid].dgst[i + 8]; tmps[gid].out[i + 9] = tmps[gid].dgst[i + 9]; tmps[gid].out[i + 10] = tmps[gid].dgst[i + 10]; tmps[gid].out[i + 11] = tmps[gid].dgst[i + 11]; tmps[gid].out[i + 12] = tmps[gid].dgst[i + 12]; tmps[gid].out[i + 13] = tmps[gid].dgst[i + 13]; tmps[gid].out[i + 14] = tmps[gid].dgst[i + 14]; tmps[gid].out[i + 15] = tmps[gid].dgst[i + 15]; } } __kernel void m06233_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ #ifdef REAL_SHM __local u32 s_Ch[8][256]; __local u32 s_Cl[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_Ch[0][i] = Ch[0][i]; s_Ch[1][i] = Ch[1][i]; s_Ch[2][i] = Ch[2][i]; s_Ch[3][i] = Ch[3][i]; s_Ch[4][i] = Ch[4][i]; s_Ch[5][i] = Ch[5][i]; s_Ch[6][i] = Ch[6][i]; s_Ch[7][i] = Ch[7][i]; s_Cl[0][i] = Cl[0][i]; s_Cl[1][i] = Cl[1][i]; s_Cl[2][i] = Cl[2][i]; s_Cl[3][i] = Cl[3][i]; s_Cl[4][i] = Cl[4][i]; s_Cl[5][i] = Cl[5][i]; s_Cl[6][i] = Cl[6][i]; s_Cl[7][i] = Cl[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32 (*s_Ch)[256] = Ch; __constant u32 (*s_Cl)[256] = Cl; #endif if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[16]; u32x opad[16]; ipad[ 0] = packv (tmps, ipad, gid, 0); ipad[ 1] = packv (tmps, ipad, gid, 1); ipad[ 2] = packv (tmps, ipad, gid, 2); ipad[ 3] = packv (tmps, ipad, gid, 3); ipad[ 4] = packv (tmps, ipad, gid, 4); ipad[ 5] = packv (tmps, ipad, gid, 5); ipad[ 6] = packv (tmps, ipad, gid, 6); ipad[ 7] = packv (tmps, ipad, gid, 7); ipad[ 8] = packv (tmps, ipad, gid, 8); ipad[ 9] = packv (tmps, ipad, gid, 9); ipad[10] = packv (tmps, ipad, gid, 10); ipad[11] = packv (tmps, ipad, gid, 11); ipad[12] = packv (tmps, ipad, gid, 12); ipad[13] = packv (tmps, ipad, gid, 13); ipad[14] = packv (tmps, ipad, gid, 14); ipad[15] = packv (tmps, ipad, gid, 15); opad[ 0] = packv (tmps, opad, gid, 0); opad[ 1] = packv (tmps, opad, gid, 1); opad[ 2] = packv (tmps, opad, gid, 2); opad[ 3] = packv (tmps, opad, gid, 3); opad[ 4] = packv (tmps, opad, gid, 4); opad[ 5] = packv (tmps, opad, gid, 5); opad[ 6] = packv (tmps, opad, gid, 6); opad[ 7] = packv (tmps, opad, gid, 7); opad[ 8] = packv (tmps, opad, gid, 8); opad[ 9] = packv (tmps, opad, gid, 9); opad[10] = packv (tmps, opad, gid, 10); opad[11] = packv (tmps, opad, gid, 11); opad[12] = packv (tmps, opad, gid, 12); opad[13] = packv (tmps, opad, gid, 13); opad[14] = packv (tmps, opad, gid, 14); opad[15] = packv (tmps, opad, gid, 15); for (u32 i = 0; i < 48; i += 16) { u32x dgst[16]; u32x out[16]; dgst[ 0] = packv (tmps, dgst, gid, i + 0); dgst[ 1] = packv (tmps, dgst, gid, i + 1); dgst[ 2] = packv (tmps, dgst, gid, i + 2); dgst[ 3] = packv (tmps, dgst, gid, i + 3); dgst[ 4] = packv (tmps, dgst, gid, i + 4); dgst[ 5] = packv (tmps, dgst, gid, i + 5); dgst[ 6] = packv (tmps, dgst, gid, i + 6); dgst[ 7] = packv (tmps, dgst, gid, i + 7); dgst[ 8] = packv (tmps, dgst, gid, i + 8); dgst[ 9] = packv (tmps, dgst, gid, i + 9); dgst[10] = packv (tmps, dgst, gid, i + 10); dgst[11] = packv (tmps, dgst, gid, i + 11); dgst[12] = packv (tmps, dgst, gid, i + 12); dgst[13] = packv (tmps, dgst, gid, i + 13); dgst[14] = packv (tmps, dgst, gid, i + 14); dgst[15] = packv (tmps, dgst, gid, i + 15); out[ 0] = packv (tmps, out, gid, i + 0); out[ 1] = packv (tmps, out, gid, i + 1); out[ 2] = packv (tmps, out, gid, i + 2); out[ 3] = packv (tmps, out, gid, i + 3); out[ 4] = packv (tmps, out, gid, i + 4); out[ 5] = packv (tmps, out, gid, i + 5); out[ 6] = packv (tmps, out, gid, i + 6); out[ 7] = packv (tmps, out, gid, i + 7); out[ 8] = packv (tmps, out, gid, i + 8); out[ 9] = packv (tmps, out, gid, i + 9); out[10] = packv (tmps, out, gid, i + 10); out[11] = packv (tmps, out, gid, i + 11); out[12] = packv (tmps, out, gid, i + 12); out[13] = packv (tmps, out, gid, i + 13); out[14] = packv (tmps, out, gid, i + 14); out[15] = packv (tmps, out, gid, i + 15); 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] = dgst[ 8]; w2[1] = dgst[ 9]; w2[2] = dgst[10]; w2[3] = dgst[11]; w3[0] = dgst[12]; w3[1] = dgst[13]; w3[2] = dgst[14]; w3[3] = dgst[15]; hmac_whirlpool_run_V (w0, w1, w2, w3, 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]; } unpackv (tmps, dgst, gid, i + 0, dgst[ 0]); unpackv (tmps, dgst, gid, i + 1, dgst[ 1]); unpackv (tmps, dgst, gid, i + 2, dgst[ 2]); unpackv (tmps, dgst, gid, i + 3, dgst[ 3]); unpackv (tmps, dgst, gid, i + 4, dgst[ 4]); unpackv (tmps, dgst, gid, i + 5, dgst[ 5]); unpackv (tmps, dgst, gid, i + 6, dgst[ 6]); unpackv (tmps, dgst, gid, i + 7, dgst[ 7]); unpackv (tmps, dgst, gid, i + 8, dgst[ 8]); unpackv (tmps, dgst, gid, i + 9, dgst[ 9]); unpackv (tmps, dgst, gid, i + 10, dgst[10]); unpackv (tmps, dgst, gid, i + 11, dgst[11]); unpackv (tmps, dgst, gid, i + 12, dgst[12]); unpackv (tmps, dgst, gid, i + 13, dgst[13]); unpackv (tmps, dgst, gid, i + 14, dgst[14]); unpackv (tmps, dgst, gid, i + 15, dgst[15]); unpackv (tmps, out, gid, i + 0, out[ 0]); unpackv (tmps, out, gid, i + 1, out[ 1]); unpackv (tmps, out, gid, i + 2, out[ 2]); unpackv (tmps, out, gid, i + 3, out[ 3]); unpackv (tmps, out, gid, i + 4, out[ 4]); unpackv (tmps, out, gid, i + 5, out[ 5]); unpackv (tmps, out, gid, i + 6, out[ 6]); unpackv (tmps, out, gid, i + 7, out[ 7]); unpackv (tmps, out, gid, i + 8, out[ 8]); unpackv (tmps, out, gid, i + 9, out[ 9]); unpackv (tmps, out, gid, i + 10, out[10]); unpackv (tmps, out, gid, i + 11, out[11]); unpackv (tmps, out, gid, i + 12, out[12]); unpackv (tmps, out, gid, i + 13, out[13]); unpackv (tmps, out, gid, i + 14, out[14]); unpackv (tmps, out, gid, i + 15, out[15]); } } __kernel void m06233_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM SHM_TYPE u32 s_td0[256]; SHM_TYPE u32 s_td1[256]; SHM_TYPE u32 s_td2[256]; SHM_TYPE u32 s_td3[256]; SHM_TYPE u32 s_td4[256]; SHM_TYPE u32 s_te0[256]; SHM_TYPE u32 s_te1[256]; SHM_TYPE u32 s_te2[256]; SHM_TYPE u32 s_te3[256]; SHM_TYPE u32 s_te4[256]; for (u32 i = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; u32 ukey1[8]; ukey1[0] = swap32_S (tmps[gid].out[ 0]); ukey1[1] = swap32_S (tmps[gid].out[ 1]); ukey1[2] = swap32_S (tmps[gid].out[ 2]); ukey1[3] = swap32_S (tmps[gid].out[ 3]); ukey1[4] = swap32_S (tmps[gid].out[ 4]); ukey1[5] = swap32_S (tmps[gid].out[ 5]); ukey1[6] = swap32_S (tmps[gid].out[ 6]); ukey1[7] = swap32_S (tmps[gid].out[ 7]); u32 ukey2[8]; ukey2[0] = swap32_S (tmps[gid].out[ 8]); ukey2[1] = swap32_S (tmps[gid].out[ 9]); ukey2[2] = swap32_S (tmps[gid].out[10]); ukey2[3] = swap32_S (tmps[gid].out[11]); ukey2[4] = swap32_S (tmps[gid].out[12]); ukey2[5] = swap32_S (tmps[gid].out[13]); ukey2[6] = swap32_S (tmps[gid].out[14]); ukey2[7] = swap32_S (tmps[gid].out[15]); if (verify_header_aes (esalt_bufs, ukey1, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } u32 ukey3[8]; ukey3[0] = swap32_S (tmps[gid].out[16]); ukey3[1] = swap32_S (tmps[gid].out[17]); ukey3[2] = swap32_S (tmps[gid].out[18]); ukey3[3] = swap32_S (tmps[gid].out[19]); ukey3[4] = swap32_S (tmps[gid].out[20]); ukey3[5] = swap32_S (tmps[gid].out[21]); ukey3[6] = swap32_S (tmps[gid].out[22]); ukey3[7] = swap32_S (tmps[gid].out[23]); u32 ukey4[8]; ukey4[0] = swap32_S (tmps[gid].out[24]); ukey4[1] = swap32_S (tmps[gid].out[25]); ukey4[2] = swap32_S (tmps[gid].out[26]); ukey4[3] = swap32_S (tmps[gid].out[27]); ukey4[4] = swap32_S (tmps[gid].out[28]); ukey4[5] = swap32_S (tmps[gid].out[29]); ukey4[6] = swap32_S (tmps[gid].out[30]); ukey4[7] = swap32_S (tmps[gid].out[31]); if (verify_header_aes_twofish (esalt_bufs, ukey1, ukey2, ukey3, ukey4, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent_aes (esalt_bufs, ukey1, ukey2, ukey3, ukey4, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish_serpent (esalt_bufs, ukey1, ukey2, ukey3, ukey4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } u32 ukey5[8]; ukey5[0] = swap32_S (tmps[gid].out[32]); ukey5[1] = swap32_S (tmps[gid].out[33]); ukey5[2] = swap32_S (tmps[gid].out[34]); ukey5[3] = swap32_S (tmps[gid].out[35]); ukey5[4] = swap32_S (tmps[gid].out[36]); ukey5[5] = swap32_S (tmps[gid].out[37]); ukey5[6] = swap32_S (tmps[gid].out[38]); ukey5[7] = swap32_S (tmps[gid].out[39]); u32 ukey6[8]; ukey6[0] = swap32_S (tmps[gid].out[40]); ukey6[1] = swap32_S (tmps[gid].out[41]); ukey6[2] = swap32_S (tmps[gid].out[42]); ukey6[3] = swap32_S (tmps[gid].out[43]); ukey6[4] = swap32_S (tmps[gid].out[44]); ukey6[5] = swap32_S (tmps[gid].out[45]); ukey6[6] = swap32_S (tmps[gid].out[46]); ukey6[7] = swap32_S (tmps[gid].out[47]); if (verify_header_aes_twofish_serpent (esalt_bufs, ukey1, ukey2, ukey3, ukey4, ukey5, ukey6, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent_twofish_aes (esalt_bufs, ukey1, ukey2, ukey3, ukey4, ukey5, ukey6, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[0]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m06300-optimized.cl000066400000000000000000000537261320027462700174360ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_md5.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void memcat16 (u32 block0[4], u32 block1[4], u32 block2[4], u32 block3[4], const u32 offset, const u32 append[4]) { u32 tmp0; u32 tmp1; u32 tmp2; u32 tmp3; u32 tmp4; const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #if defined IS_AMD || defined IS_GENERIC u32 in0 = swap32_S (append[0]); u32 in1 = swap32_S (append[1]); u32 in2 = swap32_S (append[2]); u32 in3 = swap32_S (append[3]); tmp0 = amd_bytealign ( 0, in0, offset); tmp1 = amd_bytealign (in0, in1, offset); tmp2 = amd_bytealign (in1, in2, offset); tmp3 = amd_bytealign (in2, in3, offset); tmp4 = amd_bytealign (in3, 0, offset); tmp0 = swap32_S (tmp0); tmp1 = swap32_S (tmp1); tmp2 = swap32_S (tmp2); tmp3 = swap32_S (tmp3); tmp4 = swap32_S (tmp4); #endif #ifdef IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; u32 in0 = append[0]; u32 in1 = append[1]; u32 in2 = append[2]; u32 in3 = append[3]; tmp0 = __byte_perm ( 0, in0, selector); tmp1 = __byte_perm (in0, in1, selector); tmp2 = __byte_perm (in1, in2, selector); tmp3 = __byte_perm (in2, in3, selector); tmp4 = __byte_perm (in3, 0, selector); #endif const u32 div = offset / 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; } } void memcat16_x80 (u32 block0[4], u32 block1[4], u32 block2[4], u32 block3[4], const u32 offset, const u32 append[4]) { u32 tmp0; u32 tmp1; u32 tmp2; u32 tmp3; u32 tmp4; const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #if defined IS_AMD || defined IS_GENERIC u32 in0 = swap32_S (append[0]); u32 in1 = swap32_S (append[1]); u32 in2 = swap32_S (append[2]); u32 in3 = swap32_S (append[3]); u32 in4 = 0x80000000; tmp0 = amd_bytealign ( 0, in0, offset); tmp1 = amd_bytealign (in0, in1, offset); tmp2 = amd_bytealign (in1, in2, offset); tmp3 = amd_bytealign (in2, in3, offset); tmp4 = amd_bytealign (in3, in4, offset); tmp0 = swap32_S (tmp0); tmp1 = swap32_S (tmp1); tmp2 = swap32_S (tmp2); tmp3 = swap32_S (tmp3); tmp4 = swap32_S (tmp4); #endif #ifdef IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; u32 in0 = append[0]; u32 in1 = append[1]; u32 in2 = append[2]; u32 in3 = append[3]; u32 in4 = 0x80; tmp0 = __byte_perm ( 0, in0, selector); tmp1 = __byte_perm (in0, in1, selector); tmp2 = __byte_perm (in1, in2, selector); tmp3 = __byte_perm (in2, in3, selector); tmp4 = __byte_perm (in3, in4, selector); #endif const u32 div = offset / 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; } } void memcat8 (u32 block0[4], u32 block1[4], u32 block2[4], u32 block3[4], const u32 offset, const u32 append[2]) { u32 tmp0; u32 tmp1; u32 tmp2; const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #if defined IS_AMD || defined IS_GENERIC u32 in0 = swap32_S (append[0]); u32 in1 = swap32_S (append[1]); tmp0 = amd_bytealign ( 0, in0, offset); tmp1 = amd_bytealign (in0, in1, offset); tmp2 = amd_bytealign (in1, 0, offset); tmp0 = swap32_S (tmp0); tmp1 = swap32_S (tmp1); tmp2 = swap32_S (tmp2); #endif #ifdef IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; u32 in0 = append[0]; u32 in1 = append[1]; tmp0 = __byte_perm ( 0, in0, selector); tmp1 = __byte_perm (in0, in1, selector); tmp2 = __byte_perm (in1, 0, selector); #endif const u32 div = offset / 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; } } void append_1st (u32 block0[4], u32 block1[4], u32 block2[4], u32 block3[4], const u32 block_len, const u32 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 m06300_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; 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; u32 block0[4]; block0[0] = w0[0]; block0[1] = w0[1]; block0[2] = w0[2]; block0[3] = w0[3]; u32 block1[4]; block1[0] = 0; block1[1] = 0; block1[2] = 0; block1[3] = 0; u32 block2[4]; block2[0] = 0; block2[1] = 0; block2[2] = 0; block2[3] = 0; u32 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_4x4 (block0, block1, block2, block3, block_len); block3[2] = block_len * 8; u32 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_4x4_le_S (digest, pw_len); memcat16 (block0, block1, block2, block3, block_len, digest); block_len += pw_len; /* Then something really weird... */ u32 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_4x4 (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 m06300_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; 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; u32 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_1x4 (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 */ u32 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; u32 block0[4]; block0[0] = 0; block0[1] = 0; block0[2] = 0; block0[3] = 0; u32 block1[4]; block1[0] = 0; block1[1] = 0; block1[2] = 0; block1[3] = 0; u32 block2[4]; block2[0] = 0; block2[1] = 0; block2[2] = 0; block2[3] = 0; u32 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 m06300_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ const u32 r0 = tmps[gid].digest_buf[DGST_R0]; const u32 r1 = tmps[gid].digest_buf[DGST_R1]; const u32 r2 = tmps[gid].digest_buf[DGST_R2]; const u32 r3 = tmps[gid].digest_buf[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m06300.cl000066400000000000000000000155021320027462700154220ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_md5.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" __kernel void m06300_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * init */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * prepare */ md5_ctx_t md5_ctx1; md5_init (&md5_ctx1); md5_update (&md5_ctx1, w, pw_len); md5_update (&md5_ctx1, s, salt_len); md5_update (&md5_ctx1, w, pw_len); md5_final (&md5_ctx1); u32 final[16] = { 0 }; final[0] = md5_ctx1.h[0]; final[1] = md5_ctx1.h[1]; final[2] = md5_ctx1.h[2]; final[3] = md5_ctx1.h[3]; md5_ctx_t md5_ctx; md5_init (&md5_ctx); md5_update (&md5_ctx, w, pw_len); md5_update (&md5_ctx, s, salt_len); int pl; for (pl = pw_len; pl > 16; pl -= 16) { md5_update (&md5_ctx, final, 16); } truncate_block_4x4_le_S (final, pl); md5_update (&md5_ctx, final, pl); /* Then something really weird... */ for (int i = pw_len; i != 0; i >>= 1) { u32 t[16] = { 0 }; if (i & 1) { t[0] = 0; } else { t[0] = w[0] & 0xff; } md5_update (&md5_ctx, t, 1); } md5_final (&md5_ctx); tmps[gid].digest_buf[0] = md5_ctx.h[0]; tmps[gid].digest_buf[1] = md5_ctx.h[1]; tmps[gid].digest_buf[2] = md5_ctx.h[2]; tmps[gid].digest_buf[3] = md5_ctx.h[3]; } __kernel void m06300_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * init */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } /** * digest */ u32 digest[16] = { 0 }; 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 */ for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) { md5_ctx_t md5_ctx; md5_init (&md5_ctx); if (j & 1) { md5_update (&md5_ctx, w, pw_len); } else { md5_update (&md5_ctx, digest, 16); } if (j % 3) { md5_update (&md5_ctx, s, salt_len); } if (j % 7) { md5_update (&md5_ctx, w, pw_len); } if (j & 1) { md5_update (&md5_ctx, digest, 16); } else { md5_update (&md5_ctx, w, pw_len); } md5_final (&md5_ctx); digest[0] = md5_ctx.h[0]; digest[1] = md5_ctx.h[1]; digest[2] = md5_ctx.h[2]; digest[3] = md5_ctx.h[3]; } 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 m06300_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ const u32 r0 = tmps[gid].digest_buf[DGST_R0]; const u32 r1 = tmps[gid].digest_buf[DGST_R1]; const u32 r2 = tmps[gid].digest_buf[DGST_R2]; const u32 r3 = tmps[gid].digest_buf[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m06400.cl000066400000000000000000000244571320027462700154340ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha256_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m06400_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha256aix_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha256_hmac_ctx_t sha256_hmac_ctx; sha256_hmac_init_global_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha256_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha256_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha256_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha256_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha256_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha256_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha256_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha256_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha256_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha256_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha256_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha256_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha256_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha256_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha256_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha256_hmac_ctx.opad.h[7]; sha256_hmac_update_global_swap (&sha256_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) { sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); sha256_hmac_final (&sha256_hmac_ctx2); tmps[gid].dgst[i + 0] = sha256_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha256_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha256_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha256_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha256_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha256_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha256_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha256_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m06400_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha256aix_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[8]; u32x opad[8]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); ipad[5] = packv (tmps, ipad, gid, 5); ipad[6] = packv (tmps, ipad, gid, 6); ipad[7] = packv (tmps, ipad, gid, 7); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); opad[5] = packv (tmps, opad, gid, 5); opad[6] = packv (tmps, opad, gid, 6); opad[7] = packv (tmps, opad, gid, 7); for (u32 i = 0; i < 8; i += 8) { u32x dgst[8]; u32x out[8]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); dgst[5] = packv (tmps, dgst, gid, i + 5); dgst[6] = packv (tmps, dgst, gid, i + 6); dgst[7] = packv (tmps, dgst, gid, i + 7); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, i + 4); out[5] = packv (tmps, out, gid, i + 5); out[6] = packv (tmps, out, gid, i + 6); out[7] = packv (tmps, out, gid, i + 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, dgst, gid, i + 5, dgst[5]); unpackv (tmps, dgst, gid, i + 6, dgst[6]); unpackv (tmps, dgst, gid, i + 7, dgst[7]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); unpackv (tmps, out, gid, i + 5, out[5]); unpackv (tmps, out, gid, i + 6, out[6]); unpackv (tmps, out, gid, i + 7, out[7]); } } __kernel void m06400_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha256aix_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ const u32 r0 = tmps[gid].out[DGST_R0]; const u32 r1 = tmps[gid].out[DGST_R1]; const u32 r2 = tmps[gid].out[DGST_R2]; const u32 r3 = tmps[gid].out[DGST_R3]; /* u32 a = tmps[gid].out[0]; u32 b = tmps[gid].out[1]; u32 c = tmps[gid].out[2]; u32 d = tmps[gid].out[3]; u32 e = tmps[gid].out[4]; u32 f = tmps[gid].out[5]; u32 g = tmps[gid].out[6]; u32 h = tmps[gid].out[7] & 0xffff03ff; */ #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m06500.cl000066400000000000000000000277131320027462700154330ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha512_run_V (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); w0[0] = h32_from_64 (digest[0]); w0[1] = l32_from_64 (digest[0]); w0[2] = h32_from_64 (digest[1]); w0[3] = l32_from_64 (digest[1]); w1[0] = h32_from_64 (digest[2]); w1[1] = l32_from_64 (digest[2]); w1[2] = h32_from_64 (digest[3]); w1[3] = l32_from_64 (digest[3]); w2[0] = h32_from_64 (digest[4]); w2[1] = l32_from_64 (digest[4]); w2[2] = h32_from_64 (digest[5]); w2[3] = l32_from_64 (digest[5]); w3[0] = h32_from_64 (digest[6]); w3[1] = l32_from_64 (digest[6]); w3[2] = h32_from_64 (digest[7]); w3[3] = l32_from_64 (digest[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } __kernel void m06500_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha512aix_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha512_hmac_ctx_t sha512_hmac_ctx; sha512_hmac_init_global_swap (&sha512_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha512_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha512_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha512_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha512_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha512_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha512_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha512_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha512_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha512_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha512_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha512_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha512_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha512_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha512_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha512_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha512_hmac_ctx.opad.h[7]; sha512_hmac_update_global_swap (&sha512_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) { sha512_hmac_ctx_t sha512_hmac_ctx2 = sha512_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; w0[0] = j; 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] = 0; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_update_128 (&sha512_hmac_ctx2, w0, w1, w2, w3, w4, w5, w6, w7, 4); sha512_hmac_final (&sha512_hmac_ctx2); tmps[gid].dgst[i + 0] = sha512_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha512_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha512_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha512_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha512_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha512_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha512_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha512_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m06500_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha512aix_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u64x ipad[8]; u64x opad[8]; ipad[0] = pack64v (tmps, ipad, gid, 0); ipad[1] = pack64v (tmps, ipad, gid, 1); ipad[2] = pack64v (tmps, ipad, gid, 2); ipad[3] = pack64v (tmps, ipad, gid, 3); ipad[4] = pack64v (tmps, ipad, gid, 4); ipad[5] = pack64v (tmps, ipad, gid, 5); ipad[6] = pack64v (tmps, ipad, gid, 6); ipad[7] = pack64v (tmps, ipad, gid, 7); opad[0] = pack64v (tmps, opad, gid, 0); opad[1] = pack64v (tmps, opad, gid, 1); opad[2] = pack64v (tmps, opad, gid, 2); opad[3] = pack64v (tmps, opad, gid, 3); opad[4] = pack64v (tmps, opad, gid, 4); opad[5] = pack64v (tmps, opad, gid, 5); opad[6] = pack64v (tmps, opad, gid, 6); opad[7] = pack64v (tmps, opad, gid, 7); for (u32 i = 0; i < 8; i += 8) { u64x dgst[8]; u64x out[8]; dgst[0] = pack64v (tmps, dgst, gid, i + 0); dgst[1] = pack64v (tmps, dgst, gid, i + 1); dgst[2] = pack64v (tmps, dgst, gid, i + 2); dgst[3] = pack64v (tmps, dgst, gid, i + 3); dgst[4] = pack64v (tmps, dgst, gid, i + 4); dgst[5] = pack64v (tmps, dgst, gid, i + 5); dgst[6] = pack64v (tmps, dgst, gid, i + 6); dgst[7] = pack64v (tmps, dgst, gid, i + 7); out[0] = pack64v (tmps, out, gid, i + 0); out[1] = pack64v (tmps, out, gid, i + 1); out[2] = pack64v (tmps, out, gid, i + 2); out[3] = pack64v (tmps, out, gid, i + 3); out[4] = pack64v (tmps, out, gid, i + 4); out[5] = pack64v (tmps, out, gid, i + 5); out[6] = pack64v (tmps, out, gid, i + 6); out[7] = pack64v (tmps, out, gid, i + 7); for (u32 j = 0; j < loop_cnt; j++) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; w0[0] = h32_from_64 (dgst[0]); w0[1] = l32_from_64 (dgst[0]); w0[2] = h32_from_64 (dgst[1]); w0[3] = l32_from_64 (dgst[1]); w1[0] = h32_from_64 (dgst[2]); w1[1] = l32_from_64 (dgst[2]); w1[2] = h32_from_64 (dgst[3]); w1[3] = l32_from_64 (dgst[3]); w2[0] = h32_from_64 (dgst[4]); w2[1] = l32_from_64 (dgst[4]); w2[2] = h32_from_64 (dgst[5]); w2[3] = l32_from_64 (dgst[5]); w3[0] = h32_from_64 (dgst[6]); w3[1] = l32_from_64 (dgst[6]); w3[2] = h32_from_64 (dgst[7]); w3[3] = l32_from_64 (dgst[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = (128 + 64) * 8; hmac_sha512_run_V (w0, w1, w2, w3, w4, w5, w6, w7, 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]; } unpack64v (tmps, dgst, gid, i + 0, dgst[0]); unpack64v (tmps, dgst, gid, i + 1, dgst[1]); unpack64v (tmps, dgst, gid, i + 2, dgst[2]); unpack64v (tmps, dgst, gid, i + 3, dgst[3]); unpack64v (tmps, dgst, gid, i + 4, dgst[4]); unpack64v (tmps, dgst, gid, i + 5, dgst[5]); unpack64v (tmps, dgst, gid, i + 6, dgst[6]); unpack64v (tmps, dgst, gid, i + 7, dgst[7]); unpack64v (tmps, out, gid, i + 0, out[0]); unpack64v (tmps, out, gid, i + 1, out[1]); unpack64v (tmps, out, gid, i + 2, out[2]); unpack64v (tmps, out, gid, i + 3, out[3]); unpack64v (tmps, out, gid, i + 4, out[4]); unpack64v (tmps, out, gid, i + 5, out[5]); unpack64v (tmps, out, gid, i + 6, out[6]); unpack64v (tmps, out, gid, i + 7, out[7]); } } __kernel void m06500_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha512aix_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ /* u64 a = tmps[gid].out[0]; u64 b = tmps[gid].out[1]; u64 c = tmps[gid].out[2]; u64 d = tmps[gid].out[3]; u64 e = tmps[gid].out[4]; u64 f = tmps[gid].out[5]; u64 g = tmps[gid].out[6]; u64 h = tmps[gid].out[7] & 0xffffffffffffff00; */ const u32 r0 = l32_from_64_S (tmps[gid].out[0]); const u32 r1 = h32_from_64_S (tmps[gid].out[0]); const u32 r2 = l32_from_64_S (tmps[gid].out[1]); const u32 r3 = h32_from_64_S (tmps[gid].out[1]); #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m06600.cl000066400000000000000000000244311320027462700154260ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #include "inc_cipher_aes.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha1_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m06600_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global agilekey_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha1_hmac_ctx_t sha1_hmac_ctx; sha1_hmac_init_global_swap (&sha1_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha1_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha1_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha1_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha1_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha1_hmac_ctx.ipad.h[4]; tmps[gid].opad[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha1_hmac_ctx.opad.h[4]; // salt_buf[] is a bit dirty, it's used for AES IV in _comp, too // so we have to move this data to a clean array first u32 s[16] = { 0 }; s[0] = salt_bufs[salt_pos].salt_buf[0]; s[1] = salt_bufs[salt_pos].salt_buf[1]; sha1_hmac_update_swap (&sha1_hmac_ctx, s, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 4; i += 5, j += 1) { sha1_hmac_ctx_t sha1_hmac_ctx2 = sha1_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha1_hmac_update_64 (&sha1_hmac_ctx2, w0, w1, w2, w3, 4); sha1_hmac_final (&sha1_hmac_ctx2); tmps[gid].dgst[i + 0] = sha1_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha1_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha1_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha1_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha1_hmac_ctx2.opad.h[4]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; } } __kernel void m06600_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global agilekey_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); for (u32 i = 0; i < 4; i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); } } __kernel void m06600_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global agilekey_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; /** * 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 */ u32 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]; #define KEYLEN 44 u32 ks[KEYLEN]; AES128_set_decrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); u32 out[4]; AES128_decrypt (ks, data, out, s_td0, s_td1, s_td2, s_td3, s_td4); const u32 r0 = out[0] ^ iv[0]; const u32 r1 = out[1] ^ iv[1]; const u32 r2 = out[2] ^ iv[2]; const u32 r3 = out[3] ^ iv[3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m06700.cl000066400000000000000000000210631320027462700154250ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha1_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m06700_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha1aix_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha1_hmac_ctx_t sha1_hmac_ctx; sha1_hmac_init_global_swap (&sha1_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha1_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha1_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha1_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha1_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha1_hmac_ctx.ipad.h[4]; tmps[gid].opad[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha1_hmac_ctx.opad.h[4]; sha1_hmac_update_global_swap (&sha1_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 4; i += 5, j += 1) { sha1_hmac_ctx_t sha1_hmac_ctx2 = sha1_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha1_hmac_update_64 (&sha1_hmac_ctx2, w0, w1, w2, w3, 4); sha1_hmac_final (&sha1_hmac_ctx2); tmps[gid].dgst[i + 0] = sha1_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha1_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha1_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha1_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha1_hmac_ctx2.opad.h[4]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; } } __kernel void m06700_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha1aix_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); for (u32 i = 0; i < 4; i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); } } __kernel void m06700_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha1aix_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ /* u32 a = tmps[gid].out[0]; u32 b = tmps[gid].out[1]; u32 c = tmps[gid].out[2]; u32 d = tmps[gid].out[3]; u32 e = tmps[gid].out[4] & 0xffff03ff; */ const u32 r0 = tmps[gid].out[DGST_R0]; const u32 r1 = tmps[gid].out[DGST_R1]; const u32 r2 = tmps[gid].out[DGST_R2]; const u32 r3 = tmps[gid].out[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m06800.cl000066400000000000000000000316021320027462700154260ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" #include "inc_cipher_aes.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha256_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m06800_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global lastpass_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha256_hmac_ctx_t sha256_hmac_ctx; sha256_hmac_init_global_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha256_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha256_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha256_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha256_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha256_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha256_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha256_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha256_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha256_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha256_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha256_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha256_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha256_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha256_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha256_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha256_hmac_ctx.opad.h[7]; sha256_hmac_update_global_swap (&sha256_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) { sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); sha256_hmac_final (&sha256_hmac_ctx2); tmps[gid].dgst[i + 0] = sha256_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha256_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha256_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha256_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha256_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha256_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha256_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha256_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m06800_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global lastpass_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[8]; u32x opad[8]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); ipad[5] = packv (tmps, ipad, gid, 5); ipad[6] = packv (tmps, ipad, gid, 6); ipad[7] = packv (tmps, ipad, gid, 7); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); opad[5] = packv (tmps, opad, gid, 5); opad[6] = packv (tmps, opad, gid, 6); opad[7] = packv (tmps, opad, gid, 7); for (u32 i = 0; i < 8; i += 8) { u32x dgst[8]; u32x out[8]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); dgst[5] = packv (tmps, dgst, gid, i + 5); dgst[6] = packv (tmps, dgst, gid, i + 6); dgst[7] = packv (tmps, dgst, gid, i + 7); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, i + 4); out[5] = packv (tmps, out, gid, i + 5); out[6] = packv (tmps, out, gid, i + 6); out[7] = packv (tmps, out, gid, i + 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, dgst, gid, i + 5, dgst[5]); unpackv (tmps, dgst, gid, i + 6, dgst[6]); unpackv (tmps, dgst, gid, i + 7, dgst[7]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); unpackv (tmps, out, gid, i + 5, out[5]); unpackv (tmps, out, gid, i + 6, out[6]); unpackv (tmps, out, gid, i + 7, out[7]); } } __kernel void m06800_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global lastpass_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; 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]; /** * sniffed mode */ { 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], }; #define KEYLEN 60 u32 ks[KEYLEN]; AES256_set_decrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); u32 out[4]; AES256_decrypt (ks, data, out, 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] = swap32_S (out[0]); out[1] = swap32_S (out[1]); out[2] = swap32_S (out[2]); out[3] = swap32_S (out[3]); truncate_block_4x4_le_S (out, salt_len); if ((out[0] == salt_buf[0]) && (out[1] == salt_buf[1]) && (out[2] == salt_buf[2]) && (out[3] == salt_buf[3])) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, 0); } } } /** * offline mode */ { const u32 lastpass_magic[4] = { 0x6c617374, 0x70617373, 0x20726f63, 0x6b730202, }; #define KEYLEN 60 u32 ks[KEYLEN]; AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4); u32 out[4]; AES256_encrypt (ks, lastpass_magic, out, s_te0, s_te1, s_te2, s_te3, s_te4); const u32 r0 = out[DGST_R0]; const u32 r1 = out[DGST_R1]; const u32 r2 = out[DGST_R2]; const u32 r3 = out[DGST_R3]; #define il_pos 0 #include COMPARE_M } } hashcat-4.0.1/OpenCL/m06900_a0-optimized.cl000066400000000000000000001231201320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __constant u32a 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, } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #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); \ } __kernel void m06900_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_tables[4][256]; for (u32 i = lid; i < 256; i += lsz) { s_tables[0][i] = c_tables[0][i]; s_tables[1][i] = c_tables[1][i]; s_tables[2][i] = c_tables[2][i]; s_tables[3][i] = c_tables[3][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); 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]; //if (pw_len > 0) // not really SIMD compatible { 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] = out_len * 8; 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 */ COMPARE_M_SIMD (state[0], state[1], state[2], state[3]); } } __kernel void m06900_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06900_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06900_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_tables[4][256]; for (u32 i = lid; i < 256; i += lsz) { s_tables[0][i] = c_tables[0][i]; s_tables[1][i] = c_tables[1][i]; s_tables[2][i] = c_tables[2][i]; s_tables[3][i] = c_tables[3][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * GOST */ 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]; //if (pw_len > 0) // not really SIMD compatible { 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] = out_len * 8; 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 */ COMPARE_S_SIMD (state[0], state[1], state[2], state[3]); } } __kernel void m06900_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06900_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m06900_a1-optimized.cl000066400000000000000000001305121320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u32a 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, } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #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); \ } __kernel void m06900_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_tables[4][256]; for (u32 i = lid; i < 256; i += lsz) { s_tables[0][i] = c_tables[0][i]; s_tables[1][i] = c_tables[1][i]; s_tables[2][i] = c_tables[2][i]; s_tables[3][i] = c_tables[3][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32x w0[4]; u32x w1[4]; 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]; /** * GOST */ 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]; //if (pw_len > 0) // not really SIMD compatible { 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] = pw_len * 8; 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 */ COMPARE_M_SIMD (state[0], state[1], state[2], state[3]); } } __kernel void m06900_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06900_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06900_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_tables[4][256]; for (u32 i = lid; i < 256; i += lsz) { s_tables[0][i] = c_tables[0][i]; s_tables[1][i] = c_tables[1][i]; s_tables[2][i] = c_tables[2][i]; s_tables[3][i] = c_tables[3][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32x w0[4]; u32x w1[4]; 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]; /** * GOST */ 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]; //if (pw_len > 0) // not really SIMD compatible { 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] = pw_len * 8; 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 */ COMPARE_S_SIMD (state[0], state[1], state[2], state[3]); } } __kernel void m06900_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06900_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m06900_a3-optimized.cl000066400000000000000000001370261320027462700200230ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u32a 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, } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #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); \ } void m06900m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 (*s_tables)[256]) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * GOST */ u32x data[8]; data[0] = w0lr; 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]; //if (pw_len > 0) // not really SIMD compatible { 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] = pw_len * 8; 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 */ COMPARE_M_SIMD (state[0], state[1], state[2], state[3]); } } void m06900s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 (*s_tables)[256]) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * GOST */ u32x data[8]; data[0] = w0lr; 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]; //if (pw_len > 0) // not really SIMD compatible { 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] = pw_len * 8; 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 */ COMPARE_S_SIMD (state[0], state[1], state[2], state[3]); } } __kernel void m06900_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_tables[4][256]; for (u32 i = lid; i < 256; i += lsz) { s_tables[0][i] = c_tables[0][i]; s_tables[1][i] = c_tables[1][i]; s_tables[2][i] = c_tables[2][i]; s_tables[3][i] = c_tables[3][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_tables); } __kernel void m06900_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_tables[4][256]; for (u32 i = lid; i < 256; i += lsz) { s_tables[0][i] = c_tables[0][i]; s_tables[1][i] = c_tables[1][i]; s_tables[2][i] = c_tables[2][i]; s_tables[3][i] = c_tables[3][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_tables); } __kernel void m06900_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m06900_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_tables[4][256]; for (u32 i = lid; i < 256; i += lsz) { s_tables[0][i] = c_tables[0][i]; s_tables[1][i] = c_tables[1][i]; s_tables[2][i] = c_tables[2][i]; s_tables[3][i] = c_tables[3][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_tables); } __kernel void m06900_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_tables[4][256]; for (u32 i = lid; i < 256; i += lsz) { s_tables[0][i] = c_tables[0][i]; s_tables[1][i] = c_tables[1][i]; s_tables[2][i] = c_tables[2][i]; s_tables[3][i] = c_tables[3][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, s_tables); } __kernel void m06900_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m07000_a0-optimized.cl000066400000000000000000000646551320027462700200170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m07000_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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] = 0; const u32 salt_len = 12; // salt_bufs[salt_pos].salt_len; const u32 magic_len = 24; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * combine pw + magic */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = FORTIGATE_A; s0[1] = FORTIGATE_B; s0[2] = FORTIGATE_C; s0[3] = FORTIGATE_D; s1[0] = FORTIGATE_E; s1[1] = FORTIGATE_F; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); s0[0] |= w0[0]; s0[1] |= w0[1]; s0[2] |= w0[2]; s0[3] |= w0[3]; s1[0] |= w1[0]; s1[1] |= w1[1]; s1[2] |= w1[2]; s1[3] |= w1[3]; s2[0] |= w2[0]; s2[1] |= w2[1]; s2[2] |= w2[2]; s2[3] |= w2[3]; s3[0] |= w3[0]; s3[1] |= w3[1]; s3[2] |= w3[2]; s3[3] |= w3[3]; /** * prepend salt */ w0[0] = salt_buf0[0]; w0[1] = salt_buf0[1]; w0[2] = salt_buf0[2]; w0[3] = s0[0]; w1[0] = s0[1]; w1[1] = s0[2]; w1[2] = s0[3]; w1[3] = s1[0]; w2[0] = s1[1]; w2[1] = s1[2]; w2[2] = s1[3]; w2[3] = s2[0]; w3[0] = s2[1]; w3[1] = s2[2]; w3[2] = s2[3]; w3[3] = s3[0]; const u32x final_len = salt_len + out_len + magic_len; append_0x80_4x4_VV (w0, w1, w2, w3, final_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); u32x we_t = 0; u32x wf_t = final_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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m07000_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07000_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07000_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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] = 0; const u32 salt_len = 12; // salt_bufs[salt_pos].salt_len; const u32 magic_len = 24; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], 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_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * combine pw + magic */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = FORTIGATE_A; s0[1] = FORTIGATE_B; s0[2] = FORTIGATE_C; s0[3] = FORTIGATE_D; s1[0] = FORTIGATE_E; s1[1] = FORTIGATE_F; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); s0[0] |= w0[0]; s0[1] |= w0[1]; s0[2] |= w0[2]; s0[3] |= w0[3]; s1[0] |= w1[0]; s1[1] |= w1[1]; s1[2] |= w1[2]; s1[3] |= w1[3]; s2[0] |= w2[0]; s2[1] |= w2[1]; s2[2] |= w2[2]; s2[3] |= w2[3]; s3[0] |= w3[0]; s3[1] |= w3[1]; s3[2] |= w3[2]; s3[3] |= w3[3]; /** * prepend salt */ w0[0] = salt_buf0[0]; w0[1] = salt_buf0[1]; w0[2] = salt_buf0[2]; w0[3] = s0[0]; w1[0] = s0[1]; w1[1] = s0[2]; w1[2] = s0[3]; w1[3] = s1[0]; w2[0] = s1[1]; w2[1] = s1[2]; w2[2] = s1[3]; w2[3] = s2[0]; w3[0] = s2[1]; w3[1] = s2[2]; w3[2] = s2[3]; w3[3] = s3[0]; const u32x final_len = salt_len + out_len + magic_len; append_0x80_4x4_VV (w0, w1, w2, w3, final_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); u32x we_t = 0; u32x wf_t = final_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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m07000_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07000_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m07000_a0.cl000066400000000000000000000122361320027462700160010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m07000_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx = ctx0; sha1_update_swap (&ctx, tmp.i, tmp.pw_len); /** * pepper */ u32 p0[4]; u32 p1[4]; u32 p2[4]; u32 p3[4]; p0[0] = swap32_S (FORTIGATE_A); p0[1] = swap32_S (FORTIGATE_B); p0[2] = swap32_S (FORTIGATE_C); p0[3] = swap32_S (FORTIGATE_D); p1[0] = swap32_S (FORTIGATE_E); p1[1] = swap32_S (FORTIGATE_F); p1[2] = 0; p1[3] = 0; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; sha1_update_64 (&ctx, p0, p1, p2, p3, 24); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m07000_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx = ctx0; sha1_update_swap (&ctx, tmp.i, tmp.pw_len); /** * pepper */ u32 p0[4]; u32 p1[4]; u32 p2[4]; u32 p3[4]; p0[0] = swap32_S (FORTIGATE_A); p0[1] = swap32_S (FORTIGATE_B); p0[2] = swap32_S (FORTIGATE_C); p0[3] = swap32_S (FORTIGATE_D); p1[0] = swap32_S (FORTIGATE_E); p1[1] = swap32_S (FORTIGATE_F); p1[2] = 0; p1[3] = 0; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; sha1_update_64 (&ctx, p0, p1, p2, p3, 24); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m07000_a1-optimized.cl000066400000000000000000000733701320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m07000_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 = 12; // salt_bufs[salt_pos].salt_len; const u32 magic_len = 24; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * combine pw + magic */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = FORTIGATE_A; s0[1] = FORTIGATE_B; s0[2] = FORTIGATE_C; s0[3] = FORTIGATE_D; s1[0] = FORTIGATE_E; s1[1] = FORTIGATE_F; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); s0[0] |= w0[0]; s0[1] |= w0[1]; s0[2] |= w0[2]; s0[3] |= w0[3]; s1[0] |= w1[0]; s1[1] |= w1[1]; s1[2] |= w1[2]; s1[3] |= w1[3]; s2[0] |= w2[0]; s2[1] |= w2[1]; s2[2] |= w2[2]; s2[3] |= w2[3]; s3[0] |= w3[0]; s3[1] |= w3[1]; s3[2] |= w3[2]; s3[3] |= w3[3]; /** * prepend salt */ w0[0] = salt_buf0[0]; w0[1] = salt_buf0[1]; w0[2] = salt_buf0[2]; w0[3] = s0[0]; w1[0] = s0[1]; w1[1] = s0[2]; w1[2] = s0[3]; w1[3] = s1[0]; w2[0] = s1[1]; w2[1] = s1[2]; w2[2] = s1[3]; w2[3] = s2[0]; w3[0] = s2[1]; w3[1] = s2[2]; w3[2] = s2[3]; w3[3] = s3[0]; const u32x final_len = salt_len + pw_len + magic_len; append_0x80_4x4_VV (w0, w1, w2, w3, final_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); u32x we_t = 0; u32x wf_t = final_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); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m07000_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07000_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07000_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 = 12; // salt_bufs[salt_pos].salt_len; const u32 magic_len = 24; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], 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_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * combine pw + magic */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = FORTIGATE_A; s0[1] = FORTIGATE_B; s0[2] = FORTIGATE_C; s0[3] = FORTIGATE_D; s1[0] = FORTIGATE_E; s1[1] = FORTIGATE_F; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); s0[0] |= w0[0]; s0[1] |= w0[1]; s0[2] |= w0[2]; s0[3] |= w0[3]; s1[0] |= w1[0]; s1[1] |= w1[1]; s1[2] |= w1[2]; s1[3] |= w1[3]; s2[0] |= w2[0]; s2[1] |= w2[1]; s2[2] |= w2[2]; s2[3] |= w2[3]; s3[0] |= w3[0]; s3[1] |= w3[1]; s3[2] |= w3[2]; s3[3] |= w3[3]; /** * prepend salt */ w0[0] = salt_buf0[0]; w0[1] = salt_buf0[1]; w0[2] = salt_buf0[2]; w0[3] = s0[0]; w1[0] = s0[1]; w1[1] = s0[2]; w1[2] = s0[3]; w1[3] = s1[0]; w2[0] = s1[1]; w2[1] = s1[2]; w2[2] = s1[3]; w2[3] = s2[0]; w3[0] = s2[1]; w3[1] = s2[2]; w3[2] = s2[3]; w3[3] = s3[0]; const u32x final_len = salt_len + pw_len + magic_len; append_0x80_4x4_VV (w0, w1, w2, w3, final_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (w3[1]); u32x we_t = 0; u32x wf_t = final_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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m07000_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07000_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m07000_a1.cl000066400000000000000000000121011320027462700157710ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m07000_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); /** * pepper */ u32 p0[4]; u32 p1[4]; u32 p2[4]; u32 p3[4]; p0[0] = swap32_S (FORTIGATE_A); p0[1] = swap32_S (FORTIGATE_B); p0[2] = swap32_S (FORTIGATE_C); p0[3] = swap32_S (FORTIGATE_D); p1[0] = swap32_S (FORTIGATE_E); p1[1] = swap32_S (FORTIGATE_F); p1[2] = 0; p1[3] = 0; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; sha1_update_64 (&ctx, p0, p1, p2, p3, 24); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m07000_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); /** * pepper */ u32 p0[4]; u32 p1[4]; u32 p2[4]; u32 p3[4]; p0[0] = swap32_S (FORTIGATE_A); p0[1] = swap32_S (FORTIGATE_B); p0[2] = swap32_S (FORTIGATE_C); p0[3] = swap32_S (FORTIGATE_D); p1[0] = swap32_S (FORTIGATE_E); p1[1] = swap32_S (FORTIGATE_F); p1[2] = 0; p1[3] = 0; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; sha1_update_64 (&ctx, p0, p1, p2, p3, 24); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m07000_a3-optimized.cl000066400000000000000000001104061320027462700200040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m07000m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[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; salt_buf1[0] = 0; salt_buf1[1] = 0; salt_buf1[2] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; salt_buf3[0] = 0; salt_buf3[1] = 0; salt_buf3[2] = 0; salt_buf3[3] = 0; const u32 salt_len = 12; // salt_bufs[salt_pos].salt_len; u32 magic_buf0[4]; u32 magic_buf1[4]; u32 magic_buf2[4]; u32 magic_buf3[4]; magic_buf0[0] = FORTIGATE_A; magic_buf0[1] = FORTIGATE_B; magic_buf0[2] = FORTIGATE_C; magic_buf0[3] = FORTIGATE_D; magic_buf1[0] = FORTIGATE_E; magic_buf1[1] = FORTIGATE_F; magic_buf1[2] = 0; magic_buf1[3] = 0; magic_buf2[0] = 0; magic_buf2[1] = 0; magic_buf2[2] = 0; magic_buf2[3] = 0; magic_buf3[0] = 0; magic_buf3[1] = 0; magic_buf3[2] = 0; magic_buf3[3] = 0; const u32 magic_len = 24; const u32 salt_pw_len = salt_len + pw_len; switch_buffer_by_offset_le_S (magic_buf0, magic_buf1, magic_buf2, magic_buf3, salt_pw_len); salt_buf0[0] |= magic_buf0[0]; salt_buf0[1] |= magic_buf0[1]; salt_buf0[2] |= magic_buf0[2]; salt_buf0[3] |= magic_buf0[3]; salt_buf1[0] |= magic_buf1[0]; salt_buf1[1] |= magic_buf1[1]; salt_buf1[2] |= magic_buf1[2]; salt_buf1[3] |= magic_buf1[3]; salt_buf2[0] |= magic_buf2[0]; salt_buf2[1] |= magic_buf2[1]; salt_buf2[2] |= magic_buf2[2]; salt_buf2[3] |= magic_buf2[3]; salt_buf3[0] |= magic_buf3[0]; salt_buf3[1] |= magic_buf3[1]; salt_buf3[2] |= magic_buf3[2]; salt_buf3[3] |= magic_buf3[3]; const u32 final_len = salt_len + pw_len + magic_len; append_0x80_4x4_S (salt_buf0, salt_buf1, salt_buf2, salt_buf3, final_len); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; /** * put the password after the first salt (12 bytes) but before the second salt */ t0[0] = 0; t0[1] = 0; t0[2] = 0; t0[3] = w0lr; t1[0] = w0[1]; t1[1] = w0[2]; t1[2] = w0[3]; t1[3] = w1[0]; t2[0] = w1[1]; t2[1] = w1[2]; t2[2] = w1[3]; t2[3] = w2[0]; t3[0] = w2[1]; t3[1] = w2[2]; t3[2] = w2[3]; t3[3] = w3[0]; t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] |= salt_buf3[2]; /** * sha1 */ u32x w0_t = swap32 (t0[0]); u32x w1_t = swap32 (t0[1]); u32x w2_t = swap32 (t0[2]); u32x w3_t = swap32 (t0[3]); u32x w4_t = swap32 (t1[0]); u32x w5_t = swap32 (t1[1]); u32x w6_t = swap32 (t1[2]); u32x w7_t = swap32 (t1[3]); u32x w8_t = swap32 (t2[0]); u32x w9_t = swap32 (t2[1]); u32x wa_t = swap32 (t2[2]); u32x wb_t = swap32 (t2[3]); u32x wc_t = swap32 (t3[0]); u32x wd_t = swap32 (t3[1]); u32x we_t = 0; u32x wf_t = final_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); COMPARE_M_SIMD (d, e, c, b); } } void m07000s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[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; salt_buf1[0] = 0; salt_buf1[1] = 0; salt_buf1[2] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; salt_buf3[0] = 0; salt_buf3[1] = 0; salt_buf3[2] = 0; salt_buf3[3] = 0; const u32 salt_len = 12; // salt_bufs[salt_pos].salt_len; u32 magic_buf0[4]; u32 magic_buf1[4]; u32 magic_buf2[4]; u32 magic_buf3[4]; magic_buf0[0] = FORTIGATE_A; magic_buf0[1] = FORTIGATE_B; magic_buf0[2] = FORTIGATE_C; magic_buf0[3] = FORTIGATE_D; magic_buf1[0] = FORTIGATE_E; magic_buf1[1] = FORTIGATE_F; magic_buf1[2] = 0; magic_buf1[3] = 0; magic_buf2[0] = 0; magic_buf2[1] = 0; magic_buf2[2] = 0; magic_buf2[3] = 0; magic_buf3[0] = 0; magic_buf3[1] = 0; magic_buf3[2] = 0; magic_buf3[3] = 0; const u32 magic_len = 24; const u32 salt_pw_len = salt_len + pw_len; switch_buffer_by_offset_le_S (magic_buf0, magic_buf1, magic_buf2, magic_buf3, salt_pw_len); salt_buf0[0] |= magic_buf0[0]; salt_buf0[1] |= magic_buf0[1]; salt_buf0[2] |= magic_buf0[2]; salt_buf0[3] |= magic_buf0[3]; salt_buf1[0] |= magic_buf1[0]; salt_buf1[1] |= magic_buf1[1]; salt_buf1[2] |= magic_buf1[2]; salt_buf1[3] |= magic_buf1[3]; salt_buf2[0] |= magic_buf2[0]; salt_buf2[1] |= magic_buf2[1]; salt_buf2[2] |= magic_buf2[2]; salt_buf2[3] |= magic_buf2[3]; salt_buf3[0] |= magic_buf3[0]; salt_buf3[1] |= magic_buf3[1]; salt_buf3[2] |= magic_buf3[2]; salt_buf3[3] |= magic_buf3[3]; const u32 final_len = salt_len + pw_len + magic_len; append_0x80_4x4_S (salt_buf0, salt_buf1, salt_buf2, salt_buf3, final_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_S (search[1], 2u); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; /** * put the password after the first salt (12 bytes) but before the second salt */ t0[0] = 0; t0[1] = 0; t0[2] = 0; t0[3] = w0lr; t1[0] = w0[1]; t1[1] = w0[2]; t1[2] = w0[3]; t1[3] = w1[0]; t2[0] = w1[1]; t2[1] = w1[2]; t2[2] = w1[3]; t2[3] = w2[0]; t3[0] = w2[1]; t3[1] = w2[2]; t3[2] = w2[3]; t3[3] = w3[0]; t0[0] |= salt_buf0[0]; t0[1] |= salt_buf0[1]; t0[2] |= salt_buf0[2]; t0[3] |= salt_buf0[3]; t1[0] |= salt_buf1[0]; t1[1] |= salt_buf1[1]; t1[2] |= salt_buf1[2]; t1[3] |= salt_buf1[3]; t2[0] |= salt_buf2[0]; t2[1] |= salt_buf2[1]; t2[2] |= salt_buf2[2]; t2[3] |= salt_buf2[3]; t3[0] |= salt_buf3[0]; t3[1] |= salt_buf3[1]; t3[2] |= salt_buf3[2]; /** * sha1 */ u32x w0_t = swap32 (t0[0]); u32x w1_t = swap32 (t0[1]); u32x w2_t = swap32 (t0[2]); u32x w3_t = swap32 (t0[3]); u32x w4_t = swap32 (t1[0]); u32x w5_t = swap32 (t1[1]); u32x w6_t = swap32 (t1[2]); u32x w7_t = swap32 (t1[3]); u32x w8_t = swap32 (t2[0]); u32x w9_t = swap32 (t2[1]); u32x wa_t = swap32 (t2[2]); u32x wb_t = swap32 (t2[3]); u32x wc_t = swap32 (t3[0]); u32x wd_t = swap32 (t3[1]); u32x we_t = 0; u32x wf_t = final_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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m07000_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ m07000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07000_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ m07000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07000_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ m07000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07000_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ m07000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07000_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ m07000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07000_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ m07000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m07000_a3.cl000066400000000000000000000130711320027462700160020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m07000_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); sha1_update_vector_swap (&ctx, w, pw_len); /** * pepper */ u32x p0[4]; u32x p1[4]; u32x p2[4]; u32x p3[4]; p0[0] = swap32 (FORTIGATE_A); p0[1] = swap32 (FORTIGATE_B); p0[2] = swap32 (FORTIGATE_C); p0[3] = swap32 (FORTIGATE_D); p1[0] = swap32 (FORTIGATE_E); p1[1] = swap32 (FORTIGATE_F); p1[2] = 0; p1[3] = 0; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; sha1_update_vector_64 (&ctx, p0, p1, p2, p3, 24); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m07000_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); sha1_update_vector_swap (&ctx, w, pw_len); /** * pepper */ u32x p0[4]; u32x p1[4]; u32x p2[4]; u32x p3[4]; p0[0] = swap32 (FORTIGATE_A); p0[1] = swap32 (FORTIGATE_B); p0[2] = swap32 (FORTIGATE_C); p0[3] = swap32 (FORTIGATE_D); p1[0] = swap32 (FORTIGATE_E); p1[1] = swap32 (FORTIGATE_F); p1[2] = 0; p1[3] = 0; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; sha1_update_vector_64 (&ctx, p0, p1, p2, p3, 24); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m07100.cl000066400000000000000000000273571320027462700154340ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha512_run_V (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); w0[0] = h32_from_64 (digest[0]); w0[1] = l32_from_64 (digest[0]); w0[2] = h32_from_64 (digest[1]); w0[3] = l32_from_64 (digest[1]); w1[0] = h32_from_64 (digest[2]); w1[1] = l32_from_64 (digest[2]); w1[2] = h32_from_64 (digest[3]); w1[3] = l32_from_64 (digest[3]); w2[0] = h32_from_64 (digest[4]); w2[1] = l32_from_64 (digest[4]); w2[2] = h32_from_64 (digest[5]); w2[3] = l32_from_64 (digest[5]); w3[0] = h32_from_64 (digest[6]); w3[1] = l32_from_64 (digest[6]); w3[2] = h32_from_64 (digest[7]); w3[3] = l32_from_64 (digest[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } __kernel void m07100_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha512_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha512_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha512_hmac_ctx_t sha512_hmac_ctx; sha512_hmac_init_global_swap (&sha512_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha512_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha512_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha512_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha512_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha512_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha512_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha512_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha512_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha512_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha512_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha512_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha512_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha512_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha512_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha512_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha512_hmac_ctx.opad.h[7]; sha512_hmac_update_global_swap (&sha512_hmac_ctx, esalt_bufs[digests_offset].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) { sha512_hmac_ctx_t sha512_hmac_ctx2 = sha512_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; w0[0] = j; 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] = 0; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_update_128 (&sha512_hmac_ctx2, w0, w1, w2, w3, w4, w5, w6, w7, 4); sha512_hmac_final (&sha512_hmac_ctx2); tmps[gid].dgst[i + 0] = sha512_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha512_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha512_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha512_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha512_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha512_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha512_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha512_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m07100_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha512_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha512_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u64x ipad[8]; u64x opad[8]; ipad[0] = pack64v (tmps, ipad, gid, 0); ipad[1] = pack64v (tmps, ipad, gid, 1); ipad[2] = pack64v (tmps, ipad, gid, 2); ipad[3] = pack64v (tmps, ipad, gid, 3); ipad[4] = pack64v (tmps, ipad, gid, 4); ipad[5] = pack64v (tmps, ipad, gid, 5); ipad[6] = pack64v (tmps, ipad, gid, 6); ipad[7] = pack64v (tmps, ipad, gid, 7); opad[0] = pack64v (tmps, opad, gid, 0); opad[1] = pack64v (tmps, opad, gid, 1); opad[2] = pack64v (tmps, opad, gid, 2); opad[3] = pack64v (tmps, opad, gid, 3); opad[4] = pack64v (tmps, opad, gid, 4); opad[5] = pack64v (tmps, opad, gid, 5); opad[6] = pack64v (tmps, opad, gid, 6); opad[7] = pack64v (tmps, opad, gid, 7); for (u32 i = 0; i < 8; i += 8) { u64x dgst[8]; u64x out[8]; dgst[0] = pack64v (tmps, dgst, gid, i + 0); dgst[1] = pack64v (tmps, dgst, gid, i + 1); dgst[2] = pack64v (tmps, dgst, gid, i + 2); dgst[3] = pack64v (tmps, dgst, gid, i + 3); dgst[4] = pack64v (tmps, dgst, gid, i + 4); dgst[5] = pack64v (tmps, dgst, gid, i + 5); dgst[6] = pack64v (tmps, dgst, gid, i + 6); dgst[7] = pack64v (tmps, dgst, gid, i + 7); out[0] = pack64v (tmps, out, gid, i + 0); out[1] = pack64v (tmps, out, gid, i + 1); out[2] = pack64v (tmps, out, gid, i + 2); out[3] = pack64v (tmps, out, gid, i + 3); out[4] = pack64v (tmps, out, gid, i + 4); out[5] = pack64v (tmps, out, gid, i + 5); out[6] = pack64v (tmps, out, gid, i + 6); out[7] = pack64v (tmps, out, gid, i + 7); for (u32 j = 0; j < loop_cnt; j++) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; w0[0] = h32_from_64 (dgst[0]); w0[1] = l32_from_64 (dgst[0]); w0[2] = h32_from_64 (dgst[1]); w0[3] = l32_from_64 (dgst[1]); w1[0] = h32_from_64 (dgst[2]); w1[1] = l32_from_64 (dgst[2]); w1[2] = h32_from_64 (dgst[3]); w1[3] = l32_from_64 (dgst[3]); w2[0] = h32_from_64 (dgst[4]); w2[1] = l32_from_64 (dgst[4]); w2[2] = h32_from_64 (dgst[5]); w2[3] = l32_from_64 (dgst[5]); w3[0] = h32_from_64 (dgst[6]); w3[1] = l32_from_64 (dgst[6]); w3[2] = h32_from_64 (dgst[7]); w3[3] = l32_from_64 (dgst[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = (128 + 64) * 8; hmac_sha512_run_V (w0, w1, w2, w3, w4, w5, w6, w7, 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]; } unpack64v (tmps, dgst, gid, i + 0, dgst[0]); unpack64v (tmps, dgst, gid, i + 1, dgst[1]); unpack64v (tmps, dgst, gid, i + 2, dgst[2]); unpack64v (tmps, dgst, gid, i + 3, dgst[3]); unpack64v (tmps, dgst, gid, i + 4, dgst[4]); unpack64v (tmps, dgst, gid, i + 5, dgst[5]); unpack64v (tmps, dgst, gid, i + 6, dgst[6]); unpack64v (tmps, dgst, gid, i + 7, dgst[7]); unpack64v (tmps, out, gid, i + 0, out[0]); unpack64v (tmps, out, gid, i + 1, out[1]); unpack64v (tmps, out, gid, i + 2, out[2]); unpack64v (tmps, out, gid, i + 3, out[3]); unpack64v (tmps, out, gid, i + 4, out[4]); unpack64v (tmps, out, gid, i + 5, out[5]); unpack64v (tmps, out, gid, i + 6, out[6]); unpack64v (tmps, out, gid, i + 7, out[7]); } } __kernel void m07100_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha512_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha512_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); const u64 a = tmps[gid].out[0]; const u64 b = tmps[gid].out[1]; const u32 r0 = l32_from_64_S (a); const u32 r1 = h32_from_64_S (a); const u32 r2 = l32_from_64_S (b); const u32 r3 = h32_from_64_S (b); #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m07300_a0-optimized.cl000066400000000000000000000373501320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m07300_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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[digests_offset].salt_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); /** * RAKP */ u32x ipad[5]; u32x opad[5]; hmac_sha1_pad (w0, w1, w2, w3, 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[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 0]; w0[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 1]; w0[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 2]; w0[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 3]; w1[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 4]; w1[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 5]; w1[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 6]; w1[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 7]; w2[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 8]; w2[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 9]; w2[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 10]; w2[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 11]; w3[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 12]; w3[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 13]; w3[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 14]; w3[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 15]; sha1_transform_vector (w0, w1, w2, w3, ipad); } w0[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 0]; w0[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 1]; w0[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 2]; w0[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 3]; w1[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 4]; w1[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 5]; w1[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 6]; w1[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 7]; w2[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 8]; w2[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 9]; w2[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 10]; w2[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 11]; w3[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 12]; w3[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 13]; w3[2] = 0; w3[3] = (64 + esalt_size) * 8; u32x digest[5]; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m07300_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07300_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07300_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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[digests_offset].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); /** * RAKP */ u32x ipad[5]; u32x opad[5]; hmac_sha1_pad (w0, w1, w2, w3, 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[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 0]; w0[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 1]; w0[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 2]; w0[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 3]; w1[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 4]; w1[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 5]; w1[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 6]; w1[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 7]; w2[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 8]; w2[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 9]; w2[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 10]; w2[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 11]; w3[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 12]; w3[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 13]; w3[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 14]; w3[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 15]; sha1_transform_vector (w0, w1, w2, w3, ipad); } w0[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 0]; w0[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 1]; w0[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 2]; w0[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 3]; w1[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 4]; w1[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 5]; w1[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 6]; w1[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 7]; w2[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 8]; w2[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 9]; w2[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 10]; w2[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 11]; w3[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 12]; w3[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 13]; w3[2] = 0; w3[3] = (64 + esalt_size) * 8; u32x digest[5]; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m07300_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07300_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m07300_a0.cl000066400000000000000000000102441320027462700160010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m07300_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_hmac_ctx_t ctx; sha1_hmac_init_swap (&ctx, tmp.i, tmp.pw_len); sha1_hmac_update_global (&ctx, rakp_bufs[digests_offset].salt_buf, rakp_bufs[digests_offset].salt_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m07300_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_hmac_ctx_t ctx; sha1_hmac_init_swap (&ctx, tmp.i, tmp.pw_len); sha1_hmac_update_global (&ctx, rakp_bufs[digests_offset].salt_buf, rakp_bufs[digests_offset].salt_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m07300_a1-optimized.cl000066400000000000000000000470411320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m07300_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ const u32 esalt_len = rakp_bufs[digests_offset].salt_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); /** * RAKP */ u32x ipad[5]; u32x opad[5]; hmac_sha1_pad (w0, w1, w2, w3, 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[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 0]; w0[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 1]; w0[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 2]; w0[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 3]; w1[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 4]; w1[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 5]; w1[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 6]; w1[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 7]; w2[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 8]; w2[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 9]; w2[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 10]; w2[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 11]; w3[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 12]; w3[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 13]; w3[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 14]; w3[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 15]; sha1_transform_vector (w0, w1, w2, w3, ipad); } w0[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 0]; w0[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 1]; w0[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 2]; w0[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 3]; w1[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 4]; w1[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 5]; w1[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 6]; w1[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 7]; w2[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 8]; w2[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 9]; w2[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 10]; w2[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 11]; w3[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 12]; w3[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 13]; w3[2] = 0; w3[3] = (64 + esalt_size) * 8; u32x digest[5]; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m07300_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07300_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07300_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ const u32 esalt_len = rakp_bufs[digests_offset].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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); /** * RAKP */ u32x ipad[5]; u32x opad[5]; hmac_sha1_pad (w0, w1, w2, w3, 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[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 0]; w0[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 1]; w0[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 2]; w0[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 3]; w1[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 4]; w1[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 5]; w1[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 6]; w1[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 7]; w2[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 8]; w2[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 9]; w2[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 10]; w2[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 11]; w3[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 12]; w3[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 13]; w3[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 14]; w3[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 15]; sha1_transform_vector (w0, w1, w2, w3, ipad); } w0[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 0]; w0[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 1]; w0[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 2]; w0[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 3]; w1[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 4]; w1[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 5]; w1[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 6]; w1[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 7]; w2[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 8]; w2[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 9]; w2[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 10]; w2[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 11]; w3[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 12]; w3[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 13]; w3[2] = 0; w3[3] = (64 + esalt_size) * 8; u32x digest[5]; hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m07300_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07300_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m07300_a1.cl000066400000000000000000000117231320027462700160050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m07300_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (pws[gid].i[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = swap32_S (combs_buf[il_pos].i[idx]); } switch_buffer_by_offset_1x64_be_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } sha1_hmac_ctx_t ctx; sha1_hmac_init (&ctx, c, pw_len + comb_len); sha1_hmac_update_global (&ctx, rakp_bufs[digests_offset].salt_buf, rakp_bufs[digests_offset].salt_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m07300_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (pws[gid].i[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 comb_len = combs_buf[il_pos].pw_len; u32 c[64]; #ifdef _unroll #pragma unroll #endif for (int idx = 0; idx < 64; idx++) { c[idx] = swap32_S (combs_buf[il_pos].i[idx]); } switch_buffer_by_offset_1x64_be_S (c, pw_len); #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) { c[i] |= w[i]; } sha1_hmac_ctx_t ctx; sha1_hmac_init (&ctx, c, pw_len + comb_len); sha1_hmac_update_global (&ctx, rakp_bufs[digests_offset].salt_buf, rakp_bufs[digests_offset].salt_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m07300_a3-optimized.cl000066400000000000000000000564431320027462700200210ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" 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_vector (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_vector (w0, w1, w2, w3, opad); } 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_vector (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_vector (w0, w1, w2, w3, digest); } void m07300m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 esalt_len = rakp_bufs[digests_offset].salt_len; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * RAKP */ 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[digests_offset].salt_buf[esalt_off + 0]; w0_t[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 1]; w0_t[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 2]; w0_t[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 3]; w1_t[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 4]; w1_t[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 5]; w1_t[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 6]; w1_t[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 7]; w2_t[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 8]; w2_t[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 9]; w2_t[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 10]; w2_t[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 11]; w3_t[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 12]; w3_t[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 13]; w3_t[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 14]; w3_t[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 15]; sha1_transform_vector (w0_t, w1_t, w2_t, w3_t, ipad); } w0_t[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 0]; w0_t[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 1]; w0_t[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 2]; w0_t[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 3]; w1_t[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 4]; w1_t[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 5]; w1_t[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 6]; w1_t[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 7]; w2_t[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 8]; w2_t[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 9]; w2_t[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 10]; w2_t[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 11]; w3_t[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 12]; w3_t[1] = rakp_bufs[digests_offset].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); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } void m07300s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 esalt_len = rakp_bufs[digests_offset].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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * RAKP */ 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[digests_offset].salt_buf[esalt_off + 0]; w0_t[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 1]; w0_t[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 2]; w0_t[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 3]; w1_t[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 4]; w1_t[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 5]; w1_t[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 6]; w1_t[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 7]; w2_t[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 8]; w2_t[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 9]; w2_t[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 10]; w2_t[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 11]; w3_t[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 12]; w3_t[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 13]; w3_t[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 14]; w3_t[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 15]; sha1_transform_vector (w0_t, w1_t, w2_t, w3_t, ipad); } w0_t[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 0]; w0_t[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 1]; w0_t[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 2]; w0_t[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 3]; w1_t[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 4]; w1_t[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 5]; w1_t[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 6]; w1_t[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 7]; w2_t[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 8]; w2_t[1] = rakp_bufs[digests_offset].salt_buf[esalt_off + 9]; w2_t[2] = rakp_bufs[digests_offset].salt_buf[esalt_off + 10]; w2_t[3] = rakp_bufs[digests_offset].salt_buf[esalt_off + 11]; w3_t[0] = rakp_bufs[digests_offset].salt_buf[esalt_off + 12]; w3_t[1] = rakp_bufs[digests_offset].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); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m07300_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salts, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07300_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salts, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07300_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salts, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07300_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salts, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07300_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salts, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07300_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salts, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m07300_a3.cl000066400000000000000000000106611320027462700160070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m07300_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = words_buf_r[il_pos / VECT_SIZE]; const u32 w0 = w0l | w0r; w[0] = w0; sha1_hmac_ctx_t ctx; sha1_hmac_init (&ctx, w, pw_len); sha1_hmac_update_global (&ctx, rakp_bufs[digests_offset].salt_buf, rakp_bufs[digests_offset].salt_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m07300_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = words_buf_r[il_pos / VECT_SIZE]; const u32 w0 = w0l | w0r; w[0] = w0; sha1_hmac_ctx_t ctx; sha1_hmac_init (&ctx, w, pw_len); sha1_hmac_update_global (&ctx, rakp_bufs[digests_offset].salt_buf, rakp_bufs[digests_offset].salt_len); sha1_hmac_final (&ctx); const u32 r0 = ctx.opad.h[DGST_R0]; const u32 r1 = ctx.opad.h[DGST_R1]; const u32 r2 = ctx.opad.h[DGST_R2]; const u32 r3 = ctx.opad.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m07400-optimized.cl000066400000000000000000000745011320027462700174320ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_sha256.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void sha256_transform_transport (const u32 w[16], u32 digest[8]) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = swap32_S (w[ 0]); w0[1] = swap32_S (w[ 1]); w0[2] = swap32_S (w[ 2]); w0[3] = swap32_S (w[ 3]); w1[0] = swap32_S (w[ 4]); w1[1] = swap32_S (w[ 5]); w1[2] = swap32_S (w[ 6]); w1[3] = swap32_S (w[ 7]); w2[0] = swap32_S (w[ 8]); w2[1] = swap32_S (w[ 9]); w2[2] = swap32_S (w[10]); w2[3] = swap32_S (w[11]); w3[0] = swap32_S (w[12]); w3[1] = swap32_S (w[13]); w3[2] = swap32_S (w[14]); w3[3] = swap32_S (w[15]); sha256_transform (w0, w1, w2, w3, digest); } void init_ctx (u32 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; } void bzero16 (u32 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; } void bswap8 (u32 block[16]) { block[ 0] = swap32 (block[ 0]); block[ 1] = swap32 (block[ 1]); block[ 2] = swap32 (block[ 2]); block[ 3] = swap32 (block[ 3]); block[ 4] = swap32 (block[ 4]); block[ 5] = swap32 (block[ 5]); block[ 6] = swap32 (block[ 6]); block[ 7] = swap32 (block[ 7]); } u32 memcat16 (u32 block[16], const u32 offset, const u32 append[4], const u32 append_len) { u32 tmp0; u32 tmp1; u32 tmp2; u32 tmp3; u32 tmp4; const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #if defined IS_AMD || defined IS_GENERIC u32 in0 = swap32_S (append[0]); u32 in1 = swap32_S (append[1]); u32 in2 = swap32_S (append[2]); u32 in3 = swap32_S (append[3]); tmp0 = amd_bytealign ( 0, in0, offset); tmp1 = amd_bytealign (in0, in1, offset); tmp2 = amd_bytealign (in1, in2, offset); tmp3 = amd_bytealign (in2, in3, offset); tmp4 = amd_bytealign (in3, 0, offset); tmp0 = swap32_S (tmp0); tmp1 = swap32_S (tmp1); tmp2 = swap32_S (tmp2); tmp3 = swap32_S (tmp3); tmp4 = swap32_S (tmp4); #endif #ifdef IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; u32 in0 = append[0]; u32 in1 = append[1]; u32 in2 = append[2]; u32 in3 = append[3]; tmp0 = __byte_perm ( 0, in0, selector); tmp1 = __byte_perm (in0, in1, selector); tmp2 = __byte_perm (in1, in2, selector); tmp3 = __byte_perm (in2, in3, selector); tmp4 = __byte_perm (in3, 0, selector); #endif switch (offset / 4) { 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 = offset + append_len; return new_len; } u32 memcat16c (u32 block[16], const u32 offset, const u32 append[4], const u32 append_len, u32 digest[8]) { u32 tmp0; u32 tmp1; u32 tmp2; u32 tmp3; u32 tmp4; const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #if defined IS_AMD || defined IS_GENERIC u32 in0 = swap32_S (append[0]); u32 in1 = swap32_S (append[1]); u32 in2 = swap32_S (append[2]); u32 in3 = swap32_S (append[3]); tmp0 = amd_bytealign ( 0, in0, offset); tmp1 = amd_bytealign (in0, in1, offset); tmp2 = amd_bytealign (in1, in2, offset); tmp3 = amd_bytealign (in2, in3, offset); tmp4 = amd_bytealign (in3, 0, offset); tmp0 = swap32_S (tmp0); tmp1 = swap32_S (tmp1); tmp2 = swap32_S (tmp2); tmp3 = swap32_S (tmp3); tmp4 = swap32_S (tmp4); #endif #ifdef IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; u32 in0 = append[0]; u32 in1 = append[1]; u32 in2 = append[2]; u32 in3 = append[3]; tmp0 = __byte_perm ( 0, in0, selector); tmp1 = __byte_perm (in0, in1, selector); tmp2 = __byte_perm (in1, in2, selector); tmp3 = __byte_perm (in2, in3, selector); tmp4 = __byte_perm (in3, 0, selector); #endif u32 carry[4] = { 0, 0, 0, 0 }; switch (offset / 4) { 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 = offset + append_len; if (new_len >= 64) { new_len -= 64; sha256_transform_transport (block, digest); bzero16 (block); block[0] = carry[0]; block[1] = carry[1]; block[2] = carry[2]; block[3] = carry[3]; } return new_len; } u32 memcat20 (u32 block[32], const u32 offset, const u32 append[4], const u32 append_len) { u32 tmp0; u32 tmp1; u32 tmp2; u32 tmp3; u32 tmp4; const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #if defined IS_AMD || defined IS_GENERIC u32 in0 = swap32_S (append[0]); u32 in1 = swap32_S (append[1]); u32 in2 = swap32_S (append[2]); u32 in3 = swap32_S (append[3]); tmp0 = amd_bytealign ( 0, in0, offset); tmp1 = amd_bytealign (in0, in1, offset); tmp2 = amd_bytealign (in1, in2, offset); tmp3 = amd_bytealign (in2, in3, offset); tmp4 = amd_bytealign (in3, 0, offset); tmp0 = swap32_S (tmp0); tmp1 = swap32_S (tmp1); tmp2 = swap32_S (tmp2); tmp3 = swap32_S (tmp3); tmp4 = swap32_S (tmp4); #endif #ifdef IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; u32 in0 = append[0]; u32 in1 = append[1]; u32 in2 = append[2]; u32 in3 = append[3]; tmp0 = __byte_perm ( 0, in0, selector); tmp1 = __byte_perm (in0, in1, selector); tmp2 = __byte_perm (in1, in2, selector); tmp3 = __byte_perm (in2, in3, selector); tmp4 = __byte_perm (in3, 0, selector); #endif switch (offset / 4) { 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 offset + append_len; } u32 memcat20_x80 (u32 block[32], const u32 offset, const u32 append[4], const u32 append_len) { u32 tmp0; u32 tmp1; u32 tmp2; u32 tmp3; u32 tmp4; const int offset_mod_4 = offset & 3; const int offset_minus_4 = 4 - offset_mod_4; #if defined IS_AMD || defined IS_GENERIC u32 in0 = swap32_S (append[0]); u32 in1 = swap32_S (append[1]); u32 in2 = swap32_S (append[2]); u32 in3 = swap32_S (append[3]); u32 in4 = 0x80000000; tmp0 = amd_bytealign ( 0, in0, offset); tmp1 = amd_bytealign (in0, in1, offset); tmp2 = amd_bytealign (in1, in2, offset); tmp3 = amd_bytealign (in2, in3, offset); tmp4 = amd_bytealign (in3, in4, offset); tmp0 = swap32_S (tmp0); tmp1 = swap32_S (tmp1); tmp2 = swap32_S (tmp2); tmp3 = swap32_S (tmp3); tmp4 = swap32_S (tmp4); #endif #ifdef IS_NV const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; u32 in0 = append[0]; u32 in1 = append[1]; u32 in2 = append[2]; u32 in3 = append[3]; u32 in4 = 0x80; tmp0 = __byte_perm ( 0, in0, selector); tmp1 = __byte_perm (in0, in1, selector); tmp2 = __byte_perm (in1, in2, selector); tmp3 = __byte_perm (in2, in3, selector); tmp4 = __byte_perm (in3, in4, selector); #endif switch (offset / 4) { 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 offset + append_len; } __kernel void m07400_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha256crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; 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 u32 block[16]; u32 alt_result[8]; u32 p_bytes[8]; u32 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_1x16 (block, block_len); block[15] = swap32 (block_len * 8); init_ctx (alt_result); sha256_transform_transport (block, alt_result); bswap8 (alt_result); block_len = 0; bzero16 (block); u32 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_4x4_le_S (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_1x16 (block, block_len); if (block_len >= 56) { sha256_transform_transport (block, alt_result); bzero16 (block); } block[15] = swap32 (transform_len * 8); sha256_transform_transport (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_1x16 (block, block_len); if (block_len >= 56) { sha256_transform_transport (block, p_bytes); bzero16 (block); } block[15] = swap32 (transform_len * 8); sha256_transform_transport (block, p_bytes); bswap8 (p_bytes); truncate_block_4x4_le_S (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_1x16 (block, block_len); if (block_len >= 56) { sha256_transform_transport (block, s_bytes); bzero16 (block); } block[15] = swap32 (transform_len * 8); sha256_transform_transport (block, s_bytes); bswap8 (s_bytes); truncate_block_4x4_le_S (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 m07400_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha256crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u32 pw_len = pws[gid].pw_len; /** * base */ u32 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]; u32 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_1x4 (p_bytes_x80, pw_len); u32 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]; u32 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++) { u32 tmp[8]; init_ctx (tmp); u32 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_transport (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] = swap32 (block_len * 8); sha256_transform_transport (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 m07400_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha256crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); const u32 r0 = tmps[gid].alt_result[0]; const u32 r1 = tmps[gid].alt_result[1]; const u32 r2 = tmps[gid].alt_result[2]; const u32 r3 = tmps[gid].alt_result[3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m07400.cl000066400000000000000000000242411320027462700154240ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_sha256.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" __kernel void m07400_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha256crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * init */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (w[idx]); } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = salt_bufs[salt_pos].salt_buf[idx]; } for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (s[idx]); } /** * prepare */ sha256_ctx_t ctx; sha256_init (&ctx); sha256_update (&ctx, w, pw_len); sha256_update (&ctx, s, salt_len); sha256_update (&ctx, w, pw_len); sha256_final (&ctx); u32 final[16] = { 0 }; final[0] = ctx.h[0]; final[1] = ctx.h[1]; final[2] = ctx.h[2]; final[3] = ctx.h[3]; final[4] = ctx.h[4]; final[5] = ctx.h[5]; final[6] = ctx.h[6]; final[7] = ctx.h[7]; // alt_result sha256_init (&ctx); sha256_update (&ctx, w, pw_len); sha256_update (&ctx, s, salt_len); int pl; for (pl = pw_len; pl > 32; pl -= 32) { sha256_update (&ctx, final, 32); } u32 t_final[16] = { 0 }; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) t_final[i] = final[i]; truncate_block_16x4_be_S (t_final + 0, t_final + 4, t_final + 8, t_final + 12, pl); sha256_update (&ctx, t_final, pl); for (int cnt = pw_len; cnt > 0; cnt >>= 1) { if ((cnt & 1) != 0) { sha256_update (&ctx, final, 32); } else { sha256_update (&ctx, w, pw_len); } } sha256_final (&ctx); tmps[gid].alt_result[0] = ctx.h[0]; tmps[gid].alt_result[1] = ctx.h[1]; tmps[gid].alt_result[2] = ctx.h[2]; tmps[gid].alt_result[3] = ctx.h[3]; tmps[gid].alt_result[4] = ctx.h[4]; tmps[gid].alt_result[5] = ctx.h[5]; tmps[gid].alt_result[6] = ctx.h[6]; tmps[gid].alt_result[7] = ctx.h[7]; // p_bytes sha256_init (&ctx); for (u32 j = 0; j < pw_len; j++) { sha256_update (&ctx, w, pw_len); } sha256_final (&ctx); final[ 0] = ctx.h[0]; final[ 1] = ctx.h[1]; final[ 2] = ctx.h[2]; final[ 3] = ctx.h[3]; final[ 4] = ctx.h[4]; final[ 5] = ctx.h[5]; final[ 6] = ctx.h[6]; final[ 7] = ctx.h[7]; final[ 8] = 0; final[ 9] = 0; final[10] = 0; final[11] = 0; final[12] = 0; final[13] = 0; final[14] = 0; final[15] = 0; u32 p_final[64] = { 0 }; int idx; for (pl = pw_len, idx = 0; pl > 32; pl -= 32, idx += 8) { p_final[idx + 0] = final[0]; p_final[idx + 1] = final[1]; p_final[idx + 2] = final[2]; p_final[idx + 3] = final[3]; p_final[idx + 4] = final[4]; p_final[idx + 5] = final[5]; p_final[idx + 6] = final[6]; p_final[idx + 7] = final[7]; } truncate_block_16x4_be_S (final + 0, final + 4, final + 8, final + 12, pl); p_final[idx + 0] = final[0]; p_final[idx + 1] = final[1]; p_final[idx + 2] = final[2]; p_final[idx + 3] = final[3]; p_final[idx + 4] = final[4]; p_final[idx + 5] = final[5]; p_final[idx + 6] = final[6]; p_final[idx + 7] = final[7]; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) tmps[gid].p_bytes[i] = p_final[i]; // s_bytes sha256_init (&ctx); for (u32 j = 0; j < 16 + (tmps[gid].alt_result[0] >> 24); j++) { sha256_update (&ctx, s, salt_len); } sha256_final (&ctx); final[ 0] = ctx.h[0]; final[ 1] = ctx.h[1]; final[ 2] = ctx.h[2]; final[ 3] = ctx.h[3]; final[ 4] = ctx.h[4]; final[ 5] = ctx.h[5]; final[ 6] = ctx.h[6]; final[ 7] = ctx.h[7]; final[ 8] = 0; final[ 9] = 0; final[10] = 0; final[11] = 0; final[12] = 0; final[13] = 0; final[14] = 0; final[15] = 0; u32 s_final[64] = { 0 }; for (pl = salt_len, idx = 0; pl > 32; pl -= 32, idx += 8) { s_final[idx + 0] = final[0]; s_final[idx + 1] = final[1]; s_final[idx + 2] = final[2]; s_final[idx + 3] = final[3]; s_final[idx + 4] = final[4]; s_final[idx + 5] = final[5]; s_final[idx + 6] = final[6]; s_final[idx + 7] = final[7]; } truncate_block_16x4_be_S (final + 0, final + 4, final + 8, final + 12, pl); s_final[idx + 0] = final[0]; s_final[idx + 1] = final[1]; s_final[idx + 2] = final[2]; s_final[idx + 3] = final[3]; s_final[idx + 4] = final[4]; s_final[idx + 5] = final[5]; s_final[idx + 6] = final[6]; s_final[idx + 7] = final[7]; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 64; i++) tmps[gid].s_bytes[i] = s_final[i]; } __kernel void m07400_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha256crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u32 pw_len = pws[gid].pw_len; const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 alt_result[16] = { 0 }; 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]; /* Repeatedly run the collected hash value through sha256 to burn CPU cycles. */ for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) { sha256_ctx_t ctx; sha256_init (&ctx); if (j & 1) { sha256_update_global (&ctx, tmps[gid].p_bytes, pw_len); } else { sha256_update (&ctx, alt_result, 32); } if (j % 3) { sha256_update_global (&ctx, tmps[gid].s_bytes, salt_len); } if (j % 7) { sha256_update_global (&ctx, tmps[gid].p_bytes, pw_len); } if (j & 1) { sha256_update (&ctx, alt_result, 32); } else { sha256_update_global (&ctx, tmps[gid].p_bytes, pw_len); } sha256_final (&ctx); alt_result[0] = ctx.h[0]; alt_result[1] = ctx.h[1]; alt_result[2] = ctx.h[2]; alt_result[3] = ctx.h[3]; alt_result[4] = ctx.h[4]; alt_result[5] = ctx.h[5]; alt_result[6] = ctx.h[6]; alt_result[7] = ctx.h[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 m07400_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global sha256crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); const u32 r0 = swap32_S (tmps[gid].alt_result[0]); const u32 r1 = swap32_S (tmps[gid].alt_result[1]); const u32 r2 = swap32_S (tmps[gid].alt_result[2]); const u32 r3 = swap32_S (tmps[gid].alt_result[3]); #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m07500_a0-optimized.cl000066400000000000000000000454721320027462700200200ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //shared mem too small //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; void swap (SCR_TYPE 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; } void rc4_init_16 (SCR_TYPE RC4_KEY *rc4_key, const u32 data[4]) { u32 v = 0x03020100; u32 a = 0x04040404; SCR_TYPE u32 *ptr = (SCR_TYPE u32 *) rc4_key->S; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (SCR_TYPE RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } int decrypt_and_check (SCR_TYPE RC4_KEY *rc4_key, u32 data[4], u32 timestamp_ct[8]) { rc4_init_16 (rc4_key, data); u32 out[4]; u8 j = 0; j = rc4_next_16 (rc4_key, 0, j, timestamp_ct + 0, out); if ((out[3] & 0xffff0000) != 0x30320000) return 0; j = rc4_next_16 (rc4_key, 16, j, timestamp_ct + 4, out); if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; return 1; } void hmac_md5_pad (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 ipad[4], u32 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); } void hmac_md5_run (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 ipad[4], u32 opad[4], u32 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); } void kerb_prepare (const u32 w0[4], const u32 w1[4], const u32 pw_len, const u32 checksum[4], u32 digest[4]) { /** * pads */ u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 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_2x4 (w0_t, w1_t, pw_len); make_utf16le (w1_t, w2_t, w3_t); make_utf16le (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; u32 ipad[4]; u32 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 m07500_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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[digests_offset].checksum[0]; checksum[1] = krb5pa_bufs[digests_offset].checksum[1]; checksum[2] = krb5pa_bufs[digests_offset].checksum[2]; checksum[3] = krb5pa_bufs[digests_offset].checksum[3]; u32 timestamp_ct[8]; timestamp_ct[0] = krb5pa_bufs[digests_offset].timestamp[0]; timestamp_ct[1] = krb5pa_bufs[digests_offset].timestamp[1]; timestamp_ct[2] = krb5pa_bufs[digests_offset].timestamp[2]; timestamp_ct[3] = krb5pa_bufs[digests_offset].timestamp[3]; timestamp_ct[4] = krb5pa_bufs[digests_offset].timestamp[4]; timestamp_ct[5] = krb5pa_bufs[digests_offset].timestamp[5]; timestamp_ct[6] = krb5pa_bufs[digests_offset].timestamp[6]; timestamp_ct[7] = krb5pa_bufs[digests_offset].timestamp[7]; /** * shared */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * kerberos */ u32 digest[4]; kerb_prepare (w0, w1, out_len, checksum, digest); u32 tmp[4]; tmp[0] = digest[0]; tmp[1] = digest[1]; tmp[2] = digest[2]; tmp[3] = digest[3]; if (decrypt_and_check (rc4_key, tmp, timestamp_ct) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } __kernel void m07500_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07500_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07500_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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[digests_offset].checksum[0]; checksum[1] = krb5pa_bufs[digests_offset].checksum[1]; checksum[2] = krb5pa_bufs[digests_offset].checksum[2]; checksum[3] = krb5pa_bufs[digests_offset].checksum[3]; u32 timestamp_ct[8]; timestamp_ct[0] = krb5pa_bufs[digests_offset].timestamp[0]; timestamp_ct[1] = krb5pa_bufs[digests_offset].timestamp[1]; timestamp_ct[2] = krb5pa_bufs[digests_offset].timestamp[2]; timestamp_ct[3] = krb5pa_bufs[digests_offset].timestamp[3]; timestamp_ct[4] = krb5pa_bufs[digests_offset].timestamp[4]; timestamp_ct[5] = krb5pa_bufs[digests_offset].timestamp[5]; timestamp_ct[6] = krb5pa_bufs[digests_offset].timestamp[6]; timestamp_ct[7] = krb5pa_bufs[digests_offset].timestamp[7]; /** * shared */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * kerberos */ u32 digest[4]; kerb_prepare (w0, w1, out_len, checksum, digest); u32 tmp[4]; tmp[0] = digest[0]; tmp[1] = digest[1]; tmp[2] = digest[2]; tmp[3] = digest[3]; if (decrypt_and_check (rc4_key, tmp, timestamp_ct) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } __kernel void m07500_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07500_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m07500_a0.cl000066400000000000000000000261661320027462700160150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //shared mem too small //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; void swap (SCR_TYPE 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; } void rc4_init_16 (SCR_TYPE RC4_KEY *rc4_key, const u32 data[4]) { u32 v = 0x03020100; u32 a = 0x04040404; SCR_TYPE u32 *ptr = (SCR_TYPE u32 *) rc4_key->S; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (SCR_TYPE RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } int decrypt_and_check (SCR_TYPE RC4_KEY *rc4_key, u32 data[4], u32 timestamp_ct[8]) { rc4_init_16 (rc4_key, data); u32 out[4]; u8 j = 0; j = rc4_next_16 (rc4_key, 0, j, timestamp_ct + 0, out); if ((out[3] & 0xffff0000) != 0x30320000) return 0; j = rc4_next_16 (rc4_key, 16, j, timestamp_ct + 4, out); if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; return 1; } void kerb_prepare (const u32 K[4], const u32 checksum[4], u32 digest[4]) { // K1=MD5_HMAC(K,1); with 1 encoded as little indian on 4 bytes (01000000 in hexa); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = K[0]; w0[1] = K[1]; w0[2] = K[2]; w0[3] = K[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; md5_hmac_ctx_t ctx1; md5_hmac_init_64 (&ctx1, w0, w1, w2, w3); w0[0] = 1; 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] = 0; md5_hmac_update_64 (&ctx1, w0, w1, w2, w3, 4); md5_hmac_final (&ctx1); w0[0] = ctx1.opad.h[0]; w0[1] = ctx1.opad.h[1]; w0[2] = ctx1.opad.h[2]; w0[3] = ctx1.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); w0[0] = checksum[0]; w0[1] = checksum[1]; w0[2] = checksum[2]; w0[3] = checksum[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; md5_hmac_update_64 (&ctx, w0, w1, w2, w3, 16); md5_hmac_final (&ctx); digest[0] = ctx.opad.h[0]; digest[1] = ctx.opad.h[1]; digest[2] = ctx.opad.h[2]; digest[3] = ctx.opad.h[3]; } __kernel void m07500_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif u32 checksum[4]; checksum[0] = krb5pa_bufs[digests_offset].checksum[0]; checksum[1] = krb5pa_bufs[digests_offset].checksum[1]; checksum[2] = krb5pa_bufs[digests_offset].checksum[2]; checksum[3] = krb5pa_bufs[digests_offset].checksum[3]; u32 timestamp_ct[8]; timestamp_ct[0] = krb5pa_bufs[digests_offset].timestamp[0]; timestamp_ct[1] = krb5pa_bufs[digests_offset].timestamp[1]; timestamp_ct[2] = krb5pa_bufs[digests_offset].timestamp[2]; timestamp_ct[3] = krb5pa_bufs[digests_offset].timestamp[3]; timestamp_ct[4] = krb5pa_bufs[digests_offset].timestamp[4]; timestamp_ct[5] = krb5pa_bufs[digests_offset].timestamp[5]; timestamp_ct[6] = krb5pa_bufs[digests_offset].timestamp[6]; timestamp_ct[7] = krb5pa_bufs[digests_offset].timestamp[7]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md4_ctx_t ctx; md4_init (&ctx); md4_update_utf16le (&ctx, tmp.i, tmp.pw_len); md4_final (&ctx); u32 digest[4]; kerb_prepare (ctx.h, checksum, digest); if (decrypt_and_check (rc4_key, digest, timestamp_ct) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } __kernel void m07500_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif u32 checksum[4]; checksum[0] = krb5pa_bufs[digests_offset].checksum[0]; checksum[1] = krb5pa_bufs[digests_offset].checksum[1]; checksum[2] = krb5pa_bufs[digests_offset].checksum[2]; checksum[3] = krb5pa_bufs[digests_offset].checksum[3]; u32 timestamp_ct[8]; timestamp_ct[0] = krb5pa_bufs[digests_offset].timestamp[0]; timestamp_ct[1] = krb5pa_bufs[digests_offset].timestamp[1]; timestamp_ct[2] = krb5pa_bufs[digests_offset].timestamp[2]; timestamp_ct[3] = krb5pa_bufs[digests_offset].timestamp[3]; timestamp_ct[4] = krb5pa_bufs[digests_offset].timestamp[4]; timestamp_ct[5] = krb5pa_bufs[digests_offset].timestamp[5]; timestamp_ct[6] = krb5pa_bufs[digests_offset].timestamp[6]; timestamp_ct[7] = krb5pa_bufs[digests_offset].timestamp[7]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md4_ctx_t ctx; md4_init (&ctx); md4_update_utf16le (&ctx, tmp.i, tmp.pw_len); md4_final (&ctx); u32 digest[4]; kerb_prepare (ctx.h, checksum, digest); if (decrypt_and_check (rc4_key, digest, timestamp_ct) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } hashcat-4.0.1/OpenCL/m07500_a1-optimized.cl000066400000000000000000000530271320027462700200140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //shared mem too small //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; void swap (SCR_TYPE 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; } void rc4_init_16 (SCR_TYPE RC4_KEY *rc4_key, const u32 data[4]) { u32 v = 0x03020100; u32 a = 0x04040404; SCR_TYPE u32 *ptr = (SCR_TYPE u32 *) rc4_key->S; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (SCR_TYPE RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } int decrypt_and_check (SCR_TYPE RC4_KEY *rc4_key, u32 data[4], u32 timestamp_ct[8]) { rc4_init_16 (rc4_key, data); u32 out[4]; u8 j = 0; j = rc4_next_16 (rc4_key, 0, j, timestamp_ct + 0, out); if ((out[3] & 0xffff0000) != 0x30320000) return 0; j = rc4_next_16 (rc4_key, 16, j, timestamp_ct + 4, out); if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; return 1; } void hmac_md5_pad (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 ipad[4], u32 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); } void hmac_md5_run (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 ipad[4], u32 opad[4], u32 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); } void kerb_prepare (const u32 w0[4], const u32 w1[4], const u32 pw_len, const u32 checksum[4], u32 digest[4]) { /** * pads */ u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 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_2x4 (w0_t, w1_t, pw_len); make_utf16le (w1_t, w2_t, w3_t); make_utf16le (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; u32 ipad[4]; u32 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 m07500_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 checksum[4]; checksum[0] = krb5pa_bufs[digests_offset].checksum[0]; checksum[1] = krb5pa_bufs[digests_offset].checksum[1]; checksum[2] = krb5pa_bufs[digests_offset].checksum[2]; checksum[3] = krb5pa_bufs[digests_offset].checksum[3]; u32 timestamp_ct[8]; timestamp_ct[0] = krb5pa_bufs[digests_offset].timestamp[0]; timestamp_ct[1] = krb5pa_bufs[digests_offset].timestamp[1]; timestamp_ct[2] = krb5pa_bufs[digests_offset].timestamp[2]; timestamp_ct[3] = krb5pa_bufs[digests_offset].timestamp[3]; timestamp_ct[4] = krb5pa_bufs[digests_offset].timestamp[4]; timestamp_ct[5] = krb5pa_bufs[digests_offset].timestamp[5]; timestamp_ct[6] = krb5pa_bufs[digests_offset].timestamp[6]; timestamp_ct[7] = krb5pa_bufs[digests_offset].timestamp[7]; /** * shared */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32x w0[4]; u32x w1[4]; 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]; /** * kerberos */ u32 digest[4]; kerb_prepare (w0, w1, pw_len, checksum, digest); u32 tmp[4]; tmp[0] = digest[0]; tmp[1] = digest[1]; tmp[2] = digest[2]; tmp[3] = digest[3]; if (decrypt_and_check (rc4_key, tmp, timestamp_ct) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } __kernel void m07500_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07500_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07500_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 checksum[4]; checksum[0] = krb5pa_bufs[digests_offset].checksum[0]; checksum[1] = krb5pa_bufs[digests_offset].checksum[1]; checksum[2] = krb5pa_bufs[digests_offset].checksum[2]; checksum[3] = krb5pa_bufs[digests_offset].checksum[3]; u32 timestamp_ct[8]; timestamp_ct[0] = krb5pa_bufs[digests_offset].timestamp[0]; timestamp_ct[1] = krb5pa_bufs[digests_offset].timestamp[1]; timestamp_ct[2] = krb5pa_bufs[digests_offset].timestamp[2]; timestamp_ct[3] = krb5pa_bufs[digests_offset].timestamp[3]; timestamp_ct[4] = krb5pa_bufs[digests_offset].timestamp[4]; timestamp_ct[5] = krb5pa_bufs[digests_offset].timestamp[5]; timestamp_ct[6] = krb5pa_bufs[digests_offset].timestamp[6]; timestamp_ct[7] = krb5pa_bufs[digests_offset].timestamp[7]; /** * shared */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32x w0[4]; u32x w1[4]; 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]; /** * kerberos */ u32 digest[4]; kerb_prepare (w0, w1, pw_len, checksum, digest); u32 tmp[4]; tmp[0] = digest[0]; tmp[1] = digest[1]; tmp[2] = digest[2]; tmp[3] = digest[3]; if (decrypt_and_check (rc4_key, tmp, timestamp_ct) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } __kernel void m07500_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07500_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m07500_a1.cl000066400000000000000000000261171320027462700160120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //shared mem too small //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; void swap (SCR_TYPE 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; } void rc4_init_16 (SCR_TYPE RC4_KEY *rc4_key, const u32 data[4]) { u32 v = 0x03020100; u32 a = 0x04040404; SCR_TYPE u32 *ptr = (SCR_TYPE u32 *) rc4_key->S; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (SCR_TYPE RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } int decrypt_and_check (SCR_TYPE RC4_KEY *rc4_key, u32 data[4], u32 timestamp_ct[8]) { rc4_init_16 (rc4_key, data); u32 out[4]; u8 j = 0; j = rc4_next_16 (rc4_key, 0, j, timestamp_ct + 0, out); if ((out[3] & 0xffff0000) != 0x30320000) return 0; j = rc4_next_16 (rc4_key, 16, j, timestamp_ct + 4, out); if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; return 1; } void kerb_prepare (const u32 K[4], const u32 checksum[4], u32 digest[4]) { // K1=MD5_HMAC(K,1); with 1 encoded as little indian on 4 bytes (01000000 in hexa); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = K[0]; w0[1] = K[1]; w0[2] = K[2]; w0[3] = K[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; md5_hmac_ctx_t ctx1; md5_hmac_init_64 (&ctx1, w0, w1, w2, w3); w0[0] = 1; 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] = 0; md5_hmac_update_64 (&ctx1, w0, w1, w2, w3, 4); md5_hmac_final (&ctx1); w0[0] = ctx1.opad.h[0]; w0[1] = ctx1.opad.h[1]; w0[2] = ctx1.opad.h[2]; w0[3] = ctx1.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); w0[0] = checksum[0]; w0[1] = checksum[1]; w0[2] = checksum[2]; w0[3] = checksum[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; md5_hmac_update_64 (&ctx, w0, w1, w2, w3, 16); md5_hmac_final (&ctx); digest[0] = ctx.opad.h[0]; digest[1] = ctx.opad.h[1]; digest[2] = ctx.opad.h[2]; digest[3] = ctx.opad.h[3]; } __kernel void m07500_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif u32 checksum[4]; checksum[0] = krb5pa_bufs[digests_offset].checksum[0]; checksum[1] = krb5pa_bufs[digests_offset].checksum[1]; checksum[2] = krb5pa_bufs[digests_offset].checksum[2]; checksum[3] = krb5pa_bufs[digests_offset].checksum[3]; u32 timestamp_ct[8]; timestamp_ct[0] = krb5pa_bufs[digests_offset].timestamp[0]; timestamp_ct[1] = krb5pa_bufs[digests_offset].timestamp[1]; timestamp_ct[2] = krb5pa_bufs[digests_offset].timestamp[2]; timestamp_ct[3] = krb5pa_bufs[digests_offset].timestamp[3]; timestamp_ct[4] = krb5pa_bufs[digests_offset].timestamp[4]; timestamp_ct[5] = krb5pa_bufs[digests_offset].timestamp[5]; timestamp_ct[6] = krb5pa_bufs[digests_offset].timestamp[6]; timestamp_ct[7] = krb5pa_bufs[digests_offset].timestamp[7]; md4_ctx_t ctx0; md4_init (&ctx0); md4_update_global_utf16le (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md4_ctx_t ctx = ctx0; md4_update_global_utf16le (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md4_final (&ctx); u32 digest[4]; kerb_prepare (ctx.h, checksum, digest); if (decrypt_and_check (rc4_key, digest, timestamp_ct) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } __kernel void m07500_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif u32 checksum[4]; checksum[0] = krb5pa_bufs[digests_offset].checksum[0]; checksum[1] = krb5pa_bufs[digests_offset].checksum[1]; checksum[2] = krb5pa_bufs[digests_offset].checksum[2]; checksum[3] = krb5pa_bufs[digests_offset].checksum[3]; u32 timestamp_ct[8]; timestamp_ct[0] = krb5pa_bufs[digests_offset].timestamp[0]; timestamp_ct[1] = krb5pa_bufs[digests_offset].timestamp[1]; timestamp_ct[2] = krb5pa_bufs[digests_offset].timestamp[2]; timestamp_ct[3] = krb5pa_bufs[digests_offset].timestamp[3]; timestamp_ct[4] = krb5pa_bufs[digests_offset].timestamp[4]; timestamp_ct[5] = krb5pa_bufs[digests_offset].timestamp[5]; timestamp_ct[6] = krb5pa_bufs[digests_offset].timestamp[6]; timestamp_ct[7] = krb5pa_bufs[digests_offset].timestamp[7]; md4_ctx_t ctx0; md4_init (&ctx0); md4_update_global_utf16le (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md4_ctx_t ctx = ctx0; md4_update_global_utf16le (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md4_final (&ctx); u32 digest[4]; kerb_prepare (ctx.h, checksum, digest); if (decrypt_and_check (rc4_key, digest, timestamp_ct) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } hashcat-4.0.1/OpenCL/m07500_a3-optimized.cl000066400000000000000000000541061320027462700200150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //shared mem too small //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; void swap (SCR_TYPE 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; } void rc4_init_16 (SCR_TYPE RC4_KEY *rc4_key, const u32 data[4]) { u32 v = 0x03020100; u32 a = 0x04040404; SCR_TYPE u32 *ptr = (SCR_TYPE u32 *) rc4_key->S; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (SCR_TYPE RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } int decrypt_and_check (SCR_TYPE RC4_KEY *rc4_key, u32 data[4], u32 timestamp_ct[8]) { rc4_init_16 (rc4_key, data); u32 out[4]; u8 j = 0; j = rc4_next_16 (rc4_key, 0, j, timestamp_ct + 0, out); if ((out[3] & 0xffff0000) != 0x30320000) return 0; j = rc4_next_16 (rc4_key, 16, j, timestamp_ct + 4, out); if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; return 1; } void hmac_md5_pad (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 ipad[4], u32 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); } void hmac_md5_run (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 ipad[4], u32 opad[4], u32 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); } void kerb_prepare (const u32 w0[4], const u32 w1[4], const u32 pw_len, const u32 checksum[4], u32 digest[4]) { /** * pads */ u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 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_2x4 (w0_t, w1_t, pw_len); make_utf16le (w1_t, w2_t, w3_t); make_utf16le (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; u32 ipad[4]; u32 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); } void m07500 (SCR_TYPE RC4_KEY *rc4_key, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 checksum[4]; checksum[0] = krb5pa_bufs[digests_offset].checksum[0]; checksum[1] = krb5pa_bufs[digests_offset].checksum[1]; checksum[2] = krb5pa_bufs[digests_offset].checksum[2]; checksum[3] = krb5pa_bufs[digests_offset].checksum[3]; u32 timestamp_ct[8]; timestamp_ct[0] = krb5pa_bufs[digests_offset].timestamp[0]; timestamp_ct[1] = krb5pa_bufs[digests_offset].timestamp[1]; timestamp_ct[2] = krb5pa_bufs[digests_offset].timestamp[2]; timestamp_ct[3] = krb5pa_bufs[digests_offset].timestamp[3]; timestamp_ct[4] = krb5pa_bufs[digests_offset].timestamp[4]; timestamp_ct[5] = krb5pa_bufs[digests_offset].timestamp[5]; timestamp_ct[6] = krb5pa_bufs[digests_offset].timestamp[6]; timestamp_ct[7] = krb5pa_bufs[digests_offset].timestamp[7]; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /** * kerberos */ u32 digest[4]; kerb_prepare (w0_t, w1_t, pw_len, checksum, digest); u32 tmp[4]; tmp[0] = digest[0]; tmp[1] = digest[1]; tmp[2] = digest[2]; tmp[3] = digest[3]; if (decrypt_and_check (rc4_key, tmp, timestamp_ct) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } __kernel void m07500_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif m07500 (rc4_key, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07500_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif m07500 (rc4_key, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07500_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07500_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif m07500 (rc4_key, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07500_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif m07500 (rc4_key, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07500_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m07500_a3.cl000066400000000000000000000276611320027462700160210ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //shared mem too small //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; void swap (SCR_TYPE 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; } void rc4_init_16 (SCR_TYPE RC4_KEY *rc4_key, const u32 data[4]) { u32 v = 0x03020100; u32 a = 0x04040404; SCR_TYPE u32 *ptr = (SCR_TYPE u32 *) rc4_key->S; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (SCR_TYPE RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } int decrypt_and_check (SCR_TYPE RC4_KEY *rc4_key, u32 data[4], u32 timestamp_ct[8]) { rc4_init_16 (rc4_key, data); u32 out[4]; u8 j = 0; j = rc4_next_16 (rc4_key, 0, j, timestamp_ct + 0, out); if ((out[3] & 0xffff0000) != 0x30320000) return 0; j = rc4_next_16 (rc4_key, 16, j, timestamp_ct + 4, out); if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; out[0] >>= 8; if (((out[0] & 0xff) < '0') || ((out[0] & 0xff) > '9')) return 0; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; out[1] >>= 8; if (((out[1] & 0xff) < '0') || ((out[1] & 0xff) > '9')) return 0; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; out[2] >>= 8; if (((out[2] & 0xff) < '0') || ((out[2] & 0xff) > '9')) return 0; return 1; } void kerb_prepare (const u32 K[4], const u32 checksum[4], u32 digest[4]) { // K1=MD5_HMAC(K,1); with 1 encoded as little indian on 4 bytes (01000000 in hexa); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = K[0]; w0[1] = K[1]; w0[2] = K[2]; w0[3] = K[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; md5_hmac_ctx_t ctx1; md5_hmac_init_64 (&ctx1, w0, w1, w2, w3); w0[0] = 1; 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] = 0; md5_hmac_update_64 (&ctx1, w0, w1, w2, w3, 4); md5_hmac_final (&ctx1); w0[0] = ctx1.opad.h[0]; w0[1] = ctx1.opad.h[1]; w0[2] = ctx1.opad.h[2]; w0[3] = ctx1.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); w0[0] = checksum[0]; w0[1] = checksum[1]; w0[2] = checksum[2]; w0[3] = checksum[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; md5_hmac_update_64 (&ctx, w0, w1, w2, w3, 16); md5_hmac_final (&ctx); digest[0] = ctx.opad.h[0]; digest[1] = ctx.opad.h[1]; digest[2] = ctx.opad.h[2]; digest[3] = ctx.opad.h[3]; } __kernel void m07500_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif u32 checksum[4]; checksum[0] = krb5pa_bufs[digests_offset].checksum[0]; checksum[1] = krb5pa_bufs[digests_offset].checksum[1]; checksum[2] = krb5pa_bufs[digests_offset].checksum[2]; checksum[3] = krb5pa_bufs[digests_offset].checksum[3]; u32 timestamp_ct[8]; timestamp_ct[0] = krb5pa_bufs[digests_offset].timestamp[0]; timestamp_ct[1] = krb5pa_bufs[digests_offset].timestamp[1]; timestamp_ct[2] = krb5pa_bufs[digests_offset].timestamp[2]; timestamp_ct[3] = krb5pa_bufs[digests_offset].timestamp[3]; timestamp_ct[4] = krb5pa_bufs[digests_offset].timestamp[4]; timestamp_ct[5] = krb5pa_bufs[digests_offset].timestamp[5]; timestamp_ct[6] = krb5pa_bufs[digests_offset].timestamp[6]; timestamp_ct[7] = krb5pa_bufs[digests_offset].timestamp[7]; /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md4_ctx_t ctx; md4_init (&ctx); md4_update_utf16le (&ctx, w, pw_len); md4_final (&ctx); u32 digest[4]; kerb_prepare (ctx.h, checksum, digest); if (decrypt_and_check (rc4_key, digest, timestamp_ct) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } __kernel void m07500_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif u32 checksum[4]; checksum[0] = krb5pa_bufs[digests_offset].checksum[0]; checksum[1] = krb5pa_bufs[digests_offset].checksum[1]; checksum[2] = krb5pa_bufs[digests_offset].checksum[2]; checksum[3] = krb5pa_bufs[digests_offset].checksum[3]; u32 timestamp_ct[8]; timestamp_ct[0] = krb5pa_bufs[digests_offset].timestamp[0]; timestamp_ct[1] = krb5pa_bufs[digests_offset].timestamp[1]; timestamp_ct[2] = krb5pa_bufs[digests_offset].timestamp[2]; timestamp_ct[3] = krb5pa_bufs[digests_offset].timestamp[3]; timestamp_ct[4] = krb5pa_bufs[digests_offset].timestamp[4]; timestamp_ct[5] = krb5pa_bufs[digests_offset].timestamp[5]; timestamp_ct[6] = krb5pa_bufs[digests_offset].timestamp[6]; timestamp_ct[7] = krb5pa_bufs[digests_offset].timestamp[7]; /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md4_ctx_t ctx; md4_init (&ctx); md4_update_utf16le (&ctx, w, pw_len); md4_final (&ctx); u32 digest[4]; kerb_prepare (ctx.h, checksum, digest); if (decrypt_and_check (rc4_key, digest, timestamp_ct) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } hashcat-4.0.1/OpenCL/m07700_a0-optimized.cl000066400000000000000000000405421320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #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 u32a 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 u32a 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 }; u32 sapb_trans (const u32 in) { u32 out = 0; 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; return out; } u32 walld0rf_magic (const u32 w0[4], const u32 pw_len, const u32 salt_buf0[4], const u32 salt_len, const u32 a, const u32 b, const u32 c, const u32 d, u32 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; while (i2 < sum20) { if (i1 < pw_len) { if (GETCHAR (saved_key, 15 - i1) & 1) { PUTCHAR (t, i2, bcodeArray[48 - 1 - i1]); i2++; if (i2 == sum20) break; } PUTCHAR (t, i2, GETCHAR (w, i1)); i2++; if (i2 == sum20) break; i1++; } if (i3 < salt_len) { PUTCHAR (t, i2, GETCHAR (s, i3)); i2++; if (i2 == sum20) break; i3++; } PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); i2++; i2++; } return sum20; } __kernel void m07700_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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] = 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); if (out_len > 8) continue; // otherwise it overflows in waldorf function /** * SAP */ w0[0] = sapb_trans (w0[0]); w0[1] = sapb_trans (w0[1]); /** * append salt */ u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = 0; s1[0] = 0; s1[1] = 0; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le (s0, s1, s2, s3, out_len); const u32 pw_salt_len = out_len + salt_len; u32 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_4x4_S (t + 0, t + 4, t + 8, t + 12, pw_salt_len); /** * md5 */ u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (t + 0, t + 4, t + 8, t + 12, digest); const u32 sum20 = walld0rf_magic (w0, pw_len, salt_buf0, salt_len, digest[0], digest[1], digest[2], digest[3], t); append_0x80_4x4_S (t + 0, t + 4, t + 8, t + 12, sum20); t[14] = sum20 * 8; t[15] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (t + 0, t + 4, t + 8, t + 12, digest); const u32 r0 = digest[0] ^ digest[2]; const u32 r1 = digest[1] ^ digest[3]; const u32 r2 = 0; const u32 r3 = 0; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m07700_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07700_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07700_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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] = 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], 0, 0 }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); if (out_len > 8) continue; // otherwise it overflows in waldorf function /** * SAP */ w0[0] = sapb_trans (w0[0]); w0[1] = sapb_trans (w0[1]); /** * append salt */ u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = 0; s1[0] = 0; s1[1] = 0; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le (s0, s1, s2, s3, out_len); const u32 pw_salt_len = out_len + salt_len; u32 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_4x4_S (t + 0, t + 4, t + 8, t + 12, pw_salt_len); /** * md5 */ u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (t + 0, t + 4, t + 8, t + 12, digest); const u32 sum20 = walld0rf_magic (w0, pw_len, salt_buf0, salt_len, digest[0], digest[1], digest[2], digest[3], t); append_0x80_4x4_S (t + 0, t + 4, t + 8, t + 12, sum20); t[14] = sum20 * 8; t[15] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (t + 0, t + 4, t + 8, t + 12, digest); const u32 r0 = digest[0] ^ digest[2]; const u32 r1 = digest[1] ^ digest[3]; const u32 r2 = 0; const u32 r3 = 0; COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m07700_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07700_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m07700_a1-optimized.cl000066400000000000000000000451671320027462700200240ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #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 u32a 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 u32a 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 }; u32 sapb_trans (const u32 in) { u32 out = 0; 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; return out; } u32 walld0rf_magic (const u32 w0[4], const u32 pw_len, const u32 salt_buf0[4], const u32 salt_len, const u32 a, const u32 b, const u32 c, const u32 d, u32 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; while (i2 < sum20) { if (i1 < pw_len) { if (GETCHAR (saved_key, 15 - i1) & 1) { PUTCHAR (t, i2, bcodeArray[48 - 1 - i1]); i2++; if (i2 == sum20) break; } PUTCHAR (t, i2, GETCHAR (w, i1)); i2++; if (i2 == sum20) break; i1++; } if (i3 < salt_len) { PUTCHAR (t, i2, GETCHAR (s, i3)); i2++; if (i2 == sum20) break; i3++; } PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); i2++; i2++; } return sum20; } __kernel void m07700_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32x w0[4]; w0[0] = wordl0[0] | wordr0[0]; w0[1] = wordl0[1] | wordr0[1]; if (pw_len > 8) continue; // otherwise it overflows in waldorf function /** * SAP */ w0[0] = sapb_trans (w0[0]); w0[1] = sapb_trans (w0[1]); /** * append salt */ u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = 0; s1[0] = 0; s1[1] = 0; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le (s0, s1, s2, s3, pw_len); const u32 pw_salt_len = pw_len + salt_len; u32 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_4x4_S (t + 0, t + 4, t + 8, t + 12, pw_salt_len); /** * md5 */ u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (t + 0, t + 4, t + 8, t + 12, digest); const u32 sum20 = walld0rf_magic (w0, pw_len, salt_buf0, salt_len, digest[0], digest[1], digest[2], digest[3], t); append_0x80_4x4_S (t + 0, t + 4, t + 8, t + 12, sum20); t[14] = sum20 * 8; t[15] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (t + 0, t + 4, t + 8, t + 12, digest); const u32 r0 = digest[0] ^ digest[2]; const u32 r1 = digest[1] ^ digest[3]; const u32 r2 = 0; const u32 r3 = 0; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m07700_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07700_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07700_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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], 0, 0 }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32x w0[4]; w0[0] = wordl0[0] | wordr0[0]; w0[1] = wordl0[1] | wordr0[1]; if (pw_len > 8) continue; // otherwise it overflows in waldorf function /** * SAP */ w0[0] = sapb_trans (w0[0]); w0[1] = sapb_trans (w0[1]); /** * append salt */ u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = 0; s1[0] = 0; s1[1] = 0; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le (s0, s1, s2, s3, pw_len); const u32 pw_salt_len = pw_len + salt_len; u32 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_4x4_S (t + 0, t + 4, t + 8, t + 12, pw_salt_len); /** * md5 */ u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (t + 0, t + 4, t + 8, t + 12, digest); const u32 sum20 = walld0rf_magic (w0, pw_len, salt_buf0, salt_len, digest[0], digest[1], digest[2], digest[3], t); append_0x80_4x4_S (t + 0, t + 4, t + 8, t + 12, sum20); t[14] = sum20 * 8; t[15] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (t + 0, t + 4, t + 8, t + 12, digest); const u32 r0 = digest[0] ^ digest[2]; const u32 r1 = digest[1] ^ digest[3]; const u32 r2 = 0; const u32 r3 = 0; COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m07700_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07700_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m07700_a3-optimized.cl000066400000000000000000000516171320027462700200230ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #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)))) __constant u32a 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 u32a 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 }; u32 sapb_trans (const u32 in) { u32 out = 0; 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; return out; } u32 walld0rf_magic (const u32 w0[4], const u32 pw_len, const u32 salt_buf0[4], const u32 salt_len, const u32 a, const u32 b, const u32 c, const u32 d, u32 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; while (i2 < sum20) { if (i1 < pw_len) { if (GETCHAR (saved_key, 15 - i1) & 1) { PUTCHAR (t, i2, bcodeArray[48 - 1 - i1]); i2++; if (i2 == sum20) break; } PUTCHAR (t, i2, GETCHAR (w, i1)); i2++; if (i2 == sum20) break; i1++; } if (i3 < salt_len) { PUTCHAR (t, i2, GETCHAR (s, i3)); i2++; if (i2 == sum20) break; i3++; } PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); i2++; i2++; } return sum20; } void m07700m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = 0; s1[0] = 0; s1[1] = 0; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; append_0x80_4x4_S (s0, s1, s2, s3, salt_len); switch_buffer_by_offset_le (s0, s1, s2, s3, pw_len); const u32 pw_salt_len = pw_len + salt_len; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = sapb_trans (ix_create_bft (bfs_buf, il_pos)); const u32x w0lr = w0l | w0r; w0[0] = w0lr; u32 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] = s1[1]; 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; /** * md5 */ u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (t + 0, t + 4, t + 8, t + 12, digest); const u32 sum20 = walld0rf_magic (w0, pw_len, salt_buf0, salt_len, digest[0], digest[1], digest[2], digest[3], t); append_0x80_4x4_S (t + 0, t + 4, t + 8, t + 12, sum20); t[14] = sum20 * 8; t[15] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (t + 0, t + 4, t + 8, t + 12, digest); const u32 r0 = digest[0] ^ digest[2]; const u32 r1 = digest[1] ^ digest[3]; const u32 r2 = 0; const u32 r3 = 0; COMPARE_M_SIMD (r0, r1, r2, r3); } } void m07700s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = 0; s1[0] = 0; s1[1] = 0; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; append_0x80_4x4_S (s0, s1, s2, s3, salt_len); switch_buffer_by_offset_le (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], 0, 0 }; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = sapb_trans (ix_create_bft (bfs_buf, il_pos)); const u32x w0lr = w0l | w0r; w0[0] = w0lr; u32 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] = s1[1]; 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; /** * md5 */ u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (t + 0, t + 4, t + 8, t + 12, digest); const u32 sum20 = walld0rf_magic (w0, pw_len, salt_buf0, salt_len, digest[0], digest[1], digest[2], digest[3], t); append_0x80_4x4_S (t + 0, t + 4, t + 8, t + 12, sum20); t[14] = sum20 * 8; t[15] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (t + 0, t + 4, t + 8, t + 12, digest); const u32 r0 = digest[0] ^ digest[2]; const u32 r1 = digest[1] ^ digest[3]; const u32 r2 = 0; const u32 r3 = 0; COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m07700_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ //const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07700_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ //const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07700_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07700_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ //const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07700_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ //const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07700_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m07800_a0-optimized.cl000066400000000000000000000472211320027462700200150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //incompatible data-dependant code //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __constant u32 theMagicArray[64] = { 0x91ac5114, 0x9f675443, 0x24e73be0, 0x28747bc2, 0x863313eb, 0x5a4fcb5c, 0x080a7337, 0x0e5d1c2f, 0x338fe6e5, 0xf89baedd, 0x16f24b8d, 0x2ce1d4dc, 0xb0cbdf9d, 0xd4706d17, 0xf94d423f, 0x9b1b1194, 0x9f5bc19b, 0x06059d03, 0x9d5e138a, 0x1e9a6ae8, 0xd97c1417, 0x58c72af6, 0xa199630a, 0xd7fd70c3, 0xf65e7413, 0x03c90b04, 0x2698f726, 0x8a929325, 0xb0a20d23, 0xed63796d, 0x1332fa3c, 0x35029aa3, 0xb3dd8e0a, 0x24bf51c3, 0x7ccd559f, 0x37af944c, 0x29085282, 0xb23b4e37, 0x9f170791, 0x113bfdcd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, }; u32 GETSHIFTEDINT_CONST (__constant u32 *a, const int n) { const int d = n / 4; const int m = n & 3; u64 tmp = hl32_to_64_S (a[d + 0], a[d + 1]); tmp <<= m * 8; return h32_from_64_S (tmp); } void SETSHIFTEDINT (u32 *a, const int n, const u32 v) { const int d = n / 4; const int m = n & 3; u64 tmp = hl32_to_64_S (v, 0); tmp >>= m * 8; a[d + 0] |= h32_from_64_S (tmp); a[d + 1] = l32_from_64_S (tmp); } __kernel void m07800_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * SAP */ u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf[0]; s0[1] = salt_buf[1]; s0[2] = salt_buf[2]; s0[3] = salt_buf[3]; s1[0] = salt_buf[4]; s1[1] = salt_buf[5]; s1[2] = salt_buf[6]; s1[3] = salt_buf[7]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); const u32x pw_salt_len = out_len + salt_len; /** * sha1 */ u32 final[32]; final[ 0] = swap32 (w0[0] | s0[0]); final[ 1] = swap32 (w0[1] | s0[1]); final[ 2] = swap32 (w0[2] | s0[2]); final[ 3] = swap32 (w0[3] | s0[3]); final[ 4] = swap32 (w1[0] | s1[0]); final[ 5] = swap32 (w1[1] | s1[1]); final[ 6] = swap32 (w1[2] | s1[2]); final[ 7] = swap32 (w1[3] | s1[3]); final[ 8] = swap32 (w2[0] | s2[0]); final[ 9] = swap32 (w2[1] | s2[1]); final[10] = swap32 (w2[2] | s2[2]); final[11] = swap32 (w2[3] | s2[3]); final[12] = swap32 (w3[0] | s3[0]); final[13] = swap32 (w3[1] | s3[1]); final[14] = 0; final[15] = pw_salt_len * 8; final[16] = 0; final[17] = 0; final[18] = 0; final[19] = 0; final[20] = 0; final[21] = 0; final[22] = 0; final[23] = 0; final[24] = 0; final[25] = 0; final[26] = 0; final[27] = 0; final[28] = 0; final[29] = 0; final[30] = 0; final[31] = 0; 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 (&final[0], &final[4], &final[8], &final[12], digest); // prepare magic array range u32 lengthMagicArray = 0x20; u32 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; final[ 0] = swap32_S (w0[0]); final[ 1] = swap32_S (w0[1]); final[ 2] = swap32_S (w0[2]); final[ 3] = swap32_S (w0[3]); final[ 4] = swap32_S (w1[0]); final[ 5] = swap32_S (w1[1]); final[ 6] = swap32_S (w1[2]); final[ 7] = swap32_S (w1[3]); final[ 8] = 0; final[ 9] = 0; final[10] = 0; final[11] = 0; final[12] = 0; final[13] = 0; final[14] = 0; final[15] = 0; u32 final_len = pw_len; u32 i; // append MagicArray for (i = 0; i < lengthMagicArray - 4; i += 4) { const u32 tmp = GETSHIFTEDINT_CONST (theMagicArray, offsetMagicArray + i); SETSHIFTEDINT (final, final_len + i, tmp); } const u32 mask = 0xffffffff << (((4 - (lengthMagicArray - i)) & 3) * 8); const u32 tmp = GETSHIFTEDINT_CONST (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 = swap32_S (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) { sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); } final[off + 15] = final_len * 8; sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m07800_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07800_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07800_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * SAP */ u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf[0]; s0[1] = salt_buf[1]; s0[2] = salt_buf[2]; s0[3] = salt_buf[3]; s1[0] = salt_buf[4]; s1[1] = salt_buf[5]; s1[2] = salt_buf[6]; s1[3] = salt_buf[7]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); const u32x pw_salt_len = out_len + salt_len; /** * sha1 */ u32 final[32]; final[ 0] = swap32 (w0[0] | s0[0]); final[ 1] = swap32 (w0[1] | s0[1]); final[ 2] = swap32 (w0[2] | s0[2]); final[ 3] = swap32 (w0[3] | s0[3]); final[ 4] = swap32 (w1[0] | s1[0]); final[ 5] = swap32 (w1[1] | s1[1]); final[ 6] = swap32 (w1[2] | s1[2]); final[ 7] = swap32 (w1[3] | s1[3]); final[ 8] = swap32 (w2[0] | s2[0]); final[ 9] = swap32 (w2[1] | s2[1]); final[10] = swap32 (w2[2] | s2[2]); final[11] = swap32 (w2[3] | s2[3]); final[12] = swap32 (w3[0] | s3[0]); final[13] = swap32 (w3[1] | s3[1]); final[14] = 0; final[15] = pw_salt_len * 8; final[16] = 0; final[17] = 0; final[18] = 0; final[19] = 0; final[20] = 0; final[21] = 0; final[22] = 0; final[23] = 0; final[24] = 0; final[25] = 0; final[26] = 0; final[27] = 0; final[28] = 0; final[29] = 0; final[30] = 0; final[31] = 0; 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 (&final[0], &final[4], &final[8], &final[12], digest); // prepare magic array range u32 lengthMagicArray = 0x20; u32 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; final[ 0] = swap32_S (w0[0]); final[ 1] = swap32_S (w0[1]); final[ 2] = swap32_S (w0[2]); final[ 3] = swap32_S (w0[3]); final[ 4] = swap32_S (w1[0]); final[ 5] = swap32_S (w1[1]); final[ 6] = swap32_S (w1[2]); final[ 7] = swap32_S (w1[3]); final[ 8] = 0; final[ 9] = 0; final[10] = 0; final[11] = 0; final[12] = 0; final[13] = 0; final[14] = 0; final[15] = 0; u32 final_len = pw_len; u32 i; // append MagicArray for (i = 0; i < lengthMagicArray - 4; i += 4) { const u32 tmp = GETSHIFTEDINT_CONST (theMagicArray, offsetMagicArray + i); SETSHIFTEDINT (final, final_len + i, tmp); } const u32 mask = 0xffffffff << (((4 - (lengthMagicArray - i)) & 3) * 8); const u32 tmp = GETSHIFTEDINT_CONST (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 = swap32_S (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) { sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); } final[off + 15] = final_len * 8; sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m07800_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07800_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m07800_a1-optimized.cl000066400000000000000000000562201320027462700200150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //incompatible data-dependant code //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __constant u32 theMagicArray[64] = { 0x91ac5114, 0x9f675443, 0x24e73be0, 0x28747bc2, 0x863313eb, 0x5a4fcb5c, 0x080a7337, 0x0e5d1c2f, 0x338fe6e5, 0xf89baedd, 0x16f24b8d, 0x2ce1d4dc, 0xb0cbdf9d, 0xd4706d17, 0xf94d423f, 0x9b1b1194, 0x9f5bc19b, 0x06059d03, 0x9d5e138a, 0x1e9a6ae8, 0xd97c1417, 0x58c72af6, 0xa199630a, 0xd7fd70c3, 0xf65e7413, 0x03c90b04, 0x2698f726, 0x8a929325, 0xb0a20d23, 0xed63796d, 0x1332fa3c, 0x35029aa3, 0xb3dd8e0a, 0x24bf51c3, 0x7ccd559f, 0x37af944c, 0x29085282, 0xb23b4e37, 0x9f170791, 0x113bfdcd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, }; u32 GETSHIFTEDINT_CONST (__constant u32 *a, const int n) { const int d = n / 4; const int m = n & 3; u64 tmp = hl32_to_64_S (a[d + 0], a[d + 1]); tmp <<= m * 8; return h32_from_64_S (tmp); } void SETSHIFTEDINT (u32 *a, const int n, const u32 v) { const int d = n / 4; const int m = n & 3; u64 tmp = hl32_to_64_S (v, 0); tmp >>= m * 8; a[d + 0] |= h32_from_64_S (tmp); a[d + 1] = l32_from_64_S (tmp); } __kernel void m07800_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * SAP */ u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf[0]; s0[1] = salt_buf[1]; s0[2] = salt_buf[2]; s0[3] = salt_buf[3]; s1[0] = salt_buf[4]; s1[1] = salt_buf[5]; s1[2] = salt_buf[6]; s1[3] = salt_buf[7]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); const u32x pw_salt_len = pw_len + salt_len; /** * sha1 */ u32 final[32]; final[ 0] = swap32 (w0[0] | s0[0]); final[ 1] = swap32 (w0[1] | s0[1]); final[ 2] = swap32 (w0[2] | s0[2]); final[ 3] = swap32 (w0[3] | s0[3]); final[ 4] = swap32 (w1[0] | s1[0]); final[ 5] = swap32 (w1[1] | s1[1]); final[ 6] = swap32 (w1[2] | s1[2]); final[ 7] = swap32 (w1[3] | s1[3]); final[ 8] = swap32 (w2[0] | s2[0]); final[ 9] = swap32 (w2[1] | s2[1]); final[10] = swap32 (w2[2] | s2[2]); final[11] = swap32 (w2[3] | s2[3]); final[12] = swap32 (w3[0] | s3[0]); final[13] = swap32 (w3[1] | s3[1]); final[14] = 0; final[15] = pw_salt_len * 8; final[16] = 0; final[17] = 0; final[18] = 0; final[19] = 0; final[20] = 0; final[21] = 0; final[22] = 0; final[23] = 0; final[24] = 0; final[25] = 0; final[26] = 0; final[27] = 0; final[28] = 0; final[29] = 0; final[30] = 0; final[31] = 0; 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 (&final[0], &final[4], &final[8], &final[12], digest); // prepare magic array range u32 lengthMagicArray = 0x20; u32 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; final[ 0] = swap32_S (w0[0]); final[ 1] = swap32_S (w0[1]); final[ 2] = swap32_S (w0[2]); final[ 3] = swap32_S (w0[3]); final[ 4] = swap32_S (w1[0]); final[ 5] = swap32_S (w1[1]); final[ 6] = swap32_S (w1[2]); final[ 7] = swap32_S (w1[3]); final[ 8] = swap32_S (w2[0]); final[ 9] = swap32_S (w2[1]); final[10] = swap32_S (w2[2]); final[11] = swap32_S (w2[3]); final[12] = swap32_S (w3[0]); final[13] = swap32_S (w3[1]); final[14] = 0; final[15] = 0; u32 final_len = pw_len; u32 i; // append MagicArray for (i = 0; i < lengthMagicArray - 4; i += 4) { const u32 tmp = GETSHIFTEDINT_CONST (theMagicArray, offsetMagicArray + i); SETSHIFTEDINT (final, final_len + i, tmp); } const u32 mask = 0xffffffff << (((4 - (lengthMagicArray - i)) & 3) * 8); const u32 tmp = GETSHIFTEDINT_CONST (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 = swap32_S (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) { sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); } final[off + 15] = final_len * 8; sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m07800_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07800_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07800_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * SAP */ u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf[0]; s0[1] = salt_buf[1]; s0[2] = salt_buf[2]; s0[3] = salt_buf[3]; s1[0] = salt_buf[4]; s1[1] = salt_buf[5]; s1[2] = salt_buf[6]; s1[3] = salt_buf[7]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); const u32x pw_salt_len = pw_len + salt_len; /** * sha1 */ u32 final[32]; final[ 0] = swap32 (w0[0] | s0[0]); final[ 1] = swap32 (w0[1] | s0[1]); final[ 2] = swap32 (w0[2] | s0[2]); final[ 3] = swap32 (w0[3] | s0[3]); final[ 4] = swap32 (w1[0] | s1[0]); final[ 5] = swap32 (w1[1] | s1[1]); final[ 6] = swap32 (w1[2] | s1[2]); final[ 7] = swap32 (w1[3] | s1[3]); final[ 8] = swap32 (w2[0] | s2[0]); final[ 9] = swap32 (w2[1] | s2[1]); final[10] = swap32 (w2[2] | s2[2]); final[11] = swap32 (w2[3] | s2[3]); final[12] = swap32 (w3[0] | s3[0]); final[13] = swap32 (w3[1] | s3[1]); final[14] = 0; final[15] = pw_salt_len * 8; final[16] = 0; final[17] = 0; final[18] = 0; final[19] = 0; final[20] = 0; final[21] = 0; final[22] = 0; final[23] = 0; final[24] = 0; final[25] = 0; final[26] = 0; final[27] = 0; final[28] = 0; final[29] = 0; final[30] = 0; final[31] = 0; 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 (&final[0], &final[4], &final[8], &final[12], digest); // prepare magic array range u32 lengthMagicArray = 0x20; u32 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; final[ 0] = swap32_S (w0[0]); final[ 1] = swap32_S (w0[1]); final[ 2] = swap32_S (w0[2]); final[ 3] = swap32_S (w0[3]); final[ 4] = swap32_S (w1[0]); final[ 5] = swap32_S (w1[1]); final[ 6] = swap32_S (w1[2]); final[ 7] = swap32_S (w1[3]); final[ 8] = swap32_S (w2[0]); final[ 9] = swap32_S (w2[1]); final[10] = swap32_S (w2[2]); final[11] = swap32_S (w2[3]); final[12] = swap32_S (w3[0]); final[13] = swap32_S (w3[1]); final[14] = 0; final[15] = 0; u32 final_len = pw_len; u32 i; // append MagicArray for (i = 0; i < lengthMagicArray - 4; i += 4) { const u32 tmp = GETSHIFTEDINT_CONST (theMagicArray, offsetMagicArray + i); SETSHIFTEDINT (final, final_len + i, tmp); } const u32 mask = 0xffffffff << (((4 - (lengthMagicArray - i)) & 3) * 8); const u32 tmp = GETSHIFTEDINT_CONST (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 = swap32_S (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) { sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); } final[off + 15] = final_len * 8; sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m07800_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07800_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m07800_a3-optimized.cl000066400000000000000000000607201320027462700200170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //incompatible data-dependant code //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __constant u32 theMagicArray[64] = { 0x91ac5114, 0x9f675443, 0x24e73be0, 0x28747bc2, 0x863313eb, 0x5a4fcb5c, 0x080a7337, 0x0e5d1c2f, 0x338fe6e5, 0xf89baedd, 0x16f24b8d, 0x2ce1d4dc, 0xb0cbdf9d, 0xd4706d17, 0xf94d423f, 0x9b1b1194, 0x9f5bc19b, 0x06059d03, 0x9d5e138a, 0x1e9a6ae8, 0xd97c1417, 0x58c72af6, 0xa199630a, 0xd7fd70c3, 0xf65e7413, 0x03c90b04, 0x2698f726, 0x8a929325, 0xb0a20d23, 0xed63796d, 0x1332fa3c, 0x35029aa3, 0xb3dd8e0a, 0x24bf51c3, 0x7ccd559f, 0x37af944c, 0x29085282, 0xb23b4e37, 0x9f170791, 0x113bfdcd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, }; u32 GETSHIFTEDINT_CONST (__constant u32 *a, const int n) { const int d = n / 4; const int m = n & 3; u64 tmp = hl32_to_64_S (a[d + 0], a[d + 1]); tmp <<= m * 8; return h32_from_64_S (tmp); } void SETSHIFTEDINT (u32 *a, const int n, const u32 v) { const int d = n / 4; const int m = n & 3; u64 tmp = hl32_to_64_S (v, 0); tmp >>= m * 8; a[d + 0] |= h32_from_64_S (tmp); a[d + 1] = l32_from_64_S (tmp); } void m07800m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf[8]; salt_buf[0] = swap32_S (salt_bufs[salt_pos].salt_buf[0]); salt_buf[1] = swap32_S (salt_bufs[salt_pos].salt_buf[1]); salt_buf[2] = swap32_S (salt_bufs[salt_pos].salt_buf[2]); salt_buf[3] = swap32_S (salt_bufs[salt_pos].salt_buf[3]); salt_buf[4] = swap32_S (salt_bufs[salt_pos].salt_buf[4]); salt_buf[5] = swap32_S (salt_bufs[salt_pos].salt_buf[5]); salt_buf[6] = swap32_S (salt_bufs[salt_pos].salt_buf[6]); salt_buf[7] = swap32_S (salt_bufs[salt_pos].salt_buf[7]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf[0]; s0[1] = salt_buf[1]; s0[2] = salt_buf[2]; s0[3] = salt_buf[3]; s1[0] = salt_buf[4]; s1[1] = salt_buf[5]; s1[2] = salt_buf[6]; s1[3] = salt_buf[7]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_be_S (s0, s1, s2, s3, pw_len); const u32x pw_salt_len = pw_len + salt_len; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; w0[0] = w0lr; /** * SAP */ u32 final[32]; final[ 0] = w0[0] | s0[0]; final[ 1] = w0[1] | s0[1]; final[ 2] = w0[2] | s0[2]; final[ 3] = w0[3] | s0[3]; final[ 4] = w1[0] | s1[0]; final[ 5] = w1[1] | s1[1]; final[ 6] = w1[2] | s1[2]; final[ 7] = w1[3] | s1[3]; final[ 8] = w2[0] | s2[0]; final[ 9] = w2[1] | s2[1]; final[10] = w2[2] | s2[2]; final[11] = w2[3] | s2[3]; final[12] = w3[0] | s3[0]; final[13] = w3[1] | s3[1]; final[14] = 0; final[15] = pw_salt_len * 8; final[16] = 0; final[17] = 0; final[18] = 0; final[19] = 0; final[20] = 0; final[21] = 0; final[22] = 0; final[23] = 0; final[24] = 0; final[25] = 0; final[26] = 0; final[27] = 0; final[28] = 0; final[29] = 0; final[30] = 0; final[31] = 0; 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 (&final[0], &final[4], &final[8], &final[12], digest); // prepare magic array range u32 lengthMagicArray = 0x20; u32 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; 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]; final[ 8] = 0; final[ 9] = 0; final[10] = 0; final[11] = 0; final[12] = 0; final[13] = 0; final[14] = 0; final[15] = 0; u32 final_len = pw_len; u32 i; // append MagicArray for (i = 0; i < lengthMagicArray - 4; i += 4) { const u32 tmp = GETSHIFTEDINT_CONST (theMagicArray, offsetMagicArray + i); SETSHIFTEDINT (final, final_len + i, tmp); } const u32 mask = 0xffffffff << (((4 - (lengthMagicArray - i)) & 3) * 8); const u32 tmp = GETSHIFTEDINT_CONST (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) { sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); } final[off + 15] = final_len * 8; sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } void m07800s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf[8]; salt_buf[0] = swap32_S (salt_bufs[salt_pos].salt_buf[0]); salt_buf[1] = swap32_S (salt_bufs[salt_pos].salt_buf[1]); salt_buf[2] = swap32_S (salt_bufs[salt_pos].salt_buf[2]); salt_buf[3] = swap32_S (salt_bufs[salt_pos].salt_buf[3]); salt_buf[4] = swap32_S (salt_bufs[salt_pos].salt_buf[4]); salt_buf[5] = swap32_S (salt_bufs[salt_pos].salt_buf[5]); salt_buf[6] = swap32_S (salt_bufs[salt_pos].salt_buf[6]); salt_buf[7] = swap32_S (salt_bufs[salt_pos].salt_buf[7]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf[0]; s0[1] = salt_buf[1]; s0[2] = salt_buf[2]; s0[3] = salt_buf[3]; s1[0] = salt_buf[4]; s1[1] = salt_buf[5]; s1[2] = salt_buf[6]; s1[3] = salt_buf[7]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_be_S (s0, s1, s2, s3, pw_len); const u32x 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; w0[0] = w0lr; /** * SAP */ u32 final[32]; final[ 0] = w0[0] | s0[0]; final[ 1] = w0[1] | s0[1]; final[ 2] = w0[2] | s0[2]; final[ 3] = w0[3] | s0[3]; final[ 4] = w1[0] | s1[0]; final[ 5] = w1[1] | s1[1]; final[ 6] = w1[2] | s1[2]; final[ 7] = w1[3] | s1[3]; final[ 8] = w2[0] | s2[0]; final[ 9] = w2[1] | s2[1]; final[10] = w2[2] | s2[2]; final[11] = w2[3] | s2[3]; final[12] = w3[0] | s3[0]; final[13] = w3[1] | s3[1]; final[14] = 0; final[15] = pw_salt_len * 8; final[16] = 0; final[17] = 0; final[18] = 0; final[19] = 0; final[20] = 0; final[21] = 0; final[22] = 0; final[23] = 0; final[24] = 0; final[25] = 0; final[26] = 0; final[27] = 0; final[28] = 0; final[29] = 0; final[30] = 0; final[31] = 0; 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 (&final[0], &final[4], &final[8], &final[12], digest); // prepare magic array range u32 lengthMagicArray = 0x20; u32 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; 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]; final[ 8] = 0; final[ 9] = 0; final[10] = 0; final[11] = 0; final[12] = 0; final[13] = 0; final[14] = 0; final[15] = 0; u32 final_len = pw_len; u32 i; // append MagicArray for (i = 0; i < lengthMagicArray - 4; i += 4) { const u32 tmp = GETSHIFTEDINT_CONST (theMagicArray, offsetMagicArray + i); SETSHIFTEDINT (final, final_len + i, tmp); } const u32 mask = 0xffffffff << (((4 - (lengthMagicArray - i)) & 3) * 8); const u32 tmp = GETSHIFTEDINT_CONST (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) { sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); } final[off + 15] = final_len * 8; sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m07800_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ //const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07800_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ //const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07800_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m07800_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ //const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07800_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ //const u64 lid = get_local_id (0); u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m07800_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m07900.cl000066400000000000000000000223261320027462700154330ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_sha512.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" __kernel void m07900_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global drupal7_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha512_ctx_t ctx; sha512_init (&ctx); sha512_update_global_swap (&ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha512_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); sha512_final (&ctx); tmps[gid].digest_buf[0] = ctx.h[0]; tmps[gid].digest_buf[1] = ctx.h[1]; tmps[gid].digest_buf[2] = ctx.h[2]; tmps[gid].digest_buf[3] = ctx.h[3]; tmps[gid].digest_buf[4] = ctx.h[4]; tmps[gid].digest_buf[5] = ctx.h[5]; tmps[gid].digest_buf[6] = ctx.h[6]; tmps[gid].digest_buf[7] = ctx.h[7]; } __kernel void m07900_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global drupal7_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * init */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (w[idx]); } /** * load */ 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 */ sha512_ctx_t sha512_ctx; sha512_init (&sha512_ctx); sha512_ctx.w0[0] = h32_from_64_S (digest[0]); sha512_ctx.w0[1] = l32_from_64_S (digest[0]); sha512_ctx.w0[2] = h32_from_64_S (digest[1]); sha512_ctx.w0[3] = l32_from_64_S (digest[1]); sha512_ctx.w1[0] = h32_from_64_S (digest[2]); sha512_ctx.w1[1] = l32_from_64_S (digest[2]); sha512_ctx.w1[2] = h32_from_64_S (digest[3]); sha512_ctx.w1[3] = l32_from_64_S (digest[3]); sha512_ctx.w2[0] = h32_from_64_S (digest[4]); sha512_ctx.w2[1] = l32_from_64_S (digest[4]); sha512_ctx.w2[2] = h32_from_64_S (digest[5]); sha512_ctx.w2[3] = l32_from_64_S (digest[5]); sha512_ctx.w3[0] = h32_from_64_S (digest[6]); sha512_ctx.w3[1] = l32_from_64_S (digest[6]); sha512_ctx.w3[2] = h32_from_64_S (digest[7]); sha512_ctx.w3[3] = l32_from_64_S (digest[7]); sha512_ctx.len = 64; sha512_update (&sha512_ctx, w, pw_len); sha512_final (&sha512_ctx); digest[0] = sha512_ctx.h[0]; digest[1] = sha512_ctx.h[1]; digest[2] = sha512_ctx.h[2]; digest[3] = sha512_ctx.h[3]; digest[4] = sha512_ctx.h[4]; digest[5] = sha512_ctx.h[5]; digest[6] = sha512_ctx.h[6]; digest[7] = sha512_ctx.h[7]; if ((64 + pw_len + 1) >= 112) { for (u32 i = 1; i < loop_cnt; i++) { sha512_init (&sha512_ctx); sha512_ctx.w0[0] = h32_from_64_S (digest[0]); sha512_ctx.w0[1] = l32_from_64_S (digest[0]); sha512_ctx.w0[2] = h32_from_64_S (digest[1]); sha512_ctx.w0[3] = l32_from_64_S (digest[1]); sha512_ctx.w1[0] = h32_from_64_S (digest[2]); sha512_ctx.w1[1] = l32_from_64_S (digest[2]); sha512_ctx.w1[2] = h32_from_64_S (digest[3]); sha512_ctx.w1[3] = l32_from_64_S (digest[3]); sha512_ctx.w2[0] = h32_from_64_S (digest[4]); sha512_ctx.w2[1] = l32_from_64_S (digest[4]); sha512_ctx.w2[2] = h32_from_64_S (digest[5]); sha512_ctx.w2[3] = l32_from_64_S (digest[5]); sha512_ctx.w3[0] = h32_from_64_S (digest[6]); sha512_ctx.w3[1] = l32_from_64_S (digest[6]); sha512_ctx.w3[2] = h32_from_64_S (digest[7]); sha512_ctx.w3[3] = l32_from_64_S (digest[7]); sha512_ctx.len = 64; sha512_update (&sha512_ctx, w, pw_len); sha512_final (&sha512_ctx); digest[0] = sha512_ctx.h[0]; digest[1] = sha512_ctx.h[1]; digest[2] = sha512_ctx.h[2]; digest[3] = sha512_ctx.h[3]; digest[4] = sha512_ctx.h[4]; digest[5] = sha512_ctx.h[5]; digest[6] = sha512_ctx.h[6]; digest[7] = sha512_ctx.h[7]; } } else { for (u32 i = 1; i < loop_cnt; i++) { sha512_ctx.w0[0] = h32_from_64_S (digest[0]); sha512_ctx.w0[1] = l32_from_64_S (digest[0]); sha512_ctx.w0[2] = h32_from_64_S (digest[1]); sha512_ctx.w0[3] = l32_from_64_S (digest[1]); sha512_ctx.w1[0] = h32_from_64_S (digest[2]); sha512_ctx.w1[1] = l32_from_64_S (digest[2]); sha512_ctx.w1[2] = h32_from_64_S (digest[3]); sha512_ctx.w1[3] = l32_from_64_S (digest[3]); sha512_ctx.w2[0] = h32_from_64_S (digest[4]); sha512_ctx.w2[1] = l32_from_64_S (digest[4]); sha512_ctx.w2[2] = h32_from_64_S (digest[5]); sha512_ctx.w2[3] = l32_from_64_S (digest[5]); sha512_ctx.w3[0] = h32_from_64_S (digest[6]); sha512_ctx.w3[1] = l32_from_64_S (digest[6]); sha512_ctx.w3[2] = h32_from_64_S (digest[7]); sha512_ctx.w3[3] = l32_from_64_S (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 (sha512_ctx.w0, sha512_ctx.w1, sha512_ctx.w2, sha512_ctx.w3, sha512_ctx.w4, sha512_ctx.w5, sha512_ctx.w6, sha512_ctx.w7, 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 m07900_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global drupal7_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ const u32 r0 = l32_from_64_S (tmps[gid].digest_buf[0]); const u32 r1 = h32_from_64_S (tmps[gid].digest_buf[0]); const u32 r2 = l32_from_64_S (tmps[gid].digest_buf[1]); const u32 r3 = h32_from_64_S (tmps[gid].digest_buf[1]); #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m08000_a0-optimized.cl000066400000000000000000000555501320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __constant u32a 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, }; #define SHA256_S0_S(x) (rotl32_S ((x), 25u) ^ rotl32_S ((x), 14u) ^ SHIFT_RIGHT_32 ((x), 3u)) #define SHA256_S1_S(x) (rotl32_S ((x), 15u) ^ rotl32_S ((x), 13u) ^ SHIFT_RIGHT_32 ((x), 10u)) #define SHA256_EXPAND_S(x,y,z,w) (SHA256_S1_S (x) + y + SHA256_S0_S (z) + w) 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); #ifdef _unroll #pragma unroll #endif 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; } void sha256_transform_z (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]; #define ROUND_STEP_Z(i) \ { \ SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, 0, k_sha256[i + 0]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, 0, k_sha256[i + 1]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, 0, k_sha256[i + 2]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, 0, k_sha256[i + 3]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, 0, k_sha256[i + 4]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, 0, k_sha256[i + 5]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, 0, k_sha256[i + 6]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, 0, k_sha256[i + 7]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, 0, k_sha256[i + 8]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, 0, k_sha256[i + 9]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, 0, k_sha256[i + 10]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, 0, k_sha256[i + 11]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, 0, k_sha256[i + 12]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, 0, k_sha256[i + 13]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, 0, k_sha256[i + 14]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, 0, k_sha256[i + 15]); \ } ROUND_STEP_Z (0); #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i += 16) { ROUND_STEP_Z (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; } void sha256_transform_s (u32x digest[8], __local u32 *w) { 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]; #define ROUND_STEP_S(i) \ { \ SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w[i + 0], k_sha256[i + 0]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w[i + 1], k_sha256[i + 1]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w[i + 2], k_sha256[i + 2]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w[i + 3], k_sha256[i + 3]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w[i + 4], k_sha256[i + 4]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w[i + 5], k_sha256[i + 5]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w[i + 6], k_sha256[i + 6]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w[i + 7], k_sha256[i + 7]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w[i + 8], k_sha256[i + 8]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w[i + 9], k_sha256[i + 9]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w[i + 10], k_sha256[i + 10]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w[i + 11], k_sha256[i + 11]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w[i + 12], k_sha256[i + 12]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w[i + 13], k_sha256[i + 13]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w[i + 14], k_sha256[i + 14]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w[i + 15], k_sha256[i + 15]); \ } ROUND_STEP_S (0); #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i += 16) { ROUND_STEP_S (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 m08000_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * salt */ const u32 salt_buf0 = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); const u32 salt_buf1 = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); const u32 salt_buf2 = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 /** * precompute final msg blocks */ __local u32 w_s1[64]; __local u32 w_s2[64]; for (u32 i = lid; i < 64; i += lsz) { w_s1[i] = 0; w_s2[i] = 0; } barrier (CLK_LOCAL_MEM_FENCE); if (lid == 0) { w_s1[15] = 0 | salt_buf0 >> 16; #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i++) { w_s1[i] = SHA256_EXPAND_S (w_s1[i - 2], w_s1[i - 7], w_s1[i - 15], w_s1[i - 16]); } w_s2[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; w_s2[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; w_s2[ 2] = salt_buf2 << 16 | 0; w_s2[15] = (510 + 8) * 8; #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i++) { w_s2[i] = SHA256_EXPAND_S (w_s2[i - 2], w_s2[i - 7], w_s2[i - 15], w_s2[i - 16]); } } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; make_utf16le (w0, w0_t, w1_t); make_utf16le (w1, w2_t, w3_t); u32x w_t[16]; w_t[ 0] = swap32 (w0_t[0]); w_t[ 1] = swap32 (w0_t[1]); w_t[ 2] = swap32 (w0_t[2]); w_t[ 3] = swap32 (w0_t[3]); w_t[ 4] = swap32 (w1_t[0]); w_t[ 5] = swap32 (w1_t[1]); w_t[ 6] = swap32 (w1_t[2]); w_t[ 7] = swap32 (w1_t[3]); w_t[ 8] = swap32 (w2_t[0]); w_t[ 9] = swap32 (w2_t[1]); w_t[10] = swap32 (w2_t[2]); w_t[11] = swap32 (w2_t[3]); w_t[12] = swap32 (w3_t[0]); w_t[13] = swap32 (w3_t[1]); w_t[14] = swap32 (w3_t[2]); w_t[15] = swap32 (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 sha256_transform_z (digest); // 64 - 128 sha256_transform_z (digest); // 128 - 192 sha256_transform_z (digest); // 192 - 256 sha256_transform_z (digest); // 256 - 320 sha256_transform_z (digest); // 320 - 384 sha256_transform_z (digest); // 384 - 448 sha256_transform_s (digest, w_s1); // 448 - 512 sha256_transform_s (digest, w_s2); // 512 - 576 COMPARE_M_SIMD (digest[3], digest[7], digest[2], digest[6]); } } __kernel void m08000_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08000_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08000_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * salt */ const u32 salt_buf0 = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); const u32 salt_buf1 = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); const u32 salt_buf2 = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 /** * precompute final msg blocks */ __local u32 w_s1[64]; __local u32 w_s2[64]; for (u32 i = lid; i < 64; i += lsz) { w_s1[i] = 0; w_s2[i] = 0; } barrier (CLK_LOCAL_MEM_FENCE); if (lid == 0) { w_s1[15] = 0 | salt_buf0 >> 16; #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i++) { w_s1[i] = SHA256_EXPAND_S (w_s1[i - 2], w_s1[i - 7], w_s1[i - 15], w_s1[i - 16]); } w_s2[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; w_s2[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; w_s2[ 2] = salt_buf2 << 16 | 0; w_s2[15] = (510 + 8) * 8; #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i++) { w_s2[i] = SHA256_EXPAND_S (w_s2[i - 2], w_s2[i - 7], w_s2[i - 15], w_s2[i - 16]); } } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; make_utf16le (w0, w0_t, w1_t); make_utf16le (w1, w2_t, w3_t); u32x w_t[16]; w_t[ 0] = swap32 (w0_t[0]); w_t[ 1] = swap32 (w0_t[1]); w_t[ 2] = swap32 (w0_t[2]); w_t[ 3] = swap32 (w0_t[3]); w_t[ 4] = swap32 (w1_t[0]); w_t[ 5] = swap32 (w1_t[1]); w_t[ 6] = swap32 (w1_t[2]); w_t[ 7] = swap32 (w1_t[3]); w_t[ 8] = swap32 (w2_t[0]); w_t[ 9] = swap32 (w2_t[1]); w_t[10] = swap32 (w2_t[2]); w_t[11] = swap32 (w2_t[3]); w_t[12] = swap32 (w3_t[0]); w_t[13] = swap32 (w3_t[1]); w_t[14] = swap32 (w3_t[2]); w_t[15] = swap32 (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 sha256_transform_z (digest); // 64 - 128 sha256_transform_z (digest); // 128 - 192 sha256_transform_z (digest); // 192 - 256 sha256_transform_z (digest); // 256 - 320 sha256_transform_z (digest); // 320 - 384 sha256_transform_z (digest); // 384 - 448 sha256_transform_s (digest, w_s1); // 448 - 512 sha256_transform_s (digest, w_s2); // 512 - 576 COMPARE_S_SIMD (digest[3], digest[7], digest[2], digest[6]); } } __kernel void m08000_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08000_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m08000_a1-optimized.cl000066400000000000000000000632371320027462700200140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u32a 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, }; #define SHA256_S0_S(x) (rotl32_S ((x), 25u) ^ rotl32_S ((x), 14u) ^ SHIFT_RIGHT_32 ((x), 3u)) #define SHA256_S1_S(x) (rotl32_S ((x), 15u) ^ rotl32_S ((x), 13u) ^ SHIFT_RIGHT_32 ((x), 10u)) #define SHA256_EXPAND_S(x,y,z,w) (SHA256_S1_S (x) + y + SHA256_S0_S (z) + w) 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); #ifdef _unroll #pragma unroll #endif 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; } void sha256_transform_z (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]; #define ROUND_STEP_Z(i) \ { \ SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, 0, k_sha256[i + 0]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, 0, k_sha256[i + 1]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, 0, k_sha256[i + 2]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, 0, k_sha256[i + 3]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, 0, k_sha256[i + 4]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, 0, k_sha256[i + 5]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, 0, k_sha256[i + 6]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, 0, k_sha256[i + 7]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, 0, k_sha256[i + 8]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, 0, k_sha256[i + 9]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, 0, k_sha256[i + 10]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, 0, k_sha256[i + 11]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, 0, k_sha256[i + 12]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, 0, k_sha256[i + 13]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, 0, k_sha256[i + 14]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, 0, k_sha256[i + 15]); \ } ROUND_STEP_Z (0); #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i += 16) { ROUND_STEP_Z (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; } void sha256_transform_s (u32x digest[8], __local u32 *w) { 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]; #define ROUND_STEP_S(i) \ { \ SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w[i + 0], k_sha256[i + 0]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w[i + 1], k_sha256[i + 1]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w[i + 2], k_sha256[i + 2]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w[i + 3], k_sha256[i + 3]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w[i + 4], k_sha256[i + 4]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w[i + 5], k_sha256[i + 5]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w[i + 6], k_sha256[i + 6]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w[i + 7], k_sha256[i + 7]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w[i + 8], k_sha256[i + 8]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w[i + 9], k_sha256[i + 9]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w[i + 10], k_sha256[i + 10]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w[i + 11], k_sha256[i + 11]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w[i + 12], k_sha256[i + 12]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w[i + 13], k_sha256[i + 13]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w[i + 14], k_sha256[i + 14]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w[i + 15], k_sha256[i + 15]); \ } ROUND_STEP_S (0); #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i += 16) { ROUND_STEP_S (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 m08000_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * salt */ const u32 salt_buf0 = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); const u32 salt_buf1 = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); const u32 salt_buf2 = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 /** * precompute final msg blocks */ __local u32 w_s1[64]; __local u32 w_s2[64]; for (u32 i = lid; i < 64; i += lsz) { w_s1[i] = 0; w_s2[i] = 0; } barrier (CLK_LOCAL_MEM_FENCE); if (lid == 0) { w_s1[15] = 0 | salt_buf0 >> 16; #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i++) { w_s1[i] = SHA256_EXPAND_S (w_s1[i - 2], w_s1[i - 7], w_s1[i - 15], w_s1[i - 16]); } w_s2[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; w_s2[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; w_s2[ 2] = salt_buf2 << 16 | 0; w_s2[15] = (510 + 8) * 8; #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i++) { w_s2[i] = SHA256_EXPAND_S (w_s2[i - 2], w_s2[i - 7], w_s2[i - 15], w_s2[i - 16]); } } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32x w0[4]; u32x w1[4]; 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]; /** * SHA256 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; make_utf16le (w0, w0_t, w1_t); make_utf16le (w1, w2_t, w3_t); u32x w_t[16]; w_t[ 0] = swap32 (w0_t[0]); w_t[ 1] = swap32 (w0_t[1]); w_t[ 2] = swap32 (w0_t[2]); w_t[ 3] = swap32 (w0_t[3]); w_t[ 4] = swap32 (w1_t[0]); w_t[ 5] = swap32 (w1_t[1]); w_t[ 6] = swap32 (w1_t[2]); w_t[ 7] = swap32 (w1_t[3]); w_t[ 8] = swap32 (w2_t[0]); w_t[ 9] = swap32 (w2_t[1]); w_t[10] = swap32 (w2_t[2]); w_t[11] = swap32 (w2_t[3]); w_t[12] = swap32 (w3_t[0]); w_t[13] = swap32 (w3_t[1]); w_t[14] = swap32 (w3_t[2]); w_t[15] = swap32 (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 sha256_transform_z (digest); // 64 - 128 sha256_transform_z (digest); // 128 - 192 sha256_transform_z (digest); // 192 - 256 sha256_transform_z (digest); // 256 - 320 sha256_transform_z (digest); // 320 - 384 sha256_transform_z (digest); // 384 - 448 sha256_transform_s (digest, w_s1); // 448 - 512 sha256_transform_s (digest, w_s2); // 512 - 576 COMPARE_M_SIMD (digest[3], digest[7], digest[2], digest[6]); } } __kernel void m08000_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08000_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08000_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * salt */ const u32 salt_buf0 = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); const u32 salt_buf1 = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); const u32 salt_buf2 = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 /** * precompute final msg blocks */ __local u32 w_s1[64]; __local u32 w_s2[64]; for (u32 i = lid; i < 64; i += lsz) { w_s1[i] = 0; w_s2[i] = 0; } barrier (CLK_LOCAL_MEM_FENCE); if (lid == 0) { w_s1[15] = 0 | salt_buf0 >> 16; #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i++) { w_s1[i] = SHA256_EXPAND_S (w_s1[i - 2], w_s1[i - 7], w_s1[i - 15], w_s1[i - 16]); } w_s2[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; w_s2[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; w_s2[ 2] = salt_buf2 << 16 | 0; w_s2[15] = (510 + 8) * 8; #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i++) { w_s2[i] = SHA256_EXPAND_S (w_s2[i - 2], w_s2[i - 7], w_s2[i - 15], w_s2[i - 16]); } } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32x w0[4]; u32x w1[4]; 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]; /** * SHA256 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; make_utf16le (w0, w0_t, w1_t); make_utf16le (w1, w2_t, w3_t); u32x w_t[16]; w_t[ 0] = swap32 (w0_t[0]); w_t[ 1] = swap32 (w0_t[1]); w_t[ 2] = swap32 (w0_t[2]); w_t[ 3] = swap32 (w0_t[3]); w_t[ 4] = swap32 (w1_t[0]); w_t[ 5] = swap32 (w1_t[1]); w_t[ 6] = swap32 (w1_t[2]); w_t[ 7] = swap32 (w1_t[3]); w_t[ 8] = swap32 (w2_t[0]); w_t[ 9] = swap32 (w2_t[1]); w_t[10] = swap32 (w2_t[2]); w_t[11] = swap32 (w2_t[3]); w_t[12] = swap32 (w3_t[0]); w_t[13] = swap32 (w3_t[1]); w_t[14] = swap32 (w3_t[2]); w_t[15] = swap32 (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 sha256_transform_z (digest); // 64 - 128 sha256_transform_z (digest); // 128 - 192 sha256_transform_z (digest); // 192 - 256 sha256_transform_z (digest); // 256 - 320 sha256_transform_z (digest); // 320 - 384 sha256_transform_z (digest); // 384 - 448 sha256_transform_s (digest, w_s1); // 448 - 512 sha256_transform_s (digest, w_s2); // 512 - 576 COMPARE_S_SIMD (digest[3], digest[7], digest[2], digest[6]); } } __kernel void m08000_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08000_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m08000_a3-optimized.cl000066400000000000000000000712131320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u32a 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, }; #define SHA256_S0_S(x) (rotl32_S ((x), 25u) ^ rotl32_S ((x), 14u) ^ SHIFT_RIGHT_32 ((x), 3u)) #define SHA256_S1_S(x) (rotl32_S ((x), 15u) ^ rotl32_S ((x), 13u) ^ SHIFT_RIGHT_32 ((x), 10u)) #define SHA256_EXPAND_S(x,y,z,w) (SHA256_S1_S (x) + y + SHA256_S0_S (z) + w) 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); #ifdef _unroll #pragma unroll #endif 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; } void sha256_transform_z (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]; #define ROUND_STEP_Z(i) \ { \ SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, 0, k_sha256[i + 0]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, 0, k_sha256[i + 1]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, 0, k_sha256[i + 2]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, 0, k_sha256[i + 3]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, 0, k_sha256[i + 4]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, 0, k_sha256[i + 5]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, 0, k_sha256[i + 6]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, 0, k_sha256[i + 7]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, 0, k_sha256[i + 8]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, 0, k_sha256[i + 9]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, 0, k_sha256[i + 10]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, 0, k_sha256[i + 11]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, 0, k_sha256[i + 12]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, 0, k_sha256[i + 13]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, 0, k_sha256[i + 14]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, 0, k_sha256[i + 15]); \ } ROUND_STEP_Z (0); #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i += 16) { ROUND_STEP_Z (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; } void sha256_transform_s (u32x digest[8], __local u32 *w) { 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]; #define ROUND_STEP_S(i) \ { \ SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w[i + 0], k_sha256[i + 0]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w[i + 1], k_sha256[i + 1]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w[i + 2], k_sha256[i + 2]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w[i + 3], k_sha256[i + 3]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w[i + 4], k_sha256[i + 4]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w[i + 5], k_sha256[i + 5]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w[i + 6], k_sha256[i + 6]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w[i + 7], k_sha256[i + 7]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w[i + 8], k_sha256[i + 8]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w[i + 9], k_sha256[i + 9]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w[i + 10], k_sha256[i + 10]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w[i + 11], k_sha256[i + 11]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w[i + 12], k_sha256[i + 12]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w[i + 13], k_sha256[i + 13]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w[i + 14], k_sha256[i + 14]); \ SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w[i + 15], k_sha256[i + 15]); \ } ROUND_STEP_S (0); #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i += 16) { ROUND_STEP_S (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; } void m08000m (__local u32 *w_s1, __local u32 *w_s2, u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * salt */ const u32 salt_buf0 = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); const u32 salt_buf1 = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); const u32 salt_buf2 = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 /** * precompute final msg blocks */ for (u32 i = lid; i < 64; i += lsz) { w_s1[i] = 0; w_s2[i] = 0; } barrier (CLK_LOCAL_MEM_FENCE); if (lid == 0) { w_s1[15] = 0 | salt_buf0 >> 16; #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i++) { w_s1[i] = SHA256_EXPAND_S (w_s1[i - 2], w_s1[i - 7], w_s1[i - 15], w_s1[i - 16]); } w_s2[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; w_s2[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; w_s2[ 2] = salt_buf2 << 16 | 0; w_s2[15] = (510 + 8) * 8; #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i++) { w_s2[i] = SHA256_EXPAND_S (w_s2[i - 2], w_s2[i - 7], w_s2[i - 15], w_s2[i - 16]); } } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32x w_t[16]; w_t[ 0] = w[ 0] >> 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; /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w_t[0] = w0lr >> 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 sha256_transform_z (digest); // 64 - 128 sha256_transform_z (digest); // 128 - 192 sha256_transform_z (digest); // 192 - 256 sha256_transform_z (digest); // 256 - 320 sha256_transform_z (digest); // 320 - 384 sha256_transform_z (digest); // 384 - 448 sha256_transform_s (digest, w_s1); // 448 - 512 sha256_transform_s (digest, w_s2); // 512 - 576 COMPARE_M_SIMD (digest[3], digest[7], digest[2], digest[6]); } } void m08000s (__local u32 *w_s1, __local u32 *w_s2, u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * salt */ const u32 salt_buf0 = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); const u32 salt_buf1 = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); const u32 salt_buf2 = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 /** * precompute final msg blocks */ for (u32 i = lid; i < 64; i += lsz) { w_s1[i] = 0; w_s2[i] = 0; } barrier (CLK_LOCAL_MEM_FENCE); if (lid == 0) { w_s1[15] = 0 | salt_buf0 >> 16; #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i++) { w_s1[i] = SHA256_EXPAND_S (w_s1[i - 2], w_s1[i - 7], w_s1[i - 15], w_s1[i - 16]); } w_s2[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; w_s2[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; w_s2[ 2] = salt_buf2 << 16 | 0; w_s2[15] = (510 + 8) * 8; #ifdef _unroll #pragma unroll #endif for (int i = 16; i < 64; i++) { w_s2[i] = SHA256_EXPAND_S (w_s2[i - 2], w_s2[i - 7], w_s2[i - 15], w_s2[i - 16]); } } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32x w_t[16]; w_t[ 0] = w[ 0] >> 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; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_buf[digests_offset].digest_buf[DGST_R1], digests_buf[digests_offset].digest_buf[DGST_R2], digests_buf[digests_offset].digest_buf[DGST_R3] }; /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w_t[0] = w0lr >> 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 sha256_transform_z (digest); // 64 - 128 sha256_transform_z (digest); // 128 - 192 sha256_transform_z (digest); // 192 - 256 sha256_transform_z (digest); // 256 - 320 sha256_transform_z (digest); // 320 - 384 sha256_transform_z (digest); // 384 - 448 sha256_transform_s (digest, w_s1); // 448 - 512 sha256_transform_s (digest, w_s2); // 512 - 576 COMPARE_S_SIMD (digest[3], digest[7], digest[2], digest[6]); } } __kernel void m08000_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_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; __local u32 w_s1[64]; __local u32 w_s2[64]; /** * main */ m08000m (w_s1, w_s2, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, gid_max); } __kernel void m08000_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_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; __local u32 w_s1[64]; __local u32 w_s2[64]; /** * main */ m08000m (w_s1, w_s2, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, gid_max); } __kernel void m08000_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_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; __local u32 w_s1[64]; __local u32 w_s2[64]; /** * main */ m08000m (w_s1, w_s2, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, gid_max); } __kernel void m08000_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_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; __local u32 w_s1[64]; __local u32 w_s2[64]; /** * main */ m08000s (w_s1, w_s2, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, gid_max); } __kernel void m08000_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_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; __local u32 w_s1[64]; __local u32 w_s2[64]; /** * main */ m08000s (w_s1, w_s2, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, gid_max); } __kernel void m08000_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_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; __local u32 w_s1[64]; __local u32 w_s2[64]; /** * main */ m08000s (w_s1, w_s2, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, gid_max); } hashcat-4.0.1/OpenCL/m08100_a0-optimized.cl000066400000000000000000000653251320027462700200140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m08100_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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] = 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; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_4x4_VV (w0, w1, w2, w3, out_len + 1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); /** * prepend salt */ const u32x 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] = 0; w3_t[0] = 0; w3_t[1] = 0; w3_t[2] = 0; w3_t[3] = (out_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]); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m08100_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08100_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08100_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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] = 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; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], 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_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_4x4_VV (w0, w1, w2, w3, out_len + 1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); /** * prepend salt */ const u32x 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] = 0; w3_t[0] = 0; w3_t[1] = 0; w3_t[2] = 0; w3_t[3] = (out_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]); if (MATCHES_NONE_VS (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]); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m08100_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08100_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m08100_a0.cl000066400000000000000000000102461320027462700160020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m08100_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx = ctx0; sha1_update_swap (&ctx, tmp.i, tmp.pw_len + 1); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m08100_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx = ctx0; sha1_update_swap (&ctx, tmp.i, tmp.pw_len + 1); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m08100_a1-optimized.cl000066400000000000000000000743221320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m08100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * 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; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; append_0x80_4x4_VV (w0, w1, w2, w3, pw_len + 1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); /** * prepend salt */ const u32x 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; /** * 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]); COMPARE_M_SIMD (d, e, c, b); } } __kernel void m08100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * 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; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], 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_S (search[1], 2u); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; append_0x80_4x4_VV (w0, w1, w2, w3, pw_len + 1); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); /** * prepend salt */ const u32x 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; /** * 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]); if (MATCHES_NONE_VS (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]); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m08100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m08100_a1.cl000066400000000000000000000101111320027462700157720ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m08100_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len + 1); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m08100_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len + 1); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m08100_a3-optimized.cl000066400000000000000000001042401320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m08100m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * sha1 */ u32x w0_t = salt_buf0[0]; u32x w1_t = salt_buf0[1]; u32x w2_t = w0lr; u32x w3_t = w0[1]; u32x w4_t = w0[2]; u32x w5_t = w0[3]; u32x w6_t = w1[0]; u32x w7_t = w1[1]; u32x w8_t = w1[2]; u32x w9_t = w1[3]; u32x wa_t = w2[0]; u32x wb_t = w2[1]; u32x wc_t = w2[2]; u32x wd_t = w2[3]; u32x we_t = 0; u32x wf_t = (pw_salt_len + 1) * 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); COMPARE_M_SIMD (d, e, c, b); } } void m08100s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], 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_S (search[1], 2u); /** * loop */ const u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * sha1 */ u32x w0_t = salt_buf0[0]; u32x w1_t = salt_buf0[1]; u32x w2_t = w0lr; u32x w3_t = w0[1]; u32x w4_t = w0[2]; u32x w5_t = w0[3]; u32x w6_t = w1[0]; u32x w7_t = w1[1]; u32x w8_t = w1[2]; u32x w9_t = w1[3]; u32x wa_t = w2[0]; u32x wb_t = w2[1]; u32x wc_t = w2[2]; u32x wd_t = w2[3]; u32x we_t = 0; u32x wf_t = (pw_salt_len + 1) * 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 (MATCHES_NONE_VS (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); COMPARE_S_SIMD (d, e, c, b); } } __kernel void m08100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); append_0x80_2x4_S (w0, w1, pw_len + 1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m08100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); append_0x80_3x4_S (w0, w1, w2, pw_len + 1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m08100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = 0; w3[3] = 0; append_0x80_4x4_S (w0, w1, w2, w3, pw_len + 1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m08100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); append_0x80_2x4_S (w0, w1, pw_len + 1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m08100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); append_0x80_3x4_S (w0, w1, w2, pw_len + 1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m08100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = 0; w3[3] = 0; append_0x80_4x4_S (w0, w1, w2, w3, pw_len + 1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m08100_a3.cl000066400000000000000000000110711320027462700160020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m08100_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); sha1_update_vector (&ctx, w, pw_len + 1); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m08100_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); sha1_update_vector (&ctx, w, pw_len + 1); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m08200.cl000066400000000000000000000305651320027462700154310ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" #include "inc_hash_sha512.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha512_run_V (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); w0[0] = h32_from_64 (digest[0]); w0[1] = l32_from_64 (digest[0]); w0[2] = h32_from_64 (digest[1]); w0[3] = l32_from_64 (digest[1]); w1[0] = h32_from_64 (digest[2]); w1[1] = l32_from_64 (digest[2]); w1[2] = h32_from_64 (digest[3]); w1[3] = l32_from_64 (digest[3]); w2[0] = h32_from_64 (digest[4]); w2[1] = l32_from_64 (digest[4]); w2[2] = h32_from_64 (digest[5]); w2[3] = l32_from_64 (digest[5]); w3[0] = h32_from_64 (digest[6]); w3[1] = l32_from_64 (digest[6]); w3[2] = h32_from_64 (digest[7]); w3[3] = l32_from_64 (digest[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } __kernel void m08200_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha512_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const cloudkey_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha512_hmac_ctx_t sha512_hmac_ctx; sha512_hmac_init_global_swap (&sha512_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha512_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha512_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha512_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha512_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha512_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha512_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha512_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha512_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha512_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha512_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha512_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha512_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha512_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha512_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha512_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha512_hmac_ctx.opad.h[7]; sha512_hmac_update_global_swap (&sha512_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) { sha512_hmac_ctx_t sha512_hmac_ctx2 = sha512_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; w0[0] = j; 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] = 0; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_update_128 (&sha512_hmac_ctx2, w0, w1, w2, w3, w4, w5, w6, w7, 4); sha512_hmac_final (&sha512_hmac_ctx2); tmps[gid].dgst[i + 0] = sha512_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha512_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha512_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha512_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha512_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha512_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha512_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha512_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m08200_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha512_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const cloudkey_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u64x ipad[8]; u64x opad[8]; ipad[0] = pack64v (tmps, ipad, gid, 0); ipad[1] = pack64v (tmps, ipad, gid, 1); ipad[2] = pack64v (tmps, ipad, gid, 2); ipad[3] = pack64v (tmps, ipad, gid, 3); ipad[4] = pack64v (tmps, ipad, gid, 4); ipad[5] = pack64v (tmps, ipad, gid, 5); ipad[6] = pack64v (tmps, ipad, gid, 6); ipad[7] = pack64v (tmps, ipad, gid, 7); opad[0] = pack64v (tmps, opad, gid, 0); opad[1] = pack64v (tmps, opad, gid, 1); opad[2] = pack64v (tmps, opad, gid, 2); opad[3] = pack64v (tmps, opad, gid, 3); opad[4] = pack64v (tmps, opad, gid, 4); opad[5] = pack64v (tmps, opad, gid, 5); opad[6] = pack64v (tmps, opad, gid, 6); opad[7] = pack64v (tmps, opad, gid, 7); for (u32 i = 0; i < 8; i += 8) { u64x dgst[8]; u64x out[8]; dgst[0] = pack64v (tmps, dgst, gid, i + 0); dgst[1] = pack64v (tmps, dgst, gid, i + 1); dgst[2] = pack64v (tmps, dgst, gid, i + 2); dgst[3] = pack64v (tmps, dgst, gid, i + 3); dgst[4] = pack64v (tmps, dgst, gid, i + 4); dgst[5] = pack64v (tmps, dgst, gid, i + 5); dgst[6] = pack64v (tmps, dgst, gid, i + 6); dgst[7] = pack64v (tmps, dgst, gid, i + 7); out[0] = pack64v (tmps, out, gid, i + 0); out[1] = pack64v (tmps, out, gid, i + 1); out[2] = pack64v (tmps, out, gid, i + 2); out[3] = pack64v (tmps, out, gid, i + 3); out[4] = pack64v (tmps, out, gid, i + 4); out[5] = pack64v (tmps, out, gid, i + 5); out[6] = pack64v (tmps, out, gid, i + 6); out[7] = pack64v (tmps, out, gid, i + 7); for (u32 j = 0; j < loop_cnt; j++) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; w0[0] = h32_from_64 (dgst[0]); w0[1] = l32_from_64 (dgst[0]); w0[2] = h32_from_64 (dgst[1]); w0[3] = l32_from_64 (dgst[1]); w1[0] = h32_from_64 (dgst[2]); w1[1] = l32_from_64 (dgst[2]); w1[2] = h32_from_64 (dgst[3]); w1[3] = l32_from_64 (dgst[3]); w2[0] = h32_from_64 (dgst[4]); w2[1] = l32_from_64 (dgst[4]); w2[2] = h32_from_64 (dgst[5]); w2[3] = l32_from_64 (dgst[5]); w3[0] = h32_from_64 (dgst[6]); w3[1] = l32_from_64 (dgst[6]); w3[2] = h32_from_64 (dgst[7]); w3[3] = l32_from_64 (dgst[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = (128 + 64) * 8; hmac_sha512_run_V (w0, w1, w2, w3, w4, w5, w6, w7, 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]; } unpack64v (tmps, dgst, gid, i + 0, dgst[0]); unpack64v (tmps, dgst, gid, i + 1, dgst[1]); unpack64v (tmps, dgst, gid, i + 2, dgst[2]); unpack64v (tmps, dgst, gid, i + 3, dgst[3]); unpack64v (tmps, dgst, gid, i + 4, dgst[4]); unpack64v (tmps, dgst, gid, i + 5, dgst[5]); unpack64v (tmps, dgst, gid, i + 6, dgst[6]); unpack64v (tmps, dgst, gid, i + 7, dgst[7]); unpack64v (tmps, out, gid, i + 0, out[0]); unpack64v (tmps, out, gid, i + 1, out[1]); unpack64v (tmps, out, gid, i + 2, out[2]); unpack64v (tmps, out, gid, i + 3, out[3]); unpack64v (tmps, out, gid, i + 4, out[4]); unpack64v (tmps, out, gid, i + 5, out[5]); unpack64v (tmps, out, gid, i + 6, out[6]); unpack64v (tmps, out, gid, i + 7, out[7]); } } __kernel void m08200_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha512_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const cloudkey_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = h32_from_64_S (tmps[gid].out[4]); w0[1] = l32_from_64_S (tmps[gid].out[4]); w0[2] = h32_from_64_S (tmps[gid].out[5]); w0[3] = l32_from_64_S (tmps[gid].out[5]); w1[0] = h32_from_64_S (tmps[gid].out[6]); w1[1] = l32_from_64_S (tmps[gid].out[6]); w1[2] = h32_from_64_S (tmps[gid].out[7]); w1[3] = l32_from_64_S (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; sha256_hmac_ctx_t ctx; sha256_hmac_init_64 (&ctx, w0, w1, w2, w3); sha256_hmac_update_global (&ctx, esalt_bufs[digests_offset].data_buf, esalt_bufs[digests_offset].data_len); sha256_hmac_final (&ctx); const u32 r0 = ctx.opad.h[0]; const u32 r1 = ctx.opad.h[1]; const u32 r2 = ctx.opad.h[2]; const u32 r3 = ctx.opad.h[3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m08300_a0-optimized.cl000066400000000000000000000433621320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m08300_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; 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]; const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 domain_buf0[4]; u32 domain_buf1[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]; 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_len_pc; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * 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_le (w0_t, w1_t, w2_t, w3_t, 1); w0_t[0] |= out_len & 0xff; u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = domain_buf0[0]; s0[1] = domain_buf0[1]; s0[2] = domain_buf0[2]; s0[3] = domain_buf0[3]; s1[0] = domain_buf1[0]; s1[1] = domain_buf1[1]; s1[2] = domain_buf1[2]; s1[3] = domain_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, 1 + 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]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, 1 + out_len + domain_len + 1); 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]; /** * sha1 */ w0_t[0] = swap32 (w0_t[0]); w0_t[1] = swap32 (w0_t[1]); w0_t[2] = swap32 (w0_t[2]); w0_t[3] = swap32 (w0_t[3]); w1_t[0] = swap32 (w1_t[0]); w1_t[1] = swap32 (w1_t[1]); w1_t[2] = swap32 (w1_t[2]); w1_t[3] = swap32 (w1_t[3]); w2_t[0] = swap32 (w2_t[0]); w2_t[1] = swap32 (w2_t[1]); w2_t[2] = swap32 (w2_t[2]); w2_t[3] = swap32 (w2_t[3]); w3_t[0] = swap32 (w3_t[0]); w3_t[1] = swap32 (w3_t[1]); w3_t[2] = 0; w3_t[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_vector (w0_t, w1_t, w2_t, w3_t, digest); // iterations for (u32 i = 0; i < salt_iter; i++) { 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] = swap32 (salt_buf0[0]); w1_t[2] = swap32 (salt_buf0[1]); w1_t[3] = swap32 (salt_buf0[2]); w2_t[0] = swap32 (salt_buf0[3]); w2_t[1] = swap32 (salt_buf1[0]); w2_t[2] = swap32 (salt_buf1[1]); w2_t[3] = swap32 (salt_buf1[2]); w3_t[0] = swap32 (salt_buf1[3]); w3_t[1] = 0; w3_t[2] = 0; w3_t[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_vector (w0_t, w1_t, w2_t, w3_t, digest); } COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m08300_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08300_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08300_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; 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]; const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 domain_buf0[4]; u32 domain_buf1[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]; 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_len_pc; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * 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_le (w0_t, w1_t, w2_t, w3_t, 1); w0_t[0] |= out_len & 0xff; u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = domain_buf0[0]; s0[1] = domain_buf0[1]; s0[2] = domain_buf0[2]; s0[3] = domain_buf0[3]; s1[0] = domain_buf1[0]; s1[1] = domain_buf1[1]; s1[2] = domain_buf1[2]; s1[3] = domain_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, 1 + 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]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, 1 + out_len + domain_len + 1); 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]; /** * sha1 */ w0_t[0] = swap32 (w0_t[0]); w0_t[1] = swap32 (w0_t[1]); w0_t[2] = swap32 (w0_t[2]); w0_t[3] = swap32 (w0_t[3]); w1_t[0] = swap32 (w1_t[0]); w1_t[1] = swap32 (w1_t[1]); w1_t[2] = swap32 (w1_t[2]); w1_t[3] = swap32 (w1_t[3]); w2_t[0] = swap32 (w2_t[0]); w2_t[1] = swap32 (w2_t[1]); w2_t[2] = swap32 (w2_t[2]); w2_t[3] = swap32 (w2_t[3]); w3_t[0] = swap32 (w3_t[0]); w3_t[1] = swap32 (w3_t[1]); w3_t[2] = 0; w3_t[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_vector (w0_t, w1_t, w2_t, w3_t, digest); // iterations for (u32 i = 0; i < salt_iter; i++) { 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] = swap32 (salt_buf0[0]); w1_t[2] = swap32 (salt_buf0[1]); w1_t[3] = swap32 (salt_buf0[2]); w2_t[0] = swap32 (salt_buf0[3]); w2_t[1] = swap32 (salt_buf1[0]); w2_t[2] = swap32 (salt_buf1[1]); w2_t[3] = swap32 (salt_buf1[2]); w3_t[0] = swap32 (salt_buf1[3]); w3_t[1] = 0; w3_t[2] = 0; w3_t[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_vector (w0_t, w1_t, w2_t, w3_t, digest); } COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m08300_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08300_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m08300_a0.cl000066400000000000000000000147061320027462700160110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m08300_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } const u32 salt_len_pc = salt_bufs[salt_pos].salt_len_pc; u32 s_pc[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len_pc; i += 4, idx += 1) { s_pc[idx] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[idx]); } const u32 salt_iter = salt_bufs[salt_pos].salt_iter; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx1; sha1_init (&ctx1); ctx1.w0[0] = (tmp.pw_len & 0xff) << 24; ctx1.len = 1; sha1_update_swap (&ctx1, tmp.i, tmp.pw_len); sha1_update (&ctx1, s_pc, salt_len_pc + 1); sha1_update (&ctx1, s, salt_len); sha1_final (&ctx1); u32 digest[5]; digest[0] = ctx1.h[0]; digest[1] = ctx1.h[1]; digest[2] = ctx1.h[2]; digest[3] = ctx1.h[3]; digest[4] = ctx1.h[4]; // iterations for (u32 i = 0; i < salt_iter; i++) { sha1_ctx_t ctx; sha1_init (&ctx); ctx.w0[0] = digest[0]; ctx.w0[1] = digest[1]; ctx.w0[2] = digest[2]; ctx.w0[3] = digest[3]; ctx.w1[0] = digest[4]; ctx.len = 20; sha1_update (&ctx, s, salt_len); sha1_final (&ctx); digest[0] = ctx.h[0]; digest[1] = ctx.h[1]; digest[2] = ctx.h[2]; digest[3] = ctx.h[3]; digest[4] = ctx.h[4]; } const u32 r0 = digest[DGST_R0]; const u32 r1 = digest[DGST_R1]; const u32 r2 = digest[DGST_R2]; const u32 r3 = digest[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m08300_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } const u32 salt_len_pc = salt_bufs[salt_pos].salt_len_pc; u32 s_pc[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len_pc; i += 4, idx += 1) { s_pc[idx] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[idx]); } const u32 salt_iter = salt_bufs[salt_pos].salt_iter; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx1; sha1_init (&ctx1); ctx1.w0[0] = (tmp.pw_len & 0xff) << 24; ctx1.len = 1; sha1_update_swap (&ctx1, tmp.i, tmp.pw_len); sha1_update (&ctx1, s_pc, salt_len_pc + 1); sha1_update (&ctx1, s, salt_len); sha1_final (&ctx1); u32 digest[5]; digest[0] = ctx1.h[0]; digest[1] = ctx1.h[1]; digest[2] = ctx1.h[2]; digest[3] = ctx1.h[3]; digest[4] = ctx1.h[4]; // iterations for (u32 i = 0; i < salt_iter; i++) { sha1_ctx_t ctx; sha1_init (&ctx); ctx.w0[0] = digest[0]; ctx.w0[1] = digest[1]; ctx.w0[2] = digest[2]; ctx.w0[3] = digest[3]; ctx.w1[0] = digest[4]; ctx.len = 20; sha1_update (&ctx, s, salt_len); sha1_final (&ctx); digest[0] = ctx.h[0]; digest[1] = ctx.h[1]; digest[2] = ctx.h[2]; digest[3] = ctx.h[3]; digest[4] = ctx.h[4]; } const u32 r0 = digest[DGST_R0]; const u32 r1 = digest[DGST_R1]; const u32 r2 = digest[DGST_R2]; const u32 r3 = digest[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m08300_a1-optimized.cl000066400000000000000000000520711320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m08300_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ const u32 salt_iter = salt_bufs[salt_pos].salt_iter; 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]; const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 domain_buf0[4]; u32 domain_buf1[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]; 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_len_pc; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * 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_le (w0_t, w1_t, w2_t, w3_t, 1); w0_t[0] |= pw_len & 0xff; u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = domain_buf0[0]; s0[1] = domain_buf0[1]; s0[2] = domain_buf0[2]; s0[3] = domain_buf0[3]; s1[0] = domain_buf1[0]; s1[1] = domain_buf1[1]; s1[2] = domain_buf1[2]; s1[3] = domain_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (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] |= s3[2]; w3_t[3] |= s3[3]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, 1 + pw_len + domain_len + 1); 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]; /** * sha1 */ w0_t[0] = swap32 (w0_t[0]); w0_t[1] = swap32 (w0_t[1]); w0_t[2] = swap32 (w0_t[2]); w0_t[3] = swap32 (w0_t[3]); w1_t[0] = swap32 (w1_t[0]); w1_t[1] = swap32 (w1_t[1]); w1_t[2] = swap32 (w1_t[2]); w1_t[3] = swap32 (w1_t[3]); w2_t[0] = swap32 (w2_t[0]); w2_t[1] = swap32 (w2_t[1]); w2_t[2] = swap32 (w2_t[2]); w2_t[3] = swap32 (w2_t[3]); w3_t[0] = swap32 (w3_t[0]); w3_t[1] = swap32 (w3_t[1]); w3_t[2] = 0; w3_t[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_vector (w0_t, w1_t, w2_t, w3_t, digest); // iterations for (u32 i = 0; i < salt_iter; i++) { 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] = swap32 (salt_buf0[0]); w1_t[2] = swap32 (salt_buf0[1]); w1_t[3] = swap32 (salt_buf0[2]); w2_t[0] = swap32 (salt_buf0[3]); w2_t[1] = swap32 (salt_buf1[0]); w2_t[2] = swap32 (salt_buf1[1]); w2_t[3] = swap32 (salt_buf1[2]); w3_t[0] = swap32 (salt_buf1[3]); w3_t[1] = 0; w3_t[2] = 0; w3_t[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_vector (w0_t, w1_t, w2_t, w3_t, digest); } COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m08300_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08300_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08300_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ const u32 salt_iter = salt_bufs[salt_pos].salt_iter; 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]; const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 domain_buf0[4]; u32 domain_buf1[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]; 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_len_pc; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * 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_le (w0_t, w1_t, w2_t, w3_t, 1); w0_t[0] |= pw_len & 0xff; u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = domain_buf0[0]; s0[1] = domain_buf0[1]; s0[2] = domain_buf0[2]; s0[3] = domain_buf0[3]; s1[0] = domain_buf1[0]; s1[1] = domain_buf1[1]; s1[2] = domain_buf1[2]; s1[3] = domain_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (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] |= s3[2]; w3_t[3] |= s3[3]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, 1 + pw_len + domain_len + 1); 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]; /** * sha1 */ w0_t[0] = swap32 (w0_t[0]); w0_t[1] = swap32 (w0_t[1]); w0_t[2] = swap32 (w0_t[2]); w0_t[3] = swap32 (w0_t[3]); w1_t[0] = swap32 (w1_t[0]); w1_t[1] = swap32 (w1_t[1]); w1_t[2] = swap32 (w1_t[2]); w1_t[3] = swap32 (w1_t[3]); w2_t[0] = swap32 (w2_t[0]); w2_t[1] = swap32 (w2_t[1]); w2_t[2] = swap32 (w2_t[2]); w2_t[3] = swap32 (w2_t[3]); w3_t[0] = swap32 (w3_t[0]); w3_t[1] = swap32 (w3_t[1]); w3_t[2] = 0; w3_t[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_vector (w0_t, w1_t, w2_t, w3_t, digest); // iterations for (u32 i = 0; i < salt_iter; i++) { 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] = swap32 (salt_buf0[0]); w1_t[2] = swap32 (salt_buf0[1]); w1_t[3] = swap32 (salt_buf0[2]); w2_t[0] = swap32 (salt_buf0[3]); w2_t[1] = swap32 (salt_buf1[0]); w2_t[2] = swap32 (salt_buf1[1]); w2_t[3] = swap32 (salt_buf1[2]); w3_t[0] = swap32 (salt_buf1[3]); w3_t[1] = 0; w3_t[2] = 0; w3_t[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_vector (w0_t, w1_t, w2_t, w3_t, digest); } COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m08300_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08300_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m08300_a1.cl000066400000000000000000000146611320027462700160120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m08300_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } const u32 salt_len_pc = salt_bufs[salt_pos].salt_len_pc; u32 s_pc[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len_pc; i += 4, idx += 1) { s_pc[idx] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[idx]); } const u32 salt_iter = salt_bufs[salt_pos].salt_iter; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1; sha1_init (&ctx1); ctx1.w0[0] = ((pws[gid].pw_len + combs_buf[il_pos].pw_len) & 0xff) << 24; ctx1.len = 1; sha1_update_global_swap (&ctx1, pws[gid].i, pws[gid].pw_len); sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_update (&ctx1, s_pc, salt_len_pc + 1); sha1_update (&ctx1, s, salt_len); sha1_final (&ctx1); u32 digest[5]; digest[0] = ctx1.h[0]; digest[1] = ctx1.h[1]; digest[2] = ctx1.h[2]; digest[3] = ctx1.h[3]; digest[4] = ctx1.h[4]; // iterations for (u32 i = 0; i < salt_iter; i++) { sha1_ctx_t ctx; sha1_init (&ctx); ctx.w0[0] = digest[0]; ctx.w0[1] = digest[1]; ctx.w0[2] = digest[2]; ctx.w0[3] = digest[3]; ctx.w1[0] = digest[4]; ctx.len = 20; sha1_update (&ctx, s, salt_len); sha1_final (&ctx); digest[0] = ctx.h[0]; digest[1] = ctx.h[1]; digest[2] = ctx.h[2]; digest[3] = ctx.h[3]; digest[4] = ctx.h[4]; } const u32 r0 = digest[DGST_R0]; const u32 r1 = digest[DGST_R1]; const u32 r2 = digest[DGST_R2]; const u32 r3 = digest[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m08300_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } const u32 salt_len_pc = salt_bufs[salt_pos].salt_len_pc; u32 s_pc[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len_pc; i += 4, idx += 1) { s_pc[idx] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[idx]); } const u32 salt_iter = salt_bufs[salt_pos].salt_iter; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1; sha1_init (&ctx1); ctx1.w0[0] = ((pws[gid].pw_len + combs_buf[il_pos].pw_len) & 0xff) << 24; ctx1.len = 1; sha1_update_global_swap (&ctx1, pws[gid].i, pws[gid].pw_len); sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_update (&ctx1, s_pc, salt_len_pc + 1); sha1_update (&ctx1, s, salt_len); sha1_final (&ctx1); u32 digest[5]; digest[0] = ctx1.h[0]; digest[1] = ctx1.h[1]; digest[2] = ctx1.h[2]; digest[3] = ctx1.h[3]; digest[4] = ctx1.h[4]; // iterations for (u32 i = 0; i < salt_iter; i++) { sha1_ctx_t ctx; sha1_init (&ctx); ctx.w0[0] = digest[0]; ctx.w0[1] = digest[1]; ctx.w0[2] = digest[2]; ctx.w0[3] = digest[3]; ctx.w1[0] = digest[4]; ctx.len = 20; sha1_update (&ctx, s, salt_len); sha1_final (&ctx); digest[0] = ctx.h[0]; digest[1] = ctx.h[1]; digest[2] = ctx.h[2]; digest[3] = ctx.h[3]; digest[4] = ctx.h[4]; } const u32 r0 = digest[DGST_R0]; const u32 r1 = digest[DGST_R1]; const u32 r2 = digest[DGST_R2]; const u32 r3 = digest[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m08300_a3-optimized.cl000066400000000000000000000566531320027462700200250ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" void m08300m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 salt_iter = salt_bufs[salt_pos].salt_iter; u32 salt_buf0[4]; u32 salt_buf1[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 domain_buf0[4]; u32 domain_buf1[4]; domain_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 0]); domain_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 1]); domain_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 2]); domain_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 3]); domain_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 4]); domain_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 5]); domain_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 6]); domain_buf1[3] = 0; const u32 domain_len = salt_bufs[salt_pos].salt_len_pc; u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = domain_buf0[0]; s0[1] = domain_buf0[1]; s0[2] = domain_buf0[2]; s0[3] = domain_buf0[3]; s1[0] = domain_buf1[0]; s1[1] = domain_buf1[1]; s1[2] = domain_buf1[2]; s1[3] = domain_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_be_S (s0, s1, s2, s3, pw_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]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_be_S (s0, s1, s2, s3, pw_len + domain_len + 1); 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]; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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_be (w0_t, w1_t, w2_t, w3_t, 1); w0_t[0] |= (pw_len & 0xff) << 24; w3_t[2] = 0; w3_t[3] = (1 + pw_len + domain_len + 1 + salt_len) * 8; /** * sha1 */ 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_vector (w0_t, w1_t, w2_t, w3_t, digest); // iterations for (u32 i = 0; i < salt_iter; i++) { 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] = salt_buf0[0]; w1_t[2] = salt_buf0[1]; w1_t[3] = salt_buf0[2]; w2_t[0] = salt_buf0[3]; w2_t[1] = salt_buf1[0]; w2_t[2] = salt_buf1[1]; w2_t[3] = salt_buf1[2]; w3_t[0] = salt_buf1[3]; w3_t[1] = 0; w3_t[2] = 0; w3_t[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_vector (w0_t, w1_t, w2_t, w3_t, digest); } COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } void m08300s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 salt_iter = salt_bufs[salt_pos].salt_iter; u32 salt_buf0[4]; u32 salt_buf1[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 domain_buf0[4]; u32 domain_buf1[4]; domain_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 0]); domain_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 1]); domain_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 2]); domain_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 3]); domain_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 4]); domain_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 5]); domain_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 6]); domain_buf1[3] = 0; const u32 domain_len = salt_bufs[salt_pos].salt_len_pc; u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = domain_buf0[0]; s0[1] = domain_buf0[1]; s0[2] = domain_buf0[2]; s0[3] = domain_buf0[3]; s1[0] = domain_buf1[0]; s1[1] = domain_buf1[1]; s1[2] = domain_buf1[2]; s1[3] = domain_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_be_S (s0, s1, s2, s3, pw_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]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_be_S (s0, s1, s2, s3, pw_len + domain_len + 1); 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]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_buf[digests_offset].digest_buf[DGST_R1], digests_buf[digests_offset].digest_buf[DGST_R2], digests_buf[digests_offset].digest_buf[DGST_R3] }; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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_be (w0_t, w1_t, w2_t, w3_t, 1); w0_t[0] |= (pw_len & 0xff) << 24; w3_t[2] = 0; w3_t[3] = (1 + pw_len + domain_len + 1 + salt_len) * 8; /** * sha1 */ 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_vector (w0_t, w1_t, w2_t, w3_t, digest); // iterations for (u32 i = 0; i < salt_iter; i++) { 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] = salt_buf0[0]; w1_t[2] = salt_buf0[1]; w1_t[3] = salt_buf0[2]; w2_t[0] = salt_buf0[3]; w2_t[1] = salt_buf1[0]; w2_t[2] = salt_buf1[1]; w2_t[3] = salt_buf1[2]; w3_t[0] = salt_buf1[3]; w3_t[1] = 0; w3_t[2] = 0; w3_t[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_vector (w0_t, w1_t, w2_t, w3_t, digest); } COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m08300_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m08300_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m08300_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m08300_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m08300_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m08300_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m08300_a3.cl000066400000000000000000000155351320027462700160150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m08300_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32 (salt_bufs[salt_pos].salt_buf[idx]); } const u32 salt_len_pc = salt_bufs[salt_pos].salt_len_pc; u32x s_pc[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len_pc; i += 4, idx += 1) { s_pc[idx] = swap32 (salt_bufs[salt_pos].salt_buf_pc[idx]); } const u32 salt_iter = salt_bufs[salt_pos].salt_iter; /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx1; sha1_init_vector (&ctx1); ctx1.w0[0] = (pw_len & 0xff) << 24; ctx1.len = 1; sha1_update_vector (&ctx1, w, pw_len); sha1_update_vector (&ctx1, s_pc, salt_len_pc + 1); sha1_update_vector (&ctx1, s, salt_len); sha1_final_vector (&ctx1); u32x digest[5]; digest[0] = ctx1.h[0]; digest[1] = ctx1.h[1]; digest[2] = ctx1.h[2]; digest[3] = ctx1.h[3]; digest[4] = ctx1.h[4]; // iterations for (u32 i = 0; i < salt_iter; i++) { sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); ctx.w0[0] = digest[0]; ctx.w0[1] = digest[1]; ctx.w0[2] = digest[2]; ctx.w0[3] = digest[3]; ctx.w1[0] = digest[4]; ctx.len = 20; sha1_update_vector (&ctx, s, salt_len); sha1_final_vector (&ctx); digest[0] = ctx.h[0]; digest[1] = ctx.h[1]; digest[2] = ctx.h[2]; digest[3] = ctx.h[3]; digest[4] = ctx.h[4]; } const u32x r0 = digest[DGST_R0]; const u32x r1 = digest[DGST_R1]; const u32x r2 = digest[DGST_R2]; const u32x r3 = digest[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m08300_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32 (salt_bufs[salt_pos].salt_buf[idx]); } const u32 salt_len_pc = salt_bufs[salt_pos].salt_len_pc; u32x s_pc[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len_pc; i += 4, idx += 1) { s_pc[idx] = swap32 (salt_bufs[salt_pos].salt_buf_pc[idx]); } const u32 salt_iter = salt_bufs[salt_pos].salt_iter; /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx1; sha1_init_vector (&ctx1); ctx1.w0[0] = (pw_len & 0xff) << 24; ctx1.len = 1; sha1_update_vector (&ctx1, w, pw_len); sha1_update_vector (&ctx1, s_pc, salt_len_pc + 1); sha1_update_vector (&ctx1, s, salt_len); sha1_final_vector (&ctx1); u32x digest[5]; digest[0] = ctx1.h[0]; digest[1] = ctx1.h[1]; digest[2] = ctx1.h[2]; digest[3] = ctx1.h[3]; digest[4] = ctx1.h[4]; // iterations for (u32 i = 0; i < salt_iter; i++) { sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); ctx.w0[0] = digest[0]; ctx.w0[1] = digest[1]; ctx.w0[2] = digest[2]; ctx.w0[3] = digest[3]; ctx.w1[0] = digest[4]; ctx.len = 20; sha1_update_vector (&ctx, s, salt_len); sha1_final_vector (&ctx); digest[0] = ctx.h[0]; digest[1] = ctx.h[1]; digest[2] = ctx.h[2]; digest[3] = ctx.h[3]; digest[4] = ctx.h[4]; } const u32x r0 = digest[DGST_R0]; const u32x r1 = digest[DGST_R1]; const u32x r2 = digest[DGST_R2]; const u32x r3 = digest[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m08400_a0-optimized.cl000066400000000000000000000513011320027462700200040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m08400_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * SHA1 */ w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = 0; w3[3] = out_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_vector (w0, w1, w2, w3, 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[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] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w2[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w3[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w3[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w3[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w3[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_vector (w0, w1, w2, w3, digest); w0[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; 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] = 80 * 8; sha1_transform_vector (w0, w1, w2, w3, digest); a = digest[0]; b = digest[1]; c = digest[2]; d = digest[3]; e = digest[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] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w2[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w3[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w3[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w3[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w3[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_vector (w0, w1, w2, w3, digest); w0[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; 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] = 80 * 8; sha1_transform_vector (w0, w1, w2, w3, digest); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m08400_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08400_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08400_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * SHA1 */ w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = 0; w3[3] = out_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_vector (w0, w1, w2, w3, 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[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] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w2[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w3[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w3[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w3[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w3[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_vector (w0, w1, w2, w3, digest); w0[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; 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] = 80 * 8; sha1_transform_vector (w0, w1, w2, w3, digest); a = digest[0]; b = digest[1]; c = digest[2]; d = digest[3]; e = digest[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] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w2[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w3[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w3[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w3[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w3[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_vector (w0, w1, w2, w3, digest); w0[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; 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] = 80 * 8; sha1_transform_vector (w0, w1, w2, w3, digest); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m08400_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08400_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m08400_a0.cl000066400000000000000000000272731320027462700160150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m08400_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx1; sha1_init (&ctx1); sha1_update_swap (&ctx1, tmp.i, tmp.pw_len); sha1_final (&ctx1); u32 a = ctx1.h[0]; u32 b = ctx1.h[1]; u32 c = ctx1.h[2]; u32 d = ctx1.h[3]; u32 e = ctx1.h[4]; sha1_ctx_t ctx2 = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx2, w0, w1, w2, w3, 40); sha1_final (&ctx2); a = ctx2.h[0]; b = ctx2.h[1]; c = ctx2.h[2]; d = ctx2.h[3]; e = ctx2.h[4]; sha1_ctx_t ctx = ctx0; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx, w0, w1, w2, w3, 40); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m08400_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx1; sha1_init (&ctx1); sha1_update_swap (&ctx1, tmp.i, tmp.pw_len); sha1_final (&ctx1); u32 a = ctx1.h[0]; u32 b = ctx1.h[1]; u32 c = ctx1.h[2]; u32 d = ctx1.h[3]; u32 e = ctx1.h[4]; sha1_ctx_t ctx2 = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx2, w0, w1, w2, w3, 40); sha1_final (&ctx2); a = ctx2.h[0]; b = ctx2.h[1]; c = ctx2.h[2]; d = ctx2.h[3]; e = ctx2.h[4]; sha1_ctx_t ctx = ctx0; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx, w0, w1, w2, w3, 40); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m08400_a1-optimized.cl000066400000000000000000000576701320027462700200240ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m08400_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * SHA1 */ w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = 0; w3[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_vector (w0, w1, w2, w3, 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[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] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w2[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w3[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w3[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w3[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w3[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_vector (w0, w1, w2, w3, digest); w0[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; 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] = 80 * 8; sha1_transform_vector (w0, w1, w2, w3, digest); a = digest[0]; b = digest[1]; c = digest[2]; d = digest[3]; e = digest[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] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w2[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w3[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w3[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w3[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w3[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_vector (w0, w1, w2, w3, digest); w0[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; 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] = 80 * 8; sha1_transform_vector (w0, w1, w2, w3, digest); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m08400_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08400_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08400_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * SHA1 */ w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = 0; w3[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_vector (w0, w1, w2, w3, 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[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] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w2[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w3[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w3[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w3[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w3[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_vector (w0, w1, w2, w3, digest); w0[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; 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] = 80 * 8; sha1_transform_vector (w0, w1, w2, w3, digest); a = digest[0]; b = digest[1]; c = digest[2]; d = digest[3]; e = digest[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] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w2[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w3[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w3[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w3[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w3[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_vector (w0, w1, w2, w3, digest); w0[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; 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] = 80 * 8; sha1_transform_vector (w0, w1, w2, w3, digest); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m08400_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08400_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m08400_a1.cl000066400000000000000000000272301320027462700160070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m08400_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_ctx_t ctx1l; sha1_init (&ctx1l); sha1_update_global_swap (&ctx1l, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1 = ctx1l; sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx1); u32 a = ctx1.h[0]; u32 b = ctx1.h[1]; u32 c = ctx1.h[2]; u32 d = ctx1.h[3]; u32 e = ctx1.h[4]; sha1_ctx_t ctx2 = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx2, w0, w1, w2, w3, 40); sha1_final (&ctx2); a = ctx2.h[0]; b = ctx2.h[1]; c = ctx2.h[2]; d = ctx2.h[3]; e = ctx2.h[4]; sha1_ctx_t ctx = ctx0; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx, w0, w1, w2, w3, 40); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m08400_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_ctx_t ctx1l; sha1_init (&ctx1l); sha1_update_global_swap (&ctx1l, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1 = ctx1l; sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx1); u32 a = ctx1.h[0]; u32 b = ctx1.h[1]; u32 c = ctx1.h[2]; u32 d = ctx1.h[3]; u32 e = ctx1.h[4]; sha1_ctx_t ctx2 = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx2, w0, w1, w2, w3, 40); sha1_final (&ctx2); a = ctx2.h[0]; b = ctx2.h[1]; c = ctx2.h[2]; d = ctx2.h[3]; e = ctx2.h[4]; sha1_ctx_t ctx = ctx0; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx, w0, w1, w2, w3, 40); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m08400_a3-optimized.cl000066400000000000000000000734641320027462700200250ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void m08400m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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] = pw_len * 8; /** * SHA1 */ 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_vector (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_vector (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_vector (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_vector (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_vector (w0_t, w1_t, w2_t, w3_t, digest); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } void m08400s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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] = pw_len * 8; /** * SHA1 */ 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_vector (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_vector (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_vector (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_vector (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_vector (w0_t, w1_t, w2_t, w3_t, digest); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m08400_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m08400_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m08400_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m08400_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m08400_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m08400_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } hashcat-4.0.1/OpenCL/m08400_a3.cl000066400000000000000000000304401320027462700160060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m08400_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; sha1_ctx_vector_t ctx1; sha1_init_vector (&ctx1); sha1_update_vector (&ctx1, w, pw_len); sha1_final_vector (&ctx1); u32x a = ctx1.h[0]; u32x b = ctx1.h[1]; u32x c = ctx1.h[2]; u32x d = ctx1.h[3]; u32x e = ctx1.h[4]; sha1_ctx_vector_t ctx2; sha1_init_vector_from_scalar (&ctx2, &ctx0); u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_vector_64 (&ctx2, w0, w1, w2, w3, 40); sha1_final_vector (&ctx2); a = ctx2.h[0]; b = ctx2.h[1]; c = ctx2.h[2]; d = ctx2.h[3]; e = ctx2.h[4]; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_vector_64 (&ctx, w0, w1, w2, w3, 40); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m08400_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; sha1_ctx_vector_t ctx1; sha1_init_vector (&ctx1); sha1_update_vector (&ctx1, w, pw_len); sha1_final_vector (&ctx1); u32x a = ctx1.h[0]; u32x b = ctx1.h[1]; u32x c = ctx1.h[2]; u32x d = ctx1.h[3]; u32x e = ctx1.h[4]; sha1_ctx_vector_t ctx2; sha1_init_vector_from_scalar (&ctx2, &ctx0); u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_vector_64 (&ctx2, w0, w1, w2, w3, 40); sha1_final_vector (&ctx2); a = ctx2.h[0]; b = ctx2.h[1]; c = ctx2.h[2]; d = ctx2.h[3]; e = ctx2.h[4]; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_vector_64 (&ctx, w0, w1, w2, w3, 40); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m08500_a0.cl000066400000000000000000000657441320027462700160230ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_simd.cl" #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 u32a c_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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif #if VECT_SIZE == 1 #define BOX1(i,S) (S)[(i)] #elif VECT_SIZE == 2 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1]) #elif VECT_SIZE == 4 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) #elif VECT_SIZE == 8 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7]) #elif VECT_SIZE == 16 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7], (S)[(i).s8], (S)[(i).s9], (S)[(i).sa], (S)[(i).sb], (S)[(i).sc], (S)[(i).sd], (S)[(i).se], (S)[(i).sf]) #endif void _des_crypt_encrypt (u32 iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64]) { u32 r = data[0]; u32 l = data[1]; #ifdef _unroll #pragma unroll #endif for (u32 i = 0; i < 16; i += 2) { u32 u; u32 t; u = Kc[i + 0] ^ r; t = Kd[i + 0] ^ 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); u = Kc[i + 1] ^ l; t = Kd[i + 1] ^ rotl32 (l, 28u); r ^= 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); } iv[0] = l; iv[1] = r; } void _des_crypt_keysetup (u32 c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[64]) { u32 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; #ifdef _unroll #pragma unroll #endif 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 u32 c00 = (c >> 0) & 0x0000003f; const u32 c06 = (c >> 6) & 0x00383003; const u32 c07 = (c >> 7) & 0x0000003c; const u32 c13 = (c >> 13) & 0x0000060f; const u32 c20 = (c >> 20) & 0x00000001; u32 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 u32 d00 = (d >> 0) & 0x00003c3f; const u32 d07 = (d >> 7) & 0x00003f03; const u32 d21 = (d >> 21) & 0x0000000f; const u32 d22 = (d >> 22) & 0x00000030; u32 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)); Kc[i] = rotl32 (Kc[i], 2u); Kd[i] = rotl32 (Kd[i], 2u); } } void transform_racf_key (const u32 w0, const u32x w1, u32x key[2]) { key[0] = BOX1 (((w0 >> 0) & 0xff), c_ascii_to_ebcdic_pc) << 0 | BOX1 (((w0 >> 8) & 0xff), c_ascii_to_ebcdic_pc) << 8 | BOX1 (((w0 >> 16) & 0xff), c_ascii_to_ebcdic_pc) << 16 | BOX1 (((w0 >> 24) & 0xff), c_ascii_to_ebcdic_pc) << 24; key[1] = BOX1 (((w1 >> 0) & 0xff), c_ascii_to_ebcdic_pc) << 0 | BOX1 (((w1 >> 8) & 0xff), c_ascii_to_ebcdic_pc) << 8 | BOX1 (((w1 >> 16) & 0xff), c_ascii_to_ebcdic_pc) << 16 | BOX1 (((w1 >> 24) & 0xff), c_ascii_to_ebcdic_pc) << 24; } __kernel void m08500_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * 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]; /** * main */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); /** * RACF */ u32 key[2]; transform_racf_key (tmp.i[0], tmp.i[1], key); const u32 c = key[0]; const u32 d = key[1]; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32 data[2]; data[0] = salt_buf0[0]; data[1] = salt_buf0[1]; u32 iv[2]; _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); u32 z = 0; COMPARE_M_SIMD (iv[0], iv[1], z, z); } } __kernel void m08500_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * 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], 0, 0 }; /** * main */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); /** * RACF */ u32 key[2]; transform_racf_key (tmp.i[0], tmp.i[1], key); const u32 c = key[0]; const u32 d = key[1]; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32 data[2]; data[0] = salt_buf0[0]; data[1] = salt_buf0[1]; u32 iv[2]; _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); u32 z = 0; COMPARE_S_SIMD (iv[0], iv[1], z, z); } } hashcat-4.0.1/OpenCL/m08500_a1.cl000066400000000000000000000735651320027462700160240ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #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 u32a c_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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif #if VECT_SIZE == 1 #define BOX1(i,S) (S)[(i)] #elif VECT_SIZE == 2 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1]) #elif VECT_SIZE == 4 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) #elif VECT_SIZE == 8 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7]) #elif VECT_SIZE == 16 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7], (S)[(i).s8], (S)[(i).s9], (S)[(i).sa], (S)[(i).sb], (S)[(i).sc], (S)[(i).sd], (S)[(i).se], (S)[(i).sf]) #endif void _des_crypt_encrypt (u32 iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64]) { u32 r = data[0]; u32 l = data[1]; #ifdef _unroll #pragma unroll #endif for (u32 i = 0; i < 16; i += 2) { u32 u; u32 t; u = Kc[i + 0] ^ r; t = Kd[i + 0] ^ 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); u = Kc[i + 1] ^ l; t = Kd[i + 1] ^ rotl32 (l, 28u); r ^= 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); } iv[0] = l; iv[1] = r; } void _des_crypt_keysetup (u32 c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[64]) { u32 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; #ifdef _unroll #pragma unroll #endif 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 u32 c00 = (c >> 0) & 0x0000003f; const u32 c06 = (c >> 6) & 0x00383003; const u32 c07 = (c >> 7) & 0x0000003c; const u32 c13 = (c >> 13) & 0x0000060f; const u32 c20 = (c >> 20) & 0x00000001; u32 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 u32 d00 = (d >> 0) & 0x00003c3f; const u32 d07 = (d >> 7) & 0x00003f03; const u32 d21 = (d >> 21) & 0x0000000f; const u32 d22 = (d >> 22) & 0x00000030; u32 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)); Kc[i] = rotl32 (Kc[i], 2u); Kd[i] = rotl32 (Kd[i], 2u); } } void transform_racf_key (const u32 w0, const u32x w1, u32x key[2]) { key[0] = BOX1 (((w0 >> 0) & 0xff), c_ascii_to_ebcdic_pc) << 0 | BOX1 (((w0 >> 8) & 0xff), c_ascii_to_ebcdic_pc) << 8 | BOX1 (((w0 >> 16) & 0xff), c_ascii_to_ebcdic_pc) << 16 | BOX1 (((w0 >> 24) & 0xff), c_ascii_to_ebcdic_pc) << 24; key[1] = BOX1 (((w1 >> 0) & 0xff), c_ascii_to_ebcdic_pc) << 0 | BOX1 (((w1 >> 8) & 0xff), c_ascii_to_ebcdic_pc) << 8 | BOX1 (((w1 >> 16) & 0xff), c_ascii_to_ebcdic_pc) << 16 | BOX1 (((w1 >> 24) & 0xff), c_ascii_to_ebcdic_pc) << 24; } __kernel void m08500_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = 0; pw_buf0[3] = 0; pw_buf1[0] = 0; pw_buf1[1] = 0; pw_buf1[2] = 0; pw_buf1[3] = 0; const u32 pw_l_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]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32 pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32 wordl0[4] = { 0 }; u32 wordl1[4] = { 0 }; u32 wordl2[4] = { 0 }; u32 wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32 wordr0[4] = { 0 }; u32 wordr1[4] = { 0 }; u32 wordr2[4] = { 0 }; u32 wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32 w0[2]; w0[0] = wordl0[0] | wordr0[0]; w0[1] = wordl0[1] | wordr0[1]; /** * RACF */ u32 key[2]; transform_racf_key (w0[0], w0[1], key); const u32 c = key[0]; const u32 d = key[1]; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32 data[2]; data[0] = salt_buf0[0]; data[1] = salt_buf0[1]; u32 iv[2]; _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); u32 z = 0; COMPARE_M_SIMD (iv[0], iv[1], z, z); } } __kernel void m08500_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = 0; pw_buf0[3] = 0; pw_buf1[0] = 0; pw_buf1[1] = 0; pw_buf1[2] = 0; pw_buf1[3] = 0; const u32 pw_l_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]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_buf[digests_offset].digest_buf[DGST_R1], 0, 0 }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32 pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32 wordl0[4] = { 0 }; u32 wordl1[4] = { 0 }; u32 wordl2[4] = { 0 }; u32 wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32 wordr0[4] = { 0 }; u32 wordr1[4] = { 0 }; u32 wordr2[4] = { 0 }; u32 wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32 w0[2]; w0[0] = wordl0[0] | wordr0[0]; w0[1] = wordl0[1] | wordr0[1]; /** * RACF */ u32 key[2]; transform_racf_key (w0[0], w0[1], key); const u32 c = key[0]; const u32 d = key[1]; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32 data[2]; data[0] = salt_buf0[0]; data[1] = salt_buf0[1]; u32 iv[2]; _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); u32 z = 0; COMPARE_S_SIMD (iv[0], iv[1], z, z); } } hashcat-4.0.1/OpenCL/m08500_a3.cl000066400000000000000000000755501320027462700160220ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #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 u32a c_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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif #if VECT_SIZE == 1 #define BOX1(i,S) (S)[(i)] #elif VECT_SIZE == 2 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1]) #elif VECT_SIZE == 4 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) #elif VECT_SIZE == 8 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7]) #elif VECT_SIZE == 16 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7], (S)[(i).s8], (S)[(i).s9], (S)[(i).sa], (S)[(i).sb], (S)[(i).sc], (S)[(i).sd], (S)[(i).se], (S)[(i).sf]) #endif void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64]) { u32x r = data[0]; u32x l = data[1]; #ifdef _unroll #pragma unroll #endif 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 ^= 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); u = Kc[i + 1] ^ l; t = Kd[i + 1] ^ rotl32 (l, 28u); r ^= 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); } iv[0] = l; iv[1] = r; } void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[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; #ifdef _unroll #pragma unroll #endif 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); Kc[i] = ((t << 16) | (s & 0x0000ffff)); Kd[i] = ((s >> 16) | (t & 0xffff0000)); Kc[i] = rotl32 (Kc[i], 2u); Kd[i] = rotl32 (Kd[i], 2u); } } void transform_racf_key (const u32x w0, const u32x w1, u32x key[2]) { key[0] = BOX1 (((w0 >> 0) & 0xff), c_ascii_to_ebcdic_pc) << 0 | BOX1 (((w0 >> 8) & 0xff), c_ascii_to_ebcdic_pc) << 8 | BOX1 (((w0 >> 16) & 0xff), c_ascii_to_ebcdic_pc) << 16 | BOX1 (((w0 >> 24) & 0xff), c_ascii_to_ebcdic_pc) << 24; key[1] = BOX1 (((w1 >> 0) & 0xff), c_ascii_to_ebcdic_pc) << 0 | BOX1 (((w1 >> 8) & 0xff), c_ascii_to_ebcdic_pc) << 8 | BOX1 (((w1 >> 16) & 0xff), c_ascii_to_ebcdic_pc) << 16 | BOX1 (((w1 >> 24) & 0xff), c_ascii_to_ebcdic_pc) << 24; } void m08500m (__local u32 (*s_SPtrans)[64], __local u32 (*s_skb)[64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w[0]; u32 w1 = w[1]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; /** * RACF */ 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); u32x z = 0; COMPARE_M_SIMD (iv[0], iv[1], z, z); } } void m08500s (__local u32 (*s_SPtrans)[64], __local u32 (*s_skb)[64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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], 0, 0 }; /** * loop */ u32 w0l = w[0]; u32 w1 = w[1]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; /** * RACF */ 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); u32x z = 0; COMPARE_S_SIMD (iv[0], iv[1], z, z); } } __kernel void m08500_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ 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; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m08500_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ 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; /** * 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m08600_a0.cl000066400000000000000000000256231320027462700160140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //incompatible //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_simd.cl" __constant u32a 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, }; #if VECT_SIZE == 1 #define BOX1(S,i) (S)[(i)] #elif VECT_SIZE == 2 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1]) #elif VECT_SIZE == 4 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) #elif VECT_SIZE == 8 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7]) #elif VECT_SIZE == 16 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7], (S)[(i).s8], (S)[(i).s9], (S)[(i).sa], (S)[(i).sb], (S)[(i).sc], (S)[(i).sd], (S)[(i).se], (S)[(i).sf]) #endif void lotus_mix (u32 *in, __local u32 *s_lotus_magic_table) { u32 p = 0; for (int i = 0; i < 18; i++) { u32 s = 48; for (int j = 0; j < 12; j++) { u32 tmp_in = in[j]; u32 tmp_out = 0; p = (p + s--) & 0xff; p = ((tmp_in >> 0) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 0; p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 8; p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 16; p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 24; in[j] = tmp_out; } } } void lotus_transform_password (const u32 in[4], u32x out[4], __local u32 *s_lotus_magic_table) { u32 t = out[3] >> 24; u32 c; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 4; i++) { t ^= (in[i] >> 0) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); t ^= (in[i] >> 8) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); t ^= (in[i] >> 16) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); t ^= (in[i] >> 24) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); } } 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; } } void mdtransform_norecalc (u32 state[4], const u32x block[4], __local u32 *s_lotus_magic_table) { u32 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]; } void mdtransform (u32 state[4], u32x checksum[4], const u32x block[4], __local u32 *s_lotus_magic_table) { mdtransform_norecalc (state, block, s_lotus_magic_table); lotus_transform_password (block, checksum, s_lotus_magic_table); } void domino_big_md (const u32 saved_key[4], const u32 size, u32x state[4], __local u32 *s_lotus_magic_table) { u32 checksum[4]; checksum[0] = 0; checksum[1] = 0; checksum[2] = 0; checksum[3] = 0; mdtransform (state, checksum, saved_key, s_lotus_magic_table); mdtransform_norecalc (state, checksum, s_lotus_magic_table); } __kernel void m08600_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_lotus_magic_table[256]; for (u32 i = lid; i < 256; i += lsz) { s_lotus_magic_table[i] = lotus_magic_table[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); /** * domino */ u32 state[4]; state[0] = 0; state[1] = 0; state[2] = 0; state[3] = 0; /** * padding */ pad (tmp.i, tmp.pw_len); domino_big_md (tmp.i, tmp.pw_len, state, s_lotus_magic_table); COMPARE_M_SIMD (state[0], state[1], state[2], state[3]); } } __kernel void m08600_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_lotus_magic_table[256]; for (u32 i = lid; i < 256; i += lsz) { s_lotus_magic_table[i] = lotus_magic_table[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_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 < il_cnt; il_pos += VECT_SIZE) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); /** * domino */ u32 state[4]; state[0] = 0; state[1] = 0; state[2] = 0; state[3] = 0; /** * padding */ pad (tmp.i, tmp.pw_len); domino_big_md (tmp.i, tmp.pw_len, state, s_lotus_magic_table); COMPARE_S_SIMD (state[0], state[1], state[2], state[3]); } } hashcat-4.0.1/OpenCL/m08600_a1.cl000066400000000000000000000340541320027462700160130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //incompatible //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u32a 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, }; #if VECT_SIZE == 1 #define BOX1(S,i) (S)[(i)] #elif VECT_SIZE == 2 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1]) #elif VECT_SIZE == 4 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) #elif VECT_SIZE == 8 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7]) #elif VECT_SIZE == 16 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7], (S)[(i).s8], (S)[(i).s9], (S)[(i).sa], (S)[(i).sb], (S)[(i).sc], (S)[(i).sd], (S)[(i).se], (S)[(i).sf]) #endif void lotus_mix (u32 *in, __local u32 *s_lotus_magic_table) { u32 p = 0; for (int i = 0; i < 18; i++) { u32 s = 48; for (int j = 0; j < 12; j++) { u32 tmp_in = in[j]; u32 tmp_out = 0; p = (p + s--) & 0xff; p = ((tmp_in >> 0) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 0; p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 8; p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 16; p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 24; in[j] = tmp_out; } } } void lotus_transform_password (const u32 in[4], u32x out[4], __local u32 *s_lotus_magic_table) { u32 t = out[3] >> 24; u32 c; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 4; i++) { t ^= (in[i] >> 0) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); t ^= (in[i] >> 8) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); t ^= (in[i] >> 16) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); t ^= (in[i] >> 24) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); } } 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; } } void mdtransform_norecalc (u32 state[4], const u32x block[4], __local u32 *s_lotus_magic_table) { u32 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]; } void mdtransform (u32 state[4], u32x checksum[4], const u32x block[4], __local u32 *s_lotus_magic_table) { mdtransform_norecalc (state, block, s_lotus_magic_table); lotus_transform_password (block, checksum, s_lotus_magic_table); } void domino_big_md (const u32 saved_key[4], const u32 size, u32x state[4], __local u32 *s_lotus_magic_table) { u32 checksum[4]; checksum[0] = 0; checksum[1] = 0; checksum[2] = 0; checksum[3] = 0; mdtransform (state, checksum, saved_key, s_lotus_magic_table); mdtransform_norecalc (state, checksum, s_lotus_magic_table); } __kernel void m08600_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_lotus_magic_table[256]; for (u32 i = lid; i < 256; i += lsz) { s_lotus_magic_table[i] = lotus_magic_table[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32 pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32 wordl0[4] = { 0 }; u32 wordl1[4] = { 0 }; u32 wordl2[4] = { 0 }; u32 wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32 wordr0[4] = { 0 }; u32 wordr1[4] = { 0 }; u32 wordr2[4] = { 0 }; u32 wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (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]; /** * domino */ u32 state[4]; state[0] = 0; state[1] = 0; state[2] = 0; state[3] = 0; /** * padding */ pad (w0, pw_len); domino_big_md (w0, pw_len, state, s_lotus_magic_table); COMPARE_M_SIMD (state[0], state[1], state[2], state[3]); } } __kernel void m08600_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_lotus_magic_table[256]; for (u32 i = lid; i < 256; i += lsz) { s_lotus_magic_table[i] = lotus_magic_table[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32 pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32 pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32 wordl0[4] = { 0 }; u32 wordl1[4] = { 0 }; u32 wordl2[4] = { 0 }; u32 wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32 wordr0[4] = { 0 }; u32 wordr1[4] = { 0 }; u32 wordr2[4] = { 0 }; u32 wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (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]; /** * domino */ u32 state[4]; state[0] = 0; state[1] = 0; state[2] = 0; state[3] = 0; /** * padding */ pad (w0, pw_len); domino_big_md (w0, pw_len, state, s_lotus_magic_table); COMPARE_S_SIMD (state[0], state[1], state[2], state[3]); } } hashcat-4.0.1/OpenCL/m08600_a3.cl000066400000000000000000000355101320027462700160130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u32a 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, }; #if VECT_SIZE == 1 #define BOX1(S,i) (S)[(i)] #elif VECT_SIZE == 2 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1]) #elif VECT_SIZE == 4 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) #elif VECT_SIZE == 8 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7]) #elif VECT_SIZE == 16 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7], (S)[(i).s8], (S)[(i).s9], (S)[(i).sa], (S)[(i).sb], (S)[(i).sc], (S)[(i).sd], (S)[(i).se], (S)[(i).sf]) #endif void lotus_mix (u32x *in, __local u32 *s_lotus_magic_table) { u32x p = 0; for (int i = 0; i < 18; i++) { u32 s = 48; 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) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 0; p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 8; p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 16; p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 24; in[j] = tmp_out; } } } void lotus_transform_password (const u32x in[4], u32x out[4], __local u32 *s_lotus_magic_table) { u32x t = out[3] >> 24; u32x c; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 4; i++) { t ^= (in[i] >> 0) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); t ^= (in[i] >> 8) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); t ^= (in[i] >> 16) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); t ^= (in[i] >> 24) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); } } 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; } } void mdtransform_norecalc (u32x state[4], const u32x block[4], __local u32 *s_lotus_magic_table) { 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]; } void mdtransform (u32x state[4], u32x checksum[4], const u32x block[4], __local u32 *s_lotus_magic_table) { mdtransform_norecalc (state, block, s_lotus_magic_table); lotus_transform_password (block, checksum, s_lotus_magic_table); } void domino_big_md (const u32x saved_key[4], const u32 size, u32x state[4], __local u32 *s_lotus_magic_table) { u32x checksum[4]; checksum[0] = 0; checksum[1] = 0; checksum[2] = 0; checksum[3] = 0; mdtransform (state, checksum, saved_key, s_lotus_magic_table); mdtransform_norecalc (state, checksum, s_lotus_magic_table); } void m08600m (__local u32 *s_lotus_magic_table, u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ pad (&w[ 0], pw_len); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; u32x w_t[4]; w_t[0] = w0lr; w_t[1] = w[ 1]; w_t[2] = w[ 2]; w_t[3] = w[ 3]; u32x state[4]; state[0] = 0; state[1] = 0; state[2] = 0; state[3] = 0; domino_big_md (w_t, pw_len, state, s_lotus_magic_table); COMPARE_M_SIMD (state[0], state[1], state[2], state[3]); } } void m08600s (__local u32 *s_lotus_magic_table, u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ pad (&w[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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; u32x w_t[4]; w_t[0] = w0lr; w_t[1] = w[ 1]; w_t[2] = w[ 2]; w_t[3] = w[ 3]; u32x state[4]; state[0] = 0; state[1] = 0; state[2] = 0; state[3] = 0; domino_big_md (w_t, pw_len, state, s_lotus_magic_table); COMPARE_S_SIMD (state[0], state[1], state[2], state[3]); } } __kernel void m08600_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_lotus_magic_table[256]; for (u32 i = lid; i < 256; i += lsz) { s_lotus_magic_table[i] = lotus_magic_table[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m08600_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_lotus_magic_table[256]; for (u32 i = lid; i < 256; i += lsz) { s_lotus_magic_table[i] = lotus_magic_table[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m08700_a0-optimized.cl000066400000000000000000000555371320027462700200260ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //incompatible //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __constant u32a 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, }; #if VECT_SIZE == 1 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif #if VECT_SIZE == 1 #define BOX1(S,i) (S)[(i)] #elif VECT_SIZE == 2 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1]) #elif VECT_SIZE == 4 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) #elif VECT_SIZE == 8 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7]) #elif VECT_SIZE == 16 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7], (S)[(i).s8], (S)[(i).s9], (S)[(i).sa], (S)[(i).sb], (S)[(i).sc], (S)[(i).sd], (S)[(i).se], (S)[(i).sf]) #endif void lotus_mix (u32x *in, __local u32 *s_lotus_magic_table) { u32x p = 0; for (int i = 0; i < 18; i++) { u32 s = 48; 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) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 0; p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 8; p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 16; p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 24; in[j] = tmp_out; } } } void lotus_transform_password (u32x in[4], u32x out[4], __local u32 *s_lotus_magic_table) { u32x t = out[3] >> 24; u32x c; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 4; i++) { t ^= (in[i] >> 0) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); t ^= (in[i] >> 8) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); t ^= (in[i] >> 16) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); t ^= (in[i] >> 24) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); } } 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; } } void mdtransform_norecalc (u32x state[4], u32x block[4], __local u32 *s_lotus_magic_table) { 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]; } void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], __local u32 *s_lotus_magic_table) { mdtransform_norecalc (state, block, s_lotus_magic_table); lotus_transform_password (block, checksum, s_lotus_magic_table); } void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], __local u32 *s_lotus_magic_table) { 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 m08700_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_lotus_magic_table[256]; for (u32 i = lid; i < 256; i += lsz) { s_lotus_magic_table[i] = lotus_magic_table[i]; } __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * domino */ 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 (out_len < 16) { pad (&w[ 0], out_len & 0xf); } else if (out_len < 32) { pad (&w[ 4], out_len & 0xf); } else if (out_len < 48) { pad (&w[ 8], out_len & 0xf); } else if (out_len < 64) { pad (&w[12], out_len & 0xf); } domino_big_md (w, out_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; COMPARE_M_SIMD (a, b, c, d); } } __kernel void m08700_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08700_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08700_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_lotus_magic_table[256]; for (u32 i = lid; i < 256; i += lsz) { s_lotus_magic_table[i] = lotus_magic_table[i]; } __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * domino */ 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 (out_len < 16) { pad (&w[ 0], out_len & 0xf); } else if (out_len < 32) { pad (&w[ 4], out_len & 0xf); } else if (out_len < 48) { pad (&w[ 8], out_len & 0xf); } else if (out_len < 64) { pad (&w[12], out_len & 0xf); } domino_big_md (w, out_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; COMPARE_S_SIMD (a, b, c, d); } } __kernel void m08700_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08700_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m08700_a1-optimized.cl000066400000000000000000000642141320027462700200170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //incompatible //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u32a 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, }; #if VECT_SIZE == 1 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif #if VECT_SIZE == 1 #define BOX1(S,i) (S)[(i)] #elif VECT_SIZE == 2 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1]) #elif VECT_SIZE == 4 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) #elif VECT_SIZE == 8 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7]) #elif VECT_SIZE == 16 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7], (S)[(i).s8], (S)[(i).s9], (S)[(i).sa], (S)[(i).sb], (S)[(i).sc], (S)[(i).sd], (S)[(i).se], (S)[(i).sf]) #endif void lotus_mix (u32x *in, __local u32 *s_lotus_magic_table) { u32x p = 0; for (int i = 0; i < 18; i++) { u32 s = 48; 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) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 0; p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 8; p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 16; p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 24; in[j] = tmp_out; } } } void lotus_transform_password (u32x in[4], u32x out[4], __local u32 *s_lotus_magic_table) { u32x t = out[3] >> 24; u32x c; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 4; i++) { t ^= (in[i] >> 0) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); t ^= (in[i] >> 8) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); t ^= (in[i] >> 16) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); t ^= (in[i] >> 24) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); } } 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; } } void mdtransform_norecalc (u32x state[4], u32x block[4], __local u32 *s_lotus_magic_table) { 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]; } void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], __local u32 *s_lotus_magic_table) { mdtransform_norecalc (state, block, s_lotus_magic_table); lotus_transform_password (block, checksum, s_lotus_magic_table); } void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], __local u32 *s_lotus_magic_table) { 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 m08700_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_lotus_magic_table[256]; for (u32 i = lid; i < 256; i += lsz) { s_lotus_magic_table[i] = lotus_magic_table[i]; } __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * domino */ 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; COMPARE_M_SIMD (a, b, c, d); } } __kernel void m08700_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08700_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08700_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_lotus_magic_table[256]; for (u32 i = lid; i < 256; i += lsz) { s_lotus_magic_table[i] = lotus_magic_table[i]; } __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * domino */ 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; COMPARE_S_SIMD (a, b, c, d); } } __kernel void m08700_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m08700_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m08700_a3-optimized.cl000066400000000000000000001006521320027462700200160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u32a 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, }; #define BOX(S,i) (S)[(i)] #if VECT_SIZE == 1 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif #if VECT_SIZE == 1 #define BOX1(S,i) (S)[(i)] #elif VECT_SIZE == 2 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1]) #elif VECT_SIZE == 4 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) #elif VECT_SIZE == 8 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7]) #elif VECT_SIZE == 16 #define BOX1(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7], (S)[(i).s8], (S)[(i).s9], (S)[(i).sa], (S)[(i).sb], (S)[(i).sc], (S)[(i).sd], (S)[(i).se], (S)[(i).sf]) #endif void lotus_mix (u32x *in, __local u32 *s_lotus_magic_table) { u32x p = 0; for (int i = 0; i < 18; i++) { u32 s = 48; 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) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 0; p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 8; p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 16; p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= p << 24; in[j] = tmp_out; } } } void lotus_transform_password (u32x in[4], u32x out[4], __local u32 *s_lotus_magic_table) { u32x t = out[3] >> 24; u32x c; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 4; i++) { t ^= (in[i] >> 0) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); t ^= (in[i] >> 8) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); t ^= (in[i] >> 16) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); t ^= (in[i] >> 24) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); } } 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; } } void mdtransform_norecalc (u32x state[4], u32x block[4], __local u32 *s_lotus_magic_table) { 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]; } void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], __local u32 *s_lotus_magic_table) { mdtransform_norecalc (state, block, s_lotus_magic_table); lotus_transform_password (block, checksum, s_lotus_magic_table); } void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], __local u32 *s_lotus_magic_table) { 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); } void m08700m (__local u32 *s_lotus_magic_table, __local u32 *l_bin2asc, u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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; /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; /** * domino */ 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 u32x 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; COMPARE_M_SIMD (a, b, c, d); } } void m08700s (__local u32 *s_lotus_magic_table, __local u32 *l_bin2asc, u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; /** * domino */ 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 u32x 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; COMPARE_S_SIMD (a, b, c, d); } } __kernel void m08700_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_lotus_magic_table[256]; for (u32 i = lid; i < 256; i += lsz) { s_lotus_magic_table[i] = lotus_magic_table[i]; } __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m08700_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_lotus_magic_table[256]; for (u32 i = lid; i < 256; i += lsz) { s_lotus_magic_table[i] = lotus_magic_table[i]; } __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m08700_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_lotus_magic_table[256]; for (u32 i = lid; i < 256; i += lsz) { s_lotus_magic_table[i] = lotus_magic_table[i]; } __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m08700_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_lotus_magic_table[256]; for (u32 i = lid; i < 256; i += lsz) { s_lotus_magic_table[i] = lotus_magic_table[i]; } __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m08700_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_lotus_magic_table[256]; for (u32 i = lid; i < 256; i += lsz) { s_lotus_magic_table[i] = lotus_magic_table[i]; } __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m08700_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_lotus_magic_table[256]; for (u32 i = lid; i < 256; i += lsz) { s_lotus_magic_table[i] = lotus_magic_table[i]; } __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m08800.cl000066400000000000000000000334101320027462700154270ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #include "inc_hash_sha256.cl" #include "inc_cipher_aes.cl" void hmac_sha1_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m08800_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global androidfde_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const androidfde_t *androidfde_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha1_hmac_ctx_t sha1_hmac_ctx; sha1_hmac_init_global_swap (&sha1_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha1_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha1_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha1_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha1_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha1_hmac_ctx.ipad.h[4]; tmps[gid].opad[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha1_hmac_ctx.opad.h[4]; sha1_hmac_update_global_swap (&sha1_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 8; i += 5, j += 1) { sha1_hmac_ctx_t sha1_hmac_ctx2 = sha1_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha1_hmac_update_64 (&sha1_hmac_ctx2, w0, w1, w2, w3, 4); sha1_hmac_final (&sha1_hmac_ctx2); tmps[gid].dgst[i + 0] = sha1_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha1_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha1_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha1_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha1_hmac_ctx2.opad.h[4]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; } } __kernel void m08800_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global androidfde_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const androidfde_t *androidfde_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); for (u32 i = 0; i < 8; i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); } } __kernel void m08800_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global androidfde_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const androidfde_t *androidfde_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; /** * aes */ u32 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]; #define KEYLEN 60 u32 ks[KEYLEN]; AES128_set_decrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); u32 data[4]; 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]; u32 out[4]; AES128_decrypt (ks, data, out, s_td0, s_td1, s_td2, s_td3, s_td4); u32 iv[4]; iv[0] = tmps[gid].out[4]; iv[1] = tmps[gid].out[5]; iv[2] = tmps[gid].out[6]; iv[3] = tmps[gid].out[7]; const u32 a = out[0] ^ iv[0]; const u32 b = out[1] ^ iv[1]; const u32 c = out[2] ^ iv[2]; const u32 d = out[3] ^ iv[3]; // check for FAT { sha256_ctx_t ctx; sha256_init (&ctx); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = a; w0[1] = b; w0[2] = c; w0[3] = d; 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; sha256_update_64 (&ctx, w0, w1, w2, w3, 16); sha256_final (&ctx); u32 essivhash[8]; essivhash[0] = ctx.h[0]; essivhash[1] = ctx.h[1]; essivhash[2] = ctx.h[2]; essivhash[3] = ctx.h[3]; essivhash[4] = ctx.h[4]; essivhash[5] = ctx.h[5]; essivhash[6] = ctx.h[6]; essivhash[7] = ctx.h[7]; // 2. generate essiv based on startsector -- each 512 byte is one sector AES256_set_encrypt_key (ks, essivhash, s_te0, s_te1, s_te2, s_te3, s_te4); data[0] = 0; data[1] = 0; data[2] = 0; data[3] = 0; u32 essiv[4]; AES256_encrypt (ks, data, essiv, s_te0, s_te1, s_te2, s_te3, s_te4); // 3. decrypt real data, xor essiv afterwards data[0] = androidfde_bufs[digests_offset].data[0]; data[1] = androidfde_bufs[digests_offset].data[1]; data[2] = androidfde_bufs[digests_offset].data[2]; data[3] = androidfde_bufs[digests_offset].data[3]; iv[0] = essiv[0]; iv[1] = essiv[1]; iv[2] = essiv[2]; iv[3] = essiv[3]; ukey[0] = a; ukey[1] = b; ukey[2] = c; ukey[3] = d; AES128_set_decrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); AES128_decrypt (ks, data, out, s_td0, s_td1, s_td2, s_td3, s_td4); u32 r0 = out[0] ^ iv[0]; u32 r1 = out[1] ^ iv[1]; u32 r2 = out[2] ^ iv[2]; u32 r3 = out[3] ^ iv[3]; // rotate 3 byte (in fat!) r0 = r1 << 8 | r0 >> 24; r1 = r2 << 8 | r1 >> 24; // MSDOS5.0 if ((r0 == 0x4f44534d) && (r1 == 0x302e3553)) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, 0); } } } // check for extfs { // 3. decrypt real data ukey[0] = a; ukey[1] = b; ukey[2] = c; ukey[3] = d; AES128_set_decrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); u32 r[16]; // 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; for (u32 i = 4; i < 16; i += 4) { data[0] = androidfde_bufs[digests_offset].data[256 + i + 0]; data[1] = androidfde_bufs[digests_offset].data[256 + i + 1]; data[2] = androidfde_bufs[digests_offset].data[256 + i + 2]; data[3] = androidfde_bufs[digests_offset].data[256 + i + 3]; iv[0] = androidfde_bufs[digests_offset].data[256 + i + 0 - 4]; iv[1] = androidfde_bufs[digests_offset].data[256 + i + 1 - 4]; iv[2] = androidfde_bufs[digests_offset].data[256 + i + 2 - 4]; iv[3] = androidfde_bufs[digests_offset].data[256 + i + 3 - 4]; AES128_decrypt (ks, data, out, 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] = swap32_S (r[ 5]); r[ 6] = swap32_S (r[ 6]); r[14] = swap32_S (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)) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, 0); } } } } hashcat-4.0.1/OpenCL/m08900.cl000066400000000000000000000267351320027462700154440ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_sha256.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" uint4 swap32_4 (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 SCRYPT_CNT GET_SCRYPT_CNT (SCRYPT_R, SCRYPT_P) #define SCRYPT_CNT4 (SCRYPT_CNT / 4) #define STATE_CNT GET_STATE_CNT (SCRYPT_R) #define STATE_CNT4 (STATE_CNT / 4) #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; \ } void salsa_r (uint4 *TI) { uint4 R0 = TI[STATE_CNT4 - 4]; uint4 R1 = TI[STATE_CNT4 - 3]; uint4 R2 = TI[STATE_CNT4 - 2]; uint4 R3 = TI[STATE_CNT4 - 1]; uint4 TO[STATE_CNT4]; int idx_y = 0; int idx_r1 = 0; int idx_r2 = SCRYPT_R * 4; for (int i = 0; i < SCRYPT_R; i++) { uint4 Y0; uint4 Y1; uint4 Y2; uint4 Y3; Y0 = TI[idx_y++]; Y1 = TI[idx_y++]; Y2 = TI[idx_y++]; Y3 = TI[idx_y++]; SALSA20_8_XOR (); TO[idx_r1++] = R0; TO[idx_r1++] = R1; TO[idx_r1++] = R2; TO[idx_r1++] = R3; Y0 = TI[idx_y++]; Y1 = TI[idx_y++]; Y2 = TI[idx_y++]; Y3 = TI[idx_y++]; SALSA20_8_XOR (); TO[idx_r2++] = R0; TO[idx_r2++] = R1; TO[idx_r2++] = R2; TO[idx_r2++] = R3; } #pragma unroll for (int i = 0; i < STATE_CNT4; i++) { TI[i] = TO[i]; } } void scrypt_smix (uint4 *X, uint4 *T, __global uint4 *V0, __global uint4 *V1, __global uint4 *V2, __global uint4 *V3) { #define Coord(xd4,y,z) (((xd4) * ySIZE * zSIZE) + ((y) * zSIZE) + (z)) #define CO Coord(xd4,y,z) const u32 ySIZE = SCRYPT_N / SCRYPT_TMTO; const u32 zSIZE = STATE_CNT4; const u32 x = get_global_id (0); const u32 xd4 = x / 4; const u32 xm4 = x & 3; __global uint4 *V; switch (xm4) { case 0: V = V0; break; case 1: V = V1; break; case 2: V = V2; break; case 3: V = V3; break; } #ifdef _unroll #pragma unroll #endif 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 < SCRYPT_TMTO; i++) salsa_r (X); } for (u32 i = 0; i < SCRYPT_N; i++) { const u32 k = X[zSIZE - 4].x & (SCRYPT_N - 1); const u32 y = k / SCRYPT_TMTO; const u32 km = k - (y * SCRYPT_TMTO); for (u32 z = 0; z < zSIZE; z++) T[z] = V[CO]; for (u32 i = 0; i < km; i++) salsa_r (T); for (u32 z = 0; z < zSIZE; z++) X[z] ^= T[z]; salsa_r (X); } #ifdef _unroll #pragma unroll #endif 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 m08900_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global scrypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global uint4 *d_scryptV0_buf, __global uint4 *d_scryptV1_buf, __global uint4 *d_scryptV2_buf, __global uint4 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha256_hmac_ctx_t sha256_hmac_ctx; sha256_hmac_init_global_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); sha256_hmac_update_global_swap (&sha256_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1, k = 0; i < SCRYPT_CNT; i += 8, j += 1, k += 2) { sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); sha256_hmac_final (&sha256_hmac_ctx2); u32 digest[8]; digest[0] = sha256_hmac_ctx2.opad.h[0]; digest[1] = sha256_hmac_ctx2.opad.h[1]; digest[2] = sha256_hmac_ctx2.opad.h[2]; digest[3] = sha256_hmac_ctx2.opad.h[3]; digest[4] = sha256_hmac_ctx2.opad.h[4]; digest[5] = sha256_hmac_ctx2.opad.h[5]; digest[6] = sha256_hmac_ctx2.opad.h[6]; digest[7] = sha256_hmac_ctx2.opad.h[7]; const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]); const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]); tmps[gid].P[k + 0] = tmp0; tmps[gid].P[k + 1] = tmp1; } } __kernel void m08900_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global scrypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global uint4 *d_scryptV0_buf, __global uint4 *d_scryptV1_buf, __global uint4 *d_scryptV2_buf, __global uint4 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; uint4 X[STATE_CNT4]; uint4 T[STATE_CNT4]; #ifdef _unroll #pragma unroll #endif for (int z = 0; z < STATE_CNT4; z++) X[z] = swap32_4 (tmps[gid].P[z]); scrypt_smix (X, T, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf); #ifdef _unroll #pragma unroll #endif for (int z = 0; z < STATE_CNT4; z++) tmps[gid].P[z] = swap32_4 (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] = swap32_4 (tmps[gid].P[i + z]); scrypt_smix (X, T, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf); for (int z = 0; z < STATE_CNT4; z++) tmps[gid].P[i + z] = swap32_4 (X[z]); } #endif } __kernel void m08900_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global scrypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global uint4 *d_scryptV0_buf, __global uint4 *d_scryptV1_buf, __global uint4 *d_scryptV2_buf, __global uint4 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; /** * 2nd pbkdf2, creates B */ u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; sha256_hmac_ctx_t ctx; sha256_hmac_init_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); for (u32 l = 0; l < SCRYPT_CNT4; l += 4) { 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_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); } w0[0] = 1; 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] = 0; sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 4); sha256_hmac_final (&ctx); const u32 r0 = swap32 (ctx.opad.h[DGST_R0]); const u32 r1 = swap32 (ctx.opad.h[DGST_R1]); const u32 r2 = swap32 (ctx.opad.h[DGST_R2]); const u32 r3 = swap32 (ctx.opad.h[DGST_R3]); #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m09000.cl000066400000000000000000000757211320027462700154330ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" // http://www.schneier.com/code/constants.txt __constant u32a 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 u32a 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 u32a 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 u32a 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 u32a c_pbox[18] = { 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b }; #ifdef IS_AMD #define BF_ROUND(L,R,N) \ { \ uchar4 c = as_uchar4 ((L)); \ \ u32 tmp; \ \ tmp = S0[c.s3]; \ tmp += S1[c.s2]; \ tmp ^= S2[c.s1]; \ tmp += S3[c.s0]; \ \ (R) ^= tmp ^ P[(N)]; \ } #endif #ifdef IS_NV #define BF_ROUND(L,R,N) \ { \ u32 tmp; \ \ tmp = S0[__bfe_S ((L), 24, 8)]; \ tmp += S1[__bfe_S ((L), 16, 8)]; \ tmp ^= S2[__bfe_S ((L), 8, 8)]; \ tmp += S3[__bfe_S ((L), 0, 8)]; \ \ (R) ^= tmp ^ P[(N)]; \ } #endif #ifdef IS_GENERIC #define BF_ROUND(L,R,N) \ { \ uchar4 c = as_uchar4 ((L)); \ \ u32 tmp; \ \ tmp = S0[c.s3]; \ tmp += S1[c.s2]; \ tmp ^= S2[c.s1]; \ tmp += S3[c.s0]; \ \ (R) ^= tmp ^ P[(N)]; \ } #endif #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); \ \ u32 tmp; \ \ tmp = R; \ R = L; \ L = tmp; \ \ L ^= P[17]; \ } void sha1_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[5]) { u32 A = digest[0]; u32 B = digest[1]; u32 C = digest[2]; u32 D = digest[3]; u32 E = digest[4]; u32 w0_t = w0[0]; u32 w1_t = w0[1]; u32 w2_t = w0[2]; u32 w3_t = w0[3]; u32 w4_t = w1[0]; u32 w5_t = w1[1]; u32 w6_t = w1[2]; u32 w7_t = w1[3]; u32 w8_t = w2[0]; u32 w9_t = w2[1]; u32 wa_t = w2[2]; u32 wb_t = w2[3]; u32 wc_t = w3[0]; u32 wd_t = w3[1]; u32 we_t = w3[2]; u32 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 m09000_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pwsafe2_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_4x4 (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] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); const u32 block_len = salt_len + 2 + pw_len; w3[2] = 0; w3[3] = block_len * 8; 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); /** * blowfish setkey */ u32 P[18]; for (u32 i = 0; i < 18; i++) { P[i] = c_pbox[i]; } __local u32 S0_all[8][256]; __local u32 S1_all[8][256]; __local u32 S2_all[8][256]; __local u32 S3_all[8][256]; __local u32 *S0 = S0_all[lid]; __local u32 *S1 = S1_all[lid]; __local u32 *S2 = S2_all[lid]; __local u32 *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 m09000_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pwsafe2_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); // load u32 digest[2]; digest[0] = tmps[gid].digest[0]; digest[1] = tmps[gid].digest[1]; u32 P[18]; #pragma unroll for (u32 i = 0; i < 18; i++) { P[i] = tmps[gid].P[i]; } __local u32 S0_all[8][256]; __local u32 S1_all[8][256]; __local u32 S2_all[8][256]; __local u32 S3_all[8][256]; __local u32 *S0 = S0_all[lid]; __local u32 *S1 = S1_all[lid]; __local u32 *S2 = S2_all[lid]; __local u32 *S3 = S3_all[lid]; #pragma unroll 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 u32 L0 = digest[0]; u32 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 m09000_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pwsafe2_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); // load u32 digest[2]; digest[0] = tmps[gid].digest[0]; digest[1] = tmps[gid].digest[1]; // final sha1 u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = swap32 (digest[0]); w0[1] = swap32 (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; u32 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 u32 r0 = out[0]; const u32 r1 = out[1]; const u32 r2 = out[2]; const u32 r3 = out[3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m09100.cl000066400000000000000000000544271320027462700154340ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" // breaks if used with u8a on AMDGPU-PRO __constant u8 lotus64_table[64] = { '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', '+', '/', }; // break if used with u8 on NVidia driver 378.x __constant u8a 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, }; #define uint_to_hex_upper8(i) l_bin2asc[(i)] #define BOX1(S,i) (S)[(i)] void lotus_mix (u32 *in, const __local u8 *s_lotus_magic_table) { u8 p = 0; for (int i = 0; i < 18; i++) { u8 s = 48; for (int j = 0; j < 12; j++) { u32 tmp_in = in[j]; u32 tmp_out = 0; p = (p + s--); p = (u8) (tmp_in >> 0) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= (u32) p << 0; p = (p + s--); p = (u8) (tmp_in >> 8) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= (u32) p << 8; p = (p + s--); p = (u8) (tmp_in >> 16) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= (u32) p << 16; p = (p + s--); p = (u8) (tmp_in >> 24) ^ BOX1 (s_lotus_magic_table, p); tmp_out |= (u32) p << 24; in[j] = tmp_out; } } } void lotus_transform_password (const u32 in[4], u32 out[4], const __local u8 *s_lotus_magic_table) { u8 t = (u8) (out[3] >> 24); u8 c; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 4; i++) { t ^= (u8) (in[i] >> 0); c = BOX1 (s_lotus_magic_table, t); out[i] ^= (u32) c << 0; t = (u8) (out[i] >> 0); t ^= (u8) (in[i] >> 8); c = BOX1 (s_lotus_magic_table, t); out[i] ^= (u32) c << 8; t = (u8) (out[i] >> 8); t ^= (u8) (in[i] >> 16); c = BOX1 (s_lotus_magic_table, t); out[i] ^= (u32) c << 16; t = (u8) (out[i] >> 16); t ^= (u8) (in[i] >> 24); c = BOX1 (s_lotus_magic_table, t); out[i] ^= (u32) c << 24; t = (u8) (out[i] >> 24); } } 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; } } void mdtransform_norecalc (u32 state[4], const u32 block[4], const __local u8 *s_lotus_magic_table) { u32 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]; } void mdtransform (u32 state[4], u32 checksum[4], const u32 block[4], const __local u8 *s_lotus_magic_table) { mdtransform_norecalc (state, block, s_lotus_magic_table); lotus_transform_password (block, checksum, s_lotus_magic_table); } void domino_big_md (const u32 saved_key[16], const u32 size, u32 state[4], const __local u8 *s_lotus_magic_table) { u32 checksum[4]; checksum[0] = 0; checksum[1] = 0; checksum[2] = 0; checksum[3] = 0; u32 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); } 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) { const u8 out_val0 = lotus64_table [ ((in_ptr[0] >> 2) & 0x3f)]; const u8 out_val1 = lotus64_table [((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f)]; const u8 out_val2 = lotus64_table [((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03)]; const u8 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; } } void lotus6_base64_encode (u8 base64_hash[24], const u32 salt0, const u32 salt1, const u32 a, const u32 b, const u32 c) { const uchar4 salt0c = as_uchar4 (salt0); const uchar4 salt1c = as_uchar4 (salt1); const uchar4 ac = as_uchar4 (a); const uchar4 bc = as_uchar4 (b); const uchar4 cc = as_uchar4 (c); 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; 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] = ')'; } void hmac_sha1_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m09100_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global lotus8_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u8 s_lotus_magic_table[256]; for (u32 i = lid; i < 256; i += lsz) { s_lotus_magic_table[i] = lotus_magic_table[i]; } __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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_buf0[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; const u32 salt0 = salt_buf0[0]; const u32 salt1 = (salt_buf0[1] & 0xff) | ('(' << 8); /** * Lotus 6 hash - SEC_pwddigest_V2 */ u32 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]; u32 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 u32 w0_t = uint_to_hex_upper8 ((state[0] >> 0) & 255) << 0 | uint_to_hex_upper8 ((state[0] >> 8) & 255) << 16; const u32 w1_t = uint_to_hex_upper8 ((state[0] >> 16) & 255) << 0 | uint_to_hex_upper8 ((state[0] >> 24) & 255) << 16; const u32 w2_t = uint_to_hex_upper8 ((state[1] >> 0) & 255) << 0 | uint_to_hex_upper8 ((state[1] >> 8) & 255) << 16; const u32 w3_t = uint_to_hex_upper8 ((state[1] >> 16) & 255) << 0 | uint_to_hex_upper8 ((state[1] >> 24) & 255) << 16; const u32 w4_t = uint_to_hex_upper8 ((state[2] >> 0) & 255) << 0 | uint_to_hex_upper8 ((state[2] >> 8) & 255) << 16; const u32 w5_t = uint_to_hex_upper8 ((state[2] >> 16) & 255) << 0 | uint_to_hex_upper8 ((state[2] >> 24) & 255) << 16; const u32 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); u32 a = state[0]; u32 b = state[1]; u32 c = state[2]; /** * Base64 encode */ pw_len = 22; u8 base64_hash[22]; lotus6_base64_encode (base64_hash, salt_buf0[0], salt_buf0[1], a, b, c); /** * PBKDF2 - HMACSHA1 - 1st iteration */ u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[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]; 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; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_hmac_ctx_t sha1_hmac_ctx; sha1_hmac_init_64 (&sha1_hmac_ctx, w0, w1, w2, w3); tmps[gid].ipad[0] = sha1_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha1_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha1_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha1_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha1_hmac_ctx.ipad.h[4]; tmps[gid].opad[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha1_hmac_ctx.opad.h[4]; sha1_hmac_update_global_swap (&sha1_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 2; i += 5, j += 1) { sha1_hmac_ctx_t sha1_hmac_ctx2 = sha1_hmac_ctx; w0[0] = j; 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] = 0; sha1_hmac_update_64 (&sha1_hmac_ctx2, w0, w1, w2, w3, 4); sha1_hmac_final (&sha1_hmac_ctx2); tmps[gid].dgst[i + 0] = sha1_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha1_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha1_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha1_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha1_hmac_ctx2.opad.h[4]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; } } __kernel void m09100_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global lotus8_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); for (u32 i = 0; i < 2; i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); } } __kernel void m09100_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global lotus8_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ const u32 r0 = tmps[gid].out[DGST_R0]; const u32 r1 = tmps[gid].out[DGST_R1]; const u32 r2 = 0; const u32 r3 = 0; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m09400.cl000066400000000000000000000260121320027462700154240ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #include "inc_cipher_aes.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" __kernel void m09400_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global office2007_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global office2007_t *office2007_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_global (&ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_update_global_utf16le_swap (&ctx, pws[gid].i, pws[gid].pw_len); sha1_final (&ctx); tmps[gid].out[0] = ctx.h[0]; tmps[gid].out[1] = ctx.h[1]; tmps[gid].out[2] = ctx.h[2]; tmps[gid].out[3] = ctx.h[3]; tmps[gid].out[4] = ctx.h[4]; } __kernel void m09400_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global office2007_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global office2007_t *office2007_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x t0 = packv (tmps, out, gid, 0); u32x t1 = packv (tmps, out, gid, 1); u32x t2 = packv (tmps, out, gid, 2); u32x t3 = packv (tmps, out, gid, 3); u32x t4 = packv (tmps, out, gid, 4); u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = 0; w0[1] = 0; w0[2] = 0; w0[3] = 0; w1[0] = 0; w1[1] = 0; w1[2] = 0x80000000; 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] = (4 + 20) * 8; for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) { w0[0] = swap32 (j); w0[1] = t0; w0[2] = t1; w0[3] = t2; w1[0] = t3; w1[1] = t4; 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_vector (w0, w1, w2, w3, digest); t0 = digest[0]; t1 = digest[1]; t2 = digest[2]; t3 = digest[3]; t4 = digest[4]; } unpackv (tmps, out, gid, 0, t0); unpackv (tmps, out, gid, 1, t1); unpackv (tmps, out, gid, 2, t2); unpackv (tmps, out, gid, 3, t3); unpackv (tmps, out, gid, 4, t4); } __kernel void m09400_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global office2007_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global office2007_t *office2007_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; /** * base */ u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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] = 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; sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_64 (&ctx, w0, w1, w2, w3, 20 + 4); sha1_final (&ctx); u32 digest_common[5]; digest_common[0] = ctx.h[0]; digest_common[1] = ctx.h[1]; digest_common[2] = ctx.h[2]; digest_common[3] = ctx.h[3]; digest_common[4] = ctx.h[4]; 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; sha1_init (&ctx); sha1_update_64 (&ctx, w0, w1, w2, w3, 64); sha1_final (&ctx); u32 digest_saved[5]; digest_saved[0] = ctx.h[0]; digest_saved[1] = ctx.h[1]; digest_saved[2] = ctx.h[2]; digest_saved[3] = ctx.h[3]; digest_saved[4] = ctx.h[4]; // now we got the AES key, decrypt the verifier u32 ukey[8]; ukey[0] = digest_saved[0]; ukey[1] = digest_saved[1]; ukey[2] = digest_saved[2]; ukey[3] = digest_saved[3]; u32 ks[60]; AES128_set_decrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); u32 verifier[4]; verifier[0] = office2007_bufs[digests_offset].encryptedVerifier[0]; verifier[1] = office2007_bufs[digests_offset].encryptedVerifier[1]; verifier[2] = office2007_bufs[digests_offset].encryptedVerifier[2]; verifier[3] = office2007_bufs[digests_offset].encryptedVerifier[3]; u32 data[4]; data[0] = verifier[0]; data[1] = verifier[1]; data[2] = verifier[2]; data[3] = verifier[3]; u32 out[4]; AES128_decrypt (ks, data, out, 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] = 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; sha1_init (&ctx); sha1_update_64 (&ctx, w0, w1, w2, w3, 16); sha1_final (&ctx); // encrypt it again for verify AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4); data[0] = ctx.h[0]; data[1] = ctx.h[1]; data[2] = ctx.h[2]; data[3] = ctx.h[3]; AES128_encrypt (ks, data, out, s_te0, s_te1, s_te2, s_te3, s_te4); { const u32 r0 = out[0]; const u32 r1 = out[1]; const u32 r2 = out[2]; const u32 r3 = out[3]; #define il_pos 0 #include 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; sha1_init (&ctx); sha1_update_64 (&ctx, w0, w1, w2, w3, 64); sha1_final (&ctx); // now we got the AES key, decrypt the verifier ukey[0] = digest_saved[0]; ukey[1] = digest_saved[1]; ukey[2] = digest_saved[2]; ukey[3] = digest_saved[3]; ukey[4] = digest_saved[4]; ukey[5] = ctx.h[0]; ukey[6] = ctx.h[1]; ukey[7] = ctx.h[2]; AES256_set_decrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); data[0] = verifier[0]; data[1] = verifier[1]; data[2] = verifier[2]; data[3] = verifier[3]; AES256_decrypt (ks, data, out, 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] = 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; sha1_init (&ctx); sha1_update_64 (&ctx, w0, w1, w2, w3, 16); sha1_final (&ctx); // encrypt it again for verify AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4); data[0] = ctx.h[0]; data[1] = ctx.h[1]; data[2] = ctx.h[2]; data[3] = ctx.h[3]; AES256_encrypt (ks, data, out, s_te0, s_te1, s_te2, s_te3, s_te4); { const u32 r0 = out[0]; const u32 r1 = out[1]; const u32 r2 = out[2]; const u32 r3 = out[3]; #define il_pos 0 #include COMPARE_M } } hashcat-4.0.1/OpenCL/m09500.cl000066400000000000000000000227671320027462700154420ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #include "inc_cipher_aes.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" __kernel void m09500_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global office2010_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global office2010_t *office2010_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_global (&ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_update_global_utf16le_swap (&ctx, pws[gid].i, pws[gid].pw_len); sha1_final (&ctx); tmps[gid].out[0] = ctx.h[0]; tmps[gid].out[1] = ctx.h[1]; tmps[gid].out[2] = ctx.h[2]; tmps[gid].out[3] = ctx.h[3]; tmps[gid].out[4] = ctx.h[4]; } __kernel void m09500_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global office2010_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global office2010_t *office2010_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x t0 = packv (tmps, out, gid, 0); u32x t1 = packv (tmps, out, gid, 1); u32x t2 = packv (tmps, out, gid, 2); u32x t3 = packv (tmps, out, gid, 3); u32x t4 = packv (tmps, out, gid, 4); u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = 0; w0[1] = 0; w0[2] = 0; w0[3] = 0; w1[0] = 0; w1[1] = 0; w1[2] = 0x80000000; 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] = (4 + 20) * 8; for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) { w0[0] = swap32 (j); w0[1] = t0; w0[2] = t1; w0[3] = t2; w1[0] = t3; w1[1] = t4; 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_vector (w0, w1, w2, w3, digest); t0 = digest[0]; t1 = digest[1]; t2 = digest[2]; t3 = digest[3]; t4 = digest[4]; } unpackv (tmps, out, gid, 0, t0); unpackv (tmps, out, gid, 1, t1); unpackv (tmps, out, gid, 2, t2); unpackv (tmps, out, gid, 3, t3); unpackv (tmps, out, gid, 4, t4); } __kernel void m09500_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global office2010_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global office2010_t *office2010_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; /** * base */ u32 encryptedVerifierHashInputBlockKey[2] = { 0xfea7d276, 0x3b4b9e79 }; u32 encryptedVerifierHashValueBlockKey[2] = { 0xd7aa0f6d, 0x3061344e }; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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] = 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; sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_64 (&ctx, w0, w1, w2, w3, 20 + 8); sha1_final (&ctx); u32 digest0[4]; digest0[0] = ctx.h[0]; digest0[1] = ctx.h[1]; digest0[2] = ctx.h[2]; digest0[3] = ctx.h[3]; 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] = 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; sha1_init (&ctx); sha1_update_64 (&ctx, w0, w1, w2, w3, 20 + 8); sha1_final (&ctx); u32 digest1[4]; digest1[0] = ctx.h[0]; digest1[1] = ctx.h[1]; digest1[2] = ctx.h[2]; digest1[3] = ctx.h[3]; // now we got the AES key, decrypt the verifier u32 ukey[4]; ukey[0] = digest0[0]; ukey[1] = digest0[1]; ukey[2] = digest0[2]; ukey[3] = digest0[3]; u32 ks[44]; AES128_set_decrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); u32 data[4]; data[0] = office2010_bufs[digests_offset].encryptedVerifier[0]; data[1] = office2010_bufs[digests_offset].encryptedVerifier[1]; data[2] = office2010_bufs[digests_offset].encryptedVerifier[2]; data[3] = office2010_bufs[digests_offset].encryptedVerifier[3]; u32 out[4]; AES128_decrypt (ks, data, out, 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] = 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; sha1_init (&ctx); sha1_update_64 (&ctx, w0, w1, w2, w3, 16); sha1_final (&ctx); u32 digest[4]; digest[0] = ctx.h[0]; digest[1] = ctx.h[1]; digest[2] = ctx.h[2]; digest[3] = ctx.h[3]; // encrypt it again for verify ukey[0] = digest1[0]; ukey[1] = digest1[1]; ukey[2] = digest1[2]; ukey[3] = digest1[3]; AES128_set_encrypt_key (ks, ukey, 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 (ks, data, out, s_te0, s_te1, s_te2, s_te3, s_te4); const u32 r0 = out[0]; const u32 r1 = out[1]; const u32 r2 = out[2]; const u32 r3 = out[3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m09600.cl000066400000000000000000000312101320027462700154220ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" #include "inc_cipher_aes.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" __kernel void m09600_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global office2013_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global office2013_t *office2013_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha512_ctx_t ctx; sha512_init (&ctx); sha512_update_global (&ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha512_update_global_utf16le_swap (&ctx, pws[gid].i, pws[gid].pw_len); sha512_final (&ctx); tmps[gid].out[0] = ctx.h[0]; tmps[gid].out[1] = ctx.h[1]; tmps[gid].out[2] = ctx.h[2]; tmps[gid].out[3] = ctx.h[3]; tmps[gid].out[4] = ctx.h[4]; tmps[gid].out[5] = ctx.h[5]; tmps[gid].out[6] = ctx.h[6]; tmps[gid].out[7] = ctx.h[7]; } __kernel void m09600_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global office2013_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global office2013_t *office2013_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u64x t0 = pack64v (tmps, out, gid, 0); u64x t1 = pack64v (tmps, out, gid, 1); u64x t2 = pack64v (tmps, out, gid, 2); u64x t3 = pack64v (tmps, out, gid, 3); u64x t4 = pack64v (tmps, out, gid, 4); u64x t5 = pack64v (tmps, out, gid, 5); u64x t6 = pack64v (tmps, out, gid, 6); u64x t7 = pack64v (tmps, out, gid, 7); u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; 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] = 0; w3[2] = 0; w3[3] = 0; w4[0] = 0; w4[1] = 0x80000000; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = (4 + 64) * 8; for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) { w0[0] = swap32 (j); w0[1] = h32_from_64 (t0); w0[2] = l32_from_64 (t0); w0[3] = h32_from_64 (t1); w1[0] = l32_from_64 (t1); w1[1] = h32_from_64 (t2); w1[2] = l32_from_64 (t2); w1[3] = h32_from_64 (t3); w2[0] = l32_from_64 (t3); w2[1] = h32_from_64 (t4); w2[2] = l32_from_64 (t4); w2[3] = h32_from_64 (t5); w3[0] = l32_from_64 (t5); w3[1] = h32_from_64 (t6); w3[2] = l32_from_64 (t6); w3[3] = h32_from_64 (t7); w4[0] = l32_from_64 (t7); 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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); t0 = digest[0]; t1 = digest[1]; t2 = digest[2]; t3 = digest[3]; t4 = digest[4]; t5 = digest[5]; t6 = digest[6]; t7 = digest[7]; } unpack64v (tmps, out, gid, 0, t0); unpack64v (tmps, out, gid, 1, t1); unpack64v (tmps, out, gid, 2, t2); unpack64v (tmps, out, gid, 3, t3); unpack64v (tmps, out, gid, 4, t4); unpack64v (tmps, out, gid, 5, t5); unpack64v (tmps, out, gid, 6, t6); unpack64v (tmps, out, gid, 7, t7); } __kernel void m09600_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global office2013_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global office2013_t *office2013_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; /** * base */ u32 encryptedVerifierHashInputBlockKey[2] = { 0xfea7d276, 0x3b4b9e79 }; u32 encryptedVerifierHashValueBlockKey[2] = { 0xd7aa0f6d, 0x3061344e }; u64 tmp[8]; tmp[0] = tmps[gid].out[0]; tmp[1] = tmps[gid].out[1]; tmp[2] = tmps[gid].out[2]; tmp[3] = tmps[gid].out[3]; tmp[4] = tmps[gid].out[4]; tmp[5] = tmps[gid].out[5]; tmp[6] = tmps[gid].out[6]; tmp[7] = tmps[gid].out[7]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; w0[0] = h32_from_64_S (tmp[0]); w0[1] = l32_from_64_S (tmp[0]); w0[2] = h32_from_64_S (tmp[1]); w0[3] = l32_from_64_S (tmp[1]); w1[0] = h32_from_64_S (tmp[2]); w1[1] = l32_from_64_S (tmp[2]); w1[2] = h32_from_64_S (tmp[3]); w1[3] = l32_from_64_S (tmp[3]); w2[0] = h32_from_64_S (tmp[4]); w2[1] = l32_from_64_S (tmp[4]); w2[2] = h32_from_64_S (tmp[5]); w2[3] = l32_from_64_S (tmp[5]); w3[0] = h32_from_64_S (tmp[6]); w3[1] = l32_from_64_S (tmp[6]); w3[2] = h32_from_64_S (tmp[7]); w3[3] = l32_from_64_S (tmp[7]); w4[0] = encryptedVerifierHashInputBlockKey[0]; w4[1] = encryptedVerifierHashInputBlockKey[1]; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_ctx_t ctx; sha512_init (&ctx); sha512_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 + 8); sha512_final (&ctx); u64 digest0[4]; digest0[0] = ctx.h[0]; digest0[1] = ctx.h[1]; digest0[2] = ctx.h[2]; digest0[3] = ctx.h[3]; w0[0] = h32_from_64_S (tmp[0]); w0[1] = l32_from_64_S (tmp[0]); w0[2] = h32_from_64_S (tmp[1]); w0[3] = l32_from_64_S (tmp[1]); w1[0] = h32_from_64_S (tmp[2]); w1[1] = l32_from_64_S (tmp[2]); w1[2] = h32_from_64_S (tmp[3]); w1[3] = l32_from_64_S (tmp[3]); w2[0] = h32_from_64_S (tmp[4]); w2[1] = l32_from_64_S (tmp[4]); w2[2] = h32_from_64_S (tmp[5]); w2[3] = l32_from_64_S (tmp[5]); w3[0] = h32_from_64_S (tmp[6]); w3[1] = l32_from_64_S (tmp[6]); w3[2] = h32_from_64_S (tmp[7]); w3[3] = l32_from_64_S (tmp[7]); w4[0] = encryptedVerifierHashValueBlockKey[0]; w4[1] = encryptedVerifierHashValueBlockKey[1]; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_init (&ctx); sha512_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 + 8); sha512_final (&ctx); u64 digest1[4]; digest1[0] = ctx.h[0]; digest1[1] = ctx.h[1]; digest1[2] = ctx.h[2]; digest1[3] = ctx.h[3]; // now we got the AES key, decrypt the verifier u32 ukey[8]; ukey[0] = h32_from_64_S (digest0[0]); ukey[1] = l32_from_64_S (digest0[0]); ukey[2] = h32_from_64_S (digest0[1]); ukey[3] = l32_from_64_S (digest0[1]); ukey[4] = h32_from_64_S (digest0[2]); ukey[5] = l32_from_64_S (digest0[2]); ukey[6] = h32_from_64_S (digest0[3]); ukey[7] = l32_from_64_S (digest0[3]); u32 ks[60]; AES256_set_decrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); u32 data[4]; data[0] = office2013_bufs[digests_offset].encryptedVerifier[0]; data[1] = office2013_bufs[digests_offset].encryptedVerifier[1]; data[2] = office2013_bufs[digests_offset].encryptedVerifier[2]; data[3] = office2013_bufs[digests_offset].encryptedVerifier[3]; u32 out[4]; AES256_decrypt (ks, data, out, 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 sha512 of the result w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[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; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_init (&ctx); sha512_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 16); sha512_final (&ctx); u64 digest[4]; digest[0] = ctx.h[0]; digest[1] = ctx.h[1]; digest[2] = ctx.h[2]; digest[3] = ctx.h[3]; // encrypt with 2nd key ukey[0] = h32_from_64_S (digest1[0]); ukey[1] = l32_from_64_S (digest1[0]); ukey[2] = h32_from_64_S (digest1[1]); ukey[3] = l32_from_64_S (digest1[1]); ukey[4] = h32_from_64_S (digest1[2]); ukey[5] = l32_from_64_S (digest1[2]); ukey[6] = h32_from_64_S (digest1[3]); ukey[7] = l32_from_64_S (digest1[3]); AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4); data[0] = h32_from_64_S (digest[0]) ^ salt_bufs[salt_pos].salt_buf[0]; data[1] = l32_from_64_S (digest[0]) ^ salt_bufs[salt_pos].salt_buf[1]; data[2] = h32_from_64_S (digest[1]) ^ salt_bufs[salt_pos].salt_buf[2]; data[3] = l32_from_64_S (digest[1]) ^ salt_bufs[salt_pos].salt_buf[3]; AES256_encrypt (ks, data, out, s_te0, s_te1, s_te2, s_te3, s_te4); const u32 r0 = out[0]; const u32 r1 = out[1]; const u32 r2 = out[2]; const u32 r3 = out[3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m09700_a0-optimized.cl000066400000000000000000000557741320027462700200320ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } void gen336 (u32 digest_pre[4], u32 salt_buf[4], u32 digest[4]) { u32 digest_t0[2]; u32 digest_t1[2]; u32 digest_t2[2]; u32 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; u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 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 m09700_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = pws[gid].i[ 6]; pw_buf1[3] = pws[gid].i[ 7]; const u32 pw_len = pws[gid].pw_len; /** * shared */ __local RC4_KEY rc4_keys[64]; __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]; /** * esalt */ const u32 version = oldoffice01_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice01_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice01_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice01_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice01_bufs[digests_offset].encryptedVerifier[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * md5 */ make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w3[2] = out_len * 8 * 2; w3[3] = 0; u32 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, w1, w2, w3, digest_pre); digest_pre[0] &= 0xffffffff; digest_pre[1] &= 0x000000ff; digest_pre[2] &= 0x00000000; digest_pre[3] &= 0x00000000; u32 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[0] = digest[0]; w0[1] = digest[1] & 0xff; w0[2] = 0x8000; 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] = 9 * 8; w3[3] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); // now the RC4 part u32 key[4]; key[0] = digest[0]; key[1] = digest[1]; key[2] = digest[2]; key[3] = digest[3]; rc4_init_16 (rc4_key, key); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[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] = 16 * 8; w3[3] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09700_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09700_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09700_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = pws[gid].i[ 6]; pw_buf1[3] = pws[gid].i[ 7]; const u32 pw_len = pws[gid].pw_len; /** * shared */ __local RC4_KEY rc4_keys[64]; __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]; /** * esalt */ const u32 version = oldoffice01_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice01_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice01_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice01_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice01_bufs[digests_offset].encryptedVerifier[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * md5 */ make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w3[2] = out_len * 8 * 2; w3[3] = 0; u32 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, w1, w2, w3, digest_pre); digest_pre[0] &= 0xffffffff; digest_pre[1] &= 0x000000ff; digest_pre[2] &= 0x00000000; digest_pre[3] &= 0x00000000; u32 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[0] = digest[0]; w0[1] = digest[1] & 0xff; w0[2] = 0x8000; 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] = 9 * 8; w3[3] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); // now the RC4 part u32 key[4]; key[0] = digest[0]; key[1] = digest[1]; key[2] = digest[2]; key[3] = digest[3]; rc4_init_16 (rc4_key, key); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[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] = 16 * 8; w3[3] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09700_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09700_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m09700_a1-optimized.cl000066400000000000000000000643431320027462700200230ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } void gen336 (u32 digest_pre[4], u32 salt_buf[4], u32 digest[4]) { u32 digest_t0[2]; u32 digest_t1[2]; u32 digest_t2[2]; u32 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; u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 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 m09700_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * shared */ __local RC4_KEY rc4_keys[64]; __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]; /** * esalt */ const u32 version = oldoffice01_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice01_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice01_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice01_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice01_bufs[digests_offset].encryptedVerifier[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * md5 */ make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w3[2] = pw_len * 8 * 2; w3[3] = 0; u32 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, w1, w2, w3, digest_pre); digest_pre[0] &= 0xffffffff; digest_pre[1] &= 0x000000ff; digest_pre[2] &= 0x00000000; digest_pre[3] &= 0x00000000; u32 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[0] = digest[0]; w0[1] = digest[1] & 0xff; w0[2] = 0x8000; 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] = 9 * 8; w3[3] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); // now the RC4 part u32 key[4]; key[0] = digest[0]; key[1] = digest[1]; key[2] = digest[2]; key[3] = digest[3]; rc4_init_16 (rc4_key, key); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[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] = 16 * 8; w3[3] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09700_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09700_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09700_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * shared */ __local RC4_KEY rc4_keys[64]; __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]; /** * esalt */ const u32 version = oldoffice01_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice01_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice01_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice01_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice01_bufs[digests_offset].encryptedVerifier[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * md5 */ make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w3[2] = pw_len * 8 * 2; w3[3] = 0; u32 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, w1, w2, w3, digest_pre); digest_pre[0] &= 0xffffffff; digest_pre[1] &= 0x000000ff; digest_pre[2] &= 0x00000000; digest_pre[3] &= 0x00000000; u32 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[0] = digest[0]; w0[1] = digest[1] & 0xff; w0[2] = 0x8000; 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] = 9 * 8; w3[3] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); // now the RC4 part u32 key[4]; key[0] = digest[0]; key[1] = digest[1]; key[2] = digest[2]; key[3] = digest[3]; rc4_init_16 (rc4_key, key); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[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] = 16 * 8; w3[3] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09700_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09700_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m09700_a3-optimized.cl000066400000000000000000001065331320027462700200230ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } void m09700m (__local RC4_KEY *rc4_keys, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * shared */ __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * salt */ u32 salt_buf_t0[4]; 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]; u32 salt_buf_t1[5]; 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; u32 salt_buf_t2[5]; 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; u32 salt_buf_t3[5]; 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[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice01_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice01_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice01_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice01_bufs[digests_offset].encryptedVerifier[3]; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = ix_create_bft (bfs_buf, il_pos); const u32 w0lr = w0l | w0r; /** * md5 */ u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 w3_t[4]; w0_t[0] = w0lr; 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; u32 digest_t0[4]; u32 digest_t1[2]; // need only first 5 byte u32 digest_t2[2]; u32 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 u32 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 // 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); // 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); // 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); // 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); // 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 rc4_init_16 (rc4_key, digest); u32 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); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } void m09700s (__local RC4_KEY *rc4_keys, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * shared */ __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * salt */ u32 salt_buf_t0[4]; 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]; u32 salt_buf_t1[5]; 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; u32 salt_buf_t2[5]; 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; u32 salt_buf_t3[5]; 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[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice01_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice01_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice01_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice01_bufs[digests_offset].encryptedVerifier[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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = ix_create_bft (bfs_buf, il_pos); const u32 w0lr = w0l | w0r; /** * md5 */ u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 w3_t[4]; w0_t[0] = w0lr; 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; u32 digest_t0[4]; u32 digest_t1[2]; // need only first 5 byte u32 digest_t2[2]; u32 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 u32 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 // 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); // 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); // 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); // 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); // 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 rc4_init_16 (rc4_key, digest); u32 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); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09700_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09700_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09700_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09700_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09700_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09700_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m09710_a0-optimized.cl000066400000000000000000000341441320027462700200170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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 m09710_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = pws[gid].i[ 6]; pw_buf1[3] = pws[gid].i[ 7]; const u32 pw_len = pws[gid].pw_len; /** * shared */ __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * esalt */ const u32 version = oldoffice01_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice01_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice01_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice01_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice01_bufs[digests_offset].encryptedVerifier[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * md5 */ w0[0] = w0[0]; w0[1] = w0[1] & 0xff; w0[2] = 0x8000; 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] = 9 * 8; w3[3] = 0; u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); // now the RC4 part rc4_init_16 (rc4_key, digest); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[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] = 16 * 8; w3[3] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09710_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09710_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09710_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = pws[gid].i[ 6]; pw_buf1[3] = pws[gid].i[ 7]; const u32 pw_len = pws[gid].pw_len; /** * shared */ __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * esalt */ const u32 version = oldoffice01_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice01_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice01_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice01_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice01_bufs[digests_offset].encryptedVerifier[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * md5 */ w0[0] = w0[0]; w0[1] = w0[1] & 0xff; w0[2] = 0x8000; 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] = 9 * 8; w3[3] = 0; u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); // now the RC4 part rc4_init_16 (rc4_key, digest); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[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] = 16 * 8; w3[3] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09710_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09710_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m09710_a1-optimized.cl000066400000000000000000000407711320027462700200230ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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 m09710_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * shared */ __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * esalt */ const u32 version = oldoffice01_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice01_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice01_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice01_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice01_bufs[digests_offset].encryptedVerifier[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * md5 */ w0[0] = w0[0]; w0[1] = w0[1] & 0xff; w0[2] = 0x8000; 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] = 9 * 8; w3[3] = 0; u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); // now the RC4 part rc4_init_16 (rc4_key, digest); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[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] = 16 * 8; w3[3] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09710_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09710_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09710_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * shared */ __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * esalt */ const u32 version = oldoffice01_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice01_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice01_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice01_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice01_bufs[digests_offset].encryptedVerifier[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * md5 */ w0[0] = w0[0]; w0[1] = w0[1] & 0xff; w0[2] = 0x8000; 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] = 9 * 8; w3[3] = 0; u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); // now the RC4 part rc4_init_16 (rc4_key, digest); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[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] = 16 * 8; w3[3] = 0; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09710_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09710_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m09710_a3-optimized.cl000066400000000000000000000430171320027462700200210ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } void m09710m (__local RC4_KEY *rc4_keys, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * shared */ __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * esalt */ const u32 version = oldoffice01_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice01_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice01_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice01_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice01_bufs[digests_offset].encryptedVerifier[3]; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = ix_create_bft (bfs_buf, il_pos); const u32 w0lr = w0l | w0r; // first md5 to generate RC4 128 bit key u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 w3_t[4]; w0_t[0] = w0lr; 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; u32 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 rc4_init_16 (rc4_key, digest); u32 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); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } void m09710s (__local RC4_KEY *rc4_keys, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * shared */ __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * esalt */ const u32 version = oldoffice01_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice01_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice01_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice01_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice01_bufs[digests_offset].encryptedVerifier[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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = ix_create_bft (bfs_buf, il_pos); const u32 w0lr = w0l | w0r; // first md5 to generate RC4 128 bit key u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 w3_t[4]; w0_t[0] = w0lr; 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; u32 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 rc4_init_16 (rc4_key, digest); u32 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); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09710_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09710_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09710_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09710_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09710_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09710_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m09720_a0-optimized.cl000066400000000000000000000422431320027462700200170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" 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; u32x salt_buf_t0[4]; u32x salt_buf_t1[5]; u32x salt_buf_t2[5]; u32x 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_vector (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_vector (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_vector (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_vector (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_vector (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_vector (w0_t, w1_t, w2_t, w3_t, digest); } __kernel void m09720_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * md5 */ make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w3[2] = out_len * 8 * 2; w3[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_vector (w0, w1, w2, w3, 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; u32x c = 0; u32x d = 0; COMPARE_M_SIMD (a, b, c, d); } } __kernel void m09720_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09720_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09720_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * md5 */ make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w3[2] = out_len * 8 * 2; w3[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_vector (w0, w1, w2, w3, 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; u32x c = 0; u32x d = 0; COMPARE_S_SIMD (a, b, c, d); } } __kernel void m09720_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09720_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m09720_a1-optimized.cl000066400000000000000000000475321320027462700200260ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" 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; u32x salt_buf_t0[4]; u32x salt_buf_t1[5]; u32x salt_buf_t2[5]; u32x 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_vector (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_vector (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_vector (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_vector (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_vector (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_vector (w0_t, w1_t, w2_t, w3_t, digest); } __kernel void m09720_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * md5 */ make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w3[2] = pw_len * 8 * 2; w3[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_vector (w0, w1, w2, w3, 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; u32x c = 0; u32x d = 0; COMPARE_M_SIMD (a, b, c, d); } } __kernel void m09720_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09720_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09720_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * md5 */ make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); w3[2] = pw_len * 8 * 2; w3[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_vector (w0, w1, w2, w3, 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; u32x c = 0; u32x d = 0; COMPARE_S_SIMD (a, b, c, d); } } __kernel void m09720_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09720_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m09720_a3-optimized.cl000066400000000000000000000614201320027462700200200ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" 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; u32x salt_buf_t0[4]; u32x salt_buf_t1[5]; u32x salt_buf_t2[5]; u32x 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_vector (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_vector (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_vector (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_vector (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_vector (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_vector (w0_t, w1_t, w2_t, w3_t, digest); } void m09720m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * md5 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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_vector (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; u32x c = 0; u32x d = 0; COMPARE_M_SIMD (a, b, c, d); } } void m09720s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_buf[digests_offset].digest_buf[DGST_R1], digests_buf[digests_offset].digest_buf[DGST_R2], digests_buf[digests_offset].digest_buf[DGST_R3] }; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * md5 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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_vector (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; u32x c = 0; u32x d = 0; COMPARE_S_SIMD (a, b, c, d); } } __kernel void m09720_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09720_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09720_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09720_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09720_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09720_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m09800_a0-optimized.cl000066400000000000000000000420511320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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 m09800_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = pws[gid].i[ 6]; pw_buf1[3] = pws[gid].i[ 7]; const u32 pw_len = pws[gid].pw_len; /** * shared */ __local RC4_KEY rc4_keys[64]; __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]; /** * esalt */ const u32 version = oldoffice34_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice34_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice34_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice34_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice34_bufs[digests_offset].encryptedVerifier[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_salt_len = (out_len * 2) + 16; w3[3] = pw_salt_len * 8; w3[2] = 0; w3[1] = swap32 (w2[1]); w3[0] = swap32 (w2[0]); w2[3] = swap32 (w1[3]); w2[2] = swap32 (w1[2]); w2[1] = swap32 (w1[1]); w2[0] = swap32 (w1[0]); w1[3] = swap32 (w0[3]); w1[2] = swap32 (w0[2]); w1[1] = swap32 (w0[1]); w1[0] = swap32 (w0[0]); w0[3] = salt_buf[3]; w0[2] = salt_buf[2]; w0[1] = salt_buf[1]; w0[0] = salt_buf[0]; 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] = digest[0]; w0[1] = digest[1]; w0[2] = digest[2]; w0[3] = digest[3]; w1[0] = digest[4]; w1[1] = 0; w1[2] = 0x80000000; 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] = (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, w1, w2, w3, digest); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); if (version == 3) { digest[1] &= 0xff; digest[2] = 0; digest[3] = 0; } rc4_init_16 (rc4_key, digest); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0[0] = swap32 (out[0]); w0[1] = swap32 (out[1]); w0[2] = swap32 (out[2]); w0[3] = swap32 (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); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09800_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09800_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09800_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = pws[gid].i[ 6]; pw_buf1[3] = pws[gid].i[ 7]; const u32 pw_len = pws[gid].pw_len; /** * shared */ __local RC4_KEY rc4_keys[64]; __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]; /** * esalt */ const u32 version = oldoffice34_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice34_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice34_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice34_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice34_bufs[digests_offset].encryptedVerifier[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_salt_len = (out_len * 2) + 16; w3[3] = pw_salt_len * 8; w3[2] = 0; w3[1] = swap32 (w2[1]); w3[0] = swap32 (w2[0]); w2[3] = swap32 (w1[3]); w2[2] = swap32 (w1[2]); w2[1] = swap32 (w1[1]); w2[0] = swap32 (w1[0]); w1[3] = swap32 (w0[3]); w1[2] = swap32 (w0[2]); w1[1] = swap32 (w0[1]); w1[0] = swap32 (w0[0]); w0[3] = salt_buf[3]; w0[2] = salt_buf[2]; w0[1] = salt_buf[1]; w0[0] = salt_buf[0]; 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] = digest[0]; w0[1] = digest[1]; w0[2] = digest[2]; w0[3] = digest[3]; w1[0] = digest[4]; w1[1] = 0; w1[2] = 0x80000000; 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] = (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, w1, w2, w3, digest); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); if (version == 3) { digest[1] &= 0xff; digest[2] = 0; digest[3] = 0; } rc4_init_16 (rc4_key, digest); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0[0] = swap32 (out[0]); w0[1] = swap32 (out[1]); w0[2] = swap32 (out[2]); w0[3] = swap32 (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); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09800_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09800_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m09800_a1-optimized.cl000066400000000000000000000473401320027462700200220ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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 m09800_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * shared */ __local RC4_KEY rc4_keys[64]; __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]; /** * esalt */ const u32 version = oldoffice34_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice34_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice34_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice34_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice34_bufs[digests_offset].encryptedVerifier[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_salt_len = (pw_len * 2) + 16; w3[3] = pw_salt_len * 8; w3[2] = 0; w3[1] = swap32 (w2[1]); w3[0] = swap32 (w2[0]); w2[3] = swap32 (w1[3]); w2[2] = swap32 (w1[2]); w2[1] = swap32 (w1[1]); w2[0] = swap32 (w1[0]); w1[3] = swap32 (w0[3]); w1[2] = swap32 (w0[2]); w1[1] = swap32 (w0[1]); w1[0] = swap32 (w0[0]); w0[3] = salt_buf[3]; w0[2] = salt_buf[2]; w0[1] = salt_buf[1]; w0[0] = salt_buf[0]; 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] = digest[0]; w0[1] = digest[1]; w0[2] = digest[2]; w0[3] = digest[3]; w1[0] = digest[4]; w1[1] = 0; w1[2] = 0x80000000; 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] = (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, w1, w2, w3, digest); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); if (version == 3) { digest[1] &= 0xff; digest[2] = 0; digest[3] = 0; } rc4_init_16 (rc4_key, digest); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0[0] = swap32 (out[0]); w0[1] = swap32 (out[1]); w0[2] = swap32 (out[2]); w0[3] = swap32 (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); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09800_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09800_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09800_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * shared */ __local RC4_KEY rc4_keys[64]; __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]; /** * esalt */ const u32 version = oldoffice34_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice34_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice34_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice34_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice34_bufs[digests_offset].encryptedVerifier[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_salt_len = (pw_len * 2) + 16; w3[3] = pw_salt_len * 8; w3[2] = 0; w3[1] = swap32 (w2[1]); w3[0] = swap32 (w2[0]); w2[3] = swap32 (w1[3]); w2[2] = swap32 (w1[2]); w2[1] = swap32 (w1[1]); w2[0] = swap32 (w1[0]); w1[3] = swap32 (w0[3]); w1[2] = swap32 (w0[2]); w1[1] = swap32 (w0[1]); w1[0] = swap32 (w0[0]); w0[3] = salt_buf[3]; w0[2] = salt_buf[2]; w0[1] = salt_buf[1]; w0[0] = salt_buf[0]; 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] = digest[0]; w0[1] = digest[1]; w0[2] = digest[2]; w0[3] = digest[3]; w1[0] = digest[4]; w1[1] = 0; w1[2] = 0x80000000; 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] = (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, w1, w2, w3, digest); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); if (version == 3) { digest[1] &= 0xff; digest[2] = 0; digest[3] = 0; } rc4_init_16 (rc4_key, digest); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0[0] = swap32 (out[0]); w0[1] = swap32 (out[1]); w0[2] = swap32 (out[2]); w0[3] = swap32 (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); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09800_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09800_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m09800_a3-optimized.cl000066400000000000000000000604341320027462700200230ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } void m09800m (__local RC4_KEY *rc4_keys, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * shared */ __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]; /** * esalt */ const u32 version = oldoffice34_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice34_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice34_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice34_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice34_bufs[digests_offset].encryptedVerifier[3]; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = ix_create_bft (bfs_buf, il_pos); const u32 w0lr = w0l | w0r; /** * sha1 */ const u32 pw_salt_len = pw_len + 16; u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 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] = w0lr; 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; 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_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); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); if (version == 3) { digest[1] &= 0xff; digest[2] = 0; digest[3] = 0; } rc4_init_16 (rc4_key, digest); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0_t[0] = swap32 (out[0]); w0_t[1] = swap32 (out[1]); w0_t[2] = swap32 (out[2]); w0_t[3] = swap32 (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] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } void m09800s (__local RC4_KEY *rc4_keys, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * shared */ __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]; /** * esalt */ const u32 version = oldoffice34_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice34_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice34_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice34_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice34_bufs[digests_offset].encryptedVerifier[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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = ix_create_bft (bfs_buf, il_pos); const u32 w0lr = w0l | w0r; /** * sha1 */ const u32 pw_salt_len = pw_len + 16; u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 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] = w0lr; 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; 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_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); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); if (version == 3) { digest[1] &= 0xff; digest[2] = 0; digest[3] = 0; } rc4_init_16 (rc4_key, digest); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0_t[0] = swap32 (out[0]); w0_t[1] = swap32 (out[1]); w0_t[2] = swap32 (out[2]); w0_t[3] = swap32 (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] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09800_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09800_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09800_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09800_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09800_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09800_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m09810_a0-optimized.cl000066400000000000000000000335411320027462700200200ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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 m09810_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = pws[gid].i[ 6]; pw_buf1[3] = pws[gid].i[ 7]; const u32 pw_len = pws[gid].pw_len; /** * shared */ __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * esalt */ const u32 version = oldoffice34_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice34_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice34_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice34_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice34_bufs[digests_offset].encryptedVerifier[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * RC4 + SHA1 */ u32 key[4]; key[0] = w0[0]; key[1] = w0[1] & 0xff; key[2] = 0; key[3] = 0; rc4_init_16 (rc4_key, key); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0[0] = swap32 (out[0]); w0[1] = swap32 (out[1]); w0[2] = swap32 (out[2]); w0[3] = swap32 (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; 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); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09810_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09810_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09810_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = pws[gid].i[ 6]; pw_buf1[3] = pws[gid].i[ 7]; const u32 pw_len = pws[gid].pw_len; /** * shared */ __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * esalt */ const u32 version = oldoffice34_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice34_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice34_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice34_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice34_bufs[digests_offset].encryptedVerifier[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * RC4 + SHA1 */ u32 key[4]; key[0] = w0[0]; key[1] = w0[1] & 0xff; key[2] = 0; key[3] = 0; rc4_init_16 (rc4_key, key); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0[0] = swap32 (out[0]); w0[1] = swap32 (out[1]); w0[2] = swap32 (out[2]); w0[3] = swap32 (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; 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); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09810_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09810_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m09810_a1-optimized.cl000066400000000000000000000403661320027462700200240ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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 m09810_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * shared */ __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * esalt */ const u32 version = oldoffice34_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice34_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice34_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice34_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice34_bufs[digests_offset].encryptedVerifier[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * RC4 + SHA1 */ u32 key[4]; key[0] = w0[0]; key[1] = w0[1] & 0xff; key[2] = 0; key[3] = 0; rc4_init_16 (rc4_key, key); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0[0] = swap32 (out[0]); w0[1] = swap32 (out[1]); w0[2] = swap32 (out[2]); w0[3] = swap32 (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; 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); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09810_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09810_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09810_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * shared */ __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * esalt */ const u32 version = oldoffice34_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice34_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice34_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice34_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice34_bufs[digests_offset].encryptedVerifier[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * RC4 + SHA1 */ u32 key[4]; key[0] = w0[0]; key[1] = w0[1] & 0xff; key[2] = 0; key[3] = 0; rc4_init_16 (rc4_key, key); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); w0[0] = swap32 (out[0]); w0[1] = swap32 (out[1]); w0[2] = swap32 (out[2]); w0[3] = swap32 (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; 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); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09810_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09810_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m09810_a3-optimized.cl000066400000000000000000000525461320027462700200310ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } void m09810m (__local RC4_KEY *rc4_keys, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * shared */ __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * esalt */ const u32 version = oldoffice34_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice34_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice34_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice34_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice34_bufs[digests_offset].encryptedVerifier[3]; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = ix_create_bft (bfs_buf, il_pos); const u32 w0lr = w0l | w0r; u32 key[4]; key[0] = w0lr; key[1] = w0[1] & 0xff; key[2] = 0; key[3] = 0; rc4_init_16 (rc4_key, key); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 w3_t[4]; w0_t[0] = swap32 (out[0]); w0_t[1] = swap32 (out[1]); w0_t[2] = swap32 (out[2]); w0_t[3] = swap32 (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; 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_t, w1_t, w2_t, w3_t, digest); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } void m09810s (__local RC4_KEY *rc4_keys, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * shared */ __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * esalt */ const u32 version = oldoffice34_bufs[digests_offset].version; u32 encryptedVerifier[4]; encryptedVerifier[0] = oldoffice34_bufs[digests_offset].encryptedVerifier[0]; encryptedVerifier[1] = oldoffice34_bufs[digests_offset].encryptedVerifier[1]; encryptedVerifier[2] = oldoffice34_bufs[digests_offset].encryptedVerifier[2]; encryptedVerifier[3] = oldoffice34_bufs[digests_offset].encryptedVerifier[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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = ix_create_bft (bfs_buf, il_pos); const u32 w0lr = w0l | w0r; u32 key[4]; key[0] = w0lr; key[1] = w0[1] & 0xff; key[2] = 0; key[3] = 0; rc4_init_16 (rc4_key, key); u32 out[4]; u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 w3_t[4]; w0_t[0] = swap32 (out[0]); w0_t[1] = swap32 (out[1]); w0_t[2] = swap32 (out[2]); w0_t[3] = swap32 (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; 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_t, w1_t, w2_t, w3_t, digest); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]); digest[2] = swap32 (digest[2]); digest[3] = swap32 (digest[3]); rc4_next_16 (rc4_key, 16, j, digest, out); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m09810_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09810_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09810_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09810_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09810_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09810_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m09820_a0-optimized.cl000066400000000000000000000272641320027462700200260ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m09820_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_salt_len = (out_len * 2) + 16; w3[3] = pw_salt_len * 8; w3[2] = 0; w3[1] = swap32 (w2[1]); w3[0] = swap32 (w2[0]); w2[3] = swap32 (w1[3]); w2[2] = swap32 (w1[2]); w2[1] = swap32 (w1[1]); w2[0] = swap32 (w1[0]); w1[3] = swap32 (w0[3]); w1[2] = swap32 (w0[2]); w1[1] = swap32 (w0[1]); w1[0] = swap32 (w0[0]); w0[3] = salt_buf[3]; w0[2] = salt_buf[2]; w0[1] = salt_buf[1]; w0[0] = salt_buf[0]; 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_vector (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] = 0; w1[2] = 0x80000000; 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] = (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_vector (w0, w1, w2, w3, digest); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]) & 0xff; digest[2] = 0; digest[3] = 0; COMPARE_M_SIMD (digest[0], digest[1], digest[2], digest[3]); } } __kernel void m09820_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09820_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09820_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_salt_len = (out_len * 2) + 16; w3[3] = pw_salt_len * 8; w3[2] = 0; w3[1] = swap32 (w2[1]); w3[0] = swap32 (w2[0]); w2[3] = swap32 (w1[3]); w2[2] = swap32 (w1[2]); w2[1] = swap32 (w1[1]); w2[0] = swap32 (w1[0]); w1[3] = swap32 (w0[3]); w1[2] = swap32 (w0[2]); w1[1] = swap32 (w0[1]); w1[0] = swap32 (w0[0]); w0[3] = salt_buf[3]; w0[2] = salt_buf[2]; w0[1] = salt_buf[1]; w0[0] = salt_buf[0]; 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_vector (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] = 0; w1[2] = 0x80000000; 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] = (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_vector (w0, w1, w2, w3, digest); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]) & 0xff; digest[2] = 0; digest[3] = 0; COMPARE_S_SIMD (digest[0], digest[1], digest[2], digest[3]); } } __kernel void m09820_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09820_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m09820_a1-optimized.cl000066400000000000000000000345531320027462700200260ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m09820_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_salt_len = (pw_len * 2) + 16; w3[3] = pw_salt_len * 8; w3[2] = 0; w3[1] = swap32 (w2[1]); w3[0] = swap32 (w2[0]); w2[3] = swap32 (w1[3]); w2[2] = swap32 (w1[2]); w2[1] = swap32 (w1[1]); w2[0] = swap32 (w1[0]); w1[3] = swap32 (w0[3]); w1[2] = swap32 (w0[2]); w1[1] = swap32 (w0[1]); w1[0] = swap32 (w0[0]); w0[3] = salt_buf[3]; w0[2] = salt_buf[2]; w0[1] = salt_buf[1]; w0[0] = salt_buf[0]; 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_vector (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] = 0; w1[2] = 0x80000000; 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] = (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_vector (w0, w1, w2, w3, digest); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]) & 0xff; digest[2] = 0; digest[3] = 0; COMPARE_M_SIMD (digest[0], digest[1], digest[2], digest[3]); } } __kernel void m09820_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09820_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09820_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_salt_len = (pw_len * 2) + 16; w3[3] = pw_salt_len * 8; w3[2] = 0; w3[1] = swap32 (w2[1]); w3[0] = swap32 (w2[0]); w2[3] = swap32 (w1[3]); w2[2] = swap32 (w1[2]); w2[1] = swap32 (w1[1]); w2[0] = swap32 (w1[0]); w1[3] = swap32 (w0[3]); w1[2] = swap32 (w0[2]); w1[1] = swap32 (w0[1]); w1[0] = swap32 (w0[0]); w0[3] = salt_buf[3]; w0[2] = salt_buf[2]; w0[1] = salt_buf[1]; w0[0] = salt_buf[0]; 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_vector (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] = 0; w1[2] = 0x80000000; 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] = (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_vector (w0, w1, w2, w3, digest); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]) & 0xff; digest[2] = 0; digest[3] = 0; COMPARE_S_SIMD (digest[0], digest[1], digest[2], digest[3]); } } __kernel void m09820_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09820_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m09820_a3-optimized.cl000066400000000000000000000447131320027462700200270ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" void m09820m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * sha1 */ 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] = w0lr; 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_len + 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_vector (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_vector (w0_t, w1_t, w2_t, w3_t, digest); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]) & 0xff; digest[2] = 0; digest[3] = 0; COMPARE_M_SIMD (digest[0], digest[1], digest[2], digest[3]); } } void m09820s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_buf[digests_offset].digest_buf[DGST_R1], digests_buf[digests_offset].digest_buf[DGST_R2], digests_buf[digests_offset].digest_buf[DGST_R3] }; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * sha1 */ 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] = w0lr; 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_len + 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_vector (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_vector (w0_t, w1_t, w2_t, w3_t, digest); digest[0] = swap32 (digest[0]); digest[1] = swap32 (digest[1]) & 0xff; digest[2] = 0; digest[3] = 0; COMPARE_S_SIMD (digest[0], digest[1], digest[2], digest[3]); } } __kernel void m09820_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09820_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09820_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09820_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09820_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09820_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m09900_a0-optimized.cl000066400000000000000000000577441320027462700200330ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m09900_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * 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); u32x t; 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 += 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[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] = 0x80; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 100 * 8; w3[3] = 0; 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 += r_a; b += r_b; c += r_c; d += r_d; COMPARE_M_SIMD (a, d, c, b); } } __kernel void m09900_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09900_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09900_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * 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); u32x t; 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 += 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[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] = 0x80; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 100 * 8; w3[3] = 0; 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); if (MATCHES_NONE_VS ((a + r_a), search[0])) 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 += r_a; b += r_b; c += r_c; d += r_d; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m09900_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09900_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m09900_a0.cl000066400000000000000000000076231320027462700160200ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m09900_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx; md5_init (&ctx); md5_update (&ctx, tmp.i, 100); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m09900_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx; md5_init (&ctx); md5_update (&ctx, tmp.i, 100); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m09900_a1-optimized.cl000066400000000000000000000665151320027462700200300ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m09900_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * 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); u32x t; 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 += 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[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] = 0x80; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 100 * 8; w3[3] = 0; 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 += r_a; b += r_b; c += r_c; d += r_d; COMPARE_M_SIMD (a, d, c, b); } } __kernel void m09900_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09900_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09900_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * 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); u32x t; 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 += 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[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] = 0x80; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 100 * 8; w3[3] = 0; 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); if (MATCHES_NONE_VS ((a + r_a), search[0])) 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 += r_a; b += r_b; c += r_c; d += r_d; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m09900_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m09900_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m09900_a1.cl000066400000000000000000000075441320027462700160230ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m09900_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global (&ctx, combs_buf[il_pos].i, 100 - pws[gid].pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m09900_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global (&ctx, combs_buf[il_pos].i, 100 - pws[gid].pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m09900_a3-optimized.cl000066400000000000000000001065551320027462700200310ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m09900m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ const u32 F_w0c00 = 0u + 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 = 0u + 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 = 0u + 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 = 0u + 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; /** * fixed buffer */ u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 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; /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); u32x t; 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 += 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; 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_H1, a, b, c, d, t1[1], MD5C20, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t2[0], MD5C21, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t2[3], MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t3[2], MD5C23, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t0[1], MD5C24, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t1[0], MD5C25, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t1[3], MD5C26, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t2[2], MD5C27, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t3[1], MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t0[0], MD5C29, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t0[3], MD5C2a, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t1[2], MD5C2b, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t2[1], MD5C2c, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t3[0], MD5C2d, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t3[3], MD5C2e, MD5S22); MD5_STEP (MD5_H2, 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; COMPARE_M_SIMD (a, d, c, b); } } void m09900s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ const u32 F_w0c00 = 0u + 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 = 0u + 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 = 0u + 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 = 0u + 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; /** * fixed buffer */ u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 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; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_buf[digests_offset].digest_buf[DGST_R1], digests_buf[digests_offset].digest_buf[DGST_R2], digests_buf[digests_offset].digest_buf[DGST_R3] }; /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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); u32x t; 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 += 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; 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_H1, a, b, c, d, t1[1], MD5C20, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t2[0], MD5C21, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t2[3], MD5C22, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t3[2], MD5C23, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t0[1], MD5C24, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t1[0], MD5C25, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t1[3], MD5C26, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t2[2], MD5C27, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t3[1], MD5C28, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t0[0], MD5C29, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t0[3], MD5C2a, MD5S22); MD5_STEP (MD5_H2, b, c, d, a, t1[2], MD5C2b, MD5S23); MD5_STEP (MD5_H1, a, b, c, d, t2[1], MD5C2c, MD5S20); MD5_STEP (MD5_H2, d, a, b, c, t3[0], MD5C2d, MD5S21); MD5_STEP (MD5_H1, c, d, a, b, t3[3], MD5C2e, MD5S22); MD5_STEP (MD5_H2, 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 (MATCHES_NONE_VS ((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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m09900_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09900_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09900_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09900_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09900_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m09900_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m09900_a3.cl000066400000000000000000000103621320027462700160150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __kernel void m09900_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector (&ctx); md5_update_vector (&ctx, w, 100); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m09900_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector (&ctx); md5_update_vector (&ctx, w, 100); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m10100_a0-optimized.cl000066400000000000000000000274021320027462700177770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //incompatible to simd //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #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) __kernel void m10100_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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 */ u64x v0p = SIPHASHM_0; u64x v1p = SIPHASHM_1; u64x v2p = SIPHASHM_2; u64x 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * siphash */ switch (out_len / 8) { case 0: w0[1] |= out_len << 24; break; case 1: w0[3] |= out_len << 24; break; case 2: w1[1] |= out_len << 24; break; case 3: w1[3] |= out_len << 24; break; } u64x v0 = v0p; u64x v1 = v1p; u64x v2 = v2p; u64x v3 = v3p; int i; int j; for (i = 0, j = 0; i <= out_len && i < 16; i += 8, j += 2) { u64x m = hl32_to_64 (w0[j + 1], w0[j + 0]); v3 ^= m; SIPROUND (v0, v1, v2, v3); SIPROUND (v0, v1, v2, v3); v0 ^= m; } for ( j = 0; i <= out_len && i < 32; i += 8, j += 2) { u64x m = hl32_to_64 (w1[j + 1], w1[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 z = 0; COMPARE_M_SIMD (a, b, z, z); } } __kernel void m10100_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10100_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10100_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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 */ u64x v0p = SIPHASHM_0; u64x v1p = SIPHASHM_1; u64x v2p = SIPHASHM_2; u64x 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], 0, 0 }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * siphash */ switch (out_len / 8) { case 0: w0[1] |= out_len << 24; break; case 1: w0[3] |= out_len << 24; break; case 2: w1[1] |= out_len << 24; break; case 3: w1[3] |= out_len << 24; break; } u64x v0 = v0p; u64x v1 = v1p; u64x v2 = v2p; u64x v3 = v3p; int i; int j; for (i = 0, j = 0; i <= out_len && i < 16; i += 8, j += 2) { u64x m = hl32_to_64 (w0[j + 1], w0[j + 0]); v3 ^= m; SIPROUND (v0, v1, v2, v3); SIPROUND (v0, v1, v2, v3); v0 ^= m; } for ( j = 0; i <= out_len && i < 32; i += 8, j += 2) { u64x m = hl32_to_64 (w1[j + 1], w1[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 z = 0; COMPARE_S_SIMD (a, b, z, z); } } __kernel void m10100_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10100_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m10100_a1-optimized.cl000066400000000000000000000360631320027462700200030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //incompatible to simd //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #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) __kernel void m10100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u64x v0p = SIPHASHM_0; u64x v1p = SIPHASHM_1; u64x v2p = SIPHASHM_2; u64x 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * siphash */ switch (pw_len / 8) { case 0: w0[1] |= pw_len << 24; break; case 1: w0[3] |= pw_len << 24; break; case 2: w1[1] |= pw_len << 24; break; case 3: w1[3] |= pw_len << 24; break; } 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 < 16; i += 8, j += 2) { u64x m = hl32_to_64 (w0[j + 1], w0[j + 0]); v3 ^= m; SIPROUND (v0, v1, v2, v3); SIPROUND (v0, v1, v2, v3); v0 ^= m; } for ( j = 0; i <= pw_len && i < 32; i += 8, j += 2) { u64x m = hl32_to_64 (w1[j + 1], w1[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 z = 0; COMPARE_M_SIMD (a, b, z, z); } } __kernel void m10100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u64x v0p = SIPHASHM_0; u64x v1p = SIPHASHM_1; u64x v2p = SIPHASHM_2; u64x 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], 0, 0 }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * siphash */ switch (pw_len / 8) { case 0: w0[1] |= pw_len << 24; break; case 1: w0[3] |= pw_len << 24; break; case 2: w1[1] |= pw_len << 24; break; case 3: w1[3] |= pw_len << 24; break; } 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 < 16; i += 8, j += 2) { u64x m = hl32_to_64 (w0[j + 1], w0[j + 0]); v3 ^= m; SIPROUND (v0, v1, v2, v3); SIPROUND (v0, v1, v2, v3); v0 ^= m; } for ( j = 0; i <= pw_len && i < 32; i += 8, j += 2) { u64x m = hl32_to_64 (w1[j + 1], w1[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 z = 0; COMPARE_S_SIMD (a, b, z, z); } } __kernel void m10100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m10100_a3-optimized.cl000066400000000000000000000440221320027462700177770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #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) void m10100m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u64 v0p = SIPHASHM_0; u64 v1p = SIPHASHM_1; u64 v2p = SIPHASHM_2; u64 v3p = SIPHASHM_3; v0p ^= hl32_to_64_S (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); v1p ^= hl32_to_64_S (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); v2p ^= hl32_to_64_S (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); v3p ^= hl32_to_64_S (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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; /** * siphash */ 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; u32 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 z = 0; COMPARE_M_SIMD (a, b, z, z); } } void m10100s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u64 v0p = SIPHASHM_0; u64 v1p = SIPHASHM_1; u64 v2p = SIPHASHM_2; u64 v3p = SIPHASHM_3; v0p ^= hl32_to_64_S (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); v1p ^= hl32_to_64_S (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); v2p ^= hl32_to_64_S (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); v3p ^= hl32_to_64_S (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], 0, 0 }; /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; /** * siphash */ 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; u32 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 z = 0; COMPARE_S_SIMD (a, b, z, z); } } __kernel void m10100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m10300.cl000066400000000000000000000131261320027462700154150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_sha1.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" __kernel void m10300_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global saph_sha1_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); sha1_update_global_swap (&ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_final (&ctx); tmps[gid].digest_buf[0] = ctx.h[0]; tmps[gid].digest_buf[1] = ctx.h[1]; tmps[gid].digest_buf[2] = ctx.h[2]; tmps[gid].digest_buf[3] = ctx.h[3]; tmps[gid].digest_buf[4] = ctx.h[4]; } __kernel void m10300_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global saph_sha1_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * init */ sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); /** * load */ u32 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++) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = digest[0]; w0[1] = digest[1]; w0[2] = digest[2]; w0[3] = digest[3]; w1[0] = digest[4]; 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; sha1_ctx_t ctx_inner = ctx; sha1_update_64 (&ctx_inner, w0, w1, w2, w3, 20); sha1_final (&ctx_inner); digest[0] = ctx_inner.h[0]; digest[1] = ctx_inner.h[1]; digest[2] = ctx_inner.h[2]; digest[3] = ctx_inner.h[3]; digest[4] = ctx_inner.h[4]; } 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 m10300_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global saph_sha1_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ const u32 r0 = tmps[gid].digest_buf[0]; const u32 r1 = tmps[gid].digest_buf[1]; const u32 r2 = tmps[gid].digest_buf[2]; const u32 r3 = tmps[gid].digest_buf[3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m10400_a0-optimized.cl000066400000000000000000000360071320027462700200030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __constant u32 padding[8] = { 0x5e4ebf28, 0x418a754e, 0x564e0064, 0x0801faff, 0xb6002e2e, 0x803e68d0, 0xfea90c2f, 0x7a695364 }; typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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; #ifdef _unroll #pragma unroll #endif 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); } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, __constant u32 *in, u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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 m10400_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = pws[gid].i[ 6]; pw_buf1[3] = pws[gid].i[ 7]; 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[digests_offset].o_buf[0]; o_buf[1] = pdf_bufs[digests_offset].o_buf[1]; o_buf[2] = pdf_bufs[digests_offset].o_buf[2]; o_buf[3] = pdf_bufs[digests_offset].o_buf[3]; o_buf[4] = pdf_bufs[digests_offset].o_buf[4]; o_buf[5] = pdf_bufs[digests_offset].o_buf[5]; o_buf[6] = pdf_bufs[digests_offset].o_buf[6]; o_buf[7] = pdf_bufs[digests_offset].o_buf[7]; u32 P = pdf_bufs[digests_offset].P; u32 id_buf[4]; id_buf[0] = pdf_bufs[digests_offset].id_buf[0]; id_buf[1] = pdf_bufs[digests_offset].id_buf[1]; id_buf[2] = pdf_bufs[digests_offset].id_buf[2]; id_buf[3] = pdf_bufs[digests_offset].id_buf[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * pdf */ u32 p0[4]; u32 p1[4]; u32 p2[4]; u32 p3[4]; p0[0] = padding[0]; p0[1] = padding[1]; p0[2] = padding[2]; p0[3] = padding[3]; p1[0] = padding[4]; p1[1] = padding[5]; p1[2] = padding[6]; p1[3] = padding[7]; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; switch_buffer_by_offset_le (p0, p1, p2, p3, out_len); // add password // truncate at 32 is wanted, not a bug! // add o_buf w0[0] |= p0[0]; w0[1] |= p0[1]; w0[2] |= p0[2]; w0[3] |= p0[3]; w1[0] |= p1[0]; w1[1] |= p1[1]; w1[2] |= p1[2]; w1[3] |= p1[3]; w2[0] = o_buf[0]; w2[1] = o_buf[1]; w2[2] = o_buf[2]; w2[3] = o_buf[3]; w3[0] = o_buf[4]; w3[1] = o_buf[5]; w3[2] = o_buf[6]; w3[3] = o_buf[7]; u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); w0[0] = P; w0[1] = id_buf[0]; w0[2] = id_buf[1]; w0[3] = id_buf[2]; w1[0] = id_buf[3]; w1[1] = 0x80; 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] = 84 * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, digest); // now the RC4 part digest[1] = digest[1] & 0xff; digest[2] = 0; digest[3] = 0; rc4_init_16 (rc4_key, digest); u32 out[4]; rc4_next_16 (rc4_key, 0, 0, padding, out); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m10400_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10400_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10400_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = pws[gid].i[ 6]; pw_buf1[3] = pws[gid].i[ 7]; 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[digests_offset].o_buf[0]; o_buf[1] = pdf_bufs[digests_offset].o_buf[1]; o_buf[2] = pdf_bufs[digests_offset].o_buf[2]; o_buf[3] = pdf_bufs[digests_offset].o_buf[3]; o_buf[4] = pdf_bufs[digests_offset].o_buf[4]; o_buf[5] = pdf_bufs[digests_offset].o_buf[5]; o_buf[6] = pdf_bufs[digests_offset].o_buf[6]; o_buf[7] = pdf_bufs[digests_offset].o_buf[7]; u32 P = pdf_bufs[digests_offset].P; u32 id_buf[4]; id_buf[0] = pdf_bufs[digests_offset].id_buf[0]; id_buf[1] = pdf_bufs[digests_offset].id_buf[1]; id_buf[2] = pdf_bufs[digests_offset].id_buf[2]; id_buf[3] = pdf_bufs[digests_offset].id_buf[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * pdf */ u32 p0[4]; u32 p1[4]; u32 p2[4]; u32 p3[4]; p0[0] = padding[0]; p0[1] = padding[1]; p0[2] = padding[2]; p0[3] = padding[3]; p1[0] = padding[4]; p1[1] = padding[5]; p1[2] = padding[6]; p1[3] = padding[7]; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; switch_buffer_by_offset_le (p0, p1, p2, p3, out_len); // add password // truncate at 32 is wanted, not a bug! // add o_buf w0[0] |= p0[0]; w0[1] |= p0[1]; w0[2] |= p0[2]; w0[3] |= p0[3]; w1[0] |= p1[0]; w1[1] |= p1[1]; w1[2] |= p1[2]; w1[3] |= p1[3]; w2[0] = o_buf[0]; w2[1] = o_buf[1]; w2[2] = o_buf[2]; w2[3] = o_buf[3]; w3[0] = o_buf[4]; w3[1] = o_buf[5]; w3[2] = o_buf[6]; w3[3] = o_buf[7]; u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); w0[0] = P; w0[1] = id_buf[0]; w0[2] = id_buf[1]; w0[3] = id_buf[2]; w1[0] = id_buf[3]; w1[1] = 0x80; 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] = 84 * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, digest); // now the RC4 part digest[1] = digest[1] & 0xff; digest[2] = 0; digest[3] = 0; rc4_init_16 (rc4_key, digest); u32 out[4]; rc4_next_16 (rc4_key, 0, 0, padding, out); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m10400_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10400_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m10400_a1-optimized.cl000066400000000000000000000440041320027462700200000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __constant u32 padding[8] = { 0x5e4ebf28, 0x418a754e, 0x564e0064, 0x0801faff, 0xb6002e2e, 0x803e68d0, 0xfea90c2f, 0x7a695364 }; typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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; #ifdef _unroll #pragma unroll #endif 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); } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, __constant u32 *in, u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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 m10400_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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[digests_offset].o_buf[0]; o_buf[1] = pdf_bufs[digests_offset].o_buf[1]; o_buf[2] = pdf_bufs[digests_offset].o_buf[2]; o_buf[3] = pdf_bufs[digests_offset].o_buf[3]; o_buf[4] = pdf_bufs[digests_offset].o_buf[4]; o_buf[5] = pdf_bufs[digests_offset].o_buf[5]; o_buf[6] = pdf_bufs[digests_offset].o_buf[6]; o_buf[7] = pdf_bufs[digests_offset].o_buf[7]; u32 P = pdf_bufs[digests_offset].P; u32 id_buf[4]; id_buf[0] = pdf_bufs[digests_offset].id_buf[0]; id_buf[1] = pdf_bufs[digests_offset].id_buf[1]; id_buf[2] = pdf_bufs[digests_offset].id_buf[2]; id_buf[3] = pdf_bufs[digests_offset].id_buf[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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; /** * pdf */ u32 p0[4]; u32 p1[4]; u32 p2[4]; u32 p3[4]; p0[0] = padding[0]; p0[1] = padding[1]; p0[2] = padding[2]; p0[3] = padding[3]; p1[0] = padding[4]; p1[1] = padding[5]; p1[2] = padding[6]; p1[3] = padding[7]; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; switch_buffer_by_offset_le (p0, p1, p2, p3, pw_len); // add password // truncate at 32 is wanted, not a bug! // add o_buf w0[0] |= p0[0]; w0[1] |= p0[1]; w0[2] |= p0[2]; w0[3] |= p0[3]; w1[0] |= p1[0]; w1[1] |= p1[1]; w1[2] |= p1[2]; w1[3] |= p1[3]; w2[0] = o_buf[0]; w2[1] = o_buf[1]; w2[2] = o_buf[2]; w2[3] = o_buf[3]; w3[0] = o_buf[4]; w3[1] = o_buf[5]; w3[2] = o_buf[6]; w3[3] = o_buf[7]; u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); w0[0] = P; w0[1] = id_buf[0]; w0[2] = id_buf[1]; w0[3] = id_buf[2]; w1[0] = id_buf[3]; w1[1] = 0x80; 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] = 84 * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, digest); // now the RC4 part digest[1] = digest[1] & 0xff; digest[2] = 0; digest[3] = 0; rc4_init_16 (rc4_key, digest); u32 out[4]; rc4_next_16 (rc4_key, 0, 0, padding, out); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m10400_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10400_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10400_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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[digests_offset].o_buf[0]; o_buf[1] = pdf_bufs[digests_offset].o_buf[1]; o_buf[2] = pdf_bufs[digests_offset].o_buf[2]; o_buf[3] = pdf_bufs[digests_offset].o_buf[3]; o_buf[4] = pdf_bufs[digests_offset].o_buf[4]; o_buf[5] = pdf_bufs[digests_offset].o_buf[5]; o_buf[6] = pdf_bufs[digests_offset].o_buf[6]; o_buf[7] = pdf_bufs[digests_offset].o_buf[7]; u32 P = pdf_bufs[digests_offset].P; u32 id_buf[4]; id_buf[0] = pdf_bufs[digests_offset].id_buf[0]; id_buf[1] = pdf_bufs[digests_offset].id_buf[1]; id_buf[2] = pdf_bufs[digests_offset].id_buf[2]; id_buf[3] = pdf_bufs[digests_offset].id_buf[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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; /** * pdf */ u32 p0[4]; u32 p1[4]; u32 p2[4]; u32 p3[4]; p0[0] = padding[0]; p0[1] = padding[1]; p0[2] = padding[2]; p0[3] = padding[3]; p1[0] = padding[4]; p1[1] = padding[5]; p1[2] = padding[6]; p1[3] = padding[7]; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; switch_buffer_by_offset_le (p0, p1, p2, p3, pw_len); // add password // truncate at 32 is wanted, not a bug! // add o_buf w0[0] |= p0[0]; w0[1] |= p0[1]; w0[2] |= p0[2]; w0[3] |= p0[3]; w1[0] |= p1[0]; w1[1] |= p1[1]; w1[2] |= p1[2]; w1[3] |= p1[3]; w2[0] = o_buf[0]; w2[1] = o_buf[1]; w2[2] = o_buf[2]; w2[3] = o_buf[3]; w3[0] = o_buf[4]; w3[1] = o_buf[5]; w3[2] = o_buf[6]; w3[3] = o_buf[7]; u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); w0[0] = P; w0[1] = id_buf[0]; w0[2] = id_buf[1]; w0[3] = id_buf[2]; w1[0] = id_buf[3]; w1[1] = 0x80; 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] = 84 * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, digest); // now the RC4 part digest[1] = digest[1] & 0xff; digest[2] = 0; digest[3] = 0; rc4_init_16 (rc4_key, digest); u32 out[4]; rc4_next_16 (rc4_key, 0, 0, padding, out); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m10400_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10400_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m10400_a3-optimized.cl000066400000000000000000000557161320027462700200160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __constant u32 padding[8] = { 0x5e4ebf28, 0x418a754e, 0x564e0064, 0x0801faff, 0xb6002e2e, 0x803e68d0, 0xfea90c2f, 0x7a695364 }; typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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; #ifdef _unroll #pragma unroll #endif 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); } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, __constant u32 *in, u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } void m10400m (__local RC4_KEY *rc4_keys, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * shared */ __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * U_buf */ u32 o_buf[8]; o_buf[0] = pdf_bufs[digests_offset].o_buf[0]; o_buf[1] = pdf_bufs[digests_offset].o_buf[1]; o_buf[2] = pdf_bufs[digests_offset].o_buf[2]; o_buf[3] = pdf_bufs[digests_offset].o_buf[3]; o_buf[4] = pdf_bufs[digests_offset].o_buf[4]; o_buf[5] = pdf_bufs[digests_offset].o_buf[5]; o_buf[6] = pdf_bufs[digests_offset].o_buf[6]; o_buf[7] = pdf_bufs[digests_offset].o_buf[7]; u32 P = pdf_bufs[digests_offset].P; u32 id_buf[4]; id_buf[0] = pdf_bufs[digests_offset].id_buf[0]; id_buf[1] = pdf_bufs[digests_offset].id_buf[1]; id_buf[2] = pdf_bufs[digests_offset].id_buf[2]; id_buf[3] = pdf_bufs[digests_offset].id_buf[3]; u32 p0[4]; u32 p1[4]; u32 p2[4]; u32 p3[4]; p0[0] = padding[0]; p0[1] = padding[1]; p0[2] = padding[2]; p0[3] = padding[3]; p1[0] = padding[4]; p1[1] = padding[5]; p1[2] = padding[6]; p1[3] = padding[7]; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; switch_buffer_by_offset_le (p0, p1, p2, p3, pw_len); w0[0] |= p0[0]; w0[1] |= p0[1]; w0[2] |= p0[2]; w0[3] |= p0[3]; w1[0] |= p1[0]; w1[1] |= p1[1]; w1[2] |= p1[2]; w1[3] |= p1[3]; w2[0] |= p2[0]; w2[1] |= p2[1]; w2[2] |= p2[2]; w2[3] |= p2[3]; w3[0] |= p3[0]; w3[1] |= p3[1]; w3[2] |= p3[2]; w3[3] |= p3[3]; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 w0r = ix_create_bft (bfs_buf, il_pos); w0[0] = w0l | w0r; /** * pdf */ u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 w3_t[4]; // 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]; u32 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 digest[1] = digest[1] & 0xff; digest[2] = 0; digest[3] = 0; rc4_init_16 (rc4_key, digest); u32 out[4]; rc4_next_16 (rc4_key, 0, 0, padding, out); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } void m10400s (__local RC4_KEY *rc4_keys, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * shared */ __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * U_buf */ u32 o_buf[8]; o_buf[0] = pdf_bufs[digests_offset].o_buf[0]; o_buf[1] = pdf_bufs[digests_offset].o_buf[1]; o_buf[2] = pdf_bufs[digests_offset].o_buf[2]; o_buf[3] = pdf_bufs[digests_offset].o_buf[3]; o_buf[4] = pdf_bufs[digests_offset].o_buf[4]; o_buf[5] = pdf_bufs[digests_offset].o_buf[5]; o_buf[6] = pdf_bufs[digests_offset].o_buf[6]; o_buf[7] = pdf_bufs[digests_offset].o_buf[7]; u32 P = pdf_bufs[digests_offset].P; u32 id_buf[4]; id_buf[0] = pdf_bufs[digests_offset].id_buf[0]; id_buf[1] = pdf_bufs[digests_offset].id_buf[1]; id_buf[2] = pdf_bufs[digests_offset].id_buf[2]; id_buf[3] = pdf_bufs[digests_offset].id_buf[3]; u32 p0[4]; u32 p1[4]; u32 p2[4]; u32 p3[4]; p0[0] = padding[0]; p0[1] = padding[1]; p0[2] = padding[2]; p0[3] = padding[3]; p1[0] = padding[4]; p1[1] = padding[5]; p1[2] = padding[6]; p1[3] = padding[7]; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; switch_buffer_by_offset_le (p0, p1, p2, p3, pw_len); w0[0] |= p0[0]; w0[1] |= p0[1]; w0[2] |= p0[2]; w0[3] |= p0[3]; w1[0] |= p1[0]; w1[1] |= p1[1]; w1[2] |= p1[2]; w1[3] |= p1[3]; w2[0] |= p2[0]; w2[1] |= p2[1]; w2[2] |= p2[2]; w2[3] |= p2[3]; w3[0] |= p3[0]; w3[1] |= p3[1]; w3[2] |= p3[2]; w3[3] |= p3[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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 w0r = ix_create_bft (bfs_buf, il_pos); w0[0] = w0l | w0r; /** * pdf */ u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 w3_t[4]; // 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]; u32 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 digest[1] = digest[1] & 0xff; digest[2] = 0; digest[3] = 0; rc4_init_16 (rc4_key, digest); u32 out[4]; rc4_next_16 (rc4_key, 0, 0, padding, out); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m10400_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10400_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10400_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10400_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10400_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10400_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m10410_a0-optimized.cl000066400000000000000000000254571320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __constant u32 padding[8] = { 0x5e4ebf28, 0x418a754e, 0x564e0064, 0x0801faff, 0xb6002e2e, 0x803e68d0, 0xfea90c2f, 0x7a695364 }; typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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; #ifdef _unroll #pragma unroll #endif 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); } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, __constant u32 *in, u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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 m10410_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = pws[gid].i[ 6]; pw_buf1[3] = pws[gid].i[ 7]; const u32 pw_len = pws[gid].pw_len; /** * shared */ __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * pdf */ rc4_init_16 (rc4_key, w0); u32 out[4]; rc4_next_16 (rc4_key, 0, 0, padding, out); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m10410_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10410_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10410_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = pws[gid].i[ 6]; pw_buf1[3] = pws[gid].i[ 7]; const u32 pw_len = pws[gid].pw_len; /** * shared */ __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] }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * pdf */ rc4_init_16 (rc4_key, w0); u32 out[4]; rc4_next_16 (rc4_key, 0, 0, padding, out); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m10410_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10410_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m10410_a1-optimized.cl000066400000000000000000000347721320027462700200140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __constant u32 padding[8] = { 0x5e4ebf28, 0x418a754e, 0x564e0064, 0x0801faff, 0xb6002e2e, 0x803e68d0, 0xfea90c2f, 0x7a695364 }; typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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; #ifdef _unroll #pragma unroll #endif 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); } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, __constant u32 *in, u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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 m10410_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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[digests_offset].o_buf[0]; o_buf[1] = pdf_bufs[digests_offset].o_buf[1]; o_buf[2] = pdf_bufs[digests_offset].o_buf[2]; o_buf[3] = pdf_bufs[digests_offset].o_buf[3]; o_buf[4] = pdf_bufs[digests_offset].o_buf[4]; o_buf[5] = pdf_bufs[digests_offset].o_buf[5]; o_buf[6] = pdf_bufs[digests_offset].o_buf[6]; o_buf[7] = pdf_bufs[digests_offset].o_buf[7]; u32 P = pdf_bufs[digests_offset].P; u32 id_buf[4]; id_buf[0] = pdf_bufs[digests_offset].id_buf[0]; id_buf[1] = pdf_bufs[digests_offset].id_buf[1]; id_buf[2] = pdf_bufs[digests_offset].id_buf[2]; id_buf[3] = pdf_bufs[digests_offset].id_buf[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32x w0[4]; w0[0] = wordl0[0] | wordr0[0]; w0[1] = wordl0[1] | wordr0[1]; w0[2] = 0; w0[3] = 0; /** * pdf */ rc4_init_16 (rc4_key, w0); u32 out[4]; rc4_next_16 (rc4_key, 0, 0, padding, out); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m10410_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10410_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10410_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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[digests_offset].o_buf[0]; o_buf[1] = pdf_bufs[digests_offset].o_buf[1]; o_buf[2] = pdf_bufs[digests_offset].o_buf[2]; o_buf[3] = pdf_bufs[digests_offset].o_buf[3]; o_buf[4] = pdf_bufs[digests_offset].o_buf[4]; o_buf[5] = pdf_bufs[digests_offset].o_buf[5]; o_buf[6] = pdf_bufs[digests_offset].o_buf[6]; o_buf[7] = pdf_bufs[digests_offset].o_buf[7]; u32 P = pdf_bufs[digests_offset].P; u32 id_buf[4]; id_buf[0] = pdf_bufs[digests_offset].id_buf[0]; id_buf[1] = pdf_bufs[digests_offset].id_buf[1]; id_buf[2] = pdf_bufs[digests_offset].id_buf[2]; id_buf[3] = pdf_bufs[digests_offset].id_buf[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32x w0[4]; w0[0] = wordl0[0] | wordr0[0]; w0[1] = wordl0[1] | wordr0[1]; w0[2] = 0; w0[3] = 0; /** * pdf */ rc4_init_16 (rc4_key, w0); u32 out[4]; rc4_next_16 (rc4_key, 0, 0, padding, out); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m10410_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10410_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m10410_a3-optimized.cl000066400000000000000000000441721320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __constant u32 padding[8] = { 0x5e4ebf28, 0x418a754e, 0x564e0064, 0x0801faff, 0xb6002e2e, 0x803e68d0, 0xfea90c2f, 0x7a695364 }; typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif 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; #ifdef _unroll #pragma unroll #endif 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); } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, __constant u32 *in, u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } void m10410m (__local RC4_KEY *rc4_keys, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * shared */ __local RC4_KEY *rc4_key = &rc4_keys[lid]; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = ix_create_bft (bfs_buf, il_pos); const u32 w0lr = w0l | w0r; w0[0] = w0lr; /** * pdf */ rc4_init_16 (rc4_key, w0); u32 out[4]; rc4_next_16 (rc4_key, 0, 0, padding, out); COMPARE_M_SIMD (out[0], out[1], out[2], out[3]); } } void m10410s (__local RC4_KEY *rc4_keys, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * shared */ __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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = ix_create_bft (bfs_buf, il_pos); const u32 w0lr = w0l | w0r; w0[0] = w0lr; /** * pdf */ rc4_init_16 (rc4_key, w0); u32 out[4]; rc4_next_16 (rc4_key, 0, 0, padding, out); COMPARE_S_SIMD (out[0], out[1], out[2], out[3]); } } __kernel void m10410_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10410_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10410_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10410_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10410_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10410_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m10420_a0-optimized.cl000066400000000000000000000312251320027462700200020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __constant u32a padding[8] = { 0x5e4ebf28, 0x418a754e, 0x564e0064, 0x0801faff, 0xb6002e2e, 0x803e68d0, 0xfea90c2f, 0x7a695364 }; __kernel void m10420_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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[digests_offset].o_buf[0]; o_buf[1] = pdf_bufs[digests_offset].o_buf[1]; o_buf[2] = pdf_bufs[digests_offset].o_buf[2]; o_buf[3] = pdf_bufs[digests_offset].o_buf[3]; o_buf[4] = pdf_bufs[digests_offset].o_buf[4]; o_buf[5] = pdf_bufs[digests_offset].o_buf[5]; o_buf[6] = pdf_bufs[digests_offset].o_buf[6]; o_buf[7] = pdf_bufs[digests_offset].o_buf[7]; u32 P = pdf_bufs[digests_offset].P; u32 id_buf[4]; id_buf[0] = pdf_bufs[digests_offset].id_buf[0]; id_buf[1] = pdf_bufs[digests_offset].id_buf[1]; id_buf[2] = pdf_bufs[digests_offset].id_buf[2]; id_buf[3] = pdf_bufs[digests_offset].id_buf[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * pdf */ u32 p0[4]; u32 p1[4]; u32 p2[4]; u32 p3[4]; p0[0] = padding[0]; p0[1] = padding[1]; p0[2] = padding[2]; p0[3] = padding[3]; p1[0] = padding[4]; p1[1] = padding[5]; p1[2] = padding[6]; p1[3] = padding[7]; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; switch_buffer_by_offset_le (p0, p1, p2, p3, out_len); // add password // truncate at 32 is wanted, not a bug! // add o_buf w0[0] |= p0[0]; w0[1] |= p0[1]; w0[2] |= p0[2]; w0[3] |= p0[3]; w1[0] |= p1[0]; w1[1] |= p1[1]; w1[2] |= p1[2]; w1[3] |= p1[3]; w2[0] = o_buf[0]; w2[1] = o_buf[1]; w2[2] = o_buf[2]; w2[3] = o_buf[3]; w3[0] = o_buf[4]; w3[1] = o_buf[5]; w3[2] = o_buf[6]; w3[3] = o_buf[7]; u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); w0[0] = P; w0[1] = id_buf[0]; w0[2] = id_buf[1]; w0[3] = id_buf[2]; w1[0] = id_buf[3]; w1[1] = 0x80; 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] = 84 * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, digest); u32x a = digest[0]; u32x b = digest[1] & 0xff; u32x c = 0; u32x d = 0; COMPARE_M_SIMD (a, b, c, d); } } __kernel void m10420_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules__cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10420_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10420_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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[digests_offset].o_buf[0]; o_buf[1] = pdf_bufs[digests_offset].o_buf[1]; o_buf[2] = pdf_bufs[digests_offset].o_buf[2]; o_buf[3] = pdf_bufs[digests_offset].o_buf[3]; o_buf[4] = pdf_bufs[digests_offset].o_buf[4]; o_buf[5] = pdf_bufs[digests_offset].o_buf[5]; o_buf[6] = pdf_bufs[digests_offset].o_buf[6]; o_buf[7] = pdf_bufs[digests_offset].o_buf[7]; u32 P = pdf_bufs[digests_offset].P; u32 id_buf[4]; id_buf[0] = pdf_bufs[digests_offset].id_buf[0]; id_buf[1] = pdf_bufs[digests_offset].id_buf[1]; id_buf[2] = pdf_bufs[digests_offset].id_buf[2]; id_buf[3] = pdf_bufs[digests_offset].id_buf[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * pdf */ u32 p0[4]; u32 p1[4]; u32 p2[4]; u32 p3[4]; p0[0] = padding[0]; p0[1] = padding[1]; p0[2] = padding[2]; p0[3] = padding[3]; p1[0] = padding[4]; p1[1] = padding[5]; p1[2] = padding[6]; p1[3] = padding[7]; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; switch_buffer_by_offset_le (p0, p1, p2, p3, out_len); // add password // truncate at 32 is wanted, not a bug! // add o_buf w0[0] |= p0[0]; w0[1] |= p0[1]; w0[2] |= p0[2]; w0[3] |= p0[3]; w1[0] |= p1[0]; w1[1] |= p1[1]; w1[2] |= p1[2]; w1[3] |= p1[3]; w2[0] = o_buf[0]; w2[1] = o_buf[1]; w2[2] = o_buf[2]; w2[3] = o_buf[3]; w3[0] = o_buf[4]; w3[1] = o_buf[5]; w3[2] = o_buf[6]; w3[3] = o_buf[7]; u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); w0[0] = P; w0[1] = id_buf[0]; w0[2] = id_buf[1]; w0[3] = id_buf[2]; w1[0] = id_buf[3]; w1[1] = 0x80; 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] = 84 * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, digest); u32x a = digest[0]; u32x b = digest[1] & 0xff; u32x c = 0; u32x d = 0; COMPARE_S_SIMD (a, b, c, d); } } __kernel void m10420_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10420_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m10420_a1-optimized.cl000066400000000000000000000372161320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __constant u32a padding[8] = { 0x5e4ebf28, 0x418a754e, 0x564e0064, 0x0801faff, 0xb6002e2e, 0x803e68d0, 0xfea90c2f, 0x7a695364 }; __kernel void m10420_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * U_buf */ u32 o_buf[8]; o_buf[0] = pdf_bufs[digests_offset].o_buf[0]; o_buf[1] = pdf_bufs[digests_offset].o_buf[1]; o_buf[2] = pdf_bufs[digests_offset].o_buf[2]; o_buf[3] = pdf_bufs[digests_offset].o_buf[3]; o_buf[4] = pdf_bufs[digests_offset].o_buf[4]; o_buf[5] = pdf_bufs[digests_offset].o_buf[5]; o_buf[6] = pdf_bufs[digests_offset].o_buf[6]; o_buf[7] = pdf_bufs[digests_offset].o_buf[7]; u32 P = pdf_bufs[digests_offset].P; u32 id_buf[4]; id_buf[0] = pdf_bufs[digests_offset].id_buf[0]; id_buf[1] = pdf_bufs[digests_offset].id_buf[1]; id_buf[2] = pdf_bufs[digests_offset].id_buf[2]; id_buf[3] = pdf_bufs[digests_offset].id_buf[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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; /** * pdf */ u32 p0[4]; u32 p1[4]; u32 p2[4]; u32 p3[4]; p0[0] = padding[0]; p0[1] = padding[1]; p0[2] = padding[2]; p0[3] = padding[3]; p1[0] = padding[4]; p1[1] = padding[5]; p1[2] = padding[6]; p1[3] = padding[7]; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; switch_buffer_by_offset_le (p0, p1, p2, p3, pw_len); // add password // truncate at 32 is wanted, not a bug! // add o_buf w0[0] |= p0[0]; w0[1] |= p0[1]; w0[2] |= p0[2]; w0[3] |= p0[3]; w1[0] |= p1[0]; w1[1] |= p1[1]; w1[2] |= p1[2]; w1[3] |= p1[3]; w2[0] = o_buf[0]; w2[1] = o_buf[1]; w2[2] = o_buf[2]; w2[3] = o_buf[3]; w3[0] = o_buf[4]; w3[1] = o_buf[5]; w3[2] = o_buf[6]; w3[3] = o_buf[7]; u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); w0[0] = P; w0[1] = id_buf[0]; w0[2] = id_buf[1]; w0[3] = id_buf[2]; w1[0] = id_buf[3]; w1[1] = 0x80; 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] = 84 * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, digest); u32x a = digest[0]; u32x b = digest[1] & 0xff; u32x c = 0; u32x d = 0; COMPARE_M_SIMD (a, b, c, d); } } __kernel void m10420_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10420_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10420_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * U_buf */ u32 o_buf[8]; o_buf[0] = pdf_bufs[digests_offset].o_buf[0]; o_buf[1] = pdf_bufs[digests_offset].o_buf[1]; o_buf[2] = pdf_bufs[digests_offset].o_buf[2]; o_buf[3] = pdf_bufs[digests_offset].o_buf[3]; o_buf[4] = pdf_bufs[digests_offset].o_buf[4]; o_buf[5] = pdf_bufs[digests_offset].o_buf[5]; o_buf[6] = pdf_bufs[digests_offset].o_buf[6]; o_buf[7] = pdf_bufs[digests_offset].o_buf[7]; u32 P = pdf_bufs[digests_offset].P; u32 id_buf[4]; id_buf[0] = pdf_bufs[digests_offset].id_buf[0]; id_buf[1] = pdf_bufs[digests_offset].id_buf[1]; id_buf[2] = pdf_bufs[digests_offset].id_buf[2]; id_buf[3] = pdf_bufs[digests_offset].id_buf[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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; /** * pdf */ u32 p0[4]; u32 p1[4]; u32 p2[4]; u32 p3[4]; p0[0] = padding[0]; p0[1] = padding[1]; p0[2] = padding[2]; p0[3] = padding[3]; p1[0] = padding[4]; p1[1] = padding[5]; p1[2] = padding[6]; p1[3] = padding[7]; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; switch_buffer_by_offset_le (p0, p1, p2, p3, pw_len); // add password // truncate at 32 is wanted, not a bug! // add o_buf w0[0] |= p0[0]; w0[1] |= p0[1]; w0[2] |= p0[2]; w0[3] |= p0[3]; w1[0] |= p1[0]; w1[1] |= p1[1]; w1[2] |= p1[2]; w1[3] |= p1[3]; w2[0] = o_buf[0]; w2[1] = o_buf[1]; w2[2] = o_buf[2]; w2[3] = o_buf[3]; w3[0] = o_buf[4]; w3[1] = o_buf[5]; w3[2] = o_buf[6]; w3[3] = o_buf[7]; u32 digest[4]; digest[0] = MD5M_A; digest[1] = MD5M_B; digest[2] = MD5M_C; digest[3] = MD5M_D; md5_transform (w0, w1, w2, w3, digest); w0[0] = P; w0[1] = id_buf[0]; w0[2] = id_buf[1]; w0[3] = id_buf[2]; w1[0] = id_buf[3]; w1[1] = 0x80; 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] = 84 * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, digest); u32x a = digest[0]; u32x b = digest[1] & 0xff; u32x c = 0; u32x d = 0; COMPARE_S_SIMD (a, b, c, d); } } __kernel void m10420_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10420_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m10420_a3-optimized.cl000066400000000000000000000505221320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __constant u32a padding[8] = { 0x5e4ebf28, 0x418a754e, 0x564e0064, 0x0801faff, 0xb6002e2e, 0x803e68d0, 0xfea90c2f, 0x7a695364 }; void m10420m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * U_buf */ u32 o_buf[8]; o_buf[0] = pdf_bufs[digests_offset].o_buf[0]; o_buf[1] = pdf_bufs[digests_offset].o_buf[1]; o_buf[2] = pdf_bufs[digests_offset].o_buf[2]; o_buf[3] = pdf_bufs[digests_offset].o_buf[3]; o_buf[4] = pdf_bufs[digests_offset].o_buf[4]; o_buf[5] = pdf_bufs[digests_offset].o_buf[5]; o_buf[6] = pdf_bufs[digests_offset].o_buf[6]; o_buf[7] = pdf_bufs[digests_offset].o_buf[7]; u32 P = pdf_bufs[digests_offset].P; u32 id_buf[4]; id_buf[0] = pdf_bufs[digests_offset].id_buf[0]; id_buf[1] = pdf_bufs[digests_offset].id_buf[1]; id_buf[2] = pdf_bufs[digests_offset].id_buf[2]; id_buf[3] = pdf_bufs[digests_offset].id_buf[3]; u32 p0[4]; u32 p1[4]; u32 p2[4]; u32 p3[4]; p0[0] = padding[0]; p0[1] = padding[1]; p0[2] = padding[2]; p0[3] = padding[3]; p1[0] = padding[4]; p1[1] = padding[5]; p1[2] = padding[6]; p1[3] = padding[7]; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; switch_buffer_by_offset_le_S (p0, p1, p2, p3, pw_len); w0[0] |= p0[0]; w0[1] |= p0[1]; w0[2] |= p0[2]; w0[3] |= p0[3]; w1[0] |= p1[0]; w1[1] |= p1[1]; w1[2] |= p1[2]; w1[3] |= p1[3]; w2[0] |= p2[0]; w2[1] |= p2[1]; w2[2] |= p2[2]; w2[3] |= p2[3]; w3[0] |= p3[0]; w3[1] |= p3[1]; w3[2] |= p3[2]; w3[3] |= p3[3]; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 w0r = (u32) bfs_buf[il_pos + 0].i; w0[0] = w0l | w0r; /** * pdf */ u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 w3_t[4]; // 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]; u32 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); u32 a = digest[0]; u32 b = digest[1] & 0xff; u32 c = 0; u32 d = 0; COMPARE_M_SIMD (a, b, c, d); } } void m10420s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * U_buf */ u32 o_buf[8]; o_buf[0] = pdf_bufs[digests_offset].o_buf[0]; o_buf[1] = pdf_bufs[digests_offset].o_buf[1]; o_buf[2] = pdf_bufs[digests_offset].o_buf[2]; o_buf[3] = pdf_bufs[digests_offset].o_buf[3]; o_buf[4] = pdf_bufs[digests_offset].o_buf[4]; o_buf[5] = pdf_bufs[digests_offset].o_buf[5]; o_buf[6] = pdf_bufs[digests_offset].o_buf[6]; o_buf[7] = pdf_bufs[digests_offset].o_buf[7]; u32 P = pdf_bufs[digests_offset].P; u32 id_buf[4]; id_buf[0] = pdf_bufs[digests_offset].id_buf[0]; id_buf[1] = pdf_bufs[digests_offset].id_buf[1]; id_buf[2] = pdf_bufs[digests_offset].id_buf[2]; id_buf[3] = pdf_bufs[digests_offset].id_buf[3]; u32 p0[4]; u32 p1[4]; u32 p2[4]; u32 p3[4]; p0[0] = padding[0]; p0[1] = padding[1]; p0[2] = padding[2]; p0[3] = padding[3]; p1[0] = padding[4]; p1[1] = padding[5]; p1[2] = padding[6]; p1[3] = padding[7]; p2[0] = 0; p2[1] = 0; p2[2] = 0; p2[3] = 0; p3[0] = 0; p3[1] = 0; p3[2] = 0; p3[3] = 0; switch_buffer_by_offset_le_S (p0, p1, p2, p3, pw_len); w0[0] |= p0[0]; w0[1] |= p0[1]; w0[2] |= p0[2]; w0[3] |= p0[3]; w1[0] |= p1[0]; w1[1] |= p1[1]; w1[2] |= p1[2]; w1[3] |= p1[3]; w2[0] |= p2[0]; w2[1] |= p2[1]; w2[2] |= p2[2]; w2[3] |= p2[3]; w3[0] |= p3[0]; w3[1] |= p3[1]; w3[2] |= p3[2]; w3[3] |= p3[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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 w0r = (u32) bfs_buf[il_pos].i; w0[0] = w0l | w0r; /** * pdf */ u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 w3_t[4]; // 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]; u32 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); u32 a = digest[0]; u32 b = digest[1] & 0xff; u32 c = 0; u32 d = 0; COMPARE_S_SIMD (a, b, c, d); } } __kernel void m10420_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10420_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10420_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10420_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10420_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10420_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m10500.cl000066400000000000000000000275071320027462700154270ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_md5.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" __constant u32a padding[8] = { 0x5e4ebf28, 0x418a754e, 0x564e0064, 0x0801faff, 0xb6002e2e, 0x803e68d0, 0xfea90c2f, 0x7a695364 }; typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; 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; } 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; #ifdef _unroll #pragma unroll #endif for (u32 i = 0; i < 64; i++) { *ptr++ = v; v += a; } u32 j = 0; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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 m10500_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pdf14_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); //const u64 lid = get_local_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; 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 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[digests_offset].o_buf[0]; o_buf[1] = pdf_bufs[digests_offset].o_buf[1]; o_buf[2] = pdf_bufs[digests_offset].o_buf[2]; o_buf[3] = pdf_bufs[digests_offset].o_buf[3]; o_buf[4] = pdf_bufs[digests_offset].o_buf[4]; o_buf[5] = pdf_bufs[digests_offset].o_buf[5]; o_buf[6] = pdf_bufs[digests_offset].o_buf[6]; o_buf[7] = pdf_bufs[digests_offset].o_buf[7]; u32 P = pdf_bufs[digests_offset].P; u32 id_buf[12]; id_buf[ 0] = pdf_bufs[digests_offset].id_buf[0]; id_buf[ 1] = pdf_bufs[digests_offset].id_buf[1]; id_buf[ 2] = pdf_bufs[digests_offset].id_buf[2]; id_buf[ 3] = pdf_bufs[digests_offset].id_buf[3]; id_buf[ 4] = pdf_bufs[digests_offset].id_buf[4]; id_buf[ 5] = pdf_bufs[digests_offset].id_buf[5]; id_buf[ 6] = pdf_bufs[digests_offset].id_buf[6]; id_buf[ 7] = pdf_bufs[digests_offset].id_buf[7]; id_buf[ 8] = 0; id_buf[ 9] = 0; id_buf[10] = 0; id_buf[11] = 0; u32 id_len = pdf_bufs[digests_offset].id_len; u32 id_len4 = id_len / 4; u32 rc4data[2]; rc4data[0] = pdf_bufs[digests_offset].rc4data[0]; rc4data[1] = pdf_bufs[digests_offset].rc4data[1]; u32 final_length = 68 + id_len; u32 w11 = 0x80; u32 w12 = 0; if (pdf_bufs[digests_offset].enc_md != 1) { w11 = 0xffffffff; w12 = 0x80; final_length += 4; } id_buf[id_len4 + 0] = w11; id_buf[id_len4 + 1] = w12; /** * main init */ u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 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_le (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]; u32 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 m10500_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pdf14_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 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 */ u32 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]; u32 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) { u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 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; u32 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 m10500_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pdf14_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ const u32 r0 = tmps[gid].out[0]; const u32 r1 = tmps[gid].out[1]; const u32 r2 = 0; const u32 r3 = 0; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m10700-optimized.cl000066400000000000000000000561431320027462700174310ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_sha256.cl" #include "inc_hash_sha384.cl" #include "inc_hash_sha512.cl" #include "inc_cipher_aes.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" typedef struct { union { u32 dgst32[16]; u64 dgst64[8]; }; u32 dgst_len; union { u32 W32[32]; u64 W64[16]; }; u32 W_len; } ctx_t; void orig_sha256_transform (const u32 *w0, const u32 *w1, const u32 *w2, const u32 *w3, u32 *digest) { u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; t0[0] = swap32_S (w0[0]); t0[1] = swap32_S (w0[1]); t0[2] = swap32_S (w0[2]); t0[3] = swap32_S (w0[3]); t1[0] = swap32_S (w1[0]); t1[1] = swap32_S (w1[1]); t1[2] = swap32_S (w1[2]); t1[3] = swap32_S (w1[3]); t2[0] = swap32_S (w2[0]); t2[1] = swap32_S (w2[1]); t2[2] = swap32_S (w2[2]); t2[3] = swap32_S (w2[3]); t3[0] = swap32_S (w3[0]); t3[1] = swap32_S (w3[1]); t3[2] = swap32_S (w3[2]); t3[3] = swap32_S (w3[3]); sha256_transform (t0, t1, t2, t3, digest); } void orig_sha384_transform (const u64 *w0, const u64 *w1, const u64 *w2, const u64 *w3, u64 *digest) { u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; u32 t4[4]; u32 t5[4]; u32 t6[4]; u32 t7[4]; t0[0] = swap32_S (l32_from_64_S (w0[0])); t0[1] = swap32_S (h32_from_64_S (w0[0])); t0[2] = swap32_S (l32_from_64_S (w0[1])); t0[3] = swap32_S (h32_from_64_S (w0[1])); t1[0] = swap32_S (l32_from_64_S (w0[2])); t1[1] = swap32_S (h32_from_64_S (w0[2])); t1[2] = swap32_S (l32_from_64_S (w0[3])); t1[3] = swap32_S (h32_from_64_S (w0[3])); t2[0] = swap32_S (l32_from_64_S (w1[0])); t2[1] = swap32_S (h32_from_64_S (w1[0])); t2[2] = swap32_S (l32_from_64_S (w1[1])); t2[3] = swap32_S (h32_from_64_S (w1[1])); t3[0] = swap32_S (l32_from_64_S (w1[2])); t3[1] = swap32_S (h32_from_64_S (w1[2])); t3[2] = swap32_S (l32_from_64_S (w1[3])); t3[3] = swap32_S (h32_from_64_S (w1[3])); t4[0] = swap32_S (l32_from_64_S (w2[0])); t4[1] = swap32_S (h32_from_64_S (w2[0])); t4[2] = swap32_S (l32_from_64_S (w2[1])); t4[3] = swap32_S (h32_from_64_S (w2[1])); t5[0] = swap32_S (l32_from_64_S (w2[2])); t5[1] = swap32_S (h32_from_64_S (w2[2])); t5[2] = swap32_S (l32_from_64_S (w2[3])); t5[3] = swap32_S (h32_from_64_S (w2[3])); t6[0] = swap32_S (l32_from_64_S (w3[0])); t6[1] = swap32_S (h32_from_64_S (w3[0])); t6[2] = swap32_S (l32_from_64_S (w3[1])); t6[3] = swap32_S (h32_from_64_S (w3[1])); t7[0] = swap32_S (l32_from_64_S (w3[2])); t7[1] = swap32_S (h32_from_64_S (w3[2])); t7[2] = swap32_S (l32_from_64_S (w3[3])); t7[3] = swap32_S (h32_from_64_S (w3[3])); sha384_transform (t0, t1, t2, t3, t4, t5, t6, t7, digest); } void orig_sha512_transform (const u64 *w0, const u64 *w1, const u64 *w2, const u64 *w3, u64 *digest) { u32 t0[4]; u32 t1[4]; u32 t2[4]; u32 t3[4]; u32 t4[4]; u32 t5[4]; u32 t6[4]; u32 t7[4]; t0[0] = swap32_S (l32_from_64_S (w0[0])); t0[1] = swap32_S (h32_from_64_S (w0[0])); t0[2] = swap32_S (l32_from_64_S (w0[1])); t0[3] = swap32_S (h32_from_64_S (w0[1])); t1[0] = swap32_S (l32_from_64_S (w0[2])); t1[1] = swap32_S (h32_from_64_S (w0[2])); t1[2] = swap32_S (l32_from_64_S (w0[3])); t1[3] = swap32_S (h32_from_64_S (w0[3])); t2[0] = swap32_S (l32_from_64_S (w1[0])); t2[1] = swap32_S (h32_from_64_S (w1[0])); t2[2] = swap32_S (l32_from_64_S (w1[1])); t2[3] = swap32_S (h32_from_64_S (w1[1])); t3[0] = swap32_S (l32_from_64_S (w1[2])); t3[1] = swap32_S (h32_from_64_S (w1[2])); t3[2] = swap32_S (l32_from_64_S (w1[3])); t3[3] = swap32_S (h32_from_64_S (w1[3])); t4[0] = swap32_S (l32_from_64_S (w2[0])); t4[1] = swap32_S (h32_from_64_S (w2[0])); t4[2] = swap32_S (l32_from_64_S (w2[1])); t4[3] = swap32_S (h32_from_64_S (w2[1])); t5[0] = swap32_S (l32_from_64_S (w2[2])); t5[1] = swap32_S (h32_from_64_S (w2[2])); t5[2] = swap32_S (l32_from_64_S (w2[3])); t5[3] = swap32_S (h32_from_64_S (w2[3])); t6[0] = swap32_S (l32_from_64_S (w3[0])); t6[1] = swap32_S (h32_from_64_S (w3[0])); t6[2] = swap32_S (l32_from_64_S (w3[1])); t6[3] = swap32_S (h32_from_64_S (w3[1])); t7[0] = swap32_S (l32_from_64_S (w3[2])); t7[1] = swap32_S (h32_from_64_S (w3[2])); t7[2] = swap32_S (l32_from_64_S (w3[3])); t7[3] = swap32_S (h32_from_64_S (w3[3])); sha512_transform (t0, t1, t2, t3, t4, t5, t6, t7, digest); } #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 // hashcat 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) 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; #if defined IS_AMD || defined IS_GENERIC 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); #endif #ifdef IS_NV int selector = (0x76543210 >> (pm4 * 4)) & 0xffff; 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); #endif } } 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; #if defined IS_AMD || defined IS_GENERIC 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); #endif #ifdef IS_NV 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); #endif } 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 *ks, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { 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 (ks, pt, iv, 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]; } } u32 do_round (const u32 *pw, const u32 pw_len, ctx_t *ctx, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { // 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 ks[44]; aes128_set_encrypt_key (ks, ctx->dgst32, 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, ks, 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; orig_sha256_transform (&ctx->W32[ 0], &ctx->W32[ 4], &ctx->W32[ 8], &ctx->W32[12], ctx->dgst32); orig_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; orig_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; orig_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, ks, s_te0, s_te1, s_te2, s_te3, s_te4); switch (ctx->dgst_len) { case BLSZ256: orig_sha256_transform (&ctx->W32[ 0], &ctx->W32[ 4], &ctx->W32[ 8], &ctx->W32[12], ctx->dgst32); break; case BLSZ384: orig_sha384_transform (&ctx->W64[ 0], &ctx->W64[ 4], &ctx->W64[ 8], &ctx->W64[12], ctx->dgst64); break; case BLSZ512: orig_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, ks, 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] = swap64 ((u64) (final_len * 8)); ex = ctx->W64[7] >> 56; break; case BLSZ512: make_w_with_offset (ctx, 64, offset, sc, pwbl_len, iv, ks, 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] = swap64 ((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] = swap32 (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] = swap64 ((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] = swap64 ((u64) (final_len * 8)); break; } } switch (ctx->dgst_len) { case BLSZ256: orig_sha256_transform (&ctx->W32[ 0], &ctx->W32[ 4], &ctx->W32[ 8], &ctx->W32[12], ctx->dgst32); ctx->dgst32[ 0] = swap32 (ctx->dgst32[0]); ctx->dgst32[ 1] = swap32 (ctx->dgst32[1]); ctx->dgst32[ 2] = swap32 (ctx->dgst32[2]); ctx->dgst32[ 3] = swap32 (ctx->dgst32[3]); ctx->dgst32[ 4] = swap32 (ctx->dgst32[4]); ctx->dgst32[ 5] = swap32 (ctx->dgst32[5]); ctx->dgst32[ 6] = swap32 (ctx->dgst32[6]); ctx->dgst32[ 7] = swap32 (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: orig_sha384_transform (&ctx->W64[ 0], &ctx->W64[ 4], &ctx->W64[ 8], &ctx->W64[12], ctx->dgst64); ctx->dgst64[0] = swap64 (ctx->dgst64[0]); ctx->dgst64[1] = swap64 (ctx->dgst64[1]); ctx->dgst64[2] = swap64 (ctx->dgst64[2]); ctx->dgst64[3] = swap64 (ctx->dgst64[3]); ctx->dgst64[4] = swap64 (ctx->dgst64[4]); ctx->dgst64[5] = swap64 (ctx->dgst64[5]); ctx->dgst64[6] = 0; ctx->dgst64[7] = 0; break; case BLSZ512: orig_sha512_transform (&ctx->W64[ 0], &ctx->W64[ 4], &ctx->W64[ 8], &ctx->W64[12], ctx->dgst64); ctx->dgst64[0] = swap64 (ctx->dgst64[0]); ctx->dgst64[1] = swap64 (ctx->dgst64[1]); ctx->dgst64[2] = swap64 (ctx->dgst64[2]); ctx->dgst64[3] = swap64 (ctx->dgst64[3]); ctx->dgst64[4] = swap64 (ctx->dgst64[4]); ctx->dgst64[5] = swap64 (ctx->dgst64[5]); ctx->dgst64[6] = swap64 (ctx->dgst64[6]); ctx->dgst64[7] = swap64 (ctx->dgst64[7]); break; } return ex; } __kernel void m10700_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pdf17l8_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha256_ctx_t ctx; sha256_init (&ctx); sha256_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); sha256_update_global_swap (&ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha256_final (&ctx); tmps[gid].dgst32[0] = swap32_S (ctx.h[0]); tmps[gid].dgst32[1] = swap32_S (ctx.h[1]); tmps[gid].dgst32[2] = swap32_S (ctx.h[2]); tmps[gid].dgst32[3] = swap32_S (ctx.h[3]); tmps[gid].dgst32[4] = swap32_S (ctx.h[4]); tmps[gid].dgst32[5] = swap32_S (ctx.h[5]); tmps[gid].dgst32[6] = swap32_S (ctx.h[6]); tmps[gid].dgst32[7] = swap32_S (ctx.h[7]); tmps[gid].dgst_len = BLSZ256; tmps[gid].W_len = WORDSZ256; } __kernel void m10700_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pdf17l8_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; /** * base */ u32 w0[4]; 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; if (pw_len == 0) return; /** * 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 & 0xff) + 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 m10700_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pdf17l8_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ const u32 r0 = swap32_S (tmps[gid].dgst32[DGST_R0]); const u32 r1 = swap32_S (tmps[gid].dgst32[DGST_R1]); const u32 r2 = swap32_S (tmps[gid].dgst32[DGST_R2]); const u32 r3 = swap32_S (tmps[gid].dgst32[DGST_R3]); #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m10700.cl000066400000000000000000001050501320027462700154170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_sha256.cl" #include "inc_hash_sha384.cl" #include "inc_hash_sha512.cl" #include "inc_cipher_aes.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #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] void aes128_encrypt_cbc (const u32 *aes_ks, u32 *aes_iv, const u32 *in, u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { u32 data[4]; data[0] = swap32_S (in[0]); data[1] = swap32_S (in[1]); data[2] = swap32_S (in[2]); data[3] = swap32_S (in[3]); data[0] ^= aes_iv[0]; data[1] ^= aes_iv[1]; data[2] ^= aes_iv[2]; data[3] ^= aes_iv[3]; aes128_encrypt (aes_ks, data, out, s_te0, s_te1, s_te2, s_te3, s_te4); aes_iv[0] = out[0]; aes_iv[1] = out[1]; aes_iv[2] = out[2]; aes_iv[3] = out[3]; out[0] = swap32_S (out[0]); out[1] = swap32_S (out[1]); out[2] = swap32_S (out[2]); out[3] = swap32_S (out[3]); } u32 sha256_update_aes_64 (sha256_ctx_t *ctx, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const int len, const u32 *aes_ks, u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { u32 ex = 0; const int pos = ctx->len & 63; ctx->len += len; if ((pos + len) < 64) { switch_buffer_by_offset_be_S (w0, w1, w2, w3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; } else { u32 c0[4] = { 0 }; u32 c1[4] = { 0 }; u32 c2[4] = { 0 }; u32 c3[4] = { 0 }; switch_buffer_by_offset_carry_be_S (w0, w1, w2, w3, c0, c1, c2, c3, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w0, ctx->w0, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w1, ctx->w1, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w2, ctx->w2, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w3, ctx->w3, s_te0, s_te1, s_te2, s_te3, s_te4); ex = ctx->w3[3] & 0xff; sha256_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; } return ex; } void sha256_update_aes (sha256_ctx_t *ctx, const u32 *w, const int len, const u32 *aes_ks, u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha256_update_aes_64 (ctx, w0, w1, w2, w3, 64, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; sha256_update_aes_64 (ctx, w0, w1, w2, w3, len - pos1, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4); } void sha256_final_aes (sha256_ctx_t *ctx, const u32 *aes_ks, u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { int pos = ctx->len & 63; // no encryption needed, because pos is always 0 append_0x80_4x4_S (ctx->w0, ctx->w1, ctx->w2, ctx->w3, pos ^ 3); if (pos >= 56) { sha256_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; } ctx->w3[2] = 0; ctx->w3[3] = ctx->len * 8; sha256_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); } void sha384_update_aes_128 (sha384_ctx_t *ctx, 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 int len, const u32 *aes_ks, u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { const int pos = ctx->len & 127; ctx->len += len; if ((pos + len) < 128) { switch_buffer_by_offset_8x4_be_S (w0, w1, w2, w3, w4, w5, w6, w7, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; ctx->w4[0] |= w4[0]; ctx->w4[1] |= w4[1]; ctx->w4[2] |= w4[2]; ctx->w4[3] |= w4[3]; ctx->w5[0] |= w5[0]; ctx->w5[1] |= w5[1]; ctx->w5[2] |= w5[2]; ctx->w5[3] |= w5[3]; ctx->w6[0] |= w6[0]; ctx->w6[1] |= w6[1]; ctx->w6[2] |= w6[2]; ctx->w6[3] |= w6[3]; ctx->w7[0] |= w7[0]; ctx->w7[1] |= w7[1]; ctx->w7[2] |= w7[2]; ctx->w7[3] |= w7[3]; } else { u32 c0[4] = { 0 }; u32 c1[4] = { 0 }; u32 c2[4] = { 0 }; u32 c3[4] = { 0 }; u32 c4[4] = { 0 }; u32 c5[4] = { 0 }; u32 c6[4] = { 0 }; u32 c7[4] = { 0 }; switch_buffer_by_offset_8x4_carry_be_S (w0, w1, w2, w3, w4, w5, w6, w7, c0, c1, c2, c3, c4, c5, c6, c7, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; ctx->w4[0] |= w4[0]; ctx->w4[1] |= w4[1]; ctx->w4[2] |= w4[2]; ctx->w4[3] |= w4[3]; ctx->w5[0] |= w5[0]; ctx->w5[1] |= w5[1]; ctx->w5[2] |= w5[2]; ctx->w5[3] |= w5[3]; ctx->w6[0] |= w6[0]; ctx->w6[1] |= w6[1]; ctx->w6[2] |= w6[2]; ctx->w6[3] |= w6[3]; ctx->w7[0] |= w7[0]; ctx->w7[1] |= w7[1]; ctx->w7[2] |= w7[2]; ctx->w7[3] |= w7[3]; aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w0, ctx->w0, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w1, ctx->w1, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w2, ctx->w2, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w3, ctx->w3, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w4, ctx->w4, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w5, ctx->w5, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w6, ctx->w6, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w7, ctx->w7, s_te0, s_te1, s_te2, s_te3, s_te4); sha384_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; ctx->w4[0] = c4[0]; ctx->w4[1] = c4[1]; ctx->w4[2] = c4[2]; ctx->w4[3] = c4[3]; ctx->w5[0] = c5[0]; ctx->w5[1] = c5[1]; ctx->w5[2] = c5[2]; ctx->w5[3] = c5[3]; ctx->w6[0] = c6[0]; ctx->w6[1] = c6[1]; ctx->w6[2] = c6[2]; ctx->w6[3] = c6[3]; ctx->w7[0] = c7[0]; ctx->w7[1] = c7[1]; ctx->w7[2] = c7[2]; ctx->w7[3] = c7[3]; } } void sha384_update_aes (sha384_ctx_t *ctx, const u32 *w, const int len, const u32 *aes_ks, u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 128; pos1 += 128, pos4 += 32) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; sha384_update_aes_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; sha384_update_aes_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - pos1, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4); } void sha384_final_aes (sha384_ctx_t *ctx, const u32 *aes_ks, u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { int pos = ctx->len & 127; aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w0, ctx->w0, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w1, ctx->w1, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w2, ctx->w2, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w3, ctx->w3, s_te0, s_te1, s_te2, s_te3, s_te4); append_0x80_8x4_S (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, pos ^ 3); if (pos >= 112) { sha384_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->w4[0] = 0; ctx->w4[1] = 0; ctx->w4[2] = 0; ctx->w4[3] = 0; ctx->w5[0] = 0; ctx->w5[1] = 0; ctx->w5[2] = 0; ctx->w5[3] = 0; ctx->w6[0] = 0; ctx->w6[1] = 0; ctx->w6[2] = 0; ctx->w6[3] = 0; ctx->w7[0] = 0; ctx->w7[1] = 0; ctx->w7[2] = 0; ctx->w7[3] = 0; } ctx->w7[2] = 0; ctx->w7[3] = ctx->len * 8; sha384_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); } void sha512_update_aes_128 (sha512_ctx_t *ctx, 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 int len, const u32 *aes_ks, u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { const int pos = ctx->len & 127; ctx->len += len; if ((pos + len) < 128) { switch_buffer_by_offset_8x4_be_S (w0, w1, w2, w3, w4, w5, w6, w7, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; ctx->w4[0] |= w4[0]; ctx->w4[1] |= w4[1]; ctx->w4[2] |= w4[2]; ctx->w4[3] |= w4[3]; ctx->w5[0] |= w5[0]; ctx->w5[1] |= w5[1]; ctx->w5[2] |= w5[2]; ctx->w5[3] |= w5[3]; ctx->w6[0] |= w6[0]; ctx->w6[1] |= w6[1]; ctx->w6[2] |= w6[2]; ctx->w6[3] |= w6[3]; ctx->w7[0] |= w7[0]; ctx->w7[1] |= w7[1]; ctx->w7[2] |= w7[2]; ctx->w7[3] |= w7[3]; } else { u32 c0[4] = { 0 }; u32 c1[4] = { 0 }; u32 c2[4] = { 0 }; u32 c3[4] = { 0 }; u32 c4[4] = { 0 }; u32 c5[4] = { 0 }; u32 c6[4] = { 0 }; u32 c7[4] = { 0 }; switch_buffer_by_offset_8x4_carry_be_S (w0, w1, w2, w3, w4, w5, w6, w7, c0, c1, c2, c3, c4, c5, c6, c7, pos); ctx->w0[0] |= w0[0]; ctx->w0[1] |= w0[1]; ctx->w0[2] |= w0[2]; ctx->w0[3] |= w0[3]; ctx->w1[0] |= w1[0]; ctx->w1[1] |= w1[1]; ctx->w1[2] |= w1[2]; ctx->w1[3] |= w1[3]; ctx->w2[0] |= w2[0]; ctx->w2[1] |= w2[1]; ctx->w2[2] |= w2[2]; ctx->w2[3] |= w2[3]; ctx->w3[0] |= w3[0]; ctx->w3[1] |= w3[1]; ctx->w3[2] |= w3[2]; ctx->w3[3] |= w3[3]; ctx->w4[0] |= w4[0]; ctx->w4[1] |= w4[1]; ctx->w4[2] |= w4[2]; ctx->w4[3] |= w4[3]; ctx->w5[0] |= w5[0]; ctx->w5[1] |= w5[1]; ctx->w5[2] |= w5[2]; ctx->w5[3] |= w5[3]; ctx->w6[0] |= w6[0]; ctx->w6[1] |= w6[1]; ctx->w6[2] |= w6[2]; ctx->w6[3] |= w6[3]; ctx->w7[0] |= w7[0]; ctx->w7[1] |= w7[1]; ctx->w7[2] |= w7[2]; ctx->w7[3] |= w7[3]; aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w0, ctx->w0, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w1, ctx->w1, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w2, ctx->w2, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w3, ctx->w3, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w4, ctx->w4, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w5, ctx->w5, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w6, ctx->w6, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w7, ctx->w7, s_te0, s_te1, s_te2, s_te3, s_te4); sha512_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); ctx->w0[0] = c0[0]; ctx->w0[1] = c0[1]; ctx->w0[2] = c0[2]; ctx->w0[3] = c0[3]; ctx->w1[0] = c1[0]; ctx->w1[1] = c1[1]; ctx->w1[2] = c1[2]; ctx->w1[3] = c1[3]; ctx->w2[0] = c2[0]; ctx->w2[1] = c2[1]; ctx->w2[2] = c2[2]; ctx->w2[3] = c2[3]; ctx->w3[0] = c3[0]; ctx->w3[1] = c3[1]; ctx->w3[2] = c3[2]; ctx->w3[3] = c3[3]; ctx->w4[0] = c4[0]; ctx->w4[1] = c4[1]; ctx->w4[2] = c4[2]; ctx->w4[3] = c4[3]; ctx->w5[0] = c5[0]; ctx->w5[1] = c5[1]; ctx->w5[2] = c5[2]; ctx->w5[3] = c5[3]; ctx->w6[0] = c6[0]; ctx->w6[1] = c6[1]; ctx->w6[2] = c6[2]; ctx->w6[3] = c6[3]; ctx->w7[0] = c7[0]; ctx->w7[1] = c7[1]; ctx->w7[2] = c7[2]; ctx->w7[3] = c7[3]; } } void sha512_update_aes (sha512_ctx_t *ctx, const u32 *w, const int len, const u32 *aes_ks, u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; int pos1; int pos4; for (pos1 = 0, pos4 = 0; pos1 < len - 128; pos1 += 128, pos4 += 32) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; sha512_update_aes_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4); } w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; w0[2] = w[pos4 + 2]; w0[3] = w[pos4 + 3]; w1[0] = w[pos4 + 4]; w1[1] = w[pos4 + 5]; w1[2] = w[pos4 + 6]; w1[3] = w[pos4 + 7]; w2[0] = w[pos4 + 8]; w2[1] = w[pos4 + 9]; w2[2] = w[pos4 + 10]; w2[3] = w[pos4 + 11]; w3[0] = w[pos4 + 12]; w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; w4[0] = w[pos4 + 16]; w4[1] = w[pos4 + 17]; w4[2] = w[pos4 + 18]; w4[3] = w[pos4 + 19]; w5[0] = w[pos4 + 20]; w5[1] = w[pos4 + 21]; w5[2] = w[pos4 + 22]; w5[3] = w[pos4 + 23]; w6[0] = w[pos4 + 24]; w6[1] = w[pos4 + 25]; w6[2] = w[pos4 + 26]; w6[3] = w[pos4 + 27]; w7[0] = w[pos4 + 28]; w7[1] = w[pos4 + 29]; w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; sha512_update_aes_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - pos1, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4); } void sha512_final_aes (sha512_ctx_t *ctx, const u32 *aes_ks, u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { int pos = ctx->len & 127; aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w0, ctx->w0, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w1, ctx->w1, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w2, ctx->w2, s_te0, s_te1, s_te2, s_te3, s_te4); aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w3, ctx->w3, s_te0, s_te1, s_te2, s_te3, s_te4); append_0x80_8x4_S (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, pos ^ 3); if (pos >= 112) { sha512_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); ctx->w0[0] = 0; ctx->w0[1] = 0; ctx->w0[2] = 0; ctx->w0[3] = 0; ctx->w1[0] = 0; ctx->w1[1] = 0; ctx->w1[2] = 0; ctx->w1[3] = 0; ctx->w2[0] = 0; ctx->w2[1] = 0; ctx->w2[2] = 0; ctx->w2[3] = 0; ctx->w3[0] = 0; ctx->w3[1] = 0; ctx->w3[2] = 0; ctx->w3[3] = 0; ctx->w4[0] = 0; ctx->w4[1] = 0; ctx->w4[2] = 0; ctx->w4[3] = 0; ctx->w5[0] = 0; ctx->w5[1] = 0; ctx->w5[2] = 0; ctx->w5[3] = 0; ctx->w6[0] = 0; ctx->w6[1] = 0; ctx->w6[2] = 0; ctx->w6[3] = 0; ctx->w7[0] = 0; ctx->w7[1] = 0; ctx->w7[2] = 0; ctx->w7[3] = 0; } ctx->w7[2] = 0; ctx->w7[3] = ctx->len * 8; sha512_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); } int find_sum (const u32 *w, const u32 pw_len, u32 *bb, const u32 *aes_ks, const u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { u32 data[4]; data[0] = w[0]; data[1] = w[1]; data[2] = w[2]; data[3] = w[3]; for (int i = pw_len, j = 0; i < 16; i++, j++) { PUTCHAR_BE (data, i, GETCHAR_BE (bb, j)); } data[0] = swap32_S (data[0]); data[1] = swap32_S (data[1]); data[2] = swap32_S (data[2]); data[3] = swap32_S (data[3]); data[0] ^= aes_iv[0]; data[1] ^= aes_iv[1]; data[2] ^= aes_iv[2]; data[3] ^= aes_iv[3]; u32 out[4]; aes128_encrypt (aes_ks, data, out, s_te0, s_te1, s_te2, s_te3, s_te4); u32 sum = 0; for (u32 i = 0; i < 4; i++) { sum += (out[i] >> 24) & 0xff; sum += (out[i] >> 16) & 0xff; sum += (out[i] >> 8) & 0xff; sum += (out[i] >> 0) & 0xff; } return sum; } u32 do_round (const u32 *w, const u32 pw_len, pdf17l8_tmp_t *tmp, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { // get previous hash (already padded) u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; w0[0] = tmp->dgst32[0]; w0[1] = tmp->dgst32[1]; w0[2] = tmp->dgst32[2]; w0[3] = tmp->dgst32[3]; w1[0] = tmp->dgst32[4]; w1[1] = tmp->dgst32[5]; w1[2] = tmp->dgst32[6]; w1[3] = tmp->dgst32[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; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; // cipher setup u32 aes_key[4]; aes_key[0] = swap32_S (w0[0]); aes_key[1] = swap32_S (w0[1]); aes_key[2] = swap32_S (w0[2]); aes_key[3] = swap32_S (w0[3]); u32 aes_ks[44]; aes128_set_encrypt_key (aes_ks, aes_key, s_te0, s_te1, s_te2, s_te3, s_te4); u32 aes_iv[4]; aes_iv[0] = swap32_S (w1[0]); aes_iv[1] = swap32_S (w1[1]); aes_iv[2] = swap32_S (w1[2]); aes_iv[3] = swap32_S (w1[3]); // find hash to use const int sum = find_sum (w, pw_len, w0, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4); int sum3 = sum % 3; // hash data u32 ex = 0; if (sum3 == 0) { sha256_ctx_t ctx256; sha256_init (&ctx256); for (int i = 0; i < 64; i++) { sha256_update_aes (&ctx256, w, pw_len, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4); w0[0] = tmp->dgst32[ 0]; w0[1] = tmp->dgst32[ 1]; w0[2] = tmp->dgst32[ 2]; w0[3] = tmp->dgst32[ 3]; w1[0] = tmp->dgst32[ 4]; w1[1] = tmp->dgst32[ 5]; w1[2] = tmp->dgst32[ 6]; w1[3] = tmp->dgst32[ 7]; w2[0] = tmp->dgst32[ 8]; w2[1] = tmp->dgst32[ 9]; w2[2] = tmp->dgst32[10]; w2[3] = tmp->dgst32[11]; w3[0] = tmp->dgst32[12]; w3[1] = tmp->dgst32[13]; w3[2] = tmp->dgst32[14]; w3[3] = tmp->dgst32[15]; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; ex = sha256_update_aes_64 (&ctx256, w0, w1, w2, w3, tmp->dgst_len, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4); } sha256_final_aes (&ctx256, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4); tmp->dgst32[ 0] = ctx256.h[0]; tmp->dgst32[ 1] = ctx256.h[1]; tmp->dgst32[ 2] = ctx256.h[2]; tmp->dgst32[ 3] = ctx256.h[3]; tmp->dgst32[ 4] = ctx256.h[4]; tmp->dgst32[ 5] = ctx256.h[5]; tmp->dgst32[ 6] = ctx256.h[6]; tmp->dgst32[ 7] = ctx256.h[7]; tmp->dgst32[ 8] = 0; tmp->dgst32[ 9] = 0; tmp->dgst32[10] = 0; tmp->dgst32[11] = 0; tmp->dgst32[12] = 0; tmp->dgst32[13] = 0; tmp->dgst32[14] = 0; tmp->dgst32[15] = 0; tmp->dgst_len = 32; } else if (sum3 == 1) { sha384_ctx_t ctx384; sha384_init (&ctx384); for (int i = 0; i < 64; i++) { sha384_update_aes (&ctx384, w, pw_len, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4); w0[0] = tmp->dgst32[ 0]; w0[1] = tmp->dgst32[ 1]; w0[2] = tmp->dgst32[ 2]; w0[3] = tmp->dgst32[ 3]; w1[0] = tmp->dgst32[ 4]; w1[1] = tmp->dgst32[ 5]; w1[2] = tmp->dgst32[ 6]; w1[3] = tmp->dgst32[ 7]; w2[0] = tmp->dgst32[ 8]; w2[1] = tmp->dgst32[ 9]; w2[2] = tmp->dgst32[10]; w2[3] = tmp->dgst32[11]; w3[0] = tmp->dgst32[12]; w3[1] = tmp->dgst32[13]; w3[2] = tmp->dgst32[14]; w3[3] = tmp->dgst32[15]; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha384_update_aes_128 (&ctx384, w0, w1, w2, w3, w4, w5, w6, w7, tmp->dgst_len, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4); } sha384_final_aes (&ctx384, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4); ex = ctx384.w3[3] & 0xff; tmp->dgst32[ 0] = h32_from_64_S (ctx384.h[0]); tmp->dgst32[ 1] = l32_from_64_S (ctx384.h[0]); tmp->dgst32[ 2] = h32_from_64_S (ctx384.h[1]); tmp->dgst32[ 3] = l32_from_64_S (ctx384.h[1]); tmp->dgst32[ 4] = h32_from_64_S (ctx384.h[2]); tmp->dgst32[ 5] = l32_from_64_S (ctx384.h[2]); tmp->dgst32[ 6] = h32_from_64_S (ctx384.h[3]); tmp->dgst32[ 7] = l32_from_64_S (ctx384.h[3]); tmp->dgst32[ 8] = h32_from_64_S (ctx384.h[4]); tmp->dgst32[ 9] = l32_from_64_S (ctx384.h[4]); tmp->dgst32[10] = h32_from_64_S (ctx384.h[5]); tmp->dgst32[11] = l32_from_64_S (ctx384.h[5]); tmp->dgst32[12] = 0; tmp->dgst32[13] = 0; tmp->dgst32[14] = 0; tmp->dgst32[15] = 0; tmp->dgst_len = 48; } else if (sum3 == 2) { sha512_ctx_t ctx512; sha512_init (&ctx512); for (int i = 0; i < 64; i++) { sha512_update_aes (&ctx512, w, pw_len, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4); w0[0] = tmp->dgst32[ 0]; w0[1] = tmp->dgst32[ 1]; w0[2] = tmp->dgst32[ 2]; w0[3] = tmp->dgst32[ 3]; w1[0] = tmp->dgst32[ 4]; w1[1] = tmp->dgst32[ 5]; w1[2] = tmp->dgst32[ 6]; w1[3] = tmp->dgst32[ 7]; w2[0] = tmp->dgst32[ 8]; w2[1] = tmp->dgst32[ 9]; w2[2] = tmp->dgst32[10]; w2[3] = tmp->dgst32[11]; w3[0] = tmp->dgst32[12]; w3[1] = tmp->dgst32[13]; w3[2] = tmp->dgst32[14]; w3[3] = tmp->dgst32[15]; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_update_aes_128 (&ctx512, w0, w1, w2, w3, w4, w5, w6, w7, tmp->dgst_len, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4); } sha512_final_aes (&ctx512, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4); ex = ctx512.w3[3] & 0xff; tmp->dgst32[ 0] = h32_from_64_S (ctx512.h[0]); tmp->dgst32[ 1] = l32_from_64_S (ctx512.h[0]); tmp->dgst32[ 2] = h32_from_64_S (ctx512.h[1]); tmp->dgst32[ 3] = l32_from_64_S (ctx512.h[1]); tmp->dgst32[ 4] = h32_from_64_S (ctx512.h[2]); tmp->dgst32[ 5] = l32_from_64_S (ctx512.h[2]); tmp->dgst32[ 6] = h32_from_64_S (ctx512.h[3]); tmp->dgst32[ 7] = l32_from_64_S (ctx512.h[3]); tmp->dgst32[ 8] = h32_from_64_S (ctx512.h[4]); tmp->dgst32[ 9] = l32_from_64_S (ctx512.h[4]); tmp->dgst32[10] = h32_from_64_S (ctx512.h[5]); tmp->dgst32[11] = l32_from_64_S (ctx512.h[5]); tmp->dgst32[12] = h32_from_64_S (ctx512.h[6]); tmp->dgst32[13] = l32_from_64_S (ctx512.h[6]); tmp->dgst32[14] = h32_from_64_S (ctx512.h[7]); tmp->dgst32[15] = l32_from_64_S (ctx512.h[7]); tmp->dgst_len = 64; } return ex; } __kernel void m10700_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pdf17l8_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha256_ctx_t ctx; sha256_init (&ctx); sha256_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); sha256_update_global_swap (&ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha256_final (&ctx); pdf17l8_tmp_t tmp; tmp.dgst32[ 0] = ctx.h[0]; tmp.dgst32[ 1] = ctx.h[1]; tmp.dgst32[ 2] = ctx.h[2]; tmp.dgst32[ 3] = ctx.h[3]; tmp.dgst32[ 4] = ctx.h[4]; tmp.dgst32[ 5] = ctx.h[5]; tmp.dgst32[ 6] = ctx.h[6]; tmp.dgst32[ 7] = ctx.h[7]; tmp.dgst32[ 8] = 0; tmp.dgst32[ 9] = 0; tmp.dgst32[10] = 0; tmp.dgst32[11] = 0; tmp.dgst32[12] = 0; tmp.dgst32[13] = 0; tmp.dgst32[14] = 0; tmp.dgst32[15] = 0; tmp.dgst_len = 32; tmps[gid] = tmp; } __kernel void m10700_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pdf17l8_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = swap32_S (pws[gid].i[idx]); } /** * digest */ pdf17l8_tmp_t tmp = tmps[gid]; u32 ex = 0; for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) { ex = do_round (w, pw_len, &tmp, s_te0, s_te1, s_te2, s_te3, s_te4); } if ((loop_pos + loop_cnt) == 64) { for (u32 i = 64; i < (ex & 0xff) + 32; i++) { ex = do_round (w, pw_len, &tmp, s_te0, s_te1, s_te2, s_te3, s_te4); } } tmps[gid] = tmp; } __kernel void m10700_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pdf17l8_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * digest */ const u32 r0 = tmps[gid].dgst32[DGST_R0]; const u32 r1 = tmps[gid].dgst32[DGST_R1]; const u32 r2 = tmps[gid].dgst32[DGST_R2]; const u32 r3 = tmps[gid].dgst32[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m10800_a0-optimized.cl000066400000000000000000000361621320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __constant u64a k_sha384[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, }; 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); #ifdef _unroll #pragma unroll #endif 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; } __kernel void m10800_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha512 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m10800_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10800_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10800_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha512 */ u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m10800_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10800_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m10800_a0.cl000066400000000000000000000100261320027462700157760ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha384.cl" __kernel void m10800_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha384_ctx_t ctx; sha384_init (&ctx); sha384_update_swap (&ctx, tmp.i, tmp.pw_len); sha384_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[3]); const u32 r1 = h32_from_64_S (ctx.h[3]); const u32 r2 = l32_from_64_S (ctx.h[2]); const u32 r3 = h32_from_64_S (ctx.h[2]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m10800_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha384_ctx_t ctx; sha384_init (&ctx); sha384_update_swap (&ctx, tmp.i, tmp.pw_len); sha384_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[3]); const u32 r1 = h32_from_64_S (ctx.h[3]); const u32 r2 = l32_from_64_S (ctx.h[2]); const u32 r3 = h32_from_64_S (ctx.h[2]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m10800_a1-optimized.cl000066400000000000000000000445511320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u64a k_sha384[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, }; 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); #ifdef _unroll #pragma unroll #endif 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; } __kernel void m10800_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m10800_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10800_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10800_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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] = swap32 (w0[0]); w0_t[1] = swap32 (w0[1]); w0_t[2] = swap32 (w0[2]); w0_t[3] = swap32 (w0[3]); w1_t[0] = swap32 (w1[0]); w1_t[1] = swap32 (w1[1]); w1_t[2] = swap32 (w1[2]); w1_t[3] = swap32 (w1[3]); w2_t[0] = swap32 (w2[0]); w2_t[1] = swap32 (w2[1]); w2_t[2] = swap32 (w2[2]); w2_t[3] = swap32 (w2[3]); w3_t[0] = swap32 (w3[0]); w3_t[1] = swap32 (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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m10800_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m10800_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m10800_a1.cl000066400000000000000000000077651320027462700160170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha384.cl" __kernel void m10800_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ sha384_ctx_t ctx0; sha384_init (&ctx0); sha384_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha384_ctx_t ctx = ctx0; sha384_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha384_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[3]); const u32 r1 = h32_from_64_S (ctx.h[3]); const u32 r2 = l32_from_64_S (ctx.h[2]); const u32 r3 = h32_from_64_S (ctx.h[2]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m10800_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ sha384_ctx_t ctx0; sha384_init (&ctx0); sha384_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha384_ctx_t ctx = ctx0; sha384_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha384_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[3]); const u32 r1 = h32_from_64_S (ctx.h[3]); const u32 r2 = l32_from_64_S (ctx.h[2]); const u32 r3 = h32_from_64_S (ctx.h[2]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m10800_a3-optimized.cl000066400000000000000000000530251320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u64a k_sha384[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, }; 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); #ifdef _unroll #pragma unroll #endif 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; } void m10800m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } void m10800s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m10800_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10800_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10800_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10800_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10800_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m10800_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m10800_a3.cl000066400000000000000000000105231320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha384.cl" __kernel void m10800_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha384_ctx_vector_t ctx; sha384_init_vector (&ctx); sha384_update_vector (&ctx, w, pw_len); sha384_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.h[3]); const u32x r1 = h32_from_64 (ctx.h[3]); const u32x r2 = l32_from_64 (ctx.h[2]); const u32x r3 = h32_from_64 (ctx.h[2]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m10800_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha384_ctx_vector_t ctx; sha384_init_vector (&ctx); sha384_update_vector (&ctx, w, pw_len); sha384_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.h[3]); const u32x r1 = h32_from_64 (ctx.h[3]); const u32x r2 = l32_from_64 (ctx.h[2]); const u32x r3 = h32_from_64 (ctx.h[2]); COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m10900.cl000066400000000000000000000241471320027462700154300ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha256_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m10900_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha256_hmac_ctx_t sha256_hmac_ctx; sha256_hmac_init_global_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha256_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha256_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha256_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha256_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha256_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha256_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha256_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha256_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha256_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha256_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha256_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha256_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha256_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha256_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha256_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha256_hmac_ctx.opad.h[7]; sha256_hmac_update_global_swap (&sha256_hmac_ctx, esalt_bufs[digests_offset].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) { sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); sha256_hmac_final (&sha256_hmac_ctx2); tmps[gid].dgst[i + 0] = sha256_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha256_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha256_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha256_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha256_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha256_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha256_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha256_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m10900_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[8]; u32x opad[8]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); ipad[5] = packv (tmps, ipad, gid, 5); ipad[6] = packv (tmps, ipad, gid, 6); ipad[7] = packv (tmps, ipad, gid, 7); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); opad[5] = packv (tmps, opad, gid, 5); opad[6] = packv (tmps, opad, gid, 6); opad[7] = packv (tmps, opad, gid, 7); for (u32 i = 0; i < 8; i += 8) { u32x dgst[8]; u32x out[8]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); dgst[5] = packv (tmps, dgst, gid, i + 5); dgst[6] = packv (tmps, dgst, gid, i + 6); dgst[7] = packv (tmps, dgst, gid, i + 7); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, i + 4); out[5] = packv (tmps, out, gid, i + 5); out[6] = packv (tmps, out, gid, i + 6); out[7] = packv (tmps, out, gid, i + 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, dgst, gid, i + 5, dgst[5]); unpackv (tmps, dgst, gid, i + 6, dgst[6]); unpackv (tmps, dgst, gid, i + 7, dgst[7]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); unpackv (tmps, out, gid, i + 5, out[5]); unpackv (tmps, out, gid, i + 6, out[6]); unpackv (tmps, out, gid, i + 7, out[7]); } } __kernel void m10900_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); const u32 r0 = tmps[gid].out[DGST_R0]; const u32 r1 = tmps[gid].out[DGST_R1]; const u32 r2 = tmps[gid].out[DGST_R2]; const u32 r3 = tmps[gid].out[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m11000_a0-optimized.cl000066400000000000000000000677201320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m11000_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); const u32x pw_salt_len = salt_len + out_len; /** * prepend salt */ // first step fixed 56 bytes of salt // after 56 byte salt, we have beginning of the password 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]; w3_t[2] = w0[0]; w3_t[3] = w0[1]; /** * 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); u32x t; 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] = 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] = 0; w1_t[3] = 0; w2_t[0] = 0; w2_t[1] = 0; w2_t[2] = 0; w2_t[3] = 0; w3_t[0] = 0; w3_t[1] = 0; 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; COMPARE_M_SIMD (a, d, c, b); } } __kernel void m11000_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11000_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11000_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); const u32x pw_salt_len = salt_len + out_len; /** * prepend salt */ // first step fixed 56 bytes of salt // after 56 byte salt, we have beginning of the password 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]; w3_t[2] = w0[0]; w3_t[3] = w0[1]; /** * 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); u32x t; 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] = 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] = 0; w1_t[3] = 0; w2_t[0] = 0; w2_t[1] = 0; w2_t[2] = 0; w2_t[3] = 0; w3_t[0] = 0; w3_t[1] = 0; 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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m11000_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11000_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m11000_a0.cl000066400000000000000000000102071320027462700157700ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m11000_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx = ctx0; md5_update (&ctx, tmp.i, tmp.pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m11000_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx = ctx0; md5_update (&ctx, tmp.i, tmp.pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m11000_a1-optimized.cl000066400000000000000000000764071320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m11000_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; const u32x pw_salt_len = salt_len + pw_len; /** * prepend salt */ // first step fixed 56 bytes of salt // after 56 byte salt, we have beginning of the password 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]; w3_t[2] = w0[0]; w3_t[3] = w0[1]; /** * 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); u32x t; 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] = 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_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; COMPARE_M_SIMD (a, d, c, b); } } __kernel void m11000_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11000_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11000_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; const u32x pw_salt_len = salt_len + pw_len; /** * prepend salt */ // first step fixed 56 bytes of salt // after 56 byte salt, we have beginning of the password 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]; w3_t[2] = w0[0]; w3_t[3] = w0[1]; /** * 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); u32x t; 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] = 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_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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m11000_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11000_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m11000_a1.cl000066400000000000000000000100361320027462700157710ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" __kernel void m11000_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m11000_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx = ctx0; md5_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m11000_a3-optimized.cl000066400000000000000000001057411320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m11000m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * prepend salt */ // first step fixed 56 bytes of salt // after 56 byte salt, we have beginning of the password 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]; w3_t[2] = w0lr; w3_t[3] = w0[1]; /** * 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); u32x t; 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] = 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_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; COMPARE_M_SIMD (a, d, c, b); } } void m11000s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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; 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * prepend salt */ // first step fixed 56 bytes of salt // after 56 byte salt, we have beginning of the password 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]; w3_t[2] = w0lr; w3_t[3] = w0[1]; /** * 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); u32x t; 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] = 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_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; COMPARE_S_SIMD (a, d, c, b); } } __kernel void m11000_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11000_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11000_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11000_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11000_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11000_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m11000_a3.cl000066400000000000000000000110421320027462700157710ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" __kernel void m11000_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector_from_scalar (&ctx, &ctx0); md5_update_vector (&ctx, w, pw_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m11000_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx; md5_init_vector_from_scalar (&ctx, &ctx0); md5_update_vector (&ctx, w, pw_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m11100_a0-optimized.cl000066400000000000000000000743021320027462700200010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m11100_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug, see challenge 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]; 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; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * append the salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); const u32x 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; /* * 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[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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; // add the 4 byte challenge here w2[0] = challenge; w2[1] = 0x00000080; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = (32 + 4) * 8; w3[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[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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m11100_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11100_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11100_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug, see challenge 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]; 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] }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * append the salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); const u32x 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; /* * 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[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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; // add the 4 byte challenge here w2[0] = challenge; w2[1] = 0x00000080; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = (32 + 4) * 8; w3[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[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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m11100_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11100_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m11100_a0.cl000066400000000000000000000242571320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m11100_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * salt */ u32 challenge; challenge = salt_bufs[salt_pos].salt_buf[0]; u32 salt_buf0[4]; u32 salt_buf1[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[1]; // not a bug, see challenge 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]; 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; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx1; md5_init (&ctx1); md5_update (&ctx1, tmp.i, tmp.pw_len); u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; md5_update_64 (&ctx1, s0, s1, s2, s3, salt_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.w2[0] = challenge; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 0; ctx.len = 32 + 4; md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m11100_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * salt */ u32 challenge; challenge = salt_bufs[salt_pos].salt_buf[0]; u32 salt_buf0[4]; u32 salt_buf1[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[1]; // not a bug, see challenge 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]; 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; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx1; md5_init (&ctx1); md5_update (&ctx1, tmp.i, tmp.pw_len); u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; md5_update_64 (&ctx1, s0, s1, s2, s3, salt_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.w2[0] = challenge; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 0; ctx.len = 32 + 4; md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m11100_a1-optimized.cl000066400000000000000000001027751320027462700200100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m11100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * challenge */ u32 challenge; challenge = salt_bufs[salt_pos].salt_buf[0]; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug, see challenge 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]; 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; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 the salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); const u32x 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 ($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[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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; // add the 4 byte challenge here w2[0] = challenge; w2[1] = 0x00000080; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = (32 + 4) * 8; w3[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[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); COMPARE_M_SIMD (a, d, c, b); } } __kernel void m11100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * challenge */ u32 challenge; challenge = salt_bufs[salt_pos].salt_buf[0]; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug, see challenge 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]; 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] }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 the salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); const u32x 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 ($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[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); u32x t; 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 += MD5M_A; b += MD5M_B; c += MD5M_C; d += MD5M_D; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; // add the 4 byte challenge here w2[0] = challenge; w2[1] = 0x00000080; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = (32 + 4) * 8; w3[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[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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m11100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m11100_a1.cl000066400000000000000000000241761320027462700160040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m11100_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * salt */ u32 challenge; challenge = salt_bufs[salt_pos].salt_buf[0]; u32 salt_buf0[4]; u32 salt_buf1[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[1]; // not a bug, see challenge 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]; 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; /** * base */ md5_ctx_t ctx0t; md5_init (&ctx0t); md5_update_global (&ctx0t, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0t; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; md5_update_64 (&ctx1, s0, s1, s2, s3, salt_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.w2[0] = challenge; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 0; ctx.len = 32 + 4; md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m11100_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * salt */ u32 challenge; challenge = salt_bufs[salt_pos].salt_buf[0]; u32 salt_buf0[4]; u32 salt_buf1[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[1]; // not a bug, see challenge 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]; 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; /** * base */ md5_ctx_t ctx0t; md5_init (&ctx0t); md5_update_global (&ctx0t, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0t; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; md5_update_64 (&ctx1, s0, s1, s2, s3, salt_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.w2[0] = challenge; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 0; ctx.len = 32 + 4; md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m11100_a3-optimized.cl000066400000000000000000001207071320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void m11100m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * challenge */ u32 challenge; challenge = salt_bufs[salt_pos].salt_buf[0]; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug, see challenge 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]; 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; u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_S (s0, s1, s2, s3, 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; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /* * 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); u32x t; 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; 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_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); COMPARE_M_SIMD (a, d, c, b); } } void m11100s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * challenge */ u32 challenge; challenge = salt_bufs[salt_pos].salt_buf[0]; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug, see challenge 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]; 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; u32 s0[4]; u32 s1[4]; u32 s2[4]; u32 s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_S (s0, s1, s2, s3, 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; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_buf[digests_offset].digest_buf[DGST_R1], digests_buf[digests_offset].digest_buf[DGST_R2], digests_buf[digests_offset].digest_buf[DGST_R3] }; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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]; /* * 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); u32x t; 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; 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_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); if (MATCHES_NONE_VS (a, search[0])) 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); COMPARE_S_SIMD (a, d, c, b); } } __kernel void m11100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m11100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m11100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m11100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m11100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m11100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } hashcat-4.0.1/OpenCL/m11100_a3.cl000066400000000000000000000272201320027462700157770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m11100_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * salt */ u32 challenge; challenge = salt_bufs[salt_pos].salt_buf[0]; u32 salt_buf0[4]; u32 salt_buf1[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[1]; // not a bug, see challenge 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]; 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; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; md5_ctx_vector_t ctx1; md5_init_vector (&ctx1); md5_update_vector (&ctx1, w, pw_len); u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; md5_update_vector_64 (&ctx1, s0, s1, s2, s3, salt_len); md5_final_vector (&ctx1); const u32x a = ctx1.h[0]; const u32x b = ctx1.h[1]; const u32x c = ctx1.h[2]; const u32x d = ctx1.h[3]; u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; w2[0] = challenge; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; md5_ctx_vector_t ctx; md5_init_vector (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.w2[0] = challenge; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 0; ctx.len = 32 + 4; md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m11100_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * salt */ u32 challenge; challenge = salt_bufs[salt_pos].salt_buf[0]; u32 salt_buf0[4]; u32 salt_buf1[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[1]; // not a bug, see challenge 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]; 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; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; md5_ctx_vector_t ctx1; md5_init_vector (&ctx1); md5_update_vector (&ctx1, w, pw_len); u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; md5_update_vector_64 (&ctx1, s0, s1, s2, s3, salt_len); md5_final_vector (&ctx1); const u32x a = ctx1.h[0]; const u32x b = ctx1.h[1]; const u32x c = ctx1.h[2]; const u32x d = ctx1.h[3]; md5_ctx_vector_t ctx; md5_init_vector (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.w2[0] = challenge; ctx.w2[1] = 0; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 0; ctx.len = 32 + 4; md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m11200_a0-optimized.cl000066400000000000000000001540641320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m11200_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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] = swap32_S (salt_bufs[salt_pos].salt_buf[0]); salt_buf[1] = swap32_S (salt_bufs[salt_pos].salt_buf[1]); salt_buf[2] = swap32_S (salt_bufs[salt_pos].salt_buf[2]); salt_buf[3] = swap32_S (salt_bufs[salt_pos].salt_buf[3]); salt_buf[4] = swap32_S (salt_bufs[salt_pos].salt_buf[4]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 ($pass) */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 plain_sha1_a = a + SHA1M_A; const u32x plain_sha1_b = b + SHA1M_B; const u32x plain_sha1_c = c + SHA1M_C; const u32x plain_sha1_d = d + SHA1M_D; const 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; COMPARE_M_SIMD (d, e, c, b); } } __kernel void m11200_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11200_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11200_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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] = swap32_S (salt_bufs[salt_pos].salt_buf[0]); salt_buf[1] = swap32_S (salt_bufs[salt_pos].salt_buf[1]); salt_buf[2] = swap32_S (salt_bufs[salt_pos].salt_buf[2]); salt_buf[3] = swap32_S (salt_bufs[salt_pos].salt_buf[3]); salt_buf[4] = swap32_S (salt_bufs[salt_pos].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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 ($pass) */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 plain_sha1_a = a + SHA1M_A; const u32x plain_sha1_b = b + SHA1M_B; const u32x plain_sha1_c = c + SHA1M_C; const u32x plain_sha1_d = d + SHA1M_D; const 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; COMPARE_S_SIMD (d, e, c, b); } } __kernel void m11200_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11200_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m11200_a0.cl000066400000000000000000000144001320027462700157710ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m11200_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx2; sha1_init (&ctx2); sha1_update_swap (&ctx2, tmp.i, tmp.pw_len); sha1_final (&ctx2); u32 a = ctx2.h[0]; u32 b = ctx2.h[1]; u32 c = ctx2.h[2]; u32 d = ctx2.h[3]; u32 e = ctx2.h[4]; const u32 a_sav = a; const u32 b_sav = b; const u32 c_sav = c; const u32 d_sav = d; const u32 e_sav = e; sha1_ctx_t ctx1; sha1_init (&ctx1); ctx1.w0[0] = a; ctx1.w0[1] = b; ctx1.w0[2] = c; ctx1.w0[3] = d; ctx1.w1[0] = e; ctx1.len = 20; sha1_final (&ctx1); a = ctx1.h[0]; b = ctx1.h[1]; c = ctx1.h[2]; d = ctx1.h[3]; e = ctx1.h[4]; sha1_ctx_t ctx = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = a; w0[1] = b; w0[2] = c; w0[3] = d; w1[0] = e; 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; sha1_update_64 (&ctx, w0, w1, w2, w3, 20); sha1_final (&ctx); ctx.h[0] ^= a_sav; ctx.h[1] ^= b_sav; ctx.h[2] ^= c_sav; ctx.h[3] ^= d_sav; ctx.h[4] ^= e_sav; const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m11200_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx2; sha1_init (&ctx2); sha1_update_swap (&ctx2, tmp.i, tmp.pw_len); sha1_final (&ctx2); u32 a = ctx2.h[0]; u32 b = ctx2.h[1]; u32 c = ctx2.h[2]; u32 d = ctx2.h[3]; u32 e = ctx2.h[4]; const u32 a_sav = a; const u32 b_sav = b; const u32 c_sav = c; const u32 d_sav = d; const u32 e_sav = e; sha1_ctx_t ctx1; sha1_init (&ctx1); ctx1.w0[0] = a; ctx1.w0[1] = b; ctx1.w0[2] = c; ctx1.w0[3] = d; ctx1.w1[0] = e; ctx1.len = 20; sha1_final (&ctx1); a = ctx1.h[0]; b = ctx1.h[1]; c = ctx1.h[2]; d = ctx1.h[3]; e = ctx1.h[4]; sha1_ctx_t ctx = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = a; w0[1] = b; w0[2] = c; w0[3] = d; w1[0] = e; 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; sha1_update_64 (&ctx, w0, w1, w2, w3, 20); sha1_final (&ctx); ctx.h[0] ^= a_sav; ctx.h[1] ^= b_sav; ctx.h[2] ^= c_sav; ctx.h[3] ^= d_sav; ctx.h[4] ^= e_sav; const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m11200_a1-optimized.cl000066400000000000000000001624331320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m11200_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf[5]; salt_buf[0] = swap32_S (salt_bufs[salt_pos].salt_buf[0]); salt_buf[1] = swap32_S (salt_bufs[salt_pos].salt_buf[1]); salt_buf[2] = swap32_S (salt_bufs[salt_pos].salt_buf[2]); salt_buf[3] = swap32_S (salt_bufs[salt_pos].salt_buf[3]); salt_buf[4] = swap32_S (salt_bufs[salt_pos].salt_buf[4]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 ($pass) */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 plain_sha1_a = a + SHA1M_A; const u32x plain_sha1_b = b + SHA1M_B; const u32x plain_sha1_c = c + SHA1M_C; const u32x plain_sha1_d = d + SHA1M_D; const 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; COMPARE_M_SIMD (d, e, c, b); } } __kernel void m11200_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11200_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11200_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf[5]; salt_buf[0] = swap32_S (salt_bufs[salt_pos].salt_buf[0]); salt_buf[1] = swap32_S (salt_bufs[salt_pos].salt_buf[1]); salt_buf[2] = swap32_S (salt_bufs[salt_pos].salt_buf[2]); salt_buf[3] = swap32_S (salt_bufs[salt_pos].salt_buf[3]); salt_buf[4] = swap32_S (salt_bufs[salt_pos].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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 ($pass) */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 plain_sha1_a = a + SHA1M_A; const u32x plain_sha1_b = b + SHA1M_B; const u32x plain_sha1_c = c + SHA1M_C; const u32x plain_sha1_d = d + SHA1M_D; const 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; COMPARE_S_SIMD (d, e, c, b); } } __kernel void m11200_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11200_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m11200_a1.cl000066400000000000000000000143351320027462700160010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m11200_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_ctx_t ctx2l; sha1_init (&ctx2l); sha1_update_global_swap (&ctx2l, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx2 = ctx2l; sha1_update_global_swap (&ctx2, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx2); u32 a = ctx2.h[0]; u32 b = ctx2.h[1]; u32 c = ctx2.h[2]; u32 d = ctx2.h[3]; u32 e = ctx2.h[4]; const u32 a_sav = a; const u32 b_sav = b; const u32 c_sav = c; const u32 d_sav = d; const u32 e_sav = e; sha1_ctx_t ctx1; sha1_init (&ctx1); ctx1.w0[0] = a; ctx1.w0[1] = b; ctx1.w0[2] = c; ctx1.w0[3] = d; ctx1.w1[0] = e; ctx1.len = 20; sha1_final (&ctx1); a = ctx1.h[0]; b = ctx1.h[1]; c = ctx1.h[2]; d = ctx1.h[3]; e = ctx1.h[4]; sha1_ctx_t ctx = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = a; w0[1] = b; w0[2] = c; w0[3] = d; w1[0] = e; 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; sha1_update_64 (&ctx, w0, w1, w2, w3, 20); sha1_final (&ctx); ctx.h[0] ^= a_sav; ctx.h[1] ^= b_sav; ctx.h[2] ^= c_sav; ctx.h[3] ^= d_sav; ctx.h[4] ^= e_sav; const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m11200_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_ctx_t ctx2l; sha1_init (&ctx2l); sha1_update_global_swap (&ctx2l, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx2 = ctx2l; sha1_update_global_swap (&ctx2, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx2); u32 a = ctx2.h[0]; u32 b = ctx2.h[1]; u32 c = ctx2.h[2]; u32 d = ctx2.h[3]; u32 e = ctx2.h[4]; const u32 a_sav = a; const u32 b_sav = b; const u32 c_sav = c; const u32 d_sav = d; const u32 e_sav = e; sha1_ctx_t ctx1; sha1_init (&ctx1); ctx1.w0[0] = a; ctx1.w0[1] = b; ctx1.w0[2] = c; ctx1.w0[3] = d; ctx1.w1[0] = e; ctx1.len = 20; sha1_final (&ctx1); a = ctx1.h[0]; b = ctx1.h[1]; c = ctx1.h[2]; d = ctx1.h[3]; e = ctx1.h[4]; sha1_ctx_t ctx = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = a; w0[1] = b; w0[2] = c; w0[3] = d; w1[0] = e; 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; sha1_update_64 (&ctx, w0, w1, w2, w3, 20); sha1_final (&ctx); ctx.h[0] ^= a_sav; ctx.h[1] ^= b_sav; ctx.h[2] ^= c_sav; ctx.h[3] ^= d_sav; ctx.h[4] ^= e_sav; const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m11200_a3-optimized.cl000066400000000000000000001720111320027462700200010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m11200m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf[5]; salt_buf[0] = swap32_S (salt_bufs[salt_pos].salt_buf[0]); salt_buf[1] = swap32_S (salt_bufs[salt_pos].salt_buf[1]); salt_buf[2] = swap32_S (salt_bufs[salt_pos].salt_buf[2]); salt_buf[3] = swap32_S (salt_bufs[salt_pos].salt_buf[3]); salt_buf[4] = swap32_S (salt_bufs[salt_pos].salt_buf[4]); /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * sha1 ($pass) */ u32x w0_t = w0lr; 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); const u32x plain_sha1_a = a + SHA1M_A; const u32x plain_sha1_b = b + SHA1M_B; const u32x plain_sha1_c = c + SHA1M_C; const u32x plain_sha1_d = d + SHA1M_D; const 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; COMPARE_M_SIMD (d, e, c, b); } } void m11200s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf[5]; salt_buf[0] = swap32_S (salt_bufs[salt_pos].salt_buf[0]); salt_buf[1] = swap32_S (salt_bufs[salt_pos].salt_buf[1]); salt_buf[2] = swap32_S (salt_bufs[salt_pos].salt_buf[2]); salt_buf[3] = swap32_S (salt_bufs[salt_pos].salt_buf[3]); salt_buf[4] = swap32_S (salt_bufs[salt_pos].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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * sha1 ($pass) */ u32x w0_t = w0lr; 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); const u32x plain_sha1_a = a + SHA1M_A; const u32x plain_sha1_b = b + SHA1M_B; const u32x plain_sha1_c = c + SHA1M_C; const u32x plain_sha1_d = d + SHA1M_D; const 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; COMPARE_S_SIMD (d, e, c, b); } } __kernel void m11200_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11200_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11200_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11200_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11200_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11200_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m11200_a3.cl000066400000000000000000000172421320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m11200_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; sha1_ctx_vector_t ctx2; sha1_init_vector (&ctx2); sha1_update_vector (&ctx2, w, pw_len); sha1_final_vector (&ctx2); u32x a = ctx2.h[0]; u32x b = ctx2.h[1]; u32x c = ctx2.h[2]; u32x d = ctx2.h[3]; u32x e = ctx2.h[4]; const u32x a_sav = a; const u32x b_sav = b; const u32x c_sav = c; const u32x d_sav = d; const u32x e_sav = e; sha1_ctx_vector_t ctx1; sha1_init_vector (&ctx1); ctx1.w0[0] = a; ctx1.w0[1] = b; ctx1.w0[2] = c; ctx1.w0[3] = d; ctx1.w1[0] = e; ctx1.len = 20; sha1_final_vector (&ctx1); a = ctx1.h[0]; b = ctx1.h[1]; c = ctx1.h[2]; d = ctx1.h[3]; e = ctx1.h[4]; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); 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] = e; 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; sha1_update_vector_64 (&ctx, w0, w1, w2, w3, 20); sha1_final_vector (&ctx); ctx.h[0] ^= a_sav; ctx.h[1] ^= b_sav; ctx.h[2] ^= c_sav; ctx.h[3] ^= d_sav; ctx.h[4] ^= e_sav; const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m11200_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; sha1_ctx_vector_t ctx2; sha1_init_vector (&ctx2); sha1_update_vector (&ctx2, w, pw_len); sha1_final_vector (&ctx2); u32x a = ctx2.h[0]; u32x b = ctx2.h[1]; u32x c = ctx2.h[2]; u32x d = ctx2.h[3]; u32x e = ctx2.h[4]; const u32x a_sav = a; const u32x b_sav = b; const u32x c_sav = c; const u32x d_sav = d; const u32x e_sav = e; sha1_ctx_vector_t ctx1; sha1_init_vector (&ctx1); ctx1.w0[0] = a; ctx1.w0[1] = b; ctx1.w0[2] = c; ctx1.w0[3] = d; ctx1.w1[0] = e; ctx1.len = 20; sha1_final_vector (&ctx1); a = ctx1.h[0]; b = ctx1.h[1]; c = ctx1.h[2]; d = ctx1.h[3]; e = ctx1.h[4]; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); 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] = e; 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; sha1_update_vector_64 (&ctx, w0, w1, w2, w3, 20); sha1_final_vector (&ctx); ctx.h[0] ^= a_sav; ctx.h[1] ^= b_sav; ctx.h[2] ^= c_sav; ctx.h[3] ^= d_sav; ctx.h[4] ^= e_sav; const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m11300.cl000066400000000000000000000251411320027462700154160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" #include "inc_cipher_aes.cl" void hmac_sha512_run_V (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); w0[0] = h32_from_64 (digest[0]); w0[1] = l32_from_64 (digest[0]); w0[2] = h32_from_64 (digest[1]); w0[3] = l32_from_64 (digest[1]); w1[0] = h32_from_64 (digest[2]); w1[1] = l32_from_64 (digest[2]); w1[2] = h32_from_64 (digest[3]); w1[3] = l32_from_64 (digest[3]); w2[0] = h32_from_64 (digest[4]); w2[1] = l32_from_64 (digest[4]); w2[2] = h32_from_64 (digest[5]); w2[3] = l32_from_64 (digest[5]); w3[0] = h32_from_64 (digest[6]); w3[1] = l32_from_64 (digest[6]); w3[2] = h32_from_64 (digest[7]); w3[3] = l32_from_64 (digest[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } __kernel void m11300_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global bitcoin_wallet_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global bitcoin_wallet_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha512_ctx_t ctx; sha512_init (&ctx); sha512_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); sha512_update_global_swap (&ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha512_final (&ctx); tmps[gid].dgst[0] = ctx.h[0]; tmps[gid].dgst[1] = ctx.h[1]; tmps[gid].dgst[2] = ctx.h[2]; tmps[gid].dgst[3] = ctx.h[3]; tmps[gid].dgst[4] = ctx.h[4]; tmps[gid].dgst[5] = ctx.h[5]; tmps[gid].dgst[6] = ctx.h[6]; tmps[gid].dgst[7] = ctx.h[7]; } __kernel void m11300_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global bitcoin_wallet_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global bitcoin_wallet_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u64x t0 = pack64v (tmps, dgst, gid, 0); u64x t1 = pack64v (tmps, dgst, gid, 1); u64x t2 = pack64v (tmps, dgst, gid, 2); u64x t3 = pack64v (tmps, dgst, gid, 3); u64x t4 = pack64v (tmps, dgst, gid, 4); u64x t5 = pack64v (tmps, dgst, gid, 5); u64x t6 = pack64v (tmps, dgst, gid, 6); u64x t7 = pack64v (tmps, dgst, gid, 7); u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; 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] = 0; w3[2] = 0; w3[3] = 0; w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 64 * 8; for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) { w0[0] = h32_from_64 (t0); w0[1] = l32_from_64 (t0); w0[2] = h32_from_64 (t1); w0[3] = l32_from_64 (t1); w1[0] = h32_from_64 (t2); w1[1] = l32_from_64 (t2); w1[2] = h32_from_64 (t3); w1[3] = l32_from_64 (t3); w2[0] = h32_from_64 (t4); w2[1] = l32_from_64 (t4); w2[2] = h32_from_64 (t5); w2[3] = l32_from_64 (t5); w3[0] = h32_from_64 (t6); w3[1] = l32_from_64 (t6); w3[2] = h32_from_64 (t7); w3[3] = l32_from_64 (t7); 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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); t0 = digest[0]; t1 = digest[1]; t2 = digest[2]; t3 = digest[3]; t4 = digest[4]; t5 = digest[5]; t6 = digest[6]; t7 = digest[7]; } unpack64v (tmps, dgst, gid, 0, t0); unpack64v (tmps, dgst, gid, 1, t1); unpack64v (tmps, dgst, gid, 2, t2); unpack64v (tmps, dgst, gid, 3, t3); unpack64v (tmps, dgst, gid, 4, t4); unpack64v (tmps, dgst, gid, 5, t5); unpack64v (tmps, dgst, gid, 6, t6); unpack64v (tmps, dgst, gid, 7, t7); } __kernel void m11300_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global bitcoin_wallet_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global bitcoin_wallet_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif 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]; u32 key[8]; key[0] = h32_from_64_S (dgst[0]); key[1] = l32_from_64_S (dgst[0]); key[2] = h32_from_64_S (dgst[1]); key[3] = l32_from_64_S (dgst[1]); key[4] = h32_from_64_S (dgst[2]); key[5] = l32_from_64_S (dgst[2]); key[6] = h32_from_64_S (dgst[3]); key[7] = l32_from_64_S (dgst[3]); u32 iv[4]; iv[0] = h32_from_64_S (dgst[4]); iv[1] = l32_from_64_S (dgst[4]); iv[2] = h32_from_64_S (dgst[5]); iv[3] = l32_from_64_S (dgst[5]); #define KEYLEN 60 u32 ks[KEYLEN]; AES256_set_decrypt_key (ks, key, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); u32 out[4]; for (u32 i = 0; i < esalt_bufs[digests_offset].cry_master_len; i += 16) { u32 data[4]; data[0] = swap32_S (esalt_bufs[digests_offset].cry_master_buf[(i / 4) + 0]); data[1] = swap32_S (esalt_bufs[digests_offset].cry_master_buf[(i / 4) + 1]); data[2] = swap32_S (esalt_bufs[digests_offset].cry_master_buf[(i / 4) + 2]); data[3] = swap32_S (esalt_bufs[digests_offset].cry_master_buf[(i / 4) + 3]); AES256_decrypt (ks, data, out, 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)) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m11400_a0.cl000066400000000000000000000203311320027462700157730ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m11400_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx1 = ctx0; md5_update (&ctx1, tmp.i, tmp.pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update_global (&ctx, esalt_bufs[digests_offset].esalt_buf, esalt_bufs[digests_offset].esalt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m11400_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ COPY_PW (pws[gid]); md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md5_ctx_t ctx1 = ctx0; md5_update (&ctx1, tmp.i, tmp.pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update_global (&ctx, esalt_bufs[digests_offset].esalt_buf, esalt_bufs[digests_offset].esalt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m11400_a1.cl000066400000000000000000000202141320027462700157740ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m11400_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, esalt_bufs[digests_offset].salt_buf, esalt_bufs[digests_offset].salt_len); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update_global (&ctx, esalt_bufs[digests_offset].esalt_buf, esalt_bufs[digests_offset].esalt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m11400_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, esalt_bufs[digests_offset].salt_buf, esalt_bufs[digests_offset].salt_len); md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md5_ctx_t ctx1 = ctx0; md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md5_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; md5_ctx_t ctx; md5_init (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update_global (&ctx, esalt_bufs[digests_offset].esalt_buf, esalt_bufs[digests_offset].esalt_len); md5_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m11400_a3.cl000066400000000000000000000220361320027462700160020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m11400_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 esalt_len = esalt_bufs[digests_offset].esalt_len; u32x esalt_buf[48] = { 0 }; for (int i = 0, idx = 0; i < esalt_len; i += 4, idx += 1) { esalt_buf[idx] = esalt_bufs[digests_offset].esalt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, esalt_bufs[digests_offset].salt_buf, esalt_bufs[digests_offset].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx1; md5_init_vector_from_scalar (&ctx1, &ctx0); md5_update_vector (&ctx1, w, pw_len); md5_final_vector (&ctx1); const u32x a = ctx1.h[0]; const u32x b = ctx1.h[1]; const u32x c = ctx1.h[2]; const u32x d = ctx1.h[3]; md5_ctx_vector_t ctx; md5_init_vector (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update_vector (&ctx, esalt_buf, esalt_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m11400_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 esalt_len = esalt_bufs[digests_offset].esalt_len; u32x esalt_buf[48] = { 0 }; for (int i = 0, idx = 0; i < esalt_len; i += 4, idx += 1) { esalt_buf[idx] = esalt_bufs[digests_offset].esalt_buf[idx]; } md5_ctx_t ctx0; md5_init (&ctx0); md5_update_global (&ctx0, esalt_bufs[digests_offset].salt_buf, esalt_bufs[digests_offset].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md5_ctx_vector_t ctx1; md5_init_vector_from_scalar (&ctx1, &ctx0); md5_update_vector (&ctx1, w, pw_len); md5_final_vector (&ctx1); const u32x a = ctx1.h[0]; const u32x b = ctx1.h[1]; const u32x c = ctx1.h[2]; const u32x d = ctx1.h[3]; md5_ctx_vector_t ctx; md5_init_vector (&ctx); ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 | uint_to_hex_lower8 ((a >> 8) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 | uint_to_hex_lower8 ((a >> 24) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 | uint_to_hex_lower8 ((b >> 8) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 | uint_to_hex_lower8 ((b >> 24) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 | uint_to_hex_lower8 ((c >> 8) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 | uint_to_hex_lower8 ((c >> 24) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 | uint_to_hex_lower8 ((d >> 8) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; ctx.len = 32; md5_update_vector (&ctx, esalt_buf, esalt_len); md5_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m11500_a0-optimized.cl000066400000000000000000000332441320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //incompatible because of branches //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __constant u32a 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 }; u32x round_crc32 (u32x a, const u32x v) { const u32x k = (a ^ v) & 0xff; const u32x s = a >> 8; #if VECT_SIZE == 1 a = (u32x) crc32tab[k]; #elif VECT_SIZE == 2 a = (u32x) (crc32tab[k.s0], crc32tab[k.s1]); #elif VECT_SIZE == 4 a = (u32x) (crc32tab[k.s0], crc32tab[k.s1], crc32tab[k.s2], crc32tab[k.s3]); #elif VECT_SIZE == 8 a = (u32x) (crc32tab[k.s0], crc32tab[k.s1], crc32tab[k.s2], crc32tab[k.s3], crc32tab[k.s4], crc32tab[k.s5], crc32tab[k.s6], crc32tab[k.s7]); #elif VECT_SIZE == 16 a = (u32x) (crc32tab[k.s0], crc32tab[k.s1], crc32tab[k.s2], crc32tab[k.s3], crc32tab[k.s4], crc32tab[k.s5], crc32tab[k.s6], crc32tab[k.s7], crc32tab[k.s8], crc32tab[k.s9], crc32tab[k.sa], crc32tab[k.sb], crc32tab[k.sc], crc32tab[k.sd], crc32tab[k.se], crc32tab[k.sf]); #endif a ^= s; return a; } 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 m11500_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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 iv = salt_bufs[salt_pos].salt_buf[0]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * crc32 */ 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 a = crc32 (w, out_len, iv); u32x z = 0; COMPARE_M_SIMD (a, z, z, z); } } __kernel void m11500_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11500_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11500_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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 iv = salt_bufs[salt_pos].salt_buf[0]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], 0, 0, 0 }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * crc32 */ 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 a = crc32 (w, out_len, iv); u32x z = 0; COMPARE_S_SIMD (a, z, z, z); } } __kernel void m11500_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11500_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m11500_a1-optimized.cl000066400000000000000000000420411320027462700200010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //incompatible because of branches //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u32a 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 }; u32x round_crc32 (u32x a, const u32x v) { const u32x k = (a ^ v) & 0xff; const u32x s = a >> 8; #if VECT_SIZE == 1 a = (u32x) crc32tab[k]; #elif VECT_SIZE == 2 a = (u32x) (crc32tab[k.s0], crc32tab[k.s1]); #elif VECT_SIZE == 4 a = (u32x) (crc32tab[k.s0], crc32tab[k.s1], crc32tab[k.s2], crc32tab[k.s3]); #elif VECT_SIZE == 8 a = (u32x) (crc32tab[k.s0], crc32tab[k.s1], crc32tab[k.s2], crc32tab[k.s3], crc32tab[k.s4], crc32tab[k.s5], crc32tab[k.s6], crc32tab[k.s7]); #elif VECT_SIZE == 16 a = (u32x) (crc32tab[k.s0], crc32tab[k.s1], crc32tab[k.s2], crc32tab[k.s3], crc32tab[k.s4], crc32tab[k.s5], crc32tab[k.s6], crc32tab[k.s7], crc32tab[k.s8], crc32tab[k.s9], crc32tab[k.sa], crc32tab[k.sb], crc32tab[k.sc], crc32tab[k.sd], crc32tab[k.se], crc32tab[k.sf]); #endif a ^= s; return a; } 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 m11500_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ const u32 iv = salt_bufs[salt_pos].salt_buf[0]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * crc32 */ 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 a = crc32 (w, pw_len, iv); u32x z = 0; COMPARE_M_SIMD (a, z, z, z); } } __kernel void m11500_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11500_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11500_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ const u32 iv = salt_bufs[salt_pos].salt_buf[0]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], 0, 0, 0 }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * crc32 */ 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 a = crc32 (w, pw_len, iv); u32x z = 0; COMPARE_S_SIMD (a, z, z, z); } } __kernel void m11500_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11500_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m11500_a3-optimized.cl000066400000000000000000000510351320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //incompatible because of branches //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u32a 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 }; u32x round_crc32 (u32x a, const u32x v) { const u32x k = (a ^ v) & 0xff; const u32x s = a >> 8; #if VECT_SIZE == 1 a = (u32x) crc32tab[k]; #elif VECT_SIZE == 2 a = (u32x) (crc32tab[k.s0], crc32tab[k.s1]); #elif VECT_SIZE == 4 a = (u32x) (crc32tab[k.s0], crc32tab[k.s1], crc32tab[k.s2], crc32tab[k.s3]); #elif VECT_SIZE == 8 a = (u32x) (crc32tab[k.s0], crc32tab[k.s1], crc32tab[k.s2], crc32tab[k.s3], crc32tab[k.s4], crc32tab[k.s5], crc32tab[k.s6], crc32tab[k.s7]); #elif VECT_SIZE == 16 a = (u32x) (crc32tab[k.s0], crc32tab[k.s1], crc32tab[k.s2], crc32tab[k.s3], crc32tab[k.s4], crc32tab[k.s5], crc32tab[k.s6], crc32tab[k.s7], crc32tab[k.s8], crc32tab[k.s9], crc32tab[k.sa], crc32tab[k.sb], crc32tab[k.sc], crc32tab[k.sd], crc32tab[k.se], crc32tab[k.sf]); #endif a ^= s; return a; } 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; } void m11500m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 iv = salt_bufs[salt_pos].salt_buf[0]; /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; /** * crc32 */ 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 z = 0; COMPARE_M_SIMD (a, z, z, z); } } void m11500s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 iv = salt_bufs[salt_pos].salt_buf[0]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], 0, 0, 0 }; /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; /** * crc32 */ 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 z = 0; COMPARE_S_SIMD (a, z, z, z); } } __kernel void m11500_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11500_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11500_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11500_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11500_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11500_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m11600.cl000066400000000000000000000263661320027462700154330ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_sha256.cl" void memcat8c_be (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 len, const u32 append, u32 digest[8]) { const u32 func_len = len & 63; const u32 mod = func_len & 3; const u32 div = func_len / 4; u32 tmp0; u32 tmp1; #ifdef IS_NV const int selector = (0x76543210 >> ((func_len & 3) * 4)) & 0xffff; tmp0 = __byte_perm (append, 0, selector); tmp1 = __byte_perm (0, append, selector); #endif #if defined IS_AMD || defined IS_GENERIC tmp0 = amd_bytealign (0, append, func_len); tmp1 = amd_bytealign (append, 0, func_len); #endif u32 carry = 0; switch (div) { case 0: w0[0] |= tmp0; w0[1] = tmp1; break; case 1: w0[1] |= tmp0; w0[2] = tmp1; break; case 2: w0[2] |= tmp0; w0[3] = tmp1; break; case 3: w0[3] |= tmp0; w1[0] = tmp1; break; case 4: w1[0] |= tmp0; w1[1] = tmp1; break; case 5: w1[1] |= tmp0; w1[2] = tmp1; break; case 6: w1[2] |= tmp0; w1[3] = tmp1; break; case 7: w1[3] |= tmp0; w2[0] = tmp1; break; case 8: w2[0] |= tmp0; w2[1] = tmp1; break; case 9: w2[1] |= tmp0; w2[2] = tmp1; break; case 10: w2[2] |= tmp0; w2[3] = tmp1; break; case 11: w2[3] |= tmp0; w3[0] = tmp1; break; case 12: w3[0] |= tmp0; w3[1] = tmp1; break; case 13: w3[1] |= tmp0; w3[2] = tmp1; break; case 14: w3[2] |= tmp0; w3[3] = tmp1; break; case 15: w3[3] |= tmp0; carry = tmp1; break; } const u32 new_len = func_len + 8; if (new_len >= 64) { sha256_transform (w0, w1, w2, w3, digest); w0[0] = carry; 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] = 0; } } __kernel void m11600_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global seven_zip_tmp_t *tmps, __global seven_zip_hook_t *seven_zip_hook, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * context save */ sha256_ctx_t ctx; sha256_init (&ctx); tmps[gid].h[0] = ctx.h[0]; tmps[gid].h[1] = ctx.h[1]; tmps[gid].h[2] = ctx.h[2]; tmps[gid].h[3] = ctx.h[3]; tmps[gid].h[4] = ctx.h[4]; tmps[gid].h[5] = ctx.h[5]; tmps[gid].h[6] = ctx.h[6]; tmps[gid].h[7] = ctx.h[7]; tmps[gid].w0[0] = ctx.w0[0]; tmps[gid].w0[1] = ctx.w0[1]; tmps[gid].w0[2] = ctx.w0[2]; tmps[gid].w0[3] = ctx.w0[3]; tmps[gid].w1[0] = ctx.w1[0]; tmps[gid].w1[1] = ctx.w1[1]; tmps[gid].w1[2] = ctx.w1[2]; tmps[gid].w1[3] = ctx.w1[3]; tmps[gid].w2[0] = ctx.w2[0]; tmps[gid].w2[1] = ctx.w2[1]; tmps[gid].w2[2] = ctx.w2[2]; tmps[gid].w2[3] = ctx.w2[3]; tmps[gid].w3[0] = ctx.w3[0]; tmps[gid].w3[1] = ctx.w3[1]; tmps[gid].w3[2] = ctx.w3[2]; tmps[gid].w3[3] = ctx.w3[3]; tmps[gid].len = ctx.len; } __kernel void m11600_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global seven_zip_tmp_t *tmps, __global seven_zip_hook_t *seven_zip_hook, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * context load */ sha256_ctx_t ctx; ctx.h[0] = tmps[gid].h[0]; ctx.h[1] = tmps[gid].h[1]; ctx.h[2] = tmps[gid].h[2]; ctx.h[3] = tmps[gid].h[3]; ctx.h[4] = tmps[gid].h[4]; ctx.h[5] = tmps[gid].h[5]; ctx.h[6] = tmps[gid].h[6]; ctx.h[7] = tmps[gid].h[7]; ctx.w0[0] = tmps[gid].w0[0]; ctx.w0[1] = tmps[gid].w0[1]; ctx.w0[2] = tmps[gid].w0[2]; ctx.w0[3] = tmps[gid].w0[3]; ctx.w1[0] = tmps[gid].w1[0]; ctx.w1[1] = tmps[gid].w1[1]; ctx.w1[2] = tmps[gid].w1[2]; ctx.w1[3] = tmps[gid].w1[3]; ctx.w2[0] = tmps[gid].w2[0]; ctx.w2[1] = tmps[gid].w2[1]; ctx.w2[2] = tmps[gid].w2[2]; ctx.w2[3] = tmps[gid].w2[3]; ctx.w3[0] = tmps[gid].w3[0]; ctx.w3[1] = tmps[gid].w3[1]; ctx.w3[2] = tmps[gid].w3[2]; ctx.w3[3] = tmps[gid].w3[3]; ctx.len = tmps[gid].len; /** * base */ for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) { sha256_update_utf16le_swap (&ctx, w, pw_len); memcat8c_be (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.len, swap32_S (j), ctx.h); ctx.len += 8; } /** * context save */ tmps[gid].h[0] = ctx.h[0]; tmps[gid].h[1] = ctx.h[1]; tmps[gid].h[2] = ctx.h[2]; tmps[gid].h[3] = ctx.h[3]; tmps[gid].h[4] = ctx.h[4]; tmps[gid].h[5] = ctx.h[5]; tmps[gid].h[6] = ctx.h[6]; tmps[gid].h[7] = ctx.h[7]; tmps[gid].w0[0] = ctx.w0[0]; tmps[gid].w0[1] = ctx.w0[1]; tmps[gid].w0[2] = ctx.w0[2]; tmps[gid].w0[3] = ctx.w0[3]; tmps[gid].w1[0] = ctx.w1[0]; tmps[gid].w1[1] = ctx.w1[1]; tmps[gid].w1[2] = ctx.w1[2]; tmps[gid].w1[3] = ctx.w1[3]; tmps[gid].w2[0] = ctx.w2[0]; tmps[gid].w2[1] = ctx.w2[1]; tmps[gid].w2[2] = ctx.w2[2]; tmps[gid].w2[3] = ctx.w2[3]; tmps[gid].w3[0] = ctx.w3[0]; tmps[gid].w3[1] = ctx.w3[1]; tmps[gid].w3[2] = ctx.w3[2]; tmps[gid].w3[3] = ctx.w3[3]; tmps[gid].len = ctx.len; } __kernel void m11600_hook23 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global seven_zip_tmp_t *tmps, __global seven_zip_hook_t *seven_zip_hook, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); if (gid >= gid_max) return; /** * context load */ sha256_ctx_t ctx; ctx.h[0] = tmps[gid].h[0]; ctx.h[1] = tmps[gid].h[1]; ctx.h[2] = tmps[gid].h[2]; ctx.h[3] = tmps[gid].h[3]; ctx.h[4] = tmps[gid].h[4]; ctx.h[5] = tmps[gid].h[5]; ctx.h[6] = tmps[gid].h[6]; ctx.h[7] = tmps[gid].h[7]; ctx.w0[0] = tmps[gid].w0[0]; ctx.w0[1] = tmps[gid].w0[1]; ctx.w0[2] = tmps[gid].w0[2]; ctx.w0[3] = tmps[gid].w0[3]; ctx.w1[0] = tmps[gid].w1[0]; ctx.w1[1] = tmps[gid].w1[1]; ctx.w1[2] = tmps[gid].w1[2]; ctx.w1[3] = tmps[gid].w1[3]; ctx.w2[0] = tmps[gid].w2[0]; ctx.w2[1] = tmps[gid].w2[1]; ctx.w2[2] = tmps[gid].w2[2]; ctx.w2[3] = tmps[gid].w2[3]; ctx.w3[0] = tmps[gid].w3[0]; ctx.w3[1] = tmps[gid].w3[1]; ctx.w3[2] = tmps[gid].w3[2]; ctx.w3[3] = tmps[gid].w3[3]; ctx.len = tmps[gid].len; sha256_final (&ctx); seven_zip_hook[gid].ukey[0] = swap32 (ctx.h[0]); seven_zip_hook[gid].ukey[1] = swap32 (ctx.h[1]); seven_zip_hook[gid].ukey[2] = swap32 (ctx.h[2]); seven_zip_hook[gid].ukey[3] = swap32 (ctx.h[3]); seven_zip_hook[gid].ukey[4] = swap32 (ctx.h[4]); seven_zip_hook[gid].ukey[5] = swap32 (ctx.h[5]); seven_zip_hook[gid].ukey[6] = swap32 (ctx.h[6]); seven_zip_hook[gid].ukey[7] = swap32 (ctx.h[7]); } __kernel void m11600_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global seven_zip_tmp_t *tmps, __global seven_zip_hook_t *seven_zip_hook, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; if (seven_zip_hook[gid].hook_success == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, 0); } return; } } hashcat-4.0.1/OpenCL/m11700_a0-optimized.cl000066400000000000000000002023341320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #define INITVAL 0x0101010101010101 #if VECT_SIZE == 1 #define BOX(S,n,i) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif #define SBOG_LPSti64 \ BOX (s_sbob_sl64, 0, ((t[0] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 1, ((t[1] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 2, ((t[2] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 3, ((t[3] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 4, ((t[4] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 5, ((t[5] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 6, ((t[6] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 7, ((t[7] >> (i * 8)) & 0xff)) // constants __constant u64a 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 u64a 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, }, }; void streebog_g (u64x h[8], const u64x m[8], __local u64 (*s_sbob_sl64)[256]) { u64x k[8]; u64x s[8]; u64x t[8]; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { t[i] = h[i]; } for (int i = 0; i < 8; i++) { k[i] = SBOG_LPSti64; } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { s[i] = m[i]; } for (int r = 0; r < 12; r++) { #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { t[i] = s[i] ^ k[i]; } #ifdef _unroll #pragma unroll #endif 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]; } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { k[i] = SBOG_LPSti64; } } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { h[i] ^= s[i] ^ k[i] ^ m[i]; } } __kernel void m11700_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x01_2x4_VV (w0, w1, out_len); /** * GOST */ 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; /** * reverse message block */ u64x 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] = swap64 (m[0]); m[1] = swap64 (m[1]); m[2] = swap64 (m[2]); m[3] = swap64 (m[3]); m[4] = swap64 (m[4]); m[5] = swap64 (m[5]); m[6] = swap64 (m[6]); m[7] = swap64 (m[7]); // state buffer (hash) u64x 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); u64x 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] = swap64 ((u64) (pw_len * 8)); streebog_g (h, z, s_sbob_sl64); streebog_g (h, m, s_sbob_sl64); const u32x r0 = l32_from_64 (h[0]); const u32x r1 = h32_from_64 (h[0]); const u32x r2 = l32_from_64 (h[1]); const u32x r3 = h32_from_64 (h[1]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m11700_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11700_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11700_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x01_2x4_VV (w0, w1, out_len); /** * GOST */ 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; /** * reverse message block */ u64x 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] = swap64 (m[0]); m[1] = swap64 (m[1]); m[2] = swap64 (m[2]); m[3] = swap64 (m[3]); m[4] = swap64 (m[4]); m[5] = swap64 (m[5]); m[6] = swap64 (m[6]); m[7] = swap64 (m[7]); // state buffer (hash) u64x 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); u64x 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] = swap64 ((u64) (pw_len * 8)); streebog_g (h, z, s_sbob_sl64); streebog_g (h, m, s_sbob_sl64); const u32x r0 = l32_from_64 (h[0]); const u32x r1 = h32_from_64 (h[0]); const u32x r2 = l32_from_64 (h[1]); const u32x r3 = h32_from_64 (h[1]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m11700_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11700_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m11700_a1-optimized.cl000066400000000000000000002110051320027462700200010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define INITVAL 0x0101010101010101 #if VECT_SIZE == 1 #define BOX(S,n,i) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif #define SBOG_LPSti64 \ BOX (s_sbob_sl64, 0, ((t[0] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 1, ((t[1] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 2, ((t[2] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 3, ((t[3] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 4, ((t[4] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 5, ((t[5] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 6, ((t[6] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 7, ((t[7] >> (i * 8)) & 0xff)) // constants __constant u64a 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 u64a 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, }, }; void streebog_g (u64x h[8], const u64x m[8], __local u64 (*s_sbob_sl64)[256]) { u64x k[8]; u64x s[8]; u64x t[8]; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { t[i] = h[i]; } for (int i = 0; i < 8; i++) { k[i] = SBOG_LPSti64; } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { s[i] = m[i]; } for (int r = 0; r < 12; r++) { #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { t[i] = s[i] ^ k[i]; } #ifdef _unroll #pragma unroll #endif 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]; } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { k[i] = SBOG_LPSti64; } } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { h[i] ^= s[i] ^ k[i] ^ m[i]; } } __kernel void m11700_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * GOST */ 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]; /** * reverse message block */ u64x 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] = swap64 (m[0]); m[1] = swap64 (m[1]); m[2] = swap64 (m[2]); m[3] = swap64 (m[3]); m[4] = swap64 (m[4]); m[5] = swap64 (m[5]); m[6] = swap64 (m[6]); m[7] = swap64 (m[7]); // state buffer (hash) u64x 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); u64x 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] = swap64 ((u64) (pw_len * 8)); streebog_g (h, z, s_sbob_sl64); streebog_g (h, m, s_sbob_sl64); const u32x r0 = l32_from_64 (h[0]); const u32x r1 = h32_from_64 (h[0]); const u32x r2 = l32_from_64 (h[1]); const u32x r3 = h32_from_64 (h[1]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m11700_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11700_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11700_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * GOST */ 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]; /** * reverse message block */ u64x 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] = swap64 (m[0]); m[1] = swap64 (m[1]); m[2] = swap64 (m[2]); m[3] = swap64 (m[3]); m[4] = swap64 (m[4]); m[5] = swap64 (m[5]); m[6] = swap64 (m[6]); m[7] = swap64 (m[7]); // state buffer (hash) u64x 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); u64x 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] = swap64 ((u64) (pw_len * 8)); streebog_g (h, z, s_sbob_sl64); streebog_g (h, m, s_sbob_sl64); const u32x r0 = l32_from_64 (h[0]); const u32x r1 = h32_from_64 (h[0]); const u32x r2 = l32_from_64 (h[1]); const u32x r3 = h32_from_64 (h[1]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m11700_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11700_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m11700_a3-optimized.cl000066400000000000000000002231101320027462700200030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define INITVAL 0x0101010101010101 #if VECT_SIZE == 1 #define BOX(S,n,i) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif #define SBOG_LPSti64 \ BOX (s_sbob_sl64, 0, ((t[0] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 1, ((t[1] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 2, ((t[2] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 3, ((t[3] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 4, ((t[4] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 5, ((t[5] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 6, ((t[6] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 7, ((t[7] >> (i * 8)) & 0xff)) // constants __constant u64a 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 u64a 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, }, }; void streebog_g (u64x h[8], const u64x m[8], __local u64 (*s_sbob_sl64)[256]) { u64x k[8]; u64x s[8]; u64x t[8]; for (int i = 0; i < 8; i++) { t[i] = h[i]; } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { k[i] = SBOG_LPSti64; } for (int i = 0; i < 8; i++) { s[i] = m[i]; } for (int r = 0; r < 12; r++) { for (int i = 0; i < 8; i++) { t[i] = s[i] ^ k[i]; } #ifdef _unroll #pragma unroll #endif 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]; } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { k[i] = SBOG_LPSti64; } } for (int i = 0; i < 8; i++) { h[i] ^= s[i] ^ k[i] ^ m[i]; } } void m11700m (__local u64 (*s_sbob_sl64)[256], u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * GOST */ u64x 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], w0lr ); m[0] = swap64 (m[0]); m[1] = swap64 (m[1]); m[2] = swap64 (m[2]); m[3] = swap64 (m[3]); m[4] = swap64 (m[4]); m[5] = swap64 (m[5]); m[6] = swap64 (m[6]); m[7] = swap64 (m[7]); // state buffer (hash) u64x 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); u64x 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] = swap64 ((u64) (pw_len * 8)); streebog_g (h, z, s_sbob_sl64); streebog_g (h, m, s_sbob_sl64); const u32x r0 = l32_from_64 (h[0]); const u32x r1 = h32_from_64 (h[0]); const u32x r2 = l32_from_64 (h[1]); const u32x r3 = h32_from_64 (h[1]); COMPARE_M_SIMD (r0, r1, r2, r3); } } void m11700s (__local u64 (*s_sbob_sl64)[256], u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * GOST */ u64x 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], w0lr ); m[0] = swap64 (m[0]); m[1] = swap64 (m[1]); m[2] = swap64 (m[2]); m[3] = swap64 (m[3]); m[4] = swap64 (m[4]); m[5] = swap64 (m[5]); m[6] = swap64 (m[6]); m[7] = swap64 (m[7]); // state buffer (hash) u64x 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); u64x 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] = swap64 ((u64) (pw_len * 8)); streebog_g (h, z, s_sbob_sl64); streebog_g (h, m, s_sbob_sl64); const u32x r0 = l32_from_64 (h[0]); const u32x r1 = h32_from_64 (h[0]); const u32x r2 = l32_from_64 (h[1]); const u32x r3 = h32_from_64 (h[1]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m11700_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11700_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11700_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11700_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11700_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11700_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m11800_a0-optimized.cl000066400000000000000000002023131320027462700200030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #define INITVAL 0 #if VECT_SIZE == 1 #define BOX(S,n,i) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif #define SBOG_LPSti64 \ BOX (s_sbob_sl64, 0, ((t[0] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 1, ((t[1] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 2, ((t[2] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 3, ((t[3] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 4, ((t[4] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 5, ((t[5] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 6, ((t[6] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 7, ((t[7] >> (i * 8)) & 0xff)) // constants __constant u64a 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 u64a 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, }, }; void streebog_g (u64x h[8], const u64x m[8], __local u64 (*s_sbob_sl64)[256]) { u64x k[8]; u64x s[8]; u64x t[8]; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { t[i] = h[i]; } for (int i = 0; i < 8; i++) { k[i] = SBOG_LPSti64; } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { s[i] = m[i]; } for (int r = 0; r < 12; r++) { #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { t[i] = s[i] ^ k[i]; } #ifdef _unroll #pragma unroll #endif 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]; } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { k[i] = SBOG_LPSti64; } } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { h[i] ^= s[i] ^ k[i] ^ m[i]; } } __kernel void m11800_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x01_2x4_VV (w0, w1, out_len); /** * GOST */ 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; /** * reverse message block */ u64x 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] = swap64 (m[0]); m[1] = swap64 (m[1]); m[2] = swap64 (m[2]); m[3] = swap64 (m[3]); m[4] = swap64 (m[4]); m[5] = swap64 (m[5]); m[6] = swap64 (m[6]); m[7] = swap64 (m[7]); // state buffer (hash) u64x 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); u64x 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] = swap64 ((u64) (pw_len * 8)); streebog_g (h, z, s_sbob_sl64); streebog_g (h, m, s_sbob_sl64); const u32x r0 = l32_from_64 (h[0]); const u32x r1 = h32_from_64 (h[0]); const u32x r2 = l32_from_64 (h[1]); const u32x r3 = h32_from_64 (h[1]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m11800_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11800_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11800_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x01_2x4_VV (w0, w1, out_len); /** * GOST */ 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; /** * reverse message block */ u64x 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] = swap64 (m[0]); m[1] = swap64 (m[1]); m[2] = swap64 (m[2]); m[3] = swap64 (m[3]); m[4] = swap64 (m[4]); m[5] = swap64 (m[5]); m[6] = swap64 (m[6]); m[7] = swap64 (m[7]); // state buffer (hash) u64x 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); u64x 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] = swap64 ((u64) (pw_len * 8)); streebog_g (h, z, s_sbob_sl64); streebog_g (h, m, s_sbob_sl64); const u32x r0 = l32_from_64 (h[0]); const u32x r1 = h32_from_64 (h[0]); const u32x r2 = l32_from_64 (h[1]); const u32x r3 = h32_from_64 (h[1]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m11800_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11800_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m11800_a1-optimized.cl000066400000000000000000002107641320027462700200150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define INITVAL 0 #if VECT_SIZE == 1 #define BOX(S,n,i) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif #define SBOG_LPSti64 \ BOX (s_sbob_sl64, 0, ((t[0] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 1, ((t[1] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 2, ((t[2] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 3, ((t[3] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 4, ((t[4] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 5, ((t[5] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 6, ((t[6] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 7, ((t[7] >> (i * 8)) & 0xff)) // constants __constant u64a 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 u64a 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, }, }; void streebog_g (u64x h[8], const u64x m[8], __local u64 (*s_sbob_sl64)[256]) { u64x k[8]; u64x s[8]; u64x t[8]; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { t[i] = h[i]; } for (int i = 0; i < 8; i++) { k[i] = SBOG_LPSti64; } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { s[i] = m[i]; } for (int r = 0; r < 12; r++) { #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { t[i] = s[i] ^ k[i]; } #ifdef _unroll #pragma unroll #endif 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]; } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { k[i] = SBOG_LPSti64; } } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { h[i] ^= s[i] ^ k[i] ^ m[i]; } } __kernel void m11800_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * GOST */ 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]; /** * reverse message block */ u64x 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] = swap64 (m[0]); m[1] = swap64 (m[1]); m[2] = swap64 (m[2]); m[3] = swap64 (m[3]); m[4] = swap64 (m[4]); m[5] = swap64 (m[5]); m[6] = swap64 (m[6]); m[7] = swap64 (m[7]); // state buffer (hash) u64x 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); u64x 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] = swap64 ((u64) (pw_len * 8)); streebog_g (h, z, s_sbob_sl64); streebog_g (h, m, s_sbob_sl64); const u32x r0 = l32_from_64 (h[0]); const u32x r1 = h32_from_64 (h[0]); const u32x r2 = l32_from_64 (h[1]); const u32x r3 = h32_from_64 (h[1]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m11800_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11800_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11800_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * GOST */ 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]; /** * reverse message block */ u64x 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] = swap64 (m[0]); m[1] = swap64 (m[1]); m[2] = swap64 (m[2]); m[3] = swap64 (m[3]); m[4] = swap64 (m[4]); m[5] = swap64 (m[5]); m[6] = swap64 (m[6]); m[7] = swap64 (m[7]); // state buffer (hash) u64x 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); u64x 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] = swap64 ((u64) (pw_len * 8)); streebog_g (h, z, s_sbob_sl64); streebog_g (h, m, s_sbob_sl64); const u32x r0 = l32_from_64 (h[0]); const u32x r1 = h32_from_64 (h[0]); const u32x r2 = l32_from_64 (h[1]); const u32x r3 = h32_from_64 (h[1]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m11800_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m11800_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m11800_a3-optimized.cl000066400000000000000000002230671320027462700200170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define INITVAL 0 #if VECT_SIZE == 1 #define BOX(S,n,i) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(S,n,i) (u64x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif #define SBOG_LPSti64 \ BOX (s_sbob_sl64, 0, ((t[0] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 1, ((t[1] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 2, ((t[2] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 3, ((t[3] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 4, ((t[4] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 5, ((t[5] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 6, ((t[6] >> (i * 8)) & 0xff)) ^ \ BOX (s_sbob_sl64, 7, ((t[7] >> (i * 8)) & 0xff)) // constants __constant u64a 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 u64a 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, }, }; void streebog_g (u64x h[8], const u64x m[8], __local u64 (*s_sbob_sl64)[256]) { u64x k[8]; u64x s[8]; u64x t[8]; for (int i = 0; i < 8; i++) { t[i] = h[i]; } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { k[i] = SBOG_LPSti64; } for (int i = 0; i < 8; i++) { s[i] = m[i]; } for (int r = 0; r < 12; r++) { for (int i = 0; i < 8; i++) { t[i] = s[i] ^ k[i]; } #ifdef _unroll #pragma unroll #endif 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]; } #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 8; i++) { k[i] = SBOG_LPSti64; } } for (int i = 0; i < 8; i++) { h[i] ^= s[i] ^ k[i] ^ m[i]; } } void m11800m (__local u64 (*s_sbob_sl64)[256], u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * GOST */ u64x 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], w0lr ); m[0] = swap64 (m[0]); m[1] = swap64 (m[1]); m[2] = swap64 (m[2]); m[3] = swap64 (m[3]); m[4] = swap64 (m[4]); m[5] = swap64 (m[5]); m[6] = swap64 (m[6]); m[7] = swap64 (m[7]); // state buffer (hash) u64x 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); u64x 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] = swap64 ((u64) (pw_len * 8)); streebog_g (h, z, s_sbob_sl64); streebog_g (h, m, s_sbob_sl64); const u32x r0 = l32_from_64 (h[0]); const u32x r1 = h32_from_64 (h[0]); const u32x r2 = l32_from_64 (h[1]); const u32x r3 = h32_from_64 (h[1]); COMPARE_M_SIMD (r0, r1, r2, r3); } } void m11800s (__local u64 (*s_sbob_sl64)[256], u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * GOST */ u64x 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], w0lr ); m[0] = swap64 (m[0]); m[1] = swap64 (m[1]); m[2] = swap64 (m[2]); m[3] = swap64 (m[3]); m[4] = swap64 (m[4]); m[5] = swap64 (m[5]); m[6] = swap64 (m[6]); m[7] = swap64 (m[7]); // state buffer (hash) u64x 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); u64x 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] = swap64 ((u64) (pw_len * 8)); streebog_g (h, z, s_sbob_sl64); streebog_g (h, m, s_sbob_sl64); const u32x r0 = l32_from_64 (h[0]); const u32x r1 = h32_from_64 (h[0]); const u32x r2 = l32_from_64 (h[1]); const u32x r3 = h32_from_64 (h[1]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m11800_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11800_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11800_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11800_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11800_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m11800_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared lookup table */ __local u64 s_sbob_sl64[8][256]; for (u32 i = lid; i < 256; i += lsz) { s_sbob_sl64[0][i] = sbob_sl64[0][i]; s_sbob_sl64[1][i] = sbob_sl64[1][i]; s_sbob_sl64[2][i] = sbob_sl64[2][i]; s_sbob_sl64[3][i] = sbob_sl64[3][i]; s_sbob_sl64[4][i] = sbob_sl64[4][i]; s_sbob_sl64[5][i] = sbob_sl64[5][i]; s_sbob_sl64[6][i] = sbob_sl64[6][i]; s_sbob_sl64[7][i] = sbob_sl64[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m11900.cl000066400000000000000000000175171320027462700154340ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md5.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_md5_run_V (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]; md5_transform_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m11900_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_md5_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_md5_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; md5_hmac_ctx_t md5_hmac_ctx; md5_hmac_init_global (&md5_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = md5_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = md5_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = md5_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = md5_hmac_ctx.ipad.h[3]; tmps[gid].opad[0] = md5_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = md5_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = md5_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = md5_hmac_ctx.opad.h[3]; md5_hmac_update_global (&md5_hmac_ctx, esalt_bufs[digests_offset].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 4; i += 4, j += 1) { md5_hmac_ctx_t md5_hmac_ctx2 = md5_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j << 24; 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] = 0; md5_hmac_update_64 (&md5_hmac_ctx2, w0, w1, w2, w3, 4); md5_hmac_final (&md5_hmac_ctx2); tmps[gid].dgst[i + 0] = md5_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = md5_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = md5_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = md5_hmac_ctx2.opad.h[3]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; } } __kernel void m11900_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_md5_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_md5_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[4]; u32x opad[4]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); for (u32 i = 0; i < 4; i += 4) { u32x dgst[4]; u32x out[4]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); 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] = 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_V (w0, w1, w2, w3, ipad, opad, dgst); out[0] ^= dgst[0]; out[1] ^= dgst[1]; out[2] ^= dgst[2]; out[3] ^= dgst[3]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); } } __kernel void m11900_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_md5_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_md5_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); const u32 r0 = tmps[gid].out[DGST_R0]; const u32 r1 = tmps[gid].out[DGST_R1]; const u32 r2 = tmps[gid].out[DGST_R2]; const u32 r3 = tmps[gid].out[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m12000.cl000066400000000000000000000206441320027462700154170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha1_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m12000_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha1_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha1_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha1_hmac_ctx_t sha1_hmac_ctx; sha1_hmac_init_global_swap (&sha1_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha1_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha1_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha1_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha1_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha1_hmac_ctx.ipad.h[4]; tmps[gid].opad[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha1_hmac_ctx.opad.h[4]; sha1_hmac_update_global_swap (&sha1_hmac_ctx, esalt_bufs[digests_offset].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 4; i += 5, j += 1) { sha1_hmac_ctx_t sha1_hmac_ctx2 = sha1_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha1_hmac_update_64 (&sha1_hmac_ctx2, w0, w1, w2, w3, 4); sha1_hmac_final (&sha1_hmac_ctx2); tmps[gid].dgst[i + 0] = sha1_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha1_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha1_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha1_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha1_hmac_ctx2.opad.h[4]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; } } __kernel void m12000_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha1_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha1_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); for (u32 i = 0; i < 4; i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); } } __kernel void m12000_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha1_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha1_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); const u32 r0 = tmps[gid].out[DGST_R0]; const u32 r1 = tmps[gid].out[DGST_R1]; const u32 r2 = tmps[gid].out[DGST_R2]; const u32 r3 = tmps[gid].out[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m12200.cl000066400000000000000000000150601320027462700154150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" __kernel void m12200_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global ecryptfs_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha512_ctx_t ctx; sha512_init (&ctx); sha512_update_global (&ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha512_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); sha512_final (&ctx); tmps[gid].out[0] = ctx.h[0]; tmps[gid].out[1] = ctx.h[1]; tmps[gid].out[2] = ctx.h[2]; tmps[gid].out[3] = ctx.h[3]; tmps[gid].out[4] = ctx.h[4]; tmps[gid].out[5] = ctx.h[5]; tmps[gid].out[6] = ctx.h[6]; tmps[gid].out[7] = ctx.h[7]; } __kernel void m12200_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global ecryptfs_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u64x t0 = pack64v (tmps, out, gid, 0); u64x t1 = pack64v (tmps, out, gid, 1); u64x t2 = pack64v (tmps, out, gid, 2); u64x t3 = pack64v (tmps, out, gid, 3); u64x t4 = pack64v (tmps, out, gid, 4); u64x t5 = pack64v (tmps, out, gid, 5); u64x t6 = pack64v (tmps, out, gid, 6); u64x t7 = pack64v (tmps, out, gid, 7); u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; 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] = 0; w3[2] = 0; w3[3] = 0; w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 64 * 8; for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) { w0[0] = h32_from_64 (t0); w0[1] = l32_from_64 (t0); w0[2] = h32_from_64 (t1); w0[3] = l32_from_64 (t1); w1[0] = h32_from_64 (t2); w1[1] = l32_from_64 (t2); w1[2] = h32_from_64 (t3); w1[3] = l32_from_64 (t3); w2[0] = h32_from_64 (t4); w2[1] = l32_from_64 (t4); w2[2] = h32_from_64 (t5); w2[3] = l32_from_64 (t5); w3[0] = h32_from_64 (t6); w3[1] = l32_from_64 (t6); w3[2] = h32_from_64 (t7); w3[3] = l32_from_64 (t7); 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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); t0 = digest[0]; t1 = digest[1]; t2 = digest[2]; t3 = digest[3]; t4 = digest[4]; t5 = digest[5]; t6 = digest[6]; t7 = digest[7]; } unpack64v (tmps, out, gid, 0, t0); unpack64v (tmps, out, gid, 1, t1); unpack64v (tmps, out, gid, 2, t2); unpack64v (tmps, out, gid, 3, t3); unpack64v (tmps, out, gid, 4, t4); unpack64v (tmps, out, gid, 5, t5); unpack64v (tmps, out, gid, 6, t6); unpack64v (tmps, out, gid, 7, t7); } __kernel void m12200_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global ecryptfs_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); const u64 a = tmps[gid].out[0]; const u32 r0 = h32_from_64_S (a); const u32 r1 = l32_from_64_S (a); const u32 r2 = 0; const u32 r3 = 0; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m12300.cl000066400000000000000000000330361320027462700154210ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha512_run_V (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); w0[0] = h32_from_64 (digest[0]); w0[1] = l32_from_64 (digest[0]); w0[2] = h32_from_64 (digest[1]); w0[3] = l32_from_64 (digest[1]); w1[0] = h32_from_64 (digest[2]); w1[1] = l32_from_64 (digest[2]); w1[2] = h32_from_64 (digest[3]); w1[3] = l32_from_64 (digest[3]); w2[0] = h32_from_64 (digest[4]); w2[1] = l32_from_64 (digest[4]); w2[2] = h32_from_64 (digest[5]); w2[3] = l32_from_64 (digest[5]); w3[0] = h32_from_64 (digest[6]); w3[1] = l32_from_64 (digest[6]); w3[2] = h32_from_64 (digest[7]); w3[3] = l32_from_64 (digest[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } __kernel void m12300_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global oraclet_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha512_hmac_ctx_t sha512_hmac_ctx; sha512_hmac_init_global_swap (&sha512_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha512_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha512_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha512_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha512_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha512_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha512_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha512_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha512_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha512_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha512_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha512_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha512_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha512_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha512_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha512_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha512_hmac_ctx.opad.h[7]; sha512_hmac_update_global (&sha512_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; w0[0] = 0x41555448; w0[1] = 0x5f50424b; w0[2] = 0x4446325f; w0[3] = 0x53504545; w1[0] = 0x44595f4b; w1[1] = 0x45590000; 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; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_update_128 (&sha512_hmac_ctx, w0, w1, w2, w3, w4, w5, w6, w7, 22); for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) { sha512_hmac_ctx_t sha512_hmac_ctx2 = sha512_hmac_ctx; w0[0] = j; 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] = 0; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_update_128 (&sha512_hmac_ctx2, w0, w1, w2, w3, w4, w5, w6, w7, 4); sha512_hmac_final (&sha512_hmac_ctx2); tmps[gid].dgst[i + 0] = sha512_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha512_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha512_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha512_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha512_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha512_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha512_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha512_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m12300_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global oraclet_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u64x ipad[8]; u64x opad[8]; ipad[0] = pack64v (tmps, ipad, gid, 0); ipad[1] = pack64v (tmps, ipad, gid, 1); ipad[2] = pack64v (tmps, ipad, gid, 2); ipad[3] = pack64v (tmps, ipad, gid, 3); ipad[4] = pack64v (tmps, ipad, gid, 4); ipad[5] = pack64v (tmps, ipad, gid, 5); ipad[6] = pack64v (tmps, ipad, gid, 6); ipad[7] = pack64v (tmps, ipad, gid, 7); opad[0] = pack64v (tmps, opad, gid, 0); opad[1] = pack64v (tmps, opad, gid, 1); opad[2] = pack64v (tmps, opad, gid, 2); opad[3] = pack64v (tmps, opad, gid, 3); opad[4] = pack64v (tmps, opad, gid, 4); opad[5] = pack64v (tmps, opad, gid, 5); opad[6] = pack64v (tmps, opad, gid, 6); opad[7] = pack64v (tmps, opad, gid, 7); for (u32 i = 0; i < 8; i += 8) { u64x dgst[8]; u64x out[8]; dgst[0] = pack64v (tmps, dgst, gid, i + 0); dgst[1] = pack64v (tmps, dgst, gid, i + 1); dgst[2] = pack64v (tmps, dgst, gid, i + 2); dgst[3] = pack64v (tmps, dgst, gid, i + 3); dgst[4] = pack64v (tmps, dgst, gid, i + 4); dgst[5] = pack64v (tmps, dgst, gid, i + 5); dgst[6] = pack64v (tmps, dgst, gid, i + 6); dgst[7] = pack64v (tmps, dgst, gid, i + 7); out[0] = pack64v (tmps, out, gid, i + 0); out[1] = pack64v (tmps, out, gid, i + 1); out[2] = pack64v (tmps, out, gid, i + 2); out[3] = pack64v (tmps, out, gid, i + 3); out[4] = pack64v (tmps, out, gid, i + 4); out[5] = pack64v (tmps, out, gid, i + 5); out[6] = pack64v (tmps, out, gid, i + 6); out[7] = pack64v (tmps, out, gid, i + 7); for (u32 j = 0; j < loop_cnt; j++) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; w0[0] = h32_from_64 (dgst[0]); w0[1] = l32_from_64 (dgst[0]); w0[2] = h32_from_64 (dgst[1]); w0[3] = l32_from_64 (dgst[1]); w1[0] = h32_from_64 (dgst[2]); w1[1] = l32_from_64 (dgst[2]); w1[2] = h32_from_64 (dgst[3]); w1[3] = l32_from_64 (dgst[3]); w2[0] = h32_from_64 (dgst[4]); w2[1] = l32_from_64 (dgst[4]); w2[2] = h32_from_64 (dgst[5]); w2[3] = l32_from_64 (dgst[5]); w3[0] = h32_from_64 (dgst[6]); w3[1] = l32_from_64 (dgst[6]); w3[2] = h32_from_64 (dgst[7]); w3[3] = l32_from_64 (dgst[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = (128 + 64) * 8; hmac_sha512_run_V (w0, w1, w2, w3, w4, w5, w6, w7, 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]; } unpack64v (tmps, dgst, gid, i + 0, dgst[0]); unpack64v (tmps, dgst, gid, i + 1, dgst[1]); unpack64v (tmps, dgst, gid, i + 2, dgst[2]); unpack64v (tmps, dgst, gid, i + 3, dgst[3]); unpack64v (tmps, dgst, gid, i + 4, dgst[4]); unpack64v (tmps, dgst, gid, i + 5, dgst[5]); unpack64v (tmps, dgst, gid, i + 6, dgst[6]); unpack64v (tmps, dgst, gid, i + 7, dgst[7]); unpack64v (tmps, out, gid, i + 0, out[0]); unpack64v (tmps, out, gid, i + 1, out[1]); unpack64v (tmps, out, gid, i + 2, out[2]); unpack64v (tmps, out, gid, i + 3, out[3]); unpack64v (tmps, out, gid, i + 4, out[4]); unpack64v (tmps, out, gid, i + 5, out[5]); unpack64v (tmps, out, gid, i + 6, out[6]); unpack64v (tmps, out, gid, i + 7, out[7]); } } __kernel void m12300_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global oraclet_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); u64 digest[8]; digest[0] = tmps[gid].out[0]; digest[1] = tmps[gid].out[1]; digest[2] = tmps[gid].out[2]; digest[3] = tmps[gid].out[3]; digest[4] = tmps[gid].out[4]; digest[5] = tmps[gid].out[5]; digest[6] = tmps[gid].out[6]; digest[7] = tmps[gid].out[7]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; w0[0] = h32_from_64_S (digest[0]); w0[1] = l32_from_64_S (digest[0]); w0[2] = h32_from_64_S (digest[1]); w0[3] = l32_from_64_S (digest[1]); w1[0] = h32_from_64_S (digest[2]); w1[1] = l32_from_64_S (digest[2]); w1[2] = h32_from_64_S (digest[3]); w1[3] = l32_from_64_S (digest[3]); w2[0] = h32_from_64_S (digest[4]); w2[1] = l32_from_64_S (digest[4]); w2[2] = h32_from_64_S (digest[5]); w2[3] = l32_from_64_S (digest[5]); w3[0] = h32_from_64_S (digest[6]); w3[1] = l32_from_64_S (digest[6]); w3[2] = h32_from_64_S (digest[7]); w3[3] = l32_from_64_S (digest[7]); w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_ctx_t ctx; sha512_init (&ctx); sha512_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64); sha512_update_global (&ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha512_final (&ctx); const u32 r0 = h32_from_64_S (ctx.h[0]); const u32 r1 = l32_from_64_S (ctx.h[0]); const u32 r2 = h32_from_64_S (ctx.h[1]); const u32 r3 = l32_from_64_S (ctx.h[1]); #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m12400.cl000066400000000000000000000666771320027462700154430ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 BOX(i,n,S) (S)[(n)][(i)] void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 (*s_skb)[64]) { u32 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; #ifdef _unroll #pragma unroll #endif 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 u32 c00 = (c >> 0) & 0x0000003f; const u32 c06 = (c >> 6) & 0x00383003; const u32 c07 = (c >> 7) & 0x0000003c; const u32 c13 = (c >> 13) & 0x0000060f; const u32 c20 = (c >> 20) & 0x00000001; u32 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 u32 d00 = (d >> 0) & 0x00003c3f; const u32 d07 = (d >> 7) & 0x00003f03; const u32 d21 = (d >> 21) & 0x0000000f; const u32 d22 = (d >> 22) & 0x00000030; u32 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)); } } void _des_crypt_encrypt (u32 iv[2], u32 mask, u32 rounds, u32 Kc[16], u32 Kd[16], __local u32 (*s_SPtrans)[64]) { u32 tt; const u32 E0 = ((mask >> 0) & 0x003f) | ((mask >> 4) & 0x3f00); const u32 E1 = ((mask >> 2) & 0x03f0) | ((mask >> 6) & 0xf000) | ((mask >> 22) & 0x0003); u32 r = iv[0]; u32 l = iv[1]; for (u32 i = 0; i < rounds; i++) { for (u32 j = 0; j < 16; j += 2) { u32 t; u32 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); } u32 tt; tt = l; l = r; r = tt; } iv[0] = r; iv[1] = l; } __kernel void m12400_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global bsdicrypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * word */ const u32 pw_len = pws[gid].pw_len; u32 w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } 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 m12400_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global bsdicrypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ 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 m12400_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global bsdicrypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); const u32 r0 = tmps[gid].iv[0]; const u32 r1 = tmps[gid].iv[1]; const u32 r2 = 0; const u32 r3 = 0; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m12500.cl000066400000000000000000000424241320027462700154240ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_cipher_aes.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #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] #define MIN(a,b) (((a) < (b)) ? (a) : (b)) void sha1_transform (const u32 w[16], u32 digest[5]) { u32 A = digest[0]; u32 B = digest[1]; u32 C = digest[2]; u32 D = digest[3]; u32 E = digest[4]; u32 w0_t = w[ 0]; u32 w1_t = w[ 1]; u32 w2_t = w[ 2]; u32 w3_t = w[ 3]; u32 w4_t = w[ 4]; u32 w5_t = w[ 5]; u32 w6_t = w[ 6]; u32 w7_t = w[ 7]; u32 w8_t = w[ 8]; u32 w9_t = w[ 9]; u32 wa_t = w[10]; u32 wb_t = w[11]; u32 wc_t = w[12]; u32 wd_t = w[13]; u32 we_t = w[14]; u32 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 m12500_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global rar3_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pbkdf2_sha1_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 m12500_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global rar3_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pbkdf2_sha1_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 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 = MIN (pws[gid].pw_len, 20); 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 (volatile 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 m12500_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global rar3_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pbkdf2_sha1_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; /** * base */ const u32 pw_len = MIN (pws[gid].pw_len, 20); const u32 salt_len = 8; const u32 p3 = (pw_len * 2) + salt_len + 3; u32 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); u32 ukey[4]; ukey[0] = swap32_S (dgst[0]); ukey[1] = swap32_S (dgst[1]); ukey[2] = swap32_S (dgst[2]); ukey[3] = swap32_S (dgst[3]); u32 ks[44]; AES128_set_decrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); 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]; u32 out[4]; AES128_decrypt (ks, data, out, 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; u32 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] ^= swap32_S (iv[0]); out[1] ^= swap32_S (iv[1]); out[2] ^= swap32_S (iv[2]); out[3] ^= swap32_S (iv[3]); const u32 r0 = out[0]; const u32 r1 = out[1]; const u32 r2 = 0; const u32 r3 = 0; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m12600_a0-optimized.cl000066400000000000000000001301201320027462700177760ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m12600_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 = swap32 (w0_t); w1_t = swap32 (w1_t); w2_t = swap32 (w2_t); w3_t = swap32 (w3_t); w4_t = swap32 (w4_t); w5_t = swap32 (w5_t); w6_t = swap32 (w6_t); w7_t = swap32 (w7_t); w8_t = swap32 (w8_t); w9_t = swap32 (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); COMPARE_M_SIMD (d, h, c, g); } } __kernel void m12600_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m12600_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m12600_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].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]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 = swap32 (w0_t); w1_t = swap32 (w1_t); w2_t = swap32 (w2_t); w3_t = swap32 (w3_t); w4_t = swap32 (w4_t); w5_t = swap32 (w5_t); w6_t = swap32 (w6_t); w7_t = swap32 (w7_t); w8_t = swap32 (w8_t); w9_t = swap32 (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); if (MATCHES_NONE_VS (d, search[0])) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m12600_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m12600_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m12600_a0.cl000066400000000000000000000245551320027462700160120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" #include "inc_hash_sha256.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m12600_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * 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]; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_swap (&ctx0, tmp.i, tmp.pw_len); sha1_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; const u32 e = ctx0.h[4]; sha256_ctx_t ctx; ctx.h[0] = pc256[0]; ctx.h[1] = pc256[1]; ctx.h[2] = pc256[2]; ctx.h[3] = pc256[3]; ctx.h[4] = pc256[4]; ctx.h[5] = pc256[5]; ctx.h[6] = pc256[6]; ctx.h[7] = pc256[7]; ctx.len = 64; ctx.w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 0; ctx.len += 40; sha256_final (&ctx); ctx.h[0] -= pc256[0]; ctx.h[1] -= pc256[1]; ctx.h[2] -= pc256[2]; ctx.h[3] -= pc256[3]; ctx.h[4] -= pc256[4]; ctx.h[5] -= pc256[5]; ctx.h[6] -= pc256[6]; ctx.h[7] -= pc256[7]; const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m12600_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 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] }; /** * 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]; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_swap (&ctx0, tmp.i, tmp.pw_len); sha1_final (&ctx0); const u32 a = ctx0.h[0]; const u32 b = ctx0.h[1]; const u32 c = ctx0.h[2]; const u32 d = ctx0.h[3]; const u32 e = ctx0.h[4]; sha256_ctx_t ctx; ctx.h[0] = pc256[0]; ctx.h[1] = pc256[1]; ctx.h[2] = pc256[2]; ctx.h[3] = pc256[3]; ctx.h[4] = pc256[4]; ctx.h[5] = pc256[5]; ctx.h[6] = pc256[6]; ctx.h[7] = pc256[7]; ctx.len = 64; ctx.w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 0; ctx.len += 40; sha256_final (&ctx); ctx.h[0] -= pc256[0]; ctx.h[1] -= pc256[1]; ctx.h[2] -= pc256[2]; ctx.h[3] -= pc256[3]; ctx.h[4] -= pc256[4]; ctx.h[5] -= pc256[5]; ctx.h[6] -= pc256[6]; ctx.h[7] -= pc256[7]; const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m12600_a1-optimized.cl000066400000000000000000001364671320027462700200230ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m12600_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 = swap32 (w0_t); w1_t = swap32 (w1_t); w2_t = swap32 (w2_t); w3_t = swap32 (w3_t); w4_t = swap32 (w4_t); w5_t = swap32 (w5_t); w6_t = swap32 (w6_t); w7_t = swap32 (w7_t); w8_t = swap32 (w8_t); w9_t = swap32 (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); COMPARE_M_SIMD (d, h, c, g); } } __kernel void m12600_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m12600_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m12600_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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 = swap32 (w0_t); w1_t = swap32 (w1_t); w2_t = swap32 (w2_t); w3_t = swap32 (w3_t); w4_t = swap32 (w4_t); w5_t = swap32 (w5_t); w6_t = swap32 (w6_t); w7_t = swap32 (w7_t); w8_t = swap32 (w8_t); w9_t = swap32 (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); if (MATCHES_NONE_VS (d, search[0])) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m12600_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m12600_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m12600_a1.cl000066400000000000000000000245021320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" #include "inc_hash_sha256.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m12600_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * 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]; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1 = ctx0; sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; const u32 e = ctx1.h[4]; sha256_ctx_t ctx; ctx.h[0] = pc256[0]; ctx.h[1] = pc256[1]; ctx.h[2] = pc256[2]; ctx.h[3] = pc256[3]; ctx.h[4] = pc256[4]; ctx.h[5] = pc256[5]; ctx.h[6] = pc256[6]; ctx.h[7] = pc256[7]; ctx.len = 64; ctx.w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 0; ctx.len += 40; sha256_final (&ctx); ctx.h[0] -= pc256[0]; ctx.h[1] -= pc256[1]; ctx.h[2] -= pc256[2]; ctx.h[3] -= pc256[3]; ctx.h[4] -= pc256[4]; ctx.h[5] -= pc256[5]; ctx.h[6] -= pc256[6]; ctx.h[7] -= pc256[7]; const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m12600_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 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] }; /** * 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]; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1 = ctx0; sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx1); const u32 a = ctx1.h[0]; const u32 b = ctx1.h[1]; const u32 c = ctx1.h[2]; const u32 d = ctx1.h[3]; const u32 e = ctx1.h[4]; sha256_ctx_t ctx; ctx.h[0] = pc256[0]; ctx.h[1] = pc256[1]; ctx.h[2] = pc256[2]; ctx.h[3] = pc256[3]; ctx.h[4] = pc256[4]; ctx.h[5] = pc256[5]; ctx.h[6] = pc256[6]; ctx.h[7] = pc256[7]; ctx.len = 64; ctx.w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 0; ctx.len += 40; sha256_final (&ctx); ctx.h[0] -= pc256[0]; ctx.h[1] -= pc256[1]; ctx.h[2] -= pc256[2]; ctx.h[3] -= pc256[3]; ctx.h[4] -= pc256[4]; ctx.h[5] -= pc256[5]; ctx.h[6] -= pc256[6]; ctx.h[7] -= pc256[7]; const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m12600_a3-optimized.cl000066400000000000000000001515651320027462700200210ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #if VECT_SIZE == 1 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void m12600m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * sha1 */ u32x w0_t = w0lr; 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 = swap32 (w0_t); w1_t = swap32 (w1_t); w2_t = swap32 (w2_t); w3_t = swap32 (w3_t); w4_t = swap32 (w4_t); w5_t = swap32 (w5_t); w6_t = swap32 (w6_t); w7_t = swap32 (w7_t); w8_t = swap32 (w8_t); w9_t = swap32 (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); COMPARE_M_SIMD (d, h, c, g); } } void m12600s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_buf[digests_offset].digest_buf[DGST_R1], digests_buf[digests_offset].digest_buf[DGST_R2], digests_buf[digests_offset].digest_buf[DGST_R3] }; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * sha1 */ u32x w0_t = w0lr; 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 = swap32 (w0_t); w1_t = swap32 (w1_t); w2_t = swap32 (w2_t); w3_t = swap32 (w3_t); w4_t = swap32 (w4_t); w5_t = swap32 (w5_t); w6_t = swap32 (w6_t); w7_t = swap32 (w7_t); w8_t = swap32 (w8_t); w9_t = swap32 (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); if (MATCHES_NONE_VS (d, search[0])) continue; 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); COMPARE_S_SIMD (d, h, c, g); } } __kernel void m12600_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m12600_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m12600_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m12600_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m12600_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m12600_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * modifier */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } hashcat-4.0.1/OpenCL/m12600_a3.cl000066400000000000000000000253401320027462700160060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #include "inc_hash_sha256.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m12600_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * 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]; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx0; sha1_init_vector (&ctx0); sha1_update_vector (&ctx0, w, pw_len); sha1_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; const u32x e = ctx0.h[4]; sha256_ctx_vector_t ctx; ctx.h[0] = pc256[0]; ctx.h[1] = pc256[1]; ctx.h[2] = pc256[2]; ctx.h[3] = pc256[3]; ctx.h[4] = pc256[4]; ctx.h[5] = pc256[5]; ctx.h[6] = pc256[6]; ctx.h[7] = pc256[7]; ctx.len = 64; ctx.w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 0; ctx.len += 40; sha256_final_vector (&ctx); ctx.h[0] -= pc256[0]; ctx.h[1] -= pc256[1]; ctx.h[2] -= pc256[2]; ctx.h[3] -= pc256[3]; ctx.h[4] -= pc256[4]; ctx.h[5] -= pc256[5]; ctx.h[6] -= pc256[6]; ctx.h[7] -= pc256[7]; const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m12600_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 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] }; /** * 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]; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx0; sha1_init_vector (&ctx0); sha1_update_vector (&ctx0, w, pw_len); sha1_final_vector (&ctx0); const u32x a = ctx0.h[0]; const u32x b = ctx0.h[1]; const u32x c = ctx0.h[2]; const u32x d = ctx0.h[3]; const u32x e = ctx0.h[4]; sha256_ctx_vector_t ctx; ctx.h[0] = pc256[0]; ctx.h[1] = pc256[1]; ctx.h[2] = pc256[2]; ctx.h[3] = pc256[3]; ctx.h[4] = pc256[4]; ctx.h[5] = pc256[5]; ctx.h[6] = pc256[6]; ctx.h[7] = pc256[7]; ctx.len = 64; ctx.w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; ctx.w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; ctx.w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; ctx.w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; ctx.w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; ctx.w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; ctx.w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; ctx.w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; ctx.w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; ctx.w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; ctx.w2[2] = 0; ctx.w2[3] = 0; ctx.w3[0] = 0; ctx.w3[1] = 0; ctx.w3[2] = 0; ctx.w3[3] = 0; ctx.len += 40; sha256_final_vector (&ctx); ctx.h[0] -= pc256[0]; ctx.h[1] -= pc256[1]; ctx.h[2] -= pc256[2]; ctx.h[3] -= pc256[3]; ctx.h[4] -= pc256[4]; ctx.h[5] -= pc256[5]; ctx.h[6] -= pc256[6]; ctx.h[7] -= pc256[7]; const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m12700.cl000066400000000000000000000256071320027462700154320ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #include "inc_cipher_aes.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha1_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m12700_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global mywallet_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha1_hmac_ctx_t sha1_hmac_ctx; sha1_hmac_init_global_swap (&sha1_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha1_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha1_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha1_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha1_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha1_hmac_ctx.ipad.h[4]; tmps[gid].opad[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha1_hmac_ctx.opad.h[4]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = salt_bufs[salt_pos].salt_buf[0]; w0[1] = salt_bufs[salt_pos].salt_buf[1]; w0[2] = salt_bufs[salt_pos].salt_buf[2]; w0[3] = salt_bufs[salt_pos].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; sha1_hmac_update_64 (&sha1_hmac_ctx, w0, w1, w2, w3, 16); for (u32 i = 0, j = 1; i < 8; i += 5, j += 1) { sha1_hmac_ctx_t sha1_hmac_ctx2 = sha1_hmac_ctx; w0[0] = j; 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] = 0; sha1_hmac_update_64 (&sha1_hmac_ctx2, w0, w1, w2, w3, 4); sha1_hmac_final (&sha1_hmac_ctx2); tmps[gid].dgst[i + 0] = sha1_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha1_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha1_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha1_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha1_hmac_ctx2.opad.h[4]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; } } __kernel void m12700_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global mywallet_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); for (u32 i = 0; i < 8; i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); } } __kernel void m12700_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global mywallet_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; /** * AES part */ 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 ks[KEYLEN]; AES256_set_decrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); u32 data[4]; data[0] = salt_bufs[salt_pos].salt_buf[4]; data[1] = salt_bufs[salt_pos].salt_buf[5]; data[2] = salt_bufs[salt_pos].salt_buf[6]; data[3] = salt_bufs[salt_pos].salt_buf[7]; u32 out[4]; AES256_decrypt (ks, data, out, 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]; out[0] = swap32_S (out[0]); out[1] = swap32_S (out[1]); out[2] = swap32_S (out[2]); out[3] = swap32_S (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 u32 r0 = data[0]; const u32 r1 = data[1]; const u32 r2 = data[2]; const u32 r3 = data[3]; #define il_pos 0 #include COMPARE_M } } hashcat-4.0.1/OpenCL/m12800.cl000066400000000000000000000307171320027462700154310ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md4.cl" #include "inc_hash_sha256.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha256_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m12800_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * lookup ascii table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8 | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * generate nthash */ md4_ctx_t md4_ctx; md4_init (&md4_ctx); md4_update_global_utf16le (&md4_ctx, pws[gid].i, pws[gid].pw_len); md4_final (&md4_ctx); u32 digest_md4[4]; digest_md4[0] = md4_ctx.h[0]; digest_md4[1] = md4_ctx.h[1]; digest_md4[2] = md4_ctx.h[2]; digest_md4[3] = md4_ctx.h[3]; /** * generate pbkdf2 */ u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; #define uint_to_hex_lower8(i) l_bin2asc[(i)] 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; #undef uint_to_hex_lower8 make_utf16le_S (w1, w2, w3); make_utf16le_S (w0, w0, w1); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha256_hmac_ctx_t sha256_hmac_ctx; sha256_hmac_init_64 (&sha256_hmac_ctx, w0, w1, w2, w3); tmps[gid].ipad[0] = sha256_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha256_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha256_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha256_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha256_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha256_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha256_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha256_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha256_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha256_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha256_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha256_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha256_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha256_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha256_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha256_hmac_ctx.opad.h[7]; sha256_hmac_update_global_swap (&sha256_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) { sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; w0[0] = j; 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] = 0; sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); sha256_hmac_final (&sha256_hmac_ctx2); tmps[gid].dgst[i + 0] = sha256_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha256_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha256_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha256_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha256_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha256_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha256_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha256_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m12800_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[8]; u32x opad[8]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); ipad[5] = packv (tmps, ipad, gid, 5); ipad[6] = packv (tmps, ipad, gid, 6); ipad[7] = packv (tmps, ipad, gid, 7); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); opad[5] = packv (tmps, opad, gid, 5); opad[6] = packv (tmps, opad, gid, 6); opad[7] = packv (tmps, opad, gid, 7); for (u32 i = 0; i < 8; i += 8) { u32x dgst[8]; u32x out[8]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); dgst[5] = packv (tmps, dgst, gid, i + 5); dgst[6] = packv (tmps, dgst, gid, i + 6); dgst[7] = packv (tmps, dgst, gid, i + 7); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, i + 4); out[5] = packv (tmps, out, gid, i + 5); out[6] = packv (tmps, out, gid, i + 6); out[7] = packv (tmps, out, gid, i + 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, dgst, gid, i + 5, dgst[5]); unpackv (tmps, dgst, gid, i + 6, dgst[6]); unpackv (tmps, dgst, gid, i + 7, dgst[7]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); unpackv (tmps, out, gid, i + 5, out[5]); unpackv (tmps, out, gid, i + 6, out[6]); unpackv (tmps, out, gid, i + 7, out[7]); } } __kernel void m12800_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); const u32 r0 = tmps[gid].out[DGST_R0]; const u32 r1 = tmps[gid].out[DGST_R1]; const u32 r2 = tmps[gid].out[DGST_R2]; const u32 r3 = tmps[gid].out[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m12900.cl000066400000000000000000000264561320027462700154370ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha256_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m12900_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha256_hmac_ctx_t sha256_hmac_ctx; sha256_hmac_init_global_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha256_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha256_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha256_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha256_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha256_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha256_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha256_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha256_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha256_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha256_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha256_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha256_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha256_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha256_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha256_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha256_hmac_ctx.opad.h[7]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = salt_bufs[salt_pos].salt_buf[0]; w0[1] = salt_bufs[salt_pos].salt_buf[1]; w0[2] = salt_bufs[salt_pos].salt_buf[2]; w0[3] = salt_bufs[salt_pos].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; sha256_hmac_update_64 (&sha256_hmac_ctx, w0, w1, w2, w3, 16); for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) { sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; w0[0] = j; 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] = 0; sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); sha256_hmac_final (&sha256_hmac_ctx2); tmps[gid].dgst[i + 0] = sha256_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha256_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha256_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha256_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha256_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha256_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha256_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha256_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m12900_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[8]; u32x opad[8]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); ipad[5] = packv (tmps, ipad, gid, 5); ipad[6] = packv (tmps, ipad, gid, 6); ipad[7] = packv (tmps, ipad, gid, 7); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); opad[5] = packv (tmps, opad, gid, 5); opad[6] = packv (tmps, opad, gid, 6); opad[7] = packv (tmps, opad, gid, 7); for (u32 i = 0; i < 8; i += 8) { u32x dgst[8]; u32x out[8]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); dgst[5] = packv (tmps, dgst, gid, i + 5); dgst[6] = packv (tmps, dgst, gid, i + 6); dgst[7] = packv (tmps, dgst, gid, i + 7); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, i + 4); out[5] = packv (tmps, out, gid, i + 5); out[6] = packv (tmps, out, gid, i + 6); out[7] = packv (tmps, out, gid, i + 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, dgst, gid, i + 5, dgst[5]); unpackv (tmps, dgst, gid, i + 6, dgst[6]); unpackv (tmps, dgst, gid, i + 7, dgst[7]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); unpackv (tmps, out, gid, i + 5, out[5]); unpackv (tmps, out, gid, i + 6, out[6]); unpackv (tmps, out, gid, i + 7, out[7]); } } __kernel void m12900_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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; sha256_hmac_ctx_t ctx; sha256_hmac_init_64 (&ctx, w0, w1, w2, w3); w0[0] = salt_bufs[salt_pos].salt_buf[ 4]; w0[1] = salt_bufs[salt_pos].salt_buf[ 5]; w0[2] = salt_bufs[salt_pos].salt_buf[ 6]; w0[3] = salt_bufs[salt_pos].salt_buf[ 7]; w1[0] = salt_bufs[salt_pos].salt_buf[ 8]; w1[1] = salt_bufs[salt_pos].salt_buf[ 9]; w1[2] = salt_bufs[salt_pos].salt_buf[10]; w1[3] = salt_bufs[salt_pos].salt_buf[11]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 32); sha256_hmac_final (&ctx); const u32 r0 = ctx.opad.h[0]; const u32 r1 = ctx.opad.h[1]; const u32 r2 = ctx.opad.h[2]; const u32 r3 = ctx.opad.h[3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m13000.cl000066400000000000000000000247431320027462700154240ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha256_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m13000_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha256_hmac_ctx_t sha256_hmac_ctx; sha256_hmac_init_global_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha256_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha256_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha256_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha256_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha256_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha256_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha256_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha256_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha256_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha256_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha256_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha256_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha256_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha256_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha256_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha256_hmac_ctx.opad.h[7]; sha256_hmac_update_global (&sha256_hmac_ctx, salt_bufs[digests_offset].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) { sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); sha256_hmac_final (&sha256_hmac_ctx2); tmps[gid].dgst[i + 0] = sha256_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha256_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha256_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha256_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha256_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha256_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha256_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha256_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m13000_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[8]; u32x opad[8]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); ipad[5] = packv (tmps, ipad, gid, 5); ipad[6] = packv (tmps, ipad, gid, 6); ipad[7] = packv (tmps, ipad, gid, 7); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); opad[5] = packv (tmps, opad, gid, 5); opad[6] = packv (tmps, opad, gid, 6); opad[7] = packv (tmps, opad, gid, 7); for (u32 i = 0; i < 8; i += 8) { u32x dgst[8]; u32x out[8]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); dgst[5] = packv (tmps, dgst, gid, i + 5); dgst[6] = packv (tmps, dgst, gid, i + 6); dgst[7] = packv (tmps, dgst, gid, i + 7); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, i + 4); out[5] = packv (tmps, out, gid, i + 5); out[6] = packv (tmps, out, gid, i + 6); out[7] = packv (tmps, out, gid, i + 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, dgst, gid, i + 5, dgst[5]); unpackv (tmps, dgst, gid, i + 6, dgst[6]); unpackv (tmps, dgst, gid, i + 7, dgst[7]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); unpackv (tmps, out, gid, i + 5, out[5]); unpackv (tmps, out, gid, i + 6, out[6]); unpackv (tmps, out, gid, i + 7, out[7]); } } __kernel void m13000_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); u32 outl4[4]; outl4[0] = tmps[gid].out[0]; outl4[1] = tmps[gid].out[2]; outl4[2] = tmps[gid].out[4]; outl4[3] = tmps[gid].out[6]; u32 outr4[4]; outr4[0] = tmps[gid].out[1]; outr4[1] = tmps[gid].out[3]; outr4[2] = tmps[gid].out[5]; outr4[3] = tmps[gid].out[7]; u32 outl = outl4[0] ^ outl4[1] ^ outl4[2] ^ outl4[3]; u32 outr = outr4[0] ^ outr4[1] ^ outr4[2] ^ outr4[3]; const u32 r0 = outl; const u32 r1 = outr; const u32 r2 = 0; const u32 r3 = 0; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m13100_a0-optimized.cl000066400000000000000000000524631320027462700200070ustar00rootroot00000000000000/** * Author......: see docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; void swap (SCR_TYPE 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; } void rc4_init_16 (SCR_TYPE RC4_KEY *rc4_key, const u32 data[4]) { u32 v = 0x03020100; u32 a = 0x04040404; SCR_TYPE u32 *ptr = (SCR_TYPE u32 *) rc4_key->S; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (SCR_TYPE RC4_KEY *rc4_key, u8 i, u8 j, __global u32 *in, u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } void hmac_md5_pad (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 ipad[4], u32 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); } void hmac_md5_run (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 ipad[4], u32 opad[4], u32 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); } int decrypt_and_check (SCR_TYPE RC4_KEY *rc4_key, u32 data[4], __global u32 *edata2, const u32 edata2_len, const u32 K2[4], const u32 checksum[4]) { rc4_init_16 (rc4_key, data); u32 out0[4]; u32 out1[4]; u8 i = 0; u8 j = 0; /* 8 first bytes are nonce, then ASN1 structs (DER encoding: type-length-data) if length >= 128 bytes: length is on 2 bytes and type is \x63\x82 (encode_krb5_enc_tkt_part) and data is an ASN1 sequence \x30\x82 else: length is on 1 byte and type is \x63\x81 and data is an ASN1 sequence \x30\x81 next headers follow the same ASN1 "type-length-data" scheme */ j = rc4_next_16 (rc4_key, i, j, edata2 + 0, out0); i += 16; if (((out0[2] & 0xff00ffff) != 0x30008163) && ((out0[2] & 0x0000ffff) != 0x00008263)) return 0; j = rc4_next_16 (rc4_key, i, j, edata2 + 4, out1); i += 16; if (((out1[0] & 0x00ffffff) != 0x00000503) && (out1[0] != 0x050307A0)) return 0; rc4_init_16 (rc4_key, data); i = 0; j = 0; // init hmac u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = K2[0]; w0[1] = K2[1]; w0[2] = K2[2]; w0[3] = K2[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; u32 ipad[4]; u32 opad[4]; hmac_md5_pad (w0, w1, w2, w3, ipad, opad); int edata2_left; for (edata2_left = edata2_len; edata2_left >= 64; edata2_left -= 64) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w3); i += 16; edata2 += 4; md5_transform (w0, w1, w2, w3, ipad); } 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] = 0; w3[2] = 0; w3[3] = 0; if (edata2_left < 16) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; truncate_block_4x4_le_S (w0, edata2_left & 0xf); append_0x80_1x4 (w0, edata2_left & 0xf); w3[2] = (64 + edata2_len) * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, ipad); } else if (edata2_left < 32) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; truncate_block_4x4_le_S (w1, edata2_left & 0xf); append_0x80_1x4 (w1, edata2_left & 0xf); w3[2] = (64 + edata2_len) * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, ipad); } else if (edata2_left < 48) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; truncate_block_4x4_le_S (w2, edata2_left & 0xf); append_0x80_1x4 (w2, edata2_left & 0xf); w3[2] = (64 + edata2_len) * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, ipad); } else { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w3); i += 16; edata2 += 4; truncate_block_4x4_le_S (w3, edata2_left & 0xf); append_0x80_1x4 (w3, edata2_left & 0xf); if (edata2_left < 56) { w3[2] = (64 + edata2_len) * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, ipad); } else { md5_transform (w0, w1, w2, w3, ipad); 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] = 0; w3[2] = (64 + edata2_len) * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, ipad); } } w0[0] = ipad[0]; w0[1] = ipad[1]; w0[2] = ipad[2]; w0[3] = ipad[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; md5_transform (w0, w1, w2, w3, opad); if (checksum[0] != opad[0]) return 0; if (checksum[1] != opad[1]) return 0; if (checksum[2] != opad[2]) return 0; if (checksum[3] != opad[3]) return 0; return 1; } void kerb_prepare (const u32 w0[4], const u32 w1[4], const u32 pw_len, const u32 checksum[4], u32 digest[4], u32 K2[4]) { /** * pads */ u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 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_2x4 (w0_t, w1_t, pw_len); make_utf16le (w1_t, w2_t, w3_t); make_utf16le (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 2 encoded as little indian on 4 bytes (02000000 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; u32 ipad[4]; u32 opad[4]; hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); w0_t[0] = 2; 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); // K2 = K1; K2[0] = digest[0]; K2[1] = digest[1]; K2[2] = digest[2]; K2[3] = digest[3]; // 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 m13100_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; u32 pw_buf1[4]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = pws[gid].i[ 6]; pw_buf1[3] = pws[gid].i[ 7]; const u32 pw_len = pws[gid].pw_len; /** * shared */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif /** * salt */ u32 checksum[4]; checksum[0] = krb5tgs_bufs[digests_offset].checksum[0]; checksum[1] = krb5tgs_bufs[digests_offset].checksum[1]; checksum[2] = krb5tgs_bufs[digests_offset].checksum[2]; checksum[3] = krb5tgs_bufs[digests_offset].checksum[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * kerberos */ u32 digest[4]; u32 K2[4]; kerb_prepare (w0, w1, out_len, checksum, digest, K2); u32 tmp[4]; tmp[0] = digest[0]; tmp[1] = digest[1]; tmp[2] = digest[2]; tmp[3] = digest[3]; if (decrypt_and_check (rc4_key, tmp, krb5tgs_bufs[digests_offset].edata2, krb5tgs_bufs[digests_offset].edata2_len, K2, checksum) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } __kernel void m13100_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13100_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13100_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; u32 pw_buf1[4]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = pws[gid].i[ 6]; pw_buf1[3] = pws[gid].i[ 7]; const u32 pw_len = pws[gid].pw_len; /** * shared */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif /** * salt */ u32 checksum[4]; checksum[0] = krb5tgs_bufs[digests_offset].checksum[0]; checksum[1] = krb5tgs_bufs[digests_offset].checksum[1]; checksum[2] = krb5tgs_bufs[digests_offset].checksum[2]; checksum[3] = krb5tgs_bufs[digests_offset].checksum[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * kerberos */ u32 digest[4]; u32 K2[4]; kerb_prepare (w0, w1, out_len, checksum, digest, K2); u32 tmp[4]; tmp[0] = digest[0]; tmp[1] = digest[1]; tmp[2] = digest[2]; tmp[3] = digest[3]; if (decrypt_and_check (rc4_key, tmp, krb5tgs_bufs[digests_offset].edata2, krb5tgs_bufs[digests_offset].edata2_len, K2, checksum) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } __kernel void m13100_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13100_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m13100_a0.cl000066400000000000000000000306761320027462700160070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //shared mem too small //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; void swap (SCR_TYPE 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; } void rc4_init_16 (SCR_TYPE RC4_KEY *rc4_key, const u32 data[4]) { u32 v = 0x03020100; u32 a = 0x04040404; SCR_TYPE u32 *ptr = (SCR_TYPE u32 *) rc4_key->S; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (SCR_TYPE RC4_KEY *rc4_key, u8 i, u8 j, __global const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } int decrypt_and_check (SCR_TYPE RC4_KEY *rc4_key, u32 data[4], __global const u32 *edata2, const u32 edata2_len, const u32 K2[4], const u32 checksum[4]) { rc4_init_16 (rc4_key, data); u32 out0[4]; u32 out1[4]; u8 i = 0; u8 j = 0; /* 8 first bytes are nonce, then ASN1 structs (DER encoding: type-length-data) if length >= 128 bytes: length is on 2 bytes and type is \x63\x82 (encode_krb5_enc_tkt_part) and data is an ASN1 sequence \x30\x82 else: length is on 1 byte and type is \x63\x81 and data is an ASN1 sequence \x30\x81 next headers follow the same ASN1 "type-length-data" scheme */ j = rc4_next_16 (rc4_key, i, j, edata2 + 0, out0); i += 16; if (((out0[2] & 0xff00ffff) != 0x30008163) && ((out0[2] & 0x0000ffff) != 0x00008263)) return 0; j = rc4_next_16 (rc4_key, i, j, edata2 + 4, out1); i += 16; if (((out1[0] & 0x00ffffff) != 0x00000503) && (out1[0] != 0x050307A0)) return 0; rc4_init_16 (rc4_key, data); i = 0; j = 0; // init hmac u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = K2[0]; w0[1] = K2[1]; w0[2] = K2[2]; w0[3] = K2[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); int edata2_left; for (edata2_left = edata2_len; edata2_left >= 64; edata2_left -= 64) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w3); i += 16; edata2 += 4; md5_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); } 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] = 0; w3[2] = 0; w3[3] = 0; if (edata2_left < 16) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; truncate_block_4x4_le_S (w0, edata2_left & 0xf); } else if (edata2_left < 32) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; truncate_block_4x4_le_S (w1, edata2_left & 0xf); } else if (edata2_left < 48) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; truncate_block_4x4_le_S (w2, edata2_left & 0xf); } else { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w3); i += 16; edata2 += 4; truncate_block_4x4_le_S (w3, edata2_left & 0xf); } md5_hmac_update_64 (&ctx, w0, w1, w2, w3, edata2_left); md5_hmac_final (&ctx); if (checksum[0] != ctx.opad.h[0]) return 0; if (checksum[1] != ctx.opad.h[1]) return 0; if (checksum[2] != ctx.opad.h[2]) return 0; if (checksum[3] != ctx.opad.h[3]) return 0; return 1; } void kerb_prepare (const u32 K[4], const u32 checksum[4], u32 digest[4], u32 K2[4]) { // K1=MD5_HMAC(K,1); with 1 encoded as little indian on 4 bytes (01000000 in hexa); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = K[0]; w0[1] = K[1]; w0[2] = K[2]; w0[3] = K[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; md5_hmac_ctx_t ctx1; md5_hmac_init_64 (&ctx1, w0, w1, w2, w3); w0[0] = 2; 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] = 0; md5_hmac_update_64 (&ctx1, w0, w1, w2, w3, 4); md5_hmac_final (&ctx1); w0[0] = ctx1.opad.h[0]; w0[1] = ctx1.opad.h[1]; w0[2] = ctx1.opad.h[2]; w0[3] = ctx1.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); w0[0] = checksum[0]; w0[1] = checksum[1]; w0[2] = checksum[2]; w0[3] = checksum[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; md5_hmac_update_64 (&ctx, w0, w1, w2, w3, 16); md5_hmac_final (&ctx); digest[0] = ctx.opad.h[0]; digest[1] = ctx.opad.h[1]; digest[2] = ctx.opad.h[2]; digest[3] = ctx.opad.h[3]; K2[0] = ctx1.opad.h[0]; K2[1] = ctx1.opad.h[1]; K2[2] = ctx1.opad.h[2]; K2[3] = ctx1.opad.h[3]; } __kernel void m13100_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif u32 checksum[4]; checksum[0] = krb5tgs_bufs[digests_offset].checksum[0]; checksum[1] = krb5tgs_bufs[digests_offset].checksum[1]; checksum[2] = krb5tgs_bufs[digests_offset].checksum[2]; checksum[3] = krb5tgs_bufs[digests_offset].checksum[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md4_ctx_t ctx; md4_init (&ctx); md4_update_utf16le (&ctx, tmp.i, tmp.pw_len); md4_final (&ctx); u32 digest[4]; u32 K2[4]; kerb_prepare (ctx.h, checksum, digest, K2); if (decrypt_and_check (rc4_key, digest, krb5tgs_bufs[digests_offset].edata2, krb5tgs_bufs[digests_offset].edata2_len, K2, checksum) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } __kernel void m13100_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif u32 checksum[4]; checksum[0] = krb5tgs_bufs[digests_offset].checksum[0]; checksum[1] = krb5tgs_bufs[digests_offset].checksum[1]; checksum[2] = krb5tgs_bufs[digests_offset].checksum[2]; checksum[3] = krb5tgs_bufs[digests_offset].checksum[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); md4_ctx_t ctx; md4_init (&ctx); md4_update_utf16le (&ctx, tmp.i, tmp.pw_len); md4_final (&ctx); u32 digest[4]; u32 K2[4]; kerb_prepare (ctx.h, checksum, digest, K2); if (decrypt_and_check (rc4_key, digest, krb5tgs_bufs[digests_offset].edata2, krb5tgs_bufs[digests_offset].edata2_len, K2, checksum) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } hashcat-4.0.1/OpenCL/m13100_a1-optimized.cl000066400000000000000000000577761320027462700200240ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; void swap (SCR_TYPE 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; } void rc4_init_16 (SCR_TYPE RC4_KEY *rc4_key, const u32 data[4]) { u32 v = 0x03020100; u32 a = 0x04040404; SCR_TYPE u32 *ptr = (SCR_TYPE u32 *) rc4_key->S; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (SCR_TYPE RC4_KEY *rc4_key, u8 i, u8 j, __global u32 *in, u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } void hmac_md5_pad (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 ipad[4], u32 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); } void hmac_md5_run (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 ipad[4], u32 opad[4], u32 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); } int decrypt_and_check (SCR_TYPE RC4_KEY *rc4_key, u32 data[4], __global u32 *edata2, const u32 edata2_len, const u32 K2[4], const u32 checksum[4]) { rc4_init_16 (rc4_key, data); u32 out0[4]; u32 out1[4]; u8 i = 0; u8 j = 0; /* 8 first bytes are nonce, then ASN1 structs (DER encoding: type-length-data) if length >= 128 bytes: length is on 2 bytes and type is \x63\x82 (encode_krb5_enc_tkt_part) and data is an ASN1 sequence \x30\x82 else: length is on 1 byte and type is \x63\x81 and data is an ASN1 sequence \x30\x81 next headers follow the same ASN1 "type-length-data" scheme */ j = rc4_next_16 (rc4_key, i, j, edata2 + 0, out0); i += 16; if (((out0[2] & 0xff00ffff) != 0x30008163) && ((out0[2] & 0x0000ffff) != 0x00008263)) return 0; j = rc4_next_16 (rc4_key, i, j, edata2 + 4, out1); i += 16; if (((out1[0] & 0x00ffffff) != 0x00000503) && (out1[0] != 0x050307A0)) return 0; rc4_init_16 (rc4_key, data); i = 0; j = 0; // init hmac u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = K2[0]; w0[1] = K2[1]; w0[2] = K2[2]; w0[3] = K2[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; u32 ipad[4]; u32 opad[4]; hmac_md5_pad (w0, w1, w2, w3, ipad, opad); int edata2_left; for (edata2_left = edata2_len; edata2_left >= 64; edata2_left -= 64) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w3); i += 16; edata2 += 4; md5_transform (w0, w1, w2, w3, ipad); } 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] = 0; w3[2] = 0; w3[3] = 0; if (edata2_left < 16) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; truncate_block_4x4_le_S (w0, edata2_left & 0xf); append_0x80_1x4 (w0, edata2_left & 0xf); w3[2] = (64 + edata2_len) * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, ipad); } else if (edata2_left < 32) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; truncate_block_4x4_le_S (w1, edata2_left & 0xf); append_0x80_1x4 (w1, edata2_left & 0xf); w3[2] = (64 + edata2_len) * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, ipad); } else if (edata2_left < 48) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; truncate_block_4x4_le_S (w2, edata2_left & 0xf); append_0x80_1x4 (w2, edata2_left & 0xf); w3[2] = (64 + edata2_len) * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, ipad); } else { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w3); i += 16; edata2 += 4; truncate_block_4x4_le_S (w3, edata2_left & 0xf); append_0x80_1x4 (w3, edata2_left & 0xf); if (edata2_left < 56) { w3[2] = (64 + edata2_len) * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, ipad); } else { md5_transform (w0, w1, w2, w3, ipad); 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] = 0; w3[2] = (64 + edata2_len) * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, ipad); } } w0[0] = ipad[0]; w0[1] = ipad[1]; w0[2] = ipad[2]; w0[3] = ipad[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; md5_transform (w0, w1, w2, w3, opad); if (checksum[0] != opad[0]) return 0; if (checksum[1] != opad[1]) return 0; if (checksum[2] != opad[2]) return 0; if (checksum[3] != opad[3]) return 0; return 1; } void kerb_prepare (const u32 w0[4], const u32 w1[4], const u32 pw_len, const u32 checksum[4], u32 digest[4], u32 K2[4]) { /** * pads */ u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 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_2x4 (w0_t, w1_t, pw_len); make_utf16le (w1_t, w2_t, w3_t); make_utf16le (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 2 encoded as little indian on 4 bytes (02000000 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; u32 ipad[4]; u32 opad[4]; hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); w0_t[0] = 2; 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); // K2 = K1; K2[0] = digest[0]; K2[1] = digest[1]; K2[2] = digest[2]; K2[3] = digest[3]; // 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 m13100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * shared */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif /** * salt */ u32 checksum[4]; checksum[0] = krb5tgs_bufs[digests_offset].checksum[0]; checksum[1] = krb5tgs_bufs[digests_offset].checksum[1]; checksum[2] = krb5tgs_bufs[digests_offset].checksum[2]; checksum[3] = krb5tgs_bufs[digests_offset].checksum[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32x w0[4]; u32x w1[4]; 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]; /** * kerberos */ u32 digest[4]; u32 K2[4]; kerb_prepare (w0, w1, pw_len, checksum, digest, K2); u32 tmp[4]; tmp[0] = digest[0]; tmp[1] = digest[1]; tmp[2] = digest[2]; tmp[3] = digest[3]; if (decrypt_and_check (rc4_key, tmp, krb5tgs_bufs[digests_offset].edata2, krb5tgs_bufs[digests_offset].edata2_len, K2, checksum) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } __kernel void m13100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * shared */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif /** * salt */ u32 checksum[4]; checksum[0] = krb5tgs_bufs[digests_offset].checksum[0]; checksum[1] = krb5tgs_bufs[digests_offset].checksum[1]; checksum[2] = krb5tgs_bufs[digests_offset].checksum[2]; checksum[3] = krb5tgs_bufs[digests_offset].checksum[3]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32x w0[4]; u32x w1[4]; 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]; /** * kerberos */ u32 digest[4]; u32 K2[4]; kerb_prepare (w0, w1, pw_len, checksum, digest, K2); u32 tmp[4]; tmp[0] = digest[0]; tmp[1] = digest[1]; tmp[2] = digest[2]; tmp[3] = digest[3]; if (decrypt_and_check (rc4_key, tmp, krb5tgs_bufs[digests_offset].edata2, krb5tgs_bufs[digests_offset].edata2_len, K2, checksum) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } __kernel void m13100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m13100_a1.cl000066400000000000000000000306271320027462700160040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //shared mem too small //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; void swap (SCR_TYPE 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; } void rc4_init_16 (SCR_TYPE RC4_KEY *rc4_key, const u32 data[4]) { u32 v = 0x03020100; u32 a = 0x04040404; SCR_TYPE u32 *ptr = (SCR_TYPE u32 *) rc4_key->S; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (SCR_TYPE RC4_KEY *rc4_key, u8 i, u8 j, __global const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } int decrypt_and_check (SCR_TYPE RC4_KEY *rc4_key, u32 data[4], __global const u32 *edata2, const u32 edata2_len, const u32 K2[4], const u32 checksum[4]) { rc4_init_16 (rc4_key, data); u32 out0[4]; u32 out1[4]; u8 i = 0; u8 j = 0; /* 8 first bytes are nonce, then ASN1 structs (DER encoding: type-length-data) if length >= 128 bytes: length is on 2 bytes and type is \x63\x82 (encode_krb5_enc_tkt_part) and data is an ASN1 sequence \x30\x82 else: length is on 1 byte and type is \x63\x81 and data is an ASN1 sequence \x30\x81 next headers follow the same ASN1 "type-length-data" scheme */ j = rc4_next_16 (rc4_key, i, j, edata2 + 0, out0); i += 16; if (((out0[2] & 0xff00ffff) != 0x30008163) && ((out0[2] & 0x0000ffff) != 0x00008263)) return 0; j = rc4_next_16 (rc4_key, i, j, edata2 + 4, out1); i += 16; if (((out1[0] & 0x00ffffff) != 0x00000503) && (out1[0] != 0x050307A0)) return 0; rc4_init_16 (rc4_key, data); i = 0; j = 0; // init hmac u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = K2[0]; w0[1] = K2[1]; w0[2] = K2[2]; w0[3] = K2[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); int edata2_left; for (edata2_left = edata2_len; edata2_left >= 64; edata2_left -= 64) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w3); i += 16; edata2 += 4; md5_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); } 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] = 0; w3[2] = 0; w3[3] = 0; if (edata2_left < 16) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; truncate_block_4x4_le_S (w0, edata2_left & 0xf); } else if (edata2_left < 32) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; truncate_block_4x4_le_S (w1, edata2_left & 0xf); } else if (edata2_left < 48) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; truncate_block_4x4_le_S (w2, edata2_left & 0xf); } else { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w3); i += 16; edata2 += 4; truncate_block_4x4_le_S (w3, edata2_left & 0xf); } md5_hmac_update_64 (&ctx, w0, w1, w2, w3, edata2_left); md5_hmac_final (&ctx); if (checksum[0] != ctx.opad.h[0]) return 0; if (checksum[1] != ctx.opad.h[1]) return 0; if (checksum[2] != ctx.opad.h[2]) return 0; if (checksum[3] != ctx.opad.h[3]) return 0; return 1; } void kerb_prepare (const u32 K[4], const u32 checksum[4], u32 digest[4], u32 K2[4]) { // K1=MD5_HMAC(K,1); with 1 encoded as little indian on 4 bytes (01000000 in hexa); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = K[0]; w0[1] = K[1]; w0[2] = K[2]; w0[3] = K[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; md5_hmac_ctx_t ctx1; md5_hmac_init_64 (&ctx1, w0, w1, w2, w3); w0[0] = 2; 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] = 0; md5_hmac_update_64 (&ctx1, w0, w1, w2, w3, 4); md5_hmac_final (&ctx1); w0[0] = ctx1.opad.h[0]; w0[1] = ctx1.opad.h[1]; w0[2] = ctx1.opad.h[2]; w0[3] = ctx1.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); w0[0] = checksum[0]; w0[1] = checksum[1]; w0[2] = checksum[2]; w0[3] = checksum[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; md5_hmac_update_64 (&ctx, w0, w1, w2, w3, 16); md5_hmac_final (&ctx); digest[0] = ctx.opad.h[0]; digest[1] = ctx.opad.h[1]; digest[2] = ctx.opad.h[2]; digest[3] = ctx.opad.h[3]; K2[0] = ctx1.opad.h[0]; K2[1] = ctx1.opad.h[1]; K2[2] = ctx1.opad.h[2]; K2[3] = ctx1.opad.h[3]; } __kernel void m13100_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif u32 checksum[4]; checksum[0] = krb5tgs_bufs[digests_offset].checksum[0]; checksum[1] = krb5tgs_bufs[digests_offset].checksum[1]; checksum[2] = krb5tgs_bufs[digests_offset].checksum[2]; checksum[3] = krb5tgs_bufs[digests_offset].checksum[3]; md4_ctx_t ctx0; md4_init (&ctx0); md4_update_global_utf16le (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md4_ctx_t ctx = ctx0; md4_update_global_utf16le (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md4_final (&ctx); u32 digest[4]; u32 K2[4]; kerb_prepare (ctx.h, checksum, digest, K2); if (decrypt_and_check (rc4_key, digest, krb5tgs_bufs[digests_offset].edata2, krb5tgs_bufs[digests_offset].edata2_len, K2, checksum) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } __kernel void m13100_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif u32 checksum[4]; checksum[0] = krb5tgs_bufs[digests_offset].checksum[0]; checksum[1] = krb5tgs_bufs[digests_offset].checksum[1]; checksum[2] = krb5tgs_bufs[digests_offset].checksum[2]; checksum[3] = krb5tgs_bufs[digests_offset].checksum[3]; md4_ctx_t ctx0; md4_init (&ctx0); md4_update_global_utf16le (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { md4_ctx_t ctx = ctx0; md4_update_global_utf16le (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); md4_final (&ctx); u32 digest[4]; u32 K2[4]; kerb_prepare (ctx.h, checksum, digest, K2); if (decrypt_and_check (rc4_key, digest, krb5tgs_bufs[digests_offset].edata2, krb5tgs_bufs[digests_offset].edata2_len, K2, checksum) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } hashcat-4.0.1/OpenCL/m13100_a3-optimized.cl000066400000000000000000000610251320027462700200040ustar00rootroot00000000000000/** * Author......: see docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; void swap (SCR_TYPE 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; } void rc4_init_16 (SCR_TYPE RC4_KEY *rc4_key, const u32 data[4]) { u32 v = 0x03020100; u32 a = 0x04040404; SCR_TYPE u32 *ptr = (SCR_TYPE u32 *) rc4_key->S; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (SCR_TYPE RC4_KEY *rc4_key, u8 i, u8 j, __global u32 *in, u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } void hmac_md5_pad (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 ipad[4], u32 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); } void hmac_md5_run (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 ipad[4], u32 opad[4], u32 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); } int decrypt_and_check (SCR_TYPE RC4_KEY *rc4_key, u32 data[4], __global u32 *edata2, const u32 edata2_len, const u32 K2[4], const u32 checksum[4]) { rc4_init_16 (rc4_key, data); u32 out0[4]; u32 out1[4]; u8 i = 0; u8 j = 0; /* 8 first bytes are nonce, then ASN1 structs (DER encoding: type-length-data) if length >= 128 bytes: length is on 2 bytes and type is \x63\x82 (encode_krb5_enc_tkt_part) and data is an ASN1 sequence \x30\x82 else: length is on 1 byte and type is \x63\x81 and data is an ASN1 sequence \x30\x81 next headers follow the same ASN1 "type-length-data" scheme */ j = rc4_next_16 (rc4_key, i, j, edata2 + 0, out0); i += 16; if (((out0[2] & 0xff00ffff) != 0x30008163) && ((out0[2] & 0x0000ffff) != 0x00008263)) return 0; j = rc4_next_16 (rc4_key, i, j, edata2 + 4, out1); i += 16; if (((out1[0] & 0x00ffffff) != 0x00000503) && (out1[0] != 0x050307A0)) return 0; rc4_init_16 (rc4_key, data); i = 0; j = 0; // init hmac u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = K2[0]; w0[1] = K2[1]; w0[2] = K2[2]; w0[3] = K2[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; u32 ipad[4]; u32 opad[4]; hmac_md5_pad (w0, w1, w2, w3, ipad, opad); int edata2_left; for (edata2_left = edata2_len; edata2_left >= 64; edata2_left -= 64) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w3); i += 16; edata2 += 4; md5_transform (w0, w1, w2, w3, ipad); } 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] = 0; w3[2] = 0; w3[3] = 0; if (edata2_left < 16) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; truncate_block_4x4_le_S (w0, edata2_left & 0xf); append_0x80_1x4 (w0, edata2_left & 0xf); w3[2] = (64 + edata2_len) * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, ipad); } else if (edata2_left < 32) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; truncate_block_4x4_le_S (w1, edata2_left & 0xf); append_0x80_1x4 (w1, edata2_left & 0xf); w3[2] = (64 + edata2_len) * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, ipad); } else if (edata2_left < 48) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; truncate_block_4x4_le_S (w2, edata2_left & 0xf); append_0x80_1x4 (w2, edata2_left & 0xf); w3[2] = (64 + edata2_len) * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, ipad); } else { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w3); i += 16; edata2 += 4; truncate_block_4x4_le_S (w3, edata2_left & 0xf); append_0x80_1x4 (w3, edata2_left & 0xf); if (edata2_left < 56) { w3[2] = (64 + edata2_len) * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, ipad); } else { md5_transform (w0, w1, w2, w3, ipad); 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] = 0; w3[2] = (64 + edata2_len) * 8; w3[3] = 0; md5_transform (w0, w1, w2, w3, ipad); } } w0[0] = ipad[0]; w0[1] = ipad[1]; w0[2] = ipad[2]; w0[3] = ipad[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; md5_transform (w0, w1, w2, w3, opad); if (checksum[0] != opad[0]) return 0; if (checksum[1] != opad[1]) return 0; if (checksum[2] != opad[2]) return 0; if (checksum[3] != opad[3]) return 0; return 1; } void kerb_prepare (const u32 w0[4], const u32 w1[4], const u32 pw_len, const u32 checksum[4], u32 digest[4], u32 K2[4]) { /** * pads */ u32 w0_t[4]; u32 w1_t[4]; u32 w2_t[4]; u32 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_2x4 (w0_t, w1_t, pw_len); make_utf16le (w1_t, w2_t, w3_t); make_utf16le (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 2 encoded as little indian on 4 bytes (02000000 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; u32 ipad[4]; u32 opad[4]; hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); w0_t[0] = 2; 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); // K2 = K1; K2[0] = digest[0]; K2[1] = digest[1]; K2[2] = digest[2]; K2[3] = digest[3]; // 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); } void m13100 (SCR_TYPE RC4_KEY *rc4_key, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 checksum[4]; checksum[0] = krb5tgs_bufs[digests_offset].checksum[0]; checksum[1] = krb5tgs_bufs[digests_offset].checksum[1]; checksum[2] = krb5tgs_bufs[digests_offset].checksum[2]; checksum[3] = krb5tgs_bufs[digests_offset].checksum[3]; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 w0r = bfs_buf[il_pos].i; w0[0] = w0l | w0r; /** * kerberos */ u32 digest[4]; u32 K2[4]; kerb_prepare (w0, w1, pw_len, checksum, digest, K2); u32 tmp[4]; tmp[0] = digest[0]; tmp[1] = digest[1]; tmp[2] = digest[2]; tmp[3] = digest[3]; if (decrypt_and_check (rc4_key, tmp, krb5tgs_bufs[digests_offset].edata2, krb5tgs_bufs[digests_offset].edata2_len, K2, checksum) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } __kernel void m13100_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif m13100 (rc4_key, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, krb5tgs_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13100_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif m13100 (rc4_key, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, krb5tgs_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13100_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13100_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif m13100 (rc4_key, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, krb5tgs_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13100_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif m13100 (rc4_key, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, krb5tgs_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13100_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m13100_a3.cl000066400000000000000000000313351320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //shared mem too small //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_md4.cl" #include "inc_hash_md5.cl" typedef struct { u8 S[256]; u32 wtf_its_faster; } RC4_KEY; void swap (SCR_TYPE 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; } void rc4_init_16 (SCR_TYPE RC4_KEY *rc4_key, const u32 data[4]) { u32 v = 0x03020100; u32 a = 0x04040404; SCR_TYPE u32 *ptr = (SCR_TYPE u32 *) rc4_key->S; #ifdef _unroll #pragma unroll #endif 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++; } } u8 rc4_next_16 (SCR_TYPE RC4_KEY *rc4_key, u8 i, u8 j, __global const u32 in[4], u32 out[4]) { #ifdef _unroll #pragma unroll #endif 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; } int decrypt_and_check (SCR_TYPE RC4_KEY *rc4_key, u32 data[4], __global const u32 *edata2, const u32 edata2_len, const u32 K2[4], const u32 checksum[4]) { rc4_init_16 (rc4_key, data); u32 out0[4]; u32 out1[4]; u8 i = 0; u8 j = 0; /* 8 first bytes are nonce, then ASN1 structs (DER encoding: type-length-data) if length >= 128 bytes: length is on 2 bytes and type is \x63\x82 (encode_krb5_enc_tkt_part) and data is an ASN1 sequence \x30\x82 else: length is on 1 byte and type is \x63\x81 and data is an ASN1 sequence \x30\x81 next headers follow the same ASN1 "type-length-data" scheme */ j = rc4_next_16 (rc4_key, i, j, edata2 + 0, out0); i += 16; if (((out0[2] & 0xff00ffff) != 0x30008163) && ((out0[2] & 0x0000ffff) != 0x00008263)) return 0; j = rc4_next_16 (rc4_key, i, j, edata2 + 4, out1); i += 16; if (((out1[0] & 0x00ffffff) != 0x00000503) && (out1[0] != 0x050307A0)) return 0; rc4_init_16 (rc4_key, data); i = 0; j = 0; // init hmac u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = K2[0]; w0[1] = K2[1]; w0[2] = K2[2]; w0[3] = K2[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); int edata2_left; for (edata2_left = edata2_len; edata2_left >= 64; edata2_left -= 64) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w3); i += 16; edata2 += 4; md5_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); } 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] = 0; w3[2] = 0; w3[3] = 0; if (edata2_left < 16) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; truncate_block_4x4_le_S (w0, edata2_left & 0xf); } else if (edata2_left < 32) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; truncate_block_4x4_le_S (w1, edata2_left & 0xf); } else if (edata2_left < 48) { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; truncate_block_4x4_le_S (w2, edata2_left & 0xf); } else { j = rc4_next_16 (rc4_key, i, j, edata2, w0); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w1); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w2); i += 16; edata2 += 4; j = rc4_next_16 (rc4_key, i, j, edata2, w3); i += 16; edata2 += 4; truncate_block_4x4_le_S (w3, edata2_left & 0xf); } md5_hmac_update_64 (&ctx, w0, w1, w2, w3, edata2_left); md5_hmac_final (&ctx); if (checksum[0] != ctx.opad.h[0]) return 0; if (checksum[1] != ctx.opad.h[1]) return 0; if (checksum[2] != ctx.opad.h[2]) return 0; if (checksum[3] != ctx.opad.h[3]) return 0; return 1; } void kerb_prepare (const u32 K[4], const u32 checksum[4], u32 digest[4], u32 K2[4]) { // K1=MD5_HMAC(K,1); with 1 encoded as little indian on 4 bytes (01000000 in hexa); u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = K[0]; w0[1] = K[1]; w0[2] = K[2]; w0[3] = K[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; md5_hmac_ctx_t ctx1; md5_hmac_init_64 (&ctx1, w0, w1, w2, w3); w0[0] = 2; 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] = 0; md5_hmac_update_64 (&ctx1, w0, w1, w2, w3, 4); md5_hmac_final (&ctx1); w0[0] = ctx1.opad.h[0]; w0[1] = ctx1.opad.h[1]; w0[2] = ctx1.opad.h[2]; w0[3] = ctx1.opad.h[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; md5_hmac_ctx_t ctx; md5_hmac_init_64 (&ctx, w0, w1, w2, w3); w0[0] = checksum[0]; w0[1] = checksum[1]; w0[2] = checksum[2]; w0[3] = checksum[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; md5_hmac_update_64 (&ctx, w0, w1, w2, w3, 16); md5_hmac_final (&ctx); digest[0] = ctx.opad.h[0]; digest[1] = ctx.opad.h[1]; digest[2] = ctx.opad.h[2]; digest[3] = ctx.opad.h[3]; K2[0] = ctx1.opad.h[0]; K2[1] = ctx1.opad.h[1]; K2[2] = ctx1.opad.h[2]; K2[3] = ctx1.opad.h[3]; } __kernel void m13100_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif u32 checksum[4]; checksum[0] = krb5tgs_bufs[digests_offset].checksum[0]; checksum[1] = krb5tgs_bufs[digests_offset].checksum[1]; checksum[2] = krb5tgs_bufs[digests_offset].checksum[2]; checksum[3] = krb5tgs_bufs[digests_offset].checksum[3]; /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md4_ctx_t ctx; md4_init (&ctx); md4_update_utf16le (&ctx, w, pw_len); md4_final (&ctx); u32 digest[4]; u32 K2[4]; kerb_prepare (ctx.h, checksum, digest, K2); if (decrypt_and_check (rc4_key, digest, krb5tgs_bufs[digests_offset].edata2, krb5tgs_bufs[digests_offset].edata2_len, K2, checksum) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } __kernel void m13100_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const krb5tgs_t *krb5tgs_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } #ifdef REAL_SHM __local RC4_KEY rc4_keys[64]; __local RC4_KEY *rc4_key = &rc4_keys[lid]; #else RC4_KEY rc4_keys[1]; RC4_KEY *rc4_key = &rc4_keys[0]; #endif u32 checksum[4]; checksum[0] = krb5tgs_bufs[digests_offset].checksum[0]; checksum[1] = krb5tgs_bufs[digests_offset].checksum[1]; checksum[2] = krb5tgs_bufs[digests_offset].checksum[2]; checksum[3] = krb5tgs_bufs[digests_offset].checksum[3]; /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; md4_ctx_t ctx; md4_init (&ctx); md4_update_utf16le (&ctx, w, pw_len); md4_final (&ctx); u32 digest[4]; u32 K2[4]; kerb_prepare (ctx.h, checksum, digest, K2); if (decrypt_and_check (rc4_key, digest, krb5tgs_bufs[digests_offset].edata2, krb5tgs_bufs[digests_offset].edata2_len, K2, checksum) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } } hashcat-4.0.1/OpenCL/m13200.cl000066400000000000000000000171641320027462700154250ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_sha1.cl" #include "inc_cipher_aes.cl" __kernel void m13200_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global axcrypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * KEK */ sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); sha1_final (&ctx); u32 KEK[5]; KEK[0] = ctx.h[0]; KEK[1] = ctx.h[1]; KEK[2] = ctx.h[2]; KEK[3] = ctx.h[3]; KEK[4] = ctx.h[4]; /* hash XOR salt is KEK, used as key for AES wrapping routine */ tmps[gid].KEK[0] = KEK[0] ^ salt_bufs[salt_pos].salt_buf[0]; tmps[gid].KEK[1] = KEK[1] ^ salt_bufs[salt_pos].salt_buf[1]; tmps[gid].KEK[2] = KEK[2] ^ salt_bufs[salt_pos].salt_buf[2]; tmps[gid].KEK[3] = KEK[3] ^ salt_bufs[salt_pos].salt_buf[3]; /** * salt_buf[0..3] is salt * salt_buf[4..9] is wrapped_key */ /* set lsb */ tmps[gid].lsb[0] = salt_bufs[salt_pos].salt_buf[6]; tmps[gid].lsb[1] = salt_bufs[salt_pos].salt_buf[7]; tmps[gid].lsb[2] = salt_bufs[salt_pos].salt_buf[8]; tmps[gid].lsb[3] = salt_bufs[salt_pos].salt_buf[9]; /* set msb */ tmps[gid].cipher[0] = salt_bufs[salt_pos].salt_buf[4]; tmps[gid].cipher[1] = salt_bufs[salt_pos].salt_buf[5]; tmps[gid].cipher[2] = 0; tmps[gid].cipher[3] = 0; } __kernel void m13200_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global axcrypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; u32 ukey[4]; ukey[0] = tmps[gid].KEK[0]; ukey[1] = tmps[gid].KEK[1]; ukey[2] = tmps[gid].KEK[2]; ukey[3] = tmps[gid].KEK[3]; u32 lsb[4]; lsb[0] = tmps[gid].lsb[0]; lsb[1] = tmps[gid].lsb[1]; lsb[2] = tmps[gid].lsb[2]; lsb[3] = tmps[gid].lsb[3]; u32 cipher[4]; cipher[0] = tmps[gid].cipher[0]; cipher[1] = tmps[gid].cipher[1]; cipher[2] = tmps[gid].cipher[2]; cipher[3] = tmps[gid].cipher[3]; /** * aes init */ #define KEYLEN 44 u32 ks[KEYLEN]; /** * aes decrypt key */ AES128_set_decrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); const u32 wrapping_rounds = salt_bufs[salt_pos].salt_iter - 1; /* custom AES un-wrapping loop */ for (u32 i = 0, j = wrapping_rounds - loop_pos; i < loop_cnt; i++, j--) { const u32 j2 = j * 2; cipher[0] ^= swap32_S (j2 + 2); /* R[i] */ cipher[2] = lsb[2]; cipher[3] = lsb[3]; /* AES_ECB(KEK, (MSB XOR (NUMBER_AES_BLOCKS * j + i)) | R[i]) */ AES128_decrypt (ks, cipher, cipher, s_td0, s_td1, s_td2, s_td3, s_td4); lsb[2] = cipher[2]; lsb[3] = cipher[3]; /* 2nd block treatment */ cipher[0] ^= swap32_S (j2 + 1); cipher[2] = lsb[0]; cipher[3] = lsb[1]; AES128_decrypt (ks, cipher, cipher, s_td0, s_td1, s_td2, s_td3, s_td4); lsb[0] = cipher[2]; lsb[1] = cipher[3]; } tmps[gid].lsb[0] = lsb[0]; tmps[gid].lsb[1] = lsb[1]; tmps[gid].lsb[2] = lsb[2]; tmps[gid].lsb[3] = lsb[3]; tmps[gid].cipher[0] = cipher[0]; tmps[gid].cipher[1] = cipher[1]; tmps[gid].cipher[2] = cipher[2]; tmps[gid].cipher[3] = cipher[3]; } __kernel void m13200_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global axcrypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); #define il_pos 0 if (tmps[gid].cipher[0] == 0xa6a6a6a6 && tmps[gid].cipher[1] == 0xa6a6a6a6) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } hashcat-4.0.1/OpenCL/m13300_a0-optimized.cl000066400000000000000000000567721320027462700200200ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m13300_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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; e &= 0x00000000; COMPARE_M_SIMD (a, e, d, c); } } __kernel void m13300_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13300_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13300_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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; e &= 0x00000000; COMPARE_S_SIMD (a, e, d, c); } } __kernel void m13300_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13300_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m13300_a0.cl000066400000000000000000000077321320027462700160060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m13300_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_swap (&ctx, tmp.i, tmp.pw_len); sha1_final (&ctx); ctx.h[4] = 0; const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m13300_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_swap (&ctx, tmp.i, tmp.pw_len); sha1_final (&ctx); ctx.h[4] = 0; const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m13300_a1-optimized.cl000066400000000000000000000653611320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m13300_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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; e &= 0x00000000; COMPARE_M_SIMD (a, e, d, c); } } __kernel void m13300_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13300_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13300_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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; e &= 0x00000000; COMPARE_S_SIMD (a, e, d, c); } } __kernel void m13300_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13300_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m13300_a1.cl000066400000000000000000000076611320027462700160100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m13300_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx); ctx.h[4] = 0; const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m13300_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx); ctx.h[4] = 0; const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m13300_a3-optimized.cl000066400000000000000000001121211320027462700200000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m13300m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ const u32 c_16s = rotl32_S ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); const u32 c_17s = rotl32_S ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); const u32 c_18s = rotl32_S ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); const u32 c_19s = rotl32_S ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); const u32 c_20s = rotl32_S ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); const u32 c_21s = rotl32_S ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); const u32 c_22s = rotl32_S ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); const u32 c_23s = rotl32_S ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); const u32 c_24s = rotl32_S ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); const u32 c_25s = rotl32_S ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); const u32 c_26s = rotl32_S ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); const u32 c_27s = rotl32_S ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); const u32 c_28s = rotl32_S ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); const u32 c_29s = rotl32_S ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); const u32 c_30s = rotl32_S ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); const u32 c_31s = rotl32_S ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); const u32 c_32s = rotl32_S ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); const u32 c_33s = rotl32_S ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); const u32 c_34s = rotl32_S ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); const u32 c_35s = rotl32_S ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); const u32 c_36s = rotl32_S ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); const u32 c_37s = rotl32_S ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); const u32 c_38s = rotl32_S ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); const u32 c_39s = rotl32_S ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); const u32 c_40s = rotl32_S ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); const u32 c_41s = rotl32_S ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); const u32 c_42s = rotl32_S ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); const u32 c_43s = rotl32_S ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); const u32 c_44s = rotl32_S ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); const u32 c_45s = rotl32_S ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); const u32 c_46s = rotl32_S ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); const u32 c_47s = rotl32_S ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); const u32 c_48s = rotl32_S ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); const u32 c_49s = rotl32_S ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); const u32 c_50s = rotl32_S ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); const u32 c_51s = rotl32_S ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); const u32 c_52s = rotl32_S ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); const u32 c_53s = rotl32_S ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); const u32 c_54s = rotl32_S ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); const u32 c_55s = rotl32_S ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); const u32 c_56s = rotl32_S ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); const u32 c_57s = rotl32_S ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); const u32 c_58s = rotl32_S ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); const u32 c_59s = rotl32_S ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); const u32 c_60s = rotl32_S ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); const u32 c_61s = rotl32_S ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); const u32 c_62s = rotl32_S ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); const u32 c_63s = rotl32_S ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); const u32 c_64s = rotl32_S ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); const u32 c_65s = rotl32_S ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); const u32 c_66s = rotl32_S ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); const u32 c_67s = rotl32_S ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); const u32 c_68s = rotl32_S ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); const u32 c_69s = rotl32_S ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); const u32 c_70s = rotl32_S ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); const u32 c_71s = rotl32_S ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); const u32 c_72s = rotl32_S ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); const u32 c_73s = rotl32_S ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); const u32 c_74s = rotl32_S ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); const u32 c_75s = rotl32_S ((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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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 u32x c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); const u32x c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); const u32x c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); const u32x 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; e &= 0x00000000; COMPARE_M_SIMD (a, e, d, c); } } void m13300s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ const u32 c_16s = rotl32_S ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); const u32 c_17s = rotl32_S ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); const u32 c_18s = rotl32_S ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); const u32 c_19s = rotl32_S ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); const u32 c_20s = rotl32_S ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); const u32 c_21s = rotl32_S ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); const u32 c_22s = rotl32_S ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); const u32 c_23s = rotl32_S ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); const u32 c_24s = rotl32_S ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); const u32 c_25s = rotl32_S ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); const u32 c_26s = rotl32_S ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); const u32 c_27s = rotl32_S ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); const u32 c_28s = rotl32_S ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); const u32 c_29s = rotl32_S ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); const u32 c_30s = rotl32_S ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); const u32 c_31s = rotl32_S ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); const u32 c_32s = rotl32_S ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); const u32 c_33s = rotl32_S ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); const u32 c_34s = rotl32_S ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); const u32 c_35s = rotl32_S ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); const u32 c_36s = rotl32_S ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); const u32 c_37s = rotl32_S ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); const u32 c_38s = rotl32_S ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); const u32 c_39s = rotl32_S ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); const u32 c_40s = rotl32_S ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); const u32 c_41s = rotl32_S ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); const u32 c_42s = rotl32_S ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); const u32 c_43s = rotl32_S ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); const u32 c_44s = rotl32_S ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); const u32 c_45s = rotl32_S ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); const u32 c_46s = rotl32_S ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); const u32 c_47s = rotl32_S ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); const u32 c_48s = rotl32_S ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); const u32 c_49s = rotl32_S ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); const u32 c_50s = rotl32_S ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); const u32 c_51s = rotl32_S ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); const u32 c_52s = rotl32_S ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); const u32 c_53s = rotl32_S ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); const u32 c_54s = rotl32_S ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); const u32 c_55s = rotl32_S ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); const u32 c_56s = rotl32_S ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); const u32 c_57s = rotl32_S ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); const u32 c_58s = rotl32_S ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); const u32 c_59s = rotl32_S ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); const u32 c_60s = rotl32_S ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); const u32 c_61s = rotl32_S ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); const u32 c_62s = rotl32_S ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); const u32 c_63s = rotl32_S ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); const u32 c_64s = rotl32_S ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); const u32 c_65s = rotl32_S ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); const u32 c_66s = rotl32_S ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); const u32 c_67s = rotl32_S ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); const u32 c_68s = rotl32_S ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); const u32 c_69s = rotl32_S ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); const u32 c_70s = rotl32_S ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); const u32 c_71s = rotl32_S ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); const u32 c_72s = rotl32_S ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); const u32 c_73s = rotl32_S ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); const u32 c_74s = rotl32_S ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); const u32 c_75s = rotl32_S ((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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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 u32x c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); const u32x c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); const u32x c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); const u32x 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; e &= 0x00000000; COMPARE_S_SIMD (a, e, d, c); } } __kernel void m13300_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m13300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13300_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m13300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13300_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m13300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13300_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m13300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13300_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m13300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13300_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m13300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m13300_a3.cl000066400000000000000000000104471320027462700160060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m13300_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); sha1_update_vector (&ctx, w, pw_len); sha1_final_vector (&ctx); ctx.h[4] = 0; const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m13300_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); sha1_update_vector (&ctx, w, pw_len); sha1_final_vector (&ctx); ctx.h[4] = 0; const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m13400.cl000066400000000000000000000454231320027462700154260ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_sha256.cl" #include "inc_cipher_aes.cl" #include "inc_cipher_twofish.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" __kernel void m13400_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global keepass_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const keepass_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha256_ctx_t ctx; sha256_init (&ctx); sha256_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); sha256_final (&ctx); u32 digest[8]; digest[0] = ctx.h[0]; digest[1] = ctx.h[1]; digest[2] = ctx.h[2]; digest[3] = ctx.h[3]; digest[4] = ctx.h[4]; digest[5] = ctx.h[5]; digest[6] = ctx.h[6]; digest[7] = ctx.h[7]; if (esalt_bufs[digests_offset].version == 2 && esalt_bufs[digests_offset].keyfile_len == 0) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; 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] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha256_init (&ctx); sha256_update_64 (&ctx, w0, w1, w2, w3, 32); sha256_final (&ctx); digest[0] = ctx.h[0]; digest[1] = ctx.h[1]; digest[2] = ctx.h[2]; digest[3] = ctx.h[3]; digest[4] = ctx.h[4]; digest[5] = ctx.h[5]; digest[6] = ctx.h[6]; digest[7] = ctx.h[7]; } if (esalt_bufs[digests_offset].keyfile_len != 0) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; 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] = esalt_bufs[digests_offset].keyfile[0]; w2[1] = esalt_bufs[digests_offset].keyfile[1]; w2[2] = esalt_bufs[digests_offset].keyfile[2]; w2[3] = esalt_bufs[digests_offset].keyfile[3]; w3[0] = esalt_bufs[digests_offset].keyfile[4]; w3[1] = esalt_bufs[digests_offset].keyfile[5]; w3[2] = esalt_bufs[digests_offset].keyfile[6]; w3[3] = esalt_bufs[digests_offset].keyfile[7]; sha256_init (&ctx); sha256_update_64 (&ctx, w0, w1, w2, w3, 64); sha256_final (&ctx); digest[0] = ctx.h[0]; digest[1] = ctx.h[1]; digest[2] = ctx.h[2]; digest[3] = ctx.h[3]; digest[4] = ctx.h[4]; digest[5] = ctx.h[5]; digest[6] = ctx.h[6]; digest[7] = ctx.h[7]; } tmps[gid].tmp_digest[0] = digest[0]; tmps[gid].tmp_digest[1] = digest[1]; tmps[gid].tmp_digest[2] = digest[2]; tmps[gid].tmp_digest[3] = digest[3]; tmps[gid].tmp_digest[4] = digest[4]; tmps[gid].tmp_digest[5] = digest[5]; tmps[gid].tmp_digest[6] = digest[6]; tmps[gid].tmp_digest[7] = digest[7]; } __kernel void m13400_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global keepass_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const keepass_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; /* Construct AES key */ u32 ukey[8]; ukey[0] = esalt_bufs[digests_offset].transf_random_seed[0]; ukey[1] = esalt_bufs[digests_offset].transf_random_seed[1]; ukey[2] = esalt_bufs[digests_offset].transf_random_seed[2]; ukey[3] = esalt_bufs[digests_offset].transf_random_seed[3]; ukey[4] = esalt_bufs[digests_offset].transf_random_seed[4]; ukey[5] = esalt_bufs[digests_offset].transf_random_seed[5]; ukey[6] = esalt_bufs[digests_offset].transf_random_seed[6]; ukey[7] = esalt_bufs[digests_offset].transf_random_seed[7]; #define KEYLEN 60 u32 ks[KEYLEN]; AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4); u32 data0[4]; u32 data1[4]; data0[0] = tmps[gid].tmp_digest[0]; data0[1] = tmps[gid].tmp_digest[1]; data0[2] = tmps[gid].tmp_digest[2]; data0[3] = tmps[gid].tmp_digest[3]; data1[0] = tmps[gid].tmp_digest[4]; data1[1] = tmps[gid].tmp_digest[5]; data1[2] = tmps[gid].tmp_digest[6]; data1[3] = tmps[gid].tmp_digest[7]; for (u32 i = 0; i < loop_cnt; i++) { AES256_encrypt (ks, data0, data0, s_te0, s_te1, s_te2, s_te3, s_te4); AES256_encrypt (ks, data1, data1, s_te0, s_te1, s_te2, s_te3, s_te4); } tmps[gid].tmp_digest[0] = data0[0]; tmps[gid].tmp_digest[1] = data0[1]; tmps[gid].tmp_digest[2] = data0[2]; tmps[gid].tmp_digest[3] = data0[3]; tmps[gid].tmp_digest[4] = data1[0]; tmps[gid].tmp_digest[5] = data1[1]; tmps[gid].tmp_digest[6] = data1[2]; tmps[gid].tmp_digest[7] = data1[3]; } __kernel void m13400_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global keepass_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const keepass_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; /* hash output... */ u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = tmps[gid].tmp_digest[0]; w0[1] = tmps[gid].tmp_digest[1]; w0[2] = tmps[gid].tmp_digest[2]; w0[3] = tmps[gid].tmp_digest[3]; w1[0] = tmps[gid].tmp_digest[4]; w1[1] = tmps[gid].tmp_digest[5]; w1[2] = tmps[gid].tmp_digest[6]; w1[3] = tmps[gid].tmp_digest[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; sha256_ctx_t ctx; sha256_init (&ctx); sha256_update_64 (&ctx, w0, w1, w2, w3, 32); sha256_final (&ctx); u32 digest[8]; digest[0] = ctx.h[0]; digest[1] = ctx.h[1]; digest[2] = ctx.h[2]; digest[3] = ctx.h[3]; digest[4] = ctx.h[4]; digest[5] = ctx.h[5]; digest[6] = ctx.h[6]; digest[7] = ctx.h[7]; /* ...then hash final_random_seed | output */ if (esalt_bufs[digests_offset].version == 1) { w0[0] = esalt_bufs[digests_offset].final_random_seed[0]; w0[1] = esalt_bufs[digests_offset].final_random_seed[1]; w0[2] = esalt_bufs[digests_offset].final_random_seed[2]; w0[3] = esalt_bufs[digests_offset].final_random_seed[3]; w1[0] = digest[0]; w1[1] = digest[1]; w1[2] = digest[2]; w1[3] = digest[3]; w2[0] = digest[4]; w2[1] = digest[5]; w2[2] = digest[6]; w2[3] = digest[7]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha256_init (&ctx); sha256_update_64 (&ctx, w0, w1, w2, w3, 48); sha256_final (&ctx); digest[0] = ctx.h[0]; digest[1] = ctx.h[1]; digest[2] = ctx.h[2]; digest[3] = ctx.h[3]; digest[4] = ctx.h[4]; digest[5] = ctx.h[5]; digest[6] = ctx.h[6]; digest[7] = ctx.h[7]; } else { w0[0] = esalt_bufs[digests_offset].final_random_seed[0]; w0[1] = esalt_bufs[digests_offset].final_random_seed[1]; w0[2] = esalt_bufs[digests_offset].final_random_seed[2]; w0[3] = esalt_bufs[digests_offset].final_random_seed[3]; w1[0] = esalt_bufs[digests_offset].final_random_seed[4]; w1[1] = esalt_bufs[digests_offset].final_random_seed[5]; w1[2] = esalt_bufs[digests_offset].final_random_seed[6]; w1[3] = esalt_bufs[digests_offset].final_random_seed[7]; w2[0] = digest[0]; w2[1] = digest[1]; w2[2] = digest[2]; w2[3] = digest[3]; w3[0] = digest[4]; w3[1] = digest[5]; w3[2] = digest[6]; w3[3] = digest[7]; sha256_init (&ctx); sha256_update_64 (&ctx, w0, w1, w2, w3, 64); sha256_final (&ctx); digest[0] = ctx.h[0]; digest[1] = ctx.h[1]; digest[2] = ctx.h[2]; digest[3] = ctx.h[3]; digest[4] = ctx.h[4]; digest[5] = ctx.h[5]; digest[6] = ctx.h[6]; digest[7] = ctx.h[7]; } // at this point we have to distinguish between the different keypass versions u32 iv[4]; iv[0] = esalt_bufs[digests_offset].enc_iv[0]; iv[1] = esalt_bufs[digests_offset].enc_iv[1]; iv[2] = esalt_bufs[digests_offset].enc_iv[2]; iv[3] = esalt_bufs[digests_offset].enc_iv[3]; u32 r0 = 0; u32 r1 = 0; u32 r2 = 0; u32 r3 = 0; if (esalt_bufs[digests_offset].version == 1) { sha256_ctx_t ctx; sha256_init (&ctx); if (esalt_bufs[digests_offset].algorithm == 1) { /* Construct final Twofish key */ u32 sk[4]; u32 lk[40]; digest[0] = swap32_S (digest[0]); digest[1] = swap32_S (digest[1]); digest[2] = swap32_S (digest[2]); digest[3] = swap32_S (digest[3]); digest[4] = swap32_S (digest[4]); digest[5] = swap32_S (digest[5]); digest[6] = swap32_S (digest[6]); digest[7] = swap32_S (digest[7]); twofish256_set_key (sk, lk, digest); iv[0] = swap32_S (iv[0]); iv[1] = swap32_S (iv[1]); iv[2] = swap32_S (iv[2]); iv[3] = swap32_S (iv[3]); u32 contents_len = esalt_bufs[digests_offset].contents_len; u32 contents_pos; u32 contents_off; // process (decrypt and hash) the buffer with the biggest steps possible. for (contents_pos = 0, contents_off = 0; contents_pos < contents_len - 16; contents_pos += 16, contents_off += 4) { u32 data[4]; data[0] = esalt_bufs[digests_offset].contents[contents_off + 0]; data[1] = esalt_bufs[digests_offset].contents[contents_off + 1]; data[2] = esalt_bufs[digests_offset].contents[contents_off + 2]; data[3] = esalt_bufs[digests_offset].contents[contents_off + 3]; data[0] = swap32_S (data[0]); data[1] = swap32_S (data[1]); data[2] = swap32_S (data[2]); data[3] = swap32_S (data[3]); u32 out[4]; twofish256_decrypt (sk, lk, data, out); out[0] ^= iv[0]; out[1] ^= iv[1]; out[2] ^= iv[2]; out[3] ^= iv[3]; out[0] = swap32_S (out[0]); out[1] = swap32_S (out[1]); out[2] = swap32_S (out[2]); out[3] = swap32_S (out[3]); u32 w0[4] = { 0 }; u32 w1[4] = { 0 }; u32 w2[4] = { 0 }; u32 w3[4] = { 0 }; w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[3]; sha256_update_64 (&ctx, w0, w1, w2, w3, 16); iv[0] = data[0]; iv[1] = data[1]; iv[2] = data[2]; iv[3] = data[3]; } // we've reached the final block for decrypt, it will contain the padding bytes we're looking for u32 data[4]; data[0] = esalt_bufs[digests_offset].contents[contents_off + 0]; data[1] = esalt_bufs[digests_offset].contents[contents_off + 1]; data[2] = esalt_bufs[digests_offset].contents[contents_off + 2]; data[3] = esalt_bufs[digests_offset].contents[contents_off + 3]; data[0] = swap32_S (data[0]); data[1] = swap32_S (data[1]); data[2] = swap32_S (data[2]); data[3] = swap32_S (data[3]); u32 out[4]; twofish256_decrypt (sk, lk, data, out); out[0] ^= iv[0]; out[1] ^= iv[1]; out[2] ^= iv[2]; out[3] ^= iv[3]; out[0] = swap32_S (out[0]); out[1] = swap32_S (out[1]); out[2] = swap32_S (out[2]); out[3] = swap32_S (out[3]); // now we can access the pad byte const u32 pad_byte = out[3] & 0xff; // we need to clear the buffer of the padding data truncate_block_4x4_be_S (out, 16 - pad_byte); u32 w0[4] = { 0 }; u32 w1[4] = { 0 }; u32 w2[4] = { 0 }; u32 w3[4] = { 0 }; w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[3]; sha256_update_64 (&ctx, w0, w1, w2, w3, 16 - pad_byte); } else { /* Construct final AES key */ #define KEYLEN 60 u32 ks[KEYLEN]; AES256_set_decrypt_key (ks, digest, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); u32 contents_len = esalt_bufs[digests_offset].contents_len; u32 contents_pos; u32 contents_off; for (contents_pos = 0, contents_off = 0; contents_pos < contents_len - 16; contents_pos += 16, contents_off += 4) { u32 data[4]; data[0] = esalt_bufs[digests_offset].contents[contents_off + 0]; data[1] = esalt_bufs[digests_offset].contents[contents_off + 1]; data[2] = esalt_bufs[digests_offset].contents[contents_off + 2]; data[3] = esalt_bufs[digests_offset].contents[contents_off + 3]; u32 out[4]; AES256_decrypt (ks, data, out, 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]; u32 w0[4] = { 0 }; u32 w1[4] = { 0 }; u32 w2[4] = { 0 }; u32 w3[4] = { 0 }; w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[3]; sha256_update_64 (&ctx, w0, w1, w2, w3, 16); iv[0] = data[0]; iv[1] = data[1]; iv[2] = data[2]; iv[3] = data[3]; } // we've reached the final block for decrypt, it will contain the padding bytes we're looking for u32 data[4]; data[0] = esalt_bufs[digests_offset].contents[contents_off + 0]; data[1] = esalt_bufs[digests_offset].contents[contents_off + 1]; data[2] = esalt_bufs[digests_offset].contents[contents_off + 2]; data[3] = esalt_bufs[digests_offset].contents[contents_off + 3]; u32 out[4]; AES256_decrypt (ks, data, out, 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]; // now we can access the pad byte const u32 pad_byte = out[3] & 0xff; // we need to clear the buffer of the padding data truncate_block_4x4_be_S (out, 16 - pad_byte); u32 w0[4] = { 0 }; u32 w1[4] = { 0 }; u32 w2[4] = { 0 }; u32 w3[4] = { 0 }; w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[3]; sha256_update_64 (&ctx, w0, w1, w2, w3, 16 - pad_byte); } sha256_final (&ctx); r0 = ctx.h[0]; r1 = ctx.h[1]; r2 = ctx.h[2]; r3 = ctx.h[3]; } else { /* Construct final AES key */ #define KEYLEN 60 u32 ks[KEYLEN]; AES256_set_decrypt_key (ks, digest, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); u32 data[4]; data[0] = esalt_bufs[digests_offset].contents_hash[0]; data[1] = esalt_bufs[digests_offset].contents_hash[1]; data[2] = esalt_bufs[digests_offset].contents_hash[2]; data[3] = esalt_bufs[digests_offset].contents_hash[3]; u32 out[4]; AES256_decrypt (ks, data, out, 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]; r0 = out[0]; r1 = out[1]; r2 = out[2]; r3 = out[3]; } #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m13500_a0-optimized.cl000066400000000000000000001331071320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m13500_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 pc_offset = esalt_bufs[digests_offset].pc_offset; const u32 pc_offset4 = pc_offset * 4; u32 pc_digest[5]; pc_digest[0] = esalt_bufs[digests_offset].pc_digest[0]; pc_digest[1] = esalt_bufs[digests_offset].pc_digest[1]; pc_digest[2] = esalt_bufs[digests_offset].pc_digest[2]; pc_digest[3] = esalt_bufs[digests_offset].pc_digest[3]; pc_digest[4] = esalt_bufs[digests_offset].pc_digest[4]; u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 0]); salt_buf0[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 1]); salt_buf0[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 2]); salt_buf0[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 3]); salt_buf1[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 4]); salt_buf1[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 5]); salt_buf1[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 6]); salt_buf1[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 7]); salt_buf2[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 8]); salt_buf2[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 9]); salt_buf2[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 10]); salt_buf2[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 11]); salt_buf3[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 12]); salt_buf3[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 13]); salt_buf3[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 14]); salt_buf3[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 15]); const u32 salt_len = esalt_bufs[digests_offset].salt_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; const u32x out_salt_len = out_len2 + salt_len; /** * prepend salt -- can't stay outside the loop this time */ w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_be (w0, w1, w2, w3, c0, c1, c2, c3, salt_len - pc_offset4); 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]; u32x a = pc_digest[0]; u32x b = pc_digest[1]; u32x c = pc_digest[2]; u32x d = pc_digest[3]; u32x e = pc_digest[4]; const u32 r = (salt_len - pc_offset4) + out_len2; if (r >= 56) { 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); a += pc_digest[0]; b += pc_digest[1]; c += pc_digest[2]; d += pc_digest[3]; e += pc_digest[4]; w0[0] = c0[0]; w0[1] = c0[1]; w0[2] = c0[2]; w0[3] = c0[3]; w1[0] = c1[0]; w1[1] = c1[1]; w1[2] = c1[2]; w1[3] = c1[3]; w2[0] = c2[0]; w2[1] = c2[1]; w2[2] = c2[2]; w2[3] = c2[3]; w3[0] = c3[0]; w3[1] = c3[1]; w3[2] = c3[2]; w3[3] = c3[3]; } /** * final 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 = out_salt_len * 8; u32x r_a = a; u32x r_b = b; u32x r_c = c; u32x r_d = d; u32x r_e = 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 += r_a; b += r_b; c += r_c; d += r_d; e += r_e; COMPARE_M_SIMD (d, e, c, b); } } __kernel void m13500_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13500_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13500_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 pc_offset = esalt_bufs[digests_offset].pc_offset; const u32 pc_offset4 = pc_offset * 4; u32 pc_digest[5]; pc_digest[0] = esalt_bufs[digests_offset].pc_digest[0]; pc_digest[1] = esalt_bufs[digests_offset].pc_digest[1]; pc_digest[2] = esalt_bufs[digests_offset].pc_digest[2]; pc_digest[3] = esalt_bufs[digests_offset].pc_digest[3]; pc_digest[4] = esalt_bufs[digests_offset].pc_digest[4]; u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 0]); salt_buf0[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 1]); salt_buf0[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 2]); salt_buf0[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 3]); salt_buf1[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 4]); salt_buf1[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 5]); salt_buf1[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 6]); salt_buf1[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 7]); salt_buf2[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 8]); salt_buf2[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 9]); salt_buf2[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 10]); salt_buf2[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 11]); salt_buf3[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 12]); salt_buf3[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 13]); salt_buf3[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 14]); salt_buf3[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 15]); const u32 salt_len = esalt_bufs[digests_offset].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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x out_len2 = out_len * 2; const u32x out_salt_len = out_len2 + salt_len; /** * prepend salt -- can't stay outside the loop this time */ w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_be (w0, w1, w2, w3, c0, c1, c2, c3, salt_len - pc_offset4); 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]; u32x a = pc_digest[0]; u32x b = pc_digest[1]; u32x c = pc_digest[2]; u32x d = pc_digest[3]; u32x e = pc_digest[4]; const u32 r = (salt_len - pc_offset4) + out_len2; if (r >= 56) { 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); a += pc_digest[0]; b += pc_digest[1]; c += pc_digest[2]; d += pc_digest[3]; e += pc_digest[4]; w0[0] = c0[0]; w0[1] = c0[1]; w0[2] = c0[2]; w0[3] = c0[3]; w1[0] = c1[0]; w1[1] = c1[1]; w1[2] = c1[2]; w1[3] = c1[3]; w2[0] = c2[0]; w2[1] = c2[1]; w2[2] = c2[2]; w2[3] = c2[3]; w3[0] = c3[0]; w3[1] = c3[1]; w3[2] = c3[2]; w3[3] = c3[3]; } /** * final 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 = out_salt_len * 8; u32x r_a = a; u32x r_b = b; u32x r_c = c; u32x r_d = d; u32x r_e = 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 += r_a; b += r_b; c += r_c; d += r_d; e += r_e; COMPARE_S_SIMD (d, e, c, b); } } __kernel void m13500_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13500_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m13500_a0.cl000066400000000000000000000163621320027462700160070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m13500_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * salt */ const u32 pc_offset = esalt_bufs[digests_offset].pc_offset; sha1_ctx_t ctx0; ctx0.h[0] = esalt_bufs[digests_offset].pc_digest[0]; ctx0.h[1] = esalt_bufs[digests_offset].pc_digest[1]; ctx0.h[2] = esalt_bufs[digests_offset].pc_digest[2]; ctx0.h[3] = esalt_bufs[digests_offset].pc_digest[3]; ctx0.h[4] = esalt_bufs[digests_offset].pc_digest[4]; ctx0.w0[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 0]); ctx0.w0[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 1]); ctx0.w0[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 2]); ctx0.w0[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 3]); ctx0.w1[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 4]); ctx0.w1[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 5]); ctx0.w1[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 6]); ctx0.w1[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 7]); ctx0.w2[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 8]); ctx0.w2[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 9]); ctx0.w2[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 10]); ctx0.w2[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 11]); ctx0.w3[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 12]); ctx0.w3[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 13]); ctx0.w3[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 14]); ctx0.w3[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 15]); ctx0.len = esalt_bufs[digests_offset].salt_len; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx = ctx0; sha1_update_utf16le_swap (&ctx, tmp.i, tmp.pw_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m13500_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * salt */ const u32 pc_offset = esalt_bufs[digests_offset].pc_offset; sha1_ctx_t ctx0; ctx0.h[0] = esalt_bufs[digests_offset].pc_digest[0]; ctx0.h[1] = esalt_bufs[digests_offset].pc_digest[1]; ctx0.h[2] = esalt_bufs[digests_offset].pc_digest[2]; ctx0.h[3] = esalt_bufs[digests_offset].pc_digest[3]; ctx0.h[4] = esalt_bufs[digests_offset].pc_digest[4]; ctx0.w0[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 0]); ctx0.w0[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 1]); ctx0.w0[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 2]); ctx0.w0[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 3]); ctx0.w1[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 4]); ctx0.w1[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 5]); ctx0.w1[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 6]); ctx0.w1[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 7]); ctx0.w2[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 8]); ctx0.w2[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 9]); ctx0.w2[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 10]); ctx0.w2[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 11]); ctx0.w3[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 12]); ctx0.w3[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 13]); ctx0.w3[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 14]); ctx0.w3[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 15]); ctx0.len = esalt_bufs[digests_offset].salt_len; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx = ctx0; sha1_update_utf16le_swap (&ctx, tmp.i, tmp.pw_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m13500_a1-optimized.cl000066400000000000000000001405301320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m13500_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ const u32 pc_offset = esalt_bufs[digests_offset].pc_offset; const u32 pc_offset4 = pc_offset * 4; u32 pc_digest[5]; pc_digest[0] = esalt_bufs[digests_offset].pc_digest[0]; pc_digest[1] = esalt_bufs[digests_offset].pc_digest[1]; pc_digest[2] = esalt_bufs[digests_offset].pc_digest[2]; pc_digest[3] = esalt_bufs[digests_offset].pc_digest[3]; pc_digest[4] = esalt_bufs[digests_offset].pc_digest[4]; u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 0]); salt_buf0[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 1]); salt_buf0[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 2]); salt_buf0[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 3]); salt_buf1[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 4]); salt_buf1[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 5]); salt_buf1[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 6]); salt_buf1[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 7]); salt_buf2[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 8]); salt_buf2[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 9]); salt_buf2[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 10]); salt_buf2[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 11]); salt_buf3[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 12]); salt_buf3[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 13]); salt_buf3[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 14]); salt_buf3[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 15]); const u32 salt_len = esalt_bufs[digests_offset].salt_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; append_0x80_2x4_VV (w0, w1, pw_len); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; const u32x pw_salt_len = pw_len2 + salt_len; /** * prepend salt -- can't stay outside the loop this time */ w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_be (w0, w1, w2, w3, c0, c1, c2, c3, salt_len - pc_offset4); 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]; u32x a = pc_digest[0]; u32x b = pc_digest[1]; u32x c = pc_digest[2]; u32x d = pc_digest[3]; u32x e = pc_digest[4]; const u32 r = (salt_len - pc_offset4) + pw_len2; if (r >= 56) { 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); a += pc_digest[0]; b += pc_digest[1]; c += pc_digest[2]; d += pc_digest[3]; e += pc_digest[4]; w0[0] = c0[0]; w0[1] = c0[1]; w0[2] = c0[2]; w0[3] = c0[3]; w1[0] = c1[0]; w1[1] = c1[1]; w1[2] = c1[2]; w1[3] = c1[3]; w2[0] = c2[0]; w2[1] = c2[1]; w2[2] = c2[2]; w2[3] = c2[3]; w3[0] = c3[0]; w3[1] = c3[1]; w3[2] = c3[2]; w3[3] = c3[3]; } /** * final 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_salt_len * 8; u32x r_a = a; u32x r_b = b; u32x r_c = c; u32x r_d = d; u32x r_e = 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 += r_a; b += r_b; c += r_c; d += r_d; e += r_e; COMPARE_M_SIMD (d, e, c, b); } } __kernel void m13500_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13500_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13500_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ const u32 pc_offset = esalt_bufs[digests_offset].pc_offset; const u32 pc_offset4 = pc_offset * 4; u32 pc_digest[5]; pc_digest[0] = esalt_bufs[digests_offset].pc_digest[0]; pc_digest[1] = esalt_bufs[digests_offset].pc_digest[1]; pc_digest[2] = esalt_bufs[digests_offset].pc_digest[2]; pc_digest[3] = esalt_bufs[digests_offset].pc_digest[3]; pc_digest[4] = esalt_bufs[digests_offset].pc_digest[4]; u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 0]); salt_buf0[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 1]); salt_buf0[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 2]); salt_buf0[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 3]); salt_buf1[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 4]); salt_buf1[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 5]); salt_buf1[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 6]); salt_buf1[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 7]); salt_buf2[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 8]); salt_buf2[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 9]); salt_buf2[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 10]); salt_buf2[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 11]); salt_buf3[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 12]); salt_buf3[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 13]); salt_buf3[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 14]); salt_buf3[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 15]); const u32 salt_len = esalt_bufs[digests_offset].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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; append_0x80_2x4_VV (w0, w1, pw_len); make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); const u32x pw_len2 = pw_len * 2; const u32x pw_salt_len = pw_len2 + salt_len; /** * prepend salt -- can't stay outside the loop this time */ w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = swap32 (w3[2]); w3[3] = swap32 (w3[3]); u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_be (w0, w1, w2, w3, c0, c1, c2, c3, salt_len - pc_offset4); 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]; u32x a = pc_digest[0]; u32x b = pc_digest[1]; u32x c = pc_digest[2]; u32x d = pc_digest[3]; u32x e = pc_digest[4]; const u32 r = (salt_len - pc_offset4) + pw_len2; if (r >= 56) { 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); a += pc_digest[0]; b += pc_digest[1]; c += pc_digest[2]; d += pc_digest[3]; e += pc_digest[4]; w0[0] = c0[0]; w0[1] = c0[1]; w0[2] = c0[2]; w0[3] = c0[3]; w1[0] = c1[0]; w1[1] = c1[1]; w1[2] = c1[2]; w1[3] = c1[3]; w2[0] = c2[0]; w2[1] = c2[1]; w2[2] = c2[2]; w2[3] = c2[3]; w3[0] = c3[0]; w3[1] = c3[1]; w3[2] = c3[2]; w3[3] = c3[3]; } /** * final 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_salt_len * 8; u32x r_a = a; u32x r_b = b; u32x r_c = c; u32x r_d = d; u32x r_e = 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 += r_a; b += r_b; c += r_c; d += r_d; e += r_e; COMPARE_S_SIMD (d, e, c, b); } } __kernel void m13500_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13500_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m13500_a1.cl000066400000000000000000000162451320027462700160100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m13500_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * salt */ const u32 pc_offset = esalt_bufs[digests_offset].pc_offset; sha1_ctx_t ctx0; ctx0.h[0] = esalt_bufs[digests_offset].pc_digest[0]; ctx0.h[1] = esalt_bufs[digests_offset].pc_digest[1]; ctx0.h[2] = esalt_bufs[digests_offset].pc_digest[2]; ctx0.h[3] = esalt_bufs[digests_offset].pc_digest[3]; ctx0.h[4] = esalt_bufs[digests_offset].pc_digest[4]; ctx0.w0[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 0]); ctx0.w0[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 1]); ctx0.w0[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 2]); ctx0.w0[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 3]); ctx0.w1[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 4]); ctx0.w1[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 5]); ctx0.w1[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 6]); ctx0.w1[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 7]); ctx0.w2[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 8]); ctx0.w2[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 9]); ctx0.w2[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 10]); ctx0.w2[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 11]); ctx0.w3[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 12]); ctx0.w3[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 13]); ctx0.w3[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 14]); ctx0.w3[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 15]); ctx0.len = esalt_bufs[digests_offset].salt_len; /** * base */ sha1_update_global_utf16le_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_utf16le_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m13500_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * salt */ const u32 pc_offset = esalt_bufs[digests_offset].pc_offset; sha1_ctx_t ctx0; ctx0.h[0] = esalt_bufs[digests_offset].pc_digest[0]; ctx0.h[1] = esalt_bufs[digests_offset].pc_digest[1]; ctx0.h[2] = esalt_bufs[digests_offset].pc_digest[2]; ctx0.h[3] = esalt_bufs[digests_offset].pc_digest[3]; ctx0.h[4] = esalt_bufs[digests_offset].pc_digest[4]; ctx0.w0[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 0]); ctx0.w0[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 1]); ctx0.w0[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 2]); ctx0.w0[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 3]); ctx0.w1[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 4]); ctx0.w1[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 5]); ctx0.w1[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 6]); ctx0.w1[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 7]); ctx0.w2[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 8]); ctx0.w2[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 9]); ctx0.w2[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 10]); ctx0.w2[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 11]); ctx0.w3[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 12]); ctx0.w3[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 13]); ctx0.w3[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 14]); ctx0.w3[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 15]); ctx0.len = esalt_bufs[digests_offset].salt_len; /** * base */ sha1_update_global_utf16le_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_utf16le_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m13500_a3-optimized.cl000066400000000000000000001512441320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m13500m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 pc_offset = esalt_bufs[digests_offset].pc_offset; const u32 pc_offset4 = pc_offset * 4; u32 pc_digest[5]; pc_digest[0] = esalt_bufs[digests_offset].pc_digest[0]; pc_digest[1] = esalt_bufs[digests_offset].pc_digest[1]; pc_digest[2] = esalt_bufs[digests_offset].pc_digest[2]; pc_digest[3] = esalt_bufs[digests_offset].pc_digest[3]; pc_digest[4] = esalt_bufs[digests_offset].pc_digest[4]; u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 0]); salt_buf0[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 1]); salt_buf0[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 2]); salt_buf0[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 3]); salt_buf1[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 4]); salt_buf1[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 5]); salt_buf1[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 6]); salt_buf1[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 7]); salt_buf2[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 8]); salt_buf2[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 9]); salt_buf2[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 10]); salt_buf2[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 11]); salt_buf3[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 12]); salt_buf3[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 13]); salt_buf3[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 14]); salt_buf3[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 15]); const u32 salt_len = esalt_bufs[digests_offset].salt_len; const u32 pw_salt_len = pw_len + salt_len; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * prepend salt -- can't stay outside the loop this time */ u32x w0_t2[4]; u32x w1_t2[4]; u32x w2_t2[4]; u32x w3_t2[4]; w0_t2[0] = w0lr; w0_t2[1] = w0[1]; w0_t2[2] = w0[2]; w0_t2[3] = w0[3]; w1_t2[0] = w1[0]; w1_t2[1] = w1[1]; w1_t2[2] = w1[2]; w1_t2[3] = w1[3]; w2_t2[0] = w2[0]; w2_t2[1] = w2[1]; w2_t2[2] = w2[2]; w2_t2[3] = w2[3]; w3_t2[0] = w3[0]; w3_t2[1] = w3[1]; w3_t2[2] = w3[2]; w3_t2[3] = w3[3]; u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_be (w0_t2, w1_t2, w2_t2, w3_t2, c0, c1, c2, c3, salt_len - pc_offset4); 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]; u32x a = pc_digest[0]; u32x b = pc_digest[1]; u32x c = pc_digest[2]; u32x d = pc_digest[3]; u32x e = pc_digest[4]; const u32 r = (salt_len - pc_offset4) + pw_len; if (r >= 56) { u32x w0_t = w0_t2[0]; u32x w1_t = w0_t2[1]; u32x w2_t = w0_t2[2]; u32x w3_t = w0_t2[3]; u32x w4_t = w1_t2[0]; u32x w5_t = w1_t2[1]; u32x w6_t = w1_t2[2]; u32x w7_t = w1_t2[3]; u32x w8_t = w2_t2[0]; u32x w9_t = w2_t2[1]; u32x wa_t = w2_t2[2]; u32x wb_t = w2_t2[3]; u32x wc_t = w3_t2[0]; u32x wd_t = w3_t2[1]; u32x we_t = w3_t2[2]; u32x wf_t = w3_t2[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); a += pc_digest[0]; b += pc_digest[1]; c += pc_digest[2]; d += pc_digest[3]; e += pc_digest[4]; w0_t2[0] = c0[0]; w0_t2[1] = c0[1]; w0_t2[2] = c0[2]; w0_t2[3] = c0[3]; w1_t2[0] = c1[0]; w1_t2[1] = c1[1]; w1_t2[2] = c1[2]; w1_t2[3] = c1[3]; w2_t2[0] = c2[0]; w2_t2[1] = c2[1]; w2_t2[2] = c2[2]; w2_t2[3] = c2[3]; w3_t2[0] = c3[0]; w3_t2[1] = c3[1]; w3_t2[2] = c3[2]; w3_t2[3] = c3[3]; } /** * final sha1 */ u32x w0_t = w0_t2[0]; u32x w1_t = w0_t2[1]; u32x w2_t = w0_t2[2]; u32x w3_t = w0_t2[3]; u32x w4_t = w1_t2[0]; u32x w5_t = w1_t2[1]; u32x w6_t = w1_t2[2]; u32x w7_t = w1_t2[3]; u32x w8_t = w2_t2[0]; u32x w9_t = w2_t2[1]; u32x wa_t = w2_t2[2]; u32x wb_t = w2_t2[3]; u32x wc_t = w3_t2[0]; u32x wd_t = w3_t2[1]; u32x we_t = 0; u32x wf_t = pw_salt_len * 8; u32x r_a = a; u32x r_b = b; u32x r_c = c; u32x r_d = d; u32x r_e = 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 += r_a; b += r_b; c += r_c; d += r_d; e += r_e; COMPARE_M_SIMD (d, e, c, b); } } void m13500s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 pc_offset = esalt_bufs[digests_offset].pc_offset; const u32 pc_offset4 = pc_offset * 4; u32 pc_digest[5]; pc_digest[0] = esalt_bufs[digests_offset].pc_digest[0]; pc_digest[1] = esalt_bufs[digests_offset].pc_digest[1]; pc_digest[2] = esalt_bufs[digests_offset].pc_digest[2]; pc_digest[3] = esalt_bufs[digests_offset].pc_digest[3]; pc_digest[4] = esalt_bufs[digests_offset].pc_digest[4]; u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 0]); salt_buf0[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 1]); salt_buf0[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 2]); salt_buf0[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 3]); salt_buf1[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 4]); salt_buf1[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 5]); salt_buf1[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 6]); salt_buf1[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 7]); salt_buf2[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 8]); salt_buf2[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 9]); salt_buf2[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 10]); salt_buf2[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 11]); salt_buf3[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 12]); salt_buf3[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 13]); salt_buf3[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 14]); salt_buf3[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 15]); const u32 salt_len = esalt_bufs[digests_offset].salt_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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; /** * prepend salt -- can't stay outside the loop this time */ u32x w0_t2[4]; u32x w1_t2[4]; u32x w2_t2[4]; u32x w3_t2[4]; w0_t2[0] = w0lr; w0_t2[1] = w0[1]; w0_t2[2] = w0[2]; w0_t2[3] = w0[3]; w1_t2[0] = w1[0]; w1_t2[1] = w1[1]; w1_t2[2] = w1[2]; w1_t2[3] = w1[3]; w2_t2[0] = w2[0]; w2_t2[1] = w2[1]; w2_t2[2] = w2[2]; w2_t2[3] = w2[3]; w3_t2[0] = w3[0]; w3_t2[1] = w3[1]; w3_t2[2] = w3[2]; w3_t2[3] = w3[3]; u32x c0[4] = { 0 }; u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; switch_buffer_by_offset_carry_be (w0_t2, w1_t2, w2_t2, w3_t2, c0, c1, c2, c3, salt_len - pc_offset4); 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]; u32x a = pc_digest[0]; u32x b = pc_digest[1]; u32x c = pc_digest[2]; u32x d = pc_digest[3]; u32x e = pc_digest[4]; const u32 r = (salt_len - pc_offset4) + pw_len; if (r >= 56) { u32x w0_t = w0_t2[0]; u32x w1_t = w0_t2[1]; u32x w2_t = w0_t2[2]; u32x w3_t = w0_t2[3]; u32x w4_t = w1_t2[0]; u32x w5_t = w1_t2[1]; u32x w6_t = w1_t2[2]; u32x w7_t = w1_t2[3]; u32x w8_t = w2_t2[0]; u32x w9_t = w2_t2[1]; u32x wa_t = w2_t2[2]; u32x wb_t = w2_t2[3]; u32x wc_t = w3_t2[0]; u32x wd_t = w3_t2[1]; u32x we_t = w3_t2[2]; u32x wf_t = w3_t2[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); a += pc_digest[0]; b += pc_digest[1]; c += pc_digest[2]; d += pc_digest[3]; e += pc_digest[4]; w0_t2[0] = c0[0]; w0_t2[1] = c0[1]; w0_t2[2] = c0[2]; w0_t2[3] = c0[3]; w1_t2[0] = c1[0]; w1_t2[1] = c1[1]; w1_t2[2] = c1[2]; w1_t2[3] = c1[3]; w2_t2[0] = c2[0]; w2_t2[1] = c2[1]; w2_t2[2] = c2[2]; w2_t2[3] = c2[3]; w3_t2[0] = c3[0]; w3_t2[1] = c3[1]; w3_t2[2] = c3[2]; w3_t2[3] = c3[3]; } /** * final sha1 */ u32x w0_t = w0_t2[0]; u32x w1_t = w0_t2[1]; u32x w2_t = w0_t2[2]; u32x w3_t = w0_t2[3]; u32x w4_t = w1_t2[0]; u32x w5_t = w1_t2[1]; u32x w6_t = w1_t2[2]; u32x w7_t = w1_t2[3]; u32x w8_t = w2_t2[0]; u32x w9_t = w2_t2[1]; u32x wa_t = w2_t2[2]; u32x wb_t = w2_t2[3]; u32x wc_t = w3_t2[0]; u32x wd_t = w3_t2[1]; u32x we_t = 0; u32x wf_t = pw_salt_len * 8; u32x r_a = a; u32x r_b = b; u32x r_c = c; u32x r_d = d; u32x r_e = 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 += r_a; b += r_b; c += r_c; d += r_d; e += r_e; COMPARE_S_SIMD (d, e, c, b); } } __kernel void m13500_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ m13500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13500_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ m13500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13500_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ m13500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13500_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ m13500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13500_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ m13500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13500_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ m13500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m13500_a3.cl000066400000000000000000000172071320027462700160110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m13500_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * salt */ const u32 pc_offset = esalt_bufs[digests_offset].pc_offset; sha1_ctx_t ctx0; ctx0.h[0] = esalt_bufs[digests_offset].pc_digest[0]; ctx0.h[1] = esalt_bufs[digests_offset].pc_digest[1]; ctx0.h[2] = esalt_bufs[digests_offset].pc_digest[2]; ctx0.h[3] = esalt_bufs[digests_offset].pc_digest[3]; ctx0.h[4] = esalt_bufs[digests_offset].pc_digest[4]; ctx0.w0[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 0]); ctx0.w0[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 1]); ctx0.w0[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 2]); ctx0.w0[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 3]); ctx0.w1[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 4]); ctx0.w1[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 5]); ctx0.w1[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 6]); ctx0.w1[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 7]); ctx0.w2[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 8]); ctx0.w2[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 9]); ctx0.w2[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 10]); ctx0.w2[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 11]); ctx0.w3[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 12]); ctx0.w3[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 13]); ctx0.w3[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 14]); ctx0.w3[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 15]); ctx0.len = esalt_bufs[digests_offset].salt_len; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); sha1_update_vector_utf16beN (&ctx, w, pw_len); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m13500_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const pstoken_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * salt */ const u32 pc_offset = esalt_bufs[digests_offset].pc_offset; sha1_ctx_t ctx0; ctx0.h[0] = esalt_bufs[digests_offset].pc_digest[0]; ctx0.h[1] = esalt_bufs[digests_offset].pc_digest[1]; ctx0.h[2] = esalt_bufs[digests_offset].pc_digest[2]; ctx0.h[3] = esalt_bufs[digests_offset].pc_digest[3]; ctx0.h[4] = esalt_bufs[digests_offset].pc_digest[4]; ctx0.w0[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 0]); ctx0.w0[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 1]); ctx0.w0[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 2]); ctx0.w0[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 3]); ctx0.w1[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 4]); ctx0.w1[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 5]); ctx0.w1[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 6]); ctx0.w1[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 7]); ctx0.w2[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 8]); ctx0.w2[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 9]); ctx0.w2[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 10]); ctx0.w2[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 11]); ctx0.w3[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 12]); ctx0.w3[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 13]); ctx0.w3[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 14]); ctx0.w3[3] = swap32_S (esalt_bufs[digests_offset].salt_buf[pc_offset + 15]); ctx0.len = esalt_bufs[digests_offset].salt_len; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); sha1_update_vector_utf16beN (&ctx, w, pw_len); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m13600.cl000066400000000000000000000254441320027462700154310ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha1_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m13600_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha1_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const zip2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha1_hmac_ctx_t sha1_hmac_ctx; sha1_hmac_init_global_swap (&sha1_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha1_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha1_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha1_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha1_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha1_hmac_ctx.ipad.h[4]; tmps[gid].opad[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha1_hmac_ctx.opad.h[4]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = swap32_S (esalt_bufs[digests_offset].salt_buf[0]); w0[1] = swap32_S (esalt_bufs[digests_offset].salt_buf[1]); w0[2] = swap32_S (esalt_bufs[digests_offset].salt_buf[2]); w0[3] = swap32_S (esalt_bufs[digests_offset].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; sha1_hmac_update_64 (&sha1_hmac_ctx, w0, w1, w2, w3, esalt_bufs[digests_offset].salt_len); const u32 mode = esalt_bufs[digests_offset].mode; u32 iter_start; u32 iter_stop; u32 count_start; switch (mode) { case 1: iter_start = 0; iter_stop = 2; count_start = 1; break; case 2: iter_start = 1; iter_stop = 3; count_start = 2; break; case 3: iter_start = 1; iter_stop = 4; count_start = 2; break; } for (u32 i = iter_start, j = count_start; i < iter_stop; i++, j++) { sha1_hmac_ctx_t sha1_hmac_ctx2 = sha1_hmac_ctx; w0[0] = j; 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] = 0; sha1_hmac_update_64 (&sha1_hmac_ctx2, w0, w1, w2, w3, 4); sha1_hmac_final (&sha1_hmac_ctx2); const u32 i5 = i * 5; tmps[gid].dgst[i5 + 0] = sha1_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i5 + 1] = sha1_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i5 + 2] = sha1_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i5 + 3] = sha1_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i5 + 4] = sha1_hmac_ctx2.opad.h[4]; tmps[gid].out[i5 + 0] = tmps[gid].dgst[i5 + 0]; tmps[gid].out[i5 + 1] = tmps[gid].dgst[i5 + 1]; tmps[gid].out[i5 + 2] = tmps[gid].dgst[i5 + 2]; tmps[gid].out[i5 + 3] = tmps[gid].dgst[i5 + 3]; tmps[gid].out[i5 + 4] = tmps[gid].dgst[i5 + 4]; } } __kernel void m13600_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha1_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const zip2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); const u32 mode = esalt_bufs[digests_offset].mode; u32 iter_start; u32 iter_stop; u32 count_start; switch (mode) { case 1: iter_start = 0; iter_stop = 2; count_start = 1; break; case 2: iter_start = 1; iter_stop = 3; count_start = 2; break; case 3: iter_start = 1; iter_stop = 4; count_start = 2; break; } for (u32 i = iter_start, j = count_start; i < iter_stop; i++, j++) { const u32 i5 = i * 5; u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst, gid, i5 + 0); dgst[1] = packv (tmps, dgst, gid, i5 + 1); dgst[2] = packv (tmps, dgst, gid, i5 + 2); dgst[3] = packv (tmps, dgst, gid, i5 + 3); dgst[4] = packv (tmps, dgst, gid, i5 + 4); out[0] = packv (tmps, out, gid, i5 + 0); out[1] = packv (tmps, out, gid, i5 + 1); out[2] = packv (tmps, out, gid, i5 + 2); out[3] = packv (tmps, out, gid, i5 + 3); out[4] = packv (tmps, out, gid, i5 + 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_V (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]; } unpackv (tmps, dgst, gid, i5 + 0, dgst[0]); unpackv (tmps, dgst, gid, i5 + 1, dgst[1]); unpackv (tmps, dgst, gid, i5 + 2, dgst[2]); unpackv (tmps, dgst, gid, i5 + 3, dgst[3]); unpackv (tmps, dgst, gid, i5 + 4, dgst[4]); unpackv (tmps, out, gid, i5 + 0, out[0]); unpackv (tmps, out, gid, i5 + 1, out[1]); unpackv (tmps, out, gid, i5 + 2, out[2]); unpackv (tmps, out, gid, i5 + 3, out[3]); unpackv (tmps, out, gid, i5 + 4, out[4]); } } __kernel void m13600_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha1_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const zip2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); const u32 mode = esalt_bufs[digests_offset].mode; u32 iter_start; u32 iter_stop; switch (mode) { case 1: iter_start = 4; iter_stop = 8; break; case 2: iter_start = 6; iter_stop = 12; break; case 3: iter_start = 8; iter_stop = 16; break; } u32 key[8] = { 0 }; for (int i = iter_start, j = 0; i < iter_stop; i++, j++) { key[j] = tmps[gid].out[i]; } u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = key[0]; w0[1] = key[1]; w0[2] = key[2]; w0[3] = key[3]; w1[0] = key[4]; w1[1] = key[5]; w1[2] = key[6]; w1[3] = key[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; sha1_hmac_ctx_t ctx; sha1_hmac_init_64 (&ctx, w0, w1, w2, w3); sha1_hmac_update_global_swap (&ctx, esalt_bufs[digests_offset].data_buf, esalt_bufs[digests_offset].data_len); sha1_hmac_final (&ctx); const u32 r0 = swap32_S (ctx.opad.h[0] & 0xffffffff); const u32 r1 = swap32_S (ctx.opad.h[1] & 0xffffffff); const u32 r2 = swap32_S (ctx.opad.h[2] & 0xffff0000); const u32 r3 = swap32_S (ctx.opad.h[3] & 0x00000000); #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m13751.cl000066400000000000000000000353251320027462700154370ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" #include "inc_cipher_aes.cl" #include "inc_cipher_twofish.cl" #include "inc_cipher_serpent.cl" #include "inc_truecrypt_crc32.cl" #include "inc_truecrypt_xts.cl" 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; } void hmac_sha256_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m13751_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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]; w0[0] = u8add (w0[0], esalt_bufs[digests_offset].keyfile_buf[ 0]); w0[1] = u8add (w0[1], esalt_bufs[digests_offset].keyfile_buf[ 1]); w0[2] = u8add (w0[2], esalt_bufs[digests_offset].keyfile_buf[ 2]); w0[3] = u8add (w0[3], esalt_bufs[digests_offset].keyfile_buf[ 3]); w1[0] = u8add (w1[0], esalt_bufs[digests_offset].keyfile_buf[ 4]); w1[1] = u8add (w1[1], esalt_bufs[digests_offset].keyfile_buf[ 5]); w1[2] = u8add (w1[2], esalt_bufs[digests_offset].keyfile_buf[ 6]); w1[3] = u8add (w1[3], esalt_bufs[digests_offset].keyfile_buf[ 7]); w2[0] = u8add (w2[0], esalt_bufs[digests_offset].keyfile_buf[ 8]); w2[1] = u8add (w2[1], esalt_bufs[digests_offset].keyfile_buf[ 9]); w2[2] = u8add (w2[2], esalt_bufs[digests_offset].keyfile_buf[10]); w2[3] = u8add (w2[3], esalt_bufs[digests_offset].keyfile_buf[11]); w3[0] = u8add (w3[0], esalt_bufs[digests_offset].keyfile_buf[12]); w3[1] = u8add (w3[1], esalt_bufs[digests_offset].keyfile_buf[13]); w3[2] = u8add (w3[2], esalt_bufs[digests_offset].keyfile_buf[14]); w3[3] = u8add (w3[3], esalt_bufs[digests_offset].keyfile_buf[15]); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha256_hmac_ctx_t sha256_hmac_ctx; sha256_hmac_init_64 (&sha256_hmac_ctx, w0, w1, w2, w3); tmps[gid].ipad[0] = sha256_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha256_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha256_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha256_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha256_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha256_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha256_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha256_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha256_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha256_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha256_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha256_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha256_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha256_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha256_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha256_hmac_ctx.opad.h[7]; sha256_hmac_update_global_swap (&sha256_hmac_ctx, esalt_bufs[digests_offset].salt_buf, 64); for (u32 i = 0, j = 1; i < 16; i += 8, j += 1) { sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; w0[0] = j; 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] = 0; sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); sha256_hmac_final (&sha256_hmac_ctx2); tmps[gid].dgst[i + 0] = sha256_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha256_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha256_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha256_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha256_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha256_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha256_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha256_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m13751_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[8]; u32x opad[8]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); ipad[5] = packv (tmps, ipad, gid, 5); ipad[6] = packv (tmps, ipad, gid, 6); ipad[7] = packv (tmps, ipad, gid, 7); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); opad[5] = packv (tmps, opad, gid, 5); opad[6] = packv (tmps, opad, gid, 6); opad[7] = packv (tmps, opad, gid, 7); for (u32 i = 0; i < 16; i += 8) { u32x dgst[8]; u32x out[8]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); dgst[5] = packv (tmps, dgst, gid, i + 5); dgst[6] = packv (tmps, dgst, gid, i + 6); dgst[7] = packv (tmps, dgst, gid, i + 7); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, i + 4); out[5] = packv (tmps, out, gid, i + 5); out[6] = packv (tmps, out, gid, i + 6); out[7] = packv (tmps, out, gid, i + 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, dgst, gid, i + 5, dgst[5]); unpackv (tmps, dgst, gid, i + 6, dgst[6]); unpackv (tmps, dgst, gid, i + 7, dgst[7]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); unpackv (tmps, out, gid, i + 5, out[5]); unpackv (tmps, out, gid, i + 6, out[6]); unpackv (tmps, out, gid, i + 7, out[7]); } } __kernel void m13751_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; u32 ukey1[8]; ukey1[0] = swap32_S (tmps[gid].out[ 0]); ukey1[1] = swap32_S (tmps[gid].out[ 1]); ukey1[2] = swap32_S (tmps[gid].out[ 2]); ukey1[3] = swap32_S (tmps[gid].out[ 3]); ukey1[4] = swap32_S (tmps[gid].out[ 4]); ukey1[5] = swap32_S (tmps[gid].out[ 5]); ukey1[6] = swap32_S (tmps[gid].out[ 6]); ukey1[7] = swap32_S (tmps[gid].out[ 7]); u32 ukey2[8]; ukey2[0] = swap32_S (tmps[gid].out[ 8]); ukey2[1] = swap32_S (tmps[gid].out[ 9]); ukey2[2] = swap32_S (tmps[gid].out[10]); ukey2[3] = swap32_S (tmps[gid].out[11]); ukey2[4] = swap32_S (tmps[gid].out[12]); ukey2[5] = swap32_S (tmps[gid].out[13]); ukey2[6] = swap32_S (tmps[gid].out[14]); ukey2[7] = swap32_S (tmps[gid].out[15]); if (verify_header_aes (esalt_bufs, ukey1, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m13752.cl000066400000000000000000000404031320027462700154310ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" #include "inc_cipher_aes.cl" #include "inc_cipher_twofish.cl" #include "inc_cipher_serpent.cl" #include "inc_truecrypt_crc32.cl" #include "inc_truecrypt_xts.cl" 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; } void hmac_sha256_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m13752_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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]; w0[0] = u8add (w0[0], esalt_bufs[digests_offset].keyfile_buf[ 0]); w0[1] = u8add (w0[1], esalt_bufs[digests_offset].keyfile_buf[ 1]); w0[2] = u8add (w0[2], esalt_bufs[digests_offset].keyfile_buf[ 2]); w0[3] = u8add (w0[3], esalt_bufs[digests_offset].keyfile_buf[ 3]); w1[0] = u8add (w1[0], esalt_bufs[digests_offset].keyfile_buf[ 4]); w1[1] = u8add (w1[1], esalt_bufs[digests_offset].keyfile_buf[ 5]); w1[2] = u8add (w1[2], esalt_bufs[digests_offset].keyfile_buf[ 6]); w1[3] = u8add (w1[3], esalt_bufs[digests_offset].keyfile_buf[ 7]); w2[0] = u8add (w2[0], esalt_bufs[digests_offset].keyfile_buf[ 8]); w2[1] = u8add (w2[1], esalt_bufs[digests_offset].keyfile_buf[ 9]); w2[2] = u8add (w2[2], esalt_bufs[digests_offset].keyfile_buf[10]); w2[3] = u8add (w2[3], esalt_bufs[digests_offset].keyfile_buf[11]); w3[0] = u8add (w3[0], esalt_bufs[digests_offset].keyfile_buf[12]); w3[1] = u8add (w3[1], esalt_bufs[digests_offset].keyfile_buf[13]); w3[2] = u8add (w3[2], esalt_bufs[digests_offset].keyfile_buf[14]); w3[3] = u8add (w3[3], esalt_bufs[digests_offset].keyfile_buf[15]); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha256_hmac_ctx_t sha256_hmac_ctx; sha256_hmac_init_64 (&sha256_hmac_ctx, w0, w1, w2, w3); tmps[gid].ipad[0] = sha256_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha256_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha256_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha256_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha256_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha256_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha256_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha256_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha256_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha256_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha256_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha256_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha256_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha256_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha256_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha256_hmac_ctx.opad.h[7]; sha256_hmac_update_global_swap (&sha256_hmac_ctx, esalt_bufs[digests_offset].salt_buf, 64); for (u32 i = 0, j = 1; i < 32; i += 8, j += 1) { sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; w0[0] = j; 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] = 0; sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); sha256_hmac_final (&sha256_hmac_ctx2); tmps[gid].dgst[i + 0] = sha256_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha256_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha256_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha256_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha256_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha256_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha256_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha256_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m13752_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[8]; u32x opad[8]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); ipad[5] = packv (tmps, ipad, gid, 5); ipad[6] = packv (tmps, ipad, gid, 6); ipad[7] = packv (tmps, ipad, gid, 7); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); opad[5] = packv (tmps, opad, gid, 5); opad[6] = packv (tmps, opad, gid, 6); opad[7] = packv (tmps, opad, gid, 7); for (u32 i = 0; i < 32; i += 8) { u32x dgst[8]; u32x out[8]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); dgst[5] = packv (tmps, dgst, gid, i + 5); dgst[6] = packv (tmps, dgst, gid, i + 6); dgst[7] = packv (tmps, dgst, gid, i + 7); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, i + 4); out[5] = packv (tmps, out, gid, i + 5); out[6] = packv (tmps, out, gid, i + 6); out[7] = packv (tmps, out, gid, i + 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, dgst, gid, i + 5, dgst[5]); unpackv (tmps, dgst, gid, i + 6, dgst[6]); unpackv (tmps, dgst, gid, i + 7, dgst[7]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); unpackv (tmps, out, gid, i + 5, out[5]); unpackv (tmps, out, gid, i + 6, out[6]); unpackv (tmps, out, gid, i + 7, out[7]); } } __kernel void m13752_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; u32 ukey1[8]; ukey1[0] = swap32_S (tmps[gid].out[ 0]); ukey1[1] = swap32_S (tmps[gid].out[ 1]); ukey1[2] = swap32_S (tmps[gid].out[ 2]); ukey1[3] = swap32_S (tmps[gid].out[ 3]); ukey1[4] = swap32_S (tmps[gid].out[ 4]); ukey1[5] = swap32_S (tmps[gid].out[ 5]); ukey1[6] = swap32_S (tmps[gid].out[ 6]); ukey1[7] = swap32_S (tmps[gid].out[ 7]); u32 ukey2[8]; ukey2[0] = swap32_S (tmps[gid].out[ 8]); ukey2[1] = swap32_S (tmps[gid].out[ 9]); ukey2[2] = swap32_S (tmps[gid].out[10]); ukey2[3] = swap32_S (tmps[gid].out[11]); ukey2[4] = swap32_S (tmps[gid].out[12]); ukey2[5] = swap32_S (tmps[gid].out[13]); ukey2[6] = swap32_S (tmps[gid].out[14]); ukey2[7] = swap32_S (tmps[gid].out[15]); if (verify_header_aes (esalt_bufs, ukey1, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } u32 ukey3[8]; ukey3[0] = swap32_S (tmps[gid].out[16]); ukey3[1] = swap32_S (tmps[gid].out[17]); ukey3[2] = swap32_S (tmps[gid].out[18]); ukey3[3] = swap32_S (tmps[gid].out[19]); ukey3[4] = swap32_S (tmps[gid].out[20]); ukey3[5] = swap32_S (tmps[gid].out[21]); ukey3[6] = swap32_S (tmps[gid].out[22]); ukey3[7] = swap32_S (tmps[gid].out[23]); u32 ukey4[8]; ukey4[0] = swap32_S (tmps[gid].out[24]); ukey4[1] = swap32_S (tmps[gid].out[25]); ukey4[2] = swap32_S (tmps[gid].out[26]); ukey4[3] = swap32_S (tmps[gid].out[27]); ukey4[4] = swap32_S (tmps[gid].out[28]); ukey4[5] = swap32_S (tmps[gid].out[29]); ukey4[6] = swap32_S (tmps[gid].out[30]); ukey4[7] = swap32_S (tmps[gid].out[31]); if (verify_header_aes_twofish (esalt_bufs, ukey1, ukey2, ukey3, ukey4, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent_aes (esalt_bufs, ukey1, ukey2, ukey3, ukey4, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish_serpent (esalt_bufs, ukey1, ukey2, ukey3, ukey4) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m13753.cl000066400000000000000000000431531320027462700154370ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" #include "inc_cipher_aes.cl" #include "inc_cipher_twofish.cl" #include "inc_cipher_serpent.cl" #include "inc_truecrypt_crc32.cl" #include "inc_truecrypt_xts.cl" 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; } void hmac_sha256_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m13753_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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]; w0[0] = u8add (w0[0], esalt_bufs[digests_offset].keyfile_buf[ 0]); w0[1] = u8add (w0[1], esalt_bufs[digests_offset].keyfile_buf[ 1]); w0[2] = u8add (w0[2], esalt_bufs[digests_offset].keyfile_buf[ 2]); w0[3] = u8add (w0[3], esalt_bufs[digests_offset].keyfile_buf[ 3]); w1[0] = u8add (w1[0], esalt_bufs[digests_offset].keyfile_buf[ 4]); w1[1] = u8add (w1[1], esalt_bufs[digests_offset].keyfile_buf[ 5]); w1[2] = u8add (w1[2], esalt_bufs[digests_offset].keyfile_buf[ 6]); w1[3] = u8add (w1[3], esalt_bufs[digests_offset].keyfile_buf[ 7]); w2[0] = u8add (w2[0], esalt_bufs[digests_offset].keyfile_buf[ 8]); w2[1] = u8add (w2[1], esalt_bufs[digests_offset].keyfile_buf[ 9]); w2[2] = u8add (w2[2], esalt_bufs[digests_offset].keyfile_buf[10]); w2[3] = u8add (w2[3], esalt_bufs[digests_offset].keyfile_buf[11]); w3[0] = u8add (w3[0], esalt_bufs[digests_offset].keyfile_buf[12]); w3[1] = u8add (w3[1], esalt_bufs[digests_offset].keyfile_buf[13]); w3[2] = u8add (w3[2], esalt_bufs[digests_offset].keyfile_buf[14]); w3[3] = u8add (w3[3], esalt_bufs[digests_offset].keyfile_buf[15]); w0[0] = swap32_S (w0[0]); w0[1] = swap32_S (w0[1]); w0[2] = swap32_S (w0[2]); w0[3] = swap32_S (w0[3]); w1[0] = swap32_S (w1[0]); w1[1] = swap32_S (w1[1]); w1[2] = swap32_S (w1[2]); w1[3] = swap32_S (w1[3]); w2[0] = swap32_S (w2[0]); w2[1] = swap32_S (w2[1]); w2[2] = swap32_S (w2[2]); w2[3] = swap32_S (w2[3]); w3[0] = swap32_S (w3[0]); w3[1] = swap32_S (w3[1]); w3[2] = swap32_S (w3[2]); w3[3] = swap32_S (w3[3]); sha256_hmac_ctx_t sha256_hmac_ctx; sha256_hmac_init_64 (&sha256_hmac_ctx, w0, w1, w2, w3); tmps[gid].ipad[0] = sha256_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha256_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha256_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha256_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha256_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha256_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha256_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha256_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha256_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha256_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha256_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha256_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha256_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha256_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha256_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha256_hmac_ctx.opad.h[7]; sha256_hmac_update_global_swap (&sha256_hmac_ctx, esalt_bufs[digests_offset].salt_buf, 64); for (u32 i = 0, j = 1; i < 48; i += 8, j += 1) { sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; w0[0] = j; 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] = 0; sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); sha256_hmac_final (&sha256_hmac_ctx2); tmps[gid].dgst[i + 0] = sha256_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha256_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha256_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha256_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha256_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha256_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha256_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha256_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m13753_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[8]; u32x opad[8]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); ipad[5] = packv (tmps, ipad, gid, 5); ipad[6] = packv (tmps, ipad, gid, 6); ipad[7] = packv (tmps, ipad, gid, 7); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); opad[5] = packv (tmps, opad, gid, 5); opad[6] = packv (tmps, opad, gid, 6); opad[7] = packv (tmps, opad, gid, 7); for (u32 i = 0; i < 48; i += 8) { u32x dgst[8]; u32x out[8]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); dgst[5] = packv (tmps, dgst, gid, i + 5); dgst[6] = packv (tmps, dgst, gid, i + 6); dgst[7] = packv (tmps, dgst, gid, i + 7); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, i + 4); out[5] = packv (tmps, out, gid, i + 5); out[6] = packv (tmps, out, gid, i + 6); out[7] = packv (tmps, out, gid, i + 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, dgst, gid, i + 5, dgst[5]); unpackv (tmps, dgst, gid, i + 6, dgst[6]); unpackv (tmps, dgst, gid, i + 7, dgst[7]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); unpackv (tmps, out, gid, i + 5, out[5]); unpackv (tmps, out, gid, i + 6, out[6]); unpackv (tmps, out, gid, i + 7, out[7]); } } __kernel void m13753_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; u32 ukey1[8]; ukey1[0] = swap32_S (tmps[gid].out[ 0]); ukey1[1] = swap32_S (tmps[gid].out[ 1]); ukey1[2] = swap32_S (tmps[gid].out[ 2]); ukey1[3] = swap32_S (tmps[gid].out[ 3]); ukey1[4] = swap32_S (tmps[gid].out[ 4]); ukey1[5] = swap32_S (tmps[gid].out[ 5]); ukey1[6] = swap32_S (tmps[gid].out[ 6]); ukey1[7] = swap32_S (tmps[gid].out[ 7]); u32 ukey2[8]; ukey2[0] = swap32_S (tmps[gid].out[ 8]); ukey2[1] = swap32_S (tmps[gid].out[ 9]); ukey2[2] = swap32_S (tmps[gid].out[10]); ukey2[3] = swap32_S (tmps[gid].out[11]); ukey2[4] = swap32_S (tmps[gid].out[12]); ukey2[5] = swap32_S (tmps[gid].out[13]); ukey2[6] = swap32_S (tmps[gid].out[14]); ukey2[7] = swap32_S (tmps[gid].out[15]); if (verify_header_aes (esalt_bufs, ukey1, ukey2, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish (esalt_bufs, ukey1, ukey2) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } u32 ukey3[8]; ukey3[0] = swap32_S (tmps[gid].out[16]); ukey3[1] = swap32_S (tmps[gid].out[17]); ukey3[2] = swap32_S (tmps[gid].out[18]); ukey3[3] = swap32_S (tmps[gid].out[19]); ukey3[4] = swap32_S (tmps[gid].out[20]); ukey3[5] = swap32_S (tmps[gid].out[21]); ukey3[6] = swap32_S (tmps[gid].out[22]); ukey3[7] = swap32_S (tmps[gid].out[23]); u32 ukey4[8]; ukey4[0] = swap32_S (tmps[gid].out[24]); ukey4[1] = swap32_S (tmps[gid].out[25]); ukey4[2] = swap32_S (tmps[gid].out[26]); ukey4[3] = swap32_S (tmps[gid].out[27]); ukey4[4] = swap32_S (tmps[gid].out[28]); ukey4[5] = swap32_S (tmps[gid].out[29]); ukey4[6] = swap32_S (tmps[gid].out[30]); ukey4[7] = swap32_S (tmps[gid].out[31]); if (verify_header_aes_twofish (esalt_bufs, ukey1, ukey2, ukey3, ukey4, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent_aes (esalt_bufs, ukey1, ukey2, ukey3, ukey4, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_twofish_serpent (esalt_bufs, ukey1, ukey2, ukey3, ukey4) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } u32 ukey5[8]; ukey5[0] = swap32_S (tmps[gid].out[32]); ukey5[1] = swap32_S (tmps[gid].out[33]); ukey5[2] = swap32_S (tmps[gid].out[34]); ukey5[3] = swap32_S (tmps[gid].out[35]); ukey5[4] = swap32_S (tmps[gid].out[36]); ukey5[5] = swap32_S (tmps[gid].out[37]); ukey5[6] = swap32_S (tmps[gid].out[38]); ukey5[7] = swap32_S (tmps[gid].out[39]); u32 ukey6[8]; ukey6[0] = swap32_S (tmps[gid].out[40]); ukey6[1] = swap32_S (tmps[gid].out[41]); ukey6[2] = swap32_S (tmps[gid].out[42]); ukey6[3] = swap32_S (tmps[gid].out[43]); ukey6[4] = swap32_S (tmps[gid].out[44]); ukey6[5] = swap32_S (tmps[gid].out[45]); ukey6[6] = swap32_S (tmps[gid].out[46]); ukey6[7] = swap32_S (tmps[gid].out[47]); if (verify_header_aes_twofish_serpent (esalt_bufs, ukey1, ukey2, ukey3, ukey4, ukey5, ukey6, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } if (verify_header_serpent_twofish_aes (esalt_bufs, ukey1, ukey2, ukey3, ukey4, ukey5, ukey6, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4) == 1) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m13800_a0-optimized.cl000066400000000000000000000664261320027462700200220ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //not compatible //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" void sha256_transform_transport_vector (const u32x w[16], u32x digest[8]) { sha256_transform_vector (w + 0, w + 4, w + 8, w + 12, digest); } void memcat64c_be (u32x block[16], const u32 offset, u32x carry[16]) { const u32 mod = offset & 3; const u32 div = offset / 4; u32x tmp00; u32x tmp01; u32x tmp02; u32x tmp03; u32x tmp04; u32x tmp05; u32x tmp06; u32x tmp07; u32x tmp08; u32x tmp09; u32x tmp10; u32x tmp11; u32x tmp12; u32x tmp13; u32x tmp14; u32x tmp15; u32x tmp16; #if defined IS_AMD || defined IS_GENERIC tmp00 = amd_bytealign ( 0, carry[ 0], offset); tmp01 = amd_bytealign (carry[ 0], carry[ 1], offset); tmp02 = amd_bytealign (carry[ 1], carry[ 2], offset); tmp03 = amd_bytealign (carry[ 2], carry[ 3], offset); tmp04 = amd_bytealign (carry[ 3], carry[ 4], offset); tmp05 = amd_bytealign (carry[ 4], carry[ 5], offset); tmp06 = amd_bytealign (carry[ 5], carry[ 6], offset); tmp07 = amd_bytealign (carry[ 6], carry[ 7], offset); tmp08 = amd_bytealign (carry[ 7], carry[ 8], offset); tmp09 = amd_bytealign (carry[ 8], carry[ 9], offset); tmp10 = amd_bytealign (carry[ 9], carry[10], offset); tmp11 = amd_bytealign (carry[10], carry[11], offset); tmp12 = amd_bytealign (carry[11], carry[12], offset); tmp13 = amd_bytealign (carry[12], carry[13], offset); tmp14 = amd_bytealign (carry[13], carry[14], offset); tmp15 = amd_bytealign (carry[14], carry[15], offset); tmp16 = amd_bytealign (carry[15], 0, offset); #endif #ifdef IS_NV const int selector = (0x76543210 >> ((offset & 3) * 4)) & 0xffff; tmp00 = __byte_perm (carry[ 0], 0, selector); tmp01 = __byte_perm (carry[ 1], carry[ 0], selector); tmp02 = __byte_perm (carry[ 2], carry[ 1], selector); tmp03 = __byte_perm (carry[ 3], carry[ 2], selector); tmp04 = __byte_perm (carry[ 4], carry[ 3], selector); tmp05 = __byte_perm (carry[ 5], carry[ 4], selector); tmp06 = __byte_perm (carry[ 6], carry[ 5], selector); tmp07 = __byte_perm (carry[ 7], carry[ 6], selector); tmp08 = __byte_perm (carry[ 8], carry[ 7], selector); tmp09 = __byte_perm (carry[ 9], carry[ 8], selector); tmp10 = __byte_perm (carry[10], carry[ 9], selector); tmp11 = __byte_perm (carry[11], carry[10], selector); tmp12 = __byte_perm (carry[12], carry[11], selector); tmp13 = __byte_perm (carry[13], carry[12], selector); tmp14 = __byte_perm (carry[14], carry[13], selector); tmp15 = __byte_perm (carry[15], carry[14], selector); tmp16 = __byte_perm ( 0, carry[15], selector); #endif carry[ 0] = 0; carry[ 1] = 0; carry[ 2] = 0; carry[ 3] = 0; carry[ 4] = 0; carry[ 5] = 0; carry[ 6] = 0; carry[ 7] = 0; carry[ 8] = 0; carry[ 9] = 0; carry[10] = 0; carry[11] = 0; carry[12] = 0; carry[13] = 0; carry[14] = 0; carry[15] = 0; switch (div) { case 0: block[ 0] |= tmp00; block[ 1] = tmp01; block[ 2] = tmp02; block[ 3] = tmp03; block[ 4] = tmp04; block[ 5] = tmp05; block[ 6] = tmp06; block[ 7] = tmp07; block[ 8] = tmp08; block[ 9] = tmp09; block[10] = tmp10; block[11] = tmp11; block[12] = tmp12; block[13] = tmp13; block[14] = tmp14; block[15] = tmp15; carry[ 0] = tmp16; break; case 1: block[ 1] |= tmp00; block[ 2] = tmp01; block[ 3] = tmp02; block[ 4] = tmp03; block[ 5] = tmp04; block[ 6] = tmp05; block[ 7] = tmp06; block[ 8] = tmp07; block[ 9] = tmp08; block[10] = tmp09; block[11] = tmp10; block[12] = tmp11; block[13] = tmp12; block[14] = tmp13; block[15] = tmp14; carry[ 0] = tmp15; carry[ 1] = tmp16; break; case 2: block[ 2] |= tmp00; block[ 3] = tmp01; block[ 4] = tmp02; block[ 5] = tmp03; block[ 6] = tmp04; block[ 7] = tmp05; block[ 8] = tmp06; block[ 9] = tmp07; block[10] = tmp08; block[11] = tmp09; block[12] = tmp10; block[13] = tmp11; block[14] = tmp12; block[15] = tmp13; carry[ 0] = tmp14; carry[ 1] = tmp15; carry[ 2] = tmp16; break; case 3: block[ 3] |= tmp00; block[ 4] = tmp01; block[ 5] = tmp02; block[ 6] = tmp03; block[ 7] = tmp04; block[ 8] = tmp05; block[ 9] = tmp06; block[10] = tmp07; block[11] = tmp08; block[12] = tmp09; block[13] = tmp10; block[14] = tmp11; block[15] = tmp12; carry[ 0] = tmp13; carry[ 1] = tmp14; carry[ 2] = tmp15; carry[ 3] = tmp16; break; case 4: block[ 4] |= tmp00; block[ 5] = tmp01; block[ 6] = tmp02; block[ 7] = tmp03; block[ 8] = tmp04; block[ 9] = tmp05; block[10] = tmp06; block[11] = tmp07; block[12] = tmp08; block[13] = tmp09; block[14] = tmp10; block[15] = tmp11; carry[ 0] = tmp12; carry[ 1] = tmp13; carry[ 2] = tmp14; carry[ 3] = tmp15; carry[ 4] = tmp16; break; case 5: block[ 5] |= tmp00; block[ 6] = tmp01; block[ 7] = tmp02; block[ 8] = tmp03; block[ 9] = tmp04; block[10] = tmp05; block[11] = tmp06; block[12] = tmp07; block[13] = tmp08; block[14] = tmp09; block[15] = tmp10; carry[ 0] = tmp11; carry[ 1] = tmp12; carry[ 2] = tmp13; carry[ 3] = tmp14; carry[ 4] = tmp15; carry[ 5] = tmp16; break; case 6: block[ 6] |= tmp00; block[ 7] = tmp01; block[ 8] = tmp02; block[ 9] = tmp03; block[10] = tmp04; block[11] = tmp05; block[12] = tmp06; block[13] = tmp07; block[14] = tmp08; block[15] = tmp09; carry[ 0] = tmp10; carry[ 1] = tmp11; carry[ 2] = tmp12; carry[ 3] = tmp13; carry[ 4] = tmp14; carry[ 5] = tmp15; carry[ 6] = tmp16; break; case 7: block[ 7] |= tmp00; block[ 8] = tmp01; block[ 9] = tmp02; block[10] = tmp03; block[11] = tmp04; block[12] = tmp05; block[13] = tmp06; block[14] = tmp07; block[15] = tmp08; carry[ 0] = tmp09; carry[ 1] = tmp10; carry[ 2] = tmp11; carry[ 3] = tmp12; carry[ 4] = tmp13; carry[ 5] = tmp14; carry[ 6] = tmp15; carry[ 7] = tmp16; break; case 8: block[ 8] |= tmp00; block[ 9] = tmp01; block[10] = tmp02; block[11] = tmp03; block[12] = tmp04; block[13] = tmp05; block[14] = tmp06; block[15] = tmp07; carry[ 0] = tmp08; carry[ 1] = tmp09; carry[ 2] = tmp10; carry[ 3] = tmp11; carry[ 4] = tmp12; carry[ 5] = tmp13; carry[ 6] = tmp14; carry[ 7] = tmp15; carry[ 8] = tmp16; break; case 9: block[ 9] |= tmp00; block[10] = tmp01; block[11] = tmp02; block[12] = tmp03; block[13] = tmp04; block[14] = tmp05; block[15] = tmp06; carry[ 0] = tmp07; carry[ 1] = tmp08; carry[ 2] = tmp09; carry[ 3] = tmp10; carry[ 4] = tmp11; carry[ 5] = tmp12; carry[ 6] = tmp13; carry[ 7] = tmp14; carry[ 8] = tmp15; carry[ 9] = tmp16; break; case 10: block[10] |= tmp00; block[11] = tmp01; block[12] = tmp02; block[13] = tmp03; block[14] = tmp04; block[15] = tmp05; carry[ 0] = tmp06; carry[ 1] = tmp07; carry[ 2] = tmp08; carry[ 3] = tmp09; carry[ 4] = tmp10; carry[ 5] = tmp11; carry[ 6] = tmp12; carry[ 7] = tmp13; carry[ 8] = tmp14; carry[ 9] = tmp15; carry[10] = tmp16; break; case 11: block[11] |= tmp00; block[12] = tmp01; block[13] = tmp02; block[14] = tmp03; block[15] = tmp04; carry[ 0] = tmp05; carry[ 1] = tmp06; carry[ 2] = tmp07; carry[ 3] = tmp08; carry[ 4] = tmp09; carry[ 5] = tmp10; carry[ 6] = tmp11; carry[ 7] = tmp12; carry[ 8] = tmp13; carry[ 9] = tmp14; carry[10] = tmp15; carry[11] = tmp16; break; case 12: block[12] |= tmp00; block[13] = tmp01; block[14] = tmp02; block[15] = tmp03; carry[ 0] = tmp04; carry[ 1] = tmp05; carry[ 2] = tmp06; carry[ 3] = tmp07; carry[ 4] = tmp08; carry[ 5] = tmp09; carry[ 6] = tmp10; carry[ 7] = tmp11; carry[ 8] = tmp12; carry[ 9] = tmp13; carry[10] = tmp14; carry[11] = tmp15; carry[12] = tmp16; break; case 13: block[13] |= tmp00; block[14] = tmp01; block[15] = tmp02; carry[ 0] = tmp03; carry[ 1] = tmp04; carry[ 2] = tmp05; carry[ 3] = tmp06; carry[ 4] = tmp07; carry[ 5] = tmp08; carry[ 6] = tmp09; carry[ 7] = tmp10; carry[ 8] = tmp11; carry[ 9] = tmp12; carry[10] = tmp13; carry[11] = tmp14; carry[12] = tmp15; carry[13] = tmp16; break; case 14: block[14] |= tmp00; block[15] = tmp01; carry[ 0] = tmp02; carry[ 1] = tmp03; carry[ 2] = tmp04; carry[ 3] = tmp05; carry[ 4] = tmp06; carry[ 5] = tmp07; carry[ 6] = tmp08; carry[ 7] = tmp09; carry[ 8] = tmp10; carry[ 9] = tmp11; carry[10] = tmp12; carry[11] = tmp13; carry[12] = tmp14; carry[13] = tmp15; carry[14] = tmp16; break; case 15: block[15] |= tmp00; carry[ 0] = tmp01; carry[ 1] = tmp02; carry[ 2] = tmp03; carry[ 3] = tmp04; carry[ 4] = tmp05; carry[ 5] = tmp06; carry[ 6] = tmp07; carry[ 7] = tmp08; carry[ 8] = tmp09; carry[ 9] = tmp10; carry[10] = tmp11; carry[11] = tmp12; carry[12] = tmp13; carry[13] = tmp14; carry[14] = tmp15; carry[15] = tmp16; break; } } __kernel void m13800_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_len = pws[gid].pw_len; /** * shared */ __local u32 s_esalt[32]; for (u32 i = lid; i < 32; i += lsz) { s_esalt[i] = esalt_bufs[digests_offset].salt_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); const u32x out_len2 = out_len * 2; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); u32x w[16]; w[ 0] = swap32 (w0[0]); w[ 1] = swap32 (w0[1]); w[ 2] = swap32 (w0[2]); w[ 3] = swap32 (w0[3]); w[ 4] = swap32 (w1[0]); w[ 5] = swap32 (w1[1]); w[ 6] = swap32 (w1[2]); w[ 7] = swap32 (w1[3]); w[ 8] = swap32 (w2[0]); w[ 9] = swap32 (w2[1]); w[10] = swap32 (w2[2]); w[11] = swap32 (w2[3]); w[12] = swap32 (w3[0]); w[13] = swap32 (w3[1]); w[14] = swap32 (w3[2]); w[15] = swap32 (w3[3]); u32x carry[16]; carry[ 0] = s_esalt[ 0]; carry[ 1] = s_esalt[ 1]; carry[ 2] = s_esalt[ 2]; carry[ 3] = s_esalt[ 3]; carry[ 4] = s_esalt[ 4]; carry[ 5] = s_esalt[ 5]; carry[ 6] = s_esalt[ 6]; carry[ 7] = s_esalt[ 7]; carry[ 8] = s_esalt[ 8]; carry[ 9] = s_esalt[ 9]; carry[10] = s_esalt[10]; carry[11] = s_esalt[11]; carry[12] = s_esalt[12]; carry[13] = s_esalt[13]; carry[14] = s_esalt[14]; carry[15] = s_esalt[15]; // we can always use pw_len here, since we add exactly the hash buffer size memcat64c_be (w, out_len2, carry); 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_transport_vector (w, digest); w[ 0] = carry[ 0]; w[ 1] = carry[ 1]; w[ 2] = carry[ 2]; w[ 3] = carry[ 3]; w[ 4] = carry[ 4]; w[ 5] = carry[ 5]; w[ 6] = carry[ 6]; w[ 7] = carry[ 7]; w[ 8] = carry[ 8]; w[ 9] = carry[ 9]; w[10] = carry[10]; w[11] = carry[11]; w[12] = carry[12]; w[13] = carry[13]; w[14] = carry[14]; w[15] = carry[15]; carry[ 0] = s_esalt[16]; carry[ 1] = s_esalt[17]; carry[ 2] = s_esalt[18]; carry[ 3] = s_esalt[19]; carry[ 4] = s_esalt[20]; carry[ 5] = s_esalt[21]; carry[ 6] = s_esalt[22]; carry[ 7] = s_esalt[23]; carry[ 8] = s_esalt[24]; carry[ 9] = s_esalt[25]; carry[10] = s_esalt[26]; carry[11] = s_esalt[27]; carry[12] = s_esalt[28]; carry[13] = s_esalt[29]; carry[14] = s_esalt[30]; carry[15] = s_esalt[31]; // we can always use pw_len here, since we add exactly the hash buffer size memcat64c_be (w, out_len2, carry); sha256_transform_transport_vector (w, digest); w[ 0] = carry[ 0]; w[ 1] = carry[ 1]; w[ 2] = carry[ 2]; w[ 3] = carry[ 3]; w[ 4] = carry[ 4]; w[ 5] = carry[ 5]; w[ 6] = carry[ 6]; w[ 7] = carry[ 7]; w[ 8] = carry[ 8]; w[ 9] = carry[ 9]; w[10] = carry[10]; w[11] = carry[11]; w[12] = carry[12]; w[13] = carry[13]; w[14] = carry[14]; w[15] = carry[15]; // we can always use pw_len here, since we add exactly the hash buffer size append_0x80_4x4 (w + 0, w + 4, w + 8, w + 12, out_len2 ^ 3); w[14] = 0; w[15] = (out_len2 + 128) * 8; sha256_transform_transport_vector (w, digest); const u32x d = digest[DGST_R0]; const u32x h = digest[DGST_R1]; const u32x c = digest[DGST_R2]; const u32x g = digest[DGST_R3]; COMPARE_M_SIMD (d, h, c, g); } } __kernel void m13800_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13800_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13800_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_len = pws[gid].pw_len; /** * shared */ __local u32 s_esalt[32]; for (u32 i = lid; i < 32; i += lsz) { s_esalt[i] = esalt_bufs[digests_offset].salt_buf[i]; } 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); const u32x out_len2 = out_len * 2; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); u32x w[16]; w[ 0] = swap32 (w0[0]); w[ 1] = swap32 (w0[1]); w[ 2] = swap32 (w0[2]); w[ 3] = swap32 (w0[3]); w[ 4] = swap32 (w1[0]); w[ 5] = swap32 (w1[1]); w[ 6] = swap32 (w1[2]); w[ 7] = swap32 (w1[3]); w[ 8] = swap32 (w2[0]); w[ 9] = swap32 (w2[1]); w[10] = swap32 (w2[2]); w[11] = swap32 (w2[3]); w[12] = swap32 (w3[0]); w[13] = swap32 (w3[1]); w[14] = swap32 (w3[2]); w[15] = swap32 (w3[3]); u32x carry[16]; carry[ 0] = s_esalt[ 0]; carry[ 1] = s_esalt[ 1]; carry[ 2] = s_esalt[ 2]; carry[ 3] = s_esalt[ 3]; carry[ 4] = s_esalt[ 4]; carry[ 5] = s_esalt[ 5]; carry[ 6] = s_esalt[ 6]; carry[ 7] = s_esalt[ 7]; carry[ 8] = s_esalt[ 8]; carry[ 9] = s_esalt[ 9]; carry[10] = s_esalt[10]; carry[11] = s_esalt[11]; carry[12] = s_esalt[12]; carry[13] = s_esalt[13]; carry[14] = s_esalt[14]; carry[15] = s_esalt[15]; // we can always use pw_len here, since we add exactly the hash buffer size memcat64c_be (w, out_len2, carry); 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_transport_vector (w, digest); w[ 0] = carry[ 0]; w[ 1] = carry[ 1]; w[ 2] = carry[ 2]; w[ 3] = carry[ 3]; w[ 4] = carry[ 4]; w[ 5] = carry[ 5]; w[ 6] = carry[ 6]; w[ 7] = carry[ 7]; w[ 8] = carry[ 8]; w[ 9] = carry[ 9]; w[10] = carry[10]; w[11] = carry[11]; w[12] = carry[12]; w[13] = carry[13]; w[14] = carry[14]; w[15] = carry[15]; carry[ 0] = s_esalt[16]; carry[ 1] = s_esalt[17]; carry[ 2] = s_esalt[18]; carry[ 3] = s_esalt[19]; carry[ 4] = s_esalt[20]; carry[ 5] = s_esalt[21]; carry[ 6] = s_esalt[22]; carry[ 7] = s_esalt[23]; carry[ 8] = s_esalt[24]; carry[ 9] = s_esalt[25]; carry[10] = s_esalt[26]; carry[11] = s_esalt[27]; carry[12] = s_esalt[28]; carry[13] = s_esalt[29]; carry[14] = s_esalt[30]; carry[15] = s_esalt[31]; // we can always use pw_len here, since we add exactly the hash buffer size memcat64c_be (w, out_len2, carry); sha256_transform_transport_vector (w, digest); w[ 0] = carry[ 0]; w[ 1] = carry[ 1]; w[ 2] = carry[ 2]; w[ 3] = carry[ 3]; w[ 4] = carry[ 4]; w[ 5] = carry[ 5]; w[ 6] = carry[ 6]; w[ 7] = carry[ 7]; w[ 8] = carry[ 8]; w[ 9] = carry[ 9]; w[10] = carry[10]; w[11] = carry[11]; w[12] = carry[12]; w[13] = carry[13]; w[14] = carry[14]; w[15] = carry[15]; // we can always use pw_len here, since we add exactly the hash buffer size append_0x80_4x4 (w + 0, w + 4, w + 8, w + 12, out_len2 ^ 3); w[14] = 0; w[15] = (out_len2 + 128) * 8; sha256_transform_transport_vector (w, digest); const u32x d = digest[DGST_R0]; const u32x h = digest[DGST_R1]; const u32x c = digest[DGST_R2]; const u32x g = digest[DGST_R3]; COMPARE_S_SIMD (d, h, c, g); } } __kernel void m13800_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13800_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m13800_a0.cl000066400000000000000000000101741320027462700160050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha256.cl" __kernel void m13800_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha256_ctx_t ctx; sha256_init (&ctx); sha256_update_utf16le_swap (&ctx, tmp.i, tmp.pw_len); sha256_update_global (&ctx, esalt_bufs[digests_offset].salt_buf, 128); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m13800_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha256_ctx_t ctx; sha256_init (&ctx); sha256_update_utf16le_swap (&ctx, tmp.i, tmp.pw_len); sha256_update_global (&ctx, esalt_bufs[digests_offset].salt_buf, 128); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m13800_a1-optimized.cl000066400000000000000000000741471320027462700200220ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //not compatible //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" void sha256_transform_transport_vector (const u32x w[16], u32x digest[8]) { sha256_transform_vector (w + 0, w + 4, w + 8, w + 12, digest); } void memcat64c_be (u32x block[16], const u32 offset, u32x carry[16]) { const u32 mod = offset & 3; const u32 div = offset / 4; u32x tmp00; u32x tmp01; u32x tmp02; u32x tmp03; u32x tmp04; u32x tmp05; u32x tmp06; u32x tmp07; u32x tmp08; u32x tmp09; u32x tmp10; u32x tmp11; u32x tmp12; u32x tmp13; u32x tmp14; u32x tmp15; u32x tmp16; #if defined IS_AMD || defined IS_GENERIC tmp00 = amd_bytealign ( 0, carry[ 0], offset); tmp01 = amd_bytealign (carry[ 0], carry[ 1], offset); tmp02 = amd_bytealign (carry[ 1], carry[ 2], offset); tmp03 = amd_bytealign (carry[ 2], carry[ 3], offset); tmp04 = amd_bytealign (carry[ 3], carry[ 4], offset); tmp05 = amd_bytealign (carry[ 4], carry[ 5], offset); tmp06 = amd_bytealign (carry[ 5], carry[ 6], offset); tmp07 = amd_bytealign (carry[ 6], carry[ 7], offset); tmp08 = amd_bytealign (carry[ 7], carry[ 8], offset); tmp09 = amd_bytealign (carry[ 8], carry[ 9], offset); tmp10 = amd_bytealign (carry[ 9], carry[10], offset); tmp11 = amd_bytealign (carry[10], carry[11], offset); tmp12 = amd_bytealign (carry[11], carry[12], offset); tmp13 = amd_bytealign (carry[12], carry[13], offset); tmp14 = amd_bytealign (carry[13], carry[14], offset); tmp15 = amd_bytealign (carry[14], carry[15], offset); tmp16 = amd_bytealign (carry[15], 0, offset); #endif #ifdef IS_NV const int selector = (0x76543210 >> ((offset & 3) * 4)) & 0xffff; tmp00 = __byte_perm (carry[ 0], 0, selector); tmp01 = __byte_perm (carry[ 1], carry[ 0], selector); tmp02 = __byte_perm (carry[ 2], carry[ 1], selector); tmp03 = __byte_perm (carry[ 3], carry[ 2], selector); tmp04 = __byte_perm (carry[ 4], carry[ 3], selector); tmp05 = __byte_perm (carry[ 5], carry[ 4], selector); tmp06 = __byte_perm (carry[ 6], carry[ 5], selector); tmp07 = __byte_perm (carry[ 7], carry[ 6], selector); tmp08 = __byte_perm (carry[ 8], carry[ 7], selector); tmp09 = __byte_perm (carry[ 9], carry[ 8], selector); tmp10 = __byte_perm (carry[10], carry[ 9], selector); tmp11 = __byte_perm (carry[11], carry[10], selector); tmp12 = __byte_perm (carry[12], carry[11], selector); tmp13 = __byte_perm (carry[13], carry[12], selector); tmp14 = __byte_perm (carry[14], carry[13], selector); tmp15 = __byte_perm (carry[15], carry[14], selector); tmp16 = __byte_perm ( 0, carry[15], selector); #endif carry[ 0] = 0; carry[ 1] = 0; carry[ 2] = 0; carry[ 3] = 0; carry[ 4] = 0; carry[ 5] = 0; carry[ 6] = 0; carry[ 7] = 0; carry[ 8] = 0; carry[ 9] = 0; carry[10] = 0; carry[11] = 0; carry[12] = 0; carry[13] = 0; carry[14] = 0; carry[15] = 0; switch (div) { case 0: block[ 0] |= tmp00; block[ 1] = tmp01; block[ 2] = tmp02; block[ 3] = tmp03; block[ 4] = tmp04; block[ 5] = tmp05; block[ 6] = tmp06; block[ 7] = tmp07; block[ 8] = tmp08; block[ 9] = tmp09; block[10] = tmp10; block[11] = tmp11; block[12] = tmp12; block[13] = tmp13; block[14] = tmp14; block[15] = tmp15; carry[ 0] = tmp16; break; case 1: block[ 1] |= tmp00; block[ 2] = tmp01; block[ 3] = tmp02; block[ 4] = tmp03; block[ 5] = tmp04; block[ 6] = tmp05; block[ 7] = tmp06; block[ 8] = tmp07; block[ 9] = tmp08; block[10] = tmp09; block[11] = tmp10; block[12] = tmp11; block[13] = tmp12; block[14] = tmp13; block[15] = tmp14; carry[ 0] = tmp15; carry[ 1] = tmp16; break; case 2: block[ 2] |= tmp00; block[ 3] = tmp01; block[ 4] = tmp02; block[ 5] = tmp03; block[ 6] = tmp04; block[ 7] = tmp05; block[ 8] = tmp06; block[ 9] = tmp07; block[10] = tmp08; block[11] = tmp09; block[12] = tmp10; block[13] = tmp11; block[14] = tmp12; block[15] = tmp13; carry[ 0] = tmp14; carry[ 1] = tmp15; carry[ 2] = tmp16; break; case 3: block[ 3] |= tmp00; block[ 4] = tmp01; block[ 5] = tmp02; block[ 6] = tmp03; block[ 7] = tmp04; block[ 8] = tmp05; block[ 9] = tmp06; block[10] = tmp07; block[11] = tmp08; block[12] = tmp09; block[13] = tmp10; block[14] = tmp11; block[15] = tmp12; carry[ 0] = tmp13; carry[ 1] = tmp14; carry[ 2] = tmp15; carry[ 3] = tmp16; break; case 4: block[ 4] |= tmp00; block[ 5] = tmp01; block[ 6] = tmp02; block[ 7] = tmp03; block[ 8] = tmp04; block[ 9] = tmp05; block[10] = tmp06; block[11] = tmp07; block[12] = tmp08; block[13] = tmp09; block[14] = tmp10; block[15] = tmp11; carry[ 0] = tmp12; carry[ 1] = tmp13; carry[ 2] = tmp14; carry[ 3] = tmp15; carry[ 4] = tmp16; break; case 5: block[ 5] |= tmp00; block[ 6] = tmp01; block[ 7] = tmp02; block[ 8] = tmp03; block[ 9] = tmp04; block[10] = tmp05; block[11] = tmp06; block[12] = tmp07; block[13] = tmp08; block[14] = tmp09; block[15] = tmp10; carry[ 0] = tmp11; carry[ 1] = tmp12; carry[ 2] = tmp13; carry[ 3] = tmp14; carry[ 4] = tmp15; carry[ 5] = tmp16; break; case 6: block[ 6] |= tmp00; block[ 7] = tmp01; block[ 8] = tmp02; block[ 9] = tmp03; block[10] = tmp04; block[11] = tmp05; block[12] = tmp06; block[13] = tmp07; block[14] = tmp08; block[15] = tmp09; carry[ 0] = tmp10; carry[ 1] = tmp11; carry[ 2] = tmp12; carry[ 3] = tmp13; carry[ 4] = tmp14; carry[ 5] = tmp15; carry[ 6] = tmp16; break; case 7: block[ 7] |= tmp00; block[ 8] = tmp01; block[ 9] = tmp02; block[10] = tmp03; block[11] = tmp04; block[12] = tmp05; block[13] = tmp06; block[14] = tmp07; block[15] = tmp08; carry[ 0] = tmp09; carry[ 1] = tmp10; carry[ 2] = tmp11; carry[ 3] = tmp12; carry[ 4] = tmp13; carry[ 5] = tmp14; carry[ 6] = tmp15; carry[ 7] = tmp16; break; case 8: block[ 8] |= tmp00; block[ 9] = tmp01; block[10] = tmp02; block[11] = tmp03; block[12] = tmp04; block[13] = tmp05; block[14] = tmp06; block[15] = tmp07; carry[ 0] = tmp08; carry[ 1] = tmp09; carry[ 2] = tmp10; carry[ 3] = tmp11; carry[ 4] = tmp12; carry[ 5] = tmp13; carry[ 6] = tmp14; carry[ 7] = tmp15; carry[ 8] = tmp16; break; case 9: block[ 9] |= tmp00; block[10] = tmp01; block[11] = tmp02; block[12] = tmp03; block[13] = tmp04; block[14] = tmp05; block[15] = tmp06; carry[ 0] = tmp07; carry[ 1] = tmp08; carry[ 2] = tmp09; carry[ 3] = tmp10; carry[ 4] = tmp11; carry[ 5] = tmp12; carry[ 6] = tmp13; carry[ 7] = tmp14; carry[ 8] = tmp15; carry[ 9] = tmp16; break; case 10: block[10] |= tmp00; block[11] = tmp01; block[12] = tmp02; block[13] = tmp03; block[14] = tmp04; block[15] = tmp05; carry[ 0] = tmp06; carry[ 1] = tmp07; carry[ 2] = tmp08; carry[ 3] = tmp09; carry[ 4] = tmp10; carry[ 5] = tmp11; carry[ 6] = tmp12; carry[ 7] = tmp13; carry[ 8] = tmp14; carry[ 9] = tmp15; carry[10] = tmp16; break; case 11: block[11] |= tmp00; block[12] = tmp01; block[13] = tmp02; block[14] = tmp03; block[15] = tmp04; carry[ 0] = tmp05; carry[ 1] = tmp06; carry[ 2] = tmp07; carry[ 3] = tmp08; carry[ 4] = tmp09; carry[ 5] = tmp10; carry[ 6] = tmp11; carry[ 7] = tmp12; carry[ 8] = tmp13; carry[ 9] = tmp14; carry[10] = tmp15; carry[11] = tmp16; break; case 12: block[12] |= tmp00; block[13] = tmp01; block[14] = tmp02; block[15] = tmp03; carry[ 0] = tmp04; carry[ 1] = tmp05; carry[ 2] = tmp06; carry[ 3] = tmp07; carry[ 4] = tmp08; carry[ 5] = tmp09; carry[ 6] = tmp10; carry[ 7] = tmp11; carry[ 8] = tmp12; carry[ 9] = tmp13; carry[10] = tmp14; carry[11] = tmp15; carry[12] = tmp16; break; case 13: block[13] |= tmp00; block[14] = tmp01; block[15] = tmp02; carry[ 0] = tmp03; carry[ 1] = tmp04; carry[ 2] = tmp05; carry[ 3] = tmp06; carry[ 4] = tmp07; carry[ 5] = tmp08; carry[ 6] = tmp09; carry[ 7] = tmp10; carry[ 8] = tmp11; carry[ 9] = tmp12; carry[10] = tmp13; carry[11] = tmp14; carry[12] = tmp15; carry[13] = tmp16; break; case 14: block[14] |= tmp00; block[15] = tmp01; carry[ 0] = tmp02; carry[ 1] = tmp03; carry[ 2] = tmp04; carry[ 3] = tmp05; carry[ 4] = tmp06; carry[ 5] = tmp07; carry[ 6] = tmp08; carry[ 7] = tmp09; carry[ 8] = tmp10; carry[ 9] = tmp11; carry[10] = tmp12; carry[11] = tmp13; carry[12] = tmp14; carry[13] = tmp15; carry[14] = tmp16; break; case 15: block[15] |= tmp00; carry[ 0] = tmp01; carry[ 1] = tmp02; carry[ 2] = tmp03; carry[ 3] = tmp04; carry[ 4] = tmp05; carry[ 5] = tmp06; carry[ 6] = tmp07; carry[ 7] = tmp08; carry[ 8] = tmp09; carry[ 9] = tmp10; carry[10] = tmp11; carry[11] = tmp12; carry[12] = tmp13; carry[13] = tmp14; carry[14] = tmp15; carry[15] = tmp16; break; } } __kernel void m13800_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * shared */ __local u32 s_esalt[32]; for (u32 i = lid; i < 32; i += lsz) { s_esalt[i] = esalt_bufs[digests_offset].salt_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha256 */ const u32x pw_len2 = pw_len * 2; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); u32x w[16]; w[ 0] = swap32 (w0[0]); w[ 1] = swap32 (w0[1]); w[ 2] = swap32 (w0[2]); w[ 3] = swap32 (w0[3]); w[ 4] = swap32 (w1[0]); w[ 5] = swap32 (w1[1]); w[ 6] = swap32 (w1[2]); w[ 7] = swap32 (w1[3]); w[ 8] = swap32 (w2[0]); w[ 9] = swap32 (w2[1]); w[10] = swap32 (w2[2]); w[11] = swap32 (w2[3]); w[12] = swap32 (w3[0]); w[13] = swap32 (w3[1]); w[14] = swap32 (w3[2]); w[15] = swap32 (w3[3]); u32x carry[16]; carry[ 0] = s_esalt[ 0]; carry[ 1] = s_esalt[ 1]; carry[ 2] = s_esalt[ 2]; carry[ 3] = s_esalt[ 3]; carry[ 4] = s_esalt[ 4]; carry[ 5] = s_esalt[ 5]; carry[ 6] = s_esalt[ 6]; carry[ 7] = s_esalt[ 7]; carry[ 8] = s_esalt[ 8]; carry[ 9] = s_esalt[ 9]; carry[10] = s_esalt[10]; carry[11] = s_esalt[11]; carry[12] = s_esalt[12]; carry[13] = s_esalt[13]; carry[14] = s_esalt[14]; carry[15] = s_esalt[15]; // we can always use pw_len here, since we add exactly the hash buffer size memcat64c_be (w, pw_len2, carry); 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_transport_vector (w, digest); w[ 0] = carry[ 0]; w[ 1] = carry[ 1]; w[ 2] = carry[ 2]; w[ 3] = carry[ 3]; w[ 4] = carry[ 4]; w[ 5] = carry[ 5]; w[ 6] = carry[ 6]; w[ 7] = carry[ 7]; w[ 8] = carry[ 8]; w[ 9] = carry[ 9]; w[10] = carry[10]; w[11] = carry[11]; w[12] = carry[12]; w[13] = carry[13]; w[14] = carry[14]; w[15] = carry[15]; carry[ 0] = s_esalt[16]; carry[ 1] = s_esalt[17]; carry[ 2] = s_esalt[18]; carry[ 3] = s_esalt[19]; carry[ 4] = s_esalt[20]; carry[ 5] = s_esalt[21]; carry[ 6] = s_esalt[22]; carry[ 7] = s_esalt[23]; carry[ 8] = s_esalt[24]; carry[ 9] = s_esalt[25]; carry[10] = s_esalt[26]; carry[11] = s_esalt[27]; carry[12] = s_esalt[28]; carry[13] = s_esalt[29]; carry[14] = s_esalt[30]; carry[15] = s_esalt[31]; // we can always use pw_len here, since we add exactly the hash buffer size memcat64c_be (w, pw_len2, carry); sha256_transform_transport_vector (w, digest); w[ 0] = carry[ 0]; w[ 1] = carry[ 1]; w[ 2] = carry[ 2]; w[ 3] = carry[ 3]; w[ 4] = carry[ 4]; w[ 5] = carry[ 5]; w[ 6] = carry[ 6]; w[ 7] = carry[ 7]; w[ 8] = carry[ 8]; w[ 9] = carry[ 9]; w[10] = carry[10]; w[11] = carry[11]; w[12] = carry[12]; w[13] = carry[13]; w[14] = carry[14]; w[15] = carry[15]; // we can always use pw_len here, since we add exactly the hash buffer size append_0x80_4x4 (w + 0, w + 4, w + 8, w + 12, pw_len2 ^ 3); w[14] = 0; w[15] = (pw_len2 + 128) * 8; sha256_transform_transport_vector (w, digest); const u32x d = digest[DGST_R0]; const u32x h = digest[DGST_R1]; const u32x c = digest[DGST_R2]; const u32x g = digest[DGST_R3]; COMPARE_M_SIMD (d, h, c, g); } } __kernel void m13800_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13800_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13800_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * shared */ __local u32 s_esalt[32]; for (u32 i = lid; i < 32; i += lsz) { s_esalt[i] = esalt_bufs[digests_offset].salt_buf[i]; } 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha256 */ const u32x pw_len2 = pw_len * 2; make_utf16le (w1, w2, w3); make_utf16le (w0, w0, w1); u32x w[16]; w[ 0] = swap32 (w0[0]); w[ 1] = swap32 (w0[1]); w[ 2] = swap32 (w0[2]); w[ 3] = swap32 (w0[3]); w[ 4] = swap32 (w1[0]); w[ 5] = swap32 (w1[1]); w[ 6] = swap32 (w1[2]); w[ 7] = swap32 (w1[3]); w[ 8] = swap32 (w2[0]); w[ 9] = swap32 (w2[1]); w[10] = swap32 (w2[2]); w[11] = swap32 (w2[3]); w[12] = swap32 (w3[0]); w[13] = swap32 (w3[1]); w[14] = swap32 (w3[2]); w[15] = swap32 (w3[3]); u32x carry[16]; carry[ 0] = s_esalt[ 0]; carry[ 1] = s_esalt[ 1]; carry[ 2] = s_esalt[ 2]; carry[ 3] = s_esalt[ 3]; carry[ 4] = s_esalt[ 4]; carry[ 5] = s_esalt[ 5]; carry[ 6] = s_esalt[ 6]; carry[ 7] = s_esalt[ 7]; carry[ 8] = s_esalt[ 8]; carry[ 9] = s_esalt[ 9]; carry[10] = s_esalt[10]; carry[11] = s_esalt[11]; carry[12] = s_esalt[12]; carry[13] = s_esalt[13]; carry[14] = s_esalt[14]; carry[15] = s_esalt[15]; // we can always use pw_len here, since we add exactly the hash buffer size memcat64c_be (w, pw_len2, carry); 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_transport_vector (w, digest); w[ 0] = carry[ 0]; w[ 1] = carry[ 1]; w[ 2] = carry[ 2]; w[ 3] = carry[ 3]; w[ 4] = carry[ 4]; w[ 5] = carry[ 5]; w[ 6] = carry[ 6]; w[ 7] = carry[ 7]; w[ 8] = carry[ 8]; w[ 9] = carry[ 9]; w[10] = carry[10]; w[11] = carry[11]; w[12] = carry[12]; w[13] = carry[13]; w[14] = carry[14]; w[15] = carry[15]; carry[ 0] = s_esalt[16]; carry[ 1] = s_esalt[17]; carry[ 2] = s_esalt[18]; carry[ 3] = s_esalt[19]; carry[ 4] = s_esalt[20]; carry[ 5] = s_esalt[21]; carry[ 6] = s_esalt[22]; carry[ 7] = s_esalt[23]; carry[ 8] = s_esalt[24]; carry[ 9] = s_esalt[25]; carry[10] = s_esalt[26]; carry[11] = s_esalt[27]; carry[12] = s_esalt[28]; carry[13] = s_esalt[29]; carry[14] = s_esalt[30]; carry[15] = s_esalt[31]; // we can always use pw_len here, since we add exactly the hash buffer size memcat64c_be (w, pw_len2, carry); sha256_transform_transport_vector (w, digest); w[ 0] = carry[ 0]; w[ 1] = carry[ 1]; w[ 2] = carry[ 2]; w[ 3] = carry[ 3]; w[ 4] = carry[ 4]; w[ 5] = carry[ 5]; w[ 6] = carry[ 6]; w[ 7] = carry[ 7]; w[ 8] = carry[ 8]; w[ 9] = carry[ 9]; w[10] = carry[10]; w[11] = carry[11]; w[12] = carry[12]; w[13] = carry[13]; w[14] = carry[14]; w[15] = carry[15]; // we can always use pw_len here, since we add exactly the hash buffer size append_0x80_4x4 (w + 0, w + 4, w + 8, w + 12, pw_len2 ^ 3); w[14] = 0; w[15] = (pw_len2 + 128) * 8; sha256_transform_transport_vector (w, digest); const u32x d = digest[DGST_R0]; const u32x h = digest[DGST_R1]; const u32x c = digest[DGST_R2]; const u32x g = digest[DGST_R3]; COMPARE_S_SIMD (d, h, c, g); } } __kernel void m13800_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13800_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m13800_a1.cl000066400000000000000000000101531320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha256.cl" __kernel void m13800_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_utf16le_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha256_ctx_t ctx = ctx0; sha256_update_global_utf16le_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha256_update_global (&ctx, esalt_bufs[digests_offset].salt_buf, 128); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m13800_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ sha256_ctx_t ctx0; sha256_init (&ctx0); sha256_update_global_utf16le_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha256_ctx_t ctx = ctx0; sha256_update_global_utf16le_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha256_update_global (&ctx, esalt_bufs[digests_offset].salt_buf, 128); sha256_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m13800_a3-optimized.cl000066400000000000000000001062401320027462700200120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" void sha256_transform_transport_vector (const u32x w[16], u32x digest[8]) { sha256_transform_vector (w + 0, w + 4, w + 8, w + 12, digest); } void memcat64c_be (u32x block[16], const u32 offset, u32x carry[16]) { const u32 mod = offset & 3; const u32 div = offset / 4; u32x tmp00; u32x tmp01; u32x tmp02; u32x tmp03; u32x tmp04; u32x tmp05; u32x tmp06; u32x tmp07; u32x tmp08; u32x tmp09; u32x tmp10; u32x tmp11; u32x tmp12; u32x tmp13; u32x tmp14; u32x tmp15; u32x tmp16; #if defined IS_AMD || defined IS_GENERIC tmp00 = amd_bytealign ( 0, carry[ 0], offset); tmp01 = amd_bytealign (carry[ 0], carry[ 1], offset); tmp02 = amd_bytealign (carry[ 1], carry[ 2], offset); tmp03 = amd_bytealign (carry[ 2], carry[ 3], offset); tmp04 = amd_bytealign (carry[ 3], carry[ 4], offset); tmp05 = amd_bytealign (carry[ 4], carry[ 5], offset); tmp06 = amd_bytealign (carry[ 5], carry[ 6], offset); tmp07 = amd_bytealign (carry[ 6], carry[ 7], offset); tmp08 = amd_bytealign (carry[ 7], carry[ 8], offset); tmp09 = amd_bytealign (carry[ 8], carry[ 9], offset); tmp10 = amd_bytealign (carry[ 9], carry[10], offset); tmp11 = amd_bytealign (carry[10], carry[11], offset); tmp12 = amd_bytealign (carry[11], carry[12], offset); tmp13 = amd_bytealign (carry[12], carry[13], offset); tmp14 = amd_bytealign (carry[13], carry[14], offset); tmp15 = amd_bytealign (carry[14], carry[15], offset); tmp16 = amd_bytealign (carry[15], 0, offset); #endif #ifdef IS_NV const int selector = (0x76543210 >> ((offset & 3) * 4)) & 0xffff; tmp00 = __byte_perm (carry[ 0], 0, selector); tmp01 = __byte_perm (carry[ 1], carry[ 0], selector); tmp02 = __byte_perm (carry[ 2], carry[ 1], selector); tmp03 = __byte_perm (carry[ 3], carry[ 2], selector); tmp04 = __byte_perm (carry[ 4], carry[ 3], selector); tmp05 = __byte_perm (carry[ 5], carry[ 4], selector); tmp06 = __byte_perm (carry[ 6], carry[ 5], selector); tmp07 = __byte_perm (carry[ 7], carry[ 6], selector); tmp08 = __byte_perm (carry[ 8], carry[ 7], selector); tmp09 = __byte_perm (carry[ 9], carry[ 8], selector); tmp10 = __byte_perm (carry[10], carry[ 9], selector); tmp11 = __byte_perm (carry[11], carry[10], selector); tmp12 = __byte_perm (carry[12], carry[11], selector); tmp13 = __byte_perm (carry[13], carry[12], selector); tmp14 = __byte_perm (carry[14], carry[13], selector); tmp15 = __byte_perm (carry[15], carry[14], selector); tmp16 = __byte_perm ( 0, carry[15], selector); #endif carry[ 0] = 0; carry[ 1] = 0; carry[ 2] = 0; carry[ 3] = 0; carry[ 4] = 0; carry[ 5] = 0; carry[ 6] = 0; carry[ 7] = 0; carry[ 8] = 0; carry[ 9] = 0; carry[10] = 0; carry[11] = 0; carry[12] = 0; carry[13] = 0; carry[14] = 0; carry[15] = 0; switch (div) { case 0: block[ 0] |= tmp00; block[ 1] = tmp01; block[ 2] = tmp02; block[ 3] = tmp03; block[ 4] = tmp04; block[ 5] = tmp05; block[ 6] = tmp06; block[ 7] = tmp07; block[ 8] = tmp08; block[ 9] = tmp09; block[10] = tmp10; block[11] = tmp11; block[12] = tmp12; block[13] = tmp13; block[14] = tmp14; block[15] = tmp15; carry[ 0] = tmp16; break; case 1: block[ 1] |= tmp00; block[ 2] = tmp01; block[ 3] = tmp02; block[ 4] = tmp03; block[ 5] = tmp04; block[ 6] = tmp05; block[ 7] = tmp06; block[ 8] = tmp07; block[ 9] = tmp08; block[10] = tmp09; block[11] = tmp10; block[12] = tmp11; block[13] = tmp12; block[14] = tmp13; block[15] = tmp14; carry[ 0] = tmp15; carry[ 1] = tmp16; break; case 2: block[ 2] |= tmp00; block[ 3] = tmp01; block[ 4] = tmp02; block[ 5] = tmp03; block[ 6] = tmp04; block[ 7] = tmp05; block[ 8] = tmp06; block[ 9] = tmp07; block[10] = tmp08; block[11] = tmp09; block[12] = tmp10; block[13] = tmp11; block[14] = tmp12; block[15] = tmp13; carry[ 0] = tmp14; carry[ 1] = tmp15; carry[ 2] = tmp16; break; case 3: block[ 3] |= tmp00; block[ 4] = tmp01; block[ 5] = tmp02; block[ 6] = tmp03; block[ 7] = tmp04; block[ 8] = tmp05; block[ 9] = tmp06; block[10] = tmp07; block[11] = tmp08; block[12] = tmp09; block[13] = tmp10; block[14] = tmp11; block[15] = tmp12; carry[ 0] = tmp13; carry[ 1] = tmp14; carry[ 2] = tmp15; carry[ 3] = tmp16; break; case 4: block[ 4] |= tmp00; block[ 5] = tmp01; block[ 6] = tmp02; block[ 7] = tmp03; block[ 8] = tmp04; block[ 9] = tmp05; block[10] = tmp06; block[11] = tmp07; block[12] = tmp08; block[13] = tmp09; block[14] = tmp10; block[15] = tmp11; carry[ 0] = tmp12; carry[ 1] = tmp13; carry[ 2] = tmp14; carry[ 3] = tmp15; carry[ 4] = tmp16; break; case 5: block[ 5] |= tmp00; block[ 6] = tmp01; block[ 7] = tmp02; block[ 8] = tmp03; block[ 9] = tmp04; block[10] = tmp05; block[11] = tmp06; block[12] = tmp07; block[13] = tmp08; block[14] = tmp09; block[15] = tmp10; carry[ 0] = tmp11; carry[ 1] = tmp12; carry[ 2] = tmp13; carry[ 3] = tmp14; carry[ 4] = tmp15; carry[ 5] = tmp16; break; case 6: block[ 6] |= tmp00; block[ 7] = tmp01; block[ 8] = tmp02; block[ 9] = tmp03; block[10] = tmp04; block[11] = tmp05; block[12] = tmp06; block[13] = tmp07; block[14] = tmp08; block[15] = tmp09; carry[ 0] = tmp10; carry[ 1] = tmp11; carry[ 2] = tmp12; carry[ 3] = tmp13; carry[ 4] = tmp14; carry[ 5] = tmp15; carry[ 6] = tmp16; break; case 7: block[ 7] |= tmp00; block[ 8] = tmp01; block[ 9] = tmp02; block[10] = tmp03; block[11] = tmp04; block[12] = tmp05; block[13] = tmp06; block[14] = tmp07; block[15] = tmp08; carry[ 0] = tmp09; carry[ 1] = tmp10; carry[ 2] = tmp11; carry[ 3] = tmp12; carry[ 4] = tmp13; carry[ 5] = tmp14; carry[ 6] = tmp15; carry[ 7] = tmp16; break; case 8: block[ 8] |= tmp00; block[ 9] = tmp01; block[10] = tmp02; block[11] = tmp03; block[12] = tmp04; block[13] = tmp05; block[14] = tmp06; block[15] = tmp07; carry[ 0] = tmp08; carry[ 1] = tmp09; carry[ 2] = tmp10; carry[ 3] = tmp11; carry[ 4] = tmp12; carry[ 5] = tmp13; carry[ 6] = tmp14; carry[ 7] = tmp15; carry[ 8] = tmp16; break; case 9: block[ 9] |= tmp00; block[10] = tmp01; block[11] = tmp02; block[12] = tmp03; block[13] = tmp04; block[14] = tmp05; block[15] = tmp06; carry[ 0] = tmp07; carry[ 1] = tmp08; carry[ 2] = tmp09; carry[ 3] = tmp10; carry[ 4] = tmp11; carry[ 5] = tmp12; carry[ 6] = tmp13; carry[ 7] = tmp14; carry[ 8] = tmp15; carry[ 9] = tmp16; break; case 10: block[10] |= tmp00; block[11] = tmp01; block[12] = tmp02; block[13] = tmp03; block[14] = tmp04; block[15] = tmp05; carry[ 0] = tmp06; carry[ 1] = tmp07; carry[ 2] = tmp08; carry[ 3] = tmp09; carry[ 4] = tmp10; carry[ 5] = tmp11; carry[ 6] = tmp12; carry[ 7] = tmp13; carry[ 8] = tmp14; carry[ 9] = tmp15; carry[10] = tmp16; break; case 11: block[11] |= tmp00; block[12] = tmp01; block[13] = tmp02; block[14] = tmp03; block[15] = tmp04; carry[ 0] = tmp05; carry[ 1] = tmp06; carry[ 2] = tmp07; carry[ 3] = tmp08; carry[ 4] = tmp09; carry[ 5] = tmp10; carry[ 6] = tmp11; carry[ 7] = tmp12; carry[ 8] = tmp13; carry[ 9] = tmp14; carry[10] = tmp15; carry[11] = tmp16; break; case 12: block[12] |= tmp00; block[13] = tmp01; block[14] = tmp02; block[15] = tmp03; carry[ 0] = tmp04; carry[ 1] = tmp05; carry[ 2] = tmp06; carry[ 3] = tmp07; carry[ 4] = tmp08; carry[ 5] = tmp09; carry[ 6] = tmp10; carry[ 7] = tmp11; carry[ 8] = tmp12; carry[ 9] = tmp13; carry[10] = tmp14; carry[11] = tmp15; carry[12] = tmp16; break; case 13: block[13] |= tmp00; block[14] = tmp01; block[15] = tmp02; carry[ 0] = tmp03; carry[ 1] = tmp04; carry[ 2] = tmp05; carry[ 3] = tmp06; carry[ 4] = tmp07; carry[ 5] = tmp08; carry[ 6] = tmp09; carry[ 7] = tmp10; carry[ 8] = tmp11; carry[ 9] = tmp12; carry[10] = tmp13; carry[11] = tmp14; carry[12] = tmp15; carry[13] = tmp16; break; case 14: block[14] |= tmp00; block[15] = tmp01; carry[ 0] = tmp02; carry[ 1] = tmp03; carry[ 2] = tmp04; carry[ 3] = tmp05; carry[ 4] = tmp06; carry[ 5] = tmp07; carry[ 6] = tmp08; carry[ 7] = tmp09; carry[ 8] = tmp10; carry[ 9] = tmp11; carry[10] = tmp12; carry[11] = tmp13; carry[12] = tmp14; carry[13] = tmp15; carry[14] = tmp16; break; case 15: block[15] |= tmp00; carry[ 0] = tmp01; carry[ 1] = tmp02; carry[ 2] = tmp03; carry[ 3] = tmp04; carry[ 4] = tmp05; carry[ 5] = tmp06; carry[ 6] = tmp07; carry[ 7] = tmp08; carry[ 8] = tmp09; carry[ 9] = tmp10; carry[10] = tmp11; carry[11] = tmp12; carry[12] = tmp13; carry[13] = tmp14; carry[14] = tmp15; carry[15] = tmp16; break; } } void m13800m (__local u32 *s_esalt, u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * loop */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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 carry[16]; carry[ 0] = s_esalt[ 0]; carry[ 1] = s_esalt[ 1]; carry[ 2] = s_esalt[ 2]; carry[ 3] = s_esalt[ 3]; carry[ 4] = s_esalt[ 4]; carry[ 5] = s_esalt[ 5]; carry[ 6] = s_esalt[ 6]; carry[ 7] = s_esalt[ 7]; carry[ 8] = s_esalt[ 8]; carry[ 9] = s_esalt[ 9]; carry[10] = s_esalt[10]; carry[11] = s_esalt[11]; carry[12] = s_esalt[12]; carry[13] = s_esalt[13]; carry[14] = s_esalt[14]; carry[15] = s_esalt[15]; // we can always use pw_len here, since we add exactly the hash buffer size memcat64c_be (w_t, pw_len, carry); 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_transport_vector (w_t, digest); w_t[ 0] = carry[ 0]; w_t[ 1] = carry[ 1]; w_t[ 2] = carry[ 2]; w_t[ 3] = carry[ 3]; w_t[ 4] = carry[ 4]; w_t[ 5] = carry[ 5]; w_t[ 6] = carry[ 6]; w_t[ 7] = carry[ 7]; w_t[ 8] = carry[ 8]; w_t[ 9] = carry[ 9]; w_t[10] = carry[10]; w_t[11] = carry[11]; w_t[12] = carry[12]; w_t[13] = carry[13]; w_t[14] = carry[14]; w_t[15] = carry[15]; carry[ 0] = s_esalt[16]; carry[ 1] = s_esalt[17]; carry[ 2] = s_esalt[18]; carry[ 3] = s_esalt[19]; carry[ 4] = s_esalt[20]; carry[ 5] = s_esalt[21]; carry[ 6] = s_esalt[22]; carry[ 7] = s_esalt[23]; carry[ 8] = s_esalt[24]; carry[ 9] = s_esalt[25]; carry[10] = s_esalt[26]; carry[11] = s_esalt[27]; carry[12] = s_esalt[28]; carry[13] = s_esalt[29]; carry[14] = s_esalt[30]; carry[15] = s_esalt[31]; // we can always use pw_len here, since we add exactly the hash buffer size memcat64c_be (w_t, pw_len, carry); sha256_transform_transport_vector (w_t, digest); w_t[ 0] = carry[ 0]; w_t[ 1] = carry[ 1]; w_t[ 2] = carry[ 2]; w_t[ 3] = carry[ 3]; w_t[ 4] = carry[ 4]; w_t[ 5] = carry[ 5]; w_t[ 6] = carry[ 6]; w_t[ 7] = carry[ 7]; w_t[ 8] = carry[ 8]; w_t[ 9] = carry[ 9]; w_t[10] = carry[10]; w_t[11] = carry[11]; w_t[12] = carry[12]; w_t[13] = carry[13]; w_t[14] = carry[14]; w_t[15] = carry[15]; // we can always use pw_len here, since we add exactly the hash buffer size append_0x80_4x4 (w_t + 0, w_t + 4, w_t + 8, w_t + 12, pw_len ^ 3); w_t[14] = 0; w_t[15] = (pw_len + 128) * 8; sha256_transform_transport_vector (w_t, digest); const u32x d = digest[DGST_R0]; const u32x h = digest[DGST_R1]; const u32x c = digest[DGST_R2]; const u32x g = digest[DGST_R3]; COMPARE_M_SIMD (d, h, c, g); } } void m13800s (__local u32 *s_esalt, u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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 carry[16]; carry[ 0] = s_esalt[ 0]; carry[ 1] = s_esalt[ 1]; carry[ 2] = s_esalt[ 2]; carry[ 3] = s_esalt[ 3]; carry[ 4] = s_esalt[ 4]; carry[ 5] = s_esalt[ 5]; carry[ 6] = s_esalt[ 6]; carry[ 7] = s_esalt[ 7]; carry[ 8] = s_esalt[ 8]; carry[ 9] = s_esalt[ 9]; carry[10] = s_esalt[10]; carry[11] = s_esalt[11]; carry[12] = s_esalt[12]; carry[13] = s_esalt[13]; carry[14] = s_esalt[14]; carry[15] = s_esalt[15]; // we can always use pw_len here, since we add exactly the hash buffer size memcat64c_be (w_t, pw_len, carry); 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_transport_vector (w_t, digest); w_t[ 0] = carry[ 0]; w_t[ 1] = carry[ 1]; w_t[ 2] = carry[ 2]; w_t[ 3] = carry[ 3]; w_t[ 4] = carry[ 4]; w_t[ 5] = carry[ 5]; w_t[ 6] = carry[ 6]; w_t[ 7] = carry[ 7]; w_t[ 8] = carry[ 8]; w_t[ 9] = carry[ 9]; w_t[10] = carry[10]; w_t[11] = carry[11]; w_t[12] = carry[12]; w_t[13] = carry[13]; w_t[14] = carry[14]; w_t[15] = carry[15]; carry[ 0] = s_esalt[16]; carry[ 1] = s_esalt[17]; carry[ 2] = s_esalt[18]; carry[ 3] = s_esalt[19]; carry[ 4] = s_esalt[20]; carry[ 5] = s_esalt[21]; carry[ 6] = s_esalt[22]; carry[ 7] = s_esalt[23]; carry[ 8] = s_esalt[24]; carry[ 9] = s_esalt[25]; carry[10] = s_esalt[26]; carry[11] = s_esalt[27]; carry[12] = s_esalt[28]; carry[13] = s_esalt[29]; carry[14] = s_esalt[30]; carry[15] = s_esalt[31]; // we can always use pw_len here, since we add exactly the hash buffer size memcat64c_be (w_t, pw_len, carry); sha256_transform_transport_vector (w_t, digest); w_t[ 0] = carry[ 0]; w_t[ 1] = carry[ 1]; w_t[ 2] = carry[ 2]; w_t[ 3] = carry[ 3]; w_t[ 4] = carry[ 4]; w_t[ 5] = carry[ 5]; w_t[ 6] = carry[ 6]; w_t[ 7] = carry[ 7]; w_t[ 8] = carry[ 8]; w_t[ 9] = carry[ 9]; w_t[10] = carry[10]; w_t[11] = carry[11]; w_t[12] = carry[12]; w_t[13] = carry[13]; w_t[14] = carry[14]; w_t[15] = carry[15]; // we can always use pw_len here, since we add exactly the hash buffer size append_0x80_4x4 (w_t + 0, w_t + 4, w_t + 8, w_t + 12, pw_len ^ 3); w_t[14] = 0; w_t[15] = (pw_len + 128) * 8; sha256_transform_transport_vector (w_t, digest); const u32x d = digest[DGST_R0]; const u32x h = digest[DGST_R1]; const u32x c = digest[DGST_R2]; const u32x g = digest[DGST_R3]; COMPARE_S_SIMD (d, h, c, g); } } __kernel void m13800_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * base */ u32 w[16]; w[ 0] = 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; /** * shared */ __local u32 s_esalt[32]; for (u32 i = lid; i < 32; i += lsz) { s_esalt[i] = esalt_bufs[digests_offset].salt_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m13800m (s_esalt, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13800_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * base */ u32 w[16]; w[ 0] = 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; /** * shared */ __local u32 s_esalt[32]; for (u32 i = lid; i < 32; i += lsz) { s_esalt[i] = esalt_bufs[digests_offset].salt_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m13800m (s_esalt, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13800_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * base */ u32 w[16]; w[ 0] = 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 */ __local u32 s_esalt[32]; for (u32 i = lid; i < 32; i += lsz) { s_esalt[i] = esalt_bufs[digests_offset].salt_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m13800m (s_esalt, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13800_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * base */ u32 w[16]; w[ 0] = 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; /** * shared */ __local u32 s_esalt[32]; for (u32 i = lid; i < 32; i += lsz) { s_esalt[i] = esalt_bufs[digests_offset].salt_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m13800s (s_esalt, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13800_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * base */ u32 w[16]; w[ 0] = 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; /** * shared */ __local u32 s_esalt[32]; for (u32 i = lid; i < 32; i += lsz) { s_esalt[i] = esalt_bufs[digests_offset].salt_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m13800s (s_esalt, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m13800_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * base */ u32 w[16]; w[ 0] = 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 */ __local u32 s_esalt[32]; for (u32 i = lid; i < 32; i += lsz) { s_esalt[i] = esalt_bufs[digests_offset].salt_buf[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ m13800s (s_esalt, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m13800_a3.cl000066400000000000000000000113371320027462700160120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" __kernel void m13800_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = 128; u32x s[32]; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = esalt_bufs[digests_offset].salt_buf[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha256_ctx_vector_t ctx; sha256_init_vector (&ctx); sha256_update_vector_utf16beN (&ctx, w, pw_len); sha256_update_vector (&ctx, s, salt_len); sha256_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m13800_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const win8phone_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = 128; u32x s[32]; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = esalt_bufs[digests_offset].salt_buf[idx]; } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha256_ctx_vector_t ctx; sha256_init_vector (&ctx); sha256_update_vector_utf16beN (&ctx, w, pw_len); sha256_update_vector (&ctx, s, salt_len); sha256_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m13900_a0-optimized.cl000066400000000000000000000456451320027462700200230ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m13900_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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[3]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[2]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * SHA1($pass) */ w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = 0; w3[3] = out_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_vector (w0, w1, w2, w3, digest); /** * SHA1($salt.SHA1($pass)) */ 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[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0x80000000; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; switch_buffer_by_offset_be (w0, w1, w2, w3, 9); w0[0] |= salt_buf0[0]; w0[1] |= salt_buf0[1]; w0[2] |= salt_buf0[2]; w3[3] = 49 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (w0, w1, w2, w3, digest); /** * SHA1($salt.SHA1($salt.SHA1($pass))) */ a = digest[0]; b = digest[1]; c = digest[2]; d = digest[3]; e = digest[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0x80000000; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; switch_buffer_by_offset_be (w0, w1, w2, w3, 9); w0[0] |= salt_buf0[0]; w0[1] |= salt_buf0[1]; w0[2] |= salt_buf0[2]; w3[3] = 49 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (w0, w1, w2, w3, digest); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m13900_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13900_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13900_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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[3]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[2]); 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_0x80_2x4_VV (w0, w1, out_len); /** * SHA1($pass) */ w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = 0; w3[3] = out_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_vector (w0, w1, w2, w3, digest); /** * SHA1($salt.SHA1($pass)) */ 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[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0x80000000; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; switch_buffer_by_offset_be (w0, w1, w2, w3, 9); w0[0] |= salt_buf0[0]; w0[1] |= salt_buf0[1]; w0[2] |= salt_buf0[2]; w3[3] = 49 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (w0, w1, w2, w3, digest); /** * SHA1($salt.SHA1($salt.SHA1($pass))) */ a = digest[0]; b = digest[1]; c = digest[2]; d = digest[3]; e = digest[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0x80000000; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; switch_buffer_by_offset_be (w0, w1, w2, w3, 9); w0[0] |= salt_buf0[0]; w0[1] |= salt_buf0[1]; w0[2] |= salt_buf0[2]; w3[3] = 49 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (w0, w1, w2, w3, digest); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m13900_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13900_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m13900_a0.cl000066400000000000000000000272551320027462700160160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m13900_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx1; sha1_init (&ctx1); sha1_update_swap (&ctx1, tmp.i, tmp.pw_len); sha1_final (&ctx1); u32 a = ctx1.h[0]; u32 b = ctx1.h[1]; u32 c = ctx1.h[2]; u32 d = ctx1.h[3]; u32 e = ctx1.h[4]; sha1_ctx_t ctx2 = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx2, w0, w1, w2, w3, 40); sha1_final (&ctx2); a = ctx2.h[0]; b = ctx2.h[1]; c = ctx2.h[2]; d = ctx2.h[3]; e = ctx2.h[4]; sha1_ctx_t ctx = ctx0; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx, w0, w1, w2, w3, 40); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m13900_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx1; sha1_init (&ctx1); sha1_update_swap (&ctx1, tmp.i, tmp.pw_len); sha1_final (&ctx1); u32 a = ctx1.h[0]; u32 b = ctx1.h[1]; u32 c = ctx1.h[2]; u32 d = ctx1.h[3]; u32 e = ctx1.h[4]; sha1_ctx_t ctx2 = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx2, w0, w1, w2, w3, 40); sha1_final (&ctx2); a = ctx2.h[0]; b = ctx2.h[1]; c = ctx2.h[2]; d = ctx2.h[3]; e = ctx2.h[4]; sha1_ctx_t ctx = ctx0; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx, w0, w1, w2, w3, 40); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m13900_a1-optimized.cl000066400000000000000000000542341320027462700200160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m13900_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[3]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[2]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * SHA1($pass) */ w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = 0; w3[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_vector (w0, w1, w2, w3, digest); /** * SHA1($salt.SHA1($pass)) */ 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[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0x80000000; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; switch_buffer_by_offset_be (w0, w1, w2, w3, 9); w0[0] |= salt_buf0[0]; w0[1] |= salt_buf0[1]; w0[2] |= salt_buf0[2]; w3[3] = 49 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (w0, w1, w2, w3, digest); /** * SHA1($salt.SHA1($salt.SHA1($pass))) */ a = digest[0]; b = digest[1]; c = digest[2]; d = digest[3]; e = digest[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0x80000000; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; switch_buffer_by_offset_be (w0, w1, w2, w3, 9); w0[0] |= salt_buf0[0]; w0[1] |= salt_buf0[1]; w0[2] |= salt_buf0[2]; w3[3] = 49 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (w0, w1, w2, w3, digest); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m13900_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13900_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13900_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[3]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[2]); 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * SHA1($pass) */ w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[3]); w2[0] = swap32 (w2[0]); w2[1] = swap32 (w2[1]); w2[2] = swap32 (w2[2]); w2[3] = swap32 (w2[3]); w3[0] = swap32 (w3[0]); w3[1] = swap32 (w3[1]); w3[2] = 0; w3[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_vector (w0, w1, w2, w3, digest); /** * SHA1($salt.SHA1($pass)) */ 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[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0x80000000; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; switch_buffer_by_offset_be (w0, w1, w2, w3, 9); w0[0] |= salt_buf0[0]; w0[1] |= salt_buf0[1]; w0[2] |= salt_buf0[2]; w3[3] = 49 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (w0, w1, w2, w3, digest); /** * SHA1($salt.SHA1($salt.SHA1($pass))) */ a = digest[0]; b = digest[1]; c = digest[2]; d = digest[3]; e = digest[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0x80000000; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; switch_buffer_by_offset_be (w0, w1, w2, w3, 9); w0[0] |= salt_buf0[0]; w0[1] |= salt_buf0[1]; w0[2] |= salt_buf0[2]; w3[3] = 49 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (w0, w1, w2, w3, digest); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m13900_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m13900_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m13900_a1.cl000066400000000000000000000272121320027462700160100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m13900_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_ctx_t ctx1l; sha1_init (&ctx1l); sha1_update_global_swap (&ctx1l, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1 = ctx1l; sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx1); u32 a = ctx1.h[0]; u32 b = ctx1.h[1]; u32 c = ctx1.h[2]; u32 d = ctx1.h[3]; u32 e = ctx1.h[4]; sha1_ctx_t ctx2 = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx2, w0, w1, w2, w3, 40); sha1_final (&ctx2); a = ctx2.h[0]; b = ctx2.h[1]; c = ctx2.h[2]; d = ctx2.h[3]; e = ctx2.h[4]; sha1_ctx_t ctx = ctx0; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx, w0, w1, w2, w3, 40); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m13900_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); sha1_ctx_t ctx1l; sha1_init (&ctx1l); sha1_update_global_swap (&ctx1l, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1 = ctx1l; sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_final (&ctx1); u32 a = ctx1.h[0]; u32 b = ctx1.h[1]; u32 c = ctx1.h[2]; u32 d = ctx1.h[3]; u32 e = ctx1.h[4]; sha1_ctx_t ctx2 = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx2, w0, w1, w2, w3, 40); sha1_final (&ctx2); a = ctx2.h[0]; b = ctx2.h[1]; c = ctx2.h[2]; d = ctx2.h[3]; e = ctx2.h[4]; sha1_ctx_t ctx = ctx0; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx, w0, w1, w2, w3, 40); sha1_final (&ctx); const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m13900_a3-optimized.cl000066400000000000000000000704711320027462700200210ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void m13900m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[3]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[2]); const u32 salt_len = salt_bufs[salt_pos].salt_len; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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] = pw_len * 8; /** * SHA1($pass) */ 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_vector (w0_t, w1_t, w2_t, w3_t, digest); /** * SHA1($salt.SHA1($pass)) */ 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] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0_t[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0_t[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0_t[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1_t[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1_t[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1_t[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1_t[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2_t[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2_t[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2_t[2] = 0x80000000; w2_t[3] = 0; w3_t[0] = 0; w3_t[1] = 0; w3_t[2] = 0; w3_t[3] = 0; switch_buffer_by_offset_be (w0_t, w1_t, w2_t, w3_t, 9); w0_t[0] |= salt_buf0[0]; w0_t[1] |= salt_buf0[1]; w0_t[2] |= salt_buf0[2]; w3_t[3] = 49 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (w0_t, w1_t, w2_t, w3_t, digest); /** * SHA1($salt.SHA1($salt.SHA1($pass))) */ a = digest[0]; b = digest[1]; c = digest[2]; d = digest[3]; e = digest[4]; w0_t[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0_t[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0_t[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0_t[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1_t[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1_t[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1_t[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1_t[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2_t[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2_t[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2_t[2] = 0x80000000; w2_t[3] = 0; w3_t[0] = 0; w3_t[1] = 0; w3_t[2] = 0; w3_t[3] = 0; switch_buffer_by_offset_be (w0_t, w1_t, w2_t, w3_t, 9); w0_t[0] |= salt_buf0[0]; w0_t[1] |= salt_buf0[1]; w0_t[2] |= salt_buf0[2]; w3_t[3] = 49 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (w0_t, w1_t, w2_t, w3_t, digest); COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } void m13900s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); salt_buf2[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 8]); salt_buf2[1] = swap32_S (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 */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; w0_t[0] = w0lr; 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] = pw_len * 8; /** * SHA1($pass) */ 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_vector (w0_t, w1_t, w2_t, w3_t, digest); /** * SHA1($salt.SHA1($pass)) */ 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] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0_t[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0_t[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0_t[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1_t[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1_t[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1_t[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1_t[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2_t[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2_t[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2_t[2] = 0x80000000; w2_t[3] = 0; w3_t[0] = 0; w3_t[1] = 0; w3_t[2] = 0; w3_t[3] = 0; switch_buffer_by_offset_be (w0_t, w1_t, w2_t, w3_t, 9); w0_t[0] |= salt_buf0[0]; w0_t[1] |= salt_buf0[1]; w0_t[2] |= salt_buf0[2]; w3_t[3] = 49 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (w0_t, w1_t, w2_t, w3_t, digest); /** * SHA1($salt.SHA1($salt.SHA1($pass))) */ a = digest[0]; b = digest[1]; c = digest[2]; d = digest[3]; e = digest[4]; w0_t[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0_t[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0_t[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0_t[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1_t[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1_t[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1_t[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1_t[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2_t[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2_t[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2_t[2] = 0x80000000; w2_t[3] = 0; w3_t[0] = 0; w3_t[1] = 0; w3_t[2] = 0; w3_t[3] = 0; switch_buffer_by_offset_be (w0_t, w1_t, w2_t, w3_t, 9); w0_t[0] |= salt_buf0[0]; w0_t[1] |= salt_buf0[1]; w0_t[2] |= salt_buf0[2]; w3_t[3] = 49 * 8; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (w0_t, w1_t, w2_t, w3_t, digest); COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } } __kernel void m13900_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ m13900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m13900_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ m13900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m13900_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ m13900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m13900_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ m13900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m13900_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ m13900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m13900_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ m13900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } hashcat-4.0.1/OpenCL/m13900_a3.cl000066400000000000000000000304221320027462700160070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m13900_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; sha1_ctx_vector_t ctx1; sha1_init_vector (&ctx1); sha1_update_vector (&ctx1, w, pw_len); sha1_final_vector (&ctx1); u32x a = ctx1.h[0]; u32x b = ctx1.h[1]; u32x c = ctx1.h[2]; u32x d = ctx1.h[3]; u32x e = ctx1.h[4]; sha1_ctx_vector_t ctx2; sha1_init_vector_from_scalar (&ctx2, &ctx0); u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_vector_64 (&ctx2, w0, w1, w2, w3, 40); sha1_final_vector (&ctx2); a = ctx2.h[0]; b = ctx2.h[1]; c = ctx2.h[2]; d = ctx2.h[3]; e = ctx2.h[4]; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_vector_64 (&ctx, w0, w1, w2, w3, 40); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m13900_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; sha1_ctx_vector_t ctx1; sha1_init_vector (&ctx1); sha1_update_vector (&ctx1, w, pw_len); sha1_final_vector (&ctx1); u32x a = ctx1.h[0]; u32x b = ctx1.h[1]; u32x c = ctx1.h[2]; u32x d = ctx1.h[3]; u32x e = ctx1.h[4]; sha1_ctx_vector_t ctx2; sha1_init_vector_from_scalar (&ctx2, &ctx0); u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_vector_64 (&ctx2, w0, w1, w2, w3, 40); sha1_final_vector (&ctx2); a = ctx2.h[0]; b = ctx2.h[1]; c = ctx2.h[2]; d = ctx2.h[3]; e = ctx2.h[4]; sha1_ctx_vector_t ctx; sha1_init_vector_from_scalar (&ctx, &ctx0); w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_vector_64 (&ctx, w0, w1, w2, w3, 40); sha1_final_vector (&ctx); const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m14000_a0.cl000066400000000000000000000624121320027462700160000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #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 u32a 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif #if VECT_SIZE == 1 #define BOX1(i,S) (S)[(i)] #elif VECT_SIZE == 2 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1]) #elif VECT_SIZE == 4 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) #elif VECT_SIZE == 8 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7]) #elif VECT_SIZE == 16 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7], (S)[(i).s8], (S)[(i).s9], (S)[(i).sa], (S)[(i).sb], (S)[(i).sc], (S)[(i).sd], (S)[(i).se], (S)[(i).sf]) #endif void _des_crypt_encrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 (*s_SPtrans)[64]) { u32 r = rotl32_S (data[0], 3u); u32 l = rotl32_S (data[1], 3u); u32 tt; #ifdef _unroll #pragma unroll #endif for (u32 i = 0; i < 16; i += 2) { u32 u; u32 t; u = Kc[i + 0] ^ r; t = Kd[i + 0] ^ rotl32_S (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); u = Kc[i + 1] ^ l; t = Kd[i + 1] ^ rotl32_S (l, 28u); r ^= 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); } iv[0] = rotl32_S (l, 29u); iv[1] = rotl32_S (r, 29u); } void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 (*s_skb)[64]) { u32 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; #ifdef _unroll #pragma unroll #endif 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 u32 c00 = (c >> 0) & 0x0000003f; const u32 c06 = (c >> 6) & 0x00383003; const u32 c07 = (c >> 7) & 0x0000003c; const u32 c13 = (c >> 13) & 0x0000060f; const u32 c20 = (c >> 20) & 0x00000001; u32 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 u32 d00 = (d >> 0) & 0x00003c3f; const u32 d07 = (d >> 7) & 0x00003f03; const u32 d21 = (d >> 21) & 0x0000000f; const u32 d22 = (d >> 22) & 0x00000030; u32 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)); Kc[i] = rotl32_S (Kc[i], 2u); Kd[i] = rotl32_S (Kd[i], 2u); } } __kernel void m14000_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = 0; pw_buf0[3] = 0; 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[2]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; /** * main */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32 w0[4] = { 0 }; u32 w1[4] = { 0 }; u32 w2[4] = { 0 }; u32 w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); const u32 c = w0[0]; const u32 d = w0[1]; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32 data[2]; data[0] = salt_buf0[0]; data[1] = salt_buf0[1]; u32 iv[2]; _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); u32 z = 0; COMPARE_M_SIMD (iv[0], iv[1], z, z); } } __kernel void m14000_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = 0; pw_buf0[3] = 0; 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[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], 0, 0 }; /** * main */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32 w0[4] = { 0 }; u32 w1[4] = { 0 }; u32 w2[4] = { 0 }; u32 w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); const u32 c = w0[0]; const u32 d = w0[1]; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32 data[2]; data[0] = salt_buf0[0]; data[1] = salt_buf0[1]; u32 iv[2]; _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); u32 z = 0; COMPARE_S_SIMD (iv[0], iv[1], z, z); } } hashcat-4.0.1/OpenCL/m14000_a1.cl000066400000000000000000000666641320027462700160160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif #if VECT_SIZE == 1 #define BOX1(i,S) (S)[(i)] #elif VECT_SIZE == 2 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1]) #elif VECT_SIZE == 4 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) #elif VECT_SIZE == 8 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7]) #elif VECT_SIZE == 16 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7], (S)[(i).s8], (S)[(i).s9], (S)[(i).sa], (S)[(i).sb], (S)[(i).sc], (S)[(i).sd], (S)[(i).se], (S)[(i).sf]) #endif void _des_crypt_encrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 (*s_SPtrans)[64]) { u32 r = rotl32_S (data[0], 3u); u32 l = rotl32_S (data[1], 3u); u32 tt; #ifdef _unroll #pragma unroll #endif for (u32 i = 0; i < 16; i += 2) { u32 u; u32 t; u = Kc[i + 0] ^ r; t = Kd[i + 0] ^ rotl32_S (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); u = Kc[i + 1] ^ l; t = Kd[i + 1] ^ rotl32_S (l, 28u); r ^= 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); } iv[0] = rotl32_S (l, 29u); iv[1] = rotl32_S (r, 29u); } void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 (*s_skb)[64]) { u32 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; #ifdef _unroll #pragma unroll #endif 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 u32 c00 = (c >> 0) & 0x0000003f; const u32 c06 = (c >> 6) & 0x00383003; const u32 c07 = (c >> 7) & 0x0000003c; const u32 c13 = (c >> 13) & 0x0000060f; const u32 c20 = (c >> 20) & 0x00000001; u32 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 u32 d00 = (d >> 0) & 0x00003c3f; const u32 d07 = (d >> 7) & 0x00003f03; const u32 d21 = (d >> 21) & 0x0000000f; const u32 d22 = (d >> 22) & 0x00000030; u32 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)); Kc[i] = rotl32_S (Kc[i], 2u); Kd[i] = rotl32_S (Kd[i], 2u); } } __kernel void m14000_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = 0; pw_buf0[3] = 0; pw_buf1[0] = 0; pw_buf1[1] = 0; pw_buf1[2] = 0; pw_buf1[3] = 0; const u32 pw_l_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]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32 pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32 wordl0[4] = { 0 }; u32 wordl1[4] = { 0 }; u32 wordl2[4] = { 0 }; u32 wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32 wordr0[4] = { 0 }; u32 wordr1[4] = { 0 }; u32 wordr2[4] = { 0 }; u32 wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32 w0[2]; w0[0] = wordl0[0] | wordr0[0]; w0[1] = wordl0[1] | wordr0[1]; const u32 c = w0[0]; const u32 d = w0[1]; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32 data[2]; data[0] = salt_buf0[0]; data[1] = salt_buf0[1]; u32 iv[2]; _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); u32 z = 0; COMPARE_M_SIMD (iv[0], iv[1], z, z); } } __kernel void m14000_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = 0; pw_buf0[3] = 0; pw_buf1[0] = 0; pw_buf1[1] = 0; pw_buf1[2] = 0; pw_buf1[3] = 0; const u32 pw_l_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]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_buf[digests_offset].digest_buf[DGST_R1], 0, 0 }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32 pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32 wordl0[4] = { 0 }; u32 wordl1[4] = { 0 }; u32 wordl2[4] = { 0 }; u32 wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32 wordr0[4] = { 0 }; u32 wordr1[4] = { 0 }; u32 wordr2[4] = { 0 }; u32 wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32 w0[2]; w0[0] = wordl0[0] | wordr0[0]; w0[1] = wordl0[1] | wordr0[1]; const u32 c = (w0[0]); const u32 d = (w0[1]); u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32 data[2]; data[0] = salt_buf0[0]; data[1] = salt_buf0[1]; u32 iv[2]; _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); u32 z = 0; COMPARE_S_SIMD (iv[0], iv[1], z, z); } } hashcat-4.0.1/OpenCL/m14000_a3.cl000066400000000000000000003265121320027462700160070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT * NOTE........: sboxes for maxwell were taken from DeepLearningJohnDoe, license below * : sboxes for others were takes fron JtR, license below */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #define COMPARE_S "inc_comp_single_bs.cl" #define COMPARE_M "inc_comp_multi_bs.cl" #ifdef IS_NV #define KXX_DECL #endif #ifdef IS_AMD #define KXX_DECL #endif #ifdef IS_GENERIC #define KXX_DECL #endif #ifdef IS_NV #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 volatile ("lop3.b32 %0, %1, %2, %3, "#e";" : "=r"(a): "r"(b), "r"(c), "r"(d)); 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; } 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; } 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; } 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; } 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; } 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; } 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; } 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 */ 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; } 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; } 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; } 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; } 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; } 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; } 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; } 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 #endif #if defined IS_AMD || defined IS_GENERIC /* * 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 */ 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; } 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; } 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; } 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; } 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; } 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; } 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; } 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; } 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; #ifdef _unroll #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); } } 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); } void m14000m (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bs_word_t *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 salt0 = salt_bufs[salt_pos].salt_buf_pc[0]; const u32 salt1 = salt_bufs[salt_pos].salt_buf_pc[1]; // salt1 first, because this is a 64 bit value actually #define d00 (((salt1 >> 0) & 1) ? -1 : 0) #define d01 (((salt1 >> 1) & 1) ? -1 : 0) #define d02 (((salt1 >> 2) & 1) ? -1 : 0) #define d03 (((salt1 >> 3) & 1) ? -1 : 0) #define d04 (((salt1 >> 4) & 1) ? -1 : 0) #define d05 (((salt1 >> 5) & 1) ? -1 : 0) #define d06 (((salt1 >> 6) & 1) ? -1 : 0) #define d07 (((salt1 >> 7) & 1) ? -1 : 0) #define d08 (((salt1 >> 8) & 1) ? -1 : 0) #define d09 (((salt1 >> 9) & 1) ? -1 : 0) #define d10 (((salt1 >> 10) & 1) ? -1 : 0) #define d11 (((salt1 >> 11) & 1) ? -1 : 0) #define d12 (((salt1 >> 12) & 1) ? -1 : 0) #define d13 (((salt1 >> 13) & 1) ? -1 : 0) #define d14 (((salt1 >> 14) & 1) ? -1 : 0) #define d15 (((salt1 >> 15) & 1) ? -1 : 0) #define d16 (((salt1 >> 16) & 1) ? -1 : 0) #define d17 (((salt1 >> 17) & 1) ? -1 : 0) #define d18 (((salt1 >> 18) & 1) ? -1 : 0) #define d19 (((salt1 >> 19) & 1) ? -1 : 0) #define d20 (((salt1 >> 20) & 1) ? -1 : 0) #define d21 (((salt1 >> 21) & 1) ? -1 : 0) #define d22 (((salt1 >> 22) & 1) ? -1 : 0) #define d23 (((salt1 >> 23) & 1) ? -1 : 0) #define d24 (((salt1 >> 24) & 1) ? -1 : 0) #define d25 (((salt1 >> 25) & 1) ? -1 : 0) #define d26 (((salt1 >> 26) & 1) ? -1 : 0) #define d27 (((salt1 >> 27) & 1) ? -1 : 0) #define d28 (((salt1 >> 28) & 1) ? -1 : 0) #define d29 (((salt1 >> 29) & 1) ? -1 : 0) #define d30 (((salt1 >> 30) & 1) ? -1 : 0) #define d31 (((salt1 >> 31) & 1) ? -1 : 0) #define d32 (((salt0 >> 0) & 1) ? -1 : 0) #define d33 (((salt0 >> 1) & 1) ? -1 : 0) #define d34 (((salt0 >> 2) & 1) ? -1 : 0) #define d35 (((salt0 >> 3) & 1) ? -1 : 0) #define d36 (((salt0 >> 4) & 1) ? -1 : 0) #define d37 (((salt0 >> 5) & 1) ? -1 : 0) #define d38 (((salt0 >> 6) & 1) ? -1 : 0) #define d39 (((salt0 >> 7) & 1) ? -1 : 0) #define d40 (((salt0 >> 8) & 1) ? -1 : 0) #define d41 (((salt0 >> 9) & 1) ? -1 : 0) #define d42 (((salt0 >> 10) & 1) ? -1 : 0) #define d43 (((salt0 >> 11) & 1) ? -1 : 0) #define d44 (((salt0 >> 12) & 1) ? -1 : 0) #define d45 (((salt0 >> 13) & 1) ? -1 : 0) #define d46 (((salt0 >> 14) & 1) ? -1 : 0) #define d47 (((salt0 >> 15) & 1) ? -1 : 0) #define d48 (((salt0 >> 16) & 1) ? -1 : 0) #define d49 (((salt0 >> 17) & 1) ? -1 : 0) #define d50 (((salt0 >> 18) & 1) ? -1 : 0) #define d51 (((salt0 >> 19) & 1) ? -1 : 0) #define d52 (((salt0 >> 20) & 1) ? -1 : 0) #define d53 (((salt0 >> 21) & 1) ? -1 : 0) #define d54 (((salt0 >> 22) & 1) ? -1 : 0) #define d55 (((salt0 >> 23) & 1) ? -1 : 0) #define d56 (((salt0 >> 24) & 1) ? -1 : 0) #define d57 (((salt0 >> 25) & 1) ? -1 : 0) #define d58 (((salt0 >> 26) & 1) ? -1 : 0) #define d59 (((salt0 >> 27) & 1) ? -1 : 0) #define d60 (((salt0 >> 28) & 1) ? -1 : 0) #define d61 (((salt0 >> 29) & 1) ? -1 : 0) #define d62 (((salt0 >> 30) & 1) ? -1 : 0) #define d63 (((salt0 >> 31) & 1) ? -1 : 0) u32 D00 = d00; u32 D01 = d01; u32 D02 = d02; u32 D03 = d03; u32 D04 = d04; u32 D05 = d05; u32 D06 = d06; u32 D07 = d07; u32 D08 = d08; u32 D09 = d09; u32 D10 = d10; u32 D11 = d11; u32 D12 = d12; u32 D13 = d13; u32 D14 = d14; u32 D15 = d15; u32 D16 = d16; u32 D17 = d17; u32 D18 = d18; u32 D19 = d19; u32 D20 = d20; u32 D21 = d21; u32 D22 = d22; u32 D23 = d23; u32 D24 = d24; u32 D25 = d25; u32 D26 = d26; u32 D27 = d27; u32 D28 = d28; u32 D29 = d29; u32 D30 = d30; u32 D31 = d31; u32 D32 = d32; u32 D33 = d33; u32 D34 = d34; u32 D35 = d35; u32 D36 = d36; u32 D37 = d37; u32 D38 = d38; u32 D39 = d39; u32 D40 = d40; u32 D41 = d41; u32 D42 = d42; u32 D43 = d43; u32 D44 = d44; u32 D45 = d45; u32 D46 = d46; u32 D47 = d47; u32 D48 = d48; u32 D49 = d49; u32 D50 = d50; u32 D51 = d51; u32 D52 = d52; u32 D53 = d53; u32 D54 = d54; u32 D55 = d55; u32 D56 = d56; u32 D57 = d57; u32 D58 = d58; u32 D59 = d59; u32 D60 = d60; u32 D61 = d61; u32 D62 = d62; u32 D63 = d63; /** * digest */ const u32 s0 = digests_buf[0].digest_buf[0]; const u32 s1 = digests_buf[0].digest_buf[1]; #define S00 (((s0 >> 0) & 1) ? -1 : 0) #define S01 (((s0 >> 1) & 1) ? -1 : 0) #define S02 (((s0 >> 2) & 1) ? -1 : 0) #define S03 (((s0 >> 3) & 1) ? -1 : 0) #define S04 (((s0 >> 4) & 1) ? -1 : 0) #define S05 (((s0 >> 5) & 1) ? -1 : 0) #define S06 (((s0 >> 6) & 1) ? -1 : 0) #define S07 (((s0 >> 7) & 1) ? -1 : 0) #define S08 (((s0 >> 8) & 1) ? -1 : 0) #define S09 (((s0 >> 9) & 1) ? -1 : 0) #define S10 (((s0 >> 10) & 1) ? -1 : 0) #define S11 (((s0 >> 11) & 1) ? -1 : 0) #define S12 (((s0 >> 12) & 1) ? -1 : 0) #define S13 (((s0 >> 13) & 1) ? -1 : 0) #define S14 (((s0 >> 14) & 1) ? -1 : 0) #define S15 (((s0 >> 15) & 1) ? -1 : 0) #define S16 (((s0 >> 16) & 1) ? -1 : 0) #define S17 (((s0 >> 17) & 1) ? -1 : 0) #define S18 (((s0 >> 18) & 1) ? -1 : 0) #define S19 (((s0 >> 19) & 1) ? -1 : 0) #define S20 (((s0 >> 20) & 1) ? -1 : 0) #define S21 (((s0 >> 21) & 1) ? -1 : 0) #define S22 (((s0 >> 22) & 1) ? -1 : 0) #define S23 (((s0 >> 23) & 1) ? -1 : 0) #define S24 (((s0 >> 24) & 1) ? -1 : 0) #define S25 (((s0 >> 25) & 1) ? -1 : 0) #define S26 (((s0 >> 26) & 1) ? -1 : 0) #define S27 (((s0 >> 27) & 1) ? -1 : 0) #define S28 (((s0 >> 28) & 1) ? -1 : 0) #define S29 (((s0 >> 29) & 1) ? -1 : 0) #define S30 (((s0 >> 30) & 1) ? -1 : 0) #define S31 (((s0 >> 31) & 1) ? -1 : 0) #define S32 (((s1 >> 0) & 1) ? -1 : 0) #define S33 (((s1 >> 1) & 1) ? -1 : 0) #define S34 (((s1 >> 2) & 1) ? -1 : 0) #define S35 (((s1 >> 3) & 1) ? -1 : 0) #define S36 (((s1 >> 4) & 1) ? -1 : 0) #define S37 (((s1 >> 5) & 1) ? -1 : 0) #define S38 (((s1 >> 6) & 1) ? -1 : 0) #define S39 (((s1 >> 7) & 1) ? -1 : 0) #define S40 (((s1 >> 8) & 1) ? -1 : 0) #define S41 (((s1 >> 9) & 1) ? -1 : 0) #define S42 (((s1 >> 10) & 1) ? -1 : 0) #define S43 (((s1 >> 11) & 1) ? -1 : 0) #define S44 (((s1 >> 12) & 1) ? -1 : 0) #define S45 (((s1 >> 13) & 1) ? -1 : 0) #define S46 (((s1 >> 14) & 1) ? -1 : 0) #define S47 (((s1 >> 15) & 1) ? -1 : 0) #define S48 (((s1 >> 16) & 1) ? -1 : 0) #define S49 (((s1 >> 17) & 1) ? -1 : 0) #define S50 (((s1 >> 18) & 1) ? -1 : 0) #define S51 (((s1 >> 19) & 1) ? -1 : 0) #define S52 (((s1 >> 20) & 1) ? -1 : 0) #define S53 (((s1 >> 21) & 1) ? -1 : 0) #define S54 (((s1 >> 22) & 1) ? -1 : 0) #define S55 (((s1 >> 23) & 1) ? -1 : 0) #define S56 (((s1 >> 24) & 1) ? -1 : 0) #define S57 (((s1 >> 25) & 1) ? -1 : 0) #define S58 (((s1 >> 26) & 1) ? -1 : 0) #define S59 (((s1 >> 27) & 1) ? -1 : 0) #define S60 (((s1 >> 28) & 1) ? -1 : 0) #define S61 (((s1 >> 29) & 1) ? -1 : 0) #define S62 (((s1 >> 30) & 1) ? -1 : 0) #define S63 (((s1 >> 31) & 1) ? -1 : 0) /** * base */ const u32 w0 = pws[gid].i[0]; const u32 w1 = pws[gid].i[1]; #define K00 (((w0 >> ( 0 + 7)) & 1) ? -1 : 0) #define K01 (((w0 >> ( 0 + 6)) & 1) ? -1 : 0) #define K02 (((w0 >> ( 0 + 5)) & 1) ? -1 : 0) #define K03 (((w0 >> ( 0 + 4)) & 1) ? -1 : 0) #define K04 (((w0 >> ( 0 + 3)) & 1) ? -1 : 0) #define K05 (((w0 >> ( 0 + 2)) & 1) ? -1 : 0) #define K06 (((w0 >> ( 0 + 1)) & 1) ? -1 : 0) #define K07 (((w0 >> ( 8 + 7)) & 1) ? -1 : 0) #define K08 (((w0 >> ( 8 + 6)) & 1) ? -1 : 0) #define K09 (((w0 >> ( 8 + 5)) & 1) ? -1 : 0) #define K10 (((w0 >> ( 8 + 4)) & 1) ? -1 : 0) #define K11 (((w0 >> ( 8 + 3)) & 1) ? -1 : 0) #define K12 (((w0 >> ( 8 + 2)) & 1) ? -1 : 0) #define K13 (((w0 >> ( 8 + 1)) & 1) ? -1 : 0) #define K14 (((w0 >> (16 + 7)) & 1) ? -1 : 0) #define K15 (((w0 >> (16 + 6)) & 1) ? -1 : 0) #define K16 (((w0 >> (16 + 5)) & 1) ? -1 : 0) #define K17 (((w0 >> (16 + 4)) & 1) ? -1 : 0) #define K18 (((w0 >> (16 + 3)) & 1) ? -1 : 0) #define K19 (((w0 >> (16 + 2)) & 1) ? -1 : 0) #define K20 (((w0 >> (16 + 1)) & 1) ? -1 : 0) #define K21 (((w0 >> (24 + 7)) & 1) ? -1 : 0) #define K22 (((w0 >> (24 + 6)) & 1) ? -1 : 0) #define K23 (((w0 >> (24 + 5)) & 1) ? -1 : 0) #define K24 (((w0 >> (24 + 4)) & 1) ? -1 : 0) #define K25 (((w0 >> (24 + 3)) & 1) ? -1 : 0) #define K26 (((w0 >> (24 + 2)) & 1) ? -1 : 0) #define K27 (((w0 >> (24 + 1)) & 1) ? -1 : 0) #define K28 (((w1 >> ( 0 + 7)) & 1) ? -1 : 0) #define K29 (((w1 >> ( 0 + 6)) & 1) ? -1 : 0) #define K30 (((w1 >> ( 0 + 5)) & 1) ? -1 : 0) #define K31 (((w1 >> ( 0 + 4)) & 1) ? -1 : 0) #define K32 (((w1 >> ( 0 + 3)) & 1) ? -1 : 0) #define K33 (((w1 >> ( 0 + 2)) & 1) ? -1 : 0) #define K34 (((w1 >> ( 0 + 1)) & 1) ? -1 : 0) #define K35 (((w1 >> ( 8 + 7)) & 1) ? -1 : 0) #define K36 (((w1 >> ( 8 + 6)) & 1) ? -1 : 0) #define K37 (((w1 >> ( 8 + 5)) & 1) ? -1 : 0) #define K38 (((w1 >> ( 8 + 4)) & 1) ? -1 : 0) #define K39 (((w1 >> ( 8 + 3)) & 1) ? -1 : 0) #define K40 (((w1 >> ( 8 + 2)) & 1) ? -1 : 0) #define K41 (((w1 >> ( 8 + 1)) & 1) ? -1 : 0) #define K42 (((w1 >> (16 + 7)) & 1) ? -1 : 0) #define K43 (((w1 >> (16 + 6)) & 1) ? -1 : 0) #define K44 (((w1 >> (16 + 5)) & 1) ? -1 : 0) #define K45 (((w1 >> (16 + 4)) & 1) ? -1 : 0) #define K46 (((w1 >> (16 + 3)) & 1) ? -1 : 0) #define K47 (((w1 >> (16 + 2)) & 1) ? -1 : 0) #define K48 (((w1 >> (16 + 1)) & 1) ? -1 : 0) #define K49 (((w1 >> (24 + 7)) & 1) ? -1 : 0) #define K50 (((w1 >> (24 + 6)) & 1) ? -1 : 0) #define K51 (((w1 >> (24 + 5)) & 1) ? -1 : 0) #define K52 (((w1 >> (24 + 4)) & 1) ? -1 : 0) #define K53 (((w1 >> (24 + 3)) & 1) ? -1 : 0) #define K54 (((w1 >> (24 + 2)) & 1) ? -1 : 0) #define K55 (((w1 >> (24 + 1)) & 1) ? -1 : 0) /** * 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]; 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; #ifdef _unroll #pragma unroll #endif 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 = ffz (tmpResult); const u32 r0 = search[0]; const u32 r1 = search[1]; const u32 r2 = 0; const u32 r3 = 0; #include COMPARE_M } } else { u32 out0[32]; u32 out1[32]; #ifdef _unroll #pragma unroll #endif for (int i = 0; i < 32; i++) { out0[i] = out[ 0 + i]; out1[i] = out[32 + i]; } transpose32c (out0); transpose32c (out1); #ifdef _unroll #pragma unroll #endif for (int slice = 0; slice < 32; slice++) { const u32 r0 = out0[slice]; const u32 r1 = out1[slice]; const u32 r2 = 0; const u32 r3 = 0; #include COMPARE_M } } } void m14000s (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bs_word_t *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 salt0 = salt_bufs[salt_pos].salt_buf_pc[0]; const u32 salt1 = salt_bufs[salt_pos].salt_buf_pc[1]; // salt1 first, because this is a 64 bit value actually #define d00 (((salt1 >> 0) & 1) ? -1 : 0) #define d01 (((salt1 >> 1) & 1) ? -1 : 0) #define d02 (((salt1 >> 2) & 1) ? -1 : 0) #define d03 (((salt1 >> 3) & 1) ? -1 : 0) #define d04 (((salt1 >> 4) & 1) ? -1 : 0) #define d05 (((salt1 >> 5) & 1) ? -1 : 0) #define d06 (((salt1 >> 6) & 1) ? -1 : 0) #define d07 (((salt1 >> 7) & 1) ? -1 : 0) #define d08 (((salt1 >> 8) & 1) ? -1 : 0) #define d09 (((salt1 >> 9) & 1) ? -1 : 0) #define d10 (((salt1 >> 10) & 1) ? -1 : 0) #define d11 (((salt1 >> 11) & 1) ? -1 : 0) #define d12 (((salt1 >> 12) & 1) ? -1 : 0) #define d13 (((salt1 >> 13) & 1) ? -1 : 0) #define d14 (((salt1 >> 14) & 1) ? -1 : 0) #define d15 (((salt1 >> 15) & 1) ? -1 : 0) #define d16 (((salt1 >> 16) & 1) ? -1 : 0) #define d17 (((salt1 >> 17) & 1) ? -1 : 0) #define d18 (((salt1 >> 18) & 1) ? -1 : 0) #define d19 (((salt1 >> 19) & 1) ? -1 : 0) #define d20 (((salt1 >> 20) & 1) ? -1 : 0) #define d21 (((salt1 >> 21) & 1) ? -1 : 0) #define d22 (((salt1 >> 22) & 1) ? -1 : 0) #define d23 (((salt1 >> 23) & 1) ? -1 : 0) #define d24 (((salt1 >> 24) & 1) ? -1 : 0) #define d25 (((salt1 >> 25) & 1) ? -1 : 0) #define d26 (((salt1 >> 26) & 1) ? -1 : 0) #define d27 (((salt1 >> 27) & 1) ? -1 : 0) #define d28 (((salt1 >> 28) & 1) ? -1 : 0) #define d29 (((salt1 >> 29) & 1) ? -1 : 0) #define d30 (((salt1 >> 30) & 1) ? -1 : 0) #define d31 (((salt1 >> 31) & 1) ? -1 : 0) #define d32 (((salt0 >> 0) & 1) ? -1 : 0) #define d33 (((salt0 >> 1) & 1) ? -1 : 0) #define d34 (((salt0 >> 2) & 1) ? -1 : 0) #define d35 (((salt0 >> 3) & 1) ? -1 : 0) #define d36 (((salt0 >> 4) & 1) ? -1 : 0) #define d37 (((salt0 >> 5) & 1) ? -1 : 0) #define d38 (((salt0 >> 6) & 1) ? -1 : 0) #define d39 (((salt0 >> 7) & 1) ? -1 : 0) #define d40 (((salt0 >> 8) & 1) ? -1 : 0) #define d41 (((salt0 >> 9) & 1) ? -1 : 0) #define d42 (((salt0 >> 10) & 1) ? -1 : 0) #define d43 (((salt0 >> 11) & 1) ? -1 : 0) #define d44 (((salt0 >> 12) & 1) ? -1 : 0) #define d45 (((salt0 >> 13) & 1) ? -1 : 0) #define d46 (((salt0 >> 14) & 1) ? -1 : 0) #define d47 (((salt0 >> 15) & 1) ? -1 : 0) #define d48 (((salt0 >> 16) & 1) ? -1 : 0) #define d49 (((salt0 >> 17) & 1) ? -1 : 0) #define d50 (((salt0 >> 18) & 1) ? -1 : 0) #define d51 (((salt0 >> 19) & 1) ? -1 : 0) #define d52 (((salt0 >> 20) & 1) ? -1 : 0) #define d53 (((salt0 >> 21) & 1) ? -1 : 0) #define d54 (((salt0 >> 22) & 1) ? -1 : 0) #define d55 (((salt0 >> 23) & 1) ? -1 : 0) #define d56 (((salt0 >> 24) & 1) ? -1 : 0) #define d57 (((salt0 >> 25) & 1) ? -1 : 0) #define d58 (((salt0 >> 26) & 1) ? -1 : 0) #define d59 (((salt0 >> 27) & 1) ? -1 : 0) #define d60 (((salt0 >> 28) & 1) ? -1 : 0) #define d61 (((salt0 >> 29) & 1) ? -1 : 0) #define d62 (((salt0 >> 30) & 1) ? -1 : 0) #define d63 (((salt0 >> 31) & 1) ? -1 : 0) u32 D00 = d00; u32 D01 = d01; u32 D02 = d02; u32 D03 = d03; u32 D04 = d04; u32 D05 = d05; u32 D06 = d06; u32 D07 = d07; u32 D08 = d08; u32 D09 = d09; u32 D10 = d10; u32 D11 = d11; u32 D12 = d12; u32 D13 = d13; u32 D14 = d14; u32 D15 = d15; u32 D16 = d16; u32 D17 = d17; u32 D18 = d18; u32 D19 = d19; u32 D20 = d20; u32 D21 = d21; u32 D22 = d22; u32 D23 = d23; u32 D24 = d24; u32 D25 = d25; u32 D26 = d26; u32 D27 = d27; u32 D28 = d28; u32 D29 = d29; u32 D30 = d30; u32 D31 = d31; u32 D32 = d32; u32 D33 = d33; u32 D34 = d34; u32 D35 = d35; u32 D36 = d36; u32 D37 = d37; u32 D38 = d38; u32 D39 = d39; u32 D40 = d40; u32 D41 = d41; u32 D42 = d42; u32 D43 = d43; u32 D44 = d44; u32 D45 = d45; u32 D46 = d46; u32 D47 = d47; u32 D48 = d48; u32 D49 = d49; u32 D50 = d50; u32 D51 = d51; u32 D52 = d52; u32 D53 = d53; u32 D54 = d54; u32 D55 = d55; u32 D56 = d56; u32 D57 = d57; u32 D58 = d58; u32 D59 = d59; u32 D60 = d60; u32 D61 = d61; u32 D62 = d62; u32 D63 = d63; /** * digest */ const u32 s0 = digests_buf[0].digest_buf[0]; const u32 s1 = digests_buf[0].digest_buf[1]; #define S00 (((s0 >> 0) & 1) ? -1 : 0) #define S01 (((s0 >> 1) & 1) ? -1 : 0) #define S02 (((s0 >> 2) & 1) ? -1 : 0) #define S03 (((s0 >> 3) & 1) ? -1 : 0) #define S04 (((s0 >> 4) & 1) ? -1 : 0) #define S05 (((s0 >> 5) & 1) ? -1 : 0) #define S06 (((s0 >> 6) & 1) ? -1 : 0) #define S07 (((s0 >> 7) & 1) ? -1 : 0) #define S08 (((s0 >> 8) & 1) ? -1 : 0) #define S09 (((s0 >> 9) & 1) ? -1 : 0) #define S10 (((s0 >> 10) & 1) ? -1 : 0) #define S11 (((s0 >> 11) & 1) ? -1 : 0) #define S12 (((s0 >> 12) & 1) ? -1 : 0) #define S13 (((s0 >> 13) & 1) ? -1 : 0) #define S14 (((s0 >> 14) & 1) ? -1 : 0) #define S15 (((s0 >> 15) & 1) ? -1 : 0) #define S16 (((s0 >> 16) & 1) ? -1 : 0) #define S17 (((s0 >> 17) & 1) ? -1 : 0) #define S18 (((s0 >> 18) & 1) ? -1 : 0) #define S19 (((s0 >> 19) & 1) ? -1 : 0) #define S20 (((s0 >> 20) & 1) ? -1 : 0) #define S21 (((s0 >> 21) & 1) ? -1 : 0) #define S22 (((s0 >> 22) & 1) ? -1 : 0) #define S23 (((s0 >> 23) & 1) ? -1 : 0) #define S24 (((s0 >> 24) & 1) ? -1 : 0) #define S25 (((s0 >> 25) & 1) ? -1 : 0) #define S26 (((s0 >> 26) & 1) ? -1 : 0) #define S27 (((s0 >> 27) & 1) ? -1 : 0) #define S28 (((s0 >> 28) & 1) ? -1 : 0) #define S29 (((s0 >> 29) & 1) ? -1 : 0) #define S30 (((s0 >> 30) & 1) ? -1 : 0) #define S31 (((s0 >> 31) & 1) ? -1 : 0) #define S32 (((s1 >> 0) & 1) ? -1 : 0) #define S33 (((s1 >> 1) & 1) ? -1 : 0) #define S34 (((s1 >> 2) & 1) ? -1 : 0) #define S35 (((s1 >> 3) & 1) ? -1 : 0) #define S36 (((s1 >> 4) & 1) ? -1 : 0) #define S37 (((s1 >> 5) & 1) ? -1 : 0) #define S38 (((s1 >> 6) & 1) ? -1 : 0) #define S39 (((s1 >> 7) & 1) ? -1 : 0) #define S40 (((s1 >> 8) & 1) ? -1 : 0) #define S41 (((s1 >> 9) & 1) ? -1 : 0) #define S42 (((s1 >> 10) & 1) ? -1 : 0) #define S43 (((s1 >> 11) & 1) ? -1 : 0) #define S44 (((s1 >> 12) & 1) ? -1 : 0) #define S45 (((s1 >> 13) & 1) ? -1 : 0) #define S46 (((s1 >> 14) & 1) ? -1 : 0) #define S47 (((s1 >> 15) & 1) ? -1 : 0) #define S48 (((s1 >> 16) & 1) ? -1 : 0) #define S49 (((s1 >> 17) & 1) ? -1 : 0) #define S50 (((s1 >> 18) & 1) ? -1 : 0) #define S51 (((s1 >> 19) & 1) ? -1 : 0) #define S52 (((s1 >> 20) & 1) ? -1 : 0) #define S53 (((s1 >> 21) & 1) ? -1 : 0) #define S54 (((s1 >> 22) & 1) ? -1 : 0) #define S55 (((s1 >> 23) & 1) ? -1 : 0) #define S56 (((s1 >> 24) & 1) ? -1 : 0) #define S57 (((s1 >> 25) & 1) ? -1 : 0) #define S58 (((s1 >> 26) & 1) ? -1 : 0) #define S59 (((s1 >> 27) & 1) ? -1 : 0) #define S60 (((s1 >> 28) & 1) ? -1 : 0) #define S61 (((s1 >> 29) & 1) ? -1 : 0) #define S62 (((s1 >> 30) & 1) ? -1 : 0) #define S63 (((s1 >> 31) & 1) ? -1 : 0) /** * base */ const u32 w0 = pws[gid].i[0]; const u32 w1 = pws[gid].i[1]; #define K00 (((w0 >> ( 0 + 7)) & 1) ? -1 : 0) #define K01 (((w0 >> ( 0 + 6)) & 1) ? -1 : 0) #define K02 (((w0 >> ( 0 + 5)) & 1) ? -1 : 0) #define K03 (((w0 >> ( 0 + 4)) & 1) ? -1 : 0) #define K04 (((w0 >> ( 0 + 3)) & 1) ? -1 : 0) #define K05 (((w0 >> ( 0 + 2)) & 1) ? -1 : 0) #define K06 (((w0 >> ( 0 + 1)) & 1) ? -1 : 0) #define K07 (((w0 >> ( 8 + 7)) & 1) ? -1 : 0) #define K08 (((w0 >> ( 8 + 6)) & 1) ? -1 : 0) #define K09 (((w0 >> ( 8 + 5)) & 1) ? -1 : 0) #define K10 (((w0 >> ( 8 + 4)) & 1) ? -1 : 0) #define K11 (((w0 >> ( 8 + 3)) & 1) ? -1 : 0) #define K12 (((w0 >> ( 8 + 2)) & 1) ? -1 : 0) #define K13 (((w0 >> ( 8 + 1)) & 1) ? -1 : 0) #define K14 (((w0 >> (16 + 7)) & 1) ? -1 : 0) #define K15 (((w0 >> (16 + 6)) & 1) ? -1 : 0) #define K16 (((w0 >> (16 + 5)) & 1) ? -1 : 0) #define K17 (((w0 >> (16 + 4)) & 1) ? -1 : 0) #define K18 (((w0 >> (16 + 3)) & 1) ? -1 : 0) #define K19 (((w0 >> (16 + 2)) & 1) ? -1 : 0) #define K20 (((w0 >> (16 + 1)) & 1) ? -1 : 0) #define K21 (((w0 >> (24 + 7)) & 1) ? -1 : 0) #define K22 (((w0 >> (24 + 6)) & 1) ? -1 : 0) #define K23 (((w0 >> (24 + 5)) & 1) ? -1 : 0) #define K24 (((w0 >> (24 + 4)) & 1) ? -1 : 0) #define K25 (((w0 >> (24 + 3)) & 1) ? -1 : 0) #define K26 (((w0 >> (24 + 2)) & 1) ? -1 : 0) #define K27 (((w0 >> (24 + 1)) & 1) ? -1 : 0) #define K28 (((w1 >> ( 0 + 7)) & 1) ? -1 : 0) #define K29 (((w1 >> ( 0 + 6)) & 1) ? -1 : 0) #define K30 (((w1 >> ( 0 + 5)) & 1) ? -1 : 0) #define K31 (((w1 >> ( 0 + 4)) & 1) ? -1 : 0) #define K32 (((w1 >> ( 0 + 3)) & 1) ? -1 : 0) #define K33 (((w1 >> ( 0 + 2)) & 1) ? -1 : 0) #define K34 (((w1 >> ( 0 + 1)) & 1) ? -1 : 0) #define K35 (((w1 >> ( 8 + 7)) & 1) ? -1 : 0) #define K36 (((w1 >> ( 8 + 6)) & 1) ? -1 : 0) #define K37 (((w1 >> ( 8 + 5)) & 1) ? -1 : 0) #define K38 (((w1 >> ( 8 + 4)) & 1) ? -1 : 0) #define K39 (((w1 >> ( 8 + 3)) & 1) ? -1 : 0) #define K40 (((w1 >> ( 8 + 2)) & 1) ? -1 : 0) #define K41 (((w1 >> ( 8 + 1)) & 1) ? -1 : 0) #define K42 (((w1 >> (16 + 7)) & 1) ? -1 : 0) #define K43 (((w1 >> (16 + 6)) & 1) ? -1 : 0) #define K44 (((w1 >> (16 + 5)) & 1) ? -1 : 0) #define K45 (((w1 >> (16 + 4)) & 1) ? -1 : 0) #define K46 (((w1 >> (16 + 3)) & 1) ? -1 : 0) #define K47 (((w1 >> (16 + 2)) & 1) ? -1 : 0) #define K48 (((w1 >> (16 + 1)) & 1) ? -1 : 0) #define K49 (((w1 >> (24 + 7)) & 1) ? -1 : 0) #define K50 (((w1 >> (24 + 6)) & 1) ? -1 : 0) #define K51 (((w1 >> (24 + 5)) & 1) ? -1 : 0) #define K52 (((w1 >> (24 + 4)) & 1) ? -1 : 0) #define K53 (((w1 >> (24 + 3)) & 1) ? -1 : 0) #define K54 (((w1 >> (24 + 2)) & 1) ? -1 : 0) #define K55 (((w1 >> (24 + 1)) & 1) ? -1 : 0) /** * 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]; 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 = ffz (tmpResult); #include COMPARE_S } // // transpose bitslice mod : attention race conditions, need different buffers for *in and *out // __kernel void m14000_tm (__global u32 *mod, __global bs_word_t *words_buf_r) { const u64 gid = get_global_id (0); const u32 block = gid / 32; const u32 slice = gid % 32; const u32 w0 = mod[gid]; #ifdef _unroll #pragma unroll #endif for (int i = 0, j = 0; i < 32; i += 8, j += 7) { atomic_or (&words_buf_r[block].b[j + 0], (((w0 >> (i + 7)) & 1) << slice)); atomic_or (&words_buf_r[block].b[j + 1], (((w0 >> (i + 6)) & 1) << slice)); atomic_or (&words_buf_r[block].b[j + 2], (((w0 >> (i + 5)) & 1) << slice)); atomic_or (&words_buf_r[block].b[j + 3], (((w0 >> (i + 4)) & 1) << slice)); atomic_or (&words_buf_r[block].b[j + 4], (((w0 >> (i + 3)) & 1) << slice)); atomic_or (&words_buf_r[block].b[j + 5], (((w0 >> (i + 2)) & 1) << slice)); atomic_or (&words_buf_r[block].b[j + 6], (((w0 >> (i + 1)) & 1) << slice)); } } __kernel void m14000_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bs_word_t *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; /** * main */ m14000m (pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m14000_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bs_word_t *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; /** * main */ m14000s (pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m14100_a0.cl000066400000000000000000000670071320027462700160060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #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 u32a 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif #if VECT_SIZE == 1 #define BOX1(i,S) (S)[(i)] #elif VECT_SIZE == 2 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1]) #elif VECT_SIZE == 4 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) #elif VECT_SIZE == 8 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7]) #elif VECT_SIZE == 16 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7], (S)[(i).s8], (S)[(i).s9], (S)[(i).sa], (S)[(i).sb], (S)[(i).sc], (S)[(i).sd], (S)[(i).se], (S)[(i).sf]) #endif void _des_crypt_encrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 (*s_SPtrans)[64]) { u32 r = rotl32_S (data[0], 3u); u32 l = rotl32_S (data[1], 3u); u32 tt; #ifdef _unroll #pragma unroll #endif for (u32 i = 0; i < 16; i += 2) { u32 u; u32 t; u = Kc[i + 0] ^ r; t = Kd[i + 0] ^ rotl32_S (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); u = Kc[i + 1] ^ l; t = Kd[i + 1] ^ rotl32_S (l, 28u); r ^= 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); } iv[0] = rotl32_S (l, 29u); iv[1] = rotl32_S (r, 29u); } void _des_crypt_decrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 (*s_SPtrans)[64]) { u32 r = rotl32_S (data[0], 3u); u32 l = rotl32_S (data[1], 3u); u32 tt; #ifdef _unroll #pragma unroll #endif for (u32 i = 16; i > 0; i -= 2) { u32 u; u32 t; u = Kc[i - 1] ^ r; t = Kd[i - 1] ^ rotl32_S (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); u = Kc[i - 2] ^ l; t = Kd[i - 2] ^ rotl32_S (l, 28u); r ^= 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); } iv[0] = rotl32_S (l, 29u); iv[1] = rotl32_S (r, 29u); } void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 (*s_skb)[64]) { u32 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; #ifdef _unroll #pragma unroll #endif 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 u32 c00 = (c >> 0) & 0x0000003f; const u32 c06 = (c >> 6) & 0x00383003; const u32 c07 = (c >> 7) & 0x0000003c; const u32 c13 = (c >> 13) & 0x0000060f; const u32 c20 = (c >> 20) & 0x00000001; u32 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 u32 d00 = (d >> 0) & 0x00003c3f; const u32 d07 = (d >> 7) & 0x00003f03; const u32 d21 = (d >> 21) & 0x0000000f; const u32 d22 = (d >> 22) & 0x00000030; u32 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)); Kc[i] = rotl32_S (Kc[i], 2u); Kd[i] = rotl32_S (Kd[i], 2u); } } __kernel void m14100_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = 0; pw_buf1[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]; /** * main */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32 w0[4] = { 0 }; u32 w1[4] = { 0 }; u32 w2[4] = { 0 }; u32 w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /* First Pass */ const u32 a = w0[0]; const u32 b = w0[1]; u32 Ka[16]; u32 Kb[16]; _des_crypt_keysetup (a, b, Ka, Kb, s_skb); u32 data[2]; data[0] = salt_buf0[0]; data[1] = salt_buf0[1]; u32 p1[2]; _des_crypt_encrypt (p1, data, Ka, Kb, s_SPtrans); /* Second Pass */ const u32 c = w0[2]; const u32 d = w0[3]; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32 p2[2]; _des_crypt_decrypt (p2, p1, Kc, Kd, s_SPtrans); /* Third Pass */ const u32 e = w1[0]; const u32 f = w1[1]; u32 Ke[16]; u32 Kf[16]; _des_crypt_keysetup (e, f, Ke, Kf, s_skb); u32 iv[2]; _des_crypt_encrypt (iv, p2, Ke, Kf, s_SPtrans); u32 z = 0; COMPARE_M_SIMD (iv[0], iv[1], z, z); } } __kernel void m14100_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = 0; pw_buf1[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]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_buf[digests_offset].digest_buf[DGST_R1], 0, 0 }; /** * main */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32 w0[4] = { 0 }; u32 w1[4] = { 0 }; u32 w2[4] = { 0 }; u32 w3[4] = { 0 }; apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /* First Pass */ const u32 a = w0[0]; const u32 b = w0[1]; u32 Ka[16]; u32 Kb[16]; _des_crypt_keysetup (a, b, Ka, Kb, s_skb); u32 data[2]; data[0] = salt_buf0[0]; data[1] = salt_buf0[1]; u32 p1[2]; _des_crypt_encrypt (p1, data, Ka, Kb, s_SPtrans); /* Second Pass */ const u32 c = w0[2]; const u32 d = w0[3]; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32 p2[2]; _des_crypt_decrypt (p2, p1, Kc, Kd, s_SPtrans); /* Third Pass */ const u32 e = w1[0]; const u32 f = w1[1]; u32 Ke[16]; u32 Kf[16]; _des_crypt_keysetup (e, f, Ke, Kf, s_skb); u32 iv[2]; _des_crypt_encrypt (iv, p2, Ke, Kf, s_SPtrans); u32 z = 0; COMPARE_S_SIMD (iv[0], iv[1], z, z); } } hashcat-4.0.1/OpenCL/m14100_a1.cl000066400000000000000000000737341320027462700160130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif #if VECT_SIZE == 1 #define BOX1(i,S) (S)[(i)] #elif VECT_SIZE == 2 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1]) #elif VECT_SIZE == 4 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) #elif VECT_SIZE == 8 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7]) #elif VECT_SIZE == 16 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7], (S)[(i).s8], (S)[(i).s9], (S)[(i).sa], (S)[(i).sb], (S)[(i).sc], (S)[(i).sd], (S)[(i).se], (S)[(i).sf]) #endif void _des_crypt_encrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 (*s_SPtrans)[64]) { u32 r = rotl32_S (data[0], 3u); u32 l = rotl32_S (data[1], 3u); u32 tt; #ifdef _unroll #pragma unroll #endif for (u32 i = 0; i < 16; i += 2) { u32 u; u32 t; u = Kc[i + 0] ^ r; t = Kd[i + 0] ^ rotl32_S (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); u = Kc[i + 1] ^ l; t = Kd[i + 1] ^ rotl32_S (l, 28u); r ^= 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); } iv[0] = rotl32_S (l, 29u); iv[1] = rotl32_S (r, 29u); } void _des_crypt_decrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 (*s_SPtrans)[64]) { u32 r = rotl32_S (data[0], 3u); u32 l = rotl32_S (data[1], 3u); u32 tt; #ifdef _unroll #pragma unroll #endif for (u32 i = 16; i > 0; i -= 2) { u32 u; u32 t; u = Kc[i - 1] ^ r; t = Kd[i - 1] ^ rotl32_S (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); u = Kc[i - 2] ^ l; t = Kd[i - 2] ^ rotl32_S (l, 28u); r ^= 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); } iv[0] = rotl32_S (l, 29u); iv[1] = rotl32_S (r, 29u); } void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 (*s_skb)[64]) { u32 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; #ifdef _unroll #pragma unroll #endif 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 u32 c00 = (c >> 0) & 0x0000003f; const u32 c06 = (c >> 6) & 0x00383003; const u32 c07 = (c >> 7) & 0x0000003c; const u32 c13 = (c >> 13) & 0x0000060f; const u32 c20 = (c >> 20) & 0x00000001; u32 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 u32 d00 = (d >> 0) & 0x00003c3f; const u32 d07 = (d >> 7) & 0x00003f03; const u32 d21 = (d >> 21) & 0x0000000f; const u32 d22 = (d >> 22) & 0x00000030; u32 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)); Kc[i] = rotl32_S (Kc[i], 2u); Kd[i] = rotl32_S (Kd[i], 2u); } } __kernel void m14100_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = 0; pw_buf1[3] = 0; const u32 pw_l_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]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32 pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32 wordl0[4] = { 0 }; u32 wordl1[4] = { 0 }; u32 wordl2[4] = { 0 }; u32 wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32 wordr0[4] = { 0 }; u32 wordr1[4] = { 0 }; u32 wordr2[4] = { 0 }; u32 wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32 w0[4]; u32 w1[4]; 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]; /* First Pass */ const u32 a = w0[0]; const u32 b = w0[1]; u32 Ka[16]; u32 Kb[16]; _des_crypt_keysetup (a, b, Ka, Kb, s_skb); u32 data[2]; data[0] = salt_buf0[0]; data[1] = salt_buf0[1]; u32 p1[2]; _des_crypt_encrypt (p1, data, Ka, Kb, s_SPtrans); /* Second Pass */ const u32 c = w0[2]; const u32 d = w0[3]; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32 p2[2]; _des_crypt_decrypt (p2, p1, Kc, Kd, s_SPtrans); /* Third Pass */ const u32 e = w1[0]; const u32 f = w1[1]; u32 Ke[16]; u32 Kf[16]; _des_crypt_keysetup (e, f, Ke, Kf, s_skb); u32 iv[2]; _des_crypt_encrypt (iv, p2, Ke, Kf, s_SPtrans); u32 z = 0; COMPARE_M_SIMD (iv[0], iv[1], z, z); } } __kernel void m14100_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[ 0]; pw_buf0[1] = pws[gid].i[ 1]; pw_buf0[2] = pws[gid].i[ 2]; pw_buf0[3] = pws[gid].i[ 3]; pw_buf1[0] = pws[gid].i[ 4]; pw_buf1[1] = pws[gid].i[ 5]; pw_buf1[2] = 0; pw_buf1[3] = 0; const u32 pw_l_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]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_buf[digests_offset].digest_buf[DGST_R1], 0, 0 }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32 pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32 wordl0[4] = { 0 }; u32 wordl1[4] = { 0 }; u32 wordl2[4] = { 0 }; u32 wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32 wordr0[4] = { 0 }; u32 wordr1[4] = { 0 }; u32 wordr2[4] = { 0 }; u32 wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32 w0[4]; u32 w1[4]; 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]; /* First Pass */ const u32 a = w0[0]; const u32 b = w0[1]; u32 Ka[16]; u32 Kb[16]; _des_crypt_keysetup (a, b, Ka, Kb, s_skb); u32 data[2]; data[0] = salt_buf0[0]; data[1] = salt_buf0[1]; u32 p1[2]; _des_crypt_encrypt (p1, data, Ka, Kb, s_SPtrans); /* Second Pass */ const u32 c = w0[2]; const u32 d = w0[3]; u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32 p2[2]; _des_crypt_decrypt (p2, p1, Kc, Kd, s_SPtrans); /* Third Pass */ const u32 e = w1[0]; const u32 f = w1[1]; u32 Ke[16]; u32 Kf[16]; _des_crypt_keysetup (e, f, Ke, Kf, s_skb); u32 iv[2]; _des_crypt_encrypt (iv, p2, Ke, Kf, s_SPtrans); u32 z = 0; COMPARE_S_SIMD (iv[0], iv[1], z, z); } } hashcat-4.0.1/OpenCL/m14100_a3.cl000066400000000000000000000752541320027462700160140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #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 u32a c_SPtrans[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 } }; #if VECT_SIZE == 1 #define BOX(i,n,S) (S)[(n)][(i)] #elif VECT_SIZE == 2 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) #elif VECT_SIZE == 4 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) #elif VECT_SIZE == 8 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7]) #elif VECT_SIZE == 16 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf]) #endif #if VECT_SIZE == 1 #define BOX1(i,S) (S)[(i)] #elif VECT_SIZE == 2 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1]) #elif VECT_SIZE == 4 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) #elif VECT_SIZE == 8 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7]) #elif VECT_SIZE == 16 #define BOX1(i,S) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3], (S)[(i).s4], (S)[(i).s5], (S)[(i).s6], (S)[(i).s7], (S)[(i).s8], (S)[(i).s9], (S)[(i).sa], (S)[(i).sb], (S)[(i).sc], (S)[(i).sd], (S)[(i).se], (S)[(i).sf]) #endif void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64]) { u32x r = rotl32 (data[0], 3u); u32x l = rotl32 (data[1], 3u); u32x tt; #ifdef _unroll #pragma unroll #endif 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 ^= 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); u = Kc[i + 1] ^ l; t = Kd[i + 1] ^ rotl32 (l, 28u); r ^= 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); } iv[0] = rotl32 (l, 29u); iv[1] = rotl32 (r, 29u); } void _des_crypt_decrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64]) { u32x r = rotl32 (data[0], 3u); u32x l = rotl32 (data[1], 3u); u32x tt; #ifdef _unroll #pragma unroll #endif for (u32 i = 16; i > 0; i -= 2) { u32x u; u32x t; u = Kc[i - 1] ^ r; t = Kd[i - 1] ^ 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); u = Kc[i - 2] ^ l; t = Kd[i - 2] ^ rotl32 (l, 28u); r ^= 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); } iv[0] = rotl32 (l, 29u); iv[1] = rotl32 (r, 29u); } void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[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; #ifdef _unroll #pragma unroll #endif 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); Kc[i] = ((t << 16) | (s & 0x0000ffff)); Kd[i] = ((s >> 16) | (t & 0xffff0000)); Kc[i] = rotl32 (Kc[i], 2u); Kd[i] = rotl32 (Kd[i], 2u); } } void m14100m (__local u32 (*s_SPtrans)[64], __local u32 (*s_skb)[64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 */ u32 w0l = w[0]; u32 w1 = w[1]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; /* First Pass */ const u32x a = (w0); const u32x b = (w1); u32x Ka[16]; u32x Kb[16]; _des_crypt_keysetup (a, b, Ka, Kb, s_skb); u32x data[2]; data[0] = salt_buf0[0]; data[1] = salt_buf0[1]; u32x p1[2]; _des_crypt_encrypt (p1, data, Ka, Kb, s_SPtrans); /* Second Pass */ const u32x c = (w[2]); const u32x d = (w[3]); u32x Kc[16]; u32x Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32x p2[2]; _des_crypt_decrypt (p2, p1, Kc, Kd, s_SPtrans); /* Third Pass */ const u32x e = (w[4]); const u32x f = (w[5]); u32x Ke[16]; u32x Kf[16]; _des_crypt_keysetup (e, f, Ke, Kf, s_skb); u32x iv[2]; _des_crypt_encrypt (iv, p2, Ke, Kf, s_SPtrans); u32x z = 0; COMPARE_M_SIMD (iv[0], iv[1], z, z); } } void m14100s (__local u32 (*s_SPtrans)[64], __local u32 (*s_skb)[64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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], 0, 0 }; /** * loop */ u32 w0l = w[0]; u32 w1 = w[1]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; /* First Pass */ const u32x a = (w0); const u32x b = (w1); u32x Ka[16]; u32x Kb[16]; _des_crypt_keysetup (a, b, Ka, Kb, s_skb); u32x data[2]; data[0] = salt_buf0[0]; data[1] = salt_buf0[1]; u32x p1[2]; _des_crypt_encrypt (p1, data, Ka, Kb, s_SPtrans); /* Second Pass */ const u32x c = (w[2]); const u32x d = (w[3]); u32x Kc[16]; u32x Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); u32x p2[2]; _des_crypt_decrypt (p2, p1, Kc, Kd, s_SPtrans); /* Third Pass */ const u32x e = (w[4]); const u32x f = (w[5]); u32x Ke[16]; u32x Kf[16]; _des_crypt_keysetup (e, f, Ke, Kf, s_skb); u32x iv[2]; _des_crypt_encrypt (iv, p2, Ke, Kf, s_SPtrans); u32x z = 0; COMPARE_S_SIMD (iv[0], iv[1], z, z); } } __kernel void m14100_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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] = 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 */ m14100m (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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m14100_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * shared */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w[16]; w[ 0] = 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] = 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 */ m14100s (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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m14400_a0-optimized.cl000066400000000000000000000553731320027462700200160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void append_4 (const u32 offset, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 src_r0) { u32 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: w0[0] |= tmp[0]; w0[1] = tmp[1]; break; case 1: w0[1] |= tmp[0]; w0[2] = tmp[1]; break; case 2: w0[2] |= tmp[0]; w0[3] = tmp[1]; break; case 3: w0[3] |= tmp[0]; w1[0] = tmp[1]; break; case 4: w1[0] |= tmp[0]; w1[1] = tmp[1]; break; case 5: w1[1] |= tmp[0]; w1[2] = tmp[1]; break; case 6: w1[2] |= tmp[0]; w1[3] = tmp[1]; break; case 7: w1[3] |= tmp[0]; w2[0] = tmp[1]; break; case 8: w2[0] |= tmp[0]; w2[1] = tmp[1]; break; case 9: w2[1] |= tmp[0]; w2[2] = tmp[1]; break; case 10: w2[2] |= tmp[0]; w2[3] = tmp[1]; break; case 11: w2[3] |= tmp[0]; w3[0] = tmp[1]; break; case 12: w3[0] |= tmp[0]; w3[1] = tmp[1]; break; case 13: w3[1] |= tmp[0]; w3[2] = tmp[1]; break; case 14: w3[2] |= tmp[0]; w3[3] = tmp[1]; break; case 15: w3[3] |= tmp[0]; break; } } void shift_2 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4]) { w3[3] = w3[2] >> 16 | w3[3] << 16; w3[2] = w3[1] >> 16 | w3[2] << 16; w3[1] = w3[0] >> 16 | w3[1] << 16; w3[0] = w2[3] >> 16 | w3[0] << 16; w2[3] = w2[2] >> 16 | w2[3] << 16; w2[2] = w2[1] >> 16 | w2[2] << 16; w2[1] = w2[0] >> 16 | w2[1] << 16; w2[0] = w1[3] >> 16 | w2[0] << 16; w1[3] = w1[2] >> 16 | w1[3] << 16; w1[2] = w1[1] >> 16 | w1[2] << 16; w1[1] = w1[0] >> 16 | w1[1] << 16; w1[0] = w0[3] >> 16 | w1[0] << 16; w0[3] = w0[2] >> 16 | w0[3] << 16; w0[2] = w0[1] >> 16 | w0[2] << 16; w0[1] = w0[0] >> 16 | w0[1] << 16; w0[0] = 0 | w0[0] << 16; } __kernel void m14400_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 dashes = 0x2d2d2d2d; u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[2] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; salt_buf3[0] = 0; salt_buf3[1] = 0; salt_buf3[2] = 0; salt_buf3[3] = 0; shift_2 (salt_buf0, salt_buf1, salt_buf2, salt_buf3); salt_buf0[0] |= dashes >> 16; salt_buf1[1] |= dashes << 16; salt_buf0[0] = swap32 (salt_buf0[0]); salt_buf0[1] = swap32 (salt_buf0[1]); salt_buf0[2] = swap32 (salt_buf0[2]); salt_buf0[3] = swap32 (salt_buf0[3]); salt_buf1[0] = swap32 (salt_buf1[0]); salt_buf1[1] = swap32 (salt_buf1[1]); salt_buf1[2] = swap32 (salt_buf1[2]); salt_buf1[3] = swap32 (salt_buf1[3]); salt_buf2[0] = swap32 (salt_buf2[0]); salt_buf2[1] = swap32 (salt_buf2[1]); salt_buf2[2] = swap32 (salt_buf2[2]); salt_buf2[3] = swap32 (salt_buf2[3]); salt_buf3[0] = swap32 (salt_buf3[0]); salt_buf3[1] = swap32 (salt_buf3[1]); salt_buf3[2] = swap32 (salt_buf3[2]); salt_buf3[3] = swap32 (salt_buf3[3]); const u32 salt_len_orig = salt_bufs[salt_pos].salt_len; const u32 salt_len_new = 2 + salt_len_orig + 2; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len_orig = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_4 (out_len_orig, w0, w1, w2, w3, dashes); shift_2 (w0, w1, w2, w3); w0[0] |= dashes >> 16; const u32x out_len_new = 2 + out_len_orig + 4; append_0x80_4x4_VV (w0, w1, w2, w3, out_len_new); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[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; /** * prepend salt */ const u32x out_salt_len = salt_len_new + out_len_new; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = salt_buf0[0]; t0[1] = salt_buf0[1]; t0[2] = salt_buf0[2]; t0[3] = salt_buf0[3]; t1[0] = salt_buf1[0]; t1[1] = salt_buf1[1]; t1[2] = w0[0]; t1[3] = w0[1]; t2[0] = w0[2]; t2[1] = w0[3]; t2[2] = w1[0]; t2[3] = w1[1]; t3[0] = w1[2]; t3[1] = w1[3]; t3[2] = 0; t3[3] = out_salt_len * 8; /** * sha1 */ 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_vector (t0, t1, t2, t3, digest); for (int i = 1; i < 10; i++) { u32 s[10]; s[0] = uint_to_hex_lower8_le ((digest[0] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[0] >> 24) & 255) << 16; s[1] = uint_to_hex_lower8_le ((digest[0] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[0] >> 8) & 255) << 16; s[2] = uint_to_hex_lower8_le ((digest[1] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[1] >> 24) & 255) << 16; s[3] = uint_to_hex_lower8_le ((digest[1] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[1] >> 8) & 255) << 16; s[4] = uint_to_hex_lower8_le ((digest[2] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[2] >> 24) & 255) << 16; s[5] = uint_to_hex_lower8_le ((digest[2] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[2] >> 8) & 255) << 16; s[6] = uint_to_hex_lower8_le ((digest[3] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[3] >> 24) & 255) << 16; s[7] = uint_to_hex_lower8_le ((digest[3] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[3] >> 8) & 255) << 16; s[8] = uint_to_hex_lower8_le ((digest[4] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[4] >> 24) & 255) << 16; s[9] = uint_to_hex_lower8_le ((digest[4] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[4] >> 8) & 255) << 16; t0[0] = salt_buf0[0]; t0[1] = salt_buf0[1]; t0[2] = salt_buf0[2]; t0[3] = salt_buf0[3]; t1[0] = salt_buf1[0]; t1[1] = salt_buf1[1]; t1[2] = s[0]; t1[3] = s[1]; t2[0] = s[2]; t2[1] = s[3]; t2[2] = s[4]; t2[3] = s[5]; t3[0] = s[6]; t3[1] = s[7]; t3[2] = s[8]; t3[3] = s[9]; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (t0, t1, t2, t3, digest); t0[0] = w0[0]; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = (salt_len_new + 40 + out_len_new) * 8; sha1_transform_vector (t0, t1, t2, t3, 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]; COMPARE_M_SIMD (d, e, c, b); } } __kernel void m14400_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m14400_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m14400_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 dashes = 0x2d2d2d2d; u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[2] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; salt_buf3[0] = 0; salt_buf3[1] = 0; salt_buf3[2] = 0; salt_buf3[3] = 0; shift_2 (salt_buf0, salt_buf1, salt_buf2, salt_buf3); salt_buf0[0] |= dashes >> 16; salt_buf1[1] |= dashes << 16; salt_buf0[0] = swap32 (salt_buf0[0]); salt_buf0[1] = swap32 (salt_buf0[1]); salt_buf0[2] = swap32 (salt_buf0[2]); salt_buf0[3] = swap32 (salt_buf0[3]); salt_buf1[0] = swap32 (salt_buf1[0]); salt_buf1[1] = swap32 (salt_buf1[1]); salt_buf1[2] = swap32 (salt_buf1[2]); salt_buf1[3] = swap32 (salt_buf1[3]); salt_buf2[0] = swap32 (salt_buf2[0]); salt_buf2[1] = swap32 (salt_buf2[1]); salt_buf2[2] = swap32 (salt_buf2[2]); salt_buf2[3] = swap32 (salt_buf2[3]); salt_buf3[0] = swap32 (salt_buf3[0]); salt_buf3[1] = swap32 (salt_buf3[1]); salt_buf3[2] = swap32 (salt_buf3[2]); salt_buf3[3] = swap32 (salt_buf3[3]); const u32 salt_len_orig = salt_bufs[salt_pos].salt_len; const u32 salt_len_new = 2 + salt_len_orig + 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len_orig = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); append_4 (out_len_orig, w0, w1, w2, w3, dashes); shift_2 (w0, w1, w2, w3); w0[0] |= dashes >> 16; const u32x out_len_new = 2 + out_len_orig + 4; append_0x80_4x4_VV (w0, w1, w2, w3, out_len_new); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[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; /** * prepend salt */ const u32x out_salt_len = salt_len_new + out_len_new; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = salt_buf0[0]; t0[1] = salt_buf0[1]; t0[2] = salt_buf0[2]; t0[3] = salt_buf0[3]; t1[0] = salt_buf1[0]; t1[1] = salt_buf1[1]; t1[2] = w0[0]; t1[3] = w0[1]; t2[0] = w0[2]; t2[1] = w0[3]; t2[2] = w1[0]; t2[3] = w1[1]; t3[0] = w1[2]; t3[1] = w1[3]; t3[2] = 0; t3[3] = out_salt_len * 8; /** * sha1 */ 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_vector (t0, t1, t2, t3, digest); for (int i = 1; i < 10; i++) { u32 s[10]; s[0] = uint_to_hex_lower8_le ((digest[0] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[0] >> 24) & 255) << 16; s[1] = uint_to_hex_lower8_le ((digest[0] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[0] >> 8) & 255) << 16; s[2] = uint_to_hex_lower8_le ((digest[1] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[1] >> 24) & 255) << 16; s[3] = uint_to_hex_lower8_le ((digest[1] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[1] >> 8) & 255) << 16; s[4] = uint_to_hex_lower8_le ((digest[2] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[2] >> 24) & 255) << 16; s[5] = uint_to_hex_lower8_le ((digest[2] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[2] >> 8) & 255) << 16; s[6] = uint_to_hex_lower8_le ((digest[3] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[3] >> 24) & 255) << 16; s[7] = uint_to_hex_lower8_le ((digest[3] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[3] >> 8) & 255) << 16; s[8] = uint_to_hex_lower8_le ((digest[4] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[4] >> 24) & 255) << 16; s[9] = uint_to_hex_lower8_le ((digest[4] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[4] >> 8) & 255) << 16; t0[0] = salt_buf0[0]; t0[1] = salt_buf0[1]; t0[2] = salt_buf0[2]; t0[3] = salt_buf0[3]; t1[0] = salt_buf1[0]; t1[1] = salt_buf1[1]; t1[2] = s[0]; t1[3] = s[1]; t2[0] = s[2]; t2[1] = s[3]; t2[2] = s[4]; t2[3] = s[5]; t3[0] = s[6]; t3[1] = s[7]; t3[2] = s[8]; t3[3] = s[9]; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (t0, t1, t2, t3, digest); t0[0] = w0[0]; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = (salt_len_new + 40 + out_len_new) * 8; sha1_transform_vector (t0, t1, t2, t3, 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]; COMPARE_S_SIMD (d, e, c, b); } } __kernel void m14400_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m14400_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m14400_a0.cl000066400000000000000000000324331320027462700160040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m14400_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); u32 d20[4]; u32 d21[4]; u32 d22[4]; u32 d23[4]; d20[0] = 0x2d2d0000; d20[1] = 0; d20[2] = 0; d20[3] = 0; d21[0] = 0; d21[1] = 0; d21[2] = 0; d21[3] = 0; d22[0] = 0; d22[1] = 0; d22[2] = 0; d22[3] = 0; d23[0] = 0; d23[1] = 0; d23[2] = 0; d23[3] = 0; sha1_update_64 (&ctx0, d20, d21, d22, d23, 2); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); u32 d40[4]; u32 d41[4]; u32 d42[4]; u32 d43[4]; d40[0] = 0x2d2d2d2d; d40[1] = 0; d40[2] = 0; d40[3] = 0; d41[0] = 0; d41[1] = 0; d41[2] = 0; d41[3] = 0; d42[0] = 0; d42[1] = 0; d42[2] = 0; d42[3] = 0; d43[0] = 0; d43[1] = 0; d43[2] = 0; d43[3] = 0; sha1_update_64 (&ctx0, d20, d21, d22, d23, 2); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx1 = ctx0; d20[0] = 0x2d2d0000; d20[1] = 0; d20[2] = 0; d20[3] = 0; d21[0] = 0; d21[1] = 0; d21[2] = 0; d21[3] = 0; d22[0] = 0; d22[1] = 0; d22[2] = 0; d22[3] = 0; d23[0] = 0; d23[1] = 0; d23[2] = 0; d23[3] = 0; sha1_update_64 (&ctx1, d20, d21, d22, d23, 2); sha1_update_swap (&ctx1, tmp.i, tmp.pw_len); d40[0] = 0x2d2d2d2d; d40[1] = 0; d40[2] = 0; d40[3] = 0; d41[0] = 0; d41[1] = 0; d41[2] = 0; d41[3] = 0; d42[0] = 0; d42[1] = 0; d42[2] = 0; d42[3] = 0; d43[0] = 0; d43[1] = 0; d43[2] = 0; d43[3] = 0; sha1_update_64 (&ctx1, d40, d41, d42, d43, 4); sha1_final (&ctx1); u32 a = ctx1.h[0]; u32 b = ctx1.h[1]; u32 c = ctx1.h[2]; u32 d = ctx1.h[3]; u32 e = ctx1.h[4]; sha1_ctx_t ctx; for (int i = 1; i < 10; i++) { ctx = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx, w0, w1, w2, w3, 40); d20[0] = 0x2d2d0000; d20[1] = 0; d20[2] = 0; d20[3] = 0; d21[0] = 0; d21[1] = 0; d21[2] = 0; d21[3] = 0; d22[0] = 0; d22[1] = 0; d22[2] = 0; d22[3] = 0; d23[0] = 0; d23[1] = 0; d23[2] = 0; d23[3] = 0; sha1_update_64 (&ctx, d20, d21, d22, d23, 2); sha1_update_swap (&ctx, tmp.i, tmp.pw_len); d40[0] = 0x2d2d2d2d; d40[1] = 0; d40[2] = 0; d40[3] = 0; d41[0] = 0; d41[1] = 0; d41[2] = 0; d41[3] = 0; d42[0] = 0; d42[1] = 0; d42[2] = 0; d42[3] = 0; d43[0] = 0; d43[1] = 0; d43[2] = 0; d43[3] = 0; sha1_update_64 (&ctx, d40, d41, d42, d43, 4); sha1_final (&ctx); a = ctx.h[0]; b = ctx.h[1]; c = ctx.h[2]; d = ctx.h[3]; e = ctx.h[4]; } const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m14400_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ COPY_PW (pws[gid]); sha1_ctx_t ctx0; sha1_init (&ctx0); u32 d20[4]; u32 d21[4]; u32 d22[4]; u32 d23[4]; d20[0] = 0x2d2d0000; d20[1] = 0; d20[2] = 0; d20[3] = 0; d21[0] = 0; d21[1] = 0; d21[2] = 0; d21[3] = 0; d22[0] = 0; d22[1] = 0; d22[2] = 0; d22[3] = 0; d23[0] = 0; d23[1] = 0; d23[2] = 0; d23[3] = 0; sha1_update_64 (&ctx0, d20, d21, d22, d23, 2); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); u32 d40[4]; u32 d41[4]; u32 d42[4]; u32 d43[4]; d40[0] = 0x2d2d2d2d; d40[1] = 0; d40[2] = 0; d40[3] = 0; d41[0] = 0; d41[1] = 0; d41[2] = 0; d41[3] = 0; d42[0] = 0; d42[1] = 0; d42[2] = 0; d42[3] = 0; d43[0] = 0; d43[1] = 0; d43[2] = 0; d43[3] = 0; sha1_update_64 (&ctx0, d20, d21, d22, d23, 2); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx1 = ctx0; d20[0] = 0x2d2d0000; d20[1] = 0; d20[2] = 0; d20[3] = 0; d21[0] = 0; d21[1] = 0; d21[2] = 0; d21[3] = 0; d22[0] = 0; d22[1] = 0; d22[2] = 0; d22[3] = 0; d23[0] = 0; d23[1] = 0; d23[2] = 0; d23[3] = 0; sha1_update_64 (&ctx1, d20, d21, d22, d23, 2); sha1_update_swap (&ctx1, tmp.i, tmp.pw_len); d40[0] = 0x2d2d2d2d; d40[1] = 0; d40[2] = 0; d40[3] = 0; d41[0] = 0; d41[1] = 0; d41[2] = 0; d41[3] = 0; d42[0] = 0; d42[1] = 0; d42[2] = 0; d42[3] = 0; d43[0] = 0; d43[1] = 0; d43[2] = 0; d43[3] = 0; sha1_update_64 (&ctx1, d40, d41, d42, d43, 4); sha1_final (&ctx1); u32 a = ctx1.h[0]; u32 b = ctx1.h[1]; u32 c = ctx1.h[2]; u32 d = ctx1.h[3]; u32 e = ctx1.h[4]; sha1_ctx_t ctx; for (int i = 1; i < 10; i++) { ctx = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx, w0, w1, w2, w3, 40); d20[0] = 0x2d2d0000; d20[1] = 0; d20[2] = 0; d20[3] = 0; d21[0] = 0; d21[1] = 0; d21[2] = 0; d21[3] = 0; d22[0] = 0; d22[1] = 0; d22[2] = 0; d22[3] = 0; d23[0] = 0; d23[1] = 0; d23[2] = 0; d23[3] = 0; sha1_update_64 (&ctx, d20, d21, d22, d23, 2); sha1_update_swap (&ctx, tmp.i, tmp.pw_len); d40[0] = 0x2d2d2d2d; d40[1] = 0; d40[2] = 0; d40[3] = 0; d41[0] = 0; d41[1] = 0; d41[2] = 0; d41[3] = 0; d42[0] = 0; d42[1] = 0; d42[2] = 0; d42[3] = 0; d43[0] = 0; d43[1] = 0; d43[2] = 0; d43[3] = 0; sha1_update_64 (&ctx, d40, d41, d42, d43, 4); sha1_final (&ctx); a = ctx.h[0]; b = ctx.h[1]; c = ctx.h[2]; d = ctx.h[3]; e = ctx.h[4]; } const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m14400_a1-optimized.cl000066400000000000000000000641631320027462700200140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void append_4 (const u32 offset, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 src_r0) { u32 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: w0[0] |= tmp[0]; w0[1] = tmp[1]; break; case 1: w0[1] |= tmp[0]; w0[2] = tmp[1]; break; case 2: w0[2] |= tmp[0]; w0[3] = tmp[1]; break; case 3: w0[3] |= tmp[0]; w1[0] = tmp[1]; break; case 4: w1[0] |= tmp[0]; w1[1] = tmp[1]; break; case 5: w1[1] |= tmp[0]; w1[2] = tmp[1]; break; case 6: w1[2] |= tmp[0]; w1[3] = tmp[1]; break; case 7: w1[3] |= tmp[0]; w2[0] = tmp[1]; break; case 8: w2[0] |= tmp[0]; w2[1] = tmp[1]; break; case 9: w2[1] |= tmp[0]; w2[2] = tmp[1]; break; case 10: w2[2] |= tmp[0]; w2[3] = tmp[1]; break; case 11: w2[3] |= tmp[0]; w3[0] = tmp[1]; break; case 12: w3[0] |= tmp[0]; w3[1] = tmp[1]; break; case 13: w3[1] |= tmp[0]; w3[2] = tmp[1]; break; case 14: w3[2] |= tmp[0]; w3[3] = tmp[1]; break; case 15: w3[3] |= tmp[0]; break; } } void shift_2 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4]) { w3[3] = w3[2] >> 16 | w3[3] << 16; w3[2] = w3[1] >> 16 | w3[2] << 16; w3[1] = w3[0] >> 16 | w3[1] << 16; w3[0] = w2[3] >> 16 | w3[0] << 16; w2[3] = w2[2] >> 16 | w2[3] << 16; w2[2] = w2[1] >> 16 | w2[2] << 16; w2[1] = w2[0] >> 16 | w2[1] << 16; w2[0] = w1[3] >> 16 | w2[0] << 16; w1[3] = w1[2] >> 16 | w1[3] << 16; w1[2] = w1[1] >> 16 | w1[2] << 16; w1[1] = w1[0] >> 16 | w1[1] << 16; w1[0] = w0[3] >> 16 | w1[0] << 16; w0[3] = w0[2] >> 16 | w0[3] << 16; w0[2] = w0[1] >> 16 | w0[2] << 16; w0[1] = w0[0] >> 16 | w0[1] << 16; w0[0] = 0 | w0[0] << 16; } __kernel void m14400_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ const u32 dashes = 0x2d2d2d2d; u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[2] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; salt_buf3[0] = 0; salt_buf3[1] = 0; salt_buf3[2] = 0; salt_buf3[3] = 0; shift_2 (salt_buf0, salt_buf1, salt_buf2, salt_buf3); salt_buf0[0] |= dashes >> 16; salt_buf1[1] |= dashes << 16; salt_buf0[0] = swap32 (salt_buf0[0]); salt_buf0[1] = swap32 (salt_buf0[1]); salt_buf0[2] = swap32 (salt_buf0[2]); salt_buf0[3] = swap32 (salt_buf0[3]); salt_buf1[0] = swap32 (salt_buf1[0]); salt_buf1[1] = swap32 (salt_buf1[1]); salt_buf1[2] = swap32 (salt_buf1[2]); salt_buf1[3] = swap32 (salt_buf1[3]); salt_buf2[0] = swap32 (salt_buf2[0]); salt_buf2[1] = swap32 (salt_buf2[1]); salt_buf2[2] = swap32 (salt_buf2[2]); salt_buf2[3] = swap32 (salt_buf2[3]); salt_buf3[0] = swap32 (salt_buf3[0]); salt_buf3[1] = swap32 (salt_buf3[1]); salt_buf3[2] = swap32 (salt_buf3[2]); salt_buf3[3] = swap32 (salt_buf3[3]); const u32 salt_len_orig = salt_bufs[salt_pos].salt_len; const u32 salt_len_new = 2 + salt_len_orig + 2; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ append_4 (pw_len, w0, w1, w2, w3, dashes); shift_2 (w0, w1, w2, w3); w0[0] |= dashes >> 16; const u32x pw_len_new = 2 + pw_len + 4; append_0x80_4x4_VV (w0, w1, w2, w3, pw_len_new); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[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; /** * prepend salt */ const u32x out_salt_len = salt_len_new + pw_len_new; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = salt_buf0[0]; t0[1] = salt_buf0[1]; t0[2] = salt_buf0[2]; t0[3] = salt_buf0[3]; t1[0] = salt_buf1[0]; t1[1] = salt_buf1[1]; t1[2] = w0[0]; t1[3] = w0[1]; t2[0] = w0[2]; t2[1] = w0[3]; t2[2] = w1[0]; t2[3] = w1[1]; t3[0] = w1[2]; t3[1] = w1[3]; t3[2] = 0; t3[3] = out_salt_len * 8; /** * sha1 */ 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_vector (t0, t1, t2, t3, digest); for (int i = 1; i < 10; i++) { u32 s[10]; s[0] = uint_to_hex_lower8_le ((digest[0] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[0] >> 24) & 255) << 16; s[1] = uint_to_hex_lower8_le ((digest[0] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[0] >> 8) & 255) << 16; s[2] = uint_to_hex_lower8_le ((digest[1] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[1] >> 24) & 255) << 16; s[3] = uint_to_hex_lower8_le ((digest[1] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[1] >> 8) & 255) << 16; s[4] = uint_to_hex_lower8_le ((digest[2] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[2] >> 24) & 255) << 16; s[5] = uint_to_hex_lower8_le ((digest[2] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[2] >> 8) & 255) << 16; s[6] = uint_to_hex_lower8_le ((digest[3] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[3] >> 24) & 255) << 16; s[7] = uint_to_hex_lower8_le ((digest[3] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[3] >> 8) & 255) << 16; s[8] = uint_to_hex_lower8_le ((digest[4] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[4] >> 24) & 255) << 16; s[9] = uint_to_hex_lower8_le ((digest[4] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[4] >> 8) & 255) << 16; t0[0] = salt_buf0[0]; t0[1] = salt_buf0[1]; t0[2] = salt_buf0[2]; t0[3] = salt_buf0[3]; t1[0] = salt_buf1[0]; t1[1] = salt_buf1[1]; t1[2] = s[0]; t1[3] = s[1]; t2[0] = s[2]; t2[1] = s[3]; t2[2] = s[4]; t2[3] = s[5]; t3[0] = s[6]; t3[1] = s[7]; t3[2] = s[8]; t3[3] = s[9]; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (t0, t1, t2, t3, digest); t0[0] = w0[0]; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = (salt_len_new + 40 + pw_len_new) * 8; sha1_transform_vector (t0, t1, t2, t3, 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]; COMPARE_M_SIMD (d, e, c, b); } } __kernel void m14400_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m14400_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m14400_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ const u32 dashes = 0x2d2d2d2d; u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[2] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; salt_buf3[0] = 0; salt_buf3[1] = 0; salt_buf3[2] = 0; salt_buf3[3] = 0; shift_2 (salt_buf0, salt_buf1, salt_buf2, salt_buf3); salt_buf0[0] |= dashes >> 16; salt_buf1[1] |= dashes << 16; salt_buf0[0] = swap32 (salt_buf0[0]); salt_buf0[1] = swap32 (salt_buf0[1]); salt_buf0[2] = swap32 (salt_buf0[2]); salt_buf0[3] = swap32 (salt_buf0[3]); salt_buf1[0] = swap32 (salt_buf1[0]); salt_buf1[1] = swap32 (salt_buf1[1]); salt_buf1[2] = swap32 (salt_buf1[2]); salt_buf1[3] = swap32 (salt_buf1[3]); salt_buf2[0] = swap32 (salt_buf2[0]); salt_buf2[1] = swap32 (salt_buf2[1]); salt_buf2[2] = swap32 (salt_buf2[2]); salt_buf2[3] = swap32 (salt_buf2[3]); salt_buf3[0] = swap32 (salt_buf3[0]); salt_buf3[1] = swap32 (salt_buf3[1]); salt_buf3[2] = swap32 (salt_buf3[2]); salt_buf3[3] = swap32 (salt_buf3[3]); const u32 salt_len_orig = salt_bufs[salt_pos].salt_len; const u32 salt_len_new = 2 + salt_len_orig + 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; /** * sha1 */ append_4 (pw_len, w0, w1, w2, w3, dashes); shift_2 (w0, w1, w2, w3); w0[0] |= dashes >> 16; const u32x pw_len_new = 2 + pw_len + 4; append_0x80_4x4_VV (w0, w1, w2, w3, pw_len_new); w0[0] = swap32 (w0[0]); w0[1] = swap32 (w0[1]); w0[2] = swap32 (w0[2]); w0[3] = swap32 (w0[3]); w1[0] = swap32 (w1[0]); w1[1] = swap32 (w1[1]); w1[2] = swap32 (w1[2]); w1[3] = swap32 (w1[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; /** * prepend salt */ const u32x out_salt_len = salt_len_new + pw_len_new; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = salt_buf0[0]; t0[1] = salt_buf0[1]; t0[2] = salt_buf0[2]; t0[3] = salt_buf0[3]; t1[0] = salt_buf1[0]; t1[1] = salt_buf1[1]; t1[2] = w0[0]; t1[3] = w0[1]; t2[0] = w0[2]; t2[1] = w0[3]; t2[2] = w1[0]; t2[3] = w1[1]; t3[0] = w1[2]; t3[1] = w1[3]; t3[2] = 0; t3[3] = out_salt_len * 8; /** * sha1 */ 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_vector (t0, t1, t2, t3, digest); for (int i = 1; i < 10; i++) { u32 s[10]; s[0] = uint_to_hex_lower8_le ((digest[0] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[0] >> 24) & 255) << 16; s[1] = uint_to_hex_lower8_le ((digest[0] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[0] >> 8) & 255) << 16; s[2] = uint_to_hex_lower8_le ((digest[1] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[1] >> 24) & 255) << 16; s[3] = uint_to_hex_lower8_le ((digest[1] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[1] >> 8) & 255) << 16; s[4] = uint_to_hex_lower8_le ((digest[2] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[2] >> 24) & 255) << 16; s[5] = uint_to_hex_lower8_le ((digest[2] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[2] >> 8) & 255) << 16; s[6] = uint_to_hex_lower8_le ((digest[3] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[3] >> 24) & 255) << 16; s[7] = uint_to_hex_lower8_le ((digest[3] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[3] >> 8) & 255) << 16; s[8] = uint_to_hex_lower8_le ((digest[4] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[4] >> 24) & 255) << 16; s[9] = uint_to_hex_lower8_le ((digest[4] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[4] >> 8) & 255) << 16; t0[0] = salt_buf0[0]; t0[1] = salt_buf0[1]; t0[2] = salt_buf0[2]; t0[3] = salt_buf0[3]; t1[0] = salt_buf1[0]; t1[1] = salt_buf1[1]; t1[2] = s[0]; t1[3] = s[1]; t2[0] = s[2]; t2[1] = s[3]; t2[2] = s[4]; t2[3] = s[5]; t3[0] = s[6]; t3[1] = s[7]; t3[2] = s[8]; t3[3] = s[9]; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (t0, t1, t2, t3, digest); t0[0] = w0[0]; t0[1] = w0[1]; t0[2] = w0[2]; t0[3] = w0[3]; t1[0] = w1[0]; t1[1] = w1[1]; t1[2] = w1[2]; t1[3] = w1[3]; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = (salt_len_new + 40 + pw_len_new) * 8; sha1_transform_vector (t0, t1, t2, t3, 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]; COMPARE_S_SIMD (d, e, c, b); } } __kernel void m14400_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m14400_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m14400_a1.cl000066400000000000000000000326201320027462700160030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m14400_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); u32 d20[4]; u32 d21[4]; u32 d22[4]; u32 d23[4]; d20[0] = 0x2d2d0000; d20[1] = 0; d20[2] = 0; d20[3] = 0; d21[0] = 0; d21[1] = 0; d21[2] = 0; d21[3] = 0; d22[0] = 0; d22[1] = 0; d22[2] = 0; d22[3] = 0; d23[0] = 0; d23[1] = 0; d23[2] = 0; d23[3] = 0; sha1_update_64 (&ctx0, d20, d21, d22, d23, 2); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); u32 d40[4]; u32 d41[4]; u32 d42[4]; u32 d43[4]; d40[0] = 0x2d2d2d2d; d40[1] = 0; d40[2] = 0; d40[3] = 0; d41[0] = 0; d41[1] = 0; d41[2] = 0; d41[3] = 0; d42[0] = 0; d42[1] = 0; d42[2] = 0; d42[3] = 0; d43[0] = 0; d43[1] = 0; d43[2] = 0; d43[3] = 0; sha1_update_64 (&ctx0, d20, d21, d22, d23, 2); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1 = ctx0; d20[0] = 0x2d2d0000; d20[1] = 0; d20[2] = 0; d20[3] = 0; d21[0] = 0; d21[1] = 0; d21[2] = 0; d21[3] = 0; d22[0] = 0; d22[1] = 0; d22[2] = 0; d22[3] = 0; d23[0] = 0; d23[1] = 0; d23[2] = 0; d23[3] = 0; sha1_update_64 (&ctx1, d20, d21, d22, d23, 2); sha1_update_global_swap (&ctx1, pws[gid].i, pws[gid].pw_len); sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); d40[0] = 0x2d2d2d2d; d40[1] = 0; d40[2] = 0; d40[3] = 0; d41[0] = 0; d41[1] = 0; d41[2] = 0; d41[3] = 0; d42[0] = 0; d42[1] = 0; d42[2] = 0; d42[3] = 0; d43[0] = 0; d43[1] = 0; d43[2] = 0; d43[3] = 0; sha1_update_64 (&ctx1, d40, d41, d42, d43, 4); sha1_final (&ctx1); u32 a = ctx1.h[0]; u32 b = ctx1.h[1]; u32 c = ctx1.h[2]; u32 d = ctx1.h[3]; u32 e = ctx1.h[4]; sha1_ctx_t ctx; for (int i = 1; i < 10; i++) { ctx = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx, w0, w1, w2, w3, 40); d20[0] = 0x2d2d0000; d20[1] = 0; d20[2] = 0; d20[3] = 0; d21[0] = 0; d21[1] = 0; d21[2] = 0; d21[3] = 0; d22[0] = 0; d22[1] = 0; d22[2] = 0; d22[3] = 0; d23[0] = 0; d23[1] = 0; d23[2] = 0; d23[3] = 0; sha1_update_64 (&ctx, d20, d21, d22, d23, 2); sha1_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); d40[0] = 0x2d2d2d2d; d40[1] = 0; d40[2] = 0; d40[3] = 0; d41[0] = 0; d41[1] = 0; d41[2] = 0; d41[3] = 0; d42[0] = 0; d42[1] = 0; d42[2] = 0; d42[3] = 0; d43[0] = 0; d43[1] = 0; d43[2] = 0; d43[3] = 0; sha1_update_64 (&ctx, d40, d41, d42, d43, 4); sha1_final (&ctx); a = ctx.h[0]; b = ctx.h[1]; c = ctx.h[2]; d = ctx.h[3]; e = ctx.h[4]; } const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m14400_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ sha1_ctx_t ctx0; sha1_init (&ctx0); u32 d20[4]; u32 d21[4]; u32 d22[4]; u32 d23[4]; d20[0] = 0x2d2d0000; d20[1] = 0; d20[2] = 0; d20[3] = 0; d21[0] = 0; d21[1] = 0; d21[2] = 0; d21[3] = 0; d22[0] = 0; d22[1] = 0; d22[2] = 0; d22[3] = 0; d23[0] = 0; d23[1] = 0; d23[2] = 0; d23[3] = 0; sha1_update_64 (&ctx0, d20, d21, d22, d23, 2); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); u32 d40[4]; u32 d41[4]; u32 d42[4]; u32 d43[4]; d40[0] = 0x2d2d2d2d; d40[1] = 0; d40[2] = 0; d40[3] = 0; d41[0] = 0; d41[1] = 0; d41[2] = 0; d41[3] = 0; d42[0] = 0; d42[1] = 0; d42[2] = 0; d42[3] = 0; d43[0] = 0; d43[1] = 0; d43[2] = 0; d43[3] = 0; sha1_update_64 (&ctx0, d20, d21, d22, d23, 2); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx1 = ctx0; d20[0] = 0x2d2d0000; d20[1] = 0; d20[2] = 0; d20[3] = 0; d21[0] = 0; d21[1] = 0; d21[2] = 0; d21[3] = 0; d22[0] = 0; d22[1] = 0; d22[2] = 0; d22[3] = 0; d23[0] = 0; d23[1] = 0; d23[2] = 0; d23[3] = 0; sha1_update_64 (&ctx1, d20, d21, d22, d23, 2); sha1_update_global_swap (&ctx1, pws[gid].i, pws[gid].pw_len); sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); d40[0] = 0x2d2d2d2d; d40[1] = 0; d40[2] = 0; d40[3] = 0; d41[0] = 0; d41[1] = 0; d41[2] = 0; d41[3] = 0; d42[0] = 0; d42[1] = 0; d42[2] = 0; d42[3] = 0; d43[0] = 0; d43[1] = 0; d43[2] = 0; d43[3] = 0; sha1_update_64 (&ctx1, d40, d41, d42, d43, 4); sha1_final (&ctx1); u32 a = ctx1.h[0]; u32 b = ctx1.h[1]; u32 c = ctx1.h[2]; u32 d = ctx1.h[3]; u32 e = ctx1.h[4]; sha1_ctx_t ctx; for (int i = 1; i < 10; i++) { ctx = ctx0; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_64 (&ctx, w0, w1, w2, w3, 40); d20[0] = 0x2d2d0000; d20[1] = 0; d20[2] = 0; d20[3] = 0; d21[0] = 0; d21[1] = 0; d21[2] = 0; d21[3] = 0; d22[0] = 0; d22[1] = 0; d22[2] = 0; d22[3] = 0; d23[0] = 0; d23[1] = 0; d23[2] = 0; d23[3] = 0; sha1_update_64 (&ctx, d20, d21, d22, d23, 2); sha1_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); d40[0] = 0x2d2d2d2d; d40[1] = 0; d40[2] = 0; d40[3] = 0; d41[0] = 0; d41[1] = 0; d41[2] = 0; d41[3] = 0; d42[0] = 0; d42[1] = 0; d42[2] = 0; d42[3] = 0; d43[0] = 0; d43[1] = 0; d43[2] = 0; d43[3] = 0; sha1_update_64 (&ctx, d40, d41, d42, d43, 4); sha1_final (&ctx); a = ctx.h[0]; b = ctx.h[1]; c = ctx.h[2]; d = ctx.h[3]; e = ctx.h[4]; } const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m14400_a3-optimized.cl000066400000000000000000001016631320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif void append_4 (const u32 offset, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 src_r0) { u32 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: w0[0] |= tmp[0]; w0[1] = tmp[1]; break; case 1: w0[1] |= tmp[0]; w0[2] = tmp[1]; break; case 2: w0[2] |= tmp[0]; w0[3] = tmp[1]; break; case 3: w0[3] |= tmp[0]; w1[0] = tmp[1]; break; case 4: w1[0] |= tmp[0]; w1[1] = tmp[1]; break; case 5: w1[1] |= tmp[0]; w1[2] = tmp[1]; break; case 6: w1[2] |= tmp[0]; w1[3] = tmp[1]; break; case 7: w1[3] |= tmp[0]; w2[0] = tmp[1]; break; case 8: w2[0] |= tmp[0]; w2[1] = tmp[1]; break; case 9: w2[1] |= tmp[0]; w2[2] = tmp[1]; break; case 10: w2[2] |= tmp[0]; w2[3] = tmp[1]; break; case 11: w2[3] |= tmp[0]; w3[0] = tmp[1]; break; case 12: w3[0] |= tmp[0]; w3[1] = tmp[1]; break; case 13: w3[1] |= tmp[0]; w3[2] = tmp[1]; break; case 14: w3[2] |= tmp[0]; w3[3] = tmp[1]; break; case 15: w3[3] |= tmp[0]; break; } } void shift_2 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4]) { w3[3] = w3[2] >> 16 | w3[3] << 16; w3[2] = w3[1] >> 16 | w3[2] << 16; w3[1] = w3[0] >> 16 | w3[1] << 16; w3[0] = w2[3] >> 16 | w3[0] << 16; w2[3] = w2[2] >> 16 | w2[3] << 16; w2[2] = w2[1] >> 16 | w2[2] << 16; w2[1] = w2[0] >> 16 | w2[1] << 16; w2[0] = w1[3] >> 16 | w2[0] << 16; w1[3] = w1[2] >> 16 | w1[3] << 16; w1[2] = w1[1] >> 16 | w1[2] << 16; w1[1] = w1[0] >> 16 | w1[1] << 16; w1[0] = w0[3] >> 16 | w1[0] << 16; w0[3] = w0[2] >> 16 | w0[3] << 16; w0[2] = w0[1] >> 16 | w0[2] << 16; w0[1] = w0[0] >> 16 | w0[1] << 16; w0[0] = 0 | w0[0] << 16; } void m14400m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 dashes = 0x2d2d2d2d; u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[2] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; salt_buf3[0] = 0; salt_buf3[1] = 0; salt_buf3[2] = 0; salt_buf3[3] = 0; shift_2 (salt_buf0, salt_buf1, salt_buf2, salt_buf3); salt_buf0[0] |= dashes >> 16; salt_buf1[1] |= dashes << 16; salt_buf0[0] = swap32 (salt_buf0[0]); salt_buf0[1] = swap32 (salt_buf0[1]); salt_buf0[2] = swap32 (salt_buf0[2]); salt_buf0[3] = swap32 (salt_buf0[3]); salt_buf1[0] = swap32 (salt_buf1[0]); salt_buf1[1] = swap32 (salt_buf1[1]); salt_buf1[2] = swap32 (salt_buf1[2]); salt_buf1[3] = swap32 (salt_buf1[3]); salt_buf2[0] = swap32 (salt_buf2[0]); salt_buf2[1] = swap32 (salt_buf2[1]); salt_buf2[2] = swap32 (salt_buf2[2]); salt_buf2[3] = swap32 (salt_buf2[3]); salt_buf3[0] = swap32 (salt_buf3[0]); salt_buf3[1] = swap32 (salt_buf3[1]); salt_buf3[2] = swap32 (salt_buf3[2]); salt_buf3[3] = swap32 (salt_buf3[3]); const u32 salt_len_orig = salt_bufs[salt_pos].salt_len; const u32 salt_len_new = 2 + salt_len_orig + 2; /** * prepare word */ u32 w0l = w0[0]; switch (pw_len) { case 1: w0l |= dashes << 8; break; case 2: w0l |= dashes << 16; break; case 3: w0l |= dashes << 24; break; } u32 w0_t[4] = { 0 }; u32 w1_t[4] = { 0 }; u32 w2_t[4] = { 0 }; u32 w3_t[4] = { 0 }; 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]; append_4 (pw_len, w0_t, w1_t, w2_t, w3_t, dashes); shift_2 (w0_t, w1_t, w2_t, w3_t); w0_t[0] |= dashes >> 16; const u32x pw_len_new = 2 + pw_len + 4; append_0x80_2x4_VV (w0_t, w1_t, pw_len_new); w0_t[0] = swap32 (w0_t[0]); w0_t[1] = swap32 (w0_t[1]); w0_t[2] = swap32 (w0_t[2]); w0_t[3] = swap32 (w0_t[3]); w1_t[0] = swap32 (w1_t[0]); w1_t[1] = swap32 (w1_t[1]); w1_t[2] = swap32 (w1_t[2]); w1_t[3] = swap32 (w1_t[3]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; const u32x w0lr_s = swap32 (w0lr); w0_t[0] = (w0_t[0] & 0xffff0000) | (w0lr_s >> 16); w0_t[1] = (w0_t[1] & 0x0000ffff) | (w0lr_s << 16); const u32x pw_salt_len = salt_len_new + pw_len_new; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = salt_buf0[0]; t0[1] = salt_buf0[1]; t0[2] = salt_buf0[2]; t0[3] = salt_buf0[3]; t1[0] = salt_buf1[0]; t1[1] = salt_buf1[1]; t1[2] = w0_t[0]; t1[3] = w0_t[1]; t2[0] = w0_t[2]; t2[1] = w0_t[3]; t2[2] = w1_t[0]; t2[3] = w1_t[1]; t3[0] = w1_t[2]; t3[1] = w1_t[3]; t3[2] = 0; t3[3] = pw_salt_len * 8; /** * sha1 */ 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_vector (t0, t1, t2, t3, digest); for (int i = 1; i < 10; i++) { u32 s[10]; s[0] = uint_to_hex_lower8_le ((digest[0] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[0] >> 24) & 255) << 16; s[1] = uint_to_hex_lower8_le ((digest[0] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[0] >> 8) & 255) << 16; s[2] = uint_to_hex_lower8_le ((digest[1] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[1] >> 24) & 255) << 16; s[3] = uint_to_hex_lower8_le ((digest[1] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[1] >> 8) & 255) << 16; s[4] = uint_to_hex_lower8_le ((digest[2] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[2] >> 24) & 255) << 16; s[5] = uint_to_hex_lower8_le ((digest[2] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[2] >> 8) & 255) << 16; s[6] = uint_to_hex_lower8_le ((digest[3] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[3] >> 24) & 255) << 16; s[7] = uint_to_hex_lower8_le ((digest[3] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[3] >> 8) & 255) << 16; s[8] = uint_to_hex_lower8_le ((digest[4] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[4] >> 24) & 255) << 16; s[9] = uint_to_hex_lower8_le ((digest[4] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[4] >> 8) & 255) << 16; t0[0] = salt_buf0[0]; t0[1] = salt_buf0[1]; t0[2] = salt_buf0[2]; t0[3] = salt_buf0[3]; t1[0] = salt_buf1[0]; t1[1] = salt_buf1[1]; t1[2] = s[0]; t1[3] = s[1]; t2[0] = s[2]; t2[1] = s[3]; t2[2] = s[4]; t2[3] = s[5]; t3[0] = s[6]; t3[1] = s[7]; t3[2] = s[8]; t3[3] = s[9]; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (t0, t1, t2, t3, digest); t0[0] = w0_t[0]; t0[1] = w0_t[1]; t0[2] = w0_t[2]; t0[3] = w0_t[3]; t1[0] = w1_t[0]; t1[1] = w1_t[1]; t1[2] = w1_t[2]; t1[3] = w1_t[3]; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = (salt_len_new + 40 + pw_len_new) * 8; sha1_transform_vector (t0, t1, t2, t3, 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]; COMPARE_M_SIMD (d, e, c, b); } } void m14400s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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 dashes = 0x2d2d2d2d; u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0; salt_buf1[2] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; salt_buf3[0] = 0; salt_buf3[1] = 0; salt_buf3[2] = 0; salt_buf3[3] = 0; shift_2 (salt_buf0, salt_buf1, salt_buf2, salt_buf3); salt_buf0[0] |= dashes >> 16; salt_buf1[1] |= dashes << 16; salt_buf0[0] = swap32 (salt_buf0[0]); salt_buf0[1] = swap32 (salt_buf0[1]); salt_buf0[2] = swap32 (salt_buf0[2]); salt_buf0[3] = swap32 (salt_buf0[3]); salt_buf1[0] = swap32 (salt_buf1[0]); salt_buf1[1] = swap32 (salt_buf1[1]); salt_buf1[2] = swap32 (salt_buf1[2]); salt_buf1[3] = swap32 (salt_buf1[3]); salt_buf2[0] = swap32 (salt_buf2[0]); salt_buf2[1] = swap32 (salt_buf2[1]); salt_buf2[2] = swap32 (salt_buf2[2]); salt_buf2[3] = swap32 (salt_buf2[3]); salt_buf3[0] = swap32 (salt_buf3[0]); salt_buf3[1] = swap32 (salt_buf3[1]); salt_buf3[2] = swap32 (salt_buf3[2]); salt_buf3[3] = swap32 (salt_buf3[3]); const u32 salt_len_orig = salt_bufs[salt_pos].salt_len; const u32 salt_len_new = 2 + salt_len_orig + 2; /** * prepare word */ u32 w0l = w0[0]; switch (pw_len) { case 1: w0l |= dashes << 8; break; case 2: w0l |= dashes << 16; break; case 3: w0l |= dashes << 24; break; } u32 w0_t[4] = { 0 }; u32 w1_t[4] = { 0 }; u32 w2_t[4] = { 0 }; u32 w3_t[4] = { 0 }; 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]; append_4 (pw_len, w0_t, w1_t, w2_t, w3_t, dashes); shift_2 (w0_t, w1_t, w2_t, w3_t); w0_t[0] |= dashes >> 16; const u32x pw_len_new = 2 + pw_len + 4; append_0x80_2x4_VV (w0_t, w1_t, pw_len_new); w0_t[0] = swap32 (w0_t[0]); w0_t[1] = swap32 (w0_t[1]); w0_t[2] = swap32 (w0_t[2]); w0_t[3] = swap32 (w0_t[3]); w1_t[0] = swap32 (w1_t[0]); w1_t[1] = swap32 (w1_t[1]); w1_t[2] = swap32 (w1_t[2]); w1_t[3] = swap32 (w1_t[3]); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = ix_create_bft (bfs_buf, il_pos); const u32x w0lr = w0l | w0r; const u32x w0lr_s = swap32 (w0lr); w0_t[0] = (w0_t[0] & 0xffff0000) | (w0lr_s >> 16); w0_t[1] = (w0_t[1] & 0x0000ffff) | (w0lr_s << 16); const u32x pw_salt_len = salt_len_new + pw_len_new; u32x t0[4]; u32x t1[4]; u32x t2[4]; u32x t3[4]; t0[0] = salt_buf0[0]; t0[1] = salt_buf0[1]; t0[2] = salt_buf0[2]; t0[3] = salt_buf0[3]; t1[0] = salt_buf1[0]; t1[1] = salt_buf1[1]; t1[2] = w0_t[0]; t1[3] = w0_t[1]; t2[0] = w0_t[2]; t2[1] = w0_t[3]; t2[2] = w1_t[0]; t2[3] = w1_t[1]; t3[0] = w1_t[2]; t3[1] = w1_t[3]; t3[2] = 0; t3[3] = pw_salt_len * 8; /** * sha1 */ 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_vector (t0, t1, t2, t3, digest); for (int i = 1; i < 10; i++) { u32 s[10]; s[0] = uint_to_hex_lower8_le ((digest[0] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[0] >> 24) & 255) << 16; s[1] = uint_to_hex_lower8_le ((digest[0] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[0] >> 8) & 255) << 16; s[2] = uint_to_hex_lower8_le ((digest[1] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[1] >> 24) & 255) << 16; s[3] = uint_to_hex_lower8_le ((digest[1] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[1] >> 8) & 255) << 16; s[4] = uint_to_hex_lower8_le ((digest[2] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[2] >> 24) & 255) << 16; s[5] = uint_to_hex_lower8_le ((digest[2] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[2] >> 8) & 255) << 16; s[6] = uint_to_hex_lower8_le ((digest[3] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[3] >> 24) & 255) << 16; s[7] = uint_to_hex_lower8_le ((digest[3] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[3] >> 8) & 255) << 16; s[8] = uint_to_hex_lower8_le ((digest[4] >> 16) & 255) << 0 | uint_to_hex_lower8_le ((digest[4] >> 24) & 255) << 16; s[9] = uint_to_hex_lower8_le ((digest[4] >> 0) & 255) << 0 | uint_to_hex_lower8_le ((digest[4] >> 8) & 255) << 16; t0[0] = salt_buf0[0]; t0[1] = salt_buf0[1]; t0[2] = salt_buf0[2]; t0[3] = salt_buf0[3]; t1[0] = salt_buf1[0]; t1[1] = salt_buf1[1]; t1[2] = s[0]; t1[3] = s[1]; t2[0] = s[2]; t2[1] = s[3]; t2[2] = s[4]; t2[3] = s[5]; t3[0] = s[6]; t3[1] = s[7]; t3[2] = s[8]; t3[3] = s[9]; digest[0] = SHA1M_A; digest[1] = SHA1M_B; digest[2] = SHA1M_C; digest[3] = SHA1M_D; digest[4] = SHA1M_E; sha1_transform_vector (t0, t1, t2, t3, digest); t0[0] = w0_t[0]; t0[1] = w0_t[1]; t0[2] = w0_t[2]; t0[3] = w0_t[3]; t1[0] = w1_t[0]; t1[1] = w1_t[1]; t1[2] = w1_t[2]; t1[3] = w1_t[3]; t2[0] = 0; t2[1] = 0; t2[2] = 0; t2[3] = 0; t3[0] = 0; t3[1] = 0; t3[2] = 0; t3[3] = (salt_len_new + 40 + pw_len_new) * 8; sha1_transform_vector (t0, t1, t2, t3, 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]; COMPARE_S_SIMD (d, e, c, b); } } __kernel void m14400_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ m14400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m14400_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ m14400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m14400_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ m14400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m14400_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ m14400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m14400_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ m14400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } __kernel void m14400_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = pws[gid].i[ 4]; w1[1] = pws[gid].i[ 5]; w1[2] = pws[gid].i[ 6]; w1[3] = pws[gid].i[ 7]; u32 w2[4]; w2[0] = pws[gid].i[ 8]; w2[1] = pws[gid].i[ 9]; w2[2] = pws[gid].i[10]; w2[3] = pws[gid].i[11]; u32 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 */ m14400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc); } hashcat-4.0.1/OpenCL/m14400_a3.cl000066400000000000000000000344701320027462700160120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #if VECT_SIZE == 1 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i)]) #elif VECT_SIZE == 2 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) #elif VECT_SIZE == 4 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) #elif VECT_SIZE == 8 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) #elif VECT_SIZE == 16 #define uint_to_hex_lower8_le(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif __kernel void m14400_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); u32 d20[4]; u32 d21[4]; u32 d22[4]; u32 d23[4]; d20[0] = 0x2d2d0000; d20[1] = 0; d20[2] = 0; d20[3] = 0; d21[0] = 0; d21[1] = 0; d21[2] = 0; d21[3] = 0; d22[0] = 0; d22[1] = 0; d22[2] = 0; d22[3] = 0; d23[0] = 0; d23[1] = 0; d23[2] = 0; d23[3] = 0; sha1_update_64 (&ctx0, d20, d21, d22, d23, 2); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); u32 d40[4]; u32 d41[4]; u32 d42[4]; u32 d43[4]; d40[0] = 0x2d2d2d2d; d40[1] = 0; d40[2] = 0; d40[3] = 0; d41[0] = 0; d41[1] = 0; d41[2] = 0; d41[3] = 0; d42[0] = 0; d42[1] = 0; d42[2] = 0; d42[3] = 0; d43[0] = 0; d43[1] = 0; d43[2] = 0; d43[3] = 0; sha1_update_64 (&ctx0, d20, d21, d22, d23, 2); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; sha1_ctx_vector_t ctx1; sha1_init_vector_from_scalar (&ctx1, &ctx0); u32x dx20[4]; u32x dx21[4]; u32x dx22[4]; u32x dx23[4]; dx20[0] = 0x2d2d0000; dx20[1] = 0; dx20[2] = 0; dx20[3] = 0; dx21[0] = 0; dx21[1] = 0; dx21[2] = 0; dx21[3] = 0; dx22[0] = 0; dx22[1] = 0; dx22[2] = 0; dx22[3] = 0; dx23[0] = 0; dx23[1] = 0; dx23[2] = 0; dx23[3] = 0; sha1_update_vector_64 (&ctx1, dx20, dx21, dx22, dx23, 2); sha1_update_vector_swap (&ctx1, w, pw_len); u32x dx40[4]; u32x dx41[4]; u32x dx42[4]; u32x dx43[4]; dx40[0] = 0x2d2d2d2d; dx40[1] = 0; dx40[2] = 0; dx40[3] = 0; dx41[0] = 0; dx41[1] = 0; dx41[2] = 0; dx41[3] = 0; dx42[0] = 0; dx42[1] = 0; dx42[2] = 0; dx42[3] = 0; dx43[0] = 0; dx43[1] = 0; dx43[2] = 0; dx43[3] = 0; sha1_update_vector_64 (&ctx1, dx40, dx41, dx42, dx43, 4); sha1_final_vector (&ctx1); u32x a = ctx1.h[0]; u32x b = ctx1.h[1]; u32x c = ctx1.h[2]; u32x d = ctx1.h[3]; u32x e = ctx1.h[4]; sha1_ctx_vector_t ctx; for (int i = 1; i < 10; i++) { sha1_init_vector_from_scalar (&ctx, &ctx0); u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_vector_64 (&ctx, w0, w1, w2, w3, 40); dx20[0] = 0x2d2d0000; dx20[1] = 0; dx20[2] = 0; dx20[3] = 0; dx21[0] = 0; dx21[1] = 0; dx21[2] = 0; dx21[3] = 0; dx22[0] = 0; dx22[1] = 0; dx22[2] = 0; dx22[3] = 0; dx23[0] = 0; dx23[1] = 0; dx23[2] = 0; dx23[3] = 0; sha1_update_vector_64 (&ctx, dx20, dx21, dx22, dx23, 2); sha1_update_vector_swap (&ctx, w, pw_len); dx40[0] = 0x2d2d2d2d; dx40[1] = 0; dx40[2] = 0; dx40[3] = 0; dx41[0] = 0; dx41[1] = 0; dx41[2] = 0; dx41[3] = 0; dx42[0] = 0; dx42[1] = 0; dx42[2] = 0; dx42[3] = 0; dx43[0] = 0; dx43[1] = 0; dx43[2] = 0; dx43[3] = 0; sha1_update_vector_64 (&ctx, dx40, dx41, dx42, dx43, 4); sha1_final_vector (&ctx); a = ctx.h[0]; b = ctx.h[1]; c = ctx.h[2]; d = ctx.h[3]; e = ctx.h[4]; } const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m14400_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * bin2asc table */ __local u32 l_bin2asc[256]; for (u32 i = lid; i < 256; i += lsz) { const u32 i0 = (i >> 0) & 15; const u32 i1 = (i >> 4) & 15; l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } sha1_ctx_t ctx0; sha1_init (&ctx0); u32 d20[4]; u32 d21[4]; u32 d22[4]; u32 d23[4]; d20[0] = 0x2d2d0000; d20[1] = 0; d20[2] = 0; d20[3] = 0; d21[0] = 0; d21[1] = 0; d21[2] = 0; d21[3] = 0; d22[0] = 0; d22[1] = 0; d22[2] = 0; d22[3] = 0; d23[0] = 0; d23[1] = 0; d23[2] = 0; d23[3] = 0; sha1_update_64 (&ctx0, d20, d21, d22, d23, 2); sha1_update_global_swap (&ctx0, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); u32 d40[4]; u32 d41[4]; u32 d42[4]; u32 d43[4]; d40[0] = 0x2d2d2d2d; d40[1] = 0; d40[2] = 0; d40[3] = 0; d41[0] = 0; d41[1] = 0; d41[2] = 0; d41[3] = 0; d42[0] = 0; d42[1] = 0; d42[2] = 0; d42[3] = 0; d43[0] = 0; d43[1] = 0; d43[2] = 0; d43[3] = 0; sha1_update_64 (&ctx0, d20, d21, d22, d23, 2); /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0lr = w0l | w0r; w[0] = w0lr; sha1_ctx_vector_t ctx1; sha1_init_vector_from_scalar (&ctx1, &ctx0); u32x dx20[4]; u32x dx21[4]; u32x dx22[4]; u32x dx23[4]; dx20[0] = 0x2d2d0000; dx20[1] = 0; dx20[2] = 0; dx20[3] = 0; dx21[0] = 0; dx21[1] = 0; dx21[2] = 0; dx21[3] = 0; dx22[0] = 0; dx22[1] = 0; dx22[2] = 0; dx22[3] = 0; dx23[0] = 0; dx23[1] = 0; dx23[2] = 0; dx23[3] = 0; sha1_update_vector_64 (&ctx1, dx20, dx21, dx22, dx23, 2); sha1_update_vector_swap (&ctx1, w, pw_len); u32x dx40[4]; u32x dx41[4]; u32x dx42[4]; u32x dx43[4]; dx40[0] = 0x2d2d2d2d; dx40[1] = 0; dx40[2] = 0; dx40[3] = 0; dx41[0] = 0; dx41[1] = 0; dx41[2] = 0; dx41[3] = 0; dx42[0] = 0; dx42[1] = 0; dx42[2] = 0; dx42[3] = 0; dx43[0] = 0; dx43[1] = 0; dx43[2] = 0; dx43[3] = 0; sha1_update_vector_64 (&ctx1, dx40, dx41, dx42, dx43, 4); sha1_final_vector (&ctx1); u32x a = ctx1.h[0]; u32x b = ctx1.h[1]; u32x c = ctx1.h[2]; u32x d = ctx1.h[3]; u32x e = ctx1.h[4]; sha1_ctx_vector_t ctx; for (int i = 1; i < 10; i++) { sha1_init_vector_from_scalar (&ctx, &ctx0); u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; w2[2] = 0; w2[3] = 0; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; sha1_update_vector_64 (&ctx, w0, w1, w2, w3, 40); dx20[0] = 0x2d2d0000; dx20[1] = 0; dx20[2] = 0; dx20[3] = 0; dx21[0] = 0; dx21[1] = 0; dx21[2] = 0; dx21[3] = 0; dx22[0] = 0; dx22[1] = 0; dx22[2] = 0; dx22[3] = 0; dx23[0] = 0; dx23[1] = 0; dx23[2] = 0; dx23[3] = 0; sha1_update_vector_64 (&ctx, dx20, dx21, dx22, dx23, 2); sha1_update_vector_swap (&ctx, w, pw_len); dx40[0] = 0x2d2d2d2d; dx40[1] = 0; dx40[2] = 0; dx40[3] = 0; dx41[0] = 0; dx41[1] = 0; dx41[2] = 0; dx41[3] = 0; dx42[0] = 0; dx42[1] = 0; dx42[2] = 0; dx42[3] = 0; dx43[0] = 0; dx43[1] = 0; dx43[2] = 0; dx43[3] = 0; sha1_update_vector_64 (&ctx, dx40, dx41, dx42, dx43, 4); sha1_final_vector (&ctx); a = ctx.h[0]; b = ctx.h[1]; c = ctx.h[2]; d = ctx.h[3]; e = ctx.h[4]; } const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m14611.cl000066400000000000000000000241051320027462700154250ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #include "inc_cipher_aes.cl" #include "inc_luks_af.cl" #include "inc_luks_essiv.cl" #include "inc_luks_xts.cl" #include "inc_luks_aes.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #define MAX_ENTROPY 7.0 void hmac_sha1_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m14611_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha1_hmac_ctx_t sha1_hmac_ctx; sha1_hmac_init_global_swap (&sha1_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad32[0] = sha1_hmac_ctx.ipad.h[0]; tmps[gid].ipad32[1] = sha1_hmac_ctx.ipad.h[1]; tmps[gid].ipad32[2] = sha1_hmac_ctx.ipad.h[2]; tmps[gid].ipad32[3] = sha1_hmac_ctx.ipad.h[3]; tmps[gid].ipad32[4] = sha1_hmac_ctx.ipad.h[4]; tmps[gid].opad32[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].opad32[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].opad32[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].opad32[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].opad32[4] = sha1_hmac_ctx.opad.h[4]; sha1_hmac_update_global_swap (&sha1_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); const u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0, j = 1; i < ((key_size / 8) / 4); i += 5, j += 1) { sha1_hmac_ctx_t sha1_hmac_ctx2 = sha1_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha1_hmac_update_64 (&sha1_hmac_ctx2, w0, w1, w2, w3, 4); sha1_hmac_final (&sha1_hmac_ctx2); tmps[gid].dgst32[i + 0] = sha1_hmac_ctx2.opad.h[0]; tmps[gid].dgst32[i + 1] = sha1_hmac_ctx2.opad.h[1]; tmps[gid].dgst32[i + 2] = sha1_hmac_ctx2.opad.h[2]; tmps[gid].dgst32[i + 3] = sha1_hmac_ctx2.opad.h[3]; tmps[gid].dgst32[i + 4] = sha1_hmac_ctx2.opad.h[4]; tmps[gid].out32[i + 0] = tmps[gid].dgst32[i + 0]; tmps[gid].out32[i + 1] = tmps[gid].dgst32[i + 1]; tmps[gid].out32[i + 2] = tmps[gid].dgst32[i + 2]; tmps[gid].out32[i + 3] = tmps[gid].dgst32[i + 3]; tmps[gid].out32[i + 4] = tmps[gid].dgst32[i + 4]; } } __kernel void m14611_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad32, gid, 0); ipad[1] = packv (tmps, ipad32, gid, 1); ipad[2] = packv (tmps, ipad32, gid, 2); ipad[3] = packv (tmps, ipad32, gid, 3); ipad[4] = packv (tmps, ipad32, gid, 4); opad[0] = packv (tmps, opad32, gid, 0); opad[1] = packv (tmps, opad32, gid, 1); opad[2] = packv (tmps, opad32, gid, 2); opad[3] = packv (tmps, opad32, gid, 3); opad[4] = packv (tmps, opad32, gid, 4); u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0; i < ((key_size / 8) / 4); i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst32, gid, i + 0); dgst[1] = packv (tmps, dgst32, gid, i + 1); dgst[2] = packv (tmps, dgst32, gid, i + 2); dgst[3] = packv (tmps, dgst32, gid, i + 3); dgst[4] = packv (tmps, dgst32, gid, i + 4); out[0] = packv (tmps, out32, gid, i + 0); out[1] = packv (tmps, out32, gid, i + 1); out[2] = packv (tmps, out32, gid, i + 2); out[3] = packv (tmps, out32, gid, i + 3); out[4] = packv (tmps, out32, gid, 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_V (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]; } unpackv (tmps, dgst32, gid, i + 0, dgst[0]); unpackv (tmps, dgst32, gid, i + 1, dgst[1]); unpackv (tmps, dgst32, gid, i + 2, dgst[2]); unpackv (tmps, dgst32, gid, i + 3, dgst[3]); unpackv (tmps, dgst32, gid, i + 4, dgst[4]); unpackv (tmps, out32, gid, i + 0, out[0]); unpackv (tmps, out32, gid, i + 1, out[1]); unpackv (tmps, out32, gid, i + 2, out[2]); unpackv (tmps, out32, gid, i + 3, out[3]); unpackv (tmps, out32, gid, i + 4, out[4]); } } __kernel void m14611_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; // decrypt AF with first pbkdf2 result // merge AF to masterkey // decrypt first payload sector with masterkey u32 pt_buf[128]; luks_af_sha1_then_aes_decrypt (&luks_bufs[digests_offset], &tmps[gid], pt_buf, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); // check entropy const float entropy = get_entropy (pt_buf, 128); if (entropy < MAX_ENTROPY) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m14612.cl000066400000000000000000000217751320027462700154400ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #include "inc_cipher_serpent.cl" #include "inc_luks_af.cl" #include "inc_luks_essiv.cl" #include "inc_luks_xts.cl" #include "inc_luks_serpent.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #define MAX_ENTROPY 7.0 void hmac_sha1_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m14612_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha1_hmac_ctx_t sha1_hmac_ctx; sha1_hmac_init_global_swap (&sha1_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad32[0] = sha1_hmac_ctx.ipad.h[0]; tmps[gid].ipad32[1] = sha1_hmac_ctx.ipad.h[1]; tmps[gid].ipad32[2] = sha1_hmac_ctx.ipad.h[2]; tmps[gid].ipad32[3] = sha1_hmac_ctx.ipad.h[3]; tmps[gid].ipad32[4] = sha1_hmac_ctx.ipad.h[4]; tmps[gid].opad32[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].opad32[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].opad32[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].opad32[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].opad32[4] = sha1_hmac_ctx.opad.h[4]; sha1_hmac_update_global_swap (&sha1_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); const u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0, j = 1; i < ((key_size / 8) / 4); i += 5, j += 1) { sha1_hmac_ctx_t sha1_hmac_ctx2 = sha1_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha1_hmac_update_64 (&sha1_hmac_ctx2, w0, w1, w2, w3, 4); sha1_hmac_final (&sha1_hmac_ctx2); tmps[gid].dgst32[i + 0] = sha1_hmac_ctx2.opad.h[0]; tmps[gid].dgst32[i + 1] = sha1_hmac_ctx2.opad.h[1]; tmps[gid].dgst32[i + 2] = sha1_hmac_ctx2.opad.h[2]; tmps[gid].dgst32[i + 3] = sha1_hmac_ctx2.opad.h[3]; tmps[gid].dgst32[i + 4] = sha1_hmac_ctx2.opad.h[4]; tmps[gid].out32[i + 0] = tmps[gid].dgst32[i + 0]; tmps[gid].out32[i + 1] = tmps[gid].dgst32[i + 1]; tmps[gid].out32[i + 2] = tmps[gid].dgst32[i + 2]; tmps[gid].out32[i + 3] = tmps[gid].dgst32[i + 3]; tmps[gid].out32[i + 4] = tmps[gid].dgst32[i + 4]; } } __kernel void m14612_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad32, gid, 0); ipad[1] = packv (tmps, ipad32, gid, 1); ipad[2] = packv (tmps, ipad32, gid, 2); ipad[3] = packv (tmps, ipad32, gid, 3); ipad[4] = packv (tmps, ipad32, gid, 4); opad[0] = packv (tmps, opad32, gid, 0); opad[1] = packv (tmps, opad32, gid, 1); opad[2] = packv (tmps, opad32, gid, 2); opad[3] = packv (tmps, opad32, gid, 3); opad[4] = packv (tmps, opad32, gid, 4); u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0; i < ((key_size / 8) / 4); i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst32, gid, i + 0); dgst[1] = packv (tmps, dgst32, gid, i + 1); dgst[2] = packv (tmps, dgst32, gid, i + 2); dgst[3] = packv (tmps, dgst32, gid, i + 3); dgst[4] = packv (tmps, dgst32, gid, i + 4); out[0] = packv (tmps, out32, gid, i + 0); out[1] = packv (tmps, out32, gid, i + 1); out[2] = packv (tmps, out32, gid, i + 2); out[3] = packv (tmps, out32, gid, i + 3); out[4] = packv (tmps, out32, gid, 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_V (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]; } unpackv (tmps, dgst32, gid, i + 0, dgst[0]); unpackv (tmps, dgst32, gid, i + 1, dgst[1]); unpackv (tmps, dgst32, gid, i + 2, dgst[2]); unpackv (tmps, dgst32, gid, i + 3, dgst[3]); unpackv (tmps, dgst32, gid, i + 4, dgst[4]); unpackv (tmps, out32, gid, i + 0, out[0]); unpackv (tmps, out32, gid, i + 1, out[1]); unpackv (tmps, out32, gid, i + 2, out[2]); unpackv (tmps, out32, gid, i + 3, out[3]); unpackv (tmps, out32, gid, i + 4, out[4]); } } __kernel void m14612_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; // decrypt AF with first pbkdf2 result // merge AF to masterkey // decrypt first payload sector with masterkey u32 pt_buf[128]; luks_af_sha1_then_serpent_decrypt (&luks_bufs[digests_offset], &tmps[gid], pt_buf); // check entropy const float entropy = get_entropy (pt_buf, 128); if (entropy < MAX_ENTROPY) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m14613.cl000066400000000000000000000217751320027462700154410ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #include "inc_cipher_twofish.cl" #include "inc_luks_af.cl" #include "inc_luks_essiv.cl" #include "inc_luks_xts.cl" #include "inc_luks_twofish.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #define MAX_ENTROPY 7.0 void hmac_sha1_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m14613_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha1_hmac_ctx_t sha1_hmac_ctx; sha1_hmac_init_global_swap (&sha1_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad32[0] = sha1_hmac_ctx.ipad.h[0]; tmps[gid].ipad32[1] = sha1_hmac_ctx.ipad.h[1]; tmps[gid].ipad32[2] = sha1_hmac_ctx.ipad.h[2]; tmps[gid].ipad32[3] = sha1_hmac_ctx.ipad.h[3]; tmps[gid].ipad32[4] = sha1_hmac_ctx.ipad.h[4]; tmps[gid].opad32[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].opad32[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].opad32[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].opad32[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].opad32[4] = sha1_hmac_ctx.opad.h[4]; sha1_hmac_update_global_swap (&sha1_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); const u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0, j = 1; i < ((key_size / 8) / 4); i += 5, j += 1) { sha1_hmac_ctx_t sha1_hmac_ctx2 = sha1_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha1_hmac_update_64 (&sha1_hmac_ctx2, w0, w1, w2, w3, 4); sha1_hmac_final (&sha1_hmac_ctx2); tmps[gid].dgst32[i + 0] = sha1_hmac_ctx2.opad.h[0]; tmps[gid].dgst32[i + 1] = sha1_hmac_ctx2.opad.h[1]; tmps[gid].dgst32[i + 2] = sha1_hmac_ctx2.opad.h[2]; tmps[gid].dgst32[i + 3] = sha1_hmac_ctx2.opad.h[3]; tmps[gid].dgst32[i + 4] = sha1_hmac_ctx2.opad.h[4]; tmps[gid].out32[i + 0] = tmps[gid].dgst32[i + 0]; tmps[gid].out32[i + 1] = tmps[gid].dgst32[i + 1]; tmps[gid].out32[i + 2] = tmps[gid].dgst32[i + 2]; tmps[gid].out32[i + 3] = tmps[gid].dgst32[i + 3]; tmps[gid].out32[i + 4] = tmps[gid].dgst32[i + 4]; } } __kernel void m14613_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad32, gid, 0); ipad[1] = packv (tmps, ipad32, gid, 1); ipad[2] = packv (tmps, ipad32, gid, 2); ipad[3] = packv (tmps, ipad32, gid, 3); ipad[4] = packv (tmps, ipad32, gid, 4); opad[0] = packv (tmps, opad32, gid, 0); opad[1] = packv (tmps, opad32, gid, 1); opad[2] = packv (tmps, opad32, gid, 2); opad[3] = packv (tmps, opad32, gid, 3); opad[4] = packv (tmps, opad32, gid, 4); u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0; i < ((key_size / 8) / 4); i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst32, gid, i + 0); dgst[1] = packv (tmps, dgst32, gid, i + 1); dgst[2] = packv (tmps, dgst32, gid, i + 2); dgst[3] = packv (tmps, dgst32, gid, i + 3); dgst[4] = packv (tmps, dgst32, gid, i + 4); out[0] = packv (tmps, out32, gid, i + 0); out[1] = packv (tmps, out32, gid, i + 1); out[2] = packv (tmps, out32, gid, i + 2); out[3] = packv (tmps, out32, gid, i + 3); out[4] = packv (tmps, out32, gid, 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_V (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]; } unpackv (tmps, dgst32, gid, i + 0, dgst[0]); unpackv (tmps, dgst32, gid, i + 1, dgst[1]); unpackv (tmps, dgst32, gid, i + 2, dgst[2]); unpackv (tmps, dgst32, gid, i + 3, dgst[3]); unpackv (tmps, dgst32, gid, i + 4, dgst[4]); unpackv (tmps, out32, gid, i + 0, out[0]); unpackv (tmps, out32, gid, i + 1, out[1]); unpackv (tmps, out32, gid, i + 2, out[2]); unpackv (tmps, out32, gid, i + 3, out[3]); unpackv (tmps, out32, gid, i + 4, out[4]); } } __kernel void m14613_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; // decrypt AF with first pbkdf2 result // merge AF to masterkey // decrypt first payload sector with masterkey u32 pt_buf[128]; luks_af_sha1_then_twofish_decrypt (&luks_bufs[digests_offset], &tmps[gid], pt_buf); // check entropy const float entropy = get_entropy (pt_buf, 128); if (entropy < MAX_ENTROPY) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m14621.cl000066400000000000000000000275001320027462700154300ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" #include "inc_cipher_aes.cl" #include "inc_luks_af.cl" #include "inc_luks_essiv.cl" #include "inc_luks_xts.cl" #include "inc_luks_aes.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #define MAX_ENTROPY 7.0 void hmac_sha256_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m14621_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha256_hmac_ctx_t sha256_hmac_ctx; sha256_hmac_init_global_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad32[0] = sha256_hmac_ctx.ipad.h[0]; tmps[gid].ipad32[1] = sha256_hmac_ctx.ipad.h[1]; tmps[gid].ipad32[2] = sha256_hmac_ctx.ipad.h[2]; tmps[gid].ipad32[3] = sha256_hmac_ctx.ipad.h[3]; tmps[gid].ipad32[4] = sha256_hmac_ctx.ipad.h[4]; tmps[gid].ipad32[5] = sha256_hmac_ctx.ipad.h[5]; tmps[gid].ipad32[6] = sha256_hmac_ctx.ipad.h[6]; tmps[gid].ipad32[7] = sha256_hmac_ctx.ipad.h[7]; tmps[gid].opad32[0] = sha256_hmac_ctx.opad.h[0]; tmps[gid].opad32[1] = sha256_hmac_ctx.opad.h[1]; tmps[gid].opad32[2] = sha256_hmac_ctx.opad.h[2]; tmps[gid].opad32[3] = sha256_hmac_ctx.opad.h[3]; tmps[gid].opad32[4] = sha256_hmac_ctx.opad.h[4]; tmps[gid].opad32[5] = sha256_hmac_ctx.opad.h[5]; tmps[gid].opad32[6] = sha256_hmac_ctx.opad.h[6]; tmps[gid].opad32[7] = sha256_hmac_ctx.opad.h[7]; sha256_hmac_update_global_swap (&sha256_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); const u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0, j = 1; i < ((key_size / 8) / 4); i += 8, j += 1) { sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); sha256_hmac_final (&sha256_hmac_ctx2); tmps[gid].dgst32[i + 0] = sha256_hmac_ctx2.opad.h[0]; tmps[gid].dgst32[i + 1] = sha256_hmac_ctx2.opad.h[1]; tmps[gid].dgst32[i + 2] = sha256_hmac_ctx2.opad.h[2]; tmps[gid].dgst32[i + 3] = sha256_hmac_ctx2.opad.h[3]; tmps[gid].dgst32[i + 4] = sha256_hmac_ctx2.opad.h[4]; tmps[gid].dgst32[i + 5] = sha256_hmac_ctx2.opad.h[5]; tmps[gid].dgst32[i + 6] = sha256_hmac_ctx2.opad.h[6]; tmps[gid].dgst32[i + 7] = sha256_hmac_ctx2.opad.h[7]; tmps[gid].out32[i + 0] = tmps[gid].dgst32[i + 0]; tmps[gid].out32[i + 1] = tmps[gid].dgst32[i + 1]; tmps[gid].out32[i + 2] = tmps[gid].dgst32[i + 2]; tmps[gid].out32[i + 3] = tmps[gid].dgst32[i + 3]; tmps[gid].out32[i + 4] = tmps[gid].dgst32[i + 4]; tmps[gid].out32[i + 5] = tmps[gid].dgst32[i + 5]; tmps[gid].out32[i + 6] = tmps[gid].dgst32[i + 6]; tmps[gid].out32[i + 7] = tmps[gid].dgst32[i + 7]; } } __kernel void m14621_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[8]; u32x opad[8]; ipad[0] = packv (tmps, ipad32, gid, 0); ipad[1] = packv (tmps, ipad32, gid, 1); ipad[2] = packv (tmps, ipad32, gid, 2); ipad[3] = packv (tmps, ipad32, gid, 3); ipad[4] = packv (tmps, ipad32, gid, 4); ipad[5] = packv (tmps, ipad32, gid, 5); ipad[6] = packv (tmps, ipad32, gid, 6); ipad[7] = packv (tmps, ipad32, gid, 7); opad[0] = packv (tmps, opad32, gid, 0); opad[1] = packv (tmps, opad32, gid, 1); opad[2] = packv (tmps, opad32, gid, 2); opad[3] = packv (tmps, opad32, gid, 3); opad[4] = packv (tmps, opad32, gid, 4); opad[5] = packv (tmps, opad32, gid, 5); opad[6] = packv (tmps, opad32, gid, 6); opad[7] = packv (tmps, opad32, gid, 7); u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0; i < ((key_size / 8) / 4); i += 8) { u32x dgst[8]; u32x out[8]; dgst[0] = packv (tmps, dgst32, gid, i + 0); dgst[1] = packv (tmps, dgst32, gid, i + 1); dgst[2] = packv (tmps, dgst32, gid, i + 2); dgst[3] = packv (tmps, dgst32, gid, i + 3); dgst[4] = packv (tmps, dgst32, gid, i + 4); dgst[5] = packv (tmps, dgst32, gid, i + 5); dgst[6] = packv (tmps, dgst32, gid, i + 6); dgst[7] = packv (tmps, dgst32, gid, i + 7); out[0] = packv (tmps, out32, gid, i + 0); out[1] = packv (tmps, out32, gid, i + 1); out[2] = packv (tmps, out32, gid, i + 2); out[3] = packv (tmps, out32, gid, i + 3); out[4] = packv (tmps, out32, gid, i + 4); out[5] = packv (tmps, out32, gid, i + 5); out[6] = packv (tmps, out32, gid, i + 6); out[7] = packv (tmps, out32, gid, i + 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_V (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]; } unpackv (tmps, dgst32, gid, i + 0, dgst[0]); unpackv (tmps, dgst32, gid, i + 1, dgst[1]); unpackv (tmps, dgst32, gid, i + 2, dgst[2]); unpackv (tmps, dgst32, gid, i + 3, dgst[3]); unpackv (tmps, dgst32, gid, i + 4, dgst[4]); unpackv (tmps, dgst32, gid, i + 5, dgst[5]); unpackv (tmps, dgst32, gid, i + 6, dgst[6]); unpackv (tmps, dgst32, gid, i + 7, dgst[7]); unpackv (tmps, out32, gid, i + 0, out[0]); unpackv (tmps, out32, gid, i + 1, out[1]); unpackv (tmps, out32, gid, i + 2, out[2]); unpackv (tmps, out32, gid, i + 3, out[3]); unpackv (tmps, out32, gid, i + 4, out[4]); unpackv (tmps, out32, gid, i + 5, out[5]); unpackv (tmps, out32, gid, i + 6, out[6]); unpackv (tmps, out32, gid, i + 7, out[7]); } } __kernel void m14621_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; // decrypt AF with first pbkdf2 result // merge AF to masterkey // decrypt first payload sector with masterkey u32 pt_buf[128]; luks_af_sha256_then_aes_decrypt (&luks_bufs[digests_offset], &tmps[gid], pt_buf, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); // check entropy const float entropy = get_entropy (pt_buf, 128); if (entropy < MAX_ENTROPY) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m14622.cl000066400000000000000000000253701320027462700154340ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" #include "inc_cipher_serpent.cl" #include "inc_luks_af.cl" #include "inc_luks_essiv.cl" #include "inc_luks_xts.cl" #include "inc_luks_serpent.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #define MAX_ENTROPY 7.0 void hmac_sha256_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m14622_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha256_hmac_ctx_t sha256_hmac_ctx; sha256_hmac_init_global_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad32[0] = sha256_hmac_ctx.ipad.h[0]; tmps[gid].ipad32[1] = sha256_hmac_ctx.ipad.h[1]; tmps[gid].ipad32[2] = sha256_hmac_ctx.ipad.h[2]; tmps[gid].ipad32[3] = sha256_hmac_ctx.ipad.h[3]; tmps[gid].ipad32[4] = sha256_hmac_ctx.ipad.h[4]; tmps[gid].ipad32[5] = sha256_hmac_ctx.ipad.h[5]; tmps[gid].ipad32[6] = sha256_hmac_ctx.ipad.h[6]; tmps[gid].ipad32[7] = sha256_hmac_ctx.ipad.h[7]; tmps[gid].opad32[0] = sha256_hmac_ctx.opad.h[0]; tmps[gid].opad32[1] = sha256_hmac_ctx.opad.h[1]; tmps[gid].opad32[2] = sha256_hmac_ctx.opad.h[2]; tmps[gid].opad32[3] = sha256_hmac_ctx.opad.h[3]; tmps[gid].opad32[4] = sha256_hmac_ctx.opad.h[4]; tmps[gid].opad32[5] = sha256_hmac_ctx.opad.h[5]; tmps[gid].opad32[6] = sha256_hmac_ctx.opad.h[6]; tmps[gid].opad32[7] = sha256_hmac_ctx.opad.h[7]; sha256_hmac_update_global_swap (&sha256_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); const u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0, j = 1; i < ((key_size / 8) / 4); i += 8, j += 1) { sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); sha256_hmac_final (&sha256_hmac_ctx2); tmps[gid].dgst32[i + 0] = sha256_hmac_ctx2.opad.h[0]; tmps[gid].dgst32[i + 1] = sha256_hmac_ctx2.opad.h[1]; tmps[gid].dgst32[i + 2] = sha256_hmac_ctx2.opad.h[2]; tmps[gid].dgst32[i + 3] = sha256_hmac_ctx2.opad.h[3]; tmps[gid].dgst32[i + 4] = sha256_hmac_ctx2.opad.h[4]; tmps[gid].dgst32[i + 5] = sha256_hmac_ctx2.opad.h[5]; tmps[gid].dgst32[i + 6] = sha256_hmac_ctx2.opad.h[6]; tmps[gid].dgst32[i + 7] = sha256_hmac_ctx2.opad.h[7]; tmps[gid].out32[i + 0] = tmps[gid].dgst32[i + 0]; tmps[gid].out32[i + 1] = tmps[gid].dgst32[i + 1]; tmps[gid].out32[i + 2] = tmps[gid].dgst32[i + 2]; tmps[gid].out32[i + 3] = tmps[gid].dgst32[i + 3]; tmps[gid].out32[i + 4] = tmps[gid].dgst32[i + 4]; tmps[gid].out32[i + 5] = tmps[gid].dgst32[i + 5]; tmps[gid].out32[i + 6] = tmps[gid].dgst32[i + 6]; tmps[gid].out32[i + 7] = tmps[gid].dgst32[i + 7]; } } __kernel void m14622_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[8]; u32x opad[8]; ipad[0] = packv (tmps, ipad32, gid, 0); ipad[1] = packv (tmps, ipad32, gid, 1); ipad[2] = packv (tmps, ipad32, gid, 2); ipad[3] = packv (tmps, ipad32, gid, 3); ipad[4] = packv (tmps, ipad32, gid, 4); ipad[5] = packv (tmps, ipad32, gid, 5); ipad[6] = packv (tmps, ipad32, gid, 6); ipad[7] = packv (tmps, ipad32, gid, 7); opad[0] = packv (tmps, opad32, gid, 0); opad[1] = packv (tmps, opad32, gid, 1); opad[2] = packv (tmps, opad32, gid, 2); opad[3] = packv (tmps, opad32, gid, 3); opad[4] = packv (tmps, opad32, gid, 4); opad[5] = packv (tmps, opad32, gid, 5); opad[6] = packv (tmps, opad32, gid, 6); opad[7] = packv (tmps, opad32, gid, 7); u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0; i < ((key_size / 8) / 4); i += 8) { u32x dgst[8]; u32x out[8]; dgst[0] = packv (tmps, dgst32, gid, i + 0); dgst[1] = packv (tmps, dgst32, gid, i + 1); dgst[2] = packv (tmps, dgst32, gid, i + 2); dgst[3] = packv (tmps, dgst32, gid, i + 3); dgst[4] = packv (tmps, dgst32, gid, i + 4); dgst[5] = packv (tmps, dgst32, gid, i + 5); dgst[6] = packv (tmps, dgst32, gid, i + 6); dgst[7] = packv (tmps, dgst32, gid, i + 7); out[0] = packv (tmps, out32, gid, i + 0); out[1] = packv (tmps, out32, gid, i + 1); out[2] = packv (tmps, out32, gid, i + 2); out[3] = packv (tmps, out32, gid, i + 3); out[4] = packv (tmps, out32, gid, i + 4); out[5] = packv (tmps, out32, gid, i + 5); out[6] = packv (tmps, out32, gid, i + 6); out[7] = packv (tmps, out32, gid, i + 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_V (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]; } unpackv (tmps, dgst32, gid, i + 0, dgst[0]); unpackv (tmps, dgst32, gid, i + 1, dgst[1]); unpackv (tmps, dgst32, gid, i + 2, dgst[2]); unpackv (tmps, dgst32, gid, i + 3, dgst[3]); unpackv (tmps, dgst32, gid, i + 4, dgst[4]); unpackv (tmps, dgst32, gid, i + 5, dgst[5]); unpackv (tmps, dgst32, gid, i + 6, dgst[6]); unpackv (tmps, dgst32, gid, i + 7, dgst[7]); unpackv (tmps, out32, gid, i + 0, out[0]); unpackv (tmps, out32, gid, i + 1, out[1]); unpackv (tmps, out32, gid, i + 2, out[2]); unpackv (tmps, out32, gid, i + 3, out[3]); unpackv (tmps, out32, gid, i + 4, out[4]); unpackv (tmps, out32, gid, i + 5, out[5]); unpackv (tmps, out32, gid, i + 6, out[6]); unpackv (tmps, out32, gid, i + 7, out[7]); } } __kernel void m14622_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; // decrypt AF with first pbkdf2 result // merge AF to masterkey // decrypt first payload sector with masterkey u32 pt_buf[128]; luks_af_sha256_then_serpent_decrypt (&luks_bufs[digests_offset], &tmps[gid], pt_buf); // check entropy const float entropy = get_entropy (pt_buf, 128); if (entropy < MAX_ENTROPY) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m14623.cl000066400000000000000000000253701320027462700154350ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" #include "inc_cipher_twofish.cl" #include "inc_luks_af.cl" #include "inc_luks_essiv.cl" #include "inc_luks_xts.cl" #include "inc_luks_twofish.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #define MAX_ENTROPY 7.0 void hmac_sha256_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m14623_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha256_hmac_ctx_t sha256_hmac_ctx; sha256_hmac_init_global_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad32[0] = sha256_hmac_ctx.ipad.h[0]; tmps[gid].ipad32[1] = sha256_hmac_ctx.ipad.h[1]; tmps[gid].ipad32[2] = sha256_hmac_ctx.ipad.h[2]; tmps[gid].ipad32[3] = sha256_hmac_ctx.ipad.h[3]; tmps[gid].ipad32[4] = sha256_hmac_ctx.ipad.h[4]; tmps[gid].ipad32[5] = sha256_hmac_ctx.ipad.h[5]; tmps[gid].ipad32[6] = sha256_hmac_ctx.ipad.h[6]; tmps[gid].ipad32[7] = sha256_hmac_ctx.ipad.h[7]; tmps[gid].opad32[0] = sha256_hmac_ctx.opad.h[0]; tmps[gid].opad32[1] = sha256_hmac_ctx.opad.h[1]; tmps[gid].opad32[2] = sha256_hmac_ctx.opad.h[2]; tmps[gid].opad32[3] = sha256_hmac_ctx.opad.h[3]; tmps[gid].opad32[4] = sha256_hmac_ctx.opad.h[4]; tmps[gid].opad32[5] = sha256_hmac_ctx.opad.h[5]; tmps[gid].opad32[6] = sha256_hmac_ctx.opad.h[6]; tmps[gid].opad32[7] = sha256_hmac_ctx.opad.h[7]; sha256_hmac_update_global_swap (&sha256_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); const u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0, j = 1; i < ((key_size / 8) / 4); i += 8, j += 1) { sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); sha256_hmac_final (&sha256_hmac_ctx2); tmps[gid].dgst32[i + 0] = sha256_hmac_ctx2.opad.h[0]; tmps[gid].dgst32[i + 1] = sha256_hmac_ctx2.opad.h[1]; tmps[gid].dgst32[i + 2] = sha256_hmac_ctx2.opad.h[2]; tmps[gid].dgst32[i + 3] = sha256_hmac_ctx2.opad.h[3]; tmps[gid].dgst32[i + 4] = sha256_hmac_ctx2.opad.h[4]; tmps[gid].dgst32[i + 5] = sha256_hmac_ctx2.opad.h[5]; tmps[gid].dgst32[i + 6] = sha256_hmac_ctx2.opad.h[6]; tmps[gid].dgst32[i + 7] = sha256_hmac_ctx2.opad.h[7]; tmps[gid].out32[i + 0] = tmps[gid].dgst32[i + 0]; tmps[gid].out32[i + 1] = tmps[gid].dgst32[i + 1]; tmps[gid].out32[i + 2] = tmps[gid].dgst32[i + 2]; tmps[gid].out32[i + 3] = tmps[gid].dgst32[i + 3]; tmps[gid].out32[i + 4] = tmps[gid].dgst32[i + 4]; tmps[gid].out32[i + 5] = tmps[gid].dgst32[i + 5]; tmps[gid].out32[i + 6] = tmps[gid].dgst32[i + 6]; tmps[gid].out32[i + 7] = tmps[gid].dgst32[i + 7]; } } __kernel void m14623_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[8]; u32x opad[8]; ipad[0] = packv (tmps, ipad32, gid, 0); ipad[1] = packv (tmps, ipad32, gid, 1); ipad[2] = packv (tmps, ipad32, gid, 2); ipad[3] = packv (tmps, ipad32, gid, 3); ipad[4] = packv (tmps, ipad32, gid, 4); ipad[5] = packv (tmps, ipad32, gid, 5); ipad[6] = packv (tmps, ipad32, gid, 6); ipad[7] = packv (tmps, ipad32, gid, 7); opad[0] = packv (tmps, opad32, gid, 0); opad[1] = packv (tmps, opad32, gid, 1); opad[2] = packv (tmps, opad32, gid, 2); opad[3] = packv (tmps, opad32, gid, 3); opad[4] = packv (tmps, opad32, gid, 4); opad[5] = packv (tmps, opad32, gid, 5); opad[6] = packv (tmps, opad32, gid, 6); opad[7] = packv (tmps, opad32, gid, 7); u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0; i < ((key_size / 8) / 4); i += 8) { u32x dgst[8]; u32x out[8]; dgst[0] = packv (tmps, dgst32, gid, i + 0); dgst[1] = packv (tmps, dgst32, gid, i + 1); dgst[2] = packv (tmps, dgst32, gid, i + 2); dgst[3] = packv (tmps, dgst32, gid, i + 3); dgst[4] = packv (tmps, dgst32, gid, i + 4); dgst[5] = packv (tmps, dgst32, gid, i + 5); dgst[6] = packv (tmps, dgst32, gid, i + 6); dgst[7] = packv (tmps, dgst32, gid, i + 7); out[0] = packv (tmps, out32, gid, i + 0); out[1] = packv (tmps, out32, gid, i + 1); out[2] = packv (tmps, out32, gid, i + 2); out[3] = packv (tmps, out32, gid, i + 3); out[4] = packv (tmps, out32, gid, i + 4); out[5] = packv (tmps, out32, gid, i + 5); out[6] = packv (tmps, out32, gid, i + 6); out[7] = packv (tmps, out32, gid, i + 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_V (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]; } unpackv (tmps, dgst32, gid, i + 0, dgst[0]); unpackv (tmps, dgst32, gid, i + 1, dgst[1]); unpackv (tmps, dgst32, gid, i + 2, dgst[2]); unpackv (tmps, dgst32, gid, i + 3, dgst[3]); unpackv (tmps, dgst32, gid, i + 4, dgst[4]); unpackv (tmps, dgst32, gid, i + 5, dgst[5]); unpackv (tmps, dgst32, gid, i + 6, dgst[6]); unpackv (tmps, dgst32, gid, i + 7, dgst[7]); unpackv (tmps, out32, gid, i + 0, out[0]); unpackv (tmps, out32, gid, i + 1, out[1]); unpackv (tmps, out32, gid, i + 2, out[2]); unpackv (tmps, out32, gid, i + 3, out[3]); unpackv (tmps, out32, gid, i + 4, out[4]); unpackv (tmps, out32, gid, i + 5, out[5]); unpackv (tmps, out32, gid, i + 6, out[6]); unpackv (tmps, out32, gid, i + 7, out[7]); } } __kernel void m14623_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; // decrypt AF with first pbkdf2 result // merge AF to masterkey // decrypt first payload sector with masterkey u32 pt_buf[128]; luks_af_sha256_then_twofish_decrypt (&luks_bufs[digests_offset], &tmps[gid], pt_buf); // check entropy const float entropy = get_entropy (pt_buf, 128); if (entropy < MAX_ENTROPY) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m14631.cl000066400000000000000000000326371320027462700154400ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" #include "inc_cipher_aes.cl" #include "inc_luks_af.cl" #include "inc_luks_essiv.cl" #include "inc_luks_xts.cl" #include "inc_luks_aes.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #define MAX_ENTROPY 7.0 void hmac_sha512_run_V (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); w0[0] = h32_from_64 (digest[0]); w0[1] = l32_from_64 (digest[0]); w0[2] = h32_from_64 (digest[1]); w0[3] = l32_from_64 (digest[1]); w1[0] = h32_from_64 (digest[2]); w1[1] = l32_from_64 (digest[2]); w1[2] = h32_from_64 (digest[3]); w1[3] = l32_from_64 (digest[3]); w2[0] = h32_from_64 (digest[4]); w2[1] = l32_from_64 (digest[4]); w2[2] = h32_from_64 (digest[5]); w2[3] = l32_from_64 (digest[5]); w3[0] = h32_from_64 (digest[6]); w3[1] = l32_from_64 (digest[6]); w3[2] = h32_from_64 (digest[7]); w3[3] = l32_from_64 (digest[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } __kernel void m14631_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha512_hmac_ctx_t sha512_hmac_ctx; sha512_hmac_init_global_swap (&sha512_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad64[0] = sha512_hmac_ctx.ipad.h[0]; tmps[gid].ipad64[1] = sha512_hmac_ctx.ipad.h[1]; tmps[gid].ipad64[2] = sha512_hmac_ctx.ipad.h[2]; tmps[gid].ipad64[3] = sha512_hmac_ctx.ipad.h[3]; tmps[gid].ipad64[4] = sha512_hmac_ctx.ipad.h[4]; tmps[gid].ipad64[5] = sha512_hmac_ctx.ipad.h[5]; tmps[gid].ipad64[6] = sha512_hmac_ctx.ipad.h[6]; tmps[gid].ipad64[7] = sha512_hmac_ctx.ipad.h[7]; tmps[gid].opad64[0] = sha512_hmac_ctx.opad.h[0]; tmps[gid].opad64[1] = sha512_hmac_ctx.opad.h[1]; tmps[gid].opad64[2] = sha512_hmac_ctx.opad.h[2]; tmps[gid].opad64[3] = sha512_hmac_ctx.opad.h[3]; tmps[gid].opad64[4] = sha512_hmac_ctx.opad.h[4]; tmps[gid].opad64[5] = sha512_hmac_ctx.opad.h[5]; tmps[gid].opad64[6] = sha512_hmac_ctx.opad.h[6]; tmps[gid].opad64[7] = sha512_hmac_ctx.opad.h[7]; sha512_hmac_update_global_swap (&sha512_hmac_ctx, salt_bufs[digests_offset].salt_buf, salt_bufs[salt_pos].salt_len); const u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0, j = 1; i < ((key_size / 8) / 4); i += 16, j += 1) { sha512_hmac_ctx_t sha512_hmac_ctx2 = sha512_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; w0[0] = j; 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] = 0; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_update_128 (&sha512_hmac_ctx2, w0, w1, w2, w3, w4, w5, w6, w7, 4); sha512_hmac_final (&sha512_hmac_ctx2); tmps[gid].dgst64[i + 0] = sha512_hmac_ctx2.opad.h[0]; tmps[gid].dgst64[i + 1] = sha512_hmac_ctx2.opad.h[1]; tmps[gid].dgst64[i + 2] = sha512_hmac_ctx2.opad.h[2]; tmps[gid].dgst64[i + 3] = sha512_hmac_ctx2.opad.h[3]; tmps[gid].dgst64[i + 4] = sha512_hmac_ctx2.opad.h[4]; tmps[gid].dgst64[i + 5] = sha512_hmac_ctx2.opad.h[5]; tmps[gid].dgst64[i + 6] = sha512_hmac_ctx2.opad.h[6]; tmps[gid].dgst64[i + 7] = sha512_hmac_ctx2.opad.h[7]; tmps[gid].out64[i + 0] = tmps[gid].dgst64[i + 0]; tmps[gid].out64[i + 1] = tmps[gid].dgst64[i + 1]; tmps[gid].out64[i + 2] = tmps[gid].dgst64[i + 2]; tmps[gid].out64[i + 3] = tmps[gid].dgst64[i + 3]; tmps[gid].out64[i + 4] = tmps[gid].dgst64[i + 4]; tmps[gid].out64[i + 5] = tmps[gid].dgst64[i + 5]; tmps[gid].out64[i + 6] = tmps[gid].dgst64[i + 6]; tmps[gid].out64[i + 7] = tmps[gid].dgst64[i + 7]; } } __kernel void m14631_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u64x ipad[8]; u64x opad[8]; ipad[0] = pack64v (tmps, ipad64, gid, 0); ipad[1] = pack64v (tmps, ipad64, gid, 1); ipad[2] = pack64v (tmps, ipad64, gid, 2); ipad[3] = pack64v (tmps, ipad64, gid, 3); ipad[4] = pack64v (tmps, ipad64, gid, 4); ipad[5] = pack64v (tmps, ipad64, gid, 5); ipad[6] = pack64v (tmps, ipad64, gid, 6); ipad[7] = pack64v (tmps, ipad64, gid, 7); opad[0] = pack64v (tmps, opad64, gid, 0); opad[1] = pack64v (tmps, opad64, gid, 1); opad[2] = pack64v (tmps, opad64, gid, 2); opad[3] = pack64v (tmps, opad64, gid, 3); opad[4] = pack64v (tmps, opad64, gid, 4); opad[5] = pack64v (tmps, opad64, gid, 5); opad[6] = pack64v (tmps, opad64, gid, 6); opad[7] = pack64v (tmps, opad64, gid, 7); u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0; i < ((key_size / 8) / 4); i += 16) { u64x dgst[8]; u64x out[8]; dgst[0] = pack64v (tmps, dgst64, gid, i + 0); dgst[1] = pack64v (tmps, dgst64, gid, i + 1); dgst[2] = pack64v (tmps, dgst64, gid, i + 2); dgst[3] = pack64v (tmps, dgst64, gid, i + 3); dgst[4] = pack64v (tmps, dgst64, gid, i + 4); dgst[5] = pack64v (tmps, dgst64, gid, i + 5); dgst[6] = pack64v (tmps, dgst64, gid, i + 6); dgst[7] = pack64v (tmps, dgst64, gid, i + 7); out[0] = pack64v (tmps, out64, gid, i + 0); out[1] = pack64v (tmps, out64, gid, i + 1); out[2] = pack64v (tmps, out64, gid, i + 2); out[3] = pack64v (tmps, out64, gid, i + 3); out[4] = pack64v (tmps, out64, gid, i + 4); out[5] = pack64v (tmps, out64, gid, i + 5); out[6] = pack64v (tmps, out64, gid, i + 6); out[7] = pack64v (tmps, out64, gid, i + 7); for (u32 j = 0; j < loop_cnt; j++) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; w0[0] = h32_from_64 (dgst[0]); w0[1] = l32_from_64 (dgst[0]); w0[2] = h32_from_64 (dgst[1]); w0[3] = l32_from_64 (dgst[1]); w1[0] = h32_from_64 (dgst[2]); w1[1] = l32_from_64 (dgst[2]); w1[2] = h32_from_64 (dgst[3]); w1[3] = l32_from_64 (dgst[3]); w2[0] = h32_from_64 (dgst[4]); w2[1] = l32_from_64 (dgst[4]); w2[2] = h32_from_64 (dgst[5]); w2[3] = l32_from_64 (dgst[5]); w3[0] = h32_from_64 (dgst[6]); w3[1] = l32_from_64 (dgst[6]); w3[2] = h32_from_64 (dgst[7]); w3[3] = l32_from_64 (dgst[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = (128 + 64) * 8; hmac_sha512_run_V (w0, w1, w2, w3, w4, w5, w6, w7, 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]; } unpack64v (tmps, dgst64, gid, i + 0, dgst[0]); unpack64v (tmps, dgst64, gid, i + 1, dgst[1]); unpack64v (tmps, dgst64, gid, i + 2, dgst[2]); unpack64v (tmps, dgst64, gid, i + 3, dgst[3]); unpack64v (tmps, dgst64, gid, i + 4, dgst[4]); unpack64v (tmps, dgst64, gid, i + 5, dgst[5]); unpack64v (tmps, dgst64, gid, i + 6, dgst[6]); unpack64v (tmps, dgst64, gid, i + 7, dgst[7]); unpack64v (tmps, out64, gid, i + 0, out[0]); unpack64v (tmps, out64, gid, i + 1, out[1]); unpack64v (tmps, out64, gid, i + 2, out[2]); unpack64v (tmps, out64, gid, i + 3, out[3]); unpack64v (tmps, out64, gid, i + 4, out[4]); unpack64v (tmps, out64, gid, i + 5, out[5]); unpack64v (tmps, out64, gid, i + 6, out[6]); unpack64v (tmps, out64, gid, i + 7, out[7]); } } __kernel void m14631_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; // decrypt AF with first pbkdf2 result // merge AF to masterkey // decrypt first payload sector with masterkey u32 pt_buf[128]; luks_af_sha512_then_aes_decrypt (&luks_bufs[digests_offset], &tmps[gid], pt_buf, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); // check entropy const float entropy = get_entropy (pt_buf, 128); if (entropy < MAX_ENTROPY) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m14632.cl000066400000000000000000000305271320027462700154350ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" #include "inc_cipher_serpent.cl" #include "inc_luks_af.cl" #include "inc_luks_essiv.cl" #include "inc_luks_xts.cl" #include "inc_luks_serpent.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #define MAX_ENTROPY 7.0 void hmac_sha512_run_V (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); w0[0] = h32_from_64 (digest[0]); w0[1] = l32_from_64 (digest[0]); w0[2] = h32_from_64 (digest[1]); w0[3] = l32_from_64 (digest[1]); w1[0] = h32_from_64 (digest[2]); w1[1] = l32_from_64 (digest[2]); w1[2] = h32_from_64 (digest[3]); w1[3] = l32_from_64 (digest[3]); w2[0] = h32_from_64 (digest[4]); w2[1] = l32_from_64 (digest[4]); w2[2] = h32_from_64 (digest[5]); w2[3] = l32_from_64 (digest[5]); w3[0] = h32_from_64 (digest[6]); w3[1] = l32_from_64 (digest[6]); w3[2] = h32_from_64 (digest[7]); w3[3] = l32_from_64 (digest[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } __kernel void m14632_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha512_hmac_ctx_t sha512_hmac_ctx; sha512_hmac_init_global_swap (&sha512_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad64[0] = sha512_hmac_ctx.ipad.h[0]; tmps[gid].ipad64[1] = sha512_hmac_ctx.ipad.h[1]; tmps[gid].ipad64[2] = sha512_hmac_ctx.ipad.h[2]; tmps[gid].ipad64[3] = sha512_hmac_ctx.ipad.h[3]; tmps[gid].ipad64[4] = sha512_hmac_ctx.ipad.h[4]; tmps[gid].ipad64[5] = sha512_hmac_ctx.ipad.h[5]; tmps[gid].ipad64[6] = sha512_hmac_ctx.ipad.h[6]; tmps[gid].ipad64[7] = sha512_hmac_ctx.ipad.h[7]; tmps[gid].opad64[0] = sha512_hmac_ctx.opad.h[0]; tmps[gid].opad64[1] = sha512_hmac_ctx.opad.h[1]; tmps[gid].opad64[2] = sha512_hmac_ctx.opad.h[2]; tmps[gid].opad64[3] = sha512_hmac_ctx.opad.h[3]; tmps[gid].opad64[4] = sha512_hmac_ctx.opad.h[4]; tmps[gid].opad64[5] = sha512_hmac_ctx.opad.h[5]; tmps[gid].opad64[6] = sha512_hmac_ctx.opad.h[6]; tmps[gid].opad64[7] = sha512_hmac_ctx.opad.h[7]; sha512_hmac_update_global_swap (&sha512_hmac_ctx, salt_bufs[digests_offset].salt_buf, salt_bufs[salt_pos].salt_len); const u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0, j = 1; i < ((key_size / 8) / 4); i += 16, j += 1) { sha512_hmac_ctx_t sha512_hmac_ctx2 = sha512_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; w0[0] = j; 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] = 0; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_update_128 (&sha512_hmac_ctx2, w0, w1, w2, w3, w4, w5, w6, w7, 4); sha512_hmac_final (&sha512_hmac_ctx2); tmps[gid].dgst64[i + 0] = sha512_hmac_ctx2.opad.h[0]; tmps[gid].dgst64[i + 1] = sha512_hmac_ctx2.opad.h[1]; tmps[gid].dgst64[i + 2] = sha512_hmac_ctx2.opad.h[2]; tmps[gid].dgst64[i + 3] = sha512_hmac_ctx2.opad.h[3]; tmps[gid].dgst64[i + 4] = sha512_hmac_ctx2.opad.h[4]; tmps[gid].dgst64[i + 5] = sha512_hmac_ctx2.opad.h[5]; tmps[gid].dgst64[i + 6] = sha512_hmac_ctx2.opad.h[6]; tmps[gid].dgst64[i + 7] = sha512_hmac_ctx2.opad.h[7]; tmps[gid].out64[i + 0] = tmps[gid].dgst64[i + 0]; tmps[gid].out64[i + 1] = tmps[gid].dgst64[i + 1]; tmps[gid].out64[i + 2] = tmps[gid].dgst64[i + 2]; tmps[gid].out64[i + 3] = tmps[gid].dgst64[i + 3]; tmps[gid].out64[i + 4] = tmps[gid].dgst64[i + 4]; tmps[gid].out64[i + 5] = tmps[gid].dgst64[i + 5]; tmps[gid].out64[i + 6] = tmps[gid].dgst64[i + 6]; tmps[gid].out64[i + 7] = tmps[gid].dgst64[i + 7]; } } __kernel void m14632_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u64x ipad[8]; u64x opad[8]; ipad[0] = pack64v (tmps, ipad64, gid, 0); ipad[1] = pack64v (tmps, ipad64, gid, 1); ipad[2] = pack64v (tmps, ipad64, gid, 2); ipad[3] = pack64v (tmps, ipad64, gid, 3); ipad[4] = pack64v (tmps, ipad64, gid, 4); ipad[5] = pack64v (tmps, ipad64, gid, 5); ipad[6] = pack64v (tmps, ipad64, gid, 6); ipad[7] = pack64v (tmps, ipad64, gid, 7); opad[0] = pack64v (tmps, opad64, gid, 0); opad[1] = pack64v (tmps, opad64, gid, 1); opad[2] = pack64v (tmps, opad64, gid, 2); opad[3] = pack64v (tmps, opad64, gid, 3); opad[4] = pack64v (tmps, opad64, gid, 4); opad[5] = pack64v (tmps, opad64, gid, 5); opad[6] = pack64v (tmps, opad64, gid, 6); opad[7] = pack64v (tmps, opad64, gid, 7); u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0; i < ((key_size / 8) / 4); i += 16) { u64x dgst[8]; u64x out[8]; dgst[0] = pack64v (tmps, dgst64, gid, i + 0); dgst[1] = pack64v (tmps, dgst64, gid, i + 1); dgst[2] = pack64v (tmps, dgst64, gid, i + 2); dgst[3] = pack64v (tmps, dgst64, gid, i + 3); dgst[4] = pack64v (tmps, dgst64, gid, i + 4); dgst[5] = pack64v (tmps, dgst64, gid, i + 5); dgst[6] = pack64v (tmps, dgst64, gid, i + 6); dgst[7] = pack64v (tmps, dgst64, gid, i + 7); out[0] = pack64v (tmps, out64, gid, i + 0); out[1] = pack64v (tmps, out64, gid, i + 1); out[2] = pack64v (tmps, out64, gid, i + 2); out[3] = pack64v (tmps, out64, gid, i + 3); out[4] = pack64v (tmps, out64, gid, i + 4); out[5] = pack64v (tmps, out64, gid, i + 5); out[6] = pack64v (tmps, out64, gid, i + 6); out[7] = pack64v (tmps, out64, gid, i + 7); for (u32 j = 0; j < loop_cnt; j++) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; w0[0] = h32_from_64 (dgst[0]); w0[1] = l32_from_64 (dgst[0]); w0[2] = h32_from_64 (dgst[1]); w0[3] = l32_from_64 (dgst[1]); w1[0] = h32_from_64 (dgst[2]); w1[1] = l32_from_64 (dgst[2]); w1[2] = h32_from_64 (dgst[3]); w1[3] = l32_from_64 (dgst[3]); w2[0] = h32_from_64 (dgst[4]); w2[1] = l32_from_64 (dgst[4]); w2[2] = h32_from_64 (dgst[5]); w2[3] = l32_from_64 (dgst[5]); w3[0] = h32_from_64 (dgst[6]); w3[1] = l32_from_64 (dgst[6]); w3[2] = h32_from_64 (dgst[7]); w3[3] = l32_from_64 (dgst[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = (128 + 64) * 8; hmac_sha512_run_V (w0, w1, w2, w3, w4, w5, w6, w7, 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]; } unpack64v (tmps, dgst64, gid, i + 0, dgst[0]); unpack64v (tmps, dgst64, gid, i + 1, dgst[1]); unpack64v (tmps, dgst64, gid, i + 2, dgst[2]); unpack64v (tmps, dgst64, gid, i + 3, dgst[3]); unpack64v (tmps, dgst64, gid, i + 4, dgst[4]); unpack64v (tmps, dgst64, gid, i + 5, dgst[5]); unpack64v (tmps, dgst64, gid, i + 6, dgst[6]); unpack64v (tmps, dgst64, gid, i + 7, dgst[7]); unpack64v (tmps, out64, gid, i + 0, out[0]); unpack64v (tmps, out64, gid, i + 1, out[1]); unpack64v (tmps, out64, gid, i + 2, out[2]); unpack64v (tmps, out64, gid, i + 3, out[3]); unpack64v (tmps, out64, gid, i + 4, out[4]); unpack64v (tmps, out64, gid, i + 5, out[5]); unpack64v (tmps, out64, gid, i + 6, out[6]); unpack64v (tmps, out64, gid, i + 7, out[7]); } } __kernel void m14632_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; // decrypt AF with first pbkdf2 result // merge AF to masterkey // decrypt first payload sector with masterkey u32 pt_buf[128]; luks_af_sha512_then_serpent_decrypt (&luks_bufs[digests_offset], &tmps[gid], pt_buf); // check entropy const float entropy = get_entropy (pt_buf, 128); if (entropy < MAX_ENTROPY) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m14633.cl000066400000000000000000000305271320027462700154360ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" #include "inc_cipher_twofish.cl" #include "inc_luks_af.cl" #include "inc_luks_essiv.cl" #include "inc_luks_xts.cl" #include "inc_luks_twofish.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #define MAX_ENTROPY 7.0 void hmac_sha512_run_V (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); w0[0] = h32_from_64 (digest[0]); w0[1] = l32_from_64 (digest[0]); w0[2] = h32_from_64 (digest[1]); w0[3] = l32_from_64 (digest[1]); w1[0] = h32_from_64 (digest[2]); w1[1] = l32_from_64 (digest[2]); w1[2] = h32_from_64 (digest[3]); w1[3] = l32_from_64 (digest[3]); w2[0] = h32_from_64 (digest[4]); w2[1] = l32_from_64 (digest[4]); w2[2] = h32_from_64 (digest[5]); w2[3] = l32_from_64 (digest[5]); w3[0] = h32_from_64 (digest[6]); w3[1] = l32_from_64 (digest[6]); w3[2] = h32_from_64 (digest[7]); w3[3] = l32_from_64 (digest[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } __kernel void m14633_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha512_hmac_ctx_t sha512_hmac_ctx; sha512_hmac_init_global_swap (&sha512_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad64[0] = sha512_hmac_ctx.ipad.h[0]; tmps[gid].ipad64[1] = sha512_hmac_ctx.ipad.h[1]; tmps[gid].ipad64[2] = sha512_hmac_ctx.ipad.h[2]; tmps[gid].ipad64[3] = sha512_hmac_ctx.ipad.h[3]; tmps[gid].ipad64[4] = sha512_hmac_ctx.ipad.h[4]; tmps[gid].ipad64[5] = sha512_hmac_ctx.ipad.h[5]; tmps[gid].ipad64[6] = sha512_hmac_ctx.ipad.h[6]; tmps[gid].ipad64[7] = sha512_hmac_ctx.ipad.h[7]; tmps[gid].opad64[0] = sha512_hmac_ctx.opad.h[0]; tmps[gid].opad64[1] = sha512_hmac_ctx.opad.h[1]; tmps[gid].opad64[2] = sha512_hmac_ctx.opad.h[2]; tmps[gid].opad64[3] = sha512_hmac_ctx.opad.h[3]; tmps[gid].opad64[4] = sha512_hmac_ctx.opad.h[4]; tmps[gid].opad64[5] = sha512_hmac_ctx.opad.h[5]; tmps[gid].opad64[6] = sha512_hmac_ctx.opad.h[6]; tmps[gid].opad64[7] = sha512_hmac_ctx.opad.h[7]; sha512_hmac_update_global_swap (&sha512_hmac_ctx, salt_bufs[digests_offset].salt_buf, salt_bufs[salt_pos].salt_len); const u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0, j = 1; i < ((key_size / 8) / 4); i += 16, j += 1) { sha512_hmac_ctx_t sha512_hmac_ctx2 = sha512_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; w0[0] = j; 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] = 0; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_update_128 (&sha512_hmac_ctx2, w0, w1, w2, w3, w4, w5, w6, w7, 4); sha512_hmac_final (&sha512_hmac_ctx2); tmps[gid].dgst64[i + 0] = sha512_hmac_ctx2.opad.h[0]; tmps[gid].dgst64[i + 1] = sha512_hmac_ctx2.opad.h[1]; tmps[gid].dgst64[i + 2] = sha512_hmac_ctx2.opad.h[2]; tmps[gid].dgst64[i + 3] = sha512_hmac_ctx2.opad.h[3]; tmps[gid].dgst64[i + 4] = sha512_hmac_ctx2.opad.h[4]; tmps[gid].dgst64[i + 5] = sha512_hmac_ctx2.opad.h[5]; tmps[gid].dgst64[i + 6] = sha512_hmac_ctx2.opad.h[6]; tmps[gid].dgst64[i + 7] = sha512_hmac_ctx2.opad.h[7]; tmps[gid].out64[i + 0] = tmps[gid].dgst64[i + 0]; tmps[gid].out64[i + 1] = tmps[gid].dgst64[i + 1]; tmps[gid].out64[i + 2] = tmps[gid].dgst64[i + 2]; tmps[gid].out64[i + 3] = tmps[gid].dgst64[i + 3]; tmps[gid].out64[i + 4] = tmps[gid].dgst64[i + 4]; tmps[gid].out64[i + 5] = tmps[gid].dgst64[i + 5]; tmps[gid].out64[i + 6] = tmps[gid].dgst64[i + 6]; tmps[gid].out64[i + 7] = tmps[gid].dgst64[i + 7]; } } __kernel void m14633_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u64x ipad[8]; u64x opad[8]; ipad[0] = pack64v (tmps, ipad64, gid, 0); ipad[1] = pack64v (tmps, ipad64, gid, 1); ipad[2] = pack64v (tmps, ipad64, gid, 2); ipad[3] = pack64v (tmps, ipad64, gid, 3); ipad[4] = pack64v (tmps, ipad64, gid, 4); ipad[5] = pack64v (tmps, ipad64, gid, 5); ipad[6] = pack64v (tmps, ipad64, gid, 6); ipad[7] = pack64v (tmps, ipad64, gid, 7); opad[0] = pack64v (tmps, opad64, gid, 0); opad[1] = pack64v (tmps, opad64, gid, 1); opad[2] = pack64v (tmps, opad64, gid, 2); opad[3] = pack64v (tmps, opad64, gid, 3); opad[4] = pack64v (tmps, opad64, gid, 4); opad[5] = pack64v (tmps, opad64, gid, 5); opad[6] = pack64v (tmps, opad64, gid, 6); opad[7] = pack64v (tmps, opad64, gid, 7); u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0; i < ((key_size / 8) / 4); i += 16) { u64x dgst[8]; u64x out[8]; dgst[0] = pack64v (tmps, dgst64, gid, i + 0); dgst[1] = pack64v (tmps, dgst64, gid, i + 1); dgst[2] = pack64v (tmps, dgst64, gid, i + 2); dgst[3] = pack64v (tmps, dgst64, gid, i + 3); dgst[4] = pack64v (tmps, dgst64, gid, i + 4); dgst[5] = pack64v (tmps, dgst64, gid, i + 5); dgst[6] = pack64v (tmps, dgst64, gid, i + 6); dgst[7] = pack64v (tmps, dgst64, gid, i + 7); out[0] = pack64v (tmps, out64, gid, i + 0); out[1] = pack64v (tmps, out64, gid, i + 1); out[2] = pack64v (tmps, out64, gid, i + 2); out[3] = pack64v (tmps, out64, gid, i + 3); out[4] = pack64v (tmps, out64, gid, i + 4); out[5] = pack64v (tmps, out64, gid, i + 5); out[6] = pack64v (tmps, out64, gid, i + 6); out[7] = pack64v (tmps, out64, gid, i + 7); for (u32 j = 0; j < loop_cnt; j++) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; w0[0] = h32_from_64 (dgst[0]); w0[1] = l32_from_64 (dgst[0]); w0[2] = h32_from_64 (dgst[1]); w0[3] = l32_from_64 (dgst[1]); w1[0] = h32_from_64 (dgst[2]); w1[1] = l32_from_64 (dgst[2]); w1[2] = h32_from_64 (dgst[3]); w1[3] = l32_from_64 (dgst[3]); w2[0] = h32_from_64 (dgst[4]); w2[1] = l32_from_64 (dgst[4]); w2[2] = h32_from_64 (dgst[5]); w2[3] = l32_from_64 (dgst[5]); w3[0] = h32_from_64 (dgst[6]); w3[1] = l32_from_64 (dgst[6]); w3[2] = h32_from_64 (dgst[7]); w3[3] = l32_from_64 (dgst[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = (128 + 64) * 8; hmac_sha512_run_V (w0, w1, w2, w3, w4, w5, w6, w7, 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]; } unpack64v (tmps, dgst64, gid, i + 0, dgst[0]); unpack64v (tmps, dgst64, gid, i + 1, dgst[1]); unpack64v (tmps, dgst64, gid, i + 2, dgst[2]); unpack64v (tmps, dgst64, gid, i + 3, dgst[3]); unpack64v (tmps, dgst64, gid, i + 4, dgst[4]); unpack64v (tmps, dgst64, gid, i + 5, dgst[5]); unpack64v (tmps, dgst64, gid, i + 6, dgst[6]); unpack64v (tmps, dgst64, gid, i + 7, dgst[7]); unpack64v (tmps, out64, gid, i + 0, out[0]); unpack64v (tmps, out64, gid, i + 1, out[1]); unpack64v (tmps, out64, gid, i + 2, out[2]); unpack64v (tmps, out64, gid, i + 3, out[3]); unpack64v (tmps, out64, gid, i + 4, out[4]); unpack64v (tmps, out64, gid, i + 5, out[5]); unpack64v (tmps, out64, gid, i + 6, out[6]); unpack64v (tmps, out64, gid, i + 7, out[7]); } } __kernel void m14633_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; // decrypt AF with first pbkdf2 result // merge AF to masterkey // decrypt first payload sector with masterkey u32 pt_buf[128]; luks_af_sha512_then_twofish_decrypt (&luks_bufs[digests_offset], &tmps[gid], pt_buf); // check entropy const float entropy = get_entropy (pt_buf, 128); if (entropy < MAX_ENTROPY) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m14641.cl000066400000000000000000000243371320027462700154370ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_ripemd160.cl" #include "inc_cipher_aes.cl" #include "inc_luks_af.cl" #include "inc_luks_essiv.cl" #include "inc_luks_xts.cl" #include "inc_luks_aes.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #define MAX_ENTROPY 7.0 void hmac_ripemd160_run_V (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]; ripemd160_transform_vector (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] = 0x80; 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 + 20) * 8; w3[3] = 0; digest[0] = opad[0]; digest[1] = opad[1]; digest[2] = opad[2]; digest[3] = opad[3]; digest[4] = opad[4]; ripemd160_transform_vector (w0, w1, w2, w3, digest); } __kernel void m14641_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; ripemd160_hmac_ctx_t ripemd160_hmac_ctx; ripemd160_hmac_init_global (&ripemd160_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad32[0] = ripemd160_hmac_ctx.ipad.h[0]; tmps[gid].ipad32[1] = ripemd160_hmac_ctx.ipad.h[1]; tmps[gid].ipad32[2] = ripemd160_hmac_ctx.ipad.h[2]; tmps[gid].ipad32[3] = ripemd160_hmac_ctx.ipad.h[3]; tmps[gid].ipad32[4] = ripemd160_hmac_ctx.ipad.h[4]; tmps[gid].opad32[0] = ripemd160_hmac_ctx.opad.h[0]; tmps[gid].opad32[1] = ripemd160_hmac_ctx.opad.h[1]; tmps[gid].opad32[2] = ripemd160_hmac_ctx.opad.h[2]; tmps[gid].opad32[3] = ripemd160_hmac_ctx.opad.h[3]; tmps[gid].opad32[4] = ripemd160_hmac_ctx.opad.h[4]; ripemd160_hmac_update_global (&ripemd160_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); const u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0, j = 1; i < ((key_size / 8) / 4); i += 5, j += 1) { ripemd160_hmac_ctx_t ripemd160_hmac_ctx2 = ripemd160_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j << 24; 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] = 0; ripemd160_hmac_update_64 (&ripemd160_hmac_ctx2, w0, w1, w2, w3, 4); ripemd160_hmac_final (&ripemd160_hmac_ctx2); tmps[gid].dgst32[i + 0] = ripemd160_hmac_ctx2.opad.h[0]; tmps[gid].dgst32[i + 1] = ripemd160_hmac_ctx2.opad.h[1]; tmps[gid].dgst32[i + 2] = ripemd160_hmac_ctx2.opad.h[2]; tmps[gid].dgst32[i + 3] = ripemd160_hmac_ctx2.opad.h[3]; tmps[gid].dgst32[i + 4] = ripemd160_hmac_ctx2.opad.h[4]; tmps[gid].out32[i + 0] = tmps[gid].dgst32[i + 0]; tmps[gid].out32[i + 1] = tmps[gid].dgst32[i + 1]; tmps[gid].out32[i + 2] = tmps[gid].dgst32[i + 2]; tmps[gid].out32[i + 3] = tmps[gid].dgst32[i + 3]; tmps[gid].out32[i + 4] = tmps[gid].dgst32[i + 4]; } } __kernel void m14641_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad32, gid, 0); ipad[1] = packv (tmps, ipad32, gid, 1); ipad[2] = packv (tmps, ipad32, gid, 2); ipad[3] = packv (tmps, ipad32, gid, 3); ipad[4] = packv (tmps, ipad32, gid, 4); opad[0] = packv (tmps, opad32, gid, 0); opad[1] = packv (tmps, opad32, gid, 1); opad[2] = packv (tmps, opad32, gid, 2); opad[3] = packv (tmps, opad32, gid, 3); opad[4] = packv (tmps, opad32, gid, 4); u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0; i < ((key_size / 8) / 4); i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst32, gid, i + 0); dgst[1] = packv (tmps, dgst32, gid, i + 1); dgst[2] = packv (tmps, dgst32, gid, i + 2); dgst[3] = packv (tmps, dgst32, gid, i + 3); dgst[4] = packv (tmps, dgst32, gid, i + 4); out[0] = packv (tmps, out32, gid, i + 0); out[1] = packv (tmps, out32, gid, i + 1); out[2] = packv (tmps, out32, gid, i + 2); out[3] = packv (tmps, out32, gid, i + 3); out[4] = packv (tmps, out32, gid, 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] = 0x80; 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 + 20) * 8; w3[3] = 0; hmac_ripemd160_run_V (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]; } unpackv (tmps, dgst32, gid, i + 0, dgst[0]); unpackv (tmps, dgst32, gid, i + 1, dgst[1]); unpackv (tmps, dgst32, gid, i + 2, dgst[2]); unpackv (tmps, dgst32, gid, i + 3, dgst[3]); unpackv (tmps, dgst32, gid, i + 4, dgst[4]); unpackv (tmps, out32, gid, i + 0, out[0]); unpackv (tmps, out32, gid, i + 1, out[1]); unpackv (tmps, out32, gid, i + 2, out[2]); unpackv (tmps, out32, gid, i + 3, out[3]); unpackv (tmps, out32, gid, i + 4, out[4]); } } __kernel void m14641_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; // decrypt AF with first pbkdf2 result // merge AF to masterkey // decrypt first payload sector with masterkey u32 pt_buf[128]; luks_af_ripemd160_then_aes_decrypt (&luks_bufs[digests_offset], &tmps[gid], pt_buf, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); // check entropy const float entropy = get_entropy (pt_buf, 128); if (entropy < MAX_ENTROPY) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m14642.cl000066400000000000000000000222271320027462700154340ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_ripemd160.cl" #include "inc_cipher_serpent.cl" #include "inc_luks_af.cl" #include "inc_luks_essiv.cl" #include "inc_luks_xts.cl" #include "inc_luks_serpent.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #define MAX_ENTROPY 7.0 void hmac_ripemd160_run_V (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]; ripemd160_transform_vector (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] = 0x80; 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 + 20) * 8; w3[3] = 0; digest[0] = opad[0]; digest[1] = opad[1]; digest[2] = opad[2]; digest[3] = opad[3]; digest[4] = opad[4]; ripemd160_transform_vector (w0, w1, w2, w3, digest); } __kernel void m14642_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; ripemd160_hmac_ctx_t ripemd160_hmac_ctx; ripemd160_hmac_init_global (&ripemd160_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad32[0] = ripemd160_hmac_ctx.ipad.h[0]; tmps[gid].ipad32[1] = ripemd160_hmac_ctx.ipad.h[1]; tmps[gid].ipad32[2] = ripemd160_hmac_ctx.ipad.h[2]; tmps[gid].ipad32[3] = ripemd160_hmac_ctx.ipad.h[3]; tmps[gid].ipad32[4] = ripemd160_hmac_ctx.ipad.h[4]; tmps[gid].opad32[0] = ripemd160_hmac_ctx.opad.h[0]; tmps[gid].opad32[1] = ripemd160_hmac_ctx.opad.h[1]; tmps[gid].opad32[2] = ripemd160_hmac_ctx.opad.h[2]; tmps[gid].opad32[3] = ripemd160_hmac_ctx.opad.h[3]; tmps[gid].opad32[4] = ripemd160_hmac_ctx.opad.h[4]; ripemd160_hmac_update_global (&ripemd160_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); const u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0, j = 1; i < ((key_size / 8) / 4); i += 5, j += 1) { ripemd160_hmac_ctx_t ripemd160_hmac_ctx2 = ripemd160_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j << 24; 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] = 0; ripemd160_hmac_update_64 (&ripemd160_hmac_ctx2, w0, w1, w2, w3, 4); ripemd160_hmac_final (&ripemd160_hmac_ctx2); tmps[gid].dgst32[i + 0] = ripemd160_hmac_ctx2.opad.h[0]; tmps[gid].dgst32[i + 1] = ripemd160_hmac_ctx2.opad.h[1]; tmps[gid].dgst32[i + 2] = ripemd160_hmac_ctx2.opad.h[2]; tmps[gid].dgst32[i + 3] = ripemd160_hmac_ctx2.opad.h[3]; tmps[gid].dgst32[i + 4] = ripemd160_hmac_ctx2.opad.h[4]; tmps[gid].out32[i + 0] = tmps[gid].dgst32[i + 0]; tmps[gid].out32[i + 1] = tmps[gid].dgst32[i + 1]; tmps[gid].out32[i + 2] = tmps[gid].dgst32[i + 2]; tmps[gid].out32[i + 3] = tmps[gid].dgst32[i + 3]; tmps[gid].out32[i + 4] = tmps[gid].dgst32[i + 4]; } } __kernel void m14642_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad32, gid, 0); ipad[1] = packv (tmps, ipad32, gid, 1); ipad[2] = packv (tmps, ipad32, gid, 2); ipad[3] = packv (tmps, ipad32, gid, 3); ipad[4] = packv (tmps, ipad32, gid, 4); opad[0] = packv (tmps, opad32, gid, 0); opad[1] = packv (tmps, opad32, gid, 1); opad[2] = packv (tmps, opad32, gid, 2); opad[3] = packv (tmps, opad32, gid, 3); opad[4] = packv (tmps, opad32, gid, 4); u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0; i < ((key_size / 8) / 4); i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst32, gid, i + 0); dgst[1] = packv (tmps, dgst32, gid, i + 1); dgst[2] = packv (tmps, dgst32, gid, i + 2); dgst[3] = packv (tmps, dgst32, gid, i + 3); dgst[4] = packv (tmps, dgst32, gid, i + 4); out[0] = packv (tmps, out32, gid, i + 0); out[1] = packv (tmps, out32, gid, i + 1); out[2] = packv (tmps, out32, gid, i + 2); out[3] = packv (tmps, out32, gid, i + 3); out[4] = packv (tmps, out32, gid, 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] = 0x80; 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 + 20) * 8; w3[3] = 0; hmac_ripemd160_run_V (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]; } unpackv (tmps, dgst32, gid, i + 0, dgst[0]); unpackv (tmps, dgst32, gid, i + 1, dgst[1]); unpackv (tmps, dgst32, gid, i + 2, dgst[2]); unpackv (tmps, dgst32, gid, i + 3, dgst[3]); unpackv (tmps, dgst32, gid, i + 4, dgst[4]); unpackv (tmps, out32, gid, i + 0, out[0]); unpackv (tmps, out32, gid, i + 1, out[1]); unpackv (tmps, out32, gid, i + 2, out[2]); unpackv (tmps, out32, gid, i + 3, out[3]); unpackv (tmps, out32, gid, i + 4, out[4]); } } __kernel void m14642_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; // decrypt AF with first pbkdf2 result // merge AF to masterkey // decrypt first payload sector with masterkey u32 pt_buf[128]; luks_af_ripemd160_then_serpent_decrypt (&luks_bufs[digests_offset], &tmps[gid], pt_buf); // check entropy const float entropy = get_entropy (pt_buf, 128); if (entropy < MAX_ENTROPY) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m14643.cl000066400000000000000000000222271320027462700154350ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_ripemd160.cl" #include "inc_cipher_twofish.cl" #include "inc_luks_af.cl" #include "inc_luks_essiv.cl" #include "inc_luks_xts.cl" #include "inc_luks_twofish.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #define MAX_ENTROPY 7.0 void hmac_ripemd160_run_V (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]; ripemd160_transform_vector (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] = 0x80; 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 + 20) * 8; w3[3] = 0; digest[0] = opad[0]; digest[1] = opad[1]; digest[2] = opad[2]; digest[3] = opad[3]; digest[4] = opad[4]; ripemd160_transform_vector (w0, w1, w2, w3, digest); } __kernel void m14643_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; ripemd160_hmac_ctx_t ripemd160_hmac_ctx; ripemd160_hmac_init_global (&ripemd160_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad32[0] = ripemd160_hmac_ctx.ipad.h[0]; tmps[gid].ipad32[1] = ripemd160_hmac_ctx.ipad.h[1]; tmps[gid].ipad32[2] = ripemd160_hmac_ctx.ipad.h[2]; tmps[gid].ipad32[3] = ripemd160_hmac_ctx.ipad.h[3]; tmps[gid].ipad32[4] = ripemd160_hmac_ctx.ipad.h[4]; tmps[gid].opad32[0] = ripemd160_hmac_ctx.opad.h[0]; tmps[gid].opad32[1] = ripemd160_hmac_ctx.opad.h[1]; tmps[gid].opad32[2] = ripemd160_hmac_ctx.opad.h[2]; tmps[gid].opad32[3] = ripemd160_hmac_ctx.opad.h[3]; tmps[gid].opad32[4] = ripemd160_hmac_ctx.opad.h[4]; ripemd160_hmac_update_global (&ripemd160_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); const u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0, j = 1; i < ((key_size / 8) / 4); i += 5, j += 1) { ripemd160_hmac_ctx_t ripemd160_hmac_ctx2 = ripemd160_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j << 24; 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] = 0; ripemd160_hmac_update_64 (&ripemd160_hmac_ctx2, w0, w1, w2, w3, 4); ripemd160_hmac_final (&ripemd160_hmac_ctx2); tmps[gid].dgst32[i + 0] = ripemd160_hmac_ctx2.opad.h[0]; tmps[gid].dgst32[i + 1] = ripemd160_hmac_ctx2.opad.h[1]; tmps[gid].dgst32[i + 2] = ripemd160_hmac_ctx2.opad.h[2]; tmps[gid].dgst32[i + 3] = ripemd160_hmac_ctx2.opad.h[3]; tmps[gid].dgst32[i + 4] = ripemd160_hmac_ctx2.opad.h[4]; tmps[gid].out32[i + 0] = tmps[gid].dgst32[i + 0]; tmps[gid].out32[i + 1] = tmps[gid].dgst32[i + 1]; tmps[gid].out32[i + 2] = tmps[gid].dgst32[i + 2]; tmps[gid].out32[i + 3] = tmps[gid].dgst32[i + 3]; tmps[gid].out32[i + 4] = tmps[gid].dgst32[i + 4]; } } __kernel void m14643_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad32, gid, 0); ipad[1] = packv (tmps, ipad32, gid, 1); ipad[2] = packv (tmps, ipad32, gid, 2); ipad[3] = packv (tmps, ipad32, gid, 3); ipad[4] = packv (tmps, ipad32, gid, 4); opad[0] = packv (tmps, opad32, gid, 0); opad[1] = packv (tmps, opad32, gid, 1); opad[2] = packv (tmps, opad32, gid, 2); opad[3] = packv (tmps, opad32, gid, 3); opad[4] = packv (tmps, opad32, gid, 4); u32 key_size = luks_bufs[digests_offset].key_size; for (u32 i = 0; i < ((key_size / 8) / 4); i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst32, gid, i + 0); dgst[1] = packv (tmps, dgst32, gid, i + 1); dgst[2] = packv (tmps, dgst32, gid, i + 2); dgst[3] = packv (tmps, dgst32, gid, i + 3); dgst[4] = packv (tmps, dgst32, gid, i + 4); out[0] = packv (tmps, out32, gid, i + 0); out[1] = packv (tmps, out32, gid, i + 1); out[2] = packv (tmps, out32, gid, i + 2); out[3] = packv (tmps, out32, gid, i + 3); out[4] = packv (tmps, out32, gid, 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] = 0x80; 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 + 20) * 8; w3[3] = 0; hmac_ripemd160_run_V (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]; } unpackv (tmps, dgst32, gid, i + 0, dgst[0]); unpackv (tmps, dgst32, gid, i + 1, dgst[1]); unpackv (tmps, dgst32, gid, i + 2, dgst[2]); unpackv (tmps, dgst32, gid, i + 3, dgst[3]); unpackv (tmps, dgst32, gid, i + 4, dgst[4]); unpackv (tmps, out32, gid, i + 0, out[0]); unpackv (tmps, out32, gid, i + 1, out[1]); unpackv (tmps, out32, gid, i + 2, out[2]); unpackv (tmps, out32, gid, i + 3, out[3]); unpackv (tmps, out32, gid, i + 4, out[4]); } } __kernel void m14643_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global luks_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const luks_t *luks_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; // decrypt AF with first pbkdf2 result // merge AF to masterkey // decrypt first payload sector with masterkey u32 pt_buf[128]; luks_af_ripemd160_then_twofish_decrypt (&luks_bufs[digests_offset], &tmps[gid], pt_buf); // check entropy const float entropy = get_entropy (pt_buf, 128); if (entropy < MAX_ENTROPY) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, 0, gid, 0); } } } hashcat-4.0.1/OpenCL/m14700.cl000066400000000000000000000264241320027462700154320ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #include "inc_cipher_aes.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha1_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m14700_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha1_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const itunes_backup_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha1_hmac_ctx_t sha1_hmac_ctx; sha1_hmac_init_global_swap (&sha1_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha1_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha1_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha1_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha1_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha1_hmac_ctx.ipad.h[4]; tmps[gid].opad[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha1_hmac_ctx.opad.h[4]; sha1_hmac_update_global (&sha1_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 8; i += 5, j += 1) { sha1_hmac_ctx_t sha1_hmac_ctx2 = sha1_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha1_hmac_update_64 (&sha1_hmac_ctx2, w0, w1, w2, w3, 4); sha1_hmac_final (&sha1_hmac_ctx2); tmps[gid].dgst[i + 0] = sha1_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha1_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha1_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha1_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha1_hmac_ctx2.opad.h[4]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; } } __kernel void m14700_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha1_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const itunes_backup_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); for (u32 i = 0; i < 8; i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); } } __kernel void m14700_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha1_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const itunes_backup_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; /** * aes */ 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 ks[KEYLEN]; AES256_set_decrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); u32 cipher[4]; cipher[0] = esalt_bufs[digests_offset].wpky[0]; cipher[1] = esalt_bufs[digests_offset].wpky[1]; cipher[2] = 0; cipher[3] = 0; u32 lsb[8]; lsb[0] = esalt_bufs[digests_offset].wpky[8]; lsb[1] = esalt_bufs[digests_offset].wpky[9]; lsb[2] = esalt_bufs[digests_offset].wpky[6]; lsb[3] = esalt_bufs[digests_offset].wpky[7]; lsb[4] = esalt_bufs[digests_offset].wpky[4]; lsb[5] = esalt_bufs[digests_offset].wpky[5]; lsb[6] = esalt_bufs[digests_offset].wpky[2]; lsb[7] = esalt_bufs[digests_offset].wpky[3]; for (int j = 5; j >= 0; j--) { // 1st cipher[1] ^= (4 * j + 4); cipher[2] = lsb[0]; cipher[3] = lsb[1]; AES256_decrypt (ks, cipher, cipher, s_td0, s_td1, s_td2, s_td3, s_td4); lsb[0] = cipher[2]; lsb[1] = cipher[3]; // 2nd cipher[1] ^= (4 * j + 3); cipher[2] = lsb[2]; cipher[3] = lsb[3]; AES256_decrypt (ks, cipher, cipher, s_td0, s_td1, s_td2, s_td3, s_td4); lsb[2] = cipher[2]; lsb[3] = cipher[3]; // 3rd cipher[1] ^= (4 * j + 2); cipher[2] = lsb[4]; cipher[3] = lsb[5]; AES256_decrypt (ks, cipher, cipher, s_td0, s_td1, s_td2, s_td3, s_td4); lsb[4] = cipher[2]; lsb[5] = cipher[3]; // 4th cipher[1] ^= (4 * j + 1); cipher[2] = lsb[6]; cipher[3] = lsb[7]; AES256_decrypt (ks, cipher, cipher, s_td0, s_td1, s_td2, s_td3, s_td4); lsb[6] = cipher[2]; lsb[7] = cipher[3]; } if ((cipher[0] == 0xa6a6a6a6) && (cipher[1] == 0xa6a6a6a6)) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, 0); } return; } } hashcat-4.0.1/OpenCL/m14800.cl000066400000000000000000000502461320027462700154320ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #include "inc_hash_sha256.cl" #include "inc_cipher_aes.cl" void hmac_sha1_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } void hmac_sha256_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m14800_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global itunes_backup_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha256_hmac_ctx_t sha256_hmac_ctx; sha256_hmac_init_global_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha256_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha256_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha256_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha256_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha256_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha256_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha256_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha256_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha256_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha256_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha256_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha256_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha256_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha256_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha256_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha256_hmac_ctx.opad.h[7]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = esalt_bufs[digests_offset].dpsl[0]; w0[1] = esalt_bufs[digests_offset].dpsl[1]; w0[2] = esalt_bufs[digests_offset].dpsl[2]; w0[3] = esalt_bufs[digests_offset].dpsl[3]; w1[0] = esalt_bufs[digests_offset].dpsl[4]; 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; sha256_hmac_update_64 (&sha256_hmac_ctx, w0, w1, w2, w3, 20); for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) { sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; w0[0] = j; 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] = 0; sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); sha256_hmac_final (&sha256_hmac_ctx2); tmps[gid].dgst[i + 0] = sha256_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha256_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha256_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha256_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha256_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha256_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha256_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha256_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m14800_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global itunes_backup_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[8]; u32x opad[8]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); ipad[5] = packv (tmps, ipad, gid, 5); ipad[6] = packv (tmps, ipad, gid, 6); ipad[7] = packv (tmps, ipad, gid, 7); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); opad[5] = packv (tmps, opad, gid, 5); opad[6] = packv (tmps, opad, gid, 6); opad[7] = packv (tmps, opad, gid, 7); for (u32 i = 0; i < 8; i += 8) { u32x dgst[8]; u32x out[8]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); dgst[5] = packv (tmps, dgst, gid, i + 5); dgst[6] = packv (tmps, dgst, gid, i + 6); dgst[7] = packv (tmps, dgst, gid, i + 7); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, i + 4); out[5] = packv (tmps, out, gid, i + 5); out[6] = packv (tmps, out, gid, i + 6); out[7] = packv (tmps, out, gid, i + 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, dgst, gid, i + 5, dgst[5]); unpackv (tmps, dgst, gid, i + 6, dgst[6]); unpackv (tmps, dgst, gid, i + 7, dgst[7]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); unpackv (tmps, out, gid, i + 5, out[5]); unpackv (tmps, out, gid, i + 6, out[6]); unpackv (tmps, out, gid, i + 7, out[7]); } } __kernel void m14800_init2 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global itunes_backup_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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; sha1_hmac_ctx_t sha1_hmac_ctx; sha1_hmac_init_64 (&sha1_hmac_ctx, w0, w1, w2, w3); tmps[gid].ipad[0] = sha1_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha1_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha1_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha1_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha1_hmac_ctx.ipad.h[4]; tmps[gid].opad[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha1_hmac_ctx.opad.h[4]; sha1_hmac_update_global (&sha1_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 8; i += 5, j += 1) { sha1_hmac_ctx_t sha1_hmac_ctx2 = sha1_hmac_ctx; w0[0] = j; 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] = 0; sha1_hmac_update_64 (&sha1_hmac_ctx2, w0, w1, w2, w3, 4); sha1_hmac_final (&sha1_hmac_ctx2); tmps[gid].dgst[i + 0] = sha1_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha1_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha1_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha1_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha1_hmac_ctx2.opad.h[4]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; } } __kernel void m14800_loop2 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global itunes_backup_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); for (u32 i = 0; i < 8; i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); } } __kernel void m14800_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global itunes_backup_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; /** * aes */ 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 ks[KEYLEN]; AES256_set_decrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); u32 cipher[4]; cipher[0] = esalt_bufs[digests_offset].wpky[0]; cipher[1] = esalt_bufs[digests_offset].wpky[1]; cipher[2] = 0; cipher[3] = 0; u32 lsb[8]; lsb[0] = esalt_bufs[digests_offset].wpky[8]; lsb[1] = esalt_bufs[digests_offset].wpky[9]; lsb[2] = esalt_bufs[digests_offset].wpky[6]; lsb[3] = esalt_bufs[digests_offset].wpky[7]; lsb[4] = esalt_bufs[digests_offset].wpky[4]; lsb[5] = esalt_bufs[digests_offset].wpky[5]; lsb[6] = esalt_bufs[digests_offset].wpky[2]; lsb[7] = esalt_bufs[digests_offset].wpky[3]; for (int j = 5; j >= 0; j--) { // 1st cipher[1] ^= (4 * j + 4); cipher[2] = lsb[0]; cipher[3] = lsb[1]; AES256_decrypt (ks, cipher, cipher, s_td0, s_td1, s_td2, s_td3, s_td4); lsb[0] = cipher[2]; lsb[1] = cipher[3]; // 2nd cipher[1] ^= (4 * j + 3); cipher[2] = lsb[2]; cipher[3] = lsb[3]; AES256_decrypt (ks, cipher, cipher, s_td0, s_td1, s_td2, s_td3, s_td4); lsb[2] = cipher[2]; lsb[3] = cipher[3]; // 3rd cipher[1] ^= (4 * j + 2); cipher[2] = lsb[4]; cipher[3] = lsb[5]; AES256_decrypt (ks, cipher, cipher, s_td0, s_td1, s_td2, s_td3, s_td4); lsb[4] = cipher[2]; lsb[5] = cipher[3]; // 4th cipher[1] ^= (4 * j + 1); cipher[2] = lsb[6]; cipher[3] = lsb[7]; AES256_decrypt (ks, cipher, cipher, s_td0, s_td1, s_td2, s_td3, s_td4); lsb[6] = cipher[2]; lsb[7] = cipher[3]; } if ((cipher[0] == 0xa6a6a6a6) && (cipher[1] == 0xa6a6a6a6)) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, 0); } return; } } hashcat-4.0.1/OpenCL/m14900_a0-optimized.cl000066400000000000000000000304371320027462700200150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __constant u8a c_ftable[256] = { 0xa3, 0xd7, 0x09, 0x83, 0xf8, 0x48, 0xf6, 0xf4, 0xb3, 0x21, 0x15, 0x78, 0x99, 0xb1, 0xaf, 0xf9, 0xe7, 0x2d, 0x4d, 0x8a, 0xce, 0x4c, 0xca, 0x2e, 0x52, 0x95, 0xd9, 0x1e, 0x4e, 0x38, 0x44, 0x28, 0x0a, 0xdf, 0x02, 0xa0, 0x17, 0xf1, 0x60, 0x68, 0x12, 0xb7, 0x7a, 0xc3, 0xe9, 0xfa, 0x3d, 0x53, 0x96, 0x84, 0x6b, 0xba, 0xf2, 0x63, 0x9a, 0x19, 0x7c, 0xae, 0xe5, 0xf5, 0xf7, 0x16, 0x6a, 0xa2, 0x39, 0xb6, 0x7b, 0x0f, 0xc1, 0x93, 0x81, 0x1b, 0xee, 0xb4, 0x1a, 0xea, 0xd0, 0x91, 0x2f, 0xb8, 0x55, 0xb9, 0xda, 0x85, 0x3f, 0x41, 0xbf, 0xe0, 0x5a, 0x58, 0x80, 0x5f, 0x66, 0x0b, 0xd8, 0x90, 0x35, 0xd5, 0xc0, 0xa7, 0x33, 0x06, 0x65, 0x69, 0x45, 0x00, 0x94, 0x56, 0x6d, 0x98, 0x9b, 0x76, 0x97, 0xfc, 0xb2, 0xc2, 0xb0, 0xfe, 0xdb, 0x20, 0xe1, 0xeb, 0xd6, 0xe4, 0xdd, 0x47, 0x4a, 0x1d, 0x42, 0xed, 0x9e, 0x6e, 0x49, 0x3c, 0xcd, 0x43, 0x27, 0xd2, 0x07, 0xd4, 0xde, 0xc7, 0x67, 0x18, 0x89, 0xcb, 0x30, 0x1f, 0x8d, 0xc6, 0x8f, 0xaa, 0xc8, 0x74, 0xdc, 0xc9, 0x5d, 0x5c, 0x31, 0xa4, 0x70, 0x88, 0x61, 0x2c, 0x9f, 0x0d, 0x2b, 0x87, 0x50, 0x82, 0x54, 0x64, 0x26, 0x7d, 0x03, 0x40, 0x34, 0x4b, 0x1c, 0x73, 0xd1, 0xc4, 0xfd, 0x3b, 0xcc, 0xfb, 0x7f, 0xab, 0xe6, 0x3e, 0x5b, 0xa5, 0xad, 0x04, 0x23, 0x9c, 0x14, 0x51, 0x22, 0xf0, 0x29, 0x79, 0x71, 0x7e, 0xff, 0x8c, 0x0e, 0xe2, 0x0c, 0xef, 0xbc, 0x72, 0x75, 0x6f, 0x37, 0xa1, 0xec, 0xd3, 0x8e, 0x62, 0x8b, 0x86, 0x10, 0xe8, 0x08, 0x77, 0x11, 0xbe, 0x92, 0x4f, 0x24, 0xc5, 0x32, 0x36, 0x9d, 0xcf, 0xf3, 0xa6, 0xbb, 0xac, 0x5e, 0x6c, 0xa9, 0x13, 0x57, 0x25, 0xb5, 0xe3, 0xbd, 0xa8, 0x3a, 0x01, 0x05, 0x59, 0x2a, 0x46 }; void g (__local u8 *s_ftable, const u32 *key, const int k, const u32 *wx, u32 *out) { const u32 g1 = wx[1]; const u32 g2 = wx[0]; const u32 g3 = s_ftable[g2 ^ key[(4 * k + 0) % 10]] ^ g1; const u32 g4 = s_ftable[g3 ^ key[(4 * k + 1) % 10]] ^ g2; const u32 g5 = s_ftable[g4 ^ key[(4 * k + 2) % 10]] ^ g3; const u32 g6 = s_ftable[g5 ^ key[(4 * k + 3) % 10]] ^ g4; out[0] = g6; out[1] = g5; } u32 skip32 (__local u8 *s_ftable, const u32 KP, const u32 *key) { u32 wl[2]; u32 wr[2]; wl[0] = (KP >> 8) & 0xff; wl[1] = (KP >> 0) & 0xff; wr[0] = (KP >> 24) & 0xff; wr[1] = (KP >> 16) & 0xff; for (u32 i = 0; i < 12; i++) { const u32 k0 = (i * 2) + 0; const u32 k1 = (i * 2) + 1; u32 tmp[2]; g (s_ftable, key, k0, wl, tmp); tmp[0] ^= k0; wr[0] ^= tmp[0]; wr[1] ^= tmp[1]; g (s_ftable, key, k1, wr, tmp); tmp[0] ^= k1; wl[0] ^= tmp[0]; wl[1] ^= tmp[1]; } const u32 r = ((wr[1] & 0xff) << 0) | ((wr[0] & 0xff) << 8) | ((wl[1] & 0xff) << 16) | ((wl[0] & 0xff) << 24); return r; } __kernel void m14900_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_ftable */ __local u8 s_ftable[256]; for (u32 i = lid; i < 256; i += lsz) { s_ftable[i] = c_ftable[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 KP = salt_bufs[salt_pos].salt_buf[0]; /** * main */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); u32 key[10]; key[0] = (w0[0] >> 0) & 0xff; key[1] = (w0[0] >> 8) & 0xff; key[2] = (w0[0] >> 16) & 0xff; key[3] = (w0[0] >> 24) & 0xff; key[4] = (w0[1] >> 0) & 0xff; key[5] = (w0[1] >> 8) & 0xff; key[6] = (w0[1] >> 16) & 0xff; key[7] = (w0[1] >> 24) & 0xff; key[8] = (w0[2] >> 0) & 0xff; key[9] = (w0[2] >> 8) & 0xff; const u32 r = skip32 (s_ftable, KP, key); const u32 z = 0; COMPARE_M_SIMD (r, z, z, z); } } __kernel void m14900_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m14900_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m14900_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_ftable */ __local u8 s_ftable[256]; for (u32 i = lid; i < 256; i += lsz) { s_ftable[i] = c_ftable[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 KP = salt_bufs[salt_pos].salt_buf[0]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], 0, 0, 0 }; /** * main */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); u32 key[10]; key[0] = (w0[0] >> 0) & 0xff; key[1] = (w0[0] >> 8) & 0xff; key[2] = (w0[0] >> 16) & 0xff; key[3] = (w0[0] >> 24) & 0xff; key[4] = (w0[1] >> 0) & 0xff; key[5] = (w0[1] >> 8) & 0xff; key[6] = (w0[1] >> 16) & 0xff; key[7] = (w0[1] >> 24) & 0xff; key[8] = (w0[2] >> 0) & 0xff; key[9] = (w0[2] >> 8) & 0xff; const u32 r = skip32 (s_ftable, KP, key); const u32 z = 0; COMPARE_S_SIMD (r, z, z, z); } } __kernel void m14900_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m14900_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m14900_a1-optimized.cl000066400000000000000000000372201320027462700200130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u8a c_ftable[256] = { 0xa3, 0xd7, 0x09, 0x83, 0xf8, 0x48, 0xf6, 0xf4, 0xb3, 0x21, 0x15, 0x78, 0x99, 0xb1, 0xaf, 0xf9, 0xe7, 0x2d, 0x4d, 0x8a, 0xce, 0x4c, 0xca, 0x2e, 0x52, 0x95, 0xd9, 0x1e, 0x4e, 0x38, 0x44, 0x28, 0x0a, 0xdf, 0x02, 0xa0, 0x17, 0xf1, 0x60, 0x68, 0x12, 0xb7, 0x7a, 0xc3, 0xe9, 0xfa, 0x3d, 0x53, 0x96, 0x84, 0x6b, 0xba, 0xf2, 0x63, 0x9a, 0x19, 0x7c, 0xae, 0xe5, 0xf5, 0xf7, 0x16, 0x6a, 0xa2, 0x39, 0xb6, 0x7b, 0x0f, 0xc1, 0x93, 0x81, 0x1b, 0xee, 0xb4, 0x1a, 0xea, 0xd0, 0x91, 0x2f, 0xb8, 0x55, 0xb9, 0xda, 0x85, 0x3f, 0x41, 0xbf, 0xe0, 0x5a, 0x58, 0x80, 0x5f, 0x66, 0x0b, 0xd8, 0x90, 0x35, 0xd5, 0xc0, 0xa7, 0x33, 0x06, 0x65, 0x69, 0x45, 0x00, 0x94, 0x56, 0x6d, 0x98, 0x9b, 0x76, 0x97, 0xfc, 0xb2, 0xc2, 0xb0, 0xfe, 0xdb, 0x20, 0xe1, 0xeb, 0xd6, 0xe4, 0xdd, 0x47, 0x4a, 0x1d, 0x42, 0xed, 0x9e, 0x6e, 0x49, 0x3c, 0xcd, 0x43, 0x27, 0xd2, 0x07, 0xd4, 0xde, 0xc7, 0x67, 0x18, 0x89, 0xcb, 0x30, 0x1f, 0x8d, 0xc6, 0x8f, 0xaa, 0xc8, 0x74, 0xdc, 0xc9, 0x5d, 0x5c, 0x31, 0xa4, 0x70, 0x88, 0x61, 0x2c, 0x9f, 0x0d, 0x2b, 0x87, 0x50, 0x82, 0x54, 0x64, 0x26, 0x7d, 0x03, 0x40, 0x34, 0x4b, 0x1c, 0x73, 0xd1, 0xc4, 0xfd, 0x3b, 0xcc, 0xfb, 0x7f, 0xab, 0xe6, 0x3e, 0x5b, 0xa5, 0xad, 0x04, 0x23, 0x9c, 0x14, 0x51, 0x22, 0xf0, 0x29, 0x79, 0x71, 0x7e, 0xff, 0x8c, 0x0e, 0xe2, 0x0c, 0xef, 0xbc, 0x72, 0x75, 0x6f, 0x37, 0xa1, 0xec, 0xd3, 0x8e, 0x62, 0x8b, 0x86, 0x10, 0xe8, 0x08, 0x77, 0x11, 0xbe, 0x92, 0x4f, 0x24, 0xc5, 0x32, 0x36, 0x9d, 0xcf, 0xf3, 0xa6, 0xbb, 0xac, 0x5e, 0x6c, 0xa9, 0x13, 0x57, 0x25, 0xb5, 0xe3, 0xbd, 0xa8, 0x3a, 0x01, 0x05, 0x59, 0x2a, 0x46 }; void g (__local u8 *s_ftable, const u32 *key, const int k, const u32 *wx, u32 *out) { const u32 g1 = wx[1]; const u32 g2 = wx[0]; const u32 g3 = s_ftable[g2 ^ key[(4 * k + 0) % 10]] ^ g1; const u32 g4 = s_ftable[g3 ^ key[(4 * k + 1) % 10]] ^ g2; const u32 g5 = s_ftable[g4 ^ key[(4 * k + 2) % 10]] ^ g3; const u32 g6 = s_ftable[g5 ^ key[(4 * k + 3) % 10]] ^ g4; out[0] = g6; out[1] = g5; } u32 skip32 (__local u8 *s_ftable, const u32 KP, const u32 *key) { u32 wl[2]; u32 wr[2]; wl[0] = (KP >> 8) & 0xff; wl[1] = (KP >> 0) & 0xff; wr[0] = (KP >> 24) & 0xff; wr[1] = (KP >> 16) & 0xff; for (u32 i = 0; i < 12; i++) { const u32 k0 = (i * 2) + 0; const u32 k1 = (i * 2) + 1; u32 tmp[2]; g (s_ftable, key, k0, wl, tmp); tmp[0] ^= k0; wr[0] ^= tmp[0]; wr[1] ^= tmp[1]; g (s_ftable, key, k1, wr, tmp); tmp[0] ^= k1; wl[0] ^= tmp[0]; wl[1] ^= tmp[1]; } const u32 r = ((wr[1] & 0xff) << 0) | ((wr[0] & 0xff) << 8) | ((wl[1] & 0xff) << 16) | ((wl[0] & 0xff) << 24); return r; } __kernel void m14900_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_ftable */ __local u8 s_ftable[256]; for (u32 i = lid; i < 256; i += lsz) { s_ftable[i] = c_ftable[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ const u32 KP = salt_bufs[salt_pos].salt_buf[0]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32 pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32 wordl0[4] = { 0 }; u32 wordl1[4] = { 0 }; u32 wordl2[4] = { 0 }; u32 wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32 wordr0[4] = { 0 }; u32 wordr1[4] = { 0 }; u32 wordr2[4] = { 0 }; u32 wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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]; /** * Skip32 */ u32 key[10]; key[0] = (w0[0] >> 0) & 0xff; key[1] = (w0[0] >> 8) & 0xff; key[2] = (w0[0] >> 16) & 0xff; key[3] = (w0[0] >> 24) & 0xff; key[4] = (w0[1] >> 0) & 0xff; key[5] = (w0[1] >> 8) & 0xff; key[6] = (w0[1] >> 16) & 0xff; key[7] = (w0[1] >> 24) & 0xff; key[8] = (w0[2] >> 0) & 0xff; key[9] = (w0[2] >> 8) & 0xff; const u32 r = skip32 (s_ftable, KP, key); const u32 z = 0; COMPARE_M_SIMD (r, z, z, z); } } __kernel void m14900_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m14900_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m14900_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * s_ftable */ __local u8 s_ftable[256]; for (u32 i = lid; i < 256; i += lsz) { s_ftable[i] = c_ftable[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ const u32 KP = salt_bufs[salt_pos].salt_buf[0]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], 0, 0, 0 }; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32 pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32 wordl0[4] = { 0 }; u32 wordl1[4] = { 0 }; u32 wordl2[4] = { 0 }; u32 wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32 wordr0[4] = { 0 }; u32 wordr1[4] = { 0 }; u32 wordr2[4] = { 0 }; u32 wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 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]; /** * Skip32 */ u32 key[10]; key[0] = (w0[0] >> 0) & 0xff; key[1] = (w0[0] >> 8) & 0xff; key[2] = (w0[0] >> 16) & 0xff; key[3] = (w0[0] >> 24) & 0xff; key[4] = (w0[1] >> 0) & 0xff; key[5] = (w0[1] >> 8) & 0xff; key[6] = (w0[1] >> 16) & 0xff; key[7] = (w0[1] >> 24) & 0xff; key[8] = (w0[2] >> 0) & 0xff; key[9] = (w0[2] >> 8) & 0xff; const u32 r = skip32 (s_ftable, KP, key); const u32 z = 0; COMPARE_S_SIMD (r, z, z, z); } } __kernel void m14900_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m14900_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m14900_a3-optimized.cl000066400000000000000000000370251320027462700200200ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //too much register pressure //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u8a c_ftable[256] = { 0xa3, 0xd7, 0x09, 0x83, 0xf8, 0x48, 0xf6, 0xf4, 0xb3, 0x21, 0x15, 0x78, 0x99, 0xb1, 0xaf, 0xf9, 0xe7, 0x2d, 0x4d, 0x8a, 0xce, 0x4c, 0xca, 0x2e, 0x52, 0x95, 0xd9, 0x1e, 0x4e, 0x38, 0x44, 0x28, 0x0a, 0xdf, 0x02, 0xa0, 0x17, 0xf1, 0x60, 0x68, 0x12, 0xb7, 0x7a, 0xc3, 0xe9, 0xfa, 0x3d, 0x53, 0x96, 0x84, 0x6b, 0xba, 0xf2, 0x63, 0x9a, 0x19, 0x7c, 0xae, 0xe5, 0xf5, 0xf7, 0x16, 0x6a, 0xa2, 0x39, 0xb6, 0x7b, 0x0f, 0xc1, 0x93, 0x81, 0x1b, 0xee, 0xb4, 0x1a, 0xea, 0xd0, 0x91, 0x2f, 0xb8, 0x55, 0xb9, 0xda, 0x85, 0x3f, 0x41, 0xbf, 0xe0, 0x5a, 0x58, 0x80, 0x5f, 0x66, 0x0b, 0xd8, 0x90, 0x35, 0xd5, 0xc0, 0xa7, 0x33, 0x06, 0x65, 0x69, 0x45, 0x00, 0x94, 0x56, 0x6d, 0x98, 0x9b, 0x76, 0x97, 0xfc, 0xb2, 0xc2, 0xb0, 0xfe, 0xdb, 0x20, 0xe1, 0xeb, 0xd6, 0xe4, 0xdd, 0x47, 0x4a, 0x1d, 0x42, 0xed, 0x9e, 0x6e, 0x49, 0x3c, 0xcd, 0x43, 0x27, 0xd2, 0x07, 0xd4, 0xde, 0xc7, 0x67, 0x18, 0x89, 0xcb, 0x30, 0x1f, 0x8d, 0xc6, 0x8f, 0xaa, 0xc8, 0x74, 0xdc, 0xc9, 0x5d, 0x5c, 0x31, 0xa4, 0x70, 0x88, 0x61, 0x2c, 0x9f, 0x0d, 0x2b, 0x87, 0x50, 0x82, 0x54, 0x64, 0x26, 0x7d, 0x03, 0x40, 0x34, 0x4b, 0x1c, 0x73, 0xd1, 0xc4, 0xfd, 0x3b, 0xcc, 0xfb, 0x7f, 0xab, 0xe6, 0x3e, 0x5b, 0xa5, 0xad, 0x04, 0x23, 0x9c, 0x14, 0x51, 0x22, 0xf0, 0x29, 0x79, 0x71, 0x7e, 0xff, 0x8c, 0x0e, 0xe2, 0x0c, 0xef, 0xbc, 0x72, 0x75, 0x6f, 0x37, 0xa1, 0xec, 0xd3, 0x8e, 0x62, 0x8b, 0x86, 0x10, 0xe8, 0x08, 0x77, 0x11, 0xbe, 0x92, 0x4f, 0x24, 0xc5, 0x32, 0x36, 0x9d, 0xcf, 0xf3, 0xa6, 0xbb, 0xac, 0x5e, 0x6c, 0xa9, 0x13, 0x57, 0x25, 0xb5, 0xe3, 0xbd, 0xa8, 0x3a, 0x01, 0x05, 0x59, 0x2a, 0x46 }; void g (__local u8 *s_ftable, const u32 *key, const int k, const u32 *wx, u32 *out) { const u32 g1 = wx[1]; const u32 g2 = wx[0]; const u32 g3 = s_ftable[g2 ^ key[(4 * k + 0) % 10]] ^ g1; const u32 g4 = s_ftable[g3 ^ key[(4 * k + 1) % 10]] ^ g2; const u32 g5 = s_ftable[g4 ^ key[(4 * k + 2) % 10]] ^ g3; const u32 g6 = s_ftable[g5 ^ key[(4 * k + 3) % 10]] ^ g4; out[0] = g6; out[1] = g5; } u32 skip32 (__local u8 *s_ftable, const u32 KP, const u32 *key) { u32 wl[2]; u32 wr[2]; wl[0] = (KP >> 8) & 0xff; wl[1] = (KP >> 0) & 0xff; wr[0] = (KP >> 24) & 0xff; wr[1] = (KP >> 16) & 0xff; for (u32 i = 0; i < 12; i++) { const u32 k0 = (i * 2) + 0; const u32 k1 = (i * 2) + 1; u32 tmp[2]; g (s_ftable, key, k0, wl, tmp); tmp[0] ^= k0; wr[0] ^= tmp[0]; wr[1] ^= tmp[1]; g (s_ftable, key, k1, wr, tmp); tmp[0] ^= k1; wl[0] ^= tmp[0]; wl[1] ^= tmp[1]; } const u32 r = ((wr[1] & 0xff) << 0) | ((wr[0] & 0xff) << 8) | ((wl[1] & 0xff) << 16) | ((wl[0] & 0xff) << 24); return r; } void m14900m (__local u8 *s_ftable, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 KP = salt_bufs[salt_pos].salt_buf[0]; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = ix_create_bft (bfs_buf, il_pos); const u32 w0lr = w0l | w0r; u32 key[10]; key[0] = (w0lr >> 0) & 0xff; key[1] = (w0lr >> 8) & 0xff; key[2] = (w0lr >> 16) & 0xff; key[3] = (w0lr >> 24) & 0xff; key[4] = (w0[1] >> 0) & 0xff; key[5] = (w0[1] >> 8) & 0xff; key[6] = (w0[1] >> 16) & 0xff; key[7] = (w0[1] >> 24) & 0xff; key[8] = (w0[2] >> 0) & 0xff; key[9] = (w0[2] >> 8) & 0xff; const u32 r = skip32 (s_ftable, KP, key); const u32 z = 0; COMPARE_M_SIMD (r, z, z, z); } } void m14900s (__local u8 *s_ftable, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 KP = salt_bufs[salt_pos].salt_buf[0]; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], 0, 0, 0, }; /** * loop */ u32 w0l = w0[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32 w0r = ix_create_bft (bfs_buf, il_pos); const u32 w0lr = w0l | w0r; u32 key[10]; key[0] = (w0lr >> 0) & 0xff; key[1] = (w0lr >> 8) & 0xff; key[2] = (w0lr >> 16) & 0xff; key[3] = (w0lr >> 24) & 0xff; key[4] = (w0[1] >> 0) & 0xff; key[5] = (w0[1] >> 8) & 0xff; key[6] = (w0[1] >> 16) & 0xff; key[7] = (w0[1] >> 24) & 0xff; key[8] = (w0[2] >> 0) & 0xff; key[9] = (w0[2] >> 8) & 0xff; const u32 r = skip32 (s_ftable, KP, key); const u32 z = 0; COMPARE_S_SIMD (r, z, z, z); } } __kernel void m14900_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u8 s_ftable[256]; for (u32 i = lid; i < 256; i += lsz) { s_ftable[i] = c_ftable[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ m14900m (s_ftable, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m14900_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m14900_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m14900_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * sbox, kbox */ __local u8 s_ftable[256]; for (u32 i = lid; i < 256; i += lsz) { s_ftable[i] = c_ftable[i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * base */ u32 w0[4]; w0[0] = pws[gid].i[ 0]; w0[1] = pws[gid].i[ 1]; w0[2] = pws[gid].i[ 2]; w0[3] = pws[gid].i[ 3]; u32 w1[4]; w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; u32 w2[4]; w2[0] = 0; w2[1] = 0; w2[2] = 0; w2[3] = 0; u32 w3[4]; w3[0] = 0; w3[1] = 0; w3[2] = 0; w3[3] = 0; const u32 pw_len = pws[gid].pw_len; /** * main */ m14900s (s_ftable, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, 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_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m14900_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m14900_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m15000_a0-optimized.cl000066400000000000000000000516341320027462700200070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __constant u64a 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, }; void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], const u32x w4[4], const u32x w5[4], const u32x w6[4], const u32x w7[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 = hl32_to_64 (w3[2], w3[3]); u64x w8_t = hl32_to_64 (w4[0], w4[1]); u64x w9_t = hl32_to_64 (w4[2], w4[3]); u64x wa_t = hl32_to_64 (w5[0], w5[1]); u64x wb_t = hl32_to_64 (w5[2], w5[3]); u64x wc_t = hl32_to_64 (w6[0], w6[1]); u64x wd_t = hl32_to_64 (w6[2], w6[3]); u64x we_t = hl32_to_64 (w7[0], w7[1]); u64x wf_t = hl32_to_64 (w7[2], w7[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); #ifdef _unroll #pragma unroll #endif 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 m15000_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * append salt */ const u32x pw_salt_len = out_len + salt_len; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; u32x w4_t[4]; u32x w5_t[4]; u32x w6_t[4]; u32x w7_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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; w4_t[0] = 0x80; w4_t[1] = 0; w4_t[2] = 0; w4_t[3] = 0; w5_t[0] = 0; w5_t[1] = 0; w5_t[2] = 0; w5_t[3] = 0; w6_t[0] = 0; w6_t[1] = 0; w6_t[2] = 0; w6_t[3] = 0; w7_t[0] = 0; w7_t[1] = 0; w7_t[2] = 0; w7_t[3] = 0; switch_buffer_by_offset_8x4_le_VV (w0_t, w1_t, w2_t, w3_t, w4_t, w5_t, w6_t, w7_t, 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] |= 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]; w0_t[0] = swap32 (w0_t[0]); w0_t[1] = swap32 (w0_t[1]); w0_t[2] = swap32 (w0_t[2]); w0_t[3] = swap32 (w0_t[3]); w1_t[0] = swap32 (w1_t[0]); w1_t[1] = swap32 (w1_t[1]); w1_t[2] = swap32 (w1_t[2]); w1_t[3] = swap32 (w1_t[3]); w2_t[0] = swap32 (w2_t[0]); w2_t[1] = swap32 (w2_t[1]); w2_t[2] = swap32 (w2_t[2]); w2_t[3] = swap32 (w2_t[3]); w3_t[0] = swap32 (w3_t[0]); w3_t[1] = swap32 (w3_t[1]); w3_t[2] = swap32 (w3_t[2]); w3_t[3] = swap32 (w3_t[3]); w4_t[0] = swap32 (w4_t[0]); w4_t[1] = swap32 (w4_t[1]); w4_t[2] = swap32 (w4_t[2]); w4_t[3] = swap32 (w4_t[3]); w5_t[0] = swap32 (w5_t[0]); w5_t[1] = swap32 (w5_t[1]); w5_t[2] = swap32 (w5_t[2]); w5_t[3] = swap32 (w5_t[3]); w6_t[0] = swap32 (w6_t[0]); w6_t[1] = swap32 (w6_t[1]); w6_t[2] = swap32 (w6_t[2]); w6_t[3] = swap32 (w6_t[3]); w7_t[0] = swap32 (w7_t[0]); w7_t[1] = swap32 (w7_t[1]); w7_t[2] = 0; w7_t[3] = pw_salt_len * 8; /** * sha512 */ 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, w4_t, w5_t, w6_t, w7_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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m15000_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15000_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15000_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); /** * append salt */ const u32x pw_salt_len = out_len + salt_len; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; u32x w4_t[4]; u32x w5_t[4]; u32x w6_t[4]; u32x w7_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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; w4_t[0] = 0x80; w4_t[1] = 0; w4_t[2] = 0; w4_t[3] = 0; w5_t[0] = 0; w5_t[1] = 0; w5_t[2] = 0; w5_t[3] = 0; w6_t[0] = 0; w6_t[1] = 0; w6_t[2] = 0; w6_t[3] = 0; w7_t[0] = 0; w7_t[1] = 0; w7_t[2] = 0; w7_t[3] = 0; switch_buffer_by_offset_8x4_le_VV (w0_t, w1_t, w2_t, w3_t, w4_t, w5_t, w6_t, w7_t, 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] |= 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]; w0_t[0] = swap32 (w0_t[0]); w0_t[1] = swap32 (w0_t[1]); w0_t[2] = swap32 (w0_t[2]); w0_t[3] = swap32 (w0_t[3]); w1_t[0] = swap32 (w1_t[0]); w1_t[1] = swap32 (w1_t[1]); w1_t[2] = swap32 (w1_t[2]); w1_t[3] = swap32 (w1_t[3]); w2_t[0] = swap32 (w2_t[0]); w2_t[1] = swap32 (w2_t[1]); w2_t[2] = swap32 (w2_t[2]); w2_t[3] = swap32 (w2_t[3]); w3_t[0] = swap32 (w3_t[0]); w3_t[1] = swap32 (w3_t[1]); w3_t[2] = swap32 (w3_t[2]); w3_t[3] = swap32 (w3_t[3]); w4_t[0] = swap32 (w4_t[0]); w4_t[1] = swap32 (w4_t[1]); w4_t[2] = swap32 (w4_t[2]); w4_t[3] = swap32 (w4_t[3]); w5_t[0] = swap32 (w5_t[0]); w5_t[1] = swap32 (w5_t[1]); w5_t[2] = swap32 (w5_t[2]); w5_t[3] = swap32 (w5_t[3]); w6_t[0] = swap32 (w6_t[0]); w6_t[1] = swap32 (w6_t[1]); w6_t[2] = swap32 (w6_t[2]); w6_t[3] = swap32 (w6_t[3]); w7_t[0] = swap32 (w7_t[0]); w7_t[1] = swap32 (w7_t[1]); w7_t[2] = 0; w7_t[3] = pw_salt_len * 8; /** * sha512 */ 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, w4_t, w5_t, w6_t, w7_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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m15000_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15000_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m15000_a0.cl000066400000000000000000000107741320027462700160050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha512.cl" __kernel void m15000_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha512_ctx_t ctx; sha512_init (&ctx); sha512_update_swap (&ctx, tmp.i, tmp.pw_len); sha512_update (&ctx, s, salt_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m15000_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha512_ctx_t ctx; sha512_init (&ctx); sha512_update_swap (&ctx, tmp.i, tmp.pw_len); sha512_update (&ctx, s, salt_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m15000_a1-optimized.cl000066400000000000000000000603471320027462700200110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u64a 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, }; void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], const u32x w4[4], const u32x w5[4], const u32x w6[4], const u32x w7[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 = hl32_to_64 (w3[2], w3[3]); u64x w8_t = hl32_to_64 (w4[0], w4[1]); u64x w9_t = hl32_to_64 (w4[2], w4[3]); u64x wa_t = hl32_to_64 (w5[0], w5[1]); u64x wb_t = hl32_to_64 (w5[2], w5[3]); u64x wc_t = hl32_to_64 (w6[0], w6[1]); u64x wd_t = hl32_to_64 (w6[2], w6[3]); u64x we_t = hl32_to_64 (w7[0], w7[1]); u64x wf_t = hl32_to_64 (w7[2], w7[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); #ifdef _unroll #pragma unroll #endif 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 m15000_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ const u32x pw_salt_len = pw_len + salt_len; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; u32x w4_t[4]; u32x w5_t[4]; u32x w6_t[4]; u32x w7_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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; w4_t[0] = 0x80; w4_t[1] = 0; w4_t[2] = 0; w4_t[3] = 0; w5_t[0] = 0; w5_t[1] = 0; w5_t[2] = 0; w5_t[3] = 0; w6_t[0] = 0; w6_t[1] = 0; w6_t[2] = 0; w6_t[3] = 0; w7_t[0] = 0; w7_t[1] = 0; w7_t[2] = 0; w7_t[3] = 0; switch_buffer_by_offset_8x4_le_VV (w0_t, w1_t, w2_t, w3_t, w4_t, w5_t, w6_t, w7_t, 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] |= w3[2]; w3_t[3] |= w3[3]; w0_t[0] = swap32 (w0_t[0]); w0_t[1] = swap32 (w0_t[1]); w0_t[2] = swap32 (w0_t[2]); w0_t[3] = swap32 (w0_t[3]); w1_t[0] = swap32 (w1_t[0]); w1_t[1] = swap32 (w1_t[1]); w1_t[2] = swap32 (w1_t[2]); w1_t[3] = swap32 (w1_t[3]); w2_t[0] = swap32 (w2_t[0]); w2_t[1] = swap32 (w2_t[1]); w2_t[2] = swap32 (w2_t[2]); w2_t[3] = swap32 (w2_t[3]); w3_t[0] = swap32 (w3_t[0]); w3_t[1] = swap32 (w3_t[1]); w3_t[2] = swap32 (w3_t[2]); w3_t[3] = swap32 (w3_t[3]); w4_t[0] = swap32 (w4_t[0]); w4_t[1] = swap32 (w4_t[1]); w4_t[2] = swap32 (w4_t[2]); w4_t[3] = swap32 (w4_t[3]); w5_t[0] = swap32 (w5_t[0]); w5_t[1] = swap32 (w5_t[1]); w5_t[2] = swap32 (w5_t[2]); w5_t[3] = swap32 (w5_t[3]); w6_t[0] = swap32 (w6_t[0]); w6_t[1] = swap32 (w6_t[1]); w6_t[2] = swap32 (w6_t[2]); w6_t[3] = swap32 (w6_t[3]); w7_t[0] = swap32 (w7_t[0]); w7_t[1] = swap32 (w7_t[1]); w7_t[2] = 0; w7_t[3] = pw_salt_len * 8; /** * sha512 */ 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, w4_t, w5_t, w6_t, w7_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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m15000_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15000_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15000_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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 */ const u32x pw_salt_len = pw_len + salt_len; u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; u32x w4_t[4]; u32x w5_t[4]; u32x w6_t[4]; u32x w7_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]; w3_t[2] = salt_buf3[2]; w3_t[3] = salt_buf3[3]; w4_t[0] = 0x80; w4_t[1] = 0; w4_t[2] = 0; w4_t[3] = 0; w5_t[0] = 0; w5_t[1] = 0; w5_t[2] = 0; w5_t[3] = 0; w6_t[0] = 0; w6_t[1] = 0; w6_t[2] = 0; w6_t[3] = 0; w7_t[0] = 0; w7_t[1] = 0; w7_t[2] = 0; w7_t[3] = 0; switch_buffer_by_offset_8x4_le_VV (w0_t, w1_t, w2_t, w3_t, w4_t, w5_t, w6_t, w7_t, 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] |= w3[2]; w3_t[3] |= w3[3]; w0_t[0] = swap32 (w0_t[0]); w0_t[1] = swap32 (w0_t[1]); w0_t[2] = swap32 (w0_t[2]); w0_t[3] = swap32 (w0_t[3]); w1_t[0] = swap32 (w1_t[0]); w1_t[1] = swap32 (w1_t[1]); w1_t[2] = swap32 (w1_t[2]); w1_t[3] = swap32 (w1_t[3]); w2_t[0] = swap32 (w2_t[0]); w2_t[1] = swap32 (w2_t[1]); w2_t[2] = swap32 (w2_t[2]); w2_t[3] = swap32 (w2_t[3]); w3_t[0] = swap32 (w3_t[0]); w3_t[1] = swap32 (w3_t[1]); w3_t[2] = swap32 (w3_t[2]); w3_t[3] = swap32 (w3_t[3]); w4_t[0] = swap32 (w4_t[0]); w4_t[1] = swap32 (w4_t[1]); w4_t[2] = swap32 (w4_t[2]); w4_t[3] = swap32 (w4_t[3]); w5_t[0] = swap32 (w5_t[0]); w5_t[1] = swap32 (w5_t[1]); w5_t[2] = swap32 (w5_t[2]); w5_t[3] = swap32 (w5_t[3]); w6_t[0] = swap32 (w6_t[0]); w6_t[1] = swap32 (w6_t[1]); w6_t[2] = swap32 (w6_t[2]); w6_t[3] = swap32 (w6_t[3]); w7_t[0] = swap32 (w7_t[0]); w7_t[1] = swap32 (w7_t[1]); w7_t[2] = 0; w7_t[3] = pw_salt_len * 8; /** * sha512 */ 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, w4_t, w5_t, w6_t, w7_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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m15000_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15000_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m15000_a1.cl000066400000000000000000000107331320027462700160010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha512.cl" __kernel void m15000_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha512_ctx_t ctx = ctx0; sha512_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha512_update (&ctx, s, salt_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m15000_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha512_ctx_t ctx0; sha512_init (&ctx0); sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha512_ctx_t ctx = ctx0; sha512_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha512_update (&ctx, s, salt_len); sha512_final (&ctx); const u32 r0 = l32_from_64_S (ctx.h[7]); const u32 r1 = h32_from_64_S (ctx.h[7]); const u32 r2 = l32_from_64_S (ctx.h[3]); const u32 r3 = h32_from_64_S (ctx.h[3]); COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m15000_a3-optimized.cl000066400000000000000000000664071320027462700200160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __constant u64a 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, }; void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], const u32x w4[4], const u32x w5[4], const u32x w6[4], const u32x w7[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 = hl32_to_64 (w3[2], w3[3]); u64x w8_t = hl32_to_64 (w4[0], w4[1]); u64x w9_t = hl32_to_64 (w4[2], w4[3]); u64x wa_t = hl32_to_64 (w5[0], w5[1]); u64x wb_t = hl32_to_64 (w5[2], w5[3]); u64x wc_t = hl32_to_64 (w6[0], w6[1]); u64x wd_t = hl32_to_64 (w6[2], w6[3]); u64x we_t = hl32_to_64 (w7[0], w7[1]); u64x wf_t = hl32_to_64 (w7[2], w7[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); #ifdef _unroll #pragma unroll #endif 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; } void m15000m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ const u32 salt_len = salt_bufs[salt_pos].salt_len; const u32 pw_salt_len = pw_len + salt_len; u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; u32 salt_buf4[4]; u32 salt_buf5[4]; u32 salt_buf6[4]; u32 salt_buf7[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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]; salt_buf4[0] = 0x80; salt_buf4[1] = 0; salt_buf4[2] = 0; salt_buf4[3] = 0; salt_buf5[0] = 0; salt_buf5[1] = 0; salt_buf5[2] = 0; salt_buf5[3] = 0; salt_buf6[0] = 0; salt_buf6[1] = 0; salt_buf6[2] = 0; salt_buf6[3] = 0; salt_buf7[0] = 0; salt_buf7[1] = 0; salt_buf7[2] = 0; salt_buf7[3] = 0; switch_buffer_by_offset_8x4_le_S (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_buf4, salt_buf5, salt_buf6, salt_buf7, pw_len); u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; u32x w4_t[4]; u32x w5_t[4]; u32x w6_t[4]; u32x w7_t[4]; w0_t[0] = swap32 (salt_buf0[0]); w0_t[1] = swap32 (salt_buf0[1]); w0_t[2] = swap32 (salt_buf0[2]); w0_t[3] = swap32 (salt_buf0[3]); w1_t[0] = swap32 (salt_buf1[0]); w1_t[1] = swap32 (salt_buf1[1]); w1_t[2] = swap32 (salt_buf1[2]); w1_t[3] = swap32 (salt_buf1[3]); w2_t[0] = swap32 (salt_buf2[0]); w2_t[1] = swap32 (salt_buf2[1]); w2_t[2] = swap32 (salt_buf2[2]); w2_t[3] = swap32 (salt_buf2[3]); w3_t[0] = swap32 (salt_buf3[0]); w3_t[1] = swap32 (salt_buf3[1]); w3_t[2] = swap32 (salt_buf3[2]); w3_t[3] = swap32 (salt_buf3[3]); w4_t[0] = swap32 (salt_buf4[0]); w4_t[1] = swap32 (salt_buf4[1]); w4_t[2] = swap32 (salt_buf4[2]); w4_t[3] = swap32 (salt_buf4[3]); w5_t[0] = swap32 (salt_buf5[0]); w5_t[1] = swap32 (salt_buf5[1]); w5_t[2] = swap32 (salt_buf5[2]); w5_t[3] = swap32 (salt_buf5[3]); w6_t[0] = swap32 (salt_buf6[0]); w6_t[1] = swap32 (salt_buf6[1]); w6_t[2] = swap32 (salt_buf6[2]); w6_t[3] = swap32 (salt_buf6[3]); w7_t[0] = swap32 (salt_buf7[0]); w7_t[1] = swap32 (salt_buf7[1]); w7_t[2] = swap32 (salt_buf7[2]); w7_t[3] = swap32 (salt_buf7[3]); 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]; w7_t[3] = pw_salt_len * 8; /** * loop */ u32x w0l = w0_t[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w0_t[0] = w0; /* * sha512 */ 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, w4_t, w5_t, w6_t, w7_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]); COMPARE_M_SIMD (r0, r1, r2, r3); } } void m15000s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 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; const u32 pw_salt_len = pw_len + salt_len; u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; u32 salt_buf4[4]; u32 salt_buf5[4]; u32 salt_buf6[4]; u32 salt_buf7[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; salt_buf0[1] = salt_bufs[salt_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] = salt_bufs[salt_pos].salt_buf[10]; salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; 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]; salt_buf4[0] = 0x80; salt_buf4[1] = 0; salt_buf4[2] = 0; salt_buf4[3] = 0; salt_buf5[0] = 0; salt_buf5[1] = 0; salt_buf5[2] = 0; salt_buf5[3] = 0; salt_buf6[0] = 0; salt_buf6[1] = 0; salt_buf6[2] = 0; salt_buf6[3] = 0; salt_buf7[0] = 0; salt_buf7[1] = 0; salt_buf7[2] = 0; salt_buf7[3] = 0; switch_buffer_by_offset_8x4_le_S (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_buf4, salt_buf5, salt_buf6, salt_buf7, pw_len); u32x w0_t[4]; u32x w1_t[4]; u32x w2_t[4]; u32x w3_t[4]; u32x w4_t[4]; u32x w5_t[4]; u32x w6_t[4]; u32x w7_t[4]; w0_t[0] = swap32 (salt_buf0[0]); w0_t[1] = swap32 (salt_buf0[1]); w0_t[2] = swap32 (salt_buf0[2]); w0_t[3] = swap32 (salt_buf0[3]); w1_t[0] = swap32 (salt_buf1[0]); w1_t[1] = swap32 (salt_buf1[1]); w1_t[2] = swap32 (salt_buf1[2]); w1_t[3] = swap32 (salt_buf1[3]); w2_t[0] = swap32 (salt_buf2[0]); w2_t[1] = swap32 (salt_buf2[1]); w2_t[2] = swap32 (salt_buf2[2]); w2_t[3] = swap32 (salt_buf2[3]); w3_t[0] = swap32 (salt_buf3[0]); w3_t[1] = swap32 (salt_buf3[1]); w3_t[2] = swap32 (salt_buf3[2]); w3_t[3] = swap32 (salt_buf3[3]); w4_t[0] = swap32 (salt_buf4[0]); w4_t[1] = swap32 (salt_buf4[1]); w4_t[2] = swap32 (salt_buf4[2]); w4_t[3] = swap32 (salt_buf4[3]); w5_t[0] = swap32 (salt_buf5[0]); w5_t[1] = swap32 (salt_buf5[1]); w5_t[2] = swap32 (salt_buf5[2]); w5_t[3] = swap32 (salt_buf5[3]); w6_t[0] = swap32 (salt_buf6[0]); w6_t[1] = swap32 (salt_buf6[1]); w6_t[2] = swap32 (salt_buf6[2]); w6_t[3] = swap32 (salt_buf6[3]); w7_t[0] = swap32 (salt_buf7[0]); w7_t[1] = swap32 (salt_buf7[1]); w7_t[2] = swap32 (salt_buf7[2]); w7_t[3] = swap32 (salt_buf7[3]); 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]; w7_t[3] = pw_salt_len * 8; /** * loop */ u32x w0l = w0_t[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w0_t[0] = w0; /* * sha512 */ 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, w4_t, w5_t, w6_t, w7_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]); COMPARE_S_SIMD (r0, r1, r2, r3); } } __kernel void m15000_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m15000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m15000_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m15000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m15000_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m15000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m15000_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m15000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m15000_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m15000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m15000_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m15000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m15000_a3.cl000066400000000000000000000115111320027462700157760ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha512.cl" __kernel void m15000_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha512_ctx_vector_t ctx; sha512_init_vector (&ctx); sha512_update_vector (&ctx, w, pw_len); sha512_update_vector (&ctx, s, salt_len); sha512_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.h[7]); const u32x r1 = h32_from_64 (ctx.h[7]); const u32x r2 = l32_from_64 (ctx.h[3]); const u32x r3 = h32_from_64 (ctx.h[3]); COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m15000_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha512_ctx_vector_t ctx; sha512_init_vector (&ctx); sha512_update_vector (&ctx, w, pw_len); sha512_update_vector (&ctx, s, salt_len); sha512_final_vector (&ctx); const u32x r0 = l32_from_64 (ctx.h[7]); const u32x r1 = h32_from_64 (ctx.h[7]); const u32x r2 = l32_from_64 (ctx.h[3]); const u32x r3 = h32_from_64 (ctx.h[3]); COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m15100.cl000066400000000000000000000156101320027462700154200ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha1_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m15100_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf1_sha1_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha1_hmac_ctx_t sha1_hmac_ctx; sha1_hmac_init_global_swap (&sha1_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha1_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha1_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha1_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha1_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha1_hmac_ctx.ipad.h[4]; tmps[gid].opad[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha1_hmac_ctx.opad.h[4]; sha1_hmac_update_global_swap (&sha1_hmac_ctx, salt_bufs[salt_pos].salt_buf_pc, salt_bufs[salt_pos].salt_len_pc); sha1_hmac_final (&sha1_hmac_ctx); tmps[gid].out[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].out[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].out[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].out[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].out[4] = sha1_hmac_ctx.opad.h[4]; } __kernel void m15100_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf1_sha1_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); u32x out[5]; out[0] = packv (tmps, out, gid, 0); out[1] = packv (tmps, out, gid, 1); out[2] = packv (tmps, out, gid, 2); out[3] = packv (tmps, out, gid, 3); out[4] = packv (tmps, out, gid, 4); for (u32 j = 0; j < loop_cnt; j++) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[3]; w1[0] = out[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_V (w0, w1, w2, w3, ipad, opad, out); } unpackv (tmps, out, gid, 0, out[0]); unpackv (tmps, out, gid, 1, out[1]); unpackv (tmps, out, gid, 2, out[2]); unpackv (tmps, out, gid, 3, out[3]); unpackv (tmps, out, gid, 4, out[4]); } __kernel void m15100_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf1_sha1_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); const u32 r0 = tmps[gid].out[DGST_R0]; const u32 r1 = tmps[gid].out[DGST_R1]; const u32 r2 = tmps[gid].out[DGST_R2]; const u32 r3 = tmps[gid].out[DGST_R3]; #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m15300.cl000066400000000000000000001050011320027462700154140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md4.cl" #include "inc_hash_sha1.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" #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 u32a 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 u32a c_skb[8][64] = { { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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, }, { 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 BOX(i,n,S) (S)[(n)][(i)] #define BOX1(i,S) (S)[(i)] void _des_crypt_encrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 (*s_SPtrans)[64]) { u32 tt; u32 r = data[0]; u32 l = data[1]; IP (r, l, tt); r = rotl32_S (r, 3u); l = rotl32_S (l, 3u); #ifdef _unroll #pragma unroll #endif for (u32 i = 0; i < 16; i += 2) { u32 u; u32 t; u = Kc[i + 0] ^ r; t = Kd[i + 0] ^ rotl32_S (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); u = Kc[i + 1] ^ l; t = Kd[i + 1] ^ rotl32_S (l, 28u); r ^= 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); } l = rotl32_S (l, 29u); r = rotl32_S (r, 29u); FP (r, l, tt); iv[0] = l; iv[1] = r; } void _des_crypt_decrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 (*s_SPtrans)[64]) { u32 tt; u32 r = data[0]; u32 l = data[1]; IP (r, l, tt); r = rotl32_S (r, 3u); l = rotl32_S (l, 3u); #ifdef _unroll #pragma unroll #endif for (u32 i = 16; i > 0; i -= 2) { u32 u; u32 t; u = Kc[i - 1] ^ r; t = Kd[i - 1] ^ rotl32_S (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); u = Kc[i - 2] ^ l; t = Kd[i - 2] ^ rotl32_S (l, 28u); r ^= 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); } l = rotl32_S (l, 29u); r = rotl32_S (r, 29u); FP (r, l, tt); iv[0] = l; iv[1] = r; } void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 (*s_skb)[64]) { u32 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; #ifdef _unroll #pragma unroll #endif 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 u32 c00 = (c >> 0) & 0x0000003f; const u32 c06 = (c >> 6) & 0x00383003; const u32 c07 = (c >> 7) & 0x0000003c; const u32 c13 = (c >> 13) & 0x0000060f; const u32 c20 = (c >> 20) & 0x00000001; u32 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 u32 d00 = (d >> 0) & 0x00003c3f; const u32 d07 = (d >> 7) & 0x00003f03; const u32 d21 = (d >> 21) & 0x0000000f; const u32 d22 = (d >> 22) & 0x00000030; u32 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)); Kc[i] = rotl32_S (Kc[i], 2u); Kd[i] = rotl32_S (Kd[i], 2u); } } void hmac_sha1_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m15300_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global dpapimk_tmp_v1_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const dpapimk_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * main */ u32 digest_context[5]; if (esalt_bufs[digests_offset].context == 1) { /* local credentials */ sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_global_utf16le_swap (&ctx, pws[gid].i, pws[gid].pw_len); sha1_final (&ctx); digest_context[0] = ctx.h[0]; digest_context[1] = ctx.h[1]; digest_context[2] = ctx.h[2]; digest_context[3] = ctx.h[3]; digest_context[4] = ctx.h[4]; } else if (esalt_bufs[digests_offset].context == 2) { /* domain credentials */ md4_ctx_t ctx; md4_init (&ctx); md4_update_global_utf16le (&ctx, pws[gid].i, pws[gid].pw_len); md4_final (&ctx); digest_context[0] = ctx.h[0]; digest_context[1] = ctx.h[1]; digest_context[2] = ctx.h[2]; digest_context[3] = ctx.h[3]; digest_context[4] = 0; digest_context[0] = swap32_S (digest_context[0]); digest_context[1] = swap32_S (digest_context[1]); digest_context[2] = swap32_S (digest_context[2]); digest_context[3] = swap32_S (digest_context[3]); } /* initialize hmac-sha1 */ u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = digest_context[0]; w0[1] = digest_context[1]; w0[2] = digest_context[2]; w0[3] = digest_context[3]; w1[0] = digest_context[4]; 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; sha1_hmac_ctx_t ctx; sha1_hmac_init_64 (&ctx, w0, w1, w2, w3); sha1_hmac_update_global (&ctx, esalt_bufs[digests_offset].SID, esalt_bufs[digests_offset].SID_len); sha1_hmac_final (&ctx); u32 key[5]; key[0] = ctx.opad.h[0]; key[1] = ctx.opad.h[1]; key[2] = ctx.opad.h[2]; key[3] = ctx.opad.h[3]; key[4] = ctx.opad.h[4]; /* this key is used as password for pbkdf2-hmac-sha1 */ tmps[gid].userKey[0] = key[0]; tmps[gid].userKey[1] = key[1]; tmps[gid].userKey[2] = key[2]; tmps[gid].userKey[3] = key[3]; tmps[gid].userKey[4] = key[4]; w0[0] = key[0]; w0[1] = key[1]; w0[2] = key[2]; w0[3] = key[3]; w1[0] = key[4]; 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; sha1_hmac_ctx_t sha1_hmac_ctx; sha1_hmac_init_64 (&sha1_hmac_ctx, w0, w1, w2, w3); tmps[gid].ipad[0] = sha1_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha1_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha1_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha1_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha1_hmac_ctx.ipad.h[4]; tmps[gid].opad[0] = sha1_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha1_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha1_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha1_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha1_hmac_ctx.opad.h[4]; w0[0] = esalt_bufs[digests_offset].iv[0]; w0[1] = esalt_bufs[digests_offset].iv[1]; w0[2] = esalt_bufs[digests_offset].iv[2]; w0[3] = esalt_bufs[digests_offset].iv[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; sha1_hmac_update_64 (&sha1_hmac_ctx, w0, w1, w2, w3, 16); for (u32 i = 0, j = 1; i < 8; i += 5, j += 1) { sha1_hmac_ctx_t sha1_hmac_ctx2 = sha1_hmac_ctx; w0[0] = j; 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] = 0; sha1_hmac_update_64 (&sha1_hmac_ctx2, w0, w1, w2, w3, 4); sha1_hmac_final (&sha1_hmac_ctx2); tmps[gid].dgst[i + 0] = sha1_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha1_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha1_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha1_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha1_hmac_ctx2.opad.h[4]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; } } __kernel void m15300_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global dpapimk_tmp_v1_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const dpapimk_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[5]; u32x opad[5]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); for (u32 i = 0; i < 8; i += 5) { u32x dgst[5]; u32x out[5]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, i + 4); for (u32 j = 0; j < loop_cnt; j++) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; w0[0] = out[0]; w0[1] = out[1]; w0[2] = out[2]; w0[3] = out[3]; w1[0] = out[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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); } } __kernel void m15300_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global dpapimk_tmp_v1_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const dpapimk_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * des shared */ __local u32 s_SPtrans[8][64]; __local u32 s_skb[8][64]; for (u32 i = lid; i < 64; i += lsz) { s_SPtrans[0][i] = c_SPtrans[0][i]; s_SPtrans[1][i] = c_SPtrans[1][i]; s_SPtrans[2][i] = c_SPtrans[2][i]; s_SPtrans[3][i] = c_SPtrans[3][i]; s_SPtrans[4][i] = c_SPtrans[4][i]; s_SPtrans[5][i] = c_SPtrans[5][i]; s_SPtrans[6][i] = c_SPtrans[6][i]; s_SPtrans[7][i] = c_SPtrans[7][i]; s_skb[0][i] = c_skb[0][i]; s_skb[1][i] = c_skb[1][i]; s_skb[2][i] = c_skb[2][i]; s_skb[3][i] = c_skb[3][i]; s_skb[4][i] = c_skb[4][i]; s_skb[5][i] = c_skb[5][i]; s_skb[6][i] = c_skb[6][i]; s_skb[7][i] = c_skb[7][i]; } barrier (CLK_LOCAL_MEM_FENCE); if (gid >= gid_max) return; /** * main */ u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 ipad[5]; u32 opad[5]; u32 key[6]; key[0] = swap32_S (tmps[gid].out[0]); key[1] = swap32_S (tmps[gid].out[1]); key[2] = swap32_S (tmps[gid].out[2]); key[3] = swap32_S (tmps[gid].out[3]); key[4] = swap32_S (tmps[gid].out[4]); key[5] = swap32_S (tmps[gid].out[5]); u32 iv[2]; iv[0] = swap32_S (tmps[gid].out[6]); iv[1] = swap32_S (tmps[gid].out[7]); u32 decrypted[26]; /* Construct 3DES keys */ const u32 a = (key[0]); const u32 b = (key[1]); u32 Ka[16]; u32 Kb[16]; _des_crypt_keysetup (a, b, Ka, Kb, s_skb); const u32 c = (key[2]); const u32 d = (key[3]); u32 Kc[16]; u32 Kd[16]; _des_crypt_keysetup (c, d, Kc, Kd, s_skb); const u32 e = (key[4]); const u32 f = (key[5]); u32 Ke[16]; u32 Kf[16]; _des_crypt_keysetup (e, f, Ke, Kf, s_skb); u32 contents_pos; u32 contents_off; u32 wx_off; for (wx_off = 0, contents_pos = 0, contents_off = 0; contents_pos < esalt_bufs[digests_offset].contents_len; wx_off += 2, contents_pos += 8, contents_off += 2) { /* First Pass */ u32 data[2]; data[0] = swap32_S (esalt_bufs[digests_offset].contents[contents_off + 0]); data[1] = swap32_S (esalt_bufs[digests_offset].contents[contents_off + 1]); u32 p1[2]; _des_crypt_decrypt (p1, data, Ke, Kf, s_SPtrans); /* Second Pass */ u32 p2[2]; _des_crypt_encrypt (p2, p1, Kc, Kd, s_SPtrans); /* Third Pass */ u32 out[2]; _des_crypt_decrypt (out, p2, Ka, Kb, s_SPtrans); out[0] ^= iv[0]; out[1] ^= iv[1]; decrypted[wx_off + 0] = out[0]; decrypted[wx_off + 1] = out[1]; iv[0] = data[0]; iv[1] = data[1]; } u32 hmacSalt[4]; u32 expectedHmac[4]; u32 lastKey[16]; hmacSalt[0] = swap32_S (decrypted[0]); hmacSalt[1] = swap32_S (decrypted[1]); hmacSalt[2] = swap32_S (decrypted[2]); hmacSalt[3] = swap32_S (decrypted[3]); expectedHmac[0] = swap32_S (decrypted[4 + 0]); expectedHmac[1] = swap32_S (decrypted[4 + 1]); expectedHmac[2] = swap32_S (decrypted[4 + 2]); expectedHmac[3] = swap32_S (decrypted[4 + 3]); for(int i = 0; i < 16; i++) { lastKey[i] = decrypted[i + 26 - 16]; } w0[0] = tmps[gid].userKey[0]; w0[1] = tmps[gid].userKey[1]; w0[2] = tmps[gid].userKey[2]; w0[3] = tmps[gid].userKey[3]; w1[0] = tmps[gid].userKey[4]; 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; sha1_hmac_ctx_t ctx; sha1_hmac_init_64 (&ctx, w0, w1, w2, w3); w0[0] = hmacSalt[0]; w0[1] = hmacSalt[1]; w0[2] = hmacSalt[2]; w0[3] = hmacSalt[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; sha1_hmac_update_64 (&ctx, w0, w1, w2, w3, 16); sha1_hmac_final (&ctx); w0[0] = ctx.opad.h[0]; w0[1] = ctx.opad.h[1]; w0[2] = ctx.opad.h[2]; w0[3] = ctx.opad.h[3]; w1[0] = ctx.opad.h[4]; 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; sha1_hmac_init_64 (&ctx, w0, w1, w2, w3); w0[0] = swap32_S (lastKey[ 0]); w0[1] = swap32_S (lastKey[ 1]); w0[2] = swap32_S (lastKey[ 2]); w0[3] = swap32_S (lastKey[ 3]); w1[0] = swap32_S (lastKey[ 4]); w1[1] = swap32_S (lastKey[ 5]); w1[2] = swap32_S (lastKey[ 6]); w1[3] = swap32_S (lastKey[ 7]); w2[0] = swap32_S (lastKey[ 8]); w2[1] = swap32_S (lastKey[ 9]); w2[2] = swap32_S (lastKey[10]); w2[3] = swap32_S (lastKey[11]); w3[0] = swap32_S (lastKey[12]); w3[1] = swap32_S (lastKey[13]); w3[2] = swap32_S (lastKey[14]); w3[3] = swap32_S (lastKey[15]); sha1_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); sha1_hmac_final (&ctx); #define il_pos 0 if ((expectedHmac[0] == ctx.opad.h[0]) && (expectedHmac[1] == ctx.opad.h[1]) && (expectedHmac[2] == ctx.opad.h[2]) && (expectedHmac[3] == ctx.opad.h[3])) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } hashcat-4.0.1/OpenCL/m15400_a0-optimized.cl000066400000000000000000000323501320027462700200050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #define CHACHA_CONST_00 0x61707865 #define CHACHA_CONST_01 0x3320646e #define CHACHA_CONST_02 0x79622d32 #define CHACHA_CONST_03 0x6b206574 #define QR(a, b, c, d) \ do { \ x[a] = x[a] + x[b]; \ x[d] = rotl32(x[d] ^ x[a], 16); \ x[c] = x[c] + x[d]; \ x[b] = rotl32(x[b] ^ x[c], 12); \ x[a] = x[a] + x[b]; \ x[d] = rotl32(x[d] ^ x[a], 8); \ x[c] = x[c] + x[d]; \ x[b] = rotl32(x[b] ^ x[c], 7); \ } while (0); void chacha20_transform (const u32x w0[4], const u32x w1[4], const u32 position[2], const u32 offset, const u32 iv[2], const u32 plain[4], u32x digest[4]) { /** * Key expansion */ u32x ctx[16]; ctx[ 0] = CHACHA_CONST_00; ctx[ 1] = CHACHA_CONST_01; ctx[ 2] = CHACHA_CONST_02; ctx[ 3] = CHACHA_CONST_03; ctx[ 4] = w0[0]; ctx[ 5] = w0[1]; ctx[ 6] = w0[2]; ctx[ 7] = w0[3]; ctx[ 8] = w1[0]; ctx[ 9] = w1[1]; ctx[10] = w1[2]; ctx[11] = w1[3]; ctx[12] = position[0]; ctx[13] = position[1]; ctx[14] = iv[1]; ctx[15] = iv[0]; /** * Generate 64 byte keystream */ u32x x[32]; x[ 0] = ctx[ 0]; x[ 1] = ctx[ 1]; x[ 2] = ctx[ 2]; x[ 3] = ctx[ 3]; x[ 4] = ctx[ 4]; x[ 5] = ctx[ 5]; x[ 6] = ctx[ 6]; x[ 7] = ctx[ 7]; x[ 8] = ctx[ 8]; x[ 9] = ctx[ 9]; x[10] = ctx[10]; x[11] = ctx[11]; x[12] = ctx[12]; x[13] = ctx[13]; x[14] = ctx[14]; x[15] = ctx[15]; #pragma unroll for (u8 i = 0; i < 10; i++) { /* Column round */ QR(0, 4, 8, 12); QR(1, 5, 9, 13); QR(2, 6, 10, 14); QR(3, 7, 11, 15); /* Diagonal round */ QR(0, 5, 10, 15); QR(1, 6, 11, 12); QR(2, 7, 8, 13); QR(3, 4, 9, 14); } x[ 0] += ctx[ 0]; x[ 1] += ctx[ 1]; x[ 2] += ctx[ 2]; x[ 3] += ctx[ 3]; x[ 4] += ctx[ 4]; x[ 5] += ctx[ 5]; x[ 6] += ctx[ 6]; x[ 7] += ctx[ 7]; x[ 8] += ctx[ 8]; x[ 9] += ctx[ 9]; x[10] += ctx[10]; x[11] += ctx[11]; x[12] += ctx[12]; x[13] += ctx[13]; x[14] += ctx[14]; x[15] += ctx[15]; if (offset > 56) { /** * Generate a second 64 byte keystream */ ctx[12]++; if (all(ctx[12] == 0)) ctx[13]++; x[16] = ctx[ 0]; x[17] = ctx[ 1]; x[18] = ctx[ 2]; x[19] = ctx[ 3]; x[20] = ctx[ 4]; x[21] = ctx[ 5]; x[22] = ctx[ 6]; x[23] = ctx[ 7]; x[24] = ctx[ 8]; x[25] = ctx[ 9]; x[26] = ctx[10]; x[27] = ctx[11]; x[28] = ctx[12]; x[29] = ctx[13]; x[30] = ctx[14]; x[31] = ctx[15]; #pragma unroll for (u8 i = 0; i < 10; i++) { /* Column round */ QR(16, 20, 24, 28); QR(17, 21, 25, 29); QR(18, 22, 26, 30); QR(19, 23, 27, 31); /* Diagonal round */ QR(16, 21, 26, 31); QR(17, 22, 27, 28); QR(18, 23, 24, 29); QR(19, 20, 25, 30); } x[16] += ctx[ 0]; x[17] += ctx[ 1]; x[18] += ctx[ 2]; x[19] += ctx[ 3]; x[20] += ctx[ 4]; x[21] += ctx[ 5]; x[22] += ctx[ 6]; x[23] += ctx[ 7]; x[24] += ctx[ 8]; x[25] += ctx[ 9]; x[26] += ctx[10]; x[27] += ctx[11]; x[28] += ctx[12]; x[29] += ctx[13]; x[30] += ctx[14]; x[31] += ctx[15]; } /** * Encrypt plaintext with keystream */ const u32 index = offset / 4; const u32 remain = offset % 4; digest[0] = plain[1]; digest[1] = plain[0]; if (remain > 0) { digest[1] ^= x[index + 0] >> ( 0 + remain * 8); digest[1] ^= x[index + 1] << (32 - remain * 8); digest[0] ^= x[index + 1] >> ( 0 + remain * 8); digest[0] ^= x[index + 2] << (32 - remain * 8); } else { digest[1] ^= x[index + 0]; digest[0] ^= x[index + 1]; } } __kernel void m15400_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 prep */ u32 iv[2] = { 0 }; u32 plain[2] = { 0 }; u32 position[2] = { 0 }; u32 offset = 0; position[0] = esalt_bufs[digests_offset].position[0]; position[1] = esalt_bufs[digests_offset].position[1]; offset = esalt_bufs[digests_offset].offset; iv[0] = esalt_bufs[digests_offset].iv[0]; iv[1] = esalt_bufs[digests_offset].iv[1]; plain[0] = esalt_bufs[digests_offset].plain[0]; plain[1] = esalt_bufs[digests_offset].plain[1]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; const u32x out_len = apply_rules_vect(pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); u32x digest[4] = { 0 }; chacha20_transform (w0, w1, position, offset, iv, plain, digest); const u32x r0 = digest[0]; const u32x r1 = digest[1]; const u32x r2 = digest[2]; const u32x r3 = digest[3]; COMPARE_M_SIMD(r0, r1, r2, r3); } } __kernel void m15400_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15400_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15400_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 prep */ u32 iv[2] = { 0 }; u32 plain[2] = { 0 }; u32 position[2] = { 0 }; u32 offset = 0; position[0] = esalt_bufs[digests_offset].position[0]; position[1] = esalt_bufs[digests_offset].position[1]; offset = esalt_bufs[digests_offset].offset; iv[0] = esalt_bufs[digests_offset].iv[0]; iv[1] = esalt_bufs[digests_offset].iv[1]; plain[0] = esalt_bufs[digests_offset].plain[0]; plain[1] = esalt_bufs[digests_offset].plain[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; const u32x out_len = apply_rules_vect(pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); u32x digest[4] = { 0 }; chacha20_transform (w0, w1, position, offset, iv, plain, digest); const u32x r0 = digest[0]; const u32x r1 = digest[1]; const u32x r2 = digest[2]; const u32x r3 = digest[3]; COMPARE_S_SIMD(r0, r1, r2, r3); } } __kernel void m15400_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15400_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m15400_a1-optimized.cl000066400000000000000000000401531320027462700200060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" #define CHACHA_CONST_00 0x61707865 #define CHACHA_CONST_01 0x3320646e #define CHACHA_CONST_02 0x79622d32 #define CHACHA_CONST_03 0x6b206574 #define QR(a, b, c, d) \ do { \ x[a] = x[a] + x[b]; \ x[d] = rotl32(x[d] ^ x[a], 16); \ x[c] = x[c] + x[d]; \ x[b] = rotl32(x[b] ^ x[c], 12); \ x[a] = x[a] + x[b]; \ x[d] = rotl32(x[d] ^ x[a], 8); \ x[c] = x[c] + x[d]; \ x[b] = rotl32(x[b] ^ x[c], 7); \ } while (0); void chacha20_transform (const u32x w0[4], const u32x w1[4], const u32 position[2], const u32 offset, const u32 iv[2], const u32 plain[4], u32x digest[4]) { /** * Key expansion */ u32x ctx[16]; ctx[ 0] = CHACHA_CONST_00; ctx[ 1] = CHACHA_CONST_01; ctx[ 2] = CHACHA_CONST_02; ctx[ 3] = CHACHA_CONST_03; ctx[ 4] = w0[0]; ctx[ 5] = w0[1]; ctx[ 6] = w0[2]; ctx[ 7] = w0[3]; ctx[ 8] = w1[0]; ctx[ 9] = w1[1]; ctx[10] = w1[2]; ctx[11] = w1[3]; ctx[12] = position[0]; ctx[13] = position[1]; ctx[14] = iv[1]; ctx[15] = iv[0]; /** * Generate 64 byte keystream */ u32x x[32]; x[ 0] = ctx[ 0]; x[ 1] = ctx[ 1]; x[ 2] = ctx[ 2]; x[ 3] = ctx[ 3]; x[ 4] = ctx[ 4]; x[ 5] = ctx[ 5]; x[ 6] = ctx[ 6]; x[ 7] = ctx[ 7]; x[ 8] = ctx[ 8]; x[ 9] = ctx[ 9]; x[10] = ctx[10]; x[11] = ctx[11]; x[12] = ctx[12]; x[13] = ctx[13]; x[14] = ctx[14]; x[15] = ctx[15]; #pragma unroll for (u8 i = 0; i < 10; i++) { /* Column round */ QR(0, 4, 8, 12); QR(1, 5, 9, 13); QR(2, 6, 10, 14); QR(3, 7, 11, 15); /* Diagonal round */ QR(0, 5, 10, 15); QR(1, 6, 11, 12); QR(2, 7, 8, 13); QR(3, 4, 9, 14); } x[ 0] += ctx[ 0]; x[ 1] += ctx[ 1]; x[ 2] += ctx[ 2]; x[ 3] += ctx[ 3]; x[ 4] += ctx[ 4]; x[ 5] += ctx[ 5]; x[ 6] += ctx[ 6]; x[ 7] += ctx[ 7]; x[ 8] += ctx[ 8]; x[ 9] += ctx[ 9]; x[10] += ctx[10]; x[11] += ctx[11]; x[12] += ctx[12]; x[13] += ctx[13]; x[14] += ctx[14]; x[15] += ctx[15]; if (offset > 56) { /** * Generate a second 64 byte keystream */ ctx[12]++; if (all(ctx[12] == 0)) ctx[13]++; x[16] = ctx[ 0]; x[17] = ctx[ 1]; x[18] = ctx[ 2]; x[19] = ctx[ 3]; x[20] = ctx[ 4]; x[21] = ctx[ 5]; x[22] = ctx[ 6]; x[23] = ctx[ 7]; x[24] = ctx[ 8]; x[25] = ctx[ 9]; x[26] = ctx[10]; x[27] = ctx[11]; x[28] = ctx[12]; x[29] = ctx[13]; x[30] = ctx[14]; x[31] = ctx[15]; #pragma unroll for (u8 i = 0; i < 10; i++) { /* Column round */ QR(16, 20, 24, 28); QR(17, 21, 25, 29); QR(18, 22, 26, 30); QR(19, 23, 27, 31); /* Diagonal round */ QR(16, 21, 26, 31); QR(17, 22, 27, 28); QR(18, 23, 24, 29); QR(19, 20, 25, 30); } x[16] += ctx[ 0]; x[17] += ctx[ 1]; x[18] += ctx[ 2]; x[19] += ctx[ 3]; x[20] += ctx[ 4]; x[21] += ctx[ 5]; x[22] += ctx[ 6]; x[23] += ctx[ 7]; x[24] += ctx[ 8]; x[25] += ctx[ 9]; x[26] += ctx[10]; x[27] += ctx[11]; x[28] += ctx[12]; x[29] += ctx[13]; x[30] += ctx[14]; x[31] += ctx[15]; } /** * Encrypt plaintext with keystream */ const u32 index = offset / 4; const u32 remain = offset % 4; digest[0] = plain[1]; digest[1] = plain[0]; if (remain > 0) { digest[1] ^= x[index + 0] >> ( 0 + remain * 8); digest[1] ^= x[index + 1] << (32 - remain * 8); digest[0] ^= x[index + 1] >> ( 0 + remain * 8); digest[0] ^= x[index + 2] << (32 - remain * 8); } else { digest[1] ^= x[index + 0]; digest[0] ^= x[index + 1]; } } __kernel void m15400_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * Salt prep */ u32 iv[2] = { 0 }; u32 plain[2] = { 0 }; u32 position[2] = { 0 }; u32 offset = 0; position[0] = esalt_bufs[digests_offset].position[0]; position[1] = esalt_bufs[digests_offset].position[1]; offset = esalt_bufs[digests_offset].offset; iv[0] = esalt_bufs[digests_offset].iv[0]; iv[1] = esalt_bufs[digests_offset].iv[1]; plain[0] = esalt_bufs[digests_offset].plain[0]; plain[1] = esalt_bufs[digests_offset].plain[1]; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x out_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32x w0[4]; u32x w1[4]; 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]; u32x digest[4] = { 0 }; chacha20_transform (w0, w1, position, offset, iv, plain, digest); const u32x r0 = digest[0]; const u32x r1 = digest[1]; const u32x r2 = digest[2]; const u32x r3 = digest[3]; COMPARE_M_SIMD(r0, r1, r2, r3); } } __kernel void m15400_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15400_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15400_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_len = pws[gid].pw_len; /** * Salt prep */ u32 iv[2] = { 0 }; u32 plain[2] = { 0 }; u32 position[2] = { 0 }; u32 offset = 0; position[0] = esalt_bufs[digests_offset].position[0]; position[1] = esalt_bufs[digests_offset].position[1]; offset = esalt_bufs[digests_offset].offset; iv[0] = esalt_bufs[digests_offset].iv[0]; iv[1] = esalt_bufs[digests_offset].iv[1]; plain[0] = esalt_bufs[digests_offset].plain[0]; plain[1] = esalt_bufs[digests_offset].plain[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 */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x out_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); } u32x w0[4]; u32x w1[4]; 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]; u32x digest[4] = { 0 }; chacha20_transform (w0, w1, position, offset, iv, plain, digest); const u32x r0 = digest[0]; const u32x r1 = digest[1]; const u32x r2 = digest[2]; const u32x r3 = digest[3]; COMPARE_S_SIMD(r0, r1, r2, r3); } } __kernel void m15400_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15400_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m15400_a3-optimized.cl000066400000000000000000000326071320027462700200150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #define CHACHA_CONST_00 0x61707865 #define CHACHA_CONST_01 0x3320646e #define CHACHA_CONST_02 0x79622d32 #define CHACHA_CONST_03 0x6b206574 #define QR(a, b, c, d) \ do { \ x[a] = x[a] + x[b]; \ x[d] = rotl32(x[d] ^ x[a], 16); \ x[c] = x[c] + x[d]; \ x[b] = rotl32(x[b] ^ x[c], 12); \ x[a] = x[a] + x[b]; \ x[d] = rotl32(x[d] ^ x[a], 8); \ x[c] = x[c] + x[d]; \ x[b] = rotl32(x[b] ^ x[c], 7); \ } while (0); void chacha20_transform (const u32x w0[4], const u32x w1[4], const u32 position[2], const u32 offset, const u32 iv[2], const u32 plain[4], u32x digest[4]) { /** * Key expansion */ u32x ctx[16]; ctx[ 0] = CHACHA_CONST_00; ctx[ 1] = CHACHA_CONST_01; ctx[ 2] = CHACHA_CONST_02; ctx[ 3] = CHACHA_CONST_03; ctx[ 4] = w0[0]; ctx[ 5] = w0[1]; ctx[ 6] = w0[2]; ctx[ 7] = w0[3]; ctx[ 8] = w1[0]; ctx[ 9] = w1[1]; ctx[10] = w1[2]; ctx[11] = w1[3]; ctx[12] = position[0]; ctx[13] = position[1]; ctx[14] = iv[1]; ctx[15] = iv[0]; /** * Generate 64 byte keystream */ u32x x[32]; x[ 0] = ctx[ 0]; x[ 1] = ctx[ 1]; x[ 2] = ctx[ 2]; x[ 3] = ctx[ 3]; x[ 4] = ctx[ 4]; x[ 5] = ctx[ 5]; x[ 6] = ctx[ 6]; x[ 7] = ctx[ 7]; x[ 8] = ctx[ 8]; x[ 9] = ctx[ 9]; x[10] = ctx[10]; x[11] = ctx[11]; x[12] = ctx[12]; x[13] = ctx[13]; x[14] = ctx[14]; x[15] = ctx[15]; #pragma unroll for (u8 i = 0; i < 10; i++) { /* Column round */ QR(0, 4, 8, 12); QR(1, 5, 9, 13); QR(2, 6, 10, 14); QR(3, 7, 11, 15); /* Diagonal round */ QR(0, 5, 10, 15); QR(1, 6, 11, 12); QR(2, 7, 8, 13); QR(3, 4, 9, 14); } x[ 0] += ctx[ 0]; x[ 1] += ctx[ 1]; x[ 2] += ctx[ 2]; x[ 3] += ctx[ 3]; x[ 4] += ctx[ 4]; x[ 5] += ctx[ 5]; x[ 6] += ctx[ 6]; x[ 7] += ctx[ 7]; x[ 8] += ctx[ 8]; x[ 9] += ctx[ 9]; x[10] += ctx[10]; x[11] += ctx[11]; x[12] += ctx[12]; x[13] += ctx[13]; x[14] += ctx[14]; x[15] += ctx[15]; if (offset > 56) { /** * Generate a second 64 byte keystream */ ctx[12]++; if (all(ctx[12] == 0)) ctx[13]++; x[16] = ctx[ 0]; x[17] = ctx[ 1]; x[18] = ctx[ 2]; x[19] = ctx[ 3]; x[20] = ctx[ 4]; x[21] = ctx[ 5]; x[22] = ctx[ 6]; x[23] = ctx[ 7]; x[24] = ctx[ 8]; x[25] = ctx[ 9]; x[26] = ctx[10]; x[27] = ctx[11]; x[28] = ctx[12]; x[29] = ctx[13]; x[30] = ctx[14]; x[31] = ctx[15]; #pragma unroll for (u8 i = 0; i < 10; i++) { /* Column round */ QR(16, 20, 24, 28); QR(17, 21, 25, 29); QR(18, 22, 26, 30); QR(19, 23, 27, 31); /* Diagonal round */ QR(16, 21, 26, 31); QR(17, 22, 27, 28); QR(18, 23, 24, 29); QR(19, 20, 25, 30); } x[16] += ctx[ 0]; x[17] += ctx[ 1]; x[18] += ctx[ 2]; x[19] += ctx[ 3]; x[20] += ctx[ 4]; x[21] += ctx[ 5]; x[22] += ctx[ 6]; x[23] += ctx[ 7]; x[24] += ctx[ 8]; x[25] += ctx[ 9]; x[26] += ctx[10]; x[27] += ctx[11]; x[28] += ctx[12]; x[29] += ctx[13]; x[30] += ctx[14]; x[31] += ctx[15]; } /** * Encrypt plaintext with keystream */ const u32 index = offset / 4; const u32 remain = offset % 4; digest[0] = plain[1]; digest[1] = plain[0]; if (remain > 0) { digest[1] ^= x[index + 0] >> ( 0 + remain * 8); digest[1] ^= x[index + 1] << (32 - remain * 8); digest[0] ^= x[index + 1] >> ( 0 + remain * 8); digest[0] ^= x[index + 2] << (32 - remain * 8); } else { digest[1] ^= x[index + 0]; digest[0] ^= x[index + 1]; } } __kernel void m15400_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); u32 w0[4]; u32 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]; u32x out_len = pws[gid].pw_len; /** * Salt prep */ u32 iv[2] = { 0 }; u32 plain[2] = { 0 }; u32 position[2] = { 0 }; u32 offset = 0; position[0] = esalt_bufs[digests_offset].position[0]; position[1] = esalt_bufs[digests_offset].position[1]; offset = esalt_bufs[digests_offset].offset; iv[0] = esalt_bufs[digests_offset].iv[0]; iv[1] = esalt_bufs[digests_offset].iv[1]; plain[0] = esalt_bufs[digests_offset].plain[0]; plain[1] = esalt_bufs[digests_offset].plain[1]; /** * loop */ u32 w0l = pws[gid].i[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0x = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; w0_t[0] = w0x; 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]; u32x digest[4] = { 0 }; chacha20_transform (w0_t, w1_t, position, offset, iv, plain, digest); const u32x r0 = digest[0]; const u32x r1 = digest[1]; const u32x r2 = digest[2]; const u32x r3 = digest[3]; COMPARE_M_SIMD(r0, r1, r2, r3); } } __kernel void m15400_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15400_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15400_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); u32 w0[4]; u32 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]; u32 out_len = pws[gid].pw_len; /** * Salt prep */ u32 iv[2] = { 0 }; u32 plain[2] = { 0 }; u32 position[2] = { 0 }; u32 offset = 0; position[0] = esalt_bufs[digests_offset].position[0]; position[1] = esalt_bufs[digests_offset].position[1]; offset = esalt_bufs[digests_offset].offset; iv[0] = esalt_bufs[digests_offset].iv[0]; iv[1] = esalt_bufs[digests_offset].iv[1]; plain[0] = esalt_bufs[digests_offset].plain[0]; plain[1] = esalt_bufs[digests_offset].plain[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 */ u32 w0l = pws[gid].i[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0x = w0l | w0r; u32x w0_t[4]; u32x w1_t[4]; w0_t[0] = w0x; 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]; u32x digest[4] = { 0 }; chacha20_transform (w0_t, w1_t, position, offset, iv, plain, digest); const u32x r0 = digest[0]; const u32x r1 = digest[1]; const u32x r2 = digest[2]; const u32x r3 = digest[3]; COMPARE_S_SIMD(r0, r1, r2, r3); } } __kernel void m15400_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15400_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const chacha20_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m15500_a0-optimized.cl000066400000000000000000000640741320027462700200160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp_optimized.h" #include "inc_rp_optimized.cl" #include "inc_simd.cl" __kernel void m15500_m04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 = 20; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16be (w1, w2, w3); make_utf16be (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf[0]; s0[1] = salt_buf[1]; s0[2] = salt_buf[2]; s0[3] = salt_buf[3]; s1[0] = salt_buf[4]; s1[1] = 0x80; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len2); const u32x pw_salt_len = out_len2 + 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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); a += SHA1M_A; b += SHA1M_B; c += SHA1M_C; d += SHA1M_D; e += SHA1M_E; a &= 0xff000000; b &= 0x0000ffff; c &= 0xffffffff; d &= 0xffffffff; e &= 0xffffffff; COMPARE_M_SIMD (d, e, c, b); } } __kernel void m15500_m08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15500_m16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15500_s04 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].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 = 20; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_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 < il_cnt; il_pos += VECT_SIZE) { u32x w0[4] = { 0 }; u32x w1[4] = { 0 }; u32x w2[4] = { 0 }; u32x w3[4] = { 0 }; const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); make_utf16be (w1, w2, w3); make_utf16be (w0, w0, w1); const u32x out_len2 = out_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf[0]; s0[1] = salt_buf[1]; s0[2] = salt_buf[2]; s0[3] = salt_buf[3]; s1[0] = salt_buf[4]; s1[1] = 0x80; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len2); const u32x pw_salt_len = out_len2 + 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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); a += SHA1M_A; b += SHA1M_B; c += SHA1M_C; d += SHA1M_D; e += SHA1M_E; a &= 0xff000000; b &= 0x0000ffff; c &= 0xffffffff; d &= 0xffffffff; e &= 0xffffffff; COMPARE_S_SIMD (d, e, c, b); } } __kernel void m15500_s08 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15500_s16 (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m15500_a0.cl000066400000000000000000000113001320027462700157740ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_rp.h" #include "inc_rp.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m15500_mxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_utf16be_swap (&ctx, tmp.i, tmp.pw_len); sha1_update (&ctx, s, salt_len); sha1_final (&ctx); ctx.h[0] &= 0xff000000; ctx.h[1] &= 0x0000ffff; ctx.h[2] &= 0xffffffff; ctx.h[3] &= 0xffffffff; ctx.h[4] &= 0xffffffff; const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m15500_sxx (__global pw_t *pws, __constant const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ COPY_PW (pws[gid]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { pw_t tmp = PASTE_PW; tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_utf16be_swap (&ctx, tmp.i, tmp.pw_len); sha1_update (&ctx, s, salt_len); sha1_final (&ctx); ctx.h[0] &= 0xff000000; ctx.h[1] &= 0x0000ffff; ctx.h[2] &= 0xffffffff; ctx.h[3] &= 0xffffffff; ctx.h[4] &= 0xffffffff; const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m15500_a1-optimized.cl000066400000000000000000000726031320027462700200140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" __kernel void m15500_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 = 20; /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16be (w1, w2, w3); make_utf16be (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf[0]; s0[1] = salt_buf[1]; s0[2] = salt_buf[2]; s0[3] = salt_buf[3]; s1[0] = salt_buf[4]; s1[1] = 0x80; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len2); const u32x pw_salt_len = pw_len2 + 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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); a += SHA1M_A; b += SHA1M_B; c += SHA1M_C; d += SHA1M_D; e += SHA1M_E; a &= 0xff000000; b &= 0x0000ffff; c &= 0xffffffff; d &= 0xffffffff; e &= 0xffffffff; COMPARE_M_SIMD (d, e, c, b); } } __kernel void m15500_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15500_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15500_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf0[4]; u32 pw_buf1[4]; pw_buf0[0] = pws[gid].i[0]; pw_buf0[1] = pws[gid].i[1]; pw_buf0[2] = pws[gid].i[2]; pw_buf0[3] = pws[gid].i[3]; pw_buf1[0] = pws[gid].i[4]; pw_buf1[1] = pws[gid].i[5]; pw_buf1[2] = pws[gid].i[6]; pw_buf1[3] = pws[gid].i[7]; const u32 pw_l_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 = 20; /** * digest */ const u32 search[4] = { digests_buf[digests_offset].digest_buf[DGST_R0], digests_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 < il_cnt; il_pos += VECT_SIZE) { const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos); const u32x pw_len = pw_l_len + pw_r_len; /** * concat password candidate */ u32x wordl0[4] = { 0 }; u32x wordl1[4] = { 0 }; u32x wordl2[4] = { 0 }; u32x wordl3[4] = { 0 }; wordl0[0] = pw_buf0[0]; wordl0[1] = pw_buf0[1]; wordl0[2] = pw_buf0[2]; wordl0[3] = pw_buf0[3]; wordl1[0] = pw_buf1[0]; wordl1[1] = pw_buf1[1]; wordl1[2] = pw_buf1[2]; wordl1[3] = pw_buf1[3]; u32x wordr0[4] = { 0 }; u32x wordr1[4] = { 0 }; u32x wordr2[4] = { 0 }; u32x wordr3[4] = { 0 }; wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); } else { switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_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]; make_utf16be (w1, w2, w3); make_utf16be (w0, w0, w1); const u32x pw_len2 = pw_len * 2; /** * append salt */ u32x s0[4]; u32x s1[4]; u32x s2[4]; u32x s3[4]; s0[0] = salt_buf[0]; s0[1] = salt_buf[1]; s0[2] = salt_buf[2]; s0[3] = salt_buf[3]; s1[0] = salt_buf[4]; s1[1] = 0x80; s1[2] = 0; s1[3] = 0; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; s3[0] = 0; s3[1] = 0; s3[2] = 0; s3[3] = 0; switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len2); const u32x pw_salt_len = pw_len2 + 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]; /** * sha1 */ u32x w0_t = swap32 (w0[0]); u32x w1_t = swap32 (w0[1]); u32x w2_t = swap32 (w0[2]); u32x w3_t = swap32 (w0[3]); u32x w4_t = swap32 (w1[0]); u32x w5_t = swap32 (w1[1]); u32x w6_t = swap32 (w1[2]); u32x w7_t = swap32 (w1[3]); u32x w8_t = swap32 (w2[0]); u32x w9_t = swap32 (w2[1]); u32x wa_t = swap32 (w2[2]); u32x wb_t = swap32 (w2[3]); u32x wc_t = swap32 (w3[0]); u32x wd_t = swap32 (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); a += SHA1M_A; b += SHA1M_B; c += SHA1M_C; d += SHA1M_D; e += SHA1M_E; a &= 0xff000000; b &= 0x0000ffff; c &= 0xffffffff; d &= 0xffffffff; e &= 0xffffffff; COMPARE_S_SIMD (d, e, c, b); } } __kernel void m15500_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } __kernel void m15500_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { } hashcat-4.0.1/OpenCL/m15500_a1.cl000066400000000000000000000112471320027462700160070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ //#define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_scalar.cl" #include "inc_hash_sha1.cl" __kernel void m15500_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_utf16be_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_utf16be_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_update (&ctx, s, salt_len); sha1_final (&ctx); ctx.h[0] &= 0xff000000; ctx.h[1] &= 0x0000ffff; ctx.h[2] &= 0xffffffff; ctx.h[3] &= 0xffffffff; ctx.h[4] &= 0xffffffff; const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } } __kernel void m15500_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } sha1_ctx_t ctx0; sha1_init (&ctx0); sha1_update_global_utf16be_swap (&ctx0, pws[gid].i, pws[gid].pw_len); /** * loop */ for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { sha1_ctx_t ctx = ctx0; sha1_update_global_utf16be_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); sha1_update (&ctx, s, salt_len); sha1_final (&ctx); ctx.h[0] &= 0xff000000; ctx.h[1] &= 0x0000ffff; ctx.h[2] &= 0xffffffff; ctx.h[3] &= 0xffffffff; ctx.h[4] &= 0xffffffff; const u32 r0 = ctx.h[DGST_R0]; const u32 r1 = ctx.h[DGST_R1]; const u32 r2 = ctx.h[DGST_R2]; const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m15500_a3-optimized.cl000066400000000000000000001151571320027462700200200ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" void m15500m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * salt */ u32 salt_buf0[4]; u32 salt_buf1[4]; u32 salt_buf2[4]; u32 salt_buf3[4]; salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; salt_buf0[1] = salt_bufs[salt_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] = 0x80; salt_buf1[2] = 0; salt_buf1[3] = 0; salt_buf2[0] = 0; salt_buf2[1] = 0; salt_buf2[2] = 0; salt_buf2[3] = 0; salt_buf3[0] = 0; salt_buf3[1] = 0; salt_buf3[2] = 0; salt_buf3[3] = 0; switch_buffer_by_offset_le_S (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); w[ 0] |= swap32_S (salt_buf0[0]); w[ 1] |= swap32_S (salt_buf0[1]); w[ 2] |= swap32_S (salt_buf0[2]); w[ 3] |= swap32_S (salt_buf0[3]); w[ 4] |= swap32_S (salt_buf1[0]); w[ 5] |= swap32_S (salt_buf1[1]); w[ 6] |= swap32_S (salt_buf1[2]); w[ 7] |= swap32_S (salt_buf1[3]); w[ 8] |= swap32_S (salt_buf2[0]); w[ 9] |= swap32_S (salt_buf2[1]); w[10] |= swap32_S (salt_buf2[2]); w[11] |= swap32_S (salt_buf2[3]); w[12] |= swap32_S (salt_buf3[0]); w[13] |= swap32_S (salt_buf3[1]); w[14] |= swap32_S (salt_buf3[2]); w[15] |= swap32_S (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_S ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); const u32 c_17s = rotl32_S ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); const u32 c_18s = rotl32_S ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); const u32 c_19s = rotl32_S ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); const u32 c_20s = rotl32_S ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); const u32 c_21s = rotl32_S ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); const u32 c_22s = rotl32_S ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); const u32 c_23s = rotl32_S ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); const u32 c_24s = rotl32_S ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); const u32 c_25s = rotl32_S ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); const u32 c_26s = rotl32_S ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); const u32 c_27s = rotl32_S ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); const u32 c_28s = rotl32_S ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); const u32 c_29s = rotl32_S ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); const u32 c_30s = rotl32_S ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); const u32 c_31s = rotl32_S ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); const u32 c_32s = rotl32_S ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); const u32 c_33s = rotl32_S ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); const u32 c_34s = rotl32_S ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); const u32 c_35s = rotl32_S ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); const u32 c_36s = rotl32_S ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); const u32 c_37s = rotl32_S ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); const u32 c_38s = rotl32_S ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); const u32 c_39s = rotl32_S ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); const u32 c_40s = rotl32_S ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); const u32 c_41s = rotl32_S ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); const u32 c_42s = rotl32_S ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); const u32 c_43s = rotl32_S ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); const u32 c_44s = rotl32_S ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); const u32 c_45s = rotl32_S ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); const u32 c_46s = rotl32_S ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); const u32 c_47s = rotl32_S ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); const u32 c_48s = rotl32_S ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); const u32 c_49s = rotl32_S ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); const u32 c_50s = rotl32_S ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); const u32 c_51s = rotl32_S ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); const u32 c_52s = rotl32_S ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); const u32 c_53s = rotl32_S ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); const u32 c_54s = rotl32_S ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); const u32 c_55s = rotl32_S ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); const u32 c_56s = rotl32_S ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); const u32 c_57s = rotl32_S ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); const u32 c_58s = rotl32_S ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); const u32 c_59s = rotl32_S ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); const u32 c_60s = rotl32_S ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); const u32 c_61s = rotl32_S ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); const u32 c_62s = rotl32_S ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); const u32 c_63s = rotl32_S ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); const u32 c_64s = rotl32_S ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); const u32 c_65s = rotl32_S ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); const u32 c_66s = rotl32_S ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); const u32 c_67s = rotl32_S ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); const u32 c_68s = rotl32_S ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); const u32 c_69s = rotl32_S ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); const u32 c_70s = rotl32_S ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); const u32 c_71s = rotl32_S ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); const u32 c_72s = rotl32_S ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); const u32 c_73s = rotl32_S ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); const u32 c_74s = rotl32_S ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); const u32 c_75s = rotl32_S ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); const u32 c_76s = rotl32_S ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); const u32 c_77s = rotl32_S ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); const u32 c_78s = rotl32_S ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); const u32 c_79s = rotl32_S ((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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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)); a += SHA1M_A; b += SHA1M_B; c += SHA1M_C; d += SHA1M_D; e += SHA1M_E; a &= 0xff000000; b &= 0x0000ffff; c &= 0xffffffff; d &= 0xffffffff; e &= 0xffffffff; COMPARE_M_SIMD (d, e, c, b); } } void m15500s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset) { /** * modifier */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); /** * base */ const u32 c_16s = rotl32_S ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); const u32 c_17s = rotl32_S ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); const u32 c_18s = rotl32_S ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); const u32 c_19s = rotl32_S ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); const u32 c_20s = rotl32_S ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); const u32 c_21s = rotl32_S ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); const u32 c_22s = rotl32_S ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); const u32 c_23s = rotl32_S ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); const u32 c_24s = rotl32_S ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); const u32 c_25s = rotl32_S ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); const u32 c_26s = rotl32_S ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); const u32 c_27s = rotl32_S ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); const u32 c_28s = rotl32_S ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); const u32 c_29s = rotl32_S ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); const u32 c_30s = rotl32_S ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); const u32 c_31s = rotl32_S ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); const u32 c_32s = rotl32_S ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); const u32 c_33s = rotl32_S ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); const u32 c_34s = rotl32_S ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); const u32 c_35s = rotl32_S ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); const u32 c_36s = rotl32_S ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); const u32 c_37s = rotl32_S ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); const u32 c_38s = rotl32_S ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); const u32 c_39s = rotl32_S ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); const u32 c_40s = rotl32_S ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); const u32 c_41s = rotl32_S ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); const u32 c_42s = rotl32_S ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); const u32 c_43s = rotl32_S ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); const u32 c_44s = rotl32_S ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); const u32 c_45s = rotl32_S ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); const u32 c_46s = rotl32_S ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); const u32 c_47s = rotl32_S ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); const u32 c_48s = rotl32_S ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); const u32 c_49s = rotl32_S ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); const u32 c_50s = rotl32_S ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); const u32 c_51s = rotl32_S ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); const u32 c_52s = rotl32_S ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); const u32 c_53s = rotl32_S ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); const u32 c_54s = rotl32_S ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); const u32 c_55s = rotl32_S ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); const u32 c_56s = rotl32_S ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); const u32 c_57s = rotl32_S ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); const u32 c_58s = rotl32_S ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); const u32 c_59s = rotl32_S ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); const u32 c_60s = rotl32_S ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); const u32 c_61s = rotl32_S ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); const u32 c_62s = rotl32_S ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); const u32 c_63s = rotl32_S ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); const u32 c_64s = rotl32_S ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); const u32 c_65s = rotl32_S ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); const u32 c_66s = rotl32_S ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); const u32 c_67s = rotl32_S ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); const u32 c_68s = rotl32_S ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); const u32 c_69s = rotl32_S ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); const u32 c_70s = rotl32_S ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); const u32 c_71s = rotl32_S ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); const u32 c_72s = rotl32_S ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); const u32 c_73s = rotl32_S ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); const u32 c_74s = rotl32_S ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); const u32 c_75s = rotl32_S ((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 */ u32 w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; 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 u32x c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); const u32x c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); const u32x c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); const u32x 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; a &= 0xff000000; b &= 0x0000ffff; c &= 0xffffffff; d &= 0xffffffff; e &= 0xffffffff; COMPARE_S_SIMD (d, e, c, b); } } __kernel void m15500_m04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m15500m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m15500_m08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m15500m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m15500_m16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m15500m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m15500_s04 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m15500s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m15500_s08 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m15500s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } __kernel void m15500_s16 (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 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 */ m15500s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset); } hashcat-4.0.1/OpenCL/m15500_a3.cl000066400000000000000000000120371320027462700160070ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha1.cl" __kernel void m15500_mxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); sha1_update_vector_utf16leN (&ctx, w, pw_len); sha1_update_vector (&ctx, s, salt_len); sha1_final_vector (&ctx); ctx.h[0] &= 0xff000000; ctx.h[1] &= 0x0000ffff; ctx.h[2] &= 0xffffffff; ctx.h[3] &= 0xffffffff; ctx.h[4] &= 0xffffffff; const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_M_SIMD (r0, r1, r2, r3); } } __kernel void m15500_sxx (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __constant const u32x *words_buf_r, __global void *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * modifier */ const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); 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] }; /** * base */ const u32 pw_len = pws[gid].pw_len; u32x w[64] = { 0 }; for (int i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { w[idx] = pws[gid].i[idx]; } const u32 salt_len = salt_bufs[salt_pos].salt_len; u32x s[64] = { 0 }; for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) { s[idx] = swap32_S (salt_bufs[salt_pos].salt_buf[idx]); } /** * loop */ u32x w0l = w[0]; for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) { const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; const u32x w0 = w0l | w0r; w[0] = w0; sha1_ctx_vector_t ctx; sha1_init_vector (&ctx); sha1_update_vector_utf16leN (&ctx, w, pw_len); sha1_update_vector (&ctx, s, salt_len); sha1_final_vector (&ctx); ctx.h[0] &= 0xff000000; ctx.h[1] &= 0x0000ffff; ctx.h[2] &= 0xffffffff; ctx.h[3] &= 0xffffffff; ctx.h[4] &= 0xffffffff; const u32x r0 = ctx.h[DGST_R0]; const u32x r1 = ctx.h[DGST_R1]; const u32x r2 = ctx.h[DGST_R2]; const u32x r3 = ctx.h[DGST_R3]; COMPARE_S_SIMD (r0, r1, r2, r3); } } hashcat-4.0.1/OpenCL/m15600.cl000066400000000000000000000346271320027462700154360ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_sha256.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" __constant u64a 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 }; #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_S (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; \ } void keccak_transform_S (u64 st[25]) { const u8 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 u8 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 }; /** * Keccak */ int round; for (round = 0; round < KECCAK_ROUNDS; round++) { // Theta u64 bc0 = Theta1 (0); u64 bc1 = Theta1 (1); u64 bc2 = Theta1 (2); u64 bc3 = Theta1 (3); u64 bc4 = Theta1 (4); u64 t; t = bc4 ^ rotl64_S (bc1, 1); Theta2 (0); t = bc0 ^ rotl64_S (bc2, 1); Theta2 (1); t = bc1 ^ rotl64_S (bc3, 1); Theta2 (2); t = bc2 ^ rotl64_S (bc4, 1); Theta2 (3); t = bc3 ^ rotl64_S (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]; } } void hmac_sha256_run_V (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_vector (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_vector (w0, w1, w2, w3, digest); } __kernel void m15600_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ethereum_pbkdf2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha256_hmac_ctx_t sha256_hmac_ctx; sha256_hmac_init_global_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); tmps[gid].ipad[0] = sha256_hmac_ctx.ipad.h[0]; tmps[gid].ipad[1] = sha256_hmac_ctx.ipad.h[1]; tmps[gid].ipad[2] = sha256_hmac_ctx.ipad.h[2]; tmps[gid].ipad[3] = sha256_hmac_ctx.ipad.h[3]; tmps[gid].ipad[4] = sha256_hmac_ctx.ipad.h[4]; tmps[gid].ipad[5] = sha256_hmac_ctx.ipad.h[5]; tmps[gid].ipad[6] = sha256_hmac_ctx.ipad.h[6]; tmps[gid].ipad[7] = sha256_hmac_ctx.ipad.h[7]; tmps[gid].opad[0] = sha256_hmac_ctx.opad.h[0]; tmps[gid].opad[1] = sha256_hmac_ctx.opad.h[1]; tmps[gid].opad[2] = sha256_hmac_ctx.opad.h[2]; tmps[gid].opad[3] = sha256_hmac_ctx.opad.h[3]; tmps[gid].opad[4] = sha256_hmac_ctx.opad.h[4]; tmps[gid].opad[5] = sha256_hmac_ctx.opad.h[5]; tmps[gid].opad[6] = sha256_hmac_ctx.opad.h[6]; tmps[gid].opad[7] = sha256_hmac_ctx.opad.h[7]; sha256_hmac_update_global_swap (&sha256_hmac_ctx, esalt_bufs[digests_offset].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) { sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); sha256_hmac_final (&sha256_hmac_ctx2); tmps[gid].dgst[i + 0] = sha256_hmac_ctx2.opad.h[0]; tmps[gid].dgst[i + 1] = sha256_hmac_ctx2.opad.h[1]; tmps[gid].dgst[i + 2] = sha256_hmac_ctx2.opad.h[2]; tmps[gid].dgst[i + 3] = sha256_hmac_ctx2.opad.h[3]; tmps[gid].dgst[i + 4] = sha256_hmac_ctx2.opad.h[4]; tmps[gid].dgst[i + 5] = sha256_hmac_ctx2.opad.h[5]; tmps[gid].dgst[i + 6] = sha256_hmac_ctx2.opad.h[6]; tmps[gid].dgst[i + 7] = sha256_hmac_ctx2.opad.h[7]; tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } } __kernel void m15600_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ethereum_pbkdf2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u32x ipad[8]; u32x opad[8]; ipad[0] = packv (tmps, ipad, gid, 0); ipad[1] = packv (tmps, ipad, gid, 1); ipad[2] = packv (tmps, ipad, gid, 2); ipad[3] = packv (tmps, ipad, gid, 3); ipad[4] = packv (tmps, ipad, gid, 4); ipad[5] = packv (tmps, ipad, gid, 5); ipad[6] = packv (tmps, ipad, gid, 6); ipad[7] = packv (tmps, ipad, gid, 7); opad[0] = packv (tmps, opad, gid, 0); opad[1] = packv (tmps, opad, gid, 1); opad[2] = packv (tmps, opad, gid, 2); opad[3] = packv (tmps, opad, gid, 3); opad[4] = packv (tmps, opad, gid, 4); opad[5] = packv (tmps, opad, gid, 5); opad[6] = packv (tmps, opad, gid, 6); opad[7] = packv (tmps, opad, gid, 7); for (u32 i = 0; i < 8; i += 8) { u32x dgst[8]; u32x out[8]; dgst[0] = packv (tmps, dgst, gid, i + 0); dgst[1] = packv (tmps, dgst, gid, i + 1); dgst[2] = packv (tmps, dgst, gid, i + 2); dgst[3] = packv (tmps, dgst, gid, i + 3); dgst[4] = packv (tmps, dgst, gid, i + 4); dgst[5] = packv (tmps, dgst, gid, i + 5); dgst[6] = packv (tmps, dgst, gid, i + 6); dgst[7] = packv (tmps, dgst, gid, i + 7); out[0] = packv (tmps, out, gid, i + 0); out[1] = packv (tmps, out, gid, i + 1); out[2] = packv (tmps, out, gid, i + 2); out[3] = packv (tmps, out, gid, i + 3); out[4] = packv (tmps, out, gid, i + 4); out[5] = packv (tmps, out, gid, i + 5); out[6] = packv (tmps, out, gid, i + 6); out[7] = packv (tmps, out, gid, i + 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_V (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]; } unpackv (tmps, dgst, gid, i + 0, dgst[0]); unpackv (tmps, dgst, gid, i + 1, dgst[1]); unpackv (tmps, dgst, gid, i + 2, dgst[2]); unpackv (tmps, dgst, gid, i + 3, dgst[3]); unpackv (tmps, dgst, gid, i + 4, dgst[4]); unpackv (tmps, dgst, gid, i + 5, dgst[5]); unpackv (tmps, dgst, gid, i + 6, dgst[6]); unpackv (tmps, dgst, gid, i + 7, dgst[7]); unpackv (tmps, out, gid, i + 0, out[0]); unpackv (tmps, out, gid, i + 1, out[1]); unpackv (tmps, out, gid, i + 2, out[2]); unpackv (tmps, out, gid, i + 3, out[3]); unpackv (tmps, out, gid, i + 4, out[4]); unpackv (tmps, out, gid, i + 5, out[5]); unpackv (tmps, out, gid, i + 6, out[6]); unpackv (tmps, out, gid, i + 7, out[7]); } } __kernel void m15600_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ethereum_pbkdf2_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; const u64 lid = get_local_id (0); /** * keccak */ u32 ciphertext[8]; ciphertext[0] = esalt_bufs[digests_offset].ciphertext[0]; ciphertext[1] = esalt_bufs[digests_offset].ciphertext[1]; ciphertext[2] = esalt_bufs[digests_offset].ciphertext[2]; ciphertext[3] = esalt_bufs[digests_offset].ciphertext[3]; ciphertext[4] = esalt_bufs[digests_offset].ciphertext[4]; ciphertext[5] = esalt_bufs[digests_offset].ciphertext[5]; ciphertext[6] = esalt_bufs[digests_offset].ciphertext[6]; ciphertext[7] = esalt_bufs[digests_offset].ciphertext[7]; u32 key[4]; key[0] = swap32_S (tmps[gid].out[4]); key[1] = swap32_S (tmps[gid].out[5]); key[2] = swap32_S (tmps[gid].out[6]); key[3] = swap32_S (tmps[gid].out[7]); u64 st[25]; st[ 0] = hl32_to_64_S (key[1], key[0]); st[ 1] = hl32_to_64_S (key[3], key[2]); st[ 2] = hl32_to_64_S (ciphertext[1], ciphertext[0]); st[ 3] = hl32_to_64_S (ciphertext[3], ciphertext[2]); st[ 4] = hl32_to_64_S (ciphertext[5], ciphertext[4]); st[ 5] = hl32_to_64_S (ciphertext[7], ciphertext[6]); st[ 6] = 0x01; 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; const u32 mdlen = 32; const u32 rsiz = 200 - (2 * mdlen); const u32 add80w = (rsiz - 1) / 8; st[add80w] |= 0x8000000000000000; keccak_transform_S (st); const u32 r0 = l32_from_64_S (st[0]); const u32 r1 = h32_from_64_S (st[0]); const u32 r2 = l32_from_64_S (st[1]); const u32 r3 = h32_from_64_S (st[1]); #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m15700.cl000066400000000000000000000374121320027462700154320ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_hash_sha256.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" uint4 swap32_4 (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 SCRYPT_CNT GET_SCRYPT_CNT (SCRYPT_R, SCRYPT_P) #define SCRYPT_CNT4 (SCRYPT_CNT / 4) #define STATE_CNT GET_STATE_CNT (SCRYPT_R) #define STATE_CNT4 (STATE_CNT / 4) #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; \ } void salsa_r (uint4 *TI) { uint4 R0 = TI[STATE_CNT4 - 4]; uint4 R1 = TI[STATE_CNT4 - 3]; uint4 R2 = TI[STATE_CNT4 - 2]; uint4 R3 = TI[STATE_CNT4 - 1]; uint4 TO[STATE_CNT4]; int idx_y = 0; int idx_r1 = 0; int idx_r2 = SCRYPT_R * 4; for (int i = 0; i < SCRYPT_R; i++) { uint4 Y0; uint4 Y1; uint4 Y2; uint4 Y3; Y0 = TI[idx_y++]; Y1 = TI[idx_y++]; Y2 = TI[idx_y++]; Y3 = TI[idx_y++]; SALSA20_8_XOR (); TO[idx_r1++] = R0; TO[idx_r1++] = R1; TO[idx_r1++] = R2; TO[idx_r1++] = R3; Y0 = TI[idx_y++]; Y1 = TI[idx_y++]; Y2 = TI[idx_y++]; Y3 = TI[idx_y++]; SALSA20_8_XOR (); TO[idx_r2++] = R0; TO[idx_r2++] = R1; TO[idx_r2++] = R2; TO[idx_r2++] = R3; } #pragma unroll for (int i = 0; i < STATE_CNT4; i++) { TI[i] = TO[i]; } } void scrypt_smix (uint4 *X, uint4 *T, __global uint4 *V0, __global uint4 *V1, __global uint4 *V2, __global uint4 *V3) { #define Coord(xd4,y,z) (((xd4) * ySIZE * zSIZE) + ((y) * zSIZE) + (z)) #define CO Coord(xd4,y,z) const u32 ySIZE = SCRYPT_N / SCRYPT_TMTO; const u32 zSIZE = STATE_CNT4; const u32 x = get_global_id (0); const u32 xd4 = x / 4; const u32 xm4 = x & 3; __global uint4 *V; switch (xm4) { case 0: V = V0; break; case 1: V = V1; break; case 2: V = V2; break; case 3: V = V3; break; } #ifdef _unroll #pragma unroll #endif 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 < SCRYPT_TMTO; i++) salsa_r (X); } for (u32 i = 0; i < SCRYPT_N; i++) { const u32 k = X[zSIZE - 4].x & (SCRYPT_N - 1); const u32 y = k / SCRYPT_TMTO; const u32 km = k - (y * SCRYPT_TMTO); for (u32 z = 0; z < zSIZE; z++) T[z] = V[CO]; for (u32 i = 0; i < km; i++) salsa_r (T); for (u32 z = 0; z < zSIZE; z++) X[z] ^= T[z]; salsa_r (X); } #ifdef _unroll #pragma unroll #endif 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]; } } #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_S (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; \ } __constant u64a 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 }; void keccak_transform_S (u64 st[25]) { const u8 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 u8 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 }; /** * Keccak */ int round; for (round = 0; round < KECCAK_ROUNDS; round++) { // Theta u64 bc0 = Theta1 (0); u64 bc1 = Theta1 (1); u64 bc2 = Theta1 (2); u64 bc3 = Theta1 (3); u64 bc4 = Theta1 (4); u64 t; t = bc4 ^ rotl64_S (bc1, 1); Theta2 (0); t = bc0 ^ rotl64_S (bc2, 1); Theta2 (1); t = bc1 ^ rotl64_S (bc3, 1); Theta2 (2); t = bc2 ^ rotl64_S (bc4, 1); Theta2 (3); t = bc3 ^ rotl64_S (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]; } } __kernel void m15700_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global scrypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ethereum_scrypt_t *esalt_bufs, __global u32 *d_return_buf, __global uint4 *d_scryptV0_buf, __global uint4 *d_scryptV1_buf, __global uint4 *d_scryptV2_buf, __global uint4 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; sha256_hmac_ctx_t sha256_hmac_ctx; sha256_hmac_init_global_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); sha256_hmac_update_global_swap (&sha256_hmac_ctx, salt_bufs[salt_pos].salt_buf, salt_bufs[salt_pos].salt_len); for (u32 i = 0, j = 1, k = 0; i < SCRYPT_CNT; i += 8, j += 1, k += 2) { sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = j; 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] = 0; sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); sha256_hmac_final (&sha256_hmac_ctx2); u32 digest[8]; digest[0] = sha256_hmac_ctx2.opad.h[0]; digest[1] = sha256_hmac_ctx2.opad.h[1]; digest[2] = sha256_hmac_ctx2.opad.h[2]; digest[3] = sha256_hmac_ctx2.opad.h[3]; digest[4] = sha256_hmac_ctx2.opad.h[4]; digest[5] = sha256_hmac_ctx2.opad.h[5]; digest[6] = sha256_hmac_ctx2.opad.h[6]; digest[7] = sha256_hmac_ctx2.opad.h[7]; const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]); const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]); tmps[gid].P[k + 0] = tmp0; tmps[gid].P[k + 1] = tmp1; } } __kernel void m15700_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global scrypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ethereum_scrypt_t *esalt_bufs, __global u32 *d_return_buf, __global uint4 *d_scryptV0_buf, __global uint4 *d_scryptV1_buf, __global uint4 *d_scryptV2_buf, __global uint4 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; uint4 X[STATE_CNT4]; uint4 T[STATE_CNT4]; #ifdef _unroll #pragma unroll #endif for (int z = 0; z < STATE_CNT4; z++) X[z] = swap32_4 (tmps[gid].P[z]); scrypt_smix (X, T, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf); #ifdef _unroll #pragma unroll #endif for (int z = 0; z < STATE_CNT4; z++) tmps[gid].P[z] = swap32_4 (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] = swap32_4 (tmps[gid].P[i + z]); scrypt_smix (X, T, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf); for (int z = 0; z < STATE_CNT4; z++) tmps[gid].P[i + z] = swap32_4 (X[z]); } #endif } __kernel void m15700_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global scrypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const ethereum_scrypt_t *esalt_bufs, __global u32 *d_return_buf, __global uint4 *d_scryptV0_buf, __global uint4 *d_scryptV1_buf, __global uint4 *d_scryptV2_buf, __global uint4 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); if (gid >= gid_max) return; /** * 2nd pbkdf2, creates B */ u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; sha256_hmac_ctx_t ctx; sha256_hmac_init_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); for (u32 l = 0; l < SCRYPT_CNT4; l += 4) { 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_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); } w0[0] = 1; 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] = 0; sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 4); sha256_hmac_final (&ctx); /** * keccak */ u32 ciphertext[8]; ciphertext[0] = esalt_bufs[digests_offset].ciphertext[0]; ciphertext[1] = esalt_bufs[digests_offset].ciphertext[1]; ciphertext[2] = esalt_bufs[digests_offset].ciphertext[2]; ciphertext[3] = esalt_bufs[digests_offset].ciphertext[3]; ciphertext[4] = esalt_bufs[digests_offset].ciphertext[4]; ciphertext[5] = esalt_bufs[digests_offset].ciphertext[5]; ciphertext[6] = esalt_bufs[digests_offset].ciphertext[6]; ciphertext[7] = esalt_bufs[digests_offset].ciphertext[7]; u32 key[4]; key[0] = swap32_S (ctx.opad.h[4]); key[1] = swap32_S (ctx.opad.h[5]); key[2] = swap32_S (ctx.opad.h[6]); key[3] = swap32_S (ctx.opad.h[7]); u64 st[25]; st[ 0] = hl32_to_64_S (key[1], key[0]); st[ 1] = hl32_to_64_S (key[3], key[2]); st[ 2] = hl32_to_64_S (ciphertext[1], ciphertext[0]); st[ 3] = hl32_to_64_S (ciphertext[3], ciphertext[2]); st[ 4] = hl32_to_64_S (ciphertext[5], ciphertext[4]); st[ 5] = hl32_to_64_S (ciphertext[7], ciphertext[6]); st[ 6] = 0x01; 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; const u32 mdlen = 32; const u32 rsiz = 200 - (2 * mdlen); const u32 add80w = (rsiz - 1) / 8; st[add80w] |= 0x8000000000000000; keccak_transform_S (st); const u32 r0 = l32_from_64_S (st[0]); const u32 r1 = h32_from_64_S (st[0]); const u32 r2 = l32_from_64_S (st[1]); const u32 r3 = h32_from_64_S (st[1]); #define il_pos 0 #include COMPARE_M } hashcat-4.0.1/OpenCL/m15900.cl000066400000000000000000000513421320027462700154320ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define NEW_SIMD_CODE #include "inc_vendor.cl" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "inc_types.cl" #include "inc_common.cl" #include "inc_simd.cl" #include "inc_hash_md4.cl" #include "inc_hash_sha1.cl" #include "inc_hash_sha512.cl" #include "inc_cipher_aes.cl" #define COMPARE_S "inc_comp_single.cl" #define COMPARE_M "inc_comp_multi.cl" void hmac_sha512_run_V (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); w0[0] = h32_from_64 (digest[0]); w0[1] = l32_from_64 (digest[0]); w0[2] = h32_from_64 (digest[1]); w0[3] = l32_from_64 (digest[1]); w1[0] = h32_from_64 (digest[2]); w1[1] = l32_from_64 (digest[2]); w1[2] = h32_from_64 (digest[3]); w1[3] = l32_from_64 (digest[3]); w2[0] = h32_from_64 (digest[4]); w2[1] = l32_from_64 (digest[4]); w2[2] = h32_from_64 (digest[5]); w2[3] = l32_from_64 (digest[5]); w3[0] = h32_from_64 (digest[6]); w3[1] = l32_from_64 (digest[6]); w3[2] = h32_from_64 (digest[7]); w3[3] = l32_from_64 (digest[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[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_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } __kernel void m15900_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global dpapimk_tmp_v2_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const dpapimk_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if (gid >= gid_max) return; /** * main */ u32 digest_context[5]; if (esalt_bufs[digests_offset].context == 1) { /* local credentials */ sha1_ctx_t ctx; sha1_init (&ctx); sha1_update_global_utf16le_swap (&ctx, pws[gid].i, pws[gid].pw_len); sha1_final (&ctx); digest_context[0] = ctx.h[0]; digest_context[1] = ctx.h[1]; digest_context[2] = ctx.h[2]; digest_context[3] = ctx.h[3]; digest_context[4] = ctx.h[4]; } else if (esalt_bufs[digests_offset].context == 2) { /* domain credentials */ md4_ctx_t ctx; md4_init (&ctx); md4_update_global_utf16le (&ctx, pws[gid].i, pws[gid].pw_len); md4_final (&ctx); digest_context[0] = ctx.h[0]; digest_context[1] = ctx.h[1]; digest_context[2] = ctx.h[2]; digest_context[3] = ctx.h[3]; digest_context[4] = 0; digest_context[0] = swap32_S (digest_context[0]); digest_context[1] = swap32_S (digest_context[1]); digest_context[2] = swap32_S (digest_context[2]); digest_context[3] = swap32_S (digest_context[3]); } /* initialize hmac-sha1 */ u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = digest_context[0]; w0[1] = digest_context[1]; w0[2] = digest_context[2]; w0[3] = digest_context[3]; w1[0] = digest_context[4]; 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; sha1_hmac_ctx_t ctx; sha1_hmac_init_64 (&ctx, w0, w1, w2, w3); sha1_hmac_update_global (&ctx, esalt_bufs[digests_offset].SID, esalt_bufs[digests_offset].SID_len); sha1_hmac_final (&ctx); u32 key[5]; key[0] = ctx.opad.h[0]; key[1] = ctx.opad.h[1]; key[2] = ctx.opad.h[2]; key[3] = ctx.opad.h[3]; key[4] = ctx.opad.h[4]; /* this key is used as password for pbkdf2-hmac-sha512 */ tmps[gid].userKey[0] = key[0]; tmps[gid].userKey[1] = key[1]; tmps[gid].userKey[2] = key[2]; tmps[gid].userKey[3] = key[3]; tmps[gid].userKey[4] = key[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; w0[0] = key[0]; w0[1] = key[1]; w0[2] = key[2]; w0[3] = key[3]; w1[0] = key[4]; 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; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_ctx_t sha512_hmac_ctx; sha512_hmac_init_128 (&sha512_hmac_ctx, w0, w1, w2, w3, w5, w5, w6, w7); tmps[gid].ipad64[0] = sha512_hmac_ctx.ipad.h[0]; tmps[gid].ipad64[1] = sha512_hmac_ctx.ipad.h[1]; tmps[gid].ipad64[2] = sha512_hmac_ctx.ipad.h[2]; tmps[gid].ipad64[3] = sha512_hmac_ctx.ipad.h[3]; tmps[gid].ipad64[4] = sha512_hmac_ctx.ipad.h[4]; tmps[gid].ipad64[5] = sha512_hmac_ctx.ipad.h[5]; tmps[gid].ipad64[6] = sha512_hmac_ctx.ipad.h[6]; tmps[gid].ipad64[7] = sha512_hmac_ctx.ipad.h[7]; tmps[gid].opad64[0] = sha512_hmac_ctx.opad.h[0]; tmps[gid].opad64[1] = sha512_hmac_ctx.opad.h[1]; tmps[gid].opad64[2] = sha512_hmac_ctx.opad.h[2]; tmps[gid].opad64[3] = sha512_hmac_ctx.opad.h[3]; tmps[gid].opad64[4] = sha512_hmac_ctx.opad.h[4]; tmps[gid].opad64[5] = sha512_hmac_ctx.opad.h[5]; tmps[gid].opad64[6] = sha512_hmac_ctx.opad.h[6]; tmps[gid].opad64[7] = sha512_hmac_ctx.opad.h[7]; w0[0] = esalt_bufs[digests_offset].iv[0]; w0[1] = esalt_bufs[digests_offset].iv[1]; w0[2] = esalt_bufs[digests_offset].iv[2]; w0[3] = esalt_bufs[digests_offset].iv[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; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_update_128 (&sha512_hmac_ctx, w0, w1, w2, w3, w4, w5, w6, w7, 16); for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) { sha512_hmac_ctx_t sha512_hmac_ctx2 = sha512_hmac_ctx; w0[0] = j; 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] = 0; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_update_128 (&sha512_hmac_ctx2, w0, w1, w2, w3, w4, w5, w6, w7, 4); sha512_hmac_final (&sha512_hmac_ctx2); tmps[gid].dgst64[i + 0] = sha512_hmac_ctx2.opad.h[0]; tmps[gid].dgst64[i + 1] = sha512_hmac_ctx2.opad.h[1]; tmps[gid].dgst64[i + 2] = sha512_hmac_ctx2.opad.h[2]; tmps[gid].dgst64[i + 3] = sha512_hmac_ctx2.opad.h[3]; tmps[gid].dgst64[i + 4] = sha512_hmac_ctx2.opad.h[4]; tmps[gid].dgst64[i + 5] = sha512_hmac_ctx2.opad.h[5]; tmps[gid].dgst64[i + 6] = sha512_hmac_ctx2.opad.h[6]; tmps[gid].dgst64[i + 7] = sha512_hmac_ctx2.opad.h[7]; tmps[gid].out64[i + 0] = tmps[gid].dgst64[i + 0]; tmps[gid].out64[i + 1] = tmps[gid].dgst64[i + 1]; tmps[gid].out64[i + 2] = tmps[gid].dgst64[i + 2]; tmps[gid].out64[i + 3] = tmps[gid].dgst64[i + 3]; tmps[gid].out64[i + 4] = tmps[gid].dgst64[i + 4]; tmps[gid].out64[i + 5] = tmps[gid].dgst64[i + 5]; tmps[gid].out64[i + 6] = tmps[gid].dgst64[i + 6]; tmps[gid].out64[i + 7] = tmps[gid].dgst64[i + 7]; } } __kernel void m15900_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global dpapimk_tmp_v2_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const dpapimk_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { /** * base */ const u64 gid = get_global_id (0); if ((gid * VECT_SIZE) >= gid_max) return; u64x ipad[8]; u64x opad[8]; ipad[0] = pack64v (tmps, ipad64, gid, 0); ipad[1] = pack64v (tmps, ipad64, gid, 1); ipad[2] = pack64v (tmps, ipad64, gid, 2); ipad[3] = pack64v (tmps, ipad64, gid, 3); ipad[4] = pack64v (tmps, ipad64, gid, 4); ipad[5] = pack64v (tmps, ipad64, gid, 5); ipad[6] = pack64v (tmps, ipad64, gid, 6); ipad[7] = pack64v (tmps, ipad64, gid, 7); opad[0] = pack64v (tmps, opad64, gid, 0); opad[1] = pack64v (tmps, opad64, gid, 1); opad[2] = pack64v (tmps, opad64, gid, 2); opad[3] = pack64v (tmps, opad64, gid, 3); opad[4] = pack64v (tmps, opad64, gid, 4); opad[5] = pack64v (tmps, opad64, gid, 5); opad[6] = pack64v (tmps, opad64, gid, 6); opad[7] = pack64v (tmps, opad64, gid, 7); for (u32 i = 0; i < 8; i += 8) { u64x dgst[8]; u64x out[8]; dgst[0] = pack64v (tmps, dgst64, gid, i + 0); dgst[1] = pack64v (tmps, dgst64, gid, i + 1); dgst[2] = pack64v (tmps, dgst64, gid, i + 2); dgst[3] = pack64v (tmps, dgst64, gid, i + 3); dgst[4] = pack64v (tmps, dgst64, gid, i + 4); dgst[5] = pack64v (tmps, dgst64, gid, i + 5); dgst[6] = pack64v (tmps, dgst64, gid, i + 6); dgst[7] = pack64v (tmps, dgst64, gid, i + 7); out[0] = pack64v (tmps, out64, gid, i + 0); out[1] = pack64v (tmps, out64, gid, i + 1); out[2] = pack64v (tmps, out64, gid, i + 2); out[3] = pack64v (tmps, out64, gid, i + 3); out[4] = pack64v (tmps, out64, gid, i + 4); out[5] = pack64v (tmps, out64, gid, i + 5); out[6] = pack64v (tmps, out64, gid, i + 6); out[7] = pack64v (tmps, out64, gid, i + 7); for (u32 j = 0; j < loop_cnt; j++) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; u32x w4[4]; u32x w5[4]; u32x w6[4]; u32x w7[4]; w0[0] = h32_from_64 (out[0]); w0[1] = l32_from_64 (out[0]); w0[2] = h32_from_64 (out[1]); w0[3] = l32_from_64 (out[1]); w1[0] = h32_from_64 (out[2]); w1[1] = l32_from_64 (out[2]); w1[2] = h32_from_64 (out[3]); w1[3] = l32_from_64 (out[3]); w2[0] = h32_from_64 (out[4]); w2[1] = l32_from_64 (out[4]); w2[2] = h32_from_64 (out[5]); w2[3] = l32_from_64 (out[5]); w3[0] = h32_from_64 (out[6]); w3[1] = l32_from_64 (out[6]); w3[2] = h32_from_64 (out[7]); w3[3] = l32_from_64 (out[7]); w4[0] = 0x80000000; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = (128 + 64) * 8; hmac_sha512_run_V (w0, w1, w2, w3, w4, w5, w6, w7, 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]; } unpack64v (tmps, dgst64, gid, i + 0, dgst[0]); unpack64v (tmps, dgst64, gid, i + 1, dgst[1]); unpack64v (tmps, dgst64, gid, i + 2, dgst[2]); unpack64v (tmps, dgst64, gid, i + 3, dgst[3]); unpack64v (tmps, dgst64, gid, i + 4, dgst[4]); unpack64v (tmps, dgst64, gid, i + 5, dgst[5]); unpack64v (tmps, dgst64, gid, i + 6, dgst[6]); unpack64v (tmps, dgst64, gid, i + 7, dgst[7]); unpack64v (tmps, out64, gid, i + 0, out[0]); unpack64v (tmps, out64, gid, i + 1, out[1]); unpack64v (tmps, out64, gid, i + 2, out[2]); unpack64v (tmps, out64, gid, i + 3, out[3]); unpack64v (tmps, out64, gid, i + 4, out[4]); unpack64v (tmps, out64, gid, i + 5, out[5]); unpack64v (tmps, out64, gid, i + 6, out[6]); unpack64v (tmps, out64, gid, i + 7, out[7]); } } __kernel void m15900_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global dpapimk_tmp_v2_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const dpapimk_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u64 gid_max) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); const u64 lsz = get_local_size (0); /** * aes shared */ #ifdef REAL_SHM __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 = lid; i < 256; i += lsz) { s_td0[i] = td0[i]; s_td1[i] = td1[i]; s_td2[i] = td2[i]; s_td3[i] = td3[i]; s_td4[i] = td4[i]; s_te0[i] = te0[i]; s_te1[i] = te1[i]; s_te2[i] = te2[i]; s_te3[i] = te3[i]; s_te4[i] = te4[i]; } barrier (CLK_LOCAL_MEM_FENCE); #else __constant u32a *s_td0 = td0; __constant u32a *s_td1 = td1; __constant u32a *s_td2 = td2; __constant u32a *s_td3 = td3; __constant u32a *s_td4 = td4; __constant u32a *s_te0 = te0; __constant u32a *s_te1 = te1; __constant u32a *s_te2 = te2; __constant u32a *s_te3 = te3; __constant u32a *s_te4 = te4; #endif if (gid >= gid_max) return; /** * main */ u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; u32 w4[4]; u32 w5[4]; u32 w6[4]; u32 w7[4]; /* Construct AES key */ u32 key[8]; key[0] = h32_from_64_S (tmps[gid].out64[0]); key[1] = l32_from_64_S (tmps[gid].out64[0]); key[2] = h32_from_64_S (tmps[gid].out64[1]); key[3] = l32_from_64_S (tmps[gid].out64[1]); key[4] = h32_from_64_S (tmps[gid].out64[2]); key[5] = l32_from_64_S (tmps[gid].out64[2]); key[6] = h32_from_64_S (tmps[gid].out64[3]); key[7] = l32_from_64_S (tmps[gid].out64[3]); u32 iv[4]; iv[0] = h32_from_64_S (tmps[gid].out64[4]); iv[1] = l32_from_64_S (tmps[gid].out64[4]); iv[2] = h32_from_64_S (tmps[gid].out64[5]); iv[3] = l32_from_64_S (tmps[gid].out64[5]); #define KEYLEN 60 u32 ks[KEYLEN]; AES256_set_decrypt_key (ks, key, s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4); /* 144 bytes */ u32 decrypted[36] = { 0 }; u32 contents_pos; u32 contents_off; u32 wx_off; for (wx_off = 0, contents_pos = 0, contents_off = 0; contents_pos < esalt_bufs[digests_offset].contents_len; wx_off += 4, contents_pos += 16, contents_off += 4) { u32 data[4]; data[0] = esalt_bufs[digests_offset].contents[contents_off + 0]; data[1] = esalt_bufs[digests_offset].contents[contents_off + 1]; data[2] = esalt_bufs[digests_offset].contents[contents_off + 2]; data[3] = esalt_bufs[digests_offset].contents[contents_off + 3]; u32 out[4]; AES256_decrypt (ks, data, out, 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]; decrypted[wx_off + 0] = out[0]; decrypted[wx_off + 1] = out[1]; decrypted[wx_off + 2] = out[2]; decrypted[wx_off + 3] = out[3]; iv[0] = data[0]; iv[1] = data[1]; iv[2] = data[2]; iv[3] = data[3]; } u32 hmacSalt[4]; u32 expectedHmac[16]; u32 lastKey[16]; hmacSalt[0] = decrypted[0]; hmacSalt[1] = decrypted[1]; hmacSalt[2] = decrypted[2]; hmacSalt[3] = decrypted[3]; for(int i = 0; i < 16; i++) { expectedHmac[i] = decrypted[i + 4]; lastKey[i] = decrypted[i + 36 - 16]; } w0[0] = tmps[gid].userKey[0]; w0[1] = tmps[gid].userKey[1]; w0[2] = tmps[gid].userKey[2]; w0[3] = tmps[gid].userKey[3]; w1[0] = tmps[gid].userKey[4]; 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; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_ctx_t ctx; sha512_hmac_init_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7); w0[0] = hmacSalt[0]; w0[1] = hmacSalt[1]; w0[2] = hmacSalt[2]; w0[3] = hmacSalt[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; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 16); sha512_hmac_final (&ctx); w0[0] = h32_from_64_S (ctx.opad.h[0]); w0[1] = l32_from_64_S (ctx.opad.h[0]); w0[2] = h32_from_64_S (ctx.opad.h[1]); w0[3] = l32_from_64_S (ctx.opad.h[1]); w1[0] = h32_from_64_S (ctx.opad.h[2]); w1[1] = l32_from_64_S (ctx.opad.h[2]); w1[2] = h32_from_64_S (ctx.opad.h[3]); w1[3] = l32_from_64_S (ctx.opad.h[3]); w2[0] = h32_from_64_S (ctx.opad.h[4]); w2[1] = l32_from_64_S (ctx.opad.h[4]); w2[2] = h32_from_64_S (ctx.opad.h[5]); w2[3] = l32_from_64_S (ctx.opad.h[5]); w3[0] = h32_from_64_S (ctx.opad.h[6]); w3[1] = l32_from_64_S (ctx.opad.h[6]); w3[2] = h32_from_64_S (ctx.opad.h[7]); w3[3] = l32_from_64_S (ctx.opad.h[7]); w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_init_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7); w0[0] = lastKey[ 0]; w0[1] = lastKey[ 1]; w0[2] = lastKey[ 2]; w0[3] = lastKey[ 3]; w1[0] = lastKey[ 4]; w1[1] = lastKey[ 5]; w1[2] = lastKey[ 6]; w1[3] = lastKey[ 7]; w2[0] = lastKey[ 8]; w2[1] = lastKey[ 9]; w2[2] = lastKey[10]; w2[3] = lastKey[11]; w3[0] = lastKey[12]; w3[1] = lastKey[13]; w3[2] = lastKey[14]; w3[3] = lastKey[15]; w4[0] = 0; w4[1] = 0; w4[2] = 0; w4[3] = 0; w5[0] = 0; w5[1] = 0; w5[2] = 0; w5[3] = 0; w6[0] = 0; w6[1] = 0; w6[2] = 0; w6[3] = 0; w7[0] = 0; w7[1] = 0; w7[2] = 0; w7[3] = 0; sha512_hmac_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64); sha512_hmac_final (&ctx); #define il_pos 0 if ((expectedHmac[0] == h32_from_64_S (ctx.opad.h[0])) && (expectedHmac[1] == l32_from_64_S (ctx.opad.h[0])) && (expectedHmac[2] == h32_from_64_S (ctx.opad.h[1])) && (expectedHmac[3] == l32_from_64_S (ctx.opad.h[1]))) { if (atomic_inc (&hashes_shown[digests_offset]) == 0) { mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos); } } } hashcat-4.0.1/OpenCL/markov_be.cl000066400000000000000000000051001320027462700165330ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #define CHARSIZ 256 #include "inc_types.cl" void generate_pw (u32 pw_buf[64], __global const cs_t *root_css_buf, __global const 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) { __global const 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 l_markov (__global pw_t *pws_buf_l, __global const cs_t *root_css_buf, __global const 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 u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf[64] = { 0 }; generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid); #pragma unroll for (int idx = 0; idx < 64; idx++) { pws_buf_l[gid].i[idx] = pw_buf[idx]; } pws_buf_l[gid].pw_len = pw_l_len + pw_r_len; } __kernel void r_markov (__global bf_t *pws_buf_r, __global const cs_t *root_css_buf, __global const cs_t *markov_css_buf, const u64 off, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf[64] = { 0 }; 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 C_markov (__global pw_t *pws_buf, __global const cs_t *root_css_buf, __global const cs_t *markov_css_buf, const u64 off, const u32 pw_len, const u32 mask80, const u32 bits14, const u32 bits15, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf[64] = { 0 }; generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid); #pragma unroll for (int idx = 0; idx < 64; idx++) { pws_buf[gid].i[idx] = pw_buf[idx]; } pws_buf[gid].pw_len = pw_len; } hashcat-4.0.1/OpenCL/markov_le.cl000066400000000000000000000050641320027462700165560ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "inc_vendor.cl" #define CHARSIZ 256 #include "inc_types.cl" void generate_pw (u32 pw_buf[64], __global const cs_t *root_css_buf, __global const 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) { __global const 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 l_markov (__global pw_t *pws_buf_l, __global const cs_t *root_css_buf, __global const 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 u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf[64] = { 0 }; generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid); #pragma unroll for (int idx = 0; idx < 64; idx++) { pws_buf_l[gid].i[idx] = pw_buf[idx]; } pws_buf_l[gid].pw_len = pw_l_len + pw_r_len; } __kernel void r_markov (__global bf_t *pws_buf_r, __global const cs_t *root_css_buf, __global const cs_t *markov_css_buf, const u64 off, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf[64] = { 0 }; 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 C_markov (__global pw_t *pws_buf, __global const cs_t *root_css_buf, __global const cs_t *markov_css_buf, const u64 off, const u32 pw_len, const u32 mask80, const u32 bits14, const u32 bits15, const u64 gid_max) { const u64 gid = get_global_id (0); if (gid >= gid_max) return; u32 pw_buf[64] = { 0 }; generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid); #pragma unroll for (int idx = 0; idx < 64; idx++) { pws_buf[gid].i[idx] = pw_buf[idx]; } pws_buf[gid].pw_len = pw_len; } hashcat-4.0.1/README.md000066400000000000000000000101361320027462700144120ustar00rootroot00000000000000## *hashcat* ## **hashcat** is the world's fastest and most advanced password recovery utility, supporting five unique modes of attack for over 200 highly-optimized hashing algorithms. hashcat currently supports CPUs, GPUs, and other hardware accelerators on Linux, Windows, and macOS, and has facilities to help enable distributed password cracking. ### License ### **hashcat** 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/hashcat/) 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 [BUILD.md](BUILD.md) for instructions on how to build **hashcat** from source. Tests: Travis | Appveyor | Coverity ------ | -------- | -------- [![Hashcat Travis Build status](https://travis-ci.org/hashcat/hashcat.svg?branch=master)](https://travis-ci.org/hashcat/hashcat) | [![Hashcat Appveyor Build status](https://ci.appveyor.com/api/projects/status/github/hashcat/hashcat?branch=master&svg=true)](https://ci.appveyor.com/project/jsteube/hashcat) | [![Coverity Scan Build Status](https://scan.coverity.com/projects/11753/badge.svg)](https://scan.coverity.com/projects/hashcat) ### 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 gnu99 standard 3. Compiles cleanly with no warnings when compiled with `-W -Wall -std=gnu99` 4. Uses [Allman-style](https://en.wikipedia.org/wiki/Indent_style#Allman_style) code blocks & indentation 5. Uses 2-spaces as indentation or a tab if it's required (for example: Makefiles) 6. Uses lower-case function and variable names 7. 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)`) 8. Use code like array[index + 0] if you also need to do array[index + 1], to keep it aligned 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/hashcat/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 **hashcat** 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! hashcat-4.0.1/charsets/000077500000000000000000000000001320027462700147465ustar00rootroot00000000000000hashcat-4.0.1/charsets/DES_full.charset000066400000000000000000000004001320027462700177500ustar00rootroot0000000000000001020407080b0d0e10131516191a1c1f20232526292a2c2f31323437383b3d3e40434546494a4c4f51525457585b5d5e61626467686b6d6e70737576797a7c7f80838586898a8c8f91929497989b9d9ea1a2a4a7a8abadaeb0b3b5b6b9babcbfc1c2c4c7c8cbcdced0d3d5d6d9dadcdfe0e3e5e6e9eaeceff1f2f4f7f8fbfdfehashcat-4.0.1/charsets/DES_special/000077500000000000000000000000001320027462700170615ustar00rootroot00000000000000hashcat-4.0.1/charsets/DES_special/DES_alpha.charset000066400000000000000000000000441320027462700222120ustar00rootroot00000000000000abadaebabcbfcbcdcedadcdfeaeceffbfdfehashcat-4.0.1/charsets/DES_special/DES_numeral.charset000066400000000000000000000001441320027462700225710ustar00rootroot000000000000000102040708101315161920232526293132343738404345464951525457586162646768707375767980838586899192949798hashcat-4.0.1/charsets/DES_special/multiple_nodes/000077500000000000000000000000001320027462700221045ustar00rootroot00000000000000hashcat-4.0.1/charsets/DES_special/multiple_nodes/DES_portion_0.charset000066400000000000000000000000201320027462700260530ustar00rootroot0000000000000001020407080b0d0ehashcat-4.0.1/charsets/DES_special/multiple_nodes/DES_portion_1.charset000066400000000000000000000000201320027462700260540ustar00rootroot0000000000000010131516191a1c1fhashcat-4.0.1/charsets/DES_special/multiple_nodes/DES_portion_2.charset000066400000000000000000000000201320027462700260550ustar00rootroot0000000000000020232526292a2c2fhashcat-4.0.1/charsets/DES_special/multiple_nodes/DES_portion_3.charset000066400000000000000000000000201320027462700260560ustar00rootroot0000000000000031323437383b3d3ehashcat-4.0.1/charsets/DES_special/multiple_nodes/DES_portion_4.charset000066400000000000000000000000201320027462700260570ustar00rootroot0000000000000040434546494a4c4fhashcat-4.0.1/charsets/DES_special/multiple_nodes/DES_portion_5.charset000066400000000000000000000000201320027462700260600ustar00rootroot0000000000000051525457585b5d5ehashcat-4.0.1/charsets/DES_special/multiple_nodes/DES_portion_6.charset000066400000000000000000000000201320027462700260610ustar00rootroot0000000000000061626467686b6d6ehashcat-4.0.1/charsets/DES_special/multiple_nodes/DES_portion_7.charset000066400000000000000000000000201320027462700260620ustar00rootroot0000000000000070737576797a7c7fhashcat-4.0.1/charsets/DES_special/multiple_nodes/DES_portion_8.charset000066400000000000000000000000201320027462700260630ustar00rootroot0000000000000080838586898a8c8fhashcat-4.0.1/charsets/DES_special/multiple_nodes/DES_portion_9.charset000066400000000000000000000000201320027462700260640ustar00rootroot0000000000000091929497989b9d9ehashcat-4.0.1/charsets/DES_special/multiple_nodes/DES_portion_A.charset000066400000000000000000000000201320027462700260740ustar00rootroot00000000000000a1a2a4a7a8abadaehashcat-4.0.1/charsets/DES_special/multiple_nodes/DES_portion_B.charset000066400000000000000000000000201320027462700260750ustar00rootroot00000000000000b0b3b5b6b9babcbfhashcat-4.0.1/charsets/DES_special/multiple_nodes/DES_portion_C.charset000066400000000000000000000000201320027462700260760ustar00rootroot00000000000000c1c2c4c7c8cbcdcehashcat-4.0.1/charsets/DES_special/multiple_nodes/DES_portion_D.charset000066400000000000000000000000201320027462700260770ustar00rootroot00000000000000d0d3d5d6d9dadcdfhashcat-4.0.1/charsets/DES_special/multiple_nodes/DES_portion_E.charset000066400000000000000000000000201320027462700261000ustar00rootroot00000000000000e0e3e5e6e9eaecefhashcat-4.0.1/charsets/DES_special/multiple_nodes/DES_portion_F.charset000066400000000000000000000000201320027462700261010ustar00rootroot00000000000000f1f2f4f7f8fbfdfehashcat-4.0.1/charsets/combined/000077500000000000000000000000001320027462700165265ustar00rootroot00000000000000hashcat-4.0.1/charsets/combined/Bulgarian.hcchr000066400000000000000000000001201320027462700214340ustar00rootroot00000000000000ˆ°²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿhashcat-4.0.1/charsets/combined/Castilian.hcchr000066400000000000000000000000261320027462700214440ustar00rootroot00000000000000€¡¤¨ª´º¿ÁÉÍÑÓÚÜáéíñóúühashcat-4.0.1/charsets/combined/Catalan.hcchr000066400000000000000000000000341320027462700210770ustar00rootroot00000000000000€¡¤¨ª´º¿ÀÇÈÉÍÏÒÓÚÜàçèéíïòóúühashcat-4.0.1/charsets/combined/English.hcchr000066400000000000000000000000031320027462700211210ustar00rootroot00000000000000€£¤hashcat-4.0.1/charsets/combined/French.hcchr000066400000000000000000000000551320027462700207440ustar00rootroot00000000000000€ŒœŸ¡¤¨ª«°´»¼½¾¿ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿhashcat-4.0.1/charsets/combined/German.hcchr000066400000000000000000000000141320027462700207430ustar00rootroot00000000000000€¤²³ºÄÖÜßäöühashcat-4.0.1/charsets/combined/Greek.hcchr000066400000000000000000000001101320027462700205640ustar00rootroot00000000000000€¢¤¶¸¹º¼¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþhashcat-4.0.1/charsets/combined/GreekPolytonic.hcchr000066400000000000000000000001101320027462700224650ustar00rootroot00000000000000€¢¤¶¸¹º¼¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþhashcat-4.0.1/charsets/combined/Italian.hcchr000066400000000000000000000000321320027462700211130ustar00rootroot00000000000000€£¤ª´ºÀÈÉÌÍÎÒÓÙÚàèéìíîòóùúhashcat-4.0.1/charsets/combined/Lithuanian.hcchr000066400000000000000000000000411320027462700216260ustar00rootroot00000000000000€¡©®±¹¾ÀÁÆÇÈÊËÌÐØÙÛÞàáæçèêëìðøùûþhashcat-4.0.1/charsets/combined/Polish.hcchr000066400000000000000000000000311320027462700207670ustar00rootroot00000000000000€ŒœŸ¡£¥¦¬¯±³¶¹¼¿ÆÊÑÓæêñóhashcat-4.0.1/charsets/combined/Portuguese.hcchr000066400000000000000000000000431320027462700216760ustar00rootroot00000000000000€£¤¨ª«´º»ÀÁÂÃÇÉÊÍÓÔÕÚÜàáâãçéêíóôõúühashcat-4.0.1/charsets/combined/Russian.hcchr000066400000000000000000000001251320027462700211610ustar00rootroot00000000000000‹›¡£¨°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿhashcat-4.0.1/charsets/combined/Slovak.hcchr000066400000000000000000000000571320027462700210000ustar00rootroot00000000000000€ŠŽšž¡¥¨©«®°´µ·¹»¼¾ÀÁÄÅÈÉÍÏÒÓÔÚÝàáäåèéíïòóôúýhashcat-4.0.1/charsets/combined/Spanish.hcchr000066400000000000000000000000401320027462700211360ustar00rootroot00000000000000€¡¤¨ª´º¿ÀÁÇÈÉÍÏÑÒÓÚÜàáçèéíïñòóúühashcat-4.0.1/charsets/special/000077500000000000000000000000001320027462700163665ustar00rootroot00000000000000hashcat-4.0.1/charsets/special/Castilian/000077500000000000000000000000001320027462700202755ustar00rootroot00000000000000hashcat-4.0.1/charsets/special/Castilian/es-ES_ISO-8859-1-special.hcchr000066400000000000000000000000241320027462700251170ustar00rootroot00000000000000¡¨ª´º¿ÁÉÍÑÓÚÜáéíñóúühashcat-4.0.1/charsets/special/Castilian/es-ES_ISO-8859-15-special.hcchr000066400000000000000000000000231320027462700252030ustar00rootroot00000000000000¡¤ªº¿ÁÉÍÑÓÚÜáéíñóúühashcat-4.0.1/charsets/special/Castilian/es-ES_cp1252-special.hcchr000066400000000000000000000000251320027462700246310ustar00rootroot00000000000000€¡¨ª´º¿ÁÉÍÑÓÚÜáéíñóúühashcat-4.0.1/charsets/special/Catalan/000077500000000000000000000000001320027462700177315ustar00rootroot00000000000000hashcat-4.0.1/charsets/special/Catalan/ca_ISO-8859-1-special.hcchr000066400000000000000000000000321320027462700242210ustar00rootroot00000000000000¡¨ª´º¿ÀÇÈÉÍÏÒÓÚÜàçèéíïòóúühashcat-4.0.1/charsets/special/Catalan/ca_ISO-8859-15-special.hcchr000066400000000000000000000000311320027462700243050ustar00rootroot00000000000000¡¤ªº¿ÀÇÈÉÍÏÒÓÚÜàçèéíïòóúühashcat-4.0.1/charsets/special/Catalan/ca_cp1252-special.hcchr000066400000000000000000000000331320027462700237330ustar00rootroot00000000000000€¡¨ª´º¿ÀÇÈÉÍÏÒÓÚÜàçèéíïòóúühashcat-4.0.1/charsets/special/French/000077500000000000000000000000001320027462700175735ustar00rootroot00000000000000hashcat-4.0.1/charsets/special/French/fr_ISO-8859-1-special.hcchr000066400000000000000000000000451320027462700241130ustar00rootroot00000000000000¡¨ª«°´»¿ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿhashcat-4.0.1/charsets/special/French/fr_ISO-8859-15-special.hcchr000066400000000000000000000000471320027462700242020ustar00rootroot00000000000000¡¤ª«°»¼½¾¿ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿhashcat-4.0.1/charsets/special/French/fr_ISO-8859-16-special.hcchr000066400000000000000000000000441320027462700242000ustar00rootroot00000000000000¤«°»¼½¾ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿhashcat-4.0.1/charsets/special/French/fr_cp1252-special.hcchr000066400000000000000000000000511320027462700236210ustar00rootroot00000000000000€ŒœŸ¡¨ª«°´»¿ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿhashcat-4.0.1/charsets/special/German/000077500000000000000000000000001320027462700175775ustar00rootroot00000000000000hashcat-4.0.1/charsets/special/German/de_ISO-8859-1-special.hcchr000066400000000000000000000000121320027462700240720ustar00rootroot00000000000000²³ºÄÖÜßäöühashcat-4.0.1/charsets/special/German/de_ISO-8859-15-special.hcchr000066400000000000000000000000131320027462700241600ustar00rootroot00000000000000¤²³ºÄÖÜßäöühashcat-4.0.1/charsets/special/German/de_cp1252-special.hcchr000066400000000000000000000000131320027462700236040ustar00rootroot00000000000000€²³ºÄÖÜßäöühashcat-4.0.1/charsets/special/Greek/000077500000000000000000000000001320027462700174235ustar00rootroot00000000000000hashcat-4.0.1/charsets/special/Greek/el_ISO-8859-7-special.hcchr000066400000000000000000000001061320027462700237400ustar00rootroot00000000000000¤¶¸¹º¼¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþhashcat-4.0.1/charsets/special/Greek/el_cp1253-special.hcchr000066400000000000000000000001061320027462700234440ustar00rootroot00000000000000€¢¸¹º¼¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþhashcat-4.0.1/charsets/special/Italian/000077500000000000000000000000001320027462700177475ustar00rootroot00000000000000hashcat-4.0.1/charsets/special/Italian/it_ISO-8859-1-special.hcchr000066400000000000000000000000301320027462700242660ustar00rootroot00000000000000£ª´ºÀÈÉÌÍÎÒÓÙÚàèéìíîòóùúhashcat-4.0.1/charsets/special/Italian/it_ISO-8859-15-special.hcchr000066400000000000000000000000301320027462700243530ustar00rootroot00000000000000£¤ªºÀÈÉÌÍÎÒÓÙÚàèéìíîòóùúhashcat-4.0.1/charsets/special/Italian/it_cp1252-special.hcchr000066400000000000000000000000311320027462700240000ustar00rootroot00000000000000€£ª´ºÀÈÉÌÍÎÒÓÙÚàèéìíîòóùúhashcat-4.0.1/charsets/special/Polish/000077500000000000000000000000001320027462700176245ustar00rootroot00000000000000hashcat-4.0.1/charsets/special/Polish/pl_cp1250-special.hcchr000066400000000000000000000000231320027462700236530ustar00rootroot00000000000000€ŒœŸ£¥¯³¹¿ÆÊÑÓæêñóhashcat-4.0.1/charsets/special/Portuguese/000077500000000000000000000000001320027462700205305ustar00rootroot00000000000000hashcat-4.0.1/charsets/special/Portuguese/pt_ISO-8859-1-special.hcchr000066400000000000000000000000411320027462700250600ustar00rootroot00000000000000£¨ª«´º»ÀÁÂÃÇÉÊÍÓÔÕÚÜàáâãçéêíóôõúühashcat-4.0.1/charsets/special/Portuguese/pt_ISO-8859-15-special.hcchr000066400000000000000000000000401320027462700251440ustar00rootroot00000000000000£¤ª«º»ÀÁÂÃÇÉÊÍÓÔÕÚÜàáâãçéêíóôõúühashcat-4.0.1/charsets/special/Portuguese/pt_cp1252-special.hcchr000066400000000000000000000000421320027462700245720ustar00rootroot00000000000000€£¨ª«´º»ÀÁÂÃÇÉÊÍÓÔÕÚÜàáâãçéêíóôõúühashcat-4.0.1/charsets/special/Russian/000077500000000000000000000000001320027462700200125ustar00rootroot00000000000000hashcat-4.0.1/charsets/special/Russian/ru_ISO-8859-5-special.hcchr000066400000000000000000000001041320027462700243510ustar00rootroot00000000000000¡¢°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñhashcat-4.0.1/charsets/special/Russian/ru_cp1251-special.hcchr000066400000000000000000000001051320027462700240560ustar00rootroot00000000000000‹›¨¸¹ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿhashcat-4.0.1/charsets/special/Slovak/000077500000000000000000000000001320027462700176255ustar00rootroot00000000000000hashcat-4.0.1/charsets/special/Slovak/sk_ISO-8859-2-special.hcchr000066400000000000000000000000461320027462700241550ustar00rootroot00000000000000¥¨©«®°´µ·¹»¾ÀÁÄÅÈÉÍÏÒÓÔÚÝàáäåèéíïòóôúýhashcat-4.0.1/charsets/special/Slovak/sk_cp1250-special.hcchr000066400000000000000000000000471320027462700236640ustar00rootroot00000000000000€ŠŽšž¡¨°´¼¾ÀÁÄÅÈÉÍÏÒÓÔÚÝàáäåèéíïòóôúýhashcat-4.0.1/charsets/special/Spanish/000077500000000000000000000000001320027462700177735ustar00rootroot00000000000000hashcat-4.0.1/charsets/special/Spanish/es_ISO-8859-1-special.hcchr000066400000000000000000000000361320027462700243130ustar00rootroot00000000000000¡¨ª´º¿ÀÁÇÈÉÍÏÑÒÓÚÜàáçèéíïñòóúühashcat-4.0.1/charsets/special/Spanish/es_ISO-8859-15-special.hcchr000066400000000000000000000000351320027462700243770ustar00rootroot00000000000000¡¤ªº¿ÀÁÇÈÉÍÏÑÒÓÚÜàáçèéíïñòóúühashcat-4.0.1/charsets/special/Spanish/es_cp1252-special.hcchr000066400000000000000000000000371320027462700240250ustar00rootroot00000000000000€¡¨ª´º¿ÀÁÇÈÉÍÏÑÒÓÚÜàáçèéíïñòóúühashcat-4.0.1/charsets/standard/000077500000000000000000000000001320027462700165465ustar00rootroot00000000000000hashcat-4.0.1/charsets/standard/Bulgarian/000077500000000000000000000000001320027462700204525ustar00rootroot00000000000000hashcat-4.0.1/charsets/standard/Bulgarian/bg_ISO-8859-5.hcchr000066400000000000000000000000741320027462700233430ustar00rootroot00000000000000°²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊÌÍÎÏÐÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêìíîïhashcat-4.0.1/charsets/standard/Bulgarian/bg_KOI8-R.hcchr000066400000000000000000000000741320027462700230450ustar00rootroot00000000000000ÀÁÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÚÛÜÝÞßàáãäåæçèéêëìíîïðñòóôõö÷øúûüýþÿhashcat-4.0.1/charsets/standard/Bulgarian/bg_cp1251.hcchr000066400000000000000000000000751320027462700230500ustar00rootroot00000000000000ˆÀÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÜÝÞßàâãäåæçèéêëìíîïðñòóôõö÷øùúüýþÿhashcat-4.0.1/charsets/standard/Castilian/000077500000000000000000000000001320027462700204555ustar00rootroot00000000000000hashcat-4.0.1/charsets/standard/Castilian/es-ES_ISO-8859-1.hcchr000066400000000000000000000000201320027462700236550ustar00rootroot00000000000000¡¿ÁÉÍÑÓÚÜáéíñóúühashcat-4.0.1/charsets/standard/Castilian/es-ES_ISO-8859-15.hcchr000066400000000000000000000000211320027462700237430ustar00rootroot00000000000000¡¤¿ÁÉÍÑÓÚÜáéíñóúühashcat-4.0.1/charsets/standard/Castilian/es-ES_cp1252.hcchr000066400000000000000000000000211320027462700233670ustar00rootroot00000000000000€¡¿ÁÉÍÑÓÚÜáéíñóúühashcat-4.0.1/charsets/standard/Catalan/000077500000000000000000000000001320027462700201115ustar00rootroot00000000000000hashcat-4.0.1/charsets/standard/Catalan/ca_ISO-8859-1.hcchr000066400000000000000000000000261320027462700227660ustar00rootroot00000000000000¡¿ÀÇÈÉÍÏÒÓÚÜàçèéíïòóúühashcat-4.0.1/charsets/standard/Catalan/ca_ISO-8859-15.hcchr000066400000000000000000000000271320027462700230540ustar00rootroot00000000000000¡¤¿ÀÇÈÉÍÏÒÓÚÜàçèéíïòóúühashcat-4.0.1/charsets/standard/Catalan/ca_cp1252.hcchr000066400000000000000000000000271320027462700225000ustar00rootroot00000000000000€¡¿ÀÇÈÉÍÏÒÓÚÜàçèéíïòóúühashcat-4.0.1/charsets/standard/English/000077500000000000000000000000001320027462700201375ustar00rootroot00000000000000hashcat-4.0.1/charsets/standard/English/en_ISO-8859-1.hcchr000066400000000000000000000000011320027462700230240ustar00rootroot00000000000000£hashcat-4.0.1/charsets/standard/English/en_ISO-8859-15.hcchr000066400000000000000000000000021320027462700231120ustar00rootroot00000000000000£¤hashcat-4.0.1/charsets/standard/English/en_cp1252.hcchr000066400000000000000000000000021320027462700225360ustar00rootroot00000000000000€£hashcat-4.0.1/charsets/standard/French/000077500000000000000000000000001320027462700177535ustar00rootroot00000000000000hashcat-4.0.1/charsets/standard/French/fr_ISO-8859-1.hcchr000066400000000000000000000000371320027462700226560ustar00rootroot00000000000000¡¿ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿhashcat-4.0.1/charsets/standard/French/fr_ISO-8859-15.hcchr000066400000000000000000000000431320027462700227400ustar00rootroot00000000000000¡¤¼½¾¿ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿhashcat-4.0.1/charsets/standard/French/fr_ISO-8859-16.hcchr000066400000000000000000000000411320027462700227370ustar00rootroot00000000000000¤¼½¾ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿhashcat-4.0.1/charsets/standard/French/fr_cp1252.hcchr000066400000000000000000000000431320027462700223640ustar00rootroot00000000000000€ŒœŸ¡¿ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿhashcat-4.0.1/charsets/standard/German/000077500000000000000000000000001320027462700177575ustar00rootroot00000000000000hashcat-4.0.1/charsets/standard/German/de_ISO-8859-1.hcchr000066400000000000000000000000071320027462700226400ustar00rootroot00000000000000ÄÖÜßäöühashcat-4.0.1/charsets/standard/German/de_ISO-8859-15.hcchr000066400000000000000000000000101320027462700227170ustar00rootroot00000000000000¤ÄÖÜßäöühashcat-4.0.1/charsets/standard/German/de_cp1252.hcchr000066400000000000000000000000101320027462700223430ustar00rootroot00000000000000€ÄÖÜßäöühashcat-4.0.1/charsets/standard/Greek/000077500000000000000000000000001320027462700176035ustar00rootroot00000000000000hashcat-4.0.1/charsets/standard/Greek/el_ISO-8859-7.hcchr000066400000000000000000000000621320027462700225030ustar00rootroot00000000000000¤ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖרÙáâãäåæçèéêëìíîïðñòóôõö÷øùhashcat-4.0.1/charsets/standard/Greek/el_cp1253.hcchr000066400000000000000000000000621320027462700222070ustar00rootroot00000000000000€ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖרÙáâãäåæçèéêëìíîïðñòóôõö÷øùhashcat-4.0.1/charsets/standard/GreekPolytonic/000077500000000000000000000000001320027462700215045ustar00rootroot00000000000000hashcat-4.0.1/charsets/standard/GreekPolytonic/el_polytonic_ISO-8859-7.hcchr000066400000000000000000000001061320027462700265030ustar00rootroot00000000000000¤¶¸¹º¼¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþhashcat-4.0.1/charsets/standard/GreekPolytonic/el_polytonic_cp1253.hcchr000066400000000000000000000001061320027462700262070ustar00rootroot00000000000000€¢¸¹º¼¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþhashcat-4.0.1/charsets/standard/Hungarian/000077500000000000000000000000001320027462700204625ustar00rootroot00000000000000hashcat-4.0.1/charsets/standard/Hungarian/hu_cp1250.hcchr000066400000000000000000000000221320027462700230730ustar00rootroot00000000000000ÁÉÍÓÕÖÚÛÜáéíóõöúûühashcat-4.0.1/charsets/standard/Italian/000077500000000000000000000000001320027462700201275ustar00rootroot00000000000000hashcat-4.0.1/charsets/standard/Italian/it_ISO-8859-1.hcchr000066400000000000000000000000241320027462700230330ustar00rootroot00000000000000ÀÈÉÌÍÎÒÓÙÚàèéìíîòóùúhashcat-4.0.1/charsets/standard/Italian/it_ISO-8859-15.hcchr000066400000000000000000000000251320027462700231210ustar00rootroot00000000000000¤ÀÈÉÌÍÎÒÓÙÚàèéìíîòóùúhashcat-4.0.1/charsets/standard/Italian/it_cp1252.hcchr000066400000000000000000000000251320027462700225450ustar00rootroot00000000000000€ÀÈÉÌÍÎÒÓÙÚàèéìíîòóùúhashcat-4.0.1/charsets/standard/Lithuanian/000077500000000000000000000000001320027462700206425ustar00rootroot00000000000000hashcat-4.0.1/charsets/standard/Lithuanian/lt_ISO-8859-13.hcchr000066400000000000000000000000221320027462700236320ustar00rootroot00000000000000ÀÁÆÈËÐØÛÞàáæèëðøûþhashcat-4.0.1/charsets/standard/Lithuanian/lt_ISO-8859-4.hcchr000066400000000000000000000000221320027462700235520ustar00rootroot00000000000000¡©®±¹¾ÇÈÊÌÙÞçèêìùþhashcat-4.0.1/charsets/standard/Lithuanian/lt_cp1257.hcchr000066400000000000000000000000231320027462700232660ustar00rootroot00000000000000€ÀÁÆÈËÐØÛÞàáæèëðøûþhashcat-4.0.1/charsets/standard/Polish/000077500000000000000000000000001320027462700200045ustar00rootroot00000000000000hashcat-4.0.1/charsets/standard/Polish/pl_ISO-8859-2.hcchr000066400000000000000000000000221320027462700227060ustar00rootroot00000000000000¡£¦¬¯±³¶¼¿ÆÊÑÓæêñóhashcat-4.0.1/charsets/standard/Polish/pl_cp1250.hcchr000066400000000000000000000000221320027462700224140ustar00rootroot00000000000000ŒœŸ£¥¯³¹¿ÆÊÑÓæêñóhashcat-4.0.1/charsets/standard/Portuguese/000077500000000000000000000000001320027462700207105ustar00rootroot00000000000000hashcat-4.0.1/charsets/standard/Portuguese/pt_ISO-8859-1.hcchr000066400000000000000000000000321320027462700236220ustar00rootroot00000000000000ÀÁÂÃÇÉÊÍÓÔÕÚÜàáâãçéêíóôõúühashcat-4.0.1/charsets/standard/Portuguese/pt_ISO-8859-15.hcchr000066400000000000000000000000331320027462700237100ustar00rootroot00000000000000¤ÀÁÂÃÇÉÊÍÓÔÕÚÜàáâãçéêíóôõúühashcat-4.0.1/charsets/standard/Portuguese/pt_cp1252.hcchr000066400000000000000000000000331320027462700233340ustar00rootroot00000000000000€ÀÁÂÃÇÉÊÍÓÔÕÚÜàáâãçéêíóôõúühashcat-4.0.1/charsets/standard/Russian/000077500000000000000000000000001320027462700201725ustar00rootroot00000000000000hashcat-4.0.1/charsets/standard/Russian/ru_ISO-8859-5.hcchr000066400000000000000000000001031320027462700231120ustar00rootroot00000000000000¡°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñhashcat-4.0.1/charsets/standard/Russian/ru_KOI8-R.hcchr000066400000000000000000000001021320027462700226130ustar00rootroot00000000000000£³ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿhashcat-4.0.1/charsets/standard/Russian/ru_cp1251.hcchr000066400000000000000000000001031320027462700226160ustar00rootroot00000000000000¨¸¹ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿhashcat-4.0.1/charsets/standard/Slovak/000077500000000000000000000000001320027462700200055ustar00rootroot00000000000000hashcat-4.0.1/charsets/standard/Slovak/sk_ISO-8859-2.hcchr000066400000000000000000000000421320027462700227130ustar00rootroot00000000000000¥©«®µ¹»¾ÀÁÄÅÈÉÍÏÒÓÔÚÝàáäåèéíïòóôúýhashcat-4.0.1/charsets/standard/Slovak/sk_cp1250.hcchr000066400000000000000000000000431320027462700224220ustar00rootroot00000000000000€ŠŽšž¼¾ÀÁÄÅÈÉÍÏÒÓÔÚÝàáäåèéíïòóôúýhashcat-4.0.1/charsets/standard/Spanish/000077500000000000000000000000001320027462700201535ustar00rootroot00000000000000hashcat-4.0.1/charsets/standard/Spanish/es_ISO-8859-1.hcchr000066400000000000000000000000321320027462700230510ustar00rootroot00000000000000¡¿ÀÁÇÈÉÍÏÑÒÓÚÜàáçèéíïñòóúühashcat-4.0.1/charsets/standard/Spanish/es_ISO-8859-15.hcchr000066400000000000000000000000331320027462700231370ustar00rootroot00000000000000¡¤¿ÀÁÇÈÉÍÏÑÒÓÚÜàáçèéíïñòóúühashcat-4.0.1/charsets/standard/Spanish/es_cp1252.hcchr000066400000000000000000000000331320027462700225630ustar00rootroot00000000000000€¡¿ÀÁÇÈÉÍÏÑÒÓÚÜàáçèéíïñòóúühashcat-4.0.1/deps/000077500000000000000000000000001320027462700140655ustar00rootroot00000000000000hashcat-4.0.1/deps/OpenCL-Headers/000077500000000000000000000000001320027462700165565ustar00rootroot00000000000000hashcat-4.0.1/deps/OpenCL-Headers/CL/000077500000000000000000000000001320027462700170545ustar00rootroot00000000000000hashcat-4.0.1/docs/000077500000000000000000000000001320027462700140625ustar00rootroot00000000000000hashcat-4.0.1/docs/changes.txt000066400000000000000000001316121320027462700162370ustar00rootroot00000000000000* changes v4.0.0 -> v4.0.1: ## ## Bugs ## - Fixed a memory leak while parsing a wordlist - Fixed compile of kernels on AMD systems on windows due to invalid detection of ROCm - Fixed compile of sources using clang under MSYS2 - Fixed overlapping memory segment copy in CPU rule engine if using a specific rule function - Fixed a parallel build problem when using the "install" Makefile target - Fixed the version number extraction for github releases which do not including the .git directory * changes v3.6.0 -> v4.0.0: ## ## Features ## - Added support to crack passwords and salts up to length 256 - Added option --optimized-kernel-enable to use faster kernels but limit the maximum supported password- and salt-length - Added self-test functionality to detect broken OpenCL runtimes on startup - Added option --self-test-disable to disable self-test functionality on startup - Added option --wordlist-autohex-disable to disable the automatical conversion of $HEX[] words from the word list - Added option --example-hashes to show an example hash for each hash-mode - Removed option --weak-hash-check (zero-length password check) to increase startup time, it also causes many Trap 6 error on macOS ## ## Algorithms ## - Added hash-mode 2500 = WPA/WPA2 (SHA256-AES-CMAC) - Added hash-mode 2501 = WPA/WPA2 PMK ## ## Bugs ## - Fixed a buffer overflow in mangle_dupechar_last function - Fixed a calculation error in get_power() leading to errors of type "BUG pw_add()!!" - Fixed a memory problem that occured when the OpenCL folder was not found and e.g. the shared and session folder were the same - Fixed a missing barrier() call in the RACF OpenCL kernel - Fixed a missing salt length value in benchmark mode for SIP - Fixed an integer overflow in hash buffer size calculation - Fixed an integer overflow in innerloop_step and innerloop_cnt variables - Fixed an integer overflow in masks not skipped when loaded from file - Fixed an invalid optimization code in kernel 7700 depending on the input hash, causing the kernel to loop forever - Fixed an invalid progress value in status view if words from the base wordlist get rejected because of length - Fixed a parser error for mode -m 9820 = MS Office <= 2003 $3, SHA1 + RC4, collider #2 - Fixed a parser error in multiple modes not checking for return code, resulting in negative memory index writes - Fixed a problem with changed current working directory, for instance by using --restore together with --remove - Fixed a problem with the conversion to the $HEX[] format: convert/hexify also all passwords of the format $HEX[] - Fixed the calculation of device_name_chksum; should be done for each iteration - Fixed the dictstat lookup if nanoseconds are used in timestamps for the cached files - Fixed the estimated time value whenever the value is very large and overflows - Fixed the output of --show when used together with the collider modes -m 9710, 9810 or 10410 - Fixed the parsing of command line options. It doesn't show two times the same error about an invalid option anymore - Fixed the parsing of DCC2 hashes by allowing the "#" character within the user name - Fixed the parsing of descrypt hashes if the hashes do have non-standard characters within the salt - Fixed the use of --veracrypt-pim option. It was completely ignored without showing an error - Fixed the version number used in the restore file header ## ## Improvements ## - Autotune: Do a pre-autotune test run to find out if kernel runtime is above some TDR limit - Charset: Add additional DES charsets with corrected parity - OpenCL Buffers: Do not allocate memory for amplifiers for fast hashes, it's simply not needed - OpenCL Kernels: Improved performance of SHA-3 Kernel (keccak) by hardcoding the 0x80 stopbit - OpenCL Kernels: Improved rule engine performance by 6% on for NVidia - OpenCL Kernels: Move from ld.global.v4.u32 to ld.const.v4.u32 in _a3 kernels - OpenCL Kernels: Replace bitwise swaps with rotate() versions for AMD - OpenCL Kernels: Rewritten Keccak kernel to run fully on registers and partially reversed last round - OpenCL Kernels: Rewritten SIP kernel from scratch - OpenCL Kernels: Thread-count is set to hardware native count except if -w 4 is used then OpenCL maximum is used - OpenCL Kernels: Updated default scrypt TMTO to be ideal for latest NVidia and AMD top models - OpenCL Kernels: Vectorized tons of slow kernels to improve CPU cracking speed - OpenCL Runtime: Improved detection for AMD and NV devices on macOS - OpenCL Runtime: Improved performance on Intel MIC devices (Xeon PHI) on runtime level (300MH/s to 2000MH/s) - OpenCL Runtime: Updated AMD ROCm driver version check, warn if version < 1.1 - Show cracks: Improved the performance of --show/--left if used together with --username - Startup: Add visual indicator of active options when benchmarking - Startup: Check and abort session if outfile and wordlist point to the same file - Startup: Show some attack-specific optimizer constraints on start, eg: minimum and maximum support password- and salt-length - WPA cracking: Improved nonce-error-corrections mode to use a both positive and negative corrections ## ## Technical ## - General: Update C standard from c99 to gnu99 - Hash Parser: Improved salt-length checks for generic hash modes - HCdict File: Renamed file from hashcat.hcdict to hashcat.hcdict2 and add header because versions are incompatible - HCstat File: Add code to read LZMA compressed hashcat.hcstat2 - HCstat File: Add hcstat2 support to enable masks of length up to 256, also adds a filetype header - HCstat File: Renamed file from hashcat.hcstat to hashcat.hcstat2 and add header because versions are incompatible - HCtune File: Remove apple related GPU entries to workaround Trap 6 error - OpenCL Kernels: Added code generator for most of the switch_* functions and replaced existing code - OpenCL Kernels: Declared all include functions as static to reduce binary kernel cache size - OpenCL Kernels: On AMD GPU, optimized kernels for use with AMD ROCm driver - OpenCL Kernels: Removed some include functions that are no longer needed to reduce compile time - OpenCL Runtime: Fall back to 64 threads default (from 256) on AMD GPU to prevent creating too many workitems - OpenCL Runtime: Forcing OpenCL 1.2 no longer needed. Option removed from build options - OpenCL Runtime: On AMD GPU, recommend AMD ROCm driver for Linux - Restore: Fixed the version number used in the restore file header - Time: added new type for time measurements hc_time_t and related functions to force the use of 64 bit times * changes v3.5.0 -> v3.6.0: ## ## Algorithms ## - Added hash-mode 600 = BLAKE2-512 - Added hash-mode 15200 = Blockchain, My Wallet, V2 - Added hash-mode 15300 = DPAPI masterkey file v1 and v2 - Added hash-mode 15400 = ChaCha20 - Added hash-mode 15500 = JKS Java Key Store Private Keys (SHA1) - Added hash-mode 15600 = Ethereum Wallet, PBKDF2-HMAC-SHA256 - Added hash-mode 15700 = Ethereum Wallet, PBKDF2-SCRYPT ## ## Features ## - 7-Zip cracking: increased max. data length to 320k and removed AES padding attack to avoid false negatives - Dictionary cache: Show time spent on dictionary cache building at startup - Rules: Support added for position 'p' (Nth instance of a character) in host mode (using -j or -k) - Rules: Support added for rejection rule '_N' (reject plains of length not equal to N) in host mode - Rules: Support added for rule 'eX' - Wordlist encoding: Added parameters --encoding-from and --encoding-to to configure wordlist encoding handling - Wordlist encoding: Support added for internal conversion between user-defined encodings during runtime ## ## Workarounds ## - Workaround added for NVIDIA NVML library: If libnvidia-ml.so couldn't be loaded, try again using libnvidia-ml.so.1 ## ## Improvements ## - WPA cracking: Improved nonce-error-corrections mode to fix corrupt nonces generated on big-endian devices ## ## Bugs ## - Fixed a condition that caused hybrid attacks using a maskfile to not select all wordlists from a wordlist folder - Fixed a memory leak that was present when a user periodically prints hashcat status (using --status-timer) - Fixed a missing type specifier in a function declaration of the RACF kernel ## ## Technical ## - Building: In the binary release packages, link libiconv static for Windows binaries - Dictstat: Structure for dictstat file changed to include --encoding-from and --encoding-to parameters - OpenCL Runtime: Updated AMDGPU-PRO driver version check, warn if version 17.10 (known to be broken) is detected - WPA cracking: Reduced --nonce-error-corrections default from 16 to 8 to compensate for speed drop caused by big-endian fixes * changes v3.40 -> v3.5.0: ## ## Features ## - WPA cracking: Added support for WPA/WPA2 handshake AP nonce automatic error correction - WPA cracking: Added parameter --nonce-error-corrections to configure range of error correction ## ## Algorithms ## - Added hash-mode 15100 = Juniper/NetBSD sha1crypt ## ## Improvements ## - Abbreviate long hashes to display the Hash.Target status line within 80 characters - Refactored internal use of esalt to sync with the number of digests instead of the number of salts - Refactored other output to display within 80 characters without wrapping ## ## Bugs ## - Fixed a hash validation error when trying to load Android FDE < 4.3 hashes - Fixed a problem where --keyspace combined with custom charsets incorrectly displayed an error message - Fixed a problem where --stdout combined with custom charsets incorrectly displayed an error message - Fixed a problem with parsing and displaying -m 7000 = Fortigate (FortiOS) hashes - Fixed a race condition after sessions finish, where the input-base was freed but accessed afterwards - Fixed a typo that resulted in the minimum password length not being correctly initialized - Fixed --outfile-format formats 11 through 15 to show the correct crack position - Fixed --remove to apply even when all hashes are either found in the potfile or detected in weak-hash checks ## ## Technical ## - Building: Added missing prototypes for atlassian_parse_hash function - Dictionary Cache: Split long status line into multiple lines to stay < 80 chars - Files: Detect and error when users try to use -r with a parameter which is not a file - HCCAPX Parser: Added support for a special bit (bit 8) of the message_pair that indicates if replay counters match - Parameter: Detect and error when users try to use an empty string (length 0) for parameters like --session= - Parameter: Detect and error when users try to use non-digit input when only digits are expected - Sessions: Improved string comparison in case user sets --session to "hashcat" - Status View: Add rejected counter to machine-readable output - Status View: Rename labels Input.Mode, Input.Base, ... to Guess.Mode, Guess.Base, ... - Status View: Added a visual indicator to the status screen when checkpoint quit has been requested - Versions: Changed version naming convention from x.yz to x.y.z * changes v3.30 -> v3.40: ## ## Features ## - Added support for loading hccapx files - Added support for filtering hccapx message pairs using --hccapx-message-pair - Added support for parsing 7-Zip hashes with LZMA/LZMA2 compression indicator set to a non-zero value - Added support for decompressing LZMA1/LZMA2 data for -m 11600 = 7-Zip to validate the CRC - Added support for automatic merge of LM halfes in case --show and --left is used - Added support for showing all user names with --show and --left if --username was specified - Added support for GPU temperature management on cygwin build ## ## Algorithms ## - Added hash-mode 1411 = SSHA-256(Base64), LDAP {SSHA256} - Added hash-mode 3910 = md5(md5($pass).md5($salt)) - Added hash-mode 4010 = md5($salt.md5($salt.$pass)) - Added hash-mode 4110 = md5($salt.md5($pass.$salt)) - Added hash-mode 4520 = sha1($salt.sha1($pass)) - Added hash-mode 4522 = PunBB - Added hash-mode 7000 = Fortigate (FortiOS) - Added hash-mode 12001 = Atlassian (PBKDF2-HMAC-SHA1) - Added hash-mode 14600 = LUKS - Added hash-mode 14700 = iTunes Backup < 10.0 - Added hash-mode 14800 = iTunes Backup >= 10.0 - Added hash-mode 14900 = Skip32 - Added hash-mode 15000 = FileZilla Server >= 0.9.55 ## ## Workarounds ## - Workaround added for AMDGPU-Pro OpenCL runtime: AES encrypt and decrypt Invertkey function was calculated wrong in certain cases - Workaround added for AMDGPU-Pro OpenCL runtime: RAR3 kernel require a volatile variable to work correctly - Workaround added for Apple OpenCL runtime: bcrypt kernel requires a volatile variable because of a compiler optimization bug - Workaround added for Apple OpenCL runtime: LUKS kernel requires some volatile variables because of a compiler optimization bug - Workaround added for Apple OpenCL runtime: TrueCrypt kernel requires some volatile variables because of a compiler optimization bug - Workaround added for NVidia OpenCL runtime: RACF kernel requires EBCDIC lookup to be done on shared memory ## ## Bugs ## - Fixed a problem within the Kerberos 5 TGS-REP (-m 13100) hash parser - Fixed clEnqueueNDRangeKernel(): CL_UNKNOWN_ERROR caused by an invalid work-item count during weak-hash-check - Fixed cracking of PeopleSoft Token (-m 13500) if salt length + password length is >= 128 byte - Fixed cracking of Plaintext (-m 99999) in case MD4 was used in a previous session - Fixed DEScrypt cracking in BF mode in case the hashlist contains more than 16 times the same salt - Fixed duplicate detection for WPA handshakes with the same ESSID - Fixed nvapi datatype definition for NvS32 and NvU32 - Fixed overflow in bcrypt kernel in expand_key() function - Fixed pointer to local variable outside scope in case -j or -k is used - Fixed pointer to local variable outside scope in case --markov-hcstat is not used - Fixed recursion in loopback handling when session was aborted by the user - Fixed rule 'O' (RULE_OP_MANGLE_OMIT) in host mode in case the offset + length parameter equals the length of the input word - Fixed rule 'i' (RULE_OP_MANGLE_INSERT) in host mode in case the offset parameter equals the length of the input word - Fixed string not null terminated inside workaround for checking drm driver path - Fixed string not null terminated while reading maskfiles - Fixed truncation of password after position 32 with the combinator attack - Fixed use of option --keyspace in combination with -m 2500 (WPA) - Fixed WPA/WPA2 cracking in case eapol frame is >= 248 byte ## ## Technical ## - Building: Add SHARED variable to Makefile to choose if hashcat is build as static or shared binary (using libhashcat.so/hashcat.dll) - Building: Removed compiler option -march=native as this created problems for maintainers on various distributions - Building: Removed the use of RPATH on linker level - Building: Replaced linking of CRT_glob.o with the use of int _dowildcard - Commandline: Do some checks related to custom-charset options if user specifies them - CPU Affinity: Fixed memory leak in case invalid cpu Id was specified - Dispatcher: Fixed several memory leaks in case an OpenCL error occurs - Events: Improved the maximum event message handling. event_log () will now also internally make sure that the message is properly terminated - File Locking: Improved error detection on file locks - File Reads: Fixed memory leak in case outfile or hashfile was not accessible - File Reads: Improved error detection on file reads, especially when getting the file stats - Files: Do several file and folder checks on startup rather than when they are actually used to avoid related error after eventual intense operations - Hardware Management: Bring back kernel exec timeout detection for NVidia on user request - Hardware Monitor: Fixed several memory leaks in case hash-file writing (caused by --remove) failed - Hardware Monitor: Fixed several memory leaks in case no hardware monitor sensor is found - Hardware Monitor: In case NVML initialization failed, do not try to initialiaze NVAPI or XNVCTRL because they both depend on NVML - Hash Parsing: Added additional bound checks for the SIP digest authentication (MD5) parser (-m 11400) - Hash Parsing: Make sure that all files are correctly closed whenever a hash file parsing error occurs - Helper: Added functions to check existence, type, read- and write-permissions and rewrite sources to use them instead of stat() - Keyfile handling: Make sure that the memory is cleanly freed whenever a VeraCrypt/TrueCrypt keyfile fails to load - Mask Checks: Added additional memory cleanups after parsing/verifying masks - Mask Checks: Added integer overflow detection for a keyspace of a mask provided by user - Mask Increment: Fixed memory leak in case mask_append() fails - OpenCL Device: Do a check on available constant memory size and abort if it's less than 64kB - OpenCL Device Management: Fixed several memory leaks in case initialization of an OpenCL device or platform failed - OpenCL Header: Updated CL_* errorcode to OpenCL 1.2 standard - OpenCL Kernel: Move kernel binary buffer from heap to stack memory - OpenCL Kernel: Refactored read_kernel_binary to load only a single kernel for a single device - OpenCL Kernel: Remove "static" keyword from function declarations; Causes older Intel OpenCL runtimes to fail compiling - OpenCL Kernel: Renumbered hash-mode 7600 to 4521 - OpenCL Runtime: Added a warning about using Mesa OpenCL runtime - OpenCL Runtime: Updated AMDGPU-Pro driver version check, do warn if version 16.60 is detected which is known to be broken - Outfile Check: Fixed a memory leak for failed outfile reads - Restore: Add some checks on the rd->cwd variable in restore case - Rule Engine: Fixed several memory leaks in case loading of rules failed - Session Management: Automatically set dedicated session names for non-cracking parameters, for example: --stdout - Session Management: Fixed several memory leaks in case profile- or install-folder setup failed - Sessions: Move out handling of multiple instance from restore file into separate pidfile - Status screen: Do not try to clear prompt in --quiet mode - Tests: Fixed the timeout status code value and increased the runtime to 400 seconds - Threads: Restored strerror as %m is unsupported by the BSDs - Wordlists: Disable dictstat handling for hash-mode 3000 as it virtually creates words in the wordlist which is not the case for other modes - Wordlists: Fixed memory leak in case access a file in a wordlist folder fails - WPA: Changed format for outfile and potfile from essid:mac1:mac2 to hash:mac_ap:mac_sta:essid - WPA: Changed format for outfile_check from essid:mac1:mac2 to hash * changes v3.20 -> v3.30: ## ## Features ## - Files: Use $HEX[...] in case the password includes the separater character, increases potfile reading performance - Files: If the user specifies a folder to scan for wordlists instead of directly a wordlist, then ignore the hidden files - Loopback: Include passwords for removed hashes present in the potfile to next loopback iteration - New option --progress-only: Quickly provides ideal progress step size and time to process on the user hashes and selected options, then quit - Status screen: Reenabled automatic status screen display in case of stdin used - Truecrypt/Veracrypt: Use CRC32 to verify headers instead of fuzzy logic, greatly reduces false positives from 18:2^48 to 3:2^64 - WPA cracking: Reuse PBKDF2 intermediate keys if duplicate essid is detected ## ## Algorithms ## - Added hash-mode 1300 = SHA-224 ## ## Bugs ## - Fixed buffer overflow in status screen display in case of long non-utf8 string - Fixed buffer overflow in plaintext parsing code: Leading to segfault - Fixed custom char parsing code in maskfiles in --increment mode: Custom charset wasn't used - Fixed display screen to show input queue when using custom charset or rules - Fixed double fclose() using AMDGPU-Pro on sysfs compatible platform: Leading to segfault - Fixed hash-mode 11400 = SIP digest authentication (MD5): Cracking of hashes which did not include *auth* or *auth-int* was broken - Fixed hex output of plaintext in case --outfile-format 4, 5, 6 or 7 was used - Fixed infinite loop when using --loopback in case all hashes have been cracked - Fixed kernel loops in --increment mode leading to slower performance - Fixed mask length check in hybrid attack-modes: Do not include hash-mode dependant mask length checks - Fixed parsing of hashes in case the last line did not include a linefeed character - Fixed potfile loading to accept blank passwords - Fixed runtime limit: No longer required so sample startup time after refactorization ## ## Workarounds ## - Workaround added for Intel OpenCL runtime: GPU support is broken, skip the device unless user forces to enable it ## ## Technical ## - Building: Added hashcat32.dll and hashcat64.dll makefile targets for building hashcat windows libraries - Building: Added production flag in Makefile to disable all the GCC compiler options needed only for development - Building: Removed access to readlink() on FreeBSD - Building: For CYGWIN prefer to use "opencl.dll" (installed by drivers) instead of optional "cygOpenCL-1.dll" - Events: Added new event EVENT_WEAK_HASH_ALL_CRACKED if all hashes have been cracked during weak hash check - Hardware management: Switched matching ADL device with OpenCL device by using PCI bus, device and function - Hardware management: Switched matching NvAPI device with OpenCL device by using PCI bus, device and function - Hardware management: Switched matching NVML device with OpenCL device by using PCI bus, device and function - Hardware management: Switched matching xnvctrl device with OpenCL device by using PCI bus, device and function - Hardware management: Removed *throttled* message from NVML as this created more confusion than it helped - Hash Parser: Improved error detection of invalid hex characters where hex character are expected - OpenCL Runtime: Updated AMDGPU-Pro driver version check, do warn if version 16.50 is detected which is known to be broken - OpenCL Runtime: Updated hashcat.hctune for Iris Pro GPU on macOS - Potfile: In v3.10 already, the default potfile suffix changed but the note about was missing. The "hashcat.pot" became "hashcat.potfile" - Potfile: Added old potfile detection, show warning message - Returncode: Added dedicated returncode (see docs/status_codes.txt) for shutdowns caused by --runtime and checkpoint keypress - Sanity: Added sanity check to disallow --speed-only in combination with -i - Sanity: Added sanity check to disallow --loopback in combination with --runtime - Threads: Replaced all calls to ctime() with ctime_r() to ensure thread safety - Threads: Replaced all calls to strerror() with %m printf() GNU extension to ensure thread safety * changes v3.10 -> v3.20: The hashcat core was completely refactored to be a MT-safe library (libhashcat). The goal was to help developers include hashcat into distributed clients or GUI frontends. The CLI (hashcat.bin or hashcat.exe) works as before but from a technical perspective it's a library frontend. ## ## Features ## - New option --speed-only: Quickly provides cracking speed per device based on the user hashes and selected options, then quit - New option --keep-guessing: Continue cracking hashes even after they have been cracked (to find collisions) - New option --restore-file-path: Manually override the path to the restore file (useful if we want all session files in the same folder) - New option --opencl-info: Show details about OpenCL compatible devices like an embedded clinfo tool (useful for bug reports) - Documents: Added colors for warnings (yellow) and errors (red) instead of WARNING: and ERROR: prefix - Documents: Added hints presented to the user about optimizing performance while hashcat is running - Hardware management: Support --gpu-temp-retain for AMDGPU-Pro driver - Hardware management: Support --powertune-enable for AMDGPU-Pro driver - Password candidates: Allow words of length > 31 in wordlists for -a 0 for some slow hashes if no rules are in use - Password candidates: Do not use $HEX[] if the password candidate is a valid UTF-8 string and print out as-is - Pause mode: Allow quit program also if in pause mode - Pause mode: Ignore runtime limit in pause mode - Status view: Show core-clock, memory-clock and execution time in benchmark-mode in case --machine-readable is activated - Status view: Show temperature, coreclock, memoryclock, fanspeed and pci-lanes for devices using AMDGPU-Pro driver - Status view: Show the current first and last password candidate test queued for execution per device (as in JtR) - Status view: Show the current position in the queue for both base and modifier (Example: Wordlist 2/5) - Markov statistics: Update hashcat.hcstat which is used as reference whenever the user defines a mask - Charsets: Added lowercase ascii hex (?h) and uppercase ascii hex (?H) as predefined charsets ## ## Algorithms ## - Added hash-mode 14000 = DES (PT = $salt, key = $pass) - Added hash-mode 14100 = 3DES (PT = $salt, key = $pass) - Added hash-mode 14400 = SHA1(CX) - Added hash-mode 99999 = Plaintext - Extended hash-mode 3200 = bcrypt: Accept signature $2b$ (February 2014) - Improved hash-mode 8300 = DNSSEC: Additional parsing error detection ## ## Bugs ## - Custom charset from file parsing code did not return an error if an error occured - Fix some clSetKernelArg() size error that caused slow modes to not work anymore in -a 1 mode - Hash-mode 11600 = (7-Zip): Depending on input hash a clEnqueueReadBuffer(): CL_INVALID_VALUE error occured - Hash-mode 22 = Juniper Netscreen/SSG (ScreenOS): Fix salt length for -m 22 in benchmark mode - Hash-Mode 5500 = NetNTLMv1 + ESS: Fix loading of NetNTLMv1 + SSP hash - Hash-mode 6000 = RipeMD160: Fix typo in array index number - If cracking a hash-mode using unicode passwords, length check of a mask was not taking into account - If cracking a large salted hashlist the wordlist reject code was too slow to handle it, leading to 0H/s - Null-pointer dereference in outfile-check shutdown code when using --outfile-check-dir, leading to segfault - On startup hashcat tried to access the folder defined in INSTALL_FOLDER, leading to segfault if that folder was not existing - Random rules generator code used invalid parameter for memory copy function (M), leading to use of invalid rule - Sanity check for --outfile-format was broken if used in combination with --show or --left ## ## Workarounds ## - Workaround added for AMDGPU-Pro OpenCL runtime: Failed to compile hash-mode 10700 = PDF 1.7 Level 8 - Workaround added for AMDGPU-Pro OpenCL runtime: Failed to compile hash-mode 1800 = sha512crypt - Workaround added for NVidia OpenCL runtime: Failed to compile hash-mode 6400 = AIX {ssha256} - Workaround added for NVidia OpenCL runtime: Failed to compile hash-mode 6800 = Lastpass + Lastpass sniffed - Workaround added for macOS OpenCL runtime: Failed to compile hash-mode 10420 = PDF 1.1 - 1.3 (Acrobat 2 - 4) - Workaround added for macOS OpenCL runtime: Failed to compile hash-mode 1100 = Domain Cached Credentials (DCC), MS Cache - Workaround added for macOS OpenCL runtime: Failed to compile hash-mode 13800 = Windows 8+ phone PIN/Password - Workaround added for pocl OpenCL runtime: Failed to compile hash-mode 5800 = Android PIN ## ## Performance ## - Improved performance for rule-based attacks for _very_ fast hashes like MD5 and NTLM by 30% or higher - Improved performance for DEScrypt on AMD, from 373MH/s to 525MH/s - Improved performance for raw DES-based algorithms (like LM) on AMD, from 1.6GH/s to 12.5GH/s - Improved performance for raw SHA256-based algorithms using meet-in-the-middle optimization, reduces 7/64 steps - Improved performance for SAP CODVN B (BCODE) and SAP CODVN F/G (PASSCODE) due to register handling optimization, gives 3% and 25% - Improved performance by reducing maximum number of allowed function calls per rule from 255 to 31 - Improved performance by update the selection when to use #pragma unroll depending on OpenCL runtime vendor - Full performance comparison sheet v3.10 vs. v3.20: https://docs.google.com/spreadsheets/d/1B1S_t1Z0KsqByH3pNkYUM-RCFMu860nlfSsYEqOoqco/edit#gid=1591672380 ## ## Technical ## - Autotune: Do not run any caching rounds in autotune in DEBUG mode if -n and -u are specified - Bash completion: Removed some v2.01 leftovers in the bash completion configuration - Benchmark: Do not control fan speed in benchmark mode - Benchmark: On macOS, some hash-modes can't compile because of macOS OpenCL runtime. Skip them and move on to the next - Building: Added Makefile target "main_shared", a small how-to-use libhashcat example - Building: Added many additional compiler warning flags in Makefile to improve static code error detection - Building: Added missing includes for FreeBSD - Building: Added some types for windows only in case _BASETSD_H was not set - Building: Changed Makefile to strip symbols in the linker instead of the compiler - Building: Defined NOMINMAX macro to prevent definition min and max macros in stdlib header files - Building: Enabled ASLR and DEP for Windows builds - Building: Fixed almost all errors reported by cppcheck and scan-build - Building: On macOS, move '-framework OpenCL' from CFLAGS to LDFLAGS - Building: On macOS, use clang as default compiler - Building: Support building on Msys2 environment - Building: Use .gitmodules to simplify the OpenCL header dependency handling process - Charsets: Added DES_full.charset - Data Types: Replaced all integer macros with enumerator types - Data Types: Replaced all integer variables with true bool variables in case they are used as a bool - Data Types: Replaced all string macros with static const char types - Data Types: Replaced all uint and uint32_t to u32 - Data Types: Replaced atoi() with atoll(). Eliminates sign conversion warnings - Documents: Added docs/credits.txt - Documents: Added docs/team.txt - Documents: Changed rules.txt to match v3.20 limitations - Error handling (file handling): Fixed a couple of filepointer leaks - Error handling (format strings): Fixed a few printf() formats, ex: use %u instead of %d for uint32_t - Error handling (memory allocation): Removed memory allocation checks, just print to stderr instead - Error handling (startup): Added some missing returncode checks to get_exec_path() - Fanspeed: Check both fanpolicy and fanspeed returncode and disable retain support if any of them fail - Fanspeed: Minimum fanspeed for retain support increased to 33%, same as NV uses as default on windows - Fanspeed: Reset PID controler settings to what they were initially - Fanspeed: Set fan speed to default on quit - File handling: Do a single write test (for files to be written later) directly on startup - File locking: Use same locking mechanism in potfile as in outfile - Hardware management: Fixed calling conventions for ADL, NvAPI and NVML on windows - Hardware management: Improved checking for successfull load of the NVML API - Hardware management: In case fanspeed can not be set, disable --gpu-temp-retain automatically - Hardware management: In case of initialization error show it only once to the user on startup - Hardware management: Refactored all code to return returncode (0 or -1) instead of data for more easy error handling - Hardware management: Refactored macros to real functions - Hardware management: Removed kernel exec timeout detection on NVIDIA, should no longer occur due to autotune - Hardware management: Replaced NVML registry functions macros with their ascii versions (Adds NVML support for XP) - Hashlist loading: Do not load data from hashfile if hashfile changed during runtime - Kernel cache: Fixed checksum building on oversized device version or driver version strings - Logging: Improved variable names in hashcat.log - Loopback: Refactored --loopback support completely, no longer a recursive function - Memory management: Fixed some memory leaks on shutdown - Memory management: Got rid of all global variables - Memory management: Got rid of local_free() and global_free(), no longer required - Memory management: Refactored all variables with HCBUFSIZ_LARGE size from stack to heap, macOS doesn't like that - OpenCL Headers: Select OpenCL headers tagged for OpenCL 1.2, since we use -cl-std=CL1.2 - OpenCL Kernels: Added const qualifier to variable declaration of matching global memory objects - OpenCL Kernels: Got rid of one global kernel_threads variable - OpenCL Kernels: Moved OpenCL requirement from v1.1 to v1.2 - OpenCL Kernels: Recognize reqd_work_group_size() values from OpenCL kernels and use them in the host if possible - OpenCL Kernels: Refactored common function append_0x01() - OpenCL Kernels: Refactored common function append_0x02() - OpenCL Kernels: Refactored common function append_0x80() - OpenCL Kernels: Refactored rule function append_block1() - OpenCL Kernels: Refactored rule function rule_op_mangle_delete_last() - OpenCL Kernels: Refactored rule function rule_op_mangle_dupechar_last() - OpenCL Kernels: Refactored rule function rule_op_mangle_rotate_left() - OpenCL Kernels: Refactored rule function rule_op_mangle_rotate_right() - OpenCL Kernels: Support mixed kernel thread count for mixed kernels in the same source file - OpenCL Kernels: Switch from clz() to ffz() for bitsliced algorithms - OpenCL Kernels: Using platform vendor name is better than using device vendor name for function detection - OpenCL Runtime: Updated AMDGPU-Pro and AMD Radeon driver version check - OpenCL Runtime: Updated Intel OpenCL runtime version check - OpenCL Runtime: Updated NVIDIA driver version check - Password candidates: The maximum word length in a wordlist is 31 not 32, because 0x80 will eventually be appended - Potfile: Base logic switched; Assuming the potfile is larger than the hashlist it's better to load hashlist instead of potfile entries - Potfile: In case all hashes were cracking using potfile abort and inform user - Restore: Automatically unlink restore file if all hashes have been cracked - Restore: Do not unlink restore file if restore is disabled - Rules: Refactored macros to real functions - Status: Added Input.Queue.Base and Input.Queue.Mod to help the user better understand this concept - Status: Do not wait for the progress mutex to read and store speed timer - Status: Do not show Recovered/Time when cracking < 1000 hashes - Status: Do not show Recovered/Time as floats but as integers to reduce over-information - Tests: Removed rules_test/ subproject: Would require total rewrite but not used in a long time - Threads: Replaced all calls to getpwuid() with getpwuid_r() to ensure thread safety - Threads: Replaced all calls to gmtime() with gmtime_r() to ensure thread safety - Threads: Replaced all calls to strtok() with strtok_r() to ensure thread safety - Wordlists: Use larger counter variable to handle larger wordlists (that is > 2^32 words) - X11: Detect missing coolbits and added some help text for the user how to fix it * changes v3.00 -> v3.10: ## ## Improvements ## - Added mask display to modes 3, 6, and 7. Allows the user to see the custom character set used during the run - Make Linux build POSIX compatible; Also allow it to actually compile on musl-libc systems - Add support to compile on FreeBSD - Make use of cl_context_properties[] to clCreateContext(), even if OpenCL specification allow the use of NULL, some runtimes fail without - The Time.Estimated attribute in status display should also show --runtime limit if user set it - Fix some strict aliasing rule violation on older compilers - Fix some variable initializers on older compilers - Replace DARWIN macro with compiler predefined macro __APPLE__ - Replace LINUX macro with compiler predefined macro __linux__ - Allow the use of enc_id == 0 in hash-mode 10600 and 10700 as it takes no part in the actual computation - Get rid of exit() calls in OpenCL wrapper library with the goal to have a better control which error can be ignored under special circumstances - Do not error and exit if an OpenCL platform has no devices, just print a warning and continue with the next platform - Workaround for OpenCL runtimes which do not accept -I parameter in the OpenCL kernel build options even if this is an OpenCL standard option - Workaround for OpenCL runtimes which do accept -I parameter in the OpenCL kernel build options, but do not allow quotes - Output cracked hashes on Windows using \r\n and not \n - Replace RegGetValue() with RegQueryValueEx() to enable Windows XP 32 bit compatibility - Slightly increased NVidias rule-processing performance by using generic instructions instead of byte_perm() - Add support for @ rule (RULE_OP_MANGLE_PURGECHAR) to use on GPU - Add support for --outfile (short -o) to be used together with --stdout - Skip periodic status output whenever --stdout is used together with stdin mode, but no outfile was specified - Show error message if --show is used together with --outfile-autohex-disable (this is currently not supported) - Show error message if --skip/--limit is used together with mask files or --increment - Workaround for NVidia OpenCL runtime bug causing -m 6223 to not crack any hashes even with the correct password candidate ## ## Bugs ## - Fixed a bug where CRAM MD5 checked salt length instead of hash length - Fixed a bug where hashcat is suppressing --machine-readable output in the final status update - Fixed a bug where hashcat did not check the return of realpath() and crashes uncontrolled if the path does not exist - Fixed a bug where hashcat crashes for accessing deallocated buffer if user spams "s" shortly before hashcat shuts down - Fixed a bug where hashcat crashes in case of a scrypt P setting > 1 - Fixed a bug where hashcat did not correctly use the newly cracked plains whenever --loopback or the induction folder was used - Fixed a bug where hashcat did not correctly remove hashes of type WPA/WPA2 even if present in potfile - Fixed a bug where hashcat reported an invalid password for a zero-length password in LM - Fixed a bug where hashcat did not take into account how long it takes to prepare a session when auto-aborting with --runtime is in use - Fixed a bug where some kernels used COMPARE_M_SIMD instead of COMPARE_S_SIMD in singlehash mode ## ## Algorithms ## - Added new hash-mode 13900 = OpenCart * changes v2.01 -> v3.00: This release markes the fusion of "hashcat" and "oclHashcat" into "hashcat". It combines all features of all hashcat projects in one project. ## ## Features ## - Support for Apple OpenCL runtime - Support for NVidia OpenCL runtime (replaces CUDA) - Support for Mesa (Gallium) OpenCL runtime - Support for pocl OpenCL runtime - Support for Khronos' OSS OpenCL reference implementation for building - Support to utilize OpenCL devices-types other than GPU, ex: CPU and FPGA - Support to utilize multiple different OpenCL platforms in parallel, ex: AMD + NV - Support to utilize multiple different OpenCL device-types in parallel, ex: GPU + CPU - Added option --opencl-platform to select a specific OpenCL platform - Added option --opencl-device-types select specific OpenCL device types - Added option --opencl-vector-width to override automatically selected vector-width size - Added makefile native compilation target - Added makefile install and uninstall targets - Added autotuning engine and user-configurable tuning database - Added current engine clock, current memory clock and pci-e lanes to the status display - Added support for --gpu-temp-retain for NVidia GPU, both Linux and Windows - Added execution timer of the running kernel to the status display - Added command prompt to quit at next restore checkpoint - Added human-readable error message for the OpenCL error codes - Added option --potfile-path to override potfile path - Added option --veracrypt-keyfile to set Keyfiles used, can be multiple - Added option --veracrypt-pim to set the VeraCrypt personal iterations multiplier - Added option --machine-readable for easier parsing of output - Added option --powertune-enable to work with NVidia devices as well, not just AMD - Added option --stdout to print candidates instead of trying to crack a hash ## ## Algorithms ## - Added new hash-mode 125 = ArubaOS - Added new hash-mode 12900 = Android FDE (Samsung DEK) - Added new hash-mode 13000 = RAR5 - Added new hash-mode 13100 = Kerberos 5 TGS-REP etype 23 - Added new hash-mode 13200 = AxCrypt - Added new hash-mode 13300 = AxCrypt in memory SHA1 - Added new hash-mode 13400 = Keepass 1 (AES/Twofish) and Keepass 2 (AES) - Added new hash-mode 13500 = PeopleSoft PS_TOKEN - Added new hash-mode 13600 = WinZip - Added new hash-mode 137** = VeraCrypt - Added new hash-mode 13800 = Windows 8+ phone PIN/Password ## ## Performance ## - Full Table: https://docs.google.com/spreadsheets/d/1B1S_t1Z0KsqByH3pNkYUM-RCFMu860nlfSsYEqOoqco/edit#gid=0 ## ## Improvements ## - Reordering of files to help integration into linux distributions ~/.hashcat etc - Use a profile directory to write temporary files (session, potfile etc.) - Workaround dependencies on AMD APP-SDK AMD ADL, NV CUDA-SDK, NV ForceWare, NVML and NVAPI; they are no longer required - Load external libraries dynamic at runtime instead of link them static at compile-time - Benchmark accuracy improved; Is now on par to: singlehash -a 3 -w 3 ?b?b?b?b?b?b?b - Benchmark no longer depends on a fixed time - Removed option --benchmark-mode, therefore support --workload-profile in benchmark-mode - Enabled support of --machine-readable in combination with --benchmark for automated benchmark processing - Replaced --status-automat entirely with --machine-readable to make it more consistent among benchmark and non-benchmark mode - Extended support from 14 to 255 functions calls per rule - Extended password length up to 32 for 7zip - Extended salt length up to 55 for raw hash types, eg: md5($pass.$salt) - Extended version information - Removed some duplicate rules in T0XlCv1, d3ad0ne and dive - Redesigned changes.txt layout - Redesigned --help menu layout ## ## Bugs ## - Fixed a bug in speed display: In some situation, especially with slow hashes or lots of salts, it showed a speed of 0H/s - Fixed a bug in restore handling: user immediately aborting after restart broke the restore file - Fixed a bug in line counter: conditional jump or move depends on an uninitialised value - Fixed a bug in rule-engine for NVidia devices: code for left- and right-shift were switched - Fixed a bug in dive.rule: rules were not updated after the function 'x' was renamed to 'O' - Fixed a bug in memory allocation "OpenCL -4 error": used unitialized value in a special situation - Fixed a bug in memory handling: heap buffer overflow - Fixed a bug in memory handling: out of bounds access - Fixed a bug in implementation of DCC2: forced default iteration count for hashes to 10240 - Fixed a bug in implementation of WPA/WPA2: MAC and nonce stay one their original position as in the hccap file - Fixed a bug in implementation of GOST R 34.11-94: zero length passwords were not cracked - Fixed a bug in implementation of BLAKE2-512 kernels: incorrect access of the esalt buffer ## ## Technical ## - Removed deprecated GCC version check requirement - Removed NPROCS from Makefile, let make automatically detect the optimal number of parallel threads - Dropped all C++ overloading functions to normal function which helps support more OpenCL platforms - Renamed functions in common.h to emphasize their purpose - Refactorized fast-hash kernels to enable SIMD on all OpenCL platforms - Refactorized SIMD handling: SIMD the inner-loop not the outer-loop to save registers - Workaround missing clEnqueueFillBuffer() support in certain OpenCL runtimes - Added amd_bytealign() support in non-AMD OpenCL runtimes - Added amd_bfe() support in non-AMD OpenCL runtimes - Added several macros to allow writing optimized code for the different OpenCL platforms - Replaced typedef for bool with stdbool.h - Added special DEBUG environment variables to the makefile - Hashcat now acquires an exclusive lock before writing to any file - Changed buffers to not use same buffer for both input and output at the same time with snprintf() - Check for allocatable device-memory depending on kernel_accel amplifier before trying to allocate - Added additional check for max. ESSID length to prevent possible crashes - Use a GCC equivalent for __stdcall where applicable - Synchronize maximum output line size with input line size - Increased maximum hash line size to 0x50000 - Run weak-hash checks only in straight-attack mode, this greatly reduces code complexity - Restrict loopback option to straight attack-mode - Moved rules_optimize to hashcat-utils - Stick to older libOpenCL in binary package to avoid errors like this: version `OPENCL_2.0' not found - Tightened hash parser for several algorithms - Updated old RC4 code in Kerberos 5 - Limited the salt length of Juniper Netscreen/SSG (ScreenOS) hashes to 10 - Updated algorithm used to automatically select an ideal --scrypt-tmto value - Renamed option --gpu-accel to --kernel-accel - Renamed option --gpu-loops to --kernel-loops - Renamed option --gpu-devices to --opencl-devices - Added inline declaration to functions from simd.c, common.c, rp.c and types_ocl.c to increase performance - Dropped static declaration from functions in all kernel to achieve OpenCL 1.1 compatibility - Added -cl-std=CL1.1 to all kernel build options - Created environment variable to inform NVidia OpenCL runtime to not create its own kernel cache - Created environment variable to inform pocl OpenCL runtime to not create its own kernel cache - Dropped special 64-bit rotate() handling for NV, it seems that they've added it to their OpenCL runtime - Completely get rid of HAVE_ADL, HAVE_NVML and HAVE_NVAPI in sources - Replaced NVAPI with NVML on windows hashcat-4.0.1/docs/contact.txt000066400000000000000000000000601320027462700162520ustar00rootroot00000000000000web: https://hashcat.net irc: freenode #hashcat hashcat-4.0.1/docs/credits.txt000066400000000000000000000037401320027462700162640ustar00rootroot00000000000000# hashcat and its predecessors has been developed and is maintained by: Jens "atom" Steube (@hashcat) # The following persons made code contributions to hashcat: Philipp "philsmd" Schmidt (@philsmd) * Multiple kernel modules * Hardware monitor maintenance * Test Suite maintenance * Makefile maintenance * Potfile feature * Maskfile feature * Induction directory feature * Loopback file feature * Userinput sanity checks Gabriele "matrix" Gristina (@gm4tr1x) * Apple macOS port * Hardware monitor initial code base * Test suite initial code base * Makefiles initial code base * Multithreading initial code base * Benchmarks initial code base * Offline OpenCL Kernel Compiler support Jean-Christophe "Fist0urs" Delaunay (@Fist0urs) * Kerberos TGS Rep enctype 23 kernel module * AxCrypt kernel module * KeePass kernel module * DPAPImk v1 and v2 kernel module Other contributors to hashcat * A full list and their commits can be found here: https://github.com/hashcat/hashcat/graphs/contributors # Furthermore the following persons helped the project: Martin "purehate" Bos (@cantcomputer) * For the first person presenting hashcat in his talks and tutorials to a larger audience * For pushing hashcat to Kali Jeremi "epixoip" Gosney (@thorsheim) * For running the "PasswordsCon" conference, first of its kind * For convincing me to speak publicly about my work Rick "Minga" Redman and KoreLogic (@CrackMeIfYouCan) * For running the "Crack Me If You Can" password cracking contest, first of its kind * For pushing password cracking techniques forward !!! All the package maintainer of hashcat !!! hashcat-4.0.1/docs/license.txt000066400000000000000000000020741320027462700162500ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2015-2017 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. hashcat-4.0.1/docs/performance.txt000066400000000000000000000003701320027462700171240ustar00rootroot00000000000000Performance Notes: ================== - Always Use the latest display driver - To significantly improve performance use -w 3 Also read this: https://hashcat.net/wiki/doku.php?id=frequently_asked_questions#how_to_create_more_work_for_full_speed hashcat-4.0.1/docs/readme.txt000066400000000000000000000130061320027462700160600ustar00rootroot00000000000000hashcat v4.0.1 ============== AMD GPUs on Linux require "RadeonOpenCompute (ROCm)" Software Platform (1.6.180 or later) AMD GPUs on Windows require "AMD Radeon Software Crimson Edition" (15.12 or later) Intel CPUs require "OpenCL Runtime for Intel Core and Intel Xeon Processors" (16.1.1 or later) Intel GPUs on Linux require "OpenCL 2.0 GPU Driver Package for Linux" (2.0 or later) Intel GPUs on Windows require "OpenCL Driver for Intel Iris and Intel HD Graphics" NVIDIA GPUs require "NVIDIA Driver" (367.x or later) ## ## Features ## - World's fastest password cracker - World's first and only in-kernel rule engine - Free - Open-Source (MIT License) - Multi-OS (Linux, Windows and macOS) - Multi-Platform (CPU, GPU, DSP, FPGA, etc., everything that comes with an OpenCL runtime) - Multi-Hash (Cracking multiple hashes at the same time) - Multi-Devices (Utilizing multiple devices in same system) - Multi-Device-Types (Utilizing mixed device types in same system) - Supports distributed cracking networks (using overlay) - Supports interactive pause / resume - Supports sessions - Supports restore - Supports reading password candidates from file and stdin - Supports hex-salt and hex-charset - Supports automatic performance tuning - Supports automatic keyspace ordering markov-chains - Built-in benchmarking system - Integrated thermal watchdog - 200+ Hash-types implemented with performance in mind ## ## Hash-Types ## - MD4 - MD5 - Half MD5 (left, mid, right) - SHA1 - SHA-224 - SHA-256 - SHA-384 - SHA-512 - SHA-3 (Keccak) - BLAKE2b-512 - SipHash - Skip32 - RIPEMD-160 - Whirlpool - DES (PT = $salt, key = $pass) - 3DES (PT = $salt, key = $pass) - ChaCha20 - GOST R 34.11-94 - GOST R 34.11-2012 (Streebog) 256-bit - GOST R 34.11-2012 (Streebog) 512-bit - md5($pass.$salt) - md5($salt.$pass) - md5(unicode($pass).$salt) - md5($salt.unicode($pass)) - md5($salt.$pass.$salt) - md5($salt.md5($pass)) - md5($salt.md5($salt.$pass)) - md5($salt.md5($pass.$salt)) - md5(md5($pass)) - md5(md5($pass).md5($salt)) - md5(strtoupper(md5($pass))) - md5(sha1($pass)) - sha1($pass.$salt) - sha1($salt.$pass) - sha1(unicode($pass).$salt) - sha1($salt.unicode($pass)) - sha1(sha1($pass)) - sha1($salt.sha1($pass)) - sha1(md5($pass)) - sha1($salt.$pass.$salt) - sha1(CX) - 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 (Simple Machines Forum) - vBulletin - IPB (Invision Power Board) - WBB (Woltlab Burning Board) - osCommerce - xt:Commerce - PrestaShop - MediaWiki B type - WordPress - Drupal 7 - 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 CRAM (SHA1) - PostgreSQL CRAM (MD5) - SIP digest authentication (MD5) - WPA/WPA2 - WPA/WPA2 PMK - NetNTLMv1 - NetNTLMv1+ESS - NetNTLMv2 - Kerberos 5 AS-REQ Pre-Auth etype 23 - Kerberos 5 TGS-REP etype 23 - Netscape LDAP SHA/SSHA - FileZilla Server - LM - NTLM - Domain Cached Credentials (DCC), MS Cache - Domain Cached Credentials 2 (DCC2), MS Cache 2 - DPAPI masterkey file v1 and v2 - MS-AzureSync PBKDF2-HMAC-SHA256 - descrypt - bsdicrypt - md5crypt - sha256crypt - sha512crypt - bcrypt - scrypt - macOS v10.4 - macOS v10.5 - macOS v10.6 - macOS v10.7 - macOS v10.8 - macOS v10.9 - macOS v10.10 - iTunes backup < 10.0 - iTunes backup >= 10.0 - AIX {smd5} - AIX {ssha1} - AIX {ssha256} - AIX {ssha512} - Cisco-ASA MD5 - Cisco-PIX MD5 - Cisco-IOS $1$ (MD5) - Cisco-IOS type 4 (SHA256) - Cisco $8$ (PBKDF2-SHA256) - Cisco $9$ (scrypt) - Juniper IVE - Juniper NetScreen/SSG (ScreenOS) - Juniper/NetBSD sha1crypt - Fortigate (FortiOS) - Samsung Android Password/PIN - Windows Phone 8+ PIN/password - GRUB 2 - CRC32 - RACF - Radmin2 - Redmine - PunBB - OpenCart - Atlassian (PBKDF2-HMAC-SHA1) - Citrix NetScaler - SAP CODVN B (BCODE) - SAP CODVN F/G (PASSCODE) - SAP CODVN H (PWDSALTEDHASH) iSSHA-1 - PeopleSoft - PeopleSoft PS_TOKEN - Skype - WinZip - 7-Zip - RAR3-hp - RAR5 - AxCrypt - AxCrypt in-memory SHA1 - 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 - Blockchain, My Wallet, V2 - 1Password, agilekeychain - 1Password, cloudkeychain - LastPass - Password Safe v2 - Password Safe v3 - KeePass 1 (AES/Twofish) and KeePass 2 (AES) - JKS Java Key Store Private Keys (SHA1) - Ethereum Wallet, PBKDF2-HMAC-SHA256 - Ethereum Wallet, SCRYPT - eCryptfs - Android FDE <= 4.3 - Android FDE (Samsung DEK) - TrueCrypt - VeraCrypt - LUKS - Plaintext ## ## Attack-Modes ## - Straight * - Combination - Brute-force - Hybrid dict + mask - Hybrid mask + dict * = Supports rules ## ## Supported OpenCL runtimes ## - AMD - Apple - Intel - Mesa (Gallium) - NVidia - pocl ## ## Supported OpenCL device types ## - GPU - CPU - APU - DSP - FPGA - Coprocessor hashcat-4.0.1/docs/rules.txt000066400000000000000000000115201320027462700157540ustar00rootroot00000000000000#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_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 #define RULE_OP_MANGLE_TITLE_SEP 'e' // lowercase everything then upper case the first letter and every letter after char X /* With -j or -k only */ #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_EQUAL '_' // reject plains of length not equal to 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 #define RULE_LAST_REJECTED_SAVED_POS 'p' // position of the character last found with '/' or '%' hashcat-4.0.1/docs/status_codes.txt000066400000000000000000000002571320027462700173270ustar00rootroot00000000000000status codes on exit: ===================== -2 = gpu-watchdog alarm -1 = error 0 = OK/cracked 1 = exhausted 2 = aborted 3 = aborted by checkpoint 4 = aborted by runtime hashcat-4.0.1/docs/team.txt000066400000000000000000000047031320027462700155550ustar00rootroot00000000000000# Team hashcat: We're a group of people participating in the yearly repeating password cracking contests * Achievements | Competition | Conference | Year | Placed | |---------------------|----------------------------|------|--------| | Crack Me If You Can | DEF CON, Las Vegas | 2010 | 1st | | Crack Me If You Can | DEF CON, Las Vegas | 2011 | 2nd | | Crack Me If You Can | DEF CON, Las Vegas | 2012 | 1st | | Crack Me If You Can | DEF CON, Las Vegas | 2013 | 2nd | | Crack Me If You Can | DEF CON, Las Vegas | 2014 | 1st | | Crack Me If You Can | DEF CON, Las Vegas | 2015 | 1st | | Crack Me If You Can | DerbyCon, Louisville | 2017 | 1st | | Competition | Conference | Year | Placed | |---------------------|----------------------------|------|--------| | Hash Runner | Positive Hack Days, Moscow | 2012 | 1st | | Hash Runner | Positive Hack Days, Moscow | 2013 | 2nd | | Hash Runner | Positive Hack Days, Moscow | 2014 | 2nd | | Hash Runner | Positive Hack Days, Moscow | 2015 | 1st | | Competition | Conference | Year | Placed | |---------------------|----------------------------|------|--------| | Hashkiller | - | 2012 | 1st | | Hashkiller | - | 2016 | 2nd | | Competition | Conference | Year | Placed | |---------------------|----------------------------|------|--------| | PCrack | SAINTCON, Utah | 2017 | 1st | * Special recognition for team hashcat goes to: Christoph "dropdead" Heuwieser (@dropdeadfu): Lead and organizing Xanadrel (@Xanadrel): Developing LC, the "Team hashcat" hash management tool * Active and former member abaco alotdv atom blandyuk blaz BlowCane chancas Chick3nman coolbry95 dakykilla deutsch dropdead epixoip EvilMog franky gpufreak hashtka Hydraze J0hnnyBrav0 K9 kontrast23 legion m3g9tr0n matrix minga N|IGHT5 NSAKEY NullMode philsmd purehate radix Rolf rurapenthe s3in!c SuperJames Szul tehnlulz The_Mechanic T0XlC TychoTithonus undeath unix-ninja Xanadrel xmisery hashcat-4.0.1/docs/user_manuals.txt000066400000000000000000000002741320027462700173240ustar00rootroot00000000000000The 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 hashcat-4.0.1/example.dict000066400000000000000000040756601320027462700154540ustar00rootroot000000000000000 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 hashcat-4.0.1/example0.cmd000066400000000000000000000001031320027462700153240ustar00rootroot00000000000000hashcat64.exe -t 32 -a 7 example0.hash ?a?a?a?a example.dict pause hashcat-4.0.1/example0.hash000066400000000000000000006424361320027462700155310ustar00rootroot00000000000000000405dbc07c3b595fc87031af6f9879 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 hashcat-4.0.1/example0.sh000077500000000000000000000000711320027462700152020ustar00rootroot00000000000000./hashcat -t 32 -a 7 example0.hash ?a?a?a?a example.dict hashcat-4.0.1/example400.cmd000066400000000000000000000000771320027462700155020ustar00rootroot00000000000000type example.dict | hashcat64.exe -m 400 example400.hash pause hashcat-4.0.1/example400.hash000066400000000000000000000000431320027462700156530ustar00rootroot00000000000000$H$9y5boZ2wsUlgl2tI6b5PrRoADzYfXD1 hashcat-4.0.1/example400.sh000077500000000000000000000000641320027462700153500ustar00rootroot00000000000000cat example.dict | ./hashcat -m 400 example400.hash hashcat-4.0.1/example500.cmd000066400000000000000000000000701320027462700154740ustar00rootroot00000000000000hashcat64.exe -m 500 example500.hash example.dict pause hashcat-4.0.1/example500.hash000066400000000000000000000000431320027462700156540ustar00rootroot00000000000000$1$uOM6WNc4$r3ZGeSB11q6UUSILqek3J1 hashcat-4.0.1/example500.sh000077500000000000000000000000561320027462700153520ustar00rootroot00000000000000./hashcat -m 500 example500.hash example.dict hashcat-4.0.1/extra/000077500000000000000000000000001320027462700142555ustar00rootroot00000000000000hashcat-4.0.1/extra/tab_completion/000077500000000000000000000000001320027462700172545ustar00rootroot00000000000000hashcat-4.0.1/extra/tab_completion/hashcat.sh000066400000000000000000000534251320027462700212340ustar00rootroot00000000000000## ## Author......: See docs/credits.txt ## License.....: MIT ## HASHCAT_ROOT="." # helper functions _hashcat_get_permutations () { local num_devices=${1} hashcat_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 hashcat_devices_permutation=$(seq 1 $num_devices) local k for k in $(seq 2 $num_devices); do if [ "${k}" -eq ${num_devices} ];then hashcat_devices_permutation="${hashcat_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 hashcat_devices_permutation="${hashcat_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 } _hashcat_opencl_devices () { local num_devices=0 if which clinfo &> /dev/null; then num_devices=$(clinfo 2>/dev/null 2> /dev/null) elif which nvidia-smi &> /dev/null; then num_devices=$(nvidia-smi --list-gpus | wc -l) fi return ${num_devices} } _hashcat_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} } _hashcat_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 } _hashcat () { local VERSION=4.0.1 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 200 300 400 500 501 600 900 1000 1100 1400 1410 1411 1420 1421 1430 1440 1441 1450 1460 1500 1600 1700 1710 1711 1720 1722 1730 1731 1740 1750 1760 1800 2100 2400 2410 2500 2501 2600 2611 2612 2711 2811 3000 3100 3200 3710 3711 3800 3910 4010 4110 4300 4400 4500 4520 4521 4522 4700 4800 4900 5000 5100 5200 5300 5400 5500 5600 5700 5800 6000 6100 6211 6212 6213 6221 6222 6223 6231 6232 6233 6241 6242 6243 6300 6400 6500 6600 6700 6800 6900 7000 7100 7200 7300 7400 7500 7700 7800 7900 8000 8100 8200 8300 8400 8500 8600 8700 8800 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 12001 12100 12200 12300 12400 12500 12600 12700 12800 12900 13000 13100 13200 13300 13400 13500 13600 13800 13900 14000 14100 14700 14800 14900 15000 15100 15200 15300 15400 15500 15600 15700 15900" local ATTACK_MODES="0 1 3 6 7" local HCCAPX_MESSAGE_PAIR="0 1 2 3 4 5" local OUTFILE_FORMATS="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" local OPENCL_DEVICE_TYPES="1 2 3" local OPENCL_VECTOR_WIDTH="1 2 4 8 16" local DEBUG_MODE="1 2 3 4" local WORKLOAD_PROFILE="1 2 3" 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 ?h ?H' 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 -I -s -l -O" local LONG_OPTS="--hash-type --attack-mode --version --help --quiet --benchmark --hex-salt --hex-wordlist --hex-charset --force --status --status-timer --machine-readable --loopback --markov-hcstat --markov-disable --markov-classic --markov-threshold --runtime --session --speed-only --progress-only --restore --restore-file-path --restore-disable --outfile --outfile-format --outfile-autohex-disable --outfile-check-timer --outfile-check-dir --wordlist-autohex-disable --separator --show --left --username --remove --remove-timer --potfile-disable --potfile-path --debug-mode --debug-file --induction-dir --segment-size --bitmap-min --bitmap-max --cpu-affinity --example-hashes --opencl-info --opencl-devices --opencl-platforms --opencl-device-types --opencl-vector-width --workload-profile --kernel-accel --kernel-loops --nvidia-spin-damp --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 --custom-charset1 --custom-charset2 --custom-charset3 --custom-charset4 --increment --increment-min --increment-max --logfile-disable --scrypt-tmto --truecrypt-keyfiles --veracrypt-keyfiles --veracrypt-pim --stdout --keep-guessing --hccapx-message-pair --nonce-error-corrections --encoding-from --encoding-to --optimized-kernel-enable --self-test-disable" 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 --status-timer --markov-hcstat --markov-threshold --runtime --session --timer --outfile --outfile-format --outfile-check-timer --outfile-check-dir --separator --remove-timer --potfile-path --restore-file-path --debug-mode --debug-file --induction-dir --segment-size --bitmap-min --bitmap-max --cpu-affinity --opencl-devices --opencl-platforms --opencl-device-types --opencl-vector-width --workload-profile --kernel-accel --kernel-loops --nvidia-spin-damp --gpu-temp-abort --gpu-temp-retain --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 --veracrypt-keyfiles --veracrypt-pim --hccapx-message-pair --nonce-error-corrections --encoding-from --encoding-to" 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 ;; --hccapx-message-pair) COMPREPLY=($(compgen -W "${HCCAPX_MESSAGE_PAIRS}" -- ${cur})) return 0 ;; --outfile-format) COMPREPLY=($(compgen -W "${OUTFILE_FORMATS}" -- ${cur})) return 0 ;; -w|--workload-profile) COMPREPLY=($(compgen -W "${WORKLOAD_PROFILE}" -- ${cur})) return 0 ;; -o|--outfile|-r|--rules-file|--debug-file|--potfile-path| --restore-file-path) 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|--opencl-devices) _hashcat_opencl_devices local num_devices=${?} _hashcat_get_permutations ${num_devices} COMPREPLY=($(compgen -W "${hashcat_devices_permutation}" -- ${cur})) return 0 ;; --opencl-device-types) COMPREPLY=($(compgen -W "${OPENCL_DEVICE_TYPES}" -- ${cur})) return 0 ;; --opencl-vector-width) COMPREPLY=($(compgen -W "${OPENCL_VECTOR_WIDTH}" -- ${cur})) return 0 ;; --opencl-platforms) local icd_list=$(ls -1 /etc/OpenCL/vendors/*.icd 2> /dev/null) local architecture=$(getconf LONG_BIT 2> /dev/null) if [ -z "${architecture}" ]; then return 0 fi # filter the icd_list (do not show 32 bit on 64bit systems and vice versa) if [ "${architecture}" -eq 64 ]; then icd_list=$(echo "${icd_list}" | grep -v "32.icd") else icd_list=$(echo "${icd_list}" | grep -v "64.icd") fi local number_icds=$(seq 1 $(echo "${icd_list}" | wc -l)) COMPREPLY=($(compgen -W "${number_icds}" -- ${cur})) return 0 ;; --cpu-affinity) _hashcat_cpu_devices local num_devices=${?} _hashcat_get_permutations ${num_devices} COMPREPLY=($(compgen -W "${hashcat_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| \ --nvidia-spin-damp|--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| \ --outfile-check-timer|--outfile-check-dir|--induction-dir|--scrypt-tmto|--encoding-from|--encoding-to|--optimized-kernel-enable|--self-test-disable) return 0 ;; --debug-mode) COMPREPLY=($(compgen -W "${DEBUG_MODE}" -- ${cur})) return 0 ;; --truecrypt-keyfiles|--veracrypt-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 ;; -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*) _hashcat_opencl_devices local num_devices=${?} _hashcat_get_permutations ${num_devices} local opencl_devices_var="$(echo " "${hashcat_devices_permutation} | sed 's/ / -d/g')" COMPREPLY=($(compgen -W "${opencl_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 hashcat 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 _hashcat_contains "${OPTIONS}" "${COMP_WORDS[h]}"; then h=$((h + 2)) else if ! _hashcat_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 _hashcat -o filenames "${HASHCAT_ROOT}"/hashcat64.bin "${HASHCAT_ROOT}"/hashcat32.bin "${HASHCAT_ROOT}"/hashcat hashcat hashcat-4.0.1/extra/tab_completion/howto.txt000066400000000000000000000001511320027462700211520ustar00rootroot00000000000000run: source ./install OR source ./hashcat.sh # not working permanently (i.e. not working after a reboot) hashcat-4.0.1/extra/tab_completion/install000077500000000000000000000055761320027462700206650ustar00rootroot00000000000000#!/bin/bash # Programmable bash completion for hashcat # 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}/hashcat.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 echo "Warning: root permissions are required to install the tab completion script into the protected '${COMPGENFOLDER}' folder" 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 # remove the old version of hashcat64.sh (was renamed to just hashcat.sh) rm -f "${COMPGENTARGET}"/hashcat64.sh # copy the script to target folder cp ${ROOT}/hashcat.sh "${COMPGENTARGET}" # adjust paths to the main binaries of hashcat 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 hashcat 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 ${?} hashcat-4.0.1/hashcat.hcstat2000066400000000000000000007256161320027462700160600ustar00rootroot00000000000000ÿÿ̾Ù]4ÊνO¶ Üë¥XÔ¶]Û«T” ˆd"Íõgª sD ž*¦æÌZÇ ÈNüNÕCÁŒ:ΫÞ3…[¼‹ã”ÔA%9dMÿ‡½Šä HpsË™4*Û! ¤@¯îQlÛ¥G*ÞÛµ5Å»49AcËÃB«"n¨Ð…“p ¹£ÃSöŒ@þ‚Œ:-> Ï(á(˜ CFD7jþé¾¥S<÷¹O-üÏJjüŒ]WÃlš¨g ÷¡sñ 8dü¯ž=ä=™Éo˜©Ê8FxøöøžÅW˜ƒÒ3µ2õÍà~É‘ÉXUÑF^²‹g{{ ~F¾U*¯UM|þH ˆZ2¾£¸3˜•˜ˆ¼æZê}¾tÔ]Åi' Rü¨Exïáûg¿®85ÂXAäW?…׃€YTÃ2íjgð›¾7tuí ­„[ÛÞ¼¡à³'‚5yNA>P὎nb¸îóÐZpÓ±ûé;²{Šz`AÅcºÛ¡J“Œ‰‚µú-|¹§ûàë°àâò*¿Wô~c” E»no׋ž.&ÁÈðRió[z‰kz…\i³ƒÐSÒèE>§f Ò}8ªpz³¯©~1C2R*"Ha4‹`µÑƒH©L£Šˆ¤1ž+)SŒ¤8bÛj/zö“iDÕ¶²ä#„^ ‡ô “‘‹3}Ðz¤«+¥ õ£;ZþžHçmÈ™)øŽPVñ jª ?!•‘÷jÜûKä ¸ëj5Ë,61Ÿöúä#úOjS‹­!áù|Q‘Û§š_H™°Ïüöšã^ÅŠä®’‚ÚÄë…OLi'0IÔ±}ûLf©‚Ã*«Åt3añ7ÁðkÔœz`e"nè9ܤ:‰ Å…œ1˜“5xz7Nª4_‘–UpÄ¿@œ0öªí¦]â4¹Gn=ÕUvG£c?eÅ­†i 0ÖÓÕ“¥E8Æœ?÷ )”nêßÉñQk7Öb*P¾ï _DXq´4E?.WåæK•_ª›¸®P5L5Yƒ‡QÁOGƒN7.¯æq‘žì„.I¼Ë:kL+f®ú=A§×*úöæüà¡Y§_Œ³}jþ܈ješ¿´·Uf²°ãWò¯¯|v­ëÅóÉ®˜û2,ÎŽÚIÄ––šM¶©¡øÏ"nšÁ©×š\Æ•ÐÍEû’¢Vô’Fìï„¥ïîÚ¥º_é'[`Xsñ•}ò&‡Ötî¶âé½îŠþêTV×7´ œl¦p§k¶g ?°ˆUóH±þèlW÷t]»éК†(Cp!öq´«*Óý*CU‡C8ì »hUšu«îpû¾Ž^Ä{²s?hCĦ^Ad•%=×Â\ã·Ný‡CZk}Ôæ8gÇ_¿\bW*[D^  =f€3¹\ðÒÈÜÉ,ï0³ Ua†Wl(?w—–*ƒ`(ú¢š_L­ÈÔÅ‚±N#¦…ç5sŽÍkWsZ{sD’PW´Øxª!zÈz)Š×7PõÇLãg.«ˆy4ËSñ“ êê8ÿÍŠ&^Ýó.“¸4#,”’ÏnŒ(ãfÓò/R•–õ®61o“«BŽ7¯¤úàìíôžHîþ‹ñ?Wù£!üŠ0“ð†¦o¿I¨ÉëJ`ŸSóï¯%ȱNtb jÕ9€nÝÅ qônìJŒ~îLp;uð),Ím5ˆH¼UÔÅÜ? uÄl‘v$ý·X³[mÕNkϼ%T^_ó%J¸…êÛ±B6ãrù‘öc¦"_ûTˆ©‘ª•ûÎÛ×ö7­Í¿6,Ñ —ÿâµ»âÌĈ¦ô 2]‘š°ÍË’ˤvH\-ìU¨¶‰`L”Ȳ<âÙÒm%¡{»8‰Odî Ê­ÃzZtòå5ýnƒYÙë'‹ˆzMÒÆ îrà(å„ë›fÞÝ4`áïµäÅ[Šô(O ½à_ÜÔ6ú²ŠDþWärõ®rQø‹yCÓwØMù‚¢âtüÆíà^ö¸€ä~«¸î6o¥ÓëgH2²ý^ž†?Qk[ïád5¦J‹[íö=Ô ­RHb°†A˜Üÿúî}Cbú—Ò€ÎcÈ~Ä¥Œ¤gZñýÙ«ÖÁžV>îÞ×1÷„R‡Î÷FD n½b3Ñ ¼¿x‚iÏ¥ölÜ[hÕ™õä¨%a×Up}¯©²L­¹jP0¸†õðˆwh6üÀª…¤vx;Ìgå™h_ìò¼ƒÚ8™0K ’{… ';Ò…ª]Û£€â‹ŠÜ£\]H½B¨-åxÌw#%¸Mbékf¬’µ¤"ž>]ã°eék}Õ„vp°µ§ÙOlÃ…¡¸EÔ¥¤n VZ÷º™Æ¡"O4ûºÐ!i«v…;/Ç Ù“£q©´×Y5(5o¨S¹Î¸ÕªsŽ«&G'J¦L5c*r”ì:ŽË¡¡%‰Q¿9Ì›É?ö¨,ã °´>8.ÀÜIc‰IüHXjD1 qYWCâ;7ÂC9åÚo·ÒÐao¶­þîã¯lž½9eKñP »l¬3PÖñm{óy_ÄX$OéVϪÎÝê·ÄM#ÙS·ý‘|~Ô¯ƒÞ'áÿoÉ´‚`ÜK—`>ÆÜÓ×§ÌÝê1r, ^‚:ϨK…G];)¹B«c×”ÔÇšA‡ ûÉf«Î-cï U¥ŠS­m1xZrv“—š™•K08›¤6¥tº4(4O°õZ05ðäÀ‰¿*-ˆŸ‹¤#`«Ámé½Ð^ã­ð¬ú3§à÷ÄT¢¶ofŽëÐðfR–˜<¨’áõdsôøk˜€ahª¨­•',PêQŽåò8k ÚX,з|"úxûBc5q1áÄï„3ÂY.AÑFó÷:O\´bT–~K¡ßÖelþ¿[{7wÿ<ؾDfÈ&¸ð^Ñ%:b%Ýc9àz¤U¥,Å.¹TÔ›À@#·°Ð@ÝZCz"Íù1­ÿ°È«n ýëhÊ¿ÿ ÔœÂA=þ™ÿÌhÅ[ý2¡í¬¿ÞÈÜn+P4à[Üx—5lEÁê?Íü›§J»À:xßzæ–àåýl;Ä,¶üÒ53çTw?›N·¨†­—‚´`ÏÃLÝ>A5‡ÄV÷ÖÉ<‰ÚQ+hBæîá^úë¿tq¶«ü( º&ÊL÷Ûtç–{>ªA)©©Ãe·’~ÈtT~W5‰°¦“HÈ´É®ùÄÜñPŠ¥É#ˆ€íjÎìaˆžõ¢ðPEýâÌv˜U,&¡-z&;šÓÕ§N+ÿ.3æ%Óvz(§PÐ2Áy_æ¶¹ž{j致u’ŽÃZH}Ëš(|­®Ž„&2…‰PÄi‘èo™|u­àN3çªõPVõ·_ÕýôŽÃ~]8=c§hãT& Ó)dSð"ÿUŠÅ‡ú9½¹‰eácz¨J¶j­LÓ•™6æ1ðWÐ웎«‚žßGÒÈ]‹™+,ÌcÆZˆß– ³CÙ¨ªÍè!ÊØØ2)½;ã•A ½¾×Bd]Ÿ§ñÑÒMóò¤)g]ʧƒ=¾kmçõ¿í–˜=ËäÇ/¬ŒãøÈfŒ¨]ìP:¿×õÞ1¬^²·9ÿB±3B$n€…iÒÊŽˆÔw3ˆA;<~dàýÿxâ‰O`¬:ºJ7 ·–R»:Õ}:“zJÙºZ ¨x¿ømeøŽ™ýôÎJÔÿuùhZÙyøÑÿ^UD£ùä\þ*i… é6{Ïö{Pïc3ŒX½Av›7’!)ÕVžSŒøù@}$ u8™\ÅN`>ð@²‡áÏÔå?Ï~…ðˆo2ÚÉŠb„.2ÑÛØúÕ~»«“쩽/Y—• ârH\ÀÕà öR7tûÔã¢ãVÞ‹ÉÖáþÁÇ35›/w/^æ_VØ»å¶ORë¡ÎÆtÆÑ‰ŠÐ$3ºÛÍãÕkÙz! ÊrLq=¾ Ëÿ(O¥`›í˜Ö‰7)züÈ×"¢uû®- äÔz< öËÖZì\é%-¤>g5X“ë$š+œNQböGÞEÞ¤¸C ê¡.F Ÿº™\oÙ, ú)ëþqÇ‘ õâmm€~¼Š ^±.ó6W%¿(lGM{fÙ‚aȯqúf=;”‡s‹.ÛÆl[â&¸ZÑt”{â­èž%ñ#PPêYÍ*('2­3(¯Lï%õÆgSjY¯úßç8öšÞ#“wTHäpÓCãô–|•›¡^µÇ]¿ þ$iµ‹ûo5xÑ«‹ìÃWã“ ]7hÜÚòÀÿ@|£Á·¼AT;6#W·æç•œt˜æÅWö%CxYM.€‚¹~Ö5, ØÍuñ$œsÙݪœÑiíÈ;ÝM€‘Ôç€EÖ˜à@=)˜³%¬›p¬oí#âßrs.ÎY–€’ƒ%̶¬g³ùV,‰–XÀ1´¥~§ Æq+þžŸ èLÊuyü±SÂn§,­E¥·Oa=S?œÛ‹–“ÒÓ 2Œ•+*ÃÜ+Ó ™Ë5U]£F[@•}šg€”)Õ€°ŠQH㈣V›4:n ƒ”¸oçzYÜöÔU>½=Ý5Ëk›ž?OÝqµJ½ q™F®¿á´¢Þ‰„¿¼à•”%4;ưs^:™VXÊΡcLQ'VÑe!0î6ƒ°ã¦ÎfŒ;³_åÕìK¶—”„sÊÛÜj¡Š\éñªÙˆÊštS§?5Úê ],Ì9Û€eDÆO ºß2#»ÆáÑ"¦eôô|­+Äþ#JXk@>KŤ“5?i¿¹mù ¢ëdVOw}Um¶™– 'ÆØ~¡Ú·Ê/€Å±Ž™±¹ì|…'×àE•’DÇ^EÌZ/‹Øf¦êQ>gh¹föÒë[í´0 üe#F?ÅÇø#Ìsè:3Ãì*®Þa€#ùæ{ÿ€Ì1prl®»“Qò4±c&èØjùYÀC¦sz¥Ú}åÄþó„BÊ<uzí”TÞ¦Ÿ•‹õ¼l»FTêy¤ä m»UäË£Y[&7I½›ƒ/Ê\l}·OÂî°jÇw¬ºÁÎ qˆ þÜíæ¨çXÿiÓ“á=øÄ¼:s×/f,ë$j6€ð_¾”Z`þxrld>²Æ_zÞ*zè»Ø³IÝ…Ä8Š|ÙB~“ñ σÄùˆ"÷&Uœó³üDÍKŠsâ—B[Õº ýߢŒ{_ÒT„Üú "ÈHbÝ{¥qá¿×\Ú6ĨMR]ÁQh ^d¾ç^Ò2þ]-›Ârd©ÄŠCþjÇ.te&ìî9~nÂ|ÚÀåœÜ;£©!¡(if¿$U˜dú°g·rå5"qÙÂvå»ãß!˜ÂThh0w‘«SX¿Èš.…Á/uè9òÏ‹Ð~Ìz.ö{6Uö¹:ëögÔ½÷Ô,8sƒæÏŸ¼(ï ßgª/­†kÖ®¬žzÂQ´ëDXaÄÆDU !›cM›S«6i©®>³æÀ íøå&\'Ô”B)R’®‰yš„9n>d7ŸBû¥Æ 'iFDïåâ—cÐû¼VF‹å\¦Ã¤¥¦kÉ#ÿ7\t‰¬GjÎl㣀^¯B!°‡£ñÎgZÑM%”ÝÖÿ¿·ˆ·¶É˜A¡KT†Ø6AçÆ&}nÎ-¹DÖP$RfM댈*ÿêàô‰ýŒžÀ…›ÿÏ"∞ºÀ†㎉Òeá2‰o¢Ê!ʨÕß‹–h2j¼}òœwö9 ji›Ú;8òÅ/Ò«° ÈNC*åÞ öi¼%¿ÊsˆR´ó@kq±|dcq:–rɨ \yÏ;.Mß}zôõ7"" 7‰¦¡åÂô þã–µ²öŒÄЉ™2‰&“›ØtïZㆵD.V#²%wé±Ñ~4œ¤êP\ÙjsF_ú‰ß‰¤3ycTÎsŒ)‰þÙÞ¿Y´x·76ÔótUÆg;à˜-AùN,«òä²!Ú²„+I_¾ŒÄèL'{—àe©o®£­0‡åL,œ'wD„Úh¹Á×\‡ <ˆqw«Nè?9ÐZ+OšOWº&:‚,T½é«ÈÓNÜká¶ìðp#çž2N¾àh&Ló*÷mIÕƒ„Â8‡uü$öNàÉ´ÆP ¿, ô¸ÖE0¤>Ò3ëŒÆcàY°>4[ÊNÚ#ï©{šý™óÔ¸Þ;L·(Ï]F ÊTÏàÓ–ó~|PcßzrFÒ:aó¶½A ^õ ݹðÒF=˜–ñ9ã%ߺzb¹á‚¦T<RBó4?P)Þ†ŠXtè éRÇ{…ÞóäUŸOj­Í *÷7¦äQ äp ýBˆÜ|CÝ÷ªTº*ߥÔÀé8¿|u÷½‰A{®£¼‘úÖŸ"þ¨¬;æ,|E8Œ~7Ò­×›ÅU'wD¦éÜÓvåÚöž]â,VÒ$œl¶­ÓŒƒÍÍåÄÞM€ã$é5»Û39Úâ/€²™ B@íÏÏE膸$¤­5®OAÈî&è¦aX´qZJçŒÆ²Ó÷¶`çtFA V÷u …G}üêlëˆûDà¶–®å¹¯;v€`OlÎ/Á Ã\"ºMá´1p_hªA9ÑfkKâøÂ H¶²°ÔZE¢)¾ æ'«xml•ÿ¹&÷s[ŸG„¦HQWoV͈–`¨kp˜»+ò•œ®-J>èþCåÊ'_C}¤:\G 5¯v2·{PØ_ãÒòç¥Z‚ªßhËò¤}Ž`xÒôGËhkèâl’…šù9·6!PÔ+o3h¹tYU„¯‰áS÷<8BʈœÏ¹àãl3›„ Oc’÷fÒÜBÌG’l9m¡S"áff—;¹.!}±ö·d4iŽ`.WC"è2böïtÊÈ¢æÇtÁé•`@ÄY°ù%ç×Ëá3Ðxx lú5°™t#OT#šEÙ›âüÑ"“P@8 j‡Âr)3KvXð¥ó à9lì0~òžEU9ÊBôÐtº¤ÜÀ£è¹E%!H Üü5Å&7òï†:ÏÐo×Kn–S4~îÀæëñõbyRàeîawÇKµ‘£c®­¸ø‹lOw™ ­ó½3Ó¾Xvâ„d´id‹B>ƒ¢OªÐ|7ÄÀ}Yp×¹ò²WlS=6]1€T{ Ç«¾C¦è クØÄ€ýó7Æ€- )1‹…lá^_K€®UâHJ™)”N2¦ MÖžgë :œ¹[N±9¢åT„Pšbì­ÿñÒ›°½Òòth—á>=²~ -FµÕRù:,YˆÀ ˜¯uy%¬Ñ:ù^faÃg%,ØÀk@8óRy {¹“ýóÝ:AsDP|e!Å‚Ruï-B:;¶Ëy“·ªª<¬Q4øÎÝ%Û82Ó ‰L×ÂY< Cº…² Üš1U+Ò$peå‡{(C´f™Ìf–u{_¡Ö ;ˆp TW'’¢¸P>£PÍ8T€xPÉU戮‚–¸«^?°?$Ñ›¨°“Xã¸Ñ¿e@é1¾=;dK§Êz×Np0Cã™[›Ì¾£b”V‰Ž"'Ü^¹G³8êuÊÞ ¯VŒ¡Ã¹x½7MÅÝ]£¨‰b…3š€³{w_îYk’ï Ò@Á\fæãbzó" r ›Êgn¥zxÿ×`Œž¥€€Àˆ õÔØ°×ÃR7Q‡»Ÿih¶¥gº?9D`4aþæšR)õ}À;ÀK}›ÝûÙ1:!4³‡g9o2¤áþHÝ@É)Ó¤/ú³6ûîÆžòk_«É3uÊ%Œûªއ¾)|G÷ñ)TÚÛÞfû#¼úf¨u¢h£dæ0•×X¢rV(E+;œþŽÝŠÆ€PŒEÓÆÛÖòðªîó*mK¡eéÉÛûØo+T^âù-Ú>ŸÜºº“ž3—ù̾[©ÉÝ„qz/qKn°öað@êFvÜó>Õyqò‘8].¼ Væa &”&B—!1å]AèßÿWõ€¶½65¨#ûkÖ "ÀâѤ(Ã÷)nKéù%ϦøÀ¿‚°ÒEØj“rä¦y|ØÓóÆþ.P%X~Æ ‘i™ÅJgº@Spþ?Y¢©ÎsÏ”1–3cNÛ¶'ÚH󭲊æÜú _«l=Ð5ÓÅŽaæ‚^^km®‡ù¼Û9üÆGÚŸñÞàkP‰S¥²3,öѦ8ŸÌGÀn_€AÐ`vPw¤+Ã~èÑF¥ÃQ^æ[“ Á Ú'®•Ò…øÝ¡Xc@ÓºÁQÎÎ \z¬Z¥€3muW|…`ìmÉsúcÉy…GŒ¬gNþI¿9‡¡ó?€¨hIYÕ_à‡Ž¥vÆ£@¦vÐ× ‚ÊÎõÚT²Ç‹*Ó÷«QyHZ€ÃjW…Ôz:Є5ËNä>+ù«ÑÝîÎ…–è|7åx Ù«¬¾,üÞ€G1·­ÈäMÜZBbéWa“›Ç¾ê׫»ôÃD½†öô{<ž;üö&^÷à päa¶ò®|@ƦÑÎ,7’Ûš}¨£´ÍÁ1äí˜ó?ÇbÅ7šÓ­ ?h–Æß(¿GzÄ™§vöaq-ü Lƒ½‘_w/j§‚‚ÓS/êý~þ¬Üýý’á¯åq¥¼G¿œ#­`¸=Æ·C´§*"íÉÌ„^Çgri? B‘«„ç‡ -jÛÅQèÍÿ_™u+þ,Sôœ;7‚¸tIÑfQ¸J2öu$h±pÄØ*LùòÒ,?Úqƒ$Ûò(ùûìÉôè#B‰¦p•,Œ^’¾ úϼzXåC–ÈB‡FQ ë™X9’šZ*•aÑ•~·éF\\@Œö+•”Ó@ÔdËFeÔ!ž lN ÝUÇÍKÍê7þ²é½û«Óµs90hBâ—§ÔeNï‰ö½Iè+åÒ÷`,òü¯ß‚[>ú´ðûiäg^I_!ø@«ó ÕY¸°…sÈk^€­y“R•¹ÕüƱ‰ºxÓklm¢l5ñYIbŠ®ùsj.iÏôØÄavc÷7jÓœÀ<˜ýU.îç’úÎ×7Û׃´ÊÔäöE«b©ò‹ƒÅ™öî/†@~Ö A_ÝÞ±ÂWC4G0¹î…ÿÞ­ ¶²9æMÈ¥¢U ‹b9LÇA¶¨Æ÷…]ñ¿)úÏ„ÿõË©°5¤³‚ˆbñfzå>„4öŠ#¡ß}t!ƒ°ËÕq!÷œÄ/{äÎ= ´³R²hàðÄ÷³)nûgzÛv£p–ÿÞ–* B‘‰ÒVVÏR—´ÀÝ~®YÀÞñôšìùƒ+*)—Ï PÔfºõ~ÛzÌÂ.`TâÛ÷jkläÓN3rŠl‚Aÿ ‡'#ß~-9!´+n@Y ÍAL¯&"q{ÆßùÙØ/JׇËX{l—,×u²*¤“\Õš¨µ e倸õD·ñ?WVð¾¹#¥9ï ®Ä!Li)£ã|2qªªe Jò‰ÏçåñvÀm{ƒ;2w£¢—…õ,R÷ ¸êö¢å³6ÚtÂÈôr šºyf‚Ϋ  Ñs3 °¿_¨(ä4” Ê_V¾ܻާÅðtQa&(RGÕ š×G^úªŸéð-¾ÑÎãkÀèÛé„Äzø#ÛüÌübp¯Ìjl&ÚúÛGöDȉÓ!4 qø¤»'jtÈó¦'~œi®úã[çø½éTÙáôûébþ„Ý,µÎ,ŸKPž°{»2žL5™- «µÑÍÜ)W÷W4–­"-ã™ÝV‡k°åâ³fLMaɪå‰÷Ñ壺€JaÉ×»•¹)håf§e{%7 œ V†*þ?¡6KOáúŠïÖĘßúÉËbryHgþñ4«Wè<™‘ìðØŸ<.;‡ê èÇüs3u)Ûfu 0N&yPsÄ­‡úê)tû:s]ø™uRìR] „¥Ñ:žû¾üj„Úî”xç!œ¹^¬•&¶¥Èÿ(4±óÊòD²Wi€)YUÖ]itú¹Ò÷åÑ[q0ùWâB]Sý4–"”­káT·Z…šhêH—æiÿqwü9ø—×ëZÚ^~ùhžÌ"O¤ÿáU¤7ûT½&Öú\kÒé9 x(j;+‚)r9¢ATxd§‚ÆÖ^(Ã幂^ï¾ÜeöÇô錋F”Q¡Ôý+2¥Þ5Ü#<8X£³©ÓÞ{4„H¥8'³3NÑjx*+_—,mhyL»£ÿ¾[ßý6w$ŒÊ„þí5&õ¤ÙWùª PÒÛ½°äKO^ ·e¶fË/·äÃÌ…²‘‚\>s°ÂØl«Á#ÐbS7ÔûYMq ;aH[vËŽ÷6ç‘àüGpbaɬ?zO¬7ìP=Ò–— xéÑä`à85Î~pÅæH½æ+—T'Kê Kד 4àõV×1&¡/¤+|Æjš¡+{]hÈHÜüßàj°£pbÆÃÁ»y¥–gá£ß*Âê…·/bEOeà«ÂUm¡ Y§;÷)tV ó{`•;pˆÎyRÏ´ AÆéŒš˜´öz< ͬî˜9f4]˜8;ˆsÏ?†&oµhêÁ _;+÷‚ ›«rKmÝ}…p¢ö+‰ÜØ8Tм¤²£t×8N|v0øz*Ïnì£Èœ™­`º\£ÛæÖ‘Ã(é â½ù*º­ ŽèPÖÛZ[SÝØ)>×tÚˆ¯Þ‘,Õ3%©p¶“NE…$óÔûüjIÍ4#Ì9ÏVesR‘_Ï_6UpÍaŠÖ«ü¦ëì›dÅÿý|c@»y’AgNt»ø¨{¯sË!Ö-¬94ü[ïî$,Sl %€?|ó¾á‡Åum}翯+)ßÐÌ++žîòÓöêÊÆ0Âh¬U¦CBªˆ°IÂÉŸ`¨6Á­ß*ì½\ä’¼½Ijä.^’<(ÅaýØ$)½¾ÒCÕÉŽÜ~€BZ òmrPûQ±|oæ¢Ë–œ0cu}M²P:^žMQÜ×.g¶Ä‹@.øx•Ä©Ê~RãŸdïý5LØDþƒAig žµ‘¤çJlJ‡}ËÜ»µ†3dh^Õ׋?J„‹&Òê¦ÓMVdŒŸÊÚk´x7KyÔ”ÈI¤¬F±™ïüæ¦wM…w;kÄn&Ÿ&£/  ¤I©‚zd?Ò>Ž è‰cðtEÒ¼6 XÜѵ›»JÕ†€Ýô¸íÎe>‰ðL"ØJ)PÝý x3Éó—T»¨>½1sÚ‹úðrŠ$1&JF‚Šþ&KÔ]=¯8ŽO%W/T*úþg\èý|.&xÄg©NßÖÐãðž ÞžÀ,%Ö·˜ò¶Ö­†ŒMû¢t ãØS^ †qøsMW§*ÁëCdÛ¿ç 97YñèTÑ ÎöËØLÌ.CDX77¯Ñ¤·q)¿Ÿ9á§sÁýš<çaÇ7ÙI x€Gó;µűrU^޼Bp¡M¯Í(XpŸ °,ˆ#Œ<“„r2Ë%ËÒÔ¸ H‹=¨áMÊ.YTu© û£gA0uxÎ%ƒ;Ži¶bpdŠ“ÈNÚwÖݹ?ž±Nòª“ÑO/k+öglê3 @Bbj,å¯õ«… ¹dƒÎ…ÉwVuGÚëåõ¤= ·`×ü”ŽÛ8t™$“¦ìöÌØ1*Ë;Oí3sÒ¹xaê,BwœY–ÙFe˜Ðm‡K$3ýºX²z;JŸ!Èø.µÈá=­O™‘â_®ç]«¸~ïEzÔ³ N<´¥"#nZ._R3Öw¸6©0úû!âßk=ô”Oœ(x©ïbê?ìuy¼ù‹°§µKÂ7Í{ÑY§Ù!fh‡ÆZ ß9Š¢¶n™š–HÑ«4eã²iœ}Âî<Ðyb¨3}°ƒ—ÏYM©ÕGç—$x6–•v(tã·ÂkÂjçÊ?°-aR¤ƒK—Þ‚ƒ¯ʇc˜Ÿ*þš/8-„>X1ÃÙFGò®u’¢Ë¨¯¸Ü.ŒTÔ ¦•Ñpí‹+–1‘'±Žn“õlÂñ_Ý}_Ûyõ…»AÜ æÖfAß„)òcšŸ÷yk邈h¨†»C$€£ °[K®“}w°ìƒZÅÒç@ bë¡,w5]ÖUîe¼")™L•%ø*Ü#¼ƒgåÑÄž@»C%ç…P«áÜî°‘VImp·à{'r•¥îÙ´ß} þËÍC Þ°šD ê“tkß6˜²tð[:!€Ý\³c%ãá?à·(óò2ãf/£ˆO§{I.ŽÁð¨(Ê›—O!62÷v–ŠqÏL®°é›‰g¾4sÌ@ð;Ôd)¥H ÷è,™P~‚ŠG|\ì’F‘Š?¢VfÃ1z5%4“+ÎV[.h…'²½.XMò?.ü9ËDôC†+2âÉp–ÜDÊrè_Ð-×Z±2@*)à6S ƒ–\j@B:¬ÜÄàÚãëæë ½ù Î *“1@ùÙU{¯èþBÍsRR)y¬@!³K™µ\:ÊH³ÉYp^eÛÞoòÃ〃ôiÛÕñ]õ%8åï±OäOU,× ¬Õs—ä·2µ.šúäž2(‘à:„:dæÍ2O}§ÕÄÒ‘†­œÀ‹ðà°^_áLŽØÅwïKÐRƇ¼c”æ‰Z(–.•±Õ=ð¹ W‚£XÔÓóÅ ¦6Iü½¤Ø3ŒO¥ˆÞPC:Ѐä.vñ ‰¶¬[´cR²`æ»a~cÂì†o»n§›ß{ FþaU褛bÅ\Xþ<þæ6^ÊÁ¯MewÃQÍä!*=ejaçÞE#­_èó–´‘2ÓHîqI™¯ ³Óúuœ‹üXØÙû’â8™!t½çZôö›%‰÷¤½WúoÖÿ×¹Õoô²"Ç_×·ín÷ނȹäý’‚nÇScã~5›` ô íâî­ˆh©C ñ /ˆý¡ÎŒQûѰ°Ÿ)]ºä3¦Ô°¼ªj¿D$ÊÓnã•’OWšÕnòYY ïúÓós´NÚ¼¨Ã-DjeeŠÒº‹öª7ØU2}i°½M‹_qƒØU“Í÷V•LD‘@µºâèÿ'êiç½Îf' ô¢÷7Ê wõí­N9¹ïבLBçÃl}Ê+~ÃÂ$ͼ„6ûÜct.LX>ÍŠì cQrj+A„+y­r¼[ Ö ÎFüfuÁ:$ÂБb øigNuùQ®Jäµ®€Q–Ô÷l.6ôeX]Ò“d8z²È›¶ ”¶8`^•醬Ó\_ÛFaÚÿšr¾Â™Ž¸Hgn–¡Zê*O’hjtxOg>®ãCÔzâðåSi qÄÓÿ¦#“õŠ\­þ•’pGÙjGXÆ÷Z>Óîó 9ÄmПÀbVÈ…§ödþÔ3«þœŒ ª—— æsvM.±+jŽB€ÿM!|„Ã.[ùvó™±V"ÔÂq4o„–Šò8(ù-òúÒˆðëž«½Ä2yã)œ°gVÒ²P¨Ç©ÚtQ4&A8SWïSAyRmåfg|_rŒ8_æ&pëßOIZAhs×òáÖTÛÃêF;üZ»wK¯4` MßÅ•u©Ã&\AÉWQÊkµ˜ÎB«~«@ö¼ª¢ Z"Aó9q—½w6º>Òžv.&Ø}³Ý§º¢À•)Cd2lm7,bY8éaÕYzpœ0Z«!„¼å¤Üv\/H+†ŠnZ‡û¡øœf9›á¾Øc¼»M¡@‰þ&#‡\Ù–°:RS¸r†•8\Qrþ)N“ä%Åf­*•RÞÒÝEŠÊˆ:¨€fÞì1ÛÙQª°À t®G*rµÏÐÌŠW>ý— &š½Z»ò0~&:¸?¼1gÿ@{±g¿[³÷z*ó{9œ®Ä‡û1Û©Â2 Ê9‰dÌsuÂ\à5ŽñÀJÚÀ,⬠gÆuª!óö‘o¢K@ 8Šâ± ‹ ´Nñ­`L#E)¹Uīθߢ¯þ`çí×H:Ö@Ê䃆]ʬ¨I&R£Õ÷€ÌÏÞ1ê¢B3n}ŒûPpªUϘX=#©˜ðÑÚÉEn|ªœøéNÓôõª³ƒdÚ"E ¥Æœ÷ã‡4O[Xä³åk·åF K¯¸¸šÒÞ–¼ÍD|-+xð`“år Nÿ™"p„\ÿ¬ãX¤Å~Ê…r¿(ÏU[Lœ¬™kå T @û{Dm¬‡üüæ°tßð`CíPÒ(¹EDfa ÿØŸ¹äy®2~G ŽX÷]_NǺ&ycZ<>Ƙ—|9L“e7-, ¾3ýMµ‚û#~¡"µ}û)Æ­W\Õ}óWùSoJl ™"/byÿ+‰±°Qïð£kŒÚ]Ô´ÑàHpÓÏÉ*£G¶LRCWµe³•‡k!fi™s1ä"`1eF=[î—§V<„ØDü™BÿH󨇫¤[À›xè&ˆEzC(vW®> íê”[ôX`ªX±º±ù¨ïàx] ›PÕĹÔ?¨ÛÈ;xN:£ µ…x‚nó]*5ŒÊH>Ï…­.Ä!¼s—‹±bµÓ…¼Øû^5ªo°oå–IIÀ?Kmj7­TÈA±©þP¼Y9ï ­;e§›W£:uD„âA0Þ°:ü&/2˜ |wR¼®?Ò4•›^1tEtg À»í™5a Bq +»wØÿêÉÉž¬GãÄQ…ÃB@^qu¥ ]vý—îÌòÎK¬)Fø7Í'‡¹6„V'›½qb›H«°O+ÄÍû|Údå¸bºè€s@È®¥Ô°ª¹ôH†%6y‘îíðºß>l—úßžà‘;A‚ZwŸ¦Ü´bü€r«$ø bÔ–©˜Á¸¼ªõ:›+§G0ÍÈ3Œt# ïÕ§ûøâDµ?ù|3ƒ;²ÿ#ò 2õëâd0ÅÝÎiÿØVþÇÙ÷¡Æ©ºó©îÀs뤰´[HmÁXÚYv?ÐHHžÞŒ'= È ç,7å›ý:´3¤ ç¯÷P\0︨AÒöHpÁukì׆ÆLW{4W¿šV¢ø(×ÂÙÈ\´•¬g`5©òN¦¾ˆ£›Úoþj…Çëÿ4ŒêßEj}“:m£•É÷ð—‹'hë]ø”zc˜sî ì@cÄgf¡/_œzù‰,ýz¥áVÀYcÌe}ÒÐ~.Hí‰9KÐëb5ØéVHáab"K±|EÖ^­Ä ° w‚Hšjd¾þx‡ªÛk;åžý‹Þf½<@”ƒ`UO2Ü‘‰Ãpæxûì¨Mq8ƒ!ϸ O²Ufš–‹£ÑYžKj„,b«”#¼¸óZIØg5*%5Èâ3b ìD½Ž›ÜK\GêHi×T… ØîýåÕ jê·É|ÖMàÙ6Ïõ‚ßP†w೑ì×¥Vf uªAh.øæ.b!­·?kL}çù3ŒÓlTqð†Þ/¤Ùê©}0Ìe<ÙÑSSA‚ÓÞR.EœÙÞº““Ø.š¬/K ü”ôÂ>š¡ SõÂ_…œ%ŠÃ‚f.ìÜPGÁÌýf>¹[ÑjQÐ! nžòb¸ÿ²4ø ³"‹iDÆ£Lõ›7r;„Ù¯ »¯Ê.âO_¥YÄ ®ƒw¯ ™dm ܲ(þlîü}Âàð*¡µÚ.9¦ÇEBn’Ñoð`™yÅ_å•b÷~Ü%Üö*ásáÈפ"ï·)¯Šõa&%¼Å¬uB0!r‰mN°获¯íþרq’ÑÈÓŸK[)P·9¸Œý3¤VZ§‹ðÒ×ñŸ®k^EµÆ?÷â/Zß}—ÇoeU)q³é’¼¿[2($Lº¥Ã$¯JkëÍ2_[¥ðÛƒ|Ô4)Kã`¥úZÉaw¹ö/ðÞŽñÀÒ°´!/áó ®TFáÍ7Ë­yih¢Â¥w%õÁƒ‡þøä¶š9ò.¤Ñ’k<à¸:UWä=ð~Óƒ¼ÿª‡õ’jG›Ή³5"¬]R¨Æ O­þ‰ê ™A‹ÀÄ”»¹åLüØ·qW`º×u`úeµ÷ÛÃ2RïhLYŸÃmïxtõŸ^÷ˆüö?åü 5|¶æƒ1Û÷†3)«wОEä’Lå·{´Ì¤{0ªiûe@âû®6À›´!{«ùçI}/ƒN2eèË0'k¥œ%ÃFÇENἜø»ŠÍšB”¨„¹áÖ' 7¶!g¾hÎæ®ˆ|5„Ï®Î]ÀÔœ#2ÁWÀÿ¸*žt·QB²ú ˆ´ÝÏz›š½Ï'5Æ…¶ßÇnz¢š —Ñ'TÛ<_®7§˜»?äTyÊLF…Â0| ôbšëˆà‹Üìí«¤uݱ=ÑÃa y”½ÔÕ7û­1UÐf}rr¯ƒÅJ[a ¢Ì«}œûf.ƒ=AtÛ£\œÆ/0|.³‚¢ÿÊÿ&mÄà$éœ#º~ãÌ[難:cîJ“ó61GÆÈóf…ISÕ˜˜üÁ|m²ŠƒÁˆ²îøÚò>0 ¦ozÕ}ÕXC’¹s™Ï}ü‚×o×3ªÂÿ0碾]sDpÙ“q«”µ` ÉÒ1[ DÅ%´gôœ8Zƒ~–Ì$ëT(ae™:A“Éq}ÙpcýSÅMx´Z7ªass§ ƒÅi²›õ19‚§)rŠ˜Æ+6^¢nVNØ0üb<6[|Â’“´éí7!‘ÓÇÆ‹$ems›@½Ö™LQ…$w ‰©¬ÞݱV1¬õ˜æ–ªXã}PÓcñ4f?ŽÀ…;ºtö³IoµÊêëÐ{”ûûK«åÛ ¶t G–5[Ù/ëK0?À,ÅÖ ¯Íó¦GcË='F!¿$=D‚bʹ¯‹>SÅ©ÅÈeØç«=͘î…s ›s¡ìFBŠû9‡[Ñzh ê‘’¿ãˆÒíþVÙ£Ý͔րð,PF¶m%n¢ÔÔræ;ŒŠ%ÙþèbåKtÿIå+ÿ:ªT*³b¥PKø29«œäaºó¦Ô·›ái¤ÎáPöÏdÿIþÇn<®ÈÜrì-rkWznbW&PöÐ nÛ$í(#Ï0 ðˆÝûËœÈ  œBŠv¬Ötùؾ¿Ö~ªšPjäµ#Uù(¯tˆeÙôª$©þ,Ê –k¯üÀyÁvšBÔW™òýüÀìˆh+þ þ,idÏûàK”ݽQD, ÌÄ‘ƒöœ£±·Æì)–l8ïËú¤‹$°I?1¿ZÙ‘îÍºŠ“XÒ»0ªs2~*„vØ* ¢ !ħ±¶h%$žÇí%˜j+…<èß™:úeb}K[;¡™iø8çÑ×  åѨBòè(tVŸØ%_jHû·äõFþ-X(Útg¬ââ¶#£ˆ•:ɰŽ%,›‰[Ýõ¹FÝÚwJü¦Ö—h5™|X—éPþ+Wš(ø#3|,ú~ҫʘ.û¤^s+5¿O‡'ì™’¿m½¨@ÍÀˆæåhˆ ºG‹ìµ9Ä6ÖËÄxi …ÖIð rëÄi^‡ÃÕ!Ù½à:Ÿ^Ý>Úâ ôÏ9öò]Ë ð»m …ÍG—O´ŠÃô”˳P®³HZp‘Ú_ðäWKĺˆ Xz—F}C2ÖOrëN;:Ór'/ÍÔBå1Èj\óßýoŒ“gŽ˜T,ˆ?Ÿ÷³%{eùÜÔTú-ÎæõLëƒëjÂ~moòN<ó› 3ñDÖo܃òœͰ XªÐo*­°Õ~T9¯+ gE™¾Bƒz’˨T"Ô ©™F=ܺ¦`:-‚N±ïâë{0ÄYX_‹`Ì[M9p¾ùýh4 ßœØìpí E{ £%ªðÎÏG‚ç Ã2 ¸“=К’ 7ø#pWFÔ×zs¦‘tE›|Únš«|qºQ}Ïôî'3¦ê¦?µº€ÜßÈéŠ=D¬âd¥$ø7çí"¼-_¸°~Õ$¿ ä—[õú{ö˜ í H’c!‘f“¢¯)ËžK€E'CÝɹ`Z€ñÆ¥h?~–âS¹ÚÁüéø ×x,c׿<Éo·?tüÆn_4ÿ b§ >g&lèñ´¿Sð©]<ýÉ2§ºÂe”0¥Ä~Á Õ¶ö¥XÈ`_\l•/¤G2Á\¾¸áÀâ—ÍÙ}¿ Ðg# ÑÃ!‰&øXÒÍO¼òü›€P6ÖzãCÅG…{åYN(lË šew£¨ëiL¹Ê”X<<îà@"]'û€›PÀýð'hï2+ÚºeÏÕÄl—¹Cš%Ýr‚ªÒ;Z°õAûêÀ)H;7¦8)c.8oM˜=ÎŽU¦€ñ””GÇM¤Ê·`‘ùQ9¤qBE{ëAr^øÉá´7r–Ð’É–x>Àå’UëlE4QöU^X½©MñõÔAl%*³v‡+¶|”]­öd¨DÂZáÁ*mteϳšuy\ 4W|û$h£èGYÄ‹$¼Í „4‰gÐmÏ8J™ÝrŠ÷oKÃþR«Mr”4ÞÍ¥”}ã] Cî5Ñsô½äÝí'd¶Va¾P’Äcç¤Mï­c’_‚ƒPX'¢âN}kªÅÝ8¨{—akª¾Ü®Ÿy&h’³*öD4\Ðb¨=QUï³ùÌÀ>±ÿϬ^ò.…×Wœé-‰jÐ5X|ƒß3^·eX0×=އv´²¢í3d A qáwJ·x½NœZ}ŽñTבn1³ ˜—T4É8…81#1%C“E µè{QÖYK”)ùÆœv±ÃËÊÁögwjFc'êã›Gs ¢M£Hy¬µú[Ü)A}¯;§ÄtHƒ·™òÝÒ«gbÝJOÂ)éÊ÷(òÎããGx¼ó“reªÌã•æ3ÙúuË™2²H4RšX)c-ee²y²¦‡øôøKk¸ZÜÍa\Ð:‡uØýÂé©þÍÁzv†wS´Ò¡³¨¼Œ2µe-àia‹;xâ¾µÃRíbï!&âäeo$0;$ŒÝUˆûÔú*°Ç\C+m,•ïÔ˜:IL;vºWª Â€' %ù8Á–˜*6ªãÀj<€%rQ½ËDùPòFœìtH…›LƒT“&¤ çvuæ#²䇅†56oÄmv)i=“g¥Str_<‡m^ŠðºÒ^‹z#\Ä[²áØ£íå—¼3¥–(×<-ÕùŒþV]|i$ÿ².š&«àîì¤Ù¤­ÒDQO Ó¶ÖÕ¹Ê&Ï ¤w$Ö_ƒiã9;º-%uÞàÃRƒ%&âdk¢Xp}ˆS|) IA ‡™õ%ùìi/pAøÚAD•ôqTØ9e¿úšæ±;¦”!”½añWònàP—›Ü3Õ¨Ñe‹@€ÌàÝ‚O„ª-@Vì`ÿìî—U!„_ÎOÆ2§ ßðFUö^æO%,Ý¿!I:|R³;BñŠ‰Ý˜”æ­mF¬cÔ ‹é~p›ÏUدÛ/À”ñ2©±+ˆ$OŸ›NVqMî¤ZÊ=íÜA°«áÿ«Œ6ê†eƒÌ÷‡ã ìǦ¤ÿ’ªUW‹þru®vGæ´¸xD_,JÿÖ6ûð³Òy´_/énïgñ×=_ŠÍÉ#1˜E†2’ŽÙ7F,é]îó¾Žc‘"N#ÒûòÎ/œåö£i!0]ÞÌÆ±ø¥òªý3$ò™ù*àK_Á?ÞAL’»!Ùàð–!M³õŸURèJ8ûË+zÃô€2 (LÊLȫŔùçÏ‹zdã’.¿L±6öSÐC3w]*ŸfG„–¡åŒ uI37ë÷êâ;’)YÒìïß?͇ãBrN-ÑËÍo‚ƒ€Ž/ååŽÈ)ã‹OeßsnÛÿ¨d´ghQ;`Ç®¯¤r{â¨Tk8€Çû|@ǼZÛ/ àð†ûmÛƒ­CË‹KM„ÍX½«s‰¦½Ì²§íïº/$«P&ðõOß÷B)ƒ[4yǺ¥ x<Àˆi9l¥P€¬ó tÓAž6äX܇X"XÅ® ‡C„BL¯‹=sª†K´q¶YÝ•Y@韻'É&þZôzŒèp±©ã¨ˆÅñ´9* ¬ÜCj—K(¾®˜Å¢-̲1YXTG’¶z~”"45¡3Uð·}¡ÁÏ(mmí+YìÞ±¿/ ^€É‘L$1ß§ ‰Ê䄢̞ÀYõdòÔd‰w67  pèÚ‰³ôÛ@ReÕcõ9ËþðÓÅÑKžFWé’T2 Lø.ãVH'‚hðIÅKT3SÀÍÄ®ô{s†Lgqn$ÚS¾º6М6g õqÔ <‡ 3öqÆ%Ýÿ–6‹:ïÅ„»'¤FxÌZ&ÖÜ“NpB}ã—¼Baž P XÆn!T‘f%W²Õ“ÃY»†`óÌ^Y¬Š436ø9*ÇkO8äÄ$ÓEŽƒQ/šJ´JMœ‘‚em³¡^m‚TDzT‘D"i“¾õ{;†KÓ¦´¶-ÞZ˜¾"¨²ŽlICœlrŠŠœ~•P¾a„\|þ­´hZVÑ<3(CéêsÃÏåÔ©iTõvÆœY*õ4Û¡çiö‹_äE2•þß{sN²dRz"p¯jfÑ¡ž‹×C&››ò?mŸÿ· a@zÇæoe×üY~)Óü÷ÜmT&)‰ìNgÆ|iKð—.N̓@+ÚÕjC´ò3¤Ð㛬Y_Ó{•øÁse<¯æ2¬*Â’m³ÜqiÔ‹Ö©¸uÿ‰59át„}õϮ˴â#‹>MnD›îð7Y¸÷¿eÐ|>îˆNYÚú=çþ·}Qz¤9{V¸•YÖ½¹f%›ÒT4T‹Ú‘?H±>íÃCÇ|Ö8lz28¬ÒuÆùœüÖýÇ¢Š*Å•û?ÁQÛayO‹0Ý`ô¿=L­Ý%ŒÇÍø1d^„VWºšRÅKÚ¢¹@B>¤9æúd†Ç6*B ÙÎÀñš•ݹ‹Ý÷˜ã`{|«þ¬·t—å ñ½;œùà ª%ô*µÓ÷å,7x'áÜJM·9Y¨Ð.·âŸ,=‰ÎäˆøýÀvž6„E ¤CÄA¸¼}»Hs“%xüràʈ-ï Uè öøJÿ{ØÃ¢ŸPFˆ%|âr¥‚§c†1æMpÿ¤y‹hö=wÜtgGb)uYÄÙå¼ðµ1f?/Gh]J­eŽ·ž÷¡³XXx©ÏÅ_åëøß,Xí#°ý¦‚š@ ]f zǯ¹ªYÍwqŒ¢ÝëÌQ›6¾NM981T.Šˆ£HƒçÚÑ".\Z)ï¸âXs¶$¼A]Ûý¸Rsª18õÖRŠr›¿:¤7PO6ƒ[ÎìQÜDu¨_’™ ÂéosÆÙÞƒG8{ó˜|CGP†„yºt»mg&§>¬uãà é w§ö(¥@dúÿc†\y®èêýÐDh´!û‹ŠMýŒ” ÎVâ‘5ž >ÈšAuqÄJäóæÜ<Ó^ó‹…© Rö‰œ¹pínªŠßÄôQR i©'onE^´X®Î³©“Ò8Óº¯égê”6êÅÈ †,-›HPz#¶ë™*÷r%ø1ù²µö lÔä+‚F$+M3ÄÉú”iɲµƒšC™€ü(¯?Ô•$e*~ˆüX@çWûËçΫjõtÁDyŠ®®âêóÔ¦SÀˆÉ¡-`°ïˆeÜŒgyi5pú‘ £9ïÒ,í<(´È ;þéL³9å@˜š5%QüZ_Ö4<Îoó•ÆDt®s!óq™\v+utÊeà&hK“Œ²Í<Ø*Rytx;0CrÐ?“ã[F’ò80ƒhq+ t“)Ê1ë%# ‹‹ù}ŽiÙ}ú˜mŸ6ëùRzIfR¦ƒH5¸ÿŒ:øAÃæí«[êF€H¡mÕ(-Ö7!«æDtAŠ!Hh Ü;Ë`IÛº×k›y0È÷ªn³Jš'e®†ÉÝŸÞB­Sçu-ä{xñ2¥âªÀ¨¯Œºò†ÿëô;¥‘¶a s¦‡ãëýúIôà*L5ãÎhvŠÙ½NkÚPÝpóŒáÝ«ÕÙ qMöå DŸãMÖoCÇ?5œI>0©á}ªÎŸy/,ˆ\Y+gËÙ1‚ï3¢¡ ‡Ue²‘‚eèÿ WùøãH¹’BM<®·øúvE]&°>ÃÆ’±(‡cË„ü ¸.§§G£â@íBŒéŽpGàí_’¤Tš÷f0w{z”DüˆtÞÈT@¤»„Iü8{DWÉ@Ô—ëØóñ7¸Œz ø«Äcæ@…wÉ«óF"q/{˜¹ºŒuFÊ–4о[Œ!À×ë[ÛÆØRWëq¤–èRqÉFRóx0¢úF ‘dÈa¡Ûì óÆÑ…ØTÖcçÜÒÞGPý—ð›”.ÄðI™›ŠH*j¯ñcº—¼ ô¢ÇŠ NòòñÙ5²—¢v˜Ø*'~…ê³]6ž™±o@f½;ÀsîCÒuýIÊmdg¥`§wÆRÈýþzFûFfüPs\Ñw0‡k?Ýá*ÄĵD„؇Œä*"Ó–à“!¶ª6qbÏ{Mx½8ö,ªCUK6zÃxÊÂùZçKO}ü_Š„¬’°±‘ßÓ`øŠ°aý£‹¹5ìÅÓ¶™Ï\ VqÆn „Õ"t£Îƒ º·À?šÁ[¨“6E=ÙµgÑ1«ñX]ÜXn¾§"‚hq9 • n¸Á5oÖ,wÄ#?ËNâ¾I„BãöÚbp¹ûõzº‰Ç^nÉlÎÿM¼ª!RÎÝ̨ÚnUŒ…×L=jXç®v+‚>üÉÛû㡸ê'›'X™` ˆ ñÌÊÔb£Fõº«W[¬H}˜„­žê0ßè³ÄOj/ÕÑÈM¤>éhç±@eÒfÛöÓzfˆ¼$Ãeºi‰CÚ*+ 2áL¤üê†Úšàã¼JwYù…ÜgHÀˆR?)½É%Ä'* Oê„ì•®t Y“•=B‚Ì­ŸÆ7ßÎÛà¹Ø²ã7Ì 2Ä™vŸVÙjj8=ü}N21üœÛ¥í†Fcô gùïD¦]ëcZ H»¢T\\A£˜³õ1Ž;TŸòrÀÄ/ÈÆ_H- ¥¶¹uºè;7NMiŽ0 ‹r6vø,çÇ¥µ§GUÄæyäì±¥˜Ç^¢ŠÚØôÃÙå9.*¡ÿ8X%9¼†©xç 2¶£>"žÉgFY½a*„Íð`ðqn·É¡˜¿ÑÃQ2…ÿÚ9¢•¡´jw\ÎzøYû4-‰*³w¼<¢Ó¼âGŸ‰„h9‰h â.…»“ʼnéÙìÉUøms@Òë\Dä¬oS @ƒ’åÙÐR5Üi×ÿ‹åª;IðäÔöéxØ4-¹ýx¼¥F•h§<ÅñŽïçø$j¹D–YyÒeXˆk.ÃÚè*^©¤«ñXÆEºÞ¾^n¥¥&pB÷zø^_:z<®~Wiytœei¢Gó¶<†ÿ³CÞr~†fÛ ;ªwD:Ÿ>ÖÐU¥BáôL)³ÖíY³ŸØíݳ aˆ%òÓoŒdiû×ÖLf¶ÕJçÆfWSTë[u”ÖlyâLù¸žN WË‚ìHêëÌ©•<ðª0¾€AèeÙ¶ø˜vUÌ$@ÌÜ$)¼~ÜüÖɶ¤Sª‹ö˜euÂP¡>¡tD›í9÷.Óò¶Éú`Kj¨Ì­[\³@˃ãpë>SDÅžŒwÊã²`ùº{‰ÿD—%š÷ߊÄ(Ü¡d]l¶?[ÖÍŒËN7šÌ½‹™×]O¸93â?XÖsŠ‚²¦yðõ­è.èôLDÁ–ù¥iuÁïr zB\šùÑô¦2ØÃý(£%H[™ùtf"È£Ÿ•+ #ìw¬ï ÙÒ@ë“ÂêqµŸ ÒÛ¯•Z‡Žg#üzUÄC²˜¼ÁÀÅÅ;ƒ±²èvw5Q´Í¤ŸeŸD»·­HƒÓÔàT4 Õ,Àr´jå‹#Μ†V¨A7¯‘}Æ„ìij¡µÇá}pÿ Ñœ½n‡9ú÷g.a0QÁZXjÛÐ2<< Ú¶ÑIë®Ya+4b¡&í패ºýÄ'-:ÐìäÔÂãî߇£`@>,t:È7ï+ŸX;Î’É& åë§wÇnÈš¾ë!ùðÇj3ÁaSñ–v Ú…Qr¸ßX7ô•)næáò,¼ÂxIç ¨¯Š±ñâ3.ˆM4;ýê> õ§š*<ÌZáÉ)M¬Œ-^¯ É8¡¾¶Ú_6e ÐN¦œÚL&PimD„ F9¨ãþq­¢g ˜’œ~ óy ÿžpf4muÇö½ŒÛæ%‘ËК¹ßÔ´N¯DOÅ÷Ë¢qãµÂ¶©ôR—7£þ™§Ü+ 7m %¼£Ã¡QÂÚYTëá÷±è™ªDÏús~ü±×z?UŒaZ‚S€ ¤'Ί¹YQaLÉoE`MÖoƒ^Ý#R”îx8uK\÷|îìc…Äþ?‰lnE"—$®_âÍëxì9vKqSƒ`ï¶ûÌ©6¥1Ôd ZÈ\ #°)ĵt{¶ëµ Ì?Z°)Ë ·@S¥¿t ^¤Øv—FåZìÞ¹o†6ŽŸù x·ZÎSA{n;IXe¼@Öϲ Óz{Ç– Èz‘ÖÓ CZj)@û™äy6w!æÏ ]\¥Û µ&Ù¯ö0¼ ,dÑr­rƒ÷¨3—³½ÕÞ¹Cyõ¼÷Ñ Ã×+6úÑ “qî™vƹÊõ›ôa®õ£K$ÆE9hK79DT›b‚·é—6PE}Ñf•6TûGÝk¿sÜÚ•T á ß–Žz…„ƒ&né™=ˆ-îwzÀ´H+çç½zéÉïˆÖqwI;±9æT5§]ï-”bŒÉþÍ®Ìì™MM#—ÝävšìÄõ~•soU;iL°.ü©yZz*Ó?²0lc²Î"ÒFdóqš¾3í}—ýmƒwéjĆù‚ÌI~Bj²:•3ÝðK=2_Hͼ·bÐŒ3AîÇu“3xÄy‰ZÝÒúž]3fJºy¡s½Ë)O“Í÷Î`ïq@À}Ðt¼2LNÉ™?•¥ŸÊÐ×6vÃ…VDž,V6ÇŸùТ¾Z¹h€7Ú Yß>¿oÿÞƒ%e¿¡RÁ­®‘³µ4æô=Ç¡¦dxÄ û²f»ÔüØd³n}ñ%ÃSD·ã7lÁÇØP"KÂÑš§ô+E5z‡ÿCÙh"S«ðBæRÃmᯘȀG6úè~sX;6ô@nVDÑè È?CR2†4DÃõ JfÔ¢h ïÝsK{ãUmaðc21³À†’U?21 ës–­í,km}ªL«_n-j+¡«6¬ ¶™ƒx»ðÐøþ*‹@žªºì2p2zÉç£SýŸ†F‡±ÚÄ‚—É]lóü,B(„Õ÷©eP½z10å\}m8Ú‘ˆdS‘º¬8‚(±¡p?SŠvURpðý∜¦è¸vÌàëOf™×—®\˜Qð£U2¨yô±xMÀÕ“Š ¾Ás"Æ^ vÏ* ÆÕ¥ ¥îy>˜;löTq‘µD{ÿ¿åĈ&{œuᣵ{]ãC]5Â'ªØljù£¯†?›:L g Ð ¬rT®½Ô¼E½Y5£9sô ÕùØ®ÛÊ+°GOÔwóYoçtqÀ»*®PwâÕǾ&­b+* $åÔ$ ‡Ó¥Oc$ý%gûvŽñ u¢2<~ngr¶H§]ÍJx»gp„4¹Š‹>˜–7XëâúÏ.ßÃ&BY΢jUP.î…5È݃÷{µ±ÓÌd#æ\Þ«}³DšWl)dBT6§{ ðPÈC·y»Ûö­*çT ÃpEòKÆ \©`D"› èçúqT2{|Ã/ˆî<ŽXBÚ—¨êdoÌYmQ¿—T‰qÀO-Þó™©;2vS¸8I9׆”¨¥Ÿß ¥’GÆòì‡l¥Ê‡®­Îþh¦Ìwæ;lÑ™‘æ Îuãk§7ê’0ìS¥ Eq²cÚü'˜XêN€É½éTÍ~ qÕ5,©]?½#ÿtÙ(%°£ šP ý‹ï¹å×"V•-5~D™É;z(Ø%Ç·l^6ØbÞÈïÏv˜3åðHdä‰ùÒÕ_çž+lE°âG4W¸‡­È"hîÛæ0¸»¼²ï^7©¹Xð]ü£î¹êÛ(ª¹*f†=RÛq¢ (dbjŠç^‰.s·ë¬!3hô €!ó¼ðö÷ÕY(ùXŒrúMRaœÓ“¾ 6æO6#=;¤ ŒE×½.ñA‹hýRÁ®áÝúó¨6+)*4ùÅ vHPNéa«àås¨}oX_ÇþÂ7jfhûov ›þæ¼3>l‘&þ\Œ£EæhÒˆ¡¸DUÆÌpf>`áÈû0ÔÛ ºx€iæ“h-Ô==Í¢„h^Ž9µ²É)}@Ü aã/Ô¨0ÙRìí›ךÊð‚—i®ºW¯Tä£ó¸k,bÈŸ"¯½ßR…vŠoíZí{m}±ŒQÈMþ¿Ç`Pd@Øe¼ò€e@èÃ?vkí[lå#øì•’çjÎÔ<"ûÊ=ý”ÙEH÷»Yó>{ªŠ–­«˜AˆmG±vøÓ‘2(E"Ùâ&ûl“Ï`×½¿ou¬ÁQZ€dÝ«8»”ј—^¦+ 6ßIR*[3©Fâ²ú;‰ŒÖ¼ÑÌ mºkWÊÝÓŒ×ù @3ÇuψH)Y²Œ¿›—ÓévuñÓAѯEãòÃ/ä, ¯ê„Ù,&ŠË)©^Å»èFiçårepÃJ€PH°@33Æ\c¡UP Üä_Ôñ)k!ÐËí'„H1#¦ó'ùöžpeú ˜û@Î`a H¶…oëÐÿÖûï2¥+nW@u­Oç¾é©Ù8ÅWe€ØCš§DºNÕã*S2yÒNBdÃPÐ}Ôf>Î ‘ka+O…qQ]UWSRUå3m#ª…ü)UD%^r€§YÿWèXZ¹Z-?wè+ßïœåÑÆHèþhKe¥Ð_@.þDFdÆõ t<š’–e°¢ñ‡äRx‡Znã BX»üp„?š„¶9‚znNx•/T!Ò/A|¯õ:uQ9ñéW—pn=Ê›üº%_=‚ýíû ýõS´wT.¡·û;ë¾ã)#h»säÊbû“‚1Y¹´ädþZägùéE”I‰å½Ÿü<0ª°ì3lo§ˆÅ»ž<»gfâü-ñä“®ÜR}ˆ/©>À"®/Imª“¾Ÿ;ª:òæ—jÀPX"Ö0ƒ£’tÝq,‡4Œ(ú¾#OHÊšñ+Ö.6oºV%°Oäþ±ÞÝh»û¨‘*oQò[¾(àç —³µt†´X4¾Ë޻„òÂ¿ÞŒóø©¦në,ËΡ½)P¨Š1ýãÚóÎ-öb½gFs­›³í\ÑZ ù¼‚Ù¿·_ê ¦ùùuá¿>MÄ6ŠõÀÑäÃÑ_2Á¹yÕ<'Þ“¢…x×õaŒÑÜëæžã}f/Á„a<FÇòžzù(GPÖ¶~ͳŽÙÒ·x*(G°‚Ûì›Ê®2e°Ä ŽÕjƒÓãT[ô›´ Ïfò‹Íè´ñ.tq¤'–Ù˜ŒD5â@«@nÙ ܨy/« ré43ÚW'4øµÎÿ¶¸mÚXÓ#ФCìæU ¥¡wuá?qm)ÚI’ËŸkK]-‡£ÔÒgH&@®4½Ì¦6 F²¯Qk©"L…BcÜ'ë¸O§?ÞÒ\kHȱ²ûÚjÎÔkÄѪ®vzÑÆªXŸ§êh]âÂÖlÆ³Öæ?+°pbRUH”Îþc_9\ßþ°óD˜Kxâ†4¼uÏQöÌÛ˜=Í9W§mï 9¢æi%H`7 zgU~ù—vù¤9E”aãîÒ Íj*b„VŒË@ÝÃÕP-pºì}ß¾jK‹V1KÎQÀ:Yxp廸]hSe&î|öaÜü]í_ƒoéñ œn„ ­ dßr"²ùÓ÷LÊåÔ– i¹×ç<îADö¬Á¿{÷3¡‰•¶xl¿z@NÌ~\el ¢š³ýO½#¸þÊ¿ºÂÞíqêÉ-iæŸÑ Ë›>ÙŠ«ø„‰¦×ªà˜·©eß@ý&l¡µè26~O"Cõ'ш.nm4æ}æ¨É´ — ˜îqÎtd3æ%Æ„Í C¾ bÆ`•ªêeÚEìÍ©(J×k;>VW–uùõã[%R>_% ytçž%ŸmbÖNœü*á »Bµ„Ìõ°×ž ­Jª?dß)­ÝBs¼«P¢›àåS=Ì¡¸šVËÉ(ONÊ»°5cú†]1$#ñêÓ`sy{Î¥"èdêCþ¶1¼ÁÙ´L(XÍ¿å‰ÐS(’k>Žœ½®6…áQBøá¸àØ—g–kÍjÏÅkô»¦®+pû@šm>¾ƒaøÇ—1÷ ònÜ€¢§¾“{IÐTh^zñž£M:Ž£˜ Y@Aò/µ1º½ÈC:!}Údž´zâŒãœƒVô+eÖ€øT™•‹µa÷ÚBá‘›3…P#à—ŒLêW\¿”Zør팉ã6€lÁÆIåЩìUt³é#´n mk© ÌV‹208Ùß2 Êó%Ö¡5ÇXdŠ2Œø³¯'ã1mœ £ 0_ò¾ ?ŸñÇŠZ5³Ù$™‚W×s¤çPÞKT·c8½Y³;ÅQÁXdté„Ü(”RNÆ7V4ÿMíy…­ý]°W=ò8黵>§Ž~©"*’gÌÙ¨þ_›Á°-® ~ÔxìÖF¹UkIù<ÏÙŒ é1¼(w™ÍXEê-ÇdM™Êk¡d…ìDà,]Þæ«–<(tÞÉŒŸ¥2 ‚/%u¶‘íu\ïË«“4.ÔÖ‹mÕŠÄ)|3Þð·\ç¡#Ú¿ÈÂUNùV< ˜®2O~Ð×*z®zi¹œ5elA“gâ‹0S¢Qÿ€þCÌýÑ+1ˆ%ÞÉ:pˆKâ,!4ÀÓ@Ü÷.±úØ Í«E!ÖVXÒ–yݤ>[¨U Èú;‘=, wö~oì">=Î%%#…7oÝY¤@Þ9|ÔÚ¥ÜxbµÔ›Rª{ K½$Í ´.{B¨@¹±´k·D<gl´¢Û¿6fÎ&ÞRÚÞ­ý`XççÓTž‰kàf‹>®ðü¾s¿7éIKŸì£õÄ®–õR-¬Gµž¨Q“ÔÞ%OJx†a×n†Wá-ùn×5W'GHòòxÓ‡ ÉäôÁiNL¿’ŽÝZñ™1òV`ÙDÜ® D€üÔ4ÉÊtüûDZ㫾V7åÏÿG•üØ¿³g4–IòÙy¢Àιb¨rÒ{ޏÖqJy¹ :5)‚Œ'D- ÑrÀnžS‡îú0Ûk0iq÷1_ƒ¹>ôz‚IAb¥éZ¾ž³ŠötxEaXöN”ùa¬ä. ôg÷À ÖZÃÂxNðht)"Mýư›ü9h9{Q¥)‰ý¨‹Xíùj2N«¹œD}`T|›úÕ2(½·¢ÏnnûsJ?긦³üšÙ%îcöa™Ggœ"«¦Ûþ¦E9í/ÌdݪM#ÿ˜+¢ö]w×pÜ` B>¢Ø(Ü, Ä·@©¥›½ Ex—"-˜×IEðñ,rgŽé‹åRˆE®}`þ>]t9? ÃÍ’•EŒ­^2¾Ê‘òŒ“ŽºÚŸá9iî²2,´£«¨ãÖ@Ñ~ÜK7¸¾ì3Rø²_½®b‘ÝAì¾¹>üA,l?³‘ƒ ¾ ÚÒKþ(U8'[†ÏèlÐÍN„a“IJ.?Í ©¶ì±='fŸg‡¼@m‡º% ÙŒGž;S¤w D™ê9à‚CN‚q£vè‰U=ä¡ðЦaÜ”|òX!i,¥7q»9m,Tæ÷&ß_U³À$|ñû….š ’˜¸Èv·ï'R&p!ĺÎÐø ¿¸KÖ=-]¥—Ê»f~ƒçù»i$ «6{)€Œì©Íþ ‡bôŽc¿“à5'9caG²É,2˜ê§‡·ÿð®7ˆ%ŠÇ¹È*¶|ósZŒÎŸgùºúäNú@øIÏÄiéÕ+ë%Ü‘vËišG¤Ij!S.bl’‹qµÁd N¦Ÿƒ„6C]Ûõ†èÁINzUã ø)Q2þºÕH÷$÷Ö†—míK«2ÏŠ/g c84 ó›wŒØÌb„yÆKéšiJ¼ž ]mþk^’¥èß%Fà“Ÿ—M²¦kò‘MÃëAésðrÚò!íÊÛrA\GÞi638reÒEÊ&¹¿¾2ºÂù6’Ú&úÁõ ·¤¥r?LJ\ä+=<Zñ^%ê¿°þ·“²81]àkC…†œiˆYòÍÊ®c{E6˜”YàßÅVaF—ˆ’YvD¨™xàŸ‰ë É4óbߌ„Ga…½tü’XgA{F·Úgƒeüya6Ì ˜-k×€ßÛOíìÑ5 ¥ØÉC/ÿð[½8!±‚ê€âàþ»TABÏ3 ÷÷ňsRÁ*İ6œ.žŠAæý¸ï }„;¸²#;òkZB‡Tù•±Æ:- ¶MK¾lÆei“6ÕÍ ‘Þ‡b£?*opCù´.¨ÀÝ+`}çt·‚ÔÆäÈú–õ‘þ2íbX2%`¥ÌkCÈû­oLK=¶Ð¬ù SóÚšb)G4XîŠ8ð<Ñj"x?¨z"káÖÉ{¨µËJ^ 4^+±ó50GH·kÏö¿æà£…% y}˜ÑTîôJg1«oò¿u8ýyãT"P?=5‹âá!Š~|uùjz•V$1¾o‡•XàiâƒÝ+%²´„l»@¥IBhà£=à!IZõ¶Éî*0£ÍLÅ/F¸†ùGhj uYÄ G‚÷fiÁíM­»„n-qöoʸÜC†:m'ÿ›ÍÀ½y‹Rv♵›O"d—KJÁœ‘›ÅÞë$d­jË>S¸©qý¦PPs˜ nnõ•ñÊû«~óEõ ,ˆ»®4qÔ/ô¶Ì…ÿ•.«ú€¼=‹ßL!ï}ìu–±Ïɧ`͇ýV÷¤(Öàc2;h*±Ñ!_iA˲”Yùë±wJ••ÉŒÐ9rþYf‘FKˆ¡à6ߦï7`}?¾L‘¼pç#µØ8µ¼ê£ÙárnvÇmRÙ—P±c+®5‘ ™ GADêÔ·An¬zÀqå9UbJÇÞ…Ú„L6PÝ—Ì<Ò¨œK»nP=xçÿÁ§îc;0©çõü¶Uñn­yL¤ 9*ÌâMR7(s4°¥)ÀN;î6Ðr¦D•²SgËÍ =s´en0³Ò’_ÂBЇ¦×ÂkÞý‹Æ½tÎMÏ¿˜Ÿè [‚OH’D9Yˆ™*t}Ixb±²Dÿ Õ¶—J½¾ª’HµÉÜ´î¶_âa_)8ò`˜Nª—„”\o®na6Û‡Û7ór@C άG%J¡Ç »ÜÊiyc÷Sßtº^ׄî€"ßLÐPs%áÍ•®™MÅúèg(‡Ì?Êø§An¢`IJ´6L-áˆ:t'!ΣfaÍñÂ=qK(–OcÀ^õ4dWQ\©®|/€S×dج·[åÃL¤¯W-r),X[ñÍS I’E¿þÀ~/ž{~xŠw*Þz4Ë¿kaeÉ#ÿß®Ò4®V ‹)ðP†èÁß°9™l½$A|v"ྒྷ‚šL(í"ÆžÁü/x‰ß+òØ.ñÎÄÜÝI[:ããÅä¹5;Õo7jxݲ©ŽÄ8MÕã®y›åŠéJa÷Rúñ<ÔÛΗ¾ ¼%)ýk҄垨 jx§È$ P¨ãê…uÉAܵÛÊÑoúÕÂ.Ô&•Š+¾À”;VÙÖç3žeû/ÅWLòRk¸†—Aº•Í“žtQÁCy§Œ:œjŒhd¢–ÎSåjBP°†P/,Ôå¼$äîŽ"¦`öž/«LBŽx•l’±Ü.])¨¬<ξ|¯2RFÔöµ%¾Õµóª×†í ^Øräqòt+-·Os¾›D5Ôpö÷ò7®ªSG%廾“Ô™¿2”¹¬BGþå Åî2mZÇ!bñ%2Í€ —Ûlf¦zkÄsÞ¡ÿˆo»xÈ£¥m$]ºXnxŒ:è’„hEf˜N•òä¥E°«°ðåX4-Ž=£n:HøŠS;¡·Ì`âÝ1Žq™Äc?û¤ EäÛaìæQŒ_™à$—kuTzuiPõåŠKklQzòéÓZ\–º@€Ðóªô´”ÂzÍ…úÊ„Qð´çF=gߥ²j¸ì,c-÷ì.;Ëê©Á1Ð÷4Í{ú© ì]¯ö=ím‘ćÛyc¬åS1ÃÙbú™\®ˆwq²Q´ãûvÂŒ{êö,åTãÕwcà¦ò÷¼ ^ÿ9^1Yô}©p~Ïñܾ¬›io=ư/<>C4JW`…–¡1Øý`‚æ;“Þ4z3}^#ê³j¤²ð&øx$æsÙuhî§1ÆØ‘êð˜ñC‹ìôoü³ÒÚ+ÇNžÙ³[­byWÔ Á¿–Z!»_1Òó¾Î-ªþ ™7¤_ít›Y9³Mfݨ$¼Ÿ:3``Ñ­}y¨ëÄ-˜2 â­%Ǭ•"Àÿ½Š¯™Oeh£¢7ïÌ©b«d­`ÖÔº‚±«nc›ãìu>Ä àL$ Ê_èJ>Ÿ‚ߣ»{hâ—\g¸§`m8ŽRå\àš6J€jóƒâU –§²<@õdùÆ;zYKPcs`þ:g㘬ŒkñÁÄ2†q°xúêýÌ[ÄgªuѧQ±$"¯¼]¹,QÌ÷Qòv²È8õ`bÁœ€3ÆÒÝ« ®V»òo)"¬¤ÔV뎢&ÁÆáj*©{\6Òbüâg<>Ëûkè»DN(/è0µHÙu…þ_ÛÌâh™-A释–Y0ªð·{IØÀP¥P¡¼¶9¦Ît_ôBÚi0ñiî3µB±Q0Äõγ-»©{Ô–Ôä]ìc8 Ñ'"šÓ…æÓ-´vÇ£óœ ¬ïÃõˆÒŸ6•6ÄJo*!Y/¦š¸ ±_=úåÁÉ&ر<†4ŸfµÃÛv—s·d- òÙ*D>Q}ïÂ9p¶ŽÏxƒ<ÔWûÒ] ÖRÜ¿_àua‹µ€XóŘØ/,÷#„untxÀRI1óïÖÄÂëïÝ ¬SñØÊ—ö:ʨU \eäkÊ­çU"ž zBkÿZiÐwDK‘ 2*Bø8/s8J•a™C”ˆ.ýŽï`îºIó娿 XžwÎnÐÔí"‡Â"¯ˆŒÃ’†Ñ½¡GEOKV_ ~Üö˜¢¦½^®¾âÊ^Ë|eý{“&ä<Ò™éÀ=º¤Æø?õöÅ= bÉ×aüfÕ÷Á¡ÁQ.$ù"$g¦‡Ì§wÙÄ M¡6‰y hãHß0Œ¸’£FîžBxÃêsôÀ;úÑ~ŽyÍy-’ F>Aãl¿Îô'ƒ#f·yË‘ “,.÷°§ÖV0’·îIPÓYÅ—#çúy›€ÇÒ‹Ü›ý)’»³¾ÀévxK¯þtˆ}í~`a‡ ÍÈU¾ 5LQ­ô0´JOÍwâï£^ |Dõ@õÚ›ÁÛM~‘yŒ0 Ô¾sWiÄÕPŠÔHLØ'êîïSç; ìF53¿àDÎÃZ±kÕ‡ü­¨´¨Þw¨‡»€»K(Î+-¾lU§jIð_Nœ¯ìB!±â‘PžuaXø%8]Ú^›¨<7kk2ƒsí:ùÅàwžuÒ•øYXê¾!Gåz\NH§}¸k]Õ—{´dŠ´&v¬ Œï#ŽŒPº0Åå¢üO’{ªbál™¹X!µ Hù;îä7™¢ó–LògØ µ‡déóh¤Îu‚ ‚”ˆÿ¶’ÿ$M¾pñx×ö-ÜÒþ—AOøH–" ÷:é%k²x»qb»tær—¯Z a@>¯ßÃ^_uªkÐKâ Y_ûîk%ÌÊß ÿ‡½§iq!’ûCU¥8iY›3ËÎr6=gZS3(Þ¤¹ÌåÂ]yô. õ5ûëdüòñÄ$žN-KKª¬’Jz8¼Ü±áÎq«RßDeaÐîÇDòp‘C ö–…ãfkÒ¶.¾Ð¹Oü¢WïsµÑ?óÇe…eÓäG¦a\½† ú„¹»,Zg®^ƒ7Ü&4A7‡âöX:3)%{q4*ó+í9sÉÍT#l}‡ÿƒ3uâË̺Þ,‰BÙkæ©Éø!´¼>@[ãß@™Ñ†æ—ðØs8<Û0[n[Þš~…9 ,9Pñ…çÊë[îÀçæY‹=\\&pÒ–<#ÕH u‘´À[ãE…0EæÑ5Lr¨ †AåÒÖÙHbm(æ!ÑV˜VýÌ‘^¬õ‰zHÎxvGõk“¿¹ÿ¹0EVcù‹b8X ¾¡›äyÞ£ÔSzã²Ð¯—4•FP´À·9ß\yTÓô®z•Ÿ —‘Žš™Õ­»»(Ú/0yÒG o.ÓŒOÿ hU'ïÆŽiÚ³ñz¦œ ΋{~œ^âH"Ÿ¦{¿ö·‹€G!Ê“ˆºšºzvüÒ©Ù™mÎ&¥õ÷}s'jýš0Kú”Þ òÏNש@‡šO }£žXÿI¬™˜rc)…%†Q«0=*8Ëa§H€dµ/Á<˜øYX'ÍBçKaŽÙ ;ˆ"Äðèx?'·OÑÇ3}ŒV@ kÆïSbHôØ5yPXÔžlIsRܺ+p(ÿ¬í6;„ÒhôL>ØÑ8[ýdÿý·ßI,Ð[˜î‰2àÔm›FL^GÍ/Ú\E¾Yf© ÌjÔ¾{¹$Uâñ?hEV]ÆN§Ö¥ÖP•òwxÔÃç$AÍàü2#›CR8UâÐ^Pö9t´Íjæ5FÝ»´Â¤Áªdy*Z½{Za1°©)ý/ra¥‰Ú˘´‡—³XÕ4=BÅ@ ³–šZ?RAŽž]ÿMÎ-ãݽÁšà¯µjžõ%çÔB°ù‡OYKsŒ2R‰EŒ¢) JraG²áWŠסٷœÖ!í›Æ¨cÆH;-`œåìk\È+yݨ‰IÎAßÔ48ëCÕ³î }GAÿ¸Iˆõ’²¡ý/Lø[®Ì¢7UŒ,>é´/z“Ñ>ÕMxPÔËF×2s³™§I ¢zý¬¢CSÜÒeýÏwÜœ´ìxƒ(lnýOZ¯”œL-.möç÷wbÖª§n¥iLR¾(;ô4°3£1·ªÇ*¤ÒZ©& Rc`¬ÇÓXÔ]`CŒËý«Å™¯|ðcÝa9…üñÑ×o±™£:• µ+–ö6ýzºH Vÿÿ° RÌi¤nÊ_CBS+æo 1bç˃ÞFÚlÁN­¹am¨óH퓱 Ü ΗŒ) Ø‚‰MI]ÁDj74;÷£ƒ o »&áÕ\V¯×«/DƒÑeÔY©¥x¤;ÉS^Á ‰íM=¾P©;þXhø¡2Wµ¯kkÿÔ$¥O|÷“ü£ ÜsNÞºæÅúÜmÎiÓϘ( aú›«$ÈÎDr+/L|÷.Ù,gñ:ʃ*V…üsìþø"ëêÔu(Þs·'OòM=á+ ÔõlRUÅYÌÏ~H0f7ø$ýñ ¥åFðOÅ)ÄôÛžy) (R´à .’¡½†ÑLöÔ xàM`³,ϬkcBŸÙ”,ÙøQоoßP¢ý0ý@öÍvƃo\=2N²°³˜À§¬4ËML$`í¢rÒÊ‘è·VL~À%Üê?¨DRÙ Ý{#› º» 2ãÍj~н ýPönïÅÊùª5¼èß/xe”<^!>µ‰œÍÐüqÞ;v2U=ã ÒR½<}GzvÄæÂ2ªÛ¥r°±[uÌ«…‚=¹v&uöÄxö è0K(XŽÁý÷~Z§`” dQôÙ÷ñ$}½Æñº3Ã0qætÆŸóii󽡼U>¬ó•uÍ:m+˜ì—%µ ]‰f¦`Ozþ:‚ zc,Æj=Ž—çÖH™ò%-dª£¼:(Ò™Qw@!¬]ãÌ {9µû S´Ë—hÿNò’9|ú“ N3­¢ßò|D’˜‹·–µŽûláýÁh“—߀ÙéUnϾ‰vª¬’ê?<+/6çwJ©Vn>¥<©õ8`?é¾aW9‚‘GÞ£Dd‹zìCjÕTBܧÁµ;Stß ãŽmŠ˜~É]Hð%ɾ&üfìçÅ]›4sR°PVK©û7™ËëQFNiÿl)4„ãœCbZ^?Ùí¯ ¸ûuùÎÀyÈ©RËÜ5D ¼Úoeíëìb% ¯ÁT!5¿#,nÊràï8;ðÉF*UnDxÁ–å8áç ñ¥dŠ®T2Y¯w2ŠšÚVjZàÑÜAëÉ{q#[ÅØ'åY´µ~X¯#@B$€ÐfÀ'…S˜«Ù*ùg[¼²à‘WŒ·üs¶l¢‡îŠ[¸3Yï‰('’¨®<¯Ø10?l×ôÿB]ú=8ûOhÞX?¥{ê}åöʶ%@‹þ™i‘‰P2•® í1ªkëáUãs¯Ö㮽ëAx őŲDd±QÜ"ÌÎD Jc L‘^źI¾”ºKq1BZIøbE’q¡Îh¹MÛ1KXØ<ít;Ù ÷Œ2`eàa:ŸGœjƒkWoµ™Z;ÞD„X`¢¯ú_ÔYU„,ôO&¨Ñ¸dÆï#ÆŠÖÓ¢™,Ò­ÜŽ±ä¥&ËØgaIgm@¨ö8©â÷NÅV7ŒÛœ@XV› '5=t9r)Ûš=[6ž:gz1½ †þÊê÷À¬L’]ß }Áõ³"¶Hµbû0QƒNDörÇ ‘Á¦«žÃÇs_hPÊ$2†2·zÙˆhkf¬²ácÜ®ãvg?çœ.1ÁB~^”Þõ†5df#?6gµç?w.5n ’|]Šb«¾¨ÙN¯–³S«™èn›PãÔõÓÃZWc?ê#Þdt™ <Ãã @ÿ¢šZ9»H豘dƒN?|­zÛ™[P3AˆSÖ»€½Šëì8 Ô®IT)ÿzðIׯۼÐû9muÊÀ…†œù~N½ÉCÓoñè·EpK3aSoýë)úY 8¶•¢ô’èôöT´¦1ùa~9›RrÊñ€òsæQÉ’.\a‡ÓL1öXÿN¼¤DÙÍ4Ji %kq-Ò¯§0‰ïikà¾4ÚÄ~ã´®n ÿ„d÷9#pg7ž:Þ„\H7QC\-€ÃX²?ÙGr6z^ïóÈïVèž/C©•¢<ÌÁ­iÝž #+„«¨3¡Év‘<‹èùÞM9ó½á©OC‡¥´ ;íø[Ô2uú¹`ö5@½üïš#:a39EÖs`Tô}ËE ËÍ8Íýk, ½g#ƒÃ':xgÏæ™½5ì*Õmšd³·>mO-ƒ4f‚×'‚D!Éj£¢k1;aÅ'è*ì"hQ:WôûðæFlSÈzzûʃ”ZVõ?¤]¯zA>í­e …Ÿá›ï étýï›Z?µ§%ÄñÔS½žRí;îJÔËÊÂV}•9 °ÉIùw1*¾È:ËÚ'OMÁÔ6òÓ†/ùÈ)²F>5s„†;Ò\i>u(Ð~n¸¶‰cY¬€³»˜ªÎA‹s§çÒ‚Ú¥¤$ :b?ñ?fm¥Á8øcòs= F&’=z®Ôó,}+К“±Ÿ 3HR$> ªbËæ[ú÷K‹àŽÀ¦­ûÜeÄ”ìÓ¸muO Ù€àÑ¿®ˆKŒ™–Ûª p¬`6rr©N9$oÓŽKN'eä«~—ýê…E$>Ìïgm«TTYïš¿˜d–õ˜£&¥„ðÿÁ}®ìeåðfg¿èi• Îb'Ï æáuÆm9´TÓ‘þcÙêuñžåmÊ@®½5Ï+F“W´Ü×Ì,€=ƒ6š}5, éÙŠsJí8»u{Ó¦‡+åX·Aák°T²»®€¼ Jz'¼‹äó¬µQtß‹ •wøéYÝâÚÈ@Ìèoi55Gìï¤/ð@0ò§À{þæ§ÚfÕª©¨äälÚ ®w¯Áq’ô”ƒ‡›žwj; ö¤.Î+…÷ݯn´.=QB¸ÇЕø¯FRr-gdëâ=§^ [ÂMãFGWÜý]r$–oY%Vl[îkê:#²²þ7 €·üùŠãH_”JŸÆÝ­à™¥)6æA7e?ö¶ÃúG˜|©:u6bY+¢áwÔ^ÄnÁŽª±:äu?a¥Æz… ;¦ø1ÿq’æO=WöÛó~óGmÂEÉèC8‡‘òvØYÄKè\mñIìÕû¯ÁcíeÂ&ÛÅ„f­²ñïx•KÆ´f¨Á›ÏäØr¡,×íÜñ§•µ¶Y ÆÞ㈪ýç°ÍŠ"ùÃߦ£vÍÛûÁÉr\ | èHæ&ü¶rÓ¨J%¡0Ò5—®¬V9.|}´vbubÈ$Ðû s£l ›Uµ @éôŽiÑŸmÞû/¸Ä•Q†ò6ó3°—_š‘Ñ9VÞòÞ{ é©Ëüà° «TðÈ:ƒ’"Î7º™¦=X~Áp!ŽÚç–ê“0b¿¾k  Çà˜ÂDV÷­ÿ²mHìn ÁK{¢å+oW¼&OùZÅÖ.p"ãŠÛq³þfÔîþæ¿í~[Ÿt1àÿ"ÿƒx£ƒå`„ýŸ˜‰I‹¹P(Ù¥µÛu­ªö¯ü<ÙÁÛxᕬ«¬ü7ï¬=Xh¶•÷(s:åã0Õ² ^/›$ørÑù×ì@ iVKFØ¥©_ñXççÎ%ø„Ähº䘰-81áþ8ÛágˆÚŒÑް騗?§ð‡¼C>$ §to+HS 6ï?¢Òwkê­wD¸ìŒÃ@"u²,ô½=ÐOk'B#ÎçÍxIJù|BäéOß‚v;6¡½ßtë“"ÙNÝC;Ÿ?UåeMQð/ÞD}ú?O+X›§•d [@)Ø->¢P'&|//œü ”f² 6y[ˆOU£l•ðo® ãûÝ™òÓ‚ˆ”Ý´|p~jÀCÆhËæ¯$9ubµUKöS ÍÕY\ƒ¬IÏf‡”5C,¡Ò/óLÔRì $f`¿ Ùc£Ðü]•Z¤&!¢3ÕÚDÒB úÖ}·V°"ÿçÕ!uTæÛ'³áü¦KÁ_𼡏P5¿ÐîRíÜsùÐÛØ{1¼%Í䙾IŽúÂKVÃ<¤¿àgí¹a‚1<,4Ö7™%‘˜¼tŠ÷ç&Ÿt$]‹ÍE#™>c]©`md5õo–ÿË»à1ÑJd;O=Ûhk”"µNåú8Q’fMáϲ}!†ž¿ÖU™¬û^ñZ…²—(Øõb™íµ¤ N܆ÒÝÕ6|Õ¶)ŸNîXUïûr&F³"T#÷ bY ߟø4Ò¯yØ“y"¶O…yÄQ±T¡ØÔë\B2©Ä'‹L¾¼ÌÉ•_/ñSß°*xµÅ¤Ý¿~r=‡}’ }&±ÙÏv{¬Bxè§ÿÓkɈ?ók_äà‡‘L¿F¬?À„¼ÉÛÙÖ°¥äUØíšq9Gf¢°´¨ø·ä²ÝøYz^ñ¼›ßÔÝ]#uÔÄoŽK»íe¦Ã@¼–“ö¯˜€ºì€ú²ýóI¾êÙ´C ÜÎTZÙÀú×íSèp„ß{4=o|\˜£ÝD¶„9šwYÀ˜Ü©Ö¬lG/t@¥*¹n'_ìö]¥ïUô'—G‚á 6Ô¡+OWÌ eÂíÎúnÌ h™ð›U3J„.oæ»×ZèéŸëÄ>åîUJ'/àL™½ ðC[Fûå.Õ†?›•…ƒõ‡®¿Ã ì3.‚åôúéÔ²Jñ‡¾õöL¶ÖÕØ’Úü,–x¼}‡¶[uK  ]}§ËÈ&™Ëw-Çß¿Jœ l¾ÐS$@D™‚6ávÁ΂Ä?ñÎÆ’€DFEzz‡^…\¹ +&¯C É)Ö¶æê®±~&|žÕ$Å|¿…çÜG ÁŠû‡uΤÛ^O'¶5‰=X¿0—<sñ†jßí 0ÔMaª‹ª…“¡ Êʽ¬kp­/¬Ím†¼üŠ J¯Jž9£„éÓù–;ï6—)’1<Îd,¼WO—¥f`Ø6ÇÔR£·-’ãv"÷TUÿÞ-Š|ßÀí3¥“ifµVÆU'é€ÈÄU–Hè¬6µ×† žŽ¯Šá·ó3©Uk,k¦iD&Ùq‡î`Y9ë‘ë,ΡW/ýÜÞÐL½û|hÇ¥Ž„$ ûö–Óx\Ñ€.¢QÖ¿& ê«€U%]u€°×¯ ÃÔb³w6€cHh—@F`0á(à(9îz¥FÈ4Ì¡3.‡¡eíOóÔÕ;œ Õ’#?JAF‹7SuËTyßhZ‹ŽQ¤¨ƒ…]£G²!e081+¼óêû)ð[J±‹‚ý#\M~We¸ùÇ”ÕÅï1^–céA'³ ••¿ÊîSÍ´ŽSÄM\ºm×^Ó±™—£Q(ä$krx‡ô•÷•2’Ê覢0Õá%ÃP:aN)D‡Á‹¦” `››‡oîõ¡òææ‹þ”ž·Ãb¬3óùDdŒð(g ”Ó‘£*à:Cñß6‰2Âî>Í]m$4LB‡å®̨áLÂö]X$±Ò…p©Á¶‰À‚ x¼ €–ýÿBk~"3H>ü –Ž@|ÂÞÔúܱùØ) ‚¾ï&KÞamr÷§ ìí8.Ö c­ñã˜ržÐU$koœP’Ù¶)ꃄc}=.èÁŠOšrÓ2 É{‹üñ; `ÒY‡IëÌ”ôpoZ+ïjÃÜ“»jÛEÊnq1Fe"Fш¼nª æöG I¦ÀÉ^¨C,âÞ+æzßçÂè˜b6d‚5}®<xcÒ$“PÉàâ¯F〄ܿԪbk§_nÔê,‘">rïÂ{ëUyèGÈ^¦H´ìX„xP–ô7m™Á»OW¸œÖÓ„â°ÀL©Â=Âa„W!sôh”ÈË@÷L’¯/M]7Ë.C½´ßÅ.µÖ‹áT2ó€þë–ÌôÇ´§¦¾uU3ê·–¶ãÕü¯à×q1.”™{ßS†B•žò:òÊŠqÝn>‰j{ô‡bO&&Ó§ut|ÛíiDOu‰=z¶“f~熮ßx/IE»~™{*cÜ‹Á•8]›e¾d÷]i6JßÀ‹¸Hæ{`¡˜v!”*Ëóæ&æÁùô 8ù2ªíƒJ¢ëL7Æ…u²èÑ„±%†©ô'Ã:ô`ÌûoÀuF@‹9U˜ÊáìTe.l¸¤"¸åÃÓ¬&µ"VÅY­¬o}­¾@*©Œv³24:s&}=ç¹@:wøq"¨[ Þ«¢ÿ÷ýÜ¢’´9(šG.„˜µ\fcp0tÑúôȳ–ŽQèì}Uïæè^jTµ)‚@U} üÒBƒÑSAlƒô&©ØÅ’ Ï-µ3b¾Å0œöuã) hà¢>ÙýQð}ïø½;7 @šÞù>bæíÅ )üŸÌë½»x'=é®È~ænJ” öʆ™šÉ³(nèª:©K— }Uàö?:ouCâ›rùšöNÿÜ`ÈûÖ}À:Ë(:üÓÒ]M®‘hg‡YNN¤îÓ¬sù ¿·ùxš¤9h¹œŽÖ±‘Ý5VÉ+CÐ\n«fÄ'\>µ²ÒµqOT}¬¼‘[ï×;´Ò÷8žº_#ífº0gò5^Ë9t÷×ZLC5žQ«6áV«Q7[‰A*¦fnR ûvK/œÜFíâEÙYŸ´ë‡NîRèAÈ<ßhÔ[ÛÌŒkêAÑ’É©£˜4ß¼áÐ!÷x?iÙk|¾›gÏC¦‡#á ĸCà‚¢wc poC(eXždÿ´õÙ>áðkgéìœm*]ó¸Q šlÛÕN×A’%²+ü˜ÎI!ä¡m\­M…TŒcå\¨j³ 9+«)‘_µZæëRØuûÖ#ËÁ™ Ë¥¥Ã¢:&¼ãšý…FpÏ«>ž'ɘødq<-ŸN“ÛÞ5¢üÅnã>hGÉA(´Lx‘õY;ë%þ“†b4Dl¬\©ÔivÇLyÓÿö‹ÕW豃Ìû€.‚ȳ³§“´Nȯùšlò°YÃYË‘y"{€ÿn×A“Z™ckÙ¿>[€ýwmuA­[j¼jókûQj²ÚÚ§ ÆóŒãK§Eeå‘ü¨V3¼$»ù v­xÉÐZ¬ùºË¶µ‚}¨¢‚7é?ÍM_"ìÍøWu¹—|··ÆÿƒÆÇS»´ymT— Õñ$µºÿ3žþ”ÔNve\Ç™ûl%HQûõˆ Ô‡DwWdéËs¬·Ä­ÿZàúÍJÕñíÈ@ZíÓé_:΀¢‹ð(ÓžÃæ—ø‹2L‰?])ùÅ{š…î“r[Êçóê‘·W8üÇ,:å¹+¿bæQŠ-þµßEGhiâÄ„•A5HÔǘntÓ®ˆ<%ÉÏlô‚ÎD©ÍnÞ*mö?å1–^·7Ó`Ú¡Ï÷]ÄW»uãóùd¨<·Þö÷ÝÔô5à«æê–¦dÛÆž fÃ8)\zCÿj…¼œõûÑ0ùN Š­C›ð‘NäJï-®K‰jñÃEl¹Ï‹ÂÎä¬îÂøXò:}„‘6wOâÑ>† S‰$Á]®@1Ñ’%aüÍ)§í&Tן°=­'/%ŽVÑŒßYþÃE‘¶Ï·¾Þë­ÂÐþ= y•'¯ØËQ_ˆÆÿJõjÌ´înàßpß´E–¼ÀeìÁW´5Mı’á•N&—TžpðØ¢8#‹{ëÄ_üaöc:B-‹´x¤Sä™mî펙tå¦ñL¯FTE †à `]pÚ^z3–E°Zåÿpó•ìZ¯õy’g²¶50ùz‡âíIÛ’ÁÑ2°“,*©ŠOº àÀŠå›¾õ/jñÔ÷&Ô²jî@áÁLÞoºÕ)5&ëÊΩÛ×ÌÒMs£ Ô°äÅ#öP<«L!¥Á=g6ÄÊüÒ«Msa|ôõªìG…ûÃLJý\žœóþkï°Úµ•Ü^³Ã¦Ù—–‘\~³®ƒÍè ì1ªèœ¥o^…ž¶“ÏÚåÎO p•Öò{ÇÂÞfܼ·^ÖÄ[¾Š} zžý;z2Hä‹[yαІÔ`oƒ`Ñ·VϨQXœÖ£vtáéE·ÌœÚ.¬Žöh_ø?ϹíÅéþ" ‹+ 7]ÉTÄÇ ì,Åi:q[P¶ér!•Ä6ïIhqâdL˜y0zZçÜ["ñ—EªÜœr|¢hswq5-/ذíÎ@»S§Ó×âËÚͨз°0ΩÐÞûé¹|"Ÿ/lTˆh¼fCÞàbÞÄØiWè|úL6‡XÓŸ(Žzá=q·a«£AôO¼#E=!ì™R¦KxˬY¥ïè_qy¸ë¥š&γ´ïª/*:$š%Ù YÙW é#8OÚñOš|…€½ÇÕÉܺWÿÆ{4©( WÍò–-9ö«ôúE×]lÐÉש@G#aµ4{>õÇb%˜¢n‰€é]&òo^Ú”öBœOô¦{ö Ëý RÐËq…MïV¬Ñœ°ßxÔ7Œå›xi’ÖÙ !ºÏâ!ÉýkËÕ„7—[·û Ê-l¸Lü~O!ôÒJÜŸhÃW!ÞNV÷ø;]°F÷G©¬Žô´shUjZö‡î Æ?(Vkž{3Ütå28 Ÿü¿Ò‰¡Ÿg2¯;Ýä©Þ<`0tÀš|kݶ˜¿#µ‹@&õÔƒ“õ`äŒgÛÎÅ¥Œ˜À4SA:£¨Í£uBÑ =ê´·Àü°XC¼žE:þÕÞíï°ÖÀ(øŒ»F¬CM†Am¶•Ͻñ>µ—7š¥}奎!˜Mûàh#ši®ÑÙ_\zUº¹\·RKfuù†³f8öŸ•#WJ»ÊÆÖ¸ Ë"þ¯àU#Žm±²4?{®°í$£ð©74:RèÑ><< o9¸ÝÒ™©V?ù¿²ds‚p†eÉE÷I¥wùîú˜J¦ úº&h¼æìfÍ󲜊Ó_K÷õ ó¼ØAjŠw+EüY5—vÿf”‰UOj¡á—m… ó©àŽßY¡»îó1V$õ Y~«^pX>*y³Loð #®rAÈWÏ›óŒF“~:ùy¹]§0 )ÇNé|Òã²…ÅÑÃ9ƃ»7 ÆÊzBØ5ò/ÄÀIò -é¨î<4ZÑ—}ʶ!L×à©… ¹Q(*þÓòÇ ícÄÍlI>!‘âÅ_£”¢# Dª­`ÆãŒž;Aànöî­å Sù†ŽÃf•\ êS?¶%=jLìDV„øeÃÉ®‡enùhÞ'Û ’gt363ƒŸqgB€¦rP7{š([ÿ€fs|#«Œ ‰ÎÄâ"D&hzÞòc{û1èGÑœ¤7šŸêQKy鸰LÖK 7G‘eñ¨/¢Çq¨ôk=öuGê@SÝÞ¸¿)Œº®ô_åä¥q údy,|䢇|eB2‹{*“ì/î&kpž‡™ê ûq¦«Æ!ké#ïcM¾ƒQÁëø“B0Üš©cµ;ã*"Õ‚¡z½«AáuiSÙepÛ›ËwÅÞaõ*N>ˆÁ•ZÌ糨M#Ô˜v¦´ÞÞ¡r1uäé§¡'øƒþŠ•ƒ­\¨Yd„ÞZxíª îÜâyÖãå]xPýE¤Xɇ·'®Ëãç"ÍàÓ|A˜.o…>Ĩ­…‹»œ32ÆžTS()ûDªWÝÖØÎï…B÷4„6¤ø/f‚<u(”£Žû ²ì5Õá"i ªˆÅÖ¾ña’3mÎ}†èx­O¿“É­út’ôFD|<†·Ë»”·8àûj ›ÜMb,’øjG]Ð}†æ;¢'ºÑÿÏ´ª>…ÕL!_4ÖÔâ„=ÀUÑï]nGÈäK“‘Wj¼È7lU~a €íƒûbQ¸ ËšC¥ÒiÑÌäxæDRJ·ª¤Óa® ÒHTÊ‚Ìùù#»=¦‰åm3ã÷À‹­^í§Î‘vÀ/Nò­HÈëAŸR¸G¤\É|HH’n9›“Yœ0Ï(ÖΆu®5ó«SQfÅ6xÀÝãCJfJ½L}<®Æ4áEk`­éÔª›1 ZáÓéZºŸ nÖK 2Ÿ(~ççEþˆw¬zÅ9Ç€R&~’3_àQWŸµ:(î{]ßÉBW·UΣÔÃ.àLüÅ=\ù~‚YøpÍT`ºé÷èØMCtxù¦1˜™Ž˜¤±w$!¥ÊäM=¨çn=!Þæ±oxÈØß*£B;ź¥ÚI#“ŒàßutÑà0Ðâ§M:ÿ<Ôb/eÃÁ¤Íÿ…Òï^p±î¨©uŠŸM¶Ž€ÐÙQúº=[DSÆ\î¹CrŽÀ?ÜK- ý”§éuLé( Óà‰& u†›É¤¡ÓóâèÎ_ë_%…ˆU|E>1ÁmýšÿçxZnè©|Ä` ¿T×û΋Y7} Ķêkê„Ⳛ,‘ÀÉæá“†F¿»0 „ßÜM×nÈCq€í”ÆÖüˆƒ ¿SŠCAi]ÝÝ›ñ—Áp_˜ Yí5à¹Y«ú#‚ ú&.³g±3DH˜Â2d¾þ “u°}uÑê£ü¤ßQ]HÞI­r&²x4¥šµ/Š Dv¶'‡%“mÏyIL:÷ÞEEN¼ˆ*Ö¥—uB㯩açs¾ >p+z#İw×øXÓý{nòºÀ“ãÄöœÜ¨º}LYëÌJŽæòâPuß(0½ä·ÊæÉ£®ÛìÆe™/$8Ôç¬\“’œ»j[¬²]Å‹n3N£R%ß=uß73ˆn¸._U¥­›±ú;ùú‡€Ýz“ézc37þ"¯ò0hðB?Q-}b¾¡W"Míuèü÷B¾þŒ?`­*©Ö“F„s«¢àV>%¿7‹*JNU‚À¬+æ,>ˆàl–ù©ó½®¼ SX`M9 |›+•’h“{5’åå=¶(ÕMŒ‰ûGÜ¥Ç>wAíjÃE¤®E~)®K6!¬Ž 4`ÍÐiNX²©sêCãTþ¦1øÿw'¦qÊ·<ÈüγÁDeöùË͋å ˆÉºõˆÚs¾B‚°Ò¢†»þjâ#ØV÷!Q-ÒÚü]Jãqò>S°¡ÄeGXo¨n¦°€6ÜD¬\×vðÑAc{ñ‡ý\˜±ŸDC3Œ-UšFÙòÌ´±ÁðŠ•—ëáË\Õ dÆ£à¤,ž`?-0ša×ö!ã ) ú¤g~¹/=Ññ4@5j±b¤ÿj›×òDì{MÎü,ÿ êr_Û ×CÉD¸Î˜`Ë RCwñ#>±>úÝÍ]\ì$Ø]&àÀ ’_³ºp«@r5%d¬ ª‰ -"¶õÊš,î-Ì«QûõÓC¨D÷_©24¶–ÄW_lB\ÿ ¸í-ŒA¹è³–êéÞÕòåƒÛr.9¿ $ÌFc#ø¤Ë~QݰNb™ È;”ËZ½Fôœ'¢Â&ô¾züÜsdt u0+ü>'ƒ8ºÒ0Ü*}ì99¹é)Ô2‡ N,Bƒ°ÅÆ9%ˆá`F¢Ù…éŽŽàŽ€7Ë÷5TBÿ´ºð‚rÉ¥ìl¼Ãn«·U4{âÓèµ3¬ñ$rvÏ‘ÑeÁfÂݸÞôEH† )Šq;ß‚ä’é7›ÜH÷,â®Ý}fB!àKF´„áapK'¥¥ÇE–¶èTÿ‰‹ Uº»+;t GrŠ5óÌJÒ¼^6ìV©íXp‹µY·¯VÓ;þ;N…Ô"yÞ×Ñ5¾àŸa¤šÆJÅ+e#¬îàVŸ§ØøF·rƒbÔ¿±­¥wûñoíUœï‡\…Ùã¡q[˜:ktT BÁYzkÔjïL¢#Ùl…¹ØåÜíeºÊOJà8 ûc÷±ƒúÝOã¤DF<+K(Ýr¨ iˆÚ>vÏc[€ü'Vª–é; ¿´25Œë A°.· ¨GQËV‰l@G0Ì{ƒæÍ"GÆZgñS]E¸?SË)ŸÛI8ÚYÐíGY$Ÿ‘3,Zòº ¶Ä¶—Ží·Àòøu"PK ó9'F¾%ºÃZdíŽV£&œ©Þžl]£±ÊåRûÿšÒÍ=6|Ì$Âô#O÷¸šFŽné® ^µØ4rÍÁExãc•ÞÇcŸxQ¥¬TÜÅq7ÒÍØ 2§|ns*á°ÞßeË®½…Lñµƒ™ñú$ˆÏVÌ[˜zó¿Õ§&ÑGýÄ›á”ØìSÛŠBï÷ù=‘3T®(³¸ëi‰åÉ¢wkÍרÆhöäÙX¥^¾&<·—¼ê â^À4z½èEH‹»k,ý ï|ƒAÍH»ö°ÇŠ´¨ÏŠ-Í©²OãM; …E«!Tó"v Õ•'û>46s™Z,ÇC^4vó²õJ+lI©SÜ–hì }&ê ìF?¿ìE†©¾ê)x^¶¶–äë†:½DñSø/ó AÐ;Óv³ja³5?!qëùò«ëRN´á ]˜à·EÞ~gvmí!«tdî*…ì»ß,v/Fv“þ=LÜß”Äx8=BŒ®kÞQÃ/@§È)Ðì<܉«(ˆlŸ\ó(OŒûë »l]¹º¾²½©:PJÏ…·h¯Uk_ÁÔÕ÷`®Z¨Í‡¾ÆqJðÿÍãŠìãB³)‘ëi`0½}Í>NŸBÚñS1¥ÆB›ÎìK¸åŸ1‡ÓMßM¢¤;ÇÌ,rK)="bá ?Y) g‚¿|Ëž­ù3×±7eS “zùÄÄTÈUßÈ^ŽÁx oßm5&¨O˜B_ëHF‘S!E­ÏáÛú²’á¤Äq>X¯æè÷¶>E?P“ñƒÖðÛ0C׈y~81…8lLxO5–*(¦ý8‰ Ø?+…õèß9ˆCòclj /JÒU½)|À'EìPØ¡1‹Åúß 0%豑øgV.ÊßÁÈ{$B–ÂÎň½wÈß´HXÛD+æ<"ÌX6€_•×eú£; ¤€ßÁ41nyþž>ßk›“æ’¢š9ú§ó¥L·9¤–$pÐéQ•"½ñ¿¼Cªt/8¢C‘ô#pjË%!Î{¯G>MËæÙúÆš¡ea˜±%¹O aŽˆáåÿZ®1ïuo|ÄJ¬šuµZ$´#ÊJ÷¼¬€ÛÉ@^Ê­É›õÎw·¨X£Å0W'Übk. 4ØÁV‡ž7(4á×ò®l³m@‘ðåá˜ì¤UÙA#)»šÜáì’ ^‚,“ iä]SÅù#–—‹«ŸeŸÁÌw8Ø<Àø¹¬˜udêâv²ç;¾w³å.äßXOïën]0à"³×5k›¯ZñªoC›ú€³CKu¢±IÛ *¶ ÅqKU ‘pÑî‡éÀuà¥Y×AN¤îejz¬n%?åÀ¢"D]ûkÛ×ë“–(6ËÅLBuw‡è0Ëw¢ûþ¼ÔŸ­597ÍÙ-ìñbÅÏo ™")§V|0 ©¡}ÏúÞˆ1u€õé‹ s¥ $2©Ço´e[Ì âP­Z/ùe^ªÅ+ÜI·¨&ž‚zK»ßσ­)ß RªÂ‰\Yw&)î;×$¹ØO­½Yu–¬5 ÿåÕ2¿QZsXJ ™7xx%Tÿ^/!pú -cLžù³É:`4d…ß ¬Z;ÊÆ«¥FlÅš/énåò/‚ëÙ zÊv+4-Nm—a¯MM\€Ü Cknëÿɺ…Yºõ²¦ò·‡,3­Jõy–ÒžC mµêwÙ `ÌBÊ yüÕ4„khsß0fÚ4R¹D5øÑ׋”°¬—×Áx©OvŒ¹œ˜>þVö˜Åˆ–^õ¯±ÓA䨫»ŸÃ`e^b‘ ßC¢¬•Nø®Ï7îÈ“„nùWøÌL±ÃàuðÔ5½Xç†gõ™ÊlV=+“ä·¨ëŠÚ5_ BHf f” ì(ÛДÓtá¶móPû«¼BØyMÙ›ÝÙIw«ÖVÜ»ÚZo…Aµ‡ªp£ žV´1X(,¼±öÞÚYìâˆï«wžü?HÚâšùûϰÃ,‚‘èM,Ñy\5êHëH&Œýñk}Eòæà®ç¾®b÷﨧Ì7$›DOs ¹u±éÆ3ÓŒàôŒ Žßxx;rIýìú½nO@Õ'nÚS eΖf”Úy„ü™ÉÖ)—›Újz£@_O÷Ề¾Y°È…Ë«U‚?Ô:™uÂ'K ß\ÿeg¶…³zV¨ ö±B„»µØT-ä¼­úÈÈŽ×ኻ›ˆÌY¨3è'`ßoO?ÒQ!*šÜ ÜI¥z_’ibÛ_ÿm òš1å+JDR‚{¯| dWgÉ©´ 3”<þô½ôº°3/)WDC\0éBô”j8aðJ¶íÅCZ‰ÄÒÃíòÔLàÖ’øwåÃÔrÉ$C›þ=~&*–I3Œ¤šÉ¿ú$} ù|Yu~:L /† üBï5§}äʜ̅ŸË -±°i%°Ê"dåM.œ²8Vûä|.NòÖ{¦ÏuÐ?¼­¬%cVÔð¨!~bØ#§–”¡›Vw,¬ÉGü‚é¤ô4P ;ö6Ì„^äЉ[/S.”¤ö= Æ·>yì½ ×&ùÚaÉ3›åç5ºE1ø% Ám@ò@ƒ|,÷ˆ¢Ì›røK&y´é2:c–[;K©þ@$±ˆîσƒlÆx|Ûƒ‡ ãÇB•“‹1ùÌÌUA;½Cµgtfõ<€Fø·@ó˜[Áú¿®ŠQÇQ¿}Iu?ÈO‚ÏjåÈå¸WÛøç\nD¨“údR£./ÀÇë6>ÇÜpn‚“¥»ºµé毹YbÙ&åßá@¡Ì‚(Ÿ<¬œVbÍTöÀà7í»±kr"wßtû 3ô¢»o˜ÎHIÈ"ƒŠ541ò?K¨ú6Òµ ˆãá|Mñw:Ùô ƒÊXS×Å0½¹Í“-ÙÇ,Pt+©N”^6Íۮì7gøRwaÈ#,Sѕ̯ŸðXX#éqëÍAER\ d–”®%mß;ò¶â¬n;Qo¼)²Ošû €%“ÔnH䬧MÄPZ20‘ä4úÿ† £.‚t6£3ô¤›…sæFâÖR/“„¬*7Ѣⴖæ]#æÙ®<ëÄT·U‡ºÝåþj»f,A1yÚܬgº‘~nÄH~…˜tׂ~€­˜ì¸øÛó “g,+j@™LGÂ/ízŒ‰KÊ‚AÃì:‡@Z¹_À[Fúˆ4½íæñZ“BËHjþr]ݾMAë[@òñ¡¢œx8½o±X§€òôYÓ=%@Ç:×lµAP ìá<”ÑYÊK"×:9àªx:ÌK»=icˆˆoÜv¸„‰€c?•ØKíúuLJO|)2*ã;£"!–ŽÒ1ªT5Oî,pɶEÛ}‡Ø£ÍŽI,:aì{U‰‰»¶:À—”ç=Ôßjḻ$gJëéàÚc=èø6‰Ùá$µ‹§ÓÈj:Œ©›Ò\Ü)V«‰–ùdOÇ׳ª -k¾hsgMÀò-BÈ‘á‡ÖŽN‹Ìuý,{Á"A³í\ ÞPwNJž¢ëé(È/ØéÒ~ÇUGKeßGõ 7ܦÚgqÚÇ)Å0rè›—ËäŸIÖF=Ò†îö„•Çz´”µžl‚2B’Dmµ#ÞdMþ²–ˆmÝd\6²Ýï•Õ32uõ#¹ œõ<Ö/É–‹r@àò9º!ŸYèy9¹N‡BÇžÞdŽÞkçÈÒX€ÀÝ:CFÂ|L÷ §×Ç­EV³ºNF¢Ä|Ö’ £‘º5>:q;Tø1a-eç¾1NûûEØÂ’}.´J¡–þcf&ç¯3J°ÜèÁÐX cÀ &I¬‹!ãż¢Ÿ†&·lDÎNÔ5% tÜ?>Iñ.þQî527‚F2æþ±€å¦Lt¬zÏÓ‚†rгU’FÜ3ÒöŽg¾Tf(OMjTÃ2Þ´¥èiY`ûWÐ3·-~cÅ×µ¦àø.•Än~Uœ3]„U.Ád}£+uBÄv®Í‘ns²GÁƒîe˜Pä p1 ‹((&<‹Ô™= ÝãçJ¾Cññׯڅj[Ô‡+UUKÈáH³tÏã <ÿe®W3QM°€™6¥‰ï”6)¤zš~ë!£hKëRñÄAv#þŸ~#o£ûO&“^T¤ ø?-ôªY8 ŽÁ~¡B! )UC&™¼[£ïô&ˆ)½ !dRÎâ*Iå wµôßí•‘I1g·‹’‚üÒ2²âŸ`Vã´Ò˜ò‡òùn¬55Ê’¨àÌøß7½Äôe Ë-‹ÝOŸÈ_"jNŸßZU_nô²ÎØI¯ ?ïmyt6ð#ã>€ôœQÛœÄôl~¹ÆxŽ‘‚Tì“~ÕWa"·Òi}¹zžlMÓÛµf&¬ÃËÓ\^©´& Þ¨k&=$%†³6nóŠŽ›¯7„›•ߊ š:‹¤üTxUtILü/ÌŒ+¸èXX‹iëÍ¡0tØô.qR×è&i1SÛ÷sÏ8@gCt‘Ž6hà!þ6ÚeOÝpbÁâΖK vfÝí¯…I›ÄŸLˆ‘’'ç‚N¢·Aß IÐmF ýÐÖÒ&{Û¶W{Z«rÒ)W¼ÅBŒ‰7 .hE@ùÈ$T¸o¨I/ˆcRäFõ2sr;öÇÒær‡žœ¬*)`KÃë…w}W@‹Gð¸Ñ¯÷Àð¸ûQ¹…Zr×…`ÐX7!´bÍoæ`ÅÐC>{‡ˆv´ýTÀ‹¦øõÑë{ÿZä‰êJ8¿£Á T¯ÖÂhŒ€Æ ¢Þdëë4ûôÝ k¦úø¢Y¦N\—•žá Ôuu<¸eÏÇÒEË ˆNö8~‰Ü_ç ¸áq)=ãŸ*±§&=ìºëí5‡ž#ç\G¶G¥jöœËSGÿP%œn1_•þ(.馣“Ô"›ÆRkÈî«Sõ8úK¾ï¸ÅSÛ*‹°vЊ=¢¾Ã|: jâoîdWyz‘ !ÃÌZcF\•X$“)pZvr»~J$étÕð®áõ™­KÙ>%0]Û±2æz©ÅtwW0lÔ"–«r"í}®Š!›àžŽ]°rèBEx^ÿÔÛGŽ÷{˜¯s—ÚfÉÀ“:M-•¼B«ÕF`æþ'ç98åaÞ¿©*ãâ2ä1Øi)XO»ãŒ:Ê’Fža¼ÍÉú¥, CZŠÇE_IõrبúPy ` ÿ6k³ÔÐfo½…ÒÄ[Ò CÖ»cé!&&ìŸÙ2šËµ /,W(ùfy)ë»jàë9æpŽyÚ û2æ44Ó„XUYáŽÖï–µ‡úk6ĨmaµdíP3›LÅ¿”²ãzdé"áÌrùUóñ¿dÌÛ[oˆ2ް ö›\ôÓÞ²oáKî8ÊzÓ«úÖvþ³!嘵>ül#¬Ø¸Í)çȯ÷„ŒàŠ•©`L½Òî4÷Ð/+o \¼`wÛÊÔ¨8AJI¦,‡i!¼D Ûzaíñ7l{·Ð§8;±¢ëX–X8I¢Ì¼ßyPn¢OÏAžsdUNé ‰)|í߃¼ -OJuÒS’ˆ„´Ñyð+ËxÝ%è<ðpýaÒj£”±LB*(ÂÃC“2ÆÇeü~`‰}¸wrÈ!íFeí7Ó2½rã6zUÒœE„:WŠ®žÁaÉÓaxOèi𯚰!üwf!¦Ú$¸*9«óÚ¼7´Ö‘.Ão-¯ìl)})‰ÀØAà5¥Ëÿ-Q4¡ ÁûèäyPëúõ0ÕÏ*ц~ÕðŠ?¾ÀAj›Ü#õÍɬM[Âä¢'~©°±Ç`3§Zû——áŸÿ3ºæ¾ £zÄ}õaRAì;d˜4wa?7ÖrÆÿ3ÊLn—]í§1‘Ä>¹äCƒÏ¢?}ê;šª¹ísZWdy¬ú[Ø-w  (O9¿!á¨\&:øUƒb–<·¨dh]3¾ckªd·i¨˜¾ªM¶—½C“DŒ\ ˜Ë‡Xt¢Û’TWHLÑ|h ½“]‰Ëd*YK ®hÙ€Ö@ùrk¡ÖC [äO ²Wakf¤*왲Ñ,‘à«aß+5@ü¿·¼;{Þ³&õѽ¡u$%ãé,•vÍq8þ|<¨©ºR2x¶{þœŽœLg³Nf@Dz…‚©èX²tvQþz9¿·’Ù5,Þ_ß FB× ¡S©¾xXQ‰.è Zé˜×™òÉÄ«žÐžè>. Ã僋ôzÔEsÖDNéø°Û¿²†áÛfËï¿Íd’£IÖ„¨sXµ¥rŠt95ɯ- wWÓ¬àñ†¢‡¸`Éͪ° Ç ÕK¹Bþöß‹œ­ø»,’³ÓÆ/³ŸÜ$xŸ—Ý-2Â䥺Ø,!jïÆ Ü³¢ ÷Xoøª­.‚4S "nMÛ’Ú¨•øÚRˆÜ¯-TR>i P¦æu'Ðÿ ‹‘I=¨Á /á'GæO`FD5ö±Oô*Ëq×ù2µZ+=àÈ>ÅwcfS{ÿW@&QåÂoh®{:iÈèj±Ô­w1­Ù‰‘­ù^9 ]á-Ð>Î#†Ò¤+’iQg_ H®ËíϼæÔ3¶¶ÅÙÒv-y-`Ër²V*,_§lÆ‚~µ¡'îv_•‡*ýŠ»å©h ÿô}›Úµ/Æ¾Š‘4â×SšÝÑæÐ™²Î߃]b˜ ¨U´0âx3˜QAéê„™›µTaºñ§jVSü’w¼›;ò¿S×§ÄÒÂô›i€3ðl!(¼Âi>{Ž~°+“0XÒùÜGjIë&­1•ÍöŒ[›¹4=¯1£Ïò•ŒÊåXBl«ïø;òÖÛ†«„QJŽÜÞN¾Ñ1xaõ¦öÔU·ÎS:¸Çñ äÉx…´éÍØŒFÃþ ðÔõ³DýS8¦ Ä¹á º±Òðôðd‹ëo±Â’ÃNIIcE¨Ð3j¬·;…È zת~íd>¨=ˆH`m%Ž ¹Îº—â¹nÙó› ¹P»ÙÁ­xðÄôiQçE¾®‚=îż5˜ ´¼—¸äKyà½)æ“I£I83gØ”SvzIçpçr>ä²€” ˆ/¥ e ?îçMÇŸ$[oc¿ž!))i®çÞp4ÃÔGsõÚ‘t¼O˜ÓHlñå!]Ó‰Ö6¬<"¦Ú"ÀN Už´–162Ok4|XÙß&¦ÌÁšhªc"–pøÄëL6}&ï´-\¯ÍŽGÑ*ýDrÍ‚`IºÈNHž[³ø„ïvî±Á¡xNÖõÄX ë]ò‹Xw i1»2ߢ¿_—×Ö|)×:‘~¶Üð‰×Þ°Ý­£áÈù—­*ºR¯Çt;`¤€.N|EýÐÔú%mdΡcˆàänRéÜÇèµáH;rÔï[›ó¾]˜ Ç59ÍîkúþÃþÜUwº+nŒ`Ý¢¤ÐòK"3œ‡œ® „ÐʬçÐGt¤HþU,`þëPÒ Z»à+Fî861¸P)ëû÷¿¾¢g”S µ=J«É•Ö N‡Ñn_ÏIM 5_ì4Ò$Ø£½ˆ¤Á;TENÍîjªë'k­*Ü¢ò©Ë‘F+ùe| ˆ'º.x›×ƒt!‡d‚Æ¢?ܵÑ+õEå«wO2:56­œ.ÒÛ—ÏŽ‰F[6LhÇÊÛ1(é93E»¨‘oò»rnMýB–yžç4ÂĉJûȯåí¡=á4çÌ¿Â$CÿFªÁ­^m,Þý†‚3}®QdBy “×EHö_¶Ç>G¬á´¡)C/äY:\þ+±¢-!L¦{.Áø%Ú™tà@îL¢!gHøÕ;i׺ÀZ·T+ÆÓƒ¶˜å¶·_b~@4ê‘M ¿©šöþÈCx#30Û8ÓV¦ãäœß‡ûzÃPÊ×-’ÉÝ ï¢È’£½ÃuÝ~„F&Pv™µõ_ç¹-Œ³¾ K‡´nš\ `âA&ÚϳMþTµDÍsÄôÕdSD±/ B,'5:騦•:§æo³Ð)½ø‹ ³þ^m© Ø=¦'ãS×¢‚Z¶4Ðïñyçœ`å%0ff¾42ÚšÒ†éÓWX4~ eó¸„÷Þî#]ê¯òôotL¾hw/‰Ê¨Šë\P?‚ÖCÎY¼KîÁo*z¬§¢ÑcTfðÁ f26Âü%9§ö¸R¬º HJ³±²ã–øÐ^ »‹ßo) †È³È*€Î‹ß|Ú­©Á¦ÍÀu'Fع'ÔkÄÂJºì«â6ðbb[3¦ÙZ)KŒþJõÝßü©¼RGxžF7½H7É^¢ÝÐPF¹0va¸£X¡G,&¶E"÷r,ŒýDØ— Gꙫã p[ˆzÛg9çæ@ã«îÖ_ÀÔ´¯?Áµ÷ |öáxÿx_¤PúÈ =ù”¥Á2%݃HS½±Ö“²NAQì$¶©ú*°QdÁ"†f…Fª*šP•ý™Æ˜šÝ?k@Ì: Ø Wucl™¾/–μ*›þ!Èf³´ßX•¢Ü ÎðÓ'íÏù¿ÍÕÆ/ôFa s“‹µ?;óP—¡iûÌc9ÅiN ¡°.ƒ2ÑCØ—,¡g¦”,.Á-CÇèâûŠ$ÿpuß$׊Þߤî3´®ÃðÉíN(¡qrg·Z­'‡{„$t]lÁMÖä.¿@+å.Ž»s.[£rªÑÉ2éPò»Æë£Ïj)G;?JNÓ‡ð“2dQG[/TŸ£®½bÊ8£"@Ÿ(jÎvÃjtˆÉ4u[\7=Æì£¶¨Žß.+µ%i­w(k÷Pe$ŸÉ/î&_üvšõwy·«ÍÒu¡ eŠ[ìxnE”TjüXët‘xz¹òìÓYÙ¤@¨ß¼¦âšóú¦•… –¶z¡p8 8¢«IùDþWÒ¢Äãm/2)æÒ|«9)×1'pÜÅé˜a4(]˜V*áþíøE¤yj‚e€¾A*‰A áÜÖ†.ÎÀÑ¿<Š(©¾D©÷7!nµÀå¨vçÈùtÏt$£3™:GçŽ3e%Œ½ØÊ¬YŽŸ{Á³ók%£ÃæDg‹ŒCñê>g6h]Q4Îo~12 Ónª@CÅQKy /.~¯²¯ë ÌÀdû{דªõïÄyëµlZõÕ5i¸eEÝ÷þmg—,+ÿøf!}@|äåb ;Z«!«Íu#fÎE€ufˆÝÖvœª)}·˜þËYßÖëAkÆîîéi<»n[Ë¿ã56¨¡2™u:QYø–e|]M¼`»&Lç*føÄ,—zŠ¿‚§NÁK€_J/©+ÈPì' ê¯`qЇ®DF%ñ³«¶jзm—53ȆÏÓ›?Áµ4št­»ã«55c™ìw±&ÚB¼eV¿4{Ÿ×öw½©ëC1„ì&Ð)üÔ$Y…Þw~O‡ˆÉG ñ¼Ç/’—Ÿ`±Hú΀k&Áêm·É¨ž2ñ3¬ˆ«½A#Õ‹©N"ô€ *Ɉ´ÇAKœ³Z²“ç²óïia úH$™D©;›QÀÒÞ¹óSº8 ‰¾ÇÜ·º™; ¨wŽÌ¨±»©r¦y¿ÁÒ(ò¶Ô£˜mMu1y÷Ä ØKMonÓ—Íå¢:HàZEöœ#÷Pµ—<€µyçVËûÆÒ[­9|ñh€³Â•HÖëïù÷Ý\o÷T àb—|áºù ü¡´ëF޵:7FFŸœ-d2cã(Ðxœ­È¡ÇaÓUUmì¡¡Š<èZ«Ý‚Ìœ‘ûLE&òã>UG‡’ª8$l¹ì{-s«Þú#´XÖ`?v¨wªUæª8X¸·Ê–»þþfÏé{¯ê¿,(B´ÕÍÕ!q–(eØo ½¹ÉvÖ÷3Ú-Ü5ãùî¦<ª›œ=»fÔƒ7©WÓ[ÊI„¦À게Òt3<ÝÅñ.ÎôG$xc-ë4à6ä5;^§À$×ßê$¯#ãAúwî »ÝÄ ŸôG<éXœÿõo3WÝÜ"¶ÚOxRnÚ;£SM¢ùtä IÜ«r’ŠÉ õr.ôÙþòÑ…;ìÛΞ`߯ÓGòæµ Ã&õ¬`œ–EWOYác*¨¾L6bn_Ò‡¯A“ÅþóÈtÖü-¯¨öó9['×þ<9•ü¤¶ý´sÏjåm¿¡Ÿâ¡%oGÞµPLÝ<“s›!_½ZUwpÏ'Ä%ƒÜpF–j;`‘‚’½¨1tÍ;yÕw}"i@^ó ü]ÇOval ùëÓÉÀÉgÅ.™Á«rvƒl/L›nSÆ%ôqØ,/­ùÍÁȳœc}·¬$l|fj0¹KP"ÑïùVµM™ú~Ä©þ”ÐÀ âfØ|îFðžý¨tx†r+Ë@…‹)_Å@½4µé.ýY,ww Ò\2whÒÿ;IéšÁK‚4ÊÂèå)áòNI^ÜÍ{’fˆë ‹æä;oñ—ó JYCï]VƒlÑÁÖ1 ·qÙgüÀ‹»»HÓAÖ>û/º@%ûc­«uï- V„æ;4ÚtŸ¢;1Ä$ØtÝNÙÜŸD0?dC‰fp{ä£ËëkÊ*U!tÏ}úù,è  Z•¢àÖ^b4$&>ëT m;§ )àÔµÊ!ßóàŠ~A~JÄÀøKa>Y…»E=›ÞY&7 €[j=dùáÒù¿$í(D11W˜NÌR!ÆŸ€j-=m¡Kø6ŠÅÃÔúªIUêŸmÞùyÝõðˆ]$!ñk²{çº7”íŒütaÏ‘—ÖÇ<¦=µÒ?Ä4‚Í0 ç’ jùÔ B¸W¸¬/¢4LpÂí w_’Þ78útWäiŽSÓ#cggy݈xmw߯F2È€¹6ÀÅ«š¯™j>AÊ•ƒÖ*ÞgMü Ð…S¤r OO 6Iåšm™Ày(+Pi¨™ñÆ!s§xV,æ3ûÌð»Ûª`4=Ö볘f4G¶Í"8{)­~ ÿ÷Ó#N<ŒkCúü{D߀¥¸!@ÈŠØi,‹T22¢Åþ’6Ì·'†fz[¦äáu3R¬X´\†Ÿ´±{Èʉëﺤ¬Ÿù_ÖCÈ¡_O æ=oÛ^(qMaKqH\çÞù½p¸|¬goêõª]aMR]‡Å/.Z¦å²å™æÏã´)¥,°Ï¼>DÃE®#·¯dKša“BsWxý4¨¸ÏG ô6†. Åsž'õóú, Xì;UbLQG–TÓÙ?¹›ß×õÇ,^Z>GvØk2¢ﺤ‚(M9§#Ôá &$TÏRÎÉW†£iϰàl -yîý‚Ú€Æ ÿ3XÜ@éC»xäìûf› žÁë„Gå{(ˆüæÏXÍÙå(Z…›.£ÇU¾5y­o™(š3s'UÜßÇæ÷6-n"uAxœ¥¢û?cðÄ®•XÕ‹epþQâQ&òP<¾DLÚ7bóú*sŠ [ÀF#“¢ÖÃŒ)±V# Â/›•x^ù0êK ?ÿF\ÕRä±*£)¢áºBZ’±ˆb±)sïíLÒ\Ë=`W•Ê“Àæå5Re8P.s¨£+4ÒyŒ»õ—'€´b¤/"›rÙÀÏfÞ?/ ,ëºØðh×68rÈÆ]Æ•ì!1罯Ç(H‹‡ aWMB ÷¾T$.ß ³SjÇ“Þëë¦oéñÖ\oªêœ“ŽkùíSVÀ]ŸÚ¬L¯²ì¡ÜÎ&¿_ô"<™#0K¤¡íD‚gF€åwŽç­¸û¸ß“¾–jg£Ú)V‚¾§³IµIÿKeÐa™i+ánjS´#l?–g·ÔÜZüÝåë]׸yg7q?sÉs}Ší(ÆØ×Ü‚«&“ôËså2U¨(±ì߸JRªYYü‡ô»m ¤‚£ÐÚR2d#YŒ¿%Áæ áÌ}€IŠ™bÀ½6õ)¯xgC“˜‘ÿäE=½ÄÃ×QÎT˜†|ðv´b˜³ºÁtÉr“sÒé:"k­âÞn#'*™ì>ëû´@'Am¡ï|u˜´ƒ×e·|+Ë»0A…õÒ­L|ÜðÑŸ‡ 9#àè:P ¢¦òàw²ÌWhêFn¥O³Žø·¦¼Ôí%ÓÌôä0–ÕžÖs)ô®”°œb47L2»›ÊìTK” ˜ÿÑ[åª6u°(Ð+Oôb‹ÏŸ Ò^BÔÈhDzNâ5è˜gX¯èdœ†Ò`´§Œš@¦’fˆœm©µë‰Ð½އS˜Þ÷•êÿ£­FÏdxJ+RÙ5¤×²¿Kc6jX=´÷7ÄàØë¬ EÕá½öµeMOÕ•DZ£Þ|ó=y A×d¹(¢no»i²Ê>²fl:È/[áÔé×ȘQpØ eDŽܒëþ:bB‚»D)lâ[>¡óñgüL7ß6l0ì|ìý©8¤†(½¾u%k4½Ù|ÙPA$§ë£pBG eæÙïr-¬“挶©ï=à§µ·å—EŠÆàå@Ø¿0fÌù L+‘ÉK4\ìmw„¡Qxef­ÆlêÕ&Œ+ˆ"É”|ô*àªØí#¿ócïÔC­½¼QýŸ<ÚKk‚kéÏ%ì$V{?|);¼:‰ðákE\÷œø•¥p6£9da€&bAlÉ$>¥‹9¼;²¶ Í*àaWÒj;ÊÄÑíŸ,9[îïVÀ5 \P¬cíYöz[ÏÝY,ÁŠ´®žo‹žI8$çJW¤Qíóˆaz÷P ^Ë9¤+Bäç?ÙÐvù ëâ±$ïAa,¦sx¯ÍÉüÊò> -s½7¤„‰L-ev쵞8Ïð*>`hõ,3(z¿Ù^êýK´Ì}÷…a2Éå÷ÜÆ‰6@M†`x:%›À6#•Ó26Šù&«lUmÀä%œú°oþÙú³Šì"JÓª‰à§µwÈÐÏæƒRJ¤SÝäi‚‡;M¼Þü­{@r!#` MwÕ  ˆ\]T-m‡5cÊóÍŒS®ƒ¨~63öªu@mXx<áŽ{t°tŸÎ-qÄFMf®zóøÊK\íNÊM²•TZSˤ¬ªw#R8:§@£Kå£}ùIÉ禘ÊkÁàðbwhøBñ¦åë.P M°FrÉXéWlÍ)s‘÷Á‚5†ð;3V½\‚s¡Zò-"0dÔ £Bƒ¶›Å5Ðx^G¿ …¨Vëר”ê©*¿Ù‹÷Ä)'™/u0~öÓW“Ä<…:ærsÂh™è¶È0b%©9 c¤sê¤}^އõ«ŸŸN¡YU-m§ë¦r–AãE*WÐñbÞ^Œ¯wåk¤"y¶¾E_r¦ÖÊ·ÈíPðxI§Í¶0i• ¾¡Ù˜8_ÄЪÒÚú_•pÅËÉ%m‘S ITÿÐLŒí¿Ý'xüG ~zN‚wø:&J¹t*WßÄi²[LôºÛ6ðáíÂÈÈ(Zí¢RY^!)ì] >°•Ö°qÊ<ƒ”¸À}šwÇ nI‡DòÞ!'…ÒÖ¨MJ HŸG¶÷ô”Z²cën iG\p¾)¤dX“5!š DRnƒXŠwL2÷üÎä[Y"ñGvMìiò÷Þ‘ÒöýqµPýý8Å öh ð»TH†®±ZİÃFáÍ9¯C;Æe…@"®.V IäCš³0ú} h¨–%d?lÊð%0ñƒ¯PÏy°Ñú8 Ö.kaöŠòp{>@ãM˜Œ¯vV·äºÏ.ˆD012s=VÃ/™¥[ÿþŒ©œð˜®Í xëoðÓŸ}FùƳQ1‹` QT0iázɺ¢3 R"êÛÞƒHRWV¹ýü”ŸiÒ”CÃ¥x½º|=Q-’ì» Ûð8–&W9$2òs³‚Æ7>Cİ«î7ZñÜÚoŸGù؈€OíôŒ¸ ˜[SlÛ>Xߪp3x¸u0Íöâ÷Tþ)ïRsÌÈ\{víJiRXpÍØÔ ^Q=.m9f‰Â6&¼3%R=Ýé~6›Ö RVÛ0Òë,ñ"ô3#L/÷à¢/†¼à½»ÍؼA@Š?\ÀN¾>@#ê¿#º`IýßîŠa[ô€z]åP ±ÛÝ~ëøyyÙ‰!?ßÂ)â¬=#ç'ÞöÄKMÎOðEð”Ç•½¼HD…ˆßûAãËÓåY „–¬ðÚƒR®ž´­´Ü:÷3¹~!h¡$]ÌQCï±R†ï³ÞE–áß/º7hüÝ!ÉÊð+j.,5j¬ÇQ”†‡·rJ–x:H#³Ž –Ò|M¦Q:×ZÆDÁ‚â›‡Ë ªÁ d–°Z4»¶›Þ´ƒw:ÏF†œÀª§ñìŠm£z{>Mñð:dõG÷ÿhH¾eY}4‰ÚúÉÇ»: {q„”„ÞDŠ¡œ.F2·å¼¾-!dÑnlqIËk¦´:ã½_Apb4ržˆ ij=þáe͇ò"õ6äZdt8ÖͲY9‹Âã˜Bq°¢ìã—£ô7G6HÝË–ÿÃûçXŸf«]ÝÿŠ‰Úæä´Œ\æ· õƒÞ´-V,0‚ï5Ζ¤cvS° CbOxgc¯Bé úe¡7ܲ“ÿîøQUì0-™<éTnÂä0…I 6qÙ'U®¸ÛåÒ~N÷¼Ã½Ö‘d –ʦ”Å%О\õ÷¨†ØææRqNFBpÊb× >ÎM x_Þ¾W­xךŒR9äïl;À¨?ìœ/c¡¶ZtÂ,i¿q>×ð¡ÛËïT³œæYi©qÚ%•–©¬7 ŸE©ÙÖÅZ—1…Í/á qIŦ‰ä§n.i÷røîm;á2”[.”/%ÏÎx«ç Ò½ö¢¾¸LEÍÔ<ÀÖªø‚Yœ"^ Š2_ÞÏHgrð¥6³—¯V˜NŒÆï´ŽÆýüË.Ó€ßA|ÜFóŽ,„#F—¸bé±g÷`uÝR§N]Ë^‘o°ôfò…B©œLF‡{öÙ«Æ–Æ»–ÈnÚr3³•ΔîWÙ8«ºÍ€," w±§ºÑ à ò»b»BåþâLÓKÓ´y¥§Qä§Á ¡ƒJÃQv¼Ò2 ñ£RÓ3Ûâ)4âˆÖ¯º­ñ†YÏ]ÐíB)#”œòÆ•ëçã=À7à‚‰#wÃ0hûý ÅÎE=`9öÚÌÑ$äC–²Ëw 7o€ÁžÁf!«g|ÞM­ÁÊ·Ù„±ö‚ÀûGHþ×Î#×FÙ*0¤HÈk‚§ßx ˜Þbt(ûWL&˜/&™S-”/dÀÑ´®Pèœ Ù´=O®e>:;fØj©SIŽ‚Ñ×üDÓ&ÉÓÂV^áv*ý"-àe»x0(bk¡$¼> ÷çà¹Á¼oœ_¦Ì»€³ ¯‰21Bz8þ-K€\L)ÑÜÖZƒ¢‰åµÏ ’EiæØl ’§ÛQ—°×š0æ6M'Š®W3Jð‹ëö<10CD;V¦Jˆ­ÿ»½·2Esù—/ßXCÛüe  ØìôûÅ9ÇöÌk®“ð2_³¯‘‘©­ô­èè%&G‘óÌ·oôþ_Ú-˜Øù¶¸rÔ ²†ÎÌS!æSJ°)Ëà^KÎ÷^ ¦³zŠˆ‚w_Õ|BßÑ&ØH[ÑÞ µ¯½ v…©Œð@åpN^O\Àk´ú°|mçT€˜4õ·Ï ³¤ÿvSŽ4ýC×P3GX$àþ²!›@¾ço‡e]/”Þ ñ¸¤t"Ý‡Í @n+¡Lhvù£[Њý’p3Ñî/8ÚŽe8ìMG"¸.šü38ú‡ü®Œ¦eyÆFç{äèM…ABœ¿ÓZ销ÎêʘÎáêdÈÕÜIS=Îþ8ŒYCÐ+Ú„$ .‚IV᩾J83·Ü¼ƒPÖ[Áß4“%,¼çº’v zÇqˆyψ®lÚ uŽè‘ÊzlX¹YÐ )ë:`úh‡yºè7° ÌP]úæn7·w)eU7éf{ʲÅI(í/Ç ‰ß›l¶íIµ}­Âs» ÿb¬Ã‡0±Ø ükîFÁ ËâªAé}3 JÏ7…yq_F¥Ë‚ ±¡½®*œŽ''gì|S^ùZ&ôÒt&@žï&ÍÏ!U‘_M‚N…“~¯ú]—D®%€ª7õeaî¨ãàÕÑ(Ë¢ *çzh*¤%°‡Uë(`2¸lM:#þ5p5¯œL‹ïcÁb¤cIë%ã0µH½x®öM÷ÀKŠ]>çb£¿ac•º2ò¤ Ÿ÷æÿˆm>O€‘8Lª_ìöhº1VùŸ-VËUH»½b<°ÄC=õfr’YžmkI‘dú/"UžŒôÓ-¼ÀèõR¼U¸Y8_Q; —õ³N¼"0N%щ|—¸Ž0mÞJÑ›]¸X¬Ë£gDr#KêÏ’ão=ïC&ª˜WQD^5+²= èº9Ó¯.-®?Ÿa@y˜Å7ÉTžè‰æt݇pŸÿŒ•sâ¹3Çßp˜ªK NYõq-ÉPWÊ…¡á‚nwÖÎÈ…Íè_ò¦´šÒÉkÈhFYº3`tÛ÷$•| ½Bk¥1AŽžM =¬t¦~ªÇНÔªO|ðwGx$Õi¦·•…#=d°|—Èç"[5aÍa«ƒq7ŠëedM: m<ÂT§»™s`–ˆ<»=!HXN{˜í´Fu!•‹û‰:µâzYKûÿpŽp€{»™\Ѷª&™ðo›ÏÓ¡ìxC ¬M}_Õû1U9^H´ÎÿwB&¡^‰ûÂ'ZTÉ~òä¦ £yãA1kO?4>ŠÚ©PV°!Ü9Bn??dŸ ‚È€±®Cf]xfæ]<{¿³fSͼ™æÿBÆ(– ×áÍŸiŽQY7Ðx­§UJåäÆÁŸör푾”SÚñiA .f¶,«”éõ{-9ÑÍè¨ÄtÃsµª$4çZÙi˜Ð~‰ùPE›‰E–nÊ»C«‘±|UsoB‡«q.†˜~¡R°Åš¢Y£¬Rq3liË$-eèäv=KÜÍÅ/‘ÓšRZŒøõLK}ßn{gfìwŒcßvJ—@𢩇EAÍ¡5žHiÓŒ^9p]NZ ¤uX,ÙÆ 7™¿1¦®´âm‰ß^%“)ážNÉè^ÅÀâ0q?/Öa˜iÞƒë{˜`¤B½q¬ y…øâQƒÐCp¤¶)·³SÖge—í íæ^sTªmd'!cÊ6'ÇA;*\ûÙüs¦P\tÄÕgÞpÊ„o¹e#2ÉÄ0Òð¨].N§`‡yÇÖ3¯`ÞBŽm∤w޳ƒ†GgßÚbŠSŒf½ùQ<6”‚&õ˜ß:ÚŒlçA»V‰ÀÒÃe,ÊöJNU‚X>ïŒéš·¶’üÂ(0AµÊÊ>áfÚ!‡qˆW5¥õLfÀÍë«V%™¡ Ø$̪$mk´U6·„lñ±õ¤\ÜG¶:«^`juÆœV(·âg×ç/wYyÊV•±»òžÞ85%ÏÆØÑú­M¡g›4:}ÒK}Ÿ™0€è…‡¢Ê`5lôImnÅÁÏμÇA£¤‘VìI Ó/{-•Ö%ìv ­3\¦EI4bãO‘\~¨Ï#†íÁa,ƒã9M½\)à#C.¹KÊËßåÔyŒÈ©‡Õcî0I¡3æÁ2ˆ²ÉÛÏ -!‡Ïܓʤõ^š#ÁB—ÝW±øb~ß9…†‚µm¨ýøk$³-CpGîI:½ÿÄ”/¬ávÉÑ0 {ö†+£“9WŒ]±ùöaÀ\á‹DßËB¿¼‚SdÕno?»IâÎc…Ã?Êiðfƒç½jáA`›ÌÐpÆc§v¹šºy5r1ˆ´â RâÅÞ•$J2¥O‹Uï¡Ab€Á´&Tÿ¤•E_C’{¦ýfH—¤×Cî¹Á4ìo/§ð³ÐƒUÖjü§¼ïB¸æÔŽzÓ_[–Á3 ƒ´¸òW§€šŸ‰ö–v«®ÇëyžJ§èZÆ_Lr^]ë´¥²lššÀmÒâˆÔ·ØsÄÜ"¿[°êo¨~‘wDʈyXÝ/Ò¡ÊÎí4Ýã$yz±¡g%ïßF,Ì&ZVî3Ÿˆ!ø1>R^U›zƒZÊF·­îŽ*ÃušÐ¯ 01¦ÝÀÚ>ðr®FXŠcó¶ÎcDÿ ÊÑ»˜Û•v½b·ßçˆÌâż‹\®†¢ ªŠ^¬ûÅNªU@PZ—  öQ̃ (@ñ?…ÎÑ•ÀÒj¼+”!´MA>c+*CGH`l¡LdVìYQÚðw'TÀ'+c³ÄáîOÈOòG Úò–7.ÞÉùÜØ{NaiBymêù¸÷Ngÿ2g&È3P¤ÅL½W¸—¿ØNŽo°â kÓWgÛ™ºmh ¦ÄÑsú>–­ÀÚºþ§÷4 ?ý¬‹ŒulS¢OB? Wv!æ=P+L¡G‚tü']Y"”…’¼®8U× —ƒŒ¸ÄÀâªj#¢‰Ôç/1;›ö‘3ÂÀ²†u,'=›ñ7ìSã©ô[Dô40ê¿"à“L;صÁñw™`§¡'¥&ï »ÃXºd”$]µE½ˆÂÜK¥‹K/°üêq½‰g@ÉUè&!Ù}x2TÝîÑ©ç‡âàêt&§©‡ŸÔT¤S¨ÔMbÄsË+Ò{ÆPÒ{>ÙÈ<æjD9‚Y…LJ÷e‚§nÎWßÜß³$ëù3:{ÖFêÛWÓW´PºWu¾’PàdõÖ’Fª1Í_nµ²ü€–ç´ßÍã‹L’XîÁcÄ{äÙ@gJl!NYêPWŸRØpfo¦möÁ‘é(>h©± +šýŸ˜Ç8ŸU¼Âx¨™|1Û¤>< ‰Px”`Ü÷aü"a” o`3õH“wƒLIþ·ºÈØ!°FÙ­3ø)8»D5t=Ç®(/X >c­ÇeDñ9Ù"G'Þ_~Hšr`øeÖr·cèW½»ijÙß4en3¢ *”pÿ2G7âμHqÖ‹ù:j6V½¢?zðç!”ãÏrÐ<Wh±ÆpW‘,SÁ愉kùÛÇ,¢l¼™Åþp M™qïŽ!° £+Ûöv‚ÓÉ OÉÝ3ÇöB~WQõÊ>ÍCÚ¯®”ƒWÑ•ð&ëXöýÍ(0ªíB "“PŠÂ\¦Â¾Dû÷OtÒ9³´3Ã(j VÅß>¯”8 Òx)ëÀ}xäHa {ªãPN¤F™Å«.üžžúd.åæ{{ʺY”–¬ž%gC0ÛX.í¶®³£ö¼둼‡Jý)s¨ÿžÇm¥à¹5ðÿÔßÁôc ØfßQ ¨J×uÜ­5>…ÊD%ï¿ ²O#r÷5ÄèDÙÀ.”â•s7hgljÐè7•üŽ5ãª>>ˆ<·ÁŸß¾Ã<ÏmÂ+êĦq>ß^Í)Ð,R i‡xlfÜÍ÷|‹ §€sP¶q¤ò€Ö‹µ‰:"öI ¨ibœs0_œA5«çÖ÷1G™÷¨ô¾At¬#cë…°Õæm‹cÿK!>ƒ×°óÔ0 E×Ô¥YÎÿœ^Š VE?Èø È~]@p}¸u}¡­mê_ÐãÔúíOv,±¦ÍC’8¹äÚ®=´›@é7Õ?šÖ›60GTD´·´õy*9ltA(HÙ'\Äð³1Ñ3FõÞ¸²ZI= öªŠ‰±è‰}ÈTtŒXò\üS\Eö3ÝR*=D €>‹È)ÝËD6êV€#º$Š)Ïí2ö*)\ü’»ÑÉjAìþŒ:—@ñh³E•á.Psþ˜o‚Å×(¢½¦ÂJØ)¤’¯`ÔÍü¤7/íŒH7³:´[`™QZfAÔ+œªuè…Q@ÇFYñ3ˆ–gëK—µ¶p[žÕiÕ—&{‡oÌÉò¦ÝTÙ©nL]ÛªLña(šA)fñ&7&I¯Õ=ÞÖèqpn ãÀMWk÷ ¡ÃÐ5Õ%‰“r+Y©n=+¶Èé¹»ûNc#nC#ЏçÑ‘ì³cF¢Füä黫‹Ps{¬.fäãoÏ&ØCâfv `±óêçZÇiÏGŸÒ=A·E;9BÇÖ^µRÝ€Ô¬@ ôF=Òö>~À‘†¼áµü»bSÅ984m“=×^ùižÉMáxmÊ+] F¸‰I³—BðÉt¦íµø®È øÀC*‚å²3·DºŽ› û¸Å‹ Ú´ù:¡õMy6'øâd“¦uà™ÓW!'±dhÙ9¶îÓö楷»ìÃ@½^›ÜP³p±ítÓºš¬3ì .á;.ùM.õò#óíëLšxÎÏ \LÑ߃â;)ÊêžÆî G¡ ¾ÕJ †´‹åÉłʤ)ê¥ÝÔ‡C)åZÚQÖ®À±*žÉjy!LÒ©¬dZ\ù2jmÚþ›=hŸë¹g°xÈAóo8Õd%ô•o@i bìÓlRÈ™ùòa_â öCDÑç‘¶óÆÒųÅ;ÊY‡¿Ïyz@ȧ×[¬¥-É'öBá†V ž l—z‹ð1b?Zí嚪eº:ñf}!Ùô`ƒÂ£C¯»efÏjþ]YaU/c头-Õv§ûE~Obe³³«k «Rñ†›:^’)›m¼v?/…ÓªÛá\÷,РÕ[ZvÙíÇÓlN+væ ¬ü›GA"1œWO‹¯ªm«æ¹_%tMXBÓr{¤zÛƒO>çÇ$;ÁÔþÿÒ£èr9»?Q| LTóë܃˜ðÈç+Â~3'Û”•ŸÓg„Nñ^Ÿ4ø®EÞô“Ëåcõf6°\+Á;êM‚9‚Å2‚“óÒ@=SCFô1¡ó,jLh4·ÍF,y|[ü$°åo……¶²4ïÐ ¥ÌÄ\ m¹]ìdƒô>ðît#7V×/žOÁÀŽüN uX6ÝnRõ SIKwh@›1(‚¥¹™¥âëb¬F%[Ë¾Ž‚*ÏT7H$)ÓüŠë{a¹Ø¢—j?+vP{¤4™Î`Ìm&4t‰jÑÁŽvòž«¢ÞB9t*fØS+±ÝæRñd^´~uKªS8F_»(ÂG¦¨Æ{>¢ƒ¡S)Žîo…Ê!]vŸ: È8E”l@>œ(à?ý5•=Œtm­Íe(¾•ØGHãèÉ]Ú1/Ø;-]üÓúFéó)ÊaÕXƒ¾áŒÒŠðM›Öy°nU#ˆ­Êhò³Ú„ŽËŠU¡ö)”˜ï>5wÊ£P¼õ?‰ÅØ#d½]è ¡UJ½ôQ|»¨¦„\«ŠÒÂ;Œûäõi´:ÃtÞŽ.™#b„[i%Q4snÏËœ½„Äí+OÔ·qd½F×¼/ŠÞ|­Ù/–o¸È¾Ã‰pŒØ–x×{›½l31ÃõÆh;Üó%ŽDWø‡Z>0úò€:¿²T…XÈr4ÌoXìÉ©HwnPí3d¿?¤¥Ÿxé¸ÈsÅ7*dc<ÃÿZÊsF“x û#ôz·‡ùµ“TY¥Š†…§Í‰¿ú˜6×Dä •¼ÎÈ¡íuQ޾›L1u3yz%¦Ÿ¶áʨN~.wz”W |À   ˜H/8ÁÊŒÃûKf~c¼f:Œ-6f»‡ÇuGÝ,ޝ T4½PÃ¥{é/Qì;áïkÊ©äL;m6¯öÁÇ8:[i/8»ÿ± ›=Â4åÉžX<"iÇ?$ BËEI¯?×ôÑmž˜Êtq’ï¯ù¾‹9¹ÿôŒF‘&ò·#ÓlûÖöm[LÞ.•6ª©¯Ÿÿ®õ}ÜdÆNŮ֯:qU¶$F楗6|iŸmÓ×wgV-}Ýv”#¨õÐz%\VËìl¸/ìâY§BáÊËŒýr»Z5D^\ArÎï’ݯ—Áu¦X ~“†1÷Ud+pw÷üŽ(˜mœòKl8ùD‡v…!:úö”oËço0Ò/hP( ° ½©ýö˜ÆVv/©@Îy»fÑÆY\¡ÜgÁªÑ@Ìþ[®ChØœâDñ‰[[jð—\åt‹’ÕcGøý1Š?œè³0™ŠQ¢óÁýBˆÑj¬I–Á¶VÞfNëÈHmtî–{%xTqGÁlTuÔR©Ä—'o_Už6â–È2“;áß‹'c;liwFåBû[‰⎧ºƒ9é[^„»…‡£š¤q¦J9KÚïÓði•DîmÎèlÍà·bèøÎfDÌ•±†ÝøágH‘+s'](ä”ù´¡Â¸F´òÏÝ#²@ØŒslÑP!"úõ¸(ÇUh®ù›{)#,Ê”O‰¡"2êU~»-TB·j£§JÌ®ŽjWÂpV;ÐèÜ#¸+ææ¹]USãô&mïUr ½5ŸÁbJ¤¬kƒUzD‡ó¢ 2[àžšCÊh1âà2ø¿,L, R¨á=žÑ"IîþÅAk °$ˆpêܱ–0Ï—/ý׿g¢+{Žzv9hÖÀ,«b(}áôÁCÁOÊl<Ì öyZ%t±ÇGAáoRϾàìÝ@Áă]y؆0ÔÝúã'?uÆ‚ZlèµÂVPy:o¥w3yÐâB¯«XXÄ1VͪÕ¸þ§ wÔz[[õO SýNÁ ½¹§ÌÞñ¾\Ydjãì3 ð,¡îKôyƒ½‚LVÊv6õu”»ÕñhÃ<@qŠÁËQ[YRàµR“BM!¡GÑ¥R€vk#ôƒá©†[šEôþzdÄñ/[ÜKLüÔ2ÙÐRÞB¸ %œÂW5çòa¥Lr×á&ƒúâ4ä«ÛôÀ„½Ø@ÕàðØäI뱦T³_…^~Ø’õüg1ÏÒOµ"´Bãû˜kZͬo6VþFÈX³—”˜##È5ž!áJõyœ„«NöNcÊšµ†ð`Ô&‘dð;lÐî±~ËîlЂHÔ9´û| Þ¥¤5ŸD†Š2o>5îp\ÎËF\ë+méiájf\¼ŒlÅß÷QA C5‚ñÖÕ –{²@Œ‚Ö»BКJÞ†(Úåa@)‚–mzp'ý²2»4L*2ëäPÉöçÝ'­%_6 øìŸ?¿ºˆhUøkÏÆ:|ô)U ÃÌú?h1‚¶†0†³ú>;Hy– ËVzâîFýù¿ >—YÏÒCÃk<£ ~@šÆë ãu„˜û«©o^°r×ëÈ¥•XêXcÏTg>‘2ÿ!!®8_}ðž¶¼&œOè=aaÜŽReI\¸þ÷ÉË–ÐÌŸc€94Æ!¼&±{ͳ0”¾„å³¥ âZlî¼E‘°.àž‹yúì11L "]—{¶†iø<:ÉÓèìyö@^¶v]íÇ!Á¨‹D{õné0.yŽ4@ÏT® †(:븒n>;¼Ôq¦£Ç7×o‰ß{áÚŒnÉº T1»µ-*†r×[}ȆÞ˜| r í8òCs+xj´1y:7}È[áÓåý8˜C6ý{€3¾=í~:'Ø×Yzð£©~¡jˆ‡dDIü|ƒÓmò5™T:ö(€Âlýs‹©´+ˆî•S¥,´Ì߯ªØb„A`¼¡ ·”éÙWˆý4jg‰e:¢§Ãœ<éžß½o5ed½7¯–  ^nßQ<!\ sÚ³s÷±V­4îCK,qXJ&Òã÷•áËü9¶Ž—ÐéP÷KuC6K/ ‹»õ¬"X;WÝrRììLø}ß¡"/jÌöd¿`ûvšO90² r_›«ånçƒè]~#0“m_/ý–ȃq±ˆ¢I°×Ðt¶€Që?Îññ_þ®ø#-<5±JÍÝ€Ò° XkË FªwLrÚ¯!Ü ×¥-1B¸ …r†’yé0ÔK®ø!>SÉ¢‡J'Ƭ¢ñèoķΓD˜¦ÄŸUâ˜ÏÑ-v³Oaäò þdÞ¯#ºMP±") Zx4¢·ý-¤¹­F1±w66¼rÆDÑNíKJDÆ]hyd£±N¡l™=$ÚwÌ™?tŒð™ÍN~¦|YÈ”C‰NÎK3LEÙ1dZ-Èö¨˜J6ÿ^²DÊŠI6 l—}¶CzYò7x¨aïkâŒFã—|ý„#zÇ=< øJµ¯æU*Ï,êþƒQ6‡ C]bQt ûQ"¥Ò”fòâÜ&¸Ê±:™?·AÝIS# mNö©rƒa-N-8ܱ€¿­~*ˆO$¯³Å%›!²e0ÅSn)ë#6-ê²Çtw/œý—ŽÁf¤EòeaH«òÓÅÑÊÓ$ŒÀãÉKƒ¯6Q$¶•lnŠð¬'ýr‹IIŒÌDÿ1_ßtèg M]p-˽éÆLþwxfÛ¾sºûºñZuS¶t:w\êUné>CL”NQE Mî1r֫ȇ>d®í’?%53VR"جÃ}ÖKêç\UèÙPX:di²Æ,ÛüöÛÅ©Dh«@aÈ¡…dm-äÝ“9¼9£’¤#i¢ 9»˜>ÔÔBzeÛc‹tš‘#ÄÎ_ñõÐyÆ^"39dW‹ÄòÚÆÉHÅjîë½8†4)t°#3¤BšßÎÀÕ\õ±izÚtyxfþd'Ñ}¹åU…ýL+Žãi`ôv¦Ÿ|Ÿ\ôº`Ç)Échu>gä¿~3ªN:ðàÍ¿M®mi‹§A“‚+°›ª*KoÉ#drºoo‘!4s3"6‰ïÌã©ñyøçúš<©4¤Z_§pzm2AX¸òùƚ˒¨Ç"+aâW÷âcѽf-Ïæ‹À~‰ç8O•ƒ°ÛýAܘ£³ÏµDrß^÷‘Ñvt‚ÁúðIõˆÊùI€)5É–+Ÿž¸ÆFôú •ð{ÄÔÛ`èeÖp!Ð3}è¬ÃI²­ëÎen@úÀ.Phšµüˆž,æ fÙD¤r=Eiß’»Pœç™ÝÒ8™r{xܸȮþւΗn:ýÕ/ûi® =rã‘FQäÅEfØÇz~™WÃOrÍ3´·cÑz$ v® ®ì2týIë6Î~ž`##´Ð%pµ[ÜÚ¥M^m‡Ç©´¥;Þ³ÉBRœÒ™OøÆ ógß6\+¦Ì‰DÉzëÊðZú[Ÿ¯+ùl‹¥X÷Á›º?X#Irœ½ªÎ/èû08 b¹‹ªÞ£:ÿêùüÕV)üÀTž [„º_妩7 2Czöi£kRä)VâÙ¥Ü(…Ä'”‹2D3ØÔ¥ûoP§‹açPx·|«æ®Ä‰þ¯“ô(g-øAFYø … ¯³tÈçˆòmŒ]è†6)j"½ì^‹Ü¾WÁxžä«ññ0©dþ¸÷Ï ¢CÄG¹ì Úï¡$¹Û¿äônÁqŽãO§Âû ò*5І2kñå‘=(ÆŸ];â%7,¿¸¿`/š{¹oå…ñ1ˆVæžZ‹`|ö8½WR×Ôe½(EÝ“_þ’˜ý!^ 5ùåQÎÄt‘I$~Îÿ Nàrw•éé4™Õé>Ì<çíÞË­ö•ÃIDrWR%fÞ…Øí&þ+ñ3Ã6Ö7Œ0Ó°E“¹ÿ~A+˜|¹ji承ÄÛ¥Už|××?×Å!¦„&¼§ŸÏЊ#ž:¿{E¨Lç>x1%>2æ«ïÈt×^ìö"ÖBa-áVO–QÔquâÄÅúâZï<ëQùfMÃ7¬œpª4ñÎ÷k#ŠlMEt€„÷Çè×)–¢Fy_3î–¸ß8%T)¶Ÿpzøº‚°×+¢ä,@löá ÉßoòÔ»¡Áe ¤î+ÉãK*é’tNºzÄŽ@íÊfÈüµÛ‰ª ÂÙ¹†u ÒŸ‚Q ìÜG”åŒ||‚µ±Ó`뻞+Óuö¯Óû˜¼T¥€…†ðh‚¤NqV•¨lp΃¾€%iËaÖ0¢¦Ä,¼y"8޶e®ŒTÌš_A ÿÊ‚$¯þÔÄiV؉™cjYÍú·×v2èÁƒš>¸yÖD¦¥¨]rfD¥_sý2%¾vÀ_Âü'ãì¹b©<¶°AU=âfNáz£Å÷ù¥’yƒ?ò,|?MD£@2‹¡{BÑ–¸èîÁDÒñƒß@ï¡ zEùŒ!¿+nœºh ¤Ù7ûìO‚< 5Þªßað¢5àgKÜp;›l¯UƒYç ²‘)Žð_'ÉûÜÎSìíÍGÉÕ9¢†8ƒË ¨0g [óVaø½’‰.O޵©¡+ý¶jSFÞ¤6>ŸBÕZ¯h£å-Kôaˆr~‡Hã÷9G¥;n”ë(<»¿fROO—Fäúú]aBŒ…ô’-Éœ¢Îõ¹ŸM¿nCù—¤´…ÓgÙÈw§ ¾ê¦I¨ê{`P9M¨lB“ks÷ÚoÜwIôzé…¬{ºýfsG„S±yà¾Á Ïpˆi?DÉŠÐ ­Fµ^ ˆ h\QÝ‹rd| +“$è¢~i0Ð:òÜ"|ÿ×AZŽj§ ï¾•ßã‚m÷hÍ“µVÉ›é÷…1yÔbqQ+:$»ê#Aóe!7påæðC’ÁÕ°lÄú§ˆ3Ë|2Ž"È—H„ç«þíýVZÂsD0®‘ä•HÕ}±2ÝïE25ä›áb”CæY6qN»-Ôî2{ïÖÕ0¡ïë 'áÆ_6¿Òç‡÷è=ðœÊŠú¼êà’D ÀÌhàêù4¥äýHdéá»b©¹€Ã#DÂKØ7!Ì37T&²8‚K.Žü̆fr]*Ýš—f,¿7¡žÄ¸’(¸‚~±&w¹ £À¼è†B™QšÂå)°ÇüaC´Ð Ý³iÎÌÊÕÂégÐ[Ë—ý5ú]« ǪÂå@âðˆkÆq?™3),ÆCvÛ=Œ§¶gሼ’‘ªîìá–à ÈH%ɼè¶N³šå¬ô; ~3ìÏÙO£G73 $#ûzíX?;”Êh4hŸ8/I.xˬÑò$¤!éöãuüDùÃ%¯”i• Ùdû8#ÓÐõÊŽ!gyVSá8 ü¢þÐ$ß(AIÕ×¹½‚®Máú´y ߊã.õžº;ekø¹ÆÃNÏ U4×k׳܎(T£Ù;l ¶Äû‘™ÆÜﬓ«nòtõåA=xЧÁïìæº=£,´y¿Ñ~˜é¬¤SlHð*¿ôpĽP: Â+òÆßëìk{îi€01ff8]ù;ÒBXÀ@dÚé½ïY~)R8(ùß_’7ñ¹˜Ï¹áƒÒyµ¦dÀïÊfº,Ð*µM”ó0ÉϯKXð½…©P”ö‹¢/ríž>‚Æ*¨+ru€ÊËú,yÝç›nPGôÔ%:O!ªûÛ$:d}Ʋ%J}±åà¦Ì5üD®˜_+[6¹6¨Ò À¡!„2‹ôì-•ÜzŽç:ûíT<†‰Oí>ûaõ Gy着BʦO(ªx“{@¸ƒÈl£)¨-+SP6 ¯£-ÏžbŠ`(~)|0èG%V¢øë.‡eê\ÍÌB -qôRµ?™kÚƒNcË’x\7’0ÑŒUû©¥XIeCŸC¼i@?ÓcÆ<ô)bÙŸÍܽ×Uw½Ûéc;îFà–g•€å=É/}R@cf.¿CåÓ®:¬Nhà E„_‹x€¸%>Uˆ¬šôU†UŽ¿¢‹5,º| P×tZŠ~;17KNù\bˆ¦’>68{çÈlØ`µ/’63Ï CÊÂÐð]»^‘Á\¾Ý2YscCk„ ¯…]#%hž¦ÃÕ”±øÍ¤OskB*Ai­æ/à¬\¼„‰û„CŸ ãÛ yæÅV¶³ŠîŠ_”cq¯ºôÃm˜^˜‡c‘`·= ]\paÀǺ ”©èø ñÛ“d_âð„ 6tÑS£5Þ„i ±]R*WÝuyýIsì¢aQMj Ï®ä=NYúN‘êèi°Õ÷1£oLŽwœ` µ‹x6اØyIö¿µ|ºÂ¬ÿë‡í_µ¶N2üƒ3I=hö`1fåH&ô¾HM›fŽH±}ÕˆùªFW?Rûý/§‚N2ÕyÎp&­AÑte\7ºE°25àJz¤ú'QÈ1-Bto™ÔÉÁ[ÿ<]„0<+ÄÓ~$ÀLÿeØÞ«å Fò“Ù„è‡fEs«f yî#ÈíkóCxáæ µŠVP¤X5äK“2ší6¶-œè1öœ®Z÷@¼õµãq«ºÏô„Éö|’Zù§<ÞÆiQ¬öXÝ Çøæ¿f¦ ÉmÑM¿^·©…ó¸?©,ÏÆú¶oí§MRQ”ÂñMÉq9»è&¿ ÏCÜMmÃÀ"ôù:¸·çZ*{E{íF¼—•§@¨´â—*æáCd¼¡öG©Ø4Äq«û6êÉÜvz'•©{Y͵'‡íðN Ѫý=Ò›ôËÌÿq(Áç«çü{ιù>IØÁÅ…‹ÌÞýF–ËyWB_Ç5õWÌ®ÊfÖø³â9 l+u* –á°‡µœþç!På.”qI»%Ò$%À –)%D¾V¹¿´‹´í(ãnÓÚ¹48õ«"A§ÀŽ×ÔD8 éîý”#G2sPËjjW‘QÕˆPk¬¸«Äº‘ÐØ´,f&½y:4u­ë¥ šÔ×KQõtã­Mj’‚¢‰n0 k1é=Œ„µÖÖêýCŸ§±üa(¨ÕYZkíå‹Þ ÚC=;ÿË·«Ú¾ƒRT«ºƒøªu¨b·-$´»ÞÖýo³|rV“—vÍìÆ¾µËm,5Ï{´þ9—#C]Ú–Ñù52§‚xòjZ³LxÃ+S0°oç©x¤Œ¿+ŒŸ¦­Å1ôlËŽ¯$Ë©ªú-¾4M/Ê`Ȇ׾¸û6ú.oÛ@ÿˆ¡L ÂÒ_ŽUùc&è²Dü»ÉL({îP2 Îàwh:(œÉ 0Ö­Åx[—ÕØ!ñÙ½  ¢¦¯ÀÂ2j×ï@j³Õ–8]ìÊÊ6sïPQÄe8fjõ‘Ýžî¡î>„ìvߌ¡" EGOô˜»ûQâãÀ.=‡W{¨±'û¦Ó'nŸË–¦óÑmSÛµ¿x ¸"·ÓÃÇ¢rp|ÛÕ¨Gb;ž= •œ ˜@ã•ÓáÍ>l›¡³¿úâ»:xK.òôUõŸov´ ± £$jŽßº fPØFƒ÷‘|ÿàÖ{5“Ï" p‚bö\Xž„šü>|–{ûŸç—›c0A›Ñ0O [—R–÷YLwdçZÅÉ’—T3o’B»‡¦”f©e.ùG7Á›ùLÓQSsü ¶»yqµÈ[kÏÄjÁ í·éùô‰<~1?á> ضŸ³Øêé:²€Å)¨À©†ÁêSܰ®‹òšI‡ÊÚc‚¦; ÀÅðúË¥ø„1I€ø¸àËåÞˆè º#„´0¹/ KÈÜÀiŠª¨ëÌ88û*Ô\-!¸”àÖ’ssO\¦¢0,ôG­]ð`c¶ NH/•cÄ1ƒ‰kPH(5Æ^éWÆ‚Ÿ Áp ¢²q€µŒÚ+‘jóT¢&èàÌ]¹Tq¯rÞQƯNÉ@Ñ*Â4Á0Ÿ•2£G™`Œ¬Žëoä·œ¡C‰š>«Ë;ÿƒÞ¥:|<Ⳍ w „±÷ÍXÛ_EZ%á"ìž„†Õ9ÂæPf%= _b’\!–™Qh’ô#îŸcwd©(QªBQO˜³Å;Ý]Ný·f‡ÄŸüa‡ €iê?‹¥¬€‡€âdÎzåz±/©œÝ8S‹*\Œå¡qH†‚yááÑ #•O™ý}_Tê9S‘%¢C( g5v7ÿ÷ÉÉ+4+[´=1¾ašˆ~ƆärÝ“>ªFÀî£{CÓ0™°V —vþ0ʉ1C¨#zÚdW¸“ud6L4/´L˜d‡t™~/Œ6Ïb.sÒÖ_u€öu¼¾¢jSÈj!sÌÙÃNâK<H ¾‡nÜò™7ëPjr¯£ÎÕý‹ý²àçM‚ehßb)ÖL£±ÊÅq{?Ð`ÓïÏÁÑ€Õyá»z>+ÜÚ”1¶n cƒ0kªD»8vj­ïá6P·ÉvÈ“9”ø_PIÃ&¾`6ã­ÀjÐG|Ùõ¥M]ÖÒ9ÐÆØGñžûH¼*Ô-‡D^Ï·-tÿ2íl Çåç.UÆÄeÑãhwOúB=X,ònBN•äCC{f;C>áî 7ÕéÍãÁP…z€Ý;1)e·!¯³ü,‘ìЦB[gH¯šídÂW¾ ÉÇêòb’jRIèŠ ¥:„ôt7|eä4øñ¾OÖÒÕ> ¶“Uo¨¡bbgŽÍØ)‡QµØ Òªû àDîêí`ÈaU·d„a^ÝVq™°¦oÿ×Ù ]~ˤ Po^‰×aiÂäŸÄ„&™Š'èó)¿ÈŸîÖ0…S(еR9­ºZ¸¯P?/ª™zø%MlíÀPàK¦s„·ÖbÚ¹P9ß·`è꫘ø2¿; ËfH†°7:ÍÿR{jšN“«ž´cáÀ ¼iëÖèÁoX×M >ƒ[è~L8Þnr¬þ˜à»•ÁCÞ»‹ ©€=7÷ß«)téq‚ŸÒ¿‹îÁÚQUBÑųûä·€Jz†¹é5Íq.ò Ü?÷½ûm;BWÅŠpôœ„Ń»“îú±o#&ÿa>äKEÉâ'ývÁC= ã¼\µf©Ixײ½²z˜YÕ[›#/V>¯,<¤µAÞáYz*¢‚)ÃûT0ó†˜^™E}kÌíuõ‚¹2¥ö3¶i½²/¼èJ4³»éeö€O>¨ø —ÜióæÓ‚oxÔ×m'½ù ¿²ó”FõF–pžÏɯdj; ½â;,-)‡Êôù/fQÚº`Ý–c¨¡Ê®Q[GæŒæyÁ­€Ä^²Ú9GFúùOóÄ«òϽD\у˜C枃PâÜ8‰Ù].Ë(Î,½¬ªç>úcŸÞö [UYȦ„§OšêÒlý8…Î[6¬ÌÛ 5$ËÙY {\òÉ ÀIs•HëvF®2,P~SºÄŸ‹© ž FÍtdG«k5#þÇ~~°åȃÊUQd"“|PÀåg{ü4E?|Wš ¦âÁ°u.PwNß].³ÿò !®*WÙé³Dn_ŠÜþÒ¶/{zÑÐÓ|ah[¿½ù¾6,5™Ä( ezk~gà×s[5`ïí¥9¬„’¦ÔÅb¨  ;k'gªµï̼$Aj¦â4胙ÙSfɬC5èö%Æ«uÑœíHÚØ‚¸ߎBN~?º–¯kb­Dn–(¡žÜuˆa×DÊÅ8þ öWð^ ²îÄæ`,EÌ(SEG7]+Qv(_„¡ÞÀñùÙšrP–†•{,Ý?ÆÔÚѰï§•Ó÷JVNžíÛh¼þÙˆ;KIv=*Zcƒ>a]Nè7çÏŒƒJç#ýé½½¿·Õxê“à’ψ TþÊ$¶a<Ö4-–ò„ž1A„5w¨]ž,Ú‡,^)?k?´ °o\)X/rÊIç.óãiønšP(…z"œ²•)_稩¿TôÂ;fÉò¦ SRÃâµ—’q¯Õ¿‹bŸ¼-o%{²E’î%ÕSê².ÕÅçLÖ2z.KQFˆÂîYWDyè ú¶ |2ài@SÎ⚢ýµ;‹íÈ\f LÕá|HEWëLùäí~ˆò6W£¤XèpÓB‘Ý_iT0@ŸªðnG£Påx}seÏG­@>s&R ²Xÿ†Øò ÂS3µIó±Kæ%!Øùx}ýƆÕÓ‹¯â¢Î5ÈI…¤@•ßÞÅiR^wʼYåÃ% ? šZ`ʇ䋷PvpóŽU>HqÜyþŸ»z§-ý„ÆnÜ–`O)‘6½Sº mv0zVRvºJßåôŠþ=Ó{_ý]L{^ö–6ùgçrͧ-1óZÍ1MÜÜ!; ã~–2Ô»ú¯Ÿ\\æ‹6=´ÜfÜh„ƒ…rˆ @@uáêmCèiŽ™pU¥]SüdÞl#!xT¼i$'>L½SAìBˆ¯_ÕØ‡å¸þÇ„#‰‘uçËvŒËgè7iŠú/–ª¬Oµ;-`ÊL!tÕmûñ Z§ çÜŠX ;5® ¾B¥ø=~pæ¿s;-lxBXséëyç˵bbÀ_Ùcwç¯s~O°Ÿü>‹6ó©©ÖКÿ(°~n´Ù És™V¼ÈåÇW‘«Wú¦övÏùʇ9ƒDëUKû˜¼fŠ;a3"3Ã4è ÓÎnuþ©JU¢Kf#cƒ²Ú]Iuy5Ý.KUGüÌ×_œÛIhµ]£&g±¸®p°Cð:±Bú·nCIË9íN”"þÂÌ0ÃOõÓIâÜÖæ&Y¼ç^-ºì}ÑЛ oE#jt ®¾B -iL`ÈÉÐå·LpVB:OYr–"Äk™=€¾¼ƒGÜdc¤QÑŠîò!.ŸñÔ'èyÎB°¼×=Û«‡€Ëg>®ý«LkMŽý {ö„ÂèÃᤦø¼. ^˃2²Òרº¼¢Èy5õ÷­•ꕈXQ¬fº"P#.¾gwœ¥Kƒˆt¼B‡©rL…Ü\m·­x²g°¹'ƒ¤ØY¾~NKBHálgL‰åéø­aÀÐÒ,pT§0½Z‹dÒË"þÉUJÆPø9%FÕ;»”çsV ú|›§ðvU›Ñ©¨3Æ‚ž³”³Ýß&x$;Gl¸YÂJá·a hÒK?*‘j<4™Kó¿‘÷m_ òMÐÁÊ:Ýu'$~t‚ÛßH§¹2¥ÜÉW’bª‚ ÔNj(™—ARÅQt­ô ~õ3.?A£ƒõƒì|Š~x™ºáq Àå]‡ÒçŽÞ‹VƒS mj¯ËºoXKƒÙ@`ö Ç»úÌý2y%†¯šÉs uÏu ‡þ—IÕ$:˜ógAbéTP±l?ý[°Œ:Ç;‚C¦=@òÕp­ ºKÉÞ¨ûžd?D‘pÑAÅÕ|3iÍ•Éó58‹³Q`6šüHÎbR²’îƒòHjÁsJTf¼·}/;Cáþ|ðsÙÑy¡;Õìøû\¬?Ðù=ÃêðÌÜf²Ï¯vè2‘Õ S9PR#îË,-­ço¡Z¤Ê«!Âj¬oOmôÂÆv`ÊÆZœSÌ»iÞ’jý¿þ¹ %©Ç¶W$*ç¶VñKŠ€h2¶ÙJ@Tž _nv<¸ý 0gRW®‘KËVÒ_Èr—sÏTäL\»€½—a7KöǺ§Cçj7è`̼VÌj¸š)jrs×­÷b>ðuX¨*É SH‰l·Ñ™• $’=*VÜÝÂ]ƒ µQ™=‚t¬Û”¢³X\ç|62QX;h]\”W‹²ŒvßìØ1;ûøc$ò ðóVœ)>Y®›®s‡3"åªx+ª)BÆžËÐT†å)V]í 7  Ák]¶º PÛxD!f¸Tc­ÜÑK¿çƒš„6ÉNzÆþ»¿.#±]©õ¥ ºêÄÈrVã.3ßîÒfžåÌ*Á%$Ug[Ǭ´±á8¬É‰fÕ¹äimöü—Y›M­`A§:E3ó ã>Ãc•Nìy}Þ,÷HâËáÕ€iù…&äÙTµ;ñ´Rˆ[õ¨–þ§ï m-ýu±Ò­û›TDÁ4®yõƒgWý\¤ƒ©É`âtéKžîË?`~Ž}ÙïqP«¯XJ—-²¢öbßiµqµàIÈ tvyÚ†KA™Ž‡ýr¯X]ýUPéh=](×à9“œ7csܤs Íe˜AÂ@À¥œÊl´xÖ耙üˆi°Â¿dé<ú?s»C!.ÌÈé¬ÑQÚœÔs5¶"ÂÖVÆK™ïŒ›Ë)WWZóúÝ‚ýƺ«øÇ?»9TöÔÚj.È$ŠÈr…ôhïϳ©^ÖÆÅ/–ó]àâÂÚSµ8ê9Ò-?éwDû° ~߯ÕFÁœ*Åù8>–z*-s:ºÙÓŽÿiªRýÄ<$~Z²Œd^ªí¢ÈËZ¢úú=‚[.4Ú’~ì58Én‰䟳Ç:1Ë­B±âFîÎAaM®(’§k¢ÎËøÊlsñW׊ã"ï_„n­/®xt4ã+ø³¯ì’[‘Ï ŒÄA->]}„Wê]WË)ö”ß’ˆÀ›b¹ò”Ku„º`Ô«±Gnôñ¡­¸9Fëßh™v½½ï„Ú¶=abt¯UÌÉïmÌTùFwÍì'NQlÍ™˜¾úèu³ÿI‹!b3\ò¥Ìƒ=ëo`zh_égߊtl0U½·A!ªÂõÙÔ®¼“H~ ¢BÁfU"…¸$OÇà´üt’Hs á´¬Z]Ôe±^®©Õ±û—ÚT<"1W¶½Ý¸+í<‡“ºó`è”xãXö¶ äÈsZvvŽ¡U=×>гøh7ü—j[b#Íl‘ž\ U¼l(z+ÝŽê)ŒO»¦¢l×aÙÇ):"²Tˆ0I±¨Îdµ<3J=-´écûªTµÐ¯%•UôLï9Î òJ4¼è'…çUÍ/6_ŒÂó´ñ·‚€’h‰1éï•jO¥ $4‹DŸé™ú.æ ýn2YÖ06Ð6"ó5^ªÛŒÇp£ Í›Àß@u.âÇ?Ø„L‚4ôãê¿Òg\7è[T…ZÊöeš:xi0fŸ&õ Ñ ¤ßºÑ¸ŽŒb‚˜ÌÞ¦(o"H\#F;G/ÙØ8ý[*´ƒ÷A¡Àw(×À –$|L`Š¡‡ú=$Ë–MÒМ¦•3Ÿ5¿øŸ0гš‘I•U¿iüÚcÌ QUSÆ\ÃÅVäC‰X‹ƒÈ¯†öæ_+‘ ˆo‹l#*ÃɹÅ5‚Èd°®áréeÔOšû÷戂Ž~%\ßV“»Ò”h­›£Ä«#ñ©Yž*ŽanTĦ*OjžpÌý.õìòJ–ˆé«ÀV4®MF|WT\Tn¹‰DZŠP ÈÈ+—ȇ£ÀrÔàóoÉfU(±U–oÅÊ·TÒÒ ¯ ¹r½˜!°\s•ŒÕ2½f0òP—V ÖM§·VÃôÛ#;ýlCkmïtÁQx"úCgõ•=˜w JHE3ǹ~ŽÿÁLHŽ7òA'Ð÷ ¤a45ùÖï*ê5ÀÞYó³l~®»Žƒ³‚i|½w)J c¾ÈE K‘3ð²x¬Ú ïdO#´RöéNŸ©X T'–àxnH¤·v8:¶à÷}u<`-¡Že®X[I£'ÒÆ^@ÀÏNa9PïIÙȈnÍ ƒ\¹MãÞÜ íגع®ÿh<¦ñ¶hßYŸ;yñ©·Cv΢4è£N÷ðâšÜë8jÁŸwßÜSqÀ•R‚/Ÿ3¦î;ʃÚ«i±‚ÄYîÄÐûr¡ä¾{ ÏßïVT²8ü‡â¤@Ξ6{V\ZÀ?¯F¡.©Ìêa°]>²än(„Iºù(5hÏ8WÙ ÇÓ󰸟ç-Z±h“Ráx0*¥ù«6²Jª™J­@/e¤’)uøÌ¤ÚBÑü£Y¶ó¿ mj®P{ÏNæ¼·ç÷Ÿò-™õ†onKbõüŒàÖ„™=µÆû]*/Òæ€ðë_×pmãßäÐìvwXåL¨´–FP]îXóä 3¤Ñ]ÇápÅ©²Í„g+ØM9‘½Îyö+³Õ}Xåâx@OÖ^dzë³|î»Ó§ó’ôŽT6ã®À4nÕYTÆ&4Ĉ`ÃY¦íKÁæëÝ{DŖÆ9ØÒag(~Ê,pXƒ /—&Wà¡ƒÎ’Ì œÐù§]Ýœ8Àuk¿lŽ{Opðˆx®ù’fzº©g~‰F"MÓøFè(j_Ö¦Ö–[ú9¤06ÕdÁÅe5?)M2–&*6ÒÌ[±lHš½Xq&‹ç¶ý.÷ÁÑ|À1{!ã­ž@M ÒÕ• ¥µ¨Ð€’ŒÚíf÷[ƒˆ Jv¶¼FpÌÀ䋚mXgÀKŒ»"—ø36_ôs¼8Ázù5Ë£PtÚ,É’ì¿J>ÈL® ñ¸³eWèóæ!¥Üö>9³f6q}ÏXè´œ³[}í)Òï–¨[»›%ã8>ÙøÇp6=2l~jëh¢|?0õT3ÿB§6ò¹)Ö$'…tËMÏ£ gò¯¥Ì-ï=ǧ3ùRĪ:Ê´PñæjE'Þ)ü¿@ºݤ™Uo$ÞÝD}Ëœgåß\«pò¶fÛGù׺æd‰ C17刜@˜ÆÀIUäñÐ \ŽÝ(]R“ÞÌí£lL ÉGbN*K2©d#W––ëæjÖëï‰$N±ªŒvÚ@›n'áÜšL¦C› 5:K–Óý’çK_‘æžÜŒ6±ãT+öH¤S¯_<#EGRý­¾©š%ÃìJºz¯ª)=Èjä`isl*›¾ÄOÌ+3 Ø€®Ê†ýÍNµ£‚JÞú“ &Ët£|¿ :þJEºcV¡™üBH¿C·§äÇjÊ6ÿP3„YyH…›ÛS¥ÚìÀþ§UìC³3»É|Á;+e¢ïLC6ê¸jwÓµôØB&¬Fåzù§y¾æ|ù} ªÆ;ì*Ÿ9Wy¨oLÀüHGŸµT§=€hÙKÆ(´ ÿÐjáÊž©ÀÑĈš?*n„¹’mYE9=2+X‘WR¾ïMjeLøF2½#¯%œý²‹w¾š†ÝöÆï!'–Ž¡ž ÈzQçÚÍžSÀ³ 'ã¼BÒž²}3Ò.óqí¹r–;R U¡:Öë`™ëP褄¯BNB&´,>Oì2ÆF?ÁÅŸ|ͧ€•~ßÙÂ’œ¾Âhsùbÿ]-2W‚ÏÆ¹Íì„­¤Ê‘ŒD.U* UôÚ—­ÑPÔ Ì‡\$hµá;a+gøI»Á„(=¶|Œ3JØlC&Ó€¤9S»L4Y•¹‰{qs&°‚KV8z¹%÷}Èþ™ÎÞ}ƒ«©]«¯ÇûZGÖu×Ê4âó·Ž¿¢+žkbË>%ôÄëz— £®è¬ä7µàê:×_q4‡wâˆV 7Èϯ'|'h2é½ö®˜N_h ¥QIŸHZþ)©¶!å”>un[OcæVì\Âþçk‘Œ(ÂÁ_5Ë5cXË•L¿)d&?5ÚŠŒ´Nóà°U.íí‹}øžcÁ]@<’QüνÓ*äõrv4oŸ…RUft¢Ñ¬/Ðæ¹ƒÜ)àÜÕÉÿ¡¢¥Ÿá1ýÞYÞ+ò õß"à‹„ Ÿ™³ ÀÁÃdY'éMâ0ó~eÌ3V|©Ñ•éÛFsó° e)OàŒ&C\é‹Ps`™ÞO¸??Ë CU´ÚQ8<Šá1FÃa´¨A\¿äWæŒÕOófiTÝõµ©ÌþYø[ÏŸ™ØTh[ Ñzµüós™'²Pâ&Bûß8ÎqMòð€h Ū­/Þ¶¢²fÄA8M|VÄ©’ìì ˆwÄÅÞÝwý´¸jÓÇë… ѽÀ0 õÅÞhy™·ÐÆØYÍ-÷ÀFÝ ´"-(÷ü¹‡«j䌿1}Šƒ'‰7Ʋc™óŸc Ô¦ÖrR)ÁNC6\7fT¬Dé o¾ýÔØ.Åu-=VÜrÏf°¾1U¸ØÃˆ14)FqÑé·gÌ ´•pjY³`ž S‹o…Æßá~aœW´W¢dô}xÀý0¿¦É Æ$Â")RˆþHÞ/:PHÃ3îkœ¬%‘"@ Ý&òŽÚÌŽ¤É½Þ&¥Õç«åöØ÷@@yû˜ 0NVS‘/…Qj;ã[>&éÅ.¹‹ŽkX†×­÷‘ì¬;ÑÕü3žCF·õAžg: Þ0ÔÁÑ+³_HéÄBdÊY¬&îx÷ÈÐ*À"¹ÈÄ óu›ïEgêÄßÁ7Pä,×o?ØÙòÔáÛZ{¶@>ï^·qïƒp—_Ä(S“27-±¥ä…kºærš®!—{òÚ¹8ÅÔ ÕôÜÅÎñ >6 ÂãsV"—rÍ"KGøøWG"ɦÊTÔ=ºSN½Ì2?Ë.±!x.+µM{Q&a}þfj{²7y¨¥ŒåâÉšõsež Û"ËÝ‘9‡hZâ7_ƒüîãŸßÖTMPáÄ;Ö¥¨íhRM€Ñi—}QõŠ2Ýœà¼óóÌþΪð‘Sø¯¹£~¸ø_.¬»ÈûW?ìîy¬´…³bY•õ#b°ôO抎•Û¼Ò=?ÆN§ë €•¸*K·Z¥*ÌSþܧyï6¤îþÈ=Òƒ*Çåçí/}àØ¸Xƒ{+Œ#6+‹'s´x@’Ø´<Õd ¡ÊŸ¯36’³5q&®йO¹µ1~À¤Ô:¸Ö¿n®HxĿЦ#‹åFÕ6 à~ƒ<0'm¾A ß&ñ—b"à£Õu+ßœú Q¼t Óf€lf 2®”ÊlhBʨDãJ¢ãö¸Ç³ f;¬òdX3%L˜øí¿'ß&#ù»z±$‘…låêQê so †\`á¨ÁÙ´úöÔAÏqœ1a SµŽ5Dx¸ý”/ª©{Ù&د]‹O»yf´‰àvq £Rµce¼ës6¹é…óz6ÉoÒÐ-‘[ëb¡9£ÐV1… 9sóYÉ\YÀ¤¯8ÇŒpd[™tr ÁÕ2°uüœ`/‚Ã%Š,Ü©NWeúóu2ϸpÇžϦKJ{£Ý¼÷p|²ƒbÆ”G tvÄfM]í/PY‘K¢æ.ëq ÐG»ø‚©^̰Ð°ÝØ:è´6ézª…;Þ9©Eµ©˜),Yãô*¿µ¬V«æål?;’–½…ßÇ¥ý¨Wsto¬¶-åßàŽ¯ü( e0·?ö½¡(nÍUèˆÛõʹtäa¹d 5V쯠¸é;B“W*œäôÖ¸ µ\ÅrÇ^H½+ÃÜJ¥Ò¦g„”…QnûÑ–<®å­ß{ãPCß?Þfâ¿ÄšÐ*’£EÕ•æ¬%¤þšœ ÁœæçÌ‘êÙ¹˜ªÁ¢ ƒbààÍéÑÀñW9Ö*Þ™Ý++AXöý˜„6¸ApÜL ~ùÙüm Á ™â s•<ƒ"Tsxœ¿nQU ÁÁ=Týò‹û‘)<2V ä>’‰òé1T03(¹>5p„Øý:ëúgF3T4ÍìÀÇRçø†ý•½óN*ØÌk1ó„¨öö¢¨G)Ýé\úpMAŒKv¯ÏmZœ– sÜ3Ø?Çî iösÉݘƒÖÆ3Z2ඇ¿!ä!Úõuƒ÷+‹O~®d)=?û¸§Æs'%ž5Ú@Ãcn—¥{#Œ,rýHÔ³§PáLS+÷çÊy#xŒö Nkf 'í_{¢™D©d–Á+XÓÖŽû`5˜‹ŽÀˆVª:h¯]Eå-tÇP6QÞî©^/ Õj³*¢r:†Zo‘–WËd“ƒôò ꊻ¹=UñdÖéòŽ åÒ"5ö÷Âÿgå©ò¡%®ö…<P#“ݲ…˜ß¾ð”n>T÷iê;ÛÂkùÛnœ¤Ý-³°<‹š‡”—/yóx*•õ°äb—êœj!¾ÿü/s> 2ˆ1MÒ&TðÚuôT¶¤©øxˆ¥úì9JÙ±UiOÜq­•™Ö®]<­ÄQ£lý癳½òŸ…„;biÎ|úÏS~³¢- TTƒQÿYÝ=¬ ë¹þç1† òo¹˜îrÂÄFÉÍ_cQ–¦\æ õèoj§ñÂíèî¡õ·‘TÞù3îôfê` ó8OúÔn’å˜O `qöóLݸ'K±^_™iêj!ÃòÎSŠš¯Žÿ†Ð£ûÿ¤VÀ´‹­{·ó8¤Ò@¢vžÏÔ3‹=ªJ1JÝò]¢¢Ÿ^=ÇÉ7;LÍŠòïÄ£¾:äulÂ‡Ó ?8{öÈhÉÝ&+íÝüHO]ÿJ¡¹4“%,XHu-ßòöò†±‘h…4¼cÔÄ‘þ5œ"oר¬Œš ÄuF´(QLÿ¹y¡Dàüž=‰º¨8hT» ë_°v¯†­Ö!€Åç | µÙ`G¡ë)‡¯ûà•–Ðd½ÜÀ öAcK‘Çñ±7&íj¬Õ3IwÂ>úïØ;*òŽèÿs,'áǦ‘ݰã ÿ}­…9÷5æ±ùÙ¥ Î<Mψ¿“¥>HÍr¼„ì•KßI 8¬_Ñs;+Y£PhàȬf'R¬ÍÌÆÂ æ¡ÑdRzà¢ÇYÒ †ÃÚI£€2êûÁ€E¨#»Cã. ãñÿê0dQÙ ÿþZîÛ{ä„ÉAs#k­?—UbX®ºä,¤"©ra/»GðßþAs°$«yÆ®»Ì@œ~YÔ]—~úœZ` ®W¬lP¦’3rªûI¾’²rÐhBöÛç{\£#íÃ:CQ_yG’ «¨ Ž Ù̵Xù>]ä](ž,ò9WÃí:p¿äꚯ*P“€ŒÆ¹ª [Ÿ@íHuë¹ß]Áw`L&ú4 zúB C^}hk]š™có™Ž(È/¡t+@“Z{"6Të)®©\ RÙÛnšw¹€÷¢¼Çt€· q"B™úw$nÒnv™ÁG(Ü‹ßÓêuþLÇÅsº){Jú›ßÕöÝÑV‚“!ò.¹õt&ó’Ù¼È8ö\d;6‚ÿò¸rÍ< ë ØàW€QÉd÷qœlþ/’²dŽwþm «úyÒÑZ¤\¼Ûñõ<·°°˜ÿ Ä iˆ4bßÂäÁõÆ¥²aÕ}5E¿8gÑ/cìª"E@{‹;–3)e²D;ÀôÌ/Äé9ðGÈÂ8t,{æá¬&/páz@g†¡aÃö´&úsxS›Õõ–áCQÔfÞô‘ÂZn<…ÉOHrÙ㔕ö‚Ès_§Èv‹á7E¼C²8óŒ¿{†Äáгê7ßÁ´¦¸«£ýaO©¹'÷MWþsÂzw‡WyúË-úU¶Þ¯Ãwý%|0ÿ[V¨ÝT‡Æ`€ªÇ¥“R_X»K»oÍfl“šþ0¥Œ¡¢ªˆ .v­Ë7K¤¬ŽA‘j†òGç•71XU¿(PéXt&StlÏhÎoMšJ}®±”u‚ìÂáâ:G½ŠSE- kn»±—\‘ô^ŸPü9KuìÚè¨ÁHˆØ¸Ãò>nó¾Y߉€[o;‹áÇÊ–FÂÕ„´û!9m¹0?C[zº›t 5Ir‘·7Gå7ö©9 80ÛîÀõ¢‰@ ôäq³pHôä£á ˲®Z°Õ_ïž¾0£#ÛÆàÄS°QŽcÈêB{Ý2±…½œ››©!¼RLx¿Õ¤˜û“]‚åc+Ûl SDY ²AÀ€4cmOKpuÚ w}šô«DNÄZ¹£±Òl=ÿ¨9©Ø°wQdp$ß9ý•o` a’Ñ(·à™I;•Y ¾Œ|pØá «¨T*|ÐϼôN,^Bý”D5Έ5§~iIX(Ãaæ,ŽbëÀKžåˆ©—ª© U*±ÒqÖ#ÍRI®À÷„f´Ú!g}xl2m½HS×YÊ(|sÞ¬’#"X¼Ó [ÛÚPX¾Í-”¥©mÂUêOø-DTìxãzž´ö‡ŽF`*½HyBc¿ýˆpÒ™-Ô Twû'Žúø¬<ÜlV°L¦Øè‡¶îVÊyëì@¤qÍjXÇ?3ü¶´šßyA|6€Ôo$BÁ²¸‰P^.éÅ;ƒônžs°÷òQžú-ä'ÁŠR€Ê/ ä›’ ©œ¬‚ˆGMâÑt‰y.,ŸlŸ™¿Y·!5“H`óþ.<Ѹ-Wêqq4K©ðÈ€– é¨Z™)ñïí&šëª¥„“@ B_ô×üišm˜&‘eÕCÕÀÝçánÇ«^èDáþe=%ÏQ°cÿ¥Y.ÎÉRgÔ–Rëìä%<8kMT}dVoÎÙ_å~!^K4'Ô)©nìa¥¥ “2v¬®éû©óòËy>÷évø[X&(“‹Ëfa ËØˆ± ^[DosWË›‹¢‚|g~¼€˜eÁˆ.¼ÿs}Ög9kzZs»}±YÀ}˜ˆÈ–c èBûFÞY:ÑWó@³ž B¦d…`$§ívOpšØg¥dÀ y]sèJAg„BN(ªû²(¬Ó9 •tçʾùýÅÝM‚ ÁEÒ(BÊýê.‹VÆéÝ^[ôÀ–èexÁ1¤CAc glµ~yµ†O¿†ÕD¦âû ˜tfÀíHªóNKµ¸Sû’¢Äû¦ðc{múŠ¿ÿºW¢8‘Ç–$Ûºš ¨ˆ71³™´-¶é›Xa÷°ò±×\)ÎjD£i™S…î+€² Ï}c¸R復94ú4 Ò/xtC«t}×)2-,bSÌMa–5™Ó#|–Ð.ßD.-‚ fßH"¼ËÚYúnxÝÒ»c¾˜6‹£ßaŽhòñ qÉ(LJÀ[Æ&ÚÔU¾æ òSêD8ÝÆ¤}ǰXw¦uQ?¹ô/Ó^Ø»æw]~¬ %ŽÈ6¤;¹Ê…²¢¢X}ð´³v¬©‘XeÝY=eÆQá¢ÐqÅü¢êFŘWeÜ8þñÖuî¤w6y.Káp_± QG1ÿ7>BE¥bP(ÊÙ ³á—U£‹e6€'¢(^U‚äW…sö» £æÖæ¯d ¥ù{”-P㥳j$X€ó½øµ¦m‹t‹Ç±£lCŒŸÄy˜ ?*ª7 Ûdoc/nuÊ U<¹Žxõ/ÎG›×V¢¹ïðFC Á–ˆh2TÕ)ø¿Ë$jý»g”|’š\î)m©Yh‰­Ì²pX<¥¢ü͸䭎^‚ ƒö„­TXF¢´N…¦}_×:ÀF™ž\‘Û1ÊLg‚‹z;µÀ-l27B>"MîµBü] cˆ—ꓸ¤¾óHê¨Lø–Í{´xÕã2IlÈ›á`P½#yׄŮéØ-Úàpn½É´‚ÅJŽâÛåûÿ-;z­mNzæxV”Xƒp6¹ßkË2>O@yø—ªøˆçMwÕÔ]"J™Ùsr¯®{@Û‚è…$¥Ã;°$k¹BË~,ûmÌßSâêtI&Ã)¾Ó5Râ¬ÈÑÞ&†çÇöNVf¿‰M²Àø†Â¦U¾ì1Òˆ£éJ7׈õO½îîýXà7a·]m»þónˆc[qº3€ójEs0Ë«¶ªÿ™gòâüx„êÑ‹â½:ëTÞ´<Á*ìÐyŽB¬¯o3¦x^Ñ^ù |™Æ¸e­Ÿë‚!?‰M4–Éð9z99ò”3ŽÏ.'i%Ë„+Ìò½$ ÕX¬É·QÚêâO9Þ§ K5^Iñ£‹Dkßzƒðå’ÿeVÇíüÛ÷ ¦% ížu.,Ó©è¿&›¨XH‰ ¥×§ ÷»aïäu!<΋!@Šc_Db؉zÖ vù7[²Q`㸋÷œJe.VvsƘ03&E˧»—øÏwD÷Ú¦ÖÜÊÒò°©Srj˜97%bo·hõâkŽ0îX6²JH-*P…ÏÒ üßöI¾3#ãµK*ÔÍä«u4òy¾=×H7<‚œ‡ãpº¤¢åa‘טþ`QXÂO–/ªüôb~ð*nõ5°øƒpO#×íÌ…ˆ±i_ÃÆõ.õTÁ8ׂŒÖH’2)Ùå¥iOÌÕA²d5aÇíê)™pœù¿¸F}¯Àö@lö‰ÊïÄ»ÂKÓ~â¿!žÌç”Fê€ø¿’X2¶%cj¶ÀåÆ)9çbŠÇKí}÷c#'krŠUØAþb•k©ØCeöt7 ÆÀÓ—ÂY¼ƒX«×üÍÿårËÙÄPÑFÅZ—”A.’Óüõ ï“ûÁý8)èÐX¯ÑaiL”WÒÒAzß_A’’èª~ 'Öø‡0"Ĭˆc TiÅà›DÊ`©QR# Écñ¾¼Ñ_׿p* Ôµ½ÿØðB ²àư {„25Ã3ÕÙü Xɲ,°ô·‰ª7Ô’ÙöЇÍDÇËR3¬‘äÅÂÂóÇ Öåã!½0º6¶t§Ì±Eΰv æzö¬ÐO€¦s‚ôÀ>5MFÌbæÂCB>‘M‚¥ã0ÐmǶøÚæÓ(9€h›;]ûjÅöüH-ôžè ÃiD3•ÆûøSqVA¦ \« ½7¦dM±í¿¸¯>=ñ”x@EøJ|ëòçË@›n{|@°Xaºt:4zæO[gƒ×²êð-ÏÂè·jà:+<ŒEôGƒg«Rì8«ÏUYNó¦Tå)’ÏúÎð—ñWÛåä:9œ®£ìùbáX$Æ0#1K–‚¬¨¸ÑuÞ?² =BB€†äa/”Ër¨ö¥¾2¦<̦Ç_úØ_øa÷ Ve&ÀªþÙêÇïï6Â3í»KÕô_úœçC&Vªšfp>?_Ê4WyÌEº›q êøJ+ÁÑÖƒ­´ï¡a’$Èj$Ø97üæ]ƒæ*Á¹B;r©žQ‡®BKwStlhªòEðzã¿J¨|7š*Uš9÷æz<²:I邹°Ï =×´½‚&ÏaÐŽ¾•Ÿ*Ëòw×0ÔC&E±÷ÎÔ*°«…õÁ496¢¦ã±0.a[’ÁŠ€Ðá[sÌ‚ …pú!eÓœy}O¼l÷/„oíÀ27B'—ðSgÂîî3mŠñ†eí ž™j¶¦¾r>È,0´f‰·c‘p*1Š%òՀŖÛHcË%³/ô@<&qøºCWSC0>*Ùç?ÁW¤uî¡J#jž”ÏN眙‹. "ÖïÌÌâ>ûnÿºañ³Éä¾1£«îÒ½a¬Y.ˆR $GÀ™ÀœsyÿÍðÿ Ú(è‚ÔÎþ¬å×éæ»ä@‰kPØG9)þ¿Ðu3LÌqŒ‚xH²œHb $ÚGDú(ÃÑOQ—UùŒ¸3B>a¶Í?úâ4-¬A{Ê® útê7<ˆP9ó9ÅH#ûНI…›b”~çý…„tª3ÃZh e]60ÔNjµ% À—˜ -0¦Åî÷¯¹ä©_eŒFŸ&qò’7cQ8žÙŸ0BOCªéã÷üzoöù)Ôy]Wo‡@— ;­ÁˆÊBFožÔCõ;á,Üì±8]ñëïÄ$F~°òZ¢ŽÅ‚¦í!ÚóW«;;Ä׺츘o“VTý¼±šÑ>%L Á»Ÿ»F“2úMeËÞŠs—&Ûî6ô7áÇ«cÝÈ(O m¬‹úªVKƒ’Ô ÊéÉx>æÂÔM+ÅðXTĸ‹“2Ç÷®?¥t®õÀ[}ãQôë‡6e½ØË2;,`ua€‚AÝYWéJ°-§Ÿ¿¬RS'§— bTJe5Ry)Ö«EÃyGÌÑUñ*- ߸$NhKCU´ÆíêžÑÕÓïWEétåqâÌ`ñhØ5)ÒÆž¯<º‚ì.†2ŽÑL8ÿ%K´1‡v%qs¨¼ ”ˆc1ìv8P…1àV¶ù*îªôû}o†Å‡Lˆ”>úWýÚ/a9‚ð \¼··›4Ôe»ö3œh¨móàÈr»…@å^c ø>{¾ZzŸ–eÀÓ³Öwp„Çt6÷±{Î ,¦XJ· y¼&Nµ-TôöÝ>œoU¥_®‡!ÇßSœÙÈ`n-v ½rFáòž®ËÎêïålÄŸ¸d~šîßò÷7 $Ê~¿÷©¹˜jfux%š8Ãh»Ç$ÑõÝu—uŽfˆêV ÌŒÎP] 2a\å¹Zè„CÑEwÝ| ¦Ñ_Päâ§j½ù÷¬õF Ò¿Xfa ßu£¾ijºÁª8ºq‚›sqO xk©¡”G]y·JÞ….ѲÔÁ^}=hö”ëŸuÚÔì¼0*›ìý®ÀlÊd¢;]]£j¸òêC ÒÃëÞ×Ç2åHu1WV9Ë¢0¬hÐ)ÖÓ9‰¥™\É0ïtY8<©µVU›©#p¯$©¤ùõ®ð.˽Ò+~ÕмýsZsqk•ó‚ãØÈRDR ÉÏ*}Þ]”Eø ‚2ÇPÿ4:CYÅ ˜pÍćÌŠXyKè45|÷‰nàïy—õ‡pºûîÚ!ÿ¼/bùŽqaŽ'†¶Þæ²N¹Ì”ãÝy%XÿrëÏ |yî^xR¸ã¶Ã¦¡ôöÅû÷UH‚Ôðtv³w®BDÐUw/þåSáýîI”x`Â6ò;#â#ðÊÐ['|r\GR³×è2+Ú¶Öép1ð?|ÏUä”îµ·X~fÄM-—æ øíïîGÖpôÜ“ŒX㦌ϩ;aeÛ^lAµ!fž@fœU €<èsižÇ‰V“%Cn;л’ 9ÑÕ<ç–X0W“¤’òÛÔÏ¡€Ø´CÏàÜ{Ê,þ '»#Lwíp9[“Ñ~ÆôOû※T%µ;yð6dìú7l¶÷ÂÞZêx¬Íí”Í||þuñ.ÝhTþ‰‰ƒ‰\ÈfãQ˪.¸bç° }YÞv<0ì+°J‡E^·ž¸¶9H´¸¸“/ó,›ª`$Ýh&GÌÀŒ7G ›RU.±ˆ\$B x”TÿÏÍ•z¤AöIÿL¾ãYÀˆ{–YNSØ;ÂzEÒlpîSrˆ…ÿÀýˆÚTZ€|Jó›!?0À`Tw1íWLšú£ÀšÑ(# Ÿ¬Un›\ õ„’sñœõ3ÄFºX’'¼°»“X&sŽ%“–çλ§ ­é_Ɔ”A‚]¦¼8s¿|éìÂWæ,v«å®ZAמ¸ bËHAWÌÛ xs±“y¾,D¨æ\ ìvRJn€Ø£F¼ò]Eׯ’w–ØL«úÙ ÒÁ k«@æÿH{Q!°ñ×$ëÏü]ßd˜‰Ðh ½i^w¼²aš|¸¡ ä5±/·{Ó¥'Ž™À‰kù2‹€Çàe°L{JjmŸý¸:…}½uÐ ’Þûþ£;üƒ|«fg¼‰#ûµ–õÓæ*¿‘P*­æt4=“-ð¹dR-Ú2žs ‚ Mï˜e¯Tó<ÞºÛ¯m&—5X–ˆ_%G]¥z–«Î¯rÅKÙsεvY^ÍÅàg@‹j´ŽšTI!vs žÜŸS/í;Õ`É-„|Èf Ïõ‰{zü+»[“d+'Fï2V7GŒ:éb¨p 6PÏ™¸‡X`c<¨hÈÁ·G Î1‹EÅZÒ±à¢ÂÂǨN¦Œ¢lÅ¥­ ¶Òó×ýàˆH«´EGÙñÁ¥7þÓ#YÛòåïQI÷©Ù¥` ¸w¾û1À¢‰-eÞ³Ý )®Úª‰‘ â˜À_x付‹N—uiOJ×Ü”9Þ¡6Ík õ8Î;ØWò[ÒÒôçøÐzÇæŸ!Ïþ¬‹*{ ªŸâ9úÿ.W×ÁµþeURddá¢Lâdù¥±ž\¬–gÖ–æ*Kì2×Xsz“-S Öÿhú0ÐO’Àe×s êPtímLäâ~+¾‚º_øNÝ íÈY Û*¢Þè¾`˯Uç×>É1V—ÍÕ9?z 힀CÚo„2ù ÝSãQgV†ð´vsYQ”@çš~ƒkwâõ²¨¥:]kÛ‘ŠŽo3–Ï¢)a\·Ì&W€ŽÙ÷ø¥LToZ³Ìö Sâ{ò¯³!‘o ±ïëc "—¤ÓX¥ß¢£ÐD„½îº_{MÕ’Ð.Ó[5ª‹°¦¨OÞ籸͙½hT/ëfEÑ"ZÆ?[ÌFr v…öºÑÐjxÝ5èߘ+†ïký^b‘G¿è[sŸ+;ø'}vÉ_*†üÕ6[>îÔèLõÒ>["Õ§+JhF)(‡Hm^Qü%ÜL–"ç´Çm칂Ôn‹Ô»É@t÷S¼Ýzb×ÈÓ ;þ¾°ž"%:¬ÕuµÐ”Õ[V‡g77øòA'ÞB¤Ï½Ê$‹ZâGQ‹ˆœA×g4Ù~0[1Û$¢ ì“Á\2EøäŠ%¶Šø®lz•™oiÌÞæl„DÖë_ïi{š‘¨+Ò+`’ZVz‹]S¦5) ,k°•O…Èy@‡`ûÅëKÐfß úô?xPˆ*xÝ>¦¾Gí?“d,G^!¼7kKD!2 Gü ÍÔýübºG-[3ýC_XôáïGÏ›†›tè'CàÝ´de#£Ð¡?”fw?¬º/!Uöefämc}馾Í)u‘¨÷Q¬À‘lìU„Þ©3I-‚-‚;YºKÀHß®„9M(pN+Á”¨ZXÆÊçaï/ntÊ£‡õÜ|ÞÐÑ€MI`‚?Ò΀ý3;CÔ¯ä·; ¸¦‚ëܪk¡ü¥»‹@[ac‰6Œâåá,ÊþS©üÙÁ^«\é9DqÅád‚Ú„þq¾ƒ0Ýz6°CLAÚ6ÐÓ·f»üGß}·h%ªóô¼b¶Oi®EœX?L¿ÃŒ¿åÈ}Á „¿ØÙ!Ù;iÚ“H™¤Ü–C!¾3ÆÄ-€Ì§e„°.Wx~Óóþ‹(2tuŠF•Cƒ„žÝy¬Æ#^„½%ƒ!ɱá”2H•Ëé ë¼’‰«?Dàáë¬6ìÓQ ªâܺú¼b‘¶¬ Íç ^»ü•|vx¶)óT§"©|Œ¶#;âh„\;:9ÿá¾±±fHÌ _ö‹Ú†2&IJÌÍžxxu S[YÍ~Áƒ<í Tž¡‚7f¼Ù›1hµë¡š}¢ßr3‰y™ý®‚ q$Ì{šLë)mZgâœcäÀ®E®ûëÌ ™ÿÕšôÞÖøÁ\£HêeøG|bp?¿œÕÎD`@òfnë»l¿d¨¨†};}Ø_MEÚ aIØìðnä3•C€}f̰Ÿ´ êÒ7íÞEÖ„m“ñ›Èå´ìò+¬Œœ¾Þ9‡ F¹à€`ˆg¢Ù¸ÿ#mÀÝB¿ÂØp‘Wªæ¡ ýŒneZ†RG@Óáy¯‰f‡4Z G,tòóáG3 ‘ü—I¥‚í@¤T¡²‹Š,¤ç`53’–£A8úe¢ãNb†ÉÎLâÌ)`éû§†Ü€¸>%iN.˜¬ÁÒ•COê€óUoWh—t3ÖgŠÒþ‘ }H$Ÿ:N¥RæðUN5 #„)7\E2 Êb&øÏ’Ïí¢ÞÊ^½¯¬éS#‹‹|÷û¤÷±•êq^çæÛíxȶÚmƒ0Ä/ü†É="ïÓFúƒ‚Ç9Uî÷à4d4‚ëâ‚cq‚‰£ai˜§›¬*E[¥P}é% A,âgR–" ~NÂx€ô£id”ã,Oüáy5M‘ß·È+¥ÝÙ §ÞPàbê‡öÒä Rù¬Õ­HÕW/'"Žý´ÙÅx½³XQw6ô€ß =ã[ W…=þ¯áF4M‹“°j ùT“›Õ8SëSPû)ßš,|Ã! ëÜÉI¦kéÔ'Rlg$èa›‰K¿õÚ“"¥çB³;éÌäo1ýøºÍ‰{`íÍç¡Clžë©º©ZîQ2Q€[ fõAiòf)%£×Q/XgÇ f„oÜ Ù0Ô˜7Õt 3À-´0dJìMÃÆ#\åÞóŽ“Mõ§›ÓU™ úðÙºGâ¡êÑb—ààd¨>_›£Je3c¾5 fW³E)/ä%¸÷í4u×»ÝZªÃ kŒaòöŸØaÇk¦ßqdè³v<8¢&0_à³ÍŸwZ:oNñ!éì^©›ß±¥@áÿ.aýòŸüCÌ’Š(<áÌ~ür¬:a(£ý£Îô×ĉ;‚U N!‘ Š|º*U}óqzm\Iž$^íJ¬Ž:5'r‹Šª®Ù=HI.¾ hгäwÚœ¤Z{o˜¢%f'‰ÊÃC1:6R¨[L¦ÙÊ %_-ÂË·~JÆØKs¥Ãë¸yT2V10ëöéäx;ѵE¿Îä¾ ð߯ ÝQ.ÉÖ»ßF“³•^Å»±ßÉê,0SrŪS¢3a[1qŠHÑs®UàkâEJOIŸ¡ÂG ‘뿚79H!öö"ŸíÆ!U ce`°Læ­‰Ÿ×¿¬í™>®µÛ¼5¸ÒÉÚÄ4\ü[ñ~h)0§%¾^Þß¾Q(VŒ¶B ‰µSVàî¨YrFìÄTŸ2J¬º@\uËÍïJ!À¼ãbbîÒÌÿà*žW)‡rûÔ§¥k§•Â/\Íý”üÏ‘½³3EÁ­FÇðM†wµöïÕáCC]‘yx‘wOmáÜ0ã9‡[¿jùo’sjS¥¨eNgÖ¼mþ*û¶|c¼kþXÖ8&C¬yh¢V+$ÇŸM+³›{ G¾zyy8Úhk¡ŠÛû¿&®/sö¼2Jrγ9¸0ž¤z}_C^œæ°6§Á¦iðÂ`óù({à¬/ïêw š|ÂMkÞoÌí Óh¿#k 1X`!ßï†ÎüG’µ1úÊ ·´ö©ˆÔIk®r>+±KÆ G¯±ARŽÊgt¡çŽìä ±˜—?Ô ¾÷” Y~McK*Çué=ÝÑ¥!ÂÍLøÈ~ôˆV ½ð {÷Ȭ¤\<Çp(®ì‹v"\Àpé÷–$çµÊâHÑüœ—#'8%È/|ÀôobŠ ñb¯»Mo\Amó(iñ𫥨Ò*Gt¤69ù$.ªÌna£íK ‰±T“°¦±F c²ŽØdû[uD‰óâ¶I„bÁ+ô¶1a¸]6%s2÷z8E…ºµ>S ÛeÎ{·wêÖ]3²g`hïäruÈ|¤˜ÚÎËK6DÞOøaºzŠÊ™Þ ”ÓÅ«5@ç)÷Ï$ˬ’BùõQ>“+]òXwÙ™RcýÙ}K£à N¸ð¾ ~!ØgY)FbÀV£þ8’Ó¾µJŠ·hzÂú0¦¨øÂúX`8>² F'…Œ[[9©ì„}¸OjZ7+5´€ˆËìßIFûJ‡_œ<‰ X­¾ ɰiuá¡)¿äXuyšˆ÷ú7ãA""Îpª¬ùPÙw+' ƒW0œ4!7ÝÄæ ©¼]ŽÄÊñÞ‹pOÀ©Fð#>­»@s;—Z=~b´ùæ1EÏv¨É •€üîÍíoä0q*¾•v·€ J.…APãdý™”Ù—w,[æ,Åi „~½âäÏx@ Lè«Q‡] óå‘»FÆ\ n)éºÅˆ-š —ø„aÕ‘õÞÕ«o|vß™´ª“N§ P T¨d_´u@›ŽµLàI^=V6!ì ºw;cl lÁ"µëv{·ºŒ>‰e°*¢¸>ê™ËF ƒ®º:¤qYòw"EB¯Í$·M!~ ²è+Múm«±¾¾jù†­æF¿4ýáXl„òÛQÖÛSð¿ÐïèáÆ‡>wXЏÂwÒ=‚c‰ K×ëÁª†ÜkíÝ>¢6“û’ÖmŠà¦v¡YVC"vn"–!‰´¥¤-=DþuY¦Á§L Š“Ã&çù vüZÈä~ƒ”Ç6Ñ‚sý+ D£• ò´•ósÇÉ6Z]˜#£&PFFƒó%ô¸NɃ9𨖈ŽV<^LF,ûP‚dræ­sµËðÊÆ:3ñƒ°ÔNpO¼\Lرý un>ôö MAå1ÊB—™&Çšà³Èfµñ=ž’ÆQ÷çÊÝæ#+±.ÇÜêëL^þÜ`¶n@, FÑçñ¨Å÷SèÇ4ɺ¶þåÑÊ1iE:Ó=ø°EÑDj³ñûÿ5̇3bØÝ¯’k ©,j"¦Ý¦²GýÖ‰` "ñ.…?ëev$y²h÷oM9òÕs8šTqD×Y³#“¬J‰¡´äL÷÷ÚæË\i!§ä ßY<Ž6­ûï†p ÍYßIá)_xñ"X#°·°^‡åY!$Îvº_ÌjùƒÙØc]y‰y¦puÂÔ¸¯Éd–>ä¸ÐÕ0Ô~&úŽù¤'Îí²|?7Eñ†1ÀÇùwPO¹ÆïÎU €bVóõ¸»¼.ºËÎ3ÝØ«ÌÂ#8p2FœÇº°—œ´úeÑ¨ÉæMgÊ5ÿ=ÃjeKØ,×¼+y‹œŠ« ²ÿ4Ø}€1¡eñ1¯Ñ¡eÌÅmª½‡6*(u+Op¤gÆZãlãˆûñ«È+gMèNÃ/Ù¯/®Ñ{@‡4îá FbÃÏñŠeIÉCê‰U6d){"º¢âŠÇÙ wKæ{[qød湈&„Mð{‚õ.Uó&z_jÏ œ4ƒµ‘ç¨bÑBXñÅÝÿMy™ržïŬ ëù~¡éˆï¦Å÷thôß2ˆNÏŽƒX=ÝMÞ =¿C`ÞY ÝâÂ æ ¯+jU/`í?ï?gær‡eåxÓq ‘«aš[| »mM´Û“ Àoozò£ð¤q\)Dÿ©ŸÝG4YGôÝ01–¶fæN :;q))˜cet§ÊMÃc½î@ ú\ú,A[ã d ƒÉlpcTXÄŠºTLlñ³N! âù\ä=×ÀË¿[¼Wë:š Ób º·S‡|xDLä«Gw¹ø¨n×3A0E¦nóŠ]AöNètcI˜˜£/"pL-Ä¢$Q–¯/¿y0><÷®þ‚*<Î8OFqÍõht›mSî~öÜR ±.Gü8^îDV“N+÷ê¥ÐùÄbf4›nyA¾²ÜðàÀì Ó‚m‚½Ì’jôNTíýQe<<̪¢Â,r—^Ÿ ³}2›úÁ>ük¼œ7ÔxŠl¯UÍ+ÒišÙÚ¦&Ê×Þ\N+¾\* 3ttcV¹ïÒ*;å’«$Ä&ÑàâjGª«Ã硲ZCÕZáŸbJ±¡åÍ¥ìO¼<å¡[@]×$£X­Rp‹2Ã3²,Øm‚,åã²âHŠz´„2Xð*þòHX9ÐàNé„5¤ì±ƒ•JeÉEC¾s=MS ”PjÖšŸÐÊeEª7´zßW23ëÝI<ìéPJÅå|P#]d ØxèŠ ¿* A…³2V=Xí´-Ú¶w”Ó]R#~¬¿F© ¡7,µç8z‡Ð yk‚æ‰ÿ¦8Õègዹ•FûQ Á8ÀЯAMãO’”«)¡ý7-K;å¨=(¨d·´a^ð‘ÑZR;–¾³·š‚üÇhGÃ9yo¬–Û&5÷V­V#Âí^ÉpÿˆÌœ,í f£Wk%5^e>b1wîB·šÈVØ<9£Ü‹ÙVI¾nåh …“|壨ü™?æ¯È'\êé'fl,ÅFK¾¥ ®ß,C©•|6l®¦«Jù1Ùí« @Ôz ¼=,ÓkÊ 5efŒ±QÁ-’vþÑôØË]’¢’©ÓuV0GÐÄå 6îþH=¯o£×g—ñ¥»8…dP_JæGo¹$Çñòò7Žéd°‹Þ©1å[®³xJó:åöwÕòVÃÍ6ÒÊRçJ€ fÑ£ÓŽÚöe ãÊvófÔþºÑ ÿÄq-ØoªÅ·ÚïÈ¿[Ò)afr޾ƒÚ·ÐÊíVxuê¯`~„«1ô÷Y?,>Y¾™jÛPs;K\ÍÒ±!bÊäÔF C=KBÈ«b?cª|éØ÷q~Á¶ò•Å<‡õ†e0`«ÞX¬%9`m¡^K%­«n¨õ ~çh95àüÊŠevJm¥Pü©¯½ËcÉη­a¸OEs¸´àq|£Íª­û4²´[£[¾)‰C¾I‚¥¡¼‡ \µ DåÃ…Nk˜Úoæ(ìœÛ™£–L—hX®b°uÉÝ'=­½ƒF`ÂÜ<ÈŒCúõwÙ\:¤uÎ×÷§x㯼rÙ8ŸÅÆ”H÷þfL‹t ŸxG‘ÍTÍÚŽ¦ç£rj^‘a"'^z1 …šì(\þ},Œÿ ±8ܵà_­¿R¤¤ùÛåH!V¢±›‡ÿëÕ~H­fX9Ü¡X±C3ßd)ÕÞH¸ôY bIÌx{™4]£K,L.¯åß·]Dü§T1ƒÌo9®H&' 2)ôŸi ÇïçÜS#&R/µÀãx=Wo+9ážÕ$pà…ˬOŸúÒYŒòø4Á Z<ÕBº®lŸ)x¥Îç¯=ì ž1Q?œÍ\˜B^¬¢ƒK•Š¡gAbð¥]×N™Šà Ñk¦MÑÂ’ óH4IEŽü¤{zT™šˆ‡ÛÁºÙ!ÍHÚFGí»]åi³7Ž£æ*vé¢ýé#lÿH‡Æ–`kÔ¤ùÕ{}aQw”“| `“& f‘>V±¯Õ¿yTÊõa6OY[Cÿ¾ãíŠÍm»§?,ÝÛ»túq´!¶R9Ý¢s6Vx9‘4¸Éh²ÉÀŠVø:RºZ{‘ÿ”„’ȼb©;UçU…Þ(WfázF'ãÅl¶–®“üèϧž„Á!ïd±×³õ.ðñ UŠ®žê)¹•«Á‹(aš±_¸ÎÁUm#¢é%æ8j©¥ÍðíT‚ÉC=Ö½‰4óÒþs"Hs0„14#®E;¸,…Ü}õ`ôú:õyŠóü‚~3ðVÒ¿;Iée†ð÷Á<æÎ”Šá¦Š×ù[”fsMþC‰Ýuøø,é¿s9bû;:ôÀ7‘Ãçz$[Ö£—ÐÓº~wœ:Hˆ¦öU­¦'‡(3ÇA{ @UúIvMÙÄ‘ôØ*‚Ð0mù\ÞpçáêF#EwØd=d–C*uù·äÒI¸|uâÓn¨‰¾Õã•9t^ƒ—÷¨¬ÿ*À'¸aÓÅÈØª¼B0ëãí@ƒ6:ž‚Áòîf¡(ö“°%‘¬£‚`Ç•*å\¶HP$=5¡£&û;-müôF DzYR­F^­b¨#’†ZƒdµOõf’¥_^„ïxßé]« ™ŠpùúÞ ü""táòqª0Ç?›ðn·€ƒ¤6ÅWO},Wð¶3Ö$3Á;`+ð/Õ¸ˆ û±/%Áù¬·ÄgªðX^Æ“o¢\½\E·ÓD]Ô£”ØË5õÀp1÷ÖZã4ƒ ,™2c}wØ:äj2¢uG]b>‰ÆÔë)ÖtŒ‰qh&ÄG®»p}PáyàèñÖ³°ƒÇúIe¾`&íø Åß,½b‘t%=LM5ü9O®$¢ò |ÊŸ§iÅâLÍ ªŸ–Œ1†!8n‹¥CsKamYqŠðÕñî>oÒ/#Ù†ºÓI;—"íÐBµ%Ëê¸D\$î4ŸÆê¦œrøñ(SÊ-M<=øž²)W‚þQûÐ^Fje©çìdÜ‹¹ô_b‹3^éùÈàf–ÂŽnÀ'ywD#€¹­ÐÆÜsßܘ)ª¡IƒÔ „?Yÿøã5o9§Q‹Qpˆ/™ç{q- aÍerø]‹rBPT°ëŽç!Ê$O%qy;¨[bµ³>„Œéõ£9Úò3˜3H$¨ZxÐõµ5Œ¨æÄ¼<Ÿ#i*,Èû§È"d'+­…úsp”À¾$Ü׺,È °ãËà«Îþ±¬æ•~ö‘Á · ià]~±©Ii]8”9—•è©‹eºS«‰jÁHJå tÝÒz7(ŸÿA—çíx-ÜÎOm˜´˜]lÅk„1±}a;}iåË{xO¬Ÿû¶icñá±tbÚˆï‹ ÷îHÆ¢²E — ybÿ¯Íëj"w3®"k a¯0გ5βD2–±+u˜S;¤l\†‚Áo[ï"D-2j8fÝKøö_eTh* ©ž£åTè+l'cÖÇÇÿœ½ÆZojÕ…ÝNÐÀ Pšêþ*!¶Ëì×Y²ž!½XoJ¡•ÏUäCy9׋!ógâºÄ²±¨U»‚(ðŠùÜÙe¸â¨¶ÉØó(Jñ†èøn†'Ï e·ˆÖ^AEÒW}·Z£¶ù‡ÛÇh3ß…{%n–{çÊgƒI=Ü©èÆ$™LŒñqìŒûéC§•–ª¤¹9G 3Ñï.žªFDÕ5’y•‡^ v4fZXŠ'zm]üi\ÐŒP8:ƹ„–J-n˜ÃZw°ÿˆX¼å_9ïP/É/¦ÐdzR²¿¨(;°k4 ¬šŸ2®WË5- yˆœ­z’Á á1ƒ_w¤9)‘ô¨Êø9„Û#ëChez‹}åÕUÑ;Ö†8“–ÌÁÏr€}^ÎN*ï?µgψ¬¾Ô‚¿„ügui‰@³Œ"»˜XkŸ¿°â–K£øó$½R*Ôà¨;½~vGEç$dEŽíÓ\¡lÚÈï)#Ô^Î}¡§>ÃÀ ®2Žy½—¯Î Ö«v5Ô¸¬~½è\ ;†¸@,,@u¬7K63 ¬$`+ÈLì©ÙËãûfd–,¸ÎZ¤/±ã n1¬Q<Þ¶´›¯ƒ5-…Gòñ ‘EâqxȆ¹q úƒL—<=9–âTWæ;û“ÍzóZÿèÒf&ÚLwJÔq„μ{GK½#?wg:§=©)itäõ´' /Ñ_êÔ.1øüÒ!Pär*FNB—OÖꎭvÓ GU {îñ;·ñÄN%Ìø¼ø iög%›ƒ1ûiiÿúù¨v¯`_Žåks:H $3³íL·7äÇ!_ñR[K´{jÁP†ÞV#ç6ÁGgQìÏûš©tJ"àôÛ¦­°ßîæ<¨g>ãWqaW ¨)+rͬ„¿^š–õÝ™CÆõø.ë1eç8E9QôÉQ¯Êq)š¤³S“¥‰³Ø[D[¨´º/‘äaž ¬œ€?l˜Ôù1HgÇÉ…Ì €“Þ.ÿ¹ýX’¿wÿòýTlÚ0ÚÄ«@ŽhÏ=G.«^ÃAð¼Â'pÜÆç«¾•£…à ?4Ëb8ªÂl®ÛDÉÃòˆÃ$áCç¢E()8AƼ²+öbpø I{‘(á‚õxG— † uÍ¢?ø8ç©Îâ”ìoõ 5ÙSвýŸI²çòmuÐêjWCì}°{Ðë"¢ûùdŸó´ý:IõïPG«õx,žŒ§_.®÷’rºTuW°¯1ò*çúóÉ ù±x]¾4‰¸yL€«†äÆà!ûŒ‡yúVÃSü!Öå[íß 'ÆÔØ~^0mFG‰©ˆ½l[‘˸!Â?£ßvû±ôÉ™û&ç¤ÐEê?Ú¾fg“ñŵþ[š‹¨p¦QØîÿnáÛÊY¸x‰…6Öw=uÒ‰QÇ·)ïЪu‰Œé žž5ºø<’¨Žqý­@f0vŠâ#QÚ¸«HlÔ ‡åÓn„Æ‹Ëì9²iðé4>Z— ¿Î4 ó;˜Øä⟑ŗˆP*ÆsæÆƒìÐÉ–•x]gVJý–°¸2 ùÄ„7B ÊðÑ/ç4 .r+-U;Ÿî0VÅ9(Dµhu¾l¿éÉß åŠäN™ä²Ëk,M/®x¹-QI6°ªÎ2¬­Itû2¬×®Áû僶¿Z¬)]–ë¼Ü°ãO!®è©·Æe@£æ&]@€1" YÔ>mÅ4xpÿPžMô0· Jìf¯Öh Kp¹‚9}ª…±0Ä(L¥ÿï\ÑUßæÈj–$h‡î·2‚÷Êyú‹–bÓn»T1üuaÏ.ŽÎ°·CÐfN à †.Æþ7Ô#ÕbO @œ6¦µk}g-—nµ·[—9`Å8£ŠíW׿Í…h$ÅÔpç­½A·¹bKÀ«3ÃÝ"©³6ôuƒ"Oç\ÙÆŽCc°Â»à—²1iØ/`±Iªp‘f -ß4¸ãcœàì¿ûØQ%N‹M°Ã6XÆZÀuôzãë‡ÓŸ²LE—)œU.½¿_A–W-°Y’É­J¢±÷²Ùê(.èÓ{~l¤e’ÿR•º¬J}Û@|ÕèÞ0§Rì;Gc(U®b§Á.{¦X©’_$-öŸ€ï™©—Øð¥aâP dS >W¿ðJ¡¡ µ Ì$EYIeŽŽp­=¯€ímr¬ŸÃÃî˜ã¢ýž±:Uƒq”þ°ÁE’eÚ`ê]Õlw ’œ\a}Æ3óÐ;Ø«Ëôq$\NÞ& éõxtÞVïÄ,Ú¸S+] ô^ÑåÐÔ÷^ŒS†5Ñàq2ÛÍpý »…ëÆGä F6‡ãºx½·í¸AЇy^6È´€‚Õ.\«ˆ]ïPe Ä2µ±e|µVLà°Õ b~»Û¼Û¬! «ÿ²~èWƒï&b%Øà©ÜEÍÏä—{ÌÇò[äKki'´*ÍŽÔ[°jÙ-gd0š€.g–ÛòÌÔ‡…®!ñÅ-›5.‹ŽŒî?“7aˆZê: ¼­ƒélÎX6è“‚äÁæú@<üÛ¤'õ3¸Pl–#_•ÅÞÕ#H^Çn€V· ;9hŠ‘>dl<©¿D*ÈHGƒ¼Ú ŠÞ'Ñέä¨ÝÀSKÀÌv“Ç?kaÅXƒ¼aþÔ°Bíp$VûJœ4c‰«g±(œwŽšF ÎúíM2ÏŸÒìSÏ dñ=2­ ¤îy§c‘Ë,1Nÿ¼×á€ú «ðœ]+l¡>X=vÑ®s`cùj§}iQ–ænÏY,xÓ ½‹VÜWm‚\Í ÝðKmKð´òL ªò+@(?šBàoïîzô¡ã-p²–|„YbYT.¼ç’AŠj ö©T0&³tœâ¡4[•×\ØøÈäàÔᾌê“p…7ù?¸"UÎÃ,­#tÐ÷ÉÏOáÕ ïŽ9©q‹«GÉò˜X~l ðö»+œž~£èᥱv¶òÌYj-¯,§Cv„úA/‡Mç-+¥X°¡¾Ú …b-üßÁèå·ƒÒ-îˆ.¹ùÔTÒ¸e AÂ`̺Cb¹þü Ñë¾ Yô™ÈtÓOôØ™è3Ó£‹ÏRAü ‘]'Bb‘zçïçQ l½–Žaíæ:œÞ¹Àgë§Ošé°t³[¾kºs£ìf ²½ˆÃµS&.Î+æeHNt€D§DMÝK›:NxÏ› Ç®ÔÝØ¶´ì¸DÔ{îš-XkÒ‡€ÀmE ôØcpø 7rUÃðà„a“€Èy¥Š®Ùòׇ5Ü3Š[¡” ‹¥ÝŒÙ„ñø…·Ì¼ìR§) þÒç½6]Ï•cçDÀ s™ÌDc4ˆÄ½Ô-Ö¦8÷Ï#ýÕ3¾;Æôu’Y—Þc½IjävŠŒž)·åî7ËTcªê*ö¯ ¶ÿ„ZÇ~¹«j}Zë`oà=©†Åvè$MVLŒËÐq’iZ‚r|ÌG×Ï›÷#CŠq³dN\®P Œš?zSpp6 ÞàýfÎÁ ìžâxóžLy.Eÿwž7ù!O!w°ŽcšnbB¤VäªêÎL¿Ø5ªy[¥áí–?FŽï9‹zcdl¨ì¯ÐFh{Sù«‚„«o”¢ò#š…€ˆå Ú8óðÒZÄd6kTP<ÛCåF©Ut¨Já6 ­JÉËDË¡¦f¢FK¦Ë$vÚg š ÅXÂUFÕ3)È'y‘ÖBñÅÿééÍ0¶,r¬KÖŒm—œkÀ2a¨¥‡ïÙõ\bÁ;pÓ×µ´ö{ªÝ/oz”b Þ| rÉYcô)}Âé É,Äùó4•Åxt.ülí¶¼øÓå:A6Š .†ÑŒÔ$M)R;K)w£Ñ„Tq©ENÀö=Î yÈ,ÉÚ¨@“‚€{÷l±ëõaø9õñ±ˆ3ÈtàgUÑÔÀF9å ø»ž~V,_t»ªKsjUS¿pÜi5>7YŠ3h–Ùk©|1„ñ øÁ)¼ÌQ¤O €5ù£ÔªŸ½¦!'2oYâç)…™  ô|Y«7§º€Rw]¥Ôa¦¾»nDÕ5…fEJ~7·¾N|v‚ç&m´ÂŠT/íß~WéâÁàÓ§×Ï7oï”çyEè?fÒæpêø§m²8\n..Víϧ¨ú“u9³÷8†Xò•#‘è)ç®ñ,œ¸½uŠó˜¨¹h½Qyñä£eº¬x½pŠJ£äJ5\Ö"BgÁ‹Tç«÷ç%£›”¦|FèEõæÃ}¢'m y \Z×qn/éäÞ‘²Ù7@˜Š¶žÇ}ǧèóÒ÷iIf]ôÔ }S•ù;«†jUvY]¡8™b@¯Úyš2-±ðùÔ†ĹäÃa‘€ŠN¹è(_"pÚ=Qw¿û…ý½„ÎeØû¡’'Ç*Š”wPKI:ú anß)–[4ðÒ£üJÄÔzçç –ë’ú¾ørÀ¢…kÝ §ŒÎÊÝ(׃¬HðïŒÛ{šA(tɽã41‡`)*<>…Ñ•ƒ@lLãk ÛË£t$rg%Ÿ–æV`€M¸)äØ÷”–·÷>™Ü÷Yc K",ª|xøžŒtùö#£H}šV¹UÂí4Án$BÞZ„‚h—Ã'ØûÑ:3)jeÆ*ˆïºãú˜í­ŸÞd=I¨¿Ô}ŒÄ…˜ñçå5ý×|œß„T¢ÜiÙ €FÆÙ.&Û}ÌÚÑ ØíVØþÚ³ŒŽI5”Œø½š†‡–wƒq5¹,¸„™éq§c/È@`”å^Öÿî™Mhì¼tü|]w6ÔÓ¼*¶]AAè,§ôƒtG—äeZáøTŠ„¡‰> 0cÿ-k-¯»û¬ôhp‹ù]º7Z’ðGªã(®¸¾é¦ü, džæ\yÝŸ½¾”@M–˜‰èU_€Ëc€Ò‡^ƒÊ•¡R'’±Ž‚ ÿvÎ |ƒª‡¾ÙNÈâIµ·\S¥»*@ÊB¶<ûåsO²Àè¢o…dÊ @}m= ”e¥'Ê…ÉãY0ј $õÇA0«i#ÖŽ_èTDj£¬#òú2‚Ÿ÷Ìž°J§Ž›yX?Ú ?dÚ ç©ÏfÄäY™ñ$~íwí®|{˜T›ƒömvfüË‚(90ãÒt#ÐY°6M£ ÄS#!Å?øé]E–/­‘=nQö…ÞÚJ24)¨é'_qÞ×'(±¤á4 qÀú¢*Ô4§*ÌW£JTÉ ½\bKO'.9tRä‹»ËOShùeT­“*À2yÙiƒ¨äaóàuuË_OPÌ%€ N»•›Mä´Ú\$âO¶ÑþH.!/“Ã{Óf¹}BkÔG]z§‡Öùi–[°{´9X—6­S@u¯sp®¸¦Rc{•îU÷"BLßrâÁ#®¼ríÚ ˆ¥Ë”©_*ëIØ*]=B;²gãñÂó(/,/f>'OÌÃíc©ûÕ8®'µ8.f3‘à”€$§qŒiý³Ÿ-žöDfJQž^þW7žæÑ`ÌÌIô=4÷NWïZâoAy8Ÿ4Þr¡ˆBD~£5~mvnÝ´ßô:¢* Ô—Ä[óé0oŒê Â$.ßù”øM÷,&‚÷Ž}š.W‰ZÀŸöUNnLÆVúÔ¿–^¡£œ%6J+ÃéS€Ó##.ÛðVik5ĦƒÖ#H”'°Ò`Òuº:7&Ü3±XS»°]8³^ðf×$À:wß5Üg?}¸ eu{‰¾¿L|Ð!MÌúš¿ÌN¨–çÝsS‹d ß'æ|%ÙÁËÙùgù+É¥ßYˆZÑ{bõ©í12ñº(îüjï–€KTÊSt̲˜¯¨þŠh†‹wv3÷ 1+ãLåwð¹ôîΣç<ã4Õ5+Ônm+ͤ›`{ö]QñzMÿ–1:Í&™·qH+×ÿö^ŒÜoX)šÜüÒ¢lJª±{šF&[6õ· ’qûà1[_À£Ñ8é5´6íˆO£vJ£~ŒSÿàŒ#Ñã¢VE/wcgu™mB€)ÅüY•Èö¸8?Ð7šýÏ´5-¦äãB@”/äfCx£î9TK=ª,eó‰> Š¹d,pd¶÷jõ</‡j—Œ¦Çc|·;G²—a€èµ#¨@Ë1Íô•7mêîÀ8ÑÛ£{ô ?ç¶§§æ´Xhuƒ@—¬ô€Á•êŠ;ÔÎìf®f…Õ;€ BØ¿B"}Tñ©ç#½sæv k¥3:{ÞJx¦Îåµ(i¯Ø9“& ©ŠÝ.Q[Æ3Þ7 ö,õ@ãc¯äž_;·×•ZÅnñ_VèVQuÆ€«õúA“êprΧ8Bz 6²©ª_ΚŽÒcKë´×Znšo-¶äxƒ ??Øf7ŽŒ‹ÖÓ¼­]]¬Øtö3!<gåÄÐA±Ç«4Lów•$1 ·;߇Q!kÜ]u(ì6ÃûlÒqâKaã–%™g½^s˜n]݉Tþj& ÀŠ jjñ*1œ¹Ôt*G`†Ñbï’Ê îÂE›yôF ´œ+AXÙl¥/.mwØ”K4®%GøeTEøCÌèË­ÅʺQ—àca–ö)™ ¿5m%öÃÆa˜–&š‰A÷…šÌÏ;t2üÌÄ´]]ÕÊ…Í .^—°•ÙQ ÓAè%,XÇnã’úòݺmå48"‰Ôrõ9þU* ò†±‚"¿ß÷ »a/)Áýhò ÒžŽ½¦µƒÀ!ÐvvI€ô_è}Íò8ôW¡‡Ù-NáȆ/|@ŠŒ,ÆÙLÑå]¥*è¾f!frµ 2h@Å1œ%+sÑ0ט‡í)•ḅƞP£Å© ’IÏûœãO÷× ºY8ÊñÉ[œ4 o×™$‘2nÚôJ}¾þŸG9#ä¢Z¾ W 5Ô¼4ÏÐ0ÔJ”>˜œsá´åÖ²-‚‹(›0Ëä2>Ñ,6FQt\Š«‰Ü¢=_¾ÔÖNŒoƒù³ÉM¾ú„Tº–ˆË8iÑÆW¯búßEiŸç¢lÐ̽$ÅvŠÅìušÍ ã»)“r>Ltˆy°SÔÏûû-Pç[GIï†/²üŽL¯K ǘßEx‡1Û ûXô´p¹”³<íÓÁ#‘Û\9ÛŠÄ/.q¶s:[²->ûKY[¡ÃImªc®›Qƒoeù< ÄL‰8) Ÿv$~žn¾¢F ùÏÓ´'ð«Ê!€Ç9,\{ªâ‚7q|ÄéG-(˜aîý̉]Ý·Ý›NH¾âAîÃ;íEçzœÆZÀÅ¡NA:ë¦yèÖ‰½ï¥Nû–bO”L½Â¡ ÅÆ:ß䙆®«åú¤Vó úØpÒÐ XÛÚ],tVœ³bUþ@QC‹$YmþÞ-Æ•¬í Ú¯£cmy°¥Ç) {:ä<€•S_Š‘ |GѸª´Iõ¥!<&®\ëð-*©‰ 5»yÂÉè(åA+z4¸‹OÐ¥Œ˜O6’$¨«: öǽS|`þÇ%ño°Iý|ÂY&Vòg BXV|˜ÝÖ‘ÓŠº~±‹õh (pÚl-)©Šýaá“(ÐŽ^RÒªú¸o›zi‚fœ]˜pk@(0ŽHçh¨†[° TâhXZ±\®µ C“ÉHùî½/L¦¢_H/À.ò‘:fšËQÑ“Á̺,=²±‹Œ!Õ•<ìØÌú‹¼žFåwLÛ ˜ácí‘B &@£ÁK\»Bö¶;$V¦¼Š9ÂTõPç»P¨óíF€ð•¢º”)y!®×„¤˜ý¡5ˆº#x×FË+dRôMÍc^¹™k§³Ú9èâg"×ûùñÜCb1}2¦OÕôc÷PWÍ‹ÖÁæ™’–ïò‘ß”1UÈ·p¤G7Z:6”Çši£Á²”YôO?{{_;…}E)Xâ£FIÛ>É'¶?[\ÝÜÖ¥¥V’Sþt’¸#Ôcò£)3ܘæt82€&qF\Xæ>ùjsÈ'yÐxæQ!4߇tùaµž]HÉ9[Ú»†V÷Œ’”< +”à'ņ:æç`ëûÊV“U“D Ø‹;/?ÌÈ'veîdCÍHî•ZmÚWÝ#Ì_ÑDgÈ …€ó`ó3´öq·÷¯ÝðWbV5Ñׯnqƒ>ô,>éÄó^Œ¿d#ШµLHÇ:Ã.iy»ô~5Znùá éûᘌ¼mÞä ê†"µ1­«æF)[xž‡1ÊÝFÀN7ÇK… ´a±2çµÎŒà,@,7!¨QMN$ò(Ôâi)ƒÓ´“¼çû½E)ò»:’æ$F”‘@û.ý+ßmQNdò"Ìò¿WYþ=øôSƒ5: ܶ®<×òÍ$樸ÉPºÿ3Ôu9Æ—;œ‰Ÿ­âáá;á1‡·ÿþ‘õ×öUôA6ø<Ï}ÏP¬½û/|õþ'jl@ áï7ù äÖŸg^û‰Ýft÷­$IC|‰.+RDû“¾hŠA!·OÑ}WJ‘9^rMÇ»Ž÷µšn™QúnI,ìó®Kq[èÊ`ïyÂî°8¢Ç¾Ó–é&{&‡VÐaœŒ¯þuPtñr;0ø·ùvóªhf¡½…®)²ØT¿V¢9àÏe*\uˆýæl(˜Ž²BÀY¥øÄØÜÝ:Ç]ñó@‚3— `‘4õ}•C¸gO|*˜ƒlÂ)^Ô6f?à1æ%dæ¨B ­:kÛ\ÿ'iñ›çµ©ZsÙÓ¾™C5»³nå*æŠ/Î) (09òL@¢v«^u«ïC‰å>|ñb>#º“òïÆìBà&ËPwÿÔÍ<Þoy?¨+Ë}¯YŒoôÑ·ˆɸ¢ÚCZO⇲µ7Ÿ(e<ˆ¸ûÓû*ìƒÝhý]fH‹ƒ'~q/?aŽd×ÇÄáû¯Y$Nhÿ÷k·ê\”ƒ’mŒŸ®áÂÒ4ZJ{éuDÜþ.i#Oµ%Ó ‹Í›³i¾ ÀÏ7ÙKט”¹Üÿ®›(2ý7½sb Á¶@ÞDv>2Ò3Ä”Íòù{ZŒuºbÇwË+>iµ9øÐ” '±EVd¯Ð©U#íGJì! ùá·&÷5Û˜ÓM²'}öY»£†@aû$‚1½ÿ«‹m)¹ŽºvnvsH„aáé8=Ø&G×rD$®i8ùÒ¯ÄS%öˆàÜä¯NE}÷E­8ï›à&.F×»ù²Kúš‚üðy' Ÿñß@ë8GJ†˜ˆÓ\žCGà¢$`F‹yîîË÷ñnV"%NEP‚ͬðÜâôÐV$FvV/bÀ °”9ß{˜ß¾T[™5MfŠXBAgÖÿ†DµLàÈW¤V”*±0®sRÞ6t• ÕÒ5HÞmО°ô|5êpWŒä( vÉiS…C¬èVÕ|Í;8¨~ñ°.dI4uçx-l@‡6b‘±ŒÃLÔ(s “ñ2dÑ=ÐZÛÂËÅ,`tc(gi[w—Êô§ê-§Ö›Y0à-C¯TE4F~FJ›Çü]ê)ßxF;gÛKËë¸É¤7+Ÿh¶šªÊ¡°æ"MNïš:6^{’0¬×ÿRñx ›Ã‡˜ãUá}q+^îå °AV›3 Hú¥IŽhN¨ü_<\Ú­µëͶGln†ô> RQ¨Ù(2ô¦!˜Ds®Î;£ÛS+ËIòˆ6YG€0B3ôQpb˜M¶°ÔÇÒîÛ‡ÖgËêIxS±"U¨‘Éc‡ ¼´ò2.1œ¹sÕ0?vÝR̬Ä:ùçLÜ÷o¬²®ÚV–àá ñ\Á´à™ËØp%*qU³*à±_ýáe6õ&øZO"â?'ÆHbÛ?°¢ð…“ÊHo ¤"{ŸÁ£Ó¶”=‚áˆC/Tµœ‰M92T15¢^N×Ý j­Y‚ú/IxæfU ‹ž>5çùðò;)~ëÙX£/3ÙƒÝZ¦]Tä:Cb”vÁ0gÁ؆mä«èa Y<¯µ(#? §|]™¬oÚYZé´M×<%CB-Ís¥1¬ã!] R.¡(r“†cp¢È²·wíSï[í0Ö]I—ÊQ]Ù_7JÎT¬6_»*q‹™ÉñCÛ;;¿l±Ô0ËseÕ±$ X0ɽї9´@@{ÝÝq¶æ–ýh˜ ЉßNy ì®´\ñ‹›OÇ1aIJ›¶ã@Ð~٠ʳcÛ8â†/QÕv˰u^ïïs.Ü(4P0‰Qº@ãúÒçnòÒcϦۂ“¤x¯XܼÊà¯uTi~7®žb¹ÓâÖå%4çÜÒ`dÐ=ú‡°¨‹Ëûw÷²¸„“BçŸåOC <¢ô°çÛ«°ë{'~s, ’ÀÔk|¹Ms_°Ý|W Ú‹10câ®FãÂÇw¯F»%áffÙôÇP£µå–¬/v—}»ñMn»„Ì£¯} kÄýiìý§EÊ= z¿@T,6iÃŽT _¿/£âjgå”do[²Í_ jý  w¦Ø¯(¤<ÕG‡ÄÜ€°àÚУ¢ C’·^…*HHQõ¨8Iº <‡AÊ.Þº³8ì­@¡RÓØK ¸Ã'mÍZˆ£ÒÀþeï#7‰Ðð‚R)£&ÜTŽw×y 9„ƒûYº˜ÙÃÓ’@nìûA³ÈŒ wë)U/ËÂp±Üv¹s*G$æägpÁžf·/ ¯&±Ø¯zÁtJeÔqÅÐŒ4^ŠÕÎYß^,u='uv’µZ%õÌô„ȪYŽŸÒM‰Å  tÙlF]$1¦aþ™Ñ¦Ÿ¢À íse]úQ]ßœ1'¬½±PÚâ°&_jš~ÈL;ˉÑ@l'êwËäk2ó“÷þþ4§092¢Ô¨ôÎdŸ½âáòðís…[=P»çÜIŸ"mÅh FbîR˜ÓÛˆ‘BÁ‚x|ÄÄ•ûlè àõ‹¼bö;PöïÄ·L‡¯‡ºŸb“ "#(¿U â<ÖU‹Û_úŒäË +IÖZó0_ …sÕL„õŸÖH€Ûˆ7ª•]Q[WÜæ$Ôî ðPØ0‚ë3²RàÄAÄ1¿–æK¿·a·™:öÞóŸû’`ý&þëgKŠ~þ•mp:uQê©î¼7Àܺ·D¹,ëȰY"UÊZÜÿâË=±Ìú¹j\ÏaÞrnŽ4‘Jb›fò £Æ¹Õ¡…fMŠ›<Ǹ€è𢶄›u¹¸FšlhZ®Ùœ â…Q£ù.Ð,§ÎÞÕ.cÛë«õÁË¡ #½°qî¬[ùïu«-¦ß z…I²Èj*WßÐqZòF¼ùÔëFÙ¡ÅT»4Žaóú…û’¤¬Ê Ò?„{ÉhmJE^'5àß©Ýp k9š…‘ÿNøTB&ÄYÇû 6âã$‚¬¼ËTϹ^žjYgø™yÐCÃFÈÞKÓ='ŒÇ›_%ªøÎB1å–l#5œÙàpÆ÷‘äåÞ7²™ŒÆ½EV‡§dE„|} ãˆoi°o •ëövvát¡P—Ém-Šl ym,OʨŸÄk’C^W¿Ç»Äê+X%*·s}ÛZ%MU™ Ï€ÄÞ˜xw¬M¬¨î«¼L{næQ‹1ÇÜÕd"Ãÿ®†úéí»t[»UÂR£>ÙÓPâ1Wû÷Å$Äšbº&-·è)é@·zæµÃ%:0:pɉ»ˆç Ï ï³mo«.1ýºð°ŽŸc·pwasaŠ”ýE¦ý²#5©<žœëàv¸¬‘÷,¸§}·mX ¤±¼îà˜¯STÓNö4à'yšü•ÞyÑȱõ¿7ED½ØdØÁ¡ÿ¯}®®?l41áÄOÐe¬Ïý–)#p̧t› ”ìå ÀtµFL–JÇw÷ÅÖµÜÇßÝW ‘壟Pv²MßÕß±ÛÆ`« Ú²Inuª¶R}.ý2Œ>Vö­§%xP›QEI¡§„;MRç}ì2` èN|ƒ”h–ÃAkƒ!¾LQ 4ŠýêïOXÃ)býYM¸÷k@V»{~‹ï'r?üÇ25ÑUû GµžÍI§×<"ú¶ò›°Ï>¾DÃ*| Œ­WŽ:=zZ,ÛLuJS”fæ+òc½ˆÑ3‡톺€bKay½A]ãêöZ©wñoqðÚÚ¥ )ÊOç–Éι ¡åmLá’Š_%➘‚÷ZãÃó×þÀBðq–~£·’Œ+FÆQöo”Óÿµc5»÷ ø´Šœ6Â%Õ¸'ù9Ë}‚B~Û¤:ýƒ¸þ„&ü“»çäè_ñßÖ£õ*³KhȰ+ò—Ö]Aj,(l´0#“2Pd$ªQy3~¨w”ÊéZĿڑIxa þ¯ä|‘ò9BK´„úÁÿî>juò.`mv>Þ® n•0iÄB¨,§cµñsûüÒ3mGs©šä7â–~=¨Ä÷9U“†Š&$CÑ;sRG¾öªÀ†Ÿ<|$ÉÜñYy"¶é§ºN{f Ù˽0Ù¾ÃÍT•ÈÀÇ ªqž“40'"‡qáò7›‚U—¥éµ4Å}tg‡ËÙν·Èt!Ÿ*^{yºpØÄ!Ÿ¼ú5:bTÇGH¯T´V *Õ–~Lß?WÊ$‡ôÕiûSb¢¼˜·ÐEU%î7„TœuhîgÎÁE ÎþqB î™#fɧ< Ÿb5ÂN±âëØCàë¤"„J7±j}KŠ8Á§Ø""È´Ð3 °™`Kùü¨ÅV(¾|EaTÃßE7ø¾Ùp¤Q1Y ƒª‹#¬b±´ } (pó»ï槪ÌäÇÍŸˆ ïZ•h“RŠ6ë\ ÙÏí>˜«a|¦uWÜÑ¥X«þMk¥†M7°Ÿg‚k2÷÷1 G 'lJž2Å.H˜^Ò µ¹õÕ"øÖU^uˆ]þ\àóYè'uNèLJ:Ä€NÄ¿’Ô hòRšéNGL@‰o«,‰Eþ–·ðgâ†Év}µdbÑÀàmDÅÚõ§¡¡ $Œ°NÆZ`½±«¿˜«ÜsaÛï!Ì^Íhs<^M*eD¶J£?ܤOºÑ‘¨ „D=ö4öÄÄÅß%§»=4Þ“;»KUfà”cF=±8í%·ÛÂ`>•rÂNÕ\m‰¨npj>7¤×I9‹M´àëŠw3!ðsê:jC)Íœ¨åCex> dð 8áK­5¯äÊôê7*YX%M CúŠš±ù³ÆMW/ýE°nÛ$;dfAˆUÎÈ­3tÎr¬³tóJóª>V­Ço¤¨UCÒ£W‰OåìϺNžÍà˜é%˜ì”øŠ¬•§á­0¼‰´[{¸™Ù7]S¦)­jƒ“#êv&PÜÔ›áè×ÒêGCe §~fâ •2m’Ú“H ÷àn¤æ \o[˜bÍÜ\ð4§êÙö£©ü3,{pÑp4Â> Øí8@×»B\jgJ0 Í;5¦H³@õÀß”ÆTÚ½W®m¡ j˜Ó=t(ž‘‘ùY€–¾–ÆiW€íÌŠ¸¼|"´4ˆFÕ©BÓÑ ¡ùeOM‡µ¬‚0‹?Ÿëƒ–( ªAIõ—|lt²µ¤&Ù«Œ7nç= XÚøìM³9ÌÌJ‹N‹  NT@¬ÇÏ· ¨vþú‰ê¨6:ÕÍJ^ø¼¦rhPÎðN]Õç°Ñ‘W¡SÇùá8‡ÿªûLjÙq,RÌl° öèä©>¶T²ŠwžóPTæò:ÏÄ*Ä/LðÀ4UéÈ¡ÖÈJà5ùŸ5´Z`žñ´ëf/g· \ìÙƒ1`úß«»ón˜èÂ(¿ˆ‰¾¨: ]Êç ¾Ž0PR5âlÉDj›ÑzÓ½õ9ˆeàé ¥$°±‚вD(ÃÞî8ØÁü[8Ÿï«P\y¯X%S£ýTÀÆîÒ-_äc‚F÷ ÒÔʘÏ|I÷kƒãCٕ䬽Óc1å•‘ˆIoTÓI¹`·Û»&@ñŸ¢62`úqF%RSûœZà- kÃzo˜„ı+¹EôX‹­ë,zé¢muªhNH$5?±\°ßú`Ãß‹0rEmÿ6 ¸¸DIÚ ­¾¹ ' €nwe… cªÒcúiœŽæÊYSJrŸy=MÆé§W,žœ`êJ PÔÆ2Š¥{²Z=Ï•¼?uåf`'>[kŠ2ÀfJiA`Ê­o”Ⱦõ@ÊÇòQ‡>¨ÁŒ.JAª³œ{2‡3m¹^ê6‰ÎYÉ5(„rÐBØí›{s¡&³€u?Mešˆ^ÊÃÿG„ f¬k4Êu³î`Ç_y^æ‚ãQ3Ú#é;¦{ àdÄõ+•¼ú»˜¼ Ùß²K%.²!À¬_@óHRS¬tˆ™ï1 ¡¾Y«ÕNŽ#‰I‹>F“*á³#æTçYÄ’K [}”ÑϯʳÅËÐeœ,Y´‰7îD3°¼Bg“øBJ>,÷îr>µQ~̳º,ŽlHÏÞÜÖœ6NêÊ!»å]6€A)ß\¨•c@vÓ1!cd ס(&§I ‚Ñén~Gžc§$¹Ñ¤N51IlÂbïYO.îÙï÷à”B ÓkC¸ëý§šÏþ7‚äIàId]ü/¶:®7B eW…î†kÅ{ã^õ¿_¥œ&ÌË¥ÃñÕbè¬ù—<³`ýp¸n"Èmˆ1Å:"Ü#}”šû~#­æ¢‘äúÇ9­†Í.”R"µrçfYT\Å. *?®TƒµoCÇZöfxÞïŒï^ûüÐꟽZ‹/¨1U Ìo¾'ÚXƒéÔykp¦h“•§$º9:oÂ4üžJa Fmuåë5 ï)½Œ8Ò­¶H=ê/ú°VftSäsú\”qßcjþ¹òZt k[—Ll²qÊ¢Œßº7íü|¼y0f–1ß*ŠOápÊÜyß8f×ÏdzÏÒ4_aîßµb}R=[â¡=ÿ§ z‡Jæ¨JF5pÏå¿xK®éɯzIµ—@Fz{ªÖ21Œâ–æ!'aøÑˆcÑ.PBÄÄø<–±·­—÷ý©N½ÌÛÂD Þ (q^œ5N&Χ –dÁ,Vû%VÊðê­èå/%ÎæîN" žÎî ¸x¤1íŠ «_’Ý~Ýyƒ’Ÿ‚&”ìÆ& ¢u¸y:4þLj:’û ;¸Œ꬯‰…7É‘“¿ÚÂWäÉ:Î?†÷š]ÅÔs"£ôWPjxlòÈ{£6ˆ§]¢7RäH˜HÂwîIdÃW’Ç.¢‘™_ƒo/@¢øŠG¬1;“º=~ºF––©-m­±#úÖÔY (÷©ÇN( WéA%’oç¦òø±÷,Ì‚ýÿoS N“Sï½nÃv;@)rä`ÿM­§V«‹­Ž_A.á¶}?â£L¬’•AAšN‰Ã)©›Zº|tP.ã$ÚfO¬)CªE§zá"¦@qæMÐMaù}6GføRåþ[ÿîq‰M²&د ÔxYÐV‡"!¤™J|»Ë†$¥¢¾ï{œJÌ;Wî–U³¤ ;rŒ£A4s¼$p`1i6df5†k®o‹ïâds« X¬m"Ñ7, ÌCWÔ:¡ÇM°¨ â8ºÃTã…tnì¯`w L£9l¶¶@°ìÓD²/^)œn”Áþ,Z´çp«±x ï¦c®rÁ<ž%œ`\íáÈi9:‘mžÆhOá#Æ38É6,üOãn!È„³;}>ƒXb£hÒ‰û0¹bLQ‡Hj“êCf0=¢7²‘ý/ej¬ðž©¼ã¤jˆHˆŠP|_¥p‰!/[×G4bÓÇá†lKÙÏ@R³Ü¶/JÖ¬Ìj£8~XPYŠêýæüÞA^úhõ}•ƒ¯e‰ßRgiæ="Ò cë¿y?³iÒ¤N%ø ³ Â]>ñn0Ü%¶K]£Ú#=—zQZ™NìÏÞ.üªªøùò¹ô$æp«J"N3x\œb×—¯DÓ¾õjµ[\äy %rSçצ­ƒJëôïÌc hñã;šûUb)$õèJ¨½‹\^TÙè³ûÛwRX0ý!WƒZ1¸úE˜nùáý€;wí/»Ï«¿^_ÆÕ¹: ‘4·zñðB)âcH£{³Þt¶ëúêÏ­D™9¤¸ÆsM7ö³Ø-Néïœ'‡ˆâ¥TûÔ[Í«“e¥ï³ Vú¢EN7‹Up~G'Ü–JßÙ¯m3„ÖOÝ-ÛþpûÁ(ò¼²¶–zΕ¥ ýˆQ4©‘q+sr0‘ o^Šgt•–nT97æiÙ ´Ýñ›¾$ ƒ25µÈ¾‚¸3Ä4¯µÈXI*Ç¢\î|Á¦ßPÝÂB´Z ~Øê/ÓCQ¨©NSÝØh.2™¢¼éÊ8±ë¡àmb`~& á""qˆÍ‚÷q›œŒ¨é-)ït”D¾D®~íÛb3fÇ3S½Ú;ýQRI¥’ÎŽ«÷WðhÒqkÇ?^ªò*BP3|¢CÎ9\¶{{ÖzR’rX@ O¹×u âŽ,óéÁKg2|IÑžýÚk‹P:‡l ÕnÚÖMƒü£2´ï-q‰UgC+Ô†£¾_óùyoã${p<ÆÙœ Db~:åP˜Fh„PÝç¤cÑ…îwýƒ¯K³(^§£ ¬ôè²½Š ?‹x9ý}ˆ8j] •ñ=Ø(¶=dXÀ¥m*÷Ão˲½‚‚›âk9f Gnã«‚)¦ç™ÌëfΣ[þnÛwfI 12q¨·­‹?Óýß.¯Ø a£ ¹òô]ø½RÍüô»”w„È,½ˆ}G¥ ßáÈñ9ôYc bÜÌ ¸7Ê:ÿ|¶ )cKЋÔŠD[Gã% }¸LÚ2t¡›5òs€ð˜ï}˺ëé O…&_¹Q &º™òñɘl¨,Y6cØÔôޮЍN¸tm›Lóæ±;-lôI%òVZYsäw¯ÿÅ49ù?^¢}…j:6)ôtH)IòYØêšª¨Pð±YTûÚJHHWáúþÛm³cÃÆCÆ9AGW#1Ž›5JõZ+Æñ$é‚–Ò¯ ¥_­ÕBaÿÛ­š½»»OO¬QÎm æ †vø¼™D€»—¡÷™É—(šN²Ø·f:Ã;Èk¹o.û#F5< §]YXúè&Üà´ßlj=AÍs0”NjãQAP$wüø©ñ,•s ~%‚¢Í¤P_4·2¿|Α4:w¹Õµ8¢XÒf?ãí¥ÀȨ+•«Z±$f)ó + ¦Õ1ÐvÆRü•6½0s™õÊBDnàDSœ0d÷Ö¾ŠG*š†ùl|ÈÛ[„-jö‰[ׇ€v{) B©ücòa…UòÌLuÉk e»§—tƒzVƒ¯1*fÞ^¹G³*èJÍC䟸µkvQj¿úµ ¾SØB„@‚Äj€væ’rj^꤆ŸÔ2|xœ;\oà[KÜq)²i…çK9eÎJü@¹þ¦­6ÿ¾÷IC·1þŽêо0)_“BA\+¿ÙÑ¢DJAoŽ5z>^eoúÄÞØú:á>)XD½R­¸A!W\«¸£è¤7sê-NX# êÞ¯JÝêÀ¨ñ€­ôÖú«¦äëØÊΗƒ1JíçÌo/½­¹Ø1äÖ¯]¿<²*C(9'_Hæ“ÁŒK [Ù…­y§ä GÖ¢‚eÄ%Fš¿”Ì£!üx]ÖBí\ìµeêj´à`+å#_ü¨á>ÈîàžXVg„8û椔Tnm9çþá@;ü%”(ò*«£ –Ѹf5}îg5ãR>cŒ¹ ûWɦÛû`Žý(@£Ï¡ÕçÒ¸†Åç_ЛÝ2;B»33%"~ÍÍX\ã´5¢Ÿ!@;úÀªxW qkð‡Ÿ5*¹„ƒ;Eac5ÐI4xŸ“™Uëìg ¯2.€ï‘ÉlÌ{¿ÕY„ØÔüã)ÒeUÜîI‚{«P‡m²ðˆÂ7Á7õ—¤".ädiyÜø¾:ÉKÜݺò-Ã9gx,¶à©‘2¬À-0+ã|âP\o Ò¤N$:È(üˆfèá«AÈù1¥ÉÜR] Ëкva/æÚÌ"ƒ5²{nZfïéÛ1ÝÌAÈÄšìÝoRäÜÏÆ½¢'ÙÙŠ\MËx¤–¥l–í>ž%E)™ÔŸmn…\ª:œBä‹êÒ ô\¿ŠÏ:Ù Å]É'ˆÓ;t"oF4CÔErù|˜hµãÂËYÙê´ŸÍ2WEäÌœÂßJ>ÕØÄwÐMÅò!2¦£[–ŠWúÉÆpVÒÛE¶PŠ n@„5<¿ÊN^ £¨3q€+ƒU\ÅEâ3nËÅüFÖÓá…'À¹¬€ÆõPùŸ>ÇB؆áRíÊDô¡¹aÒ… ”ùJL•©›mºL(Er‰÷ÄM-XÈ–JÝzÉ?EH8àT˜ÇH¿V?*¢OdÁ·Þ«Ôv؈ûÁ~QËÉZ5kÐñNÛù+&¨ æCÁ“ƒ3û_|b_‰û_yS*G'p2™ãöЦÝXÝ&ñŽÎžÓTS/­ ÉýQão]r|ý˜ÿrçð@ú•k2}ƒ¥ž®Ø¥¼î;KcC)ñ";ÞCaNW“£þÝŸŸ„=© Ásäo7\‘¾›G†ŽD´úD%P’ÆŽs¦Á3惼ã:Uå’ÅÒWÏ|é®´‹9´ðŸÒkä;* <;åÃçgúpÜ…÷7XnÕÌ´³¡€r‘ã)pÏŽokÚçŒX»”rJÚ‰&¤à°°Ô­ÃUfmÔÀ› /ÆÎ¦Ñ4­ýpúæld*LÖ],ÿ€ŽA†ªc¥˜>Á­i(¹·€…Í`¶OQ6ÅPYMãFÓÚ]:»_Rf#†‹¶³ºW–Ø×/ŽuÃbáÍÜq‡µ}-z:B5/¢-AK«²ä©ÙEÉ7ÑùT?Åâó]AÜŸ;?²Þ;ˆS´$,|@XÐgÝ¥j ‹ø I0ÖcÁÉ*åg°oÒiíb¼áïéXÕ‰ $­™$éwo” Ê/mûñ W6=Ðsqž—ލ:³Ñ'i’Øùv†>ãKôûÔ­»ýÏ_ÅÀ á<è àHÜö¹˜E™q¨ãüü+u¡rj)sszʾéÏ»KöÆQ¡oq6ñCâþ `TËÝ¥ÄXÁþnfñ_:()8¶W]Eú‘H†ìM<Ϊ£ˆ2>}ÈÚ£„ÏÕT_2M¶ä4ÔG´…‰P]ž–ñŸ[™ck¨xW©æ6zV'è䩬ÏiÖSÆú0]#x·“èëFcìšÊä DÛó*ŽÀqÍ¿­êTýÇ1)9³N’³ØRÓÚÈØoí0¾ΛTDZ]‚5ð5ŸþÒÏÈç)UΗê65Ã=$­(¦˜Œ—±¿k~z—δ· þŸàñ!?ÜiAR¦¿ =Ͻÿ ²¢è§³ú—Ý›¥ ”ºÃû;elYÔÏÆVºÝ®¬]6åä+/"ØÍ¤øŽB|«(Ì~ÓT-”èĈd½ Cz2>õøÆëJöŽ÷Q_—ɅݾÂD„àñü[>‚¶µ¦Ó™ã¸xýU³ßGû²¨šb ­’pÇœ5i¶òîéu¤¤§ ÀÚRr,hU"(hަ¤6ISÓ•)Îr?ü7äÎiÞ©øN†¦ÿt þsÞ.‚ 2”¾=‚§&_-ÖêÖû\>õ‚»ä˜ØÂF.V¡ëšäÄáÐ\¹Þá-‰ Äw&=R¬ d 'îG©ŠucµêüUQ¦U^ªgŠfêÈ­º ú`†9íä#z Ù$}#¹àn5~öN³¼yœÑéÖ ÞOØ+üéNÒí›;›ÎÒ–g§¦P5þ~É”Älàp»ÿ/ýšì´]‰Ât–n`û¨o6†Ç EŒ¾ì3¼|oÃŽ]Mï„w6$K‹ñÙüÿʹpš}æèAñõuçjo¤,¡:Ù\¹,F±Ê€Ïû~dÀOSwt'õK×zs»–€$(Ö¹ mq¯ú—C˜³Tǵy%âi0C *» šde‰”×K¨ä/’º¿onÈp„Ì8VÎ:°Ô:oèxÇ>z•;õ¢U+VÎÈ8m¼€‹ð[ÀµKÙ•y„eÓ‡™¾ 2`!Çé·N ¨PG&Á”*QÙÉÌ42ܨ^’\¼„mSÑćÞKk¼q€š¼¨~söp&ÈÒ7ã×Î…þã¯1£q­ú‘Bcè)¸—°IN½ƒè<ÓôN¼†ZíÛËR­ r àTºõØ6Œo[ã凫 Ï¢"–»sÍ®*Dý è¸KŸ\ü†ØMíZÂø:è,aþ¤~›l0o&½ÉP±âæ(‚p,?ÓÓÿì  [Ÿª¶žT£€öÎ=âgÁ!4 ÿ>÷†|Ê {м|Tª¹ÝïÌqJé™Éÿ¸ßâ” {ÎWÂ8DÓ…lÎ%¥&­вÁR7,ØÊØ?{Ì+’¨ãÛeyªE£y_Ód $óÊæ¶AFµqÂxÝÙ€ûgâ4CLŽÎÍ¿7U„½,[…*ׯ6B@:ë…5r=¤‘óà\¼;4ïÔl|ïzÙÇüï°Gš²/%sfÞ&æhŒHŸ¼«ÕŒe‹ÝQ§Ìú õ¼RºyžÌâEDQ•]¼ò.â™ þ{±k3Ë%1£)a<©Ä]_Ä?ŠX¦Î<}ZØóxr{ÈרƒíÛðŽuòåN?üðdÇ+ »;EÎèÛìŠÚí7.#VÂþæ\üÒùÂû*ÊÛµV6É|ãÂ_"\ˆÌå Ú-¬ÞË«"3Guf^`/þ^e\ÆÔªA|ÒH¾tŠ,pX¸ø°+çsOÜ7Õ ¥­¬ó÷.÷xøqncĦœ¤k äp#«P#£_¸?ô˜^[?Ü:3mVòï¬|BÐ'/Qjôg\ˆl[1ŠÒSÚÔ°2¯«­¾;Ra7“ä—££>þ}€ïîîUŒkÓñü¼~Àx¶ë¿5*Xý%€úþ(Ïœ‰—õU´Ýî_i¥¾ó¯lÜÉR>¿9ÿ²¾ÉåèÉÀë–q–y Ý:B>7 ní>«4‹–ÝÍ–ÅZ’Åë¯Ñ’FÒ¸©RäÝN:虂¸P±Ï’ÿÜÚ4¥=õ]MV>p]hö…a_]¥JñØö²a¹hc¶zÅ•¯*^õ€º+ŽdB G%èš»=È•Ï%Áð6ž攈hLc²j”‘ñ%Òž3AÑÚù?6Èмrnïõ…µì ™¿è—FËͲ’ã6ü¹ ϰȴqÿˆæ&?öšúæ û¯Ã<2ÐÒ¾QJH% e ìkEðÈþ 1ß-æ:”§N`øvðpns+zb®¨MR¬gýûÙŽ^ÆAÅñŽYì¥hV$ ”‹ŽŸp"a®iËüãkë Ju$»‡œ“}n4œÙõöT÷M5c‹àÕŸ(÷ ¨ûaÍ!0â¸!ÅúL«“„^[0#W¡àÓ¹é@ÛWx#9üoç ñæÌØ=Cn×Õp.‚¥ê}j0S:¿_\Ý_ù|ÚØØF²ôîM}°và{ý\¢Ea`ùËãëøp›ø~Ø#nd„Ñý0Ëþ¼cб¾kv[” r®›2;#ßr°¯ ´†þ]èÑ›_qÇ“õ2ÑÑÄ–ãŽ]»>ªôU‡,Â3cù€ê×£šcx½š[¦o‡sÁÙ)2E0¹ZÊæpcgë¾-bRó =Ô#jüz.øT5!qØctï½~û¸JS=´%þ—)Ê/jCg5ûׯip5¼“ǘ„/´ñ"|Ç€ÈGq&K¦ýž€¡B£]ak¼•ªw•Ë´z:•FSÝÍîŽ&~½E³¼ùžVÇ驈\~LL›¶¦ÕVÁPÚt7è{½zÞ[ÉN'ºO-'-Ëè+¼°ËÝÌKM$¥¼ƒ„†Œ® æ\Éô·Z;؈¹'‘“:Té :´ß»ÐÏ…£aÍ(d‘½L ?w²p|Ö<“±{éü+à vÀH%ÁŽVÕs üÄ[K|]Q2{¢gDúÛg;Ý¢¿P(g±z”*ááN%Æöªúe8E €ìYŒõ3è_„'j°ÞEܘªw•9¡ê¨´wß?Y^ØZ¤½]õÌ[kH0 6=²à¦‚îÁÃܵч)V¯³­~ŸY%) Å¿Om-lØgеrŠÎ„pB1·(°<Ñf‡¶ølÁѪo­Y!¯Â8o³a×»kmFDྀaÙ%àü„õM'_SwÍwFáò BÔ±ÑÍøó]èúà)¦ƒ[E›´+_öHÓH¥<ô_v¤¹-§ù=Öè+m;ð]”#C}€ö[Ë’`°RàêÙ®%ØÈÍS]7Òå=pâè> 3&†Å ?@•äø•ßéÝ¥C°[XlÉ;È—ý:å—àbR­«–ÒªívߘrÏùæ½Pþ’Ê žÆÐ൤TQ 7 ŽêX±zZ覲s9€ù Ƹj–§±Ì‡:¸ úí°Ûî ¹^HÏØÏùó‘ášêwb©~bW»©¼>µ$X5òÙ³5å¯9™†×[à¦>q…^ÄÔŒÅê)èBóýÜÉu nY婱ÂQz"=8ʨãßT-ðzËUÈû@oïŒ5Dõ4Ê€dôø[ÝKp¬¦LDÝ1.~‘œž]`—ÜØgö¾ h¹úì¶5ÜJÆÌ©Þq ˜+J­´•ð8oÃÍÇ/˜§H•²nŸj|¤Ñ GÓ™wJÂBWZ”Ið,E—oÔb/Ás©'y¿t%†VB·?ÃÑh_ZøáÞËïqSâåJð¤U7)à\ø¾&v%ªÓJêSó£¨ÅÇ T Ð"ëA|˜Óƒ,CDh£¢šZ‰‹V6-Û¯¦ï‘”c Û1Ù¾¸Ì!‘½™þf¼< 9Œæpî"¨F®N ¡-ÛÀQ9Ž›æ—/r«‰ †^lÏú3Q%ôµòÂ^Fü06ò„t›t*æ*  ™T+ŠSuÆ1‹žSè¡`m¿G C¸ºáðX¢-¸ú‡$Ø aos ˆN×1QY÷ áÈ$,¡Cîà+²EƱ\]bÆl3Àù¯“X Mi6(2VˆÔA`ëÍîl@éðˆ+ÈÑþ dÁÁ‚ œäsÁÏ–rȾ¨m®ðÂä;Ò7Ûí‹Éêx³à«ŸIßÌ´Ýè¯á·˜ðf—KïæÒvr®½…Ì/¥2Õ’¯?§4È!;´ ¿ÞžÌ(ˆBJ—ÌsÔü ŸÜ²=10Šï—ԓݪ¢%ƒ†¶Š-VnűÎÌ ÷0«Ñ½óâ˜(¯n†$T †EÎðßL8F[¢m‘à«ûŸ³Ë)"ižü¡ër»4«*Â\ŠFähÈö „GQTð*»ùwœ„)N2ýÀ—9àF2gÔÿ+’…ì† ¥æŠ”îcEïò`%:È>”“ŒþNß$\b“þJ¦„WÜŽAÔ¡‡9q»¾1ù´å„º®j¯¨üLãŒÕó¤ªÊ”§iVpUlïF´oÙpù)8šùÅŸ3è ¯ú_ÔƒÕÛY}©þ3ϽŒõ"šjmæÉ:¢ùp—“Š!:8¸#¤Õ©Ð&«ÎgÑ»[S½i8us©~¯ž¸‘ ˿Ȫ0%O]4Ú–kµô½Ö&xÕÐU ²»ò4ëÝçW˜8Ã5£vâˆØBÀ–¨5sËΩZ6šj% Ø—ºOnõé)ß©øƒÅPá€yKXÂ(pú“1rˆ ¿µþû6 ‡ð³;½r?C“,ÄOíšGúòFhe®C]—¯i<$¢ß´‘ïŽeªï&1.ïÍÐ2­ ê"Ïž\èaQb<„&ÈsO¿–:õÈ“ÿ ÒÍO ׉ÍwgÆÈèëº'ä:â/ÓE²NÄ»“á‡<›`¨&œžÞm51ÑïiùÆ+7ix÷cÑ+pêyç`@kWûµG U§Õ¼¢°ÂÉú$¹}>$ËqÍe»ìÙ9S³B&Ÿ? ×À—EÉ ˆž»Á¸ÆÝÙ:¢ú«®:Ì\nW¬y}ã_rl¯'hò{A¾ŠÎ6 Âð Ø«jd'üGUm#}2¢@°Î3í<ã8ÍOÑ^­p×öûI¦ò.S[Ù^–•jÜñÌ:IËBczôG~äùB[ €ù«çî.âKÖZPÝw.tzdâà\ôE¨ Y•QÍõlf ³¹å&%Yr±Ÿ yËv©)Xð-Qìg×›Iü:m /O`[ž V¦3qkûÑÈÝ›ª+ ÿlO.=ÀÉéT÷c+¼h¬o\&¢½ÍhS-¹l©hƒ¢¡ƒ1UU!™¶ú+£ú áß²(ÿ¦â$EªVŒ·Ìf:„w óûyºcÉšÙQ¤¯f}ÂBÝ+ƒ|9E]®…š‰#^Ñϵ* æt­ÍBÃëƒÅb€9ÈYºˆe º×@D¬7úŸËÔ5or¶" šÒ4ó¹$P¹ù‡7=|!…)ËÌË›÷Cî›9j ôa'a„¸§Nªj…a]‚e¬®j¸¤aÊ™a÷ù‘#Ì"³jñçz¥{M2åey•rçìŽÉ@KCÍEÖ9¹ö–ntïr¼Š,’Ù€f–aÜ’ÂH%‚ùð·Gø­ÞÎ8pbÝÿÒ¥PvÓîJçEÄyšïþi[tÅHeöüÐ)’u6®–÷RÀ#”òG»ìoZéZX~t%ûľZÜ';ùÈ÷-¾‚’}A[kκÊ9x¸ÅQ?aÛøIéaÇ~Ѷà@º´l®çqñ{ùÁ·Ì[7ð$MÞ}ýÓ4†v’1HDÕ¿&5Éš!Åæ¬/èm@ 9à )wMý­ s §„â¤wQb 6`V’KgˆâÜnì"5y)Të*W0K‡¯þ1¿AÃ’d»‘&Ÿƒ˜x ¢Kt¼9í×른¶™EE^î~kpîz"½;¡wq$kƒÝ4ÚRãõpYßFh'2ÚËëTSœ¶á0ÛsÞ¶ŠÓÐÃè„=JE‹Ac™á__`2VNÆ$D¦á Á×Òÿk²mDÀÞ™O­A‰{”ÕQCþú2¤  Ò@Þ}ŸÂW‹ÄB{ϽȞ<ôx–Ú0|S»¤Ñ ÚÞUFµ|_#}(•ë[àFŒ‹*ã©¡½È™Ý±=„o]Bƒ«[¼ º4>Pc|äí\x’ùÝ!Ú®a+>|“kk`¨Ž7z%pÞ1“éb`ª—&Ïíf滸¶ †²êÛ—çùûgûÏy‰åóB 2Z`F>CΌݴÛ^;8kŒL$yÜ8|ЮúÃíÆ„ l«l€ŒVS§d"gÒeQ܉àñ‚ÈæêSqßBkŸÃëÿŽË¶ˆ¡‡÷TywK…7ä¶£àQ —ä9D¯Ì 2]#ûC¦¶r˧hi@q~¹Jwšâ}ø’ßt]èÁô›9Û³c;n•Ùⵓé} Î})—v¥Oª[ç*w¿DØjœá‡ þ€Äd¢\ ŒzkàR‹ œ8ßtyAα,D·JÎo)itØSæ,†ÛœÆÓÔ‚Â}€XbM×ó  -rSúC(j¨8¶ñ4ñS²;UA’;›ÍäŒBÒvR¤r¨}=ÿÐ zŽéf÷¼!†,2FûD®TÉ\V`)š½èÖm˜1ýãÖ]L/Eýâcn…|µa»¥º|Ùì§p‡¯‘y"5çZ©þ•XªªRÇ1ÿN82Â#}Žš5^ÞõÞ"ˆ5&INß}©ç—Ñ€±•*ÑTq≫ŽeÈÅ´nq,8x Û~)ò#¹T…âŒHóÅ,ï3&uAËGÐ"ØÜø«¹A¡«g]/=‰ ÀˆsïIâ½·ßQçÑr­×:Mª_ŠgÞ¬B_ëE®Š+E#¼RìP{ë×K,ñ%ÔJF9åË™èmJZcM \”î(V­[ËdÚ/<Æþ&'[7‘’ì„NièãÝ!žŽ<ª4»Û¡ÆÂÇsÚ-@È!ö.z(î?ñvÈ „xBÛ c Í­ ­ Y@ˆþË]áæO&˜ÐÆ]ÌfmÇ8<#äx63ׇšz°a#7U£Á¹h yØÎÜk‰-¦ðä^?è’à» `n¨. ÍF‡î0‹­ôë®.XÕ²Ì`vµ¢_³%­Eý-?!–èoV̽Z®)$©CQÔg$d¿ž†ÉžòS–®+”`:~,æ +rɲ‰*šÅû1½Àz^›Y0ð[kÆŸ\Ý&¿òC¢e:]ªÎöD¶èḜ\¡Ê@xë0’ãlú$T4ʧÛSÑ·2§öòÈŒ›í¹×sW–ÿÊþÖ/è¨JˆÖÇìêd4ÇbŸ¦ð ¨c ­ÉÍ7qNdCŒ4l;sÒîF‹£ó ë@cÓ) ޏ€ÜVÊbý0æ‰^ÝÊÉã<ÝQã\Ðqrç›Âì!ð“òׇýÔëâ·…ŽÒÖœŠÕ­ x”ÑVî¯8êª(n~“só]À ô +Ý¡›¹Ñ.TðýYÌ[‚Vøéu¢iZl1uje](Ö¨cR/äG[]Œ“š…$H2XÑNÿ@ŽÀމV@¶Ç v|d¥ ’ÙÁÝ´"6˜ÜÉ·)¡"ècH5%ð:1æ–MJD Ò9}‡-ãk3|’^Çü \ù ÚD1ðU¢ï³Ï‡ÁP¹Ñ9ÀýßDe¦"ùˆåÀ¥"ˆ.„«ü]Îøâ+¸Öîú8ÎÿçDAvÂ)R}žÝ+¼å믖•NXiÃV“„‘tàl¡3i·{H³¡mç7»ôq±ò΀7½Ghoö¼2~؆å×—äw/èÙ\µÖ´«]&˧»Û0Ò€òO,4Ää\1¤Œ4q^<‚äap,g±_†¾‚Í;3Y2[Ð%=·Š/™gÜñõòxçÍB•[Í‚I¦4Wx‚¹e%˜Ùf5êFù岎8ùd‘áÏà\ qjÿõ§R惙[îèª*ÏB„ vò¥S”f,lL^,¸<\^ÝžÔ“¡ñœ3àÁH*Œ(Ê{O-ïóFãI V= 8c~ŽÀ`£(µžÒ0ói¾êòH$ßP–«èQVìà×u î‚]/ákÑ'bß!5…oÆôøUŠe(Lõw";7§×r`÷ÅÓ!m²"s]ÅØÑÔW-Ø÷Éy%‘¦#Òþ¡ñS{¶•a!Ð+7`lŸx ¼÷P p ¾ê>pÙ%gÓ*C{xH‡àX‚Ž´±rý9ç^V„¬ >Qæb{‹‘#_ŠŸA¤þwuÃDóe¶Òq“Â_È´7±ÝPÜÏxŠ!¿ìL\K@­¿jÎ<ŘO(Æ¡ˆÞv¾éêòV¦ Áº®)_|âø¾åìâ7h&L«ÎŠnÌÞjÿٗ㯔(`½¤•¢§ƒ¯«Ÿ`©0Ǭej!ÓšCf7¼½jsœcIàsQNØ)µÜê-… %w^˜ÿÙù I7«±Ï~åjoæ3^çŽ öë…ÏÑ$5]¤züË™*ý¼Æ€¦åÜÿ¯b’*¡‹òóApø¹+ÖaÎVµÿÇOȨ‡\h)QO•ÊhÅ1s StêèqEñ‘HVF]Cš' e×ÚÍÖ¼dž©‘ÛJ-TLØ^„¦õZo¥Ÿ+*Z¸—U“¹†k aB7"š•ïŸB|;0)MOÈ]’ÆÏÉк 26ßöp—H×ÏÔ` xßž¨ÊW}™)FV+öÊkR±†}™Óov ¡µÎv²št&ˆˆ?”¬„¨GøŒºÊ¼Yµû[¾>ÐMô-’ÉÜj–^SF&£9>,ÿž°SÐPE¯Åž› Œ3#Ïe/ô’s4Râ99¤Ï¯MPÀ[MD"SÔDŸÕ¡ÿU…1­ç Êÿ}ãi0BÒäÛHAÜwyálÜ·‘‘>ð£ËûÇl¨_¥çŽ'QÇc¥¹ë½°$Á-}Ž:’òW *æÝÁòG±ò{Üξþ¢ nQû–Þ`ºâðtïë$ÜËž=p:RÈÝ7ÃQ|ò®êa¿¡TE¡·ä4+.š²EJÜbÑú'š(Ü:¹”×±íõ?r»A×Br:>iýèÉ|sªÝ—ïîy[ò™bJÞ:tðºÌ@“YÞ‘am—S6â)“®Cµûù\¤ÊL¢X:v¬ 0w•R„vÙ9^uÀVa E!Ûgˆ…ÁF¿ä€"¼S±ñàùö î"Œƒmzá–m€ì2ñó:²ª.wzÌà›žè,A‘§…”á“`º~@­ÏÊ…0{ éŽ(xDI\ àÓ€ílž-úÃ~0C)tú­ò³PŽÿç°¥?|³‘u\`iñœóS±…u™qª6i ‹|õ}´¿¶gìªSIRà"—%êQb„Ù]IÊê“Ü*Þ.—mŒ(»C¦âP°¥ž»ó^yu€¨BVDÒ[ÔKOwûƒÖÉçõÿýlt·”P`;Ò°.c3a1¢×{é´®³­ ŸzaÜ[µ1+κ˜(Ø ’*åŠË™w~0*þÔEN´>ΕY3I>ŠˆUŒXüEŸË~Ñ2g,`¨O(¤ˆ ìÑ’4ÙMÚPÚŒ½°­¦¯¶»Ñ„«¿¶Ä¢Øåà 1×_ž@“ëV§õ~ÁÆ äÆÂ,¸±/4ç%d|²rMoå\ô¤7®‚Õ˜tîÈN-æDTõyCÊ÷{Õ¸Õ*Kmê.ùĨÁàFŠG¹n–\J¨M> /u¤ˆU?¥Ä’‚=T@U3ù7›T³ Ø*‰^h¸iÞ[é*xV“;íáñ›!:VÌšôýêR¸w®A‰FC`÷ÙŸUÐå•çu·?ŸlüR½òËI¢å¥-ðÚ6‡Q »ûÖ^K;¬.y’ؾõý$/h¶ù‘àØ0CVÏÙõ¤¢ç´ÍtÀ^A€P|X«)µOÉìêP7qÚÅ-ÖN~¡ÉȺTŽÂÇ…ÍD†Ø²6Ã|„bÉX xŽ„áZ¬qn"¡_ç|çºÓ|串†Ì«º£}zÕŽÍÔ‹s[¯´n=@%Ó§5ToÀc:;Ó-ß`ÿlÜÍ)$(­è~lA£C+ÿ×’œxìÎÏ1¦7ã{PÏ#³>Ç·~¥¯°+QòdS3êFR‘Kö$ó"&*v@N­†§ñÃO´OÚf2³f ”«®¹]„^ bh(ˆÈe=ÉfóÔ¹É ƒÒÍZ©&qj%§øè†³V¤»lÕíè½–‚AHÛÜ“e34]÷b©{´RZ ðJKïùèØí äŸ;9l„9wÉí»¥$– ¯¨²ÍåODÂ~¬”Lç4!zgxù ¥VŽ{Y?„ç#¥8 ¦[rhå,ÇæÓýuÉUúƒ—gR _§ *0éQæ‚ð>³4€›Äà’'„~|â9€ï8Â[Sû¼Ââ™ÌKÎS „ESÚÑe~WL"ý}»±NLF¿HN.Ù€£Ù9Q7!fý|²sˆrxwx±GJKJ@°ÆWîŒ1ÏÖ9U¼•ß>é{ˆ9Éôÿ5ö¸\–å¬û Uk Y®çD ,¯‹‘BŽÊzf²ï8ü€ã$WâZ“aQXN½z®ÞuVu€)ÕÄéÛÕˆ™M”jœöõ¶Ñ,ÒeK#žQ³Îw&ƒ÷l•<­š+ÜnHôÇÕZœý½{ºkäù×pÄýß Qz9½£…µ˜p°ÁsvÝÆ o>|ûYãæÞGÿ¢uDªxªÕ„ìZ`5ݲµ h¡Üú. ¨cHUòœ~™@‹]c šSë×ît¸zJò6<øaã½®è•MÄ;;Éêh>ÑduÑèÀl^ªô+bƒ ÄÜ•‰…~H¨ +Î¥àŠAsìeßyÀϨ#ÕY3tÔO^•û¼›€cÄ…]&‹àdûbX`Ñ´óºeÒÍX?µ£òÑàÊ_PªA û@|Àr}²[΋0VÝxl?gâf½ž¢ÙÖ±Ëw¤|ü=ö#D¯”V3þ¹±E/S†¶c>–2Ú"†Å«aD Cñ z©ÝW²qØußÿö€-Ò¸Ì0í8#úˆkHÞk*nËieÆR@¡ á•rqEå~$u¥[Œ«SýžÓ;¨NNÈ5…X©­¢xT5µ†/¼pÎh;„[(kÈÒ¸žkà '+!_«æ€Ô—Æêº‘'AÏæ1œ ö¸á¤:vU¢u/•–Ö³î›?Àoß º£‰ÂÇûü»j5Ôˤü¤°õ¨|y.c´Qo*ø»í1O7bó)›6'8f¡Ä<µtŒƒ}Æ÷8$ÅÈ+´¨AZž~þÝ~è2.Rñ ;ê”M©Gî0Ω:f(¼Å ;‹ƒJ¸œQ\—óW©p9 dsZ5mNÄxXÖZù€Þ•¿Ðž;¤œ^ü4à]Dí)7ÓR°ê,|dÞ~xˆÁ˜»: bvëT•IÏ¶Šª¼ø«ÑM]®çÉ%r¶UPؘ3/›ÿÓ½u vÒŸä êÀNÒ®ÅåshsyH …´H úKÐQAþ쮳yß ¯òœ¬t~WpÛ¨Og‘¢Þ7è¿`¾™¡¬D|ÜNæ"Ωë}ï¨Î,“#Ñ{w•=û÷pcмr41mtîŠÎîÅoܪïM}Þy°6¬9pß\JªŒ²Ojk£RÀðw,µ¶ð5‘ôüô‡ŒˆsãIÊfV–Ôr^Ò=~@Ë Ð2ÃÖ^ÁÉ@ m›­±Í›†v¡ŸÙ“ý7Uêå:íó„)Ïjh!¡}2R:O1´Iƒµ4uxØùÀC¹þÉibΣª3*)%zpýh¥æ{çˆòRâ§a#W9rüf‚ÈH DÑQ`½?^ÞÏóî%ùàÀ¥òŒ5×.Eè^%Àª÷%–¼Y.ôEÍm)<Ü»ÑD-ö¶"Œ'“$ébMÞw‘¡~¢]/ZU°ÊŸ@«+#‘õW"(@B”`+ß#~bè*U`j9àÆÁ6¥4ûMÉóÀ£6ƒjÎ,‘^mû³¬öaƒ˜ ’ÓÑÉÿ¸p˜E:$æõ¸qE¼?tRƒ¬öuË{êA榘î)Þû‰áÍã—ìï•Jûòò#–µ´¡!o–’^+ÖM¹ }ïãé|’Ÿ#év•FŸ~®p¨Gæ~Û*8¶mÊf'Ïš(¶bÅ-´4Z~k&Es‹GÐG"bº¾/¡R˜ã›€ÌG1”y•. ,< æÙœ¿ë—¨H.>} BO#Œb§×ã#NXLÈ`Œ3ïêbûG¾ÅÁ±GIÔM¶Ò?·V5kzVŸŒfJ3PmƸA¶¬ÂÕ¨ 1O¡Wgzú~V3ËħV&¸Uôuà»×l>Ÿ+CX‚{MãÞG±ý^„/^ Ï¢7¤Ö’ãbù‰;Ê[~prÅÎÙõüÞbµú‰gIâ+ˆ=A¤ ÷î¸û½ž,“?.Kܵ÷J-?wzþmaý™bUþÞbûü·ÿ§âŽÁ½Y÷Ù] Þ$S ³ªZâ`‡uVöìã÷ÛaÀu=·¿¨º,ž•ˆÿæ{ô/!Müv¿?먙¹‡‰tü!k7"_°«Õh³ð EOÙsœ;/_ñ±YZúZ£÷T„N´';DÀS_0ŸHÖÒôWdô²F òÙI ð°c¦§éSÊhûRýŒ\Õ“Š4Ä!ëüDc;llÏuà 7ø´½ÉøQ¹§ f[ЍB(<*ÊSÜ+Á[Í/LÒ>Ê»Vb T5bD/3y„—wÂmüÌ´Üyô_Eê5d:ô¡[nU‹EA”Rì¶ËíÁ¢=±,¼öW*»ðÐ`gÙR6¡ƒ›Íöå!¦ÂçUŒ© ¸Ðí÷Ü3qƒ¬3Ã?>?‘prY)ÀrŸö $¹Ona¦Ã8Z°U™øp­Lj]@‹^öõâ°K¼´n.ÛWvå®ÏæC¸$kIþý„°÷è²ÞÇκ›š†Õ>M—»Ï¢ÀÄæò جñÞÐ×I3îÝ ÞÞ»ÆíM^t•Õž†cÊ1÷Êë©næ1‡à“J˜ H ùçÆg´„½Ä˜ Èï]3Ããì;p3!3­6ûÍ퀃ñ?‘œI„¾œûó¦Nï¶fáPõc$^˜iÈìtÄ*ØP\‰³kÔö”ažÁoF^(ò ‚6C×!N„i8ô‡ý[.Õ¹èÎsTA=ÿwg¬°¢b¼$÷\pm–¯æ{qDI¹¾ÞmдfáÉcºŽHÙþÖõg´h H×Áâp„Å»xÑZð§mvŽâÒmíµ`•À×Œï°ÆÅ½Tã\ЦÂ]L_ p]Çýщ•(,ñÁpv!PmÈ¡šzò¾µû˜Âk™ y°Ú޽UåGúQÉæ¨Á‘/Z’’>¬¬Ä±69Ÿ8$‡Ko\^Qƒõ'àÓd{½‘¥âc ˜QY>#þîëà²Ê?@Aôö›²©.Ž|Y3×ö d@½?bûkM¬¦oüBWøÀûèfl¦ ™ WÌ‹+8‹ª?£É :Á6$„Y!©¨­phvS@a£?@œÞQ¸ðèC¥5ï;ýò'‚qÐu ü¬ü„z<~:ÿ”M¤V€@x.Ç»f²]Ó_aå“§)´üqý]Å’°_C¥D¢¬DÆ Ùn7±?†û(¼Ò=Ö¤Šô‡¦”^G™ Ù9—U½ÚÌŠÏ[^Äsãîolàã Dí¿ñBçRµëñIîÎt°£•êsuÄ_Ÿw,IÀùÝÒrVB`F¶IìEè[$Âá4BnzkDió¾ðPtM…Ñ£Uè‚ ”ê¬0k¢Ðm;G&€õÙ«‚÷/ô2K}sÝ™*nße”óoñ\¸[ Qß»Yÿbý;€Û˜w«çgK/Ñ ª=:,sáI'”Þ‰®¼•!ѯ:° x٨܈åW<ÓSTm)7ÍrÌ*?¯ØconEµqeÏÎL÷$KûüW•Þ¢U·$~À€Ú F ±œÐ¨Í‚X–K¸„éâ´òÅšb£ üBVwþ m³_„+*q­AJüA” F@ÖÞ鸮=Ÿ~½,/‚·/ÔûLšÇholêŽrGCô;„‹Þ£š–'®ßýQ#;ßÒÈ0Ô¾Fa¿ò¬…2v^pX›²Ãâ›ñÊ'BgíF£o8n1òHKðOœñWipjaŠ Ñë ߟ£Ýin1'q€×¾³ªiŒK›=>'"ÃfÛàPio4éSqô°œÙYSîâ•7uBUÊ€ÿÕm/:?¢¬ã#…þ®¬’4u•:>ý»VNôÖÓ¨P¨^tù“¶>Ešò¹HjÚœ©ª) »o©þQòX™QžL«kÜžt0*íú˜£™ß¼d ­dÙ)Þ=Ög–®ÕŒEÃ… ¼S³¥ßó­ûŸì.þ¾Œš”‰C âì<ûŽm§»¹’6œ*â¶ÓOü!¬\1 SºE ¹¤\}Ýæóh®ŒVƒƒZ¤…ÈÄØ²WÄДá]€DÐl @>¦w‚ã¸TUÉ Áþ&ðÏÂ+W`[ñV R%î°’)?Š@å wÊ¥HR È3~vµøbõløõÓ“á¥U‘Û}tW «ð5¦ù6 ýÙE›¼l‡ö˜xÑšq±#{dM”=l•¾;ÿ ÈŒã©ÔnužÑ{ÖŒn‹T\Ar{g¨|z?t"½I{¨»äþÝ™‚ÕÈ3w=*ÀÛYýÍ»d´`©ãeö°Ñ. í%„’®¹¯Q-çöZŠ±Õ äî4d^G·‰ISãÐŒ^#3&=6×Wr{Õ”¶Re߆F¼õ$‚³JFM.ÔETQ'!r¸&½z-ÿ×NrüÐ%,Wœ$¼®Ð÷AX:RìWžrBg\í¤jÛÖ|Ryÿ8ÙZaW›|ëÚ¾uÊ“–­tìÒì“X·u…t ý²™´3fÛçx›{5øP®«B·Ú·çrлf;¢à’@ÏðMÑ÷¢wªÌÚÔÂXæ´ry=ײ>jä³Ê/®(&©áRìýݯ”ÿ½KF:Ú¿ÕPHÔ±(1‹çó{îúÔVX½†1üÕ5­CþÌ#”)óÔ<ô-5ç|›† ¬/ð‹B‚ðG9¾û_0Õ`çèÑw`¤ó8S$u¼­Or¦­…ë{ˆ“u´&£dÝÿK4ãû ¿qÖüFz#`Æÿ"-îòþg½F”ÁZhK¿‡Á­1[ÉãYî\âaöd?a) ƒM¯`v-¢ŒÐÑù¬xëN\ñFÁùHyLۆѬíó4*F ¤ÁŸ¹Ä®6˜0j=u8éàôƒlî0e”æ„2{9Ï#è"ðõ÷©^×µá`ˆöQXÉ9úØs(t`±«Ek–H]$æbÓ˵•÷ ¹èÒŽ½Ô;—e‘·c²âVNÌ•?C«ûöÏOðvÌixÊEû¯§èB ÄsdÐÞf}vfº=Á°Lɺ•—ž ¸H cÙ6ˆúZý1¾¹Ó´|v=å6”‹èGgì!¥÷?&ü#§ºÞ>ÝÚÓ‚«8Kø@Ñtïˆ=º‚俪ëk|o¤%R¸Muüü%¹uâp(M*Øj×’šÂn„ÂèqðF•ëÖB‡àè÷“ò†‘)T¼þòªËÂxÀ)¼dXÚö?s…i6ØlŒ™c Ã2µÃÀøÞâC„Š(ñreÔ~a.<±ÜùÀ«‹Ð"ÿÇÕ9 $X«“Çüí˜üeU¯"$REö:ñèšÌbÒE›Î[Èèwªë„ a¢jžÒþ ðSŸ™CÛŸuo¤ÜõgXP^`AbW÷›v—'?`à(ó̪§ð4Ý#vT‘6=¤™"¥ù}ðZ ]kl'²ˆcx¿€º©Î]Fa‹°Mê)ÅóÕÑ#_úŸ?»ñmé”)ÇoÜŽs«OÉ«š! ÀÅ®´ÔÎeâw÷EΪ5I¢¸}ŸD7êI¼J Q´¼g³GLÄM?¸ ÉÒ˜I’# ÍOcA½J s_H½tåù‘[!ŽëÐpð"ˆEÇ8%€USëѬÍcǪ ¼Xüî>ä’¢ÎyÈÍ:Ë£ `®˜ifÕd¼)¯w®ûÖõ«U¿~1£? 3‡æ„‚‚¹\ì|7BÜyõK¬jŠ?å¶6¼Œk%¸Ç ²ê+”®¢¸n9œ”Š«Œ͸¾©ÌHIúœe¡#7JªßÀª/Áh긅ÖH‘i&¥Kôq± ’3!âï:§°üäòºÃAÅi!yQÉHk±kü+ÊP÷$» ;•}-Í×Ïóq”À¢ž=½Š&,±èÒœ!ðY¯SÓ§ Ç…á‚ØÍ ]³­¨!N­ûÇU. alô»Œ÷¾íŒÔ;ÌKTØeXíïY´åôŒaJ-¦»ë?¾uܾgüÞcš$˜N-¨G…iéyïKq†fDœ„gR¾,‹EH™Oû‰Á÷JF=T!ujÂÔjU(OcüÜœÕ2(õÂ6Y÷ü÷óØ®áé9Y~q: ³ChôT¦À™Æô—£ #Êu׎Iž¬zÞ¨öª÷™þdÎxÆÙÖ“ î“Y˜ÑHÒ›ÖÜ.3KB£ç¢O::j·Ü­"è‹ã\£âtu¦á&<5ÌœÇÙ¢ .O6%ÏD‰4Ðc[ŒÄldþ#•|H^Ì<èܧ2 ©‰9ãd ù¤ò~,Í×§ÇB¬(<þZ_q5³A:¹.‹U̲™((–a‚ƒ=:‹øØêIU—VxvA½Å¨V—TÄTQ6é½™¸u¨SÀªt[šÈØšô/$ƒ`Àw¥1šEvÏaY–ÓXì‰B‰g§½Ñoÿ|ö€@ƒU¨3 aßD—×P<Ö© ;¦]Ѳì î–Äî G«³÷tzÄЋwàÉõU{å“ u,Òn {KdßbüS~Sl7goU>ìÿª T§Š‡øHnÉŒI]ièÉrV)êˆ.ⲈlßXÇ]ròˆ¾ŸD©ÞÑùÛÚÚgMaÔB’”5 h蘻&…5GÝ@—d½À…ø;µ«»k{ì–ÌNüð¿Då•êË뉖.E>,ôØPðÕ,ñÈÏ-CÝQmRãXRÛUÜÔv~QC¼€Ž‹`#ë‰ÔâGd¤3BΣxnâ/«"Þ¦jx°.¤ãQ_7ÔÞë4ò¦½÷n+ã/ÌÍ\»)ëT—ÁSØ—¨W$ WáLà {R•Í-{7‡ö)©7ðKÏæH«ù_f¸d@ž¯ +7a­)?;ô+Ÿ¬†I‚´”;ßçE‘¾ì#I_ïA¤Ð‘%—„ßÞoÞÌf©oŠHƒH`›æ~žLÑReÂ+ Což½Ý ©~ä•`޼ñ])l|¤S# ôPVAÛt¦2BÉêh¶žÞýŠ,p+Þ^{ç¾³›õ +©NýGõsîðÚ‘ÔFš@TˆÇÞÙ«¦ óp,…ÑåÅ£‘¨f•(q‹®‰F¢øò{Þé"Ô ^¡Ûžv7 Ö›ƒ¥šM«œ–À;õ%¹aR«Bâ¨Þñ¼Ëå;Œr-9·ÜÈ>Š¤Þ«j~”˜ÚGf^ëq6£ô;ˆ.ÓÑ )öpyâ?î³ 7éÈW 'øˆøU«é6,|þ êø¸ù¥h*ý³hH]G#1„¸ÞL¸ga“ÈÞ6ÓJOå}“ÜÁrÂé(®®I“d y3r2 Lt¤5N«·W º]Rmƒ{UÙ nxcÎhƒ-óv‚vçÛËíl¶)ßü Ö¹ë-²ˆ5Õ)d”y•,/NdÓÝ÷[ãÕüÃùd2‹3v`R\×[²QIÃèâ,ëã1[Wˆf §ó÷”·¸VŠzkâ­´U´&=ªˆ{­¤2ƒƒ†9©nÃÞòu®0éi ß>ø °p(ü›Yû¼›QX ¿£Ôq‘°6…ª^$¨×¾ydæ<;JZ™u5’€,¢`‘FE$ë«€{PµÏ …?é£ttSbgyÚ6Z¯BÑØcÖg7ÜÍ’±>LFë ’IøêÚBþúQ§Ö<ÕI•ªpÛ˜}ûÇb¥E^ìú 5ÑFh8©É3’j«ßø ôF‹@ýE<©î6T8&‡×MݪÚþ< CJc§Äúªx®Øàçäÿíd·Mô¼… ¼€$4½’ãSä^Âa•ÌYÍ/ôwi¼¹áWÀ}"A£€˜ñ²Á{kKpŒzàc9ycåSlàÆYI&F¸í ýè¼Þã¶ÝD莿°Ubäò "9Îûì­{‡]kŒº% Áá<G¥„ CZrÿÚ™ýÕÄò½®Kzrïj'¯µå±¾9:øvõ’eÄPI¹=¼—xÚ¬HÁ9©brÜ¥v+gs© Ênýgt€D”ÈK{™o;šê芡ȈÎâx×XˆVšò¶Êö|>Éã#$µúX;ïŒTSœ¨çfyÜ9á¥kŸÐ/œ­bð.œØ¶ÊÀ–°¿ràü‘PëcäÀ£ÿ‰Û)r§©oÒ!HŽŠdi[½“,ú–…G† \£]…¦‚ᔽ¬/”]W¥kÂí©ë}ø™Ëüz±†¥6›~0tÈçã3ÛÏt “«)Æ‹;)¹Dû‚"%$ëÐ-)·IKŸ€‚j‡*mU÷ 'zì YÈê¯-h2‹Èqy阛«ãùF)X$Â4ŸsbîíI]P‡ðuîo•ô\»icâ ÷Á™©º7µ¾{—oðyߊ§vž°Ú¯—»)Å}y’q5l_¯¡æ6yÓlpq.òuºN)Å×™–®ÍG°(iƽ0Er&€iÕ!øEåßPæÊ5‚v7sS$DY÷<ì“J¤F·Üºh…G`GâTîfŠã/¶v5á–2tïö3 >´#n98Nò]ów„à°Éc¹3Ço$Çx΋ _¦u‰Ð-U”ŠK¼ÔóïÞ1v±eß‚ÅðŠ ÊhçÖ„w¡ “³­mPZ‹Àæ(é‰uá&Wßê\ôs ?W£è®9WæNK÷D^`7ØÍ 2Û—Œ[% ÔƒjÖâº@Gv I—àVV§SÓÆT˜@†3>å†[Z“­ôËë-8’¥ |8N>£RP°@& òþ÷.‹½]ÿ*ÈÜ 1a¡æ2œŽü*dV½â¿¢2KÕÏÖÇP¥+2”¸°fÔ0 xµWíoC »9q¥ä¿"ß[rªˆ[*U|7ÌÍanäàov Aú´ã{¾èêp¾×žeù¢ô¸Èý1˜U•R ûÚ Âƒw¬:=8Ä„^°k˜:ÿ&<}Çêl3èQ°t†àga*Wþ€9º$ ¿ ä,S~­@ÙÓ™*Ì[›ŒeÔyô‰Æ "$]Üs»V‘I/£O¹æ©èÓû]Gù9²:œþ—OòtÑP«?YU†(æp&Â@@žéÅü-“|—ÊÀ}Ki¿QZœ"ôsá¯!sÖ¶Í\Áä1@ìì±Zª¥qSk‡ðŲ/`¿ }köD0¯¹žmøWÓºÛq­wËÈD\¢¿â¼:d]!ç(7‘cæ°k~}´ÁáŒ;örÈ.n7³ ±<Ü«m†l¶ê‹­®zLë}n—GŠ¸ÉŽÍ"þ„±o7%Zqž9-¾ØaNø²¹¯f~éïŸÏÜrrLJù50³^Oß>cî©4­9 { ”¸ìÑz†ô.Ed³ÃŽZ·=Lì& {ÆI»¦ƒ¼NSª6¢ÔéÒà‹0¦C»AS 9¿²€†°Wõæ¨X<3ùPgíÄ[_%ƒˆÁ@$sÝɾ÷îø†¦¼IQˆYB©¸fHìÜ5¶êɶU™ï“-WTgwC „ùë#[Rh‡-k– é"#ÆÌR=Ì Çu'n̲<[vuà 1Žkž $N#Ý^noa·ß[çfù]ŒCµSY™A®\}–TÄÿê74ë2hÚNw¥"…¾Çå –?[¢”r’ÛÇúÏ«pÌ!Ñ£Øk#J;aõ¥LèL•}Ó`]~®Ù_# šx97»ûúã"ûš Ó¬r>˜¸îwAßWÐsQRíЕõøQ†½2ÒTÚíx"¢ÄÂðz[Ü7rÉæ]dÚ·)WÆ)Éó‰ÝÚ~ü ‚xbÁâ=KNrWÆS¼HÌ8_~ Ш·71QCuýɈÿ©‹PÚ¬Êã'#rôb„k¾Èïæž ÒšU"¯ ªn:Z;м µG¹á JšY¡c<Ÿ(Ì!í°öõgÊ)=÷·—ƒ©VhÈõ9¸vÜÕó3%mLK|îÄ_žtæ›o;ê½MþšÚª†CÅ­—!«çÈíð´^ø25%Amüš¶iÉ..[»ÿ¢ÞÌfdî´i^5#·°è²ËÀvÒ\5Êý¯ 9‡Åò„¨P‚;à3Jú Ü®ã@‹PPÆ®h.tZQ23¢ÁEþ°ê’íZ­þIŠº]c¡Ž_1á—¸P,°qr÷ Ú®ú¼6Þк§:Ã*·NÎzâÇ ?žÐ´ºÁ­íd-5Û/þoFWGdZ8¶µ2€×Ï|ŠŽÖΜÇr”ƒUƒ6G#4¿I$l£BИI’5>UF®b?É*¯>+v ËA#7‡¿0aE25ŸØ&XÒ&ʉ9ü8ÌÞÇr‘¨óX$K’1ŠË²˜S¥SîFíΨO®õÆCÌi9«œÃï7-T¿÷8ëY¯Œk2s¾ZUŒt¬ìóv {Ÿ´`BÖxÛTù(ßñý’õG 7¡ý T yY8¼ýåj_á¤E.cÀ} ¸9®t(þyv«¹iÙµÎS£ö§^ e;?Îô„ÖP\¦®€~»ž–M+å‘>NœœcÓVSâ¡õ™ÊÄ\‘ZzsEÉž “„ñG°xŠº&~ÕC·A´I9ç~àÁ\#Ñj$âµ®\PÏëÂUi÷ùÜÈÏ®>­ã;õպد&Ôåe<³’\]HxŽ R8«U6I„a ûÁ­›¹}Vrüõ$ˆÕ²µéCK_>‘a2(B”’}¸#QçÇz¥Ãd†ŽKóN®bü~›—í=cÍúkùYC‹kì/Ü1a?J±ßkéÀ.©=ŽWå&ÂR>¾k›Ž¥W€{S@±iHœwIÜarÝÐOYl—à%Ö¦Åò睊ƒ®ùAGè zVÝÄAf%§@ d²-a·ïQÌDûAvðr¡ú·˜­¸ x4½F™£bU"Ÿ*Ê%¸ð©À8öÐkËÈÙaèY™äì¿|]´_屇lóf¦vdÒ‡”k8;±‰|á•EÍu(†¯ á]ùÏÙ‡ÈLóÉ1:6±•c™«vÊd›é²Ýy ‹Hpý´¬öjm‡—ï>^“©ûÅÉ”âÎe§3oarËë+cÕ>Ææù¥|"kkk±xRW”˜/«÷÷Óu o뺹\7°3ϰ§L@ê+Ä'³5ˆÉåÑ·hrÕ¤Ý^^Ô]u+Î6]Ú+º€Ø` 1_èÛÒJx-òG{íQ`h,£Ë¬U‰Öbõy!EïÏÇp¯ i®µÌŸÎ£dú;ˆV`]Pg*ã[ßu*ƒ¦˜‘³äêÈÙí±–qÝüsæo[{ÖÔm!"rÙÓ´³â¨D(;‘-SÇ,ªJÄcSã÷;pÇÈR¦"±†bv?ÊjÓÖ!ާ×ClÛÑ ì^Z¬ÈsÉ#°âµlõM ¶ÜÍÉÆJç¤p<Á¶d]ó>$ʃZ“—ÃZk‹Ãã\~5pN HÎõc¹uñjë\}žý¹™Þ…øë5× EÑ™Ë;²ò¡¶±ßX#œ¥QÕšxb¡º‰¬0‡ÀòxN(Ó¤Ôo°Äb•bb…[TrKt¾kç¼Õc+P£·Üªœ)X⢣+ú³§9ÞÌÓu×Ę?MàòWeã%º@Ó¢‡i!µ™ƒ‹J~ì ×ñ+ ì,ƒnç‡,7p¼ —'¬ëßä~…œçµœRƒBì3U•k~‡`´K·À‹l[”ÂÔg×Á£WèŽ><ÑHÞæ+OË™Wß1¥uÑœð"ž,÷.¹õ:òü*¡zs=:·,_C9Ðr0eØù•ñóBe€`$ ?XÉBpúkŽÙFþ]rÅø.æë/õ!$ØŠÝŸ‰rM©bF‰þ¯[‰Î¢ïój°žƒ`fnCÙYØ«gj þ!5Dƒ¹Ï¤Œ>‹=‡/Åæ¤E¼ók]7²Fr‚Êûþj ¼£Ž*–`äÍf×­úçQˆóI™ü;˜.>НU´­ï¹Ç½É÷Ï!–>éø7A˜Þ2¢ýaÉZ)Èõ“½Ì@ ‰£ ¶SÂ9Y÷SÅyÆr%;¦²ö‰à: Ã•‹  |¡LfÍ܈X=,e‚¹k² ¿Ý"2ꎓxìøR5½ `c㌬bA sáB~Þ^ÀxyÅý—ˆ,nÇ€¿ñ?âœ!{šŠn…{nnX6÷œŽVÍLÎð½S´ÍÏn;¤ yÌüGnCJ#»•æC Õé›Oç‚JžYQÓ‹îà bGmϳT;° Úƒ¬bãU¬€¥‘‰_­ËоTþf–Xü¥ôeñ´™´Rœ_î.ÿ²¶OÚH´ Ò­RÕ À±¾øu{“ÔW®z¢ÒG¯Í@`SfFWæÚuz»´Þá‘!­q Vä@è^+¹\uIEÄ„ä 2žÒXà M¦²¨•·¨5Ü‚5¾õ˜]ÕPtäœËãpŒOt4ëºïí!Cž&ÄfÑ/m ”pÑ©°8BI4„/'«õV} þš ø|¨&s³6ߊWQµÀG”õ.ø-ËL)EUKøSbCpìèêö_3S9rŒÛªêBtmø¾aZVPjù9Ç©d5Ëže߀-„Í¡3;”`m¥7.o½´>ø‚ÒŒ'9Ð ¼ßø“»[‰f³éES÷Žîyņ˜*ÁY\\³?mA¹+ô.ˉ±±‰x•ɰoƒcw_Y«à ›ŸÏÍèÿg1œäªÓ·Íñ\ƒE.–ŽIÐÿpÞÕ€ÛæÞV®E†Ù,ÿWŸ¼ …cx©—ná IþL3P×"_Ô»šÏ¡~p¥**á ܨÑÇ ¯352_ð´ÿ–,ÁÜÚÀ÷Z$3Šïpn8ÿü·ânÓKã ë¥j_€%ë–ã¤1†/—^aÄ¿I’Öí–'´ÜÉÃîÚçlÅ2cöµ1yjÆ>#E⮤<DÏW¸³äHQšš;ú³äXynq§m<ŠÙ‡o¢ <ªç±{ ..1åh’ªÏ…“Mߣ¼™1¦lG™œ#øšÍ4gwŸp$ÑÀ#‘ñ Λ¢wU¿ß÷Ëùè=fEŽ%1“²T?£Ã£‹pä¬ —EC\èÙè³ñÐï*gjTDTçȺÎf·ãßðâß>n—Ñ: 1|ø\'V¥ÎljOnu¹F°‡˜Ntüs×P®yÒwu‹€¸ö5†úñD» AO¶üÛû ¥¶’ÓÕaZôhÞ›fo(‹†lö=vwäæÄmÌUåLö`³Ôб0ü$ÿ¤1¶>  £0Ͱ>æg+™,/œ5ØI™øñòŸjQ4\QCÁuè]mBû9¿Rf¬‘B¾Ôö%½ë¸ÀÛR•†S4àË-oZ 3ØsŽZìœú„lF6áU¤•ïZÈ5” >`häu‹¶í;-L¾Oúø¡|þ:y䕤êc•©ƒÇÅ®É/âC÷§Çù@®$ChÉøñ;5†HƒEŒåÄÅlRÛã›lPã×ú4À%K'?ñO_Q` âLÙás_©µÙ9 ¤)¯|HµD 4耞ãÊ[HD¦f€nEÓοd€¾š4ßb{4ð”׈~¦(™º¢}z'(e+Ãp‚î2úf*nI­ÞsG­Ô¼’’dqé Ù°0\ç³ÌfD.Ãø4¿1Êv¼JîZ¸VçÈ¥+&SUPq{w%);¬SfÑÓõqñÿŠùÇSÜ<º7æ*Ú’ÚrLkôŽƒO\צ Ãìâ{¿ɰçQ®œ6ÿ~©F¬%Å mêZ=Œã_qÜãà¹ÇVŠr‰Ûn¨AQà·@p1#âRŸ W¼¡W§+Ë£d…q4uóÍmC!w:Vž™¡½R»VpÖ 䊽—eïÊV;B* MÕ¤–¦9•¼”HÖpJçàd5^§l=e]ÆX_V®è'á‡ÞU8/å@•"ú©†h{î~Ô*ŠùV¥ƒGfTùd7ž£ºÆBžWxŸÁéàzLý—Ol‡):ïÆð6ÏÁ×­{]÷"ž²™MGFþ”Ѫ/ˆ“09I\Šà¦ÇfÃK;Ã>-› U(Àa<úzœ —ØšmNdUå±ÿ»‡+fuÞÖü‚ Q BçÆˆ·+$šëÙz£>ŸPF‘¯»nUc—ºc0Šû0en®{ €¡‡<’WÐäÀÆ•š±ÒöUãz¼›½Z;dÌŒqÃÀG 2·¥Š©-aër#åˆ˥çh"²Šó®h"v’¶¯-š!jº¼æˆ²Õݸ(KTÖ% ß *ùöÂÖU 9Oˆ6ñÃèÑJOjÌ: ùM?K‘n ™¡Eï ÉjDM">Nžþ„å´„nËûF ŠAè¶SÛçÂÓ&$½†…ÛNíålžöÝSQYé›%õУg uÞæÙ¸7y“0ú7C²úŽÒþ§¼ä—¨|ýFˆc̃ҽù”âÿ¶0¶0îŒ Lf{pé ^õŸl” jlòËI}‘؃,W$¡KïD@pè5®ä†Rn¯D›£æ {­ ÎéQCÀŒ›íš×ÎhÌŸƒI–ᖿýúgÇ’»Bö=/Èh˜íÆòšI5v/×ï—•¤ŠHðªi»¿ ~^¼–ÕÐ+«Ý{ ÛAF«‘Ðd7ÁU‚ºÄÖ>´P¥5Æ„x1Äs—QcðËgaJ¿Ì»R>8öV¶² N'¶6¶åÜ|8Ù! è(±üîŠÛ™Å$Æ ^n°ŒÆŒ}jäÎÔØO™šø3þó‹pÆ-ZzàIz*Õ1šðXOõÜý–ÅÇì+’™Ô´ò#©Å3K‰µ?—Ó2£Ê˜Üü7îðQ~D|ò¸¤§Pú~cÄ9\*Šç¼-'^Xð’A î9§¨ŠÀ„8(uõG´ ~;ïÅ­`Ò’[¦ˆ —´Ý`øpõ÷묙 }|ƒë·9˜,BØ[Ï\‹T‰´ñ‡ƒÍäÜqP~öÑË_L± ¢tKh´f…ÿ;~( •PütOdŒSÇ|æ 0/­ù»$`,DsRß¶ ¦Õ½hjq òaÅæ`?c„nºrI*þàÏyç4X„ûø¦Àð¿œZ_Âp@BúË 3û1“W:Èÿnòÿ²­È­¬XŸ× Àè [ƒxžFFD8­ü–(Ž;Õ”BÂ÷J ጠYC)Ö·@"c\ìK(°|ÝuR»‘ ~æXÇwޝ>péiœ9Ïû ÓKkd)丗ÌZ‘—~V‹AÒ“ºÜFź—¹<9ÑÉÔUlð×ÈÓnÿ¸÷ÝÑ×·™tß;«n+õXÅ „G:»÷ãÅÅndÁð»É».†ªâ¸JP¿3 Z÷Õ GUøÚ‚ÆÇ½Êá9Ö-0Fé³cy60³8y¶{·}H,AÌ‚y©ÚÈæÐì ‹ú?WzÝ7šž¡+ÝXˆ ³- ‘ýé—”-"1ÓÐ#àu!ˆÑÚ5Hï· ,²±Ü資ŠÑʪyÐÒi5¼¹e`qc ìp&UpʉÁÏœ×qôíÄbj» í? x§ù|Kù<ÀüÍ>ty#Jè›I>5L÷Ï¡ˆ}Ú@3Ø <Uö^¦t¹ÇíÔeÇàÃôoúr«Ñrëí#‚F6QÝÀR§¬þ?ðzIF‘ó+}— û’9ÝОαfÛTtdÀ"Q;¹c‡Y+Âs6Dúuõ×_mÝü§V¹ö°?HA1¸³*Vè„+Mj3Þ«_Þè`êÄ´1~üá´†L×D- ƒ²ŽnvçQ-å0¬Óêq‰sÚ®©Óì{ ïÏúC•#ê²Ë·æN>Þç³ÁW´¼18à ÛAá@{¢Wˆ»ûô|².rŸ©ZÙÍ~OœWøiJÂ#aòFyr|óÓ0ûä$jõNÁ\RðÎ|˜ÖÞ¡”nñ^éFÒô™Þ±0 Ÿ`¬;ƒw ¯]½¢'ÎÝPƒÇiÜ¢§tÔ3bÎÌ7ãnM>Eb0Ó]’Ø!ytJ¦ 7‡@hŸŸŒµM£r²¤Ò±{;Ñ÷…›L–½M‡0Xqç'sÐÓ±ZÌtA$Aœpñç‹EFwÖ¢.úì+m+WeþewK³·å»WS$òÈp4¤ã*V­m!ûå?4³QSù%¼#­ü_?Ö`«ç…'‡þíoÐÝÍ®ŠÙÁÙÍûgCµš˜XšÅz:ùÞBì3`âÁï`Úͤ^¼`yÛí¤ O’1NóœHý¢M,-Æ©áßu@bÔ1a®|3 Q! ~™d|6id%aaåRK.n »lvZ6shv¸*do+¾ÄæyøØ tÂ×76 8ɉ¢ÉÄ1ϙ㯯Àƒ£ G§džõ£¾ðÂ]ÂCž5&¤Éæ·ë–Pg¦bði“Ç7‘송…Bކ”}nysÌšY è¢Òaza_z(Êt2›€Áy½ˆ[î0.r<ÿÅ~—“åf4 DçKÁ’Ôÿ©®y0™ìF×k9ûعEªŠHcÔ:g½¾jpìàk+\ÚÄcrQÃJž%iø_n(ùÀs²¹ú5|ùL쌧ô´Øâ2Õ<>>Èû¶:EÔÇ…K“‡^¢áìã켂(ä 2hý¿svùÎ&ÒºZ[±s£y ÷SÀOºb‡7áÕƒ0êm&™®Å’W•k bØ2ã2’Ô$-QÖ©""„¶%É*0–‘Ú”EÂm©FÜØ¢óë?°ñ÷¸ˆ¤Öþi6…ª‘U]gÚ½åAD¾ ‚€M³NžÉÍßbc”a-_íª|–;1ÞPÞ¯òîßšî}÷¶#DÎ#”pq“Tø ¸šêØÝ[{0¨É6F>œñ®ÜÔ{’Ý_üª¥£§jJ3'‚F³Ø,DÕ;ýuÐÉç8)”¼›þq3’ƒ]„LàÏüðsΦš©A}\ÏzŠT”åŠú´oz‘€õ€,áðBºä‡·¶p4ñOgس½ÄÚ¹˜Z³êÉ‚•oûjäKU¥WþTﬠѶ…+ª{€ä:«Ç¢J²e´/M Â(ÑQK»_Û,"ŠÿKT˜´æ  ä¢z¨â=!¥`›Óäbò1?tWÞW²¡Rµ@¬Р£‹ÔcqUJ£§,ØÕ‡žDKZ˜¹>=£"¸dÊÉ 9‡V©'ÐŒ0R´6õë*]¥Qáðxf© ¸û걑ÑXBþÌóR‚¥Ñé¼ÊrHæ"¸#J–ý¼Ò×(*åŠìg?Y~„Ì\b­3òÄ‚ßk݆@¢ª­•¦µ”6ç6i¹ÿêrñ¹0߇Aò\툤õoL±”bã*éH-W¶¼8¸7½wVãJ~þð±[ý1fxÙêq툰½œƒf°ýlad¶»+rƒüRn–,Ò5®rYЍàèd “‡x;C+ɚ΅´”‡Œ–ΖÕ=\Žw=9¸ÊЇ÷Æi’à| ;ºn*{®C4¥Wû»bï°›ù­Ê¨æ]ñYq`fÖ·ç%Ç3ÍQh°âÀ¾øévm°ÜYÁ‰$øM ½"¨3²·{·¦Ýë¨1Êà%Œ2y$BØz^xR|ÿŸp­tôuQ[5ûl2L¾gŸ9Kºë°V\Ae9ª´2"É¥éÅ¥Š]åÔ2—Y4ùi€Ü”¸^³l€íüž±Xе=V†ôQXž ð$1ª+è’Ç‚:¥PrzRàl¸{Øþ§$n)šª-ï|ØÑ‰±Q˜?¡„:|èðuÌeóÀ³'j}²-¦²àâÛÍDic* X6}C4– ~:þýzîwÎѯ`JÀ9Fóa }AÁB jÞ£m´[1ä!Íï®äÏvzG]D›µÃîñf±§Û`ƒ­üN 6rÕnÖ8,'ñ&ƒA«~Ñ›hSƒ,xe9Í„^Ìšf.Ã/i<©'”æQh7àõBìÖC!0êü‹#·‘´ÝTê àF[í/µÉŒ(“í“ÿ4]Hƺ™Å,íò] ^@ÙÊêÇ+© 5¼³³­˜lªFm¹Ð<ì.L€ê3æO[Îü…Ö<»Ó=a1wÍ= CŠ”› 9¼#‘ ¥mtvºþÅ\, ²w†éeÅ"æc·J½ä'ÿ°Yì§Ë´UÝ5¿Á9_MH4ÆKÏs#hÐöžp¿‰ ^%^}‘)õžó”–M(ÞÔaœïQðã:_{•~Eµ¨  bвt q!Ü)3ý7/«‚#iÃtÓ–•ô|.DÎÊËdÊù14 mÇЀ/’ ® ˬ¹¢ó$ÿ^ l.Ë—ÏνÕê/½`Õxƒ’!„6LF¦'ŽçÈ ¦#'tT›Õo¯ÓØïAÕ9ÑžöSáÌÎIÁëbÜ“n =¥±M²ôæ ß7/<»Ï†Ã gº^$DâÛè=àÞvD?cr“‰TUô€h6ëð°ñweì@ýÁ!À}ÛR$ªOä…êÝ>°]ÇÖ³ SêÅÑÀ<î’ÖJZOãVÇ)=m2MGà¡¢DPO¥ãžÎùå¾>œò}qÊöo2î33iú®…….ÕÂ* MO—2q{¶…’¤Ƨ¢ WËï0].…ÂQB¼—÷»³üÌ.%­dKðâ}ÄÂFÙgÜå6+8mTYN¯º=·­ž9ExÉoá" l¤µñs£+ÒE›õoÅé/ZO¶Œ9C²ì"ž”Ù_[ÁU¿F¬Ãx¦q(QÍåW%ˆ9òýÛ°´Þbzz²oÍï™–>æ5VBÛ|l,¶ÂÍ%zÓ~ùD%¹3‚¤%äûí'îWŽÀ´êÝÀohfk‚çÿm¥¾R\3®ÿ¸¿™¥ˆ„Œ¬1±‘- J'&Ędtº™ «sçe’áý÷ qžÚ­Yx‰uCšš³’ñSG‰5‘²uÒIÅϬžß«Ø!3åžKtZÔ–¸UxlUõ_µLÐ °¤WòmäqÿžÖrïÛVSB›a›J%]GáÜ2…:»åŸ¡øG/1®†nªsÒD^Ùj^^j;*˜‹å‹}­^J%VãÒ§ùÎOÔ!ç5œ‰3èEΚ ‘5qý‡â”àCÌbØ@NÐÙPö„ñïî 84€u{š3ßç ÕzdÞt²¯ÙIé"—à¾óa@Ä `®Ÿ/üÒâYQ’`¨|í܉w³‰ 'ïãðléó.|PE’ª–-säðÜ/û \àÑ!-Š ÁjŸF¢&…¢“é2ÉßxÛ“a?5^Ï XµcÙ«ÖXÞ*É$(ÛÞ3Ÿ’äód!îG®Û<ÏGŠ#³,,– É¡äZ¢çy_&ýg–Ô[°(b]ðûB‚’+!ÆY ŒÐÚ8~N`>å;Z·Ïì{ûp†GEþFÞïŸáÿ#^b+”`’ºï?–ö,û®:qã…n`·Wì:o ¦¨L' åí²š^ðð[€gCðdê#Raÿ1Ÿs8q”ÑBµ’# Ú!ÞTsuY^P_pO”‰RÞ9?î­%)hÔ·Ÿˆyˆ‚̳Ž;Üù!;%‡D`EV5KŸ¶À)|·þ ‘ùf¸NYmv&f97|–i¶˜ÃhETw0Ð=žI*Ãñ è,ÖŽyxÓo5Ôçès(JËPŽþþ:É_xàÇÜ+C)wT~ÕVtÚXƅ܉²ýˆ@dâ.55! w{$㪔êVw§†m2Ìïd!©?‹GògUb¬”ÉÔÙÍœ å±³7ï"ád!1‘q5–ü¬mqíý¬\…\8XŽÎJ„™Ð|¤4U–E‡nåTéYèp|«¾C½¼¤›ïN/ùîÕlv òQžyòh…4“LÙsYLbN‹h¢G‡y÷ÐÿtÖ\H1«"…¤û@ HË¿ó§ý×zÁAÎa‡DËýwYMØCA“êd¨½ð‘wÁu””;­Þ7ë#Iî‰**€Ä;Ôü)ÆVøÇŸÙ®/7Q¡?º®8.xA‚¨vq_2ilsHAu¿³9tîªõþ×.þæèuŽÉÏìç`~»s¾êEÁ£¯Tùùú»³à‹g }ãkM„Þ HY³¨Í¬*j°K*'(ĵ©bÊ[À·Ý>G”AŸZ ÄÚ%4"%ĵú_7Ô™Ê1Òm+^ðøv>ƒíQµÍw¹ËßHËë³Ó®á[–Çþ–¸hƒò…¥O½ži¯g¨È¼¾¾_‹^šíîWÓe`ꎲrLge0ÂSˆ·c^¾Ú¤eÄûIÝ—¦ÓÎÙ §¥ #_Ûë-¡<½¯‹»µƒÁ{άýyÎö5º5#ÊBî;%Õ‡@)Só¢ýuIXqA˜!¼ÏϨéÖ' AV8ö*ìT–âü¸Ñã>º¥ì‹©VM “”=PœTðÉãú\]eØÆ’-¯x:DPù½\Øð"æS‰ûÞêjþØ÷ÙS þ¼'<¥'“z¤–ä:äTvÏ»t†ûJý­T×ÿü“WŠ»’O0ef;ݤ4ˆ±È“ì뉼õŸ¸w#¾š¡¸d**áP=¿W<¿óÚ8ªÐ¸H{§‚>¥†w9dZ{¾Ào/©Á^ÃvQ€©³ÀB …ï»êшR…¿µ`ÛJ¹ÔÅÑO@âIQ>̹W:UnÛ†lŒÛê&TqæÙ¯Œ½abƒSËý€†66¼ÖÅ»Oy­ »Uaæ g‘/fŸÛcʵñ‰d5â÷oœÖ©UóéOH¦Å¿äÒ·WÕ_Ô妒íÔ÷‰ÛmCÓɪªê¥6hAñy¹aù@+þÕü$RPÔLz}IGÍ»iûz³;wüy:,ž?Y…÷ÛkVôDT¬ÕÓÕĹo—ž[ÕÔñzõtt†¥s*cò—u#Åž ÕÄüK^àQ±Ly¹ON`f]*cÚvbS©f¿ NÏHlÐ7ýx¬Xó‘W-„‹¡[µ §Œ¿ó¬SsŽJߕ֖…‹»ey{‹6)ÈÀâÓÔ¿Ô] (`ÈüxQúö^––6Ï-«\4s¡ÈÖYÿ^˜¤ þ§-ª³e-t'»ìš?)¥Myzù­*P)u óï‰1ØÛk7…ÂmÜÛgwZœnK óøCÅݼ‚a<ƒíî^ï¨CÒ¡¨Ö#´\ÌöÕ¿]5Xï7´H‡0ÄK-R,x0@]ƒð|[‹JŠ/þ[ô…âI ŠOàc]/A=Pß xÔ1Î÷]>¨ÙNTÕT[Bäͤܘß>ýôñÈÍÏ´®êû²ÞL/u¯:ZHLŒ6çë÷½“7"w¦°d“)Z…®”ñØPó„€bb‡t,¬Ëþ…âá æ+ ‚ß:^CY TÛ9æ€w/½ Í@sþD„eþ(ï‘.1œL 6_õŽ ƒÂ[‰§‚@¡¢Óß/¾¨@ûŒN6¢â ‹;`âÌÁAœ¨[¸ :϶©V>·€6á ¤µ2À@¿rÔP:e €Ù]1¸j•Ð*öba¤Ai–ݵÿºÉ©’?÷ñ”žrÁ ·—ÂùÚ&èÑé´d'>¥ÌxÞ_ØXrhpÈï1Í·h]ÆòžM³RËt?-º41, ƒVH°µ+¶ (z½’¦–ßÖ.}{×D~ÂÜjfut ÆF_gz6«b/ádÃIGͳîJͺcõ©€ï±ú×fògˆr-ðÍqèý {¶ñht…EYlÈ2ÀRâ!Q#9“Q{…<2z<§ùA‡{{F¦ºqRdm°ÒS—s‰Ÿ¥³¤!ñ? dàoR 7ÇûÁÞ=®ù4 iÓ&‘мcEó±<ƒ7‘·¸]#üZ ß>§ÈFZââ²ymh´ ÅEÏ$S¿¢ ÈQ2·ÓÜq¸—Ø·KéeÌy®q†±ý™©]«Bo7cÈ4—ö¡0¦GdíÅëf Ö-°Ëî<ðQ8ÃØ/V™йqñssŸ˜_ˆ ôÎÓ½Pg×Þ{Q• Œzäd'T3qªu³nÜÚg=É×,àD éöG| [0Y¤¸j ïõ¨^PçÞL¢&q áRŽi3Éç+ß­o$>šó­¼`5§ºž‰Þã2æ)Nbòº·ÏÑ£°ÚšIES*nŠ÷KQK?á­uKÊÖ^‰+g¢úô|SÁ¾seD¨RSC·¾x,úÏð+MVç¨`[/LÿƒfÕó7<'ÓœÜîpCúi`ñEùkâÊã wAïÿCa‰ ¤ÊÞ¶ÇÁ¹å+µuJW9ÕÕú®”ãMœ‘Þ€€ p\œ/T?" @]ÿ«dÖü­gúäehg´KÚÕj*îbp³ñ­Á~1%¨w¶¦´ÒKTÅV‰¼ÚÁÖ#´³‘Pö«9u;„¿¹WEßϵÒå6ÂæŒÌÿœ2ÊYµp/¿ea¤§H'><ÿ'p®&œ²Áåvæzh— RiÊKO#FÜcj—Cd×Á¶(ô¶OS;hˆl?ˆ$áY¬&qìg·`…õ„¸<;ÀY·ö qU{“,Γ ,i=A%3dgf$rºN_Q9fœSªé;Ù_œNóîK¶lÑ# …[¢ÉX% ƒ}³äšã èòõUæ3†€%*]úش˪sªÔA#0ÌŸ%± /ß¡ÙIUÐpñƒŸå&@Ɔ¤\È]óáS¡£õ!Zަdž*_ÿÔ™8±ˆ`xñtq‘µÍÖ+¼ç›¡æ¨ý?üu&a¡- x*äÜ,Áؘ'SvhuûéCÏ圥óQ“[{Œº¶ÜíEùSq£B àå %¬Ii°WI¤VìÉze”¤º_¿•SØ£_Ö&´%ôÂè&Z§,À).¾³ZÏ麆 %†æ˜JòXÕ(u‰H-âÐÅ6a¤®ôâᶬ ñÍœ’ø.ZÃ|9X[ŠD;x}0¦ÎÅ·º|'h/¦:Z6ô9â&3äð<ࣰ¼/©}°¸Oò0hE‚¥ÉA¾"›7é¼ê?É·k1(_¬R">•ûèí¦1 ¤¡ëûè&÷A9¿ fB&ω¯æÄ{¼“ˆpQÀMöóÄ“Õå*þxž¨g”{èç'bždG  bc—{)[…Ç‘‰Ý²õ NTI(Œ¨™b‚o—Ž5 oÃc¢{䟬¿NEyÌ BX©°d¸6×Ϩ( ¨tè›¶cÒÐ ÈzðL7 ‚Aðñ4§7mÌ…?§‡5c|eÁ9¤4o ¹8@í2r2 °wìâ„vÑ|lÛ¸rÝxo¦‚: u ÈwèË|›õ¬¬ÛØ7'ù½ìXùec*#Þ¼çJ^˜·$’­B™[¤Øs^–ìüÍøgm—Oòe²d)ÆVèVPê|¬âÚ¢Ræ<Â/ã<à‘žµ÷ÀšC“Ú‚†hPÌ÷vá²í]*ž”É÷hdø4˜}=3=9x5´Lš»1\ž%­œVr6víÿ]²Žw0*i„ƒB1v/rD˜û3zXÕ«±S ‘€¬ÒÀ%¿ûÆ0-ô‡]Z~µÚÙzýŠ„øÃ1ØahÝ4Õ§X6€/HöU÷»'Q㬠:âB52-³pC8«b¦zæ¡2µ ­ÆÇ;²•’¹4Ô.¤ýXæxFÁ×â8¬Û ¬>‹øi|nq(-H¯Šd­i*ÐU¾¼)ÛÁrGbÃ.6jØ4Xñhq…g‘U!pºlü¬ØÌór›xö¨»ƒ§h­êMÑs¡·øÂ7Ã;HÛŽõAQf‹“ üJ:ì³…5ß« 8n•<¬À¤þB,ÖuOyú<:ùÜц²baبfil/ìŸeD*óý†‰H™RãI7‘˜ë¡":  ö <˶ó˜Væá#pÇYl¢')f›¤ YÉ3¦ÙB’;ÏVÉÿ4Uéà1VløIAvÕaÎí&ÑËTUcÖÖr_™½B·€S˜>¦[ýQ)]ùjØP.Ò0Ôv¤ƒãîзî¸û‹€¾H‘{Ý\‘ÎÊðŒ†ºìÚÍ7à?ë£g‘ý©ýšÅIþñ“ÁÍvFK…ð O>6b z¼¸Mò¢øak½@E±EÁ.Ý”§‹2Θ9Ãðé.¼¼±œYŒ<ž‰;kèægH"Ñ2Pþ+22/q)ãIåÏqÍЩ¼žÌÒ"Ð9@úާYÜõ‡¢«WLŸÅº8ÂÞr¾=v#…cátøØå¯\—2`®8Å‹õ}ʽA%][Ù`Ž"#4Ô VÈ3˜lw¥+=ðqz•Å÷(ÑQ–¯cø¥{n kî:¨)Á! É÷MÁ<¥z—ÎÏT’?“Á¯Ô .Z]€ßûä娖E8¨?ÂŽìàï^+’%µ‚Ù@ÚSÒ/¤ç(";\²‘ñ–r{äÕ•y'–ÑúuþcYů–¬dé’ðùMB fyþíè,~‰©Š«z:•š‰ÐU;¶ ˜K@”ìÂoD >,Ñqyff.õ§µûø„Á7‹›7ä6D"Ú¤`-rX@¥i!à‹kžý¶Ý#ìŸ)Cø¬Ášé Þ.ÙÅê²®+cQ;fI¹¶\Ù3oŸûá’øéll•Ûd%Úº¹ÿ­—þâWnF ëˆ|f$¼jzÁ¹ã‹Âܺ¡êÀ› u˜C&û‹¼4‹Ëê¬cž=E„Nz`v‚{þX][Œ'©ÒA¹ÿå‰ìn¾YÑU%"Ä'Ù‡ž´óɾ Ü…:;g±´ƒnÉÎõ7¦TŽûõâ1]“µØ¾ŸßtiŽ];ÈFé=Dòø3Ed‘YžßRÅ@2–`°NªxÀbH‡™ñ©GqO3 )\4P\DüÁ&ÖR9v5´uZ/ÂЫ¿ÉÖý?ƒ¤ÙçAÁ&9ÌØüxQHÈ+–Å­²µWÛ•<Ä«Œë%ÒP-20ž?/Æ .§†tÛeqTØv!Ü£ cTŒ^!j<ˆ¼F6ñECHµ=ÔB–›õ5P–&}Û6Vè  {B ™>MQ%ÿT Â~ö˜Øf¤lrx+DˆŸÍ¨½ÁB/¢ÙñÁGˆ¨¨[–5Â1Ì´²-yæûsÔ<ÑÒ± ÆäD“›³ÈÑ7,}›6ý¡ñÍ» €µ„ÈÑ”}HûÑГõ4 K ÓaÎ+Ø×Å8¼#ÉRý²i两¤K›†ªƒ2äÏEì|lذ!®YR-‚e¨7Yî‹¢Z‚u3‚~“B®Ô“'v{ùÙÇeCRj ’I(’~ð-íÓ?ÌÁ鸜ÝÒ!<ú…@Áø‡ÿýð8²t=­¼l-¡­ðÁÒR¾}™XKgÓ†¡GžtóžBÓSL“? _Yî“éÅu3)]‚ÅÅ¡ûú*|!ð”_ój$š-Z»ð‰Wø¥QE™&¶¬nXùíxÕ>ºÖ4«á§Ê†ŠJ¬Ò ùìµÿVîù:vÌÎ;è¯þBMòZ‚—RoÕ–¿?~ 2²ã ð`@n ²ðÜUdzé1ž()DÙR"ÙTën¼é‘ë· úó4ŽCÊ_^ÎGÄù פ&lú•ƒàöë.j0×ð9mùê*>ªnv°OX·qëTî뺲ùcŒ, VÖôl´òêÄ¢%c;®U›†f/êV‹{Eú/ ÞìOŸÁglª™¬< ÑE ¶Š@'NÙ4U¯¹õ0€¦n£ÑHçÍF¨zŸ„qCäXÈ·Ný§„í–,w&‰3|Ï–¦Yá™Ä2%ÌïÁþ9J†Dá,nw³ïºë}µ—ø;ÌÏZë}ä£Ã/ë¿‘Ì‘ÒÐèÔ[Œ?ÛÜäkÁ{©³„K‚éöÑw#5¢cûæ ¿Î9ÿCz9,ËFW ,Ñ ‚úCÀ|þ&˖ȵ`¬Ù"ë?óYS½¼~ôV[ŒZ|žëAeÎB‚íçîïĤM"¼ø ɘµ`=PöN7œÄ€P%qš¯š1³A.1z£Ýðai‹òvWOKð“õn¶ì­^ü½œœœT!rMxgLéûJ¼4HòÑßš—¶Ò€fWÝh%Çð0Áä®®¡1=>Ä PŸŽjÀWHsåÊxlûUp} ‹$*±0¾vÌ!*A 6qö®R\šÕù^n"ÌKðÒå"^\’a¶Âƒº?Ûª%±³9Æ l,Uí•ÌDVÌEc8üiÚ}£ ‚üKyOØ3±ü:i[ÇGèsÅÍmTføI“mPlÈè%‘Ÿχña Í· ôS}͈,x~Y…éâAìz˘}¾ªcå-Í¿r8¾FŒ‡¾3£\ÖvÆ)>ƒ]Óp@aÔ¸½à÷ÂÜF‹Ïñb‹ùÔyºÎé\©ÌAÓ NNR°Ñ rûÇ'±V*v•Éú6©›F=¼Í©¦9¹ä8Çží2ŒùO.뫤ôJÅòÛ³4²QûûÚÛç:MoBν]á"&Ä,7M©$]8¯jT„”TÓ˜o·w€}-ì$‚– IFC•agÃHB<¢;ˆ0­ç¾†à6VNÃSoBÏ_ƒÿy\ߟ"h ®žø›è?žÐ¬ŽÐÔå9WûúK”°'æ9r_¡á3Z#ƒÀ±q©r©Þ€øê®Žß¡"«´%wé¢YÖ~G=YãÐßDØV1#¥ûÜ/…xîïÛ† LJR·ï~_b=ê7B,–Í‹¬2Dg§¤§ 2£WÀÕM&^"i¥7²– ã|‹üÚyTŽ7 nÈqš}À¾;Çæ=ýC~Â/Î#FeîiªP‚y;(…GÖ$oƒuy³×ÎgOàÝmä4h€@º^Eb¨Eþ¢ðÍõÄ Bê×/g"€¼üžï4ÊìÖw…gYëcä˜ÈÌAA@¿Ïäïäåu¬Üv”ñÌï»z¨’eCú@„õ½Â&²sG@IªÏæC†ž¤Á4ô1³»fl[:p£º*h<ÐÿÆÁí _³ƒYæ Èý½)PÌÅÕÞ"½=Æ{ŠèG`X•– ¹‰JKÍØ4*ÙÁ\÷›WüPðØ.@¢W÷“˜Ñ1Ìé0˜“óÁ-HòW9 Òÿ/ ñÂÞ* àô~¢¢=çþ35§Xò6µp0üÂhPózÔðœÞÐîˆyªO¤,;t‡‡”à³ÜVøÝñD$÷‰Bh=½²—súÃbVßeW4o¤¿z‚ƒÌ/Û›TìZ\§àßB‘­WИŮ– »v’PÈo4,2¾…솫㘳Qß à—¥¸0C0!¸Þ¿¹Ã¬\´­ˆìöf—ã´?±Ën ‘zsI) ÃÔÀf­TÞëþcŠË^¨È¢ûãv u!öÔ4£v’ðë÷0ðWd ¾rn™»t“o9VT9O²ùÁàÌùjÚ¶èsHGðËŽÝ;S A)ŽÆj[N«è´åg¦@–„ÅF´¾€S¿qÑ£>?L–~ÁB:DoêVÖàÀ¸Æ®JLàií¾Unò‰“ÊÿS§%±ÔøÝoëúÙ/ºŽMŒú˜ÁpfÛjdHW=E¢uG¥ƒ¹áFëôÛ×X€]jq²ë£˜BôÏüŠ&ÌRý2JV÷nv+q#RÎ%°€jk/¾…Ä9ÿÝW¸õ„{ÅFÃÑ÷D‚ÔV.¼›y7(.ª´vó€·ßB”“ZŠ9<4RnwàJT=W#1M,ñââ™ ßqÏNÙ ê?fºÈ¾f%ü‹øÄÔ+†demî …® ×CùMJО¯Úü;ê ]^"ô ƒOÀT«öÕp¿x.TÜzû•r^0×2Oœ?ê ¡+âÈâðÕcÀ nžèVo¦¿¬26æ)ÖäjÂM¤*ÁÔˆÄñ²ÆQcêX˜°-ÐõËŸ¤FŽ.óü·©îŠk7ÅÁ%®cô«Üe¬ÝXé´sÈšµð`¼’ —ÇK=¤„t:ÖðüŠvcD€Ë®nÕ³ôcÏ®ý¨ª@)[ªª¡„¥+ºNÕSdϳ®Aƒ6Îâ?_1ûÈF{m©ówÀ½õš SÓ_‹EðéJ2äÜŸhXÙµ>E¤DìwM‰úä¾2„pÙN %?TžóÄy6q‹î§(凙ŠÍ„UšC¥„ø¶´Ø^À é;°æåTZçTQà–zvԖ몤ÅèÅ¥¥æé§pNó¼& .ÓÖÏ­Öhïtò] N½p]˜›sc· ;]«€ÏM@s5Ì™o¤ò+ ºÿ@ä ¹Ý‚^ éL–Ÿ´±Ò•ÜÄ@°’vœdÈŒ¤ÃéŽ5b“sVVÈ@ Ô¤Žk¼Æ¹Šµé®R½…ڲσM»UäÛEùqeý‘éå’ÖÄi$Ë{+¹­'¬£¾3Ò]uÐ Ýã?µ¾û0ºH„öÍ£+FÐÙõÏ”»¥ˆÝíîÿöRiëÑ•ôƒK>ðmØ8)b]C6î~ïÍÿ™u»Å5„ð‹\š¯"³0o¦Òc¼¾)'h4螪—jNœTa ù‹=žzÕjã‚”Ó(jQ< !î¹ÊŒŠH†e3Sܪ (r >åšH·¶eX fêÆõ‹#Û_[A>,|›CHØôxÁzôQl«,©t¯y»«ˆV-O«™Çóûî­’ÓµÿmˆÈ*”j‡ñ 0,ø“›.¾.“t\€·`&ªl¶ŸÂµÕ©ž™t¥§ˆpôR-]’­cªá6÷ÞHǵJqܱô”˜ h™÷èåѧ«þ Ô C!N±òÔ;šòÈ*Þñ5ó!Ï oú¼¶5ŽßLà ÄS^º±N“ßF_ã£Í~Ÿse ¥›¾Êœ»¿i %Nͼjˆ£ßk-¿fK`(Ø$RѧfÇÙÛÛ}ÝmÙDëtSEŸ ¿"–̼Zc  ¸„äÑ&‹?¦ÕSd@ÒÙÉ#3!uüÀHó2Ü®%ÞÌr¶ÅhŽº²)^­WLQ¿½µqûU±t¾¡]Ád›"ÜÂeg‡DÀ³$¥üåŠH¹n)P¸¤qÓß›¹î©$@ÿ? ¶ú±Bxܪ} \ã )OtfKÿ]ÆŽy1·V¹\>S+äRró¡ó [/߃êÞ߈N¦"ògÄ›»ü窩9œ‰¶¼™õ ± oÙî šÆ+´–{v"=>›b •÷$'+-„6l&¬ÖF»Û_gB½Î÷¡"7*ÀtåBÀ%h1 ¼”,E˜ÛìÜim¶û{\ŸBŸ†–R²­ýxsè†ã ·ëtßôû›ut¾o`±G XNü—î{ë zˆ÷ܵµ·ßFqf¶ù[µ#}í‚Hj_µ lKã}jáFïhæ g&¢}\Ö{ows¢W tŠ&…´¶ê¢–¶ÝÊsŸIT†« ,§>´¹Ñõ—ì‹X¦ˆ »Ö›Œ…;¼ŸsãgôVé¼Ó™Ë±'*0yõróÁ´e"a­,Çñ­ ™9 e6¢>`íè¢LÛ;•ÿŸ¤Âá¼ôÒÑúð~ÂóRˆÏDBÞÉN:)ž|þàœÆV‡äîi@îX¥ò敵X ¹X\ìRc©9 üv‘…rÃm;¦ö :;yD éI„’|ó<Ú1€Xé±Dø[þqƒUÙdh@bÝ_)Ë}miŒ¥l~™í%«t+_®ŸUePEÉYÚÜ$žêÜ{¶ÝcGJ}Ä/÷â‹ ˜Lÿé¹ÿ?ø¹ØtbåLP‘T[÷^!•wÜú1€øXu‘ÐTMšÚÿÕ7ê®ýd;¡ƒô¤š`‚D­Þ¡ ÌŽ“ðokï[Gò’U'ć|íòÂ*ªƒÝ¤ÿT>Q=-Ô¦ãíÅê‹hÜ—qt=—‰HY%˜æR» S®ûƒÈ„Ïf½WL‰È­w½±ÃX7l¨.cœ(¬7ó/p5¹•À«2êý|s Zެéû¢÷)«ChS5¯üÓV»Š ½R6 ùÇ‚xšwÏ^Aë…ë¯ÄD<Å2„FyfqeŠå† µ2ÑmµÆ£8œ•VYÂ… ¸þã·_-Eæìrÿ<æ WælH Ñ϶›Ä É£–4 .ì(ëõÂï~·¼[¨ã†µn™Ö©"OJ–œÞÓi»‹VÙâ×A ò¼²ù?È5®%=kžŽÈtò‚Oºœ]>Ë‚rΆ_y´›— Œy’¬¢ÊIËùÓ\l\ð²w±ioWzók§ÉFò—”d¨0=&©}ô>øFôûZB2H?´¾ÐæþV&@ƒœ´Îæø)µZ¨ºÊl™“ùÎleazû<.}̈5™«ðX[A°Ü©ñÞ¹ˆ½mˆõx¸mo§û®ü`#ñwà(”À4 ë,j¯Â˜®å:äy¼goáëzŠ${dN¹ÑjæoV—âåmÓ·¾I#ºÇä¾ ’-4ŽBtÕÖO^áU6õ°ÇÐ%¨ƒªýØ6ý¶VÂ6¸ ¨‹TdgU½…6zú·ïÞF,ÐRÿ{”nÞú oe>Vs»"À%ä/̽C{à &ê •‹¹%î$“„<´JÙIø*&c¯±ÿþA¸³Åk€¬|/X5îðSÖ/SÎäJà%má^æÂ±&·:Ü6õÆüi.­a#‰’;˜KÜvÉ,‘˜3CÄBêZpv„ È2B[îìUêé´QÇ€ûW€È¢ ˆq¸ËÙXþC"—þ¡¦»‡ Õ°œVÜTgöl–£YŸæÅŽœH dšÝ;C¥—&iÜZ2ÍwFgU°ƒ`¥±T%Ûì7~ÇÄÐ(Vgʯ êKgÛ»jxR,U[°A'ª%ð#Úu'±šwö3†zeƒÊ„÷-4 +Ô.a®egO.6…¥G ðŒg³¬‚ÐÙ¾Òd‡sžÖ~ÀHrßÑàò“ þÅMðáv߬Á6¡'Å]HXq¨²´Á0ä=úK*Q(ž…ec¬¦•B.¸GÍw’›ÂÁN…ïÅt×–T… ]¿ªlCóö™ñ¸:!>ëù¤¸eo‚,2Öqzˆí«¶Ãǃ—Ü|à”(HœRØ~,£‚á,e^Áv%̶_ïîŸÈ ˜>ˆzë»d&]ÝïŒYuŒÉ£þ;ŽõCà KÆJc·û¬Sƒ°•öù”UÚeÍ;}"‹…û˜Þ­f‹½Åû`Žÿià;+—@Õ=f µ†O’±8:V¯l»B8¯i7u5ÕÑQ%†ŠH)÷O‘Û.-`û<|nÉŒ¥±e¿¬'öí V4,¦„tb…à ú  ’yÒÃõò¾º†º<îÞM[@{£š•ígËÜípž8/Ó+ö\f€›‚ˆ¦jw·/žÂ5‘‹Èy=û)ÝqÛÖÝáÏåÇ–$-cDqÐòÀ={Z»Ä³s~TöwHßDþOðQ^=d4õõJšÕvá¦Á|°ŒÞ@‡¢Cu}ä;Ã3lFQ,ϯùHÐÈ…nJXç:#v"\â{Ÿ±5Q©J·gƒ˜À`ÝÆY¹Î—þªRà.WúBæäÄ‘Í(Àù¬÷`]õ²Ìÿ*ãö×wÑÙ2;û bÀ’C~Fñꑳ• V%RáÓ{´É^âûGf|͈vð°¶‹W63ÎéºÂ+©8ÿ- Wl7zÏD¯_>^nmߘUýÝÝ|ûÅO/„wÙ WïÞ¥›Rð”FK|ªhEJÓÊÜxý |JÙð‹íÓC,}Zš„”¿Ë¡ZHµµXCñ"u¯BÉõµ0z¤°ŽS[í1-ëm½øÛE±¥×Ç·ßý«¢z°ߛ˨³Àì“<W¦¡¸óµP4FŠÛ—pÞku u2gH<ßøgÖ p+ûfæå lº-°Î®WÁéß¾)ãûg¬á2A$. 'ü:^/¦â¶³ÿÚþ:/fœ• ãì*28àªXÕ2ƒCª[í&Y¦ö¡àÅ®ë¾BŠŠ -ûltáºÛe™¸Ó®ä~ì®5j P°—ø.Ü,ùϺž!â²íÊ–©“ ÿÛ €P (ê‰ÇY,˜ì–È—µ`uv«Å=<^o^ ô&»Ù.¤°îJDáÏ‘4ÕO߈╱Á¹ùê6¹ÄµQœÅcË[­¾dbQïðNºÎÉR“Þ=mx@Yû:Æ¢®¬ž|$n¡‹·ñú®$?7ÕVœE–æV*‡ôs" 2E vZ¸ ‚D¸´xD¬æ¦•\žt–bõªqü!U€˜÷áÖkŠ1Y7[~“}yÅï̳: r$}ñUÑojî5bï±y(€äLaëB³…õGô»U+&&½+¼¹’Ò±üîë}µ—Êœ+íÚ½ååœì±êhÐ¥Š•–øöôæ÷"fI;´q‡ÓØÖ¥®?Nnv‰Oš†NPÙ‚°EnÑ=/Ʊ¡ÚÃt Ã&y8ŸÜ˜å÷{áÛŠo÷B;î?˜Ë³ÜŸÏ&ÞÚHºˆÄ5’Ydi,]¡Ao}PçÂB«bI8FÇXíD³\ |Û/Y¡)¨›É·pŒÿñYK´'«i¡‚¼§ù‘ н€fÍE¸<¯\$ÅÚnJ꩎°Yãꨈ}’5 )'LŒâO‡ÿéch(×îÌ Ž¤+ÉááOøn„På$|X3=?©£®&‰4ÿù†ôÑÚ«ù¶jê«=Ç!8:„Ë(Ë!ÙôáÕf‘ é¶‡ZÉØ¦ÛI‹ílÖ!ðƒNkx¼fû#²CD°tÄU;ûHHR{±‘Š]n¼õÏ»¢:yç^W‰P†F™…Âߌ$¯CK½Aÿ]í´DXŠŽòA[,˜« à!¬Ø Z“ÚiÀÕyóðB?ÿ¼]ݨiÔÕÐHDÿÄÿ ŠÉ¥KŽ˜þ/[€\<ß™wMÒln¢*+ï'_ÂÓ1Ì)¸úòyç)ó7÷Ò¨zêÜ›ã.È4¥¸¶†° –‚cir–éW9$=£e#ÅË$õJÛF2|.©QÇK¿¿hykQâHѽ¿šZ×h:è±ú„ Ÿ„,›úl)–6p¢)‰¹<ì—fÏeÜrwº:Bc@ÛTM™„-ÀÑÛÔ~LsŸtZC¶,þ2Wn}>8Íèëãê>³€Ïxý9KôàžšÝÔâX¡ âj1éÊõÝz[ #=¦I”—1úNäF¢¥Q^:5¬Ny‰j+E·ùÌ@Å!Ø’Ž^:‚+· k %ì䩉w^ñbL·ä6ɈhR(Í£sCÐk­ÞÇ¿2ˆM Š! ¶=µžøò­yc Oíb¿%r±6ë?\ÞÏp‚˜{¹ER¿Jñ·Zæúòéhñ€špVÔú\„¥¶5Ï©W ·jS›îöhceDÆå¦’á+%©F(IÁ56ba#Ú–Ü”÷z¿š%ø5­O>´  Ó{v@[Íû2Yâ6s·V‚~û s½hƒØ…M x¤ùJ‚yZ FÁÌX‚?8cnà¶´çEiùÊlž&í›ÈŽ:Æz÷YÖÑük/ØðûË'‚‰ºX!÷-'ÃÝV](áË ä°;áhuEÙû¢ß_öM ¶w­«?”ÅöáwÛ}‘àí¾¿sžÄñó±QóïßÌv#/<]od#uŠÎ¶çq`ñƒ°íùµäJ Ïœ3¿„ŒÑ–#D’Š¿Å‡.Á&oä kÌ}ÄÿAÛùßN;œ¬xîäo[oŒ‘,zÞN2ß/ÕrÚqgÆ óžÜlæ-©W~ïTG)¸*#iR+x·ø<÷h/,îêXÀi'&þà°íãD’N¼Ée#l…TÊš§7±#ÉWÒ5ªÝ§ºðZt…¡©°ÎyËýŸ˜À .x¾@ø.F¼uþ¤³¤ÿŠ0¢Ê©dü‰O5ðÀ~Óz[ÄVbT6þoß #ÜK‡‘T:Ï‚ó f÷öEZ’àd0ÿàë<†Q¼´|蘾|?âoL_ür¶]hˆËŽaPý&ÛøEp€;G¦wé–þU­PÓšÈ/ Ý`_LE°eªÍM½qÇ%m– ðÙ¥öAJ• º->m_vcçIÀ¼©vø¶@OH€’Å÷õçì!b°Êd1 ÓYæuOªxÅ 9'*nöâòŠõ%^h¹Òîs•ø;4·–¾®ñ‘çµ´y/ ×íÛuø¡Ð¾X,r½'X®Õ±)BW–™ŒŽhßVú6,j¸æ™DB kˆ’YK´‚ã¼üF‹8R<à5ív†W2#+=‰™òøÛ õbUiçXÁ7Åý8´j‹,ŽÏ˜2(åÞMõ0ãÒ;AOúÝ Ä$'»àÃ×qlX½™nÙåæ1ï*¥X?ù2yß ù1˜€t©ßŒ0ÉàC…XË~Ó:Ÿ&ßm¿I7ª§ÝÊ#]’mô²õëONï”E±Á¿Õóó+Ã\J&k£ƒ¸xZÛ ý˜WX5o:X²^bš5¦QL™"/Ò¿Tçéùu æfd|'ËÉáuø;Ap£ËÑb/”š‡`‰'$:;ϼÖcžÀZL(J±±DD(b²6}"‘ˆ 3CSCÿ‹Übb$¤¥ØœúÊ@Ãôê?BþǩՇãk¶sùJÌZê"¨ëÀnò+&ùDeø&^—J­ŽwŽÀÈ€"ºþ ©!ûŸ68>\Pâ©kö¬bAá?‰g‰ªa-áÿÑÏõ*ÅùÄÈû¾ÅÓ¢«¿27RS´1:px—~4i•k lw°Ýç3ð¨þŠ-Œö[‘pVR/E ]–€L^H°Ü$_ÖIÕu„CGZˆV¯vñ¿ ¼µf‡ÀÙÊðÈÿ<èW ¥…­Í Øø("/Ð',# ”¯±û»…  ‹´ª/u&´€ï »ƒþ|¡ó׆ӿõ' ’òS÷öF%GxÕæœâèeÔõ‚Þ—jн´@y”úmÙB92—>™ÂSŸ$ŧ¼Ž^‡‰u4#›A5#§W=B0Æci£/©&×…Vž-˜DÈÄ…³´'«X+€ÿDm„\»7‘³Ì ÖãÄ+‘«$whxE=´öï8,Í’HÏF}ìr W}+’ÞGEq8MW÷¯¥¨l_ ©{Xþ:Ü[&°®¶PÀÂažÝ¶ãÇ#)fáò ¾ÂQ>W½µF¦8š Ï€k¼ÕÂ)¯<¦UH†^?Ss0!ò·ÐP‡ÔE!°HuAðíî+• ÐDrƈ>c¦—/óÜhl Ô§)jü6’$èxh"Á˜s€tykDbäýã(ã\ Q’¿–Ç"¦)dßÜc82û]„´=6Y ¦ˆôsœ>âÿëú* TØî _˜E² ÍR–öBœpoWóš«6´qV!lC~!°×Âe|ÒÜ ˜„°¨Áž;û}Ãе€ØÂ¢ i¹j0Å`ò?qÚ5á¿ tÐdÿõ  6©Å96N—(QÀÝcqG.ïñG}Àdúžù×#'aßн’ <‡ׄ@Iñ¾7Hœ²cÜ‹|gñAex|'¥'­VéžÁ Ÿ÷ó;ÓHHêâ×ëgÅ´¡ŠÄ‘I„ SΞŒ´’X[¿½ù|¥'TŽ?@ÆíĬr_Ý’sÞ‘¹Ë‚Þ{yïOüÀàl®ÛT¿]Q—+þ‚äºC½©²~?…}¯Þ2©ŒE“?ÐÃK`Ë”@×o–"H\ÖŠ_šòá9òK\ÓÃYô:‚u|EÖšNa‘i‘“S òØ©ÃD25ë )å[SÌÊ{ÃŒo¥o øGÉxŽ ø…ÅlÖÈÍ!JÀ(X®¨ÀR .á–h˜ópn¤@qaQqFÔ÷’Rõ@áùhÐÁí_5P §~nÛ£ŠVúb®^Dü!^øoõì]r¬Àv¢ë¿Á¡Ó]Üúëë„ß'Žƒ$Òš¾²ÏÛ-2QKXnw°˜8BýüVÀSi ´'‚›×âUÇÐêM|†äYÃØõub«ü‡ÿúˆëGYu<ösõóKj[¹š+µ ŠÎ;‡wØB‹X8w Pô9$%T´ãü(_ž÷ÁÌ¢øõžë¹£pùõù¼X=·Ræ¾sö§/¦ Œ«´ñ>ذ1X ¢£#">½ÆQ¹DT”<å>üÝŠž9Õu5J&\ª!éÑ'Ù˜û1vW÷P>p&ˆoéN%ôŽ ÉD(6ËN•c”,÷ÎæÉö“¬ˆâ‚®g˜Ç'M9“ÿ,;á§1ávr´6ЕBì,ÊŽaN%£iO²6Ùot-^‹<¢Ù9]¸yJ>Œ=yÓÕðî¼²ÛþU´Ï6 dº1-Ъo뤄¼‘J=¼“•b€rm¦ê&‡ç¡ûçöç|]pÇe-~kT/Õ×5´ÕbùH/]úÆÓÐ|ÐLG~ÒÏ T¯´µíëXŽVéÚª&û¤tÛê ÷ìØu¤‡ÇÂvĵŠ^œål¬1äS?XDƒyRžÅã³Üˆî³2Æx:¢ù6þãDv´&H›."K0ãF<“’/øÓ…˃ö)S¾¹Ùü—þ¼_LQÙ_Æ^ÿî–M>a‰¡“䜌Ͻ©oõ°Éú8Á‘£Xˆ—Ô–ð P‘zo£Ù•çë”ë©Ã>à¶àØÕ"ÖÎ]’á#ŠPËÂv¨yO/V7~}JÇIM ¥3uXË€ûõç‰JÅ>û«,Z£¢Ú÷±?Þ–\b3¶îX9i¯TÚ†EõÎÍÿaÈ!uß’²šD$I]À¤b]€»¥Áä84~!œG¶á·y&vêíB—EÉlc]¿6:‚KÜ‘áf? ÿÛs]€¦–S'®r¨ å`+‹5ãÁøW»+†n ¥#UCþëÆWæ$¸C2¿[Ñý-­”~¨¡ZŸ&à4Ó~ˆ£¦Ômµ8V2(Ÿ  <“Ã"›[¶G`{d%ðùž|“±XûÅZ.)¦/dÖ«`h…}Á®|$Ó›rëvHÚ)HaÂÙf^Ϫ)ôö×ö6Ôe…¢€<¶ût‹ž‹Sþ°ú£C/mÇÑœ4¶ ¸û3ÅOªÕ »ÛV±Äø˜xζ¤)2öb¾îOKçÿz¾KßÖí¶tœ8›JƵ ™]@ÚÙNŠy(Ÿ¦rhÈ;®æÿÐ Ú:œ4À3ˆ¶¢Þ}š]im4óõ`§<[öè’Yvòã J(Ðó£õøÝ…ªéš©ÕD7J¢¦8 ‘Öߡւ‘êM”@›—7ÚRŽ+.ÝÆ5 c©º$«*ˆŽ) šÓo(œ²ÆhÅô×OæŒÄ¦žä5’YÌùãG/ &O¶1P‹„ºÙ_‘‚»ö9¸!\ÿËMWŽêå=ÿzÇæJÄ~6\±A`†lX~Ínø®'‹-ÑøŽë…–ÕRf5 bÈÖ¡q~ø>þb¸³ÂÃ}ò›íõ˜Wh•PëCyÿÖj2¨/Ï—•\±âôÏÀœFÔu–yô“ÜbòiQ‡’r" —ŽRˆ ø4“øb)Ch§ ¶K6\úô¹¡‘mBìÃ…–\Œ‘ïbûW÷”Q¾ÈÕI›µl'ˉ€ 5Gž ‡÷è¡Ï N{ñ:ï@ì‘dݵ Jl)_µsÛ´HGܦXD€þ埲¤èÑ ;ºû¤´µQ·áä• þ›ÉjdÔ:ÁÛ­ê¼"ÃÓL—üåD&FD*òÁŸë—‡-J?÷§¦@Ήî}z-šµõ´§´˜M[·Ÿe ÀN±<…†ù~AîñLϯf/õ$\DVÀl“Õ¾ &bÌÏ^#¥<ýMzZGI£¦‹w†Vy%Y²•åÐÊ­ñeëÒ.š{Åoóa!7u,_¾¤*}/Ë®(`ù6½'Uð[Ä&„Ú¼7ºiv72•6¬•Ž©·'¥­€)+_a?Ÿ ®Ûâr Ùe=öK+bòUWSÚÑñ RG1Iò_Y$ °G Shh}C¥›ÚOyv È•[NðÓ<²…ÈIöd]ò“×Ô7(Â8ëþÿÕt˜¡ „ —‰lxÿ<ùçç(zÆg­A–A¥öFË,bY‹HS.gS*˜æà¥ÝV&ƒŒäNÝ}ö–jñ/ØUç“æ×!ã©é8‘Zš (ÌlhÿâÅ™ø;¦Jsg¾;IM\ü§­O"u”Ÿ‚›–úRe%Tï'%>“–†¸ÊÜ^S“l+¥½ÔRäª0:3ÿ¿;Á5«Þç4ŠÎrƒyγîßV*][§g*I %$~ºó^õrTºapnÖöÅ´ù7àJµúLÀ~¿¯0V&°ÑŒ|XkÆxJib壋y p-=Ëà/êØ±ÖÖrcÍUÆyqH7·½2nr‹{•Iœ%²2‰<\©¦òcL5>õ ƒ'&kÌFå*öyÞ;MðÖØ¼¸§I·kvбuµp´H*|V€çWÉíE‹É•ßS­p‚"¡Û}ʹ ÏSAí`•ªeû¬ïµ!â¥'w?enÜa †ðQÛ5 ¨KàóHUF —ÊŒªöþ«»ÏŠÕñá˜ué0è×Oê6ˆ„ĘˆAmY{ýiïÆ“.ñì´“š YkŽÏ¾[±XYc Á pF–#È‹wþØïj™_öî>šÂa §”gÞ®ÆYS×K¬a†Ç†¼iM ÎqAÇ«!ÕR0‚ †„Æ+ Ñd®òÿƒWW¤¬‡ƒœãJ·¼e.qî¤f‹ÿ6M,7øRÔ¢õþë2´£ßÇ7 ø¿q¦ú"‘wJ¤ˆà;«™Ý¼¥ï½eªz€<]Ažå«ÜE[…èbº£m4/¿RϬ͒Åßå2Ë*#õóDû•‹p%Pºhy«ñÝ"9O)ä¸uV?Àbxzhÿ¹LmÂWʹOÆR¤ß}+Wt›ù/št¶TÔÕ7´"îÈAÕ©M W È]ëYC[(1aÄ9ôùÞzÜF]â"¹­À­¼ƒÚ°TBØdÌ:i²ã¹úô .¯ùùz¦ò)ZuÓ‹•³?Î RÃUÕquc’س?ÅHŸÚ‚ù5?K 0(9`!=…¼} ÊDTΠ͵®j¹{hÿ…$4ý©2þñ\^JÁ´ño CçXV~™ Th•l+gä—)Ù&q¬Á 7}¶páY޶UÜ“MUߺ ñ9œ¯ '^ì·¹ÿO‡ÁÉ÷¹\:ŸÏuYŸós¬ÂÓâU‚2<ûëù[2jÅÈßôR~±Wj©už£—ŒEd¶B‚RuìýØdWeŠf½Í"ðÜÆà˜€o• ß®Ýo‚7ñbs)ÿhPzzÞ–ðIó.^6›d¶ôÔ€²™~•©i¼¼NR±Vì’ªáèY@\bÈÆáQÿÆÌy‹óµJkÙCð±R;± xÀA—Cfƒ[iò~©\tÕ=øsJÄòâlõu 6þoFò³½BÍo˜‹5YeŽOB‹ð=CõÊÏd£.÷‹®cè å}x4D»ßÁÈ( ¨v*ÉÒ…ö|¶ÜþÀ­È^t‘ðY(°%¨Õ¾)už…äêeŸ£¨c!1ÖžÝñŸ©-y7ñµõ¬q¢8ˆ®j׉;méò%£` ÅŽôù ^Í«éu‡öVR§7Á¬Øw,ùDÓ„Žup_Û(¨ˆ˜z¯p¼éÆL÷‚I=Ø6›¥ 'Çð\ˆ3y×êqò§w7!‹S"@loýªB‰<8ÄKß¶,Nç{KfS¿ô³`)£9~x½Ú‰’D «& ¡M8'§Øžsô¨ |˦Ùqv»ð3÷dµphV)çî”M¿ÜÜ3]¬_þÃ{>p,¥. î@‹˜\ZÂcûª‡/joÚ‰—ž•iàøNœ„t0À¨–š9246åÝAnÌ'I0ž×g)] 'ݵá¸Þˆ»íf×i÷õp?ôg(äŸ)d‰%îfõ-̘B‰CM³ïÎE p¡j2>Î5’-‡,´”r¢Ýß㤤0¹7<‚%Í¥­Ø6õñå€Â¦·gÀÆhÈÑ}’yiâÈM¿ŒVŸp@\18­€’3ü> Ì-éþõæÌtü‹]ïQ»á¯ 3Z;±Âü$²ºÆ£‚u¦ÌúwH  …ÏÞ„ ‘Õ縆òwÒû’ûœhÄ ²7_ÒÌŤÆy[&Øh)âPØÿînÔÙ ¼-=ŠýŸ侞¥Îa KÖʺZá„¡ðU. ­¡ªÌ¿ñ <©Ç9ÃÆþ‹ö³ÒŠ5¨”ž•l«¾tùµ!£MBŠÚu¯ÞZ‹¸+ì@þDœÍ/Ú‘ `úXK”ÉÈ3$Å'S/páYT§êíµuùÕnýß å“µx [üŠÅœà®"S>0áEdeÓ—¸PkIaMÅŽok<,]`¯ÚZEø¡·d ÂAVhŸêŒF m K@tñ‰E†×õç:2f˜GD‚/ñ±«ÏÄèr­ ï¦†õS=æ&ÿÿÎ$†G¤T%³*£Èõp6É‚¥Þ}sÆ|ô(8>K÷9× µZÒí×Eãq—ºèñA¯WöªÚqVœŒ¶ÚDš(àF*f¾áiŒD°n£ö‡ö'ÞÙBœ=KM¶ÖÝzÅ ìÈ4Ž¢›Ù&E€WͼÞë¡SÌé§¶´ëV°ª“†@P²q•7,ßOI„'Û ÙgŒÅ!*ÿÇA A l¥íxãnG4±>ŸŒM0þñÛɨò[ß¾ÅÎÀ¿‹{_%Zúl§Ýôþ)‚nÒnnÙ)¦}çò{U`Љ£”O§âÛý0G{N°/ÿoÄZÙ­új„4øÖ²WrìAåÅÆâU°üí-{@£µKÁäåŒúÓòB ·ð˜£Œã½íÌõ_®Z¯~ ëí^±Þ_Ø„`F£Â´P»½ã•gÖPÐÔ}}œËi–À{v˜Ž/SÅþF‹G-Ä*+>lC–:6îötèÝlÕ=ÇNþŠoŽLë·øNe¬ž8¤¬¤Ê¦Šý˜8¾Y¥ã©cÃú쎀.D«PH•‘–“Ì|r õ™›<¶¶H}­ªþæ´©ÿ ¯´~€Q—-hã„sÛÆU–Ì ·­ä²Iø§~UlûÃ}§)ý½VJ¡™µ”º¥…d°*ÌøqhU>â–XC"óvпÄk ­óy÷òf¶G …ßß\9ìï¾!ÎÕ€R gÔ÷K¹„.qZ±@qê˜'u‘™×‘®rã!¡AråFà~f—b¹7¯H!s)¦Œ°îŸârò8Úë­Üîi¾ƒ[ÌÞ ‘vð–ÓЮ¦jÁo©DŸ“Ø-uº1€ÊNÙ³H f—è,’âSAUð@£Tô¸}=à„é‘'^­¯O>Ü>Ö[Ó-çXù‹—BËáký7žê{"øpFñ}Õ¥ì–0Y<íîFK %¶wþ/Ž-ÇÕäî­ ŒâëyôÓñ¦o6èàö()ý)€v|†>©ëC˜ßFàò½Á–“®×{í¿—‹Y@‹„¦7ù¸ú;¬.ú,#EL)„„…."Ù%_ÊD.Ý#7WVÎ=ù«±ûOnAÔ †¤$ma蘣þ#“žlÖ¦hqÿ¿íž0O÷¢® <%3{©ÓƒM_*³Ü+ëÏgª48Ê™žž’«{Åg¾Ô拯€i>hVAþv‘‚íRA<ßû5º-+ÂP¤º–äõæc{ä´¬ÕãL  8áÃ]»ƒœd®ÉBZÝ;™Š™™!½ÐÔ3QGýeÈ xó¥?lÓÀ}TÀOäÁA²}3Ó0 F+ì\DFc¡~zÜÏLIÌN´k°¡F.F±ØPWlÎbÔåm.?|ÒÚ[‹gýó 7ÚDYcæ4‡œaߺ}’™ÛC!®¶z±ø¿gº_•¥Øá<ƒLt¢‰¡Y¾òÒaŒj«ôØH!jÝÈTŠ¯ì¶¾sAMêÖ:9Àl ÷9J/pz5ÛÔkæ©u)Oàd’ "t|] I¼›Î¦›Ê|1KI['Aø?í‡q¤7’ᔬÒ*ºk ñ @à6òYƒÄó|¸mr~Öü T±Wxö0–í7%¼Ã-a<úB˜‹*Õ4ãíŸßîYyÅy¥“ö¨;ï—WÇP.?½’Åņ ï]’™×þÀÔ5¬‰Ã .…¯r©;!XÀðóþ¿}tÄ‘Õ^‡71Ííuú“Ãk7…£:Ð$D<•  ¿ãö£ã{|eó“PŽiðD(Y€]œÔÎãˆÛBUÒm¤mÂJOEU âàZý¸ F‰]3löøé–° 2ã~ùÒQ8·áÎ,YñûÇŠÀ)cÚüU¸ý[EVÆ|pÈ£eç¤.zWá_º½¦'‚”…öÒ‘£ írÜ%ò³"ºs/ÏQØ<ÜÍ¢ ”‡–å›/̯ìˇ€í™Ó‡9¤ߊýÔ¶mÖ–ºhcnß’W§< ÀZ^pÀž\yð.Ée4ŸÔšé‚f«bçSvT´rr-—i ª²Æ[ø€ B4{2øïïÿƒ¿Ñ`u" ¢©-kÔ\ ßõ¸ËU_j¡@½h4ßÑÏá+¼nçfÀ`âfp/ºµ/ãGSÖ# î%3œôÛ }|â¦ÊÊÍH ãçgQËÃ{aôÚ+¹\Fr™ŽÂm¯ue'‰[ìYÛHf°EÔÑØÌ®sb!'?jI[}Ø’.O¾÷ÎÉ ³¤I7ùžDÛ¤ü3y“¦xà2H1EF^7F˜G«þ':8ž$v™úlxî˜ó=­WË(…Š£3ݵ£þÑv·ç\¸ õ$.<åŒX²Ëoò\†‡ ¿!3„ç#q†årgþ½î)Õ)ãÈ_‘0H2$Vv]I;rnè øº…nÑ0Û Ï©«¦ <˜¿²F·ex\¿y¶g§M‡»„Påí\Z ÌžË@¦úê†ú“ oAg· ùáñ™G¬ŠshdíÚÀò˯Šü°èðÔ(Ì¢IÝ‚»x(×JôÇHb ¯YxÔÙlm1Ö"^¿h,Kƒ«PñînÃûrâ íb>ý”îáÏ_Û@Úaúv"SµUŒÆ”yCPHYsËË1–y;ØÄ´ÐzˆÇþžÒ ‰ëÖÃGxýªjr¡®Ò-v÷«—d@„„-½¾W°ûâ:"…S¿÷OœË‡a®íµ0}·@ÇÚLz^õOÌ ás1ap6Ð`(Ž(é¾ÎñÝÿŒ•©q\${i¸¤­£,4Ý}pдp}ç ƒŒÆW$Fd)5b™4—Ð'µÖ幎•¸Ï²8f:ÃKšlÖùO”ö¯˜Ñ5àOPm=ÌR·íLˆðL0¥|‹4éñ±ù£­œéâÐ²ÍØTŠÃ’{ %HcMÉ ÿulj.¹ÐÆ«X 4a°á_éXÈDûúúþÍõQ)ÊéQ‹A휻GÊe/¿’dŠX²D»éBÎm){Ù3é눔‘–sðÑ•{ËÛBîxø¬åªax´éåœ}B¢ËwYnÌ!ˆÚpÜ­Ñ O,ˆ ê‹¦´>YŸ˜‹lAx·òjÚ™”J3FQBAå[kŸì+ÍMÀ‚ L8‹º.‡¸@mnóºÈq'¬ú²•3»ºe×ìP!‰F²Ø?ø= ò2É3e&À²vOb<¹={ ­N—o&b_ FùÉšñs›£²Cur ×ðÞ\ÉJ½~œŒ}Jdï0V2Ù<_U;ù°àŽÙϨY;Ö$òõ•´ÕmÍŸ?Æ,o¡`Z;Ú1w6ÞÎѾ çÇp Šæâœ.ÊÿhÀH¯ JhÈÕð5!%…ßAZÅhÐìË î®"‰Ý___ì=Î]hÞ~Õq*ã2ôt ©ºÒIÓŸÿÚ]ÈDÛÜêš9‹œ·µ'µÆ8hì«D¯!ãAvÈS›€•Ú» óŒíÙá 3~7<Ä{8 7Sà5HãU<+³wˆJïryØþd2KD1Säý…)¹hÉÏ‹reåóBJ.…¤úµrFb_tÓ:&Ö²^”個¢Mûl4:Jè3"°ûÁÆ­2) .cÍTÛs6cTIÞ]â´SÄ€COMi Ð<íÝñKDÊõé²@æÌ™Uù9Žž9ìs3)Å[ó¿RJðüçRKë´ûý.ÿgZÿÜZåð"°’@l“eò°Ø'ãïYÛh¢šãФ×1'Ù{6JuFÍUæ™ïÔÔ ’!ó¹E[þ«ïu›èsÑJ0lÙ²ÉgšÍ‡òÞŸ Ÿ“É*ËY^¥“PHú#`攈h¹h¶ƒÙÅ۰yE(Xþ E¯x0.pL¶0œÈH‚Dœ1¥‹º;2‹¾:¦ÕßwÙ³µ/ Ì2%ØaX¿r–ëÀÚKP{•½[%­t¸í,àm &É~Ÿv9µÓ;ÝuäÛÃRˆâü-˾ªýcO¶Šz”'ÐÂÇñ$P©|oäˆ~G%qÛ }¾[MW*í¾ÍH0ǹ.}«L½uˆBaÀ®s¸–wðÄjîH¹„&ðܾo€èIÀZ-šþ¦'­)¤HMöB ŽÁ“#Í›Ž`›’¹-N’, ÕñUg‚’9¦K;Ëu{Ñ@‰œ¦^¢þOæxŃXÞVP^ÀÀ#ÈC¾ç{ïM[ùŽ#t~§ü+tÀds4vÿøú’Ý\÷FL÷ˆßYÌÚwfýA*ßíÑ ªBÙÃK•Î),GÊoÿ àùRîº2év|Lˆ2‰¨$×Ãʨv?-–c –¶Éœ´Ùª fƒ1´Ç+懭„¼éŽOÁ¿¨pZ .gkÁ:×£(I]ù¾ïäcau \UBÏ[[Âħö?Yêÿ†¿W“°'äÝ⟹åØÉ~ð«þc\îHý ÕfR¢GÕž¡ÜSì=x=ÂÁ<3ÏãÂûüîê ª8mä‘'“µÙ{…¹J8„” `‰Wpç;ôûìFÍÉé>YŽŸx•uÁó®RÒ aâ0èj,Ïwd¢äE‡ñÆs sUiµÖ¼c…s4 ÁѸ >²MçtpNIÞZÚLÙrÝPH² sÃ4óþ'¥Bˆ8½qvîë‡eLŒÂB;ô®Z”‰@T5¡D5èê¸{1Q@s‡ó8>ñ£¸N:1Öi0 $¡9ùà[$°Ñu%6.ococIíÕúÒ>pZœý“ ù^˜*{¬’ЉF-fûuEfk˜8 ö‚$ÍæH.{°‚]ȇ3p5$rõ¯2T{>´N*IMƵl’ãåÁ©uz ×–%W²™þ·*ûE[Åš3Æ”ÏçœâOò@Ò¡ø‹ò÷vØ"Z ëd޸žº?tU#&ñÑͼÚË5£9Ô¢_5™I!0;„L‚Lݨk× ?´sQgª+¯¯DÄüú‘8Õæ ãÕI,ÆEXLú‹Sk…´?YóÕUGq?—ßâ9©RþG‰æ‘‰87“Q 3/º {DÈgpÒ. î6?»/")`RÛæ ²xåoÁŠâÃò®Êe°IxXFôæ¶t;b·Yú6m¨6±®Ë³”§£í™dn=öG vˆû`¤h'èt‘äj×Ña@ÉmŒk©¬cßãPñ{1&ò!WäÛ3@SåËC:¯—¿MŸYyÀDþ%;ºÈ¼×Ø^ùZažöô ãUWN3h þ œûܸ"·ó©C…«(m‰ƒ’>ʽ¢±H#ñŸF¾ç ¹ø¶øaB‹úÔ9=Äù„ ð§Õíä‚•«?s1æÛÙœäh§‹àWÞfmË>-$63Ó*š|ÓA_`l Ë'=cJ'Ì …Noa ©šUßD«{©P&³=;€#²›aÙ+a°l¨Ce’©½ªhý\ “û>}̳ 6›D°”VE|{Q„‹¥Úx𨧰¿´›ê_EöqH«/Nr€ì]Þ<°FÐçäÀ9nîZâ^¢À·Bwéa‘“¥¤®zdRìÌ=ŽþœåO£;¨›×èíI¬4 ©û–5'Š7Í¡[Yðûä‚Oî 4kÝÕyá¥è£!¿E€Î¡¦)wÑI_í™n4h‚M†Tßn ’Ô 4nWp<¾ãêô«þ^i-ô™g‹e³¶u]–ÂÔÜZð䥲(d§Xö½°>D›4½7yàa ÁlH¡ ;‘ñK:@©ÄSNÀ(½Jœ…ùá”-ÁIÔLINL0—ƒ’¼ß>+U^q¤…ÿ¹%é—Ü›ÜTRв[´ß+ìÐKƒ­Sæ´A¯GuÍÔÏáH€»~ÜHŒë wæ@ͬÉx~ôåSL×H~C sç¹ÜU†õ[œ“§ü7,p8E,)p+c-&†×„øk¹Ï.FšQYJªÛê&ÚôÄaÇ%INt¡àï"ÿÆ-ý|=¯CR}É R@ç £T™WšO´j[¬.5ÌY=KOÈYÔäHÒÍ"äÖU¼ÕíËÊ¢;Ó ¦¨åx~ï/JéšCÕÍVìÑÚpÔV‘ÕE®3,š[-¦òÅœ]kÙ¤½Í9µ_¿ÕüŠ5e@@­6]#ü£GÞ/ çtˆQÊ'ºa³ÈSõ~½[ÂR_¯Xïl¾÷ ˜¼Ÿž:MÇf¸Þ„ÛèíÉ|_Ï v?Œ˜…#tVStFïŒÓGW$¾ò6Ÿ-e&~[&Þ‹µ}#tov"„u´KþN>Ã…Õ ‘YàÓ!>Þ AVXYé^8ãßIjŠÆƒŠ;?³DS´ðc‘þY¢^…`‡k7%U٨ꮛ9¶„VLÈný4+n¶þP(ßöl‡–‡Ôƒ³ož Õ5c„À‰ÊÞ R¬f`Úg#à«m·À·%Í’luÄÐ/ͱ(LTLºTçx8ó \ g$Јݴ¤Ì®{Ú‚ ½y³R×Të.–±UÏÕÝ5j ¹PŸ'Ka¡<’}®ÑMåkà¿ë` ¸S¨6z½¥Õ/Z??„©$êÜлQÇVÃô Ôr®Ä&:N;rp¢­¬Ax $ÚnŒ.Zÿ)ϘòF[YÃôh$BiKNÍìÄøeTf2ƳycãMhõh+ÃK*“*×¼…Ÿ¿ ç Ñ9äU´¿àHD]TŽk§Æ*žý,̂ŸpÿJ6Ó§"^¦?¿eOÊÊ..Z “>Þõ¥Sö‚=yîëØ:ù^ƒâ%:ç½e@á¤,·Ÿ´ªÌ©;%…t@°AKHM†¸!(SÓAD.È?ÚÍ_士#…¢8WaÛ9CZ•Ba™hï‘.Ají6­m 9‚T’^¤ÆZ®kæP?y+Õ%R‹´Š¡ê§öÝ·—L•f¯Ÿ»2#ãë{9Q×X¯ nçý·Ôä¿Þç3ƒ,òŒÔÁ|;ã»8ÙÞ\"!i¡jß—qÞdª ½ Ï±ˆÄ“Ð[àöT%[Ì3=!Ô6†vsÉ‹¥¼¯lµSŽÔM ó6y} "½gÛ$pÝCêL`€Zî‘­¢Æ ( ³¶«Be{Zi>¹Huh]0&¢Sl‘ڜҟlÂö<ÝF¯Áe«v‹hªÁøše°Ñ?»Xˆ°<©$J0÷3Ó ±¬oR-÷=‘Ù¨ÚnÞ]”W*l(ìà’ù/ Û_D‚òB «+Þ s;Å IòŽwÏ­¾ŒÒd«_ ¢$^‚\jM—üàøNÌí´¢Vc×ÓåÅLö’@ñ•£¯à ¥ºM4R5Í´HR;€4V¦’ª3™y ä&ì‚þÞÚùæ¼Ùà˜°MŽ¥úX–Nü%èR#ü!lߺ™Ÿ ºÝŽmm³¢¥ò)'3ÈC0µÚ²KÞ]à{͵œiH¡–¼Ô¨óôapÖ“zI¨™fóûçëõs£ºV% œ‚[ti2HYs? U4'£å!×:nœdð]†—гvÀ¯þ13—+>àkóp³-û´Pç˜zÈ‘È?X“ȹع\õî›ÐZäf!Aú/2í¾õÿUÃê¢ïŒ9ƒ~£+B$ÑLÕoØ(†hÒ!;ŸÿO#EíiÆÜ»<}iMot[ÛÜvÌùð~RÃSQ󸤸­*%D¡BC\0¨v±X+å×!öÂ)þuçi,Ã$㮕÷Ãq*(àbuÝcÂ{AäÒe:iSB¿áà:ð+ñTÞpÞÑÅ~õ4Ûª3lRþ‚AX³³<«´Ï;4õŠu5ÉR¢1W1ÙuýN><Ô‰%…`±±`OÒhpÜl_Õïl`½î6›æS±ŒøüóÖm¶K< sѹ÷¤ö-Ruòp0@ìmEñÝ@µñ°6K4%ÔLqNé}žRÉÈ*,¸ù`^÷™'7LŸÕ{hsÏUê¿e*+V@êÝrnb0×wÙYºJ9Ûiî¶Üý¤q'ÒGÏ#÷©`3ZcǧF‚ó„"D#V.D^®-ÜG3ùmEð[ÓØßg.·†‘’o@¹ì’´à¶¡E—Ç 7KË~+Ddèʸ|MÁ—öãà î¥ñÎù•Ðê¨ûë62•Yk|’Ûdÿ¡Éó¤#Ìoõȇ ²xóˆ&í>vû_d-µÆÉ̳‡O¸¢üu®ÛË9uóµê4ˆ•»WÝieÙ*ï„ç,d›¡“söˆÁ-oÒwRºÒ|b?Lö擾8K;Ël&!á¡È?©d¶Å@+vn¼SîÊQ)['x/¡C½‹;2ùud¨ƒíÃZ‚%H{…™Ãû2˜¢V Þ´¸r” 1ùŒ,±”¾}» š]@ø†ø×»A°Ó÷žcÅÞ@—È@%#iSÀJYô‡“_ßøºžÍB©ÊBiDëfdýb~B1p€à7?/¼ÍàÖãûL@k¾¤Ô8'À bL´t¬…Châ:¯¨«†zÞö ¾¡`ÈéÕr|øuYŽ’‰ôj§~`Ë6M=‚XJÙ’ òïÛj3bçÜz=O8ïÓ~/ú®¿ÄŽ¥p=ȈBì£è/CÎhí=yÒ¹CŽJ#£o‹ò*#[:¨¤ÿ=Ho®XHÚ’ò> ÁÝ&<$ý™ "aÖ„5Â?èýïÁÜ¥O…âA.D'$<Ø}ôÙôÒ‘mÃ$S„6õil¡él’i-u³¸†¬…Ð>À•‘5$l¡ ¯›Ìkpúl­Ìhô÷X#Oÿ8¿u¢ «Á|§më^,üÉlÈ#÷ø<\ ×öšeL¶•ã}ZH$ýA<5’¶ß§:Þ¹xv«–xÛ:NSäÆÎXÞ“T¼¬bû|TFŸÄ‘„µ…üÝ4îI2.¶g¤iɵ"ËlÕkH[Èð§4¤{ˆÞR¶îa¨ÿ)å™çEgϺù©Ýð|ôàå!ø½Ý¸".!8··ê.–ïôîÏš’z¹ªÚE“"ŸL‘m˜–ç$йc˪És0°{yM¡•Ì‘½ åxŽ£Ú€zV,#–Ï-ó*û†GPbš“Í÷9øí´ •Þd+Œ‘Ùï- „½ \ÆSMÌ}ÆÞ0‘ 3ÿö¡#F»M…´ýéãõƒ–ˆ¯{z¿ªåRÏÞV\Kšvmïå×’ÃDzAîöV¸I0tm,_÷dŤQ›íŸi‹tÅOP¨ 8}K¸ cú*i·Þ7ôšuñÑ›hM»…‹;û,`RK¾Í®iIF6í‘G*TŽ="E1/¼ñ:Œ»DRÀlÕP-6Í›Ýà"þ“ ÌêÞEV>Û. MC…ˆ¯Œ@> ÇÄ=/Ø.†,œ³ƒkuG„"&[5?}©'¸öCÿ©U•'1på1“¹ÅRVGÑó5) Z³åÏÃRñ·tô©0t®Ž|&”J§ž³‘r„àž™(j0Ï}FÔ¡»u`F®nã<Ê`c%•À®‚ï<`Òý€-EæÄö< ÝšÐ[×ÍOB}Qt5ˆ¦š·¨q7¤>kFhn¡ók«B¹­Œ @ ÜØA‚*° `TWŸŸÅÍr}ä1t !~d/Rmsp B„’ÅýµI¥sß1¾é-¾u~Ùôƒ0¾KëoÝŒhAίOÖfeKÈÙC›§/œ¤·L(Wœ· :b·l/`« EáÏɃ?’¼D¹#oC¶>œ-L‰5Õ=à{½ê¬¬òßÔŨ¥AÄ0¤7Ú‘<Ä\ay5Œêø–½ŸXRåPI’ø+*Hd&»áJ姤¯ûhZ`­y‰m[Í\h¸wMftÓ±€ÖYX_P™”úèýÂÍAŒà: [ çR›Öûè9îѽåäõ¥rý¹u¿ U¹ÉFA6¨¨j$r#@ WaeEF¿TF=æJF=Ñ¡¶Žà2‚xÉ÷ÇÞZ6@®/y¬Ø8MGLj¨yý3xi.‰»°hegÿJÓÊÝðE _Ç]R H÷äk˜S¡“‚lÓº)Mñƒ+Kwqðï]ø/‚ŵžŸŠú·MŠpÇ6:O‰KÀ`8wXúM«ªáùž¯ÎFìHaº¹Kx BYz¸ÞîŸu”G!CÏÞruÀÆŒmK¥+¢°¤,þÄÁåÔËjœ?טð=Û[³Ï€ô‹þÑVs¡ñ„nÀ7\t[&¤f¶ZO´s«¯YÐt²;€¨« T5o®ØëÈÚßø5²-Œ»â‹jr3âõº†!"Ð7(ü)=Ó™¯“ÂèÚÎêa»Šåõmèúj0ºÏ, DÝG„”¥ .5‘Íac+UŽßôûŸNê@à\¼j3°ÓÆö¾`¯É×ð’Òk[—®NÍ2ù6“„ÕýŽƒŠ˜téuÆbŠ, Ø^´!9ÓX‡qßÒ]èq²³Ú£À«ëH.Pz*.ZeNGºeS÷Vï®4Æ6W‘yWÆkcBºRò\å  ¿áÁ»ÛžÇ¬®›YáäÛŒk°‰"G2øØ–‡¯¿“¬"ßã – *õ]ª0¥tDø¨™Žä!¥\íÊfHë™Áfþ‡E³•ôQèUƲ%ÝA!=~3m}Ð;‘½1Þè O¯ö}SøRÁ\0@¿µßïØ·…² àY¬¡ëB2†ìEFV…áuÆÊezvÛu¼QËQ™¥Ç%dE ÔA…‰.«9¸)Êà|Š¡¤ädMýÌÖ¤dLE_²l_¤SHIàϜɉ©ÍRÄç $©ûÌ¡}NIºYÀßÛÅ\5Iã»›ïìd¼NÕ·E<æ:fº{Y7cÇèØÍ ­¾óR`ÎqüI…p•/#Ž^=E ¯~ –ccÿ ®ñ1m§C©VŒ&…Bܾ’ Ï@˜–Ô„[¾•€ºåË@xÑôNÙNt³4¼­g¦;®½ç·ðiÑD<­`v YŸ`Ð$7ÙÃí´R'£ØË.í¦PH»í­žâÒäFöTì}ØÛûß¶Q—ë¢Ù¯ìvñJ .F eh,z÷­ÉK¼˜{±ðÌS¬L ëyv” VÌÒqÌÁÞû=ÌùzqÃæ:*®iÐ;wÝuFæ¾Qû¨”E°)wG€¿ª À¿‘Ïé”=w.qÏÕµèLX1 ›¥—>¥×µç¾!þÙ’i©ÇÔ´Î á·m¿â}Ò¶¢Ï¯sè l‡ Ø[h`ßj®Á;3Úø€­#´¯R¢ZƒgªEåjB¬æöÿéÄ™þ-„ÑIžþ¥\œŽ¨f“?…¢ Œ|÷ûèeüÚÆûìR@ Ïvª *‘ …‰˜Òb9s<öáù NÕqü»ùôžÒ¬ …ž9à F51ÞªóÈÄô^“ g(è‚‘oÑ÷¨YÌâô»£ZYÆ|ÆÙ1#¥ãP7»O¸ìN?¡cL:”^u±0÷÷,i5åIíi”Ýlùj«€¸iÏ«ÑÕš÷RŽÕ&ÒDÈRtV0IW| ¼ÔÄ¡b>õ~½Ð ¶$臹At8&µ³Æªl°s¤ééx FÀZ\ëÄU’?°êèlUž jb°°B2Î!_eÐö=õmô¤^Ͼ¨ÌxÖê ÎL¸GZ­ òI:Ðò Þè½Íýžcç–ùK­™.Už71±ãµ#AáŽê-„Ú ¨ö¨½S#3® #ôa°8”‘2³±ïÓÁŠjgIõç¦ý ù:F=Ð^Ò³f®¼¼(bËÉ ñ*(Äõçþ“C>:dªuÍeÂצ|4S•ž_³™ WÅ9Ï\-ÎZLúva™¨æä,íu4ŒZƒ3ŒV4=-¶v8å[†6~õ’¼û¿ÄO8õT—YZ; jÖëV¢5òî“Nªòk.½“Ä›?ñÝ,¯‹.‘UC»žï”s^wàNþ=§bva} r3RZ/Åg™ã'«c™L÷=4®ˆWÂé¼^ávûHíRß—Nhqåy’Æ25jÁ(ÙiÇ ·±Qšd§­tT 0‰YM`Äå+Ø ꋪ@·N£‡à;æÑÁ„j„ªLù‹Wÿâ›X¸4•‚k ®Pïÿ™Ò+õ,(T¯DvY[ùHç:äÍ@5†å_çð¤J¾Ð"¤p«&frçõ /Ko½pmõx×s«¤®(¡ ¨@Êõc™ïPIIÑCÐeÊñÙTò*e/_R.4ÃÖÿ±ÖCðŸ<18œ¾æ<ÏsÙº&¾w¨!èsXwê:¼çEÖY¶¹fåéÓëÅÀì]ûsrM^3è£k‹™Æ½òhJÕy´¼¥†±‰nºZ/LÔÚév‡On/}bÓžšk;ÒÂT£¡W¯<2zVñ‚årÙ1Ð#²:ÐBFäb[jÄ „ž@É=¾­á!Yìë–¥dP5d%ÙìÒÚ£|—R…”¬ ±ˆŽ$ÊLÕØŸ“™»ä*¿c:žc]Dû0õzVý,…Åúo–·‚ÀZ¯¾ÿ÷ÍBkNÃæ£A„ 7{ ezëíSù!@cc.c¦ãÙ[²Ë“òß Ùw£sJY¹ø(Gï¿$в¸“Úõ#§Ò.È¢YúŸp^ìePù%yy»¼jÜ)Æ=Ë×Jfá4L…E±h(ôÙ®nd¨D%SÎ%ãŽ~ãÁÜ+=×Éë_Q¾£cPªö:$Ïò8¦²ƒ2kníb=˽µV){3…‰.QÉ4o]ÎÏÄ¦š˜™›ï¿ájšÏcAKBµs…fp£gñSãt([gÚOŸ¢—‘IŠÃiÑŽ±ö3f_O'ßöüÈßÉYdòÒºBÛ#E­›/äFÎ!6çxÚXêG0øšK_þ{ —:9)'¡b[sï!•K`·’C÷äATñ ©&Ÿ$ßý=ã [Çà¤ñhÁ¤&!œ34Fâ~‚B«$»§îCz°ä#ÊdÍæÙôý*Žr|TÒ8Ï‘sgÏR3?BÃ1§ŽúÌ*ßÒoFÑ sxˆ¯íçàç,õ‘D:ÝdÒo uˆuÓôöõ[›"?^FM€½í;É∠È4fée¾™»DÎÒ’ºË4}ϤQ´g÷O”`¶žAÓ,†ln¿•gÍ–k™U­!ÌâCØL€ì• üßzÄÐ_šT{¼-<ºITõ³@«$«)È9>[eí¡TkjiYÄtbv—uR°xªÔCuke>”À@i¨Î–m¥o~‹ÞmqÃ[v@7·û#Gj̵rï —{›Yà Î¥¶¥§½³QW×8.å茺_¯ÈE»x¡s|vÎzNîŠ.N›ã1 ³yàꉟmYÞƒjî}òvm=»T?œ>vZ¡–á\RŸhhJHÛ%Oã2Ï{‰2ËÅ@ÄžT#\MfªN"Fe>·œãÈkQw{Rû£ï×¹Ÿ{ljÔµeOô†¨Ò[GûþÄUOfpÑ <—{×r¿gýÀ×_%¯CÆô“LÉþÔ²œlvãÜÔ#È‹<?å©sÍm¢{)”bÎ,;µ^ „ˆØè]p³æ÷ȕ߮ð"¦ªÅõß/ —Û#¨wÂÓ)ç[‰ÏÔÀÈ¥† ÆuJóã'OFÙé†FΨ8ÚÃOš×}•ÿiqh¸Ð¿í†þ4*_—n\¨ä/N¬–³ô0Â&p9ZÓ7ÍŽÈkÖƒ?Ÿ¥ò{ÃDЀ;=Ô[_®ÜJÈxWÐìD(*/¢T §³'Õo½ÇnxH÷6äáJôNQ…'Óa’¿„(ÈêÚ˜¿}…K8hÆÒP³’aÔmÍÇ»vCƒ(V0P(& ³ ˆRø#O¢SÌƃHÞÇM&ãÚÁKF2ú[<ºžû(…,°Ø·ß‡]&² Ç æWì*uµì ˆC™8³×sÛ͈g[Yi³æh£™¦©·6m€J÷LõØGÉ‚4-?‰‘4ÕÛ£OW®7B6®¾iºYœËùÉë½C4Ý_h+&4ÐÐõÐÌŒ·¸àpéË÷ wݶݳO‹&ÅÍÍqt ²˜À©rˆñ~üMúP¯DvÚÁ§^ ¾AbøÜ°TSÔ?d”qVy²°¶ã÷M‡ÿºTNÀ‰Ø1ìr³Wñážñ?l$ŒÚ4|å)ê+dUò¹ÒoUS8¶ugÐVb¢,< ¨Øìß”F´lÜ“Ósý„ƒƒ»dKY£Èhpã[RR£‚$ÖÍÙ€^Á¤¸è‡È¢àf" üì«Êörm=‹°6_i¦â‘Ë®f­Sy îJ¬©éâð‹g)J´ìLÒS7šU²™z\M°8²ðާ;s’å•ÈŸ`ÄZúJÙjü”Ñ;ö¿’Ž6;ŒâÕùÌs;6`Mðaž3£õUVöžÇ£– ˜")¿–-"å,îÍ@¦ß7À¬g°umcÚêuZTˆ=÷eö|äç™\÷œ¸¨ ÎX…<ß³ŒßJ¦;³N³^€ŸXºÎ‰¸þ=xèÀP¾R >dS?¾Þ'%¯Úy¡% ä\b¯¶K¡ñ,á4'æQäª6Œ ?ãd.PÆ“AÑ2 ¹æžÂ+³íîQ°Ò2W7'†¾*'ŽÎµ‚ÚêÚŽ?, ŒóÄUL„“ÄÔ#I/fIU,áÚ‡:UäûLW®2Ÿe]õŒçæÇ3Ëê÷gEœoXÈLol½¢ÏÔ¢ÍceüøÔ5¶£å«Ð¤[c!íH‘Ž4³³¬Æ=»h²ˆY0ÈbÊB èzd*“åEZ+ˆ(úCè{Ê¢¦Cùy¤Iá˜×ç8{Är Õ"8õ¨¹þHÑ„7¾å'i%ÔÁw]Cc̈8–´Nz’ž½æ±Ynñ¥‹µmQ¢7ÞúKäÙ‹uè?Ó²Î2çH®H«ªÔ­Ô‡{ˆÌzæ×"i:¾mxÒv‡Ù“.¸¨åFbׯýmsî>ÁÃåmóÍ7rHÚí3ŽtªPFQ@~Lt»pO—úÏ…ý UßH„ûÑëØ«ü “ /ÌŸUÓ kËVø÷´û‹ïCæüë„ûö w¨h¼“¾˜|h/5 â(Xõ|䜑y‘˜À¤ÍiG/´¸òû“dÎønocüº„‰;Ût~T½ø·?À¾3oá‚`pôVŽøÙ%lQh… ‚u“À‘ ,†ÅvP1~ކGxj58\t)•¶gøÒrHæè‡œä¨FV{K`ôÞ?_‹ºÕ9ÏA¦Ï³‡i×˳f÷©ò,›€`~”l›°—ÅÄvy^”'ˆ6à`8j2 ¯”Ùúã2'Ë{Z¿7“=4¯!ïhÌøÀ#R¢·Yç7['|«\M?Þ·ÝX–ëàIŽ£ Å)ÿª>€òS6,Ø*#qúõܵæÅOH?üxÔ±aûílà›(ÄÐO³pZwõ\†¨Ñsú— Œ×¯’‚9¢°Iögì$­æ§ÛóvêíxºùÞ“"uµ |)ܯÑöÃÞ‚~~€†çÛ˧ˆð Ã÷~‚›ðh>Pé¿…eûÈâ+øš$ÍO÷•Q’ø”Ìi÷¾~ä6H>_}1ï¤ãUµëBnr _WzpK—¦ð·Aø‰ê›s:ð)K«wöbS]RJÛÑ?>@ºëĶ|84®üˆªÚz)-\òÏ{ï Rœ»oŽßƒb³ Ýe|îœb=Ò¿‡½¨ñu*¥ÐÞí¢f–M<­§õ óá>ê˹iV.§åÖIð^c‚Òr]ݤTúN sž@pŨXéDnýH-%<³•1JàdŠW4´ÁcJè,’…ågîÕc½£Ð$9mßÀ ßcÇk_¹±Ôé…I’¼+œL…ͦ•µð}™¸RËLËûAš!¿šÎ+'™;&H¢­G”˜^H/Âñïx@‰œS䎮|%k›9ÓAm¤n´ÉÿS¿Ü²/çôÔ%YžÈó™N7ÒR6e[®¾€IæýÉàðTsôïÛ§ä²·ùÐ$l¬qiÍaB+BGXð÷¶a·—BÀ8;¨Í /°B ­ãQHÏ0cè¨(ˤЈ%GB°9`QRF&û2Ñ®Á´™Òòzõc^±C¢;R£$ÿà„ÈUmI•t'ô¢>|†z9«p¡¤‡¸šûfÕÏ\{”ÊÅa.G¹‘mÙ²¦ì”ô‚5Ö fnN»ª]0P.·,ÌÒ÷ƒý[ç„8²óZOÓŸRâ²âP¨-ù*3b8M[T:·g0Ù›ý ›¨Ž>ÀóMnäK h‡MÁøƒuŠ ·y!ýfø˜AT*bp_‰BR¨Cip÷‚þšÁEÀ°-$‰¼U<ô)j@ ½Xö5 uÆ•0óÇ÷ç9ÅŸv¬â6­¿|?PÙ»4²žÑóÖ¢‘OâfŒ,j*JšŸ°ŒÆã-÷u§ó\að9š¼Ôe ýJ‹sX¡}Ì4$ªÙ4pÝF cA¸¯¡Ø˜lH/\JÕmŠ:µç˜”¢éyág¥ª£?6­Óæy^Mg¾év¬Yä&Ä/yS­ÓkÛèáÛ›=‡…‰¹dl‹Áêô9±×<‡íDë±é4:žaòÃ{FÏI§Ç÷‘`!)†(HÚ«»0Ã÷ÎëñrÒlWôÊ\æÿ,1Þ&oÿ¾‹í({Pðûs ¹êÈ£'Wû„ìpZÉÉY‰†Q{ƒvÜd*ÿÆiÇ ü¨Ä L}¦=b‚_ŠÃÜrÐÍÝó‰E`r¼³Ú\ì=¨ÛaR˜í'¿8ÿ²ª'Ʋt«}ÓŽ»ÔOOË]ŠŸJ–ëÊû¬6_VB•ÖO#yÕ‰¤lz@ öY«Õ{ào!¨Îˆc>s ‰_'¼cUǹ칌yL{½càúÛ¡îÊWžGœÜ7³ìáþŠˆìÇZûײÀqÆ„¹¤ZŽ0n #î¨ô†!â8ò±Ë¿ÐJGÔŸ­xr ‡8nˆ†Áh§öØ.§×IRÒ·ª‘4B¦DKõÓí"8PæÖ·:ùÌfèÖÿŸHÍ!åO¯¥hƒú/ zÐÇžäRdly°âÈŒRæwP´1Ò#ANfùøçÄwúEzÞó$. ä@c|ìë¡x€!o5>úç€3wî5<è¹<¼|ÁŠIG/•y]¤z·Ê"cæ£ÊšdS ê*ºQ°1€)SzõÉx‹â ^áiž‹XÁˆšN§\M›Ýñz.c$ÛIî¯+[]ôQ3ûz09Òy’¼:I\N-©¤­?èåÁ#!|nÃn¦ÄÏ,®—âÚ™±8:Cö¨÷‚½'A‡Úˆª‡dkµ 4 3†j&çù¼ð±åFÌ ÂoøãÊo×sµìËA'Õ…µ³€‘±Ú ‰¨”òзítM-°°ìl:ôÊnóŽN'þ›ÃØÆÃÜ:“ ç¦~ˆRôÙÔðõ‹æèF™Ï¾×ËUÇg3µñú-)“•!îMЃÄhü¾†/Â'á°¥ƒº§†¾1Bk{çFÁãÁ!fU¦šLŸIÙggZ ‹†Ì¸GË?oNRO)Të>ŸÊ§þ:÷ \‡‚ê’œ}Ü%8¹ºo}÷ò ‰_^–°Yñ=×GlÝÅMiDKƒ_Šó‘&…cöÛ&—9Û¬—?rñ=}θPá2¥Èsê—…WR)?QÐeÛp°Aì¿Æ¤OZ[ÂGgŽ/z²¥`Êm-U2ké—øSÑ cÈþ>–ø:iÖ÷½o½ÖLÎã̾ÒÀ´G»‚o³YÒ§xmž`0zϪ?Ïgñ;Ž–cs¨ò=ž€€JÃ>t7L§è4J%¤~kû,øo寯XV‹X´˜z=kЯ#Ía¡‘[Ø/€ÍÆ“&Xàª|‡®K2t¤^¼«!i f©Z+âS Mp¹æ[sç,âÔ®1eWwüЦ¶”¤oàË~VÂ~ôÅè*˜ÛÝ@‚¼KsQÔ$üã]ôõ0Ø  Äÿc†Ï/ÎÙ®iP'Aèð¡M«¬]ô·FTYè²Ú¥Ú‰¥p™Ñ;gȲæß»¯?¶jü ƒ.ë1ÈŒZÞ~ÂUši³@ MJ@q§ðö=\ ë¿øªïÀÅññ}ÅUZ€!$ÅUqt£‘=-ò–Ð-üÛuìèáf-Lb§W`\åâ•Z w¹Ý§,íŒT?Ü«hÃþÇx*~á[ŠiÈ^«óc\*2¥ÏÝÖ€poåÊ–١ÿ’æ¯c>8a›ÏŒµ‘Ë]bG.ìµÒÚc·vD¬I"Ðøcà;"Ùý¬"'8-4¬Q&6bÜÖ€0¥G½©Ã=RBòÉp@°+Æ?xZÔþöQt2sŒ L»Ü^Ñs ƒ±•ºA|Éf½ ÒzXëÆò2²‘ý'é×ï¡-êRvß²®ãMCcí£nbØÁíúá¦ê"±sº¡—?´«¾Öy¯½FŸþî ìŽw 21Ÿ²ÿý•‹c— Oxý삈>Z¾”À-[fÐØk½<\=ÍË`[ªéÅ{.°LCæê7¾úu{u!àúÝïC·®ømHú†‹Ã,Àb-_Lt*>†öo_;Ð…ÖóT)—L§Ñb?¨¬pÝ!´ÿVîL*ñÛ¡p]›A¦0Q¼Ž2ïªîœO G¨°7†Æô|ñ„…¡ÈŒ*S.ñõ9DÛj$dÎà ö¼-“vÃT;&ˆ)=•F)“0§‘KÒaÛ5­TlO•+ *•­V¸,B Î}†/y©Ç|ïvHdw›õÛH™Ù­ìß>kÅÜ?dòòåõš.é‹h“+—ôÙx‹%§­?L'+[¯•Òð#ª;‹î¶Âp¤yPò…åƒvªÑªYéýÑ4¯A]Á¼õNpó𸗬 oÔ\“x÷…æo>2×"U™¤%XBóF…ÎÉ6£5 Ô©ð`?WµnQø õÝ[ÿÝ,2'D&C(̬RSÛF⣻°É²r¬7e½´à|@ÍꆭËEMyõЇ…ûfþjƒÚ¢wŸ]ì|%o÷òÀçXkÒ­§\ÝÌ©˜‚íÄì£Þ?­,HÍZ÷»Âsf™xL!!IáÙ+Þ¦¸~®[M¸0S‹G©ýaí ¿û¡Í‘ðÓ¡)?¸ÊÉÖF Bq7²qïVò–P¬šúw¼Êã'–üáŒî¾Ž0àߊ¬a꾯¹Â>"¦QÀEW–2¨Œ1®và.ÊþÎË{4'b†„vQŸyÑ6àZÞ’/ë·š}•c> Na=\EjL¡yþ™>‘x IØŽsÝÍØ‘fZŠÍ@Õàè54´¬fä%eŒÎ#®²/9%ºL‡>=™Ë²1œÞÃnXÀâoêõ5”Œ¸×h<á`‘'í‘õÜ®+XÆÇù¤dnÑSo)–OM•Qܼàx¿Ç?+Žfþß÷IÚj³Gž)¼X,ÄŸ·¿¢J/ïÞû¬,æ½àÔl¼\ü+K±2‰Û3lüs“ú¤)å+‹È§íŽüÃeý\/êfEèÔÙa*=‘T 6}¯O8™Úúv-£Ÿ¡¥-ÐŒœ†$oŸ{]ê 1Ô‰UËÇOGÜÛ‘¥{ÿX¶T^P¡]FQþ£“ω$ÞI4•‘æ¤?†Ò@ÅTËñΰ8Ô¹Ôæ™ã|_¶Š©>n¸Í|¶Þ3OöŒn(á/†W_J}vU&¤À‡ÔžäòŒ¤l#Ì÷}„ùxæ~ào\¦ýÿÅlv'©°îî—LÜïì•L¤$¾ÃrJ׊P9édí”ölɧ¬Ú‡JÞ ^¨þ‰€•ÿkcI9ó ð$a»b¨l¡éÔ’uT¾“6þk{†ðíÙGöÅ3Óßšðá£9o`0Â-@àí6’Ãø?ie8¼°´ŽÚ¾-NÓU¼Suœºxà͆k¡ŸA¥Ð:ïÞþº@½úÔÕ¢Õb¡–¡U· 8e®ÛëHn|ýS§Rù3eTf»q=-zp‘Ú1p2<#4מúðD‰2W[ý•¾Ú¬ƒ;å®U Ð>Ÿ8\(Xaà– +Ÿ´«å§¦ ÚÓ´Éì$ûÿºBâìn‡»J…@]úÂÈ3þ×Jf諬 xÖ%7$6ó®µ9f\ã‰n}7Øêëªò{Š“Žåy™Ž›ïpTtVg®Õ$»®Ü£O`8×<Úï‚àý³®hÂO2yNÞ~ÝÈ´á  ¸“¿ª(EêÉÔüVd|éë+KóòTÂoâSJK&ÉÅN$´]ÎSÎóËs³ª:Ú“³ ³$®@©nÐ⯖“®†1ûå–‰.j÷|’¥Ý;@Ê}a×,iLŽLLE“Ò%¦‘0Y›wk•Q¸-"mÛçBë«VåÚýÇxü½V³Nfd‹¤E¾Bu$²ÍlÀOÎCÕ*J%Há„âç&#¨ø‹ÕÁ‚@ .ùdôɺìûM1™Å>Îϱ©™Çåé¸Z,#FÔ$ØêõÈäz,ôæÑY…Tw1!ó÷Qú0îL[)W92_Ö1 óÓ¿2pÌä¦Ý‚oúÜ—¹nÿÿÈ* Bû¦lPG1Õ3 Äp¸ì8NKÕ¹Ùö‚­¿—I+@ˆ²‘ÁI‹¸nUe>ö•vÐaï5¦YFÒ6êmïŠÎtêeêÉb³èÇ ùÀ_"ê¾ðBvMOéS…ÜÎe·ëø-å hðçõµU»Y8«Ó®ð“i@úÿœL ®Ó™Üó+Mœ„#è>Cá ?…ÙÑÃ=Ï ãvà ò¹–'Hju¢€k_ìå99¬o`V ~;ˤ-Á•Qí˜ÔhŸ2Ø}:åêd"ï‹Ì¨ŸB'±4ã'‘V¬n7І(Œ^o‘qV Û¥õù£æ"çÓ‹i E¼Ü/¥Ýùím{8ëÈì1T[oRV²ß@šþ}Þ$Ñ&Äæ»÷¢,¶<û™Ý ¸Ñœs#$rtüâÒ£1ìÏ;‘ûGëÅ¥©‹fiÚE+ý‰¼µÜí.=Ž»Ê< ÅNY†'{ÖÇxNàñˆŒ]I\6XW¤7Œó1…Sè"ÓÂ}úeœ± ‡|€©Z®DÚ9ŠBùr[ö1ŸkùÀ3ž•Ê-‹‚2“É‚]O¯­ïzwÚáF`uðñÞŠq̸²…=ÄTU[ü¬E¿ÿuWN‚µ˜ Ô¼ °£¯&3óá½ÿ‚^„({¦V:Þg…X”õ¹Æ4”ãY“ @_}Vi«2K§6%ßÛ²i—w0~¾‡Zê°O×U1¹uWèožÂŒ[!¸Å›²_þ$œÆö;USЭmJ§ûíܲ Øsž$KdSÖŸ½‚i8ö—ªs¢o;ŒÙ²³(?™­GDRW‘fw쀵ÅCbˆðj†õcšR”Øxöö¦-càEVD,ZÀró^Í÷d§ˆq0ÐÇ=ëØ×re®¡F®±WÑ~»«óçP©Tlúg+1“Ä)V9–îqë_‡Í fz=qÉnÂ÷îÿ3Serer†þ¢Èé?â¦òÛö÷A&xáUcöQea=OQ£ÏýU°×9L)¶á)$bŸ,3²6böghj’÷˜½}ðo1“Sk™ xŠqu¯ ù¤{hÕ®Øã7¨Û_»Y˜¸jHfáê­(#p9¾ÿµ+’ìé ÓX äÇ2€^lD¼£>>²^]ר;…¸7À s¥â£èÀ,C­0•‡åV¹­q` þ ºùË·š5ÌÕ†Z?ð`{ÚgDd(õ0ì›·îÿ½˜ìú¬@%D2J7€–7“]¼ «T6üÈ·Ê|X¾w2±éäéqcõ ØÝj¤U.aüËÞ¶ëð=TÑ5bIÃOʨ;õLžOjÿ@–YŠ0îMÆû}ý·YG¢sì?"OýiA©°Ž üIu@SÊZý´ùRUãgâ <Š ²Áw}™¦ß”Ž ÿ©Ðs›¯UŠ|q©9gÉ÷ cä8¨¨’/1(W%g è™>TÄå|¨j$ãø…¨ëß½Ñ/~ utq-¹ß¹™?Ïf!'?ýŽ,g$Ã>Z$¾´ºE¾Ÿ7îK‰+pÜá®Ùw·.’!äÇþ ™Ô‘ê óEÊÙ^9`òt´;'JI÷Y117««u…¹CóLøMæw¬}UÜ{ˆ™êuR””ìªÞ…  ¥ æ‡/^»3i4BŸ>Ê0›®>‹È²2‘83øeŽË9AH½^;úGˆÈïš°× 9聯°©¸çØÿÞ4F8㋨,šŒ Î}7’N­ßº©FZ:Öz5ðöGe#öläø ßÈp¡‰·&/j“ÃÕIQÈšqÙ±N@¬´±"ÑŒR2F9?ƒµ'1¬±oð„žÒÕt*"¹wÌFÄúï6’Ê8³leó3Ï‹XNaP~¬í²2£7f#$€ä{JÈð®{¾ðÀØ«5yJœ*•Ѓl@s• ‡ŸJ‚Oî3.ùÀõí/´9n=MUå$¬Øô±êL!O‹ªî‘dºŸ°›³Û—¿pìÅ¿†DôáMæµðºlCW·»­rêHËŽ‰œRpôÝŽ‚#&òÜc–}àÆUm åÓЃ©\u³–J_sî±lÑ?ü+—¢ÍÚ³µ™Èù¸\Gšzk«2²0Ò‹G(Ø>Ð2—wu€ZA<É36“¾¼ Ü•Â1àÙv8läÃ&7Q§sˆÿ53J0ŸÂ†CÍÜ7×ùð «Â?^ÉŒ<=ÌеÐÃm4*ùDÚÉ+8Ž-º]âtœJób ¥mö«;ümL¯ê Ñø4&Wú—­žßÒòv"m­"¥žY;c§ÓJ°ÐU?©ž5ª|NôÚŸ« ë7óÇY;UÈh»Ÿq7v³C¯Y7Ô5u¤9Ï^³¥)È„ZÄPŬ%ðÜr:|«)™ X“wÂP+×7!ð«âqsžó ØhüR&‚Á´¾v¤n»bŽ0¼¹Ý`F„f@qªªÜ#>ó¤®];/àK/³·«ÎúÁl$=½5'°yÀhvPH®Æº ØŠ >+ öº}ê¦j„ß=âä!"ñš‹в(ñ«Ÿ. C›ò›i%Uì /Ø ’ÁõIÙ\~࢚E{Ëä%%NôicÃ6;“udë@:Á €QúÊ>üëñmUãW^$M&ÑcÈien½È"èl9®î ÊâÒËU›Ó6¯×üaòÞêx4l©™k3èž:»©¾üðPH@«åç'‰£2Œa2\¦ét;Å:†E¾¸‚Ê œÉ6Wp‹®ñr¬ð š¨-*´A䮪eê®ékþ¬S‰_z„ó¥`9LéãÓKÎßVß|+ûúž†U1Ú0u2— —«ŸwÁÜõP± %Âwx±TqcvçEOõ~°ÎÅØä˜¼»gl‹Äv¯—0À/ í‰Cá=¿j)½ëùÀ×þ;€:p­;•~@ÔCŸ·D?'«Òl£*ÿ8ÕµSuºqt¡XÚüÞ¬-Ÿ¶)DÝ3²™ã[þˆÛ&Ø<®C‚žb‘I !³‘ym›Þ.é0Ȱopv­æAh!Ó}’àzù6v7m…ªò2ˆ™€1 ¬ ƒ7‡«æAͦ ˜¸¬ÿLõ˜e=>;€?ÚI nsÿg%çÿ,³jª¢¯ŽƒÀ¼$`ÖoÔ—‡ŠBÉ©#|´e—?nŽ£L5KKí1êÜ &»\ðæÄ{©‹oªÄà”ˆ|Ÿ÷ªØ‰5n&‹áÑ÷ð>1±OûÕŠ1Ü:·UDZ¤PD“Ækr­iW…ŠÉ`ö¥ó[Ê‘Š¹¯š¢uy ““ØÍ%væW.[…0uŠ5 ù¬Ÿbò¿pœç÷ý²Fÿ^Qo1+;Þ‚ mÛ ¥© ŽéÜÛS«*[*` |æ‘¥fe©éÎwxl§à,çmLÚ<˜di#“Í>îïä8·ÛóÔÚ_¤¹j=¾$!oã€gXE-àþÐÏ.%†“mh‚E ¯ñH5fI”šRðM…ºaå[«ª+.rQb%jÒÍóYº nÈ G›jª)§¿'ðŠ.$Êž,‚ç" OF!s?Õö®AséàRÐ.3á_Œnº ¥jÓ?ýQs”p‡j î°)ƒ<5¦Kñã*¢©ÝÏXåí´ã7—”¹aWA£õL¿1Ç¥Ðì¸}E„÷0ÆÙ1ô¼‘ M\‘8ȉ>&üå>xØ‘¥þÇ$;BÕ‹0?ÐD "ëN®ýGÏQån‚u½”g~ ®‰Ý%ô—·€þœ4y5§sº*à{ˆ›9ÖOY5Ex75=ͦ ñA<žry´Êö‹Ó=ÑþO“â^ODŽ(ûE£ æ£>+É×ñÙ“I05ñÚV†ÒÑQ™.F¸JŠ7C@µo¨2¦]Nå΂ÌúhNÑ7ÙÏ”ÊãO7ÈUCï’fùõî ÐZB¦ ¥u*‡mô½\8i†±1Å–Ëä'#B™yþ2‘U­åy8Wø¥Ùñ/ãLˤx^MìȧÍT—Å Üzü'b•!ãaÕ!+nЛ4»5ß¿{Hü·KitÚeÚ ÇO‰?E\|ªQ‚¦¯ aÕ5DòqIßVÉ‘;¤«ð-å4ßœÃáòD3JT÷®ŸÀa0Z-µ_´zG™ï>ù9r‡º­–Fh3ÍÞ““>]h¹Mµl\žC­=ñ%kP³! ‘”¾ÒÏ ‚Á8?e´Ó’òP<v†.‡âèêârª± P&Ôãßÿݘ/ÚÛWdú’Šà6yû¨0¤H@4ý3yÍIéB• Ô&V;h3úmÈ¿°Œ^(›ŽÐ(«·4‹Z²¿#N -; ® Ý¿S{¤‹C?Q÷÷»TiÞÚ\®®•¯»8 BâôÓM=•B~K¹85ÙÄ0Æ%”"GLî:ø]¼Qtõ˱º²æu»´ÉÑfaW[w~w?Áî%ŒˆÅAÎõ²ÂdyRum/ .˜QaV[ZªpN‰†Ñ1°Õ«}"ÙÉ=C™EŸþîyéGKçµZU9ÞðæóCU0èë¹ø÷¸ÿšHFIÛ™;P rÁúÕï󯇿µ³r7{ª<¼gc,aÌõNk¯XÓï9àÒEZß<ÆV`,¼ØÅ’ü]ì³üAŽ÷g=aé$ðæ›­oåOVé7¨ºd0 yy Ñ¢ªQÏ*r¢nCã?èÐÌl¥ú2Á¹Ì#µÞĦídü{d©ª÷‘tq6¿ûfÔ‚ï¡àGÑŽ ÊîËýA‰½/µ÷´:úŠö¸]½òÞnG•¼Ø: y°É ŽÚ¾Ösa ¦3š(ê;uM¢ñlDçŒÒ^t§¥F—ÓZ¢þ=•úÓ?|Œ:oâÿ$n…ÃÖtÔJnúU =KæÚ»Af›ÊŽã>&¨¼ô]©ÐlXjø0…Oh!¯ÁX½Öà²XÈ2µj%ÚÁæ‡ég“6šŒÎ¹e&.x–èºI­Ÿ,æë‚æzecdf!¶ŒfbûŠxVCÆo!º-÷CÍNçÃé—Ú:û€g7ªk6’÷Ù™YúªÙWÚ˜’›,ô˜ó\„4òWc;飿É@”;íòˆ‡ÃyÓ‹8@A˜j×KÚ4òï­ôOýS]øø&ý„žJ)nGnÌþÅ;¹ušŠ¬tê;"&E 9°pþ?L‘œðΌXÔæ²Ö·Ýl¸“a®ý’߰꫃7Îw}}øŒ^V«E¨ž+´“=÷·²ìâÿƹ6D²o’Ú°ù;‰¸h»L6I(bS ¥ðwQ0_;ÌnƒXA‹­DŠ/áñ7¢a ¨FüMPH»TLÍ/j+Ÿ'vðÛ(€þÕÜÒd¡NÊÞß° Ûq¦#ñz¿ÆZR<äí¶>Ͳ͋Ǽ 1Î>@ұͳŸCö59¾×„NØ:ü7P¶á‚9Âii@D9aÊXé'8ÖQ=ëó*,¡dPçVº46r ’¤»Jå+4±Ô*8}¥ ´V)™£h²rW‘‘¶Á%¯û›Ç™2€/¹{‡'•ÐCÜä„‘wõš Zï‚0ùàg'²äœÌuV‰ ¾Î¦þMi—Û^ìà[¨¹s`P!>QzÙ=]ÙÌ¢Ìt¾æbº£’xóWƒ’ŒðšéÙü6¸g\Û7á%–zùg×qàYm~Àœÿ°±W%Vôß”qädÉ»TRWûMØø¦|ÿM_ù²ò\Ü“^DÇ ˆìI°OÜ)·£–$>Då ‡c¿‰ ÷•_!nÁÇØ¿:æ–2C#³ÎRo˜ *àD·åå=¦`kAæË¸^:µYŠ×ñ›2:ùbƒÈâÓû64A¦ßdƒŸäÀ’ÝÖX¢‚3~µŠïöQ¡>33ûr`ÎPÊ®Æ@¿óhÄØ^Ùäb ŽÅ­OÛAÅ·o¹1µåçsÝÇÙ•+…‰ èün¼…jÀ'½oôšÉ!ÝspÌ(=hªQÒè(Êp›êˆRƒ1àöÖI%9wg˜ºR•™v¬,¦P=*L yHáO߳̾¨ uïÜlcñTÍ?ZÜÿa¨µ„Ðê"ên­íL\ u˼@Ùle’"n¯Ý¿è Jc³ïNmE K.´\ÆÂ’p0Cƒ¬”Ý’vfŽ€ÑJÀwèÈÖæó$¬'ó–¯hÏ–¡í°oõÃ7Ð ò{G…NÅÑä%IÇ£åQ–‚RCÕ1$¨Ü¡tÕˆýÔN6³cŠv>ñÈÒëL1BØà¥pñ²N“ A[ÿXbOBè9ôŒ¹´âöáV]œ~ìóí¹‡ªíYgl‚sOñQgMMêŠîËó©`2]ÛÛ€ ø©îwÎÏ @1“ËI!wòÄ™£Ç]<‹= –‚§åž»SÖC1_†ÜÖ[6˜Sé ý Ùš°ì``G>|1·ïÒ¹qBæ;q̓_U9á½¢>T†¹‡(ÄFÁ„ç×(]²´|  ÜHŠÂ;‘ö Ž‘u2ÔÞܳÔuþ­ ôï½°&¸FïÉKjŸEZλÞ1ÏOLiVË…Ã{½ßž=ÿ(*﹂DŽ£×D(Û‹SúêóV¡üyTE ûþ`[$›]æ`çl'–JßáЗ²LY^4hC•ã/ÉÍÃ7ÜÇ㟄ؓŒnvê¡÷¨Zu:èk”-+£š”0ƺ|´°©™R#`ãDVÕŠ64Û 4Fk·«àLÁ2,|Î}3>ÎGµÛ}«¹y9hr;[÷\Š”à’Þ”cÚˆú6AÄ7­hmÖ Ç˜˜/Ýû"eÿóœ+HˆsÜ2iÔ—k·š³|iÛ .A¶G-ŸJsRÄÁ°U¿õºDáEÅ™îäÐj&\ât`ˆ¸A*!¯þ«'ìÖ·Hîþu<ýŒSžÞðÆóhdÑ¿=ʰØ+׎ߢ¬¤|MrQÖC^ /XáVJ¡øÿÆ(ÿlé´F±„ý–õ¬±LöJª…× B/½€ õ€Óó!#h§VË54<åG/Xb±oÅ8êž$-D6X MÿŒæö¸Ã¤+#Šð­Ø ^ä5ŒgI¤‹ùf3WºF{v+‰w*Ji'lPCrä^5|:Úq<þ®#l„Ö#¡ÂÕ¾ZDôIeð”UG½5 +Û*'P†Rø7ÈW¿¢Äe³XˆùqG“EɾÂÚè.›£ccÿä~­Z6X§äa¶oå¾–sã?úôhÌ#iJ䊅z ľ ØæfœÒª‹áɨtåhÍwùT†nïGü ã»4ð¾äu=Ú^å%¶Kª à¨lî¬tj¤mª©ž– Wîõ–ác±[' Ó‘.Ó^£ / à¹KR³ªóyƒ_…€sÌ–´2ÚmM= ×o¿ÖÃ¥àJù…)—‘.“1‡²^<“,î ŠÛ´_4ìõœGn_I°‚3ÐÚ½¦»ÿêBˆ Ûæuǧ[>8Èñð:Z­a5ãB—§ ·æÁ›âÚ*h¹K2¼mª'^ 6¼SîͼÇÇÕögF‚§z²îâÎúÜô@oÞ™¶Öð‘²]ÿ÷÷…Ç]û‰øtš¶ÞƒæÐY56ë–òçÊ3;AåÙ€®ûfßµ+æÉwˆGÅÊéAÑÆb#e\Ž#Æüš $ê7»V‡xÛZáÛã·Mm‘eCߟ™p±—µÉ¸ €É\™’4½ 3w#u )㬬[ª±©‹Ïß}@ÊÆrxËáÅ«C®¨¼®=fDº}š]W =dZÁ>„Á7±1j66¥Ò'ÒîŠ$jx] Òh¡ ã¢p_éx&íîÖ_5>ž2•ˬÓë5ÁÀÃÃ/É̽Ù芭…ßäµÐàK£üX”Û{É0—X ‹²ê«=…sµ§‹±"gÇGCÎçÝâÚ®j‘p¿§FìÖr¸{ÉG~ú‹{=ÔÓë#„ÔóLUèNæï3fº,üÄ@ô}O¥AhÀÜ£xÕ¯Üôã@ß\‚2üƸ°‘\–6ÛHá’HÜžåS¨MßÌòͱ&ØGî »8R‰Pë,› ­ïÇÎÞìê:»ÚÑ/«;Ȫ %˜å~ãfeŸ˜À]#¢»Ž_Ñø§ä-ðc;Iø–kxô¥¡{L·6Ñ: ¿PÒ::nJÔVAžêÑmF7þqa ¥ ï•BAvAJ_«äÚ¾+–z,9tZÐaÞ·ËÅp>/›kSŸë£5%HiY ÌWˆ¢“P’O"x’"ê[+Ä0:ß—Jüž Ï&o "¯RîäÅÄMHá>¦Þˈù€¶¾¾" Ž­‡Þ*Úß×ýÓ„Ü”éÒ'R†X€‹‡Ä,î–*9 ¡K¢lç —Þ¡÷?Môäó´°Ç´>(Ù…ÿ“]1¶‚Ò Ê‘­Î>ÄF²YêyWŽgÜÔ¾§îw4å:k¾3V\¤§ÅˆÓ£ñ’êŽÏ…Ä)Ð>ƸíqYч¯òËy ’¶°H襾y0&.”ñG¶ˆÎµ-°¢:7-ˆë­7íÅAe¢¯+ _áª&¦º³ça(¹¼!¿Ô½d>GŽ× {Ù•JãÒ×µeŸêçq¢i½¸jæ(¿ßÇS•CÈâ€9¬--‡L¬ÿGTH¹ $‘5dÚ›¥½‡#°85]=×ºŠ‰{Q¦ÿ[Kfî⽤Ïà2$ä©u²&ãn_I\ObÎo.Ö)}Y|CË9”°¡B$¿Çç›óשý` #ÉþÐwâ,öÓGâ.YEøcâ¢&«ô7?2›? 7ú»gÇ>lŠ)¤a5Å?T9ô³ÃybË ô[mÍ4Ì{sÉœ¶xãÍ>¤œ îãž—íÜ*”`ù<…ßí§fÏ“ uzŠˆŠ_Š>ÕŽè%ê_i¤ê¹^:ݽÍÿNð ”Ù2¢…wRþ€~OÓ†¡-ÝÑÖuju¢.ÀY¦HÂFP² UHçgòþ±:³ò-Èƒí¥¶öÙøðG øè<Ы^íÇÖˆd²5àÞ ¾nÿèú8žÈËë |§læ@Rö¨iÓ¯k©þ,/[£üš¸ZÑÆž±I8#è‚У½*Å#ƒ„+ ó%bjwN¯Î4JßVŸþî [Ö5r>(š ˜Rx3»0Z%Pÿ«õ³˜Éú[ÿ~œÔf@®Áç©h1QÂÛÉ%6Ã9µ~GÞ6…_êQ :>›l\Wÿ|©1Ce,/„5çw<ÞˆRáÔËCÇû^òIRùJàtLôÉ"kö¿Šmî Ù¡26¹éóÝ4ŽömÂËYã4„yôˆ‘¹–#)mØÀ‘?ó“6wî/¼ÅÙ§’Šb0v5M5•Â¥«ö<ªÎ¶ØqõÎudw$h*œKæOͤ-èx¥ƒ¹“ S.ß»ƒûÓC oïòŽ‚ÑÁ›R×ÎB–‡ƒ©ð®ƒ1÷¯ïC–¤_0C/ºmà ;ÌÇ`ão@Sc7h¼qÝ ×ƒ¬ïgŠÄ3Bðëü\ñI!%‘ü`è󱲯አި òsÉL›  Yy?Þ Üýñ$-Ÿ>‰‡¬;+òJÍaì x]gª/êK—ˆÎ+¼¸8`˜ UA×_Mó[xlzå& >ú#¢Ž's>±M˜ß;û¦±À¤.^?4Æâê7Ä ¨dÔNÞ!•0åð\#߉¾9F¶»IG®Ü耕2§ÿê N`’LàòE„>7#Ò”m *yaî¡÷°[Ö³ 6þª›ôjÞÓÆ»ü—;uÀ– ð²€e‡! m)p 1´+"qÃ@ЛÝ:×ù6z$o è7¦1ú&ÇÄ-DÓCÃnsŒv}o«¶B.‹6…¦L ‘"p˜ú¸®ù ToÓŽu׎>ÁSœS šŒE‘û6éyµ‰õè’bhˆOe!`xŽéXC]Á¹1ÁÒPM&VµY–1Úð÷×”oz¹Î|¯þÛû’ùCù«—zd¦àw-¹ÀRùŒ™—-ˆT¸j#Ð>7–v |`|ûúÛõ­‘2ygÞ"¦ö*×lcƒË$%²ì.ñìTzšìFYq=Ié¸HÍç{½]ÆÇ'Øs1S ö Ã}غI¨’8B2sŒDF™û#E–Iî7”ûªJÜeeG §^u ¹ M!É= Æ.%R\ÏI=ŠT<Ø‹QaŽSÏ# '«Ζ~©L’³u€9}ß,B§_BÕì«Q ¡u'7 4Ö•‘¾§§—"¡(Ð@Êw˜@$ô éûÌŠº0NÐs9Ù¬,!b}´y^×N‘¿‹Qé¢jžº²º€f²¹•DÍŒ˜L9pž§"½Z:?ÅL9ãyfº€D»U#d㪊6b”„ ѵá,¤b˜,˨ÝiIý)´•¬¾Üìã%*ü5ž‹!Q…Õ(¶™ÎÊ¡ÇÚÌú/ÖNäÁ´cÎ#¸ÊÖß… f?¿Bô©÷ƒ*‡ÌQy¨Õ†˜6xäëÄÚ÷Ygĺ™? wçáTŽóáivÖ#-‰ŠpÄêË€CAò=ÊT+Ó.ÌCœ¹_’Ý#¢îð)*½mW‘ZÌéâàÜl0‚êr=²¸¿ ÖWcÚ;{Îê›ú&ìõ9vðoóç‘¢Ó£xJ•ØÆ}kZªéuÌÂaþѱ8¦7XONg¦>utÓ[g"ëÓY†Gï¬©ŽŸ‡q˜_¬À5ÂÙÁÿ*ºãÐ'³)SàMÝØÍ«ŒÙvÜÛ5%„îJy¦5ÐtΘ²'û‚¥ºcåeóùsŽüäN>’"×{Ô¾IõôõøÉ”˜¦ ¶® ‰ç!{p›ìAÑ5R4a£9¿2"­–l©j‹˜O9X7ñ˜ˆ»^ùx»\¹ÒóâZމ£;ÎZÏä<- v|Ýâ• ¥[hUJž^‡N¡ùךK5aJ°Iª7âŽú£É<¢¨ÃÞ¸ÍÂ#˜U—TÚ;:[ óTÇjCÁˆQ¶ä'Ru›·©[qVéiZ6s>“#û.hø¥Cj¾_@£ZUúªçѨ÷ 0·j®ðÀ4Áñ§ÍKLhß. :Vç· OøùŒæRì¨æm&OtB7?>&Ô÷&…¯@(Ž«J©"”ãd|1á2ÈT‰Í/¦S£~ü¯?Dm-§Ÿ¢ûÖ)è‹?‹ìÑ^É·d¢À5;Ò¤,–¦ØK°œÂ<Õ;}cvw®ÜþL-“WÄöˆ6²¾)dˆnTª²[â’S@­bí6÷wê»õ¸Y¯.-ƒô±…€ˆ Ñg®‚ô…÷/rÇa‚‡«30j“(\và”¬’jnÊÈc¨¤}û‡ðxï¸7ÄúG*¥Ѝšp"6 ·E XY)1)=¼a›i¹¸oHa2gsy{y`¬rß7TŽs?ÓÉùÇÿÅ2À-§dö%—“ý/X«XºŸVMÁôÿ½ÝWA …Š»ñ=¹¦­p‚‹rã×{Gs¨ŸÃ¸±òëÖ¿·"Nÿ™X™¤ôggÔ7¼&¶Ô×tïu¡e:þó“È)! ø¹&Õà‹,\4uYñÇô×wrqãÈËÖUÿ‹Ú¹oâd ¼n«ÔÃÈ{Eü›õ%Ëç‹G"º53|¸9RÓp”^ œö–Qñ ºÄß«¹ÇéùËØ™" Ì‘#ôÑüë÷xügvUì ¤`´}€ŒÖç50Ã<«ª¦ý*TÈa¤ò°Èaø–Ÿñ7Á©ÖÌ.Þà¶¾QŽÌ¥òã'C«ñ+8dX(™gñ6:–ª?_¹J õ0÷v‡3ö5U~wa²£¶þ@Oè·K@yn’«© ¡I5ˆÔ©Gä1:3((,Ó&¥§­9Sëd,ÿÇ)¼â9±¸|QõÖO&–¶\Μ¸ŒMÖ¡×߬Yñ¦µñÔ›3"˜õ²E¿ÊE0ÃþWµbún0š/ i‘V_nL«º„I`f!G}r—¸'–ˆcLø|N‡%䳋íEëôoÆ<<>ò×ÖêÄeÕ,ƒ7“`Y‘ÊÊNcSÒðù•mÊúÕþ{Y°*°òùøenLÈøF7‚ŸÃ’ç?¯›`jgŸNÀ³·ÖCî^9?£òz:tày`¼—A.lïÙÚ¶Æ` Q\ëÝHToC8)<Þ¨—‡©@±Å¡Sûû= ®1ìöþ0HõæSGÎä¼Ì#'{"g`iõõ=þÑÃ}‰Kv‹ãÍÞ¹˜¾”X„õ6‹9ó¥,¶{ÈÀäo šL¥8qh­ò=Ky†‹X2C`&4êp¨g‹2—4{¢nªZåµ¢ù7ºÔÂï'û9<ÇÍÉ\ÆÏÜNù4nšÒĉ;š.ÍÄÿß½À > >MiíÅñÔ»œý¬s ”Šº“ºïë.T:ÞKª)l«0ÚE'}`^§Ñ&¶ãrL2}>æÅHÝ,÷p4¦ü†€ZÃC­Ûøçü úÙ!ÈÀ-|S¾×À‘^Å£OkuÈUÔ¸†n¯˜ÿ bfv×DÑVÅ£¸I—}iþ w(ú ~ù7º›?›î/˜ˆ@z]^Ô¾‡ft¦çiؾÏhÐŒDs£v}x'4à\§¹9¦éÀñ¡ë¤¢j„Ÿ_Ð\ò¦‚œ½»ÔЇÆßÓÞÖ&¹$‡ÑÝä a‘4¦"·:˜™Œw"a¸‹mŽ’ØO öö³ÎðHêÐþ B žôôÁ¿ÞD÷õÄŠ°¤7ª¹ºDh±Øê˜aÐb^ÙÓ·È<ç‘J—ÊëŸúB£J?Ço&ÝI÷‘NEìrØ:¶Ûñ›kÅ ­Rçʦ=Þͨ\Tu9sá’W¿Š­»™¬o=,<ÝŠ% ¼›5˜/v†.gÐ2Áoû›‚v¸« Å‘ãEã'ÑYõ=ÛCØÄPºÊíù,&Ä(*rÄS,yçíc¡|n_¤s¾>Køä¡ûÂPã?JQ^ùýjœ[÷ qÆ“,¼2à]Fºß¦VŠ#B\yD±Å9¸BíYÝíCÐ3OðúRÌ8—+ÌêÆ×µôbV·zù.kγmÇ›ëI­d¥ÐiîŸÚ’qÆ–‡wú}«%¤OÕµºn0 Ñ5 ÷ð³¼Õ!X# ˆ¹æd`Y÷$øÌºs~“È(mÆar>R©–Ö¤ŸKQv˜X³B”ƒjý?PÈ„©tL®unˆiçZoq 7æ:‘` íE!ÉýÝmì ——ÂÌØ¡ñ§üC·b[îùÉÝhcxÔLJX(“µYí_öM@ÓºŠŸ]—M‰tò,áàc¿X[Í€‰ù\U§‡gCÏÇÉ—ôgm–Ÿ¤™Õ¸{åó‚Ž7])¾ƒ'Rœ˜92÷Jhôu·Íø„X‚‡-y:=…u=Ý’ž—ö5õEÊU’!-c,#ÁRÐ<´Üs\ÕŒèlǴ۬ęPÆóÛ7«Õp0ãŠÁÞê’ækï¬qöhi¿0> hþW^:…òÿ ýÍÞ7½)\>+‚…2Ì`²~®;dÔrY:gÜìÙݶ6fbÍ·ý Öì Óœ©ôónrW%mY¬àÁE×èá>žú¿:c`ÝÂ×M¡ITmeqÍÜÙ=Öƒ}øùéb³M½²ø®ïîëóU(<Ù1 ' îTý€9W.0m½Ÿ3×òQ:Æá…÷=²ftÖ°¾7˜¤ø*oí脾”EÙĨB*zèÖt>'ÄÒH ŠGÒhyK9š¯fÝ„n‚ZÕfE±¹å§ñ_å‰[w­ýÕ• 6ß´²>LKäTêÌi? 4-3.ø§JàšÅØM³!m—tZ”±þÆ´—pÞ$ÅçÝM“*\=4ßu?ñ[CþcÚ)´ýßßDâ½äVBÕ¨Ïx½3 ˆûùÎë`! õ8Ì3á ½”8š!P¥·»-¸L«‡E¸ˆü£z-0.nRžˆªg Dø7-`Õß¶Ñз'êHŠ|¼s¸Ø¥%gæò¸GF²Šâ2½Û—+hÒKØuxÈÅv©¸†æ„ëƒQKéyŒ³¾?C7¥Ê ž¢jÊàVù÷µ+TVã03b(•ÂV5¢çd8dó–A±è6£þn•“¦)³—Œ¡á××Câ "%r¡óÐ%Sû‚ÃGGç[†±6[V¬[Í’©TÙ5>_¶ {LÓòß®4Ùéq1Šð.=°ë;½ñýå‚p´y³ Ö‹îivœìøÝuTIÙ”?”‘»’ë´ÊîˆÜ *g~¨7ÙU£úG>X_ž3ï÷`ð°Z{¸VÇÊ”Y<ƒ¼(Çž6·‚ãåŠJ!Xz;’¨™,Ü|ˆ_9;ìA(ä®Z°gHù(£öYÛçmNFEý¯ — ¸^inE+j+¦ Dp'Vˆ®>U(Z]Òºú—ÿU"×™Hp€ç˳͠ŸsŽÃ¹è¿ª¾%‡x ý8ds§˜DäÁ²=NÇáÞøQ3~ ­íVÏۓߌ‹ô-Nâ´àà‚Þc8q?nAZŒÇ:â’ªLc¸æ¾–SÉO\ö}ö4|ò\DÚXÉ?ÃN=€â@sêí|ÃQSÀò,öû™u©¶^y8G>ž‘²¸@à3öýëÀ™d/ ®Ï9é³µJyT: 2SÔèVˆÊ":(ÃÓfnÆz'}:XOÄÔ{UƒÞmÐó]3}7­)c‹-Ùø0jÓLJ]ŸÿgôÄÇ’£ç&oߟÿ£Ä˜á:²f`D®vV<ìŒ 0‘ŠˆßÏÔížï ˆØ–ônê”g«Ïù¾!Øs2•Ùµ=†³Ìè{Yg}¾•‚CnÑÕzó9ÍȲiéä}±Ü¬ëÕlcIØwC0ç=FÎv“ú4ÖÒ²Lï “Ê]ûWüƒœý4Nšã°©ô:&Gò¥£Œ÷k;§úΧk’°ýëë¦J{˜hŒj›[Ûßß„æO<¸ù™¶Ä–{Ù᣺ÒÕí\º`(ÑÙ/æSé‰y¾ÕÕH+þÁÍ é(3í̺A¯ºrV8¯Ì,<Ú3BenšŠˆ~ Ë ž$ˆ·5"Øðjû w%5öE²ÍjÈ‚·i9ìÀJ˜ö¥ºñY¦ƒŠÅœ‡rݧ•¹}œí‚%|´iÑkbGäÒüDÜ6BWqåüJ÷qj ”ÈyŽˆÀ#ËÆb¥`»¬£ioÅY˜‘»è¡®–—+;*)«)î` ·û¶åö¯ê*tŽf¨³ ïMô# Ë“>§÷Q¡±²ûG›\!ЛzkàÂÒ­~Žbjº¿³‰(Ûg]ù"ÔuÓtQolí†Í¢Â r%o5­¤ò3àþÅÈo™êžÎÏdËOíÇ3 —6.zë jiÒéký M¼{~Nšˆ¹Ñmà }nÊê™>Õ7ó»Ž5ÛþaÙÁ§PûL|yØ’hXêíiZÓFýÕ.’m^ܯ†Ñ+‘7·G-<î3~,ª?FØ=ŒMÏhMv¦„">s!÷&¢î^v§ÜÆ Ñ»p´ò+hL5jnœ’¤#muŒ w9Ò¼€½¡]¢¦œµv0£4°Ž·Cn©k„ãGi±³CžÐ{¹Ðj߈T3¨IJà‡iƒ>aXßS.k”‡º~k9~à¤Å8Ô–OîKØ_#­ÒPA:†aCYËóïåd#­GáelÌ–úÆUn?¿Ù1 ÃØÚèÄ vªËôΧ6’$ñéz)\ˆA©ÜN‘ÓÎŒ”6—°o]¼0Ÿÿ SìsS§ý¾®|1/¾¨{˜qcéO¢º¢9 /àÙ|’A‘;Û\&3;ªÞƒakOàP&:gÌg[xá0[YlÔ$'Tù§Å§¼·§xø)Õ9¾¼?}¤˜ˆ[*GªéäÎCÇ4msç­Îh¨ÿ“v‘£ñÜë…ßîdEË!@ C×8ÚÏO3]à-^x¿evToŠªDP–S˜C®ð’œä9D´çðü½Ô3q'éËפ"Ýͼc‚ߑΓCÇ’8LKza“WÎð?9-"T=â ›w>±¬+Šä«I Ø=2„¸@vÐ<Çr¶nçúì¹2 9zˆ©Ñ´]H©P=„ ®—¿n²-C®ÆÜ/Ez°ù½-ð(«»ãI✻Ò,\ãYÀW²XØÞŒ0cÁÜ—‚Ù-yÒP-{Ïí!¶WtTWªµ*Áþ}—1àNc¤¸Êu…‰Û u¼ ar¨Úb**yeÚ›I´œ5 À ÈœæÑnÝñI÷äæÑ`¶» ¹Ýú8ÑŒç;ýG(zò#dÍÄ(˜Ò5l¾æñ™?’Ø1‘ˆ_:ª-‰!Y—Ëý<öœi:RÏèÍ·ôÁQrnJ½Óœn±sM=/ƒŒ¯2æ\ ¸?`…?`FÈó4¾&ßʆû+úã4’òö¤»…y&ÝÒ£t ªÕ]ñÛ!Eéü¸TZ„|®jBð¯ð߉Ußw&(̳#6)A$]Û~ Fåç½dÃÜ")ü£4ÛÁþSü°WêªõÛª“¡U¹‰.õ4ZwšåT´OòÁ|H“´ÜþôJð뢮㜛Æ@$@ÑN«.P¸¸ñÿ1çè«$Éc×IÏ æ)Jô)1%²-{al­äácC Óxÿ0߉4YÔË6Ôí1.Wéñ‘Þùè²?Šàð™&þ~—ÏÞ–×¼¦²0^+ðQ«£¹U4AÑä2‘Â_Òj—‘™2a&ë0ÊÇNèIŽ^ß& 3 !Wãô¶]u¶×9lú5k`CAÔ’‰5Ñx±a šB#Pi7IT`Ù9çW‚¸ßÞªYÖA­]‹6uÊH ¿D|í|ÌÃO“¶_Yl¾|@\ðv³ÖZÁ”—ªmÛåïtß[¿_zvK<ïl–õW•?Õ±€×EÕ •ƒ&†e}àt£úusyxßQA•¼CµÜsþªô~M˜¾ù´¿vÒCzbJ­Ôï É5Gìcc±ŒwQô¾&®ž8´vE`Ë+©…ÜébX¶„fG–§ˆˆqN‚˜ß`ø,ù=v?a92ë…j°ÁËø–~gNs\w⇜Î:öGâÖsFÛ¢š4U+7†¬ñ‚Å—iœü É å×XX&¹üS½°^&µQ𠡦œÑ#Ô=EŸ»ÉÁÕ\úD™Ü¬=0œ¼Ì÷S•R˜l²B¹ã ãØI0ZtK~á+èxA´FF3S價¾mpšÙEïF«6Ëñ+0þ»=ôz¶MþÓe¢‘Oy³£…ͲšÔí/Ê'½õs€xðÀ¿Ô R·Èe!‡…¹BªéÙi¼g}ÐFŦÐBà^¨›´7pÅo0_˜9 #ä§úò¢hé–Lþ}¹×½ß“eaj¶ …5RÌ.Ïü¡T-•¨îWè}WôFAÞû­r™Û,—ˆµÙ¨Ùý™UøòªòoŒÊxÀžhÞ {±æë©ük®º o5Éý’C+×,,¦ýáP{]}‘àŽ†ÍF!$WÕ²§0>GëPY÷s¯åˆœ±/á_ÜÒòË#¿“ßú䔓 æÓæcTCò›ÏY–ÂÛ2åÆê9%zŒÈó‚·'η]‡z&¯^è{ƒßZç&â|›]1"–q„ 9|w¯F¼ £¯š2i¥µ›u À^‚>`­æ6‚‹µX4£…øG=Lð$j×ÒGµ]#„; î ûŽœkT½ñÛdŒí~’…&O"u,\2Ÿ‰`Ô2Q_9zVFÑ"¯ÊÛ›× Á­õcd'1w›Í¶Õo1ìí‘¥á9°J¨>,ykÏJ×?Â(ÿ¸ç½ø›ÐºiÌày5 gˆÇ{¡”F–ŒÞ‘ÌyŒPm]z²ý„Öïço¥Àø®òµ<ÆXüMË)¼'àTíår.½I^ÇVF [9ïú5¦WˆÐŸå0ºóßö •ÏŠÊb»*§³³›ƒ6÷ Dì’‚YTuEdÙ}”ýºœBŽ\Ÿ)£/O(‹‹%ú¹TávÂøÃ 1…Äáôb‹húÒêïDõø&™7sØâ*àyÜüÛ‰~P‡'¦ˆË8î¾àŒieKfÙ`5°©ËA‹-qªÌlsnl¸°”ø½9d:>HOæÒRÚ¦%sŸþôðܜû*w=ø"Ú»„3´•y†ûpI'8Ào¸>À/Ág qø7XvÚ…ØõÜ IE‚¯F`ûóÓs šz\–íZhnð@g‹ÍJp¡àŽmŒ“5mm W¹K5[¸ñ!·X½‡ÂÔ®ÞOD×À3›3ª-P(£5¬ÊÇ>‡U‘bÆv·™Ì®ÃF:šAò0€ÊF& ÚÚõ†Ù!‰¾¾Ó{áºiõ4Pu?´¢i6¥šM|9‹6\X0ªšŒip'k=GI¬3#*ÓŽ¤Nx+à‘_à€íR½c ýβ“Ïß&ë•áíòìBF)ä}ÆM¾Å¹z‰€žôfùÚ¼«¹o#9 ‡¸šaäâÀœJRÕ; qu3Byu=Ï,û¹Žkí\.“òÍZéõÐÍÿ³Ùé’=ê®ã'‹Üd“,¨áÚËv(Uú§º:Uß?uñ/BªØ\×Bmkð È^º<È¿0ßLwJ'ì·NþÂ)ŠÕ˜ßY¨æ`Â<#µ[òCN:3b[®ÒÛ,ÝÜSÑoÝar'šÀ¼§,¿fZσ¦ˆs5žhk‰æCúOÜ5S£tOWÏš†S˜Ú¼ÏÛŠcÕŒ'ˆŠ‡"ÁÚõÅy†¯X£ ÅQÚã u<ÌFê ªg«9Òn[¼•öʱ/•£Z„¬)'.·ùD¶`ëï{)ÜÚ¤ÍW¡Ês_ãªA€µg‚dÓR·v6ªôjþ÷S¼ôȪ1žf@ˆ=îš!NÀÒxÒQkª è"­€Ã/w¿Ñ„6kÐ`P½ñ÷À˜P™Ê†åmO°ŽC‰œL(4JÔ!Mäéöø9'¿ø¥ä¶Wˆï·ZX1Ø<®DÄ?.=©R›Oeåü—âHŸGÐp@ò˜ŸL/«šXxˆuÕ &˜¿S¹y/«î¬5b'kWÛKH¼tCð7Tèp`ôµÀ·Çð2<`»ÈcL¢ÀaRg˜™ûრC1æñFé@àÚ àÁ}"ÿ9ÐIùÚÊb*Ç‘Ã^œ…f9A`Û嵪¨<þå‘Խ˯BL™Ê_ÿu9c%PAbï£lþÜGsv[¿fÒ§–t×ij8Òp’S+x›o¹3³þïº?&~׌rà^ÉœèÝÀë‹ìþÍQ$\7à±ïóEdCûÔ'ÍDrÖ ‚ê5Ћ-aî§÷Uš>£Ë•çe&6nªl’ÀÝœÁV‹¨ŸsÄúͶLG¾É|‡ÃAá"A7½³ù Y†™q\ ©zú ;ß 8RNß‹­¯~jú—A¹ƒr ž"ÂÃd]pÝ™Š0-“¶¦CQëïŒ÷Ù e©ÐO:ÿêï óJ’<`“ßµ;ðĽ._LÎëYZöÊt Üa±Ô[î¿& /Éé˜×{¦“»¤®ÿTú ¦³‡Í<ú‚ɉN†Ê³¾Ûõ¾§y/p“½É@IDbQq\.{RÉÖ´Ó[ûlMzSEv—GEÔû‘çÎc…PÚ£Q[};ãc¯Ã®ÃZ7 {–û¡Ê·Ôª-i|6ûÊ«4îØØý/GÒ–­²c] CRä’w©¬S–‚|>ç%ƒ•oŠbv½É@¾æ8m0ƒeB" «AkÕb¶`Úsrå×"x\jk?ëç &™»³x¨„bRU—w•gM>g//aq.9õ®U³·v…Ç¿ T¨ßô®egýIÖ«oÜïÎ… jŒ«vÐ;´¹B¼´åšûÙN©AÖ¿b0Ò…Ïà½A{{0Ô¿n °v‚ýµòÜe{Ó Á˜çú¶ÍýnÜ¥ƒŸõÌE L˜SQ,š.¤Æ±ãüðXBü)Y"•i Gɨ?ã"'35"ÿngÌ"#çš'ÝÞ$޶ìû+´”¡?-”úqD¯ò¬7UŸw&vÜ9q{`j:­ª 0B D™¡2Ò‘õ¦ ¤yá×#C˜èíÚ.ËòýsTáFy!˜³ÅóçòþõAšžÍЗºÐ8­Æê½I®&Øþ%~ñ HŸ½Óڶ˲¸(†€v1 jDµ785Æõ%WPCÙcyÇúx!/ÿ¦è¬°L«¤ù;F¬ê^VŽ[ÔJéÄmäQ=œ¸u«Í,¹)fZ²…U̧òš›šÍ*a§r*H‰­‘w—T3À­“À̈N´‹ÒËA8a‚µb•é\TgàÅÂ3VAТUŒ"5Ï7™ã3 z ‘‹×ñ¶s‰ö0ÃcsíìJlV-ËÄŸ(ÊétŸä’Éån¸ymÂ-¼&C²!Eá¢Hê0òãaÜØDOºZ¦Ÿ%ƒÁ†çiÏS|ŸÄö+›ÍfÖg”qjÀá[øxI=žÂ˜mwÙ´Š5nÍ× ákËíÄ"ßAÍÖ¡ÓÀÄèµvá‚ =CtiñS?£^_ëÃ…žœè‰Þ¡”–½ÿÿÔÐQz“G]/[{%⃬íæÞ•ÌMÔÑãìŸ* I›Áðƒtí‹æ1=qSžÒôUò åÉ:i:]äÝ @ÒÔÉ&oú¤ÕR#:ûñYµÍ­žËÎ[11Ñnb§j=wn;ø¼¥Èަ>/£¨ýRØRFcкh\O;N<™ÿ¹Ð”KG.›|”QÝH®Ïü^ÝVM(a>jÈ¢–kŸÿñ%ìsS§ý¾®|1DYØtÙn¼üU뀯Ûv/.‘ [Á±iש1õ±l (°äˆs5ûæJE—Åí1ËL+˜ÂQ û LɉÒÀ á")Ö©h*zå»xGo¤ð\¸$ ­”ÊF½«ª ö-’½%±¬,Up©¸Wy¶‡Â¶lþ 2Ö]µŠp–ñZWZ¨+[`$3`ÊRL›mÙ5iÊ\…r/Q#öÇ‹¤T»½Ôúñ à+48ŸR¡BÈhdL“úyX"œ‘d‘cË-sÐÚ©X¦õÿµšå[‚¹}»‘æh拚£pžšN‚êR#ã•Êoãt+\;H\uN˜œ+0¡©‡±´ÅÍé£OA…ÑÿÈɉÑýÃ"|À¥3ƒ #y• ]$Yƒ‹WðóZ^HXXA3ÞÒ³•@-Ÿ;–ÇPC¨.¥Nzhšª¸x'—„‹¤o%Žì{–:/@Z8C°ñ;< iÙ€KýÞ×âGÄÕ¶<\8úü±ç‰X}žâ•:/Õßòà]Ùƒ¸;Zæa¥&™-®rö}¤âN1bŠÕÉlt²†ÿ¬‹!87[úò”Ð!œâCŒ‘x“µ_û»˜Ñ´óœbÀ3£Osôãè“i>}Úu@à™ã)Ÿ¬WjÅ’˜² |6Ú“xN G' %µlƨ0VZä~}Q4§ÉžNÓ×h‹ÄÝ–‘=.]ì¤N=ª“ýåeÉèq=#ûÎ_  6úš#BA¿1ûExùìŠþ‚§€aM&˜®=b° 2µ‰‚€Dâ^ñaÉ Òf6Éò+rTšn}XÌÜ@ô9' ‰{ãd?Ç%J7Ñ©Í-$O»M’šVx\]2z“m)4¶$ »$‹C*ï·„&·Ñe ȲëNÏæ­o!#C|Á,¨iê;Lþÿ¦+_Ϋ[Ðj¯EÙ+åí!4°£ôvî,O%’Û‚Ò:ùšW÷ˆ¡¶ “x))à\NVœMÖ<ÚŒƒáAg­Z‚ Ií­5ýùበ£¡×IIB¨F Ì ™Ú«p±¼Í¥¥K ûñ´­lѹ錵œtW2^ã–…¶“â¢{{H¡¬þáï<c8Øÿò­ØN(öæ*Ly˜'é2úq_ À'›"ÐÜîÀzÒcÕ÷Lº· 5Å´ÙÿÞ)°°Í# ,*¡WAåþÿüVA¢ƒVJÇ0yš¬»xþaì¡-“¾Œ¤n$–ʼã(›ÞãÀ»~*LJÈ8>Nã™àíæÜ%¾=w>zÞl¦)É–HçqøX6 ßá82Ööÿ”ö†ùãÎ þTܺÃ6s8\‚‘zäÛí[må°t ‹Ë«áá(»>¨HßN€d¨kžªòÉsý$c#±ì<š,É CÙ²ô‡×ëÝjv>_„\‰Øÿ1½ãøÖtéµqéÆï½ÎµÐÅjJå­…ÈûȈ£)¬¼¼Û(À~[¾ùy\ðqÝ› wr 0Nn_ÔzÉǘå¤Ú|, 3%zGYÌD¶x.…ÈR·‰Ç5=u¯‚plжZÉ1+~`(å é•Y‰+=sAÉh)p‡rf½ÂRŽ_+3y¤@[º Ý>ʦµ<sµ¢Èun©gMn“Zム·Tth£md àkhëÏö p=w¿­©ú[Ç7År·Kÿ*mæeDÉö§„Ç,ÌÐ1íZ¬3*%&_CUØ”xHf ¦È,AŸ*èeä!d˜ÉI˜‰tg@­}ø¿™›`ÎÅ9b†Ç›í²KÄçÂõ÷ÖSBþ´gæ “pc°èR¥¥è£ )ÍHöÐ z©œâð“5¼Ñ›hCëՇޖ²jš<7þx7Vo|{¼ú*  C½ËBK|M݈B4Tº¨ JŸG( ’ Ôc¢Mí(Î b9VG🃃äÆô¸Ø ¾¢›q¨{ð|¿:ÿâ1IÝq i=™ß>ZV9`†Åø(Tâ›êaäêýŸÿÓ¥Æoé1V§¬uälîÖLðûp›áz²“F^Œ®œÿÕâב¢ýšv¶¾öÝø]ó8§ªj iÇ€_bð—Ø«Œ^Ýèú°¦FÌc;Ýwõ=S3bìRwŽS˹01©zʸ˜§½- o†Ï¶%†ÊquRcò>f‘Ñ,Fk³”³žÈJuîÃá¦tY¡€6Y{Óý N…QE¿EAº¼%þ¨·á”zžQôNûoÅB—ºªò&~¥ ¤ûi|/hDcÀêG"èÝOvf^ùlxø‚ ÖªÏ8.Tÿà‹«p¼ïDh ÿ®˜CG/ß9Õ?…Ü÷«äÎ1 -вãfK„£Â¬Q Y±‹}õS²ôfã¿«ÉÞß½”£0:¶H]^z4ÚÔcB¦Ÿþö§ìsS§ý¾®|1DZâS¶pÅbpY©™B`9&Ã1hl÷åth×ô߉¡µõ0Þ\OG U¬Ewð:Å•ŽöSº´eLðâ’„}¸%=YÿAO#¶?X䙎í¿ÙŠ9µøÃŒðX˜“À¸!“ «sönI ¾É‡CeìqàÊ$êµ´(Ðb­Ë–!ºûþ è+ ÌÿËxƒúV,êàud1ÎdAßóE(3sV¸§‹ïP::_þZ+]zM‰íXwiÑ.Öª_’HE•– V#öõX~׉åñ©ÅK-Dí¯®[‘f ºÐ"¤1ˆ–A•¸ƒ Þ"5Ræ¸ÅÌpT8+Ù`Ãà’¹” øšOßýFpèˆÂ;ïÛ»7çªH@<á ì\¹kU@£‘)^?Á‘ý>oƒ/?z£MhÓØ‡KП)íÕÄ«áÑ™ ÆL|ÆKÀ5·¥¨Ýnie‰Á:àš«MÀà`f4PŽTú™ôÞ äžóé´CYZÇŸq¹ÚGÒê6 ”E>DÆqÙ¼x-À>QÂ*=á…¯’mÇ´ 8p]PéÚY@Z „o8p¶#¸ØÖf[6Qá$x&CQ 1+…‰‹ïäóe4ª“èÓô¿È9e‰T|/ÐÙ/œ‡à6GgZNJ ¢Ú·K#ÕÌ‹ÂO›Ó¥¸v@ê—7æà)* K™l@DÎqª”.Qø#ÿ?£Ï.óïŸÞ_'®juèÀ¸ù’›Á ŒÔÅN›Û .xb­î¿œÌ*_æ%wÀ%b(¦yñaÝ OÐÍ£JwÄIº§7å+«ltƒ˜:Ī\DÙêÕ¡EJžXŒâfÉ—Œ×¸O@ó³ÚS²D6 >öBæÐˆƒÚ ù) æ k±ç–Œð? 03HJîæ’^ü”Ý$З§bçÏtúdkˆ­¿‹nÑÈ`Ýër²äFö*¢­»ô×ý..%ƒ“U©d:ä¬ÊÀ…vÍš ùJ äewr‹(Q)\!jõÃEàæ)Ð7ϛسˆ*Ð7—“Ò1*‹WNi|Kïú5C »}Û’jg ñóˆ„éM¬/_†&èã4Á‚E´Ø¯Ñ¬@±¦À4ºœ¥ö’‡Á7ZÊ4{ÿ` ¿¤”±Ö|S:‚wñ-óZKA×½XG3…ÊØžLàT¶{DŽ´>=óæ ãsç" ‹8…Z¤áºZ ¨BЮ›$‘‰¸bl²uSœCW¥ ©ÿçÚÒ‰¤an‰<ðÖ^ý·öA¸|”âU1ê|Tj…+ô05}_ CÉÛà! z‡ŽQ÷–«eÊ„ü”÷ ¨H ø}é-Rsw²%P=rö 6è4ö—êÅ'/c¾Í©­žuCÌðΕ(9ºÒÕ+>V(L—g‘×[É­× PxY'z%7ëù�/hsíYÇ©ýßµGz! Nu2)FŠnÇ4]ß„ MK]5ë÷“µcÆžR>·LÓÚ@{ýQ¥áZ¢Ï¶§(­¸$ ¡Âo)кi ‹§+?X0 æË\MÔWryõ’7P+=DÁ$œ\Ÿ#¬gM-yŒÜ”^ØÁÏÍÊÜ 0²ö :ñÙÏ£S߸eüèkª1I2ä¶ Œ»Ø:Æ,ñð_=-ä¡° ´©‘Ï!qc¶`\ÜÅÖ«¬þ[Ò+U¼d‘?®Xê˜â¬¥IDŸ{ïºAsvç ÿg$¸³lÁ7Ú:‰%öLEêÝ­hù\ŽM%}Ý`TXx«ý+µ‹£k›Z8°V¡TLºìõ ûRG‹'š–Hò”JÑ<Ðì ª‚¤<²µ»2a8ÿ •ËZqï×Ñ_pÛpÒ1,ÎxŠkY®œÂ8`Ï‚d4pò"]¡-š>·•RÙ¢ŸŽâkR¸b)¦×òÔ"7äÕ™ ÇÝNBHÃf§@1óD†Ï—Õrà8D›-Õ¼Ú4 ð=ᡉT›R†z‰pa£¼Qbüû&ñ)ÊÃõ‹IúŸ·J¤òwÌÔuøÙ“¢1К¤Î§TµæD˜ÞsóÔWçO®Ä¤…Fì•*çüèrx=êŽbÐÓ| ,±iŒ0Ÿ[Ù› ‘÷ ¼Ûj£{|@¿ø4Fry3DÎÔo½’ÚVÉ̽Ùè…ÍO^lT»ãüô>E[ˆ—ÈDZz MIFÁRèó Μשt@c¹èÍòXŠåo¨FvRh n·ÒYQj¤F1V h¨îê_³’iÜ Q±9ÑN˜§3×tÂz¾ ³ƒ±½©,áó›¦&z8<Éã¬W<.¡^Hj³ ½w•ñóDØÿuC.k‘T(RèÁS°?¨[(ÀØH–x§ ÔÝæÉ¶‡åÕÀC[‘o2ˆ¼q•¾Å ÎËÓL@-°u.šá²:äÞN±ø*À¦²\…õµF,»‰[pÄÙ±î·#;O¼@[<3Áu‚ÑŠj¶•ª ˜3æÀ@Óã<»i£KÑo-ÉÝ&[t鿜Îè [gîg±Û‚¬iQY!ëÛòSªvJ\J|±Ô[(j¶Ÿv¡Oôa@Ñ)×—pÌ,¨Á6Æ;dK©ˆ¨-Qþ¼¶ñïé`ç³5AÄ÷Ù¥7Ç`!å–‚–YÚ¢$+MÚ¿{^ƒŒå÷±5yE“ÛN×®6EĈ}Õzó>/ªôŽeÞ=äAÀÊj×ZvÄôÀЉ§\z5¹ì]ÛoEw’vÔ?Sót£G Mܸ‹Q—:ùQ®dKo¡…g“2^QBä—e‘YÌî½}EežÚòkÙE@Ö%~§}¼ÿÜñÍêþƒMH+t 8Ëp/Cp"Wa|шY‘t²«žÅK¡z| ñ Î_ß]$]¼„[¾rÑÞÇÊvb5|; ª4ÌjŸ‹z@¤íÉDó ½'NGjà31“|‘QT½Ÿóšæ ­¾DNüQ çÆ ºfðöЂrÎ’Ü,‚ꂑvgæ(d‹d*øúï´êÝ£µ ÐkmÅ‹žJÚ6X»eƒ`­ø9¼K>ûÝ…ýø÷[)w )ø;§º!ÀÃ#©üƒ '.Ñv«'c”*^¡Jluoª•sun£9 wp€ãýådÍ|èÈŠ¡–FüNÅñº²óêJ´TÔ̵ÝQ×Ú‘°z ¬•‚Äãdë-UJåKç*Ûò}áҒ֎™lrçD±¯ iã‚E"„'ûr]³Ù Èä÷ó³Ö_4ÍKp%þëý”ºã½©F†VN·è“§z]Yi ´ylpãØ›—¹™oZénMnì'UñtÒño†?VÓr„ïßpÄ{OÞŠ—©·Â~†…ŠÕÅÙeߊé7Õ–içŒ Ì6¢Ÿÿ8'N„6’ú{„؉Õ*Ýþô¨¡”å‡ùBŠ–kæoçãÂA*y'ýÆßš'¤$Ñ›rA§é÷Vˆ¤AHÁŽPÒ9\Ü·î Æ—ó-öè$«}ß—èKš<£ùç©q¾+”×82¬+Q\ð×€Az5¶™ÐæÐB8ÒÄìôŠ ÃŸ#G,v¡fæFÃ*»ìÙ÷PUDÎíÕ‘ëpP¶?¶)¯%¨ ™§ûôè”Û“õ¦(pÉŸÿs°ìsS§ý¾®|1”ç^ØÎVR½§¹šUKÐÖI3%@õ‚KH”&¸Õ”;Vdud!u[ôÁ³Ó¯Ðß¼ëacÅ묩òkÇ8B¡Yo+«r +Õ¨çÞ>¦t þdLÝ¥m’ß­¹Òõ:­9u1©JH¢ûŽ .¹ À|7œ í§*JfåÙ#~V÷>‘õ¸¹RñfLrùðTõ» ¶®ëj¹ÉB| =ÄG*ò!éÌ» \-9\—þŒ#¬ú²3¢©)«†Ž©>n¥¦·ÿ§rE2!‚¥ºéÑ:ùñwý¾®|1Ÿ·.~\èƒòTfCþ:Ãü¦9é|-x›ØIlQÙeüMÑ<ìä^Uéit0Mÿ›úžüGé WKV\ýÏlEšþ³“ t­úÒŸãVjeÕÔêÄá+‡3-¿JÊ£Ã|3× “ù#"ùkþžþêÛQô6Ûc°õTªlTçƒh$} \QMã8ƒ "ߎP×`8@«~:³ïW*n,<®=–ä½@ïÝGêÞwÔÐeÄAlâÚ²³Òõf¤õ…™ó=]½ÇV-SÀÉ;gæGS´¯¦%|tN(Ÿ…F­˜Ü"uŒÐG…ÛÉ´MÞÈ ÷YÖÓ?:Yü"àMQ¿\"ï~Gû¹©óÊ3c·»ïøìømö€Õí2WÐR1-w¯4ÿ®â›þj¿©oBP¯8xtLö®*LHÃ4]°&çŽÓsÐÃþU&‚7ElðÆŽ5•p³´ÐœguÍ’;ÄÒÈrt‰jÏáňÑÌÏ>öÆfA|šKGŠ4—™ó{N*íªœæ>°ô¬¶¥~oƒuÝC'K ¶;å*å[ Ll¹ïmŽLsç3ªDÊÃf€Àa¥º¦Ë%–75Úzåáfl¹ô\Î× š ÎKK ¹°ÔÄTiÕ¬ŸB«àÃI¡ø¢Û$°‘-Œ•A0Å$*xgs—DÞ.íí…‰fPicç´[GüÃѽúÌfɲgõ¼ÌNÂÄU«sURü™S…Y—ÎTƒOäø% ²:¸n¸5 ïmqåwVq!‘JdÉbÛÚtÄäm 8CÛ…¯6N® ”(¸°y±YKˆ¯ŸBtÄÛÀÜ3zoG'Õֹϩ—{¢¹ ‘•·B©¼vh¦Ô0Ú©Í L¢¿2²Êjg¥ïò8Ì WÿÒ¸‡Î-t–¿Y2öý:øPw³;“äðgù8%ÀqWëzGȈ, ›2ßr;üêôp’5îŸÿr°ìsS§ÿÛ,_¾Ø<7¶ „Ón•X®pX4ή1Äû½À*ŠA…æn&„~Mô8¡4"×T˜9ž&ïÏà:Œ‡:Á¨¥ëPhZIQ‘v " ^VCwIž±;‘‡*å(«OháÚ`ñoàS3J~ì7õ£Iöê#W'ÿH‹11eY< '­âõ-²ÏL÷å—ÎÂeèô 6ÔL‚¥o9Úßý}®×²(:ö;Íâ5ÿ_š|m2ŒQF;fŒX6¬ª“_øÃxÖ íŠpò,® æh %ˆ#έxdHIî ÿ­ÉÅ7räóPY ½zÞ9w•RŒŸnî– –+ÉûD#ø*‘€ 0ÑåBæZƒ¦/°žy¢B)üÜF31×Å|ð€n¢„Ö¨ÀÑðÉ*" îAU‰ ¼6j뛋®j²Â xj¦MÖ}>Úâ>ñÎÖÍ…7Gžà'ÖÕ!¢Þ_'‚úõu„ý°žZðHpéðĽ._ª>Ke–<ä>÷듵Ûÿ÷Æôûø® ™›«±6ìIþÊÍ9“ɶXu1¦ê=V +‡(¯ Et—° L¡”6åô” 2[Õ jº¿.»ø3}Üyý‹ï£V%ùϬ޶)¦íú t¥s²ÌwFJX£ÞêT Oj µ!æ¥',²ªkn©ÅÙ~ø'%-¿µh¬ýQ ’4b³RÅë4Ì8/R±šµÒÚrLv^Ý(RÆADцÄRÕq‡JRí<¯'4í¿üý‹áäßV«KQ\ßœ'ÕÑLV¥êYàæÁ)~á@w—Æ~ñ£íÌ+¶SŠ‘œµ(*—µÎÁi"p¡kðÌ_Êæ™fÇI?R¡E…#ƒðVÁg}m€(WFøv$g"Ñ)êŠ;Àz6è¸ ÛžÀÌ‘>]Ò€ñõó/,‹=LDÞDkß[Ûôyæn£tЇG-—Áò·wÎPjn¯Lýï$Ù:üE|Õ^.L} Á3ùDG™\YÕÀSñ°;yÙTiŒO‡¡_“†xTZ ^WTÿwÀöÕôG’¸Ç§ÿ¾µ‡ˆ™Sà xÅÕtÛYD{E{êEcUôwYSS±Ï¼Äˆ£Àì’’B²hmÂí`Ò›<»$Ö[o­:¨œ~‚Ô¼Âq) ¿2uº’ÌJ³”Uø‡tPÔ½¶v§>Þöß¾BÍè6' Báù|uß÷1úî/yǶOù£oqµŠBœžƒ§Üœ(Éjàæý^,ñ ’‹Lˆíyhï‚W–-b=êó0Ù1þ2ÑYŸþÓÈiX´ i;øiüᾪNs•ŠvQ7êÔS¬û+té¯t™ûÚèÑ%÷šÙñlF\SˆÿùÛ_ÊM³ciÏ´r㬓ì÷³‘7‚^»Æt«ñaùF£G’“d嵕PU¯é£•Üq¹¤ ZâTq3åÎY@µZU9‡Ò,ª"($c“uö+¡7èm À]Ø cX0ŠÌ„YAGÔA‘s«Š ò—!–8gG- ç™Àë2Ê:„i!µ”ªd*à‚‹ó#ñCYÂ-£=î¼þÓi{]ì ãèáeÈÛ“š—à–ƒ­R<™µöfaI&2Š‹~}ÇTf6 cµcêK!IwæPƒj]Ï ‰ô¥++sèqK6-¤гDª¬¿Eè=qSzKœçE¹´`°\ÀëPÞYÒôŽäº¹_·ÇK.Mn[¡fù6^'$Ù²¶y¸û¥Úº±!ÄvìÔÍÒuøäV/x,˜à?eOï]Œ­¦¤pd‡Úh!Iös½³“"mfš¬`Žë1bù=@§åXàÉ`ôWÀÕ¶dYÄÄž Åy£]¢xÀAFJPÅ¿ë«}>žá /NÅÅI¸¢—ª5ñEÿö›ÕŠàŸÿ\]ì–5Eˆ›yåb’Ö$ÖuÒ„;ëø!è’—#D"û´â‚ G‡¡—Œ™¼Òš··³Cþ;ÂÿXûj ffܾlæ)…ë."BÕÕLÉæe _`EõªÔböåh¸t´bÊFln|B¿_Ôû1Ó^ðw½\'f©´ÊS|C¶Æ"; µ™ÝÄ¢hÇBÊ3àÀÏ(IΩõpVð{"Žá! ƒîvŒ8c6°´œŠÝi ))žÊâ¤-?ç—É3Äü¿Í®KÖ»§ñé ³ÒžARmäHwxôÍ{ß/NßÿñŸbu}(Îm=‹å†èWcÉEîŒòð ˆ~ñÄB±wáá&v ‡úÀŽÍ,'£w)pQWè̺Èzª3©ýÓÅ…TÙq”ýµId ùûÖª>’Ñ ÁGòdz›*3›u&O_œµñ½Syá~ª y[œkãƒã’Ƙ2MÔWsm¦áÈçÙˆL]ØgGÙÄnt)/±̶ÂV[û¸”“1$zþ2<(áþäê…š ¬>aörGŸñæ2Èx˜¬V3ø)²g‡¤ÛÐ\°\Ô.A/§Ö÷‡àSSþ©w.– µ6uà•Œñ2ªd¡Y­¬fLâ”.(Êm=U¨ÀèFÙâäù`”ÔâY‰©ûRµëÂ\š£?æ"q¡GµhIo|öÉZUÃÓ ÔU=É ãyøD+ûÿ–AfFPœ c\wxéø ½Áæ‰ï‰Î~,ŽùE•¶Ê—åÃ÷`½Í® |±Ô&r…Î;b~žF¾„)ñ¹#Ì럱ٰîa~u+³ä–›î&î¡DT·´ËN0M;›c{.ž¯#ôrŒ*³à\•Ð]‹’NþàÜ4¤ÿûDq Ã <ƒVÜÁ ‘âdõ!É|·àL°žc”W—o`%ƒ›Â°É$Ù=Éëý^Q¢ç¹+í®#ÕQ³‚»×†æu-T±({*H H¡ôî=0@’UÿBL…bHÅÝIuØ‹¯~¥Ç ôÄ{Ñ'\e tËIAÀ_æ9_—>†åhM þî*J–´¨ÛŒs~ 7¾òR‹RPxœ¼pbþe|<“¢YhÝ}ÅAE[hMg -[J¨Mú§b<Ã3 ÔÉ•æ­7{Oue.‡J—JÈ‘Ó5a´ãþÙ![ê}´ð(”uËÜPÍÛ®âÍ ‹MewËûR-€¸a9ô!#m-‘™cžqÄmv¤ŒgK·Wؼš'«„Ú†4‡ÀœœP£b½§¦½n§t´2–Uõ ;3O$ú8«–Ûä&!O£ïЉpÛ-¢š@=dèÓrî'¸0Mën*ׯµŒJõñ. ?²|OƒRèœsÍžd¼\󂚈_Þ°J¨ Ýt?i.aÇl.OæN)“] e/àYšåä a[N­šN‰AðT/üÄRO. ,ÏÎÁ”¿f!S>ˆôÉX¤ç(ë^%Á|à*üjq”Ø93Â?2jpy”‘Êß*7á_Ê!_Húi0«ôÄÛ5Ãó¶É ‡Z.V¾öYs˜®«*„d#Vħ/o8>ï{lŽwÁë­3"Þï;ˆ®µÁ™0¡÷Çx¤€ª*iñïÅn+Ù’ð¾ŸþûŒìsS§ý¾®|BµÅþÃѬhšu$ògXˆ½›œC¿I9Ú±ƒ~¬ž9Õ7ÀõÓµ¤‚ç©EFÂ>¹Ì¿c{ýT1”k½ÿ6ís?–NµÏ‡a×ñÖ8ÚŽ2$–2Wgž’%®\|Ã¢íŽ éƒo£Ë}ÁعŠâ"Ož5áÕNÑÑRÉÅ­™ t_mU?ôšÈÃ1†—i[û¤呂3!Vhîõ­óþm°ÙëǎƤë–ð·kûf …õÀzÂÏ~x F›ê ')ª}Ÿ»©Åå"oàœ_»ÆðºªW8»¦üŸ4'ðHíû„L™ë,žºÞk xæ[Vˆñ÷c>Zc&ž%™¢-|³}Í N„šn ³.ŸÀÄ4³ŽHaÛûÿ…7[YzÖ3íyTPÑ<]–n¥¦ï•¡“„ñ‹Øñ÷껫z}sB)b|’ij¸ƒœ Ft8û`¾öÖÅÿ}Æ•f_m†;ªmÇÛÊMhš}A P@Wj÷¾œÄBžWõ¶؈łgcO Ó:•2&ÌÈÇÄ,‘ÚÚ÷=J]ƒÓ·3L„evºŒjü—G8n©® |o.Ï¡¶&îàzuºÉ“ˆµŽbq šÅÀsq› ŸÎÅ„)ù³^ùZ£F2žaa"£øAÒœVz\ÕPÿLÞc%1+ÿ½ã‘‘ZˆãH=›1eV‘ô £+ÞÁÕ†®ªî€%ûÙ}J÷ÃÂïúX+woa6ªVÙÖhèô«ç`ú‰5$ûžÔ *ª®}m¾’>ŒnÖ)"­uB”Š@eƒ½ðŸ©Ìƒò/‡0‘.J|ªªQ÷à³·sXÙQ¢ç¼xØô†BŸDø5±wÜ|< H¦a¬~õ p•hÂA/ŠÍéT ”¼Ââíù\«| Lm^u„3ájƒÀ «˜î÷¡›:;ö9 O0‹Ø›ï̤?â‹«ë÷´€™¡Ñ"Ù+_ó…6ÿœ— Š_Em3Z´ ú/(wF´5?Õ‘ ˆaª½:´Ëòø;ÅfóÜ"ǵæ1ÝZÏW¥x³ý„Üs(6.š8ŸÐZ¦iúñXކ̹)}B0KKáõFµ4OHY¢]O1ŸŸæO4E-ÌOú]YWjDáä6ÆCM ƒs’»ç;Ö‚¦ÏJúã/|9ÑØ1Áܮسv`Á¾&"%È7J¶ì.ÃãÝûÈOç¼éÙÓŸÿÉö/ há$ápžn‚mûŽÅ© Ö\0w 3ôË´«~¡tBno(ÑV V¡LÙ×f¥+ëÙdS:öXab¶?©?…òÄ`g˜âú¹5³‚л~/!꤮óa_ÐM½ïŒ]I+p#meC i¾rݘOÔ =¼=ü|/Î À§ÉUÖ\‹ýZôèñvJ¸üstºŽë7°²lÑB«jm,!a¾ÀÁÓ0vM¼. s+&IÔƒyã±4vJ#f™töE´ˆ¿yùÃ9à¸HÇš?ß‹•t’"NÏкC›eù¦üWw‘ñ–¸é¸“ùZ&¯Iüáð#–{­#Å;&€;À27Tk+¨ “$ý5ïY@µZU9á½¢:–#Ú|¼šœë!Púd`ŠZý«Î šS"LÏh'r¹²M ^¬‡ ™…“sVHgo3~RϨ¯Í?±rÞ^šÄÓ‡ö+ÿµ”vÝ$ÎÕ&•ô Ò${ム£7»@õÒ';)É)¾vO¨gAÞ²(·E½ærÍÝ[gÞ]× ù£Þ g½++8 õû!Å=Âm# zg'€ j|ƒJ(Ù)»öjöàBO/#p©BõÝCf.™•‡]`n5eâÆÁÐy»…qHbÞnúÀsjM%‰E†ÿîçÙÊÄu@3•»„8“1{vOëhE¾\R­i÷n̽ˊ1(SœÎDZ,l»zPˆjÝ´.:…Ú)Gû2aø^¯Âá{Íc6äù³š\}£¹ˆ;E@Ç^0­‘·Ö›?·‡‚úÎ.©ÚÀ¥àÔ‚µy‘êñù uz!ePü¤Ç‹àôhy¸¯Ê‰‚·ÝKål.Ž-¡zÈí/IŒ‘¯3¯:=œ­1¤ôÁ!³ì"xànRÇ À¸6$ õ¼òÐ=‚Ø‚C8 ¸» Ýìw1ìÊ þàÔËQµâã®Iúº`Ó(é ´öÌ@òÐ}œ½.Žâ¾M<`IÌc*|íùÄÊ{̧Ç_¨[É WÈ·’E~éÂñwÆÛ„8ŽI_7Û°áÙ3ZׇcM O`FöTðˆu,*àÞÊ0–ë‚•ûx Íý ¼„éEäåßš(pZ¥õý)ÎBÆ)‚±—ŸÿÔæÜÑbدՓ!bÐóŠ_Ì_þ↸˜¶&QMØJTFÀ‰°¤ZÖ÷û.aÊWð–ÉËîL÷ØäåL!V36¸óÑ?°&Ô¯›j:u#ƒHu ¹QgžñÁ°_BŽÞ’’ôòîÉ–gŸÓv WÃó‡AÍA¡¶»ê• š]LÁ („åÑÁ¾¬oZßKß– ‚àýËö–v*Æô5‹÷Í}‡Ä̵£q¿áP¸ê>dƒüÛ¤«¥IÔb_þöAAšŒazlå[ùÇÀBµ3¥ñø#Rà-BÈ!Ót¼¦ï7Ï‚kã Õ«Ô^EJšp"…Yäå[º²M»J³@Á°¬"2ÇíñHÛvFjöZ“ߺ)‡ß#@mik$};Õà-âÒvlŠôÓü5ûᨗÚy’q–@ÞrÖB‡º“‡ÀØÕˆ±½ HbZ¹ ;<{>ÀÚ MÀióìú´ÁxÐd¨ü„ZÇ£’d¥&±Fß‹ÂzÜÜòÁ±O.FX™ñïó.+[*Øã‚ƨuÞ^ðú]âTTçXÄ“÷½eØW¼0µvÈœ n~ Ñž°³óïfÏKôq1eD.-ìcAò äjúÞD•n70³Ú‡Z1VJBç²KÊt²‡~qFq#mW4Ný¿#3ƒï„ŸØy÷¿¥ Qõî8C™óµ¼AŽÜGÞ~«œ!5d¬øZªlË/ÐfÒß'‚©ôœTÎ&Wžãx©¾hô"wÎ^E˜qŒ-ü@•n;N›r£áØòjã“8W8T6غ`—(v2ðz³0[Åþâï&]Ü(ÔØÛ¶“åΜþQO–~–KcP>¼iÉ}-¯¬uRÿ˜», ÄJ]f'û–‘}ñiâFa[jݰVhÆðãy>¢YÿÇ!H7‚bñzGÎc±—Áré!låg¶Ýê^ê=™IŠð¼Õ“Hcƒ[ b„}p`n?7yáÿØÆµ}]– ëêá „R%álÉlz•&…^@˜Tn¥Ã3vol'ÃKÜñ²,š`?Ÿ‘¡¤^*CimYÝ„ÄûÞŹvT6\2ò‚’›O¿´c8ù)—…ÒÇp/έ’"æeóK‘ |ùg>¹ E(hÉ—mXwËíNr¨7ã^œAD5pž¬[]EW\]Ý‹UÕ³ Ë=¾ÐŽÆ2cz rø ÑËéž³}é[ÊMÁÀÄ€C—¼€¥Æ>”$'Ã;ëÉD¼ ·Ö¨«ÈàPu*‘ëñœâ‚—ãøü‡âG>°8a@µü•‚ƒˆï<Ü8ú‰rö@ÂÆÇ£ qS•é¨Õ ©3 pî‹bE½ÌÕX>µ9™$÷8Oüýg©PvˆæÓi-œXÞAÇq¢Ûp1{åÎY@µZU ÊZ˜¹ËÖ#t•9Ñ qÙ&móÈžÊgË$NŒ,UM=ÝcÙü¨… àOË'\9X‚tæ(÷Ù„j-ÙÉ{¨<Ù””l˱màh %±:WJÙ³+‘ºÇÙÓÑe-nVÛ”A¿Tã´”kÏáÖ_§ Û]Üï+1<Ê„zv:Úq˜úåÞe™/K#ÍOhÝÁ¼X'»a(þÏÍôðqOÍ@2öÑb—EÆ7°M•°š<·éY7È•<(·¾¥½1Í”_mG7¨ñø7-<À‹3TKpÆ$á{o|™º¹wQÄÇ.8@ŽË·B6GZèÞË‹Q=Š ´Gÿ¡…œp|(<,×°BHh(n¤Ñ‚xzŸ^Ÿ]8…qz…°ž3¬W<¿DpõPBMÜ›Õ|á|„È•}@§9ÂÛh¯­*½~‹Ñëâkïœù"óç²èhI¡ˆ"~Þƒ©Êz-,~q•þLfm “þdQV²7­Ÿv„më¡Dm¨¦Õ9ÄV4ßMóØ!4)«ñ­!ÝS=ø)d ;zq0ýìuÁ:>«JØô/ÖØsÔlNšê·ÐÑÓioûL„˜šÏ/Q¥î!Fy)ÜäöÕßÈT ”•z~jÛÌ™î/Ÿ%ìBÊi ŠFæëK xèYÂSÃre·!üöá/™’ð¤ÖÈlL¨òGqÄ"°_MJóÌ‚é÷´Áªù\kØí…’á%T—\h½@ ”Zy¸ãÌtø~Ï}“^+ÕjÕPA³ô©ößèKŒø? [PÐø”,·˜ôæ ⹄Õ÷~­õ„FËB·ùD¶`í¦pÛ`Ã[-‹™òœÚK>‹®ÒÐBèx„]å ùÝ[Ï„.ؤ¦|»Ÿÿ¢mìsS§ý¾®|1†kXeû ‰h®µ@û蹯2y§·Gv‘pöZ„¥:ZúµÂ[ï-厈@©Ê9œù†a§€ôCvµ%<þ<…c_rµGκ3=(1/Òt¸»8wrñ…äcº‡ŽX±O<Þ÷âÉ‘:òNa7+m2&I.A–Ñ^¬Ïpe߆Y:KS¹h€TŒÔu†ðž9 ‘ÔÀíI»·^£K·Nh;yi°h–êŠÎÙeb‡Vƒœn̽Ùô·‡Hoyq”Ê~*‘ño=SÊôh„w=ø)d H :žý–ß!ÞX¸Mý~î4sƒ hM¿{øNBº¨Â*þ¡âOJ¼ "/°=#ùsç<…ÉävOk£ÕK°6šó Éü‹ÓÒiðÕÑ õ°h4®SäËñ(¹—qV¹}5Tèüàúýà÷…øò¡ê*™dÒxîm·­›Þx ¾¤Müž¯7í‹d¸ „˜jEÀGvÐPõUîŽ2&V²RvDéëšÇ ƒini¨‘˜é˜ÿ®{R‡ß†º¹ŽÁC"°°ÖÕ½Ð:Rˆþ|п²ËÙ)@·˜E?ÌÿÂÔ6ô5b-6HAà°~Nã^xPâžV&Ò©éåü¥àÊ·Þø«ê¢ åÐ¥r èpH ×啿Є.õ4Y€ÔÀ]4óÎ7jÅ’˜;ÝKBv$6è£ *ðßçˆÈå«þy!µ¨3b„}Z<{?NÀ¶ðK*¸kO_™æñc†á>9±'ç·Gñc'vïM)j¡(Jˆ}£úmŽ âÿ{µHò3X`¦ÖìþŸ:Ö|pg(gµb/âŒË3/ÙOø}*â/ätéŸóŒiÞ|e¤eïÑËÚ™‹²àŽáœh%Õ´ü'JŸ%eU®uéq óf!Wˆ´3{>ã Y]~ù»›{öÍo¨± ;€Ë*lßµ;ðĽ‘¤zÕÍ…&1ß!Þ6`GŒ(Í•aÔWsm¦áÈþy!µ¨3†€ÒU º5ÒÓˆâuý`ƒ­•À¥‘˜IÓ‰ÈÏc SÇlѤ+=d>1©"éœ+¼T×D&ÞqÙ%*FÐÔ¼üû÷ëŒÄ·ö›»\¬™Ëv*åÝ‚yWÚ‰è*ã$°íÌÈòÙÊxÔõÇÍ\;ž“1}šë¬“é¹ÙcׂÎxœã÷êt¡ S"¾î>ó¥#Dòðápž§#_ì(Ë…ÑÁ. eª%*…Žá±÷ ß£ªÝ}—‹µ1Ò±ç ›ÙVŸÿSéGKçµZU9ᩦAÌVQì»3+ˆ'Å?n¼wß‹k«íÀ/¿”``4Ç*ÐÖ«vûtïZ䘪¬6RüÆ…ZÓ¨ÌR®Œ#ì—•h—V¹aÖŒÌÁ™x«Rå±=“Jë7Â!ôÃ,Úâr¼,Æ!D[ݡѣÃjP“ ßÛ˜7ìÖñ‡Þk[]-üÐ&‹§´6Á’z·*„Ö 8Ee¥²bÖ —I+•õ’Ü·dA1Æ÷ Eʼ—¬gƒ6ã¼;Ítn,õý$¬Åª¶è»9r¿6·ùCL˱L|™†çvú±ÙC2\þÁâ7k25.ð½v·aR |7­Ã—†ˆäqÓ,Mmç~ãk°ÒÂ` Kµû;ª©X@G¬ ÏŽ@r0tÏÔA$7Ì7FA9˜H‘'¦Ë—|ÎT!ù>SËi„ñÇØŒBK ÈiHÐü¬8À27˜¥¥è£ *ì™L#nKPÀC¾9Öý6Úb¥_Qb’y£’Çû»?¸ßV…š˜I¶t1Ô“6C©ÓÁò”®—xkÀRý›Nx É×dsHFNRë–ÝOØQ1#1‚;q¦¹]É5†%KÚK ¥ÏÚ3¬q:h¦ š&læ‹ I®8WÍÈ,OÀmÍùL¾ì¾ŠbtÎÑ7§ûdEi y$â»=Ô¿;]“‘?âéþÿ¨qü/ ñ[ÇmpúW1ª,¯&(”q=$ác¸œäç%€œq ›áÁpMG Ñ‘ª­`øû²†uª7gtVƒ›Ÿ”žÂ-Bн”ð›_Y½(@UKP‹ønL`ñ×##î#] q>dµ\éGX¼p޾90°¯úÄå±Cæ´eJ$Y>p©|8ÛWÛkE«¤ÛíÆËÚf¨òþ‡º~¨|o5ð`íÛ-¸>õ®|ΙÀ3«èøÃí 7`Ûj>Vœ„(“¶Ø|¯ýy½—±Õ¹#ÜÔ7Vyš‹ >,ˆˆ1@ŽûK¿=è´åYµŠ=XZ_¤ ´» •Ó}w«cO@KŸÿÚìsS§ý¾®|1V%8oÔ²€;Å{Éê…<¬áæçšc…Hºgñg ŒöÅŠhò 9XÕŸ¢Š0èCÜ:,ŠÅ§ä§Ç„ë¦"¼ÑëN2 ·ªå—S=É0Œ­Ãƒ¼šG³0@zdã(¯”èd³E\ »YTä•ÎÓXý·ûG$`°ÐΙàä Y2¹³ÖØsáX\—¼€¥¶Ÿ["y®Q1npž§#_ì(Ë…Ñ•˜¶}ÂZ%»ÚV·¨”‡ïÍqN–4ÒzŽƤàc/úÕj&ÐBð®¥ÅÎü ù²1à|妓S¶àãÝEÄZëÛÚe·öøÔ¥0áÖB_N}£1#ԮлjI‹n`¦wM¶kCV»Gø>Ü§xÀ)`ìáÄvÓܰ§öÖøõ7 ¤BÜÒTŽLËâz(-Å€Ââ¼iÙ!JY…ê‰ý+ÝWµîK³oûæë\Ï:ôݾCß‘`¤«€-¥®/º³êUb»£#ÁñQpÿõ¦:H jù»[úêÈ•UväŠËø«ÛÜÆ½ª¾z/:‚d~•eº"N\VoýÁŒ M$;ü7ƒ(H´[š©¸W;íf/ÈÚZT>¬eàÍñ–d©  ±GÜÆŽÃ/¦]b ¡|¿Bá.UìÅWeb9Chs㞼І& Íÿ•(F©ü|ÞðN÷4„½»oíæŒb•¿œÚ>­&À@µ§GÞ‚ AD¶`í¦mªýõ¶Å(Ù–{Š]d5$;Žtat—òW¥¢JÍ–œÅ8ÎñÂLJԻ$a\9Fd½Ò¬”{Œ¢WtFdw^f• { cˆ¹£gض½±$ƒI²[ÞØ}ç5ÜmÚëÆWF¢ƒìiÒ†”¬ G'ÚæµΈíNüÀà¡Ë*Z[Üy—~½%ø²ŠnÑÕzó>çH^­íûÞ­\G Ñ‘ª­`+>–Ÿÿ¢ÊìsÐ1ÄV DøU܈ש÷ÿžÓ*†Y{9<ÖC% ÒÁW¬^‰°Ï„‘å23îÎÜjûG*<6ª`HÌïÝ~RàÞeú¾`墴&–z¾ª3=Ͼ±šw¼l"®[õø³_ˆGnüßPß pjYÕØßhàãTzÒQ’>%@a€cq~m²’ç ÈÎîŸÞ’ò×àÕݼկJZ§ÒÀƒC¬xf¸«ƒç&#©#ô¾M•|1"ê@aÛ;l©(è+8¡÷Õ,¡è`ö¶è/Ëú yÅ—gÎMG oé–>X{æe˜4Á·{÷Ø çpñR¬%mÍíœÐ`§úœh˜­96Iñð…ýtîWÕgÛàþ²¹9·¦u;õ7ÎíGýß5 Ÿ(ÅÎ5êå£WAÿï£þy!µ¨3b„z?â¾„Ž´h<‚þ¡oÑ@€°†B=g EËK|ßÕðÀ˜M˜üÑòšAUÅ]u ëÒú.ÅmN`…æë³¦Õ[ ˜†tg–ø¾LÓL!›½ˆÒŒg˜znPìׯ5iO=)ëÇÉéÍ•ŸéY]ÏU’„q{ŸlãYI0‰½â;Ì ßi5zÕ€l²®eÂÜ­§ŒŽm9n?A¦)Ô¿³0M-ÿ.ë ¾TÑÁ[YâäÀm¦Ùè).h8ÃÈ}w«ƒç+úðçä~s›?íα'\Y†éf%®ŸîA«À,3`¦ŸÜ;t~Dy_ÙiÚÚº'~oðyäIEÕ¡CVûêã[‡’pyÔÂÑ¡]ð ž" Ófuoéç‚X§ÇnøHÅåwR%óÄJžm­Ñl2§ÃªL{äœ}§ ¶yNb2¥˜þâÂ^8Yà˜² |6Ú“—öÔÊ9ðt ezwËÌÏ=(" ÀäøY7Ó+Å&S Ÿÿ– ð˜+žÛBI Ø\&"æ&öà'òb9^æLPPqð¦zã E[¡X „ ÜSf/Ξh}SPPª,îþ8VÞ¯‹ÝV+e3°ÌlRØÚ»Þƒ²úùÑ~ªUŒ«m27íïøÁïo2iQ†cEÜ,;DÚŽßÝæÝÑŒ¢I5ÕßYè¤ÑXÍ^¢fø'rl“ï‰Ë85¢|Õ]ë†B=g  6NÊO6ô­e´À-í“¡Õm’ÔŽÚfáNêûú´~¼ÚaÍ?X/`Þ*ïŠiph4n·vAŒeGÐõ_ ´›!…ìv$ À’ãÚ%¬Y•R¢dµ:*ô&ÊõßZ'…Š“{Íro°G—N%»Gà¬k”Å;hyNdá´Tìl-ö»® Ã÷”+ëÏMÀA?ŒÓž«°Üeg?ý=–¬~Þ6`1npž§#_ì(Ë„a7RÂøU >€˜ª€Ë*lßµ;ðĽ4œ«Ÿ:_-‘n²9Gñ>Ëã¾ÓÑå˜@ȯ$H•î#€ÇžØ>À²eË%ö5²:iø†H^iq;QÏï‘{ǶD7œF¥dLL×x +…ς̈́´ô´Ã  þ$#øv’رµÔóµ‘Ö·yá¶GZÄéXªúÖ›¿³¹ED‚ãG·WQ)>KfB·èàšˆ$t!Ú{=õÆ‹; {ÊŸDø7.‘oÃ&¯JZ§vuáÜ ÈXvVj ü|9ø}â V_rùMl¶XÝÃM1Iu­½TE`z¬ˆkìžÐNß»žLXäÞ—”3ë¼ô&ªkÁéžØ§&N’ŠÒu9džc]U¼ƒù!C#"Ô±l(ÚŸŒë:!Þ6`1npž§#_ì(Ë…ÌmÔ¶5t¿%Ø¥Æ>”(fuαç&!vꊟÿ½iìsS§ý¾×ÓÍ.N+'ö}­vü ;=SÂåm‡dC硯€ål7¯Q­æmó9GÚu¿íÌ£¡yÐr\ªWþËG³?‹ÜI ‘€ á†+8Ö·“U¥kva áñú÷mGP BùÝS=ø)d ;€Ë*lßµ;ðĽ._ª>KfBÿ“øqxYø Û ‚°<ârK?¡ß[ Æ4Ná¸g\g®#ßÚ¹EK'à­D×H&e¥ˆ 2T_Ò.¼Nlõh  °o_‘þ<]¯mƒÂ:_W]"Löý½Ê[TóÂÒ•’ÿ7xKcQ²á®³ Sbv¬YäåZÛcúæ9"k(W’[i…E blÒx€kŒ?Ë~õV.>›µÛ¤îsvl¶cßÔj×AÅ0Lñ|F Fr’>öô;´DJ¿#ÿtd‡ ™ìÿKh(–\EÌÙXëiàDO—(\…Ö´˜ˆèyŽ0\Øc'ƒÝ@Ö¬²ŠnÑÕzó>Sbv¬Yäå[ùÆô dŸÿwìsS§ý¾®|1”ôðycR~ÇWœ—PÊqÛo9@CÝŒA´(tA,¿²«ÎRYåTg(st²aî³uEi& ÑÒ[HK¸¦~“T«äñR–/ð ‡>GN=óH¨Kn.ÆŒBìÂÄ­Ÿ3þœQ%ÝÔàjE¢ôYcÖ,­#™ŠU!¤Ñt²‡~qFq#mW4OŸ¾®|1Ÿ·1npž§#_ëä—(Pêäd脊‡N+ *’ë„«èö¬DNÈÍ;ƒo tPë29üû‹Ceˆ &}ø= ¿—^äçä›7€ú”aõñQlë`~w •iœGª‰!F÷¶urUK.€O²Â²?&H={^¨h=\àÎ ̨b’tI\Äm²’ç ÈÎîŸÞ¥Bˈ?\ÐN¯&(”q=$ápž§#e»ÐD5Å Ü·½-Øô=7Ù¹° âþ’ö,5äh|Bsù¯?ú͈^ð¼IëÂäÛÌɶmí:ûÃ6e¨uA쥄Ú=àÇðá‡#+–_—<Éž¶"h’Ns²c”f~=¦¾˜â¥ÏÐN¯&(”q=$ápž§#_ì(Ë…Ñ•˜Š~*‘ò'u÷À˜M˜ý© ØjÈ4ö òª“î  Xº,þÀ »F´6ž·Ç,of2 èHté–Zsš -X–GËs7$Ì–ÙîèÉ`ôæAI©1ÊêZR¬>;ÆÃ€)Å˱¥`⓸˜ÚȨDàHS³‘Øã ÓQ'npQër²äFöTðˆu,0ÛÂPT‘"—_Ép;À27˜¥Q%wŸÿqìsS§ý¾®|1—×è‚íÞNo4²¡EÖ&_Ž.²~ƒJc·&á¨í:к³Þ ÿµÔ1ˆ°Í¾ðšŠà)•U~H±›Z)lð©8*h ¦‚œ (åojIXü˺Ê(Ãÿc†â@8L[cÌ È/ÌäKκñQ-»x¦€½¢>Ve~HôÐtVƒœn̽Ù芭—-ÿ.뚺α'\Y†éfR,bœP”O‚z€D{>-;à¢,4>Ð9 §ŠSDHb/?œßWTý?.^q¯õ90úûêÀ-{!›rÏÎ$T¢>Á:§;Š„R§S É#qÞó¤l°…v¥ÏÍ‹²dÉç;‚]kÊ8uZAÀzëàUR'ƒÝ@Ö¬²ŠnÑÕzó>Sbv¬Yäå[ùÇÚ­üûR+tÍ[ Bù†=Ëz£}­&©éð ¾Ñ<òhDDp>Õ·1†²JKø¤Ò¿Ä$¸}W|Ë!凪«ŽÒP²LÛe/‡x3`¯·ãP?¨‰V„¢¬ Ó³÷Gö9Wh0á÷±YFàâ9±ÜFFÀ=¯0›q×>:\JY؃:Ve~HôÐtVƒœn̽Ù芭—-ÿ.뚺α'\Y†éfRX¾éd.ÂRSgãÇÁ¹ >Eá‡áÀžÀ±™qƒN`ÂÏÑVÖ˜áœá[É‘‚¾KÂe‘¢8÷S*ZJôþÔ\¹˜v'*!:I&g$¾ƒèJÖ˵Ê,EÌGHÅp¿~“ÄmÑrÒß6“УˆV0 ©öÁ-á|Þûš0.VÀ…óƒÀeÄ%Søõ‘61¥°îoÁpMG/-\Ÿÿ!hìsS§ý¾®|1—ìUü³Û@ž‰fâž°‰¢òpµ¤ÀHu#ë1°PÀœúÏ´1ñ„Þÿá§ A¡¹Ák$ä-é8z~B´*³µ²Œ\ƒÒJZï=mqýÇm8ŽÃ¼â‹Þ6#~˜$,™hèuÖ‰Zʸ¼um+¥o]À$Ù:üE|Õ]ë†B=g Dø7-`Ýër²äFöTðˆu,0ÛÂPT‘"—XÍ¿t¥_Ñ. DÍÚ&蜬WÎ?µ2b!Çï¦7(Àb×À?v ñW³ÙÓNUœÃqYù3ì{»Ÿ,ù7- éoÆwxqÓGª¼jŒÐ:¶ª@ðO¶v#úøj@´h°9+8—2šØBSÇ.¤ígr@RX¾év¬Yäå[ùÇÚ­üûR+tÍ[ BùÝS;±Óöؤ.‚bÙàIÝ…MÝMÔ̯뮭ŸjR*Hi’F“§âe¬ùü€ü×ÅxiL(gEãs©L–  ÖUݧˆ§Œ¶Á¤7!pðtOàÑ\ÓÓºzPIñœåC/Îðk EÊf¬Â.¤ígr@RX¾év¬Yäå[ùÇÚ­üûR+tÍ[ BùÝS=ø)d ;€Ë*8Iíß3×mèPrâ %q~žÎCæ{*‰s»ú€ŠZ‹½4QVø{Sy:ÉKþ”w ÝÕŸn±ºÙVKö(£3:¡G$²™ÉnÂ…Lr’3ý¯ý‘å52áÚv¤>ŒÈÏ1ûKF1Ý@Ö¬²ŠnÑÕzó>Sbv¬Yäå[ùÇÚ­üûR+C-ÏŸÿGìsS§ý¾®|1Ÿ¸c5µ7µ^SzQ¥›Øa3Ãg?¶¯U¬f‡LŽK02˜äèº%¦½PhBçxélÚÄš¦ ÆÝ5"Ò…¯^!á[½ˆéû–%×6ÛMÖQû>g¶2šçD+¹\Fr™Ú>­&À@µZU9á½¢>0<Ÿÿƒ?ìsS§ý¾®|1š ³´ 4ÓPa‰€‰Ä8N·¹›¯Æh Õ´Á¾BëCu‚¾l†­†}jt‹=vH¯Ï@IíBaãÜU»¤Wae/ø‚“[†wÅ—Q…ûôÂrÃq‰ñ…€Eïó•E ˆÐÔL ªçHþP‹ %+Qá0€Sò'u÷À˜M˜ýدÕÄ%Søõ‘61¥°îoÁpMG Ñà!ðߦ‰OûÝŸ£æ²¥Â[X¼ú­Pš.pÌT%»ÒØ_݃ÚEò6/1±"œ·*íRÄú­ôa)<<ÉóÔ]^ü„ÈäxÈ-©Û¾c "ûù¼±T¡ÔsVïÕ¡ÐÝ¡$i s‹; {ÊŸDø7-`Ýër²äFöTðˆu,0ÛÂPT‘"—_Ép;À27˜¤ví8oUš$[BŸ)ˆó÷`&‹Ëœoõ6#ÐHItç²&ý\kó³å|ÙT@-Ùmçö& Lñ„ÜË~QôõJ;¹ ŠÆ'¼†ÖxÀ„|«°=:CîéVë[ª›1}Ãë ðõV- Is‡W†éfRX¾év¬Yäå[ùÇÚ­üûR+tÍ[ BùÝS=ø)d ;€Ë*lß¾êÍ–(â¸z©Õó7BÍí“"Ã%/žQË ôgø;ÐkÄ÷¯58D);Û8bëy°ƒêßû‡~§šø(â?€¦¹$x(g q-E@1gå(‘6C—¼€¥Æ>”(fuαç&#¨ø‹ÙõÖ ?}w«‚ô•L"Ÿÿ=ìsS§ý¾®|1›"ëçßû1³úŸüžªø’@ÃïãŠè”ÞJôjõßÈibÞ|îë$8uVÛ2P·/2,îmç݈LÞïÇÖR%q:,¢Ê1‰}b‹›|ÿ˜ëÉê A£U›M—§Lm‡v}n=‘™4lEƒŠí“¡Õm’ÔŽÚfáNê=™I+•ùGúNçR´_TeÞ­øY¨ùÿ¿P¤µnŸvÝ(–”kÚúí÷¬ºcÄ=XjÚïdþ±¿CÒs­•SŒ]©Õ™çÍÞµ7ÍNì¶Øšw‡}P3Ú¼õÁ|5IÎü_+˜ÌQ_¤Êc©Men‘ÎÞÿü}fuαç&#¨ø‹ÙõÖ ?}w«ƒ!nÑÕzó>Sbv¬Yäå[ùÇÚ¹uüìn!&7“?QÄÆÐTÐÂh»V`bë}(½›JøQ žVÊ>¥'´Þ}žÁFÝþü´Ó~Ë”É:BŠÝ`t±§Í²ë§O@ïEòä¨mhQË]=6H£ˆ·•§ÆÝýÖ%xYø Íÿ•(F©ü|Þûš0.VÀ…óƒÀeÄ%Søõ‘61–Ôè'ÖC8P^W©†@x¯©8‘q6‚¸l<ÊýÙ ©ÝOCJ†Èñ=ɨJØh^¶lm£Ylgt<$Qö ZÒ¤¼ˆeô¯à¨Ôƒ6äŸz©³£ýêËÃxA>:®oubç+¼]‡GP BùÝS=ø)d ;€Ë*lßµ;ðĽ._ª=þõÇ+Ÿÿ1ìsS§ý¾®|1›"Cd¸)nI-/òcš¬ßdÇzD„w§ˆü›á¬8žÀŸ=„|ôE%ô €ó9"5%j¬¦–dñôöÑd ÎEVŸß¸{Lïsß/™þ+Mñ§‚ ohmË÷g¶4qØêH¶Še~HôÐtVƒœn̽Ù芭—-ÿ.뚺α'\Y†éfRVñz˜s1tJrh3tè?{À÷7)1î!aâÍÑÕº Çï©£-ÒïTϨs mí"g¯C`Ãåœ_QÜa,™ýÂô„T– F ç›ÚÂYAkg½t¨Þ?Ù]&¹cÒÛ&™\õùIÑAµ×ù~…ðãÆÇ`½ žDžâÒäFöTðˆu,0ÛÂPT‘"—_Ép;À27˜¥¥è£ *ìªÿYEðáÈQÁõnS'{C[c_U €nbÁ4žƒzN´ÑT‘Õûf‚¸S{h`RNu3)¯×‘¿iW´ãÅ w>µ•1ó ÇYˆ)Àe¥ö U¦¼ª`œ­85Îãw£= ÔäV«ÒMÚŠ//$ápž§#_ì(Ë…Ñ•˜Š~*‘ò'u÷ÆÞSŸÿ»"ìsS§ý¾®|1œ¼ó«Ä¦‘°5r7°'#.ß~÷ãÒ4úZÖì3ʆUÌb7ÃIœÜçe!εÕH8öµ®i5J· *kÄl##¢íE®Ï ”< ÿä¢õìÚb s5+–Í<†²ˆl¹A±’§¾9$ápž§#_ì(Ë…Ñ•˜Š~*‘ò'u÷À˜M˜ýدÕÄ%tO÷€aТN6)©°ãíÊꌿÂx[’jÁ*Tœ-™l‚_1¸çš^ºó‹%îËX¿‹¶‘Uˆ¥Ì› ŃY»hŸRo³‘²C¼¶î¬óŽdL#H^5YÐþGÿþ­aÍ?X0 æË\MÔWsm¦áÈþy!µ¨3b„}ZQb’tI\Ä`´~¢|x¨¼k˜B¸Žž‰>q¾JÉ„EwpeVwÚґŲ"ÜW<Ȁǧa6Șç È¯²‡âôÅv§ŠsqVê*8èr«ˆAfî,е\™Í” p^Á‡jë¨ø‹ÙõÖ ?}w«ƒ!nÑÕzó>Sbv¬Yäå[ùÇÚ­üûR*k/£âölº+r+úÑî2ðHÇbh¤I¯Á€+ZNó5_¡qéqíÎC‹Âù:9†~îF˜:r]ßÊ“'ÂãéÙ¸5 \¡®µTfõBí“¡Õm’ÔŽÚfáNê=™I+•ùGúNçRâ’V9£ÓŸÿ=ìsS§ý¾®|1Ÿ±áY#úZ_ë¯J»9GCXYþýU­º±€:4ËiJ§Ïªèåò™'ß„ÓZâUî£„ä •ó.ÁÂ3($0%\³ùGúNçRâ’VžDžâÒäFöTðˆu,0ÛÂPT‘"—_Ép;À27˜¢ÛuÓ˜ú.3²î€§:nc0zÇ¿ÿ îÀñÉþOúY‚’§oÊê«ÄœAéÃ;…,Ä;¾mŵ,VsºKŸF PØ=®WÑ×°fK>cG”™MgAWî ¨ª†B=g Dø7-`Ýër²äFöTðˆu,0ÛÂPT‘"—_Ép;À27{óµH ó¼XB­ÎùIÆ´=OÉtë{ ˆ„lÕ–k¨œ¹–œ âKfBúF ¼i,r-O½nÂ[åÿ ½åa~’ŽÁ¯j§ôy×£¾½9gˆ­_Ôù(`ØÝ™KØáÓæÖ™&lQŽÀ ;G4G“OȾʹkó>Sbv¬Yäå[ùÇÚ­üûR+tÍ[ BùÝS=ø)d ;€Ë*lßµ;ï;.–è°¯d¸ißP)5aa»_UÂ@±—åvÌÅn&M÷Ô& a?x肜@íÈž²Žh2à¤zýâXêBIQ!ʱu+àçA*•ÆÁÐtI\Äm²’ç ÈÎîŸÞ¥Bˈ?\ÐN¯&(”q=$ápž§#_‚øÀ{m¨v ã8Y§>_}qVe~HôÐtVƒœn̶XÈŸÿüìsS§ý¾®|1M‘[mÎÒú g3 ãáSÌÕµM/mÅVžÄU¹”¡¯\>y¿äK7o¼y ï:*Cú˜@¬ï*8÷ÇBÔÉ«k´6Mí±­ÙêñœÈò%ÒéfRX¾év¬Yäå[ùÇÚ­üûR+tÍ[ BùÝS=ø)d ;€Ë*lßµ:“g4-3¼èqÜÀ¼!Oñ“2rœ¢x”–Ôµ[iýQÉß_¤LÖðÆ–Ê·,BFÌw,·¯Î"ï´aÒ-(»‚ÿ gÍ,„kË7­7gO†ÙIf.õ4Z„º.¤ígr@RX¾év¬Yäå[ùÇÚ­üûR+tÍ[ Aû"a¤Öù Xϱïñ·ŒÊÛî¾'¬êã¦øæŸÐïý‚¼x‹FËòšÀŽúC]wáõ›¼dʸ-©ñãçÀÓ®B20IZ:‹²…?ðÕË`‹Ud=>ë/ÖØsáX\—¼€¥Æ>”(fuαç&#¨ø‹ÙõÖ ?}w«‚»"Ê-xè8Ÿ·Ý3\¦Ú“—§J¸’J„É÷¥ÏP¾³®{ŸaêVÚüg˜M—gž\ÿÀ[Õ0dê¬(R€“aŠbZFãGÔNËjœûoëÅ.­ç»Õxåô}ÜÀ˜M˜ýدÕÄ%Søõ‘61¥°‡<˜]ŸÿýìsS§ý¾®|1ÄXcMdTšZ¦X ÃW–åÌS?‚= ÷Ëpnså™Òõg bxƒÓ4PsÜÙ‡ß`–¹?Ò6Ò$V…–<5Œuq$#ê÷äûÉ&|˜Ù{Ã@“"&QB˜÷løòßµ;ðĽ._ª>KfBÿ“øqxYø Íÿ•(F9’"¤…´rÎMn¾|^wjx¶·ÁI8핽2¼FìDl–6a è>x«—áÛXÓuåyX²ÐÙFà ÛeMmRݶR+M $í$‚½`dà¡k¾‘4ö·£¬LßMä½j™7jÅ’˜² |6Ú“—öÔËÂË4»j2±~qFq#m;„V„bÁ93Ô´#üýõZ[1ú@ûRâÔòK¥ôÍÃKU›’)Õ5Rû#h=uxÒX†2V,“÷Ñ3§0? ÷¶K ÂÉ  ,Y6X˜TäŸ4gÝ)= ~HôÐtVƒœn̽Ù芭—-ÿ.뚺α'\Y†éfRX¾év¬W:Wð“ñ l-èSŠ]Úô¡9å߬ÎÎÐn¸Ü‹\⡞eRëVà˜²Nú½kW•q£¾+'miÛ5ëΊ^µØ‰%WŒÍM©¦¬²ŠnÑÕzó>Sbv¬Yäå[ùÇÚ­üûR+tÉQ‰KŸÿÎìsS§ý¾®|1ž$sƒdq®rúvÜ 0Žåí,6Ée&gôe¶P~O@J‹â2’Øc'‚×ÈdVòüú2;ÖT`Ì×gæ-bAÏó“’×xÿ•(F©ü|Þûš0.VÀ…óƒÀeÄ%Søõ‘61¥°îoÁpMG Ñ‘ø¶mÛ ôl4¸ífW¨I™¿@Ed†o°Y¤LGnÀJ<èT¦IrÖV!6ƒ'L/´h5$Ï¡†ýF‹( \F §?ëNçRâ’VžDžâÒäFöTðˆu,0ÛÂPT‘"—_Ép;À27˜¦)ù‘*¿“"Gy˜U4”bŽ…÷âmŽNÒ§ÕH©³Æf¯”I²9v+W¬¶>%bmǰÖ7?ç8X.¡žyJcm>…&Bs­fíƒ:Ve~HôÐtVƒœn̽Ù芭—-ÿ.뚺α'\Y†éfRX¾év«5hf"‘ì;HÊìîÚ…í–ZÕGÄÚ{–L›<âúT_ó¿ÂWækæ“®4±FÎ_ݶª7¬˜„ù?…,$”ÒØÞî„hŠfv×"Sàš Íÿ•(F©ü|Þûš0.VÀ…óƒÀeÄ%Sø×yÚÔŸÿæìsS§ý¾®|1žrøx 3 š]8¦,Mè¾~Á®N€­?ÒÂq̆E2𼇆öbj<؈wb_Ž/#pBšÓò‚ g®Åÿrÿ¦«ñÖÔWsm¦áÈþy!µ¨3b„}ZQb’tI\Äm²’ç ÈÎîŸÞ¥Bˈ?UìŽ|½Šð÷w ØÁ(#¢»èœ¦6PN?õÊS˜¯Òì5BËr§¹î³Úc‡GP[Ö6íCäñNÓtî-Šo‘^ñD[#û=­ù?ˆô§¿ |6Ú“—öÔËÂË4»j2±~qFq#mW4OŸ¾®|1Ÿ·1mpôd*\š\êéî 5 ‡uKLæ%üYØžY°»>^ÂnL1z‡óbÜD’“ŠÖ[=©h#s®^ð m"È÷5’Îðã÷M†âëþäpªo¼y!µ¨3b„}ZQb’tI\Äm²’ç ÈÎîŸÞ¥Bˈ?\§¡)–M^ú bvØ»­aPƒ,I]ªrsW Ó–*ò®­S–lHÞM I—Y¤LžÖ5“/̘¹‡¹¦Ýçê6°N–®Eâ`ÁhY^ÖÂï$Ù:üE|Õ]ë†B=g Dø7-`Ýër²äFöTðv/æpŸÿ×ìsS§ý¾®|1ž°¸¢_¢Ü$÷Q¥ôSYeÿÉ´üèÑ#•Ä)í{¥wŠ|ð³:Ðî5XKwªù¥¡Ì 4ù£– ®ôëN`-Ô<|ÇYv!Q–î­n4؃.ýÖ%xYø Íÿ•(F©ü|Þûš0.VÀ…óƒÀeÄ%Søõ‘61¥°ÒªrÄS½$²þìc*åÜÅsýX~Z¢ N.`¦;Ö¶“J«9yš¨^!šÅñE-ÆÀ .¾uÒ­±ÙkJ{Pí’¡?vw ¡«*q2½._ª>KfBÿ“øqxYø Íÿ•(F©ü|Þûš0.VÀu{GÜÛ}/CoÃø¾¸…z^¸¶É#‚jdíš Ç«ã6ùýV’ͧ^wYd˜ÿ#`%pŒC\RÊéÎ ~ÇŒþ¡öXU÷·¨Ñí'hC"VËÂË4»j2±~qFq#mW4OŸ¾®|1Ÿ·1npž§#_ì(ËÜžMÁ¯õà’JÛlCö¬ÖeA  ]~¿qÚÚË«o'Ë ß=ï–¼x"bÀ¨i–ÌîM_ …„—ŽnK0”cx>…ÄÓ+Å^Q¢ç»Õxåô}ÜÀ˜M˜ýدÕÄ"õ|ŸÿáìsS§ý¾®|1ž°…Éëvš _:·ø+òµÄUjM,ÓÍõXU¬¶ê;›c5gNŽjhÄ †éfNæ"ñœ0L ʺ5ñ·Kã»SËÍö#ò鮟};¼­#™ŠU!¤Ñt²‡~qFq#mW4OŸ¾®|1Ÿ·1npž§#_êWV¾—³Ñn,â Ÿ†u×S”B 9âÂ% b¸=?#6W:iý·àn\ºçæ/ÖØn+Rª œøRrõ—²xõŽ~–S³/a'ÎÉê¸è£ *ìªÿZ&¬r ’§¾9$ápž§#_ì(Ë…Ñ•˜Š~*‘ò'u÷ÀU¥¢°…2¬O±ZÇOÚø>(Ð}˜TÚœQðB KÄþã$Òð'/Z þ'´i¤Q`˜$–SÛ€ÙWé4§ 0™è)|…n6² |6Ú“—öÔËÂË4»j2±~qFq#mW4OŸ¾®|1Ÿ·!GÓ¾ì&%‹òPîF†K”/S4®¸Bäsu^æ€ö(;7-Ë@M¯îŸÔê¾·œ ²6ø"’ËÇ¢¸¨–í€âà{ÈðÅbƒI+•ù“ùèiåt b„}ZQb’tI\Äm²’ç ÈÎîú ŸÿàìsS§ý¾®|1žã ¦ÛfÄ÷dR'çÒÞt¤`LKçºàTR‘lÏ)‡gåóxˆAû¡p·ºÓ-‹ª,?".B¸=† j¤Ì>E¹úûÇ>‘ ¤-ú/;– åyíÓ-þa—_Ép;À27˜¥¥è£ *ìªÿZ&¬r ’§¾9$áK1¯q[k‘ÃBŸM<ùö¢ 3&R(1öÉw,À™ZÙÙñ•7{¼kÓ¿œÙÿ©-P3=Ìïñ¼2: Ï8?t·Š‹l~ÐÕ°z‘"—_Ép;À27˜¥¥è£ *ìªÿZ&¬r ’§¾9$ápž§#_â:8¡V²ÿÈáüûûJ‡ÿ ͱJL¤´RŸ¹Íbâ• ; ª€g_B$éŠÚKmMWr">×ûpWGWé#“«u€9ÐôÊ7Ðý2¦›«Ðr@RX¾év¬Yäå[ùÇÚ­üûR+tÍ[ BùÝS=ø)d ;€Ë*lßµ~ Z·î:½{Û35ä(1óâVXq–ßÂF _ýûæGžËÍŸVêuf,Li—(²‘¶KAçì -š1@«ü&‹¹ç-ÿ.뚺α'\Y†éfRX¾év¬Yäå[ùÇϱDŸÿÌìsS§ý¾®|1Ÿ·¦ï“¾äÌš8çÆ¨æ—«WJèXóè-Ž*—Mè˜méÑë."²îp°7¨:,?z¸Ô˜åÀg²Jül³ª# áô ?q`ÌÝër²äFöTðˆu,0ÛÂPT‘"—_Ép;À27˜¥¥è£ *ó] 1¹îÓ·[tå"ʱ(U‡ÌúæG4ðɨùGØY8ºÎY>%iW¹u ºîð阜+›G2#ÒY7ž0`€Ââ¼iÙ!JY…ê‰ý+Þ21Ÿ·1npž§#_ì(Ë…Ñ•˜Š~*‘ò'uï½ÍçÝñÈxd2ÃÊBkŒ£iÀ0­WÏÚ/›#iUJ+º„ö`»ü©vÂܬÑ)ÉBÎÔ‚„ŸÄ;âóoÏî™ÅøÚÛE¹Èió­BËl›?íα'\Y†éfRX¾év¬Yäå[ùÇÚ­üûR+tÍ[ BùÝS=ö°b,¯¾&h:—µ° *‡§§: ×»%>ïï ýLÛË®ätb‡¨ÈŸ#B(#ùo—Û ¬EÑH±JŪV܆™3jA;fè>—ƒ×œì`í¦pÞN^w(š ˜Tn׋ʈ?_1ûÈOè=·ã€åF ŸÿÏìsS§ý¾®|1Ÿ,ûoãçìïIÇ^@Üã¢ÙH>âR¯.kꘂ®â¥‡+Z‹—-þý¦wWyÝT{I¦¼®ßHJË4Åó.ÚREÂUVM[ûi½²,†éfRX¾év¬Yäå[ùÇÚ­üûR+tÍ[ BùÝS=ø)d ;€Ë*^H$á²åO$S|ùiÅŸwé£>¼_[R‘IA˜Èîöë(™ë†A¹¡2*šŽnaÖù!®4O+F§GLOÈCæËQï†g;¨¸Žð¯ÓUH½h€ØêÓûß¹":áÐᦟƒ= ¦ijçøM5×íy˜^§…ÊÜžr½RßáÝ%q“BÐBEƒŠí“¡Õm’ÔŽÚfáNê=™I+•ùGúNçRâšµ›î™ËŸ¤béÇ;%³‰Ôòž]wJA ¤ncq>ȰVê°Ëˆ·–W­ÀVq8w`qHÞñRˆ<Î0m_&-.‘Ü1×7gtVƒœn̽Ù芭—-ÿ.뚺α'\Y†éfRX¾év¬YäåZ‹Þ™MnKáÿ䕪…š(Q˜^ž‚ƒ¼|1Ì­Û¯fi“nhM8Î܈}Õz÷º“€j—.^Wøƒ; Ü0A£~‡“Ïý§¬r ’§¾9$ápž§#_ì(Ë…Ñ•˜Š~*‘ò'u÷À˜M˜ýدÕ"j¾Ól9Nè„´®XÑ&Uh |ôŽÚfâ ±Õ>O=`Mh÷KI†“ ÎïÝU\¯§¼HYzàÆÝýÖ%xYø Íÿ•(F©ü|Þûš0.VÀ…òõ®Ä`ŸÿìsS§ý¾®|1Ÿ¶á¨TÝU >‹ÓË ÞÄT¸ËŠ`;£ &‚¹>– 63h8´~ hk=§$m¼­#™ŠU!¤Ñt²‡~qFq#mW4OŸ¾®|1Ÿ·1npž§#_ì(Í´½ÂŸñ§›I n-Õໂ½³ wÅýVgª­^Õ¶5ÈPp¨Vðá”ÈúÒ»±N²Êþ_Ó-þa—_Ép;À27˜¥¥è£ *ìªÿZ&¬r ’§¾9$ápž§#_ì(Ë…ïDcó[xñ7îÉÔ¬dÊ-™å¤Ù4e4EU¦$3y•Ñ«˜é°CìÒ9¨VCzõš Íÿ•(F©ü|Þûš0.VÀ…óƒÀeÄ%Søõ‘61¥°îoÁpMG Ñ‘ª´Ê&_\*wƒ‹[ì»t¤O{÷zMu\Øc'ж†dØësïö žì¯h/åäs-20}ðË«ƒ!nÑÕzó>Sbv¬Yäå[ùÇÚ­üûR+t³%ÿbŸÿ„ìsS§ý¾®|1Ÿ½°„_t'ÔîVÇζ©mÜ´ñœ§ £7/À¡,ÁXMä½j™7jv—-_pmšÒØäFöTðˆu,0ÛÂPT‘"—_Ép;À27˜¥¥è£ *ìªÿZ&¬r ’§¾9ŽõòáenÀgó¯vŸí·ìj ö‚¢0<,+tÍVŸž+o;ð«<^\Fr™Ú>ÏOóJ󒘲 |6Ú“—öÔËÂË4»j2±~qFq#mW4O RÔ'XÇCë5Š+&Ð]KÇù÷óCœ6¬I 3Y†éfR!Ã_<kú‹ÃE¬é³1_U9á½¢>Ve~HôÐtVƒœn̽Ù芭—-ÿ.뚺α'\Y†éfRX¾éu„ Ýá'VÅŒ ¢|ä$±û(WÕÃæ$Ù:üE|Õ]íð«ß¿[7ðKáÈþy!µ¨3b„}ZQb’tI\Äm²’ç ÈÎîŸÞ »Ÿÿ‹ìsS§ý¾®|1Ÿ·ŽzÕ„Q½ÿÑ6•.Ÿ¯Ef7tì=E,´>­&À@B 9±¸²|yÉø¸ùpÔ“½éÑëOåó«©²©\G Ñ‘ª­`ºÎ±'\Y†éfRX¾év¬Yäå[ùÇ÷‹`ÒÃÿ;GUå㉇ÿ“øqxYø Íÿ•(F©ü|Þûš0.VÀ…óƒÀeÄ%Søõ‘61¼‘õ¡vž ôäm~KÛ±ìÙZiÙ!VA©7IPEbm¹ßaFSü@æCu,0ÛÂPT‘"—_Ép;À27˜¥¥è£ *ìªÿZ&¬r ’§¾9$ápž§"d\I]¤Ïgz¥ÚnýÌaØsáX\—¼hctò3ë±3:" ÍZ6¢lBˈt`¿l°†3¢|Õ]ë†B=g Dø7-`Ýër­šÄ`ŸÿpìsS§ý¾®|1ŸºÈƒå„{Q{ŒÎý{ª+ÍhWïU à˜ZÕù­4܆-*¢«Þ‘ê\µ»Fr¼˜ ›ðÑ­#™ŠU!¤Ñt²‡~qFq#mW4OŸ¾®|1Ÿ·1npF³ñVriÉ5jIûSÈ2®L;r…«Ô•ùGúNç…ušáÐ>möçqåØ4¿^Ä7σ:Ve~HôÐtVƒœn̽Ù芭—-ÿ.뚺α'\Y†éfRX¾év¬[Op>ï¨Ú/ž/Ëžk…D&cauº¯&(”q=ŽÜÆw°¾}1cЛ‰pÒ¸MáioûKˆlBˈ?\ÐN¯&(”q=$ápž§#_ì(Ë…Ñ•˜Š~*‘ðsµpß,qŒ&­íóÊËéu½k0…æ#_ëü>¤ÝgZ¼ú; ÐìÞY@µZU9á½¢>Ve~HôÐtVƒœn̽Ù芭—-þ›S©ŸÿjìsS§ý¾®|1Ÿ·1nl%"Ž=¢Îå‡Õ=T»&SL+FöTðˆu,0Ûvšfî£hÉŒ0rU!¤Ñt²‡~qFq#mW4OŸ¾®|1Ÿ·1npž§#_ì(Ë…Ñ•˜Š~*‘ò'r ¿^IÙ§)¥D@`¸ÆÓ…2šçD+¹\EØü¯ ,WǸ½ÿ'r²äFöTðˆu,0ÛÂPT‘"—_Ép;À27˜¥¥è£ *ìªÿZ&¬r ’§¾5Ú! ùñ²EÏ[mºÐ=^Ñël*«2ÿÀõ[Á§,H“«!}¡ðOG*¥Ѝš¨^$žiÑàÆÝýÖ%xYø Íÿ•(F©ü|Þûš0.VÀ…óƒÀeÄþ`ê<îoVm'†Ä_(y²mãéeäFöTðˆu,çþXý3€<÷ÝZU9á½¢>Ve~HôÐtVƒœn̽Ù芭—-ÿ.뚺®¶9†ŸÿiìsS§ý¾®|1Ÿ·1n\èòf{LõdJ\+î_—«»+VÉ̽ÙÖá+¾{À;Üaþ¿–ÎîŸÞ¥Bˈ?\ÐN¯&(”q=$ápž§#_ì(Ë…Ñ•˜Š~*‘ò'u÷À–²Þ¾4+ûËÞêUôÖ’TãFéd?_1ûÈOèI|Háo«nñ}ÉZ„º.¤ígr@RX¾év¬Yäå[ùÇÚ­üûR+tÍ[ BùÝS=ø)d ;€®âðUUŒnë080É´ÊŸZFÇ^ƉêUGª¸›Sƒé3ûCÛ¨&Ze+±.VÀ…óƒÀeÄ%Søõ‘61¥°îoÁpMG Ñ‘ª­`ºÎ±'\Y†éfRX¿Úcê eâDüd<êña3#=‘™4lE'¿}×)Õˆõ‹*RÕiµ[i‘^X—öÔËÂË4»j2±~qFq#m4›nƒŸÿvìsS§ý¾®|1Ÿ·9 _¥;ÓSîM: ¾Ñ$He¹3m¬ßOÓÕzó>@š>†BºŽ2>Sbv±{]}„p¹jkº5C'¹ŽÚfáNê=™I+•ùGúNçRâ’VžDžâÒäFòGÐM¾N¾yPŸ§F«Z`ÒƒiY¤(‰¼CEí>åTo«cù\Jvç+¼]‡GP BùÝS=ø)d ;€Ë*lßµ;ðĽ._ª>KfBÿ“øqxmªrÇ·qº^òk C®Ol‰®ÂRäÀm¦á¬Ò¬»Ãô$>È÷®W9“IÎJb°Å }ÉåÃvˆ·–W¬¶MáioûKˆlBˈ?\ÐN¯&(”q;þŸ¼ŒY„3¼ÊåšÞÏuÒ(ó©Ÿ©¥Ýš5ƒ Z}ÄQFüPu,1–k­ôE7(eiÓ+]±råÛé®çœ.W¬¶MáioûKˆlBˈ?\ÐN¯&(”q=$—©ZãŸÿ|ìsS§ý¾®|1Ÿ¸ò“¾Î0`s‹äV"g°ÅÈÄ';,]~HôÐq–Ióì³ökô×܈a>ç†K" ÀGåÃvˆ·–W¬¶MáioûKˆlBˈ?\ÐN¯&(”q=$áo ”NÍ«Šæ¦[>“X¡™Æ°#ÿ÷Q hNRiÎÏ˺J™GÚdX>¶2šçD+¸öÛH´> Ôú`TôZWÒ‚˜’ç ÎW¡—+¼]‡GP BùÝS=ø)d ;€Ë*lßµ;ðĽ._¬Í¸½ä†iÌfÂò¬ÏòK#:¤¤ç€²z«w퀬HåÂ㊜@Y7ã]Ñ:#¨ø‹ÙõÖ ý [ÍÐ!×Ú‘°z ­Gý svˆ·–W¬¶MáioûKˆlBˈ?\Â'à¯Ìç5`CÇOó®øõ ¾Ùq³.üTÔxx¨NðM27˜¦”zþ«è»9r¿6·ùD¶`í¦pÞN^w(š ˜Tn׋ʈ>ïÄò]ŸÿuìsS§ý¾®|1Ÿ·1npÅ.í'Í7ÊBǸjÕö›Q"—_Éo´äó OÜ‚${ÑÚI@[¶Lýï$Ù;¦oˆ]Wsm¦áÈþy!µ¨3b„}ZQb’tI\Äm²’ç ÈÎ ¾ËÔW½þ0ÓrÚìä –l*¹5´8C'¹ÑÚãŠ2œ8¢°ö«Ñ{qËüì²]BЬr ’§¾9¯3|15ÛÂPT‘"—_Ép;À27˜¥¥è£ *ìªÿZÈ¢êiÝž|®bE¡Ä“ÉœÚ!ö2š‚ÒÐPu,0ÛÂxA_B\¬O.0íÙ†­Å“"&QBšurgx>f\Y†éfRX¾év¬Yäå[ùÇÚ­üûR+tÍ[ BùÝS=ø)h£c,).dN½ÂS²7E{ÆWsm¦áÆNƒ{üEÕEûáPœºpk£:Lýï%“@Ý9\G Ñ‘ª­`ºÎ±'\Y†éfRX½kõ*ŸÿwìsS§ý¾®|1Ÿ·tAÑ0óƒ;p銺S3ð„AN<Á ‹0 –y&ÀiÖ'MÔWsm¡µÉ^ºÉ!é˜ë6¶è»9rÀlÿ²Ë!Ƙ2MÔWsm¦áÈþy!µ¨3b„}ZQb’tI\Äm²’ç ÈÎ Ïß7é„/”ùs÷”1npž§"+r¨Î ‡Ëêúûš0.VÀ·¬Jƒ&|Á>ׇv}n=‘™4lEƒŠí“¡Õm’ÔŽÚfáNê=™IXb3Õ/Ø)ì=ÒÊç‘æŒ˜"`÷Å ;Øí|ò=Iç·ªHµ¦!nÑÕzó>Sbv¬Yäå[ùÇÚ­üûD2¾ÞŸÿmìsS§ý¾®|1Ÿ·1n~Óô?^“¾óZ²?dJb`zqÎAƒ‚¥(|‘ˆn··ùÕnÙß~ƒƒÕbÀwB@Ö½._ª>KfBÿ“øqxYø Íÿ•(F©ü|Þûš0.VÀ…óƒÁI» âF^ú2Å[ò£Q)>KfB•╎ãÙ°¿^.ÅC6¹7+t²‡~qFq#mW4OŸ¾®|1Ÿ·1npž§#_ì(Ë…Ñ•˜Š~*‘ò'u÷À˜&OBU›È â`\³ŠâæRï$Ù:¾\ôöÉŸ#g·§MÚ$„QcåIG¬¯ÅÞ§QFüPu,0ÛÂPT‘"—_Ép;À27˜¥¥è£ *ìªÿZ&¬r/5‚P§4 ‘l‚Õih×Ú‘°z ­Gýno‹Š­Õ<˜¥Ü:KÀ;îö¹È~pž§#_ì(Ë…Öñò঵=‘™4lEƒŠí“ Þ œŸÿxìsS§ý¾®|1Ÿ·|í Ÿ»‹M&ÈÕ~™ÛŒdÉÓ,ĪܬÅo€¸¶ßŽäx¦€½¢>Ve~JÐEgŸ|Í FD5(fuαç&#¨øÇÃq4$\—¼€¥Æ>”(fuαç&#¨ø‹ÙõÖ ?}w«”Ï…mGv¾&ÆFœ®-nÏñ‹ÙõÖ Qd¤8)î)ì·Ž^8C'¹ŽÚg ^)ágr@RX¾év¬Yäå[ùÇÚ­üûR+tÍ[ BùÝS=ø)d €ºÂÇ]ùsÒg£óïhšÐGBŒ%1ܲ‡m2¯Éš³öË=ßИ¨øŒsA‘‹P¿Æ>”(fuαç&#¨ø‹ÙõÖ ?}w«ƒ!nÑÕzó>Sbv¬rÅߣР-ÌsÊ;ˆaŠã€º#¨ø‹böòºz²¯c¦NÊ® /±'\Y†éfú‹§ÆLφÙIf.õ4Z„º.¤ígr@RX¾é w™|Ÿÿ_ìsS§ý¾®|1Ÿ·1n|%@åïÕþ¶¹4FY³£°žIxYø Íÿ”Žlt<ÿi´hKc…§M–<Ÿà½ öÀÐ#ôSÇ.¤ígr@RX¾év¬Yäå[ùÇÚ­üûR+tÍ[ BùÝS=ø,h`·ÌÌÔOBäó».ùZ团0Ôˆ_Ë«Z,â7Ì Üúòû=Ú¬ûš0.VÀ…óƒÀeÄ%Søõ‘61¥°îoÁpMG Ñ‘ª­`ºÎ±'\Y†éfRX¿ 9½ªçÄ{åEž}….ѱKˆlBÎßÌäètY¼)a$S‰Ï—z÷äb× kè1޽`*ÎîŸÞ¥Bˈ?\ÐN¯&(”q=$ápž§#_ì(Ë…Ñ•˜Š~*‘ò'u÷À˜M˜ýدÕÄ%Søõ‘61¥°îoÁpMG Ñ‘ª­`ºÎ±'\Y†éfRX²MF݈2QìsS§ý¾®|1Ÿ·1npž§#_ì(Ë…Ñ•˜Š~*‘ò'u÷À˜M˜ýدÕÄ%Søõ‘61¥°îoÁpMG Ñ‘ª­`ºÎ±#Ò·X‹hashcat-4.0.1/hashcat.hctune000066400000000000000000000610631320027462700157630ustar00rootroot00000000000000 # This file is used to override autotune settings # This file is used to preset the Vector-Width, the Kernel-Accept and the Kernel-Loops Value per Device, Attack-Mode and Hash-Type # # - A valid line consists of the following fields (in that order): # - Device-Name # - Attack-Mode # - Hash-Type # - Vector-Width # - Kernel-Accel # - Kernel-Loops # - The first three columns define the filter, the other three is what is assigned when that filter matches # - If no filter matches, autotune is used # - Columns are separated with one or many spaces or tabs # - A line can not start with a space or a tab # - Comment lines are allowed, use a # as first character # - Invalid lines are ignored # - The Device-Name is the OpenCL Device-Name. It's shown on hashcat startup. # - If the device contains spaces, replace all spaces with _ character. # - The Device-Name can be assigned an alias. This is useful if many devices share the same chip # - If you assign an alias, make sure to not use the devices name directly # - There's also a hard-wired Device-Name which matches all device types called: # - DEVICE_TYPE_CPU # - DEVICE_TYPE_GPU # - DEVICE_TYPE_ACCELERATOR # - The use of wildcards is allowed, some rules: # - Wildcards can only replace an entire Device-Name, not parts just of it. eg: not Geforce_* # - The policy is local > global, means the closer you configure something, the more likely it is selected # - The policy testing order is from left to right # - Attack modes can be: # - 0 = Dictionary-Attack # - 1 = Combinator-Attack, will also be used for attack-mode 6 and 7 since they share the same kernel # - 3 = Mask-Attack # - The Kernel-Accel is a multiplier to OpenCL's concept of a workitem, not the workitem count # - The Kernel-Loops has a functionality depending on the hash-type: # - Slow Hash: Number of iterations calculated per workitem # - Fast Hash: Number of mutations calculated per workitem # - None of both should be confused with the OpenCL concept of a "thread", this one is maintained automatically # - The Vector-Width can have only the values 1, 2, 4, 8 or 'N', where 'N' stands for native, which is an OpenCl-queried data value # - The Kernel-Accel is limited to 1024 # - The Kernel-Loops is limited to 1024 # - The Kernel-Accel can have 'A', where 'A' stands for autotune # - The Kernel-Accel can have 'M', where 'M' stands for maximum possible # - The Kernel-Loops can have 'A', where 'A' stands for autotune # - The Kernel-Loops can have 'M', where 'M' stands for maximum possible ############# ## ALIASES ## ############# #Device Alias #Name Name Tesla_C2050 ALIAS_nv_use_simd Tesla_C2050/C2070 ALIAS_nv_use_simd Tesla_C2070 ALIAS_nv_use_simd Tesla_C2075 ALIAS_nv_use_simd Tesla_K10 ALIAS_nv_use_simd Tesla_K20 ALIAS_nv_use_simd Tesla_K40 ALIAS_nv_use_simd Tesla_K80 ALIAS_nv_use_simd Tesla_M20xx ALIAS_nv_use_simd Quadro_410 ALIAS_nv_use_simd Quadro_K2000 ALIAS_nv_use_simd Quadro_K2000D ALIAS_nv_use_simd Quadro_K4000 ALIAS_nv_use_simd Quadro_K4200 ALIAS_nv_use_simd Quadro_K420 ALIAS_nv_use_simd Quadro_K5000 ALIAS_nv_use_simd Quadro_K5200 ALIAS_nv_use_simd Quadro_K6000 ALIAS_nv_use_simd Quadro_K600 ALIAS_nv_use_simd Quadro_Plex_7000 ALIAS_nv_use_simd NVIDIA_NVS_310 ALIAS_nv_use_simd NVIDIA_NVS_315 ALIAS_nv_use_simd NVIDIA_NVS_510 ALIAS_nv_use_simd NVS_310 ALIAS_nv_use_simd NVS_315 ALIAS_nv_use_simd NVS_4200M ALIAS_nv_use_simd NVS_510 ALIAS_nv_use_simd NVS_5200M ALIAS_nv_use_simd NVS_5400M ALIAS_nv_use_simd GeForce_410M ALIAS_nv_use_simd GeForce_610M ALIAS_nv_use_simd GeForce_705M ALIAS_nv_use_simd GeForce_710M ALIAS_nv_use_simd GeForce_800M ALIAS_nv_use_simd GeForce_820M ALIAS_nv_use_simd GeForce_920M ALIAS_nv_use_simd GeForce_GT_410M ALIAS_nv_use_simd GeForce_GT_415M ALIAS_nv_use_simd GeForce_GT_420M ALIAS_nv_use_simd GeForce_GT_430 ALIAS_nv_use_simd GeForce_GT_435M ALIAS_nv_use_simd GeForce_GT_440 ALIAS_nv_use_simd GeForce_GT_445M ALIAS_nv_use_simd GeForce_GT_520 ALIAS_nv_use_simd GeForce_GT_520M ALIAS_nv_use_simd GeForce_GT_520MX ALIAS_nv_use_simd GeForce_GT_525M ALIAS_nv_use_simd GeForce_GT_540M ALIAS_nv_use_simd GeForce_GT_550M ALIAS_nv_use_simd GeForce_GT_555M ALIAS_nv_use_simd GeForce_GT_610 ALIAS_nv_use_simd GeForce_GT_620 ALIAS_nv_use_simd GeForce_GT_620M ALIAS_nv_use_simd GeForce_GT_625M ALIAS_nv_use_simd GeForce_GT_630 ALIAS_nv_use_simd GeForce_GT_630M ALIAS_nv_use_simd GeForce_GT_635M ALIAS_nv_use_simd GeForce_GT_640 ALIAS_nv_use_simd GeForce_GT_640M ALIAS_nv_use_simd GeForce_GT_640M_LE ALIAS_nv_use_simd GeForce_GT_645M ALIAS_nv_use_simd GeForce_GT_650M ALIAS_nv_use_simd GeForce_GT_705 ALIAS_nv_use_simd GeForce_GT_720 ALIAS_nv_use_simd GeForce_GT_720M ALIAS_nv_use_simd GeForce_GT_730 ALIAS_nv_use_simd GeForce_GT_730M ALIAS_nv_use_simd GeForce_GT_735M ALIAS_nv_use_simd GeForce_GT_740 ALIAS_nv_use_simd GeForce_GT_740M ALIAS_nv_use_simd GeForce_GT_745M ALIAS_nv_use_simd GeForce_GT_750M ALIAS_nv_use_simd GeForce_GTS_450 ALIAS_nv_use_simd GeForce_GTX_460 ALIAS_nv_use_simd GeForce_GTX_460M ALIAS_nv_use_simd GeForce_GTX_465 ALIAS_nv_use_simd GeForce_GTX_470 ALIAS_nv_use_simd GeForce_GTX_470M ALIAS_nv_use_simd GeForce_GTX_480 ALIAS_nv_use_simd GeForce_GTX_480M ALIAS_nv_use_simd GeForce_GTX_485M ALIAS_nv_use_simd GeForce_GTX_550_Ti ALIAS_nv_use_simd GeForce_GTX_560M ALIAS_nv_use_simd GeForce_GTX_560_Ti ALIAS_nv_use_simd GeForce_GTX_570 ALIAS_nv_use_simd GeForce_GTX_570M ALIAS_nv_use_simd GeForce_GTX_580 ALIAS_nv_use_simd GeForce_GTX_580M ALIAS_nv_use_simd GeForce_GTX_590 ALIAS_nv_use_simd GeForce_GTX_610M ALIAS_nv_use_simd GeForce_GTX_650 ALIAS_nv_use_simd GeForce_GTX_650_Ti ALIAS_nv_use_simd GeForce_GTX_650_Ti_BOOST ALIAS_nv_use_simd GeForce_GTX_660 ALIAS_nv_use_simd GeForce_GTX_660M ALIAS_nv_use_simd GeForce_GTX_660_Ti ALIAS_nv_use_simd GeForce_GTX_670 ALIAS_nv_use_simd GeForce_GTX_670M ALIAS_nv_use_simd GeForce_GTX_670MX ALIAS_nv_use_simd GeForce_GTX_675M ALIAS_nv_use_simd GeForce_GTX_675MX ALIAS_nv_use_simd GeForce_GTX_680 ALIAS_nv_use_simd GeForce_GTX_680M ALIAS_nv_use_simd GeForce_GTX_680MX ALIAS_nv_use_simd GeForce_GTX_690 ALIAS_nv_use_simd GeForce_GTX_705M ALIAS_nv_use_simd GeForce_GTX_710M ALIAS_nv_use_simd GeForce_GTX_760 ALIAS_nv_use_simd GeForce_GTX_760M ALIAS_nv_use_simd GeForce_GTX_765M ALIAS_nv_use_simd GeForce_GTX_770 ALIAS_nv_use_simd GeForce_GTX_770M ALIAS_nv_use_simd GeForce_GTX_780 ALIAS_nv_use_simd GeForce_GTX_780M ALIAS_nv_use_simd GeForce_GTX_780_Ti ALIAS_nv_use_simd GeForce_GTX_800M ALIAS_nv_use_simd GeForce_GTX_820M ALIAS_nv_use_simd GeForce_GTX_860M ALIAS_nv_use_simd GeForce_GTX_870M ALIAS_nv_use_simd GeForce_GTX_880M ALIAS_nv_use_simd GeForce_GTX_920M ALIAS_nv_use_simd #GeForce_GTX_TITAN ALIAS_nv_use_simd GeForce_GTX_TITAN_Black ALIAS_nv_use_simd GeForce_GTX_TITAN_Z ALIAS_nv_use_simd ## ## Maxwell sm_50 cards ## Quadro_K1200 ALIAS_nv_sm50 Quadro_K2200 ALIAS_nv_sm50 Quadro_K2200M ALIAS_nv_sm50 Quadro_K620 ALIAS_nv_sm50 Quadro_K620M ALIAS_nv_sm50 Quadro_M1000M ALIAS_nv_sm50 Quadro_M2000M ALIAS_nv_sm50 Quadro_M3000M ALIAS_nv_sm50 Quadro_M4000M ALIAS_nv_sm50 Quadro_M5000M ALIAS_nv_sm50 Quadro_M500M ALIAS_nv_sm50 Quadro_M5500M ALIAS_nv_sm50 Quadro_M600M ALIAS_nv_sm50 NVIDIA_NVS_810 ALIAS_nv_sm50 GeForce_830M ALIAS_nv_sm50 GeForce_830M ALIAS_nv_sm50 GeForce_840M ALIAS_nv_sm50 GeForce_840M ALIAS_nv_sm50 GeForce_930M ALIAS_nv_sm50 GeForce_940M ALIAS_nv_sm50 GeForce_GTX_750 ALIAS_nv_sm50 GeForce_GTX_750_Ti ALIAS_nv_sm50 GeForce_GTX_850M ALIAS_nv_sm50 GeForce_GTX_930M ALIAS_nv_sm50 GeForce_GTX_940M ALIAS_nv_sm50 GeForce_GTX_950M ALIAS_nv_sm50 GeForce_GTX_960M ALIAS_nv_sm50 ## ## Maxwell sm_52 cards or higher ## Tesla_M40 ALIAS_nv_sm52_or_higher Tesla_V100 ALIAS_nv_sm52_or_higher Quadro_M2000 ALIAS_nv_sm52_or_higher Quadro_M4000 ALIAS_nv_sm52_or_higher Quadro_M5000 ALIAS_nv_sm52_or_higher Quadro_M6000 ALIAS_nv_sm52_or_higher GeForce_GTX_950 ALIAS_nv_sm52_or_higher GeForce_GTX_960 ALIAS_nv_sm52_or_higher GeForce_GTX_970 ALIAS_nv_sm52_or_higher GeForce_GTX_980 ALIAS_nv_sm52_or_higher GeForce_GTX_980_Ti ALIAS_nv_sm52_or_higher GeForce_GTX_TITAN_X ALIAS_nv_sm52_or_higher GeForce_GTX_1070 ALIAS_nv_sm52_or_higher GeForce_GTX_1080 ALIAS_nv_sm52_or_higher GeForce_GTX_1080_Ti ALIAS_nv_sm52_or_higher GeForce_910M ALIAS_nv_sm52_or_higher GeForce_GTX_910M ALIAS_nv_sm52_or_higher GeForce_GTX_965M ALIAS_nv_sm52_or_higher GeForce_GTX_970M ALIAS_nv_sm52_or_higher GeForce_GTX_980M ALIAS_nv_sm52_or_higher Tegra_X1 ALIAS_nv_sm52_or_higher ############# ## ENTRIES ## ############# DEVICE_TYPE_CPU * * N A A DEVICE_TYPE_CPU * 6100 1 A A DEVICE_TYPE_CPU * 6900 1 A A #Device Attack Hash Vector Kernel Kernel #Name Mode Type Width Accel Loops ALIAS_nv_use_simd 3 0 2 A A ALIAS_nv_use_simd 3 10 2 A A ALIAS_nv_use_simd 3 11 2 A A ALIAS_nv_use_simd 3 12 2 A A ALIAS_nv_use_simd 3 20 2 A A ALIAS_nv_use_simd 3 21 2 A A ALIAS_nv_use_simd 3 22 2 A A ALIAS_nv_use_simd 3 23 2 A A ALIAS_nv_use_simd 3 100 4 A A ALIAS_nv_use_simd 3 110 4 A A ALIAS_nv_use_simd 3 111 4 A A ALIAS_nv_use_simd 3 112 4 A A ALIAS_nv_use_simd 3 130 4 A A ALIAS_nv_use_simd 3 131 4 A A ALIAS_nv_use_simd 3 132 4 A A ALIAS_nv_use_simd 3 133 4 A A ALIAS_nv_use_simd 3 200 2 A A ALIAS_nv_use_simd 3 400 2 A A ALIAS_nv_use_simd 3 900 4 A A ALIAS_nv_use_simd 3 1000 4 A A ALIAS_nv_use_simd 3 1100 4 A A ALIAS_nv_use_simd 3 2400 2 A A ALIAS_nv_use_simd 3 2410 2 A A ALIAS_nv_use_simd 3 2600 4 A A ALIAS_nv_use_simd 3 2611 4 A A ALIAS_nv_use_simd 3 2612 4 A A ALIAS_nv_use_simd 3 2711 4 A A ALIAS_nv_use_simd 3 2811 4 A A ALIAS_nv_use_simd 3 3711 2 A A ALIAS_nv_use_simd 3 5100 2 A A ALIAS_nv_use_simd 3 5300 2 A A ALIAS_nv_use_simd 3 5500 4 A A ALIAS_nv_use_simd 3 5600 2 A A ALIAS_nv_use_simd 3 8700 4 A A ALIAS_nv_use_simd 3 9900 2 A A ALIAS_nv_use_simd 3 11000 4 A A ALIAS_nv_use_simd 3 11100 2 A A ALIAS_nv_use_simd 3 11900 2 A A ALIAS_nv_use_simd 3 13300 4 A A ALIAS_nv_sm50 3 0 4 A A ALIAS_nv_sm50 3 10 4 A A ALIAS_nv_sm50 3 11 4 A A ALIAS_nv_sm50 3 12 4 A A ALIAS_nv_sm50 3 20 2 A A ALIAS_nv_sm50 3 21 2 A A ALIAS_nv_sm50 3 22 2 A A ALIAS_nv_sm50 3 23 2 A A ALIAS_nv_sm50 3 30 4 A A ALIAS_nv_sm50 3 40 2 A A ALIAS_nv_sm50 3 200 4 A A ALIAS_nv_sm50 3 400 2 A A ALIAS_nv_sm50 3 900 4 A A ALIAS_nv_sm50 3 1000 4 A A ALIAS_nv_sm50 3 1100 4 A A ALIAS_nv_sm50 3 2400 2 A A ALIAS_nv_sm50 3 2410 4 A A ALIAS_nv_sm50 3 2600 2 A A ALIAS_nv_sm50 3 2611 2 A A ALIAS_nv_sm50 3 2612 2 A A ALIAS_nv_sm50 3 2711 2 A A ALIAS_nv_sm50 3 2811 2 A A ALIAS_nv_sm50 3 3711 2 A A ALIAS_nv_sm50 3 5100 2 A A ALIAS_nv_sm50 3 5300 4 A A ALIAS_nv_sm50 3 5500 2 A A ALIAS_nv_sm50 3 5600 4 A A ALIAS_nv_sm50 3 6900 2 A A ALIAS_nv_sm50 3 8600 2 A A ALIAS_nv_sm50 3 9900 4 A A ALIAS_nv_sm50 3 10100 2 A A ALIAS_nv_sm50 3 11000 2 A A ALIAS_nv_sm50 3 11100 2 A A ALIAS_nv_sm50 3 11900 2 A A ALIAS_nv_sm52_or_higher 3 0 4 A A ALIAS_nv_sm52_or_higher 3 10 4 A A ALIAS_nv_sm52_or_higher 3 11 4 A A ALIAS_nv_sm52_or_higher 3 12 4 A A ALIAS_nv_sm52_or_higher 3 30 4 A A ALIAS_nv_sm52_or_higher 3 200 4 A A ALIAS_nv_sm52_or_higher 3 900 4 A A ALIAS_nv_sm52_or_higher 3 1000 2 A A ALIAS_nv_sm52_or_higher 3 1100 4 A A ALIAS_nv_sm52_or_higher 3 2400 2 A A ALIAS_nv_sm52_or_higher 3 2410 4 A A ALIAS_nv_sm52_or_higher 3 2711 2 A A ALIAS_nv_sm52_or_higher 3 3711 2 A A ALIAS_nv_sm52_or_higher 3 5100 2 A A ALIAS_nv_sm52_or_higher 3 8000 2 A A ALIAS_nv_sm52_or_higher 3 9900 4 A A ALIAS_nv_sm52_or_higher 3 10100 2 A A ALIAS_nv_sm52_or_higher 3 11000 2 A A ALIAS_nv_sm52_or_higher 3 11100 2 A A ## ## The following cards were manually tuned, as example ## GeForce_GTX_TITAN 3 0 4 A A GeForce_GTX_TITAN 3 11 4 A A GeForce_GTX_TITAN 3 12 4 A A GeForce_GTX_TITAN 3 21 1 A A GeForce_GTX_TITAN 3 22 1 A A GeForce_GTX_TITAN 3 23 1 A A GeForce_GTX_TITAN 3 30 4 A A GeForce_GTX_TITAN 3 200 2 A A GeForce_GTX_TITAN 3 400 1 A A GeForce_GTX_TITAN 3 900 4 A A GeForce_GTX_TITAN 3 1000 4 A A GeForce_GTX_TITAN 3 1100 4 A A GeForce_GTX_TITAN 3 2400 4 A A GeForce_GTX_TITAN 3 2410 2 A A GeForce_GTX_TITAN 3 2600 2 A A GeForce_GTX_TITAN 3 2611 2 A A GeForce_GTX_TITAN 3 2612 2 A A GeForce_GTX_TITAN 3 2711 2 A A GeForce_GTX_TITAN 3 2811 2 A A GeForce_GTX_TITAN 3 3711 1 A A GeForce_GTX_TITAN 3 5100 2 A A GeForce_GTX_TITAN 3 5500 1 A A GeForce_GTX_TITAN 3 9900 2 A A GeForce_GTX_TITAN 3 10100 2 A A GeForce_GTX_TITAN 3 11000 2 A A GeForce_GTX_TITAN 3 11100 2 A A ####################### ## EXTREME SLOW ALGOS # ####################### DEVICE_TYPE_GPU * 14600 1 2 M DEVICE_TYPE_GPU * 14800 1 2 250 ########### ## SCRYPT # ########### DEVICE_TYPE_CPU * 8900 1 1 1 DEVICE_TYPE_CPU * 9300 1 1 1 DEVICE_TYPE_CPU * 15700 1 1 1 DEVICE_TYPE_GPU * 8900 1 16 1 DEVICE_TYPE_GPU * 9300 1 16 1 DEVICE_TYPE_GPU * 15700 1 1 1 hashcat-4.0.1/include/000077500000000000000000000000001320027462700145555ustar00rootroot00000000000000hashcat-4.0.1/include/affinity.h000066400000000000000000000007211320027462700165370ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _AFFINITY_H #define _AFFINITY_H #include #include #if defined (_POSIX) #include #endif // _POSIX #if defined (__APPLE__) #include #include #include #endif // __APPLE__ #if defined (_WIN) #include #endif // _WIN int set_cpu_affinity (hashcat_ctx_t *hashcat_ctx); #endif // _AFFINITY_H hashcat-4.0.1/include/autotune.h000066400000000000000000000002451320027462700165730ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _AUTOTUNE_H #define _AUTOTUNE_H void *thread_autotune (void *p); #endif // _AUTOTUNE_H hashcat-4.0.1/include/benchmark.h000066400000000000000000000004011320027462700166530ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _BENCHMARK_H #define _BENCHMARK_H extern const unsigned int DEFAULT_BENCHMARK_ALGORITHMS_CNT; extern const unsigned int DEFAULT_BENCHMARK_ALGORITHMS_BUF[]; #endif // _BENCHMARK_H hashcat-4.0.1/include/bitmap.h000066400000000000000000000003771320027462700162110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _BITMAP_H #define _BITMAP_H #include int bitmap_ctx_init (hashcat_ctx_t *hashcat_ctx); void bitmap_ctx_destroy (hashcat_ctx_t *hashcat_ctx); #endif // _BITMAP_H hashcat-4.0.1/include/bitops.h000066400000000000000000000007521320027462700162320ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _BITOPS_H #define _BITOPS_H u32 __add3 (const u32 a, const u32 b, const u32 c); u32 __add3_S (const u32 a, const u32 b, const u32 c); u32 rotl32 (const u32 a, const u32 n); u32 rotr32 (const u32 a, const u32 n); u64 rotl64 (const u64 a, const u64 n); u64 rotr64 (const u64 a, const u64 n); u16 byte_swap_16 (const u16 n); u32 byte_swap_32 (const u32 n); u64 byte_swap_64 (const u64 n); #endif // _BITOPS_H hashcat-4.0.1/include/combinator.h000066400000000000000000000004451320027462700170660ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _COMBINATOR_H #define _COMBINATOR_H #include #include int combinator_ctx_init (hashcat_ctx_t *hashcat_ctx); void combinator_ctx_destroy (hashcat_ctx_t *hashcat_ctx); #endif // _COMBINATOR_H hashcat-4.0.1/include/common.h000066400000000000000000000051701320027462700162210ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _COMMON_H #define _COMMON_H #define PROGNAME "hashcat" #if defined (__unix__) || defined (__APPLE__) #define _POSIX #elif defined (_WIN32) #define _WIN 1 #else #error Your Operating System is not supported or detected #endif #if defined (__BYTE_ORDER__) && defined (__ORDER_BIG_ENDIAN__) #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ #error "compiling for big-endian architecture not supported" #endif #endif #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif // needed for *time_r functions under MinGW #ifndef _POSIX_THREAD_SAFE_FUNCTIONS #define _POSIX_THREAD_SAFE_FUNCTIONS 200809L #endif // needed for 64-bit off_t on 32-bit OSes #ifndef _FILE_OFFSET_BITS #define _FILE_OFFSET_BITS 64 #endif #ifndef _FORTIFY_SOURCE #define _FORTIFY_SOURCE 2 #endif #define NOMINMAX 1 #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #define MAX(a,b) (((a) > (b)) ? (a) : (b)) #define CEIL(a) ((a - (int) (a)) > 0 ? a + 1 : a) #define CEILDIV(a,b) (((a) + (b) - 1) / (b)) #if defined (__APPLE__) #define __stdcall #endif #if defined (__MSC_VER) #define HC_API_CALL __cdecl #elif defined (_WIN32) || defined (__WIN32__) #define HC_API_CALL __stdcall #else #define HC_API_CALL #endif #if defined (_WIN) #define WIN32_LEAN_AND_MEAN #endif /* The C++ standard denies redefinition of keywords, but this is nededed for VS compiler which doesn't have inline keyword but has __inline */ #ifndef __cplusplus #if defined (_MSC_VER) #define inline __inline #endif #endif #define MAYBE_UNUSED __attribute__((unused)) /* * Check if the system uses nanoseconds for file timestamps. * In case the system uses nanoseconds we set some custom macros here, * e.g. the (nanosecond) access time macros for dictstat */ #if defined (__linux__) #include #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,48) #define STAT_NANOSECONDS_ACCESS_TIME st_atim.tv_nsec #endif #endif #if defined (__APPLE__) #define STAT_NANOSECONDS_ACCESS_TIME st_atimespec.tv_nsec #endif // config section // do not try to simply change this, it will not work #define PW_MIN 0 #define PW_MAX 256 #define PW_MAX_OLD 55 #define SALT_MIN 0 #define SALT_MAX 256 #define SALT_MAX_OLD 51 #define HCBUFSIZ_TINY 0x1000 #define HCBUFSIZ_LARGE 0x50000 #define CPT_CACHE 0x20000 #define PARAMCNT 64 #define DEVICES_MAX 128 #define EXEC_CACHE 128 #define SPEED_CACHE 128 #define SPEED_MAXAGE 4096 #define EXPECTED_ITERATIONS 10000 #if defined (_WIN) #define EOL "\r\n" #else #define EOL "\n" #endif #endif // _COMMON_H hashcat-4.0.1/include/convert.h000066400000000000000000000031001320027462700164000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _CONVERT_H #define _CONVERT_H #include bool is_hexify (const u8 *buf, const int len); int exec_unhexify (const u8 *in_buf, const int in_len, u8 *out_buf, const int out_sz); bool need_hexify (const u8 *buf, const int len, const char separator, bool always_ascii); void exec_hexify (const u8 *buf, const int len, u8 *out); bool is_valid_hex_string (const u8 *s, const int len); bool is_valid_hex_char (const u8 c); u8 hex_convert (const u8 c); u8 hex_to_u8 (const u8 hex[2]); u32 hex_to_u32 (const u8 hex[8]); u64 hex_to_u64 (const u8 hex[16]); void u8_to_hex_lower (const u8 v, u8 hex[2]); void u32_to_hex_lower (const u32 v, u8 hex[8]); void u64_to_hex_lower (const u64 v, u8 hex[16]); u8 int_to_base32 (const u8 c); u8 base32_to_int (const u8 c); u8 int_to_base64 (const u8 c); u8 base64_to_int (const u8 c); u8 int_to_itoa32 (const u8 c); u8 itoa32_to_int (const u8 c); u8 int_to_itoa64 (const u8 c); u8 itoa64_to_int (const u8 c); u8 int_to_bf64 (const u8 c); u8 bf64_to_int (const u8 c); u8 int_to_lotus64 (const u8 c); u8 lotus64_to_int (const u8 c); int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf); int base32_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf); int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf); int base64_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf); void lowercase (u8 *buf, int len); void uppercase (u8 *buf, int len); #endif // _CONVERT_H hashcat-4.0.1/include/cpt.h000066400000000000000000000005071320027462700155160ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _CPT_H #define _CPT_H #include #include #include int cpt_ctx_init (hashcat_ctx_t *hashcat_ctx); void cpt_ctx_destroy (hashcat_ctx_t *hashcat_ctx); void cpt_ctx_reset (hashcat_ctx_t *hashcat_ctx); #endif // _CPT_H hashcat-4.0.1/include/cpu_aes.h000066400000000000000000000010141320027462700163410ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _CPU_AES_H #define _CPU_AES_H #define AES_KEY aes_ctx void AES_set_encrypt_key (const u8 *key, int keysize, AES_KEY *aes_key); void AES_set_decrypt_key (const u8 *key, int keysize, AES_KEY *aes_key); void AES_encrypt (AES_KEY *aes_key, const u8 *input, u8 *output); void AES_decrypt (AES_KEY *aes_key, const u8 *input, u8 *output); void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16]); #endif // _CPU_AES_H hashcat-4.0.1/include/cpu_blake2.h000066400000000000000000000005451320027462700167410ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _CPU_BLAKE2_H #define _CPU_BLAKE2_H #include const u64 blake2b_IV[8] = { 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179 }; #endif // _CPU_BLAKE2_H hashcat-4.0.1/include/cpu_crc32.h000066400000000000000000000005011320027462700165050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _CPU_CRC32_H #define _CPU_CRC32_H #include #include int cpu_crc32 (hashcat_ctx_t *hashcat_ctx, const char *filename, u8 keytab[64]); u32 cpu_crc32_buffer (const u8 *buf, const size_t length); #endif // _CPU_CRC32_H hashcat-4.0.1/include/cpu_des.h000066400000000000000000000024601320027462700163520ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _CPU_DES_H #define _CPU_DES_H #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 (const u32 data[2], u32 Kc[16], u32 Kd[16]); void _des_encrypt (u32 data[2], const u32 Kc[16], const u32 Kd[16]); #endif // _CPU_DES_H hashcat-4.0.1/include/cpu_md4.h000066400000000000000000000003101320027462700162530ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _CPU_MD4_H #define _CPU_MD4_H #include void md4_64 (const u32 block[16], u32 digest[4]); #endif // _CPU_MD4_H hashcat-4.0.1/include/cpu_md5.h000066400000000000000000000004171320027462700162640ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _CPU_MD5_H #define _CPU_MD5_H #include void md5_64 (const u32 block[16], u32 digest[4]); void md5_complete_no_limit (u32 digest[4], u32 *plain, u32 plain_len); #endif // _CPU_MD5_H hashcat-4.0.1/include/cpu_sha1.h000066400000000000000000000002671320027462700164360ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _CPU_SHA1_H #define _CPU_SHA1_H void sha1_64 (const u32 block[16], u32 digest[5]); #endif // _CPU_SHA1_H hashcat-4.0.1/include/cpu_sha256.h000066400000000000000000000002771320027462700166130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _CPU_SHA256_H #define _CPU_SHA256_H void sha256_64 (const u32 block[16], u32 digest[8]); #endif // _CPU_SHA256_H hashcat-4.0.1/include/debugfile.h000066400000000000000000000007271320027462700166620ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _DEBUGFILE_H #define _DEBUGFILE_H #include int debugfile_init (hashcat_ctx_t *hashcat_ctx); void debugfile_destroy (hashcat_ctx_t *hashcat_ctx); void debugfile_write_append (hashcat_ctx_t *hashcat_ctx, const u8 *rule_buf, const u32 rule_len, const u8 *mod_plain_ptr, const u32 mod_plain_len, const u8 *orig_plain_ptr, const u32 orig_plain_len); #endif // _DEBUGFILE_H hashcat-4.0.1/include/dictstat.h000066400000000000000000000014451320027462700165510ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _DICTSTAT_H #define _DICTSTAT_H #include #include #include #include #include #include #include #define MAX_DICTSTAT 100000 #define DICTSTAT_FILENAME "hashcat.dictstat2" #define DICTSTAT_VERSION (0x6863646963743200 | 0x01) int sort_by_dictstat (const void *s1, const void *s2); int dictstat_init (hashcat_ctx_t *hashcat_ctx); void dictstat_destroy (hashcat_ctx_t *hashcat_ctx); void dictstat_read (hashcat_ctx_t *hashcat_ctx); int dictstat_write (hashcat_ctx_t *hashcat_ctx); u64 dictstat_find (hashcat_ctx_t *hashcat_ctx, dictstat_t *d); void dictstat_append (hashcat_ctx_t *hashcat_ctx, dictstat_t *d); #endif // _DICTSTAT_H hashcat-4.0.1/include/dispatch.h000066400000000000000000000003041320027462700165220ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _DISPATCH_H #define _DISPATCH_H void *thread_calc_stdin (void *p); void *thread_calc (void *p); #endif // _DISPATCH_H hashcat-4.0.1/include/dynloader.h000066400000000000000000000037621320027462700167170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _DYNLOADER_H #define _DYNLOADER_H #include #ifdef _WIN #include #else #include #if defined (__APPLE__) #include #endif // __APPLE__ #endif // _WIN #ifdef _WIN HMODULE hc_dlopen (LPCSTR lpLibFileName); BOOL hc_dlclose (HMODULE hLibModule); FARPROC hc_dlsym (HMODULE hModule, LPCSTR lpProcName); #else void *hc_dlopen (const char *fileName, int flag); int hc_dlclose (void *handle); void *hc_dlsym (void *module, const char *symbol); #endif #define HC_LOAD_FUNC2(ptr,name,type,var,libname,noerr) \ ptr->name = (type) hc_dlsym (ptr->var, #name); \ if (noerr != -1) { \ if (!ptr->name) { \ if (noerr == 1) { \ event_log_error (hashcat_ctx, "%s is missing from %s shared library.", #name, #libname); \ return -1; \ } \ if (noerr != 1) { \ event_log_warning (hashcat_ctx, "%s is missing from %s shared library.", #name, #libname); \ return 0; \ } \ } \ } #define HC_LOAD_FUNC(ptr,name,type,libname,noerr) \ ptr->name = (type) hc_dlsym (ptr->lib, #name); \ if (noerr != -1) { \ if (!ptr->name) { \ if (noerr == 1) { \ event_log_error (hashcat_ctx, "%s is missing from %s shared library.", #name, #libname); \ return -1; \ } \ if (noerr != 1) { \ event_log_warning (hashcat_ctx, "%s is missing from %s shared library.", #name, #libname); \ return 0; \ } \ } \ } #define HC_LOAD_ADDR(ptr,name,type,func,addr,libname,noerr) \ ptr->name = (type) (*ptr->func) (addr); \ if (!ptr->name) { \ if (noerr == 1) { \ event_log_error (hashcat_ctx, "%s at address %08x is missing from %s shared library.", #name, addr, #libname); \ return -1; \ } \ if (noerr != 1) { \ event_log_warning (hashcat_ctx, "%s at address %08x is missing from %s shared library.", #name, addr, #libname); \ return 0; \ } \ } #endif // _DYNALOADER_H hashcat-4.0.1/include/event.h000066400000000000000000000027161320027462700160550ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _EVENT_H #define _EVENT_H #include #include void event_call (const u32 id, hashcat_ctx_t *hashcat_ctx, const void *buf, const size_t len); #define EVENT(id) event_call ((id), hashcat_ctx, NULL, 0) #define EVENT_DATA(id,buf,len) event_call ((id), hashcat_ctx, (buf), (len)) __attribute__ ((format (printf, 2, 3))) size_t event_log_advice_nn (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...); __attribute__ ((format (printf, 2, 3))) size_t event_log_info_nn (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...); __attribute__ ((format (printf, 2, 3))) size_t event_log_warning_nn (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...); __attribute__ ((format (printf, 2, 3))) size_t event_log_error_nn (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...); __attribute__ ((format (printf, 2, 3))) size_t event_log_advice (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...); __attribute__ ((format (printf, 2, 3))) size_t event_log_info (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...); __attribute__ ((format (printf, 2, 3))) size_t event_log_warning (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...); __attribute__ ((format (printf, 2, 3))) size_t event_log_error (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...); int event_ctx_init (hashcat_ctx_t *hashcat_ctx); void event_ctx_destroy (hashcat_ctx_t *hashcat_ctx); #endif // _EVENT_H hashcat-4.0.1/include/ext_ADL.h000066400000000000000000000256131320027462700162150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _EXT_ADL_H #define _EXT_ADL_H #include #include #if defined (_WIN) #include #endif // _WIN /** * Declarations from adl_sdk.h and subheaders */ #define ADL_OK 0 #define ADL_ERR -1 #define ADL_ERR_NOT_SUPPORTED -8 #define ADL_MAX_PATH 256 #define ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ 1 #define ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE 2 #define ADL_DL_FANCTRL_SPEED_TYPE_PERCENT 1 #define ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED 1 #define ADL_OD6_SETSTATE_PERFORMANCE 0x00000001 #define ADL_OD6_GETSTATEINFO_CUSTOM_PERFORMANCE 0x00000004 #define ADL_OD6_FANSPEED_TYPE_PERCENT 0x00000001 typedef struct AdapterInfo { int iSize; int iAdapterIndex; char strUDID[ADL_MAX_PATH]; int iBusNumber; int iDeviceNumber; int iFunctionNumber; int iVendorID; char strAdapterName[ADL_MAX_PATH]; char strDisplayName[ADL_MAX_PATH]; int iPresent; #if defined (_WIN32) || defined (_WIN64) || defined (__CYGWIN__) int iExist; char strDriverPath[ADL_MAX_PATH]; char strDriverPathExt[ADL_MAX_PATH]; char strPNPString[ADL_MAX_PATH]; int iOSDisplayIndex; #endif /* (_WIN32) || (_WIN64) || (__CYGWIN__) */ #if defined (__linux__) int iXScreenNum; int iDrvIndex; char strXScreenConfigName[ADL_MAX_PATH]; #endif /* (__linux__) */ } AdapterInfo, *LPAdapterInfo; typedef struct ADLThermalControllerInfo { int iSize; int iThermalDomain; int iDomainIndex; int iFlags; } ADLThermalControllerInfo; typedef struct ADLTemperature { int iSize; int iTemperature; } ADLTemperature; typedef struct ADLFanSpeedInfo { int iSize; int iFlags; int iMinPercent; int iMaxPercent; int iMinRPM; int iMaxRPM; } ADLFanSpeedInfo; typedef struct ADLFanSpeedValue { int iSize; int iSpeedType; int iFanSpeed; int iFlags; } ADLFanSpeedValue; typedef struct ADLDisplayID { int iDisplayLogicalIndex; int iDisplayPhysicalIndex; int iDisplayLogicalAdapterIndex; int iDisplayPhysicalAdapterIndex; } ADLDisplayID, *LPADLDisplayID; typedef struct ADLDisplayInfo { ADLDisplayID displayID; int iDisplayControllerIndex; char strDisplayName[ADL_MAX_PATH]; char strDisplayManufacturerName[ADL_MAX_PATH]; int iDisplayType; int iDisplayOutputType; int iDisplayConnector; int iDisplayInfoMask; int iDisplayInfoValue; } ADLDisplayInfo, *LPADLDisplayInfo; typedef struct ADLBiosInfo { char strPartNumber[ADL_MAX_PATH]; char strVersion[ADL_MAX_PATH]; char strDate[ADL_MAX_PATH]; } ADLBiosInfo, *LPADLBiosInfo; typedef struct ADLPMActivity { int iSize; int iEngineClock; int iMemoryClock; int iVddc; int iActivityPercent; int iCurrentPerformanceLevel; int iCurrentBusSpeed; int iCurrentBusLanes; int iMaximumBusLanes; int iReserved; } ADLPMActivity; typedef struct ADLODParameterRange { int iMin; int iMax; int iStep; } ADLODParameterRange; typedef struct ADLODParameters { int iSize; int iNumberOfPerformanceLevels; int iActivityReportingSupported; int iDiscretePerformanceLevels; int iReserved; ADLODParameterRange sEngineClock; ADLODParameterRange sMemoryClock; ADLODParameterRange sVddc; } ADLODParameters; typedef struct ADLODPerformanceLevel { int iEngineClock; int iMemoryClock; int iVddc; } ADLODPerformanceLevel; /* * Attention: we had to change this struct due to an out-of-bound problem mentioned here: * https://github.com/hashcat/hashcat/issues/244 * the change: ADLODPerformanceLevel aLevels [1] -> ADLODPerformanceLevel aLevels [2] */ typedef struct ADLODPerformanceLevels { int iSize; int iReserved; ADLODPerformanceLevel aLevels [2]; } ADLODPerformanceLevels; typedef struct ADLOD6FanSpeedInfo { int iSpeedType; int iFanSpeedPercent; int iFanSpeedRPM; int iExtValue; int iExtMask; } ADLOD6FanSpeedInfo; typedef struct ADLOD6FanSpeedValue { int iSpeedType; int iFanSpeed; int iExtValue; int iExtMask; } ADLOD6FanSpeedValue; typedef struct ADLOD6CurrentStatus { int iEngineClock; int iMemoryClock; int iActivityPercent; int iCurrentPerformanceLevel; int iCurrentBusSpeed; int iCurrentBusLanes; int iMaximumBusLanes; int iExtValue; int iExtMask; } ADLOD6CurrentStatus; typedef struct ADLOD6ParameterRange { int iMin; int iMax; int iStep; } ADLOD6ParameterRange; typedef struct ADLOD6Capabilities { int iCapabilities; int iSupportedStates; int iNumberOfPerformanceLevels; ADLOD6ParameterRange sEngineClockRange; ADLOD6ParameterRange sMemoryClockRange; int iExtValue; int iExtMask; } ADLOD6Capabilities; typedef struct ADLOD6PerformanceLevel { int iEngineClock; int iMemoryClock; } ADLOD6PerformanceLevel; /* * Attention: we had to change this struct due to an out-of-bound problem mentioned here: * https://github.com/hashcat/hashcat/issues/244 * the change: ADLOD6PerformanceLevel aLevels [1] -> ADLOD6PerformanceLevel aLevels [2] */ typedef struct ADLOD6StateInfo { int iNumberOfPerformanceLevels; int iExtValue; int iExtMask; ADLOD6PerformanceLevel aLevels [2]; } ADLOD6StateInfo; typedef struct ADLOD6PowerControlInfo { int iMinValue; int iMaxValue; int iStepValue; int iExtValue; int iExtMask; } ADLOD6PowerControlInfo; #if defined (__MSC_VER) #define ADL_API_CALL __cdecl #elif defined (_WIN32) || defined (__WIN32__) #define ADL_API_CALL __stdcall #else #define ADL_API_CALL #endif typedef void* (ADL_API_CALL *ADL_MAIN_MALLOC_CALLBACK )( int ); /* * End of declarations from adl_sdk.h and subheaders **/ typedef int HM_ADAPTER_ADL; typedef struct struct_ADLOD6MemClockState { ADLOD6StateInfo state; ADLOD6PerformanceLevel level; } ADLOD6MemClockState; typedef int (ADL_API_CALL *ADL_MAIN_CONTROL_DESTROY) (void); typedef int (ADL_API_CALL *ADL_MAIN_CONTROL_CREATE) (ADL_MAIN_MALLOC_CALLBACK, int); typedef int (ADL_API_CALL *ADL_ADAPTER_NUMBEROFADAPTERS_GET) (int *); typedef int (ADL_API_CALL *ADL_ADAPTER_ADAPTERINFO_GET) (LPAdapterInfo, int); typedef int (ADL_API_CALL *ADL_DISPLAY_DISPLAYINFO_GET) (int, int *, ADLDisplayInfo **, int); typedef int (ADL_API_CALL *ADL_OVERDRIVE5_TEMPERATURE_GET) (int, int, ADLTemperature *); typedef int (ADL_API_CALL *ADL_OVERDRIVE6_TEMPERATURE_GET) (int, int *); typedef int (ADL_API_CALL *ADL_OVERDRIVE5_CURRENTACTIVITY_GET) (int, ADLPMActivity *); typedef int (ADL_API_CALL *ADL_OVERDRIVE5_THERMALDEVICES_ENUM) (int, int, ADLThermalControllerInfo *); typedef int (ADL_API_CALL *ADL_ADAPTER_ID_GET) (int, int *); typedef int (ADL_API_CALL *ADL_ADAPTER_VIDEOBIOSINFO_GET) (int, ADLBiosInfo *); typedef int (ADL_API_CALL *ADL_OVERDRIVE5_FANSPEEDINFO_GET) (int, int, ADLFanSpeedInfo *); typedef int (ADL_API_CALL *ADL_OVERDRIVE5_FANSPEED_GET) (int, int, ADLFanSpeedValue *); typedef int (ADL_API_CALL *ADL_OVERDRIVE6_FANSPEED_GET) (int, ADLOD6FanSpeedInfo *); typedef int (ADL_API_CALL *ADL_OVERDRIVE5_FANSPEED_SET) (int, int, ADLFanSpeedValue *); typedef int (ADL_API_CALL *ADL_OVERDRIVE6_FANSPEED_SET) (int, ADLOD6FanSpeedValue *); typedef int (ADL_API_CALL *ADL_OVERDRIVE5_FANSPEEDTODEFAULT_SET) (int, int); typedef int (ADL_API_CALL *ADL_OVERDRIVE5_ODPARAMETERS_GET) (int, ADLODParameters *); typedef int (ADL_API_CALL *ADL_OVERDRIVE5_ODPERFORMANCELEVELS_GET) (int, int, ADLODPerformanceLevels *); typedef int (ADL_API_CALL *ADL_OVERDRIVE5_ODPERFORMANCELEVELS_SET) (int, ADLODPerformanceLevels *); typedef int (ADL_API_CALL *ADL_OVERDRIVE6_POWERCONTROL_SET) (int, int); typedef int (ADL_API_CALL *ADL_OVERDRIVE6_POWERCONTROL_GET) (int, int *, int *); typedef int (ADL_API_CALL *ADL_OVERDRIVE6_POWERCONTROLINFO_GET) (int, ADLOD6PowerControlInfo *); typedef int (ADL_API_CALL *ADL_ADAPTER_ACTIVE_GET) (int, int *); typedef int (ADL_API_CALL *ADL_DISPLAYENABLE_SET) (int, int *, int, int); typedef int (ADL_API_CALL *ADL_OVERDRIVE_CAPS) (int, int *, int *, int *); typedef int (ADL_API_CALL *ADL_OVERDRIVE6_CURRENTSTATUS_GET) (int, ADLOD6CurrentStatus *); typedef int (ADL_API_CALL *ADL_OVERDRIVE6_STATEINFO_GET) (int, int, ADLOD6MemClockState *); typedef int (ADL_API_CALL *ADL_OVERDRIVE6_CAPABILITIES_GET) (int, ADLOD6Capabilities *); typedef int (ADL_API_CALL *ADL_OVERDRIVE6_STATE_SET) (int, int, ADLOD6StateInfo *); typedef int (ADL_API_CALL *ADL_OVERDRIVE6_POWERCONTROL_CAPS) (int, int *); typedef int (ADL_API_CALL *ADL_OVERDRIVE6_TARGETTEMPERATUREDATA_GET) (int, int *, int *); typedef int (ADL_API_CALL *ADL_OVERDRIVE6_TARGETTEMPERATURERANGEINFO_GET) (int, ADLOD6ParameterRange *); typedef int (ADL_API_CALL *ADL_OVERDRIVE6_FANSPEED_RESET) (int); #if defined (_POSIX) typedef void *ADL_LIB; #else typedef HINSTANCE ADL_LIB; #endif typedef struct hm_adl_lib { ADL_LIB lib; ADL_MAIN_CONTROL_DESTROY ADL_Main_Control_Destroy; ADL_MAIN_CONTROL_CREATE ADL_Main_Control_Create; ADL_ADAPTER_NUMBEROFADAPTERS_GET ADL_Adapter_NumberOfAdapters_Get; ADL_ADAPTER_ADAPTERINFO_GET ADL_Adapter_AdapterInfo_Get; ADL_DISPLAY_DISPLAYINFO_GET ADL_Display_DisplayInfo_Get; ADL_ADAPTER_ID_GET ADL_Adapter_ID_Get; ADL_ADAPTER_VIDEOBIOSINFO_GET ADL_Adapter_VideoBiosInfo_Get; ADL_OVERDRIVE5_THERMALDEVICES_ENUM ADL_Overdrive5_ThermalDevices_Enum; ADL_OVERDRIVE5_TEMPERATURE_GET ADL_Overdrive5_Temperature_Get; ADL_OVERDRIVE6_TEMPERATURE_GET ADL_Overdrive6_Temperature_Get; ADL_OVERDRIVE5_CURRENTACTIVITY_GET ADL_Overdrive5_CurrentActivity_Get; ADL_OVERDRIVE5_FANSPEEDINFO_GET ADL_Overdrive5_FanSpeedInfo_Get; ADL_OVERDRIVE5_FANSPEED_GET ADL_Overdrive5_FanSpeed_Get; ADL_OVERDRIVE6_FANSPEED_GET ADL_Overdrive6_FanSpeed_Get; ADL_OVERDRIVE5_FANSPEED_SET ADL_Overdrive5_FanSpeed_Set; ADL_OVERDRIVE6_FANSPEED_SET ADL_Overdrive6_FanSpeed_Set; ADL_OVERDRIVE5_FANSPEEDTODEFAULT_SET ADL_Overdrive5_FanSpeedToDefault_Set; ADL_OVERDRIVE5_ODPARAMETERS_GET ADL_Overdrive5_ODParameters_Get; ADL_OVERDRIVE5_ODPERFORMANCELEVELS_GET ADL_Overdrive5_ODPerformanceLevels_Get; ADL_OVERDRIVE5_ODPERFORMANCELEVELS_SET ADL_Overdrive5_ODPerformanceLevels_Set; ADL_OVERDRIVE6_POWERCONTROLINFO_GET ADL_Overdrive6_PowerControlInfo_Get; ADL_OVERDRIVE6_POWERCONTROL_GET ADL_Overdrive6_PowerControl_Get; ADL_OVERDRIVE6_POWERCONTROL_SET ADL_Overdrive6_PowerControl_Set; ADL_ADAPTER_ACTIVE_GET ADL_Adapter_Active_Get; ADL_DISPLAYENABLE_SET ADL_DisplayEnable_Set; ADL_OVERDRIVE_CAPS ADL_Overdrive_Caps; ADL_OVERDRIVE6_POWERCONTROL_CAPS ADL_Overdrive6_PowerControl_Caps; ADL_OVERDRIVE6_CAPABILITIES_GET ADL_Overdrive6_Capabilities_Get; ADL_OVERDRIVE6_STATEINFO_GET ADL_Overdrive6_StateInfo_Get; ADL_OVERDRIVE6_CURRENTSTATUS_GET ADL_Overdrive6_CurrentStatus_Get; ADL_OVERDRIVE6_STATE_SET ADL_Overdrive6_State_Set; ADL_OVERDRIVE6_TARGETTEMPERATUREDATA_GET ADL_Overdrive6_TargetTemperatureData_Get; ADL_OVERDRIVE6_TARGETTEMPERATURERANGEINFO_GET ADL_Overdrive6_TargetTemperatureRangeInfo_Get; ADL_OVERDRIVE6_FANSPEED_RESET ADL_Overdrive6_FanSpeed_Reset; } hm_adl_lib_t; typedef hm_adl_lib_t ADL_PTR; void *HC_API_CALL ADL_Main_Memory_Alloc (const int iSize); #endif // _EXT_ADL_H hashcat-4.0.1/include/ext_OpenCL.h000066400000000000000000000155161320027462700167360ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _EXT_OPENCL_H #define _EXT_OPENCL_H #define CL_USE_DEPRECATED_OPENCL_1_2_APIS #define CL_USE_DEPRECATED_OPENCL_2_0_APIS #if defined (__APPLE__) #include #else #include #endif // NVIDIA extras #define CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV 0x4000 #define CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV 0x4001 #define CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV 0x4005 #define CL_DEVICE_PCI_BUS_ID_NV 0x4008 #define CL_DEVICE_PCI_SLOT_ID_NV 0x4009 // AMD extras #define CL_DEVICE_TOPOLOGY_AMD 0x4037 typedef union { struct { cl_uint type; cl_uint data[5]; } raw; struct { cl_uint type; cl_char unused[17]; cl_char bus; cl_char device; cl_char function; } pcie; } cl_device_topology_amd; #define CL_PLATFORMS_MAX 16 typedef cl_int (CL_API_CALL *OCL_CLBUILDPROGRAM) (cl_program, cl_uint, const cl_device_id *, const char *, void (CL_CALLBACK *)(cl_program, void *), void *); typedef cl_mem (CL_API_CALL *OCL_CLCREATEBUFFER) (cl_context, cl_mem_flags, size_t, void *, cl_int *); typedef cl_command_queue (CL_API_CALL *OCL_CLCREATECOMMANDQUEUE) (cl_context, cl_device_id, cl_command_queue_properties, cl_int *); typedef cl_context (CL_API_CALL *OCL_CLCREATECONTEXT) (const cl_context_properties *, cl_uint, const cl_device_id *, void (CL_CALLBACK *)(const char *, const void *, size_t, void *), void *, cl_int *); typedef cl_kernel (CL_API_CALL *OCL_CLCREATEKERNEL) (cl_program, const char *, cl_int *); typedef cl_program (CL_API_CALL *OCL_CLCREATEPROGRAMWITHBINARY) (cl_context, cl_uint, const cl_device_id *, const size_t *, const unsigned char **, cl_int *, cl_int *); typedef cl_program (CL_API_CALL *OCL_CLCREATEPROGRAMWITHSOURCE) (cl_context, cl_uint, const char **, const size_t *, cl_int *); typedef cl_int (CL_API_CALL *OCL_CLENQUEUECOPYBUFFER) (cl_command_queue, cl_mem, cl_mem, size_t, size_t, size_t, cl_uint, const cl_event *, cl_event *); typedef void * (CL_API_CALL *OCL_CLENQUEUEMAPBUFFER) (cl_command_queue, cl_mem, cl_bool, cl_map_flags, size_t, size_t, cl_uint, const cl_event *, cl_event *, cl_int *); typedef cl_int (CL_API_CALL *OCL_CLENQUEUENDRANGEKERNEL) (cl_command_queue, cl_kernel, cl_uint, const size_t *, const size_t *, const size_t *, cl_uint, const cl_event *, cl_event *); typedef cl_int (CL_API_CALL *OCL_CLENQUEUEREADBUFFER) (cl_command_queue, cl_mem, cl_bool, size_t, size_t, const void *, cl_uint, const cl_event *, cl_event *); typedef cl_int (CL_API_CALL *OCL_CLENQUEUEUNMAPMEMOBJECT) (cl_command_queue, cl_mem, void *, cl_uint, const cl_event *, cl_event *); typedef cl_int (CL_API_CALL *OCL_CLENQUEUEWRITEBUFFER) (cl_command_queue, cl_mem, cl_bool, size_t, size_t, const void *, cl_uint, const cl_event *, cl_event *); typedef cl_int (CL_API_CALL *OCL_CLFINISH) (cl_command_queue); typedef cl_int (CL_API_CALL *OCL_CLFLUSH) (cl_command_queue); typedef cl_int (CL_API_CALL *OCL_CLGETDEVICEIDS) (cl_platform_id, cl_device_type, cl_uint, cl_device_id *, cl_uint *); typedef cl_int (CL_API_CALL *OCL_CLGETDEVICEINFO) (cl_device_id, cl_device_info, size_t, void *, size_t *); typedef cl_int (CL_API_CALL *OCL_CLGETEVENTINFO) (cl_event, cl_event_info, size_t, void *, size_t *); typedef cl_int (CL_API_CALL *OCL_CLGETEVENTPROFILINGINFO) (cl_event, cl_profiling_info, size_t, void *, size_t *); typedef cl_int (CL_API_CALL *OCL_CLGETKERNELWORKGROUPINFO) (cl_kernel, cl_device_id, cl_kernel_work_group_info, size_t, void *, size_t *); typedef cl_int (CL_API_CALL *OCL_CLGETPLATFORMIDS) (cl_uint, cl_platform_id *, cl_uint *); typedef cl_int (CL_API_CALL *OCL_CLGETPLATFORMINFO) (cl_platform_id, cl_platform_info, size_t, void *, size_t *); typedef cl_int (CL_API_CALL *OCL_CLGETPROGRAMBUILDINFO) (cl_program, cl_device_id, cl_program_build_info, size_t, void *, size_t *); typedef cl_int (CL_API_CALL *OCL_CLGETPROGRAMINFO) (cl_program, cl_program_info, size_t, void *, size_t *); typedef cl_int (CL_API_CALL *OCL_CLRELEASECOMMANDQUEUE) (cl_command_queue); typedef cl_int (CL_API_CALL *OCL_CLRELEASECONTEXT) (cl_context); typedef cl_int (CL_API_CALL *OCL_CLRELEASEEVENT) (cl_event); typedef cl_int (CL_API_CALL *OCL_CLRELEASEKERNEL) (cl_kernel); typedef cl_int (CL_API_CALL *OCL_CLRELEASEMEMOBJECT) (cl_mem); typedef cl_int (CL_API_CALL *OCL_CLRELEASEPROGRAM) (cl_program); typedef cl_int (CL_API_CALL *OCL_CLSETKERNELARG) (cl_kernel, cl_uint, size_t, const void *); typedef cl_int (CL_API_CALL *OCL_CLWAITFOREVENTS) (cl_uint, const cl_event *); #if defined (_POSIX) typedef void *OCL_LIB; #else typedef HINSTANCE OCL_LIB; #endif typedef struct hc_opencl_lib { OCL_LIB lib; OCL_CLBUILDPROGRAM clBuildProgram; OCL_CLCREATEBUFFER clCreateBuffer; OCL_CLCREATECOMMANDQUEUE clCreateCommandQueue; OCL_CLCREATECONTEXT clCreateContext; OCL_CLCREATEKERNEL clCreateKernel; OCL_CLCREATEPROGRAMWITHBINARY clCreateProgramWithBinary; OCL_CLCREATEPROGRAMWITHSOURCE clCreateProgramWithSource; OCL_CLENQUEUECOPYBUFFER clEnqueueCopyBuffer; OCL_CLENQUEUEMAPBUFFER clEnqueueMapBuffer; OCL_CLENQUEUENDRANGEKERNEL clEnqueueNDRangeKernel; OCL_CLENQUEUEREADBUFFER clEnqueueReadBuffer; OCL_CLENQUEUEUNMAPMEMOBJECT clEnqueueUnmapMemObject; OCL_CLENQUEUEWRITEBUFFER clEnqueueWriteBuffer; OCL_CLFINISH clFinish; OCL_CLFLUSH clFlush; OCL_CLGETDEVICEIDS clGetDeviceIDs; OCL_CLGETDEVICEINFO clGetDeviceInfo; OCL_CLGETEVENTINFO clGetEventInfo; OCL_CLGETEVENTPROFILINGINFO clGetEventProfilingInfo; OCL_CLGETKERNELWORKGROUPINFO clGetKernelWorkGroupInfo; OCL_CLGETPLATFORMIDS clGetPlatformIDs; OCL_CLGETPLATFORMINFO clGetPlatformInfo; OCL_CLGETPROGRAMBUILDINFO clGetProgramBuildInfo; OCL_CLGETPROGRAMINFO clGetProgramInfo; OCL_CLRELEASECOMMANDQUEUE clReleaseCommandQueue; OCL_CLRELEASECONTEXT clReleaseContext; OCL_CLRELEASEEVENT clReleaseEvent; OCL_CLRELEASEKERNEL clReleaseKernel; OCL_CLRELEASEMEMOBJECT clReleaseMemObject; OCL_CLRELEASEPROGRAM clReleaseProgram; OCL_CLSETKERNELARG clSetKernelArg; OCL_CLWAITFOREVENTS clWaitForEvents; } hc_opencl_lib_t; typedef hc_opencl_lib_t OCL_PTR; const char *val2cstr_cl (cl_int CL_err); #endif // _EXT_OPENCL_H hashcat-4.0.1/include/ext_lzma.h000066400000000000000000000010301320027462700165430ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _EXT_LZMA_H #include "lzma_sdk/Alloc.h" #include "lzma_sdk/LzmaDec.h" #include "lzma_sdk/Lzma2Dec.h" int hc_lzma1_decompress (const unsigned char *in, SizeT *in_len, unsigned char *out, SizeT *out_len, const char *props); int hc_lzma2_decompress (const unsigned char *in, SizeT *in_len, unsigned char *out, SizeT *out_len, const char *props); void *hc_lzma_alloc (void *p, size_t size); void hc_lzma_free (void *p, void *address); #endif // _EXT_LZMA_H hashcat-4.0.1/include/ext_nvapi.h000066400000000000000000000432301320027462700167250ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _EXT_NVAPI_H #define _EXT_NVAPI_H /** * Declarations from nvapi.h and subheaders */ #define NVAPI_INTERFACE extern NvAPI_Status typedef unsigned int NvU32; typedef signed int NvS32; #define NV_DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name NV_DECLARE_HANDLE(NvPhysicalGpuHandle); // A single physical GPU #define NVAPI_GENERIC_STRING_MAX 4096 #define NVAPI_LONG_STRING_MAX 256 #define NVAPI_SHORT_STRING_MAX 64 typedef char NvAPI_String[NVAPI_GENERIC_STRING_MAX]; typedef char NvAPI_LongString[NVAPI_LONG_STRING_MAX]; typedef char NvAPI_ShortString[NVAPI_SHORT_STRING_MAX]; #define MAKE_NVAPI_VERSION(typeName,ver) (NvU32)(sizeof(typeName) | ((ver)<<16)) #define NVAPI_MAX_PHYSICAL_GPUS 64 #define NVAPI_MAX_COOLER_PER_GPU 20 #define GPU_COOLER_LEVELS_VER 0x10000 typedef enum _NvAPI_Status { NVAPI_OK = 0, // Success. Request is completed. NVAPI_ERROR = -1, // Generic error NVAPI_LIBRARY_NOT_FOUND = -2, // NVAPI support library cannot be loaded. NVAPI_NO_IMPLEMENTATION = -3, // not implemented in current driver installation NVAPI_API_NOT_INITIALIZED = -4, // NvAPI_Initialize has not been called (successfully) NVAPI_INVALID_ARGUMENT = -5, // The argument/parameter value is not valid or NULL. NVAPI_NVIDIA_DEVICE_NOT_FOUND = -6, // No NVIDIA display driver, or NVIDIA GPU driving a display, was found. NVAPI_END_ENUMERATION = -7, // No more items to enumerate NVAPI_INVALID_HANDLE = -8, // Invalid handle NVAPI_INCOMPATIBLE_STRUCT_VERSION = -9, // An argument's structure version is not supported NVAPI_HANDLE_INVALIDATED = -10, // The handle is no longer valid (likely due to GPU or display re-configuration) NVAPI_OPENGL_CONTEXT_NOT_CURRENT = -11, // No NVIDIA OpenGL context is current (but needs to be) NVAPI_INVALID_POINTER = -14, // An invalid pointer, usually NULL, was passed as a parameter NVAPI_NO_GL_EXPERT = -12, // OpenGL Expert is not supported by the current drivers NVAPI_INSTRUMENTATION_DISABLED = -13, // OpenGL Expert is supported, but driver instrumentation is currently disabled NVAPI_NO_GL_NSIGHT = -15, // OpenGL does not support Nsight NVAPI_EXPECTED_LOGICAL_GPU_HANDLE = -100, // Expected a logical GPU handle for one or more parameters NVAPI_EXPECTED_PHYSICAL_GPU_HANDLE = -101, // Expected a physical GPU handle for one or more parameters NVAPI_EXPECTED_DISPLAY_HANDLE = -102, // Expected an NV display handle for one or more parameters NVAPI_INVALID_COMBINATION = -103, // The combination of parameters is not valid. NVAPI_NOT_SUPPORTED = -104, // Requested feature is not supported in the selected GPU NVAPI_PORTID_NOT_FOUND = -105, // No port ID was found for the I2C transaction NVAPI_EXPECTED_UNATTACHED_DISPLAY_HANDLE = -106, // Expected an unattached display handle as one of the input parameters. NVAPI_INVALID_PERF_LEVEL = -107, // Invalid perf level NVAPI_DEVICE_BUSY = -108, // Device is busy; request not fulfilled NVAPI_NV_PERSIST_FILE_NOT_FOUND = -109, // NV persist file is not found NVAPI_PERSIST_DATA_NOT_FOUND = -110, // NV persist data is not found NVAPI_EXPECTED_TV_DISPLAY = -111, // Expected a TV output display NVAPI_EXPECTED_TV_DISPLAY_ON_DCONNECTOR = -112, // Expected a TV output on the D Connector - HDTV_EIAJ4120. NVAPI_NO_ACTIVE_SLI_TOPOLOGY = -113, // SLI is not active on this device. NVAPI_SLI_RENDERING_MODE_NOTALLOWED = -114, // Setup of SLI rendering mode is not possible right now. NVAPI_EXPECTED_DIGITAL_FLAT_PANEL = -115, // Expected a digital flat panel. NVAPI_ARGUMENT_EXCEED_MAX_SIZE = -116, // Argument exceeds the expected size. NVAPI_DEVICE_SWITCHING_NOT_ALLOWED = -117, // Inhibit is ON due to one of the flags in NV_GPU_DISPLAY_CHANGE_INHIBIT or SLI active. NVAPI_TESTING_CLOCKS_NOT_SUPPORTED = -118, // Testing of clocks is not supported. NVAPI_UNKNOWN_UNDERSCAN_CONFIG = -119, // The specified underscan config is from an unknown source (e.g. INF) NVAPI_TIMEOUT_RECONFIGURING_GPU_TOPO = -120, // Timeout while reconfiguring GPUs NVAPI_DATA_NOT_FOUND = -121, // Requested data was not found NVAPI_EXPECTED_ANALOG_DISPLAY = -122, // Expected an analog display NVAPI_NO_VIDLINK = -123, // No SLI video bridge is present NVAPI_REQUIRES_REBOOT = -124, // NVAPI requires a reboot for the settings to take effect NVAPI_INVALID_HYBRID_MODE = -125, // The function is not supported with the current Hybrid mode. NVAPI_MIXED_TARGET_TYPES = -126, // The target types are not all the same NVAPI_SYSWOW64_NOT_SUPPORTED = -127, // The function is not supported from 32-bit on a 64-bit system. NVAPI_IMPLICIT_SET_GPU_TOPOLOGY_CHANGE_NOT_ALLOWED = -128, // There is no implicit GPU topology active. Use NVAPI_SetHybridMode to change topology. NVAPI_REQUEST_USER_TO_CLOSE_NON_MIGRATABLE_APPS = -129, // Prompt the user to close all non-migratable applications. NVAPI_OUT_OF_MEMORY = -130, // Could not allocate sufficient memory to complete the call. NVAPI_WAS_STILL_DRAWING = -131, // The previous operation that is transferring information to or from this surface is incomplete. NVAPI_FILE_NOT_FOUND = -132, // The file was not found. NVAPI_TOO_MANY_UNIQUE_STATE_OBJECTS = -133, // There are too many unique instances of a particular type of state object. NVAPI_INVALID_CALL = -134, // The method call is invalid. For example, a method's parameter may not be a valid pointer. NVAPI_D3D10_1_LIBRARY_NOT_FOUND = -135, // d3d10_1.dll cannot be loaded. NVAPI_FUNCTION_NOT_FOUND = -136, // Couldn't find the function in the loaded DLL. NVAPI_INVALID_USER_PRIVILEGE = -137, // Current User is not Admin. NVAPI_EXPECTED_NON_PRIMARY_DISPLAY_HANDLE = -138, // The handle corresponds to GDIPrimary. NVAPI_EXPECTED_COMPUTE_GPU_HANDLE = -139, // Setting Physx GPU requires that the GPU is compute-capable. NVAPI_STEREO_NOT_INITIALIZED = -140, // The Stereo part of NVAPI failed to initialize completely. Check if the stereo driver is installed. NVAPI_STEREO_REGISTRY_ACCESS_FAILED = -141, // Access to stereo-related registry keys or values has failed. NVAPI_STEREO_REGISTRY_PROFILE_TYPE_NOT_SUPPORTED = -142, // The given registry profile type is not supported. NVAPI_STEREO_REGISTRY_VALUE_NOT_SUPPORTED = -143, // The given registry value is not supported. NVAPI_STEREO_NOT_ENABLED = -144, // Stereo is not enabled and the function needed it to execute completely. NVAPI_STEREO_NOT_TURNED_ON = -145, // Stereo is not turned on and the function needed it to execute completely. NVAPI_STEREO_INVALID_DEVICE_INTERFACE = -146, // Invalid device interface. NVAPI_STEREO_PARAMETER_OUT_OF_RANGE = -147, // Separation percentage or JPEG image capture quality is out of [0-100] range. NVAPI_STEREO_FRUSTUM_ADJUST_MODE_NOT_SUPPORTED = -148, // The given frustum adjust mode is not supported. NVAPI_TOPO_NOT_POSSIBLE = -149, // The mosaic topology is not possible given the current state of the hardware. NVAPI_MODE_CHANGE_FAILED = -150, // An attempt to do a display resolution mode change has failed. NVAPI_D3D11_LIBRARY_NOT_FOUND = -151, // d3d11.dll/d3d11_beta.dll cannot be loaded. NVAPI_INVALID_ADDRESS = -152, // Address is outside of valid range. NVAPI_STRING_TOO_SMALL = -153, // The pre-allocated string is too small to hold the result. NVAPI_MATCHING_DEVICE_NOT_FOUND = -154, // The input does not match any of the available devices. NVAPI_DRIVER_RUNNING = -155, // Driver is running. NVAPI_DRIVER_NOTRUNNING = -156, // Driver is not running. NVAPI_ERROR_DRIVER_RELOAD_REQUIRED = -157, // A driver reload is required to apply these settings. NVAPI_SET_NOT_ALLOWED = -158, // Intended setting is not allowed. NVAPI_ADVANCED_DISPLAY_TOPOLOGY_REQUIRED = -159, // Information can't be returned due to "advanced display topology". NVAPI_SETTING_NOT_FOUND = -160, // Setting is not found. NVAPI_SETTING_SIZE_TOO_LARGE = -161, // Setting size is too large. NVAPI_TOO_MANY_SETTINGS_IN_PROFILE = -162, // There are too many settings for a profile. NVAPI_PROFILE_NOT_FOUND = -163, // Profile is not found. NVAPI_PROFILE_NAME_IN_USE = -164, // Profile name is duplicated. NVAPI_PROFILE_NAME_EMPTY = -165, // Profile name is empty. NVAPI_EXECUTABLE_NOT_FOUND = -166, // Application not found in the Profile. NVAPI_EXECUTABLE_ALREADY_IN_USE = -167, // Application already exists in the other profile. NVAPI_DATATYPE_MISMATCH = -168, // Data Type mismatch NVAPI_PROFILE_REMOVED = -169, // The profile passed as parameter has been removed and is no longer valid. NVAPI_UNREGISTERED_RESOURCE = -170, // An unregistered resource was passed as a parameter. NVAPI_ID_OUT_OF_RANGE = -171, // The DisplayId corresponds to a display which is not within the normal outputId range. NVAPI_DISPLAYCONFIG_VALIDATION_FAILED = -172, // Display topology is not valid so the driver cannot do a mode set on this configuration. NVAPI_DPMST_CHANGED = -173, // Display Port Multi-Stream topology has been changed. NVAPI_INSUFFICIENT_BUFFER = -174, // Input buffer is insufficient to hold the contents. NVAPI_ACCESS_DENIED = -175, // No access to the caller. NVAPI_MOSAIC_NOT_ACTIVE = -176, // The requested action cannot be performed without Mosaic being enabled. NVAPI_SHARE_RESOURCE_RELOCATED = -177, // The surface is relocated away from video memory. NVAPI_REQUEST_USER_TO_DISABLE_DWM = -178, // The user should disable DWM before calling NvAPI. NVAPI_D3D_DEVICE_LOST = -179, // D3D device status is D3DERR_DEVICELOST or D3DERR_DEVICENOTRESET - the user has to reset the device. NVAPI_INVALID_CONFIGURATION = -180, // The requested action cannot be performed in the current state. NVAPI_STEREO_HANDSHAKE_NOT_DONE = -181, // Call failed as stereo handshake not completed. NVAPI_EXECUTABLE_PATH_IS_AMBIGUOUS = -182, // The path provided was too short to determine the correct NVDRS_APPLICATION NVAPI_DEFAULT_STEREO_PROFILE_IS_NOT_DEFINED = -183, // Default stereo profile is not currently defined NVAPI_DEFAULT_STEREO_PROFILE_DOES_NOT_EXIST = -184, // Default stereo profile does not exist NVAPI_CLUSTER_ALREADY_EXISTS = -185, // A cluster is already defined with the given configuration. NVAPI_DPMST_DISPLAY_ID_EXPECTED = -186, // The input display id is not that of a multi stream enabled connector or a display device in a multi stream topology NVAPI_INVALID_DISPLAY_ID = -187, // The input display id is not valid or the monitor associated to it does not support the current operation NVAPI_STREAM_IS_OUT_OF_SYNC = -188, // While playing secure audio stream, stream goes out of sync NVAPI_INCOMPATIBLE_AUDIO_DRIVER = -189, // Older audio driver version than required NVAPI_VALUE_ALREADY_SET = -190, // Value already set, setting again not allowed. NVAPI_TIMEOUT = -191, // Requested operation timed out NVAPI_GPU_WORKSTATION_FEATURE_INCOMPLETE = -192, // The requested workstation feature set has incomplete driver internal allocation resources NVAPI_STEREO_INIT_ACTIVATION_NOT_DONE = -193, // Call failed because InitActivation was not called. NVAPI_SYNC_NOT_ACTIVE = -194, // The requested action cannot be performed without Sync being enabled. NVAPI_SYNC_MASTER_NOT_FOUND = -195, // The requested action cannot be performed without Sync Master being enabled. NVAPI_INVALID_SYNC_TOPOLOGY = -196, // Invalid displays passed in the NV_GSYNC_DISPLAY pointer. NVAPI_ECID_SIGN_ALGO_UNSUPPORTED = -197, // The specified signing algorithm is not supported. Either an incorrect value was entered or the current installed driver/hardware does not support the input value. NVAPI_ECID_KEY_VERIFICATION_FAILED = -198, // The encrypted public key verification has failed. NVAPI_FIRMWARE_OUT_OF_DATE = -199, // The device's firmware is out of date. NVAPI_FIRMWARE_REVISION_NOT_SUPPORTED = -200, // The device's firmware is not supported. } NvAPI_Status; typedef struct struct_NV_GPU_PERF_POLICIES_INFO_PARAMS_V1 { // total size (of memset) is always: 76 = 0x4c NvU32 version; NvU32 a; NvU32 info_value; unsigned char x[64]; } NV_GPU_PERF_POLICIES_INFO_PARAMS_V1; typedef struct struct_NV_GPU_PERF_POLICIES_STATUS_PARAMS_V1 { // total size (of memset) is always: 1360 = 0x550 NvU32 version; NvU32 info_value; NvU32 a; NvU32 b; NvU32 throttle; unsigned char x[1340]; } NV_GPU_PERF_POLICIES_STATUS_PARAMS_V1; typedef struct struct_NvLevel { NvS32 Level; NvS32 Policy; } NvLevel; typedef struct struct_NV_GPU_COOLER_LEVELS { NvU32 Version; NvLevel Levels[NVAPI_MAX_COOLER_PER_GPU]; } NV_GPU_COOLER_LEVELS; NVAPI_INTERFACE NvAPI_QueryInterface (unsigned int offset); NVAPI_INTERFACE NvAPI_Initialize (void); NVAPI_INTERFACE NvAPI_Unload (void); NVAPI_INTERFACE NvAPI_GetErrorMessage (NvAPI_Status nr,NvAPI_ShortString szDesc); NVAPI_INTERFACE NvAPI_EnumPhysicalGPUs (NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS], NvU32 *pGpuCount); NVAPI_INTERFACE NvAPI_GPU_GetPerfPoliciesInfo (NvPhysicalGpuHandle hPhysicalGpu, NV_GPU_PERF_POLICIES_INFO_PARAMS_V1 *perfPolicies_info); NVAPI_INTERFACE NvAPI_GPU_GetPerfPoliciesStatus (NvPhysicalGpuHandle hPhysicalGpu, NV_GPU_PERF_POLICIES_STATUS_PARAMS_V1 *perfPolicies_status); NVAPI_INTERFACE NvAPI_GPU_SetCoolerLevels (NvPhysicalGpuHandle hPhysicalGpu, NvU32 coolerIndex, NV_GPU_COOLER_LEVELS *pCoolerLevels); NVAPI_INTERFACE NvAPI_GPU_RestoreCoolerSettings (NvPhysicalGpuHandle hPhysicalGpu, NvU32 coolerIndex); NVAPI_INTERFACE NvAPI_GPU_GetBusId (NvPhysicalGpuHandle hPhysicalGpu, NvU32 *pBusId); NVAPI_INTERFACE NvAPI_GPU_GetBusSlotId (NvPhysicalGpuHandle hPhysicalGpu, NvU32 *pBusSlotId); /* * End of declarations from nvapi.h and subheaders **/ typedef NvPhysicalGpuHandle HM_ADAPTER_NVAPI; #if defined(_WIN32) || defined(__WIN32__) #define NVAPI_API_CALL __stdcall #else #define NVAPI_API_CALL #endif typedef int *(*NVAPI_API_CALL NVAPI_QUERYINTERFACE) (unsigned int); typedef int (*NVAPI_API_CALL NVAPI_INITIALIZE) (void); typedef int (*NVAPI_API_CALL NVAPI_UNLOAD) (void); typedef int (*NVAPI_API_CALL NVAPI_GETERRORMESSAGE) (NvAPI_Status, NvAPI_ShortString); typedef int (*NVAPI_API_CALL NVAPI_ENUMPHYSICALGPUS) (NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS], NvU32 *); typedef int (*NVAPI_API_CALL NVAPI_GPU_GETPERFPOLICIESINFO) (NvPhysicalGpuHandle, NV_GPU_PERF_POLICIES_INFO_PARAMS_V1 *); typedef int (*NVAPI_API_CALL NVAPI_GPU_GETPERFPOLICIESSTATUS) (NvPhysicalGpuHandle, NV_GPU_PERF_POLICIES_STATUS_PARAMS_V1 *); typedef int (*NVAPI_API_CALL NVAPI_GPU_SETCOOLERLEVELS) (NvPhysicalGpuHandle, NvU32, NV_GPU_COOLER_LEVELS *); typedef int (*NVAPI_API_CALL NVAPI_GPU_RESTORECOOLERSETTINGS) (NvPhysicalGpuHandle, NvU32); typedef int (*NVAPI_API_CALL NVAPI_GPU_GETBUSID) (NvPhysicalGpuHandle, NvU32 *); typedef int (*NVAPI_API_CALL NVAPI_GPU_GETBUSSLOTID) (NvPhysicalGpuHandle, NvU32 *); #if defined (_POSIX) typedef void *NVAPI_LIB; #else typedef HINSTANCE NVAPI_LIB; #endif typedef struct hm_nvapi_lib { NVAPI_LIB lib; NVAPI_QUERYINTERFACE nvapi_QueryInterface; NVAPI_INITIALIZE NvAPI_Initialize; NVAPI_UNLOAD NvAPI_Unload; NVAPI_GETERRORMESSAGE NvAPI_GetErrorMessage; NVAPI_ENUMPHYSICALGPUS NvAPI_EnumPhysicalGPUs; NVAPI_GPU_GETPERFPOLICIESINFO NvAPI_GPU_GetPerfPoliciesInfo; NVAPI_GPU_GETPERFPOLICIESSTATUS NvAPI_GPU_GetPerfPoliciesStatus; NVAPI_GPU_SETCOOLERLEVELS NvAPI_GPU_SetCoolerLevels; NVAPI_GPU_RESTORECOOLERSETTINGS NvAPI_GPU_RestoreCoolerSettings; NVAPI_GPU_GETBUSID NvAPI_GPU_GetBusId; NVAPI_GPU_GETBUSSLOTID NvAPI_GPU_GetBusSlotId; } hm_nvapi_lib_t; typedef hm_nvapi_lib_t NVAPI_PTR; #endif // _EXT_NVAPI_H hashcat-4.0.1/include/ext_nvml.h000066400000000000000000000245161320027462700165720ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _NVML_H #define _NVML_H /** * Declarations from nvml.h */ typedef struct nvmlDevice_st* nvmlDevice_t; typedef struct nvmlPciInfo_st { char busId[16]; //!< The tuple domain:bus:device.function PCI identifier (& NULL terminator) unsigned int domain; //!< The PCI domain on which the device's bus resides, 0 to 0xffff unsigned int bus; //!< The bus on which the device resides, 0 to 0xff unsigned int device; //!< The device's id on the bus, 0 to 31 unsigned int pciDeviceId; //!< The combined 16-bit device id and 16-bit vendor id // Added in NVML 2.285 API unsigned int pciSubSystemId; //!< The 32-bit Sub System Device ID // NVIDIA reserved for internal use only unsigned int reserved0; unsigned int reserved1; unsigned int reserved2; unsigned int reserved3; } nvmlPciInfo_t; typedef struct nvmlUtilization_st { unsigned int gpu; // GPU kernel execution last second, percent unsigned int memory; // GPU memory read/write last second, percent } nvmlUtilization_t; typedef enum nvmlTemperatureSensors_enum { NVML_TEMPERATURE_GPU = 0 // Temperature sensor for the GPU die } nvmlTemperatureSensors_t; typedef enum nvmlReturn_enum { NVML_SUCCESS = 0, // The operation was successful NVML_ERROR_UNINITIALIZED = 1, // NVML was not first initialized with nvmlInit() NVML_ERROR_INVALID_ARGUMENT = 2, // A supplied argument is invalid NVML_ERROR_NOT_SUPPORTED = 3, // The requested operation is not available on target device NVML_ERROR_NO_PERMISSION = 4, // The current user does not have permission for operation NVML_ERROR_ALREADY_INITIALIZED = 5, // Deprecated: Multiple initializations are now allowed through ref counting NVML_ERROR_NOT_FOUND = 6, // A query to find an object was unsuccessful NVML_ERROR_INSUFFICIENT_SIZE = 7, // An input argument is not large enough NVML_ERROR_INSUFFICIENT_POWER = 8, // A device's external power cables are not properly attached NVML_ERROR_DRIVER_NOT_LOADED = 9, // NVIDIA driver is not loaded NVML_ERROR_TIMEOUT = 10, // User provided timeout passed NVML_ERROR_UNKNOWN = 999 // An internal driver error occurred } nvmlReturn_t; typedef enum nvmlClockType_enum { NVML_CLOCK_GRAPHICS = 0, NVML_CLOCK_SM = 1, NVML_CLOCK_MEM = 2 } nvmlClockType_t; typedef enum nvmlTemperatureThresholds_enum { NVML_TEMPERATURE_THRESHOLD_SHUTDOWN = 0, // Temperature at which the GPU will shut down // for HW protection NVML_TEMPERATURE_THRESHOLD_SLOWDOWN = 1, // Temperature at which the GPU will begin slowdown // Keep this last NVML_TEMPERATURE_THRESHOLD_COUNT } nvmlTemperatureThresholds_t; /** * Compute mode. * * NVML_COMPUTEMODE_EXCLUSIVE_PROCESS was added in CUDA 4.0. * Earlier CUDA versions supported a single exclusive mode, * which is equivalent to NVML_COMPUTEMODE_EXCLUSIVE_THREAD in CUDA 4.0 and beyond. */ typedef enum nvmlComputeMode_enum { NVML_COMPUTEMODE_DEFAULT = 0, //!< Default compute mode -- multiple contexts per device NVML_COMPUTEMODE_EXCLUSIVE_THREAD = 1, //!< Compute-exclusive-thread mode -- only one context per device, usable from one thread at a time NVML_COMPUTEMODE_PROHIBITED = 2, //!< Compute-prohibited mode -- no contexts per device NVML_COMPUTEMODE_EXCLUSIVE_PROCESS = 3, //!< Compute-exclusive-process mode -- only one context per device, usable from multiple threads at a time // Keep this last NVML_COMPUTEMODE_COUNT } nvmlComputeMode_t; /** * GPU Operation Mode * * GOM allows to reduce power usage and optimize GPU throughput by disabling GPU features. * * Each GOM is designed to meet specific user needs. */ typedef enum nvmlGom_enum { NVML_GOM_ALL_ON = 0, //!< Everything is enabled and running at full speed NVML_GOM_COMPUTE = 1, //!< Designed for running only compute tasks. Graphics operations //!< are not allowed NVML_GOM_LOW_DP = 2 //!< Designed for running graphics applications that don't require //!< high bandwidth double precision } nvmlGpuOperationMode_t; /***************************************************************************************************/ /** @addtogroup nvmlClocksThrottleReasons * @{ */ /***************************************************************************************************/ /** Nothing is running on the GPU and the clocks are dropping to Idle state * \note This limiter may be removed in a later release */ #define nvmlClocksThrottleReasonGpuIdle 0x0000000000000001LL /** GPU clocks are limited by current setting of applications clocks * * @see nvmlDeviceSetApplicationsClocks * @see nvmlDeviceGetApplicationsClock */ #define nvmlClocksThrottleReasonApplicationsClocksSetting 0x0000000000000002LL /** * @deprecated Renamed to \ref nvmlClocksThrottleReasonApplicationsClocksSetting * as the name describes the situation more accurately. */ #define nvmlClocksThrottleReasonUserDefinedClocks nvmlClocksThrottleReasonApplicationsClocksSetting /** SW Power Scaling algorithm is reducing the clocks below requested clocks * * @see nvmlDeviceGetPowerUsage * @see nvmlDeviceSetPowerManagementLimit * @see nvmlDeviceGetPowerManagementLimit */ #define nvmlClocksThrottleReasonSwPowerCap 0x0000000000000004LL /** HW Slowdown (reducing the core clocks by a factor of 2 or more) is engaged * * This is an indicator of: * - temperature being too high * - External Power Brake Assertion is triggered (e.g. by the system power supply) * - Power draw is too high and Fast Trigger protection is reducing the clocks * - May be also reported during PState or clock change * - This behavior may be removed in a later release. * * @see nvmlDeviceGetTemperature * @see nvmlDeviceGetTemperatureThreshold * @see nvmlDeviceGetPowerUsage */ #define nvmlClocksThrottleReasonHwSlowdown 0x0000000000000008LL /** Some other unspecified factor is reducing the clocks */ #define nvmlClocksThrottleReasonUnknown 0x8000000000000000LL /** Bit mask representing no clocks throttling * * Clocks are as high as possible. * */ #define nvmlClocksThrottleReasonNone 0x0000000000000000LL /* * End of declarations from nvml.h **/ typedef nvmlDevice_t HM_ADAPTER_NVML; #if defined(_WIN32) || defined(__WIN32__) #define NVML_API_CALL __stdcall #else #define NVML_API_CALL #endif typedef const char * (*NVML_API_CALL NVML_ERROR_STRING) (nvmlReturn_t); typedef int (*NVML_API_CALL NVML_INIT) (void); typedef int (*NVML_API_CALL NVML_SHUTDOWN) (void); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_COUNT) (unsigned int *); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_NAME) (nvmlDevice_t, char *, unsigned int); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_HANDLE_BY_INDEX) (unsigned int, nvmlDevice_t *); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_TEMPERATURE) (nvmlDevice_t, nvmlTemperatureSensors_t, unsigned int *); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_FAN_SPEED) (nvmlDevice_t, unsigned int *); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_POWER_USAGE) (nvmlDevice_t, unsigned int *); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_UTILIZATION_RATES) (nvmlDevice_t, nvmlUtilization_t *); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_CLOCKINFO) (nvmlDevice_t, nvmlClockType_t, unsigned int *); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_THRESHOLD) (nvmlDevice_t, nvmlTemperatureThresholds_t, unsigned int *); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_CURRPCIELINKGENERATION) (nvmlDevice_t, unsigned int *); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_CURRPCIELINKWIDTH) (nvmlDevice_t, unsigned int *); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_CURRENTCLOCKSTHROTTLEREASONS) (nvmlDevice_t, unsigned long long *); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_SUPPORTEDCLOCKSTHROTTLEREASONS) (nvmlDevice_t, unsigned long long *); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_SET_COMPUTEMODE) (nvmlDevice_t, nvmlComputeMode_t); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_SET_OPERATIONMODE) (nvmlDevice_t, nvmlGpuOperationMode_t); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_POWERMANAGEMENTLIMITCONSTRAINTS) (nvmlDevice_t, unsigned int *, unsigned int *); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_SET_POWERMANAGEMENTLIMIT) (nvmlDevice_t, unsigned int); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_POWERMANAGEMENTLIMIT) (nvmlDevice_t, unsigned int *); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_PCIINFO) (nvmlDevice_t, nvmlPciInfo_t *); #if defined (_POSIX) typedef void *NVML_LIB; #else typedef HINSTANCE NVML_LIB; #endif typedef struct hm_nvml_lib { NVML_LIB lib; NVML_ERROR_STRING nvmlErrorString; NVML_INIT nvmlInit; NVML_SHUTDOWN nvmlShutdown; NVML_DEVICE_GET_COUNT nvmlDeviceGetCount; NVML_DEVICE_GET_NAME nvmlDeviceGetName; NVML_DEVICE_GET_HANDLE_BY_INDEX nvmlDeviceGetHandleByIndex; NVML_DEVICE_GET_TEMPERATURE nvmlDeviceGetTemperature; NVML_DEVICE_GET_FAN_SPEED nvmlDeviceGetFanSpeed; NVML_DEVICE_GET_POWER_USAGE nvmlDeviceGetPowerUsage; NVML_DEVICE_GET_UTILIZATION_RATES nvmlDeviceGetUtilizationRates; NVML_DEVICE_GET_CLOCKINFO nvmlDeviceGetClockInfo; NVML_DEVICE_GET_THRESHOLD nvmlDeviceGetTemperatureThreshold; NVML_DEVICE_GET_CURRPCIELINKGENERATION nvmlDeviceGetCurrPcieLinkGeneration; NVML_DEVICE_GET_CURRPCIELINKWIDTH nvmlDeviceGetCurrPcieLinkWidth; NVML_DEVICE_GET_CURRENTCLOCKSTHROTTLEREASONS nvmlDeviceGetCurrentClocksThrottleReasons; NVML_DEVICE_GET_SUPPORTEDCLOCKSTHROTTLEREASONS nvmlDeviceGetSupportedClocksThrottleReasons; NVML_DEVICE_SET_COMPUTEMODE nvmlDeviceSetComputeMode; NVML_DEVICE_SET_OPERATIONMODE nvmlDeviceSetGpuOperationMode; NVML_DEVICE_GET_POWERMANAGEMENTLIMITCONSTRAINTS nvmlDeviceGetPowerManagementLimitConstraints; NVML_DEVICE_SET_POWERMANAGEMENTLIMIT nvmlDeviceSetPowerManagementLimit; NVML_DEVICE_GET_POWERMANAGEMENTLIMIT nvmlDeviceGetPowerManagementLimit; NVML_DEVICE_GET_PCIINFO nvmlDeviceGetPciInfo; } hm_nvml_lib_t; typedef hm_nvml_lib_t NVML_PTR; #endif // _NVML_H hashcat-4.0.1/include/ext_sysfs.h000066400000000000000000000007201320027462700167540ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _EXT_SYSFS_H #define _EXT_SYSFS_H static const char SYS_BUS_PCI_DEVICES[] = "/sys/bus/pci/devices"; typedef int HM_ADAPTER_SYSFS; typedef void *SYSFS_LIB; typedef struct hm_sysfs_lib { // currently not using libudev, because it can only read values, not set them, so using /sys instead SYSFS_LIB lib; } hm_sysfs_lib_t; typedef hm_sysfs_lib_t SYSFS_PTR; #endif // _EXT_SYSFS_H hashcat-4.0.1/include/ext_xnvctrl.h000066400000000000000000000046721320027462700173170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _EXT_XNVCTRL_H #define _EXT_XNVCTRL_H /** * Stuff from X11/Xlib.h */ typedef void *(*XOPENDISPLAY) (char *); typedef int (*XCLOSEDISPLAY) (void *); /** * Declarations from NVCtrl.h */ #define NV_CTRL_TARGET_TYPE_GPU 1 #define NV_CTRL_TARGET_TYPE_COOLER 5 /* e.g., fan */ #define NV_CTRL_GPU_COOLER_MANUAL_CONTROL 319 /* RW-G */ #define NV_CTRL_GPU_COOLER_MANUAL_CONTROL_FALSE 0 #define NV_CTRL_GPU_COOLER_MANUAL_CONTROL_TRUE 1 #define NV_CTRL_THERMAL_COOLER_CURRENT_LEVEL 417 /* R--C */ #define NV_CTRL_THERMAL_COOLER_LEVEL 320 /* RW-C */ /* * NV_CTRL_PCI_BUS - Returns the PCI bus number the specified device is using. */ #define NV_CTRL_PCI_BUS 239 /* R--GI */ /* * NV_CTRL_PCI_DEVICE - Returns the PCI device number the specified device is * using. */ #define NV_CTRL_PCI_DEVICE 240 /* R--GI */ /* * NV_CTRL_PCI_FUNCTION - Returns the PCI function number the specified device * is using. */ #define NV_CTRL_PCI_FUNCTION 241 /* R--GI */ /* * NV_CTRL_GPU_CORE_THRESHOLD reflects the temperature at which the * GPU is throttled to prevent overheating. */ #define NV_CTRL_GPU_CORE_THRESHOLD 61 /* R--G */ /** * hashcat stuff from here */ typedef int HM_ADAPTER_XNVCTRL; #if defined(_WIN32) || defined(__WIN32__) #define XNVCTRL_API_CALL __stdcall #else #define XNVCTRL_API_CALL #endif typedef int (*XNVCTRL_API_CALL XNVCTRLQUERYTARGETCOUNT) (void *, int, int *); typedef int (*XNVCTRL_API_CALL XNVCTRLQUERYTARGETATTRIBUTE) (void *, int, int, unsigned int, unsigned int, int *); typedef void (*XNVCTRL_API_CALL XNVCTRLSETTARGETATTRIBUTE) (void *, int, int, unsigned int, unsigned int, int); #if defined (_POSIX) typedef void *XNVCTRL_LIB; #else typedef HINSTANCE XNVCTRL_LIB; #endif typedef struct hm_xnvctrl_lib { void *dpy; XNVCTRL_LIB lib_x11; XNVCTRL_LIB lib_xnvctrl; XOPENDISPLAY XOpenDisplay; XCLOSEDISPLAY XCloseDisplay; XNVCTRLQUERYTARGETCOUNT XNVCTRLQueryTargetCount; XNVCTRLQUERYTARGETATTRIBUTE XNVCTRLQueryTargetAttribute; XNVCTRLSETTARGETATTRIBUTE XNVCTRLSetTargetAttribute; } hm_xnvctrl_lib_t; typedef hm_xnvctrl_lib_t XNVCTRL_PTR; #endif // _EXT_XNVCTRL_H hashcat-4.0.1/include/filehandling.h000066400000000000000000000005521320027462700173540ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _FILEHANDLING_H #define _FILEHANDLING_H #include #include #include u64 count_lines (FILE *fd); int fgetl (FILE *fp, char *line_buf); size_t superchop_with_length (char *buf, const size_t len); int in_superchop (char *buf); #endif // _FILEHANDLING_H hashcat-4.0.1/include/folder.h000066400000000000000000000016151320027462700162040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include #include #include #include #include #include #if defined (_WIN) #include #include #else #include #include #if defined (__APPLE__) #include #endif // __APPLE__ #endif // _WIN #define DOT_HASHCAT ".hashcat" #define SESSIONS_FOLDER "sessions" int sort_by_stringptr (const void *p1, const void *p2); int count_dictionaries (char **dictionary_files); char *first_file_in_directory (const char *path); char **scan_directory (const char *path); int folder_config_init (hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const char *install_folder, MAYBE_UNUSED const char *shared_folder); void folder_config_destroy (hashcat_ctx_t *hashcat_ctx); int hc_mkdir (const char *name, MAYBE_UNUSED const int mode); hashcat-4.0.1/include/hashcat.h000066400000000000000000000021101320027462700163330ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _HASHCAT_H #define _HASHCAT_H int hashcat_init (hashcat_ctx_t *hashcat_ctx, void (*event) (const u32, struct hashcat_ctx *, const void *, const size_t)); void hashcat_destroy (hashcat_ctx_t *hashcat_ctx); int hashcat_session_init (hashcat_ctx_t *hashcat_ctx, const char *install_folder, const char *shared_folder, int argc, char **argv, const int comptime); int hashcat_session_execute (hashcat_ctx_t *hashcat_ctx); int hashcat_session_pause (hashcat_ctx_t *hashcat_ctx); int hashcat_session_resume (hashcat_ctx_t *hashcat_ctx); int hashcat_session_bypass (hashcat_ctx_t *hashcat_ctx); int hashcat_session_checkpoint (hashcat_ctx_t *hashcat_ctx); int hashcat_session_quit (hashcat_ctx_t *hashcat_ctx); int hashcat_session_destroy (hashcat_ctx_t *hashcat_ctx); char *hashcat_get_log (hashcat_ctx_t *hashcat_ctx); int hashcat_get_status (hashcat_ctx_t *hashcat_ctx, hashcat_status_t *hashcat_status); #endif // _HASHCAT_H hashcat-4.0.1/include/hashes.h000066400000000000000000000020101320027462700161720ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _HASH_MANAGEMENT_H #define _HASH_MANAGEMENT_H int sort_by_digest_p0p1 (const void *v1, const void *v2, void *v3); int sort_by_salt (const void *v1, const void *v2); int sort_by_hash (const void *v1, const void *v2, void *v3); int sort_by_hash_no_salt (const void *v1, const void *v2, void *v3); int save_hash (hashcat_ctx_t *hashcat_ctx); void check_hash (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, plain_t *plain); int check_cracked (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 salt_pos); int hashes_init_stage1 (hashcat_ctx_t *hashcat_ctx); int hashes_init_stage2 (hashcat_ctx_t *hashcat_ctx); int hashes_init_stage3 (hashcat_ctx_t *hashcat_ctx); int hashes_init_stage4 (hashcat_ctx_t *hashcat_ctx); int hashes_init_selftest (hashcat_ctx_t *hashcat_ctx); void hashes_destroy (hashcat_ctx_t *hashcat_ctx); void hashes_logger (hashcat_ctx_t *hashcat_ctx); #endif // _HASH_MANAGEMENT_H hashcat-4.0.1/include/hlfmt.h000066400000000000000000000010521320027462700160360ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _HLFMT_H #define _HLFMT_H #include #define HLFMTS_CNT 11 char *strhlfmt (const u32 hashfile_format); void hlfmt_hash (hashcat_ctx_t *hashcat_ctx, u32 hashfile_format, char *line_buf, int line_len, char **hashbuf_pos, int *hashbuf_len); void hlfmt_user (hashcat_ctx_t *hashcat_ctx, u32 hashfile_format, char *line_buf, int line_len, char **userbuf_pos, int *userbuf_len); u32 hlfmt_detect (hashcat_ctx_t *hashcat_ctx, FILE *fp, u32 max_check); #endif // _HLFMT_H hashcat-4.0.1/include/hwmon.h000066400000000000000000000033541320027462700160630ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include #if defined (__CYGWIN__) #include #endif #ifndef _HWMON_H #define _HWMON_H int hm_get_threshold_slowdown_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id); int hm_get_threshold_shutdown_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id); int hm_get_temperature_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id); int hm_get_fanpolicy_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id); int hm_get_fanspeed_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id); int hm_get_buslanes_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id); int hm_get_utilization_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id); int hm_get_memoryspeed_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id); int hm_get_corespeed_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id); int hm_get_throttle_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id); int hm_set_fanspeed_with_device_id_adl (hashcat_ctx_t *hashcat_ctx, const u32 device_id, const int fanspeed, const int fanpolicy); int hm_set_fanspeed_with_device_id_nvapi (hashcat_ctx_t *hashcat_ctx, const u32 device_id, const int fanspeed, const int fanpolicy); int hm_set_fanspeed_with_device_id_xnvctrl (hashcat_ctx_t *hashcat_ctx, const u32 device_id, const int fanspeed); int hm_set_fanspeed_with_device_id_sysfs (hashcat_ctx_t *hashcat_ctx, const u32 device_id, const int fanspeed); int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx); void hwmon_ctx_destroy (hashcat_ctx_t *hashcat_ctx); #endif // _HWMON_H hashcat-4.0.1/include/induct.h000066400000000000000000000006161320027462700162170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _INDUCT_H #define _INDUCT_H #include #include #include static const char INDUCT_DIR[] = "induct"; int induct_ctx_init (hashcat_ctx_t *hashcat_ctx); void induct_ctx_scan (hashcat_ctx_t *hashcat_ctx); void induct_ctx_destroy (hashcat_ctx_t *hashcat_ctx); #endif // _INDUCT_H hashcat-4.0.1/include/interface.h000066400000000000000000002101561320027462700166730ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _INTERFACE_H #define _INTERFACE_H #include #include #include #include #include /** * zero hashes shutcut */ static const char LM_ZERO_HASH[] = "aad3b435b51404ee"; static const char LM_MASKED_PLAIN[] = "[notfound]"; /** * algo specific */ // original headers from luks.h #define LUKS_CIPHERNAME_L 32 #define LUKS_CIPHERMODE_L 32 #define LUKS_HASHSPEC_L 32 #define LUKS_DIGESTSIZE 20 // since SHA1 #define LUKS_HMACSIZE 32 #define LUKS_SALTSIZE 32 #define LUKS_NUMKEYS 8 // Minimal number of iterations #define LUKS_MKD_ITERATIONS_MIN 1000 #define LUKS_SLOT_ITERATIONS_MIN 1000 #define LUKS_KEY_DISABLED_OLD 0 #define LUKS_KEY_ENABLED_OLD 0xCAFE #define LUKS_KEY_DISABLED 0x0000DEAD #define LUKS_KEY_ENABLED 0x00AC71F3 #define LUKS_STRIPES 4000 // partition header starts with magic #define LUKS_MAGIC {'L','U','K','S', 0xba, 0xbe}; #define LUKS_MAGIC_L 6 /* Actually we need only 37, but we don't want struct autoaligning to kick in */ #define UUID_STRING_L 40 /* Offset to keyslot area [in bytes] */ #define LUKS_ALIGN_KEYSLOTS 4096 struct luks_phdr { char magic[LUKS_MAGIC_L]; uint16_t version; char cipherName[LUKS_CIPHERNAME_L]; char cipherMode[LUKS_CIPHERMODE_L]; char hashSpec[LUKS_HASHSPEC_L]; uint32_t payloadOffset; uint32_t keyBytes; char mkDigest[LUKS_DIGESTSIZE]; char mkDigestSalt[LUKS_SALTSIZE]; uint32_t mkDigestIterations; char uuid[UUID_STRING_L]; struct { uint32_t active; /* parameters used for password processing */ uint32_t passwordIterations; char passwordSalt[LUKS_SALTSIZE]; /* parameters used for AF store/load */ uint32_t keyMaterialOffset; uint32_t stripes; } keyblock[LUKS_NUMKEYS]; /* Align it to 512 sector size */ char _padding[432]; }; // not from original headers start with hc_ typedef enum hc_luks_hash_type { HC_LUKS_HASH_TYPE_SHA1 = 1, HC_LUKS_HASH_TYPE_SHA256 = 2, HC_LUKS_HASH_TYPE_SHA512 = 3, HC_LUKS_HASH_TYPE_RIPEMD160 = 4, HC_LUKS_HASH_TYPE_WHIRLPOOL = 5, } hc_luks_hash_type_t; typedef enum hc_luks_key_size { HC_LUKS_KEY_SIZE_128 = 128, HC_LUKS_KEY_SIZE_256 = 256, HC_LUKS_KEY_SIZE_512 = 512, } hc_luks_key_size_t; typedef enum hc_luks_cipher_type { HC_LUKS_CIPHER_TYPE_AES = 1, HC_LUKS_CIPHER_TYPE_SERPENT = 2, HC_LUKS_CIPHER_TYPE_TWOFISH = 3, } hc_luks_cipher_type_t; typedef enum hc_luks_cipher_mode { HC_LUKS_CIPHER_MODE_CBC_ESSIV = 1, HC_LUKS_CIPHER_MODE_CBC_PLAIN = 2, HC_LUKS_CIPHER_MODE_XTS_PLAIN = 3, } hc_luks_cipher_mode_t; typedef struct luks { int hash_type; // hc_luks_hash_type_t int key_size; // hc_luks_key_size_t int cipher_type; // hc_luks_cipher_type_t int cipher_mode; // hc_luks_cipher_mode_t u32 ct_buf[128]; u32 af_src_buf[((HC_LUKS_KEY_SIZE_512 / 8) * LUKS_STRIPES) / 4]; } luks_t; typedef struct itunes_backup { u32 wpky[10]; u32 dpsl[5]; } itunes_backup_t; typedef struct blake2 { u64 h[8]; u64 t[2]; u64 f[2]; u32 buflen; u32 outlen; u8 last_node; } blake2_t; typedef struct chacha20 { u32 iv[2]; u32 plain[2]; u32 position[2]; u32 offset; } chacha20_t; typedef struct rar5 { u32 iv[4]; } rar5_t; typedef struct pdf { 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 wpa { u32 pke[32]; u32 eapol[64 + 16]; u16 eapol_len; u8 message_pair; int message_pair_chgd; u8 keyver; u8 orig_mac_ap[6]; u8 orig_mac_sta[6]; u8 orig_nonce_ap[32]; u8 orig_nonce_sta[32]; u8 essid_len; u8 essid[32]; u32 keymic[4]; u32 hash[4]; int nonce_compare; int nonce_error_corrections; } wpa_t; typedef struct bitcoin_wallet { 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 sip { u32 salt_buf[32]; u32 salt_len; u32 esalt_buf[48]; u32 esalt_len; } sip_t; typedef struct androidfde { u32 data[384]; } androidfde_t; typedef struct ikepsk { u32 nr_buf[16]; u32 nr_len; u32 msg_buf[128]; u32 msg_len; } ikepsk_t; typedef struct netntlm { u32 user_len; u32 domain_len; u32 srvchall_len; u32 clichall_len; u32 userdomain_buf[64]; u32 chall_buf[256]; } netntlm_t; typedef struct krb5pa { u32 user[16]; u32 realm[16]; u32 salt[32]; u32 timestamp[16]; u32 checksum[4]; } krb5pa_t; typedef struct krb5tgs { u32 account_info[512]; u32 checksum[4]; u32 edata2[2560]; u32 edata2_len; } krb5tgs_t; typedef struct keepass { u32 version; u32 algorithm; /* key-file handling */ u32 keyfile_len; u32 keyfile[8]; u32 final_random_seed[8]; u32 transf_random_seed[8]; u32 enc_iv[4]; u32 contents_hash[8]; /* specific to version 1 */ u32 contents_len; u32 contents[75000]; /* specific to version 2 */ u32 expected_bytes[8]; } keepass_t; typedef struct tc { u32 salt_buf[32]; u32 data_buf[112]; u32 keyfile_buf[16]; u32 signature; } tc_t; typedef struct pbkdf2_md5 { u32 salt_buf[16]; } pbkdf2_md5_t; typedef struct pbkdf2_sha1 { u32 salt_buf[16]; } pbkdf2_sha1_t; typedef struct pbkdf2_sha256 { u32 salt_buf[16]; } pbkdf2_sha256_t; typedef struct pbkdf2_sha512 { u32 salt_buf[32]; } pbkdf2_sha512_t; typedef struct agilekey { u8 cipher[1040]; } agilekey_t; typedef struct rakp { u32 salt_buf[128]; u32 salt_len; } rakp_t; typedef struct cloudkey { u32 data_len; u32 data_buf[512]; } cloudkey_t; typedef struct office2007 { u32 encryptedVerifier[4]; u32 encryptedVerifierHash[5]; u32 keySize; } office2007_t; typedef struct office2010 { u32 encryptedVerifier[4]; u32 encryptedVerifierHash[8]; } office2010_t; typedef struct office2013 { u32 encryptedVerifier[4]; u32 encryptedVerifierHash[8]; } office2013_t; typedef struct oldoffice01 { u32 version; u32 encryptedVerifier[4]; u32 encryptedVerifierHash[4]; u32 rc4key[2]; } oldoffice01_t; typedef struct oldoffice34 { u32 version; u32 encryptedVerifier[4]; u32 encryptedVerifierHash[5]; u32 rc4key[2]; } oldoffice34_t; typedef struct pstoken { u32 salt_buf[128]; u32 salt_len; u32 pc_digest[5]; u32 pc_offset; } pstoken_t; typedef struct zip2 { u32 type; u32 mode; u32 magic; u32 salt_len; u32 salt_buf[4]; u32 verify_bytes; u32 compress_length; u32 data_len; u32 data_buf[2048]; u32 auth_len; u32 auth_buf[4]; } zip2_t; typedef struct win8phone { u32 salt_buf[32]; } win8phone_t; typedef struct psafe3 { char signature[4]; u32 salt_buf[8]; u32 iterations; u32 hash_buf[8]; } psafe3_t; typedef struct dpapimk { u32 context; u32 SID[32]; u32 SID_len; u32 SID_offset; /* here only for possible forward compatibiliy */ // u8 cipher_algo[16]; // u8 hash_algo[16]; u32 iv[4]; u32 contents_len; u32 contents[128]; } dpapimk_t; typedef struct jks_sha1 { u32 checksum[5]; u32 iv[5]; u32 enc_key_buf[4096]; u32 enc_key_len; u32 der[5]; u32 alias[16]; } jks_sha1_t; typedef struct ethereum_pbkdf2 { u32 salt_buf[16]; u32 ciphertext[8]; } ethereum_pbkdf2_t; typedef struct ethereum_scrypt { u32 salt_buf[16]; u32 ciphertext[8]; } ethereum_scrypt_t; typedef struct luks_tmp { u32 ipad32[8]; u64 ipad64[8]; u32 opad32[8]; u64 opad64[8]; u32 dgst32[32]; u64 dgst64[16]; u32 out32[32]; u64 out64[16]; } luks_tmp_t; typedef struct pdf14_tmp { u32 digest[4]; u32 out[4]; } pdf14_tmp_t; typedef struct pdf17l8_tmp { union { u32 dgst32[16]; u64 dgst64[8]; } d; u32 dgst_len; u32 W_len; } pdf17l8_tmp_t; typedef struct phpass_tmp { u32 digest_buf[4]; } phpass_tmp_t; typedef struct md5crypt_tmp { u32 digest_buf[4]; } md5crypt_tmp_t; typedef struct sha256crypt_tmp { // pure version u32 alt_result[8]; u32 p_bytes[64]; u32 s_bytes[64]; } sha256crypt_tmp_t; typedef struct sha512crypt_tmp { u64 l_alt_result[8]; u64 l_p_bytes[2]; u64 l_s_bytes[2]; // pure version u32 alt_result[16]; u32 p_bytes[64]; u32 s_bytes[64]; } sha512crypt_tmp_t; typedef struct wpa_tmp { u32 ipad[5]; u32 opad[5]; u32 dgst[10]; u32 out[10]; } wpa_tmp_t; typedef struct wpapmk_tmp { u32 out[8]; } wpapmk_tmp_t; typedef struct bitcoin_wallet_tmp { u64 dgst[8]; } bitcoin_wallet_tmp_t; typedef struct dcc2_tmp { u32 ipad[5]; u32 opad[5]; u32 dgst[5]; u32 out[4]; } dcc2_tmp_t; typedef struct bcrypt_tmp { u32 E[18]; u32 P[18]; u32 S0[256]; u32 S1[256]; u32 S2[256]; u32 S3[256]; } bcrypt_tmp_t; typedef struct pwsafe2_tmp { u32 digest[2]; u32 P[18]; u32 S0[256]; u32 S1[256]; u32 S2[256]; u32 S3[256]; } pwsafe2_tmp_t; typedef struct pwsafe3_tmp { u32 digest_buf[8]; } pwsafe3_tmp_t; typedef struct androidpin_tmp { u32 digest_buf[5]; } androidpin_tmp_t; typedef struct androidfde_tmp { u32 ipad[5]; u32 opad[5]; u32 dgst[10]; u32 out[10]; } androidfde_tmp_t; typedef struct tc_tmp { u32 ipad[16]; u32 opad[16]; u32 dgst[64]; u32 out[64]; } tc_tmp_t; typedef struct tc64_tmp { u64 ipad[8]; u64 opad[8]; u64 dgst[32]; u64 out[32]; } tc64_tmp_t; typedef struct agilekey_tmp { u32 ipad[5]; u32 opad[5]; u32 dgst[5]; u32 out[5]; } agilekey_tmp_t; typedef struct mywallet_tmp { u32 ipad[5]; u32 opad[5]; u32 dgst[10]; u32 out[10]; } mywallet_tmp_t; typedef struct sha1aix_tmp { u32 ipad[5]; u32 opad[5]; u32 dgst[5]; u32 out[5]; } sha1aix_tmp_t; typedef struct sha256aix_tmp { u32 ipad[8]; u32 opad[8]; u32 dgst[8]; u32 out[8]; } sha256aix_tmp_t; typedef struct sha512aix_tmp { u64 ipad[8]; u64 opad[8]; u64 dgst[8]; u64 out[8]; } sha512aix_tmp_t; typedef struct lastpass_tmp { u32 ipad[8]; u32 opad[8]; u32 dgst[8]; u32 out[8]; } lastpass_tmp_t; typedef struct drupal7_tmp { u64 digest_buf[8]; } drupal7_tmp_t; typedef struct lotus8_tmp { u32 ipad[5]; u32 opad[5]; u32 dgst[5]; u32 out[5]; } lotus8_tmp_t; typedef struct office2007_tmp { u32 out[5]; } office2007_tmp_t; typedef struct office2010_tmp { u32 out[5]; } office2010_tmp_t; typedef struct office2013_tmp { u64 out[8]; } office2013_tmp_t; typedef struct saph_sha1_tmp { u32 digest_buf[5]; } saph_sha1_tmp_t; typedef struct pbkdf1_sha1_tmp { // pbkdf1-sha1 is limited to 160 bits u32 ipad[5]; u32 opad[5]; u32 out[5]; } pbkdf1_sha1_tmp_t; typedef struct pbkdf2_md5_tmp { u32 ipad[4]; u32 opad[4]; u32 dgst[32]; u32 out[32]; } pbkdf2_md5_tmp_t; typedef struct pbkdf2_sha1_tmp { u32 ipad[5]; u32 opad[5]; u32 dgst[32]; u32 out[32]; } pbkdf2_sha1_tmp_t; typedef struct pbkdf2_sha256_tmp { u32 ipad[8]; u32 opad[8]; u32 dgst[32]; u32 out[32]; } pbkdf2_sha256_tmp_t; typedef struct pbkdf2_sha512_tmp { u64 ipad[8]; u64 opad[8]; u64 dgst[16]; u64 out[16]; } pbkdf2_sha512_tmp_t; typedef struct ecryptfs_tmp { u64 out[8]; } ecryptfs_tmp_t; typedef struct oraclet_tmp { u64 ipad[8]; u64 opad[8]; u64 dgst[16]; u64 out[16]; } oraclet_tmp_t; typedef struct seven_zip_tmp { u32 h[8]; u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; int len; } seven_zip_tmp_t; typedef struct bsdicrypt_tmp { u32 Kc[16]; u32 Kd[16]; u32 iv[2]; } bsdicrypt_tmp_t; typedef struct rar3_tmp { u32 dgst[17][5]; } rar3_tmp_t; typedef struct cram_md5 { u32 user[16]; } cram_md5_t; typedef struct seven_zip_hook_salt { u32 iv_buf[4]; u32 iv_len; u32 salt_buf[4]; u32 salt_len; u32 crc; u32 crc_len; u8 data_type; u32 data_buf[81882]; u32 data_len; u32 unpack_size; char coder_attributes[5 + 1]; u8 coder_attributes_len; int aes_len; // pre-computed length of the maximal (subset of) data we need for AES-CBC } seven_zip_hook_salt_t; typedef struct axcrypt_tmp { u32 KEK[4]; u32 lsb[4]; u32 cipher[4]; } axcrypt_tmp_t; typedef struct keepass_tmp { u32 tmp_digest[8]; } keepass_tmp_t; typedef struct dpapimk_tmp_v1 { u32 ipad[5]; u32 opad[5]; u32 dgst[10]; u32 out[10]; u32 userKey[5]; } dpapimk_tmp_v1_t; typedef struct dpapimk_tmp_v2 { u64 ipad64[8]; u64 opad64[8]; u64 dgst64[16]; u64 out64[16]; u32 userKey[5]; } dpapimk_tmp_v2_t; typedef struct seven_zip_hook { u32 ukey[8]; u32 hook_success; } seven_zip_hook_t; typedef struct struct_psafe2_hdr { u32 random[2]; u32 hash[5]; u32 salt[5]; // unused, but makes better valid check u32 iv[2]; // unused, but makes better valid check } psafe2_hdr; typedef enum { MESSAGE_PAIR_M12E2 = 0, MESSAGE_PAIR_M14E4 = 1, MESSAGE_PAIR_M32E2 = 2, MESSAGE_PAIR_M32E3 = 3, MESSAGE_PAIR_M34E3 = 4, MESSAGE_PAIR_M34E4 = 5, } message_pair_t; #define HCCAPX_VERSION 4 #define HCCAPX_SIGNATURE 0x58504348 // HCPX // this is required to force mingw to accept the packed attribute #pragma pack(push,1) struct hccapx { u32 signature; u32 version; u8 message_pair; u8 essid_len; u8 essid[32]; u8 keyver; u8 keymic[16]; u8 mac_ap[6]; u8 nonce_ap[32]; u8 mac_sta[6]; u8 nonce_sta[32]; u16 eapol_len; u8 eapol[256]; } __attribute__((packed)); typedef struct hccapx hccapx_t; #pragma pack(pop) /** * hashtypes enums */ typedef enum display_len { DISPLAY_LEN_MIN_0 = 32, DISPLAY_LEN_MAX_0 = 32, DISPLAY_LEN_MIN_10 = 32 + 1 + 0, DISPLAY_LEN_MAX_10 = 32 + 1 + SALT_MAX, DISPLAY_LEN_MIN_10H = 32 + 1 + 0, DISPLAY_LEN_MAX_10H = 32 + 1 + (SALT_MAX * 2), DISPLAY_LEN_MIN_20 = 32 + 1 + 0, DISPLAY_LEN_MAX_20 = 32 + 1 + SALT_MAX, DISPLAY_LEN_MIN_20H = 32 + 1 + 0, DISPLAY_LEN_MAX_20H = 32 + 1 + (SALT_MAX * 2), DISPLAY_LEN_MIN_50 = 32 + 1 + 0, DISPLAY_LEN_MAX_50 = 32 + 1 + SALT_MAX, DISPLAY_LEN_MIN_50H = 32 + 1 + 0, DISPLAY_LEN_MAX_50H = 32 + 1 + (SALT_MAX * 2), DISPLAY_LEN_MIN_100 = 40, DISPLAY_LEN_MAX_100 = 40, DISPLAY_LEN_MIN_110 = 40 + 1 + 0, DISPLAY_LEN_MAX_110 = 40 + 1 + SALT_MAX, DISPLAY_LEN_MIN_110H = 40 + 1 + 0, DISPLAY_LEN_MAX_110H = 40 + 1 + (SALT_MAX * 2), DISPLAY_LEN_MIN_120 = 40 + 1 + 0, DISPLAY_LEN_MAX_120 = 40 + 1 + SALT_MAX, DISPLAY_LEN_MIN_120H = 40 + 1 + 0, DISPLAY_LEN_MAX_120H = 40 + 1 + (SALT_MAX * 2), DISPLAY_LEN_MIN_150 = 40 + 1 + 0, DISPLAY_LEN_MAX_150 = 40 + 1 + SALT_MAX, DISPLAY_LEN_MIN_150H = 40 + 1 + 0, DISPLAY_LEN_MAX_150H = 40 + 1 + (SALT_MAX * 2), DISPLAY_LEN_MIN_200 = 16, DISPLAY_LEN_MAX_200 = 16, DISPLAY_LEN_MIN_300 = 40, DISPLAY_LEN_MAX_300 = 40, DISPLAY_LEN_MIN_400 = 34, DISPLAY_LEN_MAX_400 = 34, DISPLAY_LEN_MIN_500 = 3 + 1 + 0 + 22, DISPLAY_LEN_MIN_501 = 104, DISPLAY_LEN_MAX_500 = 3 + 1 + 8 + 22, DISPLAY_LEN_MAX_501 = 104, DISPLAY_LEN_MIN_600 = 8 + 128, DISPLAY_LEN_MAX_600 = 8 + 128, DISPLAY_LEN_MIN_900 = 32, DISPLAY_LEN_MAX_900 = 32, DISPLAY_LEN_MIN_1000 = 32, DISPLAY_LEN_MAX_1000 = 32, DISPLAY_LEN_MIN_1100 = 32 + 1 + 0, DISPLAY_LEN_MAX_1100 = 32 + 1 + SALT_MAX, DISPLAY_LEN_MIN_1300 = 56, DISPLAY_LEN_MAX_1300 = 56, DISPLAY_LEN_MIN_1400 = 64, DISPLAY_LEN_MAX_1400 = 64, DISPLAY_LEN_MIN_1410 = 64 + 1 + 0, DISPLAY_LEN_MAX_1410 = 64 + 1 + SALT_MAX, DISPLAY_LEN_MIN_1410H = 64 + 1 + 0, DISPLAY_LEN_MAX_1410H = 64 + 1 + (SALT_MAX * 2), DISPLAY_LEN_MIN_1420 = 64 + 1 + 0, DISPLAY_LEN_MAX_1420 = 64 + 1 + SALT_MAX, DISPLAY_LEN_MIN_1420H = 64 + 1 + 0, DISPLAY_LEN_MAX_1420H = 64 + 1 + (SALT_MAX * 2), DISPLAY_LEN_MIN_1421 = 70, DISPLAY_LEN_MAX_1421 = 70, DISPLAY_LEN_MIN_1450 = 64 + 1 + 0, DISPLAY_LEN_MAX_1450 = 64 + 1 + SALT_MAX, DISPLAY_LEN_MIN_1450H = 64 + 1 + 0, DISPLAY_LEN_MAX_1450H = 64 + 1 + (SALT_MAX * 2), DISPLAY_LEN_MIN_1500 = 13, DISPLAY_LEN_MAX_1500 = 13, DISPLAY_LEN_MIN_1600 = 29 + 0, DISPLAY_LEN_MAX_1600 = 29 + 8, DISPLAY_LEN_MIN_1700 = 128, DISPLAY_LEN_MAX_1700 = 128, DISPLAY_LEN_MIN_1710 = 128 + 1 + 0, DISPLAY_LEN_MAX_1710 = 128 + 1 + SALT_MAX, DISPLAY_LEN_MIN_1710H = 128 + 1 + 0, DISPLAY_LEN_MAX_1710H = 128 + 1 + (SALT_MAX * 2), DISPLAY_LEN_MIN_1720 = 128 + 1 + 0, DISPLAY_LEN_MAX_1720 = 128 + 1 + SALT_MAX, DISPLAY_LEN_MIN_1720H = 128 + 1 + 0, DISPLAY_LEN_MAX_1720H = 128 + 1 + (SALT_MAX * 2), DISPLAY_LEN_MIN_1730 = 128 + 1 + 0, DISPLAY_LEN_MAX_1730 = 128 + 1 + SALT_MAX, DISPLAY_LEN_MIN_1740 = 128 + 1 + 0, DISPLAY_LEN_MAX_1740 = 128 + 1 + (SALT_MAX * 2), DISPLAY_LEN_MIN_1750 = 128 + 1 + 0, DISPLAY_LEN_MAX_1750 = 128 + 1 + SALT_MAX, DISPLAY_LEN_MIN_1750H = 128 + 1 + 0, DISPLAY_LEN_MAX_1750H = 128 + 1 + (SALT_MAX * 2), DISPLAY_LEN_MIN_1800 = 90 + 0, DISPLAY_LEN_MAX_1800 = 90 + 16, DISPLAY_LEN_MIN_2100 = 6 + 1 + 1 + 0 + 1 + 32, DISPLAY_LEN_MAX_2100 = 6 + 5 + 1 + SALT_MAX + 1 + 32, DISPLAY_LEN_MIN_2400 = 16, DISPLAY_LEN_MAX_2400 = 16, DISPLAY_LEN_MIN_2410 = 16 + 1 + 1, DISPLAY_LEN_MAX_2410 = 16 + 1 + 4, DISPLAY_LEN_MIN_2600 = 32, DISPLAY_LEN_MAX_2600 = 32, DISPLAY_LEN_MIN_3000 = 16, DISPLAY_LEN_MAX_3000 = 16, DISPLAY_LEN_MIN_3100 = 16 + 1 + 0, DISPLAY_LEN_MAX_3100 = 16 + 1 + 30, DISPLAY_LEN_MIN_3200 = 60, DISPLAY_LEN_MAX_3200 = 60, DISPLAY_LEN_MIN_4300 = 32, DISPLAY_LEN_MAX_4300 = 32, DISPLAY_LEN_MIN_4500 = 40, DISPLAY_LEN_MAX_4500 = 40, DISPLAY_LEN_MIN_4520 = 40 + 1 + 0, DISPLAY_LEN_MAX_4520 = 40 + 1 + SALT_MAX, DISPLAY_LEN_MIN_4520H = 40 + 1 + 0, DISPLAY_LEN_MAX_4520H = 40 + 1 + (SALT_MAX * 2), DISPLAY_LEN_MIN_4800 = 32 + 1 + 32 + 1 + 2, DISPLAY_LEN_MAX_4800 = 32 + 1 + 32 + 1 + 2, DISPLAY_LEN_MIN_5000 = 16, DISPLAY_LEN_MAX_5000 = 400, DISPLAY_LEN_MIN_5100 = 16, DISPLAY_LEN_MAX_5100 = 16, DISPLAY_LEN_MIN_5300 = 48, DISPLAY_LEN_MAX_5300 = 1024, DISPLAY_LEN_MIN_5400 = 56, DISPLAY_LEN_MAX_5400 = 1024, DISPLAY_LEN_MIN_5500 = 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 48 + 1 + 16, DISPLAY_LEN_MAX_5500 = 60 + 1 + 0 + 1 + 45 + 1 + 48 + 1 + 48 + 1 + 16, DISPLAY_LEN_MIN_5600 = 1 + 1 + 0 + 1 + 1 + 1 + 16 + 1 + 32 + 1 + 1, DISPLAY_LEN_MAX_5600 = 60 + 1 + 0 + 1 + 45 + 1 + 16 + 1 + 32 + 1 + 1024, DISPLAY_LEN_MIN_5700 = 43, DISPLAY_LEN_MAX_5700 = 43, DISPLAY_LEN_MIN_5800 = 40 + 1 + 1, DISPLAY_LEN_MAX_5800 = 40 + 1 + 16, DISPLAY_LEN_MIN_6000 = 40, DISPLAY_LEN_MAX_6000 = 40, DISPLAY_LEN_MIN_6100 = 128, DISPLAY_LEN_MAX_6100 = 128, DISPLAY_LEN_MIN_6300 = 6 + 1 + 8 + 22, DISPLAY_LEN_MAX_6300 = 6 + 1 + 48 + 22, DISPLAY_LEN_MIN_6400 = 9 + 2 + 1 + 16 + 1 + 43, DISPLAY_LEN_MAX_6400 = 9 + 2 + 1 + 48 + 1 + 43, DISPLAY_LEN_MIN_6500 = 9 + 2 + 1 + 16 + 1 + 86, DISPLAY_LEN_MAX_6500 = 9 + 2 + 1 + 48 + 1 + 86, DISPLAY_LEN_MIN_6600 = 1 + 1 + 16 + 1 + 2080, DISPLAY_LEN_MAX_6600 = 6 + 1 + 16 + 1 + 2080, DISPLAY_LEN_MIN_6700 = 7 + 2 + 1 + 16 + 1 + 27, DISPLAY_LEN_MAX_6700 = 7 + 2 + 1 + 48 + 1 + 27, DISPLAY_LEN_MIN_6800 = 32 + 1 + 1 + 1 + 0, DISPLAY_LEN_MAX_6800 = 32 + 1 + 5 + 1 + 32, DISPLAY_LEN_MIN_6900 = 64, DISPLAY_LEN_MAX_6900 = 64, DISPLAY_LEN_MIN_7000 = 3 + 44, DISPLAY_LEN_MAX_7000 = 3 + 44, DISPLAY_LEN_MIN_7100 = 4 + 2 + 1 + 64 + 1 + 128, DISPLAY_LEN_MAX_7100 = 4 + 5 + 1 + 64 + 1 + 128, DISPLAY_LEN_MIN_7200 = 19 + 1 + 1 + 1 + 128, DISPLAY_LEN_MAX_7200 = 19 + 5 + 1 + 224 + 128, DISPLAY_LEN_MIN_7300 = 64 + 1 + 40, DISPLAY_LEN_MAX_7300 = 512 + 1 + 40, DISPLAY_LEN_MIN_7400 = 47 + 0, DISPLAY_LEN_MAX_7400 = 47 + 16, DISPLAY_LEN_MIN_7500 = 1 + 6 + 1 + 2 + 1 + 0 + 1 + 0 + 1 + 0 + 1 + 72 + 32, DISPLAY_LEN_MAX_7500 = 1 + 6 + 1 + 2 + 1 + 64 + 1 + 64 + 1 + 128 + 1 + 72 + 32, DISPLAY_LEN_MIN_7700 = 1 + 1 + 16, DISPLAY_LEN_MAX_7700 = 40 + 1 + 16, DISPLAY_LEN_MIN_7800 = 1 + 1 + 40, DISPLAY_LEN_MAX_7800 = 40 + 1 + 40, DISPLAY_LEN_MIN_7900 = 3 + 1 + 8 + 43, DISPLAY_LEN_MAX_7900 = 3 + 1 + 8 + 43, DISPLAY_LEN_MIN_8000 = 2 + 4 + 16 + 64, DISPLAY_LEN_MAX_8000 = 2 + 4 + 16 + 64, DISPLAY_LEN_MIN_8100 = 1 + 8 + 40, DISPLAY_LEN_MAX_8100 = 1 + 8 + 40, DISPLAY_LEN_MIN_8200 = 64 + 1 + 32 + 1 + 1 + 1 + 1, DISPLAY_LEN_MAX_8200 = 64 + 1 + 32 + 1 + 8 + 1 + 2048, DISPLAY_LEN_MIN_8300 = 32 + 1 + 1 + 1 + 1 + 1 + 1, DISPLAY_LEN_MAX_8300 = 32 + 1 + 32 + 1 + 32 + 1 + 5, DISPLAY_LEN_MIN_8400 = 40 + 1 + 40, DISPLAY_LEN_MAX_8400 = 40 + 1 + 40, DISPLAY_LEN_MIN_8500 = 6 + 1 + 1 + 1 + 1, DISPLAY_LEN_MAX_8500 = 6 + 1 + 8 + 1 + 16, DISPLAY_LEN_MIN_8600 = 32, DISPLAY_LEN_MAX_8600 = 32, DISPLAY_LEN_MIN_8700 = 22, DISPLAY_LEN_MAX_8700 = 22, DISPLAY_LEN_MIN_8800 = 1 + 3 + 1 + 2 + 1 + 32 + 1 + 2 + 1 + 32 + 1 + 3072, DISPLAY_LEN_MAX_8800 = 1 + 3 + 1 + 2 + 1 + 32 + 1 + 2 + 1 + 32 + 1 + 3072, DISPLAY_LEN_MIN_8900 = 6 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 44, DISPLAY_LEN_MAX_8900 = 6 + 1 + 6 + 1 + 2 + 1 + 2 + 1 + 45 + 1 + 44, DISPLAY_LEN_MIN_9100 = 51, DISPLAY_LEN_MAX_9100 = 51, DISPLAY_LEN_MIN_9200 = 3 + 14 + 1 + 43, DISPLAY_LEN_MAX_9200 = 3 + 14 + 1 + 43, DISPLAY_LEN_MIN_9300 = 3 + 14 + 1 + 43, DISPLAY_LEN_MAX_9300 = 3 + 14 + 1 + 43, DISPLAY_LEN_MIN_9400 = 8 + 1 + 4 + 1 + 2 + 1 + 3 + 1 + 2 + 1 + 32 + 1 + 32 + 1 + 40, DISPLAY_LEN_MAX_9400 = 8 + 1 + 4 + 1 + 2 + 1 + 3 + 1 + 2 + 1 + 32 + 1 + 32 + 1 + 40, DISPLAY_LEN_MIN_9500 = 8 + 1 + 4 + 1 + 6 + 1 + 3 + 1 + 2 + 1 + 32 + 1 + 32 + 1 + 64, DISPLAY_LEN_MAX_9500 = 8 + 1 + 4 + 1 + 6 + 1 + 3 + 1 + 2 + 1 + 32 + 1 + 32 + 1 + 64, DISPLAY_LEN_MIN_9600 = 8 + 1 + 4 + 1 + 6 + 1 + 3 + 1 + 2 + 1 + 32 + 1 + 32 + 1 + 64, DISPLAY_LEN_MAX_9600 = 8 + 1 + 4 + 1 + 6 + 1 + 3 + 1 + 2 + 1 + 32 + 1 + 32 + 1 + 64, DISPLAY_LEN_MIN_9700 = 12 + 1 + 32 + 1 + 32 + 1 + 32, DISPLAY_LEN_MAX_9700 = 12 + 1 + 32 + 1 + 32 + 1 + 32, DISPLAY_LEN_MIN_9720 = 12 + 1 + 32 + 1 + 32 + 1 + 32 + 1 + 10, DISPLAY_LEN_MAX_9720 = 12 + 1 + 32 + 1 + 32 + 1 + 32 + 1 + 10, DISPLAY_LEN_MIN_9800 = 12 + 1 + 32 + 1 + 32 + 1 + 40, DISPLAY_LEN_MAX_9800 = 12 + 1 + 32 + 1 + 32 + 1 + 40, DISPLAY_LEN_MIN_9820 = 12 + 1 + 32 + 1 + 32 + 1 + 40 + 1 + 10, DISPLAY_LEN_MAX_9820 = 12 + 1 + 32 + 1 + 32 + 1 + 40 + 1 + 10, DISPLAY_LEN_MIN_9900 = 32, DISPLAY_LEN_MAX_9900 = 32, DISPLAY_LEN_MIN_10000 = 13 + 1 + 1 + 1 + 0 + 44, DISPLAY_LEN_MAX_10000 = 13 + 1 + 6 + 1 + 15 + 44, DISPLAY_LEN_MIN_10100 = 16 + 1 + 1 + 1 + 1 + 1 + 32, DISPLAY_LEN_MAX_10100 = 16 + 1 + 1 + 1 + 1 + 1 + 32, DISPLAY_LEN_MIN_10200 = 10 + 12 + 1 + 44, DISPLAY_LEN_MAX_10200 = 10 + 76 + 1 + 132, DISPLAY_LEN_MIN_10300 = 10 + 1 + 1 + 33, DISPLAY_LEN_MAX_10300 = 10 + 5 + 1 + 49, 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, 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, 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, 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, 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, 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, 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, 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, DISPLAY_LEN_MIN_10600 = 5 + 1 + 1 + 1 + 1 + 3 + 1 + 1 + 1 + 1 + 1 + 2 + 1 + 32 + 1 + 1, DISPLAY_LEN_MAX_10600 = 5 + 1 + 1 + 1 + 1 + 3 + 1 + 5 + 1 + 1 + 1 + 2 + 1 + 32 + 1 + 1000, DISPLAY_LEN_MIN_10700 = 5 + 1 + 1 + 1 + 1 + 3 + 1 + 1 + 1 + 1 + 1 + 2 + 1 + 32 + 1 + 1, DISPLAY_LEN_MAX_10700 = 5 + 1 + 1 + 1 + 1 + 3 + 1 + 5 + 1 + 1 + 1 + 2 + 1 + 32 + 1 + 1000, DISPLAY_LEN_MIN_10800 = 96, DISPLAY_LEN_MAX_10800 = 96, DISPLAY_LEN_MIN_10900 = 7 + 1 + 1 + 0 + 1 + 24, DISPLAY_LEN_MAX_10900 = 7 + 6 + 1 + 64 + 1 + 88, DISPLAY_LEN_MIN_11000 = 32 + 1 + 56, DISPLAY_LEN_MAX_11000 = 32 + 1 + 56, DISPLAY_LEN_MIN_11100 = 10 + 0 + 1 + 8 + 1 + 32, DISPLAY_LEN_MAX_11100 = 10 + 32 + 1 + 8 + 1 + 32, DISPLAY_LEN_MIN_11200 = 9 + 40 + 1 + 40, DISPLAY_LEN_MAX_11200 = 9 + 40 + 1 + 40, DISPLAY_LEN_MIN_11300 = 1 + 7 + 1 + 2 + 1 + 96 + 1 + 2 + 1 + 16 + 1 + 1 + 1 + 2 + 1 + 96 + 1 + 1 + 1 + 2, DISPLAY_LEN_MAX_11300 = 1 + 7 + 1 + 2 + 1 + 96 + 1 + 2 + 1 + 16 + 1 + 6 + 1 + 2 + 1 + 96 + 1 + 3 + 1 + 512, 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, 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, DISPLAY_LEN_MIN_11500 = 8 + 1 + 8, DISPLAY_LEN_MAX_11500 = 8 + 1 + 8, 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 + 0 + 0 + 0 + 0, DISPLAY_LEN_MAX_11600 = 1 + 2 + 1 + 1 + 1 + 2 + 1 + 1 + 1 + 64 + 1 + 1 + 1 + 32 + 1 + 10 + 1 + 4 + 1 + 4 + 1 + 655056 + 1 + 4 + 1 + 10, DISPLAY_LEN_MIN_11700 = 64, DISPLAY_LEN_MAX_11700 = 64, DISPLAY_LEN_MIN_11800 = 128, DISPLAY_LEN_MAX_11800 = 128, DISPLAY_LEN_MIN_11900 = 3 + 1 + 1 + 0 + 1 + 12, DISPLAY_LEN_MAX_11900 = 3 + 6 + 1 + 64 + 1 + 88, DISPLAY_LEN_MIN_12000 = 4 + 1 + 1 + 0 + 1 + 16, DISPLAY_LEN_MAX_12000 = 4 + 6 + 1 + 64 + 1 + 88, DISPLAY_LEN_MIN_12100 = 6 + 1 + 1 + 0 + 1 + 16, DISPLAY_LEN_MAX_12100 = 6 + 6 + 1 + 64 + 1 + 88, DISPLAY_LEN_MIN_12200 = 1 + 8 + 1 + 1 + 1 + 1 + 1 + 16 + 1 + 16, DISPLAY_LEN_MAX_12200 = 1 + 8 + 1 + 1 + 1 + 1 + 1 + 16 + 1 + 16, DISPLAY_LEN_MIN_12300 = 160, DISPLAY_LEN_MAX_12300 = 160, DISPLAY_LEN_MIN_12400 = 1 + 4 + 4 + 11, DISPLAY_LEN_MAX_12400 = 1 + 4 + 4 + 11, DISPLAY_LEN_MIN_12500 = 6 + 1 + 1 + 1 + 16 + 1 + 32, DISPLAY_LEN_MAX_12500 = 6 + 1 + 1 + 1 + 16 + 1 + 32, DISPLAY_LEN_MIN_12600 = 64 + 1 + 64, DISPLAY_LEN_MAX_12600 = 64 + 1 + 64, DISPLAY_LEN_MIN_12700 = 1 + 10 + 1 + 1 + 1 + 64, DISPLAY_LEN_MAX_12700 = 1 + 10 + 1 + 5 + 1 + 20000, DISPLAY_LEN_MIN_12800 = 11 + 1 + 20 + 1 + 1 + 1 + 64, DISPLAY_LEN_MAX_12800 = 11 + 1 + 20 + 1 + 5 + 1 + 64, DISPLAY_LEN_MIN_12900 = 64 + 64 + 32, DISPLAY_LEN_MAX_12900 = 64 + 64 + 32, DISPLAY_LEN_MIN_13000 = 1 + 4 + 1 + 2 + 1 + 32 + 1 + 2 + 1 + 32 + 1 + 1 + 1 + 16, DISPLAY_LEN_MAX_13000 = 1 + 4 + 1 + 2 + 1 + 32 + 1 + 2 + 1 + 32 + 1 + 1 + 1 + 16, DISPLAY_LEN_MIN_13100 = 1 + 7 + 1 + 2 + 1 + 0 + 0 + 32 + 1 + 64, DISPLAY_LEN_MAX_13100 = 1 + 7 + 1 + 2 + 1 + 2 + 512 + 1 + 32 + 1 + 20480, DISPLAY_LEN_MIN_13200 = 1 + 7 + 1 + 1 + 1 + 1 + 1 + 1 + 32 + 1 + 48, DISPLAY_LEN_MAX_13200 = 1 + 7 + 1 + 1 + 1 + 1 + 50 + 1 + 32 + 1 + 48 + 1 + 20480, DISPLAY_LEN_MIN_13300 = 1 + 12 + 1 + 32, DISPLAY_LEN_MAX_13300 = 1 + 12 + 1 + 40, DISPLAY_LEN_MIN_13400 = 1 + 7 + 1 + 1 + 1 + 1 + 1 + 1 + 32 + 1 + 64 + 1 + 32 + 1 + 64 + 1 + 1 + 1 + 1, DISPLAY_LEN_MAX_13400 = 1 + 7 + 1 + 1 + 10 + 1 + 3 + 1 + 64 + 1 + 64 + 1 + 32 + 1 + 64 + 1 + 4 + 1 + 600000 + 1 + 2 + 1 + 64, DISPLAY_LEN_MIN_13500 = 40 + 1 + 32, DISPLAY_LEN_MAX_13500 = 40 + 1 + 1024, DISPLAY_LEN_MIN_13600 = 6 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 16 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 20 + 1 + 7, DISPLAY_LEN_MAX_13600 = 6 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 32 + 1 + 4 + 1 + 4 + 1 + 8192 + 1 + 20 + 1 + 7, DISPLAY_LEN_MIN_13800 = 64 + 1 + 256, DISPLAY_LEN_MAX_13800 = 64 + 1 + 256, DISPLAY_LEN_MIN_13900 = 40 + 1 + 9, DISPLAY_LEN_MAX_13900 = 40 + 1 + 9, DISPLAY_LEN_MIN_14000 = 16 + 1 + 16, DISPLAY_LEN_MAX_14000 = 16 + 1 + 16, DISPLAY_LEN_MIN_14100 = 16 + 1 + 16, DISPLAY_LEN_MAX_14100 = 16 + 1 + 16, DISPLAY_LEN_MIN_14400 = 40 + 1 + 20, DISPLAY_LEN_MAX_14400 = 40 + 1 + 20, DISPLAY_LEN_MIN_14700 = 15 + 1 + 1 + 1 + 80 + 1 + 1 + 1 + 40 + 1, DISPLAY_LEN_MAX_14700 = 15 + 1 + 2 + 1 + 80 + 1 + 6 + 1 + 40 + 1 + 9 + 1 + 40, DISPLAY_LEN_MIN_14900 = 8 + 1 + 8, DISPLAY_LEN_MAX_14900 = 8 + 1 + 8, DISPLAY_LEN_MIN_15000 = 128 + 1 + 64, DISPLAY_LEN_MAX_15000 = 128 + 1 + 64, DISPLAY_LEN_MIN_15100 = 6 + 3 + 1 + 8 + 1 + 28, DISPLAY_LEN_MAX_15100 = 6 + 6 + 1 + 8 + 1 + 28, DISPLAY_LEN_MIN_15200 = 1 + 10 + 1 + 2 + 1 + 1 + 1 + 1 + 1 + 64, DISPLAY_LEN_MAX_15200 = 1 + 10 + 1 + 2 + 1 + 8 + 1 + 5 + 1 + 20000, DISPLAY_LEN_MIN_15300 = 1 + 7 + 1 + 1 + 1 + 1 + 1 + 10 + 1 + 4 + 1 + 4 + 1 + 1 + 1 + 32 + 1 + 3 + 1 + 128, DISPLAY_LEN_MAX_15300 = 1 + 7 + 1 + 1 + 1 + 1 + 1 + 100 + 1 + 6 + 1 + 6 + 1 + 10 + 1 + 32 + 1 + 4 + 1 + 512, DISPLAY_LEN_MIN_15400 = 10 + 1 + 16 + 1 + 1 + 1 + 16 + 1 + 16 + 1 + 16, DISPLAY_LEN_MAX_15400 = 10 + 1 + 16 + 1 + 2 + 1 + 16 + 1 + 16 + 1 + 16, DISPLAY_LEN_MIN_15500 = 10 + 1 + 40 + 1 + 40 + 1 + 1 + 1 + 2 + 1 + 28 + 1 + 1, DISPLAY_LEN_MAX_15500 = 10 + 1 + 40 + 1 + 40 + 1 + 16384 + 1 + 2 + 1 + 28 + 1 + 64, DISPLAY_LEN_MIN_15600 = 11 + 1 + 1 + 1 + 32 + 1 + 64 + 1 + 64, DISPLAY_LEN_MAX_15600 = 11 + 1 + 6 + 1 + 64 + 1 + 64 + 1 + 64, DISPLAY_LEN_MIN_15700 = 11 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 64 + 1 + 64 + 1 + 64, DISPLAY_LEN_MAX_15700 = 11 + 1 + 6 + 1 + 1 + 1 + 1 + 1 + 64 + 1 + 64 + 1 + 64, DISPLAY_LEN_MIN_15900 = 1 + 7 + 1 + 1 + 1 + 1 + 1 + 10 + 1 + 4 + 1 + 4 + 1 + 1 + 1 + 32 + 1 + 3 + 1 + 128, DISPLAY_LEN_MAX_15900 = 1 + 7 + 1 + 1 + 1 + 1 + 1 + 100 + 1 + 6 + 1 + 6 + 1 + 10 + 1 + 32 + 1 + 4 + 1 + 512, DISPLAY_LEN_MIN_99999 = 1, DISPLAY_LEN_MAX_99999 = 55, DISPLAY_LEN_MIN_11 = 32 + 1 + 0, DISPLAY_LEN_MAX_11 = 32 + 1 + SALT_MAX, DISPLAY_LEN_MIN_12 = 32 + 1 + 0, DISPLAY_LEN_MAX_12 = 32 + 1 + 32, DISPLAY_LEN_MIN_21 = 32 + 1 + 2, DISPLAY_LEN_MAX_21 = 32 + 1 + 2, DISPLAY_LEN_MIN_22 = 30 + 1 + 1, DISPLAY_LEN_MAX_22 = 30 + 1 + 32, DISPLAY_LEN_MIN_23 = 32 + 1 + 0, DISPLAY_LEN_MAX_23 = 32 + 1 + SALT_MAX, DISPLAY_LEN_MIN_101 = 5 + 28, DISPLAY_LEN_MAX_101 = 5 + 28, DISPLAY_LEN_MIN_111 = 6 + 28 + 1, DISPLAY_LEN_MAX_111 = 6 + 28 + SALT_MAX, DISPLAY_LEN_MIN_112 = 40 + 1 + 20, DISPLAY_LEN_MAX_112 = 40 + 1 + 20, DISPLAY_LEN_MIN_121 = 40 + 1 + 1, DISPLAY_LEN_MAX_121 = 40 + 1 + SALT_MAX, DISPLAY_LEN_MIN_122 = 8 + 40, DISPLAY_LEN_MAX_122 = 8 + 40, DISPLAY_LEN_MIN_124 = 4 + 1 + 0 + 1 + 40, DISPLAY_LEN_MAX_124 = 4 + 1 + 32 + 1 + 40, DISPLAY_LEN_MIN_125 = 10 + 40, DISPLAY_LEN_MAX_125 = 10 + 40, DISPLAY_LEN_MIN_131 = 6 + 8 + 80, DISPLAY_LEN_MAX_131 = 6 + 8 + 80, DISPLAY_LEN_MIN_132 = 6 + 8 + 40, DISPLAY_LEN_MAX_132 = 6 + 8 + 40, DISPLAY_LEN_MIN_133 = 28, DISPLAY_LEN_MAX_133 = 28, DISPLAY_LEN_MIN_141 = 14 + 0 + 1 + 28, DISPLAY_LEN_MAX_141 = 14 + 44 + 1 + 28, DISPLAY_LEN_MIN_1411 = 9 + 44 + 0, DISPLAY_LEN_MAX_1411 = 9 + 44 + 68, DISPLAY_LEN_MIN_1441 = 14 + 0 + 1 + 43, DISPLAY_LEN_MAX_1441 = 14 + 24 + 1 + 43, DISPLAY_LEN_MIN_1711 = 9 + 86 + 0, DISPLAY_LEN_MAX_1711 = 9 + 86 + 68, DISPLAY_LEN_MIN_1722 = 8 + 128, DISPLAY_LEN_MAX_1722 = 8 + 128, DISPLAY_LEN_MIN_1731 = 128 + 6 + 0, DISPLAY_LEN_MAX_1731 = 128 + 6 + 16, DISPLAY_LEN_MIN_2611 = 32 + 1 + 0, DISPLAY_LEN_MAX_2611 = 32 + 1 + SALT_MAX, DISPLAY_LEN_MIN_2612 = 6 + 0 + 1 + 32, DISPLAY_LEN_MAX_2612 = 6 + SALT_MAX + 1 + 32, DISPLAY_LEN_MIN_2711 = 32 + 1 + 23, DISPLAY_LEN_MAX_2711 = 32 + 1 + 31, DISPLAY_LEN_MIN_2811 = 32 + 1 + 0, DISPLAY_LEN_MAX_2811 = 32 + 1 + SALT_MAX, DISPLAY_LEN_MIN_3711 = 3 + 0 + 1 + 32, DISPLAY_LEN_MAX_3711 = 3 + 31 + 1 + 32, DISPLAY_LEN_MIN_4521 = 40 + 1 + 32, DISPLAY_LEN_MAX_4521 = 40 + 1 + 32, DISPLAY_LEN_MIN_4522 = 40 + 1 + 12, DISPLAY_LEN_MAX_4522 = 40 + 1 + 12, DISPLAY_LEN_MIN_12001 = 9 + 64, DISPLAY_LEN_MAX_12001 = 9 + 64, } display_len_t; typedef enum hash_type { HASH_TYPE_MD4 = 1, HASH_TYPE_MD5 = 2, HASH_TYPE_MD5H = 3, HASH_TYPE_SHA1 = 4, HASH_TYPE_SHA224 = 5, HASH_TYPE_SHA256 = 6, HASH_TYPE_SHA384 = 7, HASH_TYPE_SHA512 = 8, HASH_TYPE_DCC2 = 9, HASH_TYPE_WPA = 10, HASH_TYPE_LM = 11, HASH_TYPE_DESCRYPT = 12, HASH_TYPE_ORACLEH = 13, HASH_TYPE_DESRACF = 14, HASH_TYPE_BCRYPT = 15, HASH_TYPE_KECCAK = 16, HASH_TYPE_NETNTLM = 17, HASH_TYPE_RIPEMD160 = 18, HASH_TYPE_WHIRLPOOL = 19, HASH_TYPE_AES = 20, HASH_TYPE_GOST = 21, HASH_TYPE_KRB5PA = 22, HASH_TYPE_SAPB = 23, HASH_TYPE_SAPG = 24, HASH_TYPE_MYSQL = 25, HASH_TYPE_LOTUS5 = 26, HASH_TYPE_LOTUS6 = 27, HASH_TYPE_ANDROIDFDE = 28, HASH_TYPE_SCRYPT = 29, HASH_TYPE_LOTUS8 = 30, HASH_TYPE_OFFICE2007 = 31, HASH_TYPE_OFFICE2010 = 32, HASH_TYPE_OFFICE2013 = 33, HASH_TYPE_OLDOFFICE01 = 34, HASH_TYPE_OLDOFFICE34 = 35, HASH_TYPE_SIPHASH = 36, HASH_TYPE_PDFU16 = 37, HASH_TYPE_PDFU32 = 38, HASH_TYPE_PBKDF2_SHA256 = 39, HASH_TYPE_BITCOIN_WALLET = 40, HASH_TYPE_CRC32 = 41, HASH_TYPE_GOST_2012SBOG_256 = 42, HASH_TYPE_GOST_2012SBOG_512 = 43, HASH_TYPE_PBKDF2_MD5 = 44, HASH_TYPE_PBKDF2_SHA1 = 45, HASH_TYPE_PBKDF2_SHA512 = 46, HASH_TYPE_ECRYPTFS = 47, HASH_TYPE_ORACLET = 48, HASH_TYPE_BSDICRYPT = 49, HASH_TYPE_RAR3HP = 50, HASH_TYPE_KRB5TGS = 51, HASH_TYPE_STDOUT = 52, HASH_TYPE_DES = 53, HASH_TYPE_PLAINTEXT = 54, HASH_TYPE_LUKS = 55, HASH_TYPE_ITUNES_BACKUP_9 = 56, HASH_TYPE_ITUNES_BACKUP_10 = 57, HASH_TYPE_SKIP32 = 58, HASH_TYPE_BLAKE2B = 59, HASH_TYPE_CHACHA20 = 60, HASH_TYPE_DPAPIMK = 61, HASH_TYPE_JKS_SHA1 = 62, } hash_type_t; typedef enum kern_type { KERN_TYPE_MD5 = 0, KERN_TYPE_MD5_PWSLT = 10, KERN_TYPE_MD5_SLTPW = 20, KERN_TYPE_MD5_PWUSLT = 30, KERN_TYPE_MD5_SLTPWU = 40, KERN_TYPE_HMACMD5_PW = 50, KERN_TYPE_HMACMD5_SLT = 60, KERN_TYPE_SHA1 = 100, KERN_TYPE_SHA1_PWSLT = 110, KERN_TYPE_SHA1_SLTPW = 120, KERN_TYPE_SHA1_PWUSLT = 130, KERN_TYPE_SHA1_SLTPWU = 140, KERN_TYPE_HMACSHA1_PW = 150, KERN_TYPE_HMACSHA1_SLT = 160, KERN_TYPE_MYSQL = 200, KERN_TYPE_MYSQL41 = 300, KERN_TYPE_PHPASS = 400, KERN_TYPE_MD5CRYPT = 500, KERN_TYPE_BLAKE2B = 600, KERN_TYPE_MD4 = 900, KERN_TYPE_MD4_PWU = 1000, KERN_TYPE_MD44_PWUSLT = 1100, KERN_TYPE_SHA224 = 1300, KERN_TYPE_SHA256 = 1400, KERN_TYPE_SHA256_PWSLT = 1410, KERN_TYPE_SHA256_SLTPW = 1420, KERN_TYPE_SHA256_PWUSLT = 1430, KERN_TYPE_SHA256_SLTPWU = 1440, KERN_TYPE_HMACSHA256_PW = 1450, KERN_TYPE_HMACSHA256_SLT = 1460, KERN_TYPE_DESCRYPT = 1500, KERN_TYPE_APR1CRYPT = 1600, KERN_TYPE_SHA512 = 1700, KERN_TYPE_SHA512_PWSLT = 1710, KERN_TYPE_SHA512_SLTPW = 1720, KERN_TYPE_SHA512_PWSLTU = 1730, KERN_TYPE_SHA512_SLTPWU = 1740, KERN_TYPE_HMACSHA512_PW = 1750, KERN_TYPE_HMACSHA512_SLT = 1760, KERN_TYPE_SHA512CRYPT = 1800, KERN_TYPE_STDOUT = 2000, KERN_TYPE_DCC2 = 2100, KERN_TYPE_MD5PIX = 2400, KERN_TYPE_MD5ASA = 2410, KERN_TYPE_WPA = 2500, KERN_TYPE_WPAPMK = 2501, KERN_TYPE_MD55 = 2600, KERN_TYPE_MD55_PWSLT1 = 2610, KERN_TYPE_MD55_PWSLT2 = 2710, KERN_TYPE_MD55_SLTPW = 2810, KERN_TYPE_LM = 3000, KERN_TYPE_ORACLEH = 3100, KERN_TYPE_BCRYPT = 3200, KERN_TYPE_MD5_SLT_MD5_PW = 3710, KERN_TYPE_MD5_SLT_PW_SLT = 3800, KERN_TYPE_MD55_PWSLT = 3910, KERN_TYPE_MD5_SLT_MD5_SLT_PW = 4010, KERN_TYPE_MD5_SLT_MD5_PW_SLT = 4110, KERN_TYPE_MD5U5 = 4300, KERN_TYPE_MD5U5_PWSLT1 = 4310, KERN_TYPE_MD5_SHA1 = 4400, KERN_TYPE_SHA11 = 4500, KERN_TYPE_SHA1_SLT_SHA1_PW = 4520, KERN_TYPE_SHA1_MD5 = 4700, KERN_TYPE_MD5_CHAP = 4800, KERN_TYPE_SHA1_SLT_PW_SLT = 4900, KERN_TYPE_KECCAK = 5000, KERN_TYPE_MD5H = 5100, KERN_TYPE_PSAFE3 = 5200, KERN_TYPE_IKEPSK_MD5 = 5300, KERN_TYPE_IKEPSK_SHA1 = 5400, KERN_TYPE_NETNTLMv1 = 5500, KERN_TYPE_NETNTLMv2 = 5600, KERN_TYPE_ANDROIDPIN = 5800, KERN_TYPE_RIPEMD160 = 6000, KERN_TYPE_WHIRLPOOL = 6100, KERN_TYPE_TCRIPEMD160_XTS512 = 6211, KERN_TYPE_TCRIPEMD160_XTS1024 = 6212, KERN_TYPE_TCRIPEMD160_XTS1536 = 6213, KERN_TYPE_TCSHA512_XTS512 = 6221, KERN_TYPE_TCSHA512_XTS1024 = 6222, KERN_TYPE_TCSHA512_XTS1536 = 6223, KERN_TYPE_TCWHIRLPOOL_XTS512 = 6231, KERN_TYPE_TCWHIRLPOOL_XTS1024 = 6232, KERN_TYPE_TCWHIRLPOOL_XTS1536 = 6233, KERN_TYPE_VCSHA256_XTS512 = 13751, KERN_TYPE_VCSHA256_XTS1024 = 13752, KERN_TYPE_VCSHA256_XTS1536 = 13753, KERN_TYPE_MD5AIX = 6300, KERN_TYPE_SHA256AIX = 6400, KERN_TYPE_SHA512AIX = 6500, KERN_TYPE_AGILEKEY = 6600, KERN_TYPE_SHA1AIX = 6700, KERN_TYPE_LASTPASS = 6800, KERN_TYPE_GOST = 6900, KERN_TYPE_FORTIGATE = 7000, KERN_TYPE_PBKDF2_SHA512 = 7100, KERN_TYPE_RAKP = 7300, KERN_TYPE_SHA256CRYPT = 7400, KERN_TYPE_KRB5PA = 7500, KERN_TYPE_SAPB = 7700, KERN_TYPE_SAPG = 7800, KERN_TYPE_DRUPAL7 = 7900, KERN_TYPE_SYBASEASE = 8000, KERN_TYPE_NETSCALER = 8100, KERN_TYPE_CLOUDKEY = 8200, KERN_TYPE_NSEC3 = 8300, KERN_TYPE_WBB3 = 8400, KERN_TYPE_RACF = 8500, KERN_TYPE_LOTUS5 = 8600, KERN_TYPE_LOTUS6 = 8700, KERN_TYPE_ANDROIDFDE = 8800, KERN_TYPE_SCRYPT = 8900, KERN_TYPE_PSAFE2 = 9000, KERN_TYPE_LOTUS8 = 9100, KERN_TYPE_OFFICE2007 = 9400, KERN_TYPE_OFFICE2010 = 9500, KERN_TYPE_OFFICE2013 = 9600, KERN_TYPE_OLDOFFICE01 = 9700, KERN_TYPE_OLDOFFICE01CM1 = 9710, KERN_TYPE_OLDOFFICE01CM2 = 9720, KERN_TYPE_OLDOFFICE34 = 9800, KERN_TYPE_OLDOFFICE34CM1 = 9810, KERN_TYPE_OLDOFFICE34CM2 = 9820, KERN_TYPE_RADMIN2 = 9900, KERN_TYPE_SIPHASH = 10100, KERN_TYPE_SAPH_SHA1 = 10300, KERN_TYPE_PDF11 = 10400, KERN_TYPE_PDF11CM1 = 10410, KERN_TYPE_PDF11CM2 = 10420, KERN_TYPE_PDF14 = 10500, KERN_TYPE_PDF17L8 = 10700, KERN_TYPE_SHA384 = 10800, KERN_TYPE_PBKDF2_SHA256 = 10900, KERN_TYPE_PRESTASHOP = 11000, KERN_TYPE_POSTGRESQL_AUTH = 11100, KERN_TYPE_MYSQL_AUTH = 11200, KERN_TYPE_BITCOIN_WALLET = 11300, KERN_TYPE_SIP_AUTH = 11400, KERN_TYPE_CRC32 = 11500, KERN_TYPE_SEVEN_ZIP = 11600, KERN_TYPE_GOST_2012SBOG_256 = 11700, KERN_TYPE_GOST_2012SBOG_512 = 11800, KERN_TYPE_PBKDF2_MD5 = 11900, KERN_TYPE_PBKDF2_SHA1 = 12000, KERN_TYPE_ECRYPTFS = 12200, KERN_TYPE_ORACLET = 12300, KERN_TYPE_BSDICRYPT = 12400, KERN_TYPE_RAR3 = 12500, KERN_TYPE_CF10 = 12600, KERN_TYPE_MYWALLET = 12700, KERN_TYPE_MS_DRSR = 12800, KERN_TYPE_ANDROIDFDE_SAMSUNG = 12900, KERN_TYPE_RAR5 = 13000, KERN_TYPE_KRB5TGS = 13100, KERN_TYPE_AXCRYPT = 13200, KERN_TYPE_SHA1_AXCRYPT = 13300, KERN_TYPE_KEEPASS = 13400, KERN_TYPE_PSTOKEN = 13500, KERN_TYPE_ZIP2 = 13600, KERN_TYPE_WIN8PHONE = 13800, KERN_TYPE_OPENCART = 13900, KERN_TYPE_DES = 14000, KERN_TYPE_3DES = 14100, KERN_TYPE_SHA1CX = 14400, KERN_TYPE_LUKS_SHA1_AES = 14611, KERN_TYPE_LUKS_SHA1_SERPENT = 14612, KERN_TYPE_LUKS_SHA1_TWOFISH = 14613, KERN_TYPE_LUKS_SHA256_AES = 14621, KERN_TYPE_LUKS_SHA256_SERPENT = 14622, KERN_TYPE_LUKS_SHA256_TWOFISH = 14623, KERN_TYPE_LUKS_SHA512_AES = 14631, KERN_TYPE_LUKS_SHA512_SERPENT = 14632, KERN_TYPE_LUKS_SHA512_TWOFISH = 14633, KERN_TYPE_LUKS_RIPEMD160_AES = 14641, KERN_TYPE_LUKS_RIPEMD160_SERPENT = 14642, KERN_TYPE_LUKS_RIPEMD160_TWOFISH = 14643, KERN_TYPE_LUKS_WHIRLPOOL_AES = 14651, KERN_TYPE_LUKS_WHIRLPOOL_SERPENT = 14652, KERN_TYPE_LUKS_WHIRLPOOL_TWOFISH = 14653, KERN_TYPE_ITUNES_BACKUP_9 = 14700, KERN_TYPE_ITUNES_BACKUP_10 = 14800, KERN_TYPE_SKIP32 = 14900, KERN_TYPE_FILEZILLA_SERVER = 15000, KERN_TYPE_NETBSD_SHA1CRYPT = 15100, KERN_TYPE_DPAPIMK_V1 = 15300, KERN_TYPE_CHACHA20 = 15400, KERN_TYPE_JKS_SHA1 = 15500, KERN_TYPE_ETHEREUM_PBKDF2 = 15600, KERN_TYPE_ETHEREUM_SCRYPT = 15700, KERN_TYPE_DPAPIMK_V2 = 15900, KERN_TYPE_PLAINTEXT = 99999, } kern_type_t; /** * Default iteration numbers */ typedef enum rounds_count { ROUNDS_PHPASS = (1 << 11), // $P$B ROUNDS_DCC2 = 10240, ROUNDS_WPA = 4096, ROUNDS_WPAPMK = 1, ROUNDS_BCRYPT = (1 << 5), ROUNDS_PSAFE3 = 2048, ROUNDS_ANDROIDPIN = 1024, ROUNDS_TRUECRYPT_1K = 1000, ROUNDS_TRUECRYPT_2K = 2000, ROUNDS_VERACRYPT_200000 = 200000, ROUNDS_VERACRYPT_500000 = 500000, ROUNDS_VERACRYPT_327661 = 327661, ROUNDS_VERACRYPT_655331 = 655331, ROUNDS_SHA1AIX = (1 << 6), ROUNDS_SHA256AIX = (1 << 6), ROUNDS_SHA512AIX = (1 << 6), ROUNDS_MD5CRYPT = 1000, ROUNDS_SHA256CRYPT = 5000, ROUNDS_SHA512CRYPT = 5000, ROUNDS_GRUB = 10000, ROUNDS_SHA512MACOS = 35000, ROUNDS_AGILEKEY = 1000, ROUNDS_LASTPASS = 500, ROUNDS_DRUPAL7 = (1 << 14), // $S$C ROUNDS_CLOUDKEY = 40000, ROUNDS_NSEC3 = 1, ROUNDS_ANDROIDFDE = 2000, ROUNDS_PSAFE2 = 1000, ROUNDS_LOTUS8 = 5000, ROUNDS_CISCO8 = 20000, ROUNDS_OFFICE2007 = 50000, ROUNDS_OFFICE2010 = 100000, ROUNDS_OFFICE2013 = 100000, ROUNDS_DJANGOPBKDF2 = 20000, ROUNDS_SAPH_SHA1 = 1024, ROUNDS_PDF14 = (50 + 20), ROUNDS_PDF17L8 = 64, ROUNDS_PBKDF2_SHA256 = 1000, ROUNDS_BITCOIN_WALLET = 200000, ROUNDS_SEVEN_ZIP = (1 << 19), ROUNDS_PBKDF2_MD5 = 1000, ROUNDS_PBKDF2_SHA1 = 1000, ROUNDS_PBKDF2_SHA512 = 1000, ROUNDS_ECRYPTFS = 65536, ROUNDS_ORACLET = 4096, ROUNDS_BSDICRYPT = 2900, ROUNDS_RAR3 = 262144, ROUNDS_MYWALLET = 10, ROUNDS_MYWALLETV2 = 5000, ROUNDS_MS_DRSR = 100, ROUNDS_ANDROIDFDE_SAMSUNG = 4096, ROUNDS_RAR5 = (1 << 15), ROUNDS_AXCRYPT = 10000, ROUNDS_KEEPASS = 6000, ROUNDS_ZIP2 = 1000, ROUNDS_LUKS = 163044, // this equal to jtr -test ROUNDS_ITUNES9_BACKUP = 10000, ROUNDS_ITUNES101_BACKUP = 10000000, // wtf, i mean, really? ROUNDS_ITUNES102_BACKUP = 10000, ROUNDS_ATLASSIAN = 10000, ROUNDS_NETBSD_SHA1CRYPT = 20000, ROUNDS_DPAPIMK_V1 = 24000 - 1, // from 4000 to 24000 (possibly more) ROUNDS_DPAPIMK_V2 = 8000 - 1, // from 4000 to 24000 (possibly more) ROUNDS_ETHEREUM_PBKDF2 = 262144 - 1, ROUNDS_STDOUT = 0 } rounds_count_t; /** * input functions */ int bcrypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int cisco4_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int dcc_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int dcc2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int descrypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int des_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int episerver_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int ipb2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int joomla_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int postgresql_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int netscreen_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int keccak_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int blake2b_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int chacha20_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int lm_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int md4_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int md5_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int md5s_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int md5half_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int md5md5_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int md5pix_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int md5asa_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int md5apr1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int md5crypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int mssql2000_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int mssql2005_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int netntlmv1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int netntlmv2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int oracleh_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int oracles_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int oraclet_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int osc_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int arubaos_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int macos1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int macos512_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int phpass_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha1b64_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha1b64s_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha1s_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha1sha1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha224_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha256_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha256s_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha384_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha512_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha512s_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha512crypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int smf_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int vb3_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int vb30_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int wpa_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int psafe2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int psafe3_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int ikepsk_md5_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int ikepsk_sha1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int androidpin_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int ripemd160_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int whirlpool_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int truecrypt_parse_hash_1k (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int truecrypt_parse_hash_2k (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int md5aix_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha256aix_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha512aix_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int agilekey_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha1aix_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int lastpass_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int gost_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha256crypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int mssql2012_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha512macos_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int episerver4_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha512grub_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha512b64s_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int hmacsha1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int hmacsha256_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int hmacsha512_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int hmacmd5_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int krb5pa_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int krb5tgs_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sapb_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sapg_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int drupal7_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sybasease_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int mysql323_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int rakp_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int netscaler_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int chap_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int cloudkey_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int nsec3_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int wbb3_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int racf_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int lotus5_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int lotus6_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int lotus8_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int hmailserver_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int phps_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int mediawiki_b_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int peoplesoft_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int skype_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int androidfde_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int scrypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int juniper_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int cisco8_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int cisco9_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int office2007_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int office2010_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int office2013_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int oldoffice01_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int oldoffice01cm1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int oldoffice01cm2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int oldoffice34_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int oldoffice34cm1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int oldoffice34cm2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int radmin2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int djangosha1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int djangopbkdf2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int siphash_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int crammd5_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int saph_sha1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int redmine_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int punbb_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int pdf11_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int pdf11cm1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int pdf11cm2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int pdf14_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int pdf17l3_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int pdf17l8_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int pbkdf2_sha256_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int prestashop_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int postgresql_auth_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int mysql_auth_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int bitcoin_wallet_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sip_auth_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int crc32_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int seven_zip_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int gost2012sbog_256_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int gost2012sbog_512_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int pbkdf2_md5_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int pbkdf2_sha1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int pbkdf2_sha512_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int ecryptfs_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int bsdicrypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int rar3hp_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int rar5_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int cf10_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int mywallet_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int mywalletv2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int ms_drsr_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int androidfde_samsung_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int axcrypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha1axcrypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int keepass_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int pstoken_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int zip2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int veracrypt_parse_hash_200000 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int veracrypt_parse_hash_500000 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int veracrypt_parse_hash_327661 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int veracrypt_parse_hash_655331 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int win8phone_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int opencart_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int plaintext_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha1cx_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int luks_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED hashconfig_t *hashconfig, const int keyslot_idx); int itunes_backup_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int skip32_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int fortigate_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int sha256b64s_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int filezilla_server_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int netbsd_sha1crypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int atlassian_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int dpapimk_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int jks_sha1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int ethereum_pbkdf2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); int ethereum_scrypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig); /** * hook functions */ void seven_zip_hook_func (hc_device_param_t *device_param, void *hook_salts_buf, const u32 salt_pos, const u32 pws_cnt); /** * output functions */ char *stroptitype (const u32 opti_type); char *strhashtype (const u32 hash_mode); char *strparser (const u32 parser_status); int check_old_hccap (const char *hashfile); void to_hccapx_t (hashcat_ctx_t *hashcat_ctx, hccapx_t *hccapx, const u32 salt_pos, const u32 digest_pos); int ascii_digest (hashcat_ctx_t *hashcat_ctx, char *out_buf, const size_t out_len, const u32 salt_pos, const u32 digest_pos); int hashconfig_init (hashcat_ctx_t *hashcat_ctx); void hashconfig_destroy (hashcat_ctx_t *hashcat_ctx); u32 hashconfig_forced_kernel_threads (hashcat_ctx_t *hashcat_ctx); u32 hashconfig_get_kernel_threads (hashcat_ctx_t *hashcat_ctx, const hc_device_param_t *device_param); u32 hashconfig_get_kernel_loops (hashcat_ctx_t *hashcat_ctx); int hashconfig_general_defaults (hashcat_ctx_t *hashcat_ctx); void hashconfig_benchmark_defaults (hashcat_ctx_t *hashcat_ctx, salt_t *salt, void *esalt, void *hook_salt); const char *hashconfig_benchmark_mask (hashcat_ctx_t *hashcat_ctx); #endif // _INTERFACE_H hashcat-4.0.1/include/locking.h000066400000000000000000000004571320027462700163620ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _LOCKING_H #define _LOCKING_H #include #include #include #include #include #include int lock_file (FILE *fp); int unlock_file (FILE *fp); #endif // _LOCKING_H hashcat-4.0.1/include/logfile.h000066400000000000000000000056211320027462700163530ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _LOGFILE_H #define _LOGFILE_H #include #include #include #include #include // logfile_append() checks for logfile_disable internally to make it easier from here #define logfile_top_msg(msg) logfile_append (hashcat_ctx, "%s\t%s", logfile_ctx->topid, (msg)); #define logfile_sub_msg(msg) logfile_append (hashcat_ctx, "%s\t%s\t%s", logfile_ctx->topid, logfile_ctx->subid, (msg)); #define logfile_top_var_uint64(var,val) logfile_append (hashcat_ctx, "%s\t%s\t%" PRIu64 "", logfile_ctx->topid, (var), (u64) (val)); #define logfile_sub_var_uint64(var,val) logfile_append (hashcat_ctx, "%s\t%s\t%s\t%" PRIu64 "", logfile_ctx->topid, logfile_ctx->subid, (var), (u64) (val)); #define logfile_top_var_uint(var,val) logfile_append (hashcat_ctx, "%s\t%s\t%u", logfile_ctx->topid, (var), (u32) (val)); #define logfile_sub_var_uint(var,val) logfile_append (hashcat_ctx, "%s\t%s\t%s\t%u", logfile_ctx->topid, logfile_ctx->subid, (var), (u32) (val)); #define logfile_top_var_char(var,val) logfile_append (hashcat_ctx, "%s\t%s\t%c", logfile_ctx->topid, (var), (char) (val)); #define logfile_sub_var_char(var,val) logfile_append (hashcat_ctx, "%s\t%s\t%s\t%c", logfile_ctx->topid, logfile_ctx->subid, (var), (char) (val)); #define logfile_top_var_string(var,val) if ((val) != NULL) logfile_append (hashcat_ctx, "%s\t%s\t%s", logfile_ctx->topid, (var), (val)); #define logfile_sub_var_string(var,val) if ((val) != NULL) logfile_append (hashcat_ctx, "%s\t%s\t%s\t%s", logfile_ctx->topid, logfile_ctx->subid, (var), (val)); #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_uint64(var) logfile_top_var_uint64 (#var, (var)); #define logfile_sub_uint64(var) logfile_sub_var_uint64 (#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)); void logfile_generate_topid (hashcat_ctx_t *hashcat_ctx); void logfile_generate_subid (hashcat_ctx_t *hashcat_ctx); void logfile_append (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); int logfile_init (hashcat_ctx_t *hashcat_ctx); void logfile_destroy (hashcat_ctx_t *hashcat_ctx); #endif // _LOGFILE_H hashcat-4.0.1/include/loopback.h000066400000000000000000000012311320027462700165150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _LOOPBACK_H #define _LOOPBACK_H #include #include #include #include static const char LOOPBACK_FILE[] = "hashcat.loopback"; int loopback_init (hashcat_ctx_t *hashcat_ctx); void loopback_destroy (hashcat_ctx_t *hashcat_ctx); int loopback_write_open (hashcat_ctx_t *hashcat_ctx); void loopback_write_close (hashcat_ctx_t *hashcat_ctx); void loopback_write_append (hashcat_ctx_t *hashcat_ctx, const u8 *plain_ptr, const unsigned int plain_len); void loopback_write_unlink (hashcat_ctx_t *hashcat_ctx); #endif // _LOOPBACK_H hashcat-4.0.1/include/lzma_sdk/000077500000000000000000000000001320027462700163615ustar00rootroot00000000000000hashcat-4.0.1/include/lzma_sdk/7zTypes.h000066400000000000000000000125471320027462700201300ustar00rootroot00000000000000/* 7zTypes.h -- Basic types 2013-11-12 : Igor Pavlov : Public domain */ #ifndef __7Z_TYPES_H #define __7Z_TYPES_H #ifdef _WIN32 /* #include */ #endif #include #ifndef EXTERN_C_BEGIN #ifdef __cplusplus #define EXTERN_C_BEGIN extern "C" { #define EXTERN_C_END } #else #define EXTERN_C_BEGIN #define EXTERN_C_END #endif #endif EXTERN_C_BEGIN #define SZ_OK 0 #define SZ_ERROR_DATA 1 #define SZ_ERROR_MEM 2 #define SZ_ERROR_CRC 3 #define SZ_ERROR_UNSUPPORTED 4 #define SZ_ERROR_PARAM 5 #define SZ_ERROR_INPUT_EOF 6 #define SZ_ERROR_OUTPUT_EOF 7 #define SZ_ERROR_READ 8 #define SZ_ERROR_WRITE 9 #define SZ_ERROR_PROGRESS 10 #define SZ_ERROR_FAIL 11 #define SZ_ERROR_THREAD 12 #define SZ_ERROR_ARCHIVE 16 #define SZ_ERROR_NO_ARCHIVE 17 typedef int SRes; #ifdef _WIN32 /* typedef DWORD WRes; */ typedef unsigned WRes; #else typedef int WRes; #endif #ifndef RINOK #define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } #endif typedef unsigned char Byte; typedef short Int16; typedef unsigned short UInt16; #ifdef _LZMA_UINT32_IS_ULONG typedef long Int32; typedef unsigned long UInt32; #else typedef int Int32; typedef unsigned int UInt32; #endif #ifdef _SZ_NO_INT_64 /* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. NOTES: Some code will work incorrectly in that case! */ typedef long Int64; typedef unsigned long UInt64; #else #if defined(_MSC_VER) || defined(__BORLANDC__) typedef __int64 Int64; typedef unsigned __int64 UInt64; #define UINT64_CONST(n) n #else typedef long long int Int64; typedef unsigned long long int UInt64; #define UINT64_CONST(n) n ## ULL #endif #endif #ifdef _LZMA_NO_SYSTEM_SIZE_T typedef UInt32 SizeT; #else typedef size_t SizeT; #endif typedef int Bool; #define True 1 #define False 0 #ifdef _WIN32 #define MY_STD_CALL __stdcall #else #define MY_STD_CALL #endif #ifdef _MSC_VER #if _MSC_VER >= 1300 #define MY_NO_INLINE __declspec(noinline) #else #define MY_NO_INLINE #endif #define MY_CDECL __cdecl #define MY_FAST_CALL __fastcall #else #define MY_NO_INLINE #define MY_CDECL #define MY_FAST_CALL #endif /* The following interfaces use first parameter as pointer to structure */ typedef struct { Byte (*Read)(void *p); /* reads one byte, returns 0 in case of EOF or error */ } IByteIn; typedef struct { void (*Write)(void *p, Byte b); } IByteOut; typedef struct { SRes (*Read)(void *p, void *buf, size_t *size); /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. (output(*size) < input(*size)) is allowed */ } ISeqInStream; /* it can return SZ_ERROR_INPUT_EOF */ SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size); SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType); SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf); typedef struct { size_t (*Write)(void *p, const void *buf, size_t size); /* Returns: result - the number of actually written bytes. (result < size) means error */ } ISeqOutStream; typedef enum { SZ_SEEK_SET = 0, SZ_SEEK_CUR = 1, SZ_SEEK_END = 2 } ESzSeek; typedef struct { SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); } ISeekInStream; typedef struct { SRes (*Look)(void *p, const void **buf, size_t *size); /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. (output(*size) > input(*size)) is not allowed (output(*size) < input(*size)) is allowed */ SRes (*Skip)(void *p, size_t offset); /* offset must be <= output(*size) of Look */ SRes (*Read)(void *p, void *buf, size_t *size); /* reads directly (without buffer). It's same as ISeqInStream::Read */ SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); } ILookInStream; SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size); SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset); /* reads via ILookInStream::Read */ SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType); SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size); #define LookToRead_BUF_SIZE (1 << 14) typedef struct { ILookInStream s; ISeekInStream *realStream; size_t pos; size_t size; Byte buf[LookToRead_BUF_SIZE]; } CLookToRead; void LookToRead_CreateVTable(CLookToRead *p, int lookahead); void LookToRead_Init(CLookToRead *p); typedef struct { ISeqInStream s; ILookInStream *realStream; } CSecToLook; void SecToLook_CreateVTable(CSecToLook *p); typedef struct { ISeqInStream s; ILookInStream *realStream; } CSecToRead; void SecToRead_CreateVTable(CSecToRead *p); typedef struct { SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize); /* Returns: result. (result != SZ_OK) means break. Value (UInt64)(Int64)-1 for size means unknown value. */ } ICompressProgress; typedef struct { void *(*Alloc)(void *p, size_t size); void (*Free)(void *p, void *address); /* address can be 0 */ } ISzAlloc; #define IAlloc_Alloc(p, size) (p)->Alloc((p), size) #define IAlloc_Free(p, a) (p)->Free((p), a) #ifdef _WIN32 #define CHAR_PATH_SEPARATOR '\\' #define WCHAR_PATH_SEPARATOR L'\\' #define STRING_PATH_SEPARATOR "\\" #define WSTRING_PATH_SEPARATOR L"\\" #else #define CHAR_PATH_SEPARATOR '/' #define WCHAR_PATH_SEPARATOR L'/' #define STRING_PATH_SEPARATOR "/" #define WSTRING_PATH_SEPARATOR L"/" #endif EXTERN_C_END #endif hashcat-4.0.1/include/lzma_sdk/Alloc.h000066400000000000000000000012021320027462700175570ustar00rootroot00000000000000/* Alloc.h -- Memory allocation functions 2015-02-21 : Igor Pavlov : Public domain */ #ifndef __COMMON_ALLOC_H #define __COMMON_ALLOC_H #include "7zTypes.h" EXTERN_C_BEGIN void *MyAlloc(size_t size); void MyFree(void *address); #ifdef _WIN32 void SetLargePageSize(void); void *MidAlloc(size_t size); void MidFree(void *address); void *BigAlloc(size_t size); void BigFree(void *address); #else #define MidAlloc(size) MyAlloc(size) #define MidFree(address) MyFree(address) #define BigAlloc(size) MyAlloc(size) #define BigFree(address) MyFree(address) #endif extern ISzAlloc g_Alloc; extern ISzAlloc g_BigAlloc; EXTERN_C_END #endif hashcat-4.0.1/include/lzma_sdk/Compiler.h000066400000000000000000000021601320027462700203030ustar00rootroot00000000000000/* Compiler.h 2015-08-02 : Igor Pavlov : Public domain */ #ifndef __7Z_COMPILER_H #define __7Z_COMPILER_H #ifdef _MSC_VER #ifdef UNDER_CE #define RPC_NO_WINDOWS_H /* #pragma warning(disable : 4115) // '_RPC_ASYNC_STATE' : named type definition in parentheses */ #pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union #pragma warning(disable : 4214) // nonstandard extension used : bit field types other than int #endif #if _MSC_VER >= 1300 #pragma warning(disable : 4996) // This function or variable may be unsafe #else #pragma warning(disable : 4511) // copy constructor could not be generated #pragma warning(disable : 4512) // assignment operator could not be generated #pragma warning(disable : 4514) // unreferenced inline function has been removed #pragma warning(disable : 4702) // unreachable code #pragma warning(disable : 4710) // not inlined #pragma warning(disable : 4786) // identifier was truncated to '255' characters in the debug information #endif #endif #define UNUSED_VAR(x) (void)x; /* #define UNUSED_VAR(x) x=x; */ #endif hashcat-4.0.1/include/lzma_sdk/Lzma2Dec.h000066400000000000000000000041661320027462700201420ustar00rootroot00000000000000/* Lzma2Dec.h -- LZMA2 Decoder 2015-05-13 : Igor Pavlov : Public domain */ #ifndef __LZMA2_DEC_H #define __LZMA2_DEC_H #include "LzmaDec.h" EXTERN_C_BEGIN /* ---------- State Interface ---------- */ typedef struct { CLzmaDec decoder; UInt32 packSize; UInt32 unpackSize; unsigned state; Byte control; Bool needInitDic; Bool needInitState; Bool needInitProp; } CLzma2Dec; #define Lzma2Dec_Construct(p) LzmaDec_Construct(&(p)->decoder) #define Lzma2Dec_FreeProbs(p, alloc) LzmaDec_FreeProbs(&(p)->decoder, alloc); #define Lzma2Dec_Free(p, alloc) LzmaDec_Free(&(p)->decoder, alloc); SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAlloc *alloc); SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAlloc *alloc); void Lzma2Dec_Init(CLzma2Dec *p); /* finishMode: It has meaning only if the decoding reaches output limit (*destLen or dicLimit). LZMA_FINISH_ANY - use smallest number of input bytes LZMA_FINISH_END - read EndOfStream marker after decoding Returns: SZ_OK status: LZMA_STATUS_FINISHED_WITH_MARK LZMA_STATUS_NOT_FINISHED LZMA_STATUS_NEEDS_MORE_INPUT SZ_ERROR_DATA - Data error */ SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); /* ---------- One Call Interface ---------- */ /* finishMode: It has meaning only if the decoding reaches output limit (*destLen). LZMA_FINISH_ANY - use smallest number of input bytes LZMA_FINISH_END - read EndOfStream marker after decoding Returns: SZ_OK status: LZMA_STATUS_FINISHED_WITH_MARK LZMA_STATUS_NOT_FINISHED SZ_ERROR_DATA - Data error SZ_ERROR_MEM - Memory allocation error SZ_ERROR_UNSUPPORTED - Unsupported properties SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). */ SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAlloc *alloc); EXTERN_C_END #endif hashcat-4.0.1/include/lzma_sdk/LzmaDec.h000066400000000000000000000153601320027462700200560ustar00rootroot00000000000000/* LzmaDec.h -- LZMA Decoder 2013-01-18 : Igor Pavlov : Public domain */ #ifndef __LZMA_DEC_H #define __LZMA_DEC_H #include "7zTypes.h" EXTERN_C_BEGIN /* #define _LZMA_PROB32 */ /* _LZMA_PROB32 can increase the speed on some CPUs, but memory usage for CLzmaDec::probs will be doubled in that case */ #ifdef _LZMA_PROB32 #define CLzmaProb UInt32 #else #define CLzmaProb UInt16 #endif /* ---------- LZMA Properties ---------- */ #define LZMA_PROPS_SIZE 5 typedef struct _CLzmaProps { unsigned lc, lp, pb; UInt32 dicSize; } CLzmaProps; /* LzmaProps_Decode - decodes properties Returns: SZ_OK SZ_ERROR_UNSUPPORTED - Unsupported properties */ SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size); /* ---------- LZMA Decoder state ---------- */ /* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case. Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */ #define LZMA_REQUIRED_INPUT_MAX 20 typedef struct { CLzmaProps prop; CLzmaProb *probs; Byte *dic; const Byte *buf; UInt32 range, code; SizeT dicPos; SizeT dicBufSize; UInt32 processedPos; UInt32 checkDicSize; unsigned state; UInt32 reps[4]; unsigned remainLen; int needFlush; int needInitState; UInt32 numProbs; unsigned tempBufSize; Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; } CLzmaDec; #define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; } void LzmaDec_Init(CLzmaDec *p); /* There are two types of LZMA streams: 0) Stream with end mark. That end mark adds about 6 bytes to compressed size. 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */ typedef enum { LZMA_FINISH_ANY, /* finish at any point */ LZMA_FINISH_END /* block must be finished at the end */ } ELzmaFinishMode; /* ELzmaFinishMode has meaning only if the decoding reaches output limit !!! You must use LZMA_FINISH_END, when you know that current output buffer covers last bytes of block. In other cases you must use LZMA_FINISH_ANY. If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK, and output value of destLen will be less than output buffer size limit. You can check status result also. You can use multiple checks to test data integrity after full decompression: 1) Check Result and "status" variable. 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. You must use correct finish mode in that case. */ typedef enum { LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */ LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ LZMA_STATUS_NOT_FINISHED, /* stream was not finished */ LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */ } ELzmaStatus; /* ELzmaStatus is used only as output value for function call */ /* ---------- Interfaces ---------- */ /* There are 3 levels of interfaces: 1) Dictionary Interface 2) Buffer Interface 3) One Call Interface You can select any of these interfaces, but don't mix functions from different groups for same object. */ /* There are two variants to allocate state for Dictionary Interface: 1) LzmaDec_Allocate / LzmaDec_Free 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs You can use variant 2, if you set dictionary buffer manually. For Buffer Interface you must always use variant 1. LzmaDec_Allocate* can return: SZ_OK SZ_ERROR_MEM - Memory allocation error SZ_ERROR_UNSUPPORTED - Unsupported properties */ SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc); void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc); SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc); void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc); /* ---------- Dictionary Interface ---------- */ /* You can use it, if you want to eliminate the overhead for data copying from dictionary to some other external buffer. You must work with CLzmaDec variables directly in this interface. STEPS: LzmaDec_Constr() LzmaDec_Allocate() for (each new stream) { LzmaDec_Init() while (it needs more decompression) { LzmaDec_DecodeToDic() use data from CLzmaDec::dic and update CLzmaDec::dicPos } } LzmaDec_Free() */ /* LzmaDec_DecodeToDic The decoding to internal dictionary buffer (CLzmaDec::dic). You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!! finishMode: It has meaning only if the decoding reaches output limit (dicLimit). LZMA_FINISH_ANY - Decode just dicLimit bytes. LZMA_FINISH_END - Stream must be finished after dicLimit. Returns: SZ_OK status: LZMA_STATUS_FINISHED_WITH_MARK LZMA_STATUS_NOT_FINISHED LZMA_STATUS_NEEDS_MORE_INPUT LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK SZ_ERROR_DATA - Data error */ SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); /* ---------- Buffer Interface ---------- */ /* It's zlib-like interface. See LzmaDec_DecodeToDic description for information about STEPS and return results, but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need to work with CLzmaDec variables manually. finishMode: It has meaning only if the decoding reaches output limit (*destLen). LZMA_FINISH_ANY - Decode just destLen bytes. LZMA_FINISH_END - Stream must be finished after (*destLen). */ SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); /* ---------- One Call Interface ---------- */ /* LzmaDecode finishMode: It has meaning only if the decoding reaches output limit (*destLen). LZMA_FINISH_ANY - Decode just destLen bytes. LZMA_FINISH_END - Stream must be finished after (*destLen). Returns: SZ_OK status: LZMA_STATUS_FINISHED_WITH_MARK LZMA_STATUS_NOT_FINISHED LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK SZ_ERROR_DATA - Data error SZ_ERROR_MEM - Memory allocation error SZ_ERROR_UNSUPPORTED - Unsupported properties SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). */ SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAlloc *alloc); EXTERN_C_END void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState); #endif hashcat-4.0.1/include/lzma_sdk/Precomp.h000066400000000000000000000002541320027462700201400ustar00rootroot00000000000000/* Precomp.h -- StdAfx 2013-11-12 : Igor Pavlov : Public domain */ #ifndef __7Z_PRECOMP_H #define __7Z_PRECOMP_H #include "Compiler.h" /* #include "7zTypes.h" */ #endif hashcat-4.0.1/include/memory.h000066400000000000000000000007131320027462700162370ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _MEMORY_H #define _MEMORY_H #include #include #include #define MSG_ENOMEM "Insufficient memory available" void *hccalloc (const size_t nmemb, const size_t sz); void *hcmalloc (const size_t sz); void *hcrealloc (void *ptr, const size_t oldsz, const size_t addsz); char *hcstrdup (const char *s); void hcfree (void *ptr); #endif // _MEMORY_H hashcat-4.0.1/include/monitor.h000066400000000000000000000003331320027462700164140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _MONITOR_H #define _MONITOR_H int get_runtime_left (const hashcat_ctx_t *hashcat_ctx); void *thread_monitor (void *p); #endif // _MONITOR_H hashcat-4.0.1/include/mpsp.h000066400000000000000000000017201320027462700157050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _MPSP_H #define _MPSP_H #include #include #include #define CHARSIZ 0x100 #define SP_HCSTAT "hashcat.hcstat2" #define SP_VERSION (0x6863737461740000 | 0x0002) #define SP_PW_MIN 2 #define SP_PW_MAX 256 #define SP_ROOT_CNT (SP_PW_MAX * CHARSIZ) #define SP_MARKOV_CNT (SP_PW_MAX * CHARSIZ * CHARSIZ) #define SP_FILESZ (sizeof (u64) + sizeof (u64) + (sizeof (u64) * SP_ROOT_CNT) + (sizeof (u64) * SP_MARKOV_CNT)) #define INCR_MASKS 1000 u32 mp_get_length (const char *mask); void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, u32 start, u32 stop); int mask_ctx_update_loop (hashcat_ctx_t *hashcat_ctx); int mask_ctx_init (hashcat_ctx_t *hashcat_ctx); void mask_ctx_destroy (hashcat_ctx_t *hashcat_ctx); int mask_ctx_parse_maskfile (hashcat_ctx_t *hashcat_ctx); #endif // _MPSP_H hashcat-4.0.1/include/opencl.h000066400000000000000000000223521320027462700162120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _OPENCL_H #define _OPENCL_H #include #include static const char CL_VENDOR_AMD1[] = "Advanced Micro Devices, Inc."; static const char CL_VENDOR_AMD2[] = "AuthenticAMD"; static const char CL_VENDOR_AMD_USE_INTEL[] = "GenuineIntel"; static const char CL_VENDOR_APPLE[] = "Apple"; static const char CL_VENDOR_APPLE_USE_AMD[] = "AMD"; static const char CL_VENDOR_APPLE_USE_NV[] = "NVIDIA"; static const char CL_VENDOR_INTEL_BEIGNET[] = "Intel"; static const char CL_VENDOR_INTEL_SDK[] = "Intel(R) Corporation"; static const char CL_VENDOR_MESA[] = "Mesa"; static const char CL_VENDOR_NV[] = "NVIDIA Corporation"; static const char CL_VENDOR_POCL[] = "The pocl project"; int ocl_init (hashcat_ctx_t *hashcat_ctx); void ocl_close (hashcat_ctx_t *hashcat_ctx); int hc_clBuildProgram (hashcat_ctx_t *hashcat_ctx, 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); int hc_clCreateBuffer (hashcat_ctx_t *hashcat_ctx, cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_mem *mem); int hc_clCreateCommandQueue (hashcat_ctx_t *hashcat_ctx, cl_context context, cl_device_id device, cl_command_queue_properties properties, cl_command_queue *command_queue); int hc_clCreateContext (hashcat_ctx_t *hashcat_ctx, 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_context *context); int hc_clCreateKernel (hashcat_ctx_t *hashcat_ctx, cl_program program, const char *kernel_name, cl_kernel *kernel); int hc_clCreateProgramWithBinary (hashcat_ctx_t *hashcat_ctx, 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_program *program); int hc_clCreateProgramWithSource (hashcat_ctx_t *hashcat_ctx, cl_context context, cl_uint count, const char **strings, const size_t *lengths, cl_program *program); int hc_clEnqueueCopyBuffer (hashcat_ctx_t *hashcat_ctx, 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); int hc_clEnqueueMapBuffer (hashcat_ctx_t *hashcat_ctx, 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 **buf); int hc_clEnqueueNDRangeKernel (hashcat_ctx_t *hashcat_ctx, 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); int hc_clEnqueueReadBuffer (hashcat_ctx_t *hashcat_ctx, 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); int hc_clEnqueueUnmapMemObject (hashcat_ctx_t *hashcat_ctx, 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); int hc_clEnqueueWriteBuffer (hashcat_ctx_t *hashcat_ctx, 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); int hc_clFinish (hashcat_ctx_t *hashcat_ctx, cl_command_queue command_queue); int hc_clFlush (hashcat_ctx_t *hashcat_ctx, cl_command_queue command_queue); int hc_clGetDeviceIDs (hashcat_ctx_t *hashcat_ctx, cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, cl_device_id *devices, cl_uint *num_devices); int hc_clGetDeviceInfo (hashcat_ctx_t *hashcat_ctx, cl_device_id device, cl_device_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret); int hc_clGetEventInfo (hashcat_ctx_t *hashcat_ctx, cl_event event, cl_event_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret); int hc_clGetEventProfilingInfo (hashcat_ctx_t *hashcat_ctx, cl_event event, cl_profiling_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret); int hc_clGetKernelWorkGroupInfo (hashcat_ctx_t *hashcat_ctx, cl_kernel kernel, cl_device_id device, cl_kernel_work_group_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret); int hc_clGetPlatformIDs (hashcat_ctx_t *hashcat_ctx, cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms); int hc_clGetPlatformInfo (hashcat_ctx_t *hashcat_ctx, cl_platform_id platform, cl_platform_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret); int hc_clGetProgramBuildInfo (hashcat_ctx_t *hashcat_ctx, cl_program program, cl_device_id device, cl_program_build_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret); int hc_clGetProgramInfo (hashcat_ctx_t *hashcat_ctx, cl_program program, cl_program_info param_name, size_t param_value_size, void *param_value, size_t * param_value_size_ret); int hc_clReleaseCommandQueue (hashcat_ctx_t *hashcat_ctx, cl_command_queue command_queue); int hc_clReleaseContext (hashcat_ctx_t *hashcat_ctx, cl_context context); int hc_clReleaseEvent (hashcat_ctx_t *hashcat_ctx, cl_event event); int hc_clReleaseKernel (hashcat_ctx_t *hashcat_ctx, cl_kernel kernel); int hc_clReleaseMemObject (hashcat_ctx_t *hashcat_ctx, cl_mem mem); int hc_clReleaseProgram (hashcat_ctx_t *hashcat_ctx, cl_program program); int hc_clSetKernelArg (hashcat_ctx_t *hashcat_ctx, cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value); int hc_clWaitForEvents (hashcat_ctx_t *hashcat_ctx, cl_uint num_events, const cl_event *event_list); int gidd_to_pw_t (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u64 gidd, pw_t *pw); int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 highest_pw_len, const u32 pws_cnt, const u32 fast_iteration, const u32 salt_pos); int run_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 kern_run, const u64 num, const u32 event_update, const u32 iteration); int run_kernel_mp (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 kern_run, const u64 num); int run_kernel_tm (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param); int run_kernel_amp (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u64 num); int run_kernel_memset (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, cl_mem buf, const u32 value, const u64 size); int run_kernel_bzero (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, cl_mem buf, const u64 size); int run_copy (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 pws_cnt); int run_cracker (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 pws_cnt); void generate_source_kernel_filename (const u32 attack_exec, const u32 attack_kern, const u32 kern_type, const u32 opti_type, char *shared_dir, char *source_file); void generate_cached_kernel_filename (const u32 attack_exec, const u32 attack_kern, const u32 kern_type, const u32 opti_type, char *profile_dir, const char *device_name_chksum, char *cached_file); void generate_source_kernel_mp_filename (const u32 opti_type, const u64 opts_type, char *shared_dir, char *source_file); void generate_cached_kernel_mp_filename (const u32 opti_type, const u64 opts_type, char *profile_dir, const char *device_name_chksum, char *cached_file); void generate_source_kernel_amp_filename (const u32 attack_kern, char *shared_dir, char *source_file); void generate_cached_kernel_amp_filename (const u32 attack_kern, char *profile_dir, const char *device_name_chksum, char *cached_file); int opencl_ctx_init (hashcat_ctx_t *hashcat_ctx); void opencl_ctx_destroy (hashcat_ctx_t *hashcat_ctx); int opencl_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime); void opencl_ctx_devices_destroy (hashcat_ctx_t *hashcat_ctx); void opencl_ctx_devices_update_power (hashcat_ctx_t *hashcat_ctx); void opencl_ctx_devices_kernel_loops (hashcat_ctx_t *hashcat_ctx); int opencl_session_begin (hashcat_ctx_t *hashcat_ctx); void opencl_session_destroy (hashcat_ctx_t *hashcat_ctx); void opencl_session_reset (hashcat_ctx_t *hashcat_ctx); int opencl_session_update_combinator (hashcat_ctx_t *hashcat_ctx); int opencl_session_update_mp (hashcat_ctx_t *hashcat_ctx); int opencl_session_update_mp_rl (hashcat_ctx_t *hashcat_ctx, const u32 css_cnt_l, const u32 css_cnt_r); #endif // _OPENCL_H hashcat-4.0.1/include/outfile.h000066400000000000000000000020731320027462700163770ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _OUTFILE_H #define _OUTFILE_H #include #include #include int build_plain (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, plain_t *plain, u32 *plain_buf, int *out_len); int build_crackpos (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, plain_t *plain, u64 *out_pos); int build_debugdata (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, plain_t *plain, u8 *debug_rule_buf, int *debug_rule_len, u8 *debug_plain_ptr, int *debug_plain_len); int outfile_init (hashcat_ctx_t *hashcat_ctx); void outfile_destroy (hashcat_ctx_t *hashcat_ctx); int outfile_write_open (hashcat_ctx_t *hashcat_ctx); void outfile_write_close (hashcat_ctx_t *hashcat_ctx); int outfile_write (hashcat_ctx_t *hashcat_ctx, const char *out_buf, const unsigned char *plain_ptr, const u32 plain_len, const u64 crackpos, const unsigned char *username, const u32 user_len, char tmp_buf[HCBUFSIZ_LARGE]); #endif // _OUTFILE_H hashcat-4.0.1/include/outfile_check.h000066400000000000000000000005641320027462700175370ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _OUTFILE_CHECK_H #define _OUTFILE_CHECK_H #include #include #define OUTFILES_DIR "outfiles" void *thread_outfile_remove (void *p); int outcheck_ctx_init (hashcat_ctx_t *hashcat_ctx); void outcheck_ctx_destroy (hashcat_ctx_t *hashcat_ctx); #endif // _OUTFILE_CHECK_H hashcat-4.0.1/include/pidfile.h000066400000000000000000000005621320027462700163450ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _PIDFILE_H #define _PIDFILE_H #include #include #include #if defined (_WIN) #include #include #endif // _WIN int pidfile_ctx_init (hashcat_ctx_t *hashcat_ctx); void pidfile_ctx_destroy (hashcat_ctx_t *hashcat_ctx); #endif // _PIDFILE_H hashcat-4.0.1/include/potfile.h000066400000000000000000000023501320027462700163700ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _POTFILE_H #define _POTFILE_H #include #include #include #include #define INCR_POT 1000 int potfile_init (hashcat_ctx_t *hashcat_ctx); int potfile_read_open (hashcat_ctx_t *hashcat_ctx); void potfile_read_close (hashcat_ctx_t *hashcat_ctx); int potfile_write_open (hashcat_ctx_t *hashcat_ctx); void potfile_write_close (hashcat_ctx_t *hashcat_ctx); void potfile_write_append (hashcat_ctx_t *hashcat_ctx, const char *out_buf, u8 *plain_ptr, unsigned int plain_len); int potfile_remove_parse (hashcat_ctx_t *hashcat_ctx); void potfile_destroy (hashcat_ctx_t *hashcat_ctx); int potfile_handle_show (hashcat_ctx_t *hashcat_ctx); int potfile_handle_left (hashcat_ctx_t *hashcat_ctx); void potfile_update_hash (hashcat_ctx_t *hashcat_ctx, hash_t *found, char *line_pw_buf, int line_pw_len); void potfile_update_hashes (hashcat_ctx_t *hashcat_ctx, hash_t *search, char *line_pw_buf, int line_pw_len, pot_tree_entry_t *tree); void pot_tree_destroy (pot_tree_entry_t *tree); int sort_pot_tree_by_hash (const void *v1, const void *v2); #endif // _POTFILE_H hashcat-4.0.1/include/restore.h000066400000000000000000000010561320027462700164130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _RESTORE_H #define _RESTORE_H #include #include #include #if defined (_WIN) #include #include #endif // _WIN #define RESTORE_VERSION_MIN 340 #define RESTORE_VERSION_CUR 400 int cycle_restore (hashcat_ctx_t *hashcat_ctx); void unlink_restore (hashcat_ctx_t *hashcat_ctx); int restore_ctx_init (hashcat_ctx_t *hashcat_ctx, int argc, char **argv); void restore_ctx_destroy (hashcat_ctx_t *hashcat_ctx); #endif // _RESTORE_H hashcat-4.0.1/include/rp.h000066400000000000000000000017661320027462700153610ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _RP_H #define _RP_H #include #define RP_RULE_SIZE 256 #define RP_PASSWORD_SIZE 256 #define INCR_RULES 10000 #define RULES_MAX 32 #define MAX_KERNEL_RULES (RULES_MAX - 1) bool class_num (const u8 c); bool class_lower (const u8 c); bool class_upper (const u8 c); bool class_alpha (const u8 c); int conv_ctoi (const u8 c); int conv_itoc (const u8 c); int generate_random_rule (char rule_buf[RP_RULE_SIZE], const u32 rp_gen_func_min, const u32 rp_gen_func_max); int cpu_rule_to_kernel_rule (char *rule_buf, u32 rule_len, kernel_rule_t *rule); int kernel_rule_to_cpu_rule (char *rule_buf, kernel_rule_t *rule); bool kernel_rules_has_noop (const kernel_rule_t *kernel_rules_buf, const u32 kernel_rules_cnt); int kernel_rules_load (hashcat_ctx_t *hashcat_ctx, kernel_rule_t **out_buf, u32 *out_cnt); int kernel_rules_generate (hashcat_ctx_t *hashcat_ctx, kernel_rule_t **out_buf, u32 *out_cnt); #endif // _RP_H hashcat-4.0.1/include/rp_cpu.h000066400000000000000000000006101320027462700162130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _RP_CPU_H #define _RP_CPU_H #include #define RULE_RC_SYNTAX_ERROR -1 #define RULE_RC_REJECT_ERROR -2 int _old_apply_rule (char *rule, int rule_len, char in[RP_PASSWORD_SIZE], int in_len, char out[RP_PASSWORD_SIZE]); int run_rule_engine (const int rule_len, const char *rule_buf); #endif // _RP_CPU_H hashcat-4.0.1/include/rp_kernel_on_cpu.h000066400000000000000000000003331320027462700202510ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _RP_KERNEL_ON_CPU_H #define _RP_KERNEL_ON_CPU_H int apply_rules (const u32 *cmds, u32 *buf, const int in_len); #endif // _RP_KERNEL_ON_CPU_H hashcat-4.0.1/include/rp_kernel_on_cpu_optimized.h000066400000000000000000000006041320027462700223360ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _RP_KERNEL_ON_CPU_OPTIMIZED_H #define _RP_KERNEL_ON_CPU_OPTIMIZED_H u32 apply_rule_optimized (const u32 name, const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len); u32 apply_rules_optimized (const u32 *cmds, u32 buf0[4], u32 buf1[4], const u32 len); #endif // _RP_KERNEL_ON_CPU_OPTIMIZED_H hashcat-4.0.1/include/selftest.h000066400000000000000000000002451320027462700165600ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _SELFTEST_H #define _SELFTEST_H void *thread_selftest (void *p); #endif // _SELFTEST_H hashcat-4.0.1/include/shared.h000066400000000000000000000043721320027462700162020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _SHARED_H #define _SHARED_H #include #include #include #include #include #include #include bool overflow_check_u32_add (const u32 a, const u32 b); bool overflow_check_u32_mul (const u32 a, const u32 b); bool overflow_check_u64_add (const u64 a, const u64 b); bool overflow_check_u64_mul (const u64 a, const u64 b); bool is_power_of_2 (const u32 v); u32 get_random_num (const u32 min, const u32 max); u32 mydivc32 (const u32 dividend, const u32 divisor); u64 mydivc64 (const u64 dividend, const u64 divisor); char *filename_from_filepath (char *filepath); void naive_replace (char *s, const char key_char, const char replace_char); void naive_escape (char *s, size_t s_max, const char key_char, const char escape_char); __attribute__ ((format (printf, 2, 3))) void hc_asprintf (char **strp, const char *fmt, ...); void setup_environment_variables (void); void setup_umask (void); void setup_seeding (const bool rp_gen_seed_chgd, const u32 rp_gen_seed); int hc_stat (const char *pathname, hc_stat_t *buf); int hc_fstat (int fd, hc_stat_t *buf); void hc_qsort_r (void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *, void *), void *arg); void *hc_bsearch_r (const void *key, const void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *, void *), void *arg); bool hc_path_is_file (const char *path); bool hc_path_is_directory (const char *path); bool hc_path_is_empty (const char *path); bool hc_path_exist (const char *path); bool hc_path_read (const char *path); bool hc_path_write (const char *path); bool hc_path_create (const char *path); bool hc_string_is_digit (const char *s); void hc_string_trim_trailing (char *s); void hc_string_trim_leading (char *s); size_t hc_fread (void *ptr, size_t size, size_t nmemb, FILE *stream); void hc_fwrite (const void *ptr, size_t size, size_t nmemb, FILE *stream); hc_time_t hc_time (hc_time_t *t); struct tm *hc_gmtime (const hc_time_t *t, MAYBE_UNUSED struct tm *result); char *hc_ctime (const hc_time_t *t, char *buf, MAYBE_UNUSED const size_t buf_size); bool hc_same_files (char *file1, char *file2); #endif // _SHARED_H hashcat-4.0.1/include/sort_r.h000066400000000000000000000140511320027462700162370ustar00rootroot00000000000000/* Isaac Turner 29 April 2014 Public Domain */ #ifndef SORT_R_H_ #define SORT_R_H_ #include #include /* sort_r function to be exported. Parameters: base is the array to be sorted nel is the number of elements in the array width is the size in bytes of each element of the array compar is the comparison function arg is a pointer to be passed to the comparison function void sort_r(void *base, size_t nel, size_t width, int (*compar)(const void *_a, const void *_b, void *_arg), void *arg); Slightly modified to work with hashcat to no falsly detect _SORT_R_LINUX with mingw */ #if (defined __APPLE__ || defined __MACH__ || defined __DARWIN__ || \ defined __FreeBSD__ || defined __DragonFly__) # define _SORT_R_BSD # define _SORT_R_INLINE inline #elif (defined __linux__) || defined (__CYGWIN__) # define _SORT_R_LINUX # define _SORT_R_INLINE inline #elif (defined _WIN32 || defined _WIN64 || defined __WINDOWS__) # define _SORT_R_WINDOWS # define _SORT_R_INLINE __inline #else /* Using our own recursive quicksort sort_r_simple() */ #endif #if (defined NESTED_QSORT && NESTED_QSORT == 0) # undef NESTED_QSORT #endif /* swap a, b iff a>b */ /* __restrict is same as restrict but better support on old machines */ static _SORT_R_INLINE int sort_r_cmpswap(char *__restrict a, char *__restrict b, size_t w, int (*compar)(const void *_a, const void *_b, void *_arg), void *arg) { char *end = a+w; if(compar(a, b, arg) > 0) { for(; a < end; a++, b++) { char tmp = *a; *a = *b; *b = tmp; } return 1; } return 0; } /* Implement recursive quicksort ourselves */ /* Note: quicksort is not stable, equivalent values may be swapped */ static _SORT_R_INLINE void sort_r_simple(void *base, size_t nel, size_t w, int (*compar)(const void *_a, const void *_b, void *_arg), void *arg) { char *b = (char *)base, *end = b + nel*w; if(nel < 7) { /* Insertion sort for arbitrarily small inputs */ char *pi, *pj; for(pi = b+w; pi < end; pi += w) { for(pj = pi; pj > b && sort_r_cmpswap(pj-w,pj,w,compar,arg); pj -= w) {} } } else { /* nel > 6; Quicksort */ /* Use median of first, middle and last items as pivot */ char *x, *y, *xend; char *pl, *pr; char *last = b+w*(nel-1), *tmp; char *l[3]; l[0] = b; l[1] = b+w*(nel/2); l[2] = last; if(compar(l[0],l[1],arg) > 0) { tmp=l[0]; l[0]=l[1]; l[1]=tmp; } if(compar(l[1],l[2],arg) > 0) { tmp=l[1]; l[1]=l[2]; l[2]=tmp; /* swap(l[1],l[2]) */ if(compar(l[0],l[1],arg) > 0) { tmp=l[0]; l[0]=l[1]; l[1]=tmp; } } /* swap l[id], l[2] to put pivot as last element */ for(x = l[1], y = last, xend = x+w; xcompar)(a, b, ss->arg); } #endif #if defined _SORT_R_LINUX typedef int(* __compar_d_fn_t)(const void *, const void *, void *); extern void qsort_r(void *base, size_t nel, size_t width, __compar_d_fn_t __compar, void *arg) __attribute__((nonnull (1, 4))); #endif /* implementation */ static _SORT_R_INLINE void sort_r(void *base, size_t nel, size_t width, int (*compar)(const void *_a, const void *_b, void *_arg), void *arg) { #if defined _SORT_R_LINUX #if defined __GLIBC__ && ((__GLIBC__ < 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 8)) /* no qsort_r in glibc before 2.8, need to use nested qsort */ sort_r_simple(base, nel, width, compar, arg); #else qsort_r(base, nel, width, compar, arg); #endif #elif defined _SORT_R_BSD struct sort_r_data tmp; tmp.arg = arg; tmp.compar = compar; qsort_r(base, nel, width, &tmp, sort_r_arg_swap); #elif defined _SORT_R_WINDOWS struct sort_r_data tmp; tmp.arg = arg; tmp.compar = compar; qsort_s(base, nel, width, sort_r_arg_swap, &tmp); #else /* Fall back to our own quicksort implementation */ sort_r_simple(base, nel, width, compar, arg); #endif } #endif /* !NESTED_QSORT */ #undef _SORT_R_INLINE #undef _SORT_R_WINDOWS #undef _SORT_R_LINUX #undef _SORT_R_BSD #endif /* SORT_R_H_ */ hashcat-4.0.1/include/status.h000066400000000000000000000155731320027462700162640ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _STATUS_H #define _STATUS_H #include #include #include double get_avg_exec_time (hc_device_param_t *device_param, const int last_num_entries); // should be static after refactoring void format_timer_display (struct tm *tm, char *buf, size_t len); void format_speed_display (double val, char *buf, size_t len); int status_get_device_info_cnt (const hashcat_ctx_t *hashcat_ctx); int status_get_device_info_active (const hashcat_ctx_t *hashcat_ctx); bool status_get_skipped_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id); char *status_get_session (const hashcat_ctx_t *hashcat_ctx); char *status_get_status_string (const hashcat_ctx_t *hashcat_ctx); int status_get_status_number (const hashcat_ctx_t *hashcat_ctx); int status_get_guess_mode (const hashcat_ctx_t *hashcat_ctx); char *status_get_guess_base (const hashcat_ctx_t *hashcat_ctx); int status_get_guess_base_offset (const hashcat_ctx_t *hashcat_ctx); int status_get_guess_base_count (const hashcat_ctx_t *hashcat_ctx); double status_get_guess_base_percent (const hashcat_ctx_t *hashcat_ctx); char *status_get_guess_mod (const hashcat_ctx_t *hashcat_ctx); int status_get_guess_mod_offset (const hashcat_ctx_t *hashcat_ctx); int status_get_guess_mod_count (const hashcat_ctx_t *hashcat_ctx); double status_get_guess_mod_percent (const hashcat_ctx_t *hashcat_ctx); char *status_get_guess_charset (const hashcat_ctx_t *hashcat_ctx); int status_get_guess_mask_length (const hashcat_ctx_t *hashcat_ctx); char *status_get_guess_candidates_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id); char *status_get_hash_type (const hashcat_ctx_t *hashcat_ctx); const char *status_get_hash_target (const hashcat_ctx_t *hashcat_ctx); int status_get_digests_done (const hashcat_ctx_t *hashcat_ctx); int status_get_digests_cnt (const hashcat_ctx_t *hashcat_ctx); double status_get_digests_percent (const hashcat_ctx_t *hashcat_ctx); int status_get_salts_done (const hashcat_ctx_t *hashcat_ctx); int status_get_salts_cnt (const hashcat_ctx_t *hashcat_ctx); double status_get_salts_percent (const hashcat_ctx_t *hashcat_ctx); double status_get_msec_running (const hashcat_ctx_t *hashcat_ctx); double status_get_msec_paused (const hashcat_ctx_t *hashcat_ctx); double status_get_msec_real (const hashcat_ctx_t *hashcat_ctx); char *status_get_time_started_absolute (const hashcat_ctx_t *hashcat_ctx); char *status_get_time_started_relative (const hashcat_ctx_t *hashcat_ctx); hc_time_t status_get_sec_etc (const hashcat_ctx_t *hashcat_ctx); char *status_get_time_estimated_absolute (const hashcat_ctx_t *hashcat_ctx); char *status_get_time_estimated_relative (const hashcat_ctx_t *hashcat_ctx); u64 status_get_restore_point (const hashcat_ctx_t *hashcat_ctx); u64 status_get_restore_total (const hashcat_ctx_t *hashcat_ctx); double status_get_restore_percent (const hashcat_ctx_t *hashcat_ctx); int status_get_progress_mode (const hashcat_ctx_t *hashcat_ctx); double status_get_progress_finished_percent (const hashcat_ctx_t *hashcat_ctx); u64 status_get_progress_done (const hashcat_ctx_t *hashcat_ctx); u64 status_get_progress_rejected (const hashcat_ctx_t *hashcat_ctx); double status_get_progress_rejected_percent (const hashcat_ctx_t *hashcat_ctx); u64 status_get_progress_restored (const hashcat_ctx_t *hashcat_ctx); u64 status_get_progress_cur (const hashcat_ctx_t *hashcat_ctx); u64 status_get_progress_end (const hashcat_ctx_t *hashcat_ctx); u64 status_get_progress_ignore (const hashcat_ctx_t *hashcat_ctx); u64 status_get_progress_skip (const hashcat_ctx_t *hashcat_ctx); u64 status_get_progress_cur_relative_skip (const hashcat_ctx_t *hashcat_ctx); u64 status_get_progress_end_relative_skip (const hashcat_ctx_t *hashcat_ctx); double status_get_hashes_msec_all (const hashcat_ctx_t *hashcat_ctx); double status_get_hashes_msec_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id); double status_get_hashes_msec_dev_benchmark (const hashcat_ctx_t *hashcat_ctx, const int device_id); double status_get_exec_msec_all (const hashcat_ctx_t *hashcat_ctx); double status_get_exec_msec_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id); char *status_get_speed_sec_all (const hashcat_ctx_t *hashcat_ctx); char *status_get_speed_sec_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id); int status_get_cpt_cur_min (const hashcat_ctx_t *hashcat_ctx); int status_get_cpt_cur_hour (const hashcat_ctx_t *hashcat_ctx); int status_get_cpt_cur_day (const hashcat_ctx_t *hashcat_ctx); int status_get_cpt_avg_min (const hashcat_ctx_t *hashcat_ctx); int status_get_cpt_avg_hour (const hashcat_ctx_t *hashcat_ctx); int status_get_cpt_avg_day (const hashcat_ctx_t *hashcat_ctx); char *status_get_cpt (const hashcat_ctx_t *hashcat_ctx); char *status_get_hwmon_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id); int status_get_corespeed_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id); int status_get_memoryspeed_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id); int status_get_progress_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id); double status_get_runtime_msec_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id); int status_progress_init (hashcat_ctx_t *hashcat_ctx); void status_progress_destroy (hashcat_ctx_t *hashcat_ctx); void status_progress_reset (hashcat_ctx_t *hashcat_ctx); int status_ctx_init (hashcat_ctx_t *hashcat_ctx); void status_ctx_destroy (hashcat_ctx_t *hashcat_ctx); void status_status_destroy (hashcat_ctx_t *hashcat_ctx, hashcat_status_t *status_ctx); #endif // _STATUS_H hashcat-4.0.1/include/stdout.h000066400000000000000000000007221320027462700162510ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _STDOUT_H #define _STDOUT_H #include #include #include #include #include #include #include #include #if defined (_POSIX) #include #include #endif // _POSIX int process_stdout (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 pws_cnt); #endif // _STDOUT_H hashcat-4.0.1/include/straight.h000066400000000000000000000005461320027462700165600ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _STRAIGHT_H #define _STRAIGHT_H #include #define INCR_DICTS 1000 int straight_ctx_update_loop (hashcat_ctx_t *hashcat_ctx); int straight_ctx_init (hashcat_ctx_t *hashcat_ctx); void straight_ctx_destroy (hashcat_ctx_t *hashcat_ctx); #endif // _STRAIGHT_H hashcat-4.0.1/include/terminal.h000066400000000000000000000032441320027462700165440ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _TERMINAL_H #define _TERMINAL_H #include #include #include #include #include #if defined (_WIN) #include #else #include #if defined (__APPLE__) #include #endif // __APPLE__ #endif // _WIN void welcome_screen (hashcat_ctx_t *hashcat_ctx, const char *version_tag); void goodbye_screen (hashcat_ctx_t *hashcat_ctx, const hc_time_t proc_start, const hc_time_t proc_stop); int setup_console (void); void send_prompt (void); void clear_prompt (void); void *thread_keypress (void *p); #if defined (_WIN) void SetConsoleWindowSize (const int x); #endif int tty_break(void); int tty_getchar(void); int tty_fix(void); void compress_terminal_line_length (char *out_buf, const size_t keep_from_beginning, const size_t keep_from_end); void example_hashes (hashcat_ctx_t *hashcat_ctx); void opencl_info (hashcat_ctx_t *hashcat_ctx); void opencl_info_compact (hashcat_ctx_t *hashcat_ctx); void status_progress_machine_readable (hashcat_ctx_t *hashcat_ctx); void status_progress (hashcat_ctx_t *hashcat_ctx); void status_speed_machine_readable (hashcat_ctx_t *hashcat_ctx); void status_speed (hashcat_ctx_t *hashcat_ctx); void status_display_machine_readable (hashcat_ctx_t *hashcat_ctx); void status_display (hashcat_ctx_t *hashcat_ctx); void status_benchmark_machine_readable (hashcat_ctx_t *hashcat_ctx); void status_benchmark (hashcat_ctx_t *hashcat_ctx); #endif // _TERMINAL_H hashcat-4.0.1/include/thread.h000066400000000000000000000037311320027462700162010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _THREAD_H #define _THREAD_H #include #if defined (_WIN) #include #else #include #include #endif // _WIN #if defined (_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 (u32 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) #else #define hc_thread_create(t,f,a) pthread_create (&t, NULL, f, a) #define hc_thread_wait(n,a) for (u32 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 /* #if defined (_WIN) BOOL WINAPI sigHandler_default (DWORD sig); BOOL WINAPI sigHandler_benchmark (DWORD sig); void hc_signal (BOOL WINAPI (callback) (DWORD)); #else void sigHandler_default (int sig); void sigHandler_benchmark (int sig); void hc_signal (void (callback) (int)); #endif */ int mycracked (hashcat_ctx_t *hashcat_ctx); int myabort_runtime (hashcat_ctx_t *hashcat_ctx); int myabort_checkpoint (hashcat_ctx_t *hashcat_ctx); int myabort (hashcat_ctx_t *hashcat_ctx); int myquit (hashcat_ctx_t *hashcat_ctx); int bypass (hashcat_ctx_t *hashcat_ctx); int SuspendThreads (hashcat_ctx_t *hashcat_ctx); int ResumeThreads (hashcat_ctx_t *hashcat_ctx); int stop_at_checkpoint (hashcat_ctx_t *hashcat_ctx); #endif // _THREAD_H hashcat-4.0.1/include/timer.h000066400000000000000000000003041320027462700160430ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _TIMER_H #define _TIMER_H void hc_timer_set (hc_timer_t *a); double hc_timer_get (hc_timer_t a); #endif // _TIMER_H hashcat-4.0.1/include/tuningdb.h000066400000000000000000000007421320027462700165430ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _TUNINGDB_H #define _TUNINGDB_H #include #include #define TUNING_DB_FILE "hashcat.hctune" int tuning_db_init (hashcat_ctx_t *hashcat_ctx); void tuning_db_destroy (hashcat_ctx_t *hashcat_ctx); tuning_db_entry_t *tuning_db_search (hashcat_ctx_t *hashcat_ctx, const char *device_name, const cl_device_type device_type, int attack_mode, const int hash_type); #endif // _TUNINGDB_H hashcat-4.0.1/include/types.h000066400000000000000000001334151320027462700161010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _TYPES_H #define _TYPES_H #include "common.h" #include #include #include #include #include #include #include #include #if defined (_WIN) #define WINICONV_CONST #endif #include #if defined (_WIN) #include #if defined (_BASETSD_H) #else 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; #endif #endif // _WIN typedef uint8_t u8; typedef uint16_t u16; typedef uint32_t u32; typedef uint64_t u64; // time #if defined (_WIN) typedef __time64_t hc_time_t; #else typedef time_t hc_time_t; #endif // timer #if defined (_WIN) typedef LARGE_INTEGER hc_timer_t; #else typedef struct timeval hc_timer_t; #endif // thread #if defined (_POSIX) #include #endif #if defined (_WIN) typedef HANDLE hc_thread_t; typedef CRITICAL_SECTION hc_thread_mutex_t; #else typedef pthread_t hc_thread_t; typedef pthread_mutex_t hc_thread_mutex_t; #endif // stat #if defined (_WIN) typedef struct _stat64 hc_stat_t; #else typedef struct stat hc_stat_t; #endif // enums typedef enum loglevel { LOGLEVEL_INFO = 0, LOGLEVEL_WARNING = 1, LOGLEVEL_ERROR = 2, LOGLEVEL_ADVICE = 3, } loglevel_t; typedef enum event_identifier { EVENT_AUTOTUNE_FINISHED = 0x00000000, EVENT_AUTOTUNE_STARTING = 0x00000001, EVENT_BITMAP_INIT_POST = 0x00000010, EVENT_BITMAP_INIT_PRE = 0x00000011, EVENT_CALCULATED_WORDS_BASE = 0x00000020, EVENT_CRACKER_FINISHED = 0x00000030, EVENT_CRACKER_HASH_CRACKED = 0x00000031, EVENT_CRACKER_STARTING = 0x00000032, EVENT_HASHLIST_COUNT_LINES_POST = 0x00000040, EVENT_HASHLIST_COUNT_LINES_PRE = 0x00000041, EVENT_HASHLIST_PARSE_HASH = 0x00000042, EVENT_HASHLIST_SORT_HASH_POST = 0x00000043, EVENT_HASHLIST_SORT_HASH_PRE = 0x00000044, EVENT_HASHLIST_SORT_SALT_POST = 0x00000045, EVENT_HASHLIST_SORT_SALT_PRE = 0x00000046, EVENT_HASHLIST_UNIQUE_HASH_POST = 0x00000047, EVENT_HASHLIST_UNIQUE_HASH_PRE = 0x00000048, EVENT_INNERLOOP1_FINISHED = 0x00000050, EVENT_INNERLOOP1_STARTING = 0x00000051, EVENT_INNERLOOP2_FINISHED = 0x00000060, EVENT_INNERLOOP2_STARTING = 0x00000061, EVENT_LOG_ERROR = 0x00000070, EVENT_LOG_INFO = 0x00000071, EVENT_LOG_WARNING = 0x00000072, EVENT_LOG_ADVICE = 0x00000073, EVENT_MONITOR_RUNTIME_LIMIT = 0x00000080, EVENT_MONITOR_STATUS_REFRESH = 0x00000081, EVENT_MONITOR_TEMP_ABORT = 0x00000082, EVENT_MONITOR_THROTTLE1 = 0x00000083, EVENT_MONITOR_THROTTLE2 = 0x00000084, EVENT_MONITOR_THROTTLE3 = 0x00000085, EVENT_MONITOR_PERFORMANCE_HINT = 0x00000086, EVENT_OPENCL_SESSION_POST = 0x00000090, EVENT_OPENCL_SESSION_PRE = 0x00000091, EVENT_OUTERLOOP_FINISHED = 0x000000a0, EVENT_OUTERLOOP_MAINSCREEN = 0x000000a1, EVENT_OUTERLOOP_STARTING = 0x000000a2, EVENT_POTFILE_ALL_CRACKED = 0x000000b0, EVENT_POTFILE_HASH_LEFT = 0x000000b1, EVENT_POTFILE_HASH_SHOW = 0x000000b2, EVENT_POTFILE_NUM_CRACKED = 0x000000b3, EVENT_POTFILE_REMOVE_PARSE_POST = 0x000000b4, EVENT_POTFILE_REMOVE_PARSE_PRE = 0x000000b5, EVENT_SELFTEST_FINISHED = 0x000000c0, EVENT_SELFTEST_STARTING = 0x000000c1, EVENT_SET_KERNEL_POWER_FINAL = 0x000000d0, EVENT_WORDLIST_CACHE_GENERATE = 0x000000e0, EVENT_WORDLIST_CACHE_HIT = 0x000000e1, // there will be much more event types soon } event_identifier_t; typedef enum amplifier_count { KERNEL_BFS = 1024, KERNEL_COMBS = 1024, KERNEL_RULES = 256, KERNEL_THREADS_MAX_CPU = 1, KERNEL_THREADS_MAX_GPU = 8, // ex: intel integrated KERNEL_THREADS_MAX_GPU_NV = 32, // optimized NV size: warps KERNEL_THREADS_MAX_GPU_AMD = 64, // optimized AMD size: wavefronts KERNEL_THREADS_MAX_OTHER = 8, // ex: intel MIC } amplifier_count_t; typedef enum vendor_id { VENDOR_ID_AMD = (1 << 0), VENDOR_ID_APPLE = (1 << 1), VENDOR_ID_INTEL_BEIGNET = (1 << 2), VENDOR_ID_INTEL_SDK = (1 << 3), VENDOR_ID_MESA = (1 << 4), VENDOR_ID_NV = (1 << 5), VENDOR_ID_POCL = (1 << 6), VENDOR_ID_AMD_USE_INTEL = (1 << 7), VENDOR_ID_GENERIC = (1 << 31) } vendor_id_t; typedef enum status_rc { STATUS_INIT = 0, STATUS_AUTOTUNE = 1, STATUS_SELFTEST = 2, STATUS_RUNNING = 3, STATUS_PAUSED = 4, STATUS_EXHAUSTED = 5, STATUS_CRACKED = 6, STATUS_ABORTED = 7, STATUS_QUIT = 8, STATUS_BYPASS = 9, STATUS_ABORTED_CHECKPOINT = 10, STATUS_ABORTED_RUNTIME = 11, } status_rc_t; typedef enum wl_mode { WL_MODE_NONE = 0, WL_MODE_STDIN = 1, WL_MODE_FILE = 2, WL_MODE_MASK = 3 } wl_mode_t; typedef enum hl_mode { HL_MODE_FILE = 4, HL_MODE_ARG = 5 } hl_mode_t; typedef enum attack_mode { ATTACK_MODE_STRAIGHT = 0, ATTACK_MODE_COMBI = 1, ATTACK_MODE_TOGGLE = 2, ATTACK_MODE_BF = 3, ATTACK_MODE_PERM = 4, ATTACK_MODE_TABLE = 5, ATTACK_MODE_HYBRID1 = 6, ATTACK_MODE_HYBRID2 = 7, ATTACK_MODE_NONE = 100 } attack_mode_t; typedef enum attack_kern { ATTACK_KERN_STRAIGHT = 0, ATTACK_KERN_COMBI = 1, ATTACK_KERN_BF = 3, ATTACK_KERN_NONE = 100 } attack_kern_t; typedef enum combinator_mode { COMBINATOR_MODE_BASE_LEFT = 10001, COMBINATOR_MODE_BASE_RIGHT = 10002 } combinator_mode_t; typedef enum kern_run { KERN_RUN_1 = 1000, KERN_RUN_12 = 1500, KERN_RUN_2 = 2000, KERN_RUN_23 = 2500, KERN_RUN_3 = 3000, KERN_RUN_4 = 4000, KERN_RUN_INIT2 = 5000, KERN_RUN_LOOP2 = 6000 } kern_run_t; typedef enum kern_run_mp { KERN_RUN_MP = 101, KERN_RUN_MP_L = 102, KERN_RUN_MP_R = 103 } kern_run_mp_t; typedef enum rule_functions { RULE_OP_MANGLE_NOOP = ':', RULE_OP_MANGLE_LREST = 'l', RULE_OP_MANGLE_UREST = 'u', RULE_OP_MANGLE_LREST_UFIRST = 'c', RULE_OP_MANGLE_UREST_LFIRST = 'C', RULE_OP_MANGLE_TREST = 't', RULE_OP_MANGLE_TOGGLE_AT = 'T', RULE_OP_MANGLE_REVERSE = 'r', RULE_OP_MANGLE_DUPEWORD = 'd', RULE_OP_MANGLE_DUPEWORD_TIMES = 'p', RULE_OP_MANGLE_REFLECT = 'f', RULE_OP_MANGLE_ROTATE_LEFT = '{', RULE_OP_MANGLE_ROTATE_RIGHT = '}', RULE_OP_MANGLE_APPEND = '$', RULE_OP_MANGLE_PREPEND = '^', RULE_OP_MANGLE_DELETE_FIRST = '[', RULE_OP_MANGLE_DELETE_LAST = ']', RULE_OP_MANGLE_DELETE_AT = 'D', RULE_OP_MANGLE_EXTRACT = 'x', RULE_OP_MANGLE_OMIT = 'O', RULE_OP_MANGLE_INSERT = 'i', RULE_OP_MANGLE_OVERSTRIKE = 'o', RULE_OP_MANGLE_TRUNCATE_AT = '\'', RULE_OP_MANGLE_REPLACE = 's', RULE_OP_MANGLE_PURGECHAR = '@', RULE_OP_MANGLE_TOGGLECASE_REC = 'a', RULE_OP_MANGLE_DUPECHAR_FIRST = 'z', RULE_OP_MANGLE_DUPECHAR_LAST = 'Z', RULE_OP_MANGLE_DUPECHAR_ALL = 'q', RULE_OP_MANGLE_EXTRACT_MEMORY = 'X', RULE_OP_MANGLE_APPEND_MEMORY = '4', RULE_OP_MANGLE_PREPEND_MEMORY = '6', RULE_OP_MANGLE_TITLE_SEP = 'e', RULE_OP_MEMORIZE_WORD = 'M', RULE_OP_REJECT_LESS = '<', RULE_OP_REJECT_GREATER = '>', RULE_OP_REJECT_EQUAL = '_', RULE_OP_REJECT_CONTAIN = '!', RULE_OP_REJECT_NOT_CONTAIN = '/', RULE_OP_REJECT_EQUAL_FIRST = '(', RULE_OP_REJECT_EQUAL_LAST = ')', RULE_OP_REJECT_EQUAL_AT = '=', RULE_OP_REJECT_CONTAINS = '%', RULE_OP_REJECT_MEMORY = 'Q', RULE_LAST_REJECTED_SAVED_POS = 'p', RULE_OP_MANGLE_SWITCH_FIRST = 'k', RULE_OP_MANGLE_SWITCH_LAST = 'K', RULE_OP_MANGLE_SWITCH_AT = '*', RULE_OP_MANGLE_CHR_SHIFTL = 'L', RULE_OP_MANGLE_CHR_SHIFTR = 'R', RULE_OP_MANGLE_CHR_INCR = '+', RULE_OP_MANGLE_CHR_DECR = '-', RULE_OP_MANGLE_REPLACE_NP1 = '.', RULE_OP_MANGLE_REPLACE_NM1 = ',', RULE_OP_MANGLE_DUPEBLOCK_FIRST = 'y', RULE_OP_MANGLE_DUPEBLOCK_LAST = 'Y', RULE_OP_MANGLE_TITLE = 'E', } rule_functions_t; typedef enum salt_type { SALT_TYPE_NONE = 1, SALT_TYPE_EMBEDDED = 2, SALT_TYPE_GENERIC = 3, SALT_TYPE_VIRTUAL = 5 } salt_type_t; typedef enum opti_type { OPTI_TYPE_OPTIMIZED_KERNEL = (1 << 0), OPTI_TYPE_ZERO_BYTE = (1 << 1), OPTI_TYPE_PRECOMPUTE_INIT = (1 << 2), OPTI_TYPE_PRECOMPUTE_MERKLE = (1 << 3), OPTI_TYPE_PRECOMPUTE_PERMUT = (1 << 4), OPTI_TYPE_MEET_IN_MIDDLE = (1 << 5), OPTI_TYPE_EARLY_SKIP = (1 << 6), OPTI_TYPE_NOT_SALTED = (1 << 7), OPTI_TYPE_NOT_ITERATED = (1 << 8), OPTI_TYPE_PREPENDED_SALT = (1 << 9), OPTI_TYPE_APPENDED_SALT = (1 << 10), OPTI_TYPE_SINGLE_HASH = (1 << 11), OPTI_TYPE_SINGLE_SALT = (1 << 12), OPTI_TYPE_BRUTE_FORCE = (1 << 13), OPTI_TYPE_RAW_HASH = (1 << 14), OPTI_TYPE_SLOW_HASH_SIMD_INIT = (1 << 15), OPTI_TYPE_SLOW_HASH_SIMD_LOOP = (1 << 16), OPTI_TYPE_SLOW_HASH_SIMD_COMP = (1 << 17), OPTI_TYPE_USES_BITS_8 = (1 << 18), OPTI_TYPE_USES_BITS_16 = (1 << 19), OPTI_TYPE_USES_BITS_32 = (1 << 20), OPTI_TYPE_USES_BITS_64 = (1 << 21) } opti_type_t; typedef enum opts_type { OPTS_TYPE_PT_UTF16LE = (1ULL << 0), OPTS_TYPE_PT_UTF16BE = (1ULL << 1), OPTS_TYPE_PT_UPPER = (1ULL << 2), OPTS_TYPE_PT_LOWER = (1ULL << 3), OPTS_TYPE_PT_ADD01 = (1ULL << 4), OPTS_TYPE_PT_ADD02 = (1ULL << 5), OPTS_TYPE_PT_ADD80 = (1ULL << 6), OPTS_TYPE_PT_ADDBITS14 = (1ULL << 7), OPTS_TYPE_PT_ADDBITS15 = (1ULL << 8), OPTS_TYPE_PT_GENERATE_LE = (1ULL << 9), OPTS_TYPE_PT_GENERATE_BE = (1ULL << 10), OPTS_TYPE_PT_NEVERCRACK = (1ULL << 11), // if we want all possible results OPTS_TYPE_PT_BITSLICE = (1ULL << 12), OPTS_TYPE_PT_ALWAYS_ASCII = (1ULL << 13), OPTS_TYPE_ST_UTF16LE = (1ULL << 14), OPTS_TYPE_ST_UTF16BE = (1ULL << 15), OPTS_TYPE_ST_UPPER = (1ULL << 16), OPTS_TYPE_ST_LOWER = (1ULL << 17), OPTS_TYPE_ST_ADD01 = (1ULL << 18), OPTS_TYPE_ST_ADD02 = (1ULL << 19), OPTS_TYPE_ST_ADD80 = (1ULL << 20), OPTS_TYPE_ST_ADDBITS14 = (1ULL << 21), OPTS_TYPE_ST_ADDBITS15 = (1ULL << 22), OPTS_TYPE_ST_GENERATE_LE = (1ULL << 23), OPTS_TYPE_ST_GENERATE_BE = (1ULL << 24), OPTS_TYPE_ST_HEX = (1ULL << 25), OPTS_TYPE_ST_BASE64 = (1ULL << 26), OPTS_TYPE_ST_HASH_MD5 = (1ULL << 27), OPTS_TYPE_HASH_COPY = (1ULL << 28), OPTS_TYPE_HASH_SPLIT = (1ULL << 29), OPTS_TYPE_HOOK12 = (1ULL << 30), OPTS_TYPE_HOOK23 = (1ULL << 31), OPTS_TYPE_INIT2 = (1ULL << 32), OPTS_TYPE_LOOP2 = (1ULL << 33), OPTS_TYPE_BINARY_HASHFILE = (1ULL << 34), } opts_type_t; typedef enum dgst_size { DGST_SIZE_4_2 = (2 * sizeof (u32)), // 8 DGST_SIZE_4_4 = (4 * sizeof (u32)), // 16 DGST_SIZE_4_5 = (5 * sizeof (u32)), // 20 DGST_SIZE_4_6 = (6 * sizeof (u32)), // 24 DGST_SIZE_4_7 = (7 * sizeof (u32)), // 28 DGST_SIZE_4_8 = (8 * sizeof (u32)), // 32 DGST_SIZE_4_16 = (16 * sizeof (u32)), // 64 !!! DGST_SIZE_4_32 = (32 * sizeof (u32)), // 128 !!! DGST_SIZE_4_64 = (64 * sizeof (u32)), // 256 DGST_SIZE_8_8 = (8 * sizeof (u64)), // 64 !!! DGST_SIZE_8_16 = (16 * sizeof (u64)), // 128 !!! DGST_SIZE_8_25 = (25 * sizeof (u64)) // 200 } dgst_size_t; typedef enum attack_exec { ATTACK_EXEC_OUTSIDE_KERNEL = 10, ATTACK_EXEC_INSIDE_KERNEL = 11 } attack_exec_t; typedef enum hlfmt_name { HLFMT_HASHCAT = 0, HLFMT_PWDUMP = 1, HLFMT_PASSWD = 2, HLFMT_SHADOW = 3, HLFMT_DCC = 4, HLFMT_DCC2 = 5, HLFMT_NETNTLM1 = 7, HLFMT_NETNTLM2 = 8, HLFMT_NSLDAP = 9, HLFMT_NSLDAPS = 10 } hlfmt_name_t; typedef enum outfile_fmt { OUTFILE_FMT_HASH = (1 << 0), OUTFILE_FMT_PLAIN = (1 << 1), OUTFILE_FMT_HEXPLAIN = (1 << 2), OUTFILE_FMT_CRACKPOS = (1 << 3) } outfile_fmt_t; typedef enum parser_rc { PARSER_OK = 0, PARSER_COMMENT = -1, PARSER_GLOBAL_ZERO = -2, PARSER_GLOBAL_LENGTH = -3, PARSER_HASH_LENGTH = -4, PARSER_HASH_VALUE = -5, PARSER_SALT_LENGTH = -6, PARSER_SALT_VALUE = -7, PARSER_SALT_ITERATION = -8, PARSER_SEPARATOR_UNMATCHED = -9, PARSER_SIGNATURE_UNMATCHED = -10, PARSER_HCCAPX_FILE_SIZE = -11, PARSER_HCCAPX_EAPOL_LEN = -12, PARSER_PSAFE2_FILE_SIZE = -13, PARSER_PSAFE3_FILE_SIZE = -14, PARSER_TC_FILE_SIZE = -15, PARSER_VC_FILE_SIZE = -16, PARSER_SIP_AUTH_DIRECTIVE = -17, PARSER_HASH_FILE = -18, PARSER_HASH_ENCODING = -19, PARSER_SALT_ENCODING = -20, PARSER_LUKS_FILE_SIZE = -21, PARSER_LUKS_MAGIC = -22, PARSER_LUKS_VERSION = -23, PARSER_LUKS_CIPHER_TYPE = -24, PARSER_LUKS_CIPHER_MODE = -25, PARSER_LUKS_HASH_TYPE = -26, PARSER_LUKS_KEY_SIZE = -27, PARSER_LUKS_KEY_DISABLED = -28, PARSER_LUKS_KEY_STRIPES = -29, PARSER_LUKS_HASH_CIPHER = -30, PARSER_HCCAPX_SIGNATURE = -31, PARSER_HCCAPX_VERSION = -32, PARSER_HCCAPX_MESSAGE_PAIR = -33, PARSER_UNKNOWN_ERROR = -255 } parser_rc_t; typedef enum guess_mode { GUESS_MODE_NONE = 0, GUESS_MODE_STRAIGHT_FILE = 1, GUESS_MODE_STRAIGHT_FILE_RULES_FILE = 2, GUESS_MODE_STRAIGHT_FILE_RULES_GEN = 3, GUESS_MODE_STRAIGHT_STDIN = 4, GUESS_MODE_STRAIGHT_STDIN_RULES_FILE = 5, GUESS_MODE_STRAIGHT_STDIN_RULES_GEN = 6, GUESS_MODE_COMBINATOR_BASE_LEFT = 7, GUESS_MODE_COMBINATOR_BASE_RIGHT = 8, GUESS_MODE_MASK = 9, GUESS_MODE_MASK_CS = 10, GUESS_MODE_HYBRID1 = 11, GUESS_MODE_HYBRID1_CS = 12, GUESS_MODE_HYBRID2 = 13, GUESS_MODE_HYBRID2_CS = 14, } guess_mode_t; typedef enum progress_mode { PROGRESS_MODE_NONE = 0, PROGRESS_MODE_KEYSPACE_KNOWN = 1, PROGRESS_MODE_KEYSPACE_UNKNOWN = 2, } progress_mode_t; typedef enum user_options_defaults { ADVICE_DISABLE = false, ATTACK_MODE = ATTACK_MODE_STRAIGHT, BENCHMARK = false, BITMAP_MAX = 24, BITMAP_MIN = 16, DEBUG_MODE = 0, EXAMPLE_HASHES = false, FORCE = false, GPU_TEMP_ABORT = 90, GPU_TEMP_DISABLE = false, GPU_TEMP_RETAIN = 75, HASH_MODE = 0, HCCAPX_MESSAGE_PAIR = 0, HEX_CHARSET = false, HEX_SALT = false, HEX_WORDLIST = false, INCREMENT = false, INCREMENT_MAX = PW_MAX, INCREMENT_MIN = 1, KEEP_GUESSING = false, KERNEL_ACCEL = 0, KERNEL_LOOPS = 0, KEYSPACE = false, LEFT = false, LIMIT = 0, LOGFILE_DISABLE = false, LOOPBACK = false, MACHINE_READABLE = false, MARKOV_CLASSIC = false, MARKOV_DISABLE = false, MARKOV_THRESHOLD = 0, NONCE_ERROR_CORRECTIONS = 8, NVIDIA_SPIN_DAMP = 100, OPENCL_INFO = false, OPENCL_VECTOR_WIDTH = 0, OPTIMIZED_KERNEL_ENABLE = false, OUTFILE_AUTOHEX = true, OUTFILE_CHECK_TIMER = 5, OUTFILE_FORMAT = 3, WORDLIST_AUTOHEX_DISABLE = false, POTFILE_DISABLE = false, POWERTUNE_ENABLE = false, QUIET = false, REMOVE = false, REMOVE_TIMER = 60, RESTORE = false, RESTORE_DISABLE = false, RESTORE_TIMER = 60, RP_GEN = 0, RP_GEN_FUNC_MAX = 4, RP_GEN_FUNC_MIN = 1, RP_GEN_SEED = 0, RUNTIME = 0, SCRYPT_TMTO = 0, SELF_TEST_DISABLE = false, SEGMENT_SIZE = 33554432, SEPARATOR = ':', SHOW = false, SKIP = 0, STATUS = false, STATUS_TIMER = 10, STDOUT_FLAG = false, SPEED_ONLY = false, PROGRESS_ONLY = false, USAGE = false, USERNAME = false, VERSION = false, WORKLOAD_PROFILE = 2, } user_options_defaults_t; typedef enum user_options_map { IDX_ADVICE_DISABLE = 0xff00, IDX_ATTACK_MODE = 'a', IDX_BENCHMARK = 'b', IDX_BITMAP_MAX = 0xff01, IDX_BITMAP_MIN = 0xff02, IDX_CPU_AFFINITY = 0xff03, IDX_CUSTOM_CHARSET_1 = '1', IDX_CUSTOM_CHARSET_2 = '2', IDX_CUSTOM_CHARSET_3 = '3', IDX_CUSTOM_CHARSET_4 = '4', IDX_DEBUG_FILE = 0xff04, IDX_DEBUG_MODE = 0xff05, IDX_ENCODING_FROM = 0xff06, IDX_ENCODING_TO = 0xff07, IDX_EXAMPLE_HASHES = 0xff08, IDX_FORCE = 0xff09, IDX_GPU_TEMP_ABORT = 0xff0a, IDX_GPU_TEMP_DISABLE = 0xff0b, IDX_GPU_TEMP_RETAIN = 0xff0c, IDX_HASH_MODE = 'm', IDX_HCCAPX_MESSAGE_PAIR = 0xff0d, IDX_HELP = 'h', IDX_HEX_CHARSET = 0xff0e, IDX_HEX_SALT = 0xff0f, IDX_HEX_WORDLIST = 0xff10, IDX_INCREMENT = 'i', IDX_INCREMENT_MAX = 0xff11, IDX_INCREMENT_MIN = 0xff12, IDX_INDUCTION_DIR = 0xff13, IDX_KEEP_GUESSING = 0xff14, IDX_KERNEL_ACCEL = 'n', IDX_KERNEL_LOOPS = 'u', IDX_KEYSPACE = 0xff15, IDX_LEFT = 0xff16, IDX_LIMIT = 'l', IDX_LOGFILE_DISABLE = 0xff17, IDX_LOOPBACK = 0xff18, IDX_MACHINE_READABLE = 0xff19, IDX_MARKOV_CLASSIC = 0xff1a, IDX_MARKOV_DISABLE = 0xff1b, IDX_MARKOV_HCSTAT = 0xff1c, IDX_MARKOV_THRESHOLD = 't', IDX_NONCE_ERROR_CORRECTIONS = 0xff1d, IDX_NVIDIA_SPIN_DAMP = 0xff1e, IDX_OPENCL_DEVICES = 'd', IDX_OPENCL_DEVICE_TYPES = 'D', IDX_OPENCL_INFO = 'I', IDX_OPENCL_PLATFORMS = 0xff1f, IDX_OPENCL_VECTOR_WIDTH = 0xff20, IDX_OPTIMIZED_KERNEL_ENABLE = 'O', IDX_OUTFILE_AUTOHEX_DISABLE = 0xff21, IDX_OUTFILE_CHECK_DIR = 0xff22, IDX_OUTFILE_CHECK_TIMER = 0xff23, IDX_OUTFILE_FORMAT = 0xff24, IDX_OUTFILE = 'o', IDX_WORDLIST_AUTOHEX_DISABLE = 0xff25, IDX_POTFILE_DISABLE = 0xff26, IDX_POTFILE_PATH = 0xff27, IDX_POWERTUNE_ENABLE = 0xff28, IDX_QUIET = 0xff29, IDX_REMOVE = 0xff2a, IDX_REMOVE_TIMER = 0xff2b, IDX_RESTORE = 0xff2c, IDX_RESTORE_DISABLE = 0xff2d, IDX_RESTORE_FILE_PATH = 0xff2e, IDX_RP_FILE = 'r', IDX_RP_GEN_FUNC_MAX = 0xff2f, IDX_RP_GEN_FUNC_MIN = 0xff30, IDX_RP_GEN = 'g', IDX_RP_GEN_SEED = 0xff31, IDX_RULE_BUF_L = 'j', IDX_RULE_BUF_R = 'k', IDX_RUNTIME = 0xff32, IDX_SCRYPT_TMTO = 0xff33, IDX_SELF_TEST_DISABLE = 0xff34, IDX_SEGMENT_SIZE = 'c', IDX_SEPARATOR = 'p', IDX_SESSION = 0xff35, IDX_SHOW = 0xff36, IDX_SKIP = 's', IDX_STATUS = 0xff37, IDX_STATUS_TIMER = 0xff38, IDX_STDOUT_FLAG = 0xff39, IDX_SPEED_ONLY = 0xff3a, IDX_PROGRESS_ONLY = 0xff3b, IDX_TRUECRYPT_KEYFILES = 0xff3c, IDX_USERNAME = 0xff3d, IDX_VERACRYPT_KEYFILES = 0xff3e, IDX_VERACRYPT_PIM = 0xff3f, IDX_VERSION_LOWER = 'v', IDX_VERSION = 'V', IDX_WORKLOAD_PROFILE = 'w' } user_options_map_t; /** * structs */ typedef struct salt { u32 salt_buf[64]; u32 salt_buf_pc[64]; u32 salt_len; u32 salt_len_pc; u32 salt_iter; u32 salt_iter2; u32 salt_sign[2]; u32 keccak_mdlen; u32 digests_cnt; u32 digests_done; u32 digests_offset; u32 scrypt_N; u32 scrypt_r; u32 scrypt_p; } salt_t; typedef struct user { char *user_name; u32 user_len; } user_t; typedef enum split_origin { SPLIT_ORIGIN_NONE = 0, SPLIT_ORIGIN_LEFT = 1, SPLIT_ORIGIN_RIGHT = 2, } split_origin_t; typedef struct split { // some hashes, like lm, are split. this id point to the other hash of the group int split_group; int split_neighbor; int split_origin; } split_t; typedef struct hashinfo { user_t *user; char *orighash; split_t *split; } hashinfo_t; typedef struct hash { void *digest; salt_t *salt; void *esalt; void *hook_salt; // additional salt info only used by the hook (host) int cracked; hashinfo_t *hash_info; char *pw_buf; int pw_len; } hash_t; typedef struct outfile_data { char *file_name; off_t seek; hc_time_t ctime; } outfile_data_t; typedef struct logfile_ctx { bool enabled; char *logfile; char *topid; char *subid; } logfile_ctx_t; typedef struct hashes { const char *hashfile; u32 hashlist_mode; u32 hashlist_format; u32 digests_cnt; u32 digests_done; u32 digests_saved; void *digests_buf; u32 *digests_shown; u32 *digests_shown_tmp; u32 salts_cnt; u32 salts_done; salt_t *salts_buf; u32 *salts_shown; void *esalts_buf; void *hook_salts_buf; u32 hashes_cnt_orig; u32 hashes_cnt; hash_t *hashes_buf; hashinfo_t **hash_info; u8 *out_buf; // allocates [HCBUFSIZ_LARGE]; u8 *tmp_buf; // allocates [HCBUFSIZ_LARGE]; // selftest buffers void *st_digests_buf; salt_t *st_salts_buf; void *st_esalts_buf; void *st_hook_salts_buf; } hashes_t; struct hashconfig { char separator; u32 hash_mode; u32 hash_type; u32 salt_type; u32 attack_exec; u64 opts_type; u32 kern_type; u32 dgst_size; u32 opti_type; u32 dgst_pos0; u32 dgst_pos1; u32 dgst_pos2; u32 dgst_pos3; bool is_salted; bool has_pure_kernel; bool has_optimized_kernel; // sizes have to be size_t size_t esalt_size; size_t hook_salt_size; size_t tmp_size; size_t hook_size; // password length limit u32 pw_min; u32 pw_max; // salt length limit (generic hashes) u32 salt_min; u32 salt_max; int (*parse_func) (u8 *, u32, hash_t *, const struct hashconfig *); char *st_hash; char *st_pass; }; typedef struct hashconfig hashconfig_t; typedef struct pw { u32 i[64]; u32 pw_len; } pw_t; typedef struct bf { u32 i; } bf_t; typedef struct bs_word { u32 b[32]; } bs_word_t; typedef struct cpt { u32 cracked; hc_time_t timestamp; } cpt_t; typedef struct plain { u32 salt_pos; u32 digest_pos; u32 hash_pos; u32 gidvid; u32 il_pos; } plain_t; #include "ext_OpenCL.h" typedef struct hc_device_param { cl_device_id device; cl_device_type device_type; u32 device_id; u32 platform_devices_id; // for mapping with hms devices bool skipped; bool skipped_temp; u32 sm_major; u32 sm_minor; u32 kernel_exec_timeout; u8 pcie_bus; u8 pcie_device; u8 pcie_function; u32 device_processors; u64 device_maxmem_alloc; u64 device_global_mem; u32 device_maxclock_frequency; size_t device_maxworkgroup_size; u32 vector_width; u32 kernel_threads_by_user; u32 kernel_threads_by_wgs_kernel1; u32 kernel_threads_by_wgs_kernel12; u32 kernel_threads_by_wgs_kernel2; u32 kernel_threads_by_wgs_kernel23; u32 kernel_threads_by_wgs_kernel3; u32 kernel_threads_by_wgs_kernel4; u32 kernel_threads_by_wgs_kernel_init2; u32 kernel_threads_by_wgs_kernel_loop2; u32 kernel_threads_by_wgs_kernel_mp; u32 kernel_threads_by_wgs_kernel_mp_l; u32 kernel_threads_by_wgs_kernel_mp_r; u32 kernel_threads_by_wgs_kernel_amp; u32 kernel_threads_by_wgs_kernel_tm; u32 kernel_threads_by_wgs_kernel_memset; u32 kernel_loops; u32 kernel_accel; u32 kernel_loops_min; u32 kernel_loops_max; u32 kernel_loops_min_sav; // the _sav are required because each -i iteration u32 kernel_loops_max_sav; // needs to recalculate the kernel_loops_min/max based on the current amplifier count u32 kernel_accel_min; u32 kernel_accel_max; u32 kernel_power; u32 hardware_power; size_t size_pws; size_t size_pws_amp; size_t size_tmps; size_t size_hooks; size_t size_bfs; size_t size_combs; size_t size_rules; size_t size_rules_c; size_t size_root_css; size_t size_markov_css; size_t size_digests; size_t size_salts; size_t size_shown; size_t size_results; size_t size_plains; size_t size_st_digests; size_t size_st_salts; size_t size_st_esalts; FILE *combs_fp; pw_t *combs_buf; void *hooks_buf; pw_t *pws_buf; u32 pws_cnt; u64 words_off; u64 words_done; u32 outerloop_pos; u32 outerloop_left; double outerloop_msec; u64 innerloop_pos; u64 innerloop_left; u32 exec_pos; double exec_msec[EXEC_CACHE]; // workaround cpu spinning double exec_us_prev1[EXPECTED_ITERATIONS]; double exec_us_prev2[EXPECTED_ITERATIONS]; double exec_us_prev3[EXPECTED_ITERATIONS]; double exec_us_prev4[EXPECTED_ITERATIONS]; double exec_us_prev_init2[EXPECTED_ITERATIONS]; double exec_us_prev_loop2[EXPECTED_ITERATIONS]; // this is "current" speed u32 speed_pos; u64 speed_cnt[SPEED_CACHE]; double speed_msec[SPEED_CACHE]; hc_timer_t timer_speed; // device specific attributes starting char *device_name; char *device_vendor; char *device_version; char *driver_version; char *device_opencl_version; bool is_rocm; double nvidia_spin_damp; cl_platform_id platform; cl_uint device_vendor_id; cl_uint platform_vendor_id; cl_kernel kernel1; cl_kernel kernel12; cl_kernel kernel2; cl_kernel kernel23; cl_kernel kernel3; cl_kernel kernel4; cl_kernel kernel_init2; cl_kernel kernel_loop2; cl_kernel kernel_mp; cl_kernel kernel_mp_l; cl_kernel kernel_mp_r; cl_kernel kernel_amp; cl_kernel kernel_tm; cl_kernel kernel_memset; 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_tmps; cl_mem d_hooks; cl_mem d_result; cl_mem d_scryptV0_buf; cl_mem d_scryptV1_buf; cl_mem d_scryptV2_buf; cl_mem d_scryptV3_buf; cl_mem d_root_css_buf; cl_mem d_markov_css_buf; cl_mem d_st_digests_buf; cl_mem d_st_salts_buf; cl_mem d_st_esalts_buf; 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_tm[PARAMCNT]; void *kernel_params_memset[PARAMCNT]; u32 kernel_params_buf32[PARAMCNT]; u64 kernel_params_buf64[PARAMCNT]; u32 kernel_params_mp_buf32[PARAMCNT]; u64 kernel_params_mp_buf64[PARAMCNT]; u32 kernel_params_mp_r_buf32[PARAMCNT]; u64 kernel_params_mp_r_buf64[PARAMCNT]; u32 kernel_params_mp_l_buf32[PARAMCNT]; u64 kernel_params_mp_l_buf64[PARAMCNT]; u32 kernel_params_amp_buf32[PARAMCNT]; u64 kernel_params_amp_buf64[PARAMCNT]; u32 kernel_params_memset_buf32[PARAMCNT]; u64 kernel_params_memset_buf64[PARAMCNT]; } hc_device_param_t; typedef struct opencl_ctx { bool enabled; void *ocl; cl_uint platforms_cnt; cl_platform_id *platforms; char **platforms_vendor; char **platforms_name; char **platforms_version; bool *platforms_skipped; cl_uint platform_devices_cnt; cl_device_id *platform_devices; u32 devices_cnt; u32 devices_active; hc_device_param_t *devices_param; u32 hardware_power_all; u32 kernel_power_all; u64 kernel_power_final; // we save that so that all divisions are done from the same base u32 opencl_platforms_filter; u32 devices_filter; cl_device_type device_types_filter; double target_msec; bool need_adl; bool need_nvml; bool need_nvapi; bool need_xnvctrl; bool need_sysfs; int comptime; int force_jit_compilation; } opencl_ctx_t; #include "ext_ADL.h" #include "ext_nvapi.h" #include "ext_nvml.h" #include "ext_xnvctrl.h" #include "ext_sysfs.h" typedef struct hm_attrs { HM_ADAPTER_ADL adl; HM_ADAPTER_NVML nvml; HM_ADAPTER_NVAPI nvapi; HM_ADAPTER_XNVCTRL xnvctrl; HM_ADAPTER_SYSFS sysfs; int od_version; bool buslanes_get_supported; bool corespeed_get_supported; bool fanspeed_get_supported; bool fanspeed_set_supported; bool fanpolicy_get_supported; bool fanpolicy_set_supported; bool memoryspeed_get_supported; bool temperature_get_supported; bool threshold_shutdown_get_supported; bool threshold_slowdown_get_supported; bool throttle_get_supported; bool utilization_get_supported; } hm_attrs_t; typedef struct hwmon_ctx { bool enabled; void *hm_adl; void *hm_nvml; void *hm_nvapi; void *hm_xnvctrl; void *hm_sysfs; hm_attrs_t *hm_device; ADLOD6MemClockState *od_clock_mem_status; int *od_power_control_status; unsigned int *nvml_power_limit; } hwmon_ctx_t; #if defined (__APPLE__) typedef struct cpu_set { u32 count; } cpu_set_t; #endif /* AES context. */ typedef struct aes_context { int bits; u32 rek[60]; u32 rdk[60]; } aes_context_t; typedef aes_context_t aes_ctx; typedef struct debugfile_ctx { bool enabled; FILE *fp; char *filename; u32 mode; } debugfile_ctx_t; typedef struct dictstat { u64 cnt; hc_stat_t stat; char encoding_from[64]; char encoding_to[64]; } dictstat_t; typedef struct dictstat_ctx { bool enabled; char *filename; dictstat_t *base; #if defined (_WIN) u32 cnt; #else size_t cnt; #endif } dictstat_ctx_t; typedef struct loopback_ctx { bool enabled; bool unused; FILE *fp; char *filename; } loopback_ctx_t; typedef struct cs { u32 cs_buf[0x100]; u32 cs_len; } cs_t; typedef struct mf { char mf_buf[0x100]; int mf_len; } mf_t; typedef struct hcstat_table { u32 key; u64 val; } hcstat_table_t; typedef struct outfile_ctx { char *filename; FILE *fp; u32 outfile_format; bool outfile_autohex; } outfile_ctx_t; typedef struct pot { char plain_buf[HCBUFSIZ_TINY]; int plain_len; hash_t hash; } pot_t; typedef struct potfile_ctx { bool enabled; bool keep_all_hashes; FILE *fp; char *filename; u8 *out_buf; // allocates [HCBUFSIZ_LARGE]; u8 *tmp_buf; // allocates [HCBUFSIZ_LARGE]; } potfile_ctx_t; // this is a linked list structure of all the hashes with the same "key" (hash or hash + salt) typedef struct pot_hash_node { hash_t *hash_buf; struct pot_hash_node *next; } pot_hash_node_t; // Attention: this is only used when --show and --username are used together // there could be multiple entries for each identical hash+salt combination // (e.g. same hashes, but different user names... we want to print all of them!) // that is why we use a linked list here typedef struct pot_tree_entry { pot_hash_node_t *nodes; // head of the linked list (under the field "hash_buf" it contains the sorting keys) // the hashconfig is required to distinguish between salted and non-salted hashes and to make sure // we compare the correct dgst_pos0...dgst_pos3 hashconfig_t *hashconfig; } pot_tree_entry_t; typedef struct restore_data { int version; char cwd[256]; u32 dicts_pos; u32 masks_pos; u64 words_cur; u32 argc; char **argv; } restore_data_t; typedef struct pidfile_data { u32 pid; } pidfile_data_t; typedef struct restore_ctx { bool enabled; int argc; char **argv; char *eff_restore_file; char *new_restore_file; restore_data_t *rd; } restore_ctx_t; typedef struct pidfile_ctx { u32 pid; char *filename; pidfile_data_t *pd; bool pidfile_written; } pidfile_ctx_t; typedef struct kernel_rule { u32 cmds[32]; } kernel_rule_t; typedef struct out { FILE *fp; char buf[HCBUFSIZ_TINY]; int len; } out_t; typedef struct tuning_db_alias { char *device_name; char *alias_name; } tuning_db_alias_t; typedef struct tuning_db_entry { const char *device_name; int attack_mode; int hash_type; int workload_profile; int vector_width; int kernel_accel; int kernel_loops; } tuning_db_entry_t; typedef struct tuning_db { bool enabled; tuning_db_alias_t *alias_buf; int alias_cnt; tuning_db_entry_t *entry_buf; int entry_cnt; } tuning_db_t; typedef struct wl_data { bool enabled; char *buf; u64 incr; u64 avail; u64 cnt; u64 pos; bool iconv_enabled; iconv_t iconv_ctx; char *iconv_tmp; void (*func) (char *, u64, u64 *, u64 *); } wl_data_t; typedef struct user_options { const char *hc_bin; int hc_argc; char **hc_argv; bool attack_mode_chgd; bool hash_mode_chgd; bool increment_max_chgd; bool increment_min_chgd; bool kernel_accel_chgd; bool kernel_loops_chgd; bool nvidia_spin_damp_chgd; bool opencl_vector_width_chgd; bool outfile_format_chgd; bool remove_timer_chgd; bool rp_gen_seed_chgd; bool runtime_chgd; bool workload_profile_chgd; bool segment_size_chgd; bool hccapx_message_pair_chgd; bool advice_disable; bool benchmark; bool example_hashes; bool force; bool gpu_temp_disable; bool hex_charset; bool hex_salt; bool hex_wordlist; bool increment; bool keep_guessing; bool keyspace; bool left; bool logfile_disable; bool loopback; bool machine_readable; bool markov_classic; bool markov_disable; bool opencl_info; bool optimized_kernel_enable; bool outfile_autohex; bool wordlist_autohex_disable; bool potfile_disable; bool powertune_enable; bool quiet; bool remove; bool restore; bool restore_disable; bool self_test_disable; bool show; bool status; bool stdout_flag; bool speed_only; bool progress_only; bool usage; bool username; bool version; char *cpu_affinity; char *custom_charset_1; char *custom_charset_2; char *custom_charset_3; char *custom_charset_4; char *debug_file; char *encoding_from; char *encoding_to; char *induction_dir; char *markov_hcstat; char *opencl_devices; char *opencl_device_types; char *opencl_platforms; char *outfile; char *outfile_check_dir; char *potfile_path; char *restore_file_path; char **rp_files; char *rule_buf_l; char *rule_buf_r; char separator; const char *session; char *truecrypt_keyfiles; char *veracrypt_keyfiles; u32 attack_mode; u32 bitmap_max; u32 bitmap_min; u32 debug_mode; u32 gpu_temp_abort; u32 gpu_temp_retain; u32 hash_mode; u32 hccapx_message_pair; u32 increment_max; u32 increment_min; u32 kernel_accel; u32 kernel_loops; u32 markov_threshold; u32 nonce_error_corrections; u32 nvidia_spin_damp; u32 opencl_vector_width; u32 outfile_check_timer; u32 outfile_format; u32 remove_timer; u32 restore_timer; u32 rp_files_cnt; u32 rp_gen; u32 rp_gen_func_max; u32 rp_gen_func_min; u32 rp_gen_seed; u32 runtime; u32 scrypt_tmto; u32 segment_size; u32 status_timer; u32 veracrypt_pim; u32 workload_profile; u64 limit; u64 skip; } user_options_t; typedef struct user_options_extra { u32 attack_kern; u32 rule_len_r; u32 rule_len_l; u32 wordlist_mode; char *hc_hash; // can be filename or string int hc_workc; // can be 0 in bf-mode = default mask char **hc_workv; } user_options_extra_t; typedef struct bitmap_ctx { bool enabled; u32 bitmap_bits; u32 bitmap_nums; u32 bitmap_size; u32 bitmap_mask; u32 bitmap_shift1; u32 bitmap_shift2; u32 *bitmap_s1_a; u32 *bitmap_s1_b; u32 *bitmap_s1_c; u32 *bitmap_s1_d; u32 *bitmap_s2_a; u32 *bitmap_s2_b; u32 *bitmap_s2_c; u32 *bitmap_s2_d; } bitmap_ctx_t; typedef struct folder_config { char *cwd; char *install_dir; char *profile_dir; char *session_dir; char *shared_dir; char *cpath_real; } folder_config_t; typedef struct induct_ctx { bool enabled; char *root_directory; char **induction_dictionaries; int induction_dictionaries_cnt; int induction_dictionaries_pos; } induct_ctx_t; typedef struct outcheck_ctx { bool enabled; char *root_directory; } outcheck_ctx_t; typedef struct straight_ctx { bool enabled; u32 kernel_rules_cnt; kernel_rule_t *kernel_rules_buf; char **dicts; u32 dicts_pos; u32 dicts_cnt; u32 dicts_avail; char *dict; } straight_ctx_t; typedef struct combinator_ctx { bool enabled; char *scratch_buf; char *dict1; char *dict2; u32 combs_mode; u64 combs_cnt; } combinator_ctx_t; typedef struct mask_ctx { bool enabled; cs_t mp_sys[8]; cs_t mp_usr[4]; u64 bfs_cnt; cs_t *css_buf; u32 css_cnt; hcstat_table_t *root_table_buf; hcstat_table_t *markov_table_buf; cs_t *root_css_buf; cs_t *markov_css_buf; bool mask_from_file; char **masks; u32 masks_pos; u32 masks_cnt; u32 masks_avail; char *mask; mf_t *mfs; } mask_ctx_t; typedef struct cpt_ctx { bool enabled; cpt_t *cpt_buf; int cpt_pos; hc_time_t cpt_start; u64 cpt_total; } cpt_ctx_t; typedef struct device_info { bool skipped_dev; double hashes_msec_dev; double hashes_msec_dev_benchmark; double exec_msec_dev; char *speed_sec_dev; char *guess_candidates_dev; char *hwmon_dev; int corespeed_dev; int memoryspeed_dev; double runtime_msec_dev; int progress_dev; } device_info_t; typedef struct hashcat_status { const char *hash_target; char *hash_type; int guess_mode; char *guess_base; int guess_base_offset; int guess_base_count; double guess_base_percent; char *guess_mod; int guess_mod_offset; int guess_mod_count; double guess_mod_percent; char *guess_charset; int guess_mask_length; char *session; char *status_string; int status_number; char *time_estimated_absolute; char *time_estimated_relative; char *time_started_absolute; char *time_started_relative; double msec_paused; double msec_running; double msec_real; int digests_cnt; int digests_done; double digests_percent; int salts_cnt; int salts_done; double salts_percent; int progress_mode; double progress_finished_percent; u64 progress_cur; u64 progress_cur_relative_skip; u64 progress_done; u64 progress_end; u64 progress_end_relative_skip; u64 progress_ignore; u64 progress_rejected; double progress_rejected_percent; u64 progress_restored; u64 progress_skip; u64 restore_point; u64 restore_total; double restore_percent; int cpt_cur_min; int cpt_cur_hour; int cpt_cur_day; double cpt_avg_min; double cpt_avg_hour; double cpt_avg_day; char *cpt; device_info_t device_info_buf[DEVICES_MAX]; int device_info_cnt; int device_info_active; double hashes_msec_all; double exec_msec_all; char *speed_sec_all; } hashcat_status_t; typedef struct status_ctx { /** * main status */ bool accessible; u32 devices_status; /** * full (final) status snapshot */ hashcat_status_t *hashcat_status_final; /** * thread control */ bool run_main_level1; bool run_main_level2; bool run_main_level3; bool run_thread_level1; bool run_thread_level2; bool shutdown_inner; bool shutdown_outer; bool checkpoint_shutdown; hc_thread_mutex_t mux_dispatcher; hc_thread_mutex_t mux_counter; hc_thread_mutex_t mux_hwmon; hc_thread_mutex_t mux_display; /** * workload */ u64 words_off; // used by dispatcher; get_work () as offset; attention: needs to be redone on in restore case! u64 words_cur; // used by dispatcher; the different to words_cur_next is that this counter guarantees that the work from zero to this counter has been actually computed // has been finished actually, can be used for restore point therefore u64 words_base; // the unamplified max keyspace u64 words_cnt; // the amplified max keyspace /** * progress */ u64 *words_progress_done; // progress number of words done per salt u64 *words_progress_rejected; // progress number of words rejected per salt u64 *words_progress_restored; // progress number of words restored per salt /** * timer */ hc_time_t runtime_start; hc_time_t runtime_stop; hc_timer_t timer_running; // timer on current dict hc_timer_t timer_paused; // timer on current dict double msec_paused; // timer on current dict } status_ctx_t; typedef struct hashcat_user { // use this for context specific data // see main.c as how this example is used int outer_threads_cnt; hc_thread_t *outer_threads; } hashcat_user_t; typedef struct cache_hit { char *dictfile; hc_stat_t stat; u64 cached_cnt; u64 keyspace; } cache_hit_t; typedef struct cache_generate { char *dictfile; double percent; u64 comp; u64 cnt; u64 cnt2; hc_time_t runtime; } cache_generate_t; typedef struct hashlist_parse { u32 hashes_cnt; u32 hashes_avail; } hashlist_parse_t; #define MAX_OLD_EVENTS 10 typedef struct event_ctx { char old_buf[MAX_OLD_EVENTS][HCBUFSIZ_TINY]; int old_len[MAX_OLD_EVENTS]; int old_cnt; char msg_buf[HCBUFSIZ_TINY]; int msg_len; bool msg_newline; int prev_len; hc_thread_mutex_t mux_event; } event_ctx_t; typedef struct hashcat_ctx { bitmap_ctx_t *bitmap_ctx; combinator_ctx_t *combinator_ctx; cpt_ctx_t *cpt_ctx; debugfile_ctx_t *debugfile_ctx; dictstat_ctx_t *dictstat_ctx; event_ctx_t *event_ctx; folder_config_t *folder_config; hashcat_user_t *hashcat_user; hashconfig_t *hashconfig; hashes_t *hashes; hwmon_ctx_t *hwmon_ctx; induct_ctx_t *induct_ctx; logfile_ctx_t *logfile_ctx; loopback_ctx_t *loopback_ctx; mask_ctx_t *mask_ctx; opencl_ctx_t *opencl_ctx; outcheck_ctx_t *outcheck_ctx; outfile_ctx_t *outfile_ctx; pidfile_ctx_t *pidfile_ctx; potfile_ctx_t *potfile_ctx; restore_ctx_t *restore_ctx; status_ctx_t *status_ctx; straight_ctx_t *straight_ctx; tuning_db_t *tuning_db; user_options_extra_t *user_options_extra; user_options_t *user_options; wl_data_t *wl_data; void (*event) (const u32, struct hashcat_ctx *, const void *, const size_t); } hashcat_ctx_t; typedef struct thread_param { u32 tid; hashcat_ctx_t *hashcat_ctx; } thread_param_t; #endif // _TYPES_H hashcat-4.0.1/include/usage.h000066400000000000000000000003771320027462700160410ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _USAGE_H #define _USAGE_H #include #include void usage_mini_print (const char *progname); void usage_big_print (const char *progname); #endif // _USAGE_H hashcat-4.0.1/include/user_options.h000066400000000000000000000016631320027462700174650ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _USER_OPTIONS_H #define _USER_OPTIONS_H #include int user_options_init (hashcat_ctx_t *hashcat_ctx); void user_options_destroy (hashcat_ctx_t *hashcat_ctx); int user_options_getopt (hashcat_ctx_t *hashcat_ctx, int argc, char **argv); int user_options_sanity (hashcat_ctx_t *hashcat_ctx); void user_options_session_auto (hashcat_ctx_t *hashcat_ctx); void user_options_preprocess (hashcat_ctx_t *hashcat_ctx); void user_options_postprocess (hashcat_ctx_t *hashcat_ctx); void user_options_extra_init (hashcat_ctx_t *hashcat_ctx); void user_options_extra_destroy (hashcat_ctx_t *hashcat_ctx); u64 user_options_extra_amplifier (hashcat_ctx_t *hashcat_ctx); void user_options_logger (hashcat_ctx_t *hashcat_ctx); int user_options_check_files (hashcat_ctx_t *hashcat_ctx); void user_options_info (hashcat_ctx_t *hashcat_ctx); #endif // _USER_OPTIONS_H hashcat-4.0.1/include/wordlist.h000066400000000000000000000015701320027462700166000ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #ifndef _WORDLIST_H #define _WORDLIST_H #include #include u32 convert_from_hex (hashcat_ctx_t *hashcat_ctx, char *line_buf, const u32 line_len); void pw_add (hc_device_param_t *device_param, const u8 *pw_buf, const int pw_len); void get_next_word_lm (char *buf, u64 sz, u64 *len, u64 *off); void get_next_word_uc (char *buf, u64 sz, u64 *len, u64 *off); void get_next_word_std (char *buf, u64 sz, u64 *len, u64 *off); void get_next_word (hashcat_ctx_t *hashcat_ctx, FILE *fd, char **out_buf, u32 *out_len); int load_segment (hashcat_ctx_t *hashcat_ctx, FILE *fd); int count_words (hashcat_ctx_t *hashcat_ctx, FILE *fd, const char *dictfile, u64 *result); int wl_data_init (hashcat_ctx_t *hashcat_ctx); void wl_data_destroy (hashcat_ctx_t *hashcat_ctx); #endif // _WORDLIST_H hashcat-4.0.1/masks/000077500000000000000000000000001320027462700142505ustar00rootroot00000000000000hashcat-4.0.1/masks/8char-1l-1u-1d-1s-compliant.hcmask000066400000000000000000025133701320027462700221240ustar00rootroot00000000000000?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 hashcat-4.0.1/masks/8char-1l-1u-1d-1s-noncompliant.hcmask000066400000000000000000014644101320027462700226360ustar00rootroot00000000000000?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 hashcat-4.0.1/masks/rockyou-1-60.hcmask000066400000000000000000000236701320027462700175240ustar00rootroot00000000000000?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?dhashcat-4.0.1/masks/rockyou-2-1800.hcmask000066400000000000000000001155421320027462700176700ustar00rootroot00000000000000?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 hashcat-4.0.1/masks/rockyou-3-3600.hcmask000066400000000000000000001526531320027462700176750ustar00rootroot00000000000000?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 hashcat-4.0.1/masks/rockyou-4-43200.hcmask000066400000000000000000003356351320027462700177610ustar00rootroot00000000000000?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 hashcat-4.0.1/masks/rockyou-5-86400.hcmask000066400000000000000000004724131320027462700177670ustar00rootroot00000000000000?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 hashcat-4.0.1/masks/rockyou-6-864000.hcmask000066400000000000000000010400451320027462700200410ustar00rootroot00000000000000?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 hashcat-4.0.1/masks/rockyou-7-2592000.hcmask000066400000000000000000014604151320027462700201310ustar00rootroot00000000000000?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 hashcat-4.0.1/obj/000077500000000000000000000000001320027462700137045ustar00rootroot00000000000000hashcat-4.0.1/obj/lzma_sdk/000077500000000000000000000000001320027462700155105ustar00rootroot00000000000000hashcat-4.0.1/obj/lzma_sdk/.lock000066400000000000000000000000001320027462700164270ustar00rootroot00000000000000hashcat-4.0.1/rules/000077500000000000000000000000001320027462700142645ustar00rootroot00000000000000hashcat-4.0.1/rules/Incisive-leetspeak.rule000066400000000000000000011342771320027462700207200ustar00rootroot00000000000000sa@ 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~ hashcat-4.0.1/rules/InsidePro-PasswordsPro.rule000066400000000000000000000460261320027462700215250ustar00rootroot00000000000000## 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 ci11i32 ci11i32i53 ci11i32i53i74 ci11i32i53i74i95 ci11i32i53i74i95iB6 ci11i32i53i74i95iB6iD7 ci11i31 ci11i31i51 ci11i31i51i71 ci11i31i51i71i91 ci11i31i51i71i91iB1 ci10i31 ci10i31i52 ci10i31i52i73 ci10i31i52i73i94 ui11i32 ui11i32i53 ui11i32i53i74 ui11i32i53i74i95 ui11i32i53i74i95iB6 ui11i32i53i74i95iB6iD7 ui11i31 ui11i31i51 ui11i31i51i71 ui11i31i51i71i91 ui11i31i51i71i91iB1 ui10i31 ui10i31i52 ui10i31i52i73 ui10i31i52i73i94 $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^- ^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. $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! 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! 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 hashcat-4.0.1/rules/T0XlC-insert_00-99_1950-2050_toprules_0_F.rule000066400000000000000000001751041320027462700236020ustar00rootroot00000000000000# Created by: T0XlC # 00-99,1950-2050 shifted from position 0 to position F # In memory of d3ad0ne i01 i19 i23 i30 i11 i29 i33 i40 i21 i39 i43 i50 i31 i49 i53 i60 i41 i59 i63 i70 i51 i69 i73 i80 i61 i79 i83 i90 i71 i89 i93 iA0 i81 i99 iA3 iB0 i91 iA9 iB3 iC0 iA1 iB9 iC3 iD0 iB1 iC9 iD3 iE0 iC1 iD9 iE3 iF0 iD1 iE9 iF3 iG0 iE1 iF9 iG3 iH0 iF1 iG9 iH3 iI0 iG1 iH9 iI3 iJ0 iH1 iI9 iJ3 iK0 iI1 iJ9 iK3 iL0 iJ1 iK9 iL3 iM0 iK1 iL9 iM3 iN0 iL1 iM9 iN3 iO0 iM1 iN9 iO3 iP0 iN1 iO9 iP3 iQ0 iO1 iP9 iQ3 iR0 iP1 iQ9 iR3 iS0 iQ1 iR9 iS3 iT0 iR1 iS9 iT3 iU0 iS1 iT9 iU3 iV0 iT1 iU9 iV3 iW0 iU1 iV9 iW3 iX0 iV1 iW9 iX3 iY0 iW1 iX9 iY3 iZ0 i01 i19 i23 i31 i11 i29 i33 i41 i21 i39 i43 i51 i31 i49 i53 i61 i41 i59 i63 i71 i51 i69 i73 i81 i61 i79 i83 i91 i71 i89 i93 iA1 i81 i99 iA3 iB1 i91 iA9 iB3 iC1 iA1 iB9 iC3 iD1 iB1 iC9 iD3 iE1 iC1 iD9 iE3 iF1 iD1 iE9 iF3 iG1 iE1 iF9 iG3 iH1 iF1 iG9 iH3 iI1 iG1 iH9 iI3 iJ1 iH1 iI9 iJ3 iK1 iI1 iJ9 iK3 iL1 iJ1 iK9 iL3 iM1 iK1 iL9 iM3 iN1 iL1 iM9 iN3 iO1 iM1 iN9 iO3 iP1 iN1 iO9 iP3 iQ1 iO1 iP9 iQ3 iR1 iP1 iQ9 iR3 iS1 iQ1 iR9 iS3 iT1 iR1 iS9 iT3 iU1 iS1 iT9 iU3 iV1 iT1 iU9 iV3 iW1 iU1 iV9 iW3 iX1 iV1 iW9 iX3 iY1 iW1 iX9 iY3 iZ1 i01 i19 i23 i32 i11 i29 i33 i42 i21 i39 i43 i52 i31 i49 i53 i62 i41 i59 i63 i72 i51 i69 i73 i82 i61 i79 i83 i92 i71 i89 i93 iA2 i81 i99 iA3 iB2 i91 iA9 iB3 iC2 iA1 iB9 iC3 iD2 iB1 iC9 iD3 iE2 iC1 iD9 iE3 iF2 iD1 iE9 iF3 iG2 iE1 iF9 iG3 iH2 iF1 iG9 iH3 iI2 iG1 iH9 iI3 iJ2 iH1 iI9 iJ3 iK2 iI1 iJ9 iK3 iL2 iJ1 iK9 iL3 iM2 iK1 iL9 iM3 iN2 iL1 iM9 iN3 iO2 iM1 iN9 iO3 iP2 iN1 iO9 iP3 iQ2 iO1 iP9 iQ3 iR2 iP1 iQ9 iR3 iS2 iQ1 iR9 iS3 iT2 iR1 iS9 iT3 iU2 iS1 iT9 iU3 iV2 iT1 iU9 iV3 iW2 iU1 iV9 iW3 iX2 iV1 iW9 iX3 iY2 iW1 iX9 iY3 iZ2 i01 i19 i23 i33 i11 i29 i33 i43 i21 i39 i43 i53 i31 i49 i53 i63 i41 i59 i63 i73 i51 i69 i73 i83 i61 i79 i83 i93 i71 i89 i93 iA3 i81 i99 iA3 iB3 i91 iA9 iB3 iC3 iA1 iB9 iC3 iD3 iB1 iC9 iD3 iE3 iC1 iD9 iE3 iF3 iD1 iE9 iF3 iG3 iE1 iF9 iG3 iH3 iF1 iG9 iH3 iI3 iG1 iH9 iI3 iJ3 iH1 iI9 iJ3 iK3 iI1 iJ9 iK3 iL3 iJ1 iK9 iL3 iM3 iK1 iL9 iM3 iN3 iL1 iM9 iN3 iO3 iM1 iN9 iO3 iP3 iN1 iO9 iP3 iQ3 iO1 iP9 iQ3 iR3 iP1 iQ9 iR3 iS3 iQ1 iR9 iS3 iT3 iR1 iS9 iT3 iU3 iS1 iT9 iU3 iV3 iT1 iU9 iV3 iW3 iU1 iV9 iW3 iX3 iV1 iW9 iX3 iY3 iW1 iX9 iY3 iZ3 i01 i19 i23 i34 i11 i29 i33 i44 i21 i39 i43 i54 i31 i49 i53 i64 i41 i59 i63 i74 i51 i69 i73 i84 i61 i79 i83 i94 i71 i89 i93 iA4 i81 i99 iA3 iB4 i91 iA9 iB3 iC4 iA1 iB9 iC3 iD4 iB1 iC9 iD3 iE4 iC1 iD9 iE3 iF4 iD1 iE9 iF3 iG4 iE1 iF9 iG3 iH4 iF1 iG9 iH3 iI4 iG1 iH9 iI3 iJ4 iH1 iI9 iJ3 iK4 iI1 iJ9 iK3 iL4 iJ1 iK9 iL3 iM4 iK1 iL9 iM3 iN4 iL1 iM9 iN3 iO4 iM1 iN9 iO3 iP4 iN1 iO9 iP3 iQ4 iO1 iP9 iQ3 iR4 iP1 iQ9 iR3 iS4 iQ1 iR9 iS3 iT4 iR1 iS9 iT3 iU4 iS1 iT9 iU3 iV4 iT1 iU9 iV3 iW4 iU1 iV9 iW3 iX4 iV1 iW9 iX3 iY4 iW1 iX9 iY3 iZ4 i01 i19 i23 i35 i11 i29 i33 i45 i21 i39 i43 i55 i31 i49 i53 i65 i41 i59 i63 i75 i51 i69 i73 i85 i61 i79 i83 i95 i71 i89 i93 iA5 i81 i99 iA3 iB5 i91 iA9 iB3 iC5 iA1 iB9 iC3 iD5 iB1 iC9 iD3 iE5 iC1 iD9 iE3 iF5 iD1 iE9 iF3 iG5 iE1 iF9 iG3 iH5 iF1 iG9 iH3 iI5 iG1 iH9 iI3 iJ5 iH1 iI9 iJ3 iK5 iI1 iJ9 iK3 iL5 iJ1 iK9 iL3 iM5 iK1 iL9 iM3 iN5 iL1 iM9 iN3 iO5 iM1 iN9 iO3 iP5 iN1 iO9 iP3 iQ5 iO1 iP9 iQ3 iR5 iP1 iQ9 iR3 iS5 iQ1 iR9 iS3 iT5 iR1 iS9 iT3 iU5 iS1 iT9 iU3 iV5 iT1 iU9 iV3 iW5 iU1 iV9 iW3 iX5 iV1 iW9 iX3 iY5 iW1 iX9 iY3 iZ5 i01 i19 i23 i36 i11 i29 i33 i46 i21 i39 i43 i56 i31 i49 i53 i66 i41 i59 i63 i76 i51 i69 i73 i86 i61 i79 i83 i96 i71 i89 i93 iA6 i81 i99 iA3 iB6 i91 iA9 iB3 iC6 iA1 iB9 iC3 iD6 iB1 iC9 iD3 iE6 iC1 iD9 iE3 iF6 iD1 iE9 iF3 iG6 iE1 iF9 iG3 iH6 iF1 iG9 iH3 iI6 iG1 iH9 iI3 iJ6 iH1 iI9 iJ3 iK6 iI1 iJ9 iK3 iL6 iJ1 iK9 iL3 iM6 iK1 iL9 iM3 iN6 iL1 iM9 iN3 iO6 iM1 iN9 iO3 iP6 iN1 iO9 iP3 iQ6 iO1 iP9 iQ3 iR6 iP1 iQ9 iR3 iS6 iQ1 iR9 iS3 iT6 iR1 iS9 iT3 iU6 iS1 iT9 iU3 iV6 iT1 iU9 iV3 iW6 iU1 iV9 iW3 iX6 iV1 iW9 iX3 iY6 iW1 iX9 iY3 iZ6 i01 i19 i23 i37 i11 i29 i33 i47 i21 i39 i43 i57 i31 i49 i53 i67 i41 i59 i63 i77 i51 i69 i73 i87 i61 i79 i83 i97 i71 i89 i93 iA7 i81 i99 iA3 iB7 i91 iA9 iB3 iC7 iA1 iB9 iC3 iD7 iB1 iC9 iD3 iE7 iC1 iD9 iE3 iF7 iD1 iE9 iF3 iG7 iE1 iF9 iG3 iH7 iF1 iG9 iH3 iI7 iG1 iH9 iI3 iJ7 iH1 iI9 iJ3 iK7 iI1 iJ9 iK3 iL7 iJ1 iK9 iL3 iM7 iK1 iL9 iM3 iN7 iL1 iM9 iN3 iO7 iM1 iN9 iO3 iP7 iN1 iO9 iP3 iQ7 iO1 iP9 iQ3 iR7 iP1 iQ9 iR3 iS7 iQ1 iR9 iS3 iT7 iR1 iS9 iT3 iU7 iS1 iT9 iU3 iV7 iT1 iU9 iV3 iW7 iU1 iV9 iW3 iX7 iV1 iW9 iX3 iY7 iW1 iX9 iY3 iZ7 i01 i19 i23 i38 i11 i29 i33 i48 i21 i39 i43 i58 i31 i49 i53 i68 i41 i59 i63 i78 i51 i69 i73 i88 i61 i79 i83 i98 i71 i89 i93 iA8 i81 i99 iA3 iB8 i91 iA9 iB3 iC8 iA1 iB9 iC3 iD8 iB1 iC9 iD3 iE8 iC1 iD9 iE3 iF8 iD1 iE9 iF3 iG8 iE1 iF9 iG3 iH8 iF1 iG9 iH3 iI8 iG1 iH9 iI3 iJ8 iH1 iI9 iJ3 iK8 iI1 iJ9 iK3 iL8 iJ1 iK9 iL3 iM8 iK1 iL9 iM3 iN8 iL1 iM9 iN3 iO8 iM1 iN9 iO3 iP8 iN1 iO9 iP3 iQ8 iO1 iP9 iQ3 iR8 iP1 iQ9 iR3 iS8 iQ1 iR9 iS3 iT8 iR1 iS9 iT3 iU8 iS1 iT9 iU3 iV8 iT1 iU9 iV3 iW8 iU1 iV9 iW3 iX8 iV1 iW9 iX3 iY8 iW1 iX9 iY3 iZ8 i01 i19 i23 i39 i11 i29 i33 i49 i21 i39 i43 i59 i31 i49 i53 i69 i41 i59 i63 i79 i51 i69 i73 i89 i61 i79 i83 i99 i71 i89 i93 iA9 i81 i99 iA3 iB9 i91 iA9 iB3 iC9 iA1 iB9 iC3 iD9 iB1 iC9 iD3 iE9 iC1 iD9 iE3 iF9 iD1 iE9 iF3 iG9 iE1 iF9 iG3 iH9 iF1 iG9 iH3 iI9 iG1 iH9 iI3 iJ9 iH1 iI9 iJ3 iK9 iI1 iJ9 iK3 iL9 iJ1 iK9 iL3 iM9 iK1 iL9 iM3 iN9 iL1 iM9 iN3 iO9 iM1 iN9 iO3 iP9 iN1 iO9 iP3 iQ9 iO1 iP9 iQ3 iR9 iP1 iQ9 iR3 iS9 iQ1 iR9 iS3 iT9 iR1 iS9 iT3 iU9 iS1 iT9 iU3 iV9 iT1 iU9 iV3 iW9 iU1 iV9 iW3 iX9 iV1 iW9 iX3 iY9 iW1 iX9 iY3 iZ9 i01 i19 i24 i30 i11 i29 i34 i40 i21 i39 i44 i50 i31 i49 i54 i60 i41 i59 i64 i70 i51 i69 i74 i80 i61 i79 i84 i90 i71 i89 i94 iA0 i81 i99 iA4 iB0 i91 iA9 iB4 iC0 iA1 iB9 iC4 iD0 iB1 iC9 iD4 iE0 iC1 iD9 iE4 iF0 iD1 iE9 iF4 iG0 iE1 iF9 iG4 iH0 iF1 iG9 iH4 iI0 iG1 iH9 iI4 iJ0 iH1 iI9 iJ4 iK0 iI1 iJ9 iK4 iL0 iJ1 iK9 iL4 iM0 iK1 iL9 iM4 iN0 iL1 iM9 iN4 iO0 iM1 iN9 iO4 iP0 iN1 iO9 iP4 iQ0 iO1 iP9 iQ4 iR0 iP1 iQ9 iR4 iS0 iQ1 iR9 iS4 iT0 iR1 iS9 iT4 iU0 iS1 iT9 iU4 iV0 iT1 iU9 iV4 iW0 iU1 iV9 iW4 iX0 iV1 iW9 iX4 iY0 iW1 iX9 iY4 iZ0 i01 i19 i24 i31 i11 i29 i34 i41 i21 i39 i44 i51 i31 i49 i54 i61 i41 i59 i64 i71 i51 i69 i74 i81 i61 i79 i84 i91 i71 i89 i94 iA1 i81 i99 iA4 iB1 i91 iA9 iB4 iC1 iA1 iB9 iC4 iD1 iB1 iC9 iD4 iE1 iC1 iD9 iE4 iF1 iD1 iE9 iF4 iG1 iE1 iF9 iG4 iH1 iF1 iG9 iH4 iI1 iG1 iH9 iI4 iJ1 iH1 iI9 iJ4 iK1 iI1 iJ9 iK4 iL1 iJ1 iK9 iL4 iM1 iK1 iL9 iM4 iN1 iL1 iM9 iN4 iO1 iM1 iN9 iO4 iP1 iN1 iO9 iP4 iQ1 iO1 iP9 iQ4 iR1 iP1 iQ9 iR4 iS1 iQ1 iR9 iS4 iT1 iR1 iS9 iT4 iU1 iS1 iT9 iU4 iV1 iT1 iU9 iV4 iW1 iU1 iV9 iW4 iX1 iV1 iW9 iX4 iY1 iW1 iX9 iY4 iZ1 i01 i19 i24 i32 i11 i29 i34 i42 i21 i39 i44 i52 i31 i49 i54 i62 i41 i59 i64 i72 i51 i69 i74 i82 i61 i79 i84 i92 i71 i89 i94 iA2 i81 i99 iA4 iB2 i91 iA9 iB4 iC2 iA1 iB9 iC4 iD2 iB1 iC9 iD4 iE2 iC1 iD9 iE4 iF2 iD1 iE9 iF4 iG2 iE1 iF9 iG4 iH2 iF1 iG9 iH4 iI2 iG1 iH9 iI4 iJ2 iH1 iI9 iJ4 iK2 iI1 iJ9 iK4 iL2 iJ1 iK9 iL4 iM2 iK1 iL9 iM4 iN2 iL1 iM9 iN4 iO2 iM1 iN9 iO4 iP2 iN1 iO9 iP4 iQ2 iO1 iP9 iQ4 iR2 iP1 iQ9 iR4 iS2 iQ1 iR9 iS4 iT2 iR1 iS9 iT4 iU2 iS1 iT9 iU4 iV2 iT1 iU9 iV4 iW2 iU1 iV9 iW4 iX2 iV1 iW9 iX4 iY2 iW1 iX9 iY4 iZ2 i01 i19 i24 i33 i11 i29 i34 i43 i21 i39 i44 i53 i31 i49 i54 i63 i41 i59 i64 i73 i51 i69 i74 i83 i61 i79 i84 i93 i71 i89 i94 iA3 i81 i99 iA4 iB3 i91 iA9 iB4 iC3 iA1 iB9 iC4 iD3 iB1 iC9 iD4 iE3 iC1 iD9 iE4 iF3 iD1 iE9 iF4 iG3 iE1 iF9 iG4 iH3 iF1 iG9 iH4 iI3 iG1 iH9 iI4 iJ3 iH1 iI9 iJ4 iK3 iI1 iJ9 iK4 iL3 iJ1 iK9 iL4 iM3 iK1 iL9 iM4 iN3 iL1 iM9 iN4 iO3 iM1 iN9 iO4 iP3 iN1 iO9 iP4 iQ3 iO1 iP9 iQ4 iR3 iP1 iQ9 iR4 iS3 iQ1 iR9 iS4 iT3 iR1 iS9 iT4 iU3 iS1 iT9 iU4 iV3 iT1 iU9 iV4 iW3 iU1 iV9 iW4 iX3 iV1 iW9 iX4 iY3 iW1 iX9 iY4 iZ3 i01 i19 i24 i34 i11 i29 i34 i44 i21 i39 i44 i54 i31 i49 i54 i64 i41 i59 i64 i74 i51 i69 i74 i84 i61 i79 i84 i94 i71 i89 i94 iA4 i81 i99 iA4 iB4 i91 iA9 iB4 iC4 iA1 iB9 iC4 iD4 iB1 iC9 iD4 iE4 iC1 iD9 iE4 iF4 iD1 iE9 iF4 iG4 iE1 iF9 iG4 iH4 iF1 iG9 iH4 iI4 iG1 iH9 iI4 iJ4 iH1 iI9 iJ4 iK4 iI1 iJ9 iK4 iL4 iJ1 iK9 iL4 iM4 iK1 iL9 iM4 iN4 iL1 iM9 iN4 iO4 iM1 iN9 iO4 iP4 iN1 iO9 iP4 iQ4 iO1 iP9 iQ4 iR4 iP1 iQ9 iR4 iS4 iQ1 iR9 iS4 iT4 iR1 iS9 iT4 iU4 iS1 iT9 iU4 iV4 iT1 iU9 iV4 iW4 iU1 iV9 iW4 iX4 iV1 iW9 iX4 iY4 iW1 iX9 iY4 iZ4 i01 i19 i24 i35 i11 i29 i34 i45 i21 i39 i44 i55 i31 i49 i54 i65 i41 i59 i64 i75 i51 i69 i74 i85 i61 i79 i84 i95 i71 i89 i94 iA5 i81 i99 iA4 iB5 i91 iA9 iB4 iC5 iA1 iB9 iC4 iD5 iB1 iC9 iD4 iE5 iC1 iD9 iE4 iF5 iD1 iE9 iF4 iG5 iE1 iF9 iG4 iH5 iF1 iG9 iH4 iI5 iG1 iH9 iI4 iJ5 iH1 iI9 iJ4 iK5 iI1 iJ9 iK4 iL5 iJ1 iK9 iL4 iM5 iK1 iL9 iM4 iN5 iL1 iM9 iN4 iO5 iM1 iN9 iO4 iP5 iN1 iO9 iP4 iQ5 iO1 iP9 iQ4 iR5 iP1 iQ9 iR4 iS5 iQ1 iR9 iS4 iT5 iR1 iS9 iT4 iU5 iS1 iT9 iU4 iV5 iT1 iU9 iV4 iW5 iU1 iV9 iW4 iX5 iV1 iW9 iX4 iY5 iW1 iX9 iY4 iZ5 i01 i19 i24 i36 i11 i29 i34 i46 i21 i39 i44 i56 i31 i49 i54 i66 i41 i59 i64 i76 i51 i69 i74 i86 i61 i79 i84 i96 i71 i89 i94 iA6 i81 i99 iA4 iB6 i91 iA9 iB4 iC6 iA1 iB9 iC4 iD6 iB1 iC9 iD4 iE6 iC1 iD9 iE4 iF6 iD1 iE9 iF4 iG6 iE1 iF9 iG4 iH6 iF1 iG9 iH4 iI6 iG1 iH9 iI4 iJ6 iH1 iI9 iJ4 iK6 iI1 iJ9 iK4 iL6 iJ1 iK9 iL4 iM6 iK1 iL9 iM4 iN6 iL1 iM9 iN4 iO6 iM1 iN9 iO4 iP6 iN1 iO9 iP4 iQ6 iO1 iP9 iQ4 iR6 iP1 iQ9 iR4 iS6 iQ1 iR9 iS4 iT6 iR1 iS9 iT4 iU6 iS1 iT9 iU4 iV6 iT1 iU9 iV4 iW6 iU1 iV9 iW4 iX6 iV1 iW9 iX4 iY6 iW1 iX9 iY4 iZ6 i01 i19 i24 i37 i11 i29 i34 i47 i21 i39 i44 i57 i31 i49 i54 i67 i41 i59 i64 i77 i51 i69 i74 i87 i61 i79 i84 i97 i71 i89 i94 iA7 i81 i99 iA4 iB7 i91 iA9 iB4 iC7 iA1 iB9 iC4 iD7 iB1 iC9 iD4 iE7 iC1 iD9 iE4 iF7 iD1 iE9 iF4 iG7 iE1 iF9 iG4 iH7 iF1 iG9 iH4 iI7 iG1 iH9 iI4 iJ7 iH1 iI9 iJ4 iK7 iI1 iJ9 iK4 iL7 iJ1 iK9 iL4 iM7 iK1 iL9 iM4 iN7 iL1 iM9 iN4 iO7 iM1 iN9 iO4 iP7 iN1 iO9 iP4 iQ7 iO1 iP9 iQ4 iR7 iP1 iQ9 iR4 iS7 iQ1 iR9 iS4 iT7 iR1 iS9 iT4 iU7 iS1 iT9 iU4 iV7 iT1 iU9 iV4 iW7 iU1 iV9 iW4 iX7 iV1 iW9 iX4 iY7 iW1 iX9 iY4 iZ7 i01 i19 i24 i38 i11 i29 i34 i48 i21 i39 i44 i58 i31 i49 i54 i68 i41 i59 i64 i78 i51 i69 i74 i88 i61 i79 i84 i98 i71 i89 i94 iA8 i81 i99 iA4 iB8 i91 iA9 iB4 iC8 iA1 iB9 iC4 iD8 iB1 iC9 iD4 iE8 iC1 iD9 iE4 iF8 iD1 iE9 iF4 iG8 iE1 iF9 iG4 iH8 iF1 iG9 iH4 iI8 iG1 iH9 iI4 iJ8 iH1 iI9 iJ4 iK8 iI1 iJ9 iK4 iL8 iJ1 iK9 iL4 iM8 iK1 iL9 iM4 iN8 iL1 iM9 iN4 iO8 iM1 iN9 iO4 iP8 iN1 iO9 iP4 iQ8 iO1 iP9 iQ4 iR8 iP1 iQ9 iR4 iS8 iQ1 iR9 iS4 iT8 iR1 iS9 iT4 iU8 iS1 iT9 iU4 iV8 iT1 iU9 iV4 iW8 iU1 iV9 iW4 iX8 iV1 iW9 iX4 iY8 iW1 iX9 iY4 iZ8 i01 i19 i24 i39 i11 i29 i34 i49 i21 i39 i44 i59 i31 i49 i54 i69 i41 i59 i64 i79 i51 i69 i74 i89 i61 i79 i84 i99 i71 i89 i94 iA9 i81 i99 iA4 iB9 i91 iA9 iB4 iC9 iA1 iB9 iC4 iD9 iB1 iC9 iD4 iE9 iC1 iD9 iE4 iF9 iD1 iE9 iF4 iG9 iE1 iF9 iG4 iH9 iF1 iG9 iH4 iI9 iG1 iH9 iI4 iJ9 iH1 iI9 iJ4 iK9 iI1 iJ9 iK4 iL9 iJ1 iK9 iL4 iM9 iK1 iL9 iM4 iN9 iL1 iM9 iN4 iO9 iM1 iN9 iO4 iP9 iN1 iO9 iP4 iQ9 iO1 iP9 iQ4 iR9 iP1 iQ9 iR4 iS9 iQ1 iR9 iS4 iT9 iR1 iS9 iT4 iU9 iS1 iT9 iU4 iV9 iT1 iU9 iV4 iW9 iU1 iV9 iW4 iX9 iV1 iW9 iX4 iY9 iW1 iX9 iY4 iZ9 i01 i19 i25 i30 i11 i29 i35 i40 i21 i39 i45 i50 i31 i49 i55 i60 i41 i59 i65 i70 i51 i69 i75 i80 i61 i79 i85 i90 i71 i89 i95 iA0 i81 i99 iA5 iB0 i91 iA9 iB5 iC0 iA1 iB9 iC5 iD0 iB1 iC9 iD5 iE0 iC1 iD9 iE5 iF0 iD1 iE9 iF5 iG0 iE1 iF9 iG5 iH0 iF1 iG9 iH5 iI0 iG1 iH9 iI5 iJ0 iH1 iI9 iJ5 iK0 iI1 iJ9 iK5 iL0 iJ1 iK9 iL5 iM0 iK1 iL9 iM5 iN0 iL1 iM9 iN5 iO0 iM1 iN9 iO5 iP0 iN1 iO9 iP5 iQ0 iO1 iP9 iQ5 iR0 iP1 iQ9 iR5 iS0 iQ1 iR9 iS5 iT0 iR1 iS9 iT5 iU0 iS1 iT9 iU5 iV0 iT1 iU9 iV5 iW0 iU1 iV9 iW5 iX0 iV1 iW9 iX5 iY0 iW1 iX9 iY5 iZ0 i01 i19 i25 i31 i11 i29 i35 i41 i21 i39 i45 i51 i31 i49 i55 i61 i41 i59 i65 i71 i51 i69 i75 i81 i61 i79 i85 i91 i71 i89 i95 iA1 i81 i99 iA5 iB1 i91 iA9 iB5 iC1 iA1 iB9 iC5 iD1 iB1 iC9 iD5 iE1 iC1 iD9 iE5 iF1 iD1 iE9 iF5 iG1 iE1 iF9 iG5 iH1 iF1 iG9 iH5 iI1 iG1 iH9 iI5 iJ1 iH1 iI9 iJ5 iK1 iI1 iJ9 iK5 iL1 iJ1 iK9 iL5 iM1 iK1 iL9 iM5 iN1 iL1 iM9 iN5 iO1 iM1 iN9 iO5 iP1 iN1 iO9 iP5 iQ1 iO1 iP9 iQ5 iR1 iP1 iQ9 iR5 iS1 iQ1 iR9 iS5 iT1 iR1 iS9 iT5 iU1 iS1 iT9 iU5 iV1 iT1 iU9 iV5 iW1 iU1 iV9 iW5 iX1 iV1 iW9 iX5 iY1 iW1 iX9 iY5 iZ1 i01 i19 i25 i32 i11 i29 i35 i42 i21 i39 i45 i52 i31 i49 i55 i62 i41 i59 i65 i72 i51 i69 i75 i82 i61 i79 i85 i92 i71 i89 i95 iA2 i81 i99 iA5 iB2 i91 iA9 iB5 iC2 iA1 iB9 iC5 iD2 iB1 iC9 iD5 iE2 iC1 iD9 iE5 iF2 iD1 iE9 iF5 iG2 iE1 iF9 iG5 iH2 iF1 iG9 iH5 iI2 iG1 iH9 iI5 iJ2 iH1 iI9 iJ5 iK2 iI1 iJ9 iK5 iL2 iJ1 iK9 iL5 iM2 iK1 iL9 iM5 iN2 iL1 iM9 iN5 iO2 iM1 iN9 iO5 iP2 iN1 iO9 iP5 iQ2 iO1 iP9 iQ5 iR2 iP1 iQ9 iR5 iS2 iQ1 iR9 iS5 iT2 iR1 iS9 iT5 iU2 iS1 iT9 iU5 iV2 iT1 iU9 iV5 iW2 iU1 iV9 iW5 iX2 iV1 iW9 iX5 iY2 iW1 iX9 iY5 iZ2 i01 i19 i25 i33 i11 i29 i35 i43 i21 i39 i45 i53 i31 i49 i55 i63 i41 i59 i65 i73 i51 i69 i75 i83 i61 i79 i85 i93 i71 i89 i95 iA3 i81 i99 iA5 iB3 i91 iA9 iB5 iC3 iA1 iB9 iC5 iD3 iB1 iC9 iD5 iE3 iC1 iD9 iE5 iF3 iD1 iE9 iF5 iG3 iE1 iF9 iG5 iH3 iF1 iG9 iH5 iI3 iG1 iH9 iI5 iJ3 iH1 iI9 iJ5 iK3 iI1 iJ9 iK5 iL3 iJ1 iK9 iL5 iM3 iK1 iL9 iM5 iN3 iL1 iM9 iN5 iO3 iM1 iN9 iO5 iP3 iN1 iO9 iP5 iQ3 iO1 iP9 iQ5 iR3 iP1 iQ9 iR5 iS3 iQ1 iR9 iS5 iT3 iR1 iS9 iT5 iU3 iS1 iT9 iU5 iV3 iT1 iU9 iV5 iW3 iU1 iV9 iW5 iX3 iV1 iW9 iX5 iY3 iW1 iX9 iY5 iZ3 i01 i19 i25 i34 i11 i29 i35 i44 i21 i39 i45 i54 i31 i49 i55 i64 i41 i59 i65 i74 i51 i69 i75 i84 i61 i79 i85 i94 i71 i89 i95 iA4 i81 i99 iA5 iB4 i91 iA9 iB5 iC4 iA1 iB9 iC5 iD4 iB1 iC9 iD5 iE4 iC1 iD9 iE5 iF4 iD1 iE9 iF5 iG4 iE1 iF9 iG5 iH4 iF1 iG9 iH5 iI4 iG1 iH9 iI5 iJ4 iH1 iI9 iJ5 iK4 iI1 iJ9 iK5 iL4 iJ1 iK9 iL5 iM4 iK1 iL9 iM5 iN4 iL1 iM9 iN5 iO4 iM1 iN9 iO5 iP4 iN1 iO9 iP5 iQ4 iO1 iP9 iQ5 iR4 iP1 iQ9 iR5 iS4 iQ1 iR9 iS5 iT4 iR1 iS9 iT5 iU4 iS1 iT9 iU5 iV4 iT1 iU9 iV5 iW4 iU1 iV9 iW5 iX4 iV1 iW9 iX5 iY4 iW1 iX9 iY5 iZ4 i01 i19 i25 i35 i11 i29 i35 i45 i21 i39 i45 i55 i31 i49 i55 i65 i41 i59 i65 i75 i51 i69 i75 i85 i61 i79 i85 i95 i71 i89 i95 iA5 i81 i99 iA5 iB5 i91 iA9 iB5 iC5 iA1 iB9 iC5 iD5 iB1 iC9 iD5 iE5 iC1 iD9 iE5 iF5 iD1 iE9 iF5 iG5 iE1 iF9 iG5 iH5 iF1 iG9 iH5 iI5 iG1 iH9 iI5 iJ5 iH1 iI9 iJ5 iK5 iI1 iJ9 iK5 iL5 iJ1 iK9 iL5 iM5 iK1 iL9 iM5 iN5 iL1 iM9 iN5 iO5 iM1 iN9 iO5 iP5 iN1 iO9 iP5 iQ5 iO1 iP9 iQ5 iR5 iP1 iQ9 iR5 iS5 iQ1 iR9 iS5 iT5 iR1 iS9 iT5 iU5 iS1 iT9 iU5 iV5 iT1 iU9 iV5 iW5 iU1 iV9 iW5 iX5 iV1 iW9 iX5 iY5 iW1 iX9 iY5 iZ5 i01 i19 i25 i36 i11 i29 i35 i46 i21 i39 i45 i56 i31 i49 i55 i66 i41 i59 i65 i76 i51 i69 i75 i86 i61 i79 i85 i96 i71 i89 i95 iA6 i81 i99 iA5 iB6 i91 iA9 iB5 iC6 iA1 iB9 iC5 iD6 iB1 iC9 iD5 iE6 iC1 iD9 iE5 iF6 iD1 iE9 iF5 iG6 iE1 iF9 iG5 iH6 iF1 iG9 iH5 iI6 iG1 iH9 iI5 iJ6 iH1 iI9 iJ5 iK6 iI1 iJ9 iK5 iL6 iJ1 iK9 iL5 iM6 iK1 iL9 iM5 iN6 iL1 iM9 iN5 iO6 iM1 iN9 iO5 iP6 iN1 iO9 iP5 iQ6 iO1 iP9 iQ5 iR6 iP1 iQ9 iR5 iS6 iQ1 iR9 iS5 iT6 iR1 iS9 iT5 iU6 iS1 iT9 iU5 iV6 iT1 iU9 iV5 iW6 iU1 iV9 iW5 iX6 iV1 iW9 iX5 iY6 iW1 iX9 iY5 iZ6 i01 i19 i25 i37 i11 i29 i35 i47 i21 i39 i45 i57 i31 i49 i55 i67 i41 i59 i65 i77 i51 i69 i75 i87 i61 i79 i85 i97 i71 i89 i95 iA7 i81 i99 iA5 iB7 i91 iA9 iB5 iC7 iA1 iB9 iC5 iD7 iB1 iC9 iD5 iE7 iC1 iD9 iE5 iF7 iD1 iE9 iF5 iG7 iE1 iF9 iG5 iH7 iF1 iG9 iH5 iI7 iG1 iH9 iI5 iJ7 iH1 iI9 iJ5 iK7 iI1 iJ9 iK5 iL7 iJ1 iK9 iL5 iM7 iK1 iL9 iM5 iN7 iL1 iM9 iN5 iO7 iM1 iN9 iO5 iP7 iN1 iO9 iP5 iQ7 iO1 iP9 iQ5 iR7 iP1 iQ9 iR5 iS7 iQ1 iR9 iS5 iT7 iR1 iS9 iT5 iU7 iS1 iT9 iU5 iV7 iT1 iU9 iV5 iW7 iU1 iV9 iW5 iX7 iV1 iW9 iX5 iY7 iW1 iX9 iY5 iZ7 i01 i19 i25 i38 i11 i29 i35 i48 i21 i39 i45 i58 i31 i49 i55 i68 i41 i59 i65 i78 i51 i69 i75 i88 i61 i79 i85 i98 i71 i89 i95 iA8 i81 i99 iA5 iB8 i91 iA9 iB5 iC8 iA1 iB9 iC5 iD8 iB1 iC9 iD5 iE8 iC1 iD9 iE5 iF8 iD1 iE9 iF5 iG8 iE1 iF9 iG5 iH8 iF1 iG9 iH5 iI8 iG1 iH9 iI5 iJ8 iH1 iI9 iJ5 iK8 iI1 iJ9 iK5 iL8 iJ1 iK9 iL5 iM8 iK1 iL9 iM5 iN8 iL1 iM9 iN5 iO8 iM1 iN9 iO5 iP8 iN1 iO9 iP5 iQ8 iO1 iP9 iQ5 iR8 iP1 iQ9 iR5 iS8 iQ1 iR9 iS5 iT8 iR1 iS9 iT5 iU8 iS1 iT9 iU5 iV8 iT1 iU9 iV5 iW8 iU1 iV9 iW5 iX8 iV1 iW9 iX5 iY8 iW1 iX9 iY5 iZ8 i01 i19 i25 i39 i11 i29 i35 i49 i21 i39 i45 i59 i31 i49 i55 i69 i41 i59 i65 i79 i51 i69 i75 i89 i61 i79 i85 i99 i71 i89 i95 iA9 i81 i99 iA5 iB9 i91 iA9 iB5 iC9 iA1 iB9 iC5 iD9 iB1 iC9 iD5 iE9 iC1 iD9 iE5 iF9 iD1 iE9 iF5 iG9 iE1 iF9 iG5 iH9 iF1 iG9 iH5 iI9 iG1 iH9 iI5 iJ9 iH1 iI9 iJ5 iK9 iI1 iJ9 iK5 iL9 iJ1 iK9 iL5 iM9 iK1 iL9 iM5 iN9 iL1 iM9 iN5 iO9 iM1 iN9 iO5 iP9 iN1 iO9 iP5 iQ9 iO1 iP9 iQ5 iR9 iP1 iQ9 iR5 iS9 iQ1 iR9 iS5 iT9 iR1 iS9 iT5 iU9 iS1 iT9 iU5 iV9 iT1 iU9 iV5 iW9 iU1 iV9 iW5 iX9 iV1 iW9 iX5 iY9 iW1 iX9 iY5 iZ9 i01 i19 i26 i30 i11 i29 i36 i40 i21 i39 i46 i50 i31 i49 i56 i60 i41 i59 i66 i70 i51 i69 i76 i80 i61 i79 i86 i90 i71 i89 i96 iA0 i81 i99 iA6 iB0 i91 iA9 iB6 iC0 iA1 iB9 iC6 iD0 iB1 iC9 iD6 iE0 iC1 iD9 iE6 iF0 iD1 iE9 iF6 iG0 iE1 iF9 iG6 iH0 iF1 iG9 iH6 iI0 iG1 iH9 iI6 iJ0 iH1 iI9 iJ6 iK0 iI1 iJ9 iK6 iL0 iJ1 iK9 iL6 iM0 iK1 iL9 iM6 iN0 iL1 iM9 iN6 iO0 iM1 iN9 iO6 iP0 iN1 iO9 iP6 iQ0 iO1 iP9 iQ6 iR0 iP1 iQ9 iR6 iS0 iQ1 iR9 iS6 iT0 iR1 iS9 iT6 iU0 iS1 iT9 iU6 iV0 iT1 iU9 iV6 iW0 iU1 iV9 iW6 iX0 iV1 iW9 iX6 iY0 iW1 iX9 iY6 iZ0 i01 i19 i26 i31 i11 i29 i36 i41 i21 i39 i46 i51 i31 i49 i56 i61 i41 i59 i66 i71 i51 i69 i76 i81 i61 i79 i86 i91 i71 i89 i96 iA1 i81 i99 iA6 iB1 i91 iA9 iB6 iC1 iA1 iB9 iC6 iD1 iB1 iC9 iD6 iE1 iC1 iD9 iE6 iF1 iD1 iE9 iF6 iG1 iE1 iF9 iG6 iH1 iF1 iG9 iH6 iI1 iG1 iH9 iI6 iJ1 iH1 iI9 iJ6 iK1 iI1 iJ9 iK6 iL1 iJ1 iK9 iL6 iM1 iK1 iL9 iM6 iN1 iL1 iM9 iN6 iO1 iM1 iN9 iO6 iP1 iN1 iO9 iP6 iQ1 iO1 iP9 iQ6 iR1 iP1 iQ9 iR6 iS1 iQ1 iR9 iS6 iT1 iR1 iS9 iT6 iU1 iS1 iT9 iU6 iV1 iT1 iU9 iV6 iW1 iU1 iV9 iW6 iX1 iV1 iW9 iX6 iY1 iW1 iX9 iY6 iZ1 i01 i19 i26 i32 i11 i29 i36 i42 i21 i39 i46 i52 i31 i49 i56 i62 i41 i59 i66 i72 i51 i69 i76 i82 i61 i79 i86 i92 i71 i89 i96 iA2 i81 i99 iA6 iB2 i91 iA9 iB6 iC2 iA1 iB9 iC6 iD2 iB1 iC9 iD6 iE2 iC1 iD9 iE6 iF2 iD1 iE9 iF6 iG2 iE1 iF9 iG6 iH2 iF1 iG9 iH6 iI2 iG1 iH9 iI6 iJ2 iH1 iI9 iJ6 iK2 iI1 iJ9 iK6 iL2 iJ1 iK9 iL6 iM2 iK1 iL9 iM6 iN2 iL1 iM9 iN6 iO2 iM1 iN9 iO6 iP2 iN1 iO9 iP6 iQ2 iO1 iP9 iQ6 iR2 iP1 iQ9 iR6 iS2 iQ1 iR9 iS6 iT2 iR1 iS9 iT6 iU2 iS1 iT9 iU6 iV2 iT1 iU9 iV6 iW2 iU1 iV9 iW6 iX2 iV1 iW9 iX6 iY2 iW1 iX9 iY6 iZ2 i01 i19 i26 i33 i11 i29 i36 i43 i21 i39 i46 i53 i31 i49 i56 i63 i41 i59 i66 i73 i51 i69 i76 i83 i61 i79 i86 i93 i71 i89 i96 iA3 i81 i99 iA6 iB3 i91 iA9 iB6 iC3 iA1 iB9 iC6 iD3 iB1 iC9 iD6 iE3 iC1 iD9 iE6 iF3 iD1 iE9 iF6 iG3 iE1 iF9 iG6 iH3 iF1 iG9 iH6 iI3 iG1 iH9 iI6 iJ3 iH1 iI9 iJ6 iK3 iI1 iJ9 iK6 iL3 iJ1 iK9 iL6 iM3 iK1 iL9 iM6 iN3 iL1 iM9 iN6 iO3 iM1 iN9 iO6 iP3 iN1 iO9 iP6 iQ3 iO1 iP9 iQ6 iR3 iP1 iQ9 iR6 iS3 iQ1 iR9 iS6 iT3 iR1 iS9 iT6 iU3 iS1 iT9 iU6 iV3 iT1 iU9 iV6 iW3 iU1 iV9 iW6 iX3 iV1 iW9 iX6 iY3 iW1 iX9 iY6 iZ3 i01 i19 i26 i34 i11 i29 i36 i44 i21 i39 i46 i54 i31 i49 i56 i64 i41 i59 i66 i74 i51 i69 i76 i84 i61 i79 i86 i94 i71 i89 i96 iA4 i81 i99 iA6 iB4 i91 iA9 iB6 iC4 iA1 iB9 iC6 iD4 iB1 iC9 iD6 iE4 iC1 iD9 iE6 iF4 iD1 iE9 iF6 iG4 iE1 iF9 iG6 iH4 iF1 iG9 iH6 iI4 iG1 iH9 iI6 iJ4 iH1 iI9 iJ6 iK4 iI1 iJ9 iK6 iL4 iJ1 iK9 iL6 iM4 iK1 iL9 iM6 iN4 iL1 iM9 iN6 iO4 iM1 iN9 iO6 iP4 iN1 iO9 iP6 iQ4 iO1 iP9 iQ6 iR4 iP1 iQ9 iR6 iS4 iQ1 iR9 iS6 iT4 iR1 iS9 iT6 iU4 iS1 iT9 iU6 iV4 iT1 iU9 iV6 iW4 iU1 iV9 iW6 iX4 iV1 iW9 iX6 iY4 iW1 iX9 iY6 iZ4 i01 i19 i26 i35 i11 i29 i36 i45 i21 i39 i46 i55 i31 i49 i56 i65 i41 i59 i66 i75 i51 i69 i76 i85 i61 i79 i86 i95 i71 i89 i96 iA5 i81 i99 iA6 iB5 i91 iA9 iB6 iC5 iA1 iB9 iC6 iD5 iB1 iC9 iD6 iE5 iC1 iD9 iE6 iF5 iD1 iE9 iF6 iG5 iE1 iF9 iG6 iH5 iF1 iG9 iH6 iI5 iG1 iH9 iI6 iJ5 iH1 iI9 iJ6 iK5 iI1 iJ9 iK6 iL5 iJ1 iK9 iL6 iM5 iK1 iL9 iM6 iN5 iL1 iM9 iN6 iO5 iM1 iN9 iO6 iP5 iN1 iO9 iP6 iQ5 iO1 iP9 iQ6 iR5 iP1 iQ9 iR6 iS5 iQ1 iR9 iS6 iT5 iR1 iS9 iT6 iU5 iS1 iT9 iU6 iV5 iT1 iU9 iV6 iW5 iU1 iV9 iW6 iX5 iV1 iW9 iX6 iY5 iW1 iX9 iY6 iZ5 i01 i19 i26 i36 i11 i29 i36 i46 i21 i39 i46 i56 i31 i49 i56 i66 i41 i59 i66 i76 i51 i69 i76 i86 i61 i79 i86 i96 i71 i89 i96 iA6 i81 i99 iA6 iB6 i91 iA9 iB6 iC6 iA1 iB9 iC6 iD6 iB1 iC9 iD6 iE6 iC1 iD9 iE6 iF6 iD1 iE9 iF6 iG6 iE1 iF9 iG6 iH6 iF1 iG9 iH6 iI6 iG1 iH9 iI6 iJ6 iH1 iI9 iJ6 iK6 iI1 iJ9 iK6 iL6 iJ1 iK9 iL6 iM6 iK1 iL9 iM6 iN6 iL1 iM9 iN6 iO6 iM1 iN9 iO6 iP6 iN1 iO9 iP6 iQ6 iO1 iP9 iQ6 iR6 iP1 iQ9 iR6 iS6 iQ1 iR9 iS6 iT6 iR1 iS9 iT6 iU6 iS1 iT9 iU6 iV6 iT1 iU9 iV6 iW6 iU1 iV9 iW6 iX6 iV1 iW9 iX6 iY6 iW1 iX9 iY6 iZ6 i01 i19 i26 i37 i11 i29 i36 i47 i21 i39 i46 i57 i31 i49 i56 i67 i41 i59 i66 i77 i51 i69 i76 i87 i61 i79 i86 i97 i71 i89 i96 iA7 i81 i99 iA6 iB7 i91 iA9 iB6 iC7 iA1 iB9 iC6 iD7 iB1 iC9 iD6 iE7 iC1 iD9 iE6 iF7 iD1 iE9 iF6 iG7 iE1 iF9 iG6 iH7 iF1 iG9 iH6 iI7 iG1 iH9 iI6 iJ7 iH1 iI9 iJ6 iK7 iI1 iJ9 iK6 iL7 iJ1 iK9 iL6 iM7 iK1 iL9 iM6 iN7 iL1 iM9 iN6 iO7 iM1 iN9 iO6 iP7 iN1 iO9 iP6 iQ7 iO1 iP9 iQ6 iR7 iP1 iQ9 iR6 iS7 iQ1 iR9 iS6 iT7 iR1 iS9 iT6 iU7 iS1 iT9 iU6 iV7 iT1 iU9 iV6 iW7 iU1 iV9 iW6 iX7 iV1 iW9 iX6 iY7 iW1 iX9 iY6 iZ7 i01 i19 i26 i38 i11 i29 i36 i48 i21 i39 i46 i58 i31 i49 i56 i68 i41 i59 i66 i78 i51 i69 i76 i88 i61 i79 i86 i98 i71 i89 i96 iA8 i81 i99 iA6 iB8 i91 iA9 iB6 iC8 iA1 iB9 iC6 iD8 iB1 iC9 iD6 iE8 iC1 iD9 iE6 iF8 iD1 iE9 iF6 iG8 iE1 iF9 iG6 iH8 iF1 iG9 iH6 iI8 iG1 iH9 iI6 iJ8 iH1 iI9 iJ6 iK8 iI1 iJ9 iK6 iL8 iJ1 iK9 iL6 iM8 iK1 iL9 iM6 iN8 iL1 iM9 iN6 iO8 iM1 iN9 iO6 iP8 iN1 iO9 iP6 iQ8 iO1 iP9 iQ6 iR8 iP1 iQ9 iR6 iS8 iQ1 iR9 iS6 iT8 iR1 iS9 iT6 iU8 iS1 iT9 iU6 iV8 iT1 iU9 iV6 iW8 iU1 iV9 iW6 iX8 iV1 iW9 iX6 iY8 iW1 iX9 iY6 iZ8 i01 i19 i26 i39 i11 i29 i36 i49 i21 i39 i46 i59 i31 i49 i56 i69 i41 i59 i66 i79 i51 i69 i76 i89 i61 i79 i86 i99 i71 i89 i96 iA9 i81 i99 iA6 iB9 i91 iA9 iB6 iC9 iA1 iB9 iC6 iD9 iB1 iC9 iD6 iE9 iC1 iD9 iE6 iF9 iD1 iE9 iF6 iG9 iE1 iF9 iG6 iH9 iF1 iG9 iH6 iI9 iG1 iH9 iI6 iJ9 iH1 iI9 iJ6 iK9 iI1 iJ9 iK6 iL9 iJ1 iK9 iL6 iM9 iK1 iL9 iM6 iN9 iL1 iM9 iN6 iO9 iM1 iN9 iO6 iP9 iN1 iO9 iP6 iQ9 iO1 iP9 iQ6 iR9 iP1 iQ9 iR6 iS9 iQ1 iR9 iS6 iT9 iR1 iS9 iT6 iU9 iS1 iT9 iU6 iV9 iT1 iU9 iV6 iW9 iU1 iV9 iW6 iX9 iV1 iW9 iX6 iY9 iW1 iX9 iY6 iZ9 i01 i19 i27 i30 i11 i29 i37 i40 i21 i39 i47 i50 i31 i49 i57 i60 i41 i59 i67 i70 i51 i69 i77 i80 i61 i79 i87 i90 i71 i89 i97 iA0 i81 i99 iA7 iB0 i91 iA9 iB7 iC0 iA1 iB9 iC7 iD0 iB1 iC9 iD7 iE0 iC1 iD9 iE7 iF0 iD1 iE9 iF7 iG0 iE1 iF9 iG7 iH0 iF1 iG9 iH7 iI0 iG1 iH9 iI7 iJ0 iH1 iI9 iJ7 iK0 iI1 iJ9 iK7 iL0 iJ1 iK9 iL7 iM0 iK1 iL9 iM7 iN0 iL1 iM9 iN7 iO0 iM1 iN9 iO7 iP0 iN1 iO9 iP7 iQ0 iO1 iP9 iQ7 iR0 iP1 iQ9 iR7 iS0 iQ1 iR9 iS7 iT0 iR1 iS9 iT7 iU0 iS1 iT9 iU7 iV0 iT1 iU9 iV7 iW0 iU1 iV9 iW7 iX0 iV1 iW9 iX7 iY0 iW1 iX9 iY7 iZ0 i01 i19 i27 i31 i11 i29 i37 i41 i21 i39 i47 i51 i31 i49 i57 i61 i41 i59 i67 i71 i51 i69 i77 i81 i61 i79 i87 i91 i71 i89 i97 iA1 i81 i99 iA7 iB1 i91 iA9 iB7 iC1 iA1 iB9 iC7 iD1 iB1 iC9 iD7 iE1 iC1 iD9 iE7 iF1 iD1 iE9 iF7 iG1 iE1 iF9 iG7 iH1 iF1 iG9 iH7 iI1 iG1 iH9 iI7 iJ1 iH1 iI9 iJ7 iK1 iI1 iJ9 iK7 iL1 iJ1 iK9 iL7 iM1 iK1 iL9 iM7 iN1 iL1 iM9 iN7 iO1 iM1 iN9 iO7 iP1 iN1 iO9 iP7 iQ1 iO1 iP9 iQ7 iR1 iP1 iQ9 iR7 iS1 iQ1 iR9 iS7 iT1 iR1 iS9 iT7 iU1 iS1 iT9 iU7 iV1 iT1 iU9 iV7 iW1 iU1 iV9 iW7 iX1 iV1 iW9 iX7 iY1 iW1 iX9 iY7 iZ1 i01 i19 i27 i32 i11 i29 i37 i42 i21 i39 i47 i52 i31 i49 i57 i62 i41 i59 i67 i72 i51 i69 i77 i82 i61 i79 i87 i92 i71 i89 i97 iA2 i81 i99 iA7 iB2 i91 iA9 iB7 iC2 iA1 iB9 iC7 iD2 iB1 iC9 iD7 iE2 iC1 iD9 iE7 iF2 iD1 iE9 iF7 iG2 iE1 iF9 iG7 iH2 iF1 iG9 iH7 iI2 iG1 iH9 iI7 iJ2 iH1 iI9 iJ7 iK2 iI1 iJ9 iK7 iL2 iJ1 iK9 iL7 iM2 iK1 iL9 iM7 iN2 iL1 iM9 iN7 iO2 iM1 iN9 iO7 iP2 iN1 iO9 iP7 iQ2 iO1 iP9 iQ7 iR2 iP1 iQ9 iR7 iS2 iQ1 iR9 iS7 iT2 iR1 iS9 iT7 iU2 iS1 iT9 iU7 iV2 iT1 iU9 iV7 iW2 iU1 iV9 iW7 iX2 iV1 iW9 iX7 iY2 iW1 iX9 iY7 iZ2 i01 i19 i27 i33 i11 i29 i37 i43 i21 i39 i47 i53 i31 i49 i57 i63 i41 i59 i67 i73 i51 i69 i77 i83 i61 i79 i87 i93 i71 i89 i97 iA3 i81 i99 iA7 iB3 i91 iA9 iB7 iC3 iA1 iB9 iC7 iD3 iB1 iC9 iD7 iE3 iC1 iD9 iE7 iF3 iD1 iE9 iF7 iG3 iE1 iF9 iG7 iH3 iF1 iG9 iH7 iI3 iG1 iH9 iI7 iJ3 iH1 iI9 iJ7 iK3 iI1 iJ9 iK7 iL3 iJ1 iK9 iL7 iM3 iK1 iL9 iM7 iN3 iL1 iM9 iN7 iO3 iM1 iN9 iO7 iP3 iN1 iO9 iP7 iQ3 iO1 iP9 iQ7 iR3 iP1 iQ9 iR7 iS3 iQ1 iR9 iS7 iT3 iR1 iS9 iT7 iU3 iS1 iT9 iU7 iV3 iT1 iU9 iV7 iW3 iU1 iV9 iW7 iX3 iV1 iW9 iX7 iY3 iW1 iX9 iY7 iZ3 i01 i19 i27 i34 i11 i29 i37 i44 i21 i39 i47 i54 i31 i49 i57 i64 i41 i59 i67 i74 i51 i69 i77 i84 i61 i79 i87 i94 i71 i89 i97 iA4 i81 i99 iA7 iB4 i91 iA9 iB7 iC4 iA1 iB9 iC7 iD4 iB1 iC9 iD7 iE4 iC1 iD9 iE7 iF4 iD1 iE9 iF7 iG4 iE1 iF9 iG7 iH4 iF1 iG9 iH7 iI4 iG1 iH9 iI7 iJ4 iH1 iI9 iJ7 iK4 iI1 iJ9 iK7 iL4 iJ1 iK9 iL7 iM4 iK1 iL9 iM7 iN4 iL1 iM9 iN7 iO4 iM1 iN9 iO7 iP4 iN1 iO9 iP7 iQ4 iO1 iP9 iQ7 iR4 iP1 iQ9 iR7 iS4 iQ1 iR9 iS7 iT4 iR1 iS9 iT7 iU4 iS1 iT9 iU7 iV4 iT1 iU9 iV7 iW4 iU1 iV9 iW7 iX4 iV1 iW9 iX7 iY4 iW1 iX9 iY7 iZ4 i01 i19 i27 i35 i11 i29 i37 i45 i21 i39 i47 i55 i31 i49 i57 i65 i41 i59 i67 i75 i51 i69 i77 i85 i61 i79 i87 i95 i71 i89 i97 iA5 i81 i99 iA7 iB5 i91 iA9 iB7 iC5 iA1 iB9 iC7 iD5 iB1 iC9 iD7 iE5 iC1 iD9 iE7 iF5 iD1 iE9 iF7 iG5 iE1 iF9 iG7 iH5 iF1 iG9 iH7 iI5 iG1 iH9 iI7 iJ5 iH1 iI9 iJ7 iK5 iI1 iJ9 iK7 iL5 iJ1 iK9 iL7 iM5 iK1 iL9 iM7 iN5 iL1 iM9 iN7 iO5 iM1 iN9 iO7 iP5 iN1 iO9 iP7 iQ5 iO1 iP9 iQ7 iR5 iP1 iQ9 iR7 iS5 iQ1 iR9 iS7 iT5 iR1 iS9 iT7 iU5 iS1 iT9 iU7 iV5 iT1 iU9 iV7 iW5 iU1 iV9 iW7 iX5 iV1 iW9 iX7 iY5 iW1 iX9 iY7 iZ5 i01 i19 i27 i36 i11 i29 i37 i46 i21 i39 i47 i56 i31 i49 i57 i66 i41 i59 i67 i76 i51 i69 i77 i86 i61 i79 i87 i96 i71 i89 i97 iA6 i81 i99 iA7 iB6 i91 iA9 iB7 iC6 iA1 iB9 iC7 iD6 iB1 iC9 iD7 iE6 iC1 iD9 iE7 iF6 iD1 iE9 iF7 iG6 iE1 iF9 iG7 iH6 iF1 iG9 iH7 iI6 iG1 iH9 iI7 iJ6 iH1 iI9 iJ7 iK6 iI1 iJ9 iK7 iL6 iJ1 iK9 iL7 iM6 iK1 iL9 iM7 iN6 iL1 iM9 iN7 iO6 iM1 iN9 iO7 iP6 iN1 iO9 iP7 iQ6 iO1 iP9 iQ7 iR6 iP1 iQ9 iR7 iS6 iQ1 iR9 iS7 iT6 iR1 iS9 iT7 iU6 iS1 iT9 iU7 iV6 iT1 iU9 iV7 iW6 iU1 iV9 iW7 iX6 iV1 iW9 iX7 iY6 iW1 iX9 iY7 iZ6 i01 i19 i27 i37 i11 i29 i37 i47 i21 i39 i47 i57 i31 i49 i57 i67 i41 i59 i67 i77 i51 i69 i77 i87 i61 i79 i87 i97 i71 i89 i97 iA7 i81 i99 iA7 iB7 i91 iA9 iB7 iC7 iA1 iB9 iC7 iD7 iB1 iC9 iD7 iE7 iC1 iD9 iE7 iF7 iD1 iE9 iF7 iG7 iE1 iF9 iG7 iH7 iF1 iG9 iH7 iI7 iG1 iH9 iI7 iJ7 iH1 iI9 iJ7 iK7 iI1 iJ9 iK7 iL7 iJ1 iK9 iL7 iM7 iK1 iL9 iM7 iN7 iL1 iM9 iN7 iO7 iM1 iN9 iO7 iP7 iN1 iO9 iP7 iQ7 iO1 iP9 iQ7 iR7 iP1 iQ9 iR7 iS7 iQ1 iR9 iS7 iT7 iR1 iS9 iT7 iU7 iS1 iT9 iU7 iV7 iT1 iU9 iV7 iW7 iU1 iV9 iW7 iX7 iV1 iW9 iX7 iY7 iW1 iX9 iY7 iZ7 i01 i19 i27 i38 i11 i29 i37 i48 i21 i39 i47 i58 i31 i49 i57 i68 i41 i59 i67 i78 i51 i69 i77 i88 i61 i79 i87 i98 i71 i89 i97 iA8 i81 i99 iA7 iB8 i91 iA9 iB7 iC8 iA1 iB9 iC7 iD8 iB1 iC9 iD7 iE8 iC1 iD9 iE7 iF8 iD1 iE9 iF7 iG8 iE1 iF9 iG7 iH8 iF1 iG9 iH7 iI8 iG1 iH9 iI7 iJ8 iH1 iI9 iJ7 iK8 iI1 iJ9 iK7 iL8 iJ1 iK9 iL7 iM8 iK1 iL9 iM7 iN8 iL1 iM9 iN7 iO8 iM1 iN9 iO7 iP8 iN1 iO9 iP7 iQ8 iO1 iP9 iQ7 iR8 iP1 iQ9 iR7 iS8 iQ1 iR9 iS7 iT8 iR1 iS9 iT7 iU8 iS1 iT9 iU7 iV8 iT1 iU9 iV7 iW8 iU1 iV9 iW7 iX8 iV1 iW9 iX7 iY8 iW1 iX9 iY7 iZ8 i01 i19 i27 i39 i11 i29 i37 i49 i21 i39 i47 i59 i31 i49 i57 i69 i41 i59 i67 i79 i51 i69 i77 i89 i61 i79 i87 i99 i71 i89 i97 iA9 i81 i99 iA7 iB9 i91 iA9 iB7 iC9 iA1 iB9 iC7 iD9 iB1 iC9 iD7 iE9 iC1 iD9 iE7 iF9 iD1 iE9 iF7 iG9 iE1 iF9 iG7 iH9 iF1 iG9 iH7 iI9 iG1 iH9 iI7 iJ9 iH1 iI9 iJ7 iK9 iI1 iJ9 iK7 iL9 iJ1 iK9 iL7 iM9 iK1 iL9 iM7 iN9 iL1 iM9 iN7 iO9 iM1 iN9 iO7 iP9 iN1 iO9 iP7 iQ9 iO1 iP9 iQ7 iR9 iP1 iQ9 iR7 iS9 iQ1 iR9 iS7 iT9 iR1 iS9 iT7 iU9 iS1 iT9 iU7 iV9 iT1 iU9 iV7 iW9 iU1 iV9 iW7 iX9 iV1 iW9 iX7 iY9 iW1 iX9 iY7 iZ9 i01 i19 i28 i30 i11 i29 i38 i40 i21 i39 i48 i50 i31 i49 i58 i60 i41 i59 i68 i70 i51 i69 i78 i80 i61 i79 i88 i90 i71 i89 i98 iA0 i81 i99 iA8 iB0 i91 iA9 iB8 iC0 iA1 iB9 iC8 iD0 iB1 iC9 iD8 iE0 iC1 iD9 iE8 iF0 iD1 iE9 iF8 iG0 iE1 iF9 iG8 iH0 iF1 iG9 iH8 iI0 iG1 iH9 iI8 iJ0 iH1 iI9 iJ8 iK0 iI1 iJ9 iK8 iL0 iJ1 iK9 iL8 iM0 iK1 iL9 iM8 iN0 iL1 iM9 iN8 iO0 iM1 iN9 iO8 iP0 iN1 iO9 iP8 iQ0 iO1 iP9 iQ8 iR0 iP1 iQ9 iR8 iS0 iQ1 iR9 iS8 iT0 iR1 iS9 iT8 iU0 iS1 iT9 iU8 iV0 iT1 iU9 iV8 iW0 iU1 iV9 iW8 iX0 iV1 iW9 iX8 iY0 iW1 iX9 iY8 iZ0 i01 i19 i28 i31 i11 i29 i38 i41 i21 i39 i48 i51 i31 i49 i58 i61 i41 i59 i68 i71 i51 i69 i78 i81 i61 i79 i88 i91 i71 i89 i98 iA1 i81 i99 iA8 iB1 i91 iA9 iB8 iC1 iA1 iB9 iC8 iD1 iB1 iC9 iD8 iE1 iC1 iD9 iE8 iF1 iD1 iE9 iF8 iG1 iE1 iF9 iG8 iH1 iF1 iG9 iH8 iI1 iG1 iH9 iI8 iJ1 iH1 iI9 iJ8 iK1 iI1 iJ9 iK8 iL1 iJ1 iK9 iL8 iM1 iK1 iL9 iM8 iN1 iL1 iM9 iN8 iO1 iM1 iN9 iO8 iP1 iN1 iO9 iP8 iQ1 iO1 iP9 iQ8 iR1 iP1 iQ9 iR8 iS1 iQ1 iR9 iS8 iT1 iR1 iS9 iT8 iU1 iS1 iT9 iU8 iV1 iT1 iU9 iV8 iW1 iU1 iV9 iW8 iX1 iV1 iW9 iX8 iY1 iW1 iX9 iY8 iZ1 i01 i19 i28 i32 i11 i29 i38 i42 i21 i39 i48 i52 i31 i49 i58 i62 i41 i59 i68 i72 i51 i69 i78 i82 i61 i79 i88 i92 i71 i89 i98 iA2 i81 i99 iA8 iB2 i91 iA9 iB8 iC2 iA1 iB9 iC8 iD2 iB1 iC9 iD8 iE2 iC1 iD9 iE8 iF2 iD1 iE9 iF8 iG2 iE1 iF9 iG8 iH2 iF1 iG9 iH8 iI2 iG1 iH9 iI8 iJ2 iH1 iI9 iJ8 iK2 iI1 iJ9 iK8 iL2 iJ1 iK9 iL8 iM2 iK1 iL9 iM8 iN2 iL1 iM9 iN8 iO2 iM1 iN9 iO8 iP2 iN1 iO9 iP8 iQ2 iO1 iP9 iQ8 iR2 iP1 iQ9 iR8 iS2 iQ1 iR9 iS8 iT2 iR1 iS9 iT8 iU2 iS1 iT9 iU8 iV2 iT1 iU9 iV8 iW2 iU1 iV9 iW8 iX2 iV1 iW9 iX8 iY2 iW1 iX9 iY8 iZ2 i01 i19 i28 i33 i11 i29 i38 i43 i21 i39 i48 i53 i31 i49 i58 i63 i41 i59 i68 i73 i51 i69 i78 i83 i61 i79 i88 i93 i71 i89 i98 iA3 i81 i99 iA8 iB3 i91 iA9 iB8 iC3 iA1 iB9 iC8 iD3 iB1 iC9 iD8 iE3 iC1 iD9 iE8 iF3 iD1 iE9 iF8 iG3 iE1 iF9 iG8 iH3 iF1 iG9 iH8 iI3 iG1 iH9 iI8 iJ3 iH1 iI9 iJ8 iK3 iI1 iJ9 iK8 iL3 iJ1 iK9 iL8 iM3 iK1 iL9 iM8 iN3 iL1 iM9 iN8 iO3 iM1 iN9 iO8 iP3 iN1 iO9 iP8 iQ3 iO1 iP9 iQ8 iR3 iP1 iQ9 iR8 iS3 iQ1 iR9 iS8 iT3 iR1 iS9 iT8 iU3 iS1 iT9 iU8 iV3 iT1 iU9 iV8 iW3 iU1 iV9 iW8 iX3 iV1 iW9 iX8 iY3 iW1 iX9 iY8 iZ3 i01 i19 i28 i34 i11 i29 i38 i44 i21 i39 i48 i54 i31 i49 i58 i64 i41 i59 i68 i74 i51 i69 i78 i84 i61 i79 i88 i94 i71 i89 i98 iA4 i81 i99 iA8 iB4 i91 iA9 iB8 iC4 iA1 iB9 iC8 iD4 iB1 iC9 iD8 iE4 iC1 iD9 iE8 iF4 iD1 iE9 iF8 iG4 iE1 iF9 iG8 iH4 iF1 iG9 iH8 iI4 iG1 iH9 iI8 iJ4 iH1 iI9 iJ8 iK4 iI1 iJ9 iK8 iL4 iJ1 iK9 iL8 iM4 iK1 iL9 iM8 iN4 iL1 iM9 iN8 iO4 iM1 iN9 iO8 iP4 iN1 iO9 iP8 iQ4 iO1 iP9 iQ8 iR4 iP1 iQ9 iR8 iS4 iQ1 iR9 iS8 iT4 iR1 iS9 iT8 iU4 iS1 iT9 iU8 iV4 iT1 iU9 iV8 iW4 iU1 iV9 iW8 iX4 iV1 iW9 iX8 iY4 iW1 iX9 iY8 iZ4 i01 i19 i28 i35 i11 i29 i38 i45 i21 i39 i48 i55 i31 i49 i58 i65 i41 i59 i68 i75 i51 i69 i78 i85 i61 i79 i88 i95 i71 i89 i98 iA5 i81 i99 iA8 iB5 i91 iA9 iB8 iC5 iA1 iB9 iC8 iD5 iB1 iC9 iD8 iE5 iC1 iD9 iE8 iF5 iD1 iE9 iF8 iG5 iE1 iF9 iG8 iH5 iF1 iG9 iH8 iI5 iG1 iH9 iI8 iJ5 iH1 iI9 iJ8 iK5 iI1 iJ9 iK8 iL5 iJ1 iK9 iL8 iM5 iK1 iL9 iM8 iN5 iL1 iM9 iN8 iO5 iM1 iN9 iO8 iP5 iN1 iO9 iP8 iQ5 iO1 iP9 iQ8 iR5 iP1 iQ9 iR8 iS5 iQ1 iR9 iS8 iT5 iR1 iS9 iT8 iU5 iS1 iT9 iU8 iV5 iT1 iU9 iV8 iW5 iU1 iV9 iW8 iX5 iV1 iW9 iX8 iY5 iW1 iX9 iY8 iZ5 i01 i19 i28 i36 i11 i29 i38 i46 i21 i39 i48 i56 i31 i49 i58 i66 i41 i59 i68 i76 i51 i69 i78 i86 i61 i79 i88 i96 i71 i89 i98 iA6 i81 i99 iA8 iB6 i91 iA9 iB8 iC6 iA1 iB9 iC8 iD6 iB1 iC9 iD8 iE6 iC1 iD9 iE8 iF6 iD1 iE9 iF8 iG6 iE1 iF9 iG8 iH6 iF1 iG9 iH8 iI6 iG1 iH9 iI8 iJ6 iH1 iI9 iJ8 iK6 iI1 iJ9 iK8 iL6 iJ1 iK9 iL8 iM6 iK1 iL9 iM8 iN6 iL1 iM9 iN8 iO6 iM1 iN9 iO8 iP6 iN1 iO9 iP8 iQ6 iO1 iP9 iQ8 iR6 iP1 iQ9 iR8 iS6 iQ1 iR9 iS8 iT6 iR1 iS9 iT8 iU6 iS1 iT9 iU8 iV6 iT1 iU9 iV8 iW6 iU1 iV9 iW8 iX6 iV1 iW9 iX8 iY6 iW1 iX9 iY8 iZ6 i01 i19 i28 i37 i11 i29 i38 i47 i21 i39 i48 i57 i31 i49 i58 i67 i41 i59 i68 i77 i51 i69 i78 i87 i61 i79 i88 i97 i71 i89 i98 iA7 i81 i99 iA8 iB7 i91 iA9 iB8 iC7 iA1 iB9 iC8 iD7 iB1 iC9 iD8 iE7 iC1 iD9 iE8 iF7 iD1 iE9 iF8 iG7 iE1 iF9 iG8 iH7 iF1 iG9 iH8 iI7 iG1 iH9 iI8 iJ7 iH1 iI9 iJ8 iK7 iI1 iJ9 iK8 iL7 iJ1 iK9 iL8 iM7 iK1 iL9 iM8 iN7 iL1 iM9 iN8 iO7 iM1 iN9 iO8 iP7 iN1 iO9 iP8 iQ7 iO1 iP9 iQ8 iR7 iP1 iQ9 iR8 iS7 iQ1 iR9 iS8 iT7 iR1 iS9 iT8 iU7 iS1 iT9 iU8 iV7 iT1 iU9 iV8 iW7 iU1 iV9 iW8 iX7 iV1 iW9 iX8 iY7 iW1 iX9 iY8 iZ7 i01 i19 i28 i38 i11 i29 i38 i48 i21 i39 i48 i58 i31 i49 i58 i68 i41 i59 i68 i78 i51 i69 i78 i88 i61 i79 i88 i98 i71 i89 i98 iA8 i81 i99 iA8 iB8 i91 iA9 iB8 iC8 iA1 iB9 iC8 iD8 iB1 iC9 iD8 iE8 iC1 iD9 iE8 iF8 iD1 iE9 iF8 iG8 iE1 iF9 iG8 iH8 iF1 iG9 iH8 iI8 iG1 iH9 iI8 iJ8 iH1 iI9 iJ8 iK8 iI1 iJ9 iK8 iL8 iJ1 iK9 iL8 iM8 iK1 iL9 iM8 iN8 iL1 iM9 iN8 iO8 iM1 iN9 iO8 iP8 iN1 iO9 iP8 iQ8 iO1 iP9 iQ8 iR8 iP1 iQ9 iR8 iS8 iQ1 iR9 iS8 iT8 iR1 iS9 iT8 iU8 iS1 iT9 iU8 iV8 iT1 iU9 iV8 iW8 iU1 iV9 iW8 iX8 iV1 iW9 iX8 iY8 iW1 iX9 iY8 iZ8 i01 i19 i28 i39 i11 i29 i38 i49 i21 i39 i48 i59 i31 i49 i58 i69 i41 i59 i68 i79 i51 i69 i78 i89 i61 i79 i88 i99 i71 i89 i98 iA9 i81 i99 iA8 iB9 i91 iA9 iB8 iC9 iA1 iB9 iC8 iD9 iB1 iC9 iD8 iE9 iC1 iD9 iE8 iF9 iD1 iE9 iF8 iG9 iE1 iF9 iG8 iH9 iF1 iG9 iH8 iI9 iG1 iH9 iI8 iJ9 iH1 iI9 iJ8 iK9 iI1 iJ9 iK8 iL9 iJ1 iK9 iL8 iM9 iK1 iL9 iM8 iN9 iL1 iM9 iN8 iO9 iM1 iN9 iO8 iP9 iN1 iO9 iP8 iQ9 iO1 iP9 iQ8 iR9 iP1 iQ9 iR8 iS9 iQ1 iR9 iS8 iT9 iR1 iS9 iT8 iU9 iS1 iT9 iU8 iV9 iT1 iU9 iV8 iW9 iU1 iV9 iW8 iX9 iV1 iW9 iX8 iY9 iW1 iX9 iY8 iZ9 i01 i19 i29 i30 i11 i29 i39 i40 i21 i39 i49 i50 i31 i49 i59 i60 i41 i59 i69 i70 i51 i69 i79 i80 i61 i79 i89 i90 i71 i89 i99 iA0 i81 i99 iA9 iB0 i91 iA9 iB9 iC0 iA1 iB9 iC9 iD0 iB1 iC9 iD9 iE0 iC1 iD9 iE9 iF0 iD1 iE9 iF9 iG0 iE1 iF9 iG9 iH0 iF1 iG9 iH9 iI0 iG1 iH9 iI9 iJ0 iH1 iI9 iJ9 iK0 iI1 iJ9 iK9 iL0 iJ1 iK9 iL9 iM0 iK1 iL9 iM9 iN0 iL1 iM9 iN9 iO0 iM1 iN9 iO9 iP0 iN1 iO9 iP9 iQ0 iO1 iP9 iQ9 iR0 iP1 iQ9 iR9 iS0 iQ1 iR9 iS9 iT0 iR1 iS9 iT9 iU0 iS1 iT9 iU9 iV0 iT1 iU9 iV9 iW0 iU1 iV9 iW9 iX0 iV1 iW9 iX9 iY0 iW1 iX9 iY9 iZ0 i01 i19 i29 i31 i11 i29 i39 i41 i21 i39 i49 i51 i31 i49 i59 i61 i41 i59 i69 i71 i51 i69 i79 i81 i61 i79 i89 i91 i71 i89 i99 iA1 i81 i99 iA9 iB1 i91 iA9 iB9 iC1 iA1 iB9 iC9 iD1 iB1 iC9 iD9 iE1 iC1 iD9 iE9 iF1 iD1 iE9 iF9 iG1 iE1 iF9 iG9 iH1 iF1 iG9 iH9 iI1 iG1 iH9 iI9 iJ1 iH1 iI9 iJ9 iK1 iI1 iJ9 iK9 iL1 iJ1 iK9 iL9 iM1 iK1 iL9 iM9 iN1 iL1 iM9 iN9 iO1 iM1 iN9 iO9 iP1 iN1 iO9 iP9 iQ1 iO1 iP9 iQ9 iR1 iP1 iQ9 iR9 iS1 iQ1 iR9 iS9 iT1 iR1 iS9 iT9 iU1 iS1 iT9 iU9 iV1 iT1 iU9 iV9 iW1 iU1 iV9 iW9 iX1 iV1 iW9 iX9 iY1 iW1 iX9 iY9 iZ1 i01 i19 i29 i32 i11 i29 i39 i42 i21 i39 i49 i52 i31 i49 i59 i62 i41 i59 i69 i72 i51 i69 i79 i82 i61 i79 i89 i92 i71 i89 i99 iA2 i81 i99 iA9 iB2 i91 iA9 iB9 iC2 iA1 iB9 iC9 iD2 iB1 iC9 iD9 iE2 iC1 iD9 iE9 iF2 iD1 iE9 iF9 iG2 iE1 iF9 iG9 iH2 iF1 iG9 iH9 iI2 iG1 iH9 iI9 iJ2 iH1 iI9 iJ9 iK2 iI1 iJ9 iK9 iL2 iJ1 iK9 iL9 iM2 iK1 iL9 iM9 iN2 iL1 iM9 iN9 iO2 iM1 iN9 iO9 iP2 iN1 iO9 iP9 iQ2 iO1 iP9 iQ9 iR2 iP1 iQ9 iR9 iS2 iQ1 iR9 iS9 iT2 iR1 iS9 iT9 iU2 iS1 iT9 iU9 iV2 iT1 iU9 iV9 iW2 iU1 iV9 iW9 iX2 iV1 iW9 iX9 iY2 iW1 iX9 iY9 iZ2 i01 i19 i29 i33 i11 i29 i39 i43 i21 i39 i49 i53 i31 i49 i59 i63 i41 i59 i69 i73 i51 i69 i79 i83 i61 i79 i89 i93 i71 i89 i99 iA3 i81 i99 iA9 iB3 i91 iA9 iB9 iC3 iA1 iB9 iC9 iD3 iB1 iC9 iD9 iE3 iC1 iD9 iE9 iF3 iD1 iE9 iF9 iG3 iE1 iF9 iG9 iH3 iF1 iG9 iH9 iI3 iG1 iH9 iI9 iJ3 iH1 iI9 iJ9 iK3 iI1 iJ9 iK9 iL3 iJ1 iK9 iL9 iM3 iK1 iL9 iM9 iN3 iL1 iM9 iN9 iO3 iM1 iN9 iO9 iP3 iN1 iO9 iP9 iQ3 iO1 iP9 iQ9 iR3 iP1 iQ9 iR9 iS3 iQ1 iR9 iS9 iT3 iR1 iS9 iT9 iU3 iS1 iT9 iU9 iV3 iT1 iU9 iV9 iW3 iU1 iV9 iW9 iX3 iV1 iW9 iX9 iY3 iW1 iX9 iY9 iZ3 i01 i19 i29 i34 i11 i29 i39 i44 i21 i39 i49 i54 i31 i49 i59 i64 i41 i59 i69 i74 i51 i69 i79 i84 i61 i79 i89 i94 i71 i89 i99 iA4 i81 i99 iA9 iB4 i91 iA9 iB9 iC4 iA1 iB9 iC9 iD4 iB1 iC9 iD9 iE4 iC1 iD9 iE9 iF4 iD1 iE9 iF9 iG4 iE1 iF9 iG9 iH4 iF1 iG9 iH9 iI4 iG1 iH9 iI9 iJ4 iH1 iI9 iJ9 iK4 iI1 iJ9 iK9 iL4 iJ1 iK9 iL9 iM4 iK1 iL9 iM9 iN4 iL1 iM9 iN9 iO4 iM1 iN9 iO9 iP4 iN1 iO9 iP9 iQ4 iO1 iP9 iQ9 iR4 iP1 iQ9 iR9 iS4 iQ1 iR9 iS9 iT4 iR1 iS9 iT9 iU4 iS1 iT9 iU9 iV4 iT1 iU9 iV9 iW4 iU1 iV9 iW9 iX4 iV1 iW9 iX9 iY4 iW1 iX9 iY9 iZ4 i01 i19 i29 i35 i11 i29 i39 i45 i21 i39 i49 i55 i31 i49 i59 i65 i41 i59 i69 i75 i51 i69 i79 i85 i61 i79 i89 i95 i71 i89 i99 iA5 i81 i99 iA9 iB5 i91 iA9 iB9 iC5 iA1 iB9 iC9 iD5 iB1 iC9 iD9 iE5 iC1 iD9 iE9 iF5 iD1 iE9 iF9 iG5 iE1 iF9 iG9 iH5 iF1 iG9 iH9 iI5 iG1 iH9 iI9 iJ5 iH1 iI9 iJ9 iK5 iI1 iJ9 iK9 iL5 iJ1 iK9 iL9 iM5 iK1 iL9 iM9 iN5 iL1 iM9 iN9 iO5 iM1 iN9 iO9 iP5 iN1 iO9 iP9 iQ5 iO1 iP9 iQ9 iR5 iP1 iQ9 iR9 iS5 iQ1 iR9 iS9 iT5 iR1 iS9 iT9 iU5 iS1 iT9 iU9 iV5 iT1 iU9 iV9 iW5 iU1 iV9 iW9 iX5 iV1 iW9 iX9 iY5 iW1 iX9 iY9 iZ5 i01 i19 i29 i36 i11 i29 i39 i46 i21 i39 i49 i56 i31 i49 i59 i66 i41 i59 i69 i76 i51 i69 i79 i86 i61 i79 i89 i96 i71 i89 i99 iA6 i81 i99 iA9 iB6 i91 iA9 iB9 iC6 iA1 iB9 iC9 iD6 iB1 iC9 iD9 iE6 iC1 iD9 iE9 iF6 iD1 iE9 iF9 iG6 iE1 iF9 iG9 iH6 iF1 iG9 iH9 iI6 iG1 iH9 iI9 iJ6 iH1 iI9 iJ9 iK6 iI1 iJ9 iK9 iL6 iJ1 iK9 iL9 iM6 iK1 iL9 iM9 iN6 iL1 iM9 iN9 iO6 iM1 iN9 iO9 iP6 iN1 iO9 iP9 iQ6 iO1 iP9 iQ9 iR6 iP1 iQ9 iR9 iS6 iQ1 iR9 iS9 iT6 iR1 iS9 iT9 iU6 iS1 iT9 iU9 iV6 iT1 iU9 iV9 iW6 iU1 iV9 iW9 iX6 iV1 iW9 iX9 iY6 iW1 iX9 iY9 iZ6 i01 i19 i29 i37 i11 i29 i39 i47 i21 i39 i49 i57 i31 i49 i59 i67 i41 i59 i69 i77 i51 i69 i79 i87 i61 i79 i89 i97 i71 i89 i99 iA7 i81 i99 iA9 iB7 i91 iA9 iB9 iC7 iA1 iB9 iC9 iD7 iB1 iC9 iD9 iE7 iC1 iD9 iE9 iF7 iD1 iE9 iF9 iG7 iE1 iF9 iG9 iH7 iF1 iG9 iH9 iI7 iG1 iH9 iI9 iJ7 iH1 iI9 iJ9 iK7 iI1 iJ9 iK9 iL7 iJ1 iK9 iL9 iM7 iK1 iL9 iM9 iN7 iL1 iM9 iN9 iO7 iM1 iN9 iO9 iP7 iN1 iO9 iP9 iQ7 iO1 iP9 iQ9 iR7 iP1 iQ9 iR9 iS7 iQ1 iR9 iS9 iT7 iR1 iS9 iT9 iU7 iS1 iT9 iU9 iV7 iT1 iU9 iV9 iW7 iU1 iV9 iW9 iX7 iV1 iW9 iX9 iY7 iW1 iX9 iY9 iZ7 i01 i19 i29 i38 i11 i29 i39 i48 i21 i39 i49 i58 i31 i49 i59 i68 i41 i59 i69 i78 i51 i69 i79 i88 i61 i79 i89 i98 i71 i89 i99 iA8 i81 i99 iA9 iB8 i91 iA9 iB9 iC8 iA1 iB9 iC9 iD8 iB1 iC9 iD9 iE8 iC1 iD9 iE9 iF8 iD1 iE9 iF9 iG8 iE1 iF9 iG9 iH8 iF1 iG9 iH9 iI8 iG1 iH9 iI9 iJ8 iH1 iI9 iJ9 iK8 iI1 iJ9 iK9 iL8 iJ1 iK9 iL9 iM8 iK1 iL9 iM9 iN8 iL1 iM9 iN9 iO8 iM1 iN9 iO9 iP8 iN1 iO9 iP9 iQ8 iO1 iP9 iQ9 iR8 iP1 iQ9 iR9 iS8 iQ1 iR9 iS9 iT8 iR1 iS9 iT9 iU8 iS1 iT9 iU9 iV8 iT1 iU9 iV9 iW8 iU1 iV9 iW9 iX8 iV1 iW9 iX9 iY8 iW1 iX9 iY9 iZ8 i01 i19 i29 i39 i11 i29 i39 i49 i21 i39 i49 i59 i31 i49 i59 i69 i41 i59 i69 i79 i51 i69 i79 i89 i61 i79 i89 i99 i71 i89 i99 iA9 i81 i99 iA9 iB9 i91 iA9 iB9 iC9 iA1 iB9 iC9 iD9 iB1 iC9 iD9 iE9 iC1 iD9 iE9 iF9 iD1 iE9 iF9 iG9 iE1 iF9 iG9 iH9 iF1 iG9 iH9 iI9 iG1 iH9 iI9 iJ9 iH1 iI9 iJ9 iK9 iI1 iJ9 iK9 iL9 iJ1 iK9 iL9 iM9 iK1 iL9 iM9 iN9 iL1 iM9 iN9 iO9 iM1 iN9 iO9 iP9 iN1 iO9 iP9 iQ9 iO1 iP9 iQ9 iR9 iP1 iQ9 iR9 iS9 iQ1 iR9 iS9 iT9 iR1 iS9 iT9 iU9 iS1 iT9 iU9 iV9 iT1 iU9 iV9 iW9 iU1 iV9 iW9 iX9 iV1 iW9 iX9 iY9 iW1 iX9 iY9 iZ9 i02 i10 i20 i30 i12 i20 i30 i40 i22 i30 i40 i50 i32 i40 i50 i60 i42 i50 i60 i70 i52 i60 i70 i80 i62 i70 i80 i90 i72 i80 i90 iA0 i82 i90 iA0 iB0 i92 iA0 iB0 iC0 iA2 iB0 iC0 iD0 iB2 iC0 iD0 iE0 iC2 iD0 iE0 iF0 iD2 iE0 iF0 iG0 iE2 iF0 iG0 iH0 iF2 iG0 iH0 iI0 iG2 iH0 iI0 iJ0 iH2 iI0 iJ0 iK0 iI2 iJ0 iK0 iL0 iJ2 iK0 iL0 iM0 iK2 iL0 iM0 iN0 iL2 iM0 iN0 iO0 iM2 iN0 iO0 iP0 iN2 iO0 iP0 iQ0 iO2 iP0 iQ0 iR0 iP2 iQ0 iR0 iS0 iQ2 iR0 iS0 iT0 iR2 iS0 iT0 iU0 iS2 iT0 iU0 iV0 iT2 iU0 iV0 iW0 iU2 iV0 iW0 iX0 iV2 iW0 iX0 iY0 iW2 iX0 iY0 iZ0 i02 i10 i20 i31 i12 i20 i30 i41 i22 i30 i40 i51 i32 i40 i50 i61 i42 i50 i60 i71 i52 i60 i70 i81 i62 i70 i80 i91 i72 i80 i90 iA1 i82 i90 iA0 iB1 i92 iA0 iB0 iC1 iA2 iB0 iC0 iD1 iB2 iC0 iD0 iE1 iC2 iD0 iE0 iF1 iD2 iE0 iF0 iG1 iE2 iF0 iG0 iH1 iF2 iG0 iH0 iI1 iG2 iH0 iI0 iJ1 iH2 iI0 iJ0 iK1 iI2 iJ0 iK0 iL1 iJ2 iK0 iL0 iM1 iK2 iL0 iM0 iN1 iL2 iM0 iN0 iO1 iM2 iN0 iO0 iP1 iN2 iO0 iP0 iQ1 iO2 iP0 iQ0 iR1 iP2 iQ0 iR0 iS1 iQ2 iR0 iS0 iT1 iR2 iS0 iT0 iU1 iS2 iT0 iU0 iV1 iT2 iU0 iV0 iW1 iU2 iV0 iW0 iX1 iV2 iW0 iX0 iY1 iW2 iX0 iY0 iZ1 i02 i10 i20 i32 i12 i20 i30 i42 i22 i30 i40 i52 i32 i40 i50 i62 i42 i50 i60 i72 i52 i60 i70 i82 i62 i70 i80 i92 i72 i80 i90 iA2 i82 i90 iA0 iB2 i92 iA0 iB0 iC2 iA2 iB0 iC0 iD2 iB2 iC0 iD0 iE2 iC2 iD0 iE0 iF2 iD2 iE0 iF0 iG2 iE2 iF0 iG0 iH2 iF2 iG0 iH0 iI2 iG2 iH0 iI0 iJ2 iH2 iI0 iJ0 iK2 iI2 iJ0 iK0 iL2 iJ2 iK0 iL0 iM2 iK2 iL0 iM0 iN2 iL2 iM0 iN0 iO2 iM2 iN0 iO0 iP2 iN2 iO0 iP0 iQ2 iO2 iP0 iQ0 iR2 iP2 iQ0 iR0 iS2 iQ2 iR0 iS0 iT2 iR2 iS0 iT0 iU2 iS2 iT0 iU0 iV2 iT2 iU0 iV0 iW2 iU2 iV0 iW0 iX2 iV2 iW0 iX0 iY2 iW2 iX0 iY0 iZ2 i02 i10 i20 i33 i12 i20 i30 i43 i22 i30 i40 i53 i32 i40 i50 i63 i42 i50 i60 i73 i52 i60 i70 i83 i62 i70 i80 i93 i72 i80 i90 iA3 i82 i90 iA0 iB3 i92 iA0 iB0 iC3 iA2 iB0 iC0 iD3 iB2 iC0 iD0 iE3 iC2 iD0 iE0 iF3 iD2 iE0 iF0 iG3 iE2 iF0 iG0 iH3 iF2 iG0 iH0 iI3 iG2 iH0 iI0 iJ3 iH2 iI0 iJ0 iK3 iI2 iJ0 iK0 iL3 iJ2 iK0 iL0 iM3 iK2 iL0 iM0 iN3 iL2 iM0 iN0 iO3 iM2 iN0 iO0 iP3 iN2 iO0 iP0 iQ3 iO2 iP0 iQ0 iR3 iP2 iQ0 iR0 iS3 iQ2 iR0 iS0 iT3 iR2 iS0 iT0 iU3 iS2 iT0 iU0 iV3 iT2 iU0 iV0 iW3 iU2 iV0 iW0 iX3 iV2 iW0 iX0 iY3 iW2 iX0 iY0 iZ3 i02 i10 i20 i34 i12 i20 i30 i44 i22 i30 i40 i54 i32 i40 i50 i64 i42 i50 i60 i74 i52 i60 i70 i84 i62 i70 i80 i94 i72 i80 i90 iA4 i82 i90 iA0 iB4 i92 iA0 iB0 iC4 iA2 iB0 iC0 iD4 iB2 iC0 iD0 iE4 iC2 iD0 iE0 iF4 iD2 iE0 iF0 iG4 iE2 iF0 iG0 iH4 iF2 iG0 iH0 iI4 iG2 iH0 iI0 iJ4 iH2 iI0 iJ0 iK4 iI2 iJ0 iK0 iL4 iJ2 iK0 iL0 iM4 iK2 iL0 iM0 iN4 iL2 iM0 iN0 iO4 iM2 iN0 iO0 iP4 iN2 iO0 iP0 iQ4 iO2 iP0 iQ0 iR4 iP2 iQ0 iR0 iS4 iQ2 iR0 iS0 iT4 iR2 iS0 iT0 iU4 iS2 iT0 iU0 iV4 iT2 iU0 iV0 iW4 iU2 iV0 iW0 iX4 iV2 iW0 iX0 iY4 iW2 iX0 iY0 iZ4 i02 i10 i20 i35 i12 i20 i30 i45 i22 i30 i40 i55 i32 i40 i50 i65 i42 i50 i60 i75 i52 i60 i70 i85 i62 i70 i80 i95 i72 i80 i90 iA5 i82 i90 iA0 iB5 i92 iA0 iB0 iC5 iA2 iB0 iC0 iD5 iB2 iC0 iD0 iE5 iC2 iD0 iE0 iF5 iD2 iE0 iF0 iG5 iE2 iF0 iG0 iH5 iF2 iG0 iH0 iI5 iG2 iH0 iI0 iJ5 iH2 iI0 iJ0 iK5 iI2 iJ0 iK0 iL5 iJ2 iK0 iL0 iM5 iK2 iL0 iM0 iN5 iL2 iM0 iN0 iO5 iM2 iN0 iO0 iP5 iN2 iO0 iP0 iQ5 iO2 iP0 iQ0 iR5 iP2 iQ0 iR0 iS5 iQ2 iR0 iS0 iT5 iR2 iS0 iT0 iU5 iS2 iT0 iU0 iV5 iT2 iU0 iV0 iW5 iU2 iV0 iW0 iX5 iV2 iW0 iX0 iY5 iW2 iX0 iY0 iZ5 i02 i10 i20 i36 i12 i20 i30 i46 i22 i30 i40 i56 i32 i40 i50 i66 i42 i50 i60 i76 i52 i60 i70 i86 i62 i70 i80 i96 i72 i80 i90 iA6 i82 i90 iA0 iB6 i92 iA0 iB0 iC6 iA2 iB0 iC0 iD6 iB2 iC0 iD0 iE6 iC2 iD0 iE0 iF6 iD2 iE0 iF0 iG6 iE2 iF0 iG0 iH6 iF2 iG0 iH0 iI6 iG2 iH0 iI0 iJ6 iH2 iI0 iJ0 iK6 iI2 iJ0 iK0 iL6 iJ2 iK0 iL0 iM6 iK2 iL0 iM0 iN6 iL2 iM0 iN0 iO6 iM2 iN0 iO0 iP6 iN2 iO0 iP0 iQ6 iO2 iP0 iQ0 iR6 iP2 iQ0 iR0 iS6 iQ2 iR0 iS0 iT6 iR2 iS0 iT0 iU6 iS2 iT0 iU0 iV6 iT2 iU0 iV0 iW6 iU2 iV0 iW0 iX6 iV2 iW0 iX0 iY6 iW2 iX0 iY0 iZ6 i02 i10 i20 i37 i12 i20 i30 i47 i22 i30 i40 i57 i32 i40 i50 i67 i42 i50 i60 i77 i52 i60 i70 i87 i62 i70 i80 i97 i72 i80 i90 iA7 i82 i90 iA0 iB7 i92 iA0 iB0 iC7 iA2 iB0 iC0 iD7 iB2 iC0 iD0 iE7 iC2 iD0 iE0 iF7 iD2 iE0 iF0 iG7 iE2 iF0 iG0 iH7 iF2 iG0 iH0 iI7 iG2 iH0 iI0 iJ7 iH2 iI0 iJ0 iK7 iI2 iJ0 iK0 iL7 iJ2 iK0 iL0 iM7 iK2 iL0 iM0 iN7 iL2 iM0 iN0 iO7 iM2 iN0 iO0 iP7 iN2 iO0 iP0 iQ7 iO2 iP0 iQ0 iR7 iP2 iQ0 iR0 iS7 iQ2 iR0 iS0 iT7 iR2 iS0 iT0 iU7 iS2 iT0 iU0 iV7 iT2 iU0 iV0 iW7 iU2 iV0 iW0 iX7 iV2 iW0 iX0 iY7 iW2 iX0 iY0 iZ7 i02 i10 i20 i38 i12 i20 i30 i48 i22 i30 i40 i58 i32 i40 i50 i68 i42 i50 i60 i78 i52 i60 i70 i88 i62 i70 i80 i98 i72 i80 i90 iA8 i82 i90 iA0 iB8 i92 iA0 iB0 iC8 iA2 iB0 iC0 iD8 iB2 iC0 iD0 iE8 iC2 iD0 iE0 iF8 iD2 iE0 iF0 iG8 iE2 iF0 iG0 iH8 iF2 iG0 iH0 iI8 iG2 iH0 iI0 iJ8 iH2 iI0 iJ0 iK8 iI2 iJ0 iK0 iL8 iJ2 iK0 iL0 iM8 iK2 iL0 iM0 iN8 iL2 iM0 iN0 iO8 iM2 iN0 iO0 iP8 iN2 iO0 iP0 iQ8 iO2 iP0 iQ0 iR8 iP2 iQ0 iR0 iS8 iQ2 iR0 iS0 iT8 iR2 iS0 iT0 iU8 iS2 iT0 iU0 iV8 iT2 iU0 iV0 iW8 iU2 iV0 iW0 iX8 iV2 iW0 iX0 iY8 iW2 iX0 iY0 iZ8 i02 i10 i20 i39 i12 i20 i30 i49 i22 i30 i40 i59 i32 i40 i50 i69 i42 i50 i60 i79 i52 i60 i70 i89 i62 i70 i80 i99 i72 i80 i90 iA9 i82 i90 iA0 iB9 i92 iA0 iB0 iC9 iA2 iB0 iC0 iD9 iB2 iC0 iD0 iE9 iC2 iD0 iE0 iF9 iD2 iE0 iF0 iG9 iE2 iF0 iG0 iH9 iF2 iG0 iH0 iI9 iG2 iH0 iI0 iJ9 iH2 iI0 iJ0 iK9 iI2 iJ0 iK0 iL9 iJ2 iK0 iL0 iM9 iK2 iL0 iM0 iN9 iL2 iM0 iN0 iO9 iM2 iN0 iO0 iP9 iN2 iO0 iP0 iQ9 iO2 iP0 iQ0 iR9 iP2 iQ0 iR0 iS9 iQ2 iR0 iS0 iT9 iR2 iS0 iT0 iU9 iS2 iT0 iU0 iV9 iT2 iU0 iV0 iW9 iU2 iV0 iW0 iX9 iV2 iW0 iX0 iY9 iW2 iX0 iY0 iZ9 i02 i10 i21 i30 i12 i20 i31 i40 i22 i30 i41 i50 i32 i40 i51 i60 i42 i50 i61 i70 i52 i60 i71 i80 i62 i70 i81 i90 i72 i80 i91 iA0 i82 i90 iA1 iB0 i92 iA0 iB1 iC0 iA2 iB0 iC1 iD0 iB2 iC0 iD1 iE0 iC2 iD0 iE1 iF0 iD2 iE0 iF1 iG0 iE2 iF0 iG1 iH0 iF2 iG0 iH1 iI0 iG2 iH0 iI1 iJ0 iH2 iI0 iJ1 iK0 iI2 iJ0 iK1 iL0 iJ2 iK0 iL1 iM0 iK2 iL0 iM1 iN0 iL2 iM0 iN1 iO0 iM2 iN0 iO1 iP0 iN2 iO0 iP1 iQ0 iO2 iP0 iQ1 iR0 iP2 iQ0 iR1 iS0 iQ2 iR0 iS1 iT0 iR2 iS0 iT1 iU0 iS2 iT0 iU1 iV0 iT2 iU0 iV1 iW0 iU2 iV0 iW1 iX0 iV2 iW0 iX1 iY0 iW2 iX0 iY1 iZ0 i02 i10 i21 i31 i12 i20 i31 i41 i22 i30 i41 i51 i32 i40 i51 i61 i42 i50 i61 i71 i52 i60 i71 i81 i62 i70 i81 i91 i72 i80 i91 iA1 i82 i90 iA1 iB1 i92 iA0 iB1 iC1 iA2 iB0 iC1 iD1 iB2 iC0 iD1 iE1 iC2 iD0 iE1 iF1 iD2 iE0 iF1 iG1 iE2 iF0 iG1 iH1 iF2 iG0 iH1 iI1 iG2 iH0 iI1 iJ1 iH2 iI0 iJ1 iK1 iI2 iJ0 iK1 iL1 iJ2 iK0 iL1 iM1 iK2 iL0 iM1 iN1 iL2 iM0 iN1 iO1 iM2 iN0 iO1 iP1 iN2 iO0 iP1 iQ1 iO2 iP0 iQ1 iR1 iP2 iQ0 iR1 iS1 iQ2 iR0 iS1 iT1 iR2 iS0 iT1 iU1 iS2 iT0 iU1 iV1 iT2 iU0 iV1 iW1 iU2 iV0 iW1 iX1 iV2 iW0 iX1 iY1 iW2 iX0 iY1 iZ1 i02 i10 i21 i32 i12 i20 i31 i42 i22 i30 i41 i52 i32 i40 i51 i62 i42 i50 i61 i72 i52 i60 i71 i82 i62 i70 i81 i92 i72 i80 i91 iA2 i82 i90 iA1 iB2 i92 iA0 iB1 iC2 iA2 iB0 iC1 iD2 iB2 iC0 iD1 iE2 iC2 iD0 iE1 iF2 iD2 iE0 iF1 iG2 iE2 iF0 iG1 iH2 iF2 iG0 iH1 iI2 iG2 iH0 iI1 iJ2 iH2 iI0 iJ1 iK2 iI2 iJ0 iK1 iL2 iJ2 iK0 iL1 iM2 iK2 iL0 iM1 iN2 iL2 iM0 iN1 iO2 iM2 iN0 iO1 iP2 iN2 iO0 iP1 iQ2 iO2 iP0 iQ1 iR2 iP2 iQ0 iR1 iS2 iQ2 iR0 iS1 iT2 iR2 iS0 iT1 iU2 iS2 iT0 iU1 iV2 iT2 iU0 iV1 iW2 iU2 iV0 iW1 iX2 iV2 iW0 iX1 iY2 iW2 iX0 iY1 iZ2 i02 i10 i21 i33 i12 i20 i31 i43 i22 i30 i41 i53 i32 i40 i51 i63 i42 i50 i61 i73 i52 i60 i71 i83 i62 i70 i81 i93 i72 i80 i91 iA3 i82 i90 iA1 iB3 i92 iA0 iB1 iC3 iA2 iB0 iC1 iD3 iB2 iC0 iD1 iE3 iC2 iD0 iE1 iF3 iD2 iE0 iF1 iG3 iE2 iF0 iG1 iH3 iF2 iG0 iH1 iI3 iG2 iH0 iI1 iJ3 iH2 iI0 iJ1 iK3 iI2 iJ0 iK1 iL3 iJ2 iK0 iL1 iM3 iK2 iL0 iM1 iN3 iL2 iM0 iN1 iO3 iM2 iN0 iO1 iP3 iN2 iO0 iP1 iQ3 iO2 iP0 iQ1 iR3 iP2 iQ0 iR1 iS3 iQ2 iR0 iS1 iT3 iR2 iS0 iT1 iU3 iS2 iT0 iU1 iV3 iT2 iU0 iV1 iW3 iU2 iV0 iW1 iX3 iV2 iW0 iX1 iY3 iW2 iX0 iY1 iZ3 i02 i10 i21 i34 i12 i20 i31 i44 i22 i30 i41 i54 i32 i40 i51 i64 i42 i50 i61 i74 i52 i60 i71 i84 i62 i70 i81 i94 i72 i80 i91 iA4 i82 i90 iA1 iB4 i92 iA0 iB1 iC4 iA2 iB0 iC1 iD4 iB2 iC0 iD1 iE4 iC2 iD0 iE1 iF4 iD2 iE0 iF1 iG4 iE2 iF0 iG1 iH4 iF2 iG0 iH1 iI4 iG2 iH0 iI1 iJ4 iH2 iI0 iJ1 iK4 iI2 iJ0 iK1 iL4 iJ2 iK0 iL1 iM4 iK2 iL0 iM1 iN4 iL2 iM0 iN1 iO4 iM2 iN0 iO1 iP4 iN2 iO0 iP1 iQ4 iO2 iP0 iQ1 iR4 iP2 iQ0 iR1 iS4 iQ2 iR0 iS1 iT4 iR2 iS0 iT1 iU4 iS2 iT0 iU1 iV4 iT2 iU0 iV1 iW4 iU2 iV0 iW1 iX4 iV2 iW0 iX1 iY4 iW2 iX0 iY1 iZ4 i02 i10 i21 i35 i12 i20 i31 i45 i22 i30 i41 i55 i32 i40 i51 i65 i42 i50 i61 i75 i52 i60 i71 i85 i62 i70 i81 i95 i72 i80 i91 iA5 i82 i90 iA1 iB5 i92 iA0 iB1 iC5 iA2 iB0 iC1 iD5 iB2 iC0 iD1 iE5 iC2 iD0 iE1 iF5 iD2 iE0 iF1 iG5 iE2 iF0 iG1 iH5 iF2 iG0 iH1 iI5 iG2 iH0 iI1 iJ5 iH2 iI0 iJ1 iK5 iI2 iJ0 iK1 iL5 iJ2 iK0 iL1 iM5 iK2 iL0 iM1 iN5 iL2 iM0 iN1 iO5 iM2 iN0 iO1 iP5 iN2 iO0 iP1 iQ5 iO2 iP0 iQ1 iR5 iP2 iQ0 iR1 iS5 iQ2 iR0 iS1 iT5 iR2 iS0 iT1 iU5 iS2 iT0 iU1 iV5 iT2 iU0 iV1 iW5 iU2 iV0 iW1 iX5 iV2 iW0 iX1 iY5 iW2 iX0 iY1 iZ5 i02 i10 i21 i36 i12 i20 i31 i46 i22 i30 i41 i56 i32 i40 i51 i66 i42 i50 i61 i76 i52 i60 i71 i86 i62 i70 i81 i96 i72 i80 i91 iA6 i82 i90 iA1 iB6 i92 iA0 iB1 iC6 iA2 iB0 iC1 iD6 iB2 iC0 iD1 iE6 iC2 iD0 iE1 iF6 iD2 iE0 iF1 iG6 iE2 iF0 iG1 iH6 iF2 iG0 iH1 iI6 iG2 iH0 iI1 iJ6 iH2 iI0 iJ1 iK6 iI2 iJ0 iK1 iL6 iJ2 iK0 iL1 iM6 iK2 iL0 iM1 iN6 iL2 iM0 iN1 iO6 iM2 iN0 iO1 iP6 iN2 iO0 iP1 iQ6 iO2 iP0 iQ1 iR6 iP2 iQ0 iR1 iS6 iQ2 iR0 iS1 iT6 iR2 iS0 iT1 iU6 iS2 iT0 iU1 iV6 iT2 iU0 iV1 iW6 iU2 iV0 iW1 iX6 iV2 iW0 iX1 iY6 iW2 iX0 iY1 iZ6 i02 i10 i21 i37 i12 i20 i31 i47 i22 i30 i41 i57 i32 i40 i51 i67 i42 i50 i61 i77 i52 i60 i71 i87 i62 i70 i81 i97 i72 i80 i91 iA7 i82 i90 iA1 iB7 i92 iA0 iB1 iC7 iA2 iB0 iC1 iD7 iB2 iC0 iD1 iE7 iC2 iD0 iE1 iF7 iD2 iE0 iF1 iG7 iE2 iF0 iG1 iH7 iF2 iG0 iH1 iI7 iG2 iH0 iI1 iJ7 iH2 iI0 iJ1 iK7 iI2 iJ0 iK1 iL7 iJ2 iK0 iL1 iM7 iK2 iL0 iM1 iN7 iL2 iM0 iN1 iO7 iM2 iN0 iO1 iP7 iN2 iO0 iP1 iQ7 iO2 iP0 iQ1 iR7 iP2 iQ0 iR1 iS7 iQ2 iR0 iS1 iT7 iR2 iS0 iT1 iU7 iS2 iT0 iU1 iV7 iT2 iU0 iV1 iW7 iU2 iV0 iW1 iX7 iV2 iW0 iX1 iY7 iW2 iX0 iY1 iZ7 i02 i10 i21 i38 i12 i20 i31 i48 i22 i30 i41 i58 i32 i40 i51 i68 i42 i50 i61 i78 i52 i60 i71 i88 i62 i70 i81 i98 i72 i80 i91 iA8 i82 i90 iA1 iB8 i92 iA0 iB1 iC8 iA2 iB0 iC1 iD8 iB2 iC0 iD1 iE8 iC2 iD0 iE1 iF8 iD2 iE0 iF1 iG8 iE2 iF0 iG1 iH8 iF2 iG0 iH1 iI8 iG2 iH0 iI1 iJ8 iH2 iI0 iJ1 iK8 iI2 iJ0 iK1 iL8 iJ2 iK0 iL1 iM8 iK2 iL0 iM1 iN8 iL2 iM0 iN1 iO8 iM2 iN0 iO1 iP8 iN2 iO0 iP1 iQ8 iO2 iP0 iQ1 iR8 iP2 iQ0 iR1 iS8 iQ2 iR0 iS1 iT8 iR2 iS0 iT1 iU8 iS2 iT0 iU1 iV8 iT2 iU0 iV1 iW8 iU2 iV0 iW1 iX8 iV2 iW0 iX1 iY8 iW2 iX0 iY1 iZ8 i02 i10 i21 i39 i12 i20 i31 i49 i22 i30 i41 i59 i32 i40 i51 i69 i42 i50 i61 i79 i52 i60 i71 i89 i62 i70 i81 i99 i72 i80 i91 iA9 i82 i90 iA1 iB9 i92 iA0 iB1 iC9 iA2 iB0 iC1 iD9 iB2 iC0 iD1 iE9 iC2 iD0 iE1 iF9 iD2 iE0 iF1 iG9 iE2 iF0 iG1 iH9 iF2 iG0 iH1 iI9 iG2 iH0 iI1 iJ9 iH2 iI0 iJ1 iK9 iI2 iJ0 iK1 iL9 iJ2 iK0 iL1 iM9 iK2 iL0 iM1 iN9 iL2 iM0 iN1 iO9 iM2 iN0 iO1 iP9 iN2 iO0 iP1 iQ9 iO2 iP0 iQ1 iR9 iP2 iQ0 iR1 iS9 iQ2 iR0 iS1 iT9 iR2 iS0 iT1 iU9 iS2 iT0 iU1 iV9 iT2 iU0 iV1 iW9 iU2 iV0 iW1 iX9 iV2 iW0 iX1 iY9 iW2 iX0 iY1 iZ9 i02 i10 i22 i30 i12 i20 i32 i40 i22 i30 i42 i50 i32 i40 i52 i60 i42 i50 i62 i70 i52 i60 i72 i80 i62 i70 i82 i90 i72 i80 i92 iA0 i82 i90 iA2 iB0 i92 iA0 iB2 iC0 iA2 iB0 iC2 iD0 iB2 iC0 iD2 iE0 iC2 iD0 iE2 iF0 iD2 iE0 iF2 iG0 iE2 iF0 iG2 iH0 iF2 iG0 iH2 iI0 iG2 iH0 iI2 iJ0 iH2 iI0 iJ2 iK0 iI2 iJ0 iK2 iL0 iJ2 iK0 iL2 iM0 iK2 iL0 iM2 iN0 iL2 iM0 iN2 iO0 iM2 iN0 iO2 iP0 iN2 iO0 iP2 iQ0 iO2 iP0 iQ2 iR0 iP2 iQ0 iR2 iS0 iQ2 iR0 iS2 iT0 iR2 iS0 iT2 iU0 iS2 iT0 iU2 iV0 iT2 iU0 iV2 iW0 iU2 iV0 iW2 iX0 iV2 iW0 iX2 iY0 iW2 iX0 iY2 iZ0 i02 i10 i22 i31 i12 i20 i32 i41 i22 i30 i42 i51 i32 i40 i52 i61 i42 i50 i62 i71 i52 i60 i72 i81 i62 i70 i82 i91 i72 i80 i92 iA1 i82 i90 iA2 iB1 i92 iA0 iB2 iC1 iA2 iB0 iC2 iD1 iB2 iC0 iD2 iE1 iC2 iD0 iE2 iF1 iD2 iE0 iF2 iG1 iE2 iF0 iG2 iH1 iF2 iG0 iH2 iI1 iG2 iH0 iI2 iJ1 iH2 iI0 iJ2 iK1 iI2 iJ0 iK2 iL1 iJ2 iK0 iL2 iM1 iK2 iL0 iM2 iN1 iL2 iM0 iN2 iO1 iM2 iN0 iO2 iP1 iN2 iO0 iP2 iQ1 iO2 iP0 iQ2 iR1 iP2 iQ0 iR2 iS1 iQ2 iR0 iS2 iT1 iR2 iS0 iT2 iU1 iS2 iT0 iU2 iV1 iT2 iU0 iV2 iW1 iU2 iV0 iW2 iX1 iV2 iW0 iX2 iY1 iW2 iX0 iY2 iZ1 i02 i10 i22 i32 i12 i20 i32 i42 i22 i30 i42 i52 i32 i40 i52 i62 i42 i50 i62 i72 i52 i60 i72 i82 i62 i70 i82 i92 i72 i80 i92 iA2 i82 i90 iA2 iB2 i92 iA0 iB2 iC2 iA2 iB0 iC2 iD2 iB2 iC0 iD2 iE2 iC2 iD0 iE2 iF2 iD2 iE0 iF2 iG2 iE2 iF0 iG2 iH2 iF2 iG0 iH2 iI2 iG2 iH0 iI2 iJ2 iH2 iI0 iJ2 iK2 iI2 iJ0 iK2 iL2 iJ2 iK0 iL2 iM2 iK2 iL0 iM2 iN2 iL2 iM0 iN2 iO2 iM2 iN0 iO2 iP2 iN2 iO0 iP2 iQ2 iO2 iP0 iQ2 iR2 iP2 iQ0 iR2 iS2 iQ2 iR0 iS2 iT2 iR2 iS0 iT2 iU2 iS2 iT0 iU2 iV2 iT2 iU0 iV2 iW2 iU2 iV0 iW2 iX2 iV2 iW0 iX2 iY2 iW2 iX0 iY2 iZ2 i02 i10 i22 i33 i12 i20 i32 i43 i22 i30 i42 i53 i32 i40 i52 i63 i42 i50 i62 i73 i52 i60 i72 i83 i62 i70 i82 i93 i72 i80 i92 iA3 i82 i90 iA2 iB3 i92 iA0 iB2 iC3 iA2 iB0 iC2 iD3 iB2 iC0 iD2 iE3 iC2 iD0 iE2 iF3 iD2 iE0 iF2 iG3 iE2 iF0 iG2 iH3 iF2 iG0 iH2 iI3 iG2 iH0 iI2 iJ3 iH2 iI0 iJ2 iK3 iI2 iJ0 iK2 iL3 iJ2 iK0 iL2 iM3 iK2 iL0 iM2 iN3 iL2 iM0 iN2 iO3 iM2 iN0 iO2 iP3 iN2 iO0 iP2 iQ3 iO2 iP0 iQ2 iR3 iP2 iQ0 iR2 iS3 iQ2 iR0 iS2 iT3 iR2 iS0 iT2 iU3 iS2 iT0 iU2 iV3 iT2 iU0 iV2 iW3 iU2 iV0 iW2 iX3 iV2 iW0 iX2 iY3 iW2 iX0 iY2 iZ3 i02 i10 i22 i34 i12 i20 i32 i44 i22 i30 i42 i54 i32 i40 i52 i64 i42 i50 i62 i74 i52 i60 i72 i84 i62 i70 i82 i94 i72 i80 i92 iA4 i82 i90 iA2 iB4 i92 iA0 iB2 iC4 iA2 iB0 iC2 iD4 iB2 iC0 iD2 iE4 iC2 iD0 iE2 iF4 iD2 iE0 iF2 iG4 iE2 iF0 iG2 iH4 iF2 iG0 iH2 iI4 iG2 iH0 iI2 iJ4 iH2 iI0 iJ2 iK4 iI2 iJ0 iK2 iL4 iJ2 iK0 iL2 iM4 iK2 iL0 iM2 iN4 iL2 iM0 iN2 iO4 iM2 iN0 iO2 iP4 iN2 iO0 iP2 iQ4 iO2 iP0 iQ2 iR4 iP2 iQ0 iR2 iS4 iQ2 iR0 iS2 iT4 iR2 iS0 iT2 iU4 iS2 iT0 iU2 iV4 iT2 iU0 iV2 iW4 iU2 iV0 iW2 iX4 iV2 iW0 iX2 iY4 iW2 iX0 iY2 iZ4 i02 i10 i22 i35 i12 i20 i32 i45 i22 i30 i42 i55 i32 i40 i52 i65 i42 i50 i62 i75 i52 i60 i72 i85 i62 i70 i82 i95 i72 i80 i92 iA5 i82 i90 iA2 iB5 i92 iA0 iB2 iC5 iA2 iB0 iC2 iD5 iB2 iC0 iD2 iE5 iC2 iD0 iE2 iF5 iD2 iE0 iF2 iG5 iE2 iF0 iG2 iH5 iF2 iG0 iH2 iI5 iG2 iH0 iI2 iJ5 iH2 iI0 iJ2 iK5 iI2 iJ0 iK2 iL5 iJ2 iK0 iL2 iM5 iK2 iL0 iM2 iN5 iL2 iM0 iN2 iO5 iM2 iN0 iO2 iP5 iN2 iO0 iP2 iQ5 iO2 iP0 iQ2 iR5 iP2 iQ0 iR2 iS5 iQ2 iR0 iS2 iT5 iR2 iS0 iT2 iU5 iS2 iT0 iU2 iV5 iT2 iU0 iV2 iW5 iU2 iV0 iW2 iX5 iV2 iW0 iX2 iY5 iW2 iX0 iY2 iZ5 i02 i10 i22 i36 i12 i20 i32 i46 i22 i30 i42 i56 i32 i40 i52 i66 i42 i50 i62 i76 i52 i60 i72 i86 i62 i70 i82 i96 i72 i80 i92 iA6 i82 i90 iA2 iB6 i92 iA0 iB2 iC6 iA2 iB0 iC2 iD6 iB2 iC0 iD2 iE6 iC2 iD0 iE2 iF6 iD2 iE0 iF2 iG6 iE2 iF0 iG2 iH6 iF2 iG0 iH2 iI6 iG2 iH0 iI2 iJ6 iH2 iI0 iJ2 iK6 iI2 iJ0 iK2 iL6 iJ2 iK0 iL2 iM6 iK2 iL0 iM2 iN6 iL2 iM0 iN2 iO6 iM2 iN0 iO2 iP6 iN2 iO0 iP2 iQ6 iO2 iP0 iQ2 iR6 iP2 iQ0 iR2 iS6 iQ2 iR0 iS2 iT6 iR2 iS0 iT2 iU6 iS2 iT0 iU2 iV6 iT2 iU0 iV2 iW6 iU2 iV0 iW2 iX6 iV2 iW0 iX2 iY6 iW2 iX0 iY2 iZ6 i02 i10 i22 i37 i12 i20 i32 i47 i22 i30 i42 i57 i32 i40 i52 i67 i42 i50 i62 i77 i52 i60 i72 i87 i62 i70 i82 i97 i72 i80 i92 iA7 i82 i90 iA2 iB7 i92 iA0 iB2 iC7 iA2 iB0 iC2 iD7 iB2 iC0 iD2 iE7 iC2 iD0 iE2 iF7 iD2 iE0 iF2 iG7 iE2 iF0 iG2 iH7 iF2 iG0 iH2 iI7 iG2 iH0 iI2 iJ7 iH2 iI0 iJ2 iK7 iI2 iJ0 iK2 iL7 iJ2 iK0 iL2 iM7 iK2 iL0 iM2 iN7 iL2 iM0 iN2 iO7 iM2 iN0 iO2 iP7 iN2 iO0 iP2 iQ7 iO2 iP0 iQ2 iR7 iP2 iQ0 iR2 iS7 iQ2 iR0 iS2 iT7 iR2 iS0 iT2 iU7 iS2 iT0 iU2 iV7 iT2 iU0 iV2 iW7 iU2 iV0 iW2 iX7 iV2 iW0 iX2 iY7 iW2 iX0 iY2 iZ7 i02 i10 i22 i38 i12 i20 i32 i48 i22 i30 i42 i58 i32 i40 i52 i68 i42 i50 i62 i78 i52 i60 i72 i88 i62 i70 i82 i98 i72 i80 i92 iA8 i82 i90 iA2 iB8 i92 iA0 iB2 iC8 iA2 iB0 iC2 iD8 iB2 iC0 iD2 iE8 iC2 iD0 iE2 iF8 iD2 iE0 iF2 iG8 iE2 iF0 iG2 iH8 iF2 iG0 iH2 iI8 iG2 iH0 iI2 iJ8 iH2 iI0 iJ2 iK8 iI2 iJ0 iK2 iL8 iJ2 iK0 iL2 iM8 iK2 iL0 iM2 iN8 iL2 iM0 iN2 iO8 iM2 iN0 iO2 iP8 iN2 iO0 iP2 iQ8 iO2 iP0 iQ2 iR8 iP2 iQ0 iR2 iS8 iQ2 iR0 iS2 iT8 iR2 iS0 iT2 iU8 iS2 iT0 iU2 iV8 iT2 iU0 iV2 iW8 iU2 iV0 iW2 iX8 iV2 iW0 iX2 iY8 iW2 iX0 iY2 iZ8 i02 i10 i22 i39 i12 i20 i32 i49 i22 i30 i42 i59 i32 i40 i52 i69 i42 i50 i62 i79 i52 i60 i72 i89 i62 i70 i82 i99 i72 i80 i92 iA9 i82 i90 iA2 iB9 i92 iA0 iB2 iC9 iA2 iB0 iC2 iD9 iB2 iC0 iD2 iE9 iC2 iD0 iE2 iF9 iD2 iE0 iF2 iG9 iE2 iF0 iG2 iH9 iF2 iG0 iH2 iI9 iG2 iH0 iI2 iJ9 iH2 iI0 iJ2 iK9 iI2 iJ0 iK2 iL9 iJ2 iK0 iL2 iM9 iK2 iL0 iM2 iN9 iL2 iM0 iN2 iO9 iM2 iN0 iO2 iP9 iN2 iO0 iP2 iQ9 iO2 iP0 iQ2 iR9 iP2 iQ0 iR2 iS9 iQ2 iR0 iS2 iT9 iR2 iS0 iT2 iU9 iS2 iT0 iU2 iV9 iT2 iU0 iV2 iW9 iU2 iV0 iW2 iX9 iV2 iW0 iX2 iY9 iW2 iX0 iY2 iZ9 i02 i10 i23 i30 i12 i20 i33 i40 i22 i30 i43 i50 i32 i40 i53 i60 i42 i50 i63 i70 i52 i60 i73 i80 i62 i70 i83 i90 i72 i80 i93 iA0 i82 i90 iA3 iB0 i92 iA0 iB3 iC0 iA2 iB0 iC3 iD0 iB2 iC0 iD3 iE0 iC2 iD0 iE3 iF0 iD2 iE0 iF3 iG0 iE2 iF0 iG3 iH0 iF2 iG0 iH3 iI0 iG2 iH0 iI3 iJ0 iH2 iI0 iJ3 iK0 iI2 iJ0 iK3 iL0 iJ2 iK0 iL3 iM0 iK2 iL0 iM3 iN0 iL2 iM0 iN3 iO0 iM2 iN0 iO3 iP0 iN2 iO0 iP3 iQ0 iO2 iP0 iQ3 iR0 iP2 iQ0 iR3 iS0 iQ2 iR0 iS3 iT0 iR2 iS0 iT3 iU0 iS2 iT0 iU3 iV0 iT2 iU0 iV3 iW0 iU2 iV0 iW3 iX0 iV2 iW0 iX3 iY0 iW2 iX0 iY3 iZ0 i02 i10 i23 i31 i12 i20 i33 i41 i22 i30 i43 i51 i32 i40 i53 i61 i42 i50 i63 i71 i52 i60 i73 i81 i62 i70 i83 i91 i72 i80 i93 iA1 i82 i90 iA3 iB1 i92 iA0 iB3 iC1 iA2 iB0 iC3 iD1 iB2 iC0 iD3 iE1 iC2 iD0 iE3 iF1 iD2 iE0 iF3 iG1 iE2 iF0 iG3 iH1 iF2 iG0 iH3 iI1 iG2 iH0 iI3 iJ1 iH2 iI0 iJ3 iK1 iI2 iJ0 iK3 iL1 iJ2 iK0 iL3 iM1 iK2 iL0 iM3 iN1 iL2 iM0 iN3 iO1 iM2 iN0 iO3 iP1 iN2 iO0 iP3 iQ1 iO2 iP0 iQ3 iR1 iP2 iQ0 iR3 iS1 iQ2 iR0 iS3 iT1 iR2 iS0 iT3 iU1 iS2 iT0 iU3 iV1 iT2 iU0 iV3 iW1 iU2 iV0 iW3 iX1 iV2 iW0 iX3 iY1 iW2 iX0 iY3 iZ1 i02 i10 i23 i32 i12 i20 i33 i42 i22 i30 i43 i52 i32 i40 i53 i62 i42 i50 i63 i72 i52 i60 i73 i82 i62 i70 i83 i92 i72 i80 i93 iA2 i82 i90 iA3 iB2 i92 iA0 iB3 iC2 iA2 iB0 iC3 iD2 iB2 iC0 iD3 iE2 iC2 iD0 iE3 iF2 iD2 iE0 iF3 iG2 iE2 iF0 iG3 iH2 iF2 iG0 iH3 iI2 iG2 iH0 iI3 iJ2 iH2 iI0 iJ3 iK2 iI2 iJ0 iK3 iL2 iJ2 iK0 iL3 iM2 iK2 iL0 iM3 iN2 iL2 iM0 iN3 iO2 iM2 iN0 iO3 iP2 iN2 iO0 iP3 iQ2 iO2 iP0 iQ3 iR2 iP2 iQ0 iR3 iS2 iQ2 iR0 iS3 iT2 iR2 iS0 iT3 iU2 iS2 iT0 iU3 iV2 iT2 iU0 iV3 iW2 iU2 iV0 iW3 iX2 iV2 iW0 iX3 iY2 iW2 iX0 iY3 iZ2 i02 i10 i23 i33 i12 i20 i33 i43 i22 i30 i43 i53 i32 i40 i53 i63 i42 i50 i63 i73 i52 i60 i73 i83 i62 i70 i83 i93 i72 i80 i93 iA3 i82 i90 iA3 iB3 i92 iA0 iB3 iC3 iA2 iB0 iC3 iD3 iB2 iC0 iD3 iE3 iC2 iD0 iE3 iF3 iD2 iE0 iF3 iG3 iE2 iF0 iG3 iH3 iF2 iG0 iH3 iI3 iG2 iH0 iI3 iJ3 iH2 iI0 iJ3 iK3 iI2 iJ0 iK3 iL3 iJ2 iK0 iL3 iM3 iK2 iL0 iM3 iN3 iL2 iM0 iN3 iO3 iM2 iN0 iO3 iP3 iN2 iO0 iP3 iQ3 iO2 iP0 iQ3 iR3 iP2 iQ0 iR3 iS3 iQ2 iR0 iS3 iT3 iR2 iS0 iT3 iU3 iS2 iT0 iU3 iV3 iT2 iU0 iV3 iW3 iU2 iV0 iW3 iX3 iV2 iW0 iX3 iY3 iW2 iX0 iY3 iZ3 i02 i10 i23 i34 i12 i20 i33 i44 i22 i30 i43 i54 i32 i40 i53 i64 i42 i50 i63 i74 i52 i60 i73 i84 i62 i70 i83 i94 i72 i80 i93 iA4 i82 i90 iA3 iB4 i92 iA0 iB3 iC4 iA2 iB0 iC3 iD4 iB2 iC0 iD3 iE4 iC2 iD0 iE3 iF4 iD2 iE0 iF3 iG4 iE2 iF0 iG3 iH4 iF2 iG0 iH3 iI4 iG2 iH0 iI3 iJ4 iH2 iI0 iJ3 iK4 iI2 iJ0 iK3 iL4 iJ2 iK0 iL3 iM4 iK2 iL0 iM3 iN4 iL2 iM0 iN3 iO4 iM2 iN0 iO3 iP4 iN2 iO0 iP3 iQ4 iO2 iP0 iQ3 iR4 iP2 iQ0 iR3 iS4 iQ2 iR0 iS3 iT4 iR2 iS0 iT3 iU4 iS2 iT0 iU3 iV4 iT2 iU0 iV3 iW4 iU2 iV0 iW3 iX4 iV2 iW0 iX3 iY4 iW2 iX0 iY3 iZ4 i02 i10 i23 i35 i12 i20 i33 i45 i22 i30 i43 i55 i32 i40 i53 i65 i42 i50 i63 i75 i52 i60 i73 i85 i62 i70 i83 i95 i72 i80 i93 iA5 i82 i90 iA3 iB5 i92 iA0 iB3 iC5 iA2 iB0 iC3 iD5 iB2 iC0 iD3 iE5 iC2 iD0 iE3 iF5 iD2 iE0 iF3 iG5 iE2 iF0 iG3 iH5 iF2 iG0 iH3 iI5 iG2 iH0 iI3 iJ5 iH2 iI0 iJ3 iK5 iI2 iJ0 iK3 iL5 iJ2 iK0 iL3 iM5 iK2 iL0 iM3 iN5 iL2 iM0 iN3 iO5 iM2 iN0 iO3 iP5 iN2 iO0 iP3 iQ5 iO2 iP0 iQ3 iR5 iP2 iQ0 iR3 iS5 iQ2 iR0 iS3 iT5 iR2 iS0 iT3 iU5 iS2 iT0 iU3 iV5 iT2 iU0 iV3 iW5 iU2 iV0 iW3 iX5 iV2 iW0 iX3 iY5 iW2 iX0 iY3 iZ5 i02 i10 i23 i36 i12 i20 i33 i46 i22 i30 i43 i56 i32 i40 i53 i66 i42 i50 i63 i76 i52 i60 i73 i86 i62 i70 i83 i96 i72 i80 i93 iA6 i82 i90 iA3 iB6 i92 iA0 iB3 iC6 iA2 iB0 iC3 iD6 iB2 iC0 iD3 iE6 iC2 iD0 iE3 iF6 iD2 iE0 iF3 iG6 iE2 iF0 iG3 iH6 iF2 iG0 iH3 iI6 iG2 iH0 iI3 iJ6 iH2 iI0 iJ3 iK6 iI2 iJ0 iK3 iL6 iJ2 iK0 iL3 iM6 iK2 iL0 iM3 iN6 iL2 iM0 iN3 iO6 iM2 iN0 iO3 iP6 iN2 iO0 iP3 iQ6 iO2 iP0 iQ3 iR6 iP2 iQ0 iR3 iS6 iQ2 iR0 iS3 iT6 iR2 iS0 iT3 iU6 iS2 iT0 iU3 iV6 iT2 iU0 iV3 iW6 iU2 iV0 iW3 iX6 iV2 iW0 iX3 iY6 iW2 iX0 iY3 iZ6 i02 i10 i23 i37 i12 i20 i33 i47 i22 i30 i43 i57 i32 i40 i53 i67 i42 i50 i63 i77 i52 i60 i73 i87 i62 i70 i83 i97 i72 i80 i93 iA7 i82 i90 iA3 iB7 i92 iA0 iB3 iC7 iA2 iB0 iC3 iD7 iB2 iC0 iD3 iE7 iC2 iD0 iE3 iF7 iD2 iE0 iF3 iG7 iE2 iF0 iG3 iH7 iF2 iG0 iH3 iI7 iG2 iH0 iI3 iJ7 iH2 iI0 iJ3 iK7 iI2 iJ0 iK3 iL7 iJ2 iK0 iL3 iM7 iK2 iL0 iM3 iN7 iL2 iM0 iN3 iO7 iM2 iN0 iO3 iP7 iN2 iO0 iP3 iQ7 iO2 iP0 iQ3 iR7 iP2 iQ0 iR3 iS7 iQ2 iR0 iS3 iT7 iR2 iS0 iT3 iU7 iS2 iT0 iU3 iV7 iT2 iU0 iV3 iW7 iU2 iV0 iW3 iX7 iV2 iW0 iX3 iY7 iW2 iX0 iY3 iZ7 i02 i10 i23 i38 i12 i20 i33 i48 i22 i30 i43 i58 i32 i40 i53 i68 i42 i50 i63 i78 i52 i60 i73 i88 i62 i70 i83 i98 i72 i80 i93 iA8 i82 i90 iA3 iB8 i92 iA0 iB3 iC8 iA2 iB0 iC3 iD8 iB2 iC0 iD3 iE8 iC2 iD0 iE3 iF8 iD2 iE0 iF3 iG8 iE2 iF0 iG3 iH8 iF2 iG0 iH3 iI8 iG2 iH0 iI3 iJ8 iH2 iI0 iJ3 iK8 iI2 iJ0 iK3 iL8 iJ2 iK0 iL3 iM8 iK2 iL0 iM3 iN8 iL2 iM0 iN3 iO8 iM2 iN0 iO3 iP8 iN2 iO0 iP3 iQ8 iO2 iP0 iQ3 iR8 iP2 iQ0 iR3 iS8 iQ2 iR0 iS3 iT8 iR2 iS0 iT3 iU8 iS2 iT0 iU3 iV8 iT2 iU0 iV3 iW8 iU2 iV0 iW3 iX8 iV2 iW0 iX3 iY8 iW2 iX0 iY3 iZ8 i02 i10 i23 i39 i12 i20 i33 i49 i22 i30 i43 i59 i32 i40 i53 i69 i42 i50 i63 i79 i52 i60 i73 i89 i62 i70 i83 i99 i72 i80 i93 iA9 i82 i90 iA3 iB9 i92 iA0 iB3 iC9 iA2 iB0 iC3 iD9 iB2 iC0 iD3 iE9 iC2 iD0 iE3 iF9 iD2 iE0 iF3 iG9 iE2 iF0 iG3 iH9 iF2 iG0 iH3 iI9 iG2 iH0 iI3 iJ9 iH2 iI0 iJ3 iK9 iI2 iJ0 iK3 iL9 iJ2 iK0 iL3 iM9 iK2 iL0 iM3 iN9 iL2 iM0 iN3 iO9 iM2 iN0 iO3 iP9 iN2 iO0 iP3 iQ9 iO2 iP0 iQ3 iR9 iP2 iQ0 iR3 iS9 iQ2 iR0 iS3 iT9 iR2 iS0 iT3 iU9 iS2 iT0 iU3 iV9 iT2 iU0 iV3 iW9 iU2 iV0 iW3 iX9 iV2 iW0 iX3 iY9 iW2 iX0 iY3 iZ9 i02 i10 i24 i30 i12 i20 i34 i40 i22 i30 i44 i50 i32 i40 i54 i60 i42 i50 i64 i70 i52 i60 i74 i80 i62 i70 i84 i90 i72 i80 i94 iA0 i82 i90 iA4 iB0 i92 iA0 iB4 iC0 iA2 iB0 iC4 iD0 iB2 iC0 iD4 iE0 iC2 iD0 iE4 iF0 iD2 iE0 iF4 iG0 iE2 iF0 iG4 iH0 iF2 iG0 iH4 iI0 iG2 iH0 iI4 iJ0 iH2 iI0 iJ4 iK0 iI2 iJ0 iK4 iL0 iJ2 iK0 iL4 iM0 iK2 iL0 iM4 iN0 iL2 iM0 iN4 iO0 iM2 iN0 iO4 iP0 iN2 iO0 iP4 iQ0 iO2 iP0 iQ4 iR0 iP2 iQ0 iR4 iS0 iQ2 iR0 iS4 iT0 iR2 iS0 iT4 iU0 iS2 iT0 iU4 iV0 iT2 iU0 iV4 iW0 iU2 iV0 iW4 iX0 iV2 iW0 iX4 iY0 iW2 iX0 iY4 iZ0 i02 i10 i24 i31 i12 i20 i34 i41 i22 i30 i44 i51 i32 i40 i54 i61 i42 i50 i64 i71 i52 i60 i74 i81 i62 i70 i84 i91 i72 i80 i94 iA1 i82 i90 iA4 iB1 i92 iA0 iB4 iC1 iA2 iB0 iC4 iD1 iB2 iC0 iD4 iE1 iC2 iD0 iE4 iF1 iD2 iE0 iF4 iG1 iE2 iF0 iG4 iH1 iF2 iG0 iH4 iI1 iG2 iH0 iI4 iJ1 iH2 iI0 iJ4 iK1 iI2 iJ0 iK4 iL1 iJ2 iK0 iL4 iM1 iK2 iL0 iM4 iN1 iL2 iM0 iN4 iO1 iM2 iN0 iO4 iP1 iN2 iO0 iP4 iQ1 iO2 iP0 iQ4 iR1 iP2 iQ0 iR4 iS1 iQ2 iR0 iS4 iT1 iR2 iS0 iT4 iU1 iS2 iT0 iU4 iV1 iT2 iU0 iV4 iW1 iU2 iV0 iW4 iX1 iV2 iW0 iX4 iY1 iW2 iX0 iY4 iZ1 i02 i10 i24 i32 i12 i20 i34 i42 i22 i30 i44 i52 i32 i40 i54 i62 i42 i50 i64 i72 i52 i60 i74 i82 i62 i70 i84 i92 i72 i80 i94 iA2 i82 i90 iA4 iB2 i92 iA0 iB4 iC2 iA2 iB0 iC4 iD2 iB2 iC0 iD4 iE2 iC2 iD0 iE4 iF2 iD2 iE0 iF4 iG2 iE2 iF0 iG4 iH2 iF2 iG0 iH4 iI2 iG2 iH0 iI4 iJ2 iH2 iI0 iJ4 iK2 iI2 iJ0 iK4 iL2 iJ2 iK0 iL4 iM2 iK2 iL0 iM4 iN2 iL2 iM0 iN4 iO2 iM2 iN0 iO4 iP2 iN2 iO0 iP4 iQ2 iO2 iP0 iQ4 iR2 iP2 iQ0 iR4 iS2 iQ2 iR0 iS4 iT2 iR2 iS0 iT4 iU2 iS2 iT0 iU4 iV2 iT2 iU0 iV4 iW2 iU2 iV0 iW4 iX2 iV2 iW0 iX4 iY2 iW2 iX0 iY4 iZ2 i02 i10 i24 i33 i12 i20 i34 i43 i22 i30 i44 i53 i32 i40 i54 i63 i42 i50 i64 i73 i52 i60 i74 i83 i62 i70 i84 i93 i72 i80 i94 iA3 i82 i90 iA4 iB3 i92 iA0 iB4 iC3 iA2 iB0 iC4 iD3 iB2 iC0 iD4 iE3 iC2 iD0 iE4 iF3 iD2 iE0 iF4 iG3 iE2 iF0 iG4 iH3 iF2 iG0 iH4 iI3 iG2 iH0 iI4 iJ3 iH2 iI0 iJ4 iK3 iI2 iJ0 iK4 iL3 iJ2 iK0 iL4 iM3 iK2 iL0 iM4 iN3 iL2 iM0 iN4 iO3 iM2 iN0 iO4 iP3 iN2 iO0 iP4 iQ3 iO2 iP0 iQ4 iR3 iP2 iQ0 iR4 iS3 iQ2 iR0 iS4 iT3 iR2 iS0 iT4 iU3 iS2 iT0 iU4 iV3 iT2 iU0 iV4 iW3 iU2 iV0 iW4 iX3 iV2 iW0 iX4 iY3 iW2 iX0 iY4 iZ3 i02 i10 i24 i34 i12 i20 i34 i44 i22 i30 i44 i54 i32 i40 i54 i64 i42 i50 i64 i74 i52 i60 i74 i84 i62 i70 i84 i94 i72 i80 i94 iA4 i82 i90 iA4 iB4 i92 iA0 iB4 iC4 iA2 iB0 iC4 iD4 iB2 iC0 iD4 iE4 iC2 iD0 iE4 iF4 iD2 iE0 iF4 iG4 iE2 iF0 iG4 iH4 iF2 iG0 iH4 iI4 iG2 iH0 iI4 iJ4 iH2 iI0 iJ4 iK4 iI2 iJ0 iK4 iL4 iJ2 iK0 iL4 iM4 iK2 iL0 iM4 iN4 iL2 iM0 iN4 iO4 iM2 iN0 iO4 iP4 iN2 iO0 iP4 iQ4 iO2 iP0 iQ4 iR4 iP2 iQ0 iR4 iS4 iQ2 iR0 iS4 iT4 iR2 iS0 iT4 iU4 iS2 iT0 iU4 iV4 iT2 iU0 iV4 iW4 iU2 iV0 iW4 iX4 iV2 iW0 iX4 iY4 iW2 iX0 iY4 iZ4 i02 i10 i24 i35 i12 i20 i34 i45 i22 i30 i44 i55 i32 i40 i54 i65 i42 i50 i64 i75 i52 i60 i74 i85 i62 i70 i84 i95 i72 i80 i94 iA5 i82 i90 iA4 iB5 i92 iA0 iB4 iC5 iA2 iB0 iC4 iD5 iB2 iC0 iD4 iE5 iC2 iD0 iE4 iF5 iD2 iE0 iF4 iG5 iE2 iF0 iG4 iH5 iF2 iG0 iH4 iI5 iG2 iH0 iI4 iJ5 iH2 iI0 iJ4 iK5 iI2 iJ0 iK4 iL5 iJ2 iK0 iL4 iM5 iK2 iL0 iM4 iN5 iL2 iM0 iN4 iO5 iM2 iN0 iO4 iP5 iN2 iO0 iP4 iQ5 iO2 iP0 iQ4 iR5 iP2 iQ0 iR4 iS5 iQ2 iR0 iS4 iT5 iR2 iS0 iT4 iU5 iS2 iT0 iU4 iV5 iT2 iU0 iV4 iW5 iU2 iV0 iW4 iX5 iV2 iW0 iX4 iY5 iW2 iX0 iY4 iZ5 i02 i10 i24 i36 i12 i20 i34 i46 i22 i30 i44 i56 i32 i40 i54 i66 i42 i50 i64 i76 i52 i60 i74 i86 i62 i70 i84 i96 i72 i80 i94 iA6 i82 i90 iA4 iB6 i92 iA0 iB4 iC6 iA2 iB0 iC4 iD6 iB2 iC0 iD4 iE6 iC2 iD0 iE4 iF6 iD2 iE0 iF4 iG6 iE2 iF0 iG4 iH6 iF2 iG0 iH4 iI6 iG2 iH0 iI4 iJ6 iH2 iI0 iJ4 iK6 iI2 iJ0 iK4 iL6 iJ2 iK0 iL4 iM6 iK2 iL0 iM4 iN6 iL2 iM0 iN4 iO6 iM2 iN0 iO4 iP6 iN2 iO0 iP4 iQ6 iO2 iP0 iQ4 iR6 iP2 iQ0 iR4 iS6 iQ2 iR0 iS4 iT6 iR2 iS0 iT4 iU6 iS2 iT0 iU4 iV6 iT2 iU0 iV4 iW6 iU2 iV0 iW4 iX6 iV2 iW0 iX4 iY6 iW2 iX0 iY4 iZ6 i02 i10 i24 i37 i12 i20 i34 i47 i22 i30 i44 i57 i32 i40 i54 i67 i42 i50 i64 i77 i52 i60 i74 i87 i62 i70 i84 i97 i72 i80 i94 iA7 i82 i90 iA4 iB7 i92 iA0 iB4 iC7 iA2 iB0 iC4 iD7 iB2 iC0 iD4 iE7 iC2 iD0 iE4 iF7 iD2 iE0 iF4 iG7 iE2 iF0 iG4 iH7 iF2 iG0 iH4 iI7 iG2 iH0 iI4 iJ7 iH2 iI0 iJ4 iK7 iI2 iJ0 iK4 iL7 iJ2 iK0 iL4 iM7 iK2 iL0 iM4 iN7 iL2 iM0 iN4 iO7 iM2 iN0 iO4 iP7 iN2 iO0 iP4 iQ7 iO2 iP0 iQ4 iR7 iP2 iQ0 iR4 iS7 iQ2 iR0 iS4 iT7 iR2 iS0 iT4 iU7 iS2 iT0 iU4 iV7 iT2 iU0 iV4 iW7 iU2 iV0 iW4 iX7 iV2 iW0 iX4 iY7 iW2 iX0 iY4 iZ7 i02 i10 i24 i38 i12 i20 i34 i48 i22 i30 i44 i58 i32 i40 i54 i68 i42 i50 i64 i78 i52 i60 i74 i88 i62 i70 i84 i98 i72 i80 i94 iA8 i82 i90 iA4 iB8 i92 iA0 iB4 iC8 iA2 iB0 iC4 iD8 iB2 iC0 iD4 iE8 iC2 iD0 iE4 iF8 iD2 iE0 iF4 iG8 iE2 iF0 iG4 iH8 iF2 iG0 iH4 iI8 iG2 iH0 iI4 iJ8 iH2 iI0 iJ4 iK8 iI2 iJ0 iK4 iL8 iJ2 iK0 iL4 iM8 iK2 iL0 iM4 iN8 iL2 iM0 iN4 iO8 iM2 iN0 iO4 iP8 iN2 iO0 iP4 iQ8 iO2 iP0 iQ4 iR8 iP2 iQ0 iR4 iS8 iQ2 iR0 iS4 iT8 iR2 iS0 iT4 iU8 iS2 iT0 iU4 iV8 iT2 iU0 iV4 iW8 iU2 iV0 iW4 iX8 iV2 iW0 iX4 iY8 iW2 iX0 iY4 iZ8 i02 i10 i24 i39 i12 i20 i34 i49 i22 i30 i44 i59 i32 i40 i54 i69 i42 i50 i64 i79 i52 i60 i74 i89 i62 i70 i84 i99 i72 i80 i94 iA9 i82 i90 iA4 iB9 i92 iA0 iB4 iC9 iA2 iB0 iC4 iD9 iB2 iC0 iD4 iE9 iC2 iD0 iE4 iF9 iD2 iE0 iF4 iG9 iE2 iF0 iG4 iH9 iF2 iG0 iH4 iI9 iG2 iH0 iI4 iJ9 iH2 iI0 iJ4 iK9 iI2 iJ0 iK4 iL9 iJ2 iK0 iL4 iM9 iK2 iL0 iM4 iN9 iL2 iM0 iN4 iO9 iM2 iN0 iO4 iP9 iN2 iO0 iP4 iQ9 iO2 iP0 iQ4 iR9 iP2 iQ0 iR4 iS9 iQ2 iR0 iS4 iT9 iR2 iS0 iT4 iU9 iS2 iT0 iU4 iV9 iT2 iU0 iV4 iW9 iU2 iV0 iW4 iX9 iV2 iW0 iX4 iY9 iW2 iX0 iY4 iZ9 i02 i10 i25 i30 i12 i20 i35 i40 i22 i30 i45 i50 i32 i40 i55 i60 i42 i50 i65 i70 i52 i60 i75 i80 i62 i70 i85 i90 i72 i80 i95 iA0 i82 i90 iA5 iB0 i92 iA0 iB5 iC0 iA2 iB0 iC5 iD0 iB2 iC0 iD5 iE0 iC2 iD0 iE5 iF0 iD2 iE0 iF5 iG0 iE2 iF0 iG5 iH0 iF2 iG0 iH5 iI0 iG2 iH0 iI5 iJ0 iH2 iI0 iJ5 iK0 iI2 iJ0 iK5 iL0 iJ2 iK0 iL5 iM0 iK2 iL0 iM5 iN0 iL2 iM0 iN5 iO0 iM2 iN0 iO5 iP0 iN2 iO0 iP5 iQ0 iO2 iP0 iQ5 iR0 iP2 iQ0 iR5 iS0 iQ2 iR0 iS5 iT0 iR2 iS0 iT5 iU0 iS2 iT0 iU5 iV0 iT2 iU0 iV5 iW0 iU2 iV0 iW5 iX0 iV2 iW0 iX5 iY0 iW2 iX0 iY5 iZ0 : l c u $1 $2 $3 D1 D2 D3 D4 D5 D6 '7 '8 '9 'A 'B 'C 'D 'E 'F $s $e $d $i $n $g hashcat-4.0.1/rules/T0XlC-insert_space_and_special_0_F.rule000066400000000000000000000037521320027462700235410ustar00rootroot00000000000000# Created by: T0XlC # All special characters shifted from position 0 to position F # In memory of d3ad0ne 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* 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> 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~hashcat-4.0.1/rules/T0XlC-insert_top_100_passwords_1_G.rule000066400000000000000000001032041320027462700234060ustar00rootroot00000000000000# 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 iGqiHwiIeiJriKtiLyiMuiNiiOoiPphashcat-4.0.1/rules/T0XlC.rule000066400000000000000000001037751320027462700160640ustar00rootroot00000000000000# 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 sa@ se3 si1 sl7 so0 ss5 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 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$; $# $!$@$# $!$!$!$!$!$!$!$!$!$!$! $!$!$!$!$!$!$!$!$!$! $!$!$!$!$!$!$!$!$! $!$!$!$!$!$!$!$! $!$!$!$!$!$!$! $!$!$!$!$!$! $!$!$!$!$! $!$!$!$! $!$!$! $!$! $! $ hashcat-4.0.1/rules/T0XlCv1.rule000066400000000000000000003134131320027462700163230ustar00rootroot00000000000000# 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 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@se3sl7si1so0 ss5sa4sl7si|so0 ss5 so0se3 so0 sl7 si| si1se3 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 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$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$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 ^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^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 ]$a ]$1 ] { [ } ] ] ] $p $h $p $b $b ] ] ] $d $o $g ] ] K ] $0 ] [^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 []d [[[[[ [[[[ [[[$1$2$3 [[[$1 [ [ [ [ [ [ $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*54x31'4 K E$sT0 E D5 D4 D3D2 D3 D2] D2D4 D2D3 D2D2z3x13 D2D1 D2 D2 D2 D1lCl] D1] D1D4 D1D3D5 D1 D0D3 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 : .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 '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 '5[ '5D3 '5D2p1 '5D2d '5$1 '5$. '5 '4y4 '4p1 '4i4y '4d '4$y '4$. '4 '3d '3$1$2$3 '3$. '3 '2$. $~$!$@$#$$ ${x12] $z $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$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 $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 $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 $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 $6p4'5D1 $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 $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 $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$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 $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 $.$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$; $# $!$!$!$!$!$!$!$!$!$!$! $!$!$!$!$!$!$!$!$!$! $!$!$!$!$!$!$!$!$! $!$!$!$!$!$!$!$! $!$!$!$!$!$!$! $!$!$!$!$!$! $!$!$!$!$! $!$!$!$! $!$!$! $!$! $! $ ^[$] ^{$} ^<$> ^($) ^^$^ ^&$& ^*$* ^@$@ ^!$! ^~$~ ^#$# ^.$. ^|$| ^\$\ ^$$$ ^%$% ^-$- ^_$_ ^=$= ^+$+ hashcat-4.0.1/rules/best64.rule000066400000000000000000000016451320027462700162720ustar00rootroot00000000000000## 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 hashcat-4.0.1/rules/combinator.rule000066400000000000000000000011711320027462700173120ustar00rootroot00000000000000## 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. hashcat-4.0.1/rules/d3ad0ne.rule000066400000000000000000006067741320027462700164170ustar00rootroot00000000000000# 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 $ O03 $ O04 $ O06 $ O08 $ O09 $ O13 $ O23 $ O34 $ O41 $ O52 $ O53 $ { $ }Z2 $! $!$!^$^$ $!$& $!$) $!$1 $!$2 $!$3 $!$@ $!$@$# $!$@$#$$ $!$@$#$$$% $!*03 $!*04 $!*25 $!*36$( $!*45 $!*62O19 $!*74 $!+1 $!+4 $!+8 $!-0O46 $!-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 $!q $!qO35 $!s6Z $!sy6 $!t$u $!u $!O02 $!O06 $!O18 $!O21 $!O25 $!O32 $!O35 $!O53 $!O54 $!O61 $!O63 $!O6B $!O71 $!O76 $!O84 $!z2 $" $"$% $"'7D1 $"*72 $"D0'3 $"R4 $"Z1 $"Z2 $"[ $"i4no6l $"i7! $"l $"o4e$! $"p1 $"s": $"u $"O21*21 $# $#$1 $#$7 $#$E $#'8 $#*57 $#*97 $#+7 $#-6 $#-7*45 $#-8 $#D3 $#T2 $#Z1 $#Z2 $#^Q $#d $#i4K $#i5E $#l $#o0w $#o69 $#o9|O37 $#r $#s#sd $#O01 $#O16 $#O18 $#O26O32 $#O42 $#O45 $#O61 $#O62 $#O71 $#z2 $$ $$$) $$$7 $$*04 $$*13i1< $$*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 $$O02 $$O06 $$O14 $$O61 $$O64 $$O72 $$O73 $% $%$! $%$^ $%$d $%$j $%'Ai4n $%+8 $%Z1 $%Z2 $%Z4 $%^' $%c $%i61 $%se1 $%t $%O23 $%O51 $%O81 $& $&*18 $&*46 $&C $&D1 $&Z1 $&Z2 $&Z3+7 $&Z5 $&[ $&^$ $&^& $&c $&d d $&i5wo81 $&i71 $&o1-O14 $&o3$O32 $&o67 $&u $' $'*60t $'*63 $'+4$! $'D0 $'T4 $'c $'o4y^c $'O19 $'z4 $( $($) $(+0 $(Z1 $(Z3 $(c $(i0* $(u $(O24 $(O51 $(O82 $) $)'6*23 $)C*42 $)D1 $)Z3 $)^L $)i4( $)syQ $)t $)O14Z2 $)O61 $* $*$& $*$*^*^* $*$1 $*$M $*$g $**01+0 $**34 $**80 $*+7 $*-3 $*@*+3 $*@5 $*D0 $*D5O12 $*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 $*O12 $*O37 $*O43 $*O45 $*O51 $*O54 $*O72 $*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-O24 $+k $+o70 $+sla $+t^! $+O53 $+O81 $+O94 $+z1 $+}$z $, $,$. $,$0 $,$5 $,$6 $,$8 $,$jo3x $,'8 $,-2 $,C $,Z1 $,Z2 $,[ $,^t $,k $,l $,O02 $,O23 $,O82 $,O93 $,{ $- $-$+ $-$. $-$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 $-O12 $-O32 $-O52 $-O73 $-O82 $-z2 $-{ $. $.$. $.$.$. $.$9 $.$?*21 $.$K $.$c$o$m $.$d $.$d$e $.$f$r $.$h $.$n$e$t $.$o$r$g $.$r$u $.$x $.*40O14 $.*45 $.*92 $.+0 $.+1 $.-5 $.C $.D1 $.Z3 $.Z4 $.[ $.^. $.^= $.d $.i3, $.l $.lZ4 $.o0w $.svD $.t $.O05 $.O25 $.O27 $.O63 $.z1ss7 $/ $/$1 $/$[O13 $/$p $/-0 $/D3 $/Z1 $/Z2 $/Z4Z1 $/[ $/^u $/c $/f $/l $/p1 $/p2 $/r $/s/X@8 $/s/Ysp= $/t $/u $/O52 $/O53 $/z2 $/z3O18 $/z5 $/{ $/}z3 $0 $0$1 $0$0 $0$0$0 $0$0$1 $0$0$7 $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*24O14 $0*67 $0*83 $0*85 $0*95 $0+5 $0-5 $0-7 $0-B $0@9 $0C $0D9 $0DB $0R7 $0T3 $0T6 $0Z2O26 $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 $0s9a $0sS9 $0sd7 $0seu $0snu $0t^X $0O05 $0O12 $0O14O04 $0O15 $0O21 $0O23 $0O31D2 $0O32 $0O51 $0O72 $0O82 $0O95 $0z1 $0z2 $1 $1$2 $1$2$3 $1$! $1$0 $1$1 $1$1$1 $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*07O43 $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 $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 $1O21*05 $1O26z2 $1O41r $1O51 $1O53 $1O56 $1O58 $1O62 $1O72 $1O81Z2 $1O84 $1OA5 $1OB2 $1OB3 $1z1 $1z1Z3 $1z2 $1z3 $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 $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 $2tO62 $2O24O64 $2O32 $2O42O16 $2O51 $2O53 $2O61 $2O73 $2O74O04 $2O82 $2OA2 $2z3 $2z4 $2{ $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] $3dO58 $3f $3i1a $3i2h*41 $3i3f $3i66 $3i6@ $3i7< $3i7y $3i8< $3k $3o4/ $3o4g $3o58 $3o62 $3o6= $3o6z $3r $3s5aO12 $3sfs $3snk $3srl $3szb $3t $3t^q $3ti9? $3u $3O02 $3O09 $3O28 $3O42u $3O61 $3O71 $3O92 $3z2 $3{ $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] $4dO49 $4i5- $4i5N+7 $4i5q*15 $4i5r $4i8! $4k $4o0E $4o2YO46 $4o2o $4o4o $4o5dO54 $4o5gZ3 $4o7R $4q $4qq $4r $4sdr $4sma@r $4sr1 $4sxm $4t $4O02 $4O13 $4O21 $4O23 $4O35i3b $4O47 $4O62 $4O81 $4O82 $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*73OA2 $5*75O63 $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 $5Z5O56 $5[ $5^$ $5^+ $5^j $5d $5dD4 $5dD5 $5dD6 $5dD7 $5d] $5fL1 $5i2! $5i2E $5i5b*24 $5i6 $5i9% $5l $5o4- $5o5l $5o65 $5o66 $5o7o $5p1O53 $5q $5sk1 $5skw $5sr#O12 $5t $5O21 $5O32 $5O41 $5O51 $5O52 $5O91 $5OB1OB1 $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 $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' $6O05 $6O16 $6O23 $6O26 $6O34c $6O53 $6O61O62 $6O62 $6O73 $6OB4 $6z4 $6{ $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*47O61 $7*51O31 $7*64 $7*87 $7*98 $7+1 $7+3 $7+A $7-7 $7@b $7@i $7C $7D2 $7L0 $7L1 $7R7 $7Z3 $7Z4 $7Z5 $7[ $7^4 $7d $7dD4 $7dD5 $7dD6 $7dD7 $7d] $7dO62 $7i0x $7i2\O03 $7i63 $7k $7l-0 $7o0Z $7o0ksmc $7o1A $7o61 $7o6T $7p2 $7s4_ $7sgc $7t+0 $7O03*20 $7O46'5 $7O52 $7O54 $7O62 $7O82 $7O95 $7OB3 $7z1 $7z2 $7z5 $7z5O08 $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 $8Z3 $8Z5 $8^b $8c $8d $8dD4 $8dD5 $8dD6 $8dD7 $8d] $8i3N $8i4e $8o0dO42 $8o1u $8o4cL6 $8o88 $8q $8r $8s61 $8s9a $8t $8u $8O23 $8O42 $8O46z2 $8O63 $8O83 $8O83-7 $8O92 $8z1c $8z1l $8z2 $8z3 $8{ $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 $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 $9O04 $9O07 $9O25R5 $9O53 $9O65 $9O72 $9OA2 $9OB1 $9z1 $9z3 $9z3O35 $9{ $: $:$) $:$1 $:'7 $:+0 $:C $:D2 $:D4 $:R0 $:T6 $:Z1 $:Z2 $:c $:d $:o6( $:r $:s:%t $; $;$) $;$/ $;$7 $;$; $;*01 $;*61 $;-7 $;D9O81 $;R4 $;T0 $;Z2 $;Z3o2% $;[ $;^no4w $;o7$ $;o7i $;u $;O02 $;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 $?O26 $?O45 $?O52 $?O63 $@ $@$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 $@o3bO06 $@o58 $@t $@tD4 $@O02 $@O12 $A $A$Y $A$a $A$v $A*54sl* $A*58O58 $A+7 $ACD2 $AD6 $AL6 $AR8@M $AT2 $AZ1 $AZ1r $AZ3 $A[ $A^< $Ac $Ak $Al $AO16Z3 $AO24u $A{ $B $B$1 $B$G $B$J $B$e $B*72 $B-3 $BL1 $BR4O43 $BZ1 $BZ2 $B^*C $Bi0L $Bk@8 $Bl $BsjBL5 $BO19c $BO46 $C $C$D $C$R $C-1 $CZ1 $CZ1i2G $Ci1S $Cr $CO12 $CO18 $CO91 $Cz1 $D $D$E $D$I $D$S $D$r $D+0 $DD1 $DZ1 $D^S $Dc $Di1nT5 $Dt $Du $DOA3iA( $Dz2O05 $Dz4z5 $E $E*65 $E*76o0C $E+4 $E-6 $ED4-3 $ED8 $EZ1 $E[c $Eo0S $EtO04 $EO25 $EO32 $EO38 $E{$S $F $F$C $F$M $F$U $F$m $F*23 $F+7 $FL6o40 $FR2Z1 $F[ $Fo7r $Fo9w$c $Ft $Fu $FO13 $FO32*67 $FO34 $FO36 $G $G$A $G$E $G$R $G*09 $G*75 $GC$s $GD5 $GR8[ $GZ2 $GZ5*14 $G^2 $Gc $Gc-0 $Gi6D $GlO37 $Gr $Gs5D+4 $Gss3 $GO02 $H $H$t*30 $H+0 $H+5 $H-5o4L $HD3 $HTAO62 $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 $Ii68O34 $Il $Io1_ $Io79 $IO08$p $IO27 $IO45 $IO63O31 $J $J$B $J$O $J$jl $J*64[ $J*80 $J+0^f $J+2O38 $JL5 $J[ $Jo1iZ1 $Jo1o $Js3Y $JO58 $JO63 $K $K$! $K$A $K$Q $K$l $K$s $KD3 $KT5 $KZ1 $KZ1R2 $K[ $K^M $KcoAC $KcO34 $Ki6F $Ki6V $Kl $Ko5B $Kr $KsbC $Kt $Ku^K $KO17 $KO18 $KO32 $KO52 $K{T4 $L $L$n $L*16 $L+0 $LC $LT6 $LZ1 $LZ2 $L^%z1 $L^\ $Lk^_ $Lo1n} $Lro7e $Lt $LO12 $LO1A $LO63 $LO68 $LO73 $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[ $MO04 $MO12 $MO27 $MO51 $N $N$q*40 $N'6^m $N*47 $N*65 $N@h'7 $ND4 $NT0 $Nc $Ni3RO04 $Ni78 $Nl{ $No2F*02 $No62 $No8ssiu $Nr $Nu $NO27 $N{ $N}Z1 $O $O$K $O*18 $O*5BO1A $O*86 $OD4 $OL6 $OZ1 $O^3-0 $OO24 $OO45o6e $OO53 $O{ $P $P$# $P$D $P$E $P$I $P$s $P*36O06 $P*43$H $P-1$O $PD0O17 $PD1 $PL9 $PR1^a $P^No72 $P^^ $Pi3zl $PlO41 $Po6. $Pp1o2w $Pq $PO26 $PO64 $P{o31 $Q $QD3 $QD5O14 $QL1*40 $QR4 $QZ1 $QZ3 $Qc $Qo2yO3B $QO04$1 $QO31T0 $R $R$#*03 $R$1c $R*06 $R@oc $RL0 $RT3$O $RZ2] $Rc $Ri6& $Ru $RO23 $RO41 $RO92 $Rz5 $R}o11 $S $S$V $S$y $S*51O46 $S-4*60 $SD3 $SKC $SL5*34 $SZ1 $SZ1soA $SZ2 $S^]o0N $S^p $Si5' $Sl $Ssn8 $SssPc $SO12 $SO74 $S{ $T $T'8Z2 $T*62 $T*87u $T@2 $TC$O $TL6 $TZ1 $T[ $T^vRA $Tl $To0Q $To13 $Tp1O18 $TO03 $TO31 $TO32 $TO52 $Tz1 $U $U$R $U*27O26 $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 $WO35L2 $Wz1 $X $X$2 $X$Y $X$x $X*41$a $X-7D0 $XZ1 $XZ2 $XZ3s4/ $X[ $X^3 $X^S $X^v $Xi0:o62 $Xo1m $Xt $XO62 $Xz1 $Y $Y$2 $Y$= $Y*67 $Y+3l $YL6 $YL7 $YL8 $YT1 $Y[$N $Y^V $Yc $Yfz3 $Yu[ $YO08 $YO0A$u $YO24C $YO36 $YO41 $YO42 $Yz2O64 $Z $Z$3R6 $Z$5 $Z$9OA5 $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 $ZO05L1 $Zz4 $[ $[*05$; $[C $[L4 $[Z1 $[Z2 $[Z4 $[[ $[t $\ $\@a $\L2*20 $\Z1 $\l $\o0J $\t $\u $] $]+1 $]-0 $][ $]^?o6= $]i3[ $]i6: $]o4[ $]o55 $]O32 $]z1 $^$^ $^+9+0 $^@j $^R8i07 $^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 $_O13 $_O25 $_O41 $_O53 $_O75 $_z3 $_{ $` $`$1 $`-1 $`R5o5Z $`Z1 $`Z2 $`c $`l $`o0h $`o64z4 $`u $`O02 $`O05 $`{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*73O03 $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 $ao1ep1 $ao3+ $ao3dC $ao6E $ao7f $aoB8 $ap1 $aq $assj $aswc $au $au$3 $auO43 $aO02 $aO31 $aO45 $aO54 $aO67 $aO73 $aO85 $aO91 $aOB1 $aOB3 $aOB4 $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 $bL7O15 $bT0 $bZ3 $bZ5 $b[ $b[R2 $b^[s2H $b^` $b^a $b^h $b^p $bf $bi1r $bi5p $bo3b^A $bo3t $bp1 $br $brq $bsaF $bsbf $bshb $bt $buo4# $bO13 $bO35 $bO45 $bO56 $bO72 $bOA3 $bOA4 $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 $cO06 $cO24 $cO29 $cO36 $cO73 $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@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 $dO02 $dO45p1 $dO52 $dO75 $dO95 $dO96 $dOA6 $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 $eO02sz$ $eO25 $eO28i3c $eO53 $eO71 $eO93 z2 $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 $fZ1O57 $fZ2 $f^= $f^f $f^q'B $f^v $fc $fi4u $fi8r $fl $fo1e $fo8/O01 $fq $fs39 $fO05 $fO28D3 $fO52 $fO62 $fO82 $fO91 $fOB1 $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^vO31 $gd $gfo4# $gi0r $gi2p*91 $gi2u $gi3@i0$ $gi5 @6 $gi5; $gi7VR9 $gl $go06 $go0ht $go2) $gr $gsaI $gsr( $gsutO47 $gt $gu $gO34 $gO36 $gO37 $gO43 $gO52 $gO73 $gO83O52 $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[O13 $h^T $h^aslI $hc $hd $hi2t $hi4X $hi6t*67 $hi8% $hi92O49 $hl $hlT1 $ho1h $hr $hr$y $hsd1 $hO12 $hO41 $hO53 $h}K $i $i $n $g $i$*z1 $i$F$F $i$d $i$n $i*10O41 $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 $iZ2O15 $i^d $i^ki75 $i^p $id $ii3 $ii8d $io2% $io2S $io5V $iq $ir $it $iu $iO09 $iO12 $iO13 $iO36 $iO54 $iO62 $iO73 $iO92 $iz2*17 $i{ $j $j$3 $j$F $j$o $j*02 $j*07 $j*68 $j-4^? $j-7 $jZ1 $jZ2 $j[ $j^2 $j^k $j^s $jc $ji49$u $ji5n^0 $jo17 $joAn $jp1 $jr $jsik $jt $ju $jO12 $jO62 $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 $kD5O26 $kR4 $kR7 $k[ $k^3 $k^D ^_ $k^m $ki5f $ki8o $ko78 $ko7n $kp1 $kp1O26 $ks17 $kt $kO13 $kO53 $kO73 $kO92 $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 $lO4B $lO62 $lO92 $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'BO05 $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 $md $mf $mi1P*83 $mi1\ $mi2i $mi7g $mk $ml^k $mo0g $mo2r $mo37 $mo5F $mo8ul $ms17 $ms24 $mt $mu^C $mO04 $mO05 $mO16 $mO18 $mO32 $mO34 $mO43 $mO57 $mO72 $mOA4 $mz1 $mz4z3 $m{k $m{t $n $n$a $n$b $n$qO47 $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 $nZ5O7B $n[$z $n[L2 $n^C $n^I*36 $n^f*23 $ni0R $ni3+ $ni3p $ni5e $nk $nl $no00O46 $no2- $no4_ $no7l $no9e $nq $nO14^3 $nO51 $nO65 $nO71 $nO82 $nO93 $o $o$O $o$h $o$ni4Y $o$s $o$x $o*03 $o*46O43 $o*82 $o+4 $o+8 $o@1 $oT0 $oT7 $oZ1 $oZ2 $o^C $o^si0c $oc $od $oi1 $oi6O $ok $oo0v $oo6g $oo6w $or $osbf $ou $oO04'5 $oO05 $oO12 $oO13 $oO15 $oO29 $oO42sk$ $oO65 $oO71 $oO87 $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 $pi4t $pi7q $pl $po0b $po29 $pr $psph $pu-5 $pO4A@p $pO51[ $pO75 $pO87 $pO92 $pz5 $p{sdo $q $q$Q $q$a $q$w $q*02 $q*34 $q+0O02 $q+5f $q-0 $q-7 $qD2 $qKr $qL6 $qL7 $qLA $qT0@T $qZ1 $qZ2 $qZ2o2+ $qZ2u $qZ3 $qZ4 $qZ5 $q^pT6 $qcO21 $qd $qi1= $qi3JZ1 $qk $qkl $qsq# $qt $qO15 $qO31 $qO43 $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 $rO31 $rO46d $rOB4 $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[O32 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 $sO34 $sO43 $sO53 $sO64 $sO82 $sO83 $sO87 $sO94 $sz1 $sz1u $sz4z5 $t $t$# $t$7 $t$b $t$c $t$g $t$h $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 $tuO01 $tO02 $tO04 $tO08 $tO09c $tO42 $tO51 $tO85 $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 $udO58 $ui0y $ui5- $ui7'O69 $ukK $uo1r $uo3w $uo4o $uo7u $uq $ur $us5,O67 $usma $ut $utr $uO12 $uO34 $uO39 $uO41$= $uO43 $uO52 $uO62 $uO65 $uO72 $uO9B $uz1 $uz5-3 $v $v$&^I $v$+ $v$3u $v$6 $v$P $v$i $v$l $v*16 $v*43 $v*62k $v*81O58 $v+0 $v-5 $v-6o8> $v-7O69 $vD3 $vD5 $vD7 $vD7O21 $vL5 $vL6 $vZ1 $vZ2 $vZ3 $v^* $v^> $v^w^G $vdO5B $vo3s $vp1 $vri0r $vstk $vO13 $vO24 $vO38 $vO83 $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[ $wcz2 $wi0q $wi1I $wi2d $wi6q $wi7_ $wi9q $wo4m $wo6a $wo7m $wp1 $wq $wr-4 $wsF[O36 $wu $wO18 $wO37 $wO67-4 $wz2 $wz3 $w{[ $x $x$? $x$g $x$g*41 $x$hO69 $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 $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 $xO21@v $xO25 $xO32 $xO37 $xO45 $xO64 $xO71 $xO76 $xO92 $xO93 $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@nO07 $y@q $yD1 $yD5d $yD8 $yL8 $yZ1 $yZ2 $yZ4 $y^i $yf $yi19'5 $yi20 $yi3R $yi6m $yk $yo4f $yo5x $yp1 $yq $yt $yO04 $yO07 $yO23 $yO27i1p $yO53 $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 $zO06 $zO24 $zO43 $zO63 $zO83 $zO95 $zOA2 $zOB2 $zz1 $zz1O36 $zz2^o $zz5 $z{ ${ ${K ${L4 ${L5 ${L8 ${o70sr@ $| $|$* $|L0 $|u $} $}$o $}+0 $}+5 $}+A $}c $}kO01 $}l $}lr $}t $}z2r '1+0z4 '1Z4 '1Z5 '1p3 '1z4Z4 '2+0p4 '2L1 '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 '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 '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 '5L4O21 '5Z1 '5Z2@d '5Z3 '5Z4 '5Z5 '5Z5T9 '5Z5O31 '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 '5O01Z2 '5O02 '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 '6fO45 '6i1* '6i23^, '6i3- '6i3m '6i3r '6i4g '6i4p '6i5% '6i5r '6l '6o0*} '6o1l '6o3P '6o3e '6o3t '6o4O '6o5% '6o5V '6o5` '6o5l '6p2 '6q '6s0g '6sfs '6shb '6sjv '6snG '6sqg '6O13 '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 '7cO01 '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 '7O13$s '7O51 '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 '8CO43 '8D4+6 '8Ko5p '8L3 '8R2 '8T7 '8Z1 '8Z2 '8Z4 '8Z5 '8[ '8[L6 '8^4 '8^R '8^a '8^t '8^|z2 '8c '8d '8dz2 '8i02 '8i1. '8i2d '8i4_ '8i4u '8i4{ '8i52 '8i5e '8i6P '8i6j '8i7_ '8i7w '8o0E '8o12 '8o2tD1 '8o34 '8o7/ '8o7; '8o7a '8s 5 '8s2<$, '8siz '8t '8u '8O51 '8O61 '8z1 '8z1O12 '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 '9O06 '9O43 '9O61 '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 'AO41 'AO42 'AO43 'AO52 'AO62+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 'BO36 'BO51 'BO71 'BO72 'Bz5 *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^O *01^R *01^v *01d$k *01i11 *01i3-[ *01o3v+4 *01o6! *01o7) *01o8s *01s x[ *01s81 *01scx *01soi *01sx5 *01t*51 *01O42 *01O61 *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 *02O21 *02O24 *02O42 *02O63 *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 *03Z3O07 *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 *03O34 *03O43 *03z3 *04 *04$5 *04$nO41 *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 *04i0K*43 *04i0m *04i3R *04i4t *04l *04li6* *04o0`O23 *04o0t *04o41 *04oAw[ *04smv *04son *04sry] *04u *04O07p3 *04O32 *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 *05O02 *05O03 *05O21 *05O35 *05O45 *05O52Z1 *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 *06O02 *06O34 *06O41 *06z1 *07 *07$g *07$p *07*18 *07*24T1 *07*53O31 *07+0 *07-4z2 *07D2 *07D6 *07R7 *07c *07i8b[ *07O04O31 *07O58 *07z4 *08 *08'5 *08D6 *08T0*13 *08Z1s1( *08[ *08i7t *08O06 *08O45 *08O47 *09 *09'6 *09*91 *09*97 *09l[ *09o6@ *09s86 *09O03 *09O34 *0ALBO06 *0A[ *0At *0AO7A *0Bl *0BO08 *0BO74 *10$6{ *10*30z3 *10*42 *10+4i1: *10-8 *10R1 *10Z2d *10^9 *10^a *10^q *10i03 *10i1b *10i2b *10i38 *10i3r *10i4{ *10lz2 *10o1. *10o2Xi7; *10o4wZ1 *10o4z *10rD3 *10tO81 *10O04@t *10O19 *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 *12dO6B *12f *12i0o *12i1; *12i1g *12i2-*43 *12i2p *12i4! *12kss2 *12l *12lk *12o0D *12o1b *12o1j *12o2y *12p1 *12s34 *12sma *12snp *12uf *12O42$v *12z3 *12} *12}i01 *13 *13$8 *13$M *13$q *13*04 *13*26 *13*42 *13*45R1 *13*65 *13D1 *13D9 *13KO31 *13Z1[ *13[p1 *13^*i3p *13^/*72 *13^8 *13^T *13^u *13^z *13c *13dO52 *13i4y *13i5u *13i64 *13k *13o0f *13o2- *13o4B *13p1 *13s73 *13sau *13sbci1& *13sc2 *13svr *13O03i0q *13O12 *13O43 *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 *14O02 *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 *15uO01 *15O04@5 *15O13 *15O34 *15O42 *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 *16o1y *16o27 *16o3/^C *16o5s *16o5w *16r *16snp *16O03 *16O04D0 *16O43 *16z2 *17 *17$y *17'6 *17*73 *17+7 *17+7z2 *17-8 *17Z2D1 *17Z3 *17Z5 *17i13$5 *17i5N*56 *17r *17O06 *17O12 *17O15 *17O42 *17O51 *18 *18@sO05 *18D7 *18D8 *18^& *18^} *18l *18o5g *18O03 *18O62 *18O75 *19 *19$2 *19i6Y *19O08-4 *19O41 *19z3O07 *1A'A *1AO03'9 *1AOA1 *1BO01 *1BO17 *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 *20p2O14 *20r *20s29 *20s4q *20s52 *20s9! *20slm^9 *20sri *20svt *20syt *20td *20O05o3U *20O18O06 *20O23 *20O32 *20O41 *20O41[ *20O71 *20z4$z *20} *20}u *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 *21Z1} *21^ *21^6*61 *21^j *21i0m *21i4t *21i5 *21i50 *21i61 *21i8| *21kd *21o0m *21o1e *21o2g *21o61 *21sdEO24 *21suo *21O25 *21O25^p *21O31c *21O41 *21z1O42 *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_ *23t *23O03 *23O19i1H *23O42 *23O51 *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 *24O14L2 *24z2 *25 *25$0O63 *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-7O03 *25D1 *25D4o3m *25R5 *25T0 *25T5 *25Z1[ *25Z3 *25^2 *25^a *25^d *25^m$% *25i5a *25lO32 *25o0B *25o0m *25o2p *25o4C *25ssv *25z2 *25z2r *25z2O41 *26 *26'5 *26*37] *26*48 *26+4z1 *26-2$5 *26D2Z2 *26D3 *26D6 *26T6O15 *26^f *26i4 *26l^" *26o33 *26o5[Z1 *26r *26t$< *26u *26O06o28 *26O41z4 *26O62 *26z1 *26z2 *27 *27$y *27*65 *27*74 *27*76 *27D2 *27^2 *27i55 *27k *27o2n *27O07Z2 *27O12 *27O15f *27O26D5 *27O43^p *27O52 *27z2 *28 *28'7 *28T1 *28T2 *28c *28o2. *28O05 *28z2seb *28z3 *29 *29T0O04 *29s4wO13 *29O03 *29O04 *29O04o0m *29O14 *2A^U *2AO06 *2BDA *2BO14 *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 *30sdD *30u *30u{ *30O23 *30O26 *30O27o4R *30O32 *30O41 *30z2 *30z2Z1 *30z4 *30{*35 *30{O53 *31$$ *31$5O2A *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 *31q *31r *31sg' *31snsT6 *31tk *31O02 *31O24 *31O29 *31O32 *31z1c *31z3L2 *31z4 *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 *32D6 *32D7 *32R5 *32T0 *32T7 *32Z1 *32Z1O18 *32Z2 *32^3c *32^A *32^I *32^s *32d *32dt *32i05 *32i1\*52 *32i1u *32i4s *32i6_ *32i7yc *32i9n *32l *32o2c *32o3h *32o7y *32r *32s9* *32O38 *32O74 *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 *34O13stc *34O51 *34O52 *34z3 *34} *35 *35$9 *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 *35O12 *35O23 *35O43 *36 *36$1O48 *36'6 *36*13O62 *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 *36O04 *36O32 *36O62 *36z1L3 *36{ *37 *37$4 *37$A *37$k *37$z *37*05 *37*14 *37*32 *37*87 *37c *37i5<*30 *37O12 *37O13 *37O25 *37z5O32 *37{z2 *38 *38'A *38@rO32 *38D0 *38O23 *38O26 *38O57 *39'A *39+5 *39+8O38 *39D3-5 *39L3O05 *39o58 *39O04 *39O32 *3A'8 *3A-0O05 *3AO08 *3AO24 *3AO36 *3AO38z5 *3B'8 *3BTBO28 *3Bl *3BO09i18 *3BO37 *40$jO02 *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 *40D6O41 *40Z1$h *40^g *40c *40i0b *40i4C *40i8j *40o0B *40o3n *40o5m *40o7y *40p1 *40q *40t *40O24 *40O27 *40O34 *40O34u *40O42 *40O42O61 *40O45 *40O75O24 *40z1 *40z2D5 *40}$8 *40}z2 *41$) *41$s *41$z *41*16 *41*32 *41*47 *41*86 *41+0^G *41-0 *41D1 *41Z1*04 *41^2^k *41^j *41^v *41c] *41d *41f *41i68 *41k{ *41o2zu *41o5t *41o82 *41q *41O14f *41O21 *41O32 *41O34 *41O37 *41O47 *41z2 *41z3 *41z3O61 *41z4'8 *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 *42]^g *42^S *42^f *42^g *42^k *42^w *42d *42dc *42li5n *42o4aZ4 *42r *42skL *42t *42O3A *42O46 *42z1 *42} *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^7O18 *43^8'5 *43^y*23 *43i2b *43i2f *43k *43o4l *43o9p *43s25 *43skC *43suo *43t-5 *43t{ *43O53 *43z1 *43z4 *45 *45$1-4 *45$8 *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 *45O04 *45O08z4 *45O32 *45O52} *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 *46O05 *46O24] *46O34$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 *47L1O06 *47T4 *47Z1 *47Z1O71 *47o4v *47z3 *48 *48'6+5 *48*08 *48*86 *48T7 *48Z1 *48[ *48^9 *48i2nO52 *48l *48tD1 *48O07 *48O43 *48O43C *48z1 *49 *49$RO29 *49'9 *49^, *49swh *49O14 *49O24 *49O47L4 *49O53 *4A *4A*74O65 *4Bi8/k *4BO16 *4BO19 *4BO63 *50$0Z1 *50$e *50*02 *50*25^_ *50*31 *50*41 *50+0 *50+2 *50+3{ *50-4 *50L5 *50R5 *50Z1O32 *50Z4O4B *50cK *50i0B *50o0[ *50o34 *50o3j *50o3l *50o3t *50o6L *50to6Z *50u *50O16 *50O18 *50O23 *50O26 *50O32 *50O43 *50O51 *50O53 *50O56 *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 *51Z1O53 *51Z3O23 *51[ *51^' *51^H+7 *51^o *51i0d *51i1g *51o71D5 *51rK *51O32*30 *51O35 *51{ *51{+6 *52$3 *52$9 *52$?*63 *52$e *52'6 *52*24 *52*53u *52*70 *52+1 *52+6 *52L0 *52Z1 *52Z2 *52[k *52^b *52^p *52c] *52d *52i13^J *52o3k *52o5 *52o5B *52s3vD1 *52se0 *52shl *52srd] *52O04 *52O12 *52O13p1 *52O56 *52O61 *52z1 *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^d *53f *53i32 *53o0z *53o1$ *53o15 *53o8o *53p1 *53p2 *53s5s *53sbm *53sbn *53smb *53sun *53sur *53t^m *53O13 *53O52T5 *53O5B *53OB2 *53z1 *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 *54usBN *54O12 *54O23 *54O52@p *54O64 *54} *56 *56$1 *56$3 *56$4 *56'7 *56'A *56*12z3 *56*13u *56*30 *56*76 *56*81O03 *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 *56O0Ap3 *56}-6 *57 *57$% *57$0 *57$9 *57$a *57$n *57$oO56 *57*06 *57*25 *57*36] *57*46 *57D8 *57T5D3 *57Z1 *57Z2o4( *57c *57cD6 *57i3s *57i8b *57i9mO18 *57o0C *57o5R *57o7a *57o7s *57p1 *57O06 *57O16 *57O32 *57} *58 *58'8 *58*76 *58D4 *58D5s13 *58D7 *58]{ *58l *58o5M *58O06 *58O25Z1 *58O91 *59 *59*56^_ *59C^$ *59D2 *59Z1O53 *59i6Vk *59o0!} *59o90 *59O25 *59O27 *59O42 *5A *5AO06 *5AO08D2 *5AO36 *5AO45Z2 *5AO53@M *5AO73 *60$3 *60$s *60*02 *60*07 *60*54 *60-1 *60-5 *60-8 *60C *60Co2k *60D0 *60D1 *60D6 *60^A *60^S *60c *60kT5 *60o3R *60o6l *60O03 *60O34u *60O35 *60O51 *60O54 *60z2O65 *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{O52 *61O03k *61O12 *61O21*13 *61O54 *61O61+6 *62*46o18 *62*52 *62*73 *62+2 *62-0 *62-2 *62T9O35 *62^Lz1 *62i0z *62i8q *62l *62o12 *62o2k *62o2s *62o61} *62O01r *62O02 *62O03 *62O32 *62O38 *62O43D4 *62O45 *62O46 *62O51 *62z3 *63$j *63+1 *63+7 *63D3 *63D7 *63L6O62 *63T2 *63Z1 *63Z3 *63]'5 *63^Gi0b *63csv# *63i2| *63i5"*49 *63o1l *63o3q *63o4h *63o5t *63o6^ *63slp *63u *63uo2` *63O53 *63} *64$x *64'5 *64*20 *64*34 *64*65[ *64D0+1 *64K *64R3 *64^cO26 *64^j *64^r *64o3`$P *64o3i *64o66 *64O43@p *64O53 *64O61 *64O72 *64O73 *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` *65O14Z1 *65O42 *65O65 *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 *68O42 *68O43^j *68O52{ *69 *69'8 *69'A *69o67 *69o95 *69O92 *6A$GO18 *6AD7 *6As70O34 *6AO37 *6AO94 *6BO16 *6BO84 *70$"^! *70$2 *70'5 *70*05 *70*2A *70+9O56 *70T1L0 *70^Q *70i4g *70t *70O01 *70O05o28 *70O52*41 *70O53 *70O72 *70z1 *71'7 *71'9 *71*29 *71*62 *71-7 *71Cl *71D2r *71D6 *71[ *71c *71cO38 *71i7+ *71o4= *71o68 *71O02 *71O03 *71O04 *71O13 *71O35 *71O54Z3 *72$q *72'4 *72'6 *72-2 *72-4 *72D7 *72i3r *72i7sz2 *72o3w *72o7r *72o8h *72s32 *72O03 *72O23 *72O28+3 *72O39 *72O53 *72O59 *72O73 *73$_ *73$g *73$m *73*02o6k *73*72C *73D1 *73L5 *73[ *73^s *73^z *73o0d *73o3m *73o5zO03 *73r *73O04 *73O21 *73O31 *73O38^y *73O62 *73O74 *73O7A *73O96 *74$k *74+4 *74+5 *74-3 *74D1 *74L5 *74Z2 *74Z3 *74i57 *74i5_ *74i5r *74k *74k$8 *74o5 *74o85 *74o9- *74s6a *74sds *74uO72 *74O31 *74O34 *74O54 *74O56 *74O64 *74O6A *74O6B *75$5 *75$m *75@?'7 *75D1 *75D4 *75D6 *75T5 *75[ *75i3|^W *75i6e *75o0J *75o1h *75o6e *75o7R *75o87 *75sGwO41 *75si^ *75t *75u*76 *75O47Z1 *75O53R5 *75{ *76$5 *76$h *76$o *76'8 *76'B *76*31 *76*34 *76*36 *76*47 *76+5 *76+6 *76+6O42 *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 *76O1Ad *76O21 *76O41 *76O42 *76O52 *76O63Z4 *76O72$t *76O74 *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 *78O31 *78O53 *78O62 *79 *79'A *79*95 *79-8 *79-9 *79i9n *79O36+7 *79O81 *7A *7A'A *7AD4'5 *7AO53 *7AO62 *7AO64 *7AO92 *7BO17 *7BO27 *7BO64 *80'6 *80*38 *80Z4O47 *80o79 *80O04 *80O28D3 *80O31 *80O36 *80O45l *81$f *81'8 *81+8 *81T6o8$ *81t'7 *81tO27 *82$:*41 *82'A *82T5 *82T8O38 *82i3l *82l *82o84 *82O06 *82O39 *82O45 *82O72 *82O81 *83'5 *83*47 *83+3 *83D5 *83Z1O54 *83i54 *83o1} *83O04 *83O54 *83O59 *83O64-7 *83O81 *84'6 *84D8 *84^s'8 *84i6c *84o84 *84u *84O06 *84O23 *84O53 *84O5A *85'6 *85'7 *85*63 *85+1D8 *85+5 *85D8 *85Z1 *85^"} *85i7e *85O23 *85O42 *86$3 *86$r *86'8 *86*50 *86*70O64 *86*95 *86+7 *86D3 *86R0 *86o0]i3x *86o30 *86o5 *86o7j *86o8s *86sr5 *86O14 *86O34 *86O41 *86O57-8 *87$1 *87*36 *87+8 *87c *87i88 *87o0p *87o76 *87o7z *87o81 *87o8A *87s81 *87sti *87O26t *87O72^x *87{t *89 *89'5$g *89+8 *89-7 *89D5 *89Z1 *89[ *89^q *89o7p *89O18 *89O46'9 *89O63O04 *89} *8A *8AD8 *8AoB3 *8As6VO54 *8At *8AO38d *8B*BA *8Bur *8BO38 *8BO64 *90L0 *90i1t*14 *90o9D *90O1A *90O26 *91*37 *91R3 *91R8 *91o1a *91oA7 *91O43 *91O67 *92$g'5 *92'9 *92t *92O18 *92O46 *92O56 *92O57 *92O58 *93'9 *93cO56 *93O07 *93O21 *93O48 *94'8 *94*89^T *94o0t *94uO56 *94O06 *94O34 *94O61 *94O73 *94O85Z1 *95*27 *95*5A *95*87 *95o93 *95uD8 *95O19u *95O76 *96D7 *96O02 *96O15 *96O52 *97$q *97*21 *97*32O34 *97D1 *97c *97i1FO62 *97o93 *97o95 *97syi *97u *97O07 *97O36 *98$eO52 *98'9 *98*85 *98+0 *98+1 *98+9 *98D9*32 *98^1 *98o7 *98o8_ *98O71 *9A$3 *9A$mO83 *9A*89 *9Ao9J *9As1c *9AO46saC *9AO73 *9B*68 *9BL2L3 *9B^gO2A *9BO62 *A0$:DA *A0'6 *A0*5AO46 *A0-7'5 *A0O4B *A0O56 *A0O69O5A *A0{ *A1'6 *A1D1 *A1RA *A1O07 *A1O16 *A1O59t *A1O83 *A2 *A2'8 *A2O38z2 *A2O49 *A2O76 *A3'7 *A3i9YO52 *A3O06 *A3O75 *A3O93 *A4'9 *A4'A-4 *A4R8 *A4O05 *A4O86 *A5*B7'8 *A5o2n *A5O3A$I *A5O76 *A6'7 *A6*A9 *A6l *A6O26 *A6O42 *A7'8 *A7[ *A7^C *A8[ *A8l *A8oAe *A8s0x *A8O35 *A9 *A9'AZ2 *A9o9n *A9oA2 *A9s05 *A9O52 *AB *ABT7'A *ABO68+6 *B0$3'6 *B0'8 *B1'6$R *B1O03 *B1O45 *B2'7 *B2'8 *B4'7 *B5o8HR8 *B5O76 *B5OA1 *B6'7[ *B6^lO69 *B7 *B7'8 *B7O85 *B8*A9 *B8f'A *B9'A *B9*30i4l *B9o2o *B9s29 *B9O65 *BAD9 *BAc *BAiA_ *BAO02 *BAO83 +0 +0$! +0$$ +0$1o2k +0$2 +0$= +0$C +0$V +0$` +0$d +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^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+ +0i64O3A +0i6J +0i6v +0l +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 +0O12 +0O12R8 +0O13 +0O24 +0O25 +0O25D3 +0O38Z4 +0O42 +0O51@m +0O52 +0O53O73 +0O56 +0O72 +0O82 +0O92 +0OA1 +0OB3O19 +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'B +1*04slk +1*06 +1*14 +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 +1CO14 +1D4-6 +1D4d +1D7 +1D9 +1KZ2 +1L2O29 +1L7 +1R0 +1R1 +1R4 +1T2 +1Z1 +1Z1D3 +1Z1O01 +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 +1o8wO12 +1p1 +1s.qo2w +1s0Q +1sbq +1sel +1skw +1smd +1srg +1szl +1t +1O23 +1O24 +1O28 +1O42-3 +1O45 +1O52 +1O62 +1O63 +1O67[ +1O92 +1z1 +1z2 +1z3 +1z4o69 +1z5O82 +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*62O5B +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 +2iA5O38 +2l +2l$% +2li0D +2o0* +2o0z +2o1b +2o4A +2o71 +2oAs +2p1O23 +2q +2sCy +2sGq +2sgb +2sui +2t*57 +2up1 +2O02 +2O39t +2O41 +2O57 +2z1 +2z2 +2z3*08 +2z3*57 +2z3D4 +2z3t +2z4 +2z5O81 +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-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+ +3o4_ +3o4i +3o5, +3o6e +3o8a +3p1 +3r +3s1d +3sjLZ1 +3sl0 +3snz +3soe +3spjo6q +3ssv +3stg +3suf +3ts27 +3u +3O03$w +3O06Z4 +3O12 +3O47 +3O53 +3O71 +3z1+2 +3z1@6 +3z2 +3z3o33 +3z4 +3{ +3{K +4 +4$$u +4$0 +4$5 +4$G +4$N +4$ZO58 +4$_'6 +4$a +4$g[ +4$k +4$u +4$v +4'4l +4'9 +4*02 +4*04z2 +4*23 +4*24O03 +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 +4Z5O58 +4[ +4^c^S +4c +4d +4i03C +4i1lD3 +4i2P +4i44 +4i4TO01 +4i4b +4i4z +4i66 +4o0m +4o0t +4o0z +4o2; +4o3g +4o5y +4o97 +4q +4qO53 +4r +4s.z +4sK9 +4seg +4so5 +4srB +4t +4O03 +4O54 +4O57 +4O62 +4O74 +4O84 +4z1 +4z3 +4z4 +4{ +4} +5 +5$- +5$4 +5$D +5$I +5$`R8 +5$g +5$u +5$xO06 +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 +5D2O41 +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 +5dO75 +5f +5i3/Z1 +5i3o +5i51 +5i5z +5ko0j +5l +5o0N +5o2q +5o37 +5o3k +5o4 +5o47 +5o4v +5o79 +5o94 +5o9y +5r +5s36 +5s6a +5s6b +5sfm$f +5t +5O04 +5O62 +5O63 +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'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 +6k +6l +6l*32 +6o2s +6o5w +6o7. +6o77 +6o78 +6o92 +6s3* +6s57 +6s87 +6skP +6slK +6slg +6u +6O02 +6O06o03 +6O12 +6O21[ +6O31 +6O32 +6O42 +6O51 +6O73 +6O74 +6O76 +6z1 +6z1{ +6z2 +6{ +7 +7$% +7$0 +7$3 +7$4 +7$P +7$a +7$bi18 +7$bO4A +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-8O31 +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 +7O0BT4 +7O12 +7O24 +7O27O43 +7O32D2 +7O41 +7O48$u +7O82 +7OA2 +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 +8O08 +8O17 +8O21 +8O26 +8O42 +8O47T6 +8O52 +8O53p1 +8z1 +8} +9 +9$8D8 +9$B +9$a +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 +9Z2OA2 +9[ +9c +9i6s$2 +9i8d +9i91 +9l +9o0IO15 +9o0l +9o43 +9o76 +9o83 +9o8i +9o8j +9u +9O15 +9O19 +9O23 +9O37Z5 +9O45 +9O72 +9OA4 +A +A$! +A$9 +A*8A +A*9A +AD4 +ADB +AR5'9 +AR9 +AZ2 +A^5c +At +AO62 +AO82 +AO91 +B +B$3 +B*9A +B+5O0A +B@2 +B@8 +B[ +Bl +Bo10 +BO02 +BO62 +BO73 +BO92 -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'8O41 -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 -0R5O12 -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^pO12 -0^u -0c -0d -0f -0f*56 -0i0C -0i18 -0i1l -0i1r -0i2n -0i2t -0i3j -0i3t -0i52 -0i57t -0i7s -0i7}O61 -0k -0kD2 -0l -0l$; -0lO24 -0o0fq -0o1wz3 -0o2H -0o3Z -0o3c -0o4=O3A -0o4f -0o52 -0o6p -0o7w -0o7z -0o8a -0o9b -0p2 -0p4 -0q -0r -0sao -0spH -0spm -0ss#l -0st2 -0t -0t^T -0O12 -0O13 -0O16 -0O18^e -0O23 -0O24 -0O25 -0O26 -0O4A -0O52sfT -0O53 -0O56 -0O84 -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 -1@2 -1@6 -1@v -1C -1C-2 -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 -1O07i1_ -1O23 -1O32 -1O37^b -1O73 -1z1 -1z2 -1z3 -1z5 -1} -1}*50 -1}i5` -2 -2$3 -2$4 -2$7 -2$8 -2$< -2$K -2$c -2$cO42 -2$hO54 -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 -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 -2p1O83 -2q -2q+0 -2r -2rz1 -2s7i -2scu*03 -2sdy -2si5 -2sw;D2 -2u -2u*31 -2O47 -2O52 -2O53 -2O53z2 -2O54swc -2z1Z1 -2z2 -2{ -3 -3$#o86 -3$, -3$4 -3$9 -3$: -3$=O05 -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 -3fO12 -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 -3p1O72 -3q -3r -3s0b -3sCg -3sTB -3sfk -3smu -3ssp -3t$n -3ui2D -3O02 -3O35*43 -3O41 -3O51 -3O52 -3O63$9 -3O72 -3O86'8 -3OB2^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*42O42 -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 -4Z2O78 -4Z3 -4[Z5 -4[^I -4]-1 -4^$ -4^4D4 -4^h -4^j -4^r -4c -4i0l -4i27O4A -4i5d -4i64 -4k -4l -4o05 -4o0G -4o0P -4o0dz2 -4o28 -4o2B -4o2t -4o52 -4o5k -4o67 -4o7e -4p1 -4s0M -4s2m -4s7 -4se. -4t -4u -4O03 -4O12 -4O14$m -4O26$B -4O31 -4O45^D -4O63 -4O75 -4O82 -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 -5Z3O43 -5Z4 -5[ -5[d -5^RO41 -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 -5O02 -5O03 -5O05 -5O42L4 -5O81 -5z2 -5z2{ -5z3 -5z3Z1 -5{ -5} -6 -6$4 -6$7 -6$8 -6$p-2 -6$x -6$z -6'7i3i -6*20 -6*24D0 -6*63 -6*67 -6*70 -6*85 -6+0 -6-0O51 -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]O74 -6^# -6^& -6^@ -6^a -6^k -6^r -6c -6ci6f -6d -6dO48 -6i06 -6i0f'9 -6i45 -6i4j -6i5, -6i5r -6i62 -6i7d -6i82 -6ki6x -6l -6o3l -6o56 -6o5t -6o5z -6o7r -6u -6uL2 -6O03 -6O04 -6O05 -6O13 -6O23 -6O31 -6O34T3 -6O51 -6O51T1 -6O65i4u -6O72 -6O75 -6O82 -6O84 -6z1 -6z1O73 -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 -7Z2 -7Z3 -7[ -7^3 -7c -7ci6_ -7i0j -7i1R -7i4; -7i4w^7 -7i4x -7i59 -7i68 -7i7,t -7i7oO43 -7i7t -7i8+O06 -7l -7o14 -7o1@ -7o5# -7o5g -7o6- -7o6. -7o69 -7o6b -7o77i5I -7o8! -7o80 -7s4$ -7sull -7t -7u -7O03 -7O04$B -7O05D4 -7O26i4s -7O79 -7O94 -7z1 -7z1D2 -7z2 -7{Z1 -7} -8 -8$! -8$% -8$5+A -8$8 -8$VO3A -8$f -8$n^O -8$s -8$w -8$y -8'8$I -8*53 -8*57 -8*76 -8*7BO62 -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@uO12 -8D6 -8D7 -8DA -8R7 -8T4 -8Z1 -8Z2 -8[ -8[l -8c -8i2[ -8i8Qc -8l -8o3b -8o4b -8o5d -8o66 -8o6b -8o7f -8o9l -8oB3 -8q -8t -8O04 -8O12c -8O16 -8O25c -8O62 -8O91 -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^5O64 -9i6- -9l -9o64 -9o7b -9s09 -9s25 -9s4F -9s91 -9s9e -9u -9uO24 -9O02t -9O15o2* -9O16^p -9O17 -9O25 -9O35^f -9O41 -9O71+3 -9O92D0 -9O93$c -9OA2 -9} -A -A*A8 -A+9 -ALA -AZ1 -Ai82 -Ao93 -AoB8 -AO01 -AO35 -B -B$3 -B$9 -B+A -B-8 -B-9 -B-A -BD7 -BZ1 -Bl -Bs21 -BO28'8 : @ $sO62 @ '9 @ t @ O49 @!+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 @0o8FO16 @0s3- @0s78 @0O32 @1 @1$5 @1*9BO92 @1+4o1@ @1+6 @1-5 @1Z2 @1Z3^S @1Z5r @1^a @1d*13 @1l @1o5- @1o64 @1s3; @1O42 @1z1O23 @1z3c @2 @2$ @2$1 @2$5 @2+2 @2T7u @2^7Z1 @2^l @2^n @2i62u @2l @2l$x @2o2e @2o94 @2oB9 @2O42 @2O71 @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 @4O31 @4O35 @4O61c @4O63C @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 @5dO62 @5o1e @5o3r @5O12Z3 @5O25T0 @5O43 @6 @6$! @6$T'8 @6'6 @6*24[ @6+8 @6C @6D4 @6L2 @6Z2 @6i7_ @6o57 @6o5> @6o5j[ @6t @6O31 @7 @7$2 @7'9 @7+1 @7+6 @7@D @7Z2*37 @7[ @7i42 @7o1b @7o3w @7p1 @7s50 @7O04u @7O26z1 @7z1 @7z4 @8 @8'8 @8+4s0A @8@v @8Z2O2A @8^3 @8i40 @8i45C @8i5V @8o65 @8t @8z2 @9 @9$1 @9'7 @9D0Z3 @9L2 @9L4 @9L5 @9R1 @9Z3 @9[ @9c @9i3- @9p1 @9O53 @9O65$1 @9O92 @9z1c @9z4 @@^f^7 @BZ5 @Do3) @DO34 @Fshr @FO13 @H'6^F @H@1u @Il @Jc @L[ @Mi0D @Mu @N @OO13 @Qt @XO04 @a @a$1 @a$c @a-3 @aT0 @ai7e @al @ao1g @asw0 @az2 @az2O03 @b @b$Q @bD1 @b[z5 @bcl @bi0eO04 @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 @eO12 @eO72 @f @f-2 @fL4 @fZ5 @f[ @f^# @fd @fz1 @f{Z1 @g'7 @g*19O03 @g*73 @g+1 @gC @gD1 @gZ2 @gO05 @gO61 @h @h$4 @h-2 @h-3 @h-7 @hZ1 @h[ @h^a @h^s @hi2Z^H @hi6sD5 @hlp1 @ho4g @hO36 @hO41 @hO54 @hO63 @i @i$a @i'9c @i*06 @iD1Z1 @iD3 @iR1 @iZ1 @ic @il @io4e @itu @iO36^g @iz1 @iz2O26 @j @j-0 @jZ4 @j^a @jc @jO32 @k @k*31L0 @kD3 @kD5 @kR1 @kZ1 @kZ4t @k^j @k^w-1 @kco3L @kO46 @kO53-3 @kO67 @l$c @l'6 @l'9 @lT3-1 @l^f @li0nt @li2E @lO42 @lz1 @lz2O07 @m @m*27 @m-1 @m-4^4 @mD2 @mT3o2y @mT6-2 @mZ2L2 @mi0T @mi0d @mqz4 @mO24 @n @n$8Z3 @n+3 @n-3 @n-5 @nZ2 @n[ @n^m @nl+7 @np1 @nsbd @nO56 @n}i7r @o @o$t @o'4 @o'7 @o+6 @o@i @o^Z @oi1s @oi5z @oO12 @oO25 @oOA2O52 @o} @p-2i2l @p-3 @pO23 @pO31 @pO53 @q @r @r$g @r'5 @r+8 @r-7D3 @rD2 @r^$L9 @r^n @rl @ro1s @rO02Z3 @rO09 @rO16O32 @rO41 @rO48 @rO71 @s @s*7AO39 @sD6 @s^l @si1Ho1n @sl @ssix @ssux @su @sO07 @sO35 @t+3o2t @t+8 @t-1 @t@d @tR1 @t^c @tc$d @tp1 @tqO64 @t} @u+2[ @uR4 @uZ4 @ul @uo3c @uo53 @uO12 @uz1 @v @v$a @v'6 @v+0 @vZ1$p @v[ @vk^w @vo5g @vz2O13 @w[ @wd @wO02 @wz1 @x @x[ @xc @xO41o2X @y @y$rO01 @y'5R1 @y^"O05 @y^G @y^i @yi4- @yo3" @yO81R8 @z$! @z$8 @z*04[ @zD5 @zo43 @zrO07 @zO31 @zO53 @zz1 C C$* C$1 C$5 C$5z4 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'5u C*05^P C*61 C*71 C+1 C+2 C+4 C+5 C+6 C+7 C+9O34 C+AO53 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 CT4 CT5 CT7 CT8 CT8o1+ CT9 CTA CZ2 CZ2q CZ3 CZ3-5 CZ3^% CZ4 CZ4O38 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$ Cd Cf Ci0& Ci18 Ci1s Ci20$a Ci21 Ci2I[ Ci2cr Ci3-sY| Ci32'A Ci3<$E Ci4P Ci64 Ci9v CiBiO37 Ck Ck$2 Co0P Co0R Co1" Co17 Co1K] 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 CO01-5 CO02 CO03q CO04 CO04O19 CO12 CO12^c CO15 CO25 CO31[ CO42 CO42T3 CO48 CO52 CO53 CO73 CO92 Cz1 Cz1'8 Cz2 Cz2o04 Cz2O36 Cz3O52 Cz3z2 Cz4 C} D0$) D0$+ D0$q D0$t D0'B D0*01} D0*14 D0*30t D0-0z5 D0@7 D0@8Z2 D0@e$& D0@x D0D1k D0L4D1 D0R0Z5 D0R2t D0R4 D0RA D0T7O24 D0Z1sbj D0^" D0^/ D0^G D0^N D0^V D0^u D0i1 D0i1V D0i1h D0i2m D0i3m D0i4o D0i5ZO3A D0i5x D0k D0kt D0o0k D0o1M D0o1mz3 D0o2R D0o2eO35 D0o3m D0o3n D0o3p D0o4e D0o6W D0oB2 D0p1O15 D0p1O21 D0p1z5 D0s30 D0s30z3 D0s4C D0s7b D0s9A D0s@# D0se6 D0seh D0sfw D0skv D0smd D0spe D0u^E D0O13 D0O43 D0O47 D0O56 D0O91c 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 D1Z2O54 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+ D1i5nO53 D1i8yO23 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 D1O24 D1O27 D1O72 D1O91 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@iO32 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 D2s1` D2s3- D2sgc D2sgy D2sm1 D2soV D2suq D2t D2tZ3 D2u D2u'4 D2O07 D2O14Z4 D2O32z2 D2O34-1 D2O45 D2O53 D2O73 D2O84 D2z1 D2z1u D2z2 D2z4 D2z4u 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*4AO06 D3*51 D3*56 D3*56k D3+1 D3+4Z5 D3+6 D3+6} D3+AO64 D3-1 D3-1c D3-6 D3-8 D3@6 D3@d D3@j^A D3@t D3C$1 D3D8 D3DBO07 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 D3o71O54 D3o8i D3o8y D3p1+6 D3q D3s3 D3s9D D3sao D3sbz D3sea D3slWO65 D3t D3tZ1 D3u$4 D3O32C D3O41^s D3O47 D3O71 D3OA1D4 D3OA1O54 D3z1 D3z2 D3z3 D3z3t D3z4 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-7 D4-B D4@h D4D1$/ D4D2{ D4D7 D4L5 D4L6 D4R3 D4T1 D4T5 D4T6 D4Z1 D4Z2D0 D4Z3O32 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{ D4O02 D4O31Z5 D4O32Z4 D4O65 D4OB1O04 D4z1O62 D4z1} D4z2^h D4z4i9a D4{O21 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-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 Kz2O23 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 L0dO19 L0i0O L0i2/$i L0i60 L0l'7 L0o1. L0o21 L0o21z1 L0o2a L0o4D L0o56 L0o5c L0p1 L0s6u L0sdu L0u L0O02^A L0O05$D L0O12 L0O14i14 L0O14u L0O16 L0O17 L0O26 L0O31 L0O41 L0O46 L0O51 L0O53 L0z1 L0z2 L0z3i8U L0{ L0} L1 L1$3R1 L1$M$d L1$d L1$xO19 L1'3 L1*15 L1*62 L1*79D6 L1+1 L1+7 L1-0 L1-4 L1-7 L1D5'9 L1R0 L1R1 L1R5 L1T0 L1Z1+5 L1Z5O52 L1[ L1^Z*45 L1^o L1^r*7A L1i0L L1i0h L1i0z L1i27 L1i2f L1i3e L1i4d L1o0L L1o1ti4b L1o25 L1o2n L1o8`O67 L1p1o3w L1qz5 L1s#U L1sa3 L1sw@'6 L1t L1O23 L1O26 L1O35 L1O41 L1O42 L1O52 L1z1 L1z1*58 L1z4^ L1{ L1{z4 L2 L2$-i4e L2$7O26 L2$al L2'4z3 L2'5i3d L2*14$/ L2*23d L2*3AO34 L2+5 L2-1 L2@3 L2@9 L2@l L2@mR3 L2D3 L2L4 L2L7D0 L2LAO49 L2R2 L2R4 L2T1 L2Z1 L2Z2 L2Z5 L2^b L2i2vi2s L2i3l L2o6`$8 L2o7a L2p1 L2r L2r$; L2s6u L2s9d L2sd_C L2sds L2t L2u L2O02 L2O02Z1 L2O38$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-8O24 L3@6 L3@z L3C^T L3Ko3c L3L1 L3R3 L3Z1 L3Z3 L3Z4O67 L3[ L3^E L3^H L3^J L3c^d L3d L3i4; L3i4k L3l L3o0[ L3o56 L3sb` L3sl` L3slkT0 L3swjO32 L3O02 L3O34Z4 L3O52 L3O62 L3z1 L3z2saV L3z4 L3{ L3} L4 L4$3 L4'5 L4'6 L4*14 L4+5o49 L4-6 L4@0 L4D3 L4L4 L4R0 L4T1-5 L4Z1 L4Z2 L4Z3 L4Z4 L4[ L4^aO16 L4^e L4i0X L4i2Wo4z L4i2a L4l L4o2a@< L4r L4tD2 L4u L4u$O L4O04 L4O37-3 L4z1 L5 L5$3 L5$j L5$n L5$y L5'7 L5*02 L5*21 L5*23] L5*34 L5*39c L5-2 L5-5 L5@9 L5D0 L5L5 L5R1 L5R5 L5Z1 L5Z1O62 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 L5O04 L5O32 L5O62 L5z1 L5{*30 L5{i5# L6 L6$* L6$2 L6$6L5 L6$MT7 L6$e L6$h L6$pO17 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 L6o9!Z2 L6r L6s61 L6tT4 L6O06 L6O35$_ L6O4B L6O56sm2 L6O71 L6O72 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 L7O07 L7O15 L7O24d L7O31 L7O52 L7O74 L7O82 L8 L8$UO45 L8'9 L8*08 L8*52 L8+8 L8Z2 L8i2{ L8i8m L8s5s L8sp` L8O17 L8O21 L8O25 L8O31 L8O35 L8O61O05 L8O92 L8{ L8{*78 L9 L9Z1 L9[ L9^jO58 L9l L9O24 L9O35 L9O42 L9O62 L9O6AZ1 L9O72 L9O82u LA LA*B5'8 LAZ4O95 LAZ5O4A LAcO25 LAi7eO85 LAo4N@3 LAO05 LAO3BZ1 LAO82 LBshqO58 LBO02 LBO13O63 LBO53 LBO92 R0 R0$!*06 R0$3 R0$8 R0$m R0$n R0$o R0'1 R0'3 R0'4 R0*06 R0*08 R0*09 R0*37 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 R0O12$z R0O12c R0O13 R0O24 R0O26z1 R0O35 R0z1 R0z1D2 R0z2 R0z2spt R0z3 R0z3C R0z4 R0z4+0 R0z5 R0z5O72 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+4 R1-3 R1-5 R1-7 R1@"+3 R1@d R1@i R1C R1Co0Q 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 R1i03O49 R1i1P R1i3" R1i5& R1o07 R1o0P R1o0e R1o2h R1o3i R1o4B R1r R1s9) R1se< R1sedO35 R1sfn R1shc R1sx" R1t R1O02O76 R1O03'5 R1O23 R1O28 R1O42 R1O53 R1z2 R1z3l R1z4 R1z5 R1}k R2 R2$+@6 R2$N R2$Z+3 R2*24 R2*57O15 R2*61 R2*70O39 R2+1 R2+3 R2-9O16 R2@9 R2D2^b R2KZ1 R2L1 R2L7 R2T2 R2Z2Z5 R2Z2O19 R2^ R2^V R2^b R2^d R2d R2f R2i00 R2i28 R2l R2o2n^c R2o4(s(1 R2o5o R2o5v R2r R2u R2O21@p R2O41 R2O51 R2O62 R2{^7 R2} R3 R3$m R3$rO3B 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 R3s1j R3sd<$7 R3t R3t-4 R3O21 R3O32q R3O54 R3O73 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 R4D1 R4D8O23 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 R4O02 R4O04 R4O21 R4O39$r R4O41@K R4O53 R4O56 R4O57 R4O63 R4z1 R4z3 R5 R5$! R5$-i1( R5$4 R5$b R5$n R5$v R5*34 R5*41Z2 R5*53 R5*64O63 R5*65K R5+1 R5+2 R5-4 R5@pl R5D4 R5K R5LB R5R6 R5T5o64 R5Z1 R5Z1O21 R5Z2 R5Z3o6> R5Z4 R5Z5 R5[O04 R5^5i5 R5^> R5^_O1B 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 R5O04 R5O05 R5O31 R5O4As4a R5O51ssS R5O63 R5z1 R5z1sl2 R5z1O67 R5z2 R5z4O74 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 R6L2O62 R6L6o55 R6R0 R6R2 R6R7 R6Z1[ R6Z3 R6Z4 R6Z4C R6[ R6[$5 R6^7{ R6^P R6^S R6^p R6i3a R6i4LO32 R6i52 R6i6A R6i74 R6o1y R6o3g R6o4d R6o5: R6o5a R6r R6sc4 R6ss8 R6t R6uo2M R6O06 R6O15 R6O21{ R6O24 R6O36 R6O41 R6O75 R6O76 R6z2 R6z2*17 R6z3O18 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 R7CO05 R7D3[ R7T0z4 R7T4 R7Z1 R7Z2 R7Z3 R7[ R7i2F R7i6V R7i75 R7l R7o0K R7o0Ml R7o6 R7o6@r R7o6G R7o88 R7qO19 R7sgs R7syi R7t R7O05 R7O08z5 R7O12-0 R7O14 R7O23d R7O34 R7O41 R7O43 R7O61 R7O81 R7z1 R8 R8$1 R8$xO72 R8-5 R8D1 R8R7 R8Z1 R8i83 R8o0a R8o7eO25 R8o7x R8O04 R8O07 R8O07z3 R8O16 R8O17 R8O25 R8O25$3 R8O31 R8O32 R8O34 R8O43O32 R8O63@8 R8z2 R9 R9$0i2s R9$9 R9$yO06 R9*25 R9*36 R9*39 R9-9 R9D7 R9R4 R9Z1 R9[ R9u R9O02 R9O08 R9O14 R9O19$r R9O24o68 R9O25 RA$0 RA+1O82 RAD3O75 RA[ RAi9XO37 RAO73 RAO74z1 RAOA2O16 RBD8*02 RBO02 RBO09 RBO74 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*07O21 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^! 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 T0uo6k T0O06 T0O12 T0O13^1 T0O16 T0O17 T0O47 T0O63 T0O73@D T0O74 T0z2@0 T0{ T1 T1$' T1$2Z4 T1$6 T1$6O56 T1$_$W T1$i T1$l*63 T1$qR3 T1$w T1'7 T1'8 T1'9 T1*01$n T1*34o1_ T1+0 T1+4 T1+6 T1+7 T1+BO29 T1-3 T1@R T1K T1T0 T1T3 T1T3T5 T1T3T5T7 T1T3T5T7T9 T1T3T5T7T9TB T1T6 T1T7 T1Z1i0S T1Z4O75 T1Z5i8) T1Z5sS7 T1[ T1^W T1^o T1d T1f T1i0@z2 T1i3m T1k T1kC T1o0' T1o2g T1o2w T1o4w T1o6- T1o75@R T1r T1sAP+1 T1sbN T1si' T1sr[^x T1t T1O15p2 T1O42 T1O54 T1O57 T1O89c T1z1 T1z5 T2 T2$! T2$2 T2$bo5& T2'4 T2'7 T2*03 T2*57 T2-0 T2@aO64 T2CD6 T2D1^) T2D7 T2T4 T2T5 T2T6 T2Z1 T2]$8 T2^< T2^Q T2^` T2^w T2d T2f T2i00*57 T2i3m T2i59 T2k T2o06i0* T2o0V T2o1A'8 T2o38 T2o3P T2o3o T2o6! T2o94u T2r T2s03 T2sA8K T2sx3 T2t T2O02 T2O41o49 T2O52*52 T2O57 T2O62 T2z1 T3 T3$" T3$1 T3$4 T3$D T3$l T3$t T3'5^\ T3'9 T3*45^9 T3+0 T3-5O63 T3D6 T3D7 T3L0 T3L3'6 T3R1O12 T3T5 T3T6 T3T8 T3Z2 T3Z3 T3[ T3[o3i T3[O27 T3^! T3^% T3^H T3^K-0 T3^oz3 T3ci4G T3i3- T3i3f T3iBgO17 T3o0p T3o1n^t T3o2C T3o3iu T3o4` T3o71 T3p1 T3qL1 T3qs7b T3r T3s0@ T3si1 T3smA T3sr2 T3tO27 T3O12 T3O43 T3O53 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 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 T4O02 T4O31^7 T4O36 T4O54 T4O56u 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 T5L9O13 T5T7 T5Z1 T5Z2 T5[ T5^. T5^6 T5^I T5^[ T5^e T5i0p T5i11O23 T5i6Y T5o0S T5o1& T5o2K T5o4_ T5p1r T5s+3 T5s0+ T5s2b T5shn T5O13 T5O25u T5O61 T5O62 T5O6A T5O76 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] T6i0@ T6i0N T6o0f T6o2m T6o3fs4b T6o53 T6o56 T6s7)@l T6O02 T6O12 T6O14 T6O24T3 T6O71 T6O72 T6O83 T7 T7$*Z1 T7$-$m T7$0 T7$3 T7$7 T7$_ T7$i T7$w[ T7+6t T7@8 T7L6O74 T7RA T7T0 T7T2 T7T3 T7T4 T7T8 T7^1 T7^2 T7^Kz1 T7cO39 T7i2V T7i2z T7o0= T7o22 T7o3k T7o49 T7o5xu T7o5z T7s 6 T7s6fs4] T7sgp T7sjnu T7t T7O05 T7O05o47 T7O24 T8 T8$1 T8$dO52 T8-7D4 T8D2 T8D5sKp T8D6 T8i4 T8o04 T8o11l T8o9,O62 T8s1f T8sdn T8t T8O02 T8O31 T8O84o7v T8}T8 T9 T9*41 T9*61 T9T4 T9T8 T9i3' T9o7f T9o8#^v T9o96[ T9O13 T9O14 T9O23O51 T9O27 T9O71$1 TA TA'B TARADB TAT0 TAZ3O05 TAt TAO02 TAO25 TAO53O41 TAO61t TB TB*A1*8B TBiBRk TBs, TBO05 TBO17i4n TBO19 TC Z1 Z1$ Z1$! Z1$% Z1$& Z1$&O52 Z1$,O54 Z1$- Z1$. Z1$0 Z1$1 Z1$1*21 Z1$2 Z1$3 Z1$3i7e Z1$6 Z1$7 Z1$8 Z1$8O16 Z1$9 Z1$=O16 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*48O32 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-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@zO04 Z1D1R4 Z1D3+5 Z1D3T1 Z1D4 Z1D5 Z1D7sUE Z1L0 Z1L4O65 Z1L5o2l Z1R0o1i Z1R1 Z1R2$c Z1R4 Z1R6z1 Z1R7D4 Z1T1 Z1T4 Z1T5 Z1T5^A Z1T6sbK Z1Z1sCk Z1Z5 Z1[ Z1[i2< Z1[O31 Z1^" Z1^$ Z1^0 Z1^2 Z1^4 Z1^4D4 Z1^7*14 Z1^8 Z1^9O46 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 Z1dO56 Z1dO65 Z1dO75 Z1fO38 Z1fO5A Z1i0k Z1i13D3 Z1i1e Z1i1j Z1i1l Z1i1p Z1i2- Z1i21 Z1i2Z Z1i2a Z1i2c Z1i2v Z1i38 Z1i3: Z1i3I Z1i3s Z1i41 Z1i43 Z1i48 Z1i4K Z1i4] Z1i4a[ Z1i4bO18 Z1i4eO71 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 Z1o0dO32 Z1o0qi48 Z1o0t Z1o0v Z1o15$b Z1o17 Z1o1Lo1c Z1o1b Z1o2A Z1o2` Z1o2o Z1o2s Z1o2u Z1o3! Z1o31 Z1o39 Z1o3:O37 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?O46 Z1o9_ Z1p2'A Z1p2O13 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 Z1sfjO43 Z1sjB Z1sjv Z1sk Z1sleO71 Z1smN Z1sn. Z1sn5 Z1snl Z1so' Z1soO Z1sou Z1srz Z1ss& Z1ssB Z1stb Z1stn Z1sua Z1svb Z1sxt Z1syh Z1sz7 Z1t Z1t[ Z1tr Z1tO28 Z1u Z1u{ Z1O03 Z1O05 Z1O12spu Z1O13f Z1O15 Z1O15sbg Z1O16 Z1O16D5 Z1O17 Z1O21*01 Z1O23z3 Z1O24 Z1O25t Z1O27c Z1O28 Z1O32 Z1O32^r Z1O38 Z1O42 Z1O42d Z1O43 Z1O46$m Z1O47 Z1O52i0Z Z1O54 Z1O56 Z1O57 Z1O57c Z1O62 Z1O64 Z1O72o48 Z1O73 Z1O74 Z1O85 Z1O95O42 Z1OA2O17 Z1OA3 Z1OB2 Z1z1 Z1z1$s Z1z1*09 Z1z1p1 Z1z2D7 Z1z3 Z1z5O25 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*20O14 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*4AO05 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*79o70 Z2*82O37 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 Z2L1 Z2L2 Z2L3 Z2L4^3 Z2L6 Z2L9 Z2R0-0 Z2R1 Z2R2u Z2R3 Z2R4 Z2R4{ Z2R5 Z2R9 Z2T0 Z2T0o8n Z2T2 Z2T5 Z2Z1O48 Z2Z4r Z2Z4O75 Z2[ Z2[t Z2^$ Z2^)*36 Z2^, Z2^3 Z2^5 Z2^6 Z2^7O52 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 Z2i1n Z2i1} Z2i2G*75 Z2i3, Z2i3d Z2i3w] Z2i3y Z2i4- Z2i4e Z2i4j] Z2i5(O27 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 Z2o2bO01 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 Z2oAwO24 Z2oBhO56 Z2r Z2r*46 Z2rZ2 Z2r^3 Z2ri67 Z2s06 Z2s0R Z2s1- Z2s1t Z2s1z Z2s27 Z2s5+ Z2s52 Z2s59 Z2s5C Z2s5b Z2s85 Z2s9fO31 Z2s9j Z2sa? Z2saI Z2se7 Z2sfh Z2sft Z2sgx Z2sgz Z2shql Z2shr Z2shv Z2si9 Z2sipO19 Z2slS Z2slx Z2smn Z2ss+ Z2ss5 Z2svwO54 Z2t Z2ti5N Z2u Z2O02 Z2O02s8K Z2O03 Z2O06 Z2O08 Z2O12 Z2O12Z1 Z2O12u Z2O12O23 Z2O13 Z2O14^u Z2O21 Z2O23 Z2O25 Z2O26 Z2O27 Z2O28 Z2O2A Z2O31 Z2O32 Z2O32se# Z2O35 Z2O3A Z2O43$7 Z2O49 Z2O49Z4 Z2O4B Z2O53[ Z2O56 Z2O64 Z2O72 Z2O82 Z2O83 Z2O84 Z2O93-A Z2O94 Z2O94D7 Z2O95 Z2O96 Z2OB5 Z2z1 Z2z1T0 Z2z1O25 Z2z1O73 Z2z2 Z2{+4 Z2{o13 Z2{u Z3 Z3$- Z3$0 Z3$1 Z3$1t Z3$3 Z3$5 Z3$7 Z3$9 Z3$?O56 Z3$J[ Z3$SO75 Z3$br Z3$gO62 Z3$l Z3$mO37 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*59O71 Z3*63*72 Z3*65L6 Z3*68 Z3*6B Z3*70 Z3*82c Z3*96D5 Z3*A0 Z3+0 Z3+1 Z3+2 Z3+3l Z3+4 Z3+5 Z3+5O6A Z3+6 Z3+7 Z3+9 Z3+A Z3-0 Z3-0O59 Z3-1 Z3-1r Z3-4 Z3-4o1A Z3-5 Z3-6 Z3-6-9 Z3-6O76 Z3-7 Z3-8 Z3-9 Z3-9OB5 Z3-A Z3-B Z3@z+2 Z3C Z3CO02 Z3D1 Z3D2 Z3D3 Z3D6 Z3D7 Z3L1 Z3L3 Z3L5z1 Z3L6 Z3R0 Z3R0s5p Z3R1 Z3R2l Z3R5 Z3RA Z3T0 Z3T1 Z3T2 Z3T2D1 Z3T3*69 Z3T3O02 Z3T6O28 Z3T7 Z3TA'9 Z3TB Z3Z3*36 Z3Z3O56 Z3Z4[ Z3Z5 Z3Z5t Z3[ Z3[-9 Z3[D3 Z3[Z5 Z3[^u 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^pO62 Z3^r Z3^x*02 Z3c Z3c*40 Z3cO85 Z3cz1 Z3d Z3i0U Z3i1+ Z3i1o Z3i2B Z3i2S Z3i3Q[ Z3i3p Z3i43 Z3i4k*41 Z3i4k*7B Z3i6L Z3i6q Z3i7x Z3k Z3k*42 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,O46 Z3o6C Z3o6K Z3o6k Z3o6s+7 Z3o6w Z3o7o Z3o92*83 Z3o9h Z3o9r Z3p2 Z3p3 Z3r Z3rO32 Z3s0u Z3s1] Z3s39 Z3s57[ Z3s6T Z3s6l Z3s7B Z3s9k Z3sab Z3scw] Z3sdz Z3sd|O13 Z3segsvt Z3sjf+4 Z3slz Z3sn+ Z3soaO59 Z3soe Z3spb Z3ssz Z3stf Z3su- Z3sy7 Z3tO61 Z3u Z3u$\ Z3uo4a Z3uO01 Z3O03$) Z3O03^; Z3O04 Z3O05 Z3O06s1n Z3O12O56 Z3O13-2 Z3O13^7 Z3O16z3 Z3O1B Z3O23 Z3O23l Z3O2A$d Z3O2B-4 Z3O34 Z3O34^5 Z3O36 Z3O4B Z3O51 Z3O53 Z3O53r Z3O54 Z3O57sAS Z3O63o6f Z3O65$X Z3O74 Z3O75T0 Z3O79c Z3O83 Z3O92 Z3OA1 Z3OB2 Z3OB4 Z3OB7$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 [$} ['5smj ['6 ['6sJc ['8T7 ['8^g ['A [*02 [*03 [*05 [*09 [*12 [*16 [*23 [*25 [*31 [*40k [*51*40 [*54+2 [*67 [*70 [*83 [+0z2 [+1 [+2 [+4 [+9 [-0 [-1 [-2 [-2o6k [-3 [-4u [-5} [-8 [-9T0 [-A [@0 [@4 [@9 [@B [@e [@h [@i [C [Ci5y [D0z4 [D1 [D3R0 [D4 [D4$U [D4d [K*15 [L1 [L6 [R0 [R1 [R1i0R [R2Z1 [R2d [R3 [R3Z1 [R3c [R3shf [R7 [T1 [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 [[O43 [^% [^& [^- [^0Z2 [^= [^C*31 [^I-1 [^L [^Ll [^LO27 [^O [^P [^V'6 [^X*12 [^a [^g [^g'7 [^h+2 [^j [^p [^vD1 [^} [c [c$J [c*31 [d [f [fi4G [i0Ei0E [i0PO62 [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= [i4HO29 [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 [o4tO23 [o4u [o4w [o5) [o56 [o5f [o5g [o5i [o5li0r [o5n [o5u [o6 [o6/ [o68 [o6g [o7H [o7i [o7n [o9> [oA4} [p1^} [p1sc2 [p1O63 [p2 [p2O24 [p3 [p4 [p5 [q [qo4m [qO27 [qO2A [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 [O02z2 [O12 [O13$m [O15 [O15s6K [O17 [O21 [O21d [O23sa+ [O24 [O24$v [O25 [O26 [O31 [O32 [O34 [O34s4d [O37O41 [O41u [O42 [O43Z2 [O45 [O45$L [O45z2 [O51 [O51o1_ [O52$z [O53 [O64 [O6A [O71O05 [O73 [O74c [O93O34 [z1 [z1-4 [z1o2D [z2 [z2^1 [z2^k [z2i49 [z2l [z3 [z3*48 [z3*79 [z3R0 [z3Z2 [z4 [z4+5 [z4} [z5 [z5*19 [z5seb [z5O67 [{ [{*35 [{D1 [{Z4 [{u [}^K [}o3u ] ]$!Z3 ]$+ ]$: ]$C*17 ]$a{ ]$of ]$q^Q ]*10i0c ]*13 ]*13] ]*13z5 ]*16 ]*35 ]*36O43 ]*60 ]*64o5w ]*8BO63 ]+2*26 ]-1 ]-4 ]-4} ]D0u ]D1f ]D3R0 ]K ]KD5 ]Kp1 ]KO01 ]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 ]fO51 ]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 ]p2O49 ]p2z2 ]q^z ]qd ]r ]rZ5 ]s2oK ]sau ]shW ]shf ]si7k ]sm9 ]snl ]stf ]stw ]uZ1 ]uZ5 ]uo42 ]ur ]uz5 ]O01} ]O02t ]O64+6 ]O71i0Z ]OB8Z3 ]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 ^ O24 ^ z3 ^ z4 ^ z5 ^ } ^! ^!$! ^!$$ ^!$3T6 ^!$As!Q ^!$z ^!*40 ^!+4 ^!@6o36 ^!C ^!Z3{ z3 ^!^1 ^!^\ ^!^ji7i ^!d ^!i4/ ^!i78 ^!ss\ ^!O18 ^!O71 ^!z1 ^!z2 ^!z3*38 ^!z5'A ^" ^"$" ^"$ki4Y ^"'5 ^"Cs1o ^"D4 ^"R3 ^"^\ ^"^j ^"^o] ^"i3p ^"sie$0 ^"O0A$= ^"z3 ^# ^#$# ^#$1 ^#$@ ^#$p ^#*24 ^#*24$1 ^#*30 ^#*57o6" ^#*B7$0 ^#+7 ^#D6 ^#R3^& ^#T2 ^#^)o2f ^#^+ ^#^@ ^#^@^! ^#i1k ^#i2#$j ^#l ^#r ^#scm ^#sgw ^#O52 ^#O75 ^#z1 ^#} ^$ ^$$$ ^$$1 ^$$9 ^$$? ^$*02 ^$+1i3l ^$-5$y ^$^#^@^! ^$^$ ^$^w-5 ^$d ^$i3l ^$o1p ^$o2D ^$qo4i ^$ss$ ^$tZ1 ^$tz3 ^$z4 ^$z5 ^% ^%$/ ^%$g$g ^%*01K ^%*12 ^%+6O52 ^%-1 ^%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 ^'O51 ^'z1o6k ^'z3 ^( ^($#O0B ^($) ^(*25 ^(-0*48 ^(D1 ^(i3) ^(o7) ^(q ^(q[ ^(r ^(O06z1 ^(} ^) ^)$m ^)*25 ^)L6 ^)T4 ^)Z2 ^)i6ho5_ ^)O23 ^)z1 ^* ^*$* ^*$- ^**31 ^**61$v ^*+1 ^*C ^*D1l ^*K ^*R1 ^*] ^*^* ^*^^ ^*d ^*o4z ^*r ^*ss# ^*O17 ^*O51 ^*z5 ^+ ^+$+ ^+$N ^+$q ^+'3 ^+*13 ^+-4 ^+Z1 ^+Z4D9 ^+^1 ^+^a ^+^f ^+^j ^+d ^+i0m ^+i1/ ^+lq ^+sdmo5( ^+u ^+O13 ^+O23 ^+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 ^-z3 ^-z4 ^-} ^. ^.$? ^.*03$p ^.-1 ^.^, ^.^1 ^.^a ^.^f ^.^t ^.d ^.i0m ^.l ^.O16z2 ^.O26 ^.z1 ^.z2 ^.z4 ^/ ^/$/ ^/+2Z1 ^/^7 ^/c ^/d} ^/i1s^P ^/i2c ^/o1$ ^/r ^/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 ^0T4O24 ^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 ^0d ^0lZ2 ^0o6- ^0r ^0u'9 ^0O12 ^0O63 ^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*15 ^1*28 ^1*32 ^1*36 ^1*50 ^1*64 ^1+8^J ^1-1 ^1-1O65 ^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 ^1o1f ^1o1i ^1o20 ^1o3w ^1o4C ^1o4n ^1o5l ^1o63 ^1oA%O76 ^1r*02 ^1s8x ^1O52 ^1O56 ^1O73 ^1z2 ^1z2O68 ^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 ^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} ^2O26f ^2O53 ^2O59l ^2O85 ^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(} ^3i5t ^3i68 ^3o1G^i ^3o1e ^3o2x ^3r*06 ^3st^ ^3tO74 ^3O12 ^3O14 ^3O23 ^3O36 ^3O37o16 ^3O57 ^3OA5 ^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 ^4i1e ^4i6/ ^4i8;o2& ^4o3x ^4o5? ^4o62 ^4rc ^4sb1 ^4sd ^4t^i ^4uD6 ^4O23 ^4O2A ^4O31 ^4O35 ^4O52u ^4O62 ^4O78 ^4z2 ^4z3 ^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^9O47 ^5^U ^5^a ^5^b ^5^c ^5^d ^5^e ^5^f ^5d ^5f'9 ^5i0$ ^5i51o3d ^5l ^5o2BZ2 ^5o5F ^5r ^5s!f ^5s4r ^5t ^5O27o3K ^5z1*26 ^5z2 ^5z3 ^5z4^> ^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 ^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 ^6O12 ^6O15 ^6O42^g ^6O56 ^6z2 ^6z5 ^6} ^7 ^7$+ ^7$7 ^7$fO53 ^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 ^7o2n ^7o3# ^7q ^7r ^7s2sl ^7s7] ^7sc% ^7tz3 ^7O27 ^7O32 ^7O62 ^7z1o6, ^7z1t ^7z2 ^7z4 ^7z5 ^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+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 ^8r ^8sod ^8t ^8O36 ^8O4AZ1 ^8O53 ^8O62 ^8O93 ^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 ^9i7HO35 ^9o3a ^9o5n ^9o6s ^9o70 ^9o87 ^9q+6 ^9t ^9O31 ^9z2 ^9z2D5 ^9z4 ^: ^:$! ^:$h ^:-4t ^:C ^:Ki7T ^:^K ^:^T*27 ^:lr ^:o48 ^:rL2 ^:t ^:z1 ^:z4i4O ^; ^;$2Z1 ^;$; ^;*63 ^;+6Z2 ^;D6 ^;R9 ^;^R^0 ^;^s ^;^| ^;c ^;i1> ^;p2O67 ^;soM ^;u ^;OB8O07 ^;z5 ^< ^<$2 ^<$> ^<*74T3 ^<+5+6 ^ ^>$* ^>$1o7X ^>$A ^>*03-3 ^>*15 ^>D3$j ^>D4*13 ^>Z3+2 ^>Z5O64 ^>^L ^>i6u ^>o71 ^>O82 ^? ^?$t*53 ^?*52 ^?^k ^?i0? ^?i6kO26 ^?l ^?o64 ^?O21 ^?z1-6 ^?z2 ^?z3 ^@ ^@$4 ^@$@ ^@$E$s ^@$e ^@$y ^@'4 ^@'7 ^@+1 ^@-1 ^@Z3O46 ^@^! ^@^!$!$@ ^@^p ^@cZ1 ^@u ^@O15 ^@O71 ^@z1 ^@z1O15 ^@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 ^AO21 ^AO32 ^AO38 ^AO63 ^Az1 ^Az2 ^A}^+ ^B ^B$. ^B$` ^B$j ^B+5 ^B^:z1 ^B^D ^B^V ^B^[T5 ^B^n+1 ^Bd ^Bi0o ^Bo3r ^Bs52 ^Bu ^BO04z3 ^BO32 ^BO35 ^BO3B ^BO42l ^BO67O04 ^Bz1 ^Bz2 ^C ^C'5 ^C*17-2 ^C*A6 ^C+1 ^C+2 ^CC ^CC*53 ^CZ2 ^C] ^C^! ^Ci58 ^Ci63 ^Ci6r ^Co1a ^Co2u ^Co7\ ^Cp1 ^CscK ^Ct ^Cu ^CO32 ^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 ^DO43 ^DO45 ^Dz1 ^Dz2 ^D}R3 ^E ^E*23 ^E*27 ^E*43 ^E-1 ^E-5 ^ED3 ^EZ1sl# ^E^1 ^E^D ^Ei0_i6o ^Ei1l ^Ei5pO72 ^Ei6k ^Ek ^Eo1fO45 ^Eo38 ^Eo4e ^ErO06 ^Eu ^EO06o01 ^EO51 ^Ez2 ^E} ^F ^F'4z3 ^F*13 ^F*46 ^F-5l ^FD3 ^FT1$x ^FcO26 ^Fi0B ^Fl ^Fo1l ^Fu ^FO25 ^FO28 ^Fz2 ^F} ^G ^G$R ^G+7i7' ^G-4 ^G-7 ^GD3 ^GZ2 ^G^M ^Gi5? ^Gl ^Go5i ^Gp1O58 ^Gu ^GO57 ^GO71 ^Gz1 ^Gz1+1 ^Gz2 ^H ^H$! ^H'7 ^H*54 ^H*63 ^H*79L1 ^HT4O56 ^H^C ^H^Dser ^H^R ^Hi5` ^Ho3z ^Ho6O ^Hq*63 ^Hu ^HO14 ^HO29 ^HO35c ^HO72l ^Hz1 ^H} ^I ^I'6 ^I*56 ^I-4 ^ID4 ^IZ3o5b ^I^+ ^Ii0S ^Ii5_ ^Il ^Io4m ^Io7gz1 ^Ip1O32 ^It ^Iu ^IO18 ^IO1B ^IO27 ^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 ^Kl ^Kl$Y ^KO13 ^KO24 ^KO34 ^KO42 ^Kz1 ^K}C ^L ^L$4 ^L$8 ^L$T ^L$i ^L*60 ^L+3 ^L-1 ^L@f ^LR7i3( ^L^B ^Lu ^LO19 ^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 ^MO13z2 ^MO18 ^MO36 ^MO42 ^MO43 ^MO69 ^Mz1 ^N ^N$H ^N$L ^N$h ^N*06O52 ^N+4 ^N^Z ^Ni7[ ^Nl ^No1m ^Np2'5 ^Ns8P+5 ^NO02$x ^NO63 ^Nz1 ^N} ^O ^O$4 ^O$i ^O*17 ^O+5 ^O+6 ^OL3*04 ^OT2 ^O^M ^Oi0}z3 ^Oi5! ^Ol ^Op1 ^Ou ^OO52 ^OO84 ^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 ^PO31 ^Pz1 ^Q ^Q-2 ^Q^X ^Q^f{ ^Qi10 ^Qi5& ^Qi5I ^Qi6k ^Ql ^Qr ^Qt ^Qu*34 ^QO16d ^QO43 ^R ^R$' ^R$R ^R'2p2 ^R*18c ^R*67 ^R@3sRt ^R@z ^RD3 ^RD4 ^RD7 ^RT3 ^RZ1 ^R^D ^Rd ^Rl ^Rq ^RO25 ^RO37 ^Rz1 ^Rz2 ^S ^S$S ^S*34O3A ^S*56L7 ^S+1 ^S+3 ^SC ^SD2 ^SR4 ^SZ1*26 ^SZ2 ^S] ^S^F ^S^J ^S^N ^Si4Sk ^SiA*O06 ^Sp1 ^SqTA ^Sr ^St ^St+8 ^Su ^SO12 ^SO14 ^SO64Z1 ^Sz1 ^Sz2 ^Sz3 ^T ^T$' ^T$) ^T$1 ^T$p ^T'8O41 ^TT1 ^TZ1 ^TZ4-6 ^TZ5 ^T^C ^T^J ^T^Q ^Ti0P ^To0sD5 ^To4n ^To7tiAC ^TO1B ^Tz1 ^U ^U'3 ^U*35+5 ^Ui63 ^UlO41 ^UqO65 ^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 ^VO06O45 ^VO12 ^VO15 ^VO31 ^VO74O05 ^Vz3 ^W ^W$Lo01 ^W'4 ^W*14 ^W*40 ^W*52 ^W*64 ^W-3i77 ^WL3C ^WT1 ^WZ2 ^W^_ ^Wi5j ^Wi8BO05 ^Wo19K ^Wp1 ^WO15 ^Wz1 ^Wz2 ^Wz5 ^W} ^X ^X'7 ^X*28 ^X+5 ^X-4 ^XK$2 ^X] ^X^B*4A ^Xi4K ^Xi6r ^Xo1i ^Xo4j^i ^Xu ^XO13+4 ^XO31 ^Xz1 ^Y ^Y$s+A ^Y*32 ^Y*64 ^YD2 ^YL0 ^Y^_+4 ^Y^yZ1 ^Yi5f ^Yo2b ^Yo5d ^YslK^y ^YO23 ^Yz2 ^Yz4 ^Yz5 ^Z ^Z$" ^Z$tz4 ^Z*68 ^Z+3 ^ZL0 ^ZZ4O75 ^Z^B ^Z^M ^Zi4R ^Zi4X ^Zl ^Zp1O14 ^Zsef ^ZO31 ^Zz2 ^Zz3-7 ^[$] ^[*30 ^[C ^[L2{ ^[i5X-1 ^[l ^[o1oo5# ^[o7VZ1 ^[s3[ ^[s[do6a ^[z1L4 ^\ ^\D6 ^\R1 ^\R2o2j ^\Z3 ^\^' ^\o69O04 ^\sr5 ^\O32p1 ^\z1T1 ^\z3 ^\} ^] ^]$: ^]$Ll ^]$[ ^]*27t ^]-2 ^]K ^]L0 ^]t ^]O18 ^]O42 ^]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 ^_O12 ^_O13 ^_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 ^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 ^ai1; ^ai3. ^ai3l ^ai49 ^ao2i ^ao3z ^aO12 ^aO21 ^aO31 ^aO41 ^aO47 ^aO49 ^aO51o0t ^aO61 ^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 ^bO25 ^bO35 ^bO52 ^bO56 ^bz2*56 ^bz3 ^bz3c ^bz4*06 ^c ^c$2 ^c$m ^c$z ^c'9 ^c*01+0 ^c*12 ^c*16 ^c*20 ^c*30 ^c*40{ ^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 ^ci1j ^ci3t ^ci58z1 ^ci5u ^co5cT1 ^co6< ^cp1 ^cp2 ^ctO32 ^cO13 ^cO4B ^cO56 ^cO75 ^cO82 ^cz5 ^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=O34 ^di8d ^dl^0 ^do2. ^do3sK ^do4h ^do4r ^do64 ^dp1 ^drk ^ds4b ^dsf5 ^dt$C ^dO13 ^dO31 ^dO32 ^dO32Z2 ^dO42 ^dO51 ^dO63-6 ^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^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 ^ei0V ^ei0l ^ei6\*36 ^eo5y ^er ^eud ^eO12 ^eO21 ^eO31 ^eO45 ^eO46 ^eO51 ^eO57 ^eO71 ^ez2 ^f ^f$^ ^f$b ^f$r ^f$v ^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 ^fi2jr ^fs62 ^fO49 ^fO51 ^fO58o2u ^fO61 ^fO75 ^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 ^guZ1 ^gO23 ^gO29p1 ^gO31 ^gO32 ^gO36 ^gO49 ^gO52 ^gO59 ^gO5A ^gO65 ^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 ^hO16 ^hO34 ^hO51 ^hO62 ^hO91 ^hz2 ^hz4 ^h} ^i ^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 ^is1l ^isv5 ^isxh ^iO12 ^iO15 ^iO21 ^iO23 ^iO25 ^iO36 ^iO54 ^iz1 ^iz2 ^iz3 ^iz5 ^i} ^j ^j$s ^j$y ^j*24 ^j*41 ^j*54 ^j*59O46 ^j+1 ^j+2 ^jR5o3l ^jZ1i2e ^jZ3 ^j^` ^j^b+2 ^j^r ^jc ^ji0h ^ji2=R1 ^jo4c ^jo51 ^jo8JO39 ^jp1 ^jrO05 ^juz1 ^jO14 ^jO21 ^jO21T5 ^jO24i09 ^jO25'5 ^jO32 ^jO34 ^jO51 ^jO62 ^jO74+7 ^jz1 ^jz2O38 ^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 ^kO13 ^kO15 ^kO32 ^kO42 ^kO46 ^kO53 ^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 ^l] ^l^J ^l^a ^l^k ^l^l^a^4 ^l^o ^l^r ^l^s ^lc ^lcZ3 ^li3l ^li5v ^li7h ^li9n ^lo3 ^lo3o ^lo4h ^lO32 ^lO36 ^lO41 ^lO53 ^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 ^mcO62 ^md ^mi1a ^mi3- ^mi6O ^mo2i ^mo3i ^mo3n ^mo4l ^mo58 ^mo85 ^msrw ^mst% ^mt ^mO12 ^mO13 ^mO15 ^mO24 ^mO32 ^mO58 ^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 ^n^n ^n^t ^nd ^nf ^ni0b ^ni1d ^ni2^ ^ni4U{ ^nkr ^no1I ^no5,o6P ^nslo ^nstk ^nt ^nto78 ^nO25 ^nO31 ^nO32 ^nO34$G ^nz2 ^nz2^x ^nz3o9v ^nz5 ^n{Z1 ^o ^o$9o6n ^o$mz2 ^o$p ^o$v ^o'8 ^o*25f ^o*28O2A ^o*30 ^o*58 ^o+1 ^o+6 ^o-3 ^o-6 ^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 ^oO12 ^oO28 ^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 ^pcz1 ^pi0$r ^pi0R ^pi2YO36 ^po0iO52 ^po1k ^pp2sfi ^psx- ^pt ^pt^| ^pu ^pO15 ^pO34 ^pO52 ^pO68 ^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 ^qo5C ^qp1 ^qr ^qtO39 ^qO48 ^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 ^rZ1 ^r^`i1J ^r^x ^ri0D ^ri18 ^ri1t ^ri4f ^ri4y ^ro0uO62 ^ro81 ^rrZ3 ^rsli ^rstm ^ru ^rO16 ^rO16o2x ^rO72O38 ^rO92 ^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 ^sZ2O26 ^sZ3 ^s^)-7 ^s^F ^s^L ^s^V ^s^Y ^s^a ^s^c ^s^gu ^si0h ^si1j ^si2a ^si87O49 ^si9y ^sl ^so2y ^sp1 ^sr ^ssl3 ^sslzz3 ^sspe ^ssr/ ^sO13 ^sO14 ^sO26 ^sO43Z1 ^sO52 ^sO63 ^sO82 ^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-6O45 ^t-7+8 ^t@t ^tC ^tZ1 ^tZ3'6 ^t^/ ^t^s ^t^s^1 ^t^u ^td ^tfO08 ^ti0a ^ti5t ^tl ^to14 ^to3R ^to3^ ^tsd ^tsmt*21 ^tt ^tuz2 ^tO12 ^tO13 ^tO24 ^tO37 ^tO43 ^tO45 ^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 ^uO15 ^uO53 ^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(O56 slr ^vO13 ^vO14 ^vO16 ^vO49 ^vO58 ^vO62 ^vz1 ^vz1D2 ^vz2 ^vz4 ^v} ^w ^w$m ^w$w ^w*37 ^w*64^` ^w+4z2 ^w@msc6 ^wD3 ^wR1 ^wR6 ^w^M ^w^_ ^w^t ^w^w ^wd ^wf ^wi1r ^wi7Z ^wo2_ ^wo3I ^wsil ^wsnXO51 ^wto3B ^wO15@x ^wO34 ^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*35 ^xl ^xo0\i3? ^xo4m ^xp1 ^xsq3 ^xu$q ^xO13 ^xO31 ^xO4B ^xO54 ^xO58 ^xO73 ^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_ ^yi5wO13 ^yi6U ^yi8O ^yo1k ^yp1 ^ys5e ^yO32 ^yO41 ^yO49 ^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 ^zZ1O31 ^z^4 ^z^s ^zi4_ ^zi6T ^zi8z ^zo6R ^zr ^zO13 ^zO23 ^zO24 ^zO42 ^zO59 ^zz2 ^zz2*23 ^z} ^{ ^{$} ^{c ^| ^|$+^Q ^|$ki4p ^|$r ^|T6 ^|T7 ^|z1*50 ^} ^}$bi0< ^}L2^- ^}^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$&d c$&d] c$) c$* c$*$*^*^* c$*d c$*d] c$+ c$+d c$+d] c$- c$-d c$-d] c$. c$0$0 c$0$0$0 c$0$0$1 c$0$0$7 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$0 c$1$1 c$1$1$1 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$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$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$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$A 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$k c$l c$m$e c$v c$x c$x$x$x c${ c'3z5 c'5 c'7Z1 c'9T3 c'B c*21 c*24T0 c*25O13 c*40t c*46 c*52+0 c*58 c*65o65 c*68 c*70 c*83 c*8A c*A8O86 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@2O14 c@3 c@A c@b c@f c@fO23 c@lO02 c@m c@q-5 cD0D8 cD1 cD4 cD5 cD5@k cD6 cD7 cD7*05 cDA cDB cK*14 cKi1[ cKp1 cL0 cL0^p cL0l cL0sl( cL5 cL7 cL7O05 cR2 cR3 cR5z3 cR6 cR6C cR7 cT1 cT1$1 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$1 cT3d cT3f cT3i3& cT3i3+ cT3i3- cT3i3. cT3i3_ cT4$1 cT4d cT4i4& cT4i4+ cT4i4- cT4i4. cT4i4_ cT5$1 cT5+4 cT5i5& cT5i5+ cT5i5- cT5i5. cT5i5_ cT6$1 cT6+B cT6i6+ cT6i6- cT6i6_ 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 cZ1O61 cZ2i32 cZ3 cZ3O53 cZ3O83 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^{$} cd ci0: 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 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!O74 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.O25 coA4 coA6 coAm cp3 cp3'8 cp4 cp5 cq cr cs$2 cs0# cs0I cs0oZ5 cs1, cs10 cs2* cs2I cs2m cs4K cs8! cs87O43 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 cuZ4 cO02 cO02L1 cO03 cO08 cO12O28 cO17$O cO23 cO24 cO25 cO26 cO28 cO32 cO35 cO35q cO36 cO38 cO41$" cO43 cO43$7 cO52 cO53 cO54'7 cO57 cO64 cO65 cO84 cO85 cO92 cOA1O04 cOA2 cOB2 cz1 cz1$0 cz2 cz2$2 cz2$t cz2o9o cz2ssR cz3 cz3K cz3^K cz3O81 cz4 cz5O18 cz5O1B c{ c} 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$aO7A 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*15O93 d*16 d*19*08 d*20 d*26 d*28O13 d*32 d*32Z1 d*3A d*45 d*47O58 d*52 d*52R4 d*53 d*56 d*57 d*64 d*68 d*68t d*70 d*71 d*74 d*7BO73 d*81O63 d*83O75 d*87 d*92D2 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+BO67 d-0O92 d-2 d-3^ d-3O92 d-4 d-5 d-6 d-6K d-7 d-A d@3 d@a d@k d@zt dCO39 dD1c dD2] dD2o4s dD3 dD4^; dD4o4w dD5[ dD6 dD6t dD7 dK dK{ dL2 dL2o8g dL3l dR0 dR3i7Q dR5 dT0O85 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^CO14 d^T d^ak d^b d^c d^f d^s dc dcsh1 dcO58 dfO9A di0# di0m di0q di0z di2m di3 di3,O07 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- dkO5A dl dlOB1 do0! do06O21 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 do8i do8k do8o do93 do9i do9vO94 doBa doBm doBx dr drO0B ds04 ds0f ds1h ds2q ds34O29 ds5- ds65C ds9y dsam dsbh dsby dseg dsg0 dsgd dsgr dsh6 dsir dsjlO14 dskz dslY dsmp dspi dsr3 dsrw dstp dsvt dsx/ dt$Q du du*42 dO02 dO03 dO04 dO05 dO06 dO07 dO09 dO09$e dO12 dO12$q dO13 dO13t dO15O63 dO16 dO17 dO18$A dO21 dO23 dO24 dO25 dO26 dO26^R dO27 dO28 dO28^Y dO29 dO29$z dO29C dO29o6| dO32 dO32Z1 dO32o6y dO34 dO34$m dO34p1 dO34O03 dO36 dO37 dO37k dO37O92 dO38 dO38o0B dO38O64 dO41 dO42 dO42[ dO43 dO45 dO45$d dO46 dO46z1 dO48 dO48^. dO49$L dO51O12 dO52 dO53 dO54 dO56 dO62 dO62K dO63 dO63c dO69 dO6As2@ dO72 dO73 dO74 dO75 dO76 dO79 dO7Bs0k dO81 dO82 dO83 dO83O51 dO84 dO85 dO85O34 dO8A dO94 dO95 dO96 dO97 dOA1 dOA4 dOA5 dOA5O52 dOA6 dOA6*93 dOA7 dOB4 dOB8 dz1r dz2 dz3 dz3Z1 dz3s*p dz3O75 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$gO76 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'9O61 f'A f'B f*06O13 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*51z1 f*60 f*67 f*67f f*69O6B f*71 f*75O54 f*78 f*79 f*86 f*94 f*98O27 f*9B f*A5'8 f+0O16 f+0O29 f+2 f+4 f+6 f+7 f+9 f-4 f-5 f-7O7B f@a fC fCL3 fD1O58 fD2 fD3 fD4 fDB fK fKO69 fL2 fL3K fL6K fR4 fR6iAA fR8O29 fT0O0A fT4 fT4D0 fT6O75 fT9O08 fZ1 fZ2 fZ4*A3 fZ5 f[ f[O59 f[O75 f] f]*51 f]O19 f]O72 f^5 f^6O3A f^8 f^9 f^T f^c f^h f^m f^n f^o*06 f^s f^tO17 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+5 frD8 fri4q fs!g'7 fs4k fsnc fss0 fswv fsy< ft fu[ fO02 fO03 fO04 fO05 fO06 fO08c fO0Ad fO13 fO13$6 fO14 fO15 fO16 fO17*0A fO18 fO18*50 fO18{ fO19 fO19$S fO1A fO23 fO24 fO25f fO26 fO27 fO28 fO2A fO2B fO31*31 fO34 fO34T0 fO36 fO36*25 fO37 fO38 fO38T1 fO39 fO3A fO3Ak fO3B-2 fO3Bi0b fO42 fO42*40 fO42z3 fO43 fO45 fO47 fO47Z2 fO48 fO48D8 fO48sh/ fO49 fO4AL5 fO4B fO51 fO52 fO53 fO56 fO57 fO58 fO59 fO59o57 fO5A fO5AT0 fO5Asts fO5B fO61 fO61o3s fO63 fO64 fO64L7 fO65 fO65t fO67 fO68 fO69 fO6A fO6B fO73 fO74 fO75 fO75i7l fO76 fO78 fO7A fO7A+6 fO7B fO82 fO83 fO85 fO86 fO8Ao8a fO8B fO91 fO93 fO96 fOA5 fOA8 fOB4 fz1 fz1'A fz2 fz2R1 fz2O2A f{ f{*65 f{[ f} f}O53 i0 ^m i0 l i0 z2 i0!o3t+0 i0!O81 i0$o3s i0$O46 i0$z3Z2 i0'^U i0($g^B i0)i5Fo9z i0)z2 i0*$0 i0+$Vo6k i0+-0OA3 i0+-3 i0+O72O24 i0,*62 i0-D6 i0.z3 i0.} i0/z5 i00'4 i00o6m i00z2i2^ i01$9 i01'B i01TA i01Z2 i01i8o i01r i01szt i01z4z2 i02$t i02^l i02z4 i03K i04'6 i04^! i04o5^ i05D3 i05^! i05lO65 i05O31T2 i06i5t i07D5 i08O71 i09+2 i09cR4 i09O15 i09z3 i09} i0:o2" i0;i2xl i0;i5A i0<$uo6( i0Z4 i0?$! i0@*19l i0@i3q i0AO13 i0D^q*14 i0Dr i0Dz3 i0E$J i0G*19 i0G] i0Gt i0Gz1$5 i0I+2 i0IO53 i0J$M i0J$d i0Ji3f i0Ll i0LO18d i0LO23 i0M$b i0Mo0?su` i0MO71 i0N*56i3N i0N^=^i i0OD3 i0O^L i0O^esk> i0PD2 i0P^E i0Po1w i0Q$"o4^ i0Q$7 i0QO26 i0QO61^2 i0R^W i0SD4 i0T^Y i0TO52 i0U$5l i0Uo4h i0V$B i0Vo6# i0Z$; i0Z^* i0Zz1 i0\$w i0\p4 i0]'4 i0]o73^[ i0^z2 i0_s87 i0`^Lo2I i0`o8f i0`r i0a$r i0a^K i0ai7'*48 i0ao6c i0at i0b*17 i0bD5 i0bZ1 i0bsrs i0b} i0c*23 i0c-6 i0c-7 i0co5m i0cshk i0cz3O31 i0d$x i0d+2i4' i0dR6 i0dZ3 i0dZ3O18 i0d^Y*52 i0do1h i0dz4 i0e*21 i0e*93O1B i0e^h i0esn_ i0ez3 i0f'8 i0f-1 i0fo15 i0fq i0fs9v i0fz3O56 i0g$r i0g*12 i0g*16 i0g*70 i0gz1 i0h*15 i0h*67 i0h@5 i0hZ2 i0h^d i0h^e i0hsli i0hO48 i0j*56l i0jo0G*57 i0jz2 i0k$e i0k$o i0k+4 i0kD4 i0k^g i0lR6$M i0lsv8 i0m*02 i0m*62 i0m*70 i0mi1V i0n$so4+ i0n'A i0n*49c i0n^k i0n^zt i0ni5Yo7E i0nOB6O08 i0o+7OA1 i0o^N i0p*80 i0p+8 i0qo3g i0r$T*07 i0rD6 i0rl^z i0rz4 i0s$a i0s@a i0sZ2T8 i0s^X i0ss2y^p i0t*50 i0t+2 i0tO04o2h i0tz2 i0u^c i0v'9 i0v*07 i0vo4w i0vr i0w*30 i0wl i0wO23Z5 i0wO81 i0x*0AO09 i0x^C*12 i0xs9u i0xz3i1? i0y$0 i0y$c i0y@w i0yr i0zsiVl i0zO04-8 i0zz1 i0{K i0{u 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*O1Az5 i1+ i1, i1- i1-] i1-d i1-i3- i1-i3-i5- i1-i3-i5-i7- i1-i3-i5-i7-i9- i1-u i1-O13p2 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^a i14i23 i14t i15 i15$d i15R2 i15T2 i15r i15z1 i16 i16R0'9 i16T2 i16o21 i16o2z i16z2} i17 i17$+ i17$2 i17C i18 i18T2 i18Z2O35 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{D2 i1D i1DR0 i1D{ i1E^J i1Eo8E i1Er i1Ez1 i1F i1G i1H 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 i1OO28 i1Oz2 i1P i1PZ1 i1PuR3 i1P{ i1Q i1Q-5k i1Rl i1SO62 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 i1bi85O63 i1c i1c-6 i1cq i1c{ i1d i1d$y i1d*65 i1dZ1 i1do3lz3 i1e i1eo3 i1f i1f-5 i1fd i1f} i1g i1g-0 i1gi5, i1gO42 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 i1lO26O31 i1l{ i1m i1m'5 i1m*45 i1mO12 i1mO57 i1mz4^P i1n i1n$7 i1no2k i1o i1o*61i5N i1o-4 i1ossN i1oO52 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 i1u i1u$ i1uT4 i1uZ3 i1ul i1uo3i i1uOA1 i1v i1v*60 i1v-4 i1v^c 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$8O12 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 i2Ri4YO36 i2S i2S+1O51 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 i2bO61 i2c i2c*30 i2cR4 i2cO06ssD 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^)*38 i2lu i2lO61 i2m i2m'9 i2mZ3 i2md i2mo3([ i2mo76 i2mO46o52 i2n i2n[ i2nk i2nscf i2o i2oZ1 i2oZ2 i2oO01 i2oO37 i2oO45 i2oz1 i2oz3 i2oz3D9 i2p i2p*53 i2pD5 i2p[ i2pq i2q i2qR7i00 i2r i2r$WZ1 i2r*81O5B i2rZ1 i2rr i2rt i2rO01 i2rz1 i2s i2sZ1 i2s] i2ssr0 i2sO02 i2sO32 i2sO54 i2t i2t'9 i2t*05 i2tiAXO59 i2tscp i2tz3*93 i2u i2u$u i2ul i2usjc i2v i2v*13 i2v^\ i2v^z} i2vd i2vu i2vO01 i2v} i2w i2w*03 i2w+0^, i2w@o i2wT0 i2x i2x^{ i2xz4 i2y i2y*62 i2yi3x i2yl i2z i2zC i2zL1 i2zZ1 i2zc i2zO14o3U 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%O51 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 i31O91 i32 i32*81 i32T4 i32Z1 i32^' i32O43 i33 i33T4 i33^7 i33^H'4 i33i40 i33i44^2^1 i33p1 i33O67 i34 i34@t i34T4 i34[ i35 i35q i36 i36+2 i37 i37$v i37T4 i37O03 i37z2O03 i38 i38-4 i38L0 i38T4 i39 i39T4 i39i59 i39u^) i39}^b i3: i3; i3;$l i3;'7 i3;'8 i3< i3= i3=CO42 i3=O02 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 i3CO02T1 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.O27 i3Ll i3Lr i3M i3Mo6,-0 i3Mz3[ i3N i3O{ i3P i3Q i3R i3RR6i6m i3Ri2? i3Rt i3S i3Si4& i3Srl i3TO43 i3U i3UK i3V i3W i3W+0slV i3W[ i3Wl i3X i3Y i3Y*30 i3YD0 i3Yi4_L0 i3Yl i3YO34 i3Z i3Z^| i3[ i3[*12 i3[[ i3[O12s73 i3\ i3\'5 i3] i3]*24oA: i3^ i3^@s*04 i3^O41 i3_ i3_*46 i3_+1 i3_+5 i3_@1 i3` i3a i3a*35 i3a-0R3 i3aO02 i3b i3bZ2 i3bk i3bu i3c i3c$FO47 i3c'6 i3cT0 i3cZ1 i3ci1i i3ci7U i3d i3d*63 i3dL1 i3do1r i3dO43 i3e i3e$3 i3e$Z i3e*53o2f i3e*60 i3eD5 i3ei2s i3eO43 i3f i3f*50 i3f-4 i3f^!skT i3g i3g$x i3g+7 i3g-1 i3gL6$t i3gT6 i3go98 i3gO43 i3g{ i3h i3h*03 i3hZ1 i3hZ3 i3h[ i3h^k i3ht i3hO12 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 i3lO03 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 i3rO41 i3s i3s*87 i3s-1 i3sZ2 i3sk i3sO35sDb i3sO43 i3t i3t*60 i3t@c i3tC i3t[ i3t^r i3to0z+5 i3to7n i3tu i3u i3up1 i3uq i3ussV i3uO63 i3v i3vZ1 i3vo2N i3w i3w*54 i3wT1 i3w^A i3wc i3wp1 i3x i3x@m i3xZ4*02 i3xd i3xO46 i3y i3y*42 i3yK i3yO13o2D i3yO51Z2 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 O12 i4 { i4! i4!{ i4"*8AO45 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&O03 i4' i4( i4(^% i4* i4+ i4+'7 i4+] i4, i4,[ i4,s,k i4- i4-*30-8 i4-^K i4-o0e*13 i4-O02 i4-{^{ i4. i4.i5, i4.t i4/ i4/'A i4/*37 i4/[ i4/t i4/O12 i40 i40D6 i40T5 i40^k i40z1 i41 i41$2 i41*04 i41-7 i41T5 i41^-o7f i41i2$ i41i52 i41i52i63 i41r i42 i42-7 i42C i42T5 i42[ i42^z i42sky i43 i43T5 i43i54^2^1 i43O57 i43O73 i43z1 i44 i44$h i44*16 i44L6*54 i44T5 i44sj\ i44O15q 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 i48O68 i48}$6 i49 i49T5 i49d i4: i4:c i4:l i4; i4< i4= i4=$5 i4=*86 i4=Z1 i4=O15o0s i4> i4? i4?*32O01 i4?^% i4?O2A 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 i4JO02 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 i4SO53 i4T i4U*29 i4V i4W i4X i4X^R+8 i4Y i4Yu i4Y{ i4[ i4[-7 i4[u} i4[O04 i4[O35 i4\ i4]*14 i4]Z2 i4^ i4^i91O27 i4_ i4_'8 i4_+5 i4_Z1 i4_O53 i4_O54 i4_O84 i4` i4`'AO32 i4`[ i4a i4a*36 i4aD2 i4a[ i4au i4aO52 i4b i4b*45$x i4bO04d i4bO51 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 i4eO13 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^ i4kO31z3 i4l i4l'8 i4m i4m*90O29 i4m-1 i4m-3 i4mi4V i4n i4n*58r i4n*65 i4nT0 i4nZ3 i4n^k i4ni3go6n i4nO91 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 i4rO91 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 i4yO52 i4yO64 i4z i4z*64 i4{ i4| i4|-8 i4}^%O35 i4}i6u i5 i5 $6 i5 'A i5 +6 i5 -6 i5 ^d i5 i69 i5 s5>O04 i5 t i5 {K i5! i5!O32 i5" i5"*53 i5"Z2*16 i5"i5] i5# i5#$` i5#l i5#O13 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.O03 i5/ i5/T6 i50 i50$9 i50$s 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 i52O76 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 i55r i55u i56 i56+6 i56^_ i56i55 i56l i57 i57*60^\ i57D8 i57T6 i57Z2 i57k i57o2C$7 i58 i58T6 i58[ i58o1* i58u i58O23 i58O71 i59 i59'8 i59*02 i59*54 i59T6 i59Z2 i59l i59O02 i59O07^" i5: i5; i5;^go87 i5< i5^k i5>O81O24 i5? i5?i2% i5@ i5@*02^I i5A i5A*16 i5AtD1 i5AO04 i5AO32 i5D i5Dl i5E i5Eo1r i5F i5G i5H i5I i5Iu i5J i5Jc i5K i5KZ2 i5Kt i5KO64 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 i5UO14[ i5VR7 i5Vi22 i5W i5X i5Y i5Y@aO24 i5Z i5Z[ i5[ i5\o4I i5] i5^ i5^-2 i5^[ i5^l i5_ i5_*97 i5_[ i5_] i5_^u i5_u i5_O64 i5_OB3'9 i5` i5`{ i5a i5a'6 i5a*04 i5a*56 i5ai24O76 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 i5eO23 i5f i5f*03 i5f-4 i5fD1 i5fr i5fO13 i5g i5g@1 i5gD6 i5gT1 i5gi8kO65 i5go4a i5gO01 i5gz1i2{ i5g{ i5h i5h*76 i5h-8 i5hT0 i5hZ2O6A i5h[ i5hz2 i5i i5i$q i5i+7 i5i@s i5iT0 i5ii18^8 i5io2Mi1S i5i{ i5j i5ju i5jO13 i5jO45 i5k i5k$2 i5k@2 i5ko6e i5l i5l-6 i5li6A i5m i5m*53 i5m-0 i5mZ1 i5mO62 i5mz1 i5n i5n*76 i5n+3 i5nZ1 i5n] i5n^) i5nO37z2 i5o i5oL4 i5oZ2 i5oi5E*74 i5oO23 i5p i5p^x i5pk i5pO05 i5pO12 i5q i5q'4-3 i5q{ i5r i5rD2 i5ri3= i5ri5? i5rs9SO51 i5rO23l i5s i5s*10 i5s-4 i5s^T i5sO03 i5t i5t[Z1 i5tc i5u i5u$0 i5u*57 i5u*68 i5v i5vi1^ i5w i5w*57 i5w[ i5wO72 i5x i5x+2 i5x@1 i5xD3 i5xl i5xO32 i5y i5yi0r i5yr i5z i5zl i5zO14 i5zz1 i5{+7 i6 i6 +8 i6 T0 i6 c i6! i6!CK i6" i6"$j-8 i6# i6$ i6% i6%c i6%O71 i6& i6' i6( i6* i6*OB1 i6*} i6+ i6+*56o62 i6+O18O31 i6, i6,O02 i6- i6-*78 i6-Z1 i6-i1" i6-o3- i6. i6.O12 i6/ i60 i60*34 i60*36 i60*62 i60Z1 i60i2" i60O05 i60O13 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 i66O75 i67 i67*13 i67*53 i67Z1 i67[ i67O42 i67O45 i68 i68*68 i68D8 i68D8*54 i68Z2 i69 i69$r i69$x i69+7 i69R5 i69O32 i69{ i6: i6:*57 i6; i6< i6= i6=c i6> i6>o8. i6? i6?T7 i6@ i6@O02 i6A i6AT0 i6Au i6Bi8PO72 i6D i6D-5 i6D^W i6Dci0U i6Do9. i6E i6E*64$k i6ET4i1$ i6FO02 i6G i6H i6I i6IO29$w i6J i6K i6KO13 i6L i6LuD1 i6M i6N i6N$zO26 i6Ni2b i6Nri7r i6O i6P i6Q i6R i6S i6S$$t i6SO62T1 i6T i6U i6U$isU i6U*71 i6UO16O35 i6Vl i6X i6Xt i6Yt i6ZL7 i6Zo7= i6Zu i6[ i6[*52o4s i6[-2'5 i6[O24 i6\ i6^ i6^o7X i6_ i6_+7 i6_-7 i6_D2 i6` i6`*01 i6a i6a*85 i6a+5 i6al i6aO02 i6aO05 i6az1 i6az2^i i6b i6b$oi3m i6bO71 i6c i6c*35 i6cc i6d i6d*60 i6d-5 i6dlO81 i6do2c i6d{ i6e i6e[ i6e] i6el i6eO94 i6f i6f*64 i6f*76 i6fl i6g i6gD4 i6g^K i6gu i6g} i6h i6h'A i6h+4 i6hZ1 i6hr i6hO82 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 i6mO06 i6mO76 i6n i6nc i6nl i6no7j i6o i6oo1p i6oO32 i6oO91 i6p i6p-7 i6p] i6po74 i6ps1! i6q i6qri6I i6qO39T3 i6r i6r$r i6r-5 i6rZ1 i6rk i6s i6s'8c i6s'A i6si4? i6sO21 i6t i6tO36^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 i6zO73 i6| i6}$rO49 i6}O53i2K i7 i7 [ i7! i7" i7# i7$ i7% i7%D3 i7& i7' i7'@1O09 i7* i7+ i7,O25 i7- i7-u i7-O43 i7. i7.[ i7/ i7/srX i70 i70T8 i70t i71 i71+8 i71[ i71O25 i72 i72+6 i72O45z3 i73 i73*79 i73[[ i73i49 i73u[ i74 i74o3[ i75 i75$4 i75Z1 i75l+1 i75O43 i75O91 i76 i76+9 i76D5 i76R8 i77 i77$3 i78 i79 i79O93 i7; i7< i7O56 i7@ i7A i7AO02 i7AO15 i7AO23 i7C i7D i7F'8T3 i7G i7HO17^M i7K i7Lc i7M i7M*37 i7Ml i7NZ1+1 i7Nc i7P i7Pc i7QO14 i7R i7S i7SZ1 i7Uu i7V-6 i7X i7Xt i7Z i7[ i7\ i7_ i7_D2 i7a i7aL6 i7aZ2 i7aO01 i7aO21 i7a{ i7b i7c i7c+1o46 i7cc i7d i7d'6@2 i7dO91 i7e i7e-8 i7eR9 i7es17 i7f i7f[ i7fc i7g i7gc i7gi90 i7h i7h$2 i7h-9 i7hi7{ i7hl i7hO25 i7i i7i+3 i7idO28 i7iO34 i7j i7jR9 i7jl i7jsjeu i7k i7k+8 i7ki7u i7l i7l'8 i7lD2 i7l^7 i7m i7m+8 i7mL8 i7mO25 i7n i7n[ i7o i7o*35 i7oo0d i7p i7p*70 i7p[ i7pO52 i7q i7qt i7r i7s i7sR8 i7sT0 i7s^j i7sl i7sz1 i7t i7t$3 i7u i7u-8 i7uO84 i7v i7vo9n i7w i7wl i7wO01 i7wO34 i7wO49 i7x i7x+4*67 i7y i7yi3d i7yi5_^{ i7z i7z} i7|^m i8 i8 -9 i8 Z1 i8 O16 i8! i8# i8#u i8$ i8% i8%$@O38 i8& i8&D4*87 i8&Z4O78 i8' i8)-9 i8* i8*s61 i8+ i8+i7I i8, i8- i8-T0 i8-p1'9 i8. i8/ i80 i80$4 i80[ i80[z1 i80k i80o6. i80r i81 i81C'A i82 i83 i83-7 i84 i84+7 i84+A i84^1O83 i85 i85O23 i85O53 i86 i86o9,[ i87 i87O61 i88 i89 i89-9 i89[ i8; i8;*37 i8< i8= i8=O53 i8> i8>z1 i8? i8@ i8@O16 i8Cl i8D i8Dc i8DiA-*86 i8E i8F i8Il i8JD6 i8MZ4O67 i8MO53 i8P i8QO57$t i8Rl i8U i8UD4 i8V i8WD1O27 i8X i8Zc i8[ i8_ i8_Z1 i8_l i8a i8a*18 i8aD6 i8aso3O71 i8aO53 i8c i8c+1 i8d i8e i8e*45R8 i8f i8fO05O21 i8g i8gO05 i8h i8hD5 i8i i8iD6 i8j i8k i8k$1 i8kD6 i8l i8lO07 i8m i8mD0 i8n i8nO08O43 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*14O04 i8xD9*32 i8y i8yc i8z i8z'9 i8zr i8zO05 i8zO52 i9 i9# i9'Z2O65 i9, i9- i90 i90c i91 i91T7R8 i91l i92 i93 i93TB i93O34 i94 i94[C i94O42 i95 i95i4|O0A i95O71 i96i7sO37 i97 i97$5 i98 i98s18 i98O61 i99 i99Z1[ i99O01 i99O43 i9; i9=i0-O1A i9A i9B$dO92 i9Bll i9Ec i9FR9'A i9Rl i9Sl i9Tl i9_ i9a i9aO61 i9aOA4 i9c i9c*04 i9cl i9d i9dT0 i9e i9eO54 i9f i9g i9h i9hD6 i9i i9i'A i9j i9jOA3 i9k i9l i9lD7 i9m i9n i9o i9p i9po6a'B i9q i9r i9r-A i9riAu i9s i9s'B i9sO02 i9t i9u i9u*13i9+ i9wO35 i9x i9x-A i9y iA iA!O56 iA&O47c iA,O67 iA- iA--B iA. iA.O67O91 iA/OA3 iA/z2O37 iA0 iA1 iA2 iA3 iA4 iA4+B iA5 iA7 iA7o95 iA8 iA9 iA: iAE$rO57 iAG$8OA3 iA\*B1 iA_ iA_o4AO46 iAcO78 iAe iAel iAeO72 iAg iAh iAi iAj iAkO82 iAnO64 iAo iAr iAs iAsO28 iAt iAt$v'B iAu iAx iAxZ3O18 iAy iAz iAzO82 iA}O86T8 iB1O37 iB2@9 iB4O38 iB5 iB9 iB_ iBa iBaO74 iBd iBe iBi iBiR2O25 iBiO16 iBiO65 iBrO46 iBs iBuO05 iBxO65 iBysi`O17 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-5*13 k-7[ kD0o5r kD2 kD4 kK*15 kK^M kK^P kL2 kR0i4y kR1^= kR1O41 kR2 kR3 kR4 kT5 kZ1 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 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*13 kp2O62 kq kqi15 kr kr$| krR1 krZ2 ks2c ks3H ks52 ks5b ks8k ksaj ksbd ksd3 ksej ksfpO71 ksgd ksir-2 ksjt ksmO ksnb ksrJ kssL kssy ksuz ksy$ kt-3 kuo9y kO07 kO07^1 kO08sd; kO13 kO18 kO23 kO51 kO62 kz1 kz1T0 kz1l kz1O51 kz2 kz2^7 kz3 kz3C kz4 kz4*97 kz5D9 kz5i9s kz5O06 k{ k{$v k{*48 k{C k{O51 k}q k}r k}s9" l l $1$2$3 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 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$1f l$3 l$4 l$6 l$7 l$8 l$DZ1 l$So7m l$SO0A l$[ l$^$s l$g*32 l$ii6R l$j l$kO92 l$l l$o l$q l$u l'8 l*03 l*13i53 l*20 l*23L4 l*23spe l*30*64 l*35 l*37 l*41 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+AO45 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 lD1$_ lD3L5 lD4 lD5i7x lD6 lD8 lL1 lL1T3 lL2 lL2i2m lL5 lL7 lLB lR0 lR1 lR3 lR6 lR6Z2 lR8 lT1 lT2 lT3 lT4 lT5 lT5i1p lT6 lT7 lT8 lT9+B lZ1 lZ1$y lZ1o4| lZ1O5B lZ2i6z lZ2st3 lZ2O83 lZ5 lZ5O57 l[d l[i5q l]d l]z3 l^! l^'z3 l^4 l^5o41 l^D l^Ei66 l^M l^QD5 l^R l^Ui0` l^W l^_O58 l^aZ2 l^b l^c l^e^N l^h l^hz2 l^m l^oz1 l^v^8 l^y l^zO91 l^}K ld$o ldstC lfsns lfO1B lfO46 li0$ li05z5 li09o6P li0S li0d li13 li15 li1: li1Q li1_ li1b li1n li2% li2p li3/ li37z2 li3a li3k li3r li42 li4; li4_ li4d'9 li4h li4n li51 li58 li5t li5u li5zD7 li6%+9 li6' li6/ li60 li67 li6: li6dO26 li6j li6p li6t li70 li7S[ li7e li7k li7v li8 li8a li8t li94 liAb lk lo01O82 lo0C lo0E$a lo0L lo0c lo0d lo0e lo0i 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 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 lui5C luO03 luOB2 lO05 lO06 lO07 lO12 lO13 lO14 lO15 lO21i31 lO23 lO23$N lO23z2 lO24 lO24$8 lO26 lO27 lO35-5 lO35R1 lO38 lO3A^k lO42 lO43 lO47 lO48 lO52 lO53 lO56 lO56i5M lO57 lO58 lO61o0H lO61o8e lO63 lO69 lO72 lO75 lO76 lO78 lO83D9 lO8B lO92 lO95 lOA3 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!O34 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,cO02 o0,p1 o0- o0-'9^L o0-D1 o0-R1 o0-} o0. o0.O31 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 o02 o02*20 o02D5 o02D6 o02Z1 o02saC o02z1 o03 o03+1 o03-1 o03^1 o03^< o03^Q o03i3a o03r o03O2Az3 o04 o04'8 o04L1 o04O13 o05 o05'8 o05l o05t o05z1 o05z5 o06 o06+1 o06@r o06Z2 o06Z4 o06O85 o07 o07*51 o07-5Z2 o07D2*56 o07R2 o07o2z o07{u o08 o08$xr o08Z1 o08]d o08rD5 o08O74 o08z2 o08z3O64 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@O24 o0A o0AL1*17 o0AZ2 o0A^Q o0B o0Bz3 o0C o0Cp1O01 o0Ctz2 o0Cz1 o0D o0D'6 o0D'9 o0Di6r o0Du^I o0E o0EC o0F o0F$s o0Fk o0Fl o0G o0G@q o0Gi0Q o0H o0HD8*18 o0Hi3m o0Hl o0HstA o0I o0Ik o0I{C o0J o0JT5 o0Jt o0Jz2D2 o0K o0K*02 o0KT5 o0Ku o0KO23^z o0L o0Lp1 o0M o0M$n o0M'9 o0M*13 o0M*43 o0MD3 o0ML1 o0MZ5 o0Md o0Mo2N o0Mz1 o0N*25 o0N*72 o0ND8O14 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 o0RO31 o0Rz3D1 o0S o0S*45*34 o0S^* o0Sp1 o0T o0T+4 o0TL1 o0U o0Uu o0V o0V+2 o0VD3 o0VO32 o0W o0W$f-6 o0W*31 o0WC o0WD2 o0WT5Z2 o0Wp1 o0Wskt o0WtO43 o0X o0Xu o0Xz2 o0Y o0Y$b o0Y$r o0Y*56 o0YZ4 o0YO43 o0Z o0Z$Z o0Z*31K o0ZZ1 o0Zc o0Zz2 o0[ o0[O23 o0\ o0] o0^ o0^i0cZ1 o0^p1 o0^z1 o0_ o0` o0a o0aT2 o0a[i2b o0a^f o0a^q o0ai6; o0aO46 o0aO63 o0b o0b*02 o0b*23*43 o0bC o0b^t o0bc o0bk o0bl o0bo6BO04 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[ o0dr o0dO37q o0dz3 o0d} o0e o0e'A o0e-2 o0eT6 o0e^Kl o0ei1s o0ekZ1 o0eo3l o0esa"*61 o0eO3A o0eO72 o0f o0f$1 o0fC^a o0fD1 o0fK o0fT3 o0f^7 o0fo39l o0fO12 o0fO32 o0g o0g*34 o0g+6 o0gZ2 o0g] o0gd o0gf o0gp2 o0gq o0gqr o0gt o0gz2 o0h o0h*12 o0hu o0hO91 o0i o0i+1 o0ip1 o0it o0iu o0j^9 o0j^D o0j^v o0jc o0jk o0jstg[ o0jO31 o0jz3 o0jz4 o0k o0k*27 o0k*30 o0k*46 o0k^g o0kc o0ko1. o0kp1 o0ks7c o0ksm+ o0kO23 o0kO41 o0kO61 o0kz1 o0l o0l^2 o0ld o0ldL6 o0lkz4 o0lO35 o0lO47 o0lz4 o0m o0mT4 o0md o0ml o0mo5w o0mz1 o0m{ o0n o0n*61 o0n*62 o0n^n o0no4K o0no62 o0nO02$A o0nz5 o0n} o0o o0o*13 o0oZ2 o0op1 o0oqO26 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^E o0r^b o0ri0p o0ro2k o0rswz o0rO21 o0rO24 o0s o0s+6 o0sZ5 o0sd o0si39 o0sk o0sl o0so3X o0sO31 o0sO46^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 o0vi75O17 o0vo1- o0vr o0vO41 o0w o0w$3 o0w$r o0w'7Z1 o0w*05 o0w*14 o0w*25 o0w*45^Z o0wD8 o0wq o0wO23 o0wz1 o0wz5D0 o0x o0xL1 o0xZ5 o0x] o0y o0y$CD0 o0yr o0z o0z$q o0z-9 o0z-9O53 o0z@u o0z^I o0zt o0zO13 o0zO32 o0z} o0{$rZ4 o0{O17 o0| o0|-2C o1 o1 O02$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.O27 o1/ o1/T0@1 o1/z2 o1/}Z5 o10 o10D2 o10Z5[ o10ls3" o10p1 o10uz5 o11 o11$/ o11D1^O o11R2 o11i2 o11k o11o9bO81 o11tz4 o11z1 o11z3 o12 o12$! o12C o12L0 o12k^4 o12l o13 o13$_ o13-2 o13Z1 o13[ o13o2S o13o8hO73 o13p1 o13t o14 o14$C o14-9 o14Z1 o14Z4 o14^3 o14^6 o14l o14p1 o15 o15'9 o15Z2*85 o15[ o15[+5 o15o6u o15O24 o16 o16*31 o16L8@b 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^iO1B o19f o19k o1:*37 o1; o1;*58 o1;l o1;O32 o1<*36 o1= o1=*71 o1=[ o1={ o1>i5J*52 o1? o1?O35 o1@ o1@-8 o1@D0 o1@^s o1@O43 o1Au o1B o1B*10 o1C o1Cu o1Cz1 o1Cz3D2 o1D o1D*21 o1DR4 o1Dc o1Dz1*56 o1E o1ED0Z1 o1F o1F$1 o1F^1 o1Fc o1G o1GZ1O71 o1H o1H$6 o1Hl o1Hu o1I o1I+2 o1IT2 o1IT4 o1I[ o1I] o1Ip1 o1Iu o1J o1JcZ2 o1Jt o1K o1K[ o1Kk o1KO35 o1KO47 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 o1UO53t o1V o1V^\+7 o1Vk o1W o1Wl^1 o1X o1Y o1Y$p o1Y*13sma o1YO31 o1Z o1Z*01 o1[ o1[Z2o5j o1\ o1\o7% o1] o1]O12o34 o1^ o1^$( o1^{$2 o1_ o1_$z o1_sdy o1_z2 o1` o1a o1a$$ o1a$- o1a-9 o1aD2 o1a^g o1ai2s o1ai4- o1asbk o1aO63 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 o1gO3A 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 o1mO28 o1n o1n*10 o1n*17 o1nl o1nu o1n{t o1o o1o*13 o1o+7 o1o@9 o1oD4 o1oL0 o1oR0 o1oZ1O53 o1od o1osWt o1ossEu o1oO25 o1p o1p-2 o1pZ2 o1p^c o1pz1 o1pz3Z3 o1p} o1q o1qt o1qu o1r o1r[ o1ro7t o1rt o1rO45 o1s o1s$h o1s+0 o1sZ1 o1sc o1sd o1si0g o1si3n o1su o1sz1 o1t o1tp1 o1u o1u$- o1u$yo1u o1up1 o1up2OAB 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 o1yO12Z4 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$Z1O42 o2$Z2 o2% o2%*73 o2& o2' o2'^*T3 o2'} o2) o2* o2*T3O01 o2*d o2*t o2*z1 o2+ o2+O32 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 o20fO58 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 o26O61 o26z2 o27 o27+8 o27C o28 o28*12 o28l o28p1i3H o28O36 o28z1 o29 o29R4 o29T4 o29o65T2 o29z2 o2:*27{ o2; o2;*31 o2;o0SO16 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 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 o2PO61 o2Q o2Q-2Z3 o2Qu o2Q} o2R o2RT0 o2RlO02 o2ST1 o2Si6GR4 o2TZ2 o2To33 o2U o2UO53u 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[ o2bO53 o2b} o2c o2cD0 o2cR4 o2co7% o2cO31 o2cO41 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 o2gO34o1& o2gO51 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 o2kO06Z1 o2l o2l$k o2l'6 o2l*42 o2l-8 o2lT0 o2lZ1 o2ls4f o2lsxZO02 o2lO31 o2m o2m$2 o2mD3 o2m^d o2n o2n-4 o2nC o2nZ1 o2n[ o2ndO58 o2nr o2nO32 o2nz3 o2n} o2o o2o+2R5 o2o^@ o2o^D o2oc o2oi2j o2oo0p o2p o2p*37 o2p*51 o2p+3 o2pC o2pD4D0 o2pO35 o2q o2q$4 o2q]i3i o2qo5r o2q{[ o2r o2r$. o2r+3O53 o2rZ3 o2r^v o2rc o2rf o2rk o2rq o2rsc@ o2rz3 o2r}[ o2s o2s] o2sc o2sp1 o2su o2sO81 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 o2wO48 o2x o2x*01 o2x^xO54 o2xr o2y o2yT0 o2yk o2yo3k o2z o2z$ o2z*21 o2zC o2zT4 o2zO53 o2{ o2{L0 o2| o2|$gO2A o2|^j o2|o8HO15 o2|s1z o2}o0l o3 o3 *53 o3 c o3 O21 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(CO32 o3) o3* o3*{ o3+ o3+D6 o3+o0w*35 o3, o3,$#'5 o3,R0 o3- o3-*20 o3-Z3 o3-[ o3-O5B o3-z4O07 o3. o3.*01 o3/ o3/O16u o3/O45 o30 o30*63 o30@a o30R1 o30r*30 o30t o31 o31R7 o31T3O61 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 o36sa0 o37 o37*20 o37@2 o37@y o37R0 o37i1n o37o11 o38 o38$6R3 o38$M o38Z2u o38qT5 o38O72 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 o4B o4C o4Ct o4D o4DDA o4Dc o4DO21 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 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 o4aO21 o4b o4b*42 o4b@mz1 o4bZ2 o4b[^N o4bz1 o4bz2 o4b} o4c o4c*67 o4c+3 o4c^{^Q o4cc o4cl o4co0@ o4cp1 o4cs0s+2 o4cu o4cO02 o4d o4d$k o4d*07 o4d*53 o4dZ2 o4do3j o4dO71 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*71O37 o4hK] o4hi8uO31 o4i o4iT1 o4iZ1+4 o4i^8z1 o4io6! o4iO31 o4j o4jR1 o4ji2H$a o4jo6Yc o4jo80 o4jp1 o4jO31 o4k o4k*35 o4k+5 o4k+6 o4k[ o4ki62 o4l o4lD3 o4lo1k o4lo3r o4lu o4lO53 o4m o4m'6O32 o4m*07 o4m+0 o4mqO56 o4mO67 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$AO25 o4s*41 o4s-0 o4sR0 o4st o4t o4t*45 o4t*73 o4tC o4tD5 o4tR3 o4tZ1 o4tZ2 o4tZ3 o4t^M o4t^Zu o4t^b o4tO21 o4u o4u*21 o4u^ki2G o4ut o4uO02 o4v o4v'6 o4v*15 o4vi0x o4vO59 o4w o4wZ1 o4w^l o4wi2m o4x o4x*46 o4x+2 o4x-9 o4xZ1 o4xZ4 o4xc o4xp1 o4xO21 o4y o4y+0l o4y^( o4yo2k o4yu o4yz2 o4z o4zL8t o4zO56 o4z{l o4{ o4| o4} o5 o5 '6 o5 +6 o5 -0 o5 D3 o5 Z1 o5 sdhO13 o5 O02 o5! o5!'6D1 o5!*30 o5!Z2 o5!i4e o5!o2l o5!sgd o5"$" o5# o5#O62 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,O61 o5- o5-'8 o5-*40 o5-O03 o5-O83 o5. o5.@w o5.Z2 o5.Z4 o5.O41 o5/ o5/satz3 o50 o50$y o50*12 o50-7 o50Z1 o50Z3 o50^b o50^f o50d o50l o50o5!t o51 o51$k o51l o51O13 o51z5 o52 o52$x o52Z1 o52Z3 o52Z4 o52l o52o1E o53 o53$e o53D8 o53^s o53u o53}^g o54 o54*02 o54Z3 o54p1 o54u o54O41 o55 o55*78 o55+6 o55+7 o55R0 o55Z1 o55Z5 o55l o55t o55tZ1 o56 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 o5Al o5B o5Bl o5C o5CT6 o5Cl o5D o5D*8A o5DO81 o5E o5E@0D2 o5ED7 o5ET3 o5EO02 o5F o5FZ1 o5G o5GD6 o5H o5Hc^4 o5Hdl o5HO31 o5I o5I$z o5I-4 o5IZ1 o5J o5K o5Ki3# o5Kl o5Ku o5Luz1 o5M o5MD1 o5N o5N+2t o5NO02 o5NO52$: o5O o5O+0 o5Oc o5P o5PZ2 o5Pi2ii5} o5Q*15 o5Q*43 o5QO24T1 o5R o5R@1 o5RZ1 o5S'6 o5T o5Tc o5To8gO35 o5TO02+1 o5U o5Ui3E^, o5Uo1B o5V o5V^n o5Vo8{ o5W o5W[ o5Wt o5X o5Z o5Zc 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 o5aO32 o5b o5bi62 o5c o5c-0 o5cC o5cO7BO07 o5cz2 o5d o5d'9 o5d*87 o5dd o5di16 o5dssF{ o5dz2 o5e o5e$2 o5e*37 o5e@z o5eK o5eZ1 o5ei2U o5eO61 o5eO67 o5f o5f$z o5f-4 o5fZ3 o5fO74 o5g o5g+7 o5gZ1 o5gO02 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 o5kO04 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 o6A o6AT0 o6A[ o6Ac o6B o6BD3 o6BO32 o6C o6C$sl o6Ct o6D o6E o6Eo4. o6F o6F+7 o6FO05 o6G$B o6Gi4=l o6Gsy2O23 o6HZ1k o6I o6I^: o6J o6J] o6Jrl o6KT6O32 o6L o6L*75t o6LC o6M o6M$2 o6M-7 o6Mc$h o6Mu o6N o6Nl o6O o6O-5 o6OT3 o6P o6P$U o6PD8 o6Q o6Q$7 o6Q-7 o6R o6R+1 o6RK o6S+3 o6SZ2 o6T o6TT7 o6Tc o6TdO29 o6Ti6Y o6Tu o6U+7 o6UO1A^Y o6V o6V$I o6VO74 o6W o6X o6X$aO27 o6Y o6[O42 o6^ o6^$6^U o6^Z1 o6^sao o6_ o6_$0 o6` o6a o6a*36 o6ao4y o6aO42 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 o6fO13 o6fO24 o6fz1 o6f{[ o6g o6gl$b o6go5ou o6h o6h'8 o6h*34 o6i o6i+8 o6ic o6id o6iO12 o6i{ o6j o6j$8 o6j$XC o6j'5$o o6jD8 o6jc+2 o6jO02 o6k o6k$s o6k[ o6kr o6ksk^ o6kO12 o6l o6l*14 o6l+3 o6l-8 o6li4zO53 o6ll o6lO84 o6lz1 o6m o6m$. o6m*43 o6mZ1'8 o6mc o6m} o6n o6n$4 o6n$y o6n+3 o6nD7 o6no7- o6o o6o$d o6o*61 o6oC o6oZ1 o6od o6oO13o3v 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 o6sO01 o6sO71 o6t o6t*45 o6t-5 o6tD4 o6tl o6tO02 o6tO03 o6t} o6u o6u+1 o6u-5 o6v o6v*46o6G o6vo5n o6w o6w+7 o6wT2Z3 o6w] o6wO71 o6x o6xZ1 o6xt o6xO51 o6y o6y$k o6y@s o6yl o6ys04 o6ysnj o6yO02 o6z o6zT1 o6zZ3 o6zl[ o6{O56@i o6|s|d o7 o7 LAO17 o7 O02 o7! o7!-5 o7!Z1 o7" o7"T3 o7# o7#*76 o7#Z2 o7#u o7#} o7$ o7$'8 o7$Z2 o7$o4QO24 o7$s$b o7% o7%O51 o7& o7' o7'T9 o7( o7) o7* o7+ o7+$,O4A o7+D9 o7+OB2O64 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 o75O25 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 o79O51Z4 o7; o7;i6x o7< o7<*67 o7c o7? o7@ o7A o7A@+ o7B o7Bo2r o7C o7CCo6j o7CL3 o7D o7DO49i1v o7E o7F o7G o7GT6 o7H o7HD2 o7I o7J-0 o7K o7K$bO53 o7Kt o7KO13 o7L o7L^` o7LO08i5f o7L} o7M o7MD8 o7MO03 o7M{ o7O o7OuO03 o7P o7Q o7QZ1 o7Qc o7QO36$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_O12 o7` o7a o7a*74 o7a+8 o7ao3DO13 o7asr3O42 o7b o7b$jO26 o7b*46 o7b+4 o7bZ1 o7bz2 o7c o7c*75 o7cK o7cZ1 o7cZ4Z2 o7co4a o7cO34 o7d o7d$1 o7d$l o7dL4 o7dp1l o7e o7e*75 o7eO43 o7f o7f*23D8 o7fsn, o7ft o7g o7g$o o7g*98 o7g] o7gu o7h o7h*56 o7ho8i o7i o7i*25+3 o7i+4 o7ic$l o7ii3XO15 o7il o7j o7j{ o7k o7k*63 o7kr o7ksbr o7l o7l-3-7 o7lD8 o7l^+$o o7m o7m$1 o7m+8 o7m-8 o7mO81 o7n o7n$1 o7nZ2-4 o7nt o7o o7o$2D2 o7o$to4f o7o'A o7o-3 o7oi9=O86 o7oo0dD8 o7or o7oO34 o7p o7q o7q*67 o7q*80T6 o7r o7rt o7rO16 o7rO41 o7rO82 o7rz3 o7s o7s*57 o7s+2 o7sc o7si6t o7sshe o7sO51 o7t o7tL8 o7tO32 o7u o7u$p o7u*67 o7uo0M o7uO04^p o7v o7v[ o7vi7t o7w o7w-5 o7wZ3 o7wt o7x o7x*46 o7y o7y*12 o7y^j o7yO0Bs 7 o7z o7zD4*56 o7zl o7zo8o o7} o7}$4 o8 o8 '9 o8 D7 o8 O02 o8 O06 o8! o8![ o8" o8# o8#+9 o8#D7 o8#D9 o8$ o8$O74c o8% o8%O31 o8& o8&$& o8&R8 o8&z1O07 o8( o8(c o8(O0B$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 o82O21 o82} o83 o83*65 o83-4 o83o3e o83tO64 o83z1 o84 o84+6 o84Z1 o84o4c o84t o84O12 o85 o85*75 o85*87 o85*97 o85+3 o85o7y o85O62 o86 o86T9 o86Z2 o87 o87+0 o87+6 o87Z3 o87O52 o87OA2 o88 o88$3 o88+9 o88Z2 o88o9! o89 o89+9 o89Z1 o89Z2 o89sw:sa5 o8: o8; o8< o8<*78 o8 o9? o9?O13 o9@ o9@uO06 o9A[ o9Ao0tO35 o9C o9E o9Fi9nl o9H o9H^qO36 o9Hl o9I o9JZ1 o9Yc o9Yl o9] o9_ o9_O34 o9` o9a o9ac o9aO43 o9b o9c o9cD7 o9d o9d$6 o9dZ2 o9dl o9dO63 o9e o9eO63 o9eO72 o9f o9g o9h o9i o9i$l o9iD0 o9ii4i o9io7QO53 o9j o9j+8 o9jO14 o9k o9kZ2 o9ki0s o9ko8d o9l o9lO52 o9lO53 o9m o9mO09 o9n o9no7v o9o o9ot o9oOA3 o9p o9q o9r o9r$i o9rO71 o9s o9s$e o9s+3 o9sD3 o9t o9tu o9tO62 o9u o9uO36O41 o9v o9w o9wl o9wO42 o9x o9xD6 o9y o9y*98 o9y-5 o9z o9zT0 o9|O15 oA! oA!O12 oA$ oA* oA+ oA.[ oA/ oA0 oA1 oA1+9 oA1D5 oA1D8 oA1l oA2 oA2$! oA2*87 oA2OB2 oA3 oA3'B oA3Z1 oA4 oA4O28 oA5 oA6 oA7 oA7u'B oA8 oA8O19 oA8} oA9 oA9D8 oA; oA@ oA@Z3L1 oAB*74O5B oAD oAEO06 oAOc oAP oAR oARl oAXO84O24 oAZsZ. oA[O16 oA^ oA_O05 oAa oAaO02 oAc oAcO07 oAd oAe oAg oAgO13 oAh oAi oAj oAl'B oAm oAn oAo oAo+2O15 oAoO72 oAp'B oAr oArO14 oAs oAsD5 oAsl oAsO28 oAsO42 oAt oAu oAv oAwO14 oAwO37 oAx oAy oAyO51D5 oAz oAzc oB O0A oB!c oB* oB+ oB/R5'8 oB0 oB0O47 oB1 oB2 oB2D9 oB2i6h'9 oB3 oB4 oB5 oB5*AB oB5DA oB6 oB6D5 oB7 oB7l oB8 oB8Z1 oB9 oB9Z1 oB9O05 oBCO65 oBKoBC oBNcO48 oBO+1O84 oBSl oBX oB_O26 oB_OB2s91 oBa oBc oBcO56O14 oBd oBdO46 oBe oBf oBfO26 oBgO29 oBi oBk oBk^Zo3H oBn oBn[O84 oBnO06 oBo oBoO36 oBr oBs oBu oBv oBy oByO26 oByO38 oBz p1$"l p1$< p1$= p1$D p1$I p1$Jz5 p1$Lo6z p1$M p1$a p1$b p1$e p1$fO17 p1$i p1$j p1$j*03 p1$k p1$l p1$r p1$s p1$v p1$vO73 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'Az1 p1*12 p1*15L3 p1*18 p1*2A*0B p1*37 p1*39O7A p1*43 p1*50O25 p1*51 p1*56i7# p1*56u p1*63 p1*65i0E p1*67 p1*69 p1*72 p1*76O83 p1*7A p1*80 p1*83 p1*89O2B p1*8B p1*8BO92 p1*91 p1*95R7 p1*96O47 p1*96O98 p1*B6O87 p1+1^t p1+4 p1+5 p1+6O13 p1+9 p1-1 p1-3 p1@2 p1@9'9 p1@ic p1C[ p1D1 p1D3'9 p1D3-6 p1D4o06 p1D6i4, p1D9 p1K[ p1KO25 p1L1 p1L4 p1R1 p1R9 p1T0 p1T2OB1 p1T6 p1T7 p1TB@2 p1Z1*30 p1Z1O05 p1Z2Z4 p1Z4z5 p1[O65 p1] p1]k p1^ p1^! p1^#z2 p1^&^/ p1^.c p1^3O4A p1^8 p1^< p1^IT1 p1^P p1^Q p1^V p1^] p1^]O2A p1^a p1^c] p1^d p1^eO45 p1^j p1^l p1^p p1^| p1cD8 p1cO08 p1i02 p1i1tO41 p1i23 p1i2U p1i2n p1i4 p1i4% p1i4/ p1i49 p1i4O06 qi0UO2A qi0l qi0y qi2&'6 qi24 qi2[ qo07 qo0_ qo0b qo0s qo1FO26 qo1k qo2O qo2y qo4y qo58 qo5YO2B qo6e qo7**27 qo77 qo7n[ qo8S qo9.O7A qoBa qq qr qr'6 qr'8 qsX* qsbB qsbd qsf4 qss! qt qtO52 quO61 qO03 qO03^u qO03o32 qO04 qO05 qO08 qO09 qO09*46 qO0B qO12 qO13 qO16k qO16O52 qO17 qO17-1 qO18 qO19 qO1A qO1B-2 qO1Bz3 qO23 qO25 qO26 qO27 qO28 qO29 qO29o6p qO2A qO34 qO35 qO35*70 qO36 qO37 qO37$y qO38 qO39 qO3A qO3B qO3Bz4 qO41s21 qO42C qO45L3 qO46 qO47 qO47O12 qO48 qO49^s qO4A qO4B qO51+5 qO54 qO54C qO56 qO59 qO5A qO5B qO63 qO64*07 qO65 qO65O31 qO68 qO6B qO74 qO78 qO83 qO83] qO83O2A qO84 qO85 qO86 qO8B qO92O73 qO94 qO95 qO96 qOA1*0B qOA1O81 qOA3 qOA5 qOA9 qz1 qz1O32 qz2 qz3 qz3OB1 q{D3 q{O18 q{O19 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'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*65O32 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^- rZ2O73 rZ3 rZ3Z4 rZ3i4W rZ3t rZ4 rZ4-4 rZ5 rZ5O09 r[*30 r[*54 r]K r]o0v r^! r^$ r^%o0c r^%u r^5 r^7T0 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^w r^z rc rcK rco6Q rd*74 rf rfO3A ri0% 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 ro0" ro0*O13 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 rqz1 rs0+ rs0- rs0l rs1 rs9! rsJ7 rsa3 rsb9 rsbq rsil rspQZ1 rsra rstE rstk rstp rswg rt rt*40 rO04 rO05 rO06 rO07 rO09 rO15 rO32 rO37 rO41t rO42 rO51 rO51$2 rO51K rO54 rO62 rO64 rz1D6 rz1i4f rz3-1 rz3R6 rz3T1 r{ r{*04 r{D3 r} r}f s $O28i2a 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#$z2O25 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,rO34 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.zlO51 s/ s/? s/B s/i s/y s0 s0 q s0 z2 s0! s0"'7i0B s0%O31 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 s06O29+1 s07 s07*13 s08$3 s08+7 s09 s09O81 s0< s0@ s0A s0B s0C s0D s0E s0F s0FO37 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 s0zO06 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 s18O08$? s18O26 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**5AO43 s2*Z2 s2*r s2+ s2, s2- s2. s20 s20$! s21 s21*82'6 s21p1O36 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 s2DdO1A s2F s2GcO51 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 s2uO32^1 s2v s2v[ s2w s2y s2y$RO46 s2yD7D6 s2z s2zO61 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 s38O52 s39 s3?Z1 s3@ s3A s3At s3E s3F s3GcO92 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 s3fO03o48 s3gO32 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 s4HO02^w s4I s4MO27^V s4O s4R s4X s4\ s4^i5mO07 s4_ s4_O71 s4a s4b s4e s4f s4gZ1 s4i s4j s4j-3 s4k s4kOA1 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%O41 s5* s5+Z1 s5, s5.O23 s5/ s50 s51 s52 s52'B s52-6 s52o71 s53 s53T0 s54 s54-1 s56 s57 s58 s58+8 s59 s59q s5=O42 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[ s5yO34q 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*37O05 s6w s6y s7 s7 O04 s7! s7" s7$ s7%u s7&O14z3 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 s78O32 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 s7bO27 s7c s7d s7e s7f s7g s7i s7j s7j$k s7l s7nO36i0k s7nO56 s7q s7r s7rO13 s7s s7v s7x s7| s8! s8# s8$ s8$tO46 s8* s8, s8- s8. s8.*07-0 s8/ s80 s80$n s80+5 s80l s81O32d s82 s83o1f s84 s84-2R1 s85 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 s8bp1O39 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 s8uO16$W s8uO61 s8vO41 s8x s8y s8z s8z+7 s9 s9 D4 s9 O01 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 s9LO14^m s9PO45 s9T s9Z*93*43 s9\ s9^ s9_ s9_Z2 s9_r s9a s9az2 s9b s9b+5 s9bo4vL0 s9bO56 s9c s9d s9d*13 s9e s9f s9i s9k s9lZ2 s9n s9o s9p s9q s9r s9u s9u-7 s9uO05 s9w s9x s9y s9z s9{ s;@ s;u s= s=; s?! s@" s@* s@u s_U s_aO13 s_i sa sa!r sa' sa)$@O01 sa* sa+ sa- sa-l sa. sa.O41 sa/ sa0 sa0D4 sa0l sa1 sa2 sa2k sa3 sa3Z4 sa3O15 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 saSO23 saU saW saY saZ-6 sa[ sa^ sa^z2O65 sac sad sad$5^q sadO52 sae sae$1 sae*74 saeD6 saei2m saf sag sah sai sak sakD6 samD4O51 san sani40 sao saoZ4 sap sap$y sap} saq saqZ2 saqz1 sar sar-6 sari1n sas sat satt sau sauk sauO43 sav savR4 saw sawZ1O46 sax saxo3z saxr say say^Az2 sayz4 saz saz@p sazO35O23 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 sfKO05 sfNl sfO sfT sfUR0 sfW$! sfX sfZo0L sf[ sf_ sfa sfa'A sfb sfc sfc^k sfd sfg*15z2 sfg@g sfgO54 sfh sfj sfjz5 sfk sfk]] sfkOB8 sfm sfn sfn[ sfo sfp sfq sfqi0z^3 sfr sfrD4 sfs sfs$! sfsZ2 sfB u 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 sghO24 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,O14 sh-o0g sh0} sh2 sh2Z2 sh2lc sh2O52 sh4^2 sh4iA0O25 sh6 sh7 sh7K sh8o2% sh9 sh9z3 shBO4A 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 shpO01 shq shr shrD6 shrz5 shs shs$5 sht shu shvZ1 shvO46 shx shxc shy shyu shz shz-2O31 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 si2O45 si3 si3*31 si4 si4$3 si5 si6 si7 si9 si9z1 si;*82 si=z1 si@O36 siCKc siCl siEu siG siGz2 siId siM siNl sik siNsNk siO siP*61 siRZ1 siW si[ si] si^} sia siaZ2 sib*45 sibZ1 sic$7 sid sie sieo06 sieo6h sifo5WO02 sifO26 sih sij sik*41 sil sim sin sio sioK sioO23 sip sipp2O4B siqk sir sit siu siv siw siwO31 six$3 siy siyO12 siz sizO01 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 sjfO37 sjg sjgd sjh sjh$r sjl sjl*05O53 sjm sjn sjnZ2 sjo sjo+3 sjp sjq sjqu sjqO28 sjr sjs sjs+2o4s sjt sjtT1T8 sjt[ sjx sjy sjzD4[ sk&u sk- sk0 sk2 sk4O02 sk7Z4 sk8 sk9 sk9z3^; sk@ skA skB skC skD$! skDdO76 skG skL skL-6 skM skOZ2D3 skP skR skT skW skW-7 skZk*05 sk[ sk] sk^ sk^'A sk_ ska skb skbK skb[O23 skc skc[ skd ske skf skfD9O15 skg skg'8 skg^sO1A 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 skyO31 skz skz'6 sl sl! sl"*94 sl"t sl$ sl* sl- sl-O31 sl/Z2 sl1 sl1T1 sl1T2 sl1T3 sl1T4 sl1T5 sl1T6 sl1T7 sl1d sl1u sl2 sl2z2L3 sl4 sl4Z5 sl5 sl6 sl7 sl7D4 sl8 sl8O26 sl9 sl; sl;D1 sl< sl?o5b sl@l slB slDz2O32 slF slGi2u slH slL slM slMT2 slO slP slQ slR slS slT slU slUO15+2 slVi4R slW slXi1qk slZl sl] sl^*62*16 sl_ sl`O41O83 sla slao1O slb slbZ2 slbu slbz2O18 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! slnO43 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( slyO41 slyO43 slz'6 sl{ sl| sl|o10[ sm$ sm$dO64 sm$p2O34 sm&o7H sm+ sm- sm. sm/ sm1 sm1$g sm1C sm1L6 sm1^a'4 sm1^e sm2 sm2O62 sm3 sm3*24 sm4 sm4D2 sm5 sm6 sm7Z1 sm7z4 sm8 sm8O21 sm; sm@t smB smC$# smD smG smH-0u smHi0s smKuZ2 smL smM*32{ smO'5 smP smPu smQ smRO31 smSp2'4 smW smXo5"+6 smZ sm[Cc sm]^MO16 sm` smb smc smd smdZ1 smdO51 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 smti6iO02 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 sn5O16 sn6 sn6c sn7 sn7d sn7u sn8 sn9 sn; snAZ3o4y snB snDD2 snGD0O67 snGc snH snK*02p1 snLc snN snR snRo5C snT snT^H snX snXO08 sn\Z1 sn^i2Cl sn_ sn_l sna snb snb-0 snbo0L snc sncq sncO1A+2 snd sndZ2 sndO02 sne snf sng sngR0'6 sngi3t snh snh$! snh*64 snh*84O54 snhp1 snii2+ snj snjo3v snk snl snl'9 snm snmp1O23 snmO53 sno@i snp snq snqr snr sns snsz2 snt sntc snu snusey snv snw snwL6 snwo4< snx sny snyp1 snz snz'7 sn| sn|fO3A so! so" so# so$ so'O24 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 so6Z5O09 so8 so; so= so> so@ so@O05 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 somO26 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 spNO05 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$z3O03 sq9 sqb sqcK sqdo1l sqgD3 sqid sqk sql sqm sqw sqx sr *65 sr O32 sr! sr$ sr%L2 sr&u sr&O1Ap2 sr' sr)$/ sr+ sr0 sr0O17 sr1 sr1$_O14 sr2 sr2R5 sr2c sr3$m sr4 sr5 sr5D1 sr6 sr7 sr8 sr:} sr>O54 sr? srGl srHO21 srI srJ srLqR5 srN[ srR srS srTO03 srWC srWdl srXo3k srXO32 srY srYu srZ sr\ sra sraD1 sra{] srb srbZ2 src+5 src-1 srcO23 srd sreD5 srf srfc srf}i3X srg srgr srgsny srgz2 srh srid srjO32 srjO64 srk srkO23 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 srxT3O32 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+O52 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 ssTO45 ssW ssZ ss\l ss^ ss_ ss` ssa ssal ssb ssbk ssc ssdi3i ssdO32 ssf ssfZ2 ssfO04 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 ssuZ3O54 ssuz2 ssv ssvo5x ssw sswi12*18 ssxZ1 ssxc ssy ssy] ssyO32 ssz ssz+3 sszo0s st st +0 st!^bO23 st# st*R6 st+ st, st/ st1 st1-0 st1{t st2o0j st3z5'8 st4 st4O13 st5Z2 st5q st5u st6 st7 st7d st7u st8 st;i4$^n st t$A t$D t$E t$F t$Id t$O t$P t$Pk t$R t$R[ t$T t$T*76 t$V t$^ t$_$h t$` t$a t$b t$d+7 t$i t$r t$s t'4 t'7Z1 t'7sg7 t'9 t*04k t*05 t*12p1 t*14 t*15 t*20 t*21 t*31 t*34 t*37 t*46 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-7O03 t-8 t-A t@# t@1 t@3 t@7 t@8O32 t@E t@K t@L+7 t@Lo1! t@O t@Oc t@P t@V t@l t@y tD1-3 tD1[ tD4sLA tD5$` tD8 tD8O24 tDAO72 tL4 tL5 tL5u tR0 tR1 tR1*05 tR3 tR4 tR7 tT1o1h tT3 tT4 tT5 tT6O58 tT9 tZ1o26 tZ1O45 tZ3 tZ3+8 tZ3[ tZ4 tZ5O12 t[ t]{ t^! t^1 t^1$2 t^2O43 t^6O3A t^7 t^FD5 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^t} t^vL1 t^{^' tc^Z td tdOA4 tfO3B tfO4A 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 to06 to07O74 to0F to0H to0S to0V to0Y to0f to0m to0n to0o to1B to1Cc to1I to1Ou to1U to1Z to1y to2 to28o4M to2FO32 to2K to2S to2T to2` to2a to2z to3" to30'6 to3Cd to3G to3L$e to3Lz1 to3Rr to3f to3f$1 to3kO21 to4# to42 to4E to4T to4` to4oT6 to4y to5 to54 to5J to5TO81 to5dD0 to5k to5s to5u to6 to61 to66 to6F to6z to7! to71O25 to77 to7K to7S to7X to7_*41 to7d to7x to82 to86 to8I to8J to8L to8O to8T to9P toA1O34 tp1*41 tp1^u tp1z2 tp2 tp2O82 tq+5 tqZ2 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 tsV6$Z tsVFc tsVG tsXB tsZK tsgX tskC tui7Z tO02O17 tO03 tO04 tO04f tO05 tO06 tO12 tO12i3J tO14O27 tO15z1 tO16p1 tO17+0 tO23 tO24 tO26 tO31z1 tO32 tO32Z3 tO32[ tO34 tO36 tO38 tO41i5a tO42 tO45 tO46 tO48 tO52 tO54 tO57 tO61 tO62 tO62@2 tO63^9 tO72 tO74 tO82 tO93 tOA2 tz1^% tz1O07 tz2 tz2L2 tz2O0B tz2O63 tz2z3 tz3 t{*54 t} t}k u u$!d] 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$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$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$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$FO23 u$Fz4 u$H u$I$O u$S^1 u$UO52 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'A u'B u*04] u*05-5 u*21 u*30i5) u*32 u*32+2 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 uD3 uD4o3t uD4O43 uD6 uD8 uL0 uL1+4 uL2 uL2T4 uL2r uL2z1 uL3 uL4 uL4i0Y uR0 uR5 uT1 uT1D3 uT2 uT5[ uT6 uT7 uT8 uZ1O75 uZ4*27 uZ4^z uZ5 uZ5$0 uZ5O57 u[L5 u[T2 u[T3 u[^N u]$V u]-3 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^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^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^Bi1R u^D u^EO41 u^K*15 u^M u^Q u^U u^V-1 u^Y u^_ u^b u^e u^ii60 u^uc u^x-1 u^| uc@g uco3Q ud'B udO12 uf-5 ui0$o5V ui0NO16 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. ui30 ui31 ui32 ui33 ui34 ui35 ui36 ui37 ui38 ui39 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 ui4TL7 ui4_ ui4u} ui5 ui5! ui5# ui5$ ui5& ui5' ui5* ui5+ ui5- ui5. ui50 ui51 ui52 ui53 ui54 ui56 ui57 ui59 ui5E ui5H ui5L ui5Q ui5Y ui5Z ui6 ui6! ui6# ui6$ ui6& ui6' ui6* ui6+ ui6- ui6. ui60 ui61 ui62 ui63 ui64 ui65 ui66 ui67 ui68 ui69 ui6P ui6_ ui6r ui7(O17 ui7N ui88l ui8C ui8N uiB3 ukO21 uls0? uls0i uo0< uo0A uo0B uo0VK uo0W uo14 uo1F uo1d uo1k uo25t uo2G*23 uo2U uo2W[ uo2i uo3$ uo33 uo3V uo4J uo4Q uo4Z uo4Z'8 uo4c uo4pc uo4z uo4{ uo5$ uo5= uo5L uo5U uo65 uo6A uo6H uo6Ro0U uo7% uo78 uo7I uo7U uo83 uo90 uoA8 up1$R up1-5 up2O69 up2O76 uqO5A 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$K ut-3 uO03O46 uO04p3 uO0A uO13 uO14p1 uO14z4 uO15 uO18^L uO1A uO1B uO21+1 uO21K uO24 uO26z2 uO28 uO35 uO35Z1 uO41 uO42 uO42z4 uO46 uO47 uO53 uO54 uO58 uO59O02 uO64 uO67 uO74 uO75 uO83 uOA1 uOA3 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 O01$N*23 O01$j O01$m O01$p O01'9 O01+2o42 O01@1 O01@H O01@k O01Co2G O01Kd O01T4o2N O01^2$y O01^M O01c$n O01csRu O01i4s O01i4u O01i8i O01l$9 O01lo6# O01o0 O01o1: O01o1a O01o2& O01o2HC O01o2[ O01o3e O01o42} O01o4S O01o4i O01o4x O01o5L O01qt O01qO0B O01sl. O01sry O01sta O01swf O01tf O01O0A O01O54 O01O93 O01z4^J O01z5Z1 O01{^h O02$" O02$% O02$* O02$+ O02$1 O02$1Z2 O02$6 O02$B O02$P O02$f O02$g O02$k O02$n O02$q O02$s O02'4 O02'5 O02'A O02*20 O02*23 O02*31 O02+1 O02+2 O02+2$7 O02+3 O02+3*02 O02+6 O02+8 O02+A O02-4 O02-7 O02@0 O02C O02D3 O02D5 O02D6 O02K{ O02L5 O02R5 O02T5 O02Z1 O02Z1R2 O02Z2 O02Z4 O02Z4suM O02^% O02^2 O02^M O02^U O02^X O02^b O02^g O02^j O02^u O02^v O02^x O02^y O02d O02f O02f+0 O02i0, O02i0f O02i2^ O02i2l O02i4f O02i5e O02i6| O02i9i O02k O02o1. O02o1n O02o1p O02o1z O02o2 O02o2- O02o2v O02o3y O02o4# O02o4- O02o4h$9 O02p2 O02qz3 O02r O02rk O02s51z3 O02sAO O02sFH O02str O02syl O02t*50 O02u O02O13 O02O35 O02O46 O02O53 O02O63 O02O82 O02O91 O02z1 O02z1f O02z2 O02z3 O02z3l O02z5 O02z5z2 O02{ O03$! O03$# O03$2 O03$5 O03$6 O03$R O03$^ O03$e O03$h O03$i O03$j O03$n O03$r O03'6 O03'A O03*12*50 O03*30 O03*31 O03*34 O03+0 O03+0sy! O03+2 O03+6 O03-0 O03@n O03CsK9 O03D1 O03D4 O03L6 O03R0 O03R1 O03R2 O03R3 O03T6 O03Z1$i O03Z2*74 O03Z3 O03Z3z2 O03Z4 O03Z5 O03^1 O03^@ O03^F O03^L O03^g O03^u O03^w O03d O03f O03f] O03i0-^U O03i0T O03i1B O03i2B O03i2t O03i4L O03i5G O03k O03l O03o1q O03o1y O03o3O O03o66 O03o69 O03o7@ O03p2 O03p3 O03p4 O03p5'9 O03q O03qz3 O03s2 O03sld O03ts8a O03O19 O03O34 O03O34^d O03O35 O03O43 O03O48 O03z1 O03z1sc? O03z1} O03z5 O03{K O04$$ O04$3 O04$F O04$r O04$s O04$v O04$y O04$| O04'3 O04'5 O04'8 O04*02 O04*78 O04+1 O04-1$M O04-1+2 O04@f O04@l O04@p O04C O04D8 O04L0 O04L7 O04R5 O04T3 O04Z1 O04Z2 O04Z3 O04Z4 O04Z5 O04^ O04^P O04^a O04^l O04^m O04^o O04^q O04^y O04csRi O04d O04di0n O04i0d O04i1a O04i22 O04i3d'4 O04i3p O04i44 O04i6 O04i6_ O04l O04o0'Z5 O04o10+9 O04o2 O04o3% O04o51 O04p2 O04p3 O04p4i3B O04sN[R1 O04sf:'7 O04u O04O49 O04O61 O04O62 O04O74 O04z2 O04{ O05$ O05$+ O05$/ O05$0 O05$4 O05$@@3 O05$S O05'9 O05'A O05*41 O05-2 O05-4 O05D3 O05R3Z2 O05T4 O05Z1 O05Z1$u O05Z2C O05Z4 O05Z4C O05Z5 O05^# O05^+ O05^-q O05^? O05^_ O05^h O05^j O05^mO64 O05^r O05^t@o O05^w O05k O05l^3 O05o1 O05o1P O05o3t O05o4a O05p1 O05p1[ O05p2 O05p3 O05q O05r O05sum O05tZ4 O05O41 O05O53 O05z2 O05z3 O05z5 O06 O06$1 O06$H O06$Z O06$]p1 O06$y O06'9 O06'A O06'B O06*20 O06-1 O06-3 O06-8 O06@9 O06R1 O06R4 O06Z1 O06Z1-0 O06Z4l O06^2 O06d O06dp3 O06dt O06dz2 O06f O06i2. O06i2h O06i49 O06i62 O06i7i O06o2- O06o2S O06o3N O06o3R O06o99 O06p2 O06p2[ O06q O06sk@ O06szy O06u O06O13 O06O32 O06z1^e O06z3 O06z3$0 O06{ O07 O07$- O07$1 O07$n O07'7 O07+2 O07+5 O07-0 O07-1 O07-6 O07D1 O07D5 O07R4 O07T0 O07Z1 O07Z2 O07Z3 O07Z4 O07^k O07^s O07^t O07d O07dO42 O07i1n O07i2H O07k O07o0Z O07o2 O07o4z O07shv O07slk O07t O07to1 O07u$I O07u^F O07O21 O07O39 O07O74 O07z2 O07z4 O07z5 O08 O08$6 O08$bZ1 O08$n O08'8 O08*63 O08-5 O08C O08L0 O08T2 O08T4 O08^Dq O08^Q O08^bt O08c O08i1a O08i2c O08o0, O08p1 O08p2 O08p5o2V O08s4b O08t O08O61 O09 O09L0 O09Z1 O09Z3 O09Z3+5 O09Z5 O09^2 O09^=d O09^B O09c O09d O09l O09o1 O09o2 O09o48 O09o6, O09O21 O09O34o0w O09O54 O09z5 O0A O0AR0 O0AZ1 O0Ad O0Ai2x O0AO35 O0AOB9O38 O0B O0B$' O0B$h O0BT7 O0BZ5 O0Bc O0Bc^. O0Bi8- O0Bo2C O0BO46 O0Bz5 O12 O12$ O12$* O12$. O12$6 O12$m O12$r O12$s O12$w O12'5D0 O12*21 O12*30O31 O12*34 O12*41 O12*52*41 O12+1Z1 O12+2 O12-1 O12-4 O12@c O12D7 O12Kl O12L1 O12L3 O12R0 O12R3 O12T3 O12Z1 O12Z3*41 O12Z3T6 O12Z4 O12Z5 O12Z5z5 O12^1o7v O12^3 O12^4 O12^E O12^[ O12^e O12^o O12^p O12^y O12c O12d O12i0I O12i1j O12i2k O12i3g O12i5 O12i5T O12o0p O12o1@ O12o2 O12o2r O12o3l O12o4 O12p2 O12q O12q+8 O12r O12s2z O12s81 O12s9n O12sf4 O12sgo O12shI'5 O12shs O12sna O12t} O12u O12u'8 O12O23 O12O32 O12O91 O12z1 O12z2T3 O12z4 O12z5 O13 O13$. O13$0d O13$1 O13$4 O13$P O13$X@m O13$Yc O13$gz1 O13$h^9 O13$oO13 O13$y O13*03 O13*03d O13*04 O13*21p1 O13*34 O13+1r O13-0K O13-2 O13@m O13C O13D6 O13D7 O13L0 O13R2 O13R5 O13T1 O13T5svz O13Z1 O13Z3 O13Z5 O13^9*21 O13^C O13^S O13^c O13^e O13^s O13^v O13^x O13c'7 O13d O13f O13i0Gi0K O13i0M O13i0X O13i0tL0 O13i1j O13i1r O13i4X O13o1? O13o1u O13o2y O13o37 O13o4Kl O13o5e O13o9+[ O13p2 O13s2f O13s9Q O13s9i O13sgP O13shF O13sk5z1 O13spw O13O32 O13z2 O13z2s8g O13z3R4 O13z3z4 O13z5 O14 O14$* O14$1 O14$3 O14$L O14$M O14$g O14$i O14$k O14$p O14'4 O14'8 O14*50 O14+0 O14-1 O14@t O14D2$_ O14D3 O14L0 O14R0 O14R3 O14Z1 O14Z3 O14Z3t O14Z4 O14Z5 O14^2 O14^2C O14^3 O14^M$n O14^P O14^g O14^gr O14^qq O14^s O14^y O14cz5 O14d O14do1m O14f*10 O14i0T O14i1G O14i1t O14i2; O14i4+ O14o0G O14p1c O14p1O83 O14s28C O14s6no40 O14sa? O14sam O14u O14O05Z2 O14O24 O14O32 O14O34 O14z3 O14z4 O14z4Z2 O14{ O15 O15$- O15$5 O15$8u O15$ML3 O15$P O15$X O15$a O15$k O15$t O15'6 O15'8 O15*15 O15+0 O15+1 O15+2 O15+3 O15-4 O15D5L2 O15T1 O15Z2@2 O15Z3 O15Z4 O15Z5l O15^G O15c O15d O15d^i O15f O15i0A O15i1r O15i41 O15i51 O15lo5x O15o0j O15o1> O15o3p O15o57 O15o5j O15sza O15szh O15O41 O15z3 O15z3t O15z4^V O15z5 O15{ O16 O16$: O16$F O16$R$v O16$V O16$_ O16'9 O16+2q O16+3 O16+7 O16-1 O16D4 O16L1 O16Z3 O16Z4 O16Z5 O16^5 O16^D O16^JZ1 O16^Sz2 O16^a O16i2n O16i4bo2n O16l O16o0H O16o1 O16o3 O16p1 O16p2 O16q O16r O16sHx O16sb9D4 O16t$2 O16O23O03 O16z4q O16z5 O17 O17$1 O17$N O17$S O17$o O17$v O17*20 O17+1 O17-1 O17-4 O17C O17L4 O17T2i0O O17Z5 O17^P O17^c O17^m O17^r O17d O17l O17q O17qd O17stP O17u O17O51 O17z5 O17{ O18 O18$q O18*42 O18+0 O18+3 O18+7 O18L0 O18R0 O18Z2 O18Z3 O18Z3q O18[^G O18d O18i5w O18lZ5 O18o3cl O18o3i+4 O18o6{-6 O18p1'3 O18p2 O18t O18O51 O18O53 O18O64 O18z1O71 O18z4 O18z4O43 O19$@ O19+3 O19@l$z O19D4 O19Z5 O19^dz1 O19i0jo21 O19p2 O19q O19qd O19r O19uD5 O1A$s O1AZ1 O1A[$J O1A^pz2 O1Ai15 O1Ai1rp2 O1B O1B+3 O1B+5 O1BR2 O1B[d O1B^1R1 O1Bd$v O1Bi1P O1Bo1* O21$6 O21$X[ O21$g O21$k O21$k+2 O21'9 O21*25 O21*30 O21*68 O21+1 O21+2 O21-0 O21@Y O21@o O21@s O21@y O21D7 O21R1o1x O21R5D4 O21R7 O21^3 O21^7 O21^L O21^cz3 O21^l O21^q-3 O21^r O21^t O21di3n O21f O21i0k O21i1*O34 O21i11 O21i42 O21i5^ O21i6e O21i81 O21kR0 O21o0C O21o0y O21o1^ O21o1b O21o1n O21o2? O21o2i O21o34 O21o3j O21o7Il O21p1O54 O21p2 O21q O21s&X O21s., O21s5 O21scZ O21scs O21sm0 O21sobi1* O21stkp1 O21stl O21syu O21O24s6+ O21O46 O21O52 O21z3i1* O21z5 O21{l O23 O23$# O23$*[ O23$. O23$? O23$I O23$f'6 O23$g O23$j O23$l O23$r O23$t O23'7 O23*23{ O23+0 O23+9 O23-2$d O23-2o28 O23-8 O23@h O23C O23D3 O23K O23L4 O23L5 O23R3 O23Z1 O23Z1s1R O23Z2 O23Z3 O23Z4 O23Z5 O23^( O23^6 O23^D O23^V O23^m O23^s O23f O23i1K O23i1b O23i2i O23i3x O23i4i O23i57 O23l$! O23o13 O23o19 O23o2n O23o36 O23o3@O12 O23p1 O23p1+0 O23p1O03 O23p2O82 O23q*82 O23r O23sLo O23sdgZ1 O23siL O23z1 O23z1^b O23z2 O23z2Z1 O23z3 O23z5o2$ O24 O24$. O24$6 O24$7 O24$_ O24$g O24$h O24$i O24$r O24'6 O24'8 O24*20p1 O24*36 O24+2 O24+5 O24-3 O24@1i4b O24@hZ3 O24K$p O24L2 O24L6 O24Z2 O24Z3 O24Z3*15 O24Z5 O24[ O24[O25 O24^# O24^W O24^g O24^m O24^o O24^oD3 O24^r O24^z O24d O24f O24i2, O24i32 O24kd O24o0SZ1 O24o21 O24o2r O24o2y O24o4 O24sa. O24sat O24skX O24sod O24sr4 O24t*13 O24tR1 O24uz5 O24O05 O24O15Z5 O24z3 O24z4 O24z5 O25 O25$ O25$& O25$0 O25$d O25$r O25'6 O25*13 O25+2 O25-1f O25-5 O25D4 O25D9 O25L1 O25R6 O25RA'7 O25T6 O25T6'5 O25Z1 O25Z2 O25Z2c O25Z3 O25Z4 O25Z5*70 O25^, O25^U O25^c O25^i O25^n O25i3g^f O25i3z O25l O25l[ O25o1q O25o49i4i O25o4B O25p1 O25rz5 O25s5c O25uo3y O25O51+2 O25z1 O25z4L6 O25z5 O26 O26$@ O26$F O26$X O26$a O26$r O26'6 O26+1 O26-5 O26@az1 O26R0 O26Z1 O26Z3 O26^'o0Z O26^a O26^bskr O26^c O26^t O26d O26i1v O26i3? O26o4y O26p1[ O26p2O94 O26qz4 O26skf O26sp6 O26ssa O26z2 O26z5 O26} O27 O27$3 O27$i O27'8 O27-1^f O27@3 O27L4 O27Z2 O27Z5 O27^8 O27^M O27^h O27d O27i2az4 O27i4p O27o03 O27o0m O27o1MZ2 O27o1j O27o1y O27o57@r O27p1z1 O27q O27s1q O27z1 O28$_D2 O28'9 O28+4 O28-0 O28^6z4 O28^e O28^z O28d O28l O28o0d O28o27d O28q O28O0B O29$J O29$y O29-1 O29-2 O29T4 O29^n O29^{-0 O29d O29i0s O29i5t O29lo5- O29o1j O29O41 O2A$. O2A'7 O2A^T O2Al O2Ao1e O2AO37 O2Az1i17 O2B$9 O2B^i O2Bi0fL4 O2BO15O08 O31$6 O31$8 O31$T O31$_ O31$m O31$o O31$y O31'4 O31'6 O31'7@7 O31*15ssr O31*24 O31*26 O31*28 O31*54] O31*61 O31*80 O31+4L7 O31+4d O31-0 O31-2 O31@3 O31R6l O31T2 O31Z2 O31Z3+1 O31Z4 O31[o6T O31]p1 O31^B O31^^l O31^t O31^u O31f O31i0! O31i2WT5 O31i3g O31i4X O31i4w O31i67 O31i73'5 O31i89O76 O31o0D O31o0Y O31o0t O31o1C O31o2U O31o3a O31o4z O31o8r O31oA5O36 O31p1[ O31p2O25 O31r O31s-h O31sar[ O31si' O31sl9 O31smf O31syT O31O21*45 O31O42 O31O43 O31O46 O31z1-0 O31z1o6e O31z3O61 O31z4*62 O31} O32 O32$ O32$7 O32$8 O32$L O32$Y} O32$b O32'8 O32*43 O32+1 O32+2 O32+5 O32+7 O32-3 O32-5 O32@. O32@k O32@t O32@zC O32D1 O32L2d O32L4 O32R4 O32R5 O32T3 O32Z2i3H O32Z2O35 O32Z3 O32Z4 O32Z5 O32[ O32^$ O32^6 O32^I O32^S O32^X O32^e O32^o O32c$b O32d O32d'6 O32d-2 O32i1e O32i3$ O32i3: O32k O32kp1 O32l O32o0k O32o2 O32o20 O32o2x O32o3+q O32o3@ O32o4w O32o55d O32o5w O32p1o5K O32s7u$A O32sG6 O32sg* O32sqc O32srl O32srs O32u O32O42 O32O65sts O32O72 O32z1-3 O32z2 O32z3 O32z4^c O32z5 O32} O34 O34$$ O34$& O34$3p2 O34$Z O34$n O34'5 O34*13 O34+1 O34+6D2 O34+8l O34-4 O34-5 O34-7 O34@y O34C O34Cu O34D6 O34L0 O34R4 O34Z1 O34Z2 O34Z3{ O34Z5 O34[t O34^4 O34^J O34^e O34^p O34^usb* O34^x O34c O34d O34fu O34l O34lo0k O34o2e O34o38q O34o3yu O34o65 O34o6n O34scf'5 O34seB O34sifp1 O34somssm O34ssp O34svj O34O52 O34O63 O34O94 O34z1 O34z2 O34z3 O34z4 O35 O35$! O35$'[ O35$* O35$5 O35$5R2 O35$A O35$C O35$n O35+0 O35+0T2 O35-1 O35-6 O35Z1 O35Z2R0 O35Z3 O35Z4-5 O35Z5 O35Z5O58 O35^B O35^nT4 O35d O35i1 O35i33 O35k O35l O35o0cq O35o0jz2 O35qT6 O35sr7 O35tT7 O35O92O63 O35z1 O35z2 O35z3 O35z4 O36 O36$ O36$# O36$. O36$0 O36$2 O36$p O36+3 O36Cz2 O36D1 O36D3C O36L3 O36T3 O36Z1$f O36Z2 O36Z2c O36^2 O36^U O36^b O36^z O36d O36i0@ O36i5u O36sbt O36t^A O36u O36z1 O36z3 O37 O37$C O37$n O37L5 O37T6 O37^C O37d O37i0GZ2 O37i2A O37i4g O37l O37o0V O37o0x O37o20 O37O41 O37z2l O37z3 O37z4'A O38$7 O38$l O38'8 O38+0 O38-0 O38R0 O38Z2 O38^O O38^s O38i3o O38o1r O38o3f O38sce O38O51 O39 O39$b O39D0^0 O39^1 O39d O39l O39o3r O39q O39z1 O3A O3A^9 O3Az2R2 O3B O3Bo0e O3Bo3 O41$+ O41$3 O41$4 O41$5q O41$9 O41$@ O41$G O41$XO91 O41$w[ O41'B O41*23Z3 O41*40 O41*40O15 O41*53 O41*56C O41*78 O41+1*30 O41-0 O41@8 O41@m O41@t O41D1 O41D5 O41L2@2 O41R0^m O41RA O41T3 O41Z3 O41Z4 O41[$h O41^6 O41^i O41^v O41d-2 O41i2o O41i4!u O41o0h O41o3S O41o7i O41p2 O41r*36 O41sh5 O41sjL O41sku O41snl O41O54Z2 O41O61 O41O82 O41O86 O42 O42$! O42$% O42$& O42$2Z2 O42$J O42$k O42$o O42'6 O42'B O42*34 O42*37Z1 O42*53 O42+3 O42+9 O42-0 O42-4 O42-6 O42-7 O42-8 O42@4 O42D1 O42D1*21 O42K$a O42KZ1 O42L5 O42L6 O42R5 O42R6O13 O42R7 O42T5 O42Z3 O42Z4 O42^& O42^2 O42^4 O42^D O42^I O42^d O42^h O42c O42c^h O42d O42d+B O42i1ao48 O42i2h O42i3Ut O42i4= O42i4e O42i4zL3 O42o0j O42o21 O42o3D O42o5` O42o5d O42p2 O42p2O79 O42r O42s91z3 O42sKE O42sa O42sdp O42sjbD8 O42slL O42srz O42t*52 O42z1 O42z1i0A O42z2 O42z4+7 O42{T6 O42} O43 O43$! O43$4D8 O43$5 O43$a O43$dc O43$e O43$k O43$xO31 O43'8 O43*04 O43*05 O43*42 O43*43 O43+2 O43+3 O43+4 O43+7 O43-9O73 O43@7z1 O43C O43D7 O43L0 O43L4 O43R0 O43Z2 O43Z3 O43[ O43^0 O43^8R3 O43^C O43^D O43^d O43^i O43d O43f O43i0% O43i05 O43i0m O43i0w O43i2I^# O43i2uK O43i4I O43i50 O43i76 O43o2n O43o4B O43p1+0 O43s2i O43s6n O43sKi O43sbh O43t O43tZ1 O43u O43up1 O43O41$$ O43O41@l O43z1 O43z1O51 O43z2 O43{$a O45 O45$pl O45-0Z3 O45-3 O45-5 O45@oi5i O45C O45C^. O45D1 O45L4 O45R0 O45R1 O45T2^l O45Z1 O45Z2 O45Z5[ O45[ O45^7 O45^L O45^j O45^m O45c O45i1x O45i5$ O45l O45o2+ O45o4z O45o78 O45oAX'9 O45p1 O45s2i O45spb O45O53 O45z1 O45z5 O45{ O46 O46$1 O46$nZ1 O46'7 O46'8l O46+2 O46-1 O46-2 O46L4 O46T0 O46T2 O46Z2 O46^U O46d O46i0L O46i4Yc O46o02 O46o3s O46o6f O46O61 O46z1 O46z2 O47 O47$; O47-4 O47D1 O47R1 O47[ O47^FR0 O47^sO52 O47c O47o0_ O47o3* O47q O47sge O48 O48$3 O48$8 O48$z O48^! O48^2O16 O48p1 O48sat O48sek O48snw O49 O49'6 O49D3^2 O49Z1 O49Z2 O49^1 O49^9 O49i4u O49o7s O4A$f O4A$p O4A-0o1j O4Ao4m O4A} O4Bc O4Bt O51$! O51$6 O51$; O51$@ O51$S O51$x O51$y O51$z O51'9 O51'9so O51*04 O51*68 O51+1 O51+2Z3 O51-1 O51-2 O51-4^2 O51-5d O51-7 O51D4O59 O51Kse6 O51L3 O51L3L1 O51R1r O51R5O5B O51R8 O51T1 O51T3 O51Z1t O51Z2 O51^' O51^1 O51^2 O51^S O51^i^o O51^n O51i0w*67 O51i2T O51i2h O51i2o O51i3m O51i3q O51i44 O51i4A O51i6r O51o1h O51o3L O51o3s O51o4N O51r O51s9u O51sh2o6. O51sj4 O51sjm O51ssa O51O03 O51O25i3k O51O62 O51z1 O51z2O71 O51z4 O51{ O52 O52$$ O52$6 O52$7+4 O52$9 O52$@T0 O52$Cu O52$G O52$a O52$n O52$p O52$v O52'A O52*02 O52*05 O52*31 O52*32 O52*41 O52*67 O52+2 O52+3+3 O52+5 O52+6i7e O52-6 O52@y O52D7 O52L4 O52R2 O52R3o66 O52R4 O52T5Z4 O52T5O13 O52Z1 O52Z1$q O52Z3 O52[Z3 O52^$ O52^0 O52^9 O52^J O52^O O52^_ O52^k O52d O52i01 O52i0Q O52i2u O52i4r O52i59 O52o0C O52o1P O52o1dz1 O52o23 O52o41 O52o4g O52o4j O52r O52s0% O52sMj O52u O52O02 O52z1 O52z1slI O52z3 O52} O53 O53$' O53$H O53$R O53$X O53$do4R O53'7o0. O53*10 O53*96 O53*97 O53+9 O53-2p1 O53-4 O53-9 O53@e O53D7 O53L1 O53L2@5 O53R6s2r O53R7 O53T0 O53T1 O53T4 O53Z1 O53Z1sde O53Z2 O53Z3 O53Z5 O53^2 O53^P O53^S O53^no3n O53i14 O53i1a O53i4l O53o2e O53o3 O53o6a O53s0. O53s1B O53sln O53t O53O62 O53z2 O53z3 O54 O54$, O54$t O54$y O54+A O54-1R0 O54-4 O54-4+2 O54-5 O54@5 O54C O54D3 O54R1 O54R5 O54R6 O54R7 O54T5 O54Z1z2 O54Z3 O54]O21 O54cO28 O54i0t O54i5t O54i6i O54i8i O54l O54o1F O54o2P O54o3D O54o4/ O54o54 O54o6B O54o6e O54set O54shCO02 O54smBO32 O54O04 O54O48 O54z1 O54z2 O56 O56$/ O56$1 O56$@ O56$k O56$w O56'8o4s O56+5 O56+6 O56-2@6 O56-3o2& O56-6 O56CO04 O56L5 O56R1D3 O56Z1 O56Z2 O56Z3[ O56^6 O56^OO23 O56^r$b O56i3x O56o3, O56O01 O56O02d O56O14^i O56z1 O57 O57$. O57$0 O57@0 O57@a O57R5 O57Z2 O57csti O57i0a O57i3- O57p1 O58 O58'6i5w O58+2 O58+5 O58z1 O59$z O59*16 O59c+0 O59i5l O59to3e O59O71 O5A O5Bo6m O61$* O61$+ O61$1 O61$5 O61$= O61$p O61$z O61*41 O61*53 O61*64 O61*78 O61-2 O61@i O61@m O61C$r O61L0 O61R5 O61T4 O61^. O61^/ O61^? O61^Q^i O61^i O61^q O61^z O61i2$O13 O61i25 O61i3f O61i3l O61i3p'7 O61i78 O61i8k O61i8u O61o09 O61o6 O61o68 O61o6g O61o7w O61o86 O61r O61s8m O61sjxD4 O61O14 O61O21 O61O23 O61O53@h O61z3 O61{z4 O61}-1 O61}-9 O62 O62$n O62$w O62'8 O62*65 O62+0 O62+2 O62-6 O62-8 O62@eR1 O62@u O62D3 O62D6s0l O62D8i61 O62T3 O62T6 O62Z2 O62Z5*3A O62[ O62^3 O62^H O62^M O62^_ O62^a O62^l O62^ul O62c O62d O62i0S O62i0b^Z O62i0s O62i35 O62i3d-1 O62i5; O62i6a O62i6m O62i6u O62i7r O62l O62l^M O62o2y O62o3t O62o4* O62o4j O62o63 O62o8s O62r O62s1i O62sbd O62se< O62O02 O62O23 O62z5O27 O63 O63$K O63$R O63$ao00 O63$c O63$mT2 O63'B O63*34 O63*62 O63-1O25 O63@h O63@n O63R1 O63R6 O63R7 O63Z1 O63Z3 O63Z5 O63[O43 O63^2 O63c O63d O63i0F O63i3so46 O63i4s O63i73 O63i82T8 O63l$r O63o0x O63o3z O63p1O04 O63r O63scH O63sk$ O63sxS O63u O63z3$B O64 O64$! O64$$ O64$0 O64$9 O64$g O64$u O64+1 O64+9 O64-6 O64-8o5m O64T0 O64[o5c O64^7 O64^g O64i5o O64i6< O64i6t O64i6w O64l O64o5q O64skL O64t O64O23 O64O32 O64O91O43 O65 O65$+ O65$/ O65$c O65$k O65*76 O65+6 O65@n O65R0 O65[ O65l O65o0K O65o0v O65o1t O65o6p O65o91 O65slb O65O0B O65O21 O65O73 O67 O67$. O67+7 O67-4 O67D2@w O67T0 O67i3l O67o6ml O68Z1 O69 O69$x O69-5 O69z1 O6A O6A$1 O6B[ O71$" O71$2D3 O71$9 O71$E O71$a O71$k O71'8$g O71'B O71*53 O71*56 O71*58D5 O71+5 O71-0c O71@9 O71@s O71L7 O71R6 O71T7 O71Z4 O71[O41 O71c} O71k*64 O71o5 O71o6h O71o6j O71o81 O71o8e O71o8k O71r O71s2! O71s2x O71sh-O43 O71O04$f O71O21 O71z2O31 O72 O72$0 O72$3 O72$4O63 O72$a O72'B O72*13 O72+1 O72+2T6 O72+8 O72-5 O72D1 O72R7 O72T2 O72T7o74 O72Z2 O72Z3 O72Z5 O72[ O72[l O72^2 O72^O O72^h O72^l O72^m O72c O72i0f O72i62 O72i83 O72o0v O72o6u O72o7Z O72sa1 O72O31 O72O42 O72z1 O73 O73$4 O73$6T6 O73$8 O73$C O73$z O73'9u O73D8 O73L1 O73R4 O73R6 O73R8 O73T6 O73^S O73^a O73^i O73^k O73i6e O73l O73o14 O73o64 O73o8! O73o8? O73o9o O73s23 O73t O73O51 O73O84 O74 O74$# O74$i O74$y O74'9 O74+1 O74+9 O74@3 O74D2 O74T1 O74i5sD1 O74l O74l'8 O74o0g O74o0rT7 O74o4o O74O04 O75 O75$1 O75$u O75+9 O75D3sck O75L0 O75R7 O75T0 O75Z1 O75i70 O75o4z O75o8h O75O03 O75O13 O75O51 O76 O76+3 O76+7 O76[ O76i7# O76o6 O76O81 O78$5 O78i3t O7A+0 O7Bc-7 O7BO1AO15 O7BO43O2B O81$1 O81$9 O81$m O81$z O81'9 O81*34 O81*91 O81-1 O81-6 O81-8 O81-9 O81-A O81@b+3 O81D1 O81R8 O81T3 O81T4 O81T5 O81T8 O81[@f O81i8ac O81o0uO53 O81o2e O81o5+ O81o8s O81o93 O81p1O6A O81r O81s21 O81seo O81sry O81O12 O81O25l O81O42 O81O61 O81O94 O82 O82$6 O82$c O82$t O82'A O82*86 O82*94'9 O82*96 O82*98 O82+1 O82-0 O82-1 O82-9 O82D3 O82D5 O82L1 O82R4O32 O82R7 O82T7 O82Z2 O82^1 O82c O82i6a O82l O82s45 O82O06 O82O17i1T O82O34 O82O92 O83 O83$! O83$# O83$3 O83$7 O83'A O83*57 O83L8 O83Z1 O83Z2 O83Z3 O83^+ O83c O83l O83o6h O83o7mO04 O83sa1 O83O02T5 O83O04^z O83O12 O83O42 O83O43 O83O51 O84 O84$9 O84*78 O84+7 O84-7 O84-8 O84L8 O84Z1 O84Z1O24 O84^x O84i8c O84l O84oB0 O84O34 O85 O85*67 O85D0 O85L8 O85l O85O43 O86 O86$1 O86$l O86-7 O86-8 O86T0 O86O23 O86O52 O87 O87'8o6u O87+2 O87O21 O89+9'9 O89l O89O62+7 O91$9 O91$< O91'B O91+6 O91+B O91@dO02 O91@t O91R8 O91R9 O91i1QO04 O91i85 O91o0j O91o69 O91o6p O91o8_ O91s92 O91O06 O91O24 O91O51'A O92 O92$6 O92$y O92*87O08 O92*98 O92+7'A O92+A O92-8 O92-9 O92@3[ O92Z1 O92cO71 O92i20 O92u O92O21 O92O25 O92O35 O93 O93$2 O93*18O07 O93-7 O93C O93D6 O93L9 O93c O93i9e O93l O93O07 O93O41 O93O62 O94 O94T9o9g O94O13 O94O26 O94O27R1 O95 O95$5 O95o66 O95O42 O96 O96'B O96-6 O96i16O15 O97 O9Al O9AO15 O9AO56O18 O9AO62 OA1$yO4A OA1'B OA1+7 OA1+A OA1+A$6 OA1-9 OA1@gO23 OA1D8 OA1LA OA1Z1'B OA1i0ZO06 OA1i2k OA1o1a OA1oA6 OA1oB0 OA1O15 OA1O21 OA2 OA2*97 OA2+A OA2T8O26 OA2[ OA2u OA3 OA3-A OA3D6 OA3c OA4 OA4$! OA4$S OA4D9u OA4cO03 OA4O35 OA5O15 OA6 OA7O07 OA9O57 OABOB4O69 OB1$1 OB1$2 OB1$3 OB1-B OB1D1'8 OB1oB3 OB2 OB2$0 OB2$4 OB2$7 OB2+B OB2iB9 OB2l OB2O16 OB2O36 OB3 OB3$6 OB3+9 OB3-B OB3Z1 OB3[ OB3l OB3O04 OB3O17 OB4 OB4$r OB4O19 OB5 OB6O04 OB6O46 OB7 z1 z1$' z1$-^A z1$2 z1$3 z1$3^l z1$7+3 z1$7@j z1$; z1$?k z1$bu z1$f z1$h z1$i z1$jR4 z1$k z1$l z1$lC z1$n z1$o 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*31-5 z1*3Bc z1*45O14 z1*50 z1*51} z1*60 z1*80i1{ z1*84 z1*94O12 z1+1 z1+4 z1+6R6 z1-1 z1-1sf0 z1-3 z1-3d z1-5Z1 z1-9O32 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 z1D4shQ z1DB z1L0$1 z1L1 z1L2^7 z1L3 z1R3 z1R7k z1RAO54 z1T0 z1T5 z1Z1*38 z1Z1^S z1Z1i16 z1Z2^4 z1Z3 z1Z3'5 z1Z3^q z1Z3q z1Z4 z1Z5 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 z1i0F z1i0F$1 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 z1i8lO23 z1i8t z1i9H z1iA1 z1k^H z1lO57 z1o05+8 z1o0nT4 z1o0yz3 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)O03 z1o61 z1o6l z1o6w z1o6| z1o71 z1o7L z1o7n z1o7p z1o8n z1o91 z1oAs z1p1'5 z1p1-5 z1p1z1 z1r$i z1r*60 z1r^r z1rt z1s0DO07 z1s3e z1s5pc z1s8zO72 z1s;| z1sd5^v z1sd= z1sf* z1shi z1sig z1sm/*52 z1sm8i5n z1sn9o0p z1sot z1stj z1t z1tD5 z1O02o1B z1O03p1 z1O06^r z1O07z2 z1O0Ai1[ z1O16Z2 z1O19'7 z1O24 z1O27 z1O32 z1O34 z1O36 z1O36+4 z1O38 z1O42 z1O43T2 z1O47 z1O51 z1O52Z1 z1O54 z1O62l z1O63 z1O63l z1O71 z1O72 z1O75 z1O81 z1O83 z1O93 z1OA7O23 z1z1*25 z1z1*68 z1z1o0l z1z2^M z1z2o7m z1z2o8n z1{ z1} z1}$m z1}R5 z1}Z1 z1}k z1}u z1}z1 z2$-O31 z2$. z2$4 z2$5*58 z2$6l z2$@ z2$A z2$AO2A z2$Co80 z2$D z2$H z2$Qo5f z2$WO36 z2$^Z2 z2$c z2$c^a z2$fc z2$h z2$io1L z2$k z2$l z2$o z2$o*49 z2$oT0 z2$r z2$s z2$u z2$z z2$| z2'5 z2'8d z2'9 z2'A z2*03 z2*04 z2*07 z2*13O02 z2*14 z2*15 z2*23 z2*24 z2*25o7r z2*31 z2*31} z2*36*79 z2*36o19 z2*39*40 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+6 z2+7t z2+9 z2+B z2-0 z2-1 z2-1{ z2-2 z2-2*69 z2-3o0T z2-8 z2@2 z2@3 z2@a z2@b z2@bt z2@j z2@m z2@q z2C z2C*54 z2CZ1 z2D4^+ z2D5Z5 z2D7O81 z2D8 z2K z2L0*53 z2L0i2< z2L1 z2L3 z2L7 z2R0 z2R0'7 z2R1 z2R2 z2R4-6 z2R6 z2R9 z2T0*45 z2T2O38 z2T4 z2T4L1 z2Z1 z2Z3O38 z2Z5O14 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 z2dO82 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 z2i5LO36 z2i5g z2i6gk z2i6u z2i73 z2i7a z2i7o z2i7s z2i7t z2i99*36 z2i9e z2lr z2lO52 z2o0!i0f z2o0"*06 z2o03 z2o06 z2o0Z z2o0g*15 z2o0m z2o1- z2o1. z2o1/ z2o10 z2o1H z2o1k z2o1l z2o1u z2o1y z2o2- z2o21 z2o2P z2o2a*07 z2o2b z2o2gO35 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 z2p2O74 z2q z2r-7 z2rc z2s.@c z2s0Ol z2s2b z2s4f z2s4x z2s7m z2s97 z2s9k z2sbq z2scl z2sd8 z2si3O34 z2siai2g z2slMo99 z2srtO04 z2su% z2sx z2tK z2u+9 z2u^0 z2u^K z2uo1< z2usG0 z2O24 z2O27 z2O29Z1 z2O2A z2O32 z2O35*03 z2O35T0 z2O42 z2O45i0E z2O47 z2O53 z2O61 z2O65l z2z1i2: z2z1i37 z2z3o5l z2z4 z2{Z5 z2} z2}*29 z3$+ z3$3 z3$5O51 z3$7 z3$Ak z3$c z3$e z3$ei4; z3$el z3$f z3$h z3$k z3$n z3$rD9 z3$s z3$y z3'8 z3'8Z4 z3'9 z3'9r z3'A z3'B*39 z3*04 z3*06 z3*07 z3*14 z3*15 z3*16*70 z3*17 z3*19 z3*24 z3*26 z3*27 z3*28 z3*35 z3*43 z3*46 z3*57O71 z3*58 z3*58o8* z3*61 z3*72T5 z3*73 z3*75 z3*83 z3*87 z3*94R3 z3*95+8 z3*97 z3+0 z3+1 z3+1O49 z3+2 z3+4z5 z3+5 z3+6 z3+6u z3+8 z3-1 z3-1-2 z3-2 z3-3 z3-5-3 z3-9 z3@a z3@h z3@j z3@k z3@mss1 z3C z3D1*75 z3D3O2B z3D4*59 z3D5r z3D7 z3K z3K$g z3K} z3L4O38 z3R0*37 z3R1 z3R4 z3R4-0 z3R6 z3T1 z3T2 z3T4sru z3Z1*80 z3Z1-0 z3Z3'8 z3Z3+9 z3Z4 z3[o7i 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 z3dO54 z3i01^# z3i0U z3i0d z3i15 z3i1XO01 z3i26 z3i28 z3i3gO48 z3i3r z3i3z z3i41 z3i4C z3i4l z3i4yO36 z3i5^ z3i5zT4 z3i5{ z3i6++8 z3i6r z3k'7 z3ksgc z3l z3o08 z3o0f z3o0mZ1 z3o0n z3o0qo4! z3o12 z3o1O*84 z3o1c z3o2- z3o21 z3o23 z3o2LO64 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 z3rsk* z3s3lO35 z3s8jo84 z3sM4O24 z3sMr z3scl z3scr z3siI*26 z3sis z3sjW z3srx z3ssz*23 z3sys z3szd z3tO54 z3O01O72 z3O02^E z3O14Z4 z3O25u z3O27 z3O29 z3O29$B z3O2A z3O36i11 z3O39 z3O41 z3O41O46 z3O42 z3O43 z3O52 z3O52z4 z3O56 z3O61{ z3O63 z3O63*42 z3O72 z3O75 z3O84 z3OA1*5A z3z2*65 z3z3*81 z3z3C z3z3^N z3z4 z3z5 z3z5-A z3z5O93 z3{ z3{-4 z3{^' z3} z3}^( z3}i4* z4 z4$! z4$0 z4$1 z4$=C z4$M z4$b z4$e*71 z4$f z4$m z4$x} z4'9o2^ z4*07 z4*0A z4*17 z4*25 z4*28'5 z4*28O62 z4*35'A z4*36 z4*36+4 z4*49 z4*50O54 z4*51 z4*54 z4*58 z4*59O16 z4*60 z4*61$3 z4*73*59 z4*76 z4*78*76 z4*81 z4*83O61 z4*95*35 z4*98 z4+0 z4+0+6 z4+1 z4+2 z4+5 z4+6T2 z4+9^+ z4+A z4-0 z4-0] z4-1 z4-2 z4-3 z4-4 z4-5 z4-8O12 z4C z4D8 z4K*35 z4L0 z4L1 z4L2O38 z4L5 z4R2 z4R3 z4R6+3 z4R8*21 z4T1 z4T2sm5 z4T4 z4T5 z4T7+4 z4Z1 z4Z1O81 z4Z1} z4Z2$A z4Z3 z4Z5 z4[$b z4[L2 z4[o4l 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[ z4i6d z4i7& z4i8@O27 z4i9r z4iBd z4li4+ z4o2y z4o3[ z4o3d z4o3h z4o3l$1 z4o3y z4o3{ z4o4> z4o6= z4o7u z4o84c z4o8U z4o8z z4oAr z4p1O3A z4p3 z4r*18 z4rO34 z4s0ao3f z4sbq z4srPT5 z4sso z4suy z4sw+ z4swv z4t z4t$L z4tO34 z4O01@e z4O06$u z4O06o3v z4O16i4e z4O16o4% z4O18+2 z4O1AZ2 z4O24i7O z4O28u z4O29 z4O34} z4O35 z4O35f z4O35o0N z4O37 z4O42o6x z4O43 z4O43C z4O46 z4O54R0 z4O56 z4O5A z4O63z5 z4O71+9 z4O82 z4O92c z4z5 z4z5O75 z4{ z4{+0 z4{^y z4} z4}O28 z5$9 z5$; z5$y z5'6T4 z5'8$o z5*17 z5*27+3 z5*36 z5*48 z5*4Ai0# z5*60 z5*64 z5*67 z5*72[ z5*74 z5*A2O92 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-9 z5@3 z5@a z5D7-4 z5K z5L1 z5R0 z5R1 z5R5 z5T1 z5T5 z5T7-3 z5Z1O27 z5Z2O27 z5Z4 z5Z4^g z5[o4o z5] z5^/ z5^3O75 z5^6 z5^D z5^m z5^nz1 z5^w z5^z z5^zO76 z5d'9 z5i01z4 z5i3|i6X z5i4c z5i57 z5i5l z5i69O57 z5i6U z5i71O34 z5i7R z5i7u*9B z5i9?O57 z5i9Zl z5ki6d z5o0er z5o10o3k z5o1X z5o1li28 z5o3O-8 z5o4{O39 z5o6d*15 z5o6t z5o7e z5o7pD8 z5oA1i4l z5oA3z1 z5qO3A z5rO34 z5s36 z5s36O36 z5s5q z5s5t z5s9AO1B z5shsO38 z5sw& z5t*76 z5u z5u+3 z5O07@p z5O0B+5 z5O0B^r z5O17k z5O1AZ1 z5O23i72 z5O24O76 z5O25 z5O28 z5O29 z5O35 z5O35Z2 z5O38+1 z5O38l z5O39 z5O3A z5O43 z5O45r z5O48 z5O49Z1 z5O53K z5O53^; z5O56 z5O5Az2 z5O61 z5O62i40 z5O64 z5O65D6 z5O68 z5O71*27 z5O71o33 z5O72 z5O73 z5O79 z5O79$r z5O81] z5O84 z5z3o7b z5}O47 { {$) {$+ {$- {$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 {*37 {*41 {*42o3> {*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 {cO21 {f {i0$ {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 {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 {s0a {s19 {s3$ {sbu {scs {sei$i {sg{ {sn9 {snkZ2 {sog {ssv {sue {svu {t {u {O02 {O03 {O05Z4 {O12 {O21l {O21o5n {O21z5 {O23 {O24 {O25q {O51o8o {O61 {O71 {O92 {z1 {z1Z1 {z1o5K {z2 {z2$A {z2*03 {z2*63 {z2i2> {z2o5e {z3 {z3{ {z4*81 {z5 {{ {{c {{i32 {{{ {{{c {{{{ {{{{c {{{{{ {{{{{c } }$ }$% }$' }$* }$- }$3 }$4o0x }$5 }$6 }$6*53 }$6^& }$7 }$? }$Ai13 }$G }$O }$P }$Qo5$ }$XO52 }$d }$j }$j-4 }$n }$o }$q }$r }$v }$z }${ }'6 }'7 }'9 }'A }*01Z3 }*03$7 }*14 }*15O12 }*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 }Z4O21 }Z5 }Z5'7 }[*72 }[T6 }]$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 }dO04 }f }i0A }i0S }i0z }i1D }i1^ }i1f }i1wi74 }i1{ }i2/R2 }i2b }i30D5 }i3G }i3NsgO }i3n }i4-O34 }i50 }i56 }i6" }i6p }i7XO54 }k }ku }lz4 }o0 }o02 }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 }p1O43 }q }q'8 }q-7 }q^T }r*50 }rD0 }s0- }s1d }s38 }s5$ }sAu }sAy }sRm }san }sc]{ }scrK }slc }soi }sro }svr }t^S }u+3 }uL7 }uz2 }O02 }O02p1 }O03 }O04 }O05 }O08 }O13 }O14 }O21 }O32 }O37 }O43 }O52 }O72 }O91 }z1 }z1i1Y }z1o5o }z1sv# }z2 }z3 }z4 }z4$7 }z4z3 }z4z5 }z5 }} }}*80 }}c }}d }}} }}}c }}}} }}}}c }}}}} }}}}}c hashcat-4.0.1/rules/dive.rule000066400000000000000000030031371320027462700161130ustar00rootroot00000000000000# 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 O12 T5 *42 D3 '8 $1 $2 $3 K +0 O14 +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 } O02 *06 *13 '9 C $0 $1 } } } } '4 $1 $1 *21 $e +3 f rcrT0 $0 $0 +7 -4 c $1 $2 $3 $9 $9 O03 $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 O32 se3 D6 'A $8 $8 so0 p1 .1 ] ] ] $y -0 s06 si1 O42 *50 *04 : -7 $7 $7 $9 $7 $2 $9 $7 $1 -3 $2 $0 $0 $0 ] $a } '7 o0m o1a .0 -2 ] ] ] $o ] ] D1 ] ] ] ] D1 $! *24 { O26 c $1 $1 +9 c $2 ] $r l $2 $0 $0 $7 -1 ^4 OB6 u -5 l $2 $0 $0 $4 ] ] $s *54 *20 *41 D7 .2 ] ] ] c $2 $2 c $1 $1 $1 D5 *62 +8 -6 l $2 $0 $0 $3 D1 c $1 $2 O62 d '7 l $2 $0 $1 $2 c $7 $7 $7 ] ] $e $r l $2 $0 $0 $0 ^3 *50 c T6 } y1 O04 sKmc c $8 $8 ] ] ] d } } +4 $m z1 c $9 $9 } $e [ 'B $2 $0 $0 $7 c $7 i22 } ,3 T6 -9 o03 } ] c $5 k $3 i72 c $4 +A c ^1 *42 O37 Z2 O91 y1 r c $3 Z4 '7 } Z4 } '7 O13 d '8 $1 $9 $9 $6 *46 } } -0 O12 i71 c $7 $7 *63 O24 T3 } o05 *03 .4 o12 O67 t u $6 T4 c $6 i70 c $8 p4 o15 O45 c $0 $6 $6 $6 -A $2 $0 $0 $4 c $0 $0 *3A OB6 t o03 O53 .3 *60 c O2B 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 c $3 $3 u $3 -8 ts}{ i81 i99 iA9 iB5 i27 c $0 $0 $0 y5 O05 o0m $1 $9 $8 $9 Y2 D7 o10 ,4 *06 E $9 *32 $1 $9 $9 $0 { K T2 -B .6 E O83 c O83 O02 '3 c $1 $0 R8u +1 +3 O53 $1 $0 { [ { ^a c $1 $9 $9 $9 c $1 $3 $1 $9 $9 $9 d '9 c $5 $5 $R s08 $t ssb u O2A c $6 $6 T1 c $1 $2 $3 $4 $4 $e $v $e $r c $6 $9 *57 ,1 c T7 cs;g O43 } Z1 c $2 $0 $0 $0 ,7 ^t O82 c $4 $4 O56 [ *04 +0 '4 $2 $0 $1 $0 c $2 $3 $r $o i71 i89 i99 iA5 +7 +7 *6Acsjc ]s#[ i3- y2 $a $n $2 $0 $0 $9 o21 o64 +5 O72 oBJu c $1 $4 { O73 c $2 $1 OB9 c l $2 $0 $0 $8 +C ] ] $i $e i73 '5 $1 i5- c $1 $6 O73 O52 O14 '6 '7 $1 c $9 $6 i4- i75 O23 i79 O12 'D sz| t OA9 R6 o77 $7 $7 $7 c T5 D4 O94 s], O2B r O92 } .0 i9#t $2 $0 $1 $1 o20 u $S ^L d 'A O08 ,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 O06 l $2 $0 $0 $5 O83 $! { { { { { c $0 $9 [ [ [ [ [ u L8 O69 +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 O42 u $7 c T4 +1 +1 +1 +1 T1 T2 T4 u $0 -2 -4 [ $q O75 u *27 T1 T3 T2 o35 '7 $2 T1 T4 T3 T1 T5 T2 l $1 $2 $3 c $9 $7 $u O02 s?| $0 $7 { o66 u $8 c $9 $3 c $1 $9 $9 $1 $2 $0 $0 $5 O12 O34 $9 $3 T2 T3 T4 T1 T5 T3 T1 T4 T5 'E $9 $6 r sLm OBA t$9 { [ +5 +5 +5 +5 c T3 o23 r C r T0 $2 $0 $0 $6 o31 '7 $3 T1 T6 T3 i76 c $1 $5 Z4 '8 O42 T1 T2 T2 T5 T4 $9 $2 +D T1 T2 T6 $i ^3 i61 i79 i89 i95 T2 T5 T3 '7 $0 u $1 T2 T6 T4 +7 +7 +7 +7 s'^$3 ,6 }sAE -C T3 T5 T4 c $s $e $s Y3 $9 $8 r $9 $5 $7 $8 T1 T6 T4 T1 T4 '7 p1 O58 $1 $4 $2 $0 $0 $1 T1 T6 T5 c $9 $2 +4 +4 +4 +4 ^d '7 $7 T2 T3 c $1 $9 $9 $7 $1 $2 $3 $4 $3l T1 T5 *7BE '7 $4 i7- T2 T6 T3 l $2 $0 $0 $9 EoBf'B c $0 $8 c $1 $9 $9 $8 $1 $5 *3A$8 T3 T6 T5 +2 +2 +2 +2 $8 $7 T4 T6 T5 T1 T3 c $1 $8 T2 T5 T6 T3 T6 T4 o65 $T OA5 O96 E '7 $5 ^y ^m OB4 $6 $y l i4- s]Ks_S[ p5 ] +1 ^p ^m T2 T4 c $2 $4 o02 T3 T5 cspd O63 $8 $9 T3 T4 c $2 $0 +3 +3 +3 +3 $9 $7 $1 $7 ^c c $8 $7 'F O12 ] tsps T4 T5 ksM& T1 T6 c $0 $7 T8 sz] O02 {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 O3B $s T3 T6 ^e c $2 $0 $1 $1 o0L l D4 ^n ^u c $2 $5 c $4 $5 $8 $5 $1 $2 $3 $4 $5 o80 i21 T2 T6 l i5- O34 T5 T6 i7e $1'A ,8p1 } k u r $6 $6 *A3} $g T4 T6 '7 $9 i6t OB8 o8' $! 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 O83 sfgu $z ] ] ] ] ] c se3 sa4 O02 iBX y4 [ z1 $@ z1 K O42 D7 ^k c $0 $6 *81iBi$6 '7 $6 *56 ^2 ^1 ^0 R0r OB7 { c $2 $6 D3s5T .3 *68 '7 $8 o70 $h c*86*B6 O54 c $1 $9 $9 $4 o73 o76 i9X*2BK o43 Z3 -2 -2 -2 -2 k O13 -7 -7 -7 -7 .8sU[u -3 -3 -3 -3 R6{ c $6 $6 $6 iBq[ {s#+TB +E ^l l i6- O64 $1 $9 $9 $4 T0 T3 T1 +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 O7B l O01 OB2 r T0 r c $1 $9 $3 $3 $3 c $1 $9 $9 $5 $5 $5 $5 T1 T7 T3 O96 } p2 '7 p1 O58 D2 i5f O93 $9 $9 $9 c $8 $5 O37 O87 E T0 T3 T2 +0+0 $1 $1 $1 T0 T1 T4 { { { { $eiBi $7*39 { E 'G T0 T5 T1 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 T0 T2 T5 $3 $3 $5 $5 ] o7v i5a c $1 $9 $9 $3 T1 T5 T7 siut $3 $2 $1 O84 c $2 $8 s-+ O51 O35 T0 T4 T3 '5 D3 c $3 $1 *09EsWQ c $8 $4 c $7 $6 T0 T5 T3 } o0v +Bc T0 T6 T2 $1 $! $4 $u O26 ssb $2 $4 T0 T6 T1 T0 T1 T2 c $8 $3 i5. c $1 $9 $9 $2 $8i9{ ^2 T1 T4 T7 ss5 l i3- O08 c $0 $3 ,5 O91 D9 ,B T0 T5 T4 sAI{ oAU*64*21 T2 T4 T7 ^b } u l $2 $0 $0 $1 T0 T4 T2 c $0 $5 c $s T0 T6 T4 O02 O39 o0n R0 T3 T5 T7 T1 T6 T7 T0 T3 T6 ^y O42 $9 iAP Y1 O39 *79 c $6 $7 $1 $9 c $3 $0 D6l +0o7g T2 T7 T3 '4 d *3A$3 i6. $1 $9 $9 $1 $5 $6 T2 T7 T6 *91 .5 T2 T5 T7 i3e '8+0 o14 c $3 $2 c $1 O8B L8^a d '6 c so0 T4 T7 T6 $$ T3 T7 T6 *17 } O12 -0 T3 T7 T4 rR5 $2 $5 .7 c $5 $9 T0 T5 T6 c $2 $0 $0 $6 ^h T5 T7 T6 i79 i79 *AB -0 O67 T4 T5 T7 i7a T1 T7 O23 sD> +F +5+5 *59$? O45 $0 $6 $1 $9 $8 $8 o9a$7s.B .B^i O25 OA2 O91 $n o3t *35 Z1 o7k O61 r O75 c ^3 ^2 ^1 +6+7 c $8 $2 i8p i1a [c O93 E *8A O43 cs'e -8 -8 -8 -8 +0 E f t Y1s^o,7 } O12 } -0 f *A5 '8 O14 c $0 $4 O15 T2 T7 OA1 { ^m T6 T7 $4 $4 Y5 T5 T7 }*79} T3 T7 ,8 r y1 $0 $3 u *92 O86 O73 *2A -1 to9*$8 oA(kR0 $7 $4 { -0 y3 O52 *12,B c o71 s81 i8- } *05 i79 i71 c $4 $2 O27 O51 o63 ^5 ^g E O7A $8 $8 $8 ^x rR8 'H OBA k c $2 $9 R7 $3 $4 O16 c $8 $1 $0 $5 *23 O56 sTi $= s&^-2 $isP} Z1 O78 c $1 $9 $9 $0 c $6 $4 ^9 i2+ O19 s*No7?$6 { O03 $2 $7 T4 T7 l i5. T0RB $9 $1 $1 -E si! se3 OA6 t c $8 $0 $6 $7 O65 +5 R0 .1 Z1 O31 O1B O28 O17 R3 O74 ^s } O01 O24 -1*96 ^M O04 s(B ]-1] $2 $6 -0-0 s)2Z1} *53 -0 O69 c o31 sSX O45 O86 Z1}*A8 c $4 $2 $0 s)M+0 r] i3a i7. *76 +6 $4 $4 $4 i52 sl1 '6sWJ -7-7 c $5 $4 *76 +7 sm`D7 RA O85 i0e .8 sDWr +0 -3 c $1 $9 $8 $5 o59 $8 $4 $7 $3 O9A D5 O65 T6s4` ^5 z1 cs.\oB. s?Js!PK o0t +8+8 $0 $4 } z2 O37 c $3 $5 c $7 $9 sa@ se3 T0 T2 o0g $3 $0 L8] $3 $1 c '8 $1 c $6 $2 ^T sZQ *45 O52 O43 *67 *5A o1a $2 $8 $4 $5 $6 l $2 $0 $1 $1 $A se3 si1 { ^d l i7- +9 +9 $e $s $8 $0 $8 $3 c $7 $4 } c Z1 l *B3o0i $1 $1 $1 $1 O98 u O45 D3 sKs *84'B+1 $7 $6 c $1 $9 $8 $9 s32+5 *68o4ioAJ OB2 ^5 r Y1 -5 $3 $2 T0 T1 R0*25 O94 R2 *87R2 D6o7V*AB c $6 $8 $8 $2 c $2 $0 $0 $2 i4. c $7 $5 i1e $j Y4 O3B *B7 R2 *37 -5 t c $5 $0 *6Bt E $8 O28 d $5 $0 O28 Y4 c $5 $7 } ^f ^8 O47 D1 l $5 $4 c $7 $2 $b i50 [ i39 rk ,9+5{ l *50 O56 ^S o9m^t o7n +5+7 -F } D2 } } } '4 } i8csie soisy% O78 O5B ^l +2+2 $2 $2 $2 *30 O2B $8 $1 sdk O03 -0+7*94 T0 $2 O81 i9T -3 D9 ss5 se3 [ [ [ KT0 R0se& R0se5s5& i54 } $e T0 T7 T1 c $2 $0 $1 $2 sy&c OA6 } +9 +9 +9 +9 [o8/ ^A $7 $8 $9 +9R3saS $9 $9 $5 o1x O9B o6> *20 c-8 c $6 $5 } ^p ^x ^e $7 $9 $6 $8 i70 i72 i4n o0z O02 R6 R0 $4 $6 $* [^l i60 s[0{ $6 $4 o2j s5@ O61 T0 T3 T7 c se3 so0 +5+6 T0 T2 T7 R5+B $5 $9 O64 O24 i72 i71 c $3 $6 'I i1d c $1 $9 $8 $8 i7zR2 +6-7 DBi6e K O06 O85 $F s'J O8B R0 $2 $9 O0A T6 ss7 $3 $5 KD2 D4D7l $5 $2 } +8 T0 O34 sRa D9^r $k iB^*08} *41*36 $7 $5 c OA3 o82s"yr -8 -8 c $6 $0 sa4 si1 -1*1ARA *28i6s ^boA{ $w c $4 $7 RA$l c $7 $1 O07 O94 $4 $2 D7D5c *81 T0 T7 T5 -6$y T0 T4 T7 d E O59 $9 c $3 $8 $c [^h } } i1o o2o T0 T7 T6 $x sv`k R4 OA1 *B0 [ ^S O14 p2 '6 O14 d '6 $5 $8 } '8 ] l i4. c $7 $3 L9*31 i78 i79 D4 s*] OA9 c O48 sK< { l c $5 $1 $6 $1 $6 $0 -6-6 +A +A [ [ ^! O58 T0 $7 $0 } K [ ^D sa@ so0 +4+4 c $6 $3 $1$9$9$8 $5 $7 s c] q c $4 $0 +1+1 si! p2 [ ^s s$vli6n ^* $* OB4 ^y o2u y1 O57 s?v $4 $7 *4Az1 } *80 *47 ^e ^d ^j o0e O57 -2 O48 *09 *12*5B +0+1 s-h O5A c *18R5*27 ,4*A2s$d $5 $1 -4*39 i4t $6 $3 $3 $6 i4i sFI*20 y2 -6 OB9 D2 R6oAZL7 i72 O89 i39 i4a *54sUO o2i [ ^t ] ] ] ] o7MR2D3 c $4 $6 +6 O56 $4 $0 +5-7 c $7 $0 ^7 i3c } +6 d 'D $3 $8 ^6 '6 $1 -1sBk K*04 $4 s6# O28 *54 l [ +2 o52 $_ uD6 $1 OBA DB o1y O59 +9 i3s -BT0 *64+0 t*91 oA5^t s@yE*37 $1 $5 $9 $4 $1 O59 u [k *36-0+4 o62 T0 T3 c $4 $1 '8*45 TB s;m O61 c $5 $2 $5 $3 i62iA< O58 o2c sRw D6 O93 i4tiAf o2e c $2 $0 $0 $1 { k $4 $3 ^kiAs s9A-3 { O6A *AB c $6 $1 { *AB O84 i99 s`8 -9 -9 -9 -9 s>e'6 cd l O65 +2 ^yR9 c $5 $8 i4s u $9 $5 *78o1r { O52 ^9 $1 $9 $8 $6 i71 i70 O46 c ^2 ^1 '8sr> s^pc -8+2 ^x ^x $x $x O3A *04 ^e ^b -6-7 Es,Rd ^r ^e ^p ^u ^s T0 T5 sa@ si1 s/Pro8< z5 [ ^k $e $r s}x+4 D3svys94 i1b O42 *49 $3 $7 O56 r i92 i61 s},s'-^h $i $n *03-9slU .6y1*96 $)K'7 o0o o79 t O7A c $4 $3 syCT7ssg i67 i18 $0 $0 $7 +Bd *13*19iBw O86 } ^A O41 *59 O36 +0+2 $msGu s`V ^ps2{ p2 } O46 i2i d ] o51 i3d R9c $4 O6B +6 -5 R6s2**A5 { -5 ^fi9E [ ^c } i6i -6+7 c $2 $0 $0 $8 O64 sEW *63 } ,1 iB( O3A +2 +B +B i70 i71 i9s c o19 'J L8K*24 sCfR1 sa@sc0$. c $1 $! '6 $1 $2 $3 +5-6 O09 to9U ^x $x *32s4Tc Kto8o '6 ] O31 p1 '6 O31 ] p1 *94 c T5 $1 coA)*98 ^a ^d [ ^c O48 rs!j c '7 $1 c $1 $9 $8 $1 OA5 $0 -0 -0 -0 sT--3 [ '6 iAp*04 { R9 i57 u i8? iA- ^E $0 $0 $1 o6. s2' O43 o19 O6A D4 [ ^g *13 +3 { Y2 o4diA0 o6+*50 D2RB,6 $N c $5 $3 +8 +9 d 'F O7B $? E*2BsR, ^M *62d sUB+7 $4 $2 $0 *B1*15*63 Esyv $!$! sKk*13*48 $- i51 i69 i79 i85 oA7 O43 O09 i6a ] [ O95 ^o sO9*2AT7 p1 O08 s|,i4ei9[ OB7 O53 *7A i4b -4-4 R7szV i94s5d LA$2 $R u C $1 ^w i71 i71 o0B i56 *B9s1mD6 *40svh ^r K ,2sC+t T7$c } i0W O8B sfK^p .3 Y1 o58 K+6o7y O02 ^c +6+8 st| y5 O08 O62 s{k o74 -1 -1 $M o5y l $e $o $n OA3 +7 +7 +7 r T0 [ [ [ [ s>s} } -2 *61 o53 u[] } ^G -A -A c '9 $1 z5 ^= O0A +7s!k *06} $8sza oA3 ^0 ^1 Z4 c $4 $8 ^( o1t O4B l O73 o3f O89 ^D i1m } ,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 sdt O45 sQs i91 OAB *6B u iAxd .7^x $0 Z2 +8 -9 ]cspL sIE+Af } *64 +2 t o7c ^b ^a O12 Y1 $o *30 O81 c $9 $9 $9 O56 R7$c o55 O29 c O81 sk i9* O86 -4 s&KTA EK +0-2 *7A} c $1 $9 $8 $7 } o6u +5 +5 +5 [ ^v .A O37 T7 c $3 $9 sAC'6 KRA o56 *30 [ O59 K OB5 .BR5 ^J [ ^T .9r L6*04} *A5 '8 O14 $+ s68 O12 i73 i72 o1l -6 -6 -6 +0+7 +3sts sgo +2 -0-2 O31 RB s ' ^R r C r $m $a i7d } O74 -7+8 $S $t $o o1i*61 *20*97-3 +2 +2 +2 +4+6 [ ^n O75 O27 $e fl +6s*4 $a $l $l R7c.7 $? O94 i3u -6 E *03*23 ET1 EsS}$9 f c '7su1 Z1sK8 -5+7 +0+3 sfa$2 +1 O6B s/? O01 sai i7? t o54 Ks6u O43 '9 ]E i2- [ ^w O67 $c $a $r $t +0-1 +9 -8 [ ^a *24sS9 o00 u[ O9B -B iA3 $u $s *23s$0 {*69 $p $r $o $i $t O6B y2 O57 *64 i44 O02 o3@ $3 $6 $0 O98 o1r s*C o7as+,s\G $3 O37 i71 i72 sa0.6 O54 *72 $3 i0t O94 iB+u o8asC($x i6y*BA O14 O45 Z1sZm i7c +9 -A -7s!. oB5-8*2A t OA5 ]f O6B *7A *21 -1 -1 -1 *14sw\ up1s|X p5t { i5k o30 *81 Y2sD6 o6b O7B Y1 *AB^h O54 $6 o9O s)ai2d o4c O82 s;/ OB4 Y2 ^4 ^3 ^2 ^1 srh*27 o3r $m $e -5 -5 -5 ^a ^A E+8 $b O53 O57 [ ^m O79 ^w sM, *A3c c ^2 ^2 O67 } sz' $j O0B OB7 O02 *53*63 } *15 t O47 *A1*47$f OA2 *68 $7 [ ^F s@zZ1 $a $d Y3 D4 ^@ '6 $3 '6 $2 $8 OA5 ^1 ^1 sa@ se3 si1 *56^jT6 +8*8Bs*r { o41 k sPg O96 [*B8 -7 -8 $' O71 o6? o5a Z4 O56 O75 c $1 $9 $7 $7 [ t o7s [ ^H R3 p4 }scP $e $l $l t*86 } $j i5c $D $5sD> O18 *4B *21 us7E*47 LB*50s/} $b $o $y ^a ^c Z4 O42 o7! O71 s%F o84 i76 i79 .9 o2c +4 s z O81 ^0 ^5 sXtsQi$v } u O32 i5d o9H O72 s]q } *62 i2z E O82 *24'9 o5. *01oA( -6s2w c $1 $9 $8 $4 +7sB=K ]s[) $l $e $e l $9 $5 l $2 $0 $1 $4 $.$. O47 *31 lr k ^z i3b +9 D8 ^d ^e ^r {RA^m ^7 ^9 ^9 ^1 $As/#T7 L9*54 *89R4TB +A +B +1 +2 *4By2 s c $2 $0 $0 $3 si1 so0 sP8E oB`o2k*B5 c '7 $2 *93 *58$i i32 sec{ i7b csHlK o8s [D7 lRAo81 OA4 O38 *B9K s>'sis +A -9 -4 -4 -4 i9Ki0S sb8 -3 -3 -3 } *36 c ^0 ^1 i64 *83 O1B O43 i85,B O02 { { { { { { d O28 d $) ]*86smy $7 O8B -8 -8 -8 ^I $8 *81 O81 ^N $y $o $u o3z $, { { { d O28 Y4 ] $i i1dsG2 $a $1 $l $a $w oBi iA5 R7 O02 ^1 ^2 $a $t KLB*43 $5 O39 sLN o4bsT&-5 O5A o9G u i6a O76 T7.9 $2 { c $1 $9 $8 $2 $5*B0oAA szR$6 O84 $6 *46L8 $1 $0 $1 *45] ^6 ^9 ^9 ^1 [ ^o i8H,9r $9 $7 $3 R8i7!i69 R1 c $1 $9 $8 $3 ,4sJN $n $o KsdC*94 l $4 $4 +0+6 Y1D6 ]s]+*86 $3 $6 $5 i67sB- O8B *76 i4_ ^0 ^2 s)y$3 +D +D o4_ c $1 $9 $8 $0 u '6 $5 *5BT3 s() C O95 svE OB2 D0 ,8Y1 o23 -7 oA"t $2 $0 $1 $4 iB>*83k $e $1 o6! D3 O9B i9y ED9 $1 DA +0+4 OB3 s\JY1 ^3 ^1 o6c *64*A1 $5sFKoAt O48 i72 i73 o06 o9oK *39$b*28 u '6 $6 ^v ^g ^n ^i ^k +9 +9 +9 *87$1 O6A o7( Z1 $*$* O7A u [ ^E O42 -0 i9@ s%MD8 [ $1 $2 $3 TBT0 O71 .6 ^P O25 R7 s]= $1 $0 $0 O35 sp$ Y1 +6s[oiBr -5 O14 i7A O41 d o60*1A $o $r ^5 ^9 ^9 ^1 oAsrTA sp6*96 i2g o6j *A9 *42 O94 o2bsr/ 'L sGE OA2 .4 ]$9 O03 s32 i70 i79 saor $d $a +3+7 C $1 $2 } O73 *1B{ c o75 ssDi1u $1 $9 $7 $7 $6sQg D2] $6DB O8A O42 r $1 *05 OA1 su8 l $2 $0 $1 $3 o73svt sdx*53s4] -7oBG LA O21 O76 o0C s#M*19$! *78ur $0 O5A O57 Y2 } O83 s{<+9 o6AsjYr +0-7 iBM s_x O63 O63 *81 -8 c OA4 *07*34 O5A +7 *48 D7+AT0 O97 i2k *01 iA4 O52 r $+ R6 R6 $t $s sfx-B$2 s04 '7 $1 $2 $3 sXc-7 *7B O04 +4-7 $9 O1B ^C ,6.6 i75 i72 o6t^us2X +4-5 O92 $8 o7i*32 *39o0dsRZ u O09 sAL +3 O08 c $1 $9 $7 $1 *06{ ko3o[ +9swS $d $o ss5 se3 sa@ o6- *51o5u o0c L6 i2j $! $! $! ] O69 *03 i73 i73 u '6 $3 o6zLB O68 u '6 $7 $s $o ]K +7*76 i79 i70 o3ys 6 u $1 $9 $9 $3 { ,4 *21 O28 O24 *B2 ,B $& *26*50 $c $a uK ] $k i4e o1y s0Jr o7i sbQ OA5 -6 +6 l O71 *12Z1 z3 i3f o7t o7s-B*78 i74 i72 [ ^W 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 o4- i70 i73 $j $e $s $u $s o88 f O7B sm2 { Z5 ^6 ^1 ^0 ,5sz, r{ o6? -9 -A ^6 ^1 Z1 s9_ O4A *68Y5 Y1*6A suy $m $a $n K O92 ^4 ^9 ^9 ^1 sep*12 *23^m o4j ^9 ^1 ^q { O47 *79 +B -A -Brsn& tshi*9A D7-7 o4M { d c O8B ] $o TA O81 sN- *32*13 *93 K O28 i12 d O28 '4 Y4 d O28 '4 d Y2*1A sV>i1i*13 sbj o9. o22 -7^a O14 d t*12 [ ^i O79 $&,7 c $2 $0 $0 $5 -8s0% D6*5B $w*4B $2sr% s=vc ^2 ^1 ^0 $m $i i75 i74 O17 o0P z3 O0A $i $d $1 OB5 ,6*B4o9n *3AT5 +7 *84 *30 ts_v O62 r o1U kc O0A D7 sf(*05 o0l *43 O63 E -7*94 $u $m sBq *8A O62 } z4 ^9 ^9 ^9 ^1 D6s5^ o7. u '6 $2 sy6oB` { +5 +2 ^0 ^0 ^0 ^2 sP=+6 O96 i6o { z5 sBx$1 O95 O13 ]Z1 O53 $1 i9- T8 OB5 i71 i73 } Y2 K] ,2*9B -C -C u -1 O17 $Q O17 ,4 o6m O03 O92 $1 $9 $8 $5 $/ o70 -5 i2v t*92 sT6$s ^5 ^2 $5s[.sc9 $f $u $n i72 i70 o4. { ^r *30 Z1sg8 ^0 ^3 .A+7 i5h ,8 OB1 o7h O71 O2A L0 i94 s.<+9 O71 +B $b $a K *A3 O79 Ki9G i75 i79 o5@ o4z ^W iA|$x o0w s\IC i79 i78 ^a ^b $f O19 sZ# D4 +1 o41 +8 O37 sGuK ] $e $d ^u O96 sbd O32 O08 o2- sZxt *2A O93 +2 i76 i76 ^d ^b s%M OB5 O71 o5].5 p3 o68 -0+1 i2w i79 i76 $a ^A o82 o2js@l ^2 ^5 o1e $O i70 i75 +2+6 o5- +F +F *A5i2h svy*70*A4 ^w p5 oAm u '6 $9 $L o7v sac+B,B +8 u i8e{i8/ $2 $4 $7 O05 O83 '9.6 $p $a $s $s -9 -9 -9 }iBt *A3*57 i78 i71 i6H$p o72 O6B O03 p2 D0 O74 -5 Es3% i6_ $4*87 i5ysg1 *02 *B5 O18 o99 o1zR8 i4z ^M O48 $9+B*B4 u '7 $3 c '7 $9 +4-6 O39 oAX ^i o0T C O03 o67 c $2 $0 $0 $4 c o1@ i1g *17 o0o O36 i6w -2-3 ^9 ^0 ^0 ^2 $a $l $e sGB+7s[n *7By1 c o54 -0-3 } } } } c i73] ^4 ^1 O32 *69 E o6i^g o2p i71 i79 s$bC r *67 O93 ^3 O09 u '6 $8 O9B o2m o7S*12 KoAZ {s`' i47 [ iB*u $C O52 d c $1 $9 $6 $9 i10 ^1 ^0 D4+6 O87 $t $i .4L8 ui9n.A } Y3 O04 o1u } T2 ,3 OB7 l +7+9 s/_sj9 t +0 ss? $b $e ^8 ^1 .A i33 s{csJ^o5i u -A O87 s-. O91 s`2 i77 i71 ,5 o8O O64 -1 -2 Cr *87] o6Wl *2B O82 i11 $2 $0 $1 $3 o7z +0-6 $b $o $x $h $o *62 O53 '6 O54 i5t $m $e $n ,3*1B O34 y2 ,8*75 f '8 O14 sEK,7 $h $e TA*23 O97 *76DA ^1 ^9 *19i8. OA5 -0+3 -4-6 } O04 Y3 ^- ^8 ^0 ^0 ^2 o25 fsm>iBV OB2 sWB } DB o8m o39 u '7 $7 -0+7 c 'A $1 +3 +4 r $0 i76 i71 $I u '7 $6 s;+ O83 OB4 i75 i75 u '7 $9 sC7stj sgvY1szF *A2sTWz1 p5E +7 sZH O3B o5! o7? s{?'9y1 y3[ i78 i70 O41 s.h iA;,B-6 *34^m u '6 $1 i5s $% L9 O41 O81 sO-s}TD5 +A O75 c $5 $5 $5 $5 soi o40 O57 ] ^4 O57 ^7 ^1 ^' *05 O03 '3 d o71*7A ^lsx$+6 $b $a $r O09 { u o2l sdf O24 *1B O75 ^1 ^0 ^0 ^2 O12 *31 i0es=q*B3 +2+7 O32 ] Et i5> O46 O59 ^9 ^6 T1*0AR8 s\+ O81 +2+5 c ^9 ^9 +B +C u '7 O96 sT| ^7 *B7y5 o1! tT8 +0+5 i7k O71 O26 o1- $8s`| d '5 *13 r ^4 ^2 $r $s $f O7A shl $u $p ^2 ^0 u '7 $5 O04 u l ^y ^m shy O85 ^D -7csrM sma*B2 $; -6+BE iBP$3 $h $i $i $s $m o3- iB-]i0m -3 t KR3 o89 O96 O94 +6 l O84 i19 ^C O18 u $4 $4 Y1*18 Z1 O01 +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' O04 T7 r $7 'M c ^0 ^0 o72s+L ^2 ^3 du p3 +2 $1 $4 $4 ] .1 -0K i8! *16-0l *A5o1bs<) i78 i77 $9 $9 $1 -D -D O5A s2` .3 c $4 $u i3_ $5 $6 $6 *19 s K O28 c '8 $3 ^e ^c i77 i77 ^1 ^5 *A7,9T2 ^5 ^0 c Y2 i5f *86^1 +0-4 ^2 ^9 ^9 ^1 ^8 ^2 *05E -9*06 *6A*06 O39 u '7 $0 $p $a ,7sC} '9D3 i3t o1i -3u c $1 $0 $1 o3b o95,7 ]oB's*s *5B]st% o3i *18s-)t -6+8 $K *3A{*01 +E +E $3 $d ^3 ^9 ^9 ^1 o8. T1 O75 s7A Y1s*H[ i74 i73 T3sFq ^6 ^9 *53o9T sY7*36,0 -4+7 $9 $9 $6 $p O02 i70 i78 O58 ^9 ^0 ^8 ^9 O35 ^T u $3 $3 ls^O ^9 ^2 +2+4 oB) sB0 O25 -4+5 s9E^Ac i77 i70 O72 ] T9 i7_ c ^4 ^1 u '7 $4 *29T3*8A o6? u ^6 ^0 l i7+ i73 i70 *56s<-sSe C $2 $2 o3_ O72 *7B i14 $c $a $t *B5u K,7k i7f $" l O0B c $1 $9 $7 $6 *41+5 O28 '4 d O28 '4 Y4 $c $a $r $c $e { [ -9 $9*BAsv* ^a ^f *94T2*7B O93 *21 ^2 ^0 ^0 ^2 -0-7 [[[c i79 i72 o8! i6g s13 ^F sTk i70 i76 O14 d p2 '6 ^Do8b -B,7 *B3T1 -2+3 o0C T4sE`*47 E ^3 $a $g $e s)a D6 OB7 ^1 ^9 ^9 ^1 Y1,4 s9Ci61*37 $P C-B i77 i72 $@$@ OA7 $e $e $t $a $r o78 O1A O91 ^7 ^8 ^0 i8#o13 sR<+4 ^f ^a *56 D7 *06+A { *80 ^* s@%-8 Z2sN& o5e +5+8 O9B o68 $B ^9 { OB6 T1s0W u $5 $5 o8d o7usL? s) sjm srI u '7 $8 s^`c.6 *B0 O93 *64 O82 ] $7 c $4 $4 $4 ,6*90 O84 i4o oAp ]$rs'C o0k $e $x [R9 i78 i72 o0osa} c '7 $7 $3 $0 $0 $0 +2E o97 +8 +A i71 i74 *15 { O52 sh;+9 ss5 se3 so0 $1 OAB $9 $6 $6 c '8 $5 i8_K -6K $0 $0 $3 *40s'I i70 i77 ^8 ^8 ^a O43 u O37 '9cs-D $d $a $y i74 i79 O61 OB1 E *8B,4i9? c '8 $9 O43 O57 sbh sdR s+s O31 o4es#fs1N ^w*13 O31 O69 o60 O92 *64 O74 s?L i76 i72 Y2t c '8 $2 o2y +B*63 R8s>q r $6 ^4s-q u '8 $6 O3B L8 *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 *06 O5B i2n*96 $3 DA Z1s93 sl}u u '6 $0 $$$$ ^a ^a ^0 ^1 ^0 ^2 ^c ^d $1$9$8$4 O2B o2f s#kz1 O24 iA* O37 ] +C -B c $1 $9 $7 $5 r $2 ,5s0. r $8 O43 oAD y4 -5^g*36 O6A Z1 *67 sTW *15 O14 $m *26 O92 O61 O19 i79 i75 *51 O47 *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 O64 -3 } O86 y3 $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 O3B *42 ^6 ^0 ^0 ^2 u '8 $0 i72 i79 O12 ^5 $a $c *72i7a^k o6@ T8s=# D0 O3A *A4 i63 oB` O69 T2 ^7 ^7 i35 i34 u $1 $1 i8;z1 t sB8 O74 sjU -7*82 .8Z2 O8B Z2 o29 ^_ $5 DA sW4[ DB y3 OB5 i0M i1a O83 l i1f O31 O0A sy[[ sPH*56 ^0 ^1 ^0 ^4 ^4 ^c ^e dtsyG c '7 $8 i75 i70 i81*90*5A k OB5 $b $o $b Z3*B5] OA4 T5 sk[*01s=B kRB +7 *03 $m $s ^9 ^8 ^0 *8A] *A5*56s06 O82 i79 i72 i74 LB*57 $1 $3 $3 O94 +B O74 o5l oAk O48 [ *97 O57 O51 OB2 *B0 ^b ^b ^0 ^0 ^1 $E O86 +9 +B i71 i78 T1'9 sp1 O59 T2 *A3y3 $2 $3 $3 l $5 $5 ^9 ^8 *05sXR s1#T5 OA5 s}t O51 -Ai88 o0Z $n$y i8r ^e ^e $9 OB1 D5scv $0 $1 $2 $s $u $n i71 i76 {*4BE ^5 ^9 $d $o $c o3[ O25 iA[ -3 -4 ^m O05 i76 i70 *7B O52 O43 iAP ,3 $r $e $d -8iA( o8q O15 .AiAn u '8 $5 O62 saD u c i4- E Y2 O76 ^4 ^5 i73 i79 $h $u $b $o $f $t *B7*B0,7 ^C*B4s]H ]$A ]Y2 *53 sAg O74 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 } } } oAZ O93 l $8 $5 s39 $n $e $w ^7 ^8 T6 $n O65 i3h '7 $! $! $! ^7 ^0 [ OB5 T9 }s.wo7H } +9 t ^7 ^3 +3-5 } t +9 sh4o5rs!\ k$! s(-'9*62 D6o9BRA O89 l $6 $6 .6 smS O28 -9 s". O1B ^o ^c iB&CiB/ } ss9 *52 O79 o5+ $o $w *0A+5 K.6 $5*76 t p5 ] d t O7A i42 -3o0wiB` $f $a $n i95 o4i *30 o48 *17 *90 ^! O97 +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 s(#Z2 [ *71 +BY1 l $6 $5 ^4 ^6 O62 { *36 'A[ D2 *34 O56 l $3 $3 C $9 $9 u '8 $8 s.7 *B5[ syt u '8 $9 $h $i $p } Y5 O75 c $1 $9 $7 $3 Y1sMk +8 -A $s $e $x O5B O43 ^5 ^8 ^0 u $1 $2 $3 ^zsPo O38 O73 sDQR4 sHi-2 D0*B7*03 L2 ^0 ^9 O34 i1v iAm L9C*79 l $8 $7 $X u $9 $9 +7 *17 +A*6BZ2 ,1{ ^CsBo sqQ O62 ^2 ^4 OB7 p2 '5 c ^8 ^1 iA2 *B9 Z2 O4A $p $r $o $o $f ]s;K sv1*81 ^H ,3$7sU; ^2 ^9 $a $h r $4 *48]$3 i74 i75 o0M *80z1 { O98 *3A y3 o3n O45 KZ1l $! c o3d ^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 O23 O76 s z u $6 $6 si4 O8B Y1 o0R { Z4 '5*03o6f $1$9$8$3 ^5 ^8 +8iB/ ^bsx. r $3 sj{*92T4 D0'AE slisU.*86 $9 $9 $3 Z1 O21 .7 *03 s?.^2 *67sf.s12 o1. u '8 $2 $S l -7 OA6 $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 O9A K *6A *09s?"y3 O31 sbU E o9a i3l *34 K y2] o1I O25 s8. D2 O31 E Z1o97 c $1 ^1 l ^x $x ^x $x c '9 $9 ^7 ^1 ^0 $J ]*16 $8 $1 $8 +2-6 *8A ,A O72 s#d O78 f ^PoB- ^ST8 [^O -7s2eY2 E OB2 *53 ^b ^f $8 $9 $9 $d $1 s_b[ E O49 ^X }sS@ D8+8*B9 ,8l c r *52 u O86 s#tLB*65 u '9 $8 +9*9Asjy *B0 OA3 $. ^4 ^3 +A +C *76 O3A $5 $0 $5 .3 O18 s)z ^6 ^1 ^1 ^c ^C O73 t -B } y4 $y $e i76 i73 s|*$8 i15 O06 s#Y o34sN! O24 $i i74 i77 i75 i76 $! O49 i7V $_ $1 iB- lsaH $p $a $t O96 o22 O96 Y2 c ^7 ^7 }s)7 'N o8z Y1*36 Y2 O9A r $4 $4 i71s!1 o5d *6A $A O93 k O81 O48 i6<^1*B3 l $9 $2 O73 *96 sVLEo5v ]ss6 ^r ^o ^f +A -8 i32 i31 i72 i76 s/A '5 O5B o0Y O71 sx, +1z1 Y1} l $9 $3 fcsBz s(y} o9! o7u o68 o7Z O65 s>C+6K $m $a $p iA>T3 -3 o94 $w $e E]Y1 $5 $9 $5 ^C O81 $k $e $y r*56 *31l O34 sGT [ +6i8a ss_o63 $e $6 *61 +6 O25 s01] $l $s O81 O3A } O69 OB3 c $_ $1 OA5 *75 s29 ^8 ^0 $i $c $e } O95 oA2 y3 E T7 s&2 O19 D7T6 ^l ^A c '8 $7 $k $i $n c ^0 ^2 i72 i77 o11 ^0 ^1 ^1 s0v $e $3 $3 $5 $0 -2-5 s45 t D1$p ^e ^a O49 o2w O43 c $p $i i73 i74 i75 i78 $9 $6 $3 i38 o6Isij ^1 ^1 ^0 ^2 +8 ,9 u c '9 $6 i77 i76 *4A*63 O53 $0 $4 $1 $9 } o1N o1d ss5 sa@ si1 o69 i71 i89 i99 iA4 $b $a $y i69 '6 $6 *94Z3] i5is;_u o2s ^f ^c *08 O93 ^A i8\ *62 sMr O9B $3 $9 $9 O59 Y1 c $4 $5 $6 o0D ^1*6B E O31 ,6 O03 *1A O03 iAJ $5o9V ^e ^f ^0 ^0 $b $u $y O62 Z1 T8 o2m i8a -8 T0 O61 c O28 sbu O13 i35 *A6^!iBA O38 O02 l $7 $8 i72 i78 +8 O7A ^c t c $2 $0 $2 $0 i88 p5 o6o i73 i75 o4a O37 t $7 $4 $7 o8u o6` OB2 t 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 $y O84 $p $e $t i81 i99 iA8 iB9 i6x*28 .6 E $3s*Ho5j s<@Z2s[_ -B -C O81 s18 i2c $p $a $d $s $k $i sAI i81 i99 iA9 iB6 $o $h i71 i89 i99 iA2 c $1 $9 $6 $1 o60 t $y $o $c $a $m T8 O71 o8r.4*A5 o8- *95^niBm *76 O21 O84 OA9 o0T l $a sL[ O62 $e $5 i81 i99 iA9 iB4 $h $i $t -A^8s^U +3-6 svU,8 $5 $2 $5 i8n O91 $f $e *6BsNn+8 o9@ s,\D1 $4 $0 $4 -8 -A i2l s1-swf ^1 ^7 i81 i99 iA9 iB0 +D -C c T2 T1 s\% s!3 O62 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 ^q O96 -A i7m*4A $d $c -3 -5 i79 i73 +0 +1 +2 i2f ^0 ^5 ^0 ^9 ^3 l $9 $4 i71 i89 i98 iA9 O5B o5eEsm/ i4r *5B*84] so!*0B ,A^G sMLt '9 $2 O0B *01 $6 $1 $0 $a $i $d O78 -7 ^4 i78 i75 T0sr; ^0 ^8 ^0 $V i2r $5 $7 $7 ^5 ^4 *A3i0r i2u *34 p3 $6 $1 $5 uT6 K RB O87 c ^4 ^2 c $5 $0 $0 *4B^a i8s [ O91 *18 -0 OA2 s7e*A0K D7 O49 O3A [ 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 *16 O39 R0 O73 +5 ^ksp7 ^lt ^b ^c d r O23 s61 c 'A $5 o8? } OB4 s83 i2. $7 $0 $3 s.6 O62 i3i i50 i51 O07 ^1 u $6 $5 ^0 ^6 ^3 i75 i77 s31 O02 y2 C $0 $1 O94 O72 i76 i74 sFA O05 s$C i76 i77 O8A r[o3d R4k*16 +8Y1*A5 $c $c ^m ^i i81 i99 iA9 iB2 L8 O9A D3 $4 ^7 *93,6 +A*54 ^3 ^3 i71 i89 i99 iA6 i6@ $k $i $t i61 i79 i89 i92 OB1 ,7 sQ} O62 O68 E $i $r $i $s $h -3+7 z4 *30 sl$ O35 O75 [ sWE *67c o8r o1O -0*47 s T E O8A RBE D0 ^6 $5 $1 $7 i36 K O43 O56 L6 O64 { { { { c sp>*68o26 Y3R9 ^5 ^6 oB p5 $5 $0 $9 *15 O8B i31 i72 i79 i74 i81 i99 iA9 iB3 $7 $1 $6 i77 i74 Y5 s(u O36 +1+4 i61 i79 i89 i90 $5 $7 $8 +8sUc o0h .0L8 +6-9 $^ $3 $0 $4 u 'A $5 ^1 ^9 ^0 y1s)X u $4 $6 i61 i79 i89 i93 } c } } } } } } c } O34 s`1 ] $o $f C $1 $0 $j $o $y $d $o $n oBN Y1 O7B $5 $4 $5 $9 $1 $0 $} $5 $0 $7 O81 *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 s9\ O65 [ O12 i4y O9A K $7 $5 $0 O1B $4 $2 $6 [ [ [ [ c sUI[,2 O92 O59 i1H l o7x c ^9 ^6 $7 $2 $8 OA7 *A4 s25 O4A $3 $0 $9 OA6 -0+5 ^8 ^3 *6A^0szQ O05 *B1 O95 ^6 ^6 *15usG/ $e $n $d soa iATEs$d s93 o34 $7 $1 $5 u '8 $1 $2 $8 $6 -0-5 D2TA O32 sOj .7 OB1 ^1 ^0 ^0 O15 c .6 $~ c 'A $3 i76 i78 O45 +5 i61 i79 i89 i96 *7B.7 O65 ^9 $o $u $r o92 srY*90Y1 $5 $4 $0 ^0 ^2 ^2 '5$c $1 $1 $4 ^JiB8o8E $1 $4 $0 sQ+^0*6B i8D O82 -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 O81 .5 o0F Z2spM ,8sxn $g $a $y i77 i75 u $9 $8 OA5 ,8 } o4j*37-1 l Y3 OA1 fsYA sTe $@ OB1 z1l*16 ^3 ^9 o6n O81 s(} 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>^! O62 *2A O38 k O02 O7A O07 c $0 $0 $9 l i5+ l Y1 O92 ^9 ^9 ^9 $7 $6 $7 i74 i76 ss5 so0 si1 $w $i $n '8 $1 u $1 $9 $7 $2 c '6 $9 $t $o $o $1 DB $m $a $r l -3 $t $e $e *18 +0 sQW O9B D1 o7r u $9 $3 s71 o4@ +4 -3 o1U l *69R7o90 O06 O78 O09 ^U $2 $9 $3 i73 i78 r i8A O1B $< o90 'BD1 u $9 $4 $g $s s64 u O9A *7B i71 i89 i99 iA3 s/n*14*26 o2@ ss5 si1 so0 se3 saU O6B D7 szis6/*79 $f $l $y snCZ1 ^2 ^6 ^2 ^1 ^1 y3 O09 i5vR1 D3*09] o45 $t $e $n o6a *82$)o5m $a $2 c $1 $9 $6 $8 Es!( O64 O7A $2 $5 $3 $r $a $n $p $o $p u 'A $7 Z1 D3 T0 O7B ,5 s4$ O72 $! } $$ $i $o $n i5ps+1 $m $y $6s8Wl oB(o90 oAz[^R O42 sGz *7A t OB9 u '9 $1 s3pi0isvm smyD2 o42i60 s=oR7s+% o7_ $5 $6 $0 u $0 $0 'AszO o8Fu c T4 T2 $p $e $n $6 $5 $7 sJ$ T4 O2B l] *24 O24 $8 $2 $5 i68 +2-5 u $8 $7 $6 $6 $7 l$u*A3 O21 i4v ,7 $e O98 *17D6 -0sH( sKJ.5 $a $u $d $i $o $3 $4 $1 $a $b sk!l *6A-9 *82,6 ^l ^a O67 iBe }saB -0+8 c $. $1 *8Ai97 ^7 ^6 ^; $4 $7 $4 ,2'7 i74 i78 i6l s ''5 T8.7 i3d O8B c +1-7 o6u D8 c } } c } } ^T OB5 s&@ ^e ^D r O61 sb- l +4 } '4 $7 $0 $4 u $1 $6 '2 c 'B $1 O96 sg9 $t $o $r $i $n $s i78 i76 O29 O2B 'As\1 o1t $3 $2 $9 o3y .0z1 Z1*14s%t u ] $d $b u $3 $5 $8l i30 i31 O21 *89 k OA2 $6 sMEd $3 $0 $7 ^b ^d O51 o6q o6k i0a i1m Y3 O53 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 C $7 $7 o9_ cDB c '9 $2 Z1sc@D5 ^c ^f p5 -9 c '8 $8 o3S K -9 $?$? O31 $8 ^j O14 *6B -0 O65 T5sW{ *41z1 ,7 O01 $c $s *39 T1 O96 c $1 $5 $9 o4I ,4 OA8 r d O4B i3p $] O5A ,7 sI4T4 $p $a $l ,0 Z5 O67 +1+5 $6 $5 $2 *49 .0 OA4 T4*B3 O39 O34 ,7 O42 o8+ $E*48 $7 $9 $3 $e $r $a +A +A +A $2 $2 $5 o6l $5 l l$* O3A *15 l Z2 -2^w sNb O81 $N O38 $Rs)| sd4i42T8 ^4 ^1 ^1 c ^4 ^4 y1 O45 D5L8 Y1 ,9 s85 ^h O63 o4s $2 $2 $0 K O97 T6 C $8 $8 sae u 'A $2 i73 i77 ^fD9*05 k$? ,7.5 ^7 ^8 ^9 ^1 i17 p2 '6 ss$ O52 OA7 sqm O1A o5u c $< $3 str*3B$. ^9 ^8 ^9 ^1 Y4 *87 O86 i78 i73 ^6 ^8 ^9 ^1 $-$- o1A u $9 $2 s/OT1sZL O28 ^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 $!$@ +8o4a u $1 $4 u $0 $9 DA *65 O89 $d $a $d $7 $0 $0 o6d KsNh u $7 $5 u $8 $6 L3 O31 ] p1 $c $h $i O36 L1 t OA7 ,6T3sXa i82-9 O7A } s/A +5 -3 s8aT6 O62 OA7 o66 *08*6Bsfv o0N 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 u 'A $4 $e $0 $# d s#s $a $7 o8c *72 O46 T5RB $a $n $i $1 $7 $6 ss5 so0 ^3 ^7 $g $o $d u $8 $5 L8 T4o7F-1 $2 $7 $8 *61$3 o7+ c *B7*1B-8 $6 $0 $0 -2+6 iA/ OA3 } O32 O07 OAB *10 i31 i30 i65 i97E $g $a $t $e ]*79 sPM O35 *BA O17 i7? t } Z2 O67 O91 $9 $4 $6 $w $o $o O49 ,6 u $6 $9 o5t u $4 $1 +0+9 ^0 ^0 ^4 C $1 $3 O52 T8 O4A o3w $r $u $n ^9 ^4 +AE *0B $b $c $f $f o4d O09 D5 O95 C $3 *94 O35 f ^b ^e o3. ^7 ^5 '8 $8 o8u$z iB7 OA6 s/Y i1d i1a s[)'6 -5+8 $2 $3 $4 +1+6 $a $s $h i71 i89 i99 iA1 *13oBy*4A i2a $) *0B O72 -Bs;mo0A [ [ O04 [ O04 [ l $8 $9 +3 -1 ^a ^e u $1 $0 $@ $1 $2 $3 u $2 $5 u $9 $7 $9 $4 $9 s4xT4 *13 -8 $3 $1 $2 *84^I .4{r i2s 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 O72 ,3} i69i0w -9 -B [ O45 *31 *49 i5n '5u -0RB*A0 s(j O61 O51 sub o1x *50 OA1 +4 stm+A $w $o $w *52srF $1$9$7$6 T6 O78 l $0 $8 Y2sLQsBf ^2 ^7 *1Aswz*98 u $1 $8 +1 -4 $a $c $e } z4 O87 d O7A *78i68o76 i4u O03 *94 $1 $7 $2 $9 $4 $8 sB4 O31 i8_ o7$ O83 s&0 O8B O79 K O7B R6 O63 i78 i74 i0A i1n c '6 $3 u $7 $1 k Z1 O98 u $3 $6 c $1 $1 $7 y2 Z2 -1-3 l $0 $9 o7d i1l O73 .7 K.6sx9 s/_Y1sH] +1oBi l $7 $3 $1$9$7$0 $f $c $t $w $o $9 $3 $7 $8 $7 $3 T5 O6B i09 O6A c$1$2$3$. i0J i1a i19 i19 c $1 $9 $6 $4 $a $r $k ssmsYtT5 $b $b slr DB O92 i81 i99 iA9 iB1 C $7 o0S ^8 ^8 ^9 ^1 O91 i84 -C -D sg\ sVu O71 O93 oAG t O3B O87 i73 i96 O84 s%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 $1 $2 $2 $! $1 $9 $9 $5 sRG O72 -3-6 ] O53 } u $3 $9 s45 O29 $e $b s17oA& u $5 $2 O79 i2p Y2T8 l $3 $0 i7+ o79 K u $7 $0 O02 sN9 $o $r $e $s $p $a +D +E ts&H o36 d O5A i0a ^K l $0 $6 s|;[] $h $a $m $7 $5 $4 i3o O92 { oAU [ 'A sw% s8L O42 { O79 $v $a $n u $6 $7 o0n c sbo u $1 $7 $9 $8 $2 l $4 $5 +7Y2 Y2 O52 *35^e +A -C c $1 $9 $6 $5 ^4 ^7 o33 ^5 ^0 ^1 l $8 $4 *9B^psmW *75*7B s#Pi0ec O2A sk] T4 u $5 $9 u $4 $5 $r $a $y $1 $1 $5 *8A O1A T6 i8@ c o52 u *63 O93 $e $h u $2 $9 i8. u d '9 *84 *83 $9 $4 $7 *24Y1 u $5 $7 i90 $> o5S sS2 o70 O5A iAw u $2 $7 u $4 $3 $s $i $n oB7 ] O35 o1h T2*0B o1k s_@i99 u $5 $8 c ^5 ^5 o1e [ O1A O7B o0g *4B*67 i5k $1 $9 $9 +0 '4 o1J o8b i59 i51 c '7 $4 u $5 $6 l $0 $0 o30 $6 $9 $6 ^7 ^1 ^1 ^1 ^0 ^1 s[i O36 +0 *83$kDA $c $a $p +D -E i3g $1 $0 $7 { O02 u $6 $1 i51 i52 u $5 $4 skK l $7 $4 u $6 $8 $1 $6 $2 s]z*75iAH i8$$z } O02 O6A -A -A -A sKzs3`{ l ] $e OB3 s#" $h $a $t iAWT7 i2+ O16 Z4 l o9iu +9l *BAD2 *75s q ^4 ^9 ^9 i39 i39 $7 $7 $5 $p $e $r T7s3d O58 -5 i1c i1a OA4 O86 ,6 $6 $7 $4 D4o0b o4o c ^8 ^8 ^8 u $3 $4 $t $e $a u $6 $0 [sqY*76 o98 O8A $l $o $c $k iA! r O79 $uiBjsZ5 $1$9$7$2 u $0 $3 i4d *B5] $i.9 KY2 D8Z1 u $3 $7 $1 $1 $8 i0P i1a u $7 $6 c $3 $6 $0 o81 $yoAS $o $v $a *06sCQ o1z i59 i59 $1$9$7$4 o96 OB5 ssy u '9 o2T $p $i $n ^0 ^9 ^0 u $3 $0 o6$ i92*8A i61 i79 i89 i91 c $! $1 $t $a $g $r $o $d s)e*26*B8 iBr s[%o4!*97 s61 sIu*01 $2 $0 $5 $e [ $7 $8 $3 $h $e $r c ^x $x ^x $x sU6i0N l i4+ u $9 $0 T5oA1s_G oBM O03 oA= o61-9 i51 i50 i7o *26{ $6 $1 $9 svU 'O u $6 $2 sot*BA $e $a $r O29 t*15 f u c '7 $0 O05 i6! i77 i73 i79sxk $i $t $s O43 u *41 -A ,9 O75 '9[ T6 OB4 $2 $1 $1 s8s u $3 $8 szn{s7s u $7 $4 u $7 $2 i8w o0Gs O08 i6e i7d } O27 z1 E $s $e $t p4 o38 o4m so9 OA6 O63 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 $5 $5 $3 *75skY O1A -2 DA O84 { L5 s5w-5 s92 ^x ^X $x $X *52 o0B $1 $9 $8 -2+5 ^Bs0gD1 sfpsVZk u $7 $3 s^" O41 T3 i5@ l $4 $8 T2 O78 o6s O97 sI7 $w O7A $A*6A -7o97 ^0 ^0 ^0 o8;$N $1 $5 $5 -3*26sIT $3 $4 $5 u $3 $1 z1 *76 O31 sjf*58sq+ D9 *86 O56 sa4 se3 i5ey2 ^1 ^2 ^3 ^ns,| *89 *B1 O85 $1 $2 $5 *9A z2 O91 -A*26 '7Z1 u $8 $9 $s $o $l y1^y $a $8 D8$* sp3R4 u $9 $1 u $0 $1 d 'H $l $o $w *75 O72 T2s8' s91 l $3 $4 $0 Z5 u $4 $7 O7B O91 s+v*57sI% -5-8 o61 O51 sy1 i9? K O28 d Y4 l $3 $7 u $8 $4 $b $r $a D4i4i O2A Z2 +8c ^d ^A $j $a $m $e $a $t ,7 -8 o6z $3 $1 $1 l $5 $7 o2I l $4 $6 .5sJ3L9 l $4 $0 $" c $i $r $e l $6 $4 oBe OB8 o9Zs$C+2 $g $u $n c $9 $9 $5 s17 O1B O41 sEL O12 'B *B2 s%]z2sVn O86 *B2 $z O71 OA8 T0 ,9 sLN O85 R9 $a $9 *32 *8B O54 l $5 $0 o9c$s*57 $r $a $t { C ^1r*83 Ksexo1k i3r } Y4 o8e $A $1 OA8 Y1 D4 -0s=M $0 $1 $1 $b $d c $@ s38 {sjoY2 C $3 $3 i2e $1 $4 $7 *0Ati8t i1r $A O98 c ^6 ^2 $z $e $r $o ^a ^D i1o OB1 y1 i6j u 'A $9 l $7 $5 $[ $\ l $5 $3 i4& *93k i5l c ^9 ^9 ^9 ^1 l $3 $5 iBao29l ^l] l $9 $1 O7B O73 ^ds>2 ^7 ^7 ^7 s|'T8 ksH0 i41 p2 O49 } O03 i5r l $7 $6 ^0 ^2 ^1 c $9 $0 $0 .8 O8A s#kDAiA6 $@$# *25s$jLA ^0 ^0 ^8 l $6 $2 O87 ^O i8S $o $l $d O97 +2 *A8 O21 s0K i1a i3a *74*81 E D6 i5S l s/2 [ O82 L8z1 O3A $b $e $t E O64 $a $r $c Z1E s8t{ ^6 ^1 ^0 ^2 o8$ $< $3 $u $s $e u $D { O03 *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 O83 K i9S l o1es2v ^!smI*47 +E -D l $4 $9 i9' c $1 $9 $6 $3 o5j l $0 $3 Y2 O29 i7)T1 o0f o48 l $1 $1 $1 $1 $2 *7A +7 T0 $n O87 -6 sHntp1 ^4 ^8 ^9 i5e i5d sKm$n i8b O78 ]]]]]] c i6e Y2 O38 OA1 s|g*16 *65 y2 O01 o2r Y1oAm p1 i91 i54 i51 $0 $1 $0 +8 +9 +9 K O53 O69 O56 s(O $l $e $d l $4 $2 sO]-0sAZ sUs +7 +8 +8 sq# O3B p1 ^AsOl siE s|vo5s $r $a $m $k $e $n O94 OB3 L8Z1Z2 s/xsF?iA1 O7A p2 E*75 i94} $.$, O42 [ *BA O21 Y1 $9 $8 $8 c $9 $8 $7 ^l ^J $_$_ l $3 $1 s\b D1 O91 skc i33 i31 o3$ +B +D skj O63 sVr *63^6 O48 D6 o1S s6Vo0D o5k y2c D3 O27 -2sA= Z3c sweo9Mo3a p2s&e o7* *63 O14 $0 $0 $9 o6m p5 i5_ c $1 $4 $7 -5sz? *34.6 u $2 $0 sou O35 $_ Y1oBY$1 T1 O58 O72 $. o3s l i3+ o5$ oB/T2 $f $e $e ^9 ^9 ^1 i5o sy\fu ,5 p4 O15 o4aslB +4+8 $i $f ] ] ] $s $b $i $d $,$. y3 O05 o4r sr^$5 t '6 i9. sk*T9*90 ^s ^a i3e i3d Y5$w c} cK Z4 s(q O82 $7 $1 $1 ^4 O28 s

c $9 $7 $2 i6sDA c ^a ^1 *85t swn]E c ^8 ^2 i33 i32 t O03 ^ms+" u O02 ^f ^e *02 O21 i39 i36 ^4 $2 *92 Z5 O45 K *48 ^9 ^1 ^0 -5 O87 *7A o0x i2d i3d i3a c $0 $4 $0 $4 $a $r $m $1 $2 $8 sT%srou .7*1B svn o6t O32 o3c O45 s/4 l $2 $8 T4iA' ^e ^e ^r ^f O8B } oAJ ^4 ^5 ^0 c $1 $8 $1 $8 p2sbB l ^d ^e ^r u T2 ^d ^r ^a ^h o2_ i50 i50 $p $i $g $b $i $n u $4 $2 s}++5 O76 *56 *B5T7 $t $i $c OA8 O82 s"I oBp -0] set .7 O5B swV $m $i $l ^A l T0 o68 ^w z2 O59 o4a o3k o70s`1 Z1*72 y1,B*23 l i6& o96 sQV ,5 z1 ^w ^e ^n o6D $g $e $e ^1 ^2 ^2 O37 t p2 $l [ ^6 ^2 ^2 o6e ,6*30 s.@^W u 'B $0 y3 O07 oB/ u $1 $9 Z2 *6B O53 *A3C $d $a $m O21 o9O O71 s4k K i55 i52 s3A ^8 ^2 ^0 c $1 $1 $0 iA?.A o9+ s4`.6+0 *6A*50 E O89 oA0 oA&$k d O67 $d $2 ,5s.Y r $8 $6 o5( O53 *5A ^m O09 Y2 Y2 o38 *91*B5^A DB $4 i57 i57 ^3 ^1 ^0 $ $1 s67 iBwi5s $5 $1 $1 i55 i54 [ $r O43 *9B O0B O78 ^Z 'B $6 [ O15 $8 $9 $0 c '9 $8 'P i5d i5a *94p2 o7wf D9,5 sg`*A0^0 i13 i12 c $2 $3 $4 ^6 ^7 ^9 ^1 O8B O61 sfB '6 $7 i51 i69 i79 i84 ^yT9 $2 $9 $9 i6h TA+A ,3E s40 $0 $9 $9 K OA4 R9T6+A '6 $5 ^7 ^9 ^6 o01sd2 ^1 ^1 ^9 i52i7k*08 $1$9$6$8 tsgD O43 [ *56*BAp1 [sp@ $2 $8 $8 st$R5 o9-E c $0 $0 $2 ^3 ^3 ^3 *86 O69 Y2stP $I $1 O71 D7t sbli00 y4 O82 l $1 $2 $3 $4 ^d ^B ^4s24 *64z2 ^7 ^8 ^9 Ep4 sKL'5Z3 ^5 ^5 ^1 ]*A7 o7B $3o8k E.2 i8o*86*0B suek $p*B2 $n $a $p O32 { $7 $4 $1 C*91,9 r $1 $8 C $4 $4 $0 $0 $2 $4 D9 s2X o9>^p scU O51 r $2 $3 ^0 ^4 ^4 i64ske] y4 s_4 O43 sq$ OB1 o59i9p stV O98 O5A *A9s25+8 o2h $1 $2 $3 $! c $6 $0 $0 ,4TB[ *93 [ *23 O81 i59 i55 i59 i56 oBv oB3 +5 -1 ^E O05 sH=K ^9 ^6 ^9 ^1 *B6D2$e ^1 ^7 ^9 ^1 sIm.8 K f +8 -7 -7 ^h O24 C $6 $6 $voA7 +4 +5 +6 ] ] c ] ] c '6 $4 Y1sSw*9B c $0 $0 $5 *65o72 s20 ]C y2 l $6 $7 $8 *73 -1 o7k ^r O25 $ps]#E $w*75 i38 i38 i57 i52 -6+9 i7e i7d *89iB}o1e o0v ^h ^6 ^6 ^0 $2 $b O8A i8A *67E *02 ,1 $s $i $s ^4 ^2 ^0 $1 OB2 p5r z2 O3B -1-7 +4-8 O74 o74 p1 l O76 ^4 ^9 ^6 $1shS*4B T6 O9B soF O95 O74 O1B $1 L6 { o0Q Z2 O58 -8i61 T9*36 ^6 ^2 ^1 D2 k *17z2 *10c*93 $- $1 ^X $X i3n -8 o0a OA3 sz=T9 $?*BAoA5 oBj[ i7P s}n O69 sa1Z2 $M $n $f O29 ^8 ^7 ^9 ^1 } } } c $z $a $p $b $1 Y1 O72 O59 $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& o9l $1 $9 $5 O2A Y2 i2_ $5 D8 $0 $3 $3 O0B ] $@ $m $e $s sYi O91 ^4 ^7 ^9 ^1 $o $w $l s56 c $0 $1 $0 $1$9$6$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 OA8 $* '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 Y4 OB1 $($) ^0 ^0 ^5 E*32 '8 $7 O4B z1*A2o8= $j $a $y u 'A ss5 si1 so0 sa@ i4@ 'B,9 *24.BY1 $2 OA2 $m $e $t +5*5B i1b i1e ^2 ^5 ^0 O4B T1 ] l $6 y4u $2 $5 $5 o02 p3 D0 o0k i9,Y4 ^0 ^5 ^9 ^1 l $7 $7 O8B O08 *92T7 O15 .6 d ,4 O96 Y1 *29K s49 O69 sJf $p $a $r $a $0 -By2K C $8 ^E i1l c ^8 ^0 ^l O17 s45 '8 $2 Y5 O47 +2 *80T2*5B *68oA' c '6 $0 [ K o2r [ +B -D $3 $5 $7 *50 y3 ]-8 ^ysVn s'{ O8A *32 ^f } $2 $4 $4 o1s $3 $6 $6 *03iA5D2 D1 o1- { [ [ } *1B O42 K s#\ *71 O34 '9p1 E O16 ^a ] $1 $1 $3 r $8 $8 c $2 $0 $1 $5 s^U$6 o0ns $o7X o6g O05 o9q *40$6 o27 c ^9 ^0 smG OB1 c ,7stG+8 d 'I o4w ] O27 r O07 O16 i01sP\ iBs O83 s@7 i35 i35 OA7 *73 *31 *20 O23 $r l [ ^M l O64 T4 ^1 ^2 ^0 o5z ^2 ^a o6' c $3 $0 $3 O42 Z1 { DB $1 $2 $1 ^9 ^0 ^1 $4 $8 $8 sHWseos25 $f $b OA9 s0/ se@ c$1$2$3$$ y4 O32 c s8' O12 s1U D5c +7 *49 i5s O78 Z3*58'8 s^$l $1 $5 $0 i0i i2m i1a i5"sU4o5_ ,9scU O87 OA2 sr( O32 $n $o $t OA6 ^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 i3a i7a syi $T l o3h o0E l -1 y1 R1 O3B i0J i1a i2n iBN*78i72 oB5 i1y *5B$3 s18 sA. O83 O25 OB3 *78T4s}E O34 s*x t } $U '8 $9 $r $a $w ^0 ^0 ^9 O98 y5 O28 c ^3 ^9 ^d ^f DB $6 sXe*31 -E -F ^2 ^9 ^9 $7+B *9A,3*0A ^7 ^2 ^7 o5B .5 *16 OB5 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 ^7 ^9 ^9 i5h l i85 OA1 s]6Y1 z1EiAo o3_ O23 D2 o1o $/$/ ^a ^x ^7 ^9 ^1 l ] $a D1*20 O03 sc> sco $i $d $s ^4 ^5 ^9 ^1 ^9 ^6 ^0 $b $e $d { *79 ^n ^a ^m i54 i52 O6B s}( D0 O76 $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 $d $o $s O02 ^j i4y O52 sv- s"x O42 $t $a $b $1$9$6$4 *A3^cE ^4 ^c *9A+1 ^8 ^6 ^9 ^1 OB3 s04 +3 sr2*86 iB0sbs OA3 +6 i59 i50 C $1 $5 i7' *A7 O96 O25 z2 u d '9 $9 O94 $4 *AB str $3 $5 $5 $f $1 *05 O03 d '3 p1 c ^6 ^0 sb[Y4 *19 T6 O41 $5 $4 $4 ^a ^B O98 p2 sbT D2Y1 *36LB^x y3D6-B s+< s"p O92 $1 $8 $7 $r $i $p s24 O56 oA; O32 iAe ^1 ^1 ^0 *03 O42 *B5 i7i i8t sVo$" i57 i51 $1 $8 $2 c $3 $1 $3 i6; O02 'A i3c i3a iAS .7s#S +8s>@ o4g C*4B*B8 O9B i52 i50 +4*90 i39 i31 O83 O65 *B3 i6Eso+ *69s&5} t O85 i2k i97 iA7 iB7 D3Z1 i2- u o6, -7 '8 i7x o2H c O52 O13 E.Bp5 D4L9 i4a i5n i6d o6i OB6 i51 r O24 O97 +5 OB4 smk 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 O82 *32 +7 O58 ^h $9 $0 $9 c $2 $0 $1 $3 sAe O47 R0 *67$9 $r $i $g $o $d $e i1A i2W d O0A 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 $5 $2 $1 z2}*A5 l ] $k ^3 ^5 ^0 O21 *5A u oB? c $9 $0 $9 ^9 ^2 ^2 Y1oAeE c $1 $4 $3 *4A *81 O32 *03 O34 *04 O25 o0W s%@k,1 i51 i69 i79 i82 ]*43*40 ^9 ^5 ^9 ^1 $k $c ^g O09 i7a i7d '6 $9 O63 O87 -2+8 o0( ff'A l*03 p1sZf *51$. ^6 ^6 ^9 ^1 ^0 ^7 ^9 ^1 ^5 ^0 ^5 i6z E OB9 +A ^a ^F o1g i8m s)\s9bp1 +4 O49 *82 c '6 $2 ^- s-m $1 O71 c $1 $6 $1 $6 RB O58 ^0 ^8 ^1 y1 O8B i5D l c O42 D6 t L4 '8 $4 $0 $2 $2 i8W*B6-2 sdk*74+5 s-[ E O84 s1qY1} -0 $? T1 { $i $t $e s4g*2BC i0J y4 i54 i54 C $0 *1B^t i58 i51 s14 i4+ si4 }EsLP O43 o5l s$cY2sSc +0-9 $b $u $d '8 $0 .2 sBK O48 o1? $6 $5 $5 c $3 $6 $9 *34$0 i6D c $1 $9 $5 $1 $5 $8 $8 i56 i59 $s $p $y ^0 ^4 ^1 c $2 $1 $2 o3f$o c ^4 ^9 sSX sM! O65 sdgo7a *03 O12 i58 i58 K z1 oA0 O58 O71 Z2'B $w $i $z *32sJ. *72o0e d '7 $1 i9u o1R $5 $2 $2 O8A O03 *72$0 $a $s $k i3H l OA1 OBA RBi6o i3Ll O1B OB4 *23 sE/supT3 $6 $3 $3 ^^ u O97 sau ^8 ^5 ^9 ^1 OA1 ,6 O28 T2 *58 ^8 ^1 ^0 i5d i5e ^6 ^5 ^5 s}t*91$2 +7-A o3rsQ) o0u +1+9 -4iAlsF} c ^9 ^8 ^3 ^6 ^9 ^1 i8u i34 i31 O87 o3a O13 c ^4 ^3 ^2 ^1 o9pstE } ssO o0A T8 O19 ]]]]]]] $6 $2 $2 -Ai61 s*Nl i93 rt [s[RK *20 l OA4 o91 k{ ]]c OAB *02 $b $u $m O96 D1 s39.7 *B4K Y1 O8A ,8 s38s}6 $6*3A K D7 ,3su) o4Y $2 $1 $2 ^6 ^5 ^1 OAB O23 y3 i4p R6*17 $5 OB1 OB1 [ [ [ $1 u d '9 $3 O12 TB $8 $5 $2 *49+5oA? O9B *9A $d $3 ^e ^w ^0 ^6 ^9 ^1 o9r i6~ ^x$xl E K O45 +7+A $f $a $t oAu i35 i32 *54 O84 ^0 ^2 ^0 c T6 T2 T4 E*B7*34 O08 Z4 c $1 $9 $4 $5 $m*24 ]^u *68Y4oBb *83Z1.5 sC_*21sY! $b $u $r sjO*32 o42 O72 Z1 O14 p1 c iB3$w 'A $7 s`Uo2i o4lD6 *9A*65*34 $E $d $r $i $m $l $i $e smV *49 O27 c $8 $0 $0 $c $o $o O38 Y5 t ,2i9E *05 O03 d u $_ o7? O45 +2sAW u 'B $1 D1 ^s -0 -1 -1 o8a s47 *21oB_ $d $6 $r $e $v i8s O82 $t $i $e C $9 $6 *A3 sc3 O43 o2o*B7 ^7 ^4 ^1 i54 i53 *B8o7! c $e $1 i51 i53 -4+8 c ^5 ^9 t K O6A ^1 ^5 ^5 $H l y5 O47 { y2 tK o4? $0 $7 $7 O02 ^w ^0 ^5 ^1 o9i*32 s57 O56 sZI o53 +1 [ [ $1 [ [ c $0 ^0 O72 ] $e $g $o u d '8 $3 -9 -A -A Y5 O63 *98 *A5*72 ^9 ^4 ^9 ^1 O63 { +0 O73 D6 -6 O89 soh ^2 ^5 ^5 [[[[[[[ O9A s9^ Y2 s/z-5 OB1 OB6 *B3 i41 i59 i69 i75 T8^f $0 $0 $6 o2O s_++8sD@ $r $o $b KD7{ o6s ^6 ^4 ^9 ^1 .2*B6 ^0 ^4 ^9 ^1 ] $t 'B $e ] $i $n $g O35 u i8t o11D7sDW y1 O04 *2B .6*B6*16 [ ^L l r $0 $2 ^3 ^4 ^9 ^1 -9i9n ^5 ^4 ^9 ^1 ^7 ^2 ^2 ^6 ^5 ^9 ^1 lsaC c $3 $4 $5 *B8$6 s+dsSZ$5 O86 *6B O32 $m $o $d ^4 ^4 ^9 ^1 d O9A ^6 ^5 ^4 ^1 ^4 ^0 ]]]]]]]] u*3B$V c $6 $2 $6 ] ^a $u $h q ] $6 o6# O14 ^m $v O73 O93 +5$y ^b ^2 i26 p4 o5I i34 i32 $d $9 ^8 ^2 ^1 Z1sN6 y2 O14 -0+9 +5s7N i51 i69 i78 i89 OB2 O19 p2 $9 $4 $4 OA8 ^3 O87 c $4 $m $e ] O34 sp* Y3 OB2 *B1*47 O32 o2. OB6 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 o9r OA4 OA7 O32 ^t -2*23 c $- $1 sC!DA $Ys_;*49 o2P $0 $8 $8 *01 O58 Z1 R3 *76 O52 c^0^2^4 C $0 $9 ^t ^s ^3 ^0 ^0 *12 { $g +6 *16 i7p ^2 ^0 ^0 s0b O83 seu $8 $6 $6 $p $a $s Y5E ^2 ^0 ^5 R5iA{-5 T4 siU O5A 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 o5v $2 $7 $7 ^a ^p i8o ^N l iB7 y4'8sB3 $0 $9 $5 ^3 ^5 ^5 $2 $1 $4 y4 O48 k c.2 *21 O2B ^t O14 Y1y1 $b $a $d ^7 ^5 ^9 ^1 $1 D3 sFI$I O57 *7B +1 oB4 *7ACs;y i7\ TAo3t o6VT1 i4j -6 -9 i51 i69 i79 i83 } Z5 O25 *79 O8B *84 T2 '9 O37 s,7 o8;o0T s17 O61 c ^5 ^4 D4*85E c R1 E OA9 sU_ i4j O23 c ^1 ^9 ^9 o4E l $4 $0 $0 $0 sLM c $7 $0 $0 c 'C $1 D3 o0T i55 i59 l $! sK+^* OA4 sf, .2 $_ $9 $6 K-6 saS *75 *90 O85 ^[ $d $f i3d i3e $_ O2B i51 i69 i79 i80 syj sh@D9 $1 $2 $4 l [ ^B ^4 ^6 ^9 ^1 ^2 ^6 ^0 ] } soAl OB3 o6a *91$@D7 ElLB ^7 ^4 ^9 ^1 sPB $3 $1 $6 { L1 +4svE *0Ay2 ^o ^s ^5 ^9 ^0 y5 O73 E o2Bc Y1 O35 ^9 ^0 ^0 sYdz1o59 O35 *71 *26 *32 O6B o4loBU O36 *9A d ^p O12 o5m y5 E O73 i52 i53 D2 D3 $f $i $n r $7 $7 C $2 $5 -Ak { O47 DA D5 *7A,9+0 i8n O91 O87 $" $s $h $e p4 $u OB3 *43 $j $a $r ^3 ^c ,3sxz ^6 ^5 ^0 +0 +A $e O02 o5A l $d $8 D4*12 ^1 ^1 ^4 i3a i3c l $. $c $o $m ^3 ^2 ^0 O86 .B r $r $a $g O92 s?y ^i ^m $3 $8 $8 O54 -5 OA6 *13 s89 $1 $3 $2 s4t*30*6B O84 l *09 o3? i6 oBEs?, $8 $2 $2 *82 $| ^e ^A l ^e ^e ^r ^f O64 sis ^K i1e *61$isen OA7 i64 *93 i30 i32 D0EZ2 s]>*73 C $9 $8 o6_s!-ss" O94 +B $c $o $p O9A Z5 O58 +1-8 sJ"^J o0s O31 $M ^m ^5 ^6 ^9 ^1 *82-7oBp Z1i3c $e p2 c ^4 ^0 y1s%rc -2*34y4 *49$A i5R D1 O27 Y1*7Bs[b Ks " O02 sGh T1 O56 *A1 $3 $4 $4 s2x*47$j *42,A c $5 $6 $7 ^P O12 '6 $8 d '9 $1 *54s;coAz o0pZ1 *71^m^b soP^Y $7 $3 $3 *78 O62 l $1 $9 ^8 ^1 ^5 -Ac*B7 OA5 $2 sD3 o4i O31 o2W o1h +0 i6m s34 .4c +7*84 c $1 $9 $5 $8 ,3 +3 i8E DA O61 Y1 i1u ^0 ^3 ^0 o0s ^S o1T $m $a $y o0H l *B0 O83 oAS O57 O31 O05 D2*8A$- O04 s&h -A -C $8 $4 $4 +5 +6 +7 s35 O52 -4 -4-8 spF $r $u $m ^1 ^3 ^3 c $9 $9 $8 $2 $1 $5 o0! Y5 f OA1 i5& ^4 ^5 ^1 t D9 +0 D8*12 ^1 ^6 ^9 ^1 +1 +2 +3 i6& i10 i10 Z1 O47 Z3 O23 O76 E DB O12 L8 $r $e $p O16 k O62 iA{ ^ ^1 *30,7*5B -3+8 -2*92 OA3 oB_ $p $o $l i53 i59 K Z3 'A $e O52 O19 o7b c ^1 ^9 ^8 ^0 ^5 o8) +4 O7A R4D2 o1j $1 $2 $6 +2 *02 $1 $0 $2 ^4 ^1 ^5 $9 l y1l+0 $1 $0 $5 O02 D5 DB] i4h *45 i7' $9 $7 $7 i37 i31 c $1 $1 $! $! *65 O47 u d '9 $6 ^1 ^4 ^9 ^1 D7 OA9 sj;*56 $r $a $n $k +7s$k*0A ^6 ^1 ^9 ^6 ^8 ^9 c $2 $0 $1 $4 s/xiB! ^3 ^0 ^5 u $a -3s+W -2D3 i6d i57 i50 *2AY2 s7Mo5ssx9 [ O37 y4 $r d kswn p3 ] s)o^5oB3 ^8 ^6 ^0 $s D7 c $2 $2 $0 +7 +9 +9 o5asEJsMU O58 Y4 sG= $d $4 +7 -6 -6 $8 $5 $5 coAb *12s\1'B [*24 o5r OB1 $3 $7 $7 OA8 i2l O48 O47 soa sWS O63 $t $h $o O04 -1 ^9 ^7 ^0 D1 +0 i7h ^8 ^8 ^9 p1 D5 Y2 O45 sZM *23 O75 O93 $o *65 $s $o $s o8k o01 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'] OBA { y4 o2p OA1 s*B u 'B $9 o09 o0g O36 o4y O0B c '6 $1 i3<.3 sP-*12 i50 i53 o0ToB\ i6f oAa svp O74 OA4 O31 +9 $0 $4 $4 $_ $9 $5 i57 i59 i50 i70 $b $o $o $k sz9i3w c $2 $5 $8 i6% O57 s5? c $3 $3 $7 C $1 $6 $t $a $t $3 $1 $5 $7 $5 $5 *49 O95 i97 sep +5+9 $2 $A D4 D7 *74 O54 sSc r $3 $3 $. OA1 O91 +0 *20 +2 $0 -B o0WT6 i8h } y2 $d } O51 $1 $4 $5 D0 c O31 T5R8sz< ^u ^e siD O32 c $3 $5 $7 OB6 O56 } O08 p3 s5} O73 E s)D O65 s2? ^d ^4 } $d y2 ^8 ^4 ^9 ^1 o9z $t $r $y O76 .B sPT *21sd] $n $i $x $8 $0 $8 .1 k o10o8$ { Z2 +3 -1 -1 KoBq+0 i56 i55 ^2 ^3 ^0 $h [ t O12 o1p OB3 o1a O5A i51 i69 i79 i86 $1 $0 $8 E '8 ]i3k r $5 $5 O14 *61 i3a i1a i4v $3 $1 $3 s1o ^. ^1 u d '8 $6 ] $x O32 *38 i2x +6 -1 o4$ t $7o9'skd i4x $g $e $m *B4E,7 O04 *A3 ,B ^9 ^5 ^1 o4S l +5s{/ *79s!8i64 O23 o9< O5A k ,5o8C D8.4 $d $o $g c*92] ^m O12 $7 $9 $9 ^D i1j D5*76.5 c $0 $0 $6 ^8 ^3 ^0 O2B sy{ O35 sca c ^7 ^9 ^3 ^7 ^0 *AB O45 Ko7K*29 ^2 ^2 ^0 o4p o6w O19 o1o 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 O74 O34 o9$ s{^ O09 i2o i8l *28.2 ^2 ^6 ^9 ^1 i5a i71 $J $b D3 +2 *58s!O*5A [^K s0z ^8 ^7 ^9 O03 Z2 $7 $9 $5 s2ao1i '8 -3 ^6 ^1 ^4 c $7 $4 $1 ^2 ^c $H OB9 *3A o2C K i38 i30 $5 $1 $0 O4B +A u d '8 $9 sQP$s D1 O3A o0r O21 -7 -9 -9 ^9 ^5 ^5 O42 z3 o7p sCyp1 $tssu ^$ *31.9 +8 +8 -9 TA O6B ^C o1a $9 $5 $5 oAy $7 [ s^0o41 $4 $9 $5 *34 O12 OA2 s6. s&% R8$l O94 i0j $z $i $p O54 $6 *B7*19*32 d O2A $9 $9 $8 *3Ao1k c ^4 ^3 i40 sbe O03 $7 ^0 ^7 ^1 R5-A*01 o6t O47 T8 o7E *60 O15 sjK*70 OA4 O1B $2 $5 $6 O3A ^x *A9T7$3 O76 O94 ${o8p ] $d O5A s59 i56 i56 oAYR7 c 'C $5 y5 O5A i1c i1e $2 $5 $0 s3^,6 +7*A9 r} ^ri9y O98 q i3. *32 O54 *9B OAB l [ ^R c $7 $1 $1 ss! o4b $e $e $l O57 $* LB c $6 $7 $8 i7vr +8 -7 +8 ls6k+9 c $5 $0 $5 r $6 $6 K +5 *23 -0 O41 Y3TB o7c$8 D5 ] O14 O32 s`v i0o ^N iB. i51 i71 O97 i92 i31 i71 iBKsK[o0p c $6 $5 $4 ^8 ^3 ^1 O53 s2> T6p4 OA7 $5 .9 o6r ^6 ^3 ^2 ^( $) se|].6 T3*1A ,5E $a $h $a s$O*26i7t Y1+5 o0GT5l *65 O42 s?Di3o iD- i56 i50 $w $i $t ^5 ^6 ^0 R9 O94 ^9 ^8 ^7 O42 $4 $0 $1 $7 i2T l $9 $5 $1 O91 $0 c ^2 ^9 } O04 +7 -9 -9 ^9 ^3 ^2 O72 { i35 i31 i7& Z1 *74 $c $b O63 Z1 c $9 $9 $0 -0}iBN *84 k 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 d '8 $8 .3y4'8 $1$9$6$0 o5LT3 $+$- $3 $0 $3 sIqTA'9 $j $u $n $k ^7 ^7 ^0 u d 'A oB9 *45 O38 c o7I sau p5o5e i47 u 'C $4 i38 i39 c $2 $4 $7 sg5kr *8B] .1spmi8& i1a i5a O82 skJ i58 i50 O45 O23 c $1 $8 $7 { Y3 -B OB2 z2 c iA@ O23 oA( -5 -9 ^1 ^3 ^1 l [ ^S $9 $9 $7 +3sE3 $h $u $g l $2 $3 ^4 ^5 ^5 *03 *34 O12 o07 i4a O52 EiB7 c sa4 ,4 O6B sb2 $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{ 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 O54 O53 t *51 ] o3p ^4 ^1 ^2 C $9 $7 l+9 D1 D4 sk)*B8-2 l [ ^A $r $i $d O98 i63 Y1 O12 y2 $4 $3 $3 ^7 ^0 ^5 ^0 ^3 ^2 i5wp2 $1 $0 $4 i37 i32 i9_ O74 ^7 ^6 ^0 s2. -6.2 c ^0 ^5 *56 D2 O41 k *94 f s0! sq+o2bsD& C +7 O02 ^7 ^9 ^0 *9A OB2 $1 $3 $0 $5 $4 $3 $2 $1 -2-8 iA? ^4 ^0 ^0 i3y *46$R*A0 i54 i59 i52 i55 ^9 ^0 ^5 T8 $1 i7a i7c $1 +B i3Ics.r OB6 sPN DB *B2^h ] OB1 y1 $0 $2 $0 *67 O16 { ^r o6_D5 $A ^a +Bs9B [ o1y c ^1 ^9 ^9 ^1 $8 $0 $0 $0 i59 i58 s[,o0h O41 *36 $9 $3 $3 ^6 ^0 ^5 O42 { -1 -3 -3 ^a O12 O32 +2 s%|*20D0 ]}.8 oA. c $2 $2 $5 sDL ] spr ^4 ^3 ^2 o9n *9A O74 sTl u 'C $2 O02 D3 o4v o1B $-$_ O89 $0 o5* i36 i32 y5 O24 $s $a $t ^a ^t O03 +0 $l $o $p c ^6 ^9 i1e i3e [ o1o O71 s9U ^9 ^6 ^3 O13 i9A o5r*94 o7@ *B7 O58 ^3 ^5 ^1 ^4 ^9 ^0 l*41 .6K[ s#u*97 o80sy3 ^H*0B shZ+1 -2 O32 ]y5 'A $9 i51 i69 i79 i81 C $1 $8 y1u OB5 oAq Y3 $3 $3 $7 $l $a $p -0 *31 ^J D6 ^s oAl O82 o5C l i9@ $8 $9 $5 $0 $2 $1 T0 -0 $1 $5 $4 c $l $6 $7 $7 { y1 i5n O81 +8 OB6 +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 sHoy5 -3-8 $b $o $w o5# i4E l o3I T6 T8 T7 $1 $0 $9 O35 O17 $f $a $r E ^( sIY O42 ^9 ^1 ^6 i2s O02 O6B *16 o7I $l $a $g s/4*43 ^0 ^5 ^2 ^5 ^4 ^1 *70+1 O04 *20 *59*02o0R K *7A DA $0 $1 $4 i3e i3c $2 $0 $2 -9Z1 ^4 ^3 ^3 s23 O4B k O63 ] y5 O63 O14 iBi O03 *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 i41 O24 TB O3B O2A *43 $0 $6 $6 l $0 $1 O81 O06 ^3 ^e *54 O75 O0B ^2i9F*36 ^2 ^d '8 $6 } C ^A i3Y l ^4 ^a o5B l o9p y2 O64 O71 o6s z5 ^q O08 o2x $M l i8K O42 +3 +4 +5 o3S l ^1 ^5 ^0 $` u ^5 ^0 ^3 i5e i71 *30o6, i3+ ]Y2sRE ^3 ^3 ^1 +3+9 ^9 ^0 ^2 o0x*86 u 'C $8 [ t D0 O6B [ o1noAV *75o72 u $5 $4 $5 $7 $6 $6 +C +C +C s0W O04 O07 k k ^s O86 *02 sS] O23 i9l .5 O27 *6A i2r O01 D8 O53 *13 O3A *A8 o58 K c $0 $1 $0 $0 ^6 ^0 ^2 O41 i0j *83 ^2 ^e $i $m $p ^3 ^d $w $e $n ^4 ^2 ^3 i82 i90 iA0 iB3 i4q ^6 ^3 ^3 $0 $9 $0 D7 D8 O82 'A c ^' o05sv} -1+8 c 'A $0 Y3 O5B slt 'Q *6A+2 i60 OA1 $a $n $y $0 $1 $9 [ Z4 i5e i5c *83s%0K k E T1 ] ^4 ^e +0 O12 K Y4 O83 -3*91 u 'C $0 ^2 ^1 ^3 $2 $2 $3 $5 $1 $5 sx,sszo9M i48 $m $u $m ^8 ^2 ^3 $o $a $k .3*3B +2 -1 -1 OAB O07 $. l *60ssz$R $d $0 o6SsLR c $1 $9 $4 $9 +1 -3 -3 O13 Z3 ^2 ^3 ^3 } p2 scs O31 o0t -Ao2b O7A c O34 y5 O08 $1$9$6$2 +7 Z2 ^i ^s i82 i90 iA1 iB2 Eo6ismo o6I i4L $c $o $x ^4 ^b o0Q i9n $v $s *84-4.9 *59i4dsYz OA1 ] i6S s5cY1y1 .2sJN $1 $. o2K i3& i4N $a $g $o E ,2 +0 -A Z1 t O94 $s $a $p $! $1 i36 i36 $. p1 c $9 $6 $3 i1_ *85-4 O26 *6B sO' O61 sj\ O63 sp-p2sTe o0e ^K l o5O .5^u $0 $8 $0 D2 O46 [ o0l +6o0l} ]{r O42 O83 i32 i30 *92sz}i7e $2 $0 $4 O8A $q sxts"p O71 C +3 -9 *43*A9 ^4 ^0 ^5 +8 +9 +8 ^0 ^1 ^9 $2i70 O31 *95 *76 ^8 ^0 ^8 O95 i9y O95 ^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 ,4 O9B [ o0d i6u O97 i4a O31 o92slGsdO Es\m c $@ $2 $2 $0 $9 $1 $a ^5 ^0 ^8 i58 i52 i51 i70 ^9 ^9 ^0 T9*97 i38 i32 s)S*A1C ] *86 $6 $9 $5 ^5 ^1 ^0 u Z4 O48 sok$p ^1 ^0 ^2 $h $a $s $u $g $h +B $3 c ^8 ^9 ^9 ^1 *78sYQ O68 $r i8U sG)iA7 i61Y1E CT9 R0-9 O36 *93 i42 s28*23 *15*05*5A sh2 $d $5 ^3 ^6 ^1 y4oB= $2 $4 $6 $2 $3 $0 $e $l O0A sz\ D3 i25 $1 [ ^1 ^8 ^1 ^d ^2 iB0 i1w s07 o4x $1 $5 $6 d '3 $b $u $t l [ ^J o5o *4A O8B O63 Y5 i9o ^2 ^8 ^9 O03 sb' O47 ^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 o1Y o8# s<|+6 sx[D9 i8I l O2A K [ o3A ^x^X^x$x$X$xl usRPT5 $m sms *87 O9B $4 i1a i3e ^9 ^3 ^1 $2 $2 $1 $3 $0 $5 *01 O06 ^w ^M ^5 ^7 ^1 c ^5 ^0 c $2 $0 $2 $@R7 $3 $2 $0 s#| O82 l o8y s_XZ1 $0 $3 $1 ^4 ^7 ^9 ^DsEU *0B-5 Y3sv$'7 ] $z i5e i5b c $4 $1 $1 o5G oA< 'B O14 s"2*35 +0 +1 +1 OBA *46 y4 '8 $5 $1 $8 $0 ^0 ^9 ^1 } O84 u 'C $5 $q $u $a $9 $8 $6 C $4 $5 $7 $6 $5 i0M O3A ^8 ^5 ^2 O08 OB2 R0*A7 $/ t s-vi3i $2 $1 $7 O23 Z2 O65 O61 t ^B o3H K o7U O01 o8D $1$9$6$1 ,2sNC*4A oAy[ s30 O15 u *12 O31 $d $i $g o8E o1m -0-9 iB3 D4*17 scl,9 iAi +9 OB7 sL1 $2 $0 $3 $4 $e O21 r +3 c-9scD c i51 sb% O28 $i $l $k $3 $2 $3 $7 $4 $4 *2Bo4h+7 l $1 $3 i4m[ ^8 ^8 ^0 OA2 $_ O25 $d $i $s su? i7f ^4 O35 i6$ o8M O65 *15 ^3 ^9 ^6 $b $u $t $t $s sbx c o11 oBJ D5 O45 R0 ] $#$$ o2M c $1 $5 $0 ^8 ^7 ^0 O02 $n *92 O26 $v $1 $0 $6 ^psHf *B8.7sJu $2 $0 $6 o43o6% $1 ^@ *45*7A oB1 O05 p5 C $0 $7 y2R8 'B $4 k $M ^5 ^2 ^4 o5L ^0 ^6 ^1 *67s1. { ^O s4V $6 O64 O72 *61 *12 ] ] ] c i85 ^4 ^6 ^6 i9` D1 OB1 ty5o5' *49 *4A O36 u 'C $7 ^8 ^3 ^3 c $2 $1 $1 +7 +7 -8 OA6 $5 *18 ^6 ^8 ^7 i60 O57 Z2sD{*62 DA OA9 s7D $1 $2 $7 c $2 $3 $2 *25*03 o3i*8B *53sko i97l i1e i5e c $8 $9 $0 +B^u*A1 i7d i7e o47 $b O0B s3G ^r ^e ^p s$.i5asF0 *27se5 O02 $s i8> E O95 ^EEs$' k +2 O18 ,B q }ui9@ ^r ^P sH*$iR7 C $0 $8 O73 *04 $f $x i54 i50 i52 i72 T8 *9A O57 O63 *A5 .9*79 i5c i5e ^1 ^0 ^5 ^4 ^3 ^1 DB+1[ i38 i37 $s $u $e ^4 ^4 ^9 q sRs O65 $3 $9 $5 '8 O14 i7! $5 $1 $8 $0 $2 $5 $4 $1 $4 Z1 O36 *A9spR r $0 $0 lo9h +2 +9 c ^7 ^9 ^9 ^1 KiA+ *27 O15 $g $a $p D0 $Q .0 *15 O64 o3e $2 $3 $2 *A3 O62 O03 +Bo0Z o1J[ $1 $6 $0 $1 $3 $4 $h $a $d slu,2 si' O09 r O72 K O73 O0A c $1 $3 $5 $&$& $7 $0 $7 i8A u $4 $2 $0 $w $h $o $vE $s $a $w o2E *58+2 } O72 o0u k ^d ^i ^m ^9 ^5 ^0 ^1 ^5 ^2 *8Br OA7 i2l o9e O74 OA5 ^9 ^7 ^2 s0A $2 $1 $6 i7A y4 o8A K O53 sF[$2 i3c i3e *23 O3B $@$! o1o D4 i82 i90 iA0 iB7 $1 $7 $0 o15 OB6 o5y O4B o5p $3 $1 $7 ^8 ^5 ^5 i8" *5B*31 *B6-5] O53 o5| Y5 $1shW[ s02 svF O62 $8 $3 $3 $2 $3 $5 O59 ^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 i38 i31 $1 $7 $8 i52 i71 OB6 i7- CsmH O87 *B7 o65 *37o5l *5B-2o8z i51 i59 $2 $0 $7 i79 i52 iA.l+6 $9 $8 $0 $B $e O35 l O65 c sVU o0O O02 i5w RB.1c ^yo71 O12 *0B r $a O97 ^t O12 l T1 y3 O98 O46 ,5 $p $e $a $r s g O34 sM3 l [ ^P l $! $! $! ^0 ^4 ^2 -8 -9 -8 c O32 +9 .9*A3$) ^e O58 c i41 -0 -3 -3 $8 $1 $2 K L9 $g $i $n sU] O02 .3 ^2 ^1 ^5 ^2 ^1 $3 $4 d Y4 i31 i42 i53 o0r ^b O95 l O96 $[$] Cs@ZsH* O39 s)r *79 } O94 k c $6 $6 $6 $! *A4su8 ^5 ^9 ^1 i4a*50 $e O93 i2o O01 $a $i $m oAP-2sp% i39 i30 O15 Y1 s}T +0 O42 i4ns%8 sDUKD2 *43'9 $5 $4 $6 C $2 $0 OB5 *8B u 'AD3Y1 Z1 i0J } $` ^4 ^3 ^0 i5z $e $o $n s03 +D -B o7g i9io6a o22 E ^l ^s $r Z1 T6 k s*h OB6 ^c ^r ^a ^M i3r*0B R0 O5A C *02 $= OB3 ] o0$ *63 O42 $c $o $t $3 $1 $0 i3a i71 o8GsgtoA2 i3e i7e $t $u $b ^5 ^1 ^3 ^5 ^1 ^2 o8t $1 $3 $7 y2-1 O06 $$ *45 O32 i8y $5 $3 $0 C $6 ^9 ^3 ^3 OB7 o8f $7 $1 $7 s)j+Ay4 o9w $9*91*BA i64 i73 i82 $2 $2 $4 s0m i18 i19 ,5sp) s5%*30$. i52 i59 *12*B1 c o10 $7 $1 $0 i37 i30 i7u O09 c ^7 ^8 +2 +4 +3 i55 i50 ^l OA2 l $0 $2 *78 .1 O58 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* i50*86 ^3 ^0 ^3 $ki7R i7a i7a $3 $2 $4 $3 $2 $6 o5=t *70^G ^3 ^6 ^0 C $9 $4 loAmsQR *BA O87 se$ 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 KT9 $3 $1 $8 E.5 ^8 ^1 ^2 -3 -9 $s $i $c O2B D3 ^5 ^8 ^9 o9c $1 $7 $1 ^9 ^2 ^3 i35 i36 T2oA8 iBg OA4 $1 $4 $1 $- c d '9 $9 i33 i30 ,3s.o $5 $8 $7 *35TB +9 -3 Y5Y5 s[= O25 $-sbC i34 i33 $vo6A ]d $1 $5 $1 $K sK1 $6 $6 $1 $6 $5 $8 $9 ^1 ^1 ^2 $!$? $s $a $d O97 i50 s]w i52 i56 i5b i5a $s $e $a $\ oBe *86,5*1B y2 *43 [ y2 sgc ^5 ^4 ^3 ^2 ^1 $e D8 OA2 O63 s _ o4S i2s O32 '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 O51 s28 o5A $2 $2 $7 +2 ^R } $} k o0c OB9 OA9 *B4 O65 O25 O63 OA4 ^5 ^0 ^9 D1 z2 T5*1BK i72 i80 i90 iA7 E,5 O54 Y5 s53 +2 -3 -3 c $3 $1 $1 *49^S O8A s\b oA1 c ^0 ^9 $9 $1 $9 [*04y1 .2 O72 [ $4 *2BR0 s32 $2 $0 $1 $0 $* $9 $8 $5 $0 $3 $0 l T6 $1 $8 $9 } ,2 O46 iA{t c ^7 $7 i5a i7a $f $a $x $8 $1 $0 c ^2 $2 T0 D6 ^7 ^a $a $y $e i1e i3d sgo s68 $p $a $w $n ] O06 -8E l [ ^D *56$3 *8B tiB]K i1s *59D0o5t ,6 o1o ^d ^C $t $a $m ^8 ^5 ^0 +8 O75 -5 u $s i3e i3b s,gD5 OB7 O73 oA$o0j i3a i5a D0 OA4 K c $1 $4 $1 i5N i34 i74 sJ8 ,7 OB6 $1 $1 $! $! [o0T C $3 $4 Z4 O34 i3@ OB2 ^T [ o0o s'V d OA3 ] O16 ^h *89*A5sS' -0 *02 c $1 $7 $1 *20i7j $<$> ^4 ^1 ^3 -B sM< O5B s*Ps@e-4 o0k*82 oA; sFb O82 T1k *B0 k O62 -3 -7 -7 snGo57 -7sla'8 C $0 $2 .3 *81 ^6 ^7 ^0 E O64 O29 sc! ^t O87 $r $a O9B i6A k r O45 ] ^8 ^0 ^0 s%2^B '9 $3 i3C l ,1 O53 o3o ^1 ^c D0stp] ^3 ^6 ^2 '8 $i i35 i30 i59 i52 i23 iA1 +0i8aK $1 $6 $5 ^6 ^2 ^0 +9 +A +9 $9 $1 $6 [i74y2 $B l ,A$_ sS/ DB O39 D7,6 i0KsodE ^b ^3 i9J*42 oB8 ^7 ^0 ^7 $5 $5 $6 u O5A ^t O13 $s O82 i5x i52 i70 ^5 ^4 ^0 L5^7sFq $0 $1 $5 *42 O45 sbm o3n D2 $0 $1 $8 ^4 O5A $v $i $e $g $u $m c ^6 ^9 ^9 ^1 ^8 ^4 ^4 i6d i7e +A +B +B +0 -3 -3 ^3 ^1 ^3 +A -B -B *2Ao3r $3 $3 $4 i6@+A i72 i51 co0M O02 Z2 $6 $0 $6 c $0 $0 $4 sph $M $r +3 +5 +5 [ $d O05 $b ^X $X ^x $x o5N -0 O12 $4 $5 $0 d O46 ,6C'7 oACi1ns%F i7as$S ls10 $l Z1 s.< O13 i6v s1! *4BT5 Z1 O84 sEX s2u .A O96 } *97 smt o1V *24+7 [ $8 i6-s6e *34D7 D0 OA3 z2 l $2 $1 $1 $6 $3 $2 -9 $5 $7 $9 o2a O07 O39 O67 -B u*27 O82 ] ^5 ^7 ^0 }*7Bz2 p4 O4A o2vsd; c ^2 ^4 O73 OA4 O76 *A9 r ^1 ^7 ^0 { K OB5 i50 i55 ^5 ^4 ^4 ^9 ^0 ^3 y2sg1 sdo i42 i50 i61 i70 u 'C $1 +5 -9 O02 $o $7 $0 $0 $0 $9 $7 $6 $2 $1 $8 i79 i51 i1j $2 $4 $2 ^3 ^4 ^4 O84 ^c O18 O54 s79 *31sev*2B c o5. c $2 $1 $0 *20 -0 O2A *23 sv9 O32 Z1 O21 o2z Z2s?,i7S o2b o3O l i3& i9h o4W u $1 $5 $1 c $1 $9 $4 $4 Z2 O86 OA9 D1 Z4 D3 O57 } saT $0 $4 $0 $8 D8 ,3[{ sy!o5+[ Y5 *1A O3B o3O O14 $8*A4 o1p O2A ] O96 O35 O62 *74 O97 OA5 $D O06 +B ,3s<_ *54^m -Ao59 O65 s J E O3B *96 *46 *7Br $6 $2 $5 i51 i54 $5o9e ^6 ^9 ^0 sMH ^3 ^0 ^9 iAZ*61 }s`4c DA.4 oAs -3 -5 -5 $d $e $b $-DA c $2 $0 $3 $0 O86 O53 *02 o2w i6a i7n i8d ^7 ^6 ^6 $r $u $g L9 ^1 ^5 ^1 smb y5 O5B p3 smC $D .B O6A sb^*32 Z1.B ^1 ^4 ^1 c o7- $7 $8 $7 O64 t s76 s$8*61+8 c $4 $0 $4 O31 O0B ^8 ^7 ^7 ^5L7 k ^2 -2sa/s(u $5 [ i6f O59 i3e i1e $2 $2 $8 $1 $5 $8 i3q*13 svxtsB8 sek OA8 *56 O29 d spm O0A O64 -2 l $x Z1 O23 .1 o6q z1 *03 ^S s*] O82 C $0 $6 ^0 ^8 ^4 } o7H ^2 ^f *34i9[ y5 *74 O17 O63 c $0 $2 $7 i71 i51 -5s!0*87 E i0J o6i ^L -8$1 D1 p2 l [ ^L K $2 *27o7u +6 +8 +7 o7j $p $u $t *49i18 [Y4 o9v *7At O03 c i2@ oA$ *1B i2Z O26 u D9 $6 $1 $2 O21 o0y ^0 ^9 ^8 O2B .1 O96 Y2 K ^5 ^3 ^0 *15s;to7# *90s"?o0V $p $u $p sd3$9 sry s(ys5[^E $4 $0 $1 sf7 ^3 ^7 ^7 *32T0sb8 ^6 ^7 ^7 ^2 ^6 ^6 DA D4 o8C*48T7 s]#si1*09 +6 +8 +8 $9 $1 $2 s46 D4 o0m ^j O21 ^1 ^2 ^4 ^e ^N $2 $6 $5 $2 $3 $6 skd *02 O31 i1I i67sZK i9J*40$S +7 +7 +8 o25.2iBn O81 i4t o2N i1p ]-9,B T0 T8 T4 i51 i56 i2X o5e O61 $6 $2 $6 O1A Z3 [,B i72 i80 i90 iA3 ^0 ^5 ^4 ^6 ^9 ^1 $5 $0 $2 D1s2b O8B -6 $2 $5 $4 i71 i89 i97 iA2 c ^8 ^7 sJ}*54 say $u $m $p k -1 O02 D6 O5B O21 *9Bc-A OA2 ] o5K l c $1 $1 $5 $f $i $e +9^d*3B *15qs%y D5 o5o ^4 ^4 ^0 ^i O12 +5 *35 ^X ^X $X $X o4o [ OA7 O51 ^O o8| c 'C $4 O12 .2 ^5 ^6 ^9 .4iAf ^8 ^6 ^1 $1 $4 $2 s+nsb${ O19 ^B c o13 sp; O28 q oA+ Ks!},3 i3i [ i9!l c '7 .5sb**09 O37 y2 R7 -9-1 ^0 ^4 ^8 o1r [ $a k 'B O51 ^1 ^e *97 OA3 s80 c $2 $5 $5 ^5 ^4 ^3 $4 $0 $8 $3 $6 $1 s%*o6@ $d*14R8 $4 $3 $0 *02 o2z s63 u 'B $6 Z2 OB2 C ^r i0D ^0 ^6 ^8 $5 $1 $3 $2 $2 $6 ^2 ^0 ^2 $5 $1 $4 *65sa= i1L +0 D4 OBA *46 oBKY1 o8j $4 $1 $7 O2B o5s $3 O89 i52 i54 i8jy2 i30 i70 i51 i55 siR u i1e i3a O4B R1 i8msrDi9D *80s/2*45 c $2 $4 $6 } $[ $K l ^1 ^1 ^3 ^3 ^5 ^2 $6 [ o7s *78 ^3 ^6 ^9 c $3 $1 $6 $2 o67 s \ O13 i5a i5a [ o0n i53 i50 'A $1 $w $a $x c $9 $8 $7 $6 s5Dl^K $2 $1 $9 s58 i77 i51 sh{$- ^M*93 ^5 ^7 ^7 s74 o1K ^8K c 'A $8 ^3 ^4 ^0 i1f i1e Y1iAq K +4 $0 $2 $4 $5 $0 $4 ^6 ^5 ^2 ^5 ^0 ^0 D1 D2 } } c ^1 ^0 ^3 c $2 $2 $1 +0 +3 +3 c { O65 *79$- ^c ^3 c ^8 $8 i0m i1a i2g ^3 ^1 ^2 O62 c iAf*0B*54 i5l i6e +1 -0 -0 z1 O54 O1A ^0 ^1 ^5 Z3D8 $1 OB3 OA2 [ c O89 T2 ^6 ^1 ^3 o6Z+5 o1s +0 } O34 *A0RBY2 u+7 c $7 $5 $3 ^Bc $5 $0 $8 ].3} s1w O76 D6 O8B z1 o9^ $3 $3 $1 i62 i70 i80 i93 *76s=8'7 i50 i58 o4K D1 k $9 $0 $1 Z1o79 $5 $8 $0 $3 $0 $1 i1e i1d iA2o2y i8d i7i+3o95 ^_ ^1 s6T'AscZ ^9 ^4 ^1 d 'J C $2 $6 s75 ^1Z1 ^1 ^8 ^9 r $9 $6 *46s#*stx ^c ^D O14 E O35 p1 *38 o0F l $4 $5 $4 o0j O31 o3g *46sMrc O61 $y .4 }sD5l ^5 ^4 ^2 c $1 $9 $5 $0 o0P y2 -5 .3 $2 $2 $9 $2 $4 $1 i1e i1e u d '7 $6 $0 $2 $3 o8- -2 O92 o5h c $2 $5 $0 sMj*93*76 s;4c+5 $6 $4 $4 $7 $0 $9 O43 Y1 $3 $2 $8 C $2 $7 sAE -6 -8 -8 ^4 ^4 ^4 O02 O91 ^e ^3 $p $e $e ^1 ^7 ^1 sXNo3w k -0 ^4 ^5 ^6 $9 $7 $8 i78 i51 c $1 $* *96i6S $5 $3 $1 s|ER5 c-Bs3I $5 $5 $2 $-$= o0O oBI^!*51 .8 O83 ^7 ^4 ^3 O46 u +2 -9 $2 $3 $7 s0m O97 y3 [ d O4A $c $f T4*54*B1 i82 i90 iA0 iB4 $a $b $c i0d i1e i2l l C O67 ^8 ^4 ^0 r O02 d E-2 i3L i39 i38 $7 $1 $3 s;j*71 $5 $1 $9 sK% O87 i32 i72 c$1$2$3$+ +2 D1 u o5r .4Ky2 T5 O81 +6 -8 -8 $2 $8 $0 [ *73 c d $5 i7e i7e i0o i1m r '7 ^d ^5 ^9 ^8 ^8 ^8 ^9 ^6 ^7 ^1 ^9 sei ^0 ^6 ^9 [ d smWsCE i1z i67 OA2 sds ,4 O98 *5A*13 ^s-B o4e D5 i51 i5a *29o2v $4 $2 $1 O42 E $h $a $y o1W *80 O06 swF iAX $7 O74 s?2+7+4 $s $1 s0Yky5 o91 $5 $6 $9 syKi99.4 $3 $0 $8 $0 $7 $0 ^4 ^6 ^0 i0d i1r i2a $2 $9 $0 $6 $8 $6 +8 oB[ O01 ^5 ^2 ^5 s'>.4i7( i50 i54 c ^0 ^4 *06o8s$q $y $a $k $# O65 OB6 $4 $2 $5 $4 $1 $6 *20o7?l $2 $5 $9 o8? O52 $6 $5 $0 $4 $4 $1 $2 $4 $0 $4 $m $e *54 OA5 $0 $6 $0 o6A D6 $4 o5' $5 $5 $0 $2 $5 $2 ^1 ^d c$1$2$3$# -1oAi i3n O42 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 c ^6 ^8 $2 $5 $7 O46 o7/ s5^ so"DB ^6 ^4 ^0 s1=-As>^ D1i4e $2 $8 $2 ^0 ^0 ^6 $1 $4 $8 sdt *79 ^p ^5 ^6 ^6 $3 $4 $7 i5a *56 u $b -6sF( O48 i7T $H i34 i30 i56 i54 i75 i55 $5 $2 $6 l $6 $9 p1 ^K O07 O58 *A2 Y3 c $1 $2 $2 $e $m $s $1 $3 $6 *02 D3 ^3 ^4 ^2 i62 i70 i80 i97 s.a$q ^7 ^4 ^0 c $5 $2 $5 $a*79.3 sf| l O23 ^2 ^1 ^9 s#[o5A ^4 ^f -C -C -C o4}ELB ^6 ^2 ^5 ,0 O68 OA2 +8+B ^9 ^0 ^9 *32s,\ y3 O62 O2A $4 $5 $2 *02*3A $u $p $s $2 $7 $0 { $n $9 $1 $8 O91 +A $8 $0 $1 i82oB% $5 $1 $6 $?$! sy]y3s"? $0 $1 $6 T0 ,7 O0B -4 -6 -5 u 'B $3 $8 $2 $8 i56 i57 s^ho21 i09-9 c $x $1 {*03 sRe O64 $7 $1 $8 ky1 $8 $7 $6 ^e O12 *21 *13 st3 O2A ,A l ] $o ,A^q O42 E p3 +6*7B $g $u $t O42 p3 E $4 $8 $7 O72 'B l -2 -9 $7 $9 $8 i30 i35 Y3 OA1 $1 $2 $3 $@ [ i1y [ $2 $9 $0 $7 O15 iA. O98 o0G ^5 ^c ^5 ^a c si1 se3 o7e $9 $6 $9 $8 $0 $9 $f $l $y $e $r *7B*54 $6 $6 $5 *32o9o r $2 $1 oAM O8A r K O59 l ^2 ^3 ^2 *24sE( ^7 ^3 ^3 s/" *65 O42 $Y o62 i0M i1a i2y oBz K,6 Y3 O07 k s71s}i ^1 ^8 ^8 +6 i5l +5 swV $4 +9 O87 i78 iB) $- iB, O96 $5 $0 $3 s-Ki9n$@ s60 i51 i73 ^7 ^5 ^3 c d $3 ] O85 i7c i7a K ^a $4 t c $1 $5 $1 *57c d '8 $2 c $1 $8 $2 *08i75 $0 $6 $9 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 $9 $8 $4 $a*30s/O T5R7 i73 i51 O54 $a sKj s#/ ^M O69 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 +B O65 ^7 ^5 ^7 C $1 $7 *6B -B O72 ^9 ^2 ^5 i5a i6n O4B -3 'A i2A *13 O12 *4A ssn *A6 O61 *BA ^4 ^4 ^1 O72 f o8@s&I*21 ^6 ^2 ^3 $7 $2 $0 d -4 O18 s]9Y1 c $9 $5 $1 $mo7[ D4 O02 $A*8B i6n*5B $5 $0 $6 O23 Y2 c $1 $9 $1 $1 $8 $5 $0 $5 $0 $4 $2 $7 O14 c O19 i71 i5e l [ ^N .7sY% c d $0 T4s3b O25 O67 $u ^6 ^4 ^4 i3a i1e +8 -6 -6 *35sI7 O95 O16 .B ^8 ^5 ^1 *61u s52 $6 $0 $0 $0 s4n ^2 ^8 ^8 k O05 O98 $8 t O28 O31 Z1 *A0 O0B -6 $x $x c $2 $@ o1m o0e o3v $8 $2 $0 *82 c O56 O17 i2i O13 O07 TB $e $k $e o0r o2k *87s$C i5e i5e suh OA2 K c ^x $x o7Y l i5i*B6 i8j ^i ^n o5i D4 $- O4B *2A $6 $1 $3 s;?p5DA iA\ s=Xs&no0h $3*13 sL!o67sJq O4A DA D2lTB $4 $7 $8 .0.6*A5 o04 $4 $3 $1 o8n *02 [ O12 o0p $5 $6 $5 [ O64 *31 O02 $5 $8 $5 sS&{ i6Y $6 $0 $2 $0 $7 $8 $2 $8 $9 i49 o3u D2 KsjK O82 s$Y sB# c $4 $1 $4 i4S O45 *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 ssl oB$ ^7 ^5 ^5 c*80+3 t O56 o1h [ *20 o0l $7 $7 $8 sem *B4 OAB ^9 $6 $1 $7 iA%rR8 *34*90 $1 $9 $1 $m $u $d ^6 ^0 ^0 c $2 $2 $8 O85 ,9 s^KZ5E ^5 ^f C $9 $3 .6E*68 T4*29 ^7 ^c u d '7 $9 ci3o l*83 oAk*02 ^T'Bs#S $l $i $b ]spH[ ^n i1d $5 $2 $8 ,1+0 O32 l O86 $d s70 E.8 $4 $1 $8 ^0 ^3 ^9 ,4} $0 $8 $6 O6A o59 i7y i2b i6Z O02 C $4 $1 $3 $1 $8 $1 R1oA" } O43 $2 $0 $8 i7c i8o $4T7 sE8*37y2 $b OA3 *92iAs o0fY1 i3A i2n [ $n $a o3M ^m O13 sL!f c ^5 ^9 ^9 ^1 ^b O3B o86 +2 +3 +3 oBs $6 $0 $8 -9]s94 p3 Y1 DA$" C $1 $9 O24 $3 O36 so$ $=$) y2 o0m *90o6$ i2v O01 sEm*24^e O82 ^D .0 O53 i9A D2 o0l $6 $2 $0 O52 Y5 O76 $s $u $b *B3-6 i70 i52 c $1 $5 $5 $9 $2 $5 l ] d $c [ i39 i32 ^5 ^2 ^9 } } d .0s+.z1 ^6 ^1 ^2 s0* c $1 $9 $4 $2 c E O39 *18^q -9*A9 *02 o3e c $3 $6 $5 $t O02 $1 $5 $2 i55 i53 ^2 ^9 ^1 +0 ^p i36 i30 '9 $5 o71sV3sLm *02 y5 O82 *43} .9r$x D2 c Y3T0 u O05 o3K .7$4 s)_p2 o3C ^9 ^5 ^4 o0k O41 ^s O13 t O71 O9A O24 *3A [[[[[[[c ^a ^3 R8 O98 o9=o2u $d $i $m ^0 ^2 ^8 u*31s;` ^8 O94 ^3 ^f s[P$E O35 -0 i0s i1u .2*47o0l o8b*79,5 $1 $3 $9 ^7 ^8 ^8 i1'*1A O35 *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 ,9 O45 .B [ +1 '6 Z2 i72 i52 o0V uz5 $* Z2 O52 +3 +3 $4 $6 $5 $3 $0 $2 u O26 O56 d ,5oB+ $x $x $x $7 $1 $2 p5o6r ^l z1 $2 $8 $1 OA5 sGj i3s [ i1e i57 i58 $1 $2 $3 $. D2R7 i6K [ i1z *0Bi2rs5t l [ ^C o2g,Asj, .3D5 $2 $4 $3 $n $a $g Y4 o2y O14 c $2 $5 $2 u d '7 $3 l O3B $1 $7 $5 $5 $9 $0 i69 O56 $s $a $y $0 $9 $1 Y2 O02 s6T*67 ^M O38 i36 i35 O56 ^L ^1 ^9 ^1 [ -2 '9 s5y O78 $# $! O92 $4 $4 $7 *48o4ao5A sarR8s-. ^4 ^6 ^1 i67 OA5 snx $aKk ^w *21 O74 *0A -7 $h $o $g i7g T6 OB2 OB9 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 o9S scV ^t +1 D0 i1h O75 C ] $3 $4 $3 o0f D1 $1 $4 $9 } } c } +7 +8 +9 } L7 E O93 Z2 ^6 ^0 ^3 $b $u $n $0 $8 $9 i0Ts`Z $1 ^! $3 $1 $9 ^p ^l d Y4 O28 i71 i5a o63*97 $4 $5 $8 .3 l t O48 +6 $9 $8 $1 s4R $4 $9 $0 sPA r E O87 *42 ^0 ^c O93 i0V LB O08 sCn O84 i0d i1o i2m c $1 $1 $3 T9*45T6 ^a ^4 i7; d O3B O87 iAv $9 $2 $0 *B3-5 iBbo4u i51 i5e s-S O56 $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 O26 sD# t o2G l $9 $0 $8 *56-BsKU O02 ^g *95,5 DB*2B O21 o2i *12*48 i30 *21 O04 d R9 O3A O24 *96 $5 $2 $3 i2q O31 T6i5q$5 ]Y1*56 *62EY4 O01 *B2 $6 $5 $6 ]D1 $9 $0 $5 i50 i56 $6 $0 $9 $2 $6 $7 $9 $1 $7 O05 s[* O4A $6 O63 sZ$ OA2 D6sq7Z2 *8A O72 $8T5 $k [ oB>*64 ^J l $4 $3 $2 $1 ^2 ^5 ^2 O09 OB7 *51 $3s*4 i70 i51 o5c o1c KiA" $R $1 c T7+6 $4 $8 $6 $4 $6 $8 $h $e $s $l $u $x $e i9i iAt o1' l $b $o $o $k ,2 O34 *46 $d $e $w } y5 O21 LA y2 s81 O1A i72 i80 i91 iA2 $S [ ^3 ^8 ^1 i62 i70 i80 i94 ^9 ^b c ^6 ^5 } O53 siu $6 $0 $4 O12 i0B D5i5- o4K l c $0 $9 $9 $4 $4 $2 O27 T7 i3e i71 ^8 ^a $.$- $1 $6 $9 z1 i1n D5 l sd3 O7B ^A *04 O32 $> c K } } $3 $5 $6 d '8 $3 iAr i5b i5e O14 -0 i32 i33 D5 D7 i72 i80 i90 iA4 $f $l $u +8 -A -A ^1 ^3 ^2 OA1 E D9 $. $1 +2 O02 $5 $2 $9 o2a OB5 -1 ^6 ^7 ^2 $4 $5 $1 *31o9?c s62 ^4 ^5 ^2 $0 $9 $4 ^0 ^8 ^2 u 'C $9 $f $u $r $5 $5 $1 O83 l iA3 s16 i54 i57 $4 $5 $7 Y3iB5 *98 D9 '6stbi7x +4 -9 ^2 ^4 ^1 i11 i11 $4 $0 $5 ^9 ^0 ^6 o7S ^f D2 o2D l T7 $1 $7 $0 $1 $o $r $b $6 $7 $1 .5^w*B2 s"i O65 O24 Z2 s/n iE- $l $v r O19 sie oBd Z1 o2j O02 ^x OB7 i09 $2 $@ '9o4@sI{ ^0 ^7 ^9 } ^M i7/ ,3*B0*26 ^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 *8A O4A } O46 $j O43 y5 s>P u $1 $0 $0 O94 r Z1 c $1 $9 $4 $1 O04 O57 [ i1w $-$+ O97 *32 *4A OB7 ^T c ^6 ^7 ^1 ^b sRW $m $u $g $2 $6 $4 o0* $0 $2 $8 $3 $3 $2 c ^5 ^3 T7 T8 O03 R2 *19 o2m*7A ro6yT9 $v $i $a } $j O46 o2ms)^*70 Y2,B s'%o9",3 $2 $4 $8 i8* s7e*21*04 *68 D6 *67 sFB O81 O69 i4- i37 i39 i7j s49 } O05 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 *10 O69 siu O42 o0j O63 i6n O68 o7- i9P*A3*43 ^\ $6 $4 $5 i3-s63s}# $1*84 k*30 s0o c i2M p4 o9e O61 $8 slZ $! ^1 ^0 ^1 ^8 i62 i70 i81 i92 $3 +8 i1a i5e ^d O13 $5 $8 $6 s6f$? us\h^K sg|K ^N $s O02 ^y $d $r $y ^6 ^2 ^6 $! $@ $# $8 $8 $7 O19 -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 $1 $8 $4 k ^m i35 i37 ^5 ^6 ^2 O32 o0k $4 $4 $0 O73 o1y O93 d '8 $4 o0' *81 O72 $2 $6 $8 $s $a $c ^9 ^4 ^0 u d '8 $7 i2p [ -8 -A -A o0b *02 ^9 ^6 ^6 d O07 -3 -8 -8 'R c $1 $2 $2 $7 *B3 O19 OB6 -A{ o6Kc ^7 ^4 ^4 o2b'B s41 $2 $6 $3 .2 O41 [Y5 $l $a $x O91 O53 *70 ^9 ^7 ^9 +3 -8 -8 +0 -7 -7 *31 '9 sSDTA$Q i50 i71 -9^6 ^9 ^6 ^2 E O36 O71 O84 *65 ^A ^1 RA OB8 RB $8 $5 $0 $4 $8 $0 $p $a $w $s $i $r ] $@ +1 +7 +7 i36 i39 .5sJaY1 *B6y5 sCP *A8*35DB *21 o0m O62 i6a i74 i51 +6szr*3B c $2 $2 $4 $6 $6 $8 $C $b i1a i1d O02 +1 ^2 ^7 ^7 Z2 OA3 -7 $6 $6 $9 +4+9 O05 k *61 $0 $4 $5 ^2 ^1 ^7 sTH oB7 O69 s&k +4o6? +8-B C $2 $8 $6 $8 $7 scz $D $o Z2 O72 $u ^l D2 Z3E $1 $9 $2 O95 O57 ^8 ^1 ^9 ^8 ^7 ^6 } R9 $8 $9 $8 $4 $7 $1 sMv*B2*24 $9 $1 $3 o0Ls,OL9 ^s +2 c ^6 ^3 sGs*01 Z5 '6 O31 ] p1 OA1 $+ -4 *34 O69 ^l c k Y3 $9 $5 $6 $D O85 $5 $5 $9 c 'D $1 $8 $0 $2 l O42 i3! ^3 ^3 ^2 C $7 $8 *B4-2 *24sEk o7' p5$A o0X i1' sP?lo4+ $2 $4 $9 $5 $9 $8 -7*8A $3 $9 $2 ss4^2 d '8 $6 +9 -A +9 O14 suk ^zo7o i50*49 ^B*96 OA4 o3@ sNL r O72 +6 +7 +6 shc ^a ^k i51 i57 r $9 $7 *43 D2 $9 $2 $1 s-= O37 i73 $8 $4 $2 u 'D $5 i4f O58 T5 *06 $3 $6 $3 O03 ^g Z3'5C sog $3 $9 $0 $2 $7 $4 D8 O43 $2 $6 $9 D2 $1 +4 -5 -5 +3 -9 -9 o16 *31 syH O35 O67 $5 $6 $8 [[[[[[[[ O32 l O97 O2A oA6 $h $o $s c ^4 ^5 $. $n $e $t K O32 $4 $2 $4 $8 $9 $7 O35 E O7B [ ^3 ^2 ^3 ^5 ^2 ^3 s42 c $3 $2 $3 $8 $8 $0 sX1 O57 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 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 OA6 i4g O15 $7 $5 $7 *14 O02 $8 $0 $5 D6 O03 K OB2 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! OA9 OA6 *01s'Q i5@ O37 s1? ^2 ^0 ^9 ^6 ^2 ^9 T7d sb6 D7 O58 y2 $3 O92 *B3o8r ssc $)TB s48 Y2o4ei8I .6 ] s1E O32 Y3.8 +2 o0z .9 ] $1 $6 $4 *81^J O81 } *96 OB9 $_ u d '8 $8 +5 -3 -3 +0 *32 c ^3 O2A syI oBS $1 $9 $6 o9k ^S O52 l ^5 ^5 ^9 ^1 +3 C $4 $2 $3 y4sV> ^8 ^3 ^2 o2P l sy_o96 o8f D9 D4 OAB $R *2B c $1 $1 $9 { { { c { C $3 $1 +8 sSm O04 Y1 *12 D0 ^6 ^c ^0 ^3 ^5 ^8 ^7 ^1 $5 $4 $1 $d $u $b o1f O03 D4 sX+ ^5 ^6 ^8 T6 $1 $g $i $g O95 s-8 oBV *69'9 +6s-# ^5 ^8 ^8 *31sgp i40-1 c $3 $3 $0 iA,i6n*5B *04 sai ^8 ^2 ^6 O23 Y3 ^L*A4 i4Zo4zo8} $2 $8 $7 $6 $4 $6 i3S c $5 $5 $6 +8 +A +A ^5 ^8 ^7 $5 $2 $7 o0p OB6 i7u i8n $7 $5 $2 y3 O62 i3D i6b $9 $0 $2 $3 $7 $9 ^1 ^# ^d $D -0 { i3E -8i5bsXP i1a i3d $1 $7 $9 $0 $2 $9 O03 ^w ^b ^8 c ^4 .8$L*2A ^8 ^6 ^9 y5 O1B ^5 ^1 ^4 sJRD7s0; t .2 i5a i3a O45 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 O32 ^8 O0A svo EZ3 o2S O34 *A0 ^c ^7 ^j +1 d O43 ^i O53 i1a i71 $3 t l [ ^T T4*9B ^8 ^4 ^2 ^5 ^9 ^7 $6 $9 $1 o3x $=$= C $5 $6 i3Y O34 i36 i37 ^Es<* t k ^f ^6 ^6 ^4 ^1 $8 $5 $6 O5A iA1 i5G *03Y5*3B Y2K*9A i53 i55 Z3 OBA c $2 $2 $7 ^4 ^7 ^1 c $7 $1 $7 ^u ^y ^b ^4 sI5 *40 O05 R7 O63 +1 i1u $c $u $e ^9 ^7 ^1 $mT6 O94 $) $7 $5 $9 *35 +1 [ T0 O73 sK,o42 +7 -3 -3 i78sS+ +7 $a ^8 ^0 ^2 slg+7,A O02 k i1v d $0 ^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 {ts f 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 c O8A } $3 $5 $2 $9 $4 $0 i28 [ D3 -1 O98 -5 O52 $a $s $p +8 O52 k o16 $a $d $z -1-8 $1-2 sXR*42 s90 o0u ^t $6 $8 $5 s1l $2 $8 $5 *57 c O49 s36 s;NT9 ^2 ^8 ^1 i0co5- s72 i4E $t $o $t sya OA7 O82 $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 O54 *65 *A2 $5 $6 $1 *3B$` $x $d ^2 ^5 ^1 ^d ^7 $6 $9 $0 $9 $2 $9 $8 $2 $7 R0 sn! OB9 o3l ^c ^4 ^c ^6 i33 i73 c $1 $0 $8 O73 O07 Y1 D4 *2AD6 $y $e $n y4 } c $2 $2 $6 O6A -6 *20 o3i ^x ^f C '7 $1 sz6t o3N c ^1 ^2 ^3 $V l o6z O9A D2 +3 $. O03 *21 *20 ^1 ^6 ^5 +1i9f $4 $0 $3 i71 i89 i97 iA1 +6 -4 -4 +A -0 r O05 sf! i5v ^2 ^8 ^2 o4P -7 -9 -8 ^9 ^4 ^2 } z1 O58 c $8 $9 $8 O47 -2 u d '9 $8 o3q c Z2 c o64 ^3 ^6 ^6 $7 $1 $4 O5B *87 sGf $2 $7 $9 c $5 $4 $5 ^k O13 c d $6 O42 oB= $6 $4 $0 sSei0G $3 $8 $0 [ o0z +AsrN +9 -3 -3 .6 O24 ^7 ^2 ^3 ,9*3B $0 $6 $5 i71 i3e o0i +1 $4 $0 $6 i6@ O1A K O02 { u*86K i30 i34 D3 k Y2sUY O84 ssb ^7*76 c $3 $4 $3 *28*A8o35 OA3 i82 *18 O51 $g $a $b $2 $6 $1 ^0 ^1 ^6 i5a i7d i8, ^0 ^9 ^2 T3+B $e O71 tsn(*94 E iB7 O53 ^6 ^a s]" O05 $7 $0 $2 $1 T1 i50 i60 i71 o1q o6O *45iBV ,3*56 *7B O74 [[[[[c i8R l $d $i $p $6 $3 $6 oBoy3o5s $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 o7T *B6-6K '8K o5C i58 i53 ^8 ^6 ^5 s19 OA7 *06 *31 $s *94 O8B scxz2sr4 $3 $8 $6 $0 $3 $2 $2 $9 $1 $4 $8 $3 [ $3 $i $r $k $7 $3 $1 i5a i5f ] 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 O96 Z2o9t $6 $2 $7 u d '9 $7 ^6 ^6 ^5 $7 $0 $5 $9 $1 $5 sGQ^GE +3 +3 -1 .6*8A D0 i2m c $9 $9 $4 $2 $6 $2 $7 $4 $0 i4i i5s c $5 $6 $5 $9 $0 $6 $8 $6 $2 ^9 ^1 ^2 O46 f O73 O06 'A ] O03 c ^8 ^3 c ^7 ^6 O12 i0B u i1e i71 *78 O6A i8s i92 o5& O47 sGQZ1oBc sJP } -0 c $6 $9 $9 ^9 ^a *30 +3 { O92 O72 c $2 $4 $0 $4 sK` O53 $5 Z4 u .2 *48$*T6 c ^1 ^1 ^0 ^2 *46 O78 ^6 ^8 ^5 o2C $2 $0 $1 $1 $. O25 O34 f o2u ^c O13 OAB $d $u $n ^7 ^f .A{Z1 saA ^1 ^1 ^5 ^8 ^8 ^1 T5 $1 D1 ^t *87 k *54 -4 $9 $0 $3 o1| $4 $7 $5 TA O61 O52 o0m { D0i09 o3y [ D6 $s ^5 ^e Z4 O47 Y1 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 sd4 $R O92 O93 K smf *05 O02 i7a i7b oAn O64 o8( c $7 $8 $6 i4\ ^2 O14 i30 i38 $2 $8 $3 $0 $5 $8 ^0 ^7 ^8 } z3 '6$2i6T *79 O7B 'A ^3 ^< ^i ^4 ^0 ^3 c $1 $4 $0 O02 ^u +0 +B spt Z5 O6B $5 $5 $8 i71 i3a u d '8 $4 $i $v $y $4 $5 $3 i51 i78 s9]i4r 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 O9A Y2 O43 $0 O02 o3y rsSjc ^9 ^7 ^7 ^m ^a ^i ^6 ^2 ^8 ^2 ^6 ^3 i38 i35 *96 O83 $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 c O14 O58 ^6 ^6 ^1 r $l *21 o1e i11 i12 O04 y4 i4A o1g O16 ^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 O43 ] ] $1 $2 ^4 ^8 ^5 sT" O43 s83 +2 c si1 so0 l o1i ^9 ^5 ^3 ^5 ^3 ^2 ^7 ^1 ^4 *53 O74 -1 DBz2 D7*23 $yo45T5 d '8 $5 O36 +0 sT6 O03 q $1o3c o6N O27 O95 $A *29o70 $5 $8 $4 *50-8 O65 O96 +0 ^g ^4 ^1 ^9 u d '8 $1 ^6 ^0 ^4 $s O83 $9 $8 $3 u *54 iBa i5o O7A ^9 ^f i6p o6d.9sX{ -3 -6 -6 $s $w $i $f $t szxY3 u d '9 $1 $7 $7 $0 snt ]Y4 i6t-B c $2 $3 $1 $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 Y3 sNB OA9 r '6 $9 $1 $4 ^R O57 O56 u *29.6 $4 $9 $8 o1e o2d ,8saO ^0 ^4 ^5 ^9 ^3 ^0 $8 $8 $6 -0 -A c $3 $1 $2 *7Ao9v$a O84 { Z5 y3 O17 $7 $0 $8 $5 $9 $1 O28 -5 ] $6 $0 $7 u d '9 $4 $5 $5 $4 u d '8 $2 +B OB3 shB -1 *13 $5 $7 $5 o9Y l o0, O94 -8 O09 $4 KE*7B l Z5 O4A $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 O67 o1i i6o ^s -1 s69 ^0 ^f O18 i79 $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 [ $p $e $a $c*B8+5 K*A2[ o7f *95'A $9 $5 $2 ^5 ^8 ^2 i8$ $6 $7 $9 $3 $2 $7 $5 $3 $5 O53 O92 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 $7 $5 $8 ^8 ^6 ^2 L5 f O25 ts&yy4 $$ OA8 O14 Y3 i3j $8 s61 Y1 o86 O82 *20 O32 D7 T0 ^e ^9 +9 -4 ^0 ^a s8D^d-6 i71 i1a i71 i7d i6b O71 sx` OA2 $6 $3 $1 $3 $4 $2 +1 +2 +2 O62 s2x d uT7 ^0 ^3 ^8 ^3 ^7 ^9 c $3 $1 $0 $5 $7 $1 OA9 +1 +9 ,9 s06 oAo $9 $0 $4 s`Q'5,2 i6A i6! *30 O93 i0Ar*93 +4 D5 $y $a +1 o0r o1P skm p1 *82 OA8 Y2 o6_ OA7 ^A T6 i30 i33 s97 L9y3c $0 $3 $8 c ^6 $6 $5 $9 $3 $3 $3 $6 $3 $5 $8 .7R8sdA ^7 ^e ^9 ^8 ^2 ^9 ^5 ^6 u d '6 $5 $w $o $n o0K o1o $7 $6 $8 c $4 $5 $0 z2sZu O27 *12 ^0 ^7 ^4 *6B O01 O1B r c ^2 ^5 ^8 sDAZ1 $5 $8 $1 $0 $3 $7 $7 $2 $9 $3 $7 $0 $5 $4 $7 $D $r o71 -6 O91 $7 -B -D D3 sao i2B $6 $3 $9 $0 $2 $6 $W O59 i1e O87 i32 i37 iB(o2h ^2 ^6 ^5 *30 O32 .1 O39 { $8 $9 $6 s4I O28 p4 *24 LB ^0 ^4 ^9 $7 OA2 *58 $6 $6 $1 ^p i0b d O69 ^C oAB O2B $3 $8 $1 [} i8z $a O91 $r $i $b $4 $0 $9 ^9 ^4 ^3 i56 i58 $2*7AT6 o4c O02 $h $u $m c $3 $3 $5 o9Ql s'; O38 } -9 -9 -A o6zsBK o5/ i76 i51 Y5 O36 ssR D8 o7t ^b ^m O91 i1Q O04 [srv $3 $9 $7 s]b*24 c $5 ^5 $8 $6 $9 .B $1 $9 $4 i6u i7r c $. O06 s(s c $. ^1 $7 $6 $1 $8 $1 $7 ^6 ^4 ^5 kR0 i59 i79 oBy ^a ^5 O02 +2 ^d ^o ^o ^g ^6 ^8 ^1 r ^J $6 $3 $8 o1F u d 'B ^9 ^d -A -B -B } O86 l +0 -5 -5 $7 $7 $9 o6p c $1 $9 $4 $8 $y D8 +8 -6 +8 c ^5 ^7 [ $y i52 i73 o2o o0p c $0 $5 $1 $0 -3 -5 -4 $0 $8 $7 i3t [ y4 O93 D8 $n $i $l scS y5 iBA o0. ^3 ^1 ^9 K,8 Y3*15 o0kk*73 $4 $8 $5 i12 i11 o6N l smI O04 O29 +3 *12 o08 ^6 ^7 ^8 ^8 ^6 ^8 ^3 ^0 ^4 o3n [ i4t i5o $4 $8 $4 skJ *0Ai6ls%7 $7 $2 $3 O42 -0 lT8 ^3 ^7 ^1 ,2*62r sc$*14 ^6 ^5 ^9 l o1e $7 $8 $1 *96*40 $5 $4 $8 o7f O04 ] O15 O5A t { *A2$! $5 $6 $3 O21 +1 *B0Z2 ^Q O05 o8Gf $t $o $w +C -E ^s O14 O37 o3a +9 ^s o2y $0 $9 $2 OBA i9o iAn iBe ^1 ^6 ^1 $5 $3 $4 ^9 ^c $w $h $y u 'D $2 $4 $9 $6 c $f $7 $4 $3 i6b O63 [ $r O76 ^A i71 i52 $9 $7 $5 ^5 ^7 ^9 sgNK ^c ^p i1a i1e u $1 $9 $9 $5 -BiB6 k +1 ^2 ^9 ^6 u -A +9 u -7 -A ] O37 i39 i35 O81 .2 t d '8 $0 c ^9 ^5 $4 $6 $7 c $4 $2 $4 c $1 $1 $6 O36 p2 $n $i $t $6 $9 $4 E O12 O62 $6 $9 $3 -4 -9 o5b $8 $8 $1 $%$% ^2 ^6 ^1 *A0 O69 *29 O48 $_ O41 Z1 s_5 snz o98s6U ^f ^7 O45 L5 z2 $2 $0 $1 $0 $$ $2 $8 $4 +0 +C s0s i78 i52 -1 -2 -3 i3K l ^8 ^1 ^8 *BA s%+ OBA *24sP> d O1A $8 $2 $6 ^s D4 u $5 $1 $9 ,5 O03 l [ ^G O34 *73 $t $i $t $_ $a $2 $7 $6 ^7 ^0 ^2 -4 OAB $2 $7 $3 ^8o63 $l $u $g O84 O52 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 O35 o6. O59 ^2 ^6 ^2 ^f ^2 $7 $8 $2 *BA iB> O73 $y $u $m sTYk $5 $9 $7 T1 TA o0S O51 $! O9B i53 i54 i2s*B8R6 i3x $6 $5 $1 -9 o87 C $7 $6 +0 o33 *A2.1 ^4 ^8 ^2 i58 i56 O59 O72 K $H O47 ^5 ^8 ^4 i7s i8t ] z1 $n $i $p o2R l O02 $*o9. ^9 ^1 ^5 $9 $6 $1 oBHi3a i3a i5e -2 o0d i5$sq<^! $9 $6 $0 $3 $8 $5 D4 o0g s"[TB O72 $1 *34 O52 +6 D7 $7 $3 $0 sa4 si1 se3 ^e O3A ^7 ^1 ^2 -4sC! *02 o1a s-So92$S i5o i6u $5 $7 $6 $8 $0 $6 $0 $4 $6 -5L6TB ^0 ^8 ^7 c $2 $1 $3 o0f O12 +5.B $9 $2 $3 $s $o $y ^j +2 i79 i88 i97 OA2 O96 O15 O68 k O04 ,2 ^0 ^5 ^8 o2D $3 $7 $1 '9 $r $m $e $g ^8 ^c $8 $3 $2 ^J OB6 oA\ O02 ^M i6E OA5 -5 O23 ^s i3a i3a c ^9 $9 *91 sP6 O35 ^! ^1 $n O71 $0 $4 $3 L6c*87 $e $l $m i4w T5 O09 i4e $r $e $f O02 *20 *9B^B $l $y s59 oB!o6z smvo7+ +D +D +D $s $l $y sF=$e D1o45 +7 -5 -5 ,3-3sw) ^7 ^7 ^1 $h $a $h OAB *70 u d '6 $6 +5 D6 s!no78 $+sbu $s+5 o0t D5 c $1 $9 $4 $7 $4 $4 $6 o2V O05 y5 $3 $6 $7 c $6 $1 $1 +5 $d u k *29.0s'} *13 *04 O23 ^K $2 O61 sk{oB8 ^8 ^1 ^3 o0r c [ o2z o2a.B i53 i58 o2n [ CZ1 $7 $0 $6 u d '6 $3 slp D1 i0h i68 o76 O54 $w u d '7 $2 ^4 ^6 ^5 ^3 ^8 ^8 o0b o1l o3e o2u O8B R1 sw] $8 $2 $1 $6 $3 $0 i5f i5a o0k *30 O23 O5B $3 $8 $9 ^2 ^4 ^2 O38 [ seGY3sU. $7 $8 $0 c ^1 ^4 +9 -2 +2 +A +5 *75 *AB *15 O97 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 O83 O47 i7e i7b o0P p5 $8 $1 $4 o6cs*ps?% $6 $7 $6 *86 ^w O52 c ^1 ^8 .2s&l $8 $4 $3 ^8 ^9 ^8 i41 i52 i63 $o $s $f $d C $0 $3 i55 i58 *24*A3 i6M i56 i76 O92 O7A $3 $7 $8 i2D $6 $8 $0 ^3 ^5 ^7 *A7 O8A } $0 $3 $6 $l $e $i $8 $5 $3 o7I]c C $9 $0 $9 $2 $4 $y t *62 O45 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 O28 O8A O17 $7 $9 $7 $4 $9 $3 ^1 ^8 ^2 ^7 ^0 ^4 shm +4 +5 +5 -1 -6 -6 $6 $6 $6 $! oBw ^9 ^4 ^9 O53 u Z1 O98 O65 sbH $0 $5 $7 O76 o4A sNH s}%+7o9' $4 $6 $3 $4 $6 $9 $x $3 } c } } o1u D3 $3 $7 $5 O14 i8[ sEb $0 $3 $4 c 'B $3 $3 $4 $9 iA*r$l $9 $6 $5 C $8 $7 ^7 ^8 ^2 -4 O31 *78 O53 o4T $7 $8 $4 $0 $7 $1 *65E d O05 E O25 i8O $5 $9 $2 c $2 $3 $3 $5 $9 $6 i0h ] o1p -2 $r $e $t $e O29 s!> -3 D2 ] ^n iA6 c $0 $5 $1 $1 +1 +3 +1 oAl{ $3 $7 $3 R3Y1 ^5 ^0 ^6 $8 $8 $2 O09 *94 o73 $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 $7 $7 $1 *54o3h sJ,u i1a i1a $0 $8 $4 c ^4 ^7 $5 $7 $0 $6 $0 $5 ^6 ^3 ^0 O13 o1u svu$B i0Es?5 *70 ] c $2 $0 $1 $6 $0 $7 $9 $7 $4 $5 o0< i8' u d '7 $4 *37*0A*56 $6 $5 $8 $6 $8 $2 O61 O32 $f $i $g ^0 ^b +5 *32 $4 $7 $9 y4 O58 $2 $9 $6 ^6 ^1 ^5 u d 'A $6 O75 O42 *24 O1B *28 ^6 ^1 ^6 R2 -1 O0B i52 i57 $8 $5 $8 c $? o9u ^a ^6 s=/$q*27 o9/ O93 $3 $8 $3 sBF{ $h $a $g *41*8A ^hl ] OA3 y3 O65 K*0A,7 $9 $6 $7 sm? sZg O81 $6 $4 $8 $3 $4 $8 +1 o0a $9 $5 $8 $3 $8 $7 $2 $a c $1 $6 $1 -3 O41 i5e i5f +7 -8 -9 $@ $2 $0 $1 $2 -7 D6 '9E OB8 i0D O04 z1 sqg ^5 ^4 ^5 $6 $6 $0 u*34 ^7 ^3 ^2 i1w O06 T8] ^8 ^e ^3 ^9 ^8 -6 -8 -7 i7a R6 L6 [ o2t $7 $2 $5 i9i O54 $$ O1B O3B O95 K ^3 ^3 ^9 saU ^4 ^3 ^9 D9 D6 *34s-x*3B $8 $2 $9 D5 'B c $2 $6 $2 O91 O14 *15 O42 ^7 ^7 ^8 s9S ^4 ^8 ^3 oAeL6 o0v O41 ^1 ^0 ^4 i0z i1a s"ro4@ i9u iAs C $3 $2 ^3 ^4 ^5 tsZ"} c $1 $1 $! ^f ^3 +A -8 -8 i4* s@z ^D O63 T9 sgQ O03 $p $o $i o2l O31 c $1 $9 $4 $6 D7 D3 *87 Y1 O38 $5 O91 sd- ^1 ^0 ^9 i55 i57 D7 D9 t i0V O03 ^J O14 OBA sMd O83 *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 o0S s@T O51 c ^8 sre se^*64o0Z *76*50 *7B O56 RA*B9l r O65 O6B ^X sFw-6 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 Y4 l O68 $$sc" sli ,3s(P.6 o4J y2 D2 i1D O03 y3 sq] $? O58 ^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 ^4 ^8 ^1 sfs O32 *32 O13 ^s 'A ,9 se- c $2 $! o3W ^. ^a ^w D3 o4f iA0 $6 s19 o1N i5} y2 OA4 +0 +1 -3 $d $i $g $i $t OA7 i6! -6 u d '6 $4 $f $r $o i3W l *53 O5B s7/ ] { .3 -6 ^6 ^6 ^8 O42 +3 $8 $4 $0 -0 -3 -2 -1 $4 +8 i3e O43 D7 D6 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 *6B^E R5Z1 i4h D0 c $3 $2 $0 ^2 ^4 ^3 i75 i51 $7 $5 $6 TD Z1*87 $3 $9 $6 ^0 ^6 ^4 ^p *20 i72 i31 i50 i57 ^4 ^9 ^1 $4 $3 $6 ^8 ^7 ^3 Z3oA;l Y5 O4A O62 o6B $w $i $n $s $0 $9 $3 i50 i72 iAxZ1i1c oA.D9 c 'A C $6 $7 D5sfF o0Ss}s!'o79 u 'C $3 s2ii7 s`$ ^H O78 O34 *74 p2 *3B[ u 'D $8 O25 sL/ Z5 $4 $3 $9 $7 $9 $0 -3 O02 $7 $9 $2 ^3 ^9 ^1 c Y5 $s $i $p $8 $0 $7 $7 $4 $2 ^4 ^2 ^9 +2 -0 -0 i69 $4 o1RD9 *50 O13 Y2s`X O56 { -B s`}*B0o3* p4 D5 c $1 $4 $4 c $2 $3 $0 [ [ $1 [ [ O95 Y4 $s O53 i6a i7s i8d ^F l i3l O03 s]#iB? o0? y3 O32 O34 y3 O34 O32 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 O96 i7x O01 i4s $7 $7 $4 $7 $2 $6 ^1 ^9 ^5 c 'E $1 i3' iA& O95 ^a ^2 c ^1 ^7 c $9 $2 $9 -A oB8 sf\ O48 -5 -7 -7 *8B^E $3 $7 $4 D1 ^d +5 -6 -6 $4 $7 $6 $0 $4 $2 o1k i1u ^S D6 O2A $7 $9 $6 u 'D $0 c o5_ [ [ [ [ $1 sMT $d O02 sDH RA O78 *06 O79 *2B i30 i36 ^2 ^1 ^4 O65 i6t sYD Y1 O02 O15 Z1 ] p5 *01 *04 o0t i32 i38 c 'D $6 *02 o3a sd+ c $1 $1 $1 $! $y $a $m i3k o0d ^S $w $i $g $1 O51 i11 i32 $s $q $u $i $d ^5 ^6 ^5 D4 +3 $7 $4 $8 LBy4 stj s/Z O56 o77 -1 K $9 o4hs G o3D K O17 ^t ^o ^h 'B $l z5tp5 $s $h $y *5B [ O05 o11 k cD6*36 .1T9*94 i5i i6s $6 $7 $2 ^2 ^9 ^5 $yK+5 ^e ^2 c ^3 ^8 o0s k O34 *78 ] OA6 ^4 ^6 ^2 u d '7 $5 ^9 ^4 ^6 u d '6 $0 ^J sd' O56 iB5c $9 $5 $3 $0 $4 $1 $6 $4 $1 i7s T0 O92 o0E s|^,6 ] ] K $0 $8 $2 -7 OA4 o0R -2 r $? $8 $2 $3 $6 $6 $3 DB$0 o5f r $2 $4 o9e O72 o6i O35 Z5 O36 o1f u Z1 $i $_s7j r $2 $7 $4 $9 $1 i0W'B [ i1d $6 $6 $2 $6 $1 $4 ^0 ^1 ^7 ^c ^5 $9 $3 $1 i7* O81 EY2 ^e ^6 o7K i3c i5a *01 *34 K ^8 ^1 ^4 $3 $8 $2 $6 $2 $9 $0 $8 $1 ^1 ^6 ^9 ,3 O63 ^8 ^0 ^6 *A7$ToBE ^4 ^1 ^4 $1 $- +A O91 ^6 ^0 ^6 k o0k iB,{ iBT *45 O64 ^3 ^1 ^8 $r $u $t ^e ^0 $t $a $d $9 $2 $7 $2 $9 $4 ^5 ^6 ^1 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!. OA3 ,B z2 ^q*4A s-Do0O.9 $0 $6 $8 $8 $6 $8 c $i $t $e i31 i3e c $1 $3 $3 ^6 ^e {^xoAR *57 s"7 O51 ^6 ^7 ^9 c $1 $2 $! O24 O67 c ^3 ^9 ^9 ^1 OB1 oBa i7x i5yT8 u $3 $2 $7 o8C [ Y2 ^f ^B s3K ssa .6E*4A i4/ r.3L8 o6o OB2 o2x ^3 ^< i51 i75 *02 ^s *24 $a DA i79 i59 ^8 ^f +6 p3 o5. O41 d D6 E sckiAu$+ OA8 o6+ *49 p3 { D3 } O48 s1< c $Q o6( LA O72 l $s $t $y i2t *A5R6 i6l i7o ^5 ^9 ^8 ^7 ^6 ^5 ^7 ^5 ^2 ^2 ^5 ^6 $0 $6 $2 ,6R9sum oB> O61 *37 T1 T2 T4 T3 ^s +3 *B6D8*67 O2A Y4 i3f i3e OB9 s}S L7 sh(*4B,4 ^a ^8 u 'D $7 $0 $7 $3 s3n^C o0h+9soI i31 i37 C O12 i54 O86 T7 i52 i75 -5 D6 L6s,o $9 [ kY2 O13 $x O2A i0k i1e ss9*8B*02 O5B s\E O75 sq8l$6 o6-s|3 sP3i35 K *65 sd Y1DA O03 O8B y5 saZst",8 c ^2 ^7 sd[ sgk ^9 ^2 ^6 i35 i33 ^0 ^8 ^3 Y5 o1s O07 ^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 ^8 ^7 ^2 ^5 ^7 ^8 $3 $9 $8 ^7 ^6 ^1 $5 $3 $6 ^2 ^6 ^9 sF4 O14 c ^5 O2B Z1 $3 $6 $4 O45 O93 s.V O36 o0t o1h o2e d i2m O23 c $! $2 i7a i3a *54 O14 k +2 +5 +3 +4 c $0 $1 $0 $4 o7ysq{sD7 +0 i1O *31 D2 $* $1 $9 $9 $5 t y3 O56 i54 i74 f E .0*AB ^3i6w 'B $9 ^2 ^0 ^6 z1 O07 y3 sp3 ^_ ^a $6 $8 $4 $@ $2 $5 $7 $2 ^4 ^7 ^2 c $0 $2 $0 $4 'A $6 o3i O02 ^K l O92 ^( O7A $a $p $t $2 $0 $1 $0 $- i1i ^k o1u l O52 o4i ] OAB c $5 $2 $0 [ O62 Y5 O26 *A9 i6% O03 'A $5 $3 $9 ^3 ^3 ^0 ^2 ^5 ^3 O02 o1p d '7 $7 o4P l i6i*27 i32 i35 $5 $4 $2 c ^2 ^8 $s O64 ^7 ^3 ^0 $7 $9 $1 $6 $3 $5 u d '6 $9 $)$) ^9 ^8 ^5 .5R1{ $9 $4 $2 ^z O13 D2 ^r i9d c ^7 ^5 ^3 ^2 ^9 $4 $4 $9 d '8 $9 Z1sw(iB) ,0 O4B O85 ^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 Y4 O1B y4 o3t o0b o7q D1 ^2 c ^1 ^6 s'" OA1 K ^3 ^6 ^5 ^2 ^3 ^9 O42 -4 $8 $4 $1 +7 O82 u d '6 $1 $b p4 Z2 O75 o6k*7B O74 R3 L9 o3w *32 [d*0A ^7 ^6 ^9 $n O82 ^LRB o9O c $5 $1 $0 O72 O6B ^x ^a i31 i38 -9 *98 c $ $2 O4B ^I +0 o4i *A0 Z3 O25 c *21 o8K i7m i8a i9n *35 D3 +4smqZ3 o8Ko2N c $1 $5 $6 { D2 } R2 q ^- $- i51 i76 i61 E Y1 i7( u $5 $2 $9 $f $r $y ^Ds,W s-Ui8HR2 $j $a $w R7 O45 o9a OBA o6d s}z^L se@ o4' c $1 $9 $0 $3 i52 i79 ^@.9 d 'A $1 *84Y3K $0 $7 $5 oB3sbs O04 ^y -7 i3h O71 D0sSaT6 $4 $3 $4 $ $2 d 'K i5a i6m $0 $9 $6 i5e i72 -1 -1 -3 ^2 ^1 ^8 i38 i36 ^2 ^4 ^6 O6B y3 o9f '9 $4 oAE^F $6 $2 $3 o3E ^e ^7 ^8 ^5 ^4 K OB9 Y2 ^6 ^7 ^6 ^6 ^0 ^9 ^c ^8 Y2*76 $8 $6 $1 c O53 o5u i2n k d O54 *36 *67 i54 i56 ^0 ^5 ^6 ^4 ^5 ^9 c ^9 ^7 [ o1t o8, c $1 $3 $2 $4 $7 $2 $4 $7 $3 O16 Y2 c s9! *52 O12 $e $b $b oAk ^u ^A sdk ^9 ^e o3l -0 -0 c $1 $9 $4 $0 D8*3AZ3 +3 O06 i7i o6oK *76s*v o26 ^A O12 i4H c i42 +5 +9 +9 -6 O51 ^v O13 ^6 ^5 ^6 ^7 ^0 ^6 p3 oA} O61 OB9 oAI Y4 i54 i72 -4i7h sFg*54*B4 c $8 $8 $0 sEd OA4 $9 $4 $3 $a O42 +0 +9 +B +B ^7 ^0 ^3 O02 O2B O52 s1g ^0 ^2 ^6 ^9 ^8 ^3 '6 $! $! $! '7 $1 $2 $3 $4 o6b f O62 l s70 *32 -2 $8 $3 $4 O23 +3 ^u ^t ^2 ^2 ^0 ^2 iF- DB O37 +3 -6 -6 -0 -5 -5 u d 'C D1 ^g $J O73 $$ sb}'9 i32 i3e i4d O34 i37 i38 $6 $8 $1 -4 -6 -6 O03 ^e s0x o33 -2 -0 k l s0? -2 -8 -8 o0w O23 i9S ^6 ^6 ^7 c $9 $9 $2 i3t i4o ^1 ^! l $0 Z5 O49 [ o2d $_ $7 *24 O67 o8. o3I *1A OAB ^2 ^0 ^7 sETi8uo0C *09l$- i64] $w $e $l $c $h i2k [ O76 '9 y3 O73 T3 sn]f*2A o9h *1A i79 i54 D7$" i4l i5i ^C*A3*7B ] $P i53 i72 syJ ^k i1i i1i i2s O36 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 O0A o3f r $D'B +0 $s $s $o $x ^5 ^1 ^5 si?s]W'8 ^Jsr_ D1^4 ^urT6 Y1i8? C $8 $5 ^1 ^0 ^8 *40 O42 $g $o $t [ o3s $0 $7 $2 ^9 ^6 ^5 -7$Tk $h $e $m $c $o $b $_sZx O83 [ z3 E ^S sY{*14 i6U i9t *35 O23 sU`Y5s;m c $1 $0 $2 o8Y l O28 $x ^b ^6 o1a ,4 O89 R5oB] '8o3c c $3 $6 $6 ^4 ^6 ^9 O63 k z1 t i79 i55 ^4 ^6 ^8 o43srl $8 $0 $4 ^2 ^2 ^9 f ^n z1 O42 sVY 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 O13 i54 i58 ^7 ^1 ^6 i9T l ^f ^0 i6R c ^5 ^6 $0 $3 $9 u 'D $4 o0z O32 c $2 $2 $9 ^s *15 O2A O56 t c $0 $5 $0 sdl *A6 O37 R6 ^4 ^1 ^6 u d $0 ^0 ^3 ^4 c $1 $2 $4 'A $3 'A $2 $0 $6 $4 $W E *87 t O79 i4C c 'B $7 Y3 O8A O96 O05 O25 s,ao7f$O *35 *24 +0 +5 +5 ,7 O05 o7zsI+ o0p +3 ^0 ^2 ^7 ^5 ^9 ^6 D6*13 i7p O52 -5 -8 -8 O09 O29 r ^4 ^4 ^5 scg ^3 ^7 ^3 ^6 ^9 ^5 i2J c $2 $4 $4 Es+P i9c y5l c ^2 ^0 ^0 ^2 c $2 $6 $6 E O46 *86 O23 *14 +1 -2 -2 $4 $8 $2 $m $o $o $t $h ^9 ^2 ^9 i79 i7e p4 D7 ^8 ^9 ^3 d '7 $2 *A2o6ts!( stp p3 se! ^4 ^2 ^7 $6 $5 $9 p5 O5A o2S E O82 T0 f'A d O79 i6* -0 -1 -3 ^1 ^7 ^4 o8l i38 i34 *01 ^v $/$* i3e i3f $3 $9 $4 i34 i36 *0Bi3k $8 $3 $5 O82 i1j c ^8 ^6 ^c ^9 s[+o69 ^6 ^5 ^8 i57 i53 c $1 T4 '9 $! *A7-6 +6 O42 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 c $* $1 s0a o1O c $8 $6 $4 *21oA} liB{ i55 i73 $h $i $d $8 $5 $7 *BA D9 ^6 ^f $@ ^1 Y3 O78 *58o5t siy ^R O67 $o $a $t c $1 $8 $0 ^7 ^3 ^9 i33 i34 -3c ^3 ^1 ^4 i27 [ $s $u $m ]Y5 i5q ^3 ^0 ^6 $8 $5 $9 $0 $6 $7 o3L O56 c ^3 ^7 ^2 u d 'A $3 c ^0 ^8 K o7t Y1c O32 i5' ] O97 O03 $i O03 o1y i4' O13 i1j sDP'4*48 i35 i75 y3r { i0K o3* [ z5 ^9 ^7 ^3 } O08 +1 -3 +1 +3 i4a iBsE -D -D -D o58i3_*72 +0 +0 +1 +6+A ^4 ^0 ^9 Y2*A7 -6 O26 s?]i0R +1 +5 +5 O57 .7 -3 -9 -9 ^6 ^3 ^6 oA\o9S*35 i7- O43 ^2 ^4 ^9 *B7 sW' O03 K*43 *15+A} o6Y +9 -0 -0 ^6 ^8 ^2 -5Z1oBb D2 p2 *76 O42 $w $a $d O96 s"m } $4 $3 $8 O56 ^n u ^0 ^2 ^4 +7 +7 +9 ^9 ^9 ^4 D6 +6 O03 '9 o5_ OBA ^O l D8 o7h -B$) seu iBzo6?u ^8 ^5 ^6 sFG y5 O02 O46 c Z2 l k O34 p2 o4m r O3B sf}i76+8 O43 d D2 sRE l ^x ^X $x $X ^* $* ^* $* O19 $I sJXq lsi/ O09 O04 s8R i2n p1 O4A i0W O7B ]sU2^E sqVo2e ^5 ^d ^r } i79 i53 ^I*9B sc< u d '7 $8 i3h O12 $2 $c o5 y5 O76 D9s3- $8 $7 $2 ^8 ^2 ^9 i3a i3f *97*87 $9 *31 OA4 -4 O12 ^k t *A0D6 +1 +3 -0 ,B O6A $Q +3 +5 +6 +4 $f $e $d E ^T o4l D3 O03 d '3 p1 c $1 $5 $3 sy7*51} ^8 ^7 ^8 c ^3 ^7 i4e O13 c$1$2$3$? 'Ao0X o9]*14 i73 i53 O28 d '4 Y4 ^7 ^6 ^3 { c ^2 ^3 ^7 ^2 ^3 ^6 *64 O53 $a $f $t i3e i7a ^7 ^7 ^2 ^5 ^9 ^5 c $0 $! O72 O41 ^8 ^4 ^6 u d '7 $1 ^1 ^2 ^8 $8 $3 $7 i59 i57 k ^n *30 -0 $. O81 i3a i3e +2 -A o0r ^E D3 o0b ^6 ^6 ^3 ^3 ^8 ^3 i73 i52 } ^a ^1 ^6 ^2 i8a D6 O51 O72 D9 +6Z1 z5 O25 o3X l k O12 EY4 sdr*96$1 L4R3 o5$ OA8 $5 $7 $4 i7i O34 [ *31 $2 $0 $1 $5 { i7` $6 $4 $7 i72 i5e $n $u $n o6/ l o3e i33 i39 O19 s$^ skt { c { tY4 o7Z o2k [ [ i4l R5*58 O3A $^ *51 O43 *B8 DA -A i9m *10o0M i34 i39 -3 *43 O5A ^" D8Y1T5 $2 O42 OB5 ] Y1C z4 $u O06 *54Y5 -6 -6 -7 c $5 $4 $3 O34 .3 sG'.3 ^7 ^9 ^5 L1 o0L *41 O21 +3 +8 +8 i5c i71 ^9 ^0 ^4 c $3 $5 $3 $r O73 ^7 ^2 ^6 '9 $c O61 D3 OA4 s%}c-3 o1g D0 ^B s5- T0*76 i0d o1h sbp s}\*85*0B sYv+6E .1 +2 sgp $3 $3 $8 i5* +5 -8 -8 $4 $a $l $l p4 [ $n $t $h c 'C $9 $2 $0 $1 $0 $+ u O97 *B1 *02 O62 +7 -0 -0 c ^2 ^9 ^9 ^1 i4! z4 O06 $u c i67 E $W i9 $1 ^6 ^8 ^4 o6T i32 i39 sG|'7L7 +B O92 c $0 $7 $0 [i0pTA o3r sZ" O91 $8 $4 $7 +B +C +C ^5 ^6 ^4 R8D3 c $4 $8 $8 y5^b ^X O37 '8 Y3 +A O9A p5 ^3 ^2 ^6 i87 i51 i74 o5t ] O9B ^d i4= O34 $6 $3 $4 o2r k +0 -6 -6 +4 +6 +6 ^1 ^8 ^3 $c $u $r o0k O61 $b $o $p +1 -3 -0 O61 O87 ^6 ^2 ^4 *B4-6 O0B } { 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 O32 p2 O52 D7 $cp5 soz ^at ^9 ^6 ^8 +6 -7 +6 ^xsxM ^2 ^2 ^4 i31 i3a CKs"W O03 $n O12 'B Y1 ^3 ^5 ^4 O48 [ i3a i4n *32 ^s svTsWw ^2 ^4 ^5 o6v ^Z O06 $5 $9 $4 s9z $$ OA1 i10 i11 ^6 ^6 ^2 *B9{t .2 O63 o6C -0^h $e o9l $n $u $b RA$`u ^2 ^3 ^4 ,7,5 s'*s2x $F $m l ^w ^e ^n O13 i1r s)y O28 ^( i61 i79 i88 i94 i4q o5u i2l i3i ^d ^6 i59 i54 +1 o0A s1t i81 i99 iA7 iB1 *13 D1 'A $0 o5S*93s>I O75 +6 s`B*89i7! ^9 ^7 ^8 O45 o5E D6^MD9 o8q ^e ^5 o1j -2 o0p -1 i3a O02 i6J DA $s i79 i58 $1 +8 c $2 $0 $5 +9 i91 ^8 ^5 ^3 oAx sN>z2 O57 sJb O17 *65 D0 tsf> DAY1 i79 i56 i0J i1u i2n l Z1 OA8 sH2 O05 O34 O64 *89loB& i56 i71 *04*02 o9? OB5 O86 o5b p1 O64 O4A c $5 $3 $5 c o5c k ^h c $2 $0 $1 sZT ^2 O4B i0(sX. o3H sM/*95Z3 c $2 $8 $2 s{XscE z3*A2 c ^3 ^5 i2i O5A $1 $0 $2 $0 *80D3 c $6 $8 $6 o0X O7B sYf s;w^Lo93 '5 Z1 ^s *41 s0+ O61 ^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 Y5 o9i O5B d '9 $4 s,aT0{ +1 ^l o4y +0 $W l +A O82 O94 O06 y1 +0 l $7 $4 $6 i9_ ^7 ^9 ^2 i70 i50 $_ { O95 ^X D3 o0h R1+0 o09 k i59 i76 +0 ^i ^0 ^e O59 *48 +8 l i39 i34 oB#Z5 o7l D8 o3G l *31 +2 t T1 $5 $5 $5 $5 d O63 +5 O62 o6= O75 $e s=C'5Z2 $8 $5 $1 ] ] ] $a c $. $2 ^5 ^5 ^6 $o $a $r [ ^h +2 *47*91 $s O94 s84 s82 c o63 ^1 ^4 ^5 [ i2k r D1 s J O92 +3 -0 -0 O24 $5 O05 ^j sE@+3iAr O01 o3e -4 *45 Z1 $A i5= oA@ oBA i7X ^9 ^4 ^5 +B +B -A o3t ^s c $6 $1 $0 *9A O73 O32 i1e i2V ^9 ^6 ^4 i7msBS oAH O76 $@$$ {$0 O67 l -5 *65 *32 c -7 l +1+A [ o3z y2 O43 y4 $y O94 i52 i60 i70 i87 c so0 sa4 ^f ^9 O6B R6 z5 O27 'A O41 *57 O76 O02 o1z ^TsAk Z4 O24 D2 O48 D2 $4 $d o3( o4& $b u $a O73 o5mK o8>Z1[ C '8 $1 E O15 oAP O62 ^G .A ^1 ^4 ^3 u $g ^5 ^7 ^6 y3 +0 O25 ^5 ^7 ^4 *B0^,sgw DB l i5j O45 ^3 ^9 ^3 i31 i39 i52 c o74 *97 ^A c scf T6 OB9 *02 O42 oBl i6m O91 i5e i7e *24}o5R ^8 ^3 ^4 s)Cy3 d O47 i37 i33 O42 .6 ] c $1 $0 $7 i9S O76 O21 -0 $3 D3 -7 *73 o76 s6z s@( O26 c $2 $1 $4 oAz $6 OB4 z2 O86 ^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 O23 i4r [ O71 O15 t $7 $3 $6 *64*19 C $6 $2 i61 i79 i88 i90 sjt-8 *6B O49 O62 *68 u O03 c $7 $7 $6 s9Ks vZ2 $7 $7 $3 c ^0 ^7 O02 ^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 r $1 $9 -3 o0A i7s i83 i1o i2t s Z2 O84 *17 -6 soh ^a ^h *46 O6A c $3 $9 $3 T7 i2r O43 i1v O72 l ^d ^o ^o ^g o5a O32 $1 $9 $9 $1 $! shk+7 k ^j *14sa\DA O82 o1t i7Q*43z1 O15 *BA E *8A D8 'A $8 c $9 $7 $3 'B t o0p o3e o3i *16 ^x ^A -2 i3h ]]]]]c ^0 ^9 ^3 c $4 $6 $4 ^8 ^2 ^4 ^8 ^9 ^5 ^7 ^1 ^8 ^d ^1 ^# ^@ ^! s`9y4 +5 l KsCu s-k O73 oAn ^5 ^2 ^0 ^2 ^d ^9 o3T i61 i79 i61 i79 i88 i92 ^9 ^3 ^7 c $3 $4 $7 i71 i50 +0 +7 +7 i53 i76 ^! $! ^4 ^5 ^3 s6@ c $3 $8 $8 i37 i77 $a $u $k i38 i33 o8p i8F i52 i74 s76 c *53T5*31 i5i T0 $R O79 sb( i4T -2 -7 -7 y2sJR -8 '9 Z1 *90u *35 O43 i7s l O31 o3a T6 O37 p2 ^4 ^5 ^8 i33 i37 O03 O64 o81 '9 ,3*A5 o3g *30 $d $u $e O58 OB9 [ $v O65 .8 s"P $b [ O28 c o7x O12 i1j ^4 ^3 ^5 o13 -3 O6B ,B o2t k z3 O74 *6A Cs^G] } iBB O82 s[&o6 s0n O03 .7 *93^J*78 +A -B +A ^5 ^9 ^2 ^2 ^2 ^6 $n $a $y i71 i89 i98 iA4 ^5 ^1 ^8 OA2 i96 ] i1F O65 +B Y1 iAQ*74 Z2E i1e i1a s'r*73 O41 *1A R3 i3d*B0 sumZ4s&( *74 O32 ^4 ^0 ^7 O95 O47 t O52 ^b ^E c $0 $1 $7 *57 o7a $6 $7 $3 ^E O16 ^5 ^3 ^9 $!$" D1 ^b O03 i2t $l O62 i6_ -7 i7T Y1DA ] $p ,BszCs3G O69 *78 oBL ^RiB* *81] i9r ^CZ1 i29 sis O69 O17 y1 Z2 s27 O7B *51 $! -3 ^J $G O59 c $0 $1 $! [ *23 R7 OB6 +3 -9 -8 s!O^J *53 *46 OA9 y2 *09'5 $c $4 smdoB$ $N { l $x $1 O74 O74 *B8 O04 O31 ] R3 ${s6A D1 o2c i4d i5i T0 i7_ i0b i1a i2l ,7-7s | o4E ^3 ^2 ^4 ^3 ^2 ^8 { s ) O27 T9{ O62 +0 $l { o3f [ $.$/ OB2 *7B *02 ^2 ^6 ^4 O59 t c $3 $9 $9 $1y4 O1A R9 i46$7 c $2 $4 $5 *36 O32 i5f i5e o5Z c $5 $5 $9 $F $c *B4 O29 i6N c $1 $6 $0 c $9 $2 $2 i6W $c $t $e O53 -1 *12 i4i i5n i6g o8M l +8sV7 E K OA6 i29 -0 L2 $9 $8 $7 $6 Y2T0 D6 ^s -1 -2 -2 i5e i1e ,6*46 ^1 ^7 ^8 -7 -7 -9 ^5 ^8 ^3 O45 R1 +3 +3 +5 ^6 ^8 ^6 iAi t +D +F ^1 ^5 ^4 +B+7 ^S OB3 $B O46 *47 f O76 i4l i5i i6n ^p -2 -0 ^d i8?.0 r $3 $4 ^4 ^3 ^4 ^m D4 o0t *54 ^8 ^6 ^7 O13 T0 Y3 t O4A *23 -0 ^9 ^1 ^3 s%,k ^2 ^9 ^7 ^4 ^6 ^4 sBH +6 [ o1K [ i6_ +7 s2- *20^rs9J u O45 ^L.Asj+ *27$6*6B o1br i9R z1 +1 $1 $2 $! $! $2 $d y1*A2 o0M D3 i5e i3e o4a O3B l O16 y5 *34 o3h *25 .8 O0A } O7B O84 O53 u -B s21 iB0 O78 *09 LAiAu ^d K i59 i73 i3b*75i9" O1B $] +5 o37 i34 i38 i5e i1a oB4iB8L6 ,2sw2{ ^s O52 +9+C l o5i O64 O39 o95sB? C*98 *49 ,8 O03 -0 s{`^X q OA9 ^t -2 l D8 $o $p $t *67 o7r $f $a $d O42 *28 si! $s $a $g $s $a $x $f $o $g c $6 $6 $0 d O8A d O82 ^0 ^2 ^0 ^2 o76 K -1 ^n $n +1 u iAt c $0 $1 $4 *4A$/t i33 i35 sgd +0 O32 $p $i $p O68 sdo -0 -0 -3 [[[[[[c s3E s];k c $1 $3 $! O34 'A d '9 $5 s50 ,6i6? T0 i3s i7| O93 R8 $L $h $i $e ^6] O48 O45 k '6 *8ALBsK, i8N ^9 ^8 ^4 ^v+5 i1U ^3 ^8 ^5 i7Pi40 oBr oBS l c $2 $1 $6 $Xs{6 O23 O76 T4*53r c z1 c $2 $3 $6 c $1 $2 $8 $JskS $1 $s $t T9 OA3 sNu*A8 i6ds$#c i79 i89 i95 $k O73 d s]N O5B ^4 ^7 ^4 *54 +0 D1 +3 o3kR1 *B3y3 E O12 i59 i77 $n u +1 c $8 $! Z1 O73 i78s)wo0K l $- $$ $1 $b $a $h .8o7z ^7 ^6 ^4 -3 o4e $aE D8L6 Z2 +7 *03 o0l ^c ^F $w [ O23 u c $4 $1 $5 o6Uc *40 [ *43i7VK ^9 ^1 ^8 s{- O6A ^@ $@ O43 O0A $i O62 O23 i2i O85 -7 o5L u ssd oAR l f,3 *13 *42 c $2 $9 $0 *49 OB4 o3h iBh O65 O02 o1n ]^R i1X sip o9_oB#*98 spb $rsIS o5y O01 i1o i2r i3d c $3 $0 $6 +0 +2 +2 +7 -8 +9 ^8 ^5 ^7 E$Es7- Y2 O12 sR( D0 o3m $_ $8 l ^X $X i11 i32 i53 i74 i5k i6e *23 o0j O73 s'F *29 O32 s[. +6 +8 +6 sbF c $8 $8 $1 ss8 T1 O98 *93 .7 -1 ^1 ^9 ^6 *57$5Z1 o0h *12 ^"s!- iB$iA$y3 $UR9*B1 *BA OB4 o0s ^i *30 O23 o9b ^6 ^4 ^7 -4 -7 -7 *01s6'*63 c $4 $9 $4 ^mEo8. -7 o14 ^3 ^4 ^9 C $8 $3 i7a i19 O02 *23 -1 -7 -6 s8)^H o5u O61 $8 $6 $7 $j $a $g $a $w $e sv8.4sFQ ^4 ^8 ^1 ^1 spl $5 $5 $6 $6 o1m *24 [ .A O4A se9z2*3A s6@s"\s,q z3 O15 t +5 ^j O32 $- d ] ^4 ^1 ^8 i8W O15 T8 o7P D6 O72 c $6 $4 $6 i3o *20 i55 i70 ^A o1h *14y4*37 $`,5s`d *74,As't -3 o4i d O76 c $2 $0 $1 $9 i7H o8$ s@x O3B oAR D1 ^u d O96 d '9 $6 spe soT sU$ O3B O73 iB6 i53 i57 *31 o32 $t $o $e o0j k $j $i $b Z2 O65 i8l i9a ^7 ^4 ^9 ^7 ^7 ^9 +6 -7 -8 y5 } sac o8Fo6T*19 } o0g *01 O42 s})$= c $1 $0 $6 i0e i1l sHT *A4Y1 O03 $r *10 p2 O1B $3 O61 c $2 $2 $! ^o ^t ^u ^a i53 i75 i7# ^3 ^6 ^8 +3 +4 +4 sMhoBe$P c $7 $8 $8 iA4^C *42 s+S O97 -1 k K^oo6d -0 -1 -0 *68 Z3 O67 *B2+6[ ^3 ^3 ^4 oBo T5 T7 T8 T6 K O91 y2 +7sUI*79 $e $w $e Z3 *A6 O27 ^0 ^8 ^5 +0 l +2 o1b i0P o1w +3 *23 k $8 D9 O57 p1 $2 $0 $1 $6 s?-*A9 R7$, O86 O51 *43 k $+ O48 r *91o9[i1c c ^9 ^4 O05 *89 ^3 ^4 ^8 i1e i5a sw, $2 D4 i2P q O08 T7 [ i2x *24 O03 ^7 ^3 ^6 i19 i59 O46 i1a k *03 *41 *50L6 c ^6 ^4 O92 +6 *4B C'8 ^5 ^5 ^7 ^1 ^1 ^7 ^2 ^7 ^4 o5s l c $2 $0 $1 $8 o5vsf6 *74sI[ o1D u .0 co7@sI. +0 +3 +1 o8G l $b $i $b i4J C $7 $2 $)$( ^3 ^7 ^5 R5*95 +0 s)T O28 i4i i5n i3n O06 ,8 i2pc o6G o9# O64 o4w u $n O93 l*32 ^0 ^4 ^7 O17 sbl s0I,6 i2s k i7c i7e so! OA2 *B2+8 ^6 ^4 ^9 o6E O12 ^p +0 o4o +0 -7 -1 ^5 ^2 ^6 i8> s;NR5 D5Z2 i66 i76 i86 c $9 $0 $1 c $0 $8 $9 +6 O32 -2 O39 *45 *35 ^0 ^8 ^6 o1l -2 o6\ i58 i54 $=sKa i0A o6, O2B i7w $m $p i2e i3l ^7 ^4 ^7 *86-1 +5 o0N k o1a d O75 [ o4u d O45 o1f k $m $o $p ^b ^9 z4 O37 i19 i37 $1 $9 $9 $2 $! i34 i3a O76 Y4 O85 ^J O91 D7 i6i i7e *18sIsC c $1 T6 O51 O03 i70 i55 *9AE$7 s|4o5M c $2 $6 $1 $0 $t O51 i58 i72 ^x c $x r iAHu*28 { sHt c ^9 ^3 O37 $+ z2 TA O05 uoAh c $4 $! O96 *94 r +As7z ^D y3 O34 c $9 $8 $8 O42 *53 o5; ^h i0N o4t O21 skp o7Y i9*sfy o0p *40 ^g+Asg* ^w ^t s {iBs k i1e ,1o0C CK ^1 ^8 ^4 +0 -1 +0 +B -9 -9 s3}$OsQ= s8QD9 ^8 ^4 ^5 ^0 ^7 ^5 -4 -5 -5 i89 i91 iA1 $% l c $1 $8 $9 o0k O23 ^7 ^5 ^6 ^0 ^3 ^7 'A $5 ^HsbS c i44 '9 $k O08 y5 O92 ,6 O95 r $2 $6 i59 i70 ^1 ^5 ^3 ^F sWi O79 *34 OA9 E $a r ]sP\o8W o8P l $h $e $y -6 -A ^4 ^8 ^4 +B -C -C i89 i99 iA9 '5 O02 { i61i79i89i97 l O7B O54 D3 l +4 -A ^5 ^6 ^7 *56 l d '9 $7 s80 l o7= d 'A $3 i4o [ +0 -1 -3 $1 i0F ^5 ^3 ^8 C $8 $2 c $9 $6 $6 [ o4s ]p2*9A {o9Z Z2s0A '8 $y y1 O24 O32 O91 t } c $8 $1 $0 $DiBx c $8 $1 $1 *A9^O D5 i3o -3 *23 o2e o4& O09 *49 c $2 $1 $7 $1 Y3 i51 i62 i73 l ^i ^n ^i ^m }p1s1? C $6 $4 -6 o56 $>$< sk1sG)*68 i6o O49 i62 i70 i81 i90 c $9 $0 $8 *36 O04 svi o67 o75 *46 -4 f o1S C R0 D7 o8i [*B6C i70 i7a ^7 ^5 ^4 O64 *02 *A9 O62 +3 T0 T3 T8 [ o3l i72 i3a +7 o0S i76 i86 i96 D1 D5 c $5 $4 $6 { l O74 o2b -0 $4 +0 ^4 ^9 ^3 .6-9-5 i74 i52 slf O0B i3C *03 o0h i3e *43 O06 '9 o3q DB p3 i6zshc i33 i36 i10 i15 O6B i3f *B2 i31-5smO O65 ^l c *8AsqZ ^v D3 ^6 ^6 ^4 +0 *05 D9*93t p2 D9 c $1 $9 $4 $3 O81 E D3 ^p o0c scq o3_ D4 c $9 $8 $0 E+1 ^1 ^3 ^6 i1y O42 $@$. i76 i52 o1w +3 c $2 $3 $0 $7 ^1 ^9 ^8 i6. OA7 O91 o03 +1 o8i O7B sm# *BA O83 o1$ o03 -1 s5x scd ^7 ^3 ^5 c $1 $5 $8 *AB.As.] *24 +2 O92 C sgt *39o7c o5` o55 +6 $z O83 '9 Z1 $! O56 $? u ^c ^1 O45 -9 +5 O36 Y3 O02 *31 ^3 ^9 ^5 sC; O73 sLV sL*i4@ d 'L s;py1 Z1 [ c $1 $6 $8 O67 y1 OA1 $8 $A D0 o3n *74*21 *54 i6t $!$# -0 i1l ^2 ^9 ^2 sIii0Z i39 i79 oAh p4 p2 *02 i79 i50 +1 ^e ^7 ^0 ^9 $p $e $g c i66 O74 o3q O86 p1 *53 ^9 ^3 ^5 +3 o4i *02 i1i sih i59 i78 Z5 y5 O59 o6] i2R $s $o $d ^6 ^0 ^8 d O37 *43 *52 o6F $q $w i77 i52 c $0 $1 $9 sMK O7A ,2 s62 ^1 ^6 ^3 i73 i50 *A1 O18 Z5 O4A ^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 O15 -8 oBa ^8 ^9 ^4 sMA^I sAH,6 O9B R7 o4N { +2 ^3 ^3 ^6 *30t i2Rl i8+ O6A sQ4 *35 r $3 $0 soyc i61 i79 i88 i93 l i5t +7 i8I O58 sDM $Go9nsG_ o3o +2 i7a i7f y5 O92 o0d ] E *54 i72 i1a i9* ${ O31 ^m.At *43 o4l *76 o6a .1se+*B8 -6 D4 '9 i8r ^3 ^8 ^7 o1C +0 +0 +3 ^8 ^8 ^2 i01o8A *05 o0r +5 -0 -0 *ABo16 s]|-8 $7snm i1a i72 $l $o $x c i31 }*A4l +1 i2g ^K O13 o3V *8A OB5 sT^ O2B TA lY3 d '9 $0 i10 i12 l o7e saC O69 sls +3 -A O96 i92 O05 $1 $0 $1 $0 i7b i7b i7b i7e o1R D0 +2 -7 -7 ^c +1 KslQ O26 ,9 O0B *19Y1o4? D2 ^m +0 -C l [ ^W $p E y5 O06 o35 C c ^2 ^1 ^0 ^2 o9> i3d c $;$; c $1 $$ i6i l s'n$, sa4 se3 so0 O5B Y1 t s0. { *15 s0o -0 ,3 i1o i2l i3l i9! $d $y $e $s Z1 so! *21 o2g i3e D5 $u $r 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 c $6 $6 $4 T3 T8 $_ $9 *43 +2 $o $h $o +7 *73 sX3'9 OB8 z3 oBj c $1 $3 $8 -1 *20 O19 y2 ]i43s9| i7e i3e O54 o8n ^1 ^4 ^6 O59 R1 D4 o4p lo8L o2d -0 +4 o0m i11 i13 $0setK ^9 ^2 ^7 s96 'B +A ^l O32 +5 +A c $6 $5 $0 s^r OA2 [ l ^o ^t ^u ^a y4sI7sU] -5 o0G DBy4 l *76 c ^e ti9k ^i O23 *90^N $J O3A s!* l-9*B7 OA2 O54 LA p2 O76 ^3 ^9 ^7 O43 Y3 i55 i77 i7S ^7 ^8 ^6 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 O48 Z2 D4 ^4 ^6 ^7 c $2 $0 $4 -7 *76 ^1 ^9 ^7 [ i4r OBA LA O84 *30 $. $1 *89 *15 o1u i3e i3a $1 O62 $p $e $p o5g '9 l k i1s l o2o o0j c i2c *30 o71 t i59 i74 *17 O42 sOjo1z i5e O23 r $5 $9 c $3 $0 $9 i41iA0s&) sUSi4c ^4 ^9 ^8 c $2 $5 $1 Y3*3B ,6 Z5 O19 ^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 i9k $*$! E ^P sae D6 *85 D8 O05 *23 ] O43 *39,7*A1 c ^e ^h ^T *05 [ i7n O81 $h $k *81o1d d O94 o1s c '9 C z1 $y D5i0T -8.B ^2 ^8 ^7 O62 i6m T4 T8 -3 t *64 s0 E$Y D3 o1h *B2,7 C $6 $5 i3a *35 +7 -9 +8 ^\ O04 ^B o2" [ -3 o3J l -8 O86 s.r^m i72 i50 D3 *34 O21 o1n i57 O3A O47 y4 O56 L7 O4B $! OB4 c $5 $2 $1 ^*s)# i1i i2s i3t c $2 $0 $7 sxH O36 *12 *75*1B+8 i3, $8 $3 $6 sLN ^9 ^6 ^7 c $3 $2 $7 ^4 ^2 ^8 ^2 ^2 ^8 +3 +3 -0 i7a i7e -3 -A d $2 u i7r c $4 $4 $1 O52 -6 i3h [ i3c i71 i3C O02 T1 O3A D7 Z3 o4= c o60 $_ $0 Y2oB6y2 +1 o2w o7o O76 .6 s{`*79 co6g i71 i53 i7o OB9 c $5 $0 $1 *A7$o 'B o9i ^1 ^9 ^4 ^1 ^9 ^2 o03 ^< O41 $9 +8 -7 -6 C $5 $7 D0 i2j .A*12 O75 $= $_R9 $1 $b ^7 ^9 ^4 '9 i8e iB5 *79+8t c $2 $0 $6 O62 O02 *04 +4 O59 $x O93 sTd*20 O37 i0J O41 T9 O61 O28 i3i i52 i60 i70 i83 sAi$^ ^l +1 o0w *05 y4 O32 skq $T+8 $4 O81 R6 O91 ^8 ^2 ^7 *41 O32 L7 O1B $t $u $x *02 +5 y5 O67 C $3 $8 *06$1 LBo4$t i72 i5a i2l i3o d O29 s - $r ^A O08 y4 O12 *4B .B i75 i7a i32 i36 ] ] $o $*$/ O1A s x ^m .2Y2 r $8 $4 iAJ$/ i61i79i89i98 c ^8 ^5 y5 y1 C $4 $2 C $3 $5 i5Y i1e i7e O74 sP{ [Y3E -8+B i3b i71 D1 p1 i55 i79 $L*2B ^TD2 o0w O39 O68 i7c i7b ^o D3 i9B l RB O82 *B2 *AB+3 ,Asbdi9G i1J sW/.8 p3 .3 i57 i72 i30 i37 t O92 O68 s&# t O42 .A OB5 $#s^K O17 c $| O79 ^& smw^K ,5i6j O7B ,2 loBB OB6 $1 ^q sJM OB6 } ^1 O93 ,A d O64 sC. O57 .6 *79 O9B 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 O49 +2 i0p t oA" O7A TAZ2 l [ ^I sMg^- *34 +0 i5g D6 ] $n ^e O31 c $7 $1 $0 c $6 $9 $0 sD+ O48 ^W *3A^V o80 T0 T2sZ] i7a i5a *67 o51 } i0S O98 O46 s78 O42 OB5 O78 $m ,3 *37 y2sG[l *36 O62 +3 -1 -0 O98 O67 +5 +5 -3 ^R O3A spm *12 k +A DB D8 o85 o6k OB4 i61 i79 i87 i96 -7 o69 i0f -1 *36 D4 ^l ^o k +3 -5 O02 *03 o1y [ o5q *21 -3 +1 o2g o1k ^s Z1 O03 $2 +7 $k $e ^s ^c t $d +7 p2 O35 [ i4n s7Uy1 O74 i8m s'* O02 o1. O37 y3 *17 ^7 ^3 ^4 ^n ^i o6' O49 i56 i74 i6i i7n ^3 ^7 ^6 +1 -0 +1 i0g i1u i2i s1s O08 i3! ^2 ^6 ^7 D6 O54 $0 $6 $0 $6 o0+ +3 +3 -8 *9A O54 sr. O65 i6a +5 s6Asx] *86 o8s p5 *39 ,8 +8 +8 +A +4 k ^3 ^6 ^4 i1e i1b $a OB3 i1lszksy{ c $9 $7 $7 o4Q Ks8K c $0 $8 $0 $7 i5R i4s *06 E } $dsfM i61 i79 i88 i96 i1Y ^m $1 ^1 ^5 ^7 r O69 ^f ^4 ^0 ^8 y3 O67 K i5a i3e o0w *14 c -7 s5Uo0I sHB $U*0B *53 -4 s9dsgl +3 *31 t $z OB1 sBP O43 y4 *32E R8 O74 $j $u $g c $3 $1 $5 O03 ^u $] O7A sID T8+8o0j } +4 } ^x *20 { $a $Jo8; ^8 ^7 ^5 ssp o2' $9 D5 $Eo9* O78 $= i32 i3a ^1 ^2 ^0 ^2 C $5 $2 ^S D2 o33 *31 $@.6 $w $o $k o0[*1A sCri4@ o2y T0 i61 i72 i83 i94 ^Rsfy c $8 $8 $6 ^m O32 ]$RsI] c $8 $7 $6 $G c c $4 $3 $2 s`5i8].5 ^a 'B c $8 $8 $7 -C -E O46 *B7 OBA $s z1 p2 r p2 D5 *65 oAc i56 i77 K Z2 p5 o1g s01 ^s *42 s/Z O94 O75 $f $5 [ *43 c $7 $5 $0 s^Y,A *30 *17 +0 -B +6 $A $u D9 u $o d '6 $1 L5*03 ^Z O47 o3- *20 slf +7 -6 +8 $8 $! ^= +3 o0c $h $e $w $K O94 O58 o2( O21 o1x i6^ so0 $! o8V l d OB4 c$1$2$3$_ $1 +7 ^5 ^1 ^7 i3e i5d r $3 $2 i52 i60 i70 i84 r $0 $8 c $2 $6 $0 i8esSW L5 $R O93 std*B5 c $9 $5 $9 ] d u +8 -A -9 ^d O32 s}7 O25 o0C ^8sHc-9 $1 $* c $$ $1 i1T T8sQvo9/ O79 o64 z1 i1_ i8as\e s3e c 'B $6 +9t c s)x O46 $! O97 -B $3 D1{ Y2 O86 $7 O52 oB5 DA y5sW; u OB2 *32 *34 ^m o3i i6h i7e i8r i71 i3c *03 o3w *35 +4 D7 O87 *56 -4 O73 T6 .1 O9A p2 i48 +7 O6B ^3 ^7 ^4 $msDY .5*A1 ^6 ^3 ^7 o8f p3 lR9 O59 $} ses u 'D $9 *02 o3m -9 s09 ^7 ^2 ^5 ^7 ^9 ^8 r $5 $6 ^y O41 o7& $v $a $t i1i i2c i3k $ $5 Z4 iA2 O29 O59 o5g o2R -4 OB2 *49 $< sv,y1 i2n i3d i4a *27+6 -5 '7 ^% o8P i31 i36 .1*79 o2+*97 ^l O41 -3 D6 y2 OA7 l O72 +3 -7 +3 O03 y2 D6o6QR5 sen z5 O26 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 O84 o2yi92 $/s(5 i4r D6 $2 $0 $1 $0 $_ oB+ ^a OA2 f*05 o9%.6 .1 O27 sGK-8 -3 -6 -3 s?<.2 i71 i89 i98 iA6 *51 [ ^9 ^2 ^0 ^2 *57-8 [ o0S u d $2 Ck[ o3/ T4 +3 c $3 $0 $4 i75 i50 c $_ $9 T1 o08 C *86 O72 o6J '8 $s O43 $$$! c $3 $0 $1 o2w k $h p2 ^7 ^4 ^8 '8 $s o1S c o0t i1a i3b ^VRA $%s2\ o62 +5 ,4s&n c $4 $7 $7 .4 Y1 o4a O21 u +2 .AsuJ T7Y1 ^9 ^5 ^7 i50 i79 o8G c ^. ^1 snr D4 ^x $1 $E O54 s%g ^`sC"l c o24 i4a i5k +A$W*B6 l [ ^O ^Jo9G*0A +1 +1 +7 Z2i7C i81 i99 iA8 iB4 o44 o55 $8 D4 *68y2 i72 i80 i91 iA0 o55 +7 i51 i5b *98 O72 o3p *35 $Z $9 OA5 $# l [ o0N .1 .0 D9$0*74 o0t ^B T4 siU i19 i35 i9E i19 i36 ^N*48 $y u ^9 ^3 ^4 O04 ^l i5a i3d s8?^! O7B O14 z1 l +8 +9 +A R5^S *13sw&s'? o9bsy! +6 +7 -8 c $3 $2 $8 o10 O54 k o1- i6@ D9 +1 +2 -3 c $0 $2 $5 Y1'9 *B0 O61 *54*67,8 R8 ^s O83 si! O32 o0s +6 s1z i2A [ { O01 +0 *79 ^8 ^8 ^4 ] $c $4 O21 o0e i1s O4A i1u i61 i79 i86 i95 c $3 $9 $0 $_$@ sdwsI3 $v $i $d $a $l k o34 RAo86o1! -2 Z1 d O62 sRt O47 Y1 O76 O78 -8T1 o8A O84 *78 O12 ^e *50 O43 oAg i2x*48 i54 i71 +8 *78 swIc -4T7i0d O34 Y3 O25 o5q r k o2g u -6 sOz$C R4*89Y1 ^9 ^4 ^8 scj $4 D7 sfb[Y5 d O04 ^2 ^8 ^4 o7_ *76 OA1 *6A D8 OB5 O83 O14 ^s y2 *14 u d $1 i3f i3f Z4 O38 O8A i5e i70 ^c *12 i7z *A6R6 O82 *81 o5w O02 ^9 ^1 ^7 sMD shw E -0 l i8O O47 -5 *53 ^3 ^2 ^7 $KsDS ^6 ^2 ^7 i7k i8a stj ^d D4 -2 O52 *72^Gs=) *90 ] O74 f O39 ^.s+r .7s*6 +2 D5 i57 i71 ^Z O49 q O1A -4 o2t i5d i7a +3 *52 O65 i8Q $o $h $m R6o9v $, O59 +9-C iAV] $aD6 i0N i1o i2v i0k D4 i61 i79 i87 i94 c $5 $8 $0 o3z l i62 i70 i81 i97 $2 $0 $1 $0 $? sdn $A $v sWiss.+9 s9k $i*B9 u ^x $x ^x $x c $5 $6 $2 i11 i17 *15 O52 { O34 D5 *B4 i41 i59 i68 i79 $n O51 O12 E $l i7E T2 y2 RBK c $2 $4 $1 sL^$A O13 ^m c $2 $4 $3 O95 o6l i55 E Y5 O63 ^1 ^1 ^8 +4 +5 +6 +7 *23 D4 z5 O16 O84 -5 c $2 $7 $2 -3 *20 o0` sbM O75 -4 D5 i9g i52 i77 *49sO,*78 o3s -0 c $2 $2 $! $! c $_ $3 i71 i89 i98 iA5 *92E^( } -7 o4i O59 -6s'w o2c O31 i59] i78 i55 o57R8 s_'oA"L6 i78 i53 $2 O82 O59 O03 ks^oo21 {R7 c $3 $1 $7 D3 o0S [ C O84 i53 i79 O43 *32 c $1 $5 $2 t -3 Z1 $y i5a i73 i98 -3 -9 -3 i7f i7f OA5 K -1 o01 *61 t O23 s9* ^0 ^4 ^6 D0 i4o ^5 ^2 ^7 s0! ] $m s . i3a i5c O32 ^e $s o7m +1 O52 i2i i3l .2iA'y4 *5Ai4u $1 $2 $2 $7 d O34 ,6 O45 ^8 ^9 ^2 k t O93 KC z1 i1_ O28 i8i i9e iAs i2U c $7 $9 $9 c r T0 *25 ^j s*;*A2i5q i5e i3a O48 o2g O27 $,sNq *23 *05 ssgsH| i42 i53 -A -A -B T0 T5 T8 '9 i8t Y2*9A *82E*54 O85 s|` c $2 $0 $1 $9 c $3 $4 $2 i61 i79 i87 i90 *85 O42 c $4 $8 $4 sDZ +1 ^z ^n O31 *58 *30 +5 -4 -4 o2t +3 ^c *01 +0 KsBRL7 R3snC o6s ^A o0B i64 c $9 $9 $! $! T0 i6_ seo i0No8Q [ $4 K +0 o44 *23 O42 *64 O61 snul i10 i19 $! [ [D4s % O61 *AB c +3 ^t *15 sgy i32i40i51i60 i57 i73 z4 *59 O16 i4k D2 o3K *02 *B8 ^H O82 +8 -5 -5 *B8$Ks"t +3 +A O32 k Ks1Ss<_ s0p O51 .2i3r o11 -6 i7f i7a { T7 c $0 $0 $! O71 OB4 O9B R7 Y1 iAjsx] sbj 'A $zs-? T1 T3 T5 T7 i53 i78 o0Z O6B *68 i6_ *56 o6b T1*46 y4 [ y3 OB9 $l $i $n $e r $3 $1 $, O93 i55 i74 i71 i5c sr?y2*A0 $1 $C D0 O23 *30 +8 +A -9 o1H D1 $3 i9# sa)i9. ]*78 O74 OA7 o5n -5 l c $4 $8 $0 sEQt i6n l T3 D6 D8*52 i59 i75 *47 D4 c $4 $2 $6 O41 T3 iB! o6L $p O92 +1 ^J c s10 [ ^y ] O06 *38 i7c i7c +1 i1l k O43 c $, $1 +5 -A i41i59i69i77 r*94{ d O27 d '7 $3 +By1 k o2d ^y ^a ^l ^p O32 [ .4 [ $. *41 O61 i78 c 'E $4 $w $a $l $t $z s16 l o53 ,3 T1 T8 O71 o6h i6e l Z2 O43 i0y i1o i2u ,2 ,1 *02 c$1$2$3$% c $2 $. ] i66 'B $m O47 *9A t *75 D4 o4u O02 c $2 $0 $1 $7 i55 i78 i51 i5d $d $u $d sv3 o8R ^7 ^8 ^5 c $4 $0 $5 o65 +3 *5B$% ] $l -3 o0G sS$Z3 i57 i75 *29 O06 ,B $5 T6 i8qz3 *04 O21 f o1O l d o4H O06 ^u i2l O48 c 'E $0 O87 y2 O05 O04 i0d f] O7B RB Z4 O04 ^3 ^3 ^7 ^Io7bsFR ,5 O41 c $9 $0 $5 sJN $]o9J k ^M i70 i56 -5 OA2 *8Al.5 } y5 '7 +7 o6_ i71 i80 i90 c $4 $0 $8 i4isal c 'B $8 rY4s7H -7 OB3 E D4+5 $1 +6 { Y4 i81 i99 iA8 iB0 o8= c $5 $0 $9 ^d O31 T4 $1 o4t D5 *32 i4s $'sQg O01 i4u o5( O02 $g o0cy3 *25 +2 c $1 $3 $6 s6Q slS $z $x O43 i4@ OB3 D1 $1 i3b i1a *A0[ LAEsn9 *65 c i78 i56 i5_ [ i41 i59 i69 i71 D7 o5v } ^d i54 i77 *76 $\ O09 *30 o2y *42EsO< [ O21 *29 O02 i5e *25toB" o5j *50 sgj ^f *21 ^3 p3 y2 O39 c $_ $8 o6[ c T6 T8 T2 T4 ^k ^o ^o ^b *B2i56 sa4 so0 si1 Y5 O91 o0- DA *BA $2 $2 $3 $3 *7A O92 c $7 $8 $5 Z2 *4B OA1 *35 i3i -9 l i8x '9 c $9 $4 $4 c $7 $7 $9 i13 i13 iBAkp1 C $5 $8 c d '9 $1 O93 c } ^j o5% [s\e *20 p2 O14 *78 O38 *18 c $5 $6 $4 c $8 $4 $4 l ^u ^e c $1 $9 $5 i8K,B} ^q +1 ssXs4o i6a l $E O83 ^5 ^7 ^5 i11 i14 ^2 ^5 ^7 o5k D7 p5 O68 ^2 ^8 ^6 ^4 ^3 ^8 o70i7z+8 ^9 ^3 ^8 *15 +3 sl% sl@ t -7 s"-Y3*A8 o8r O71 i2Z '8$#sU- i12 i34 r $7 $4 ^7 ^5 ^8 i9q +8s-v i24{ ^Tls @ o4NsYx*8B .8 O02 O1B [ i15 .4o6K svp *72 O42 o68 *A5 O67 O97 *38o10o9H D2^J*89 ]qsqj iAt 'B O63 i18 O05 ^w O01 { O3B '8 $h { p1 y4 i3\ $m K O71 K C*25 s";.5 i1a i2i i3n *87o4x i32 i73 l ] $x -6 [ $B $d O2A y4 *0B $1 $9 $9 $0 $@ $w+B $4 -9 O42 *13 o75 t Z1i9j iAk O82 D6*B7 u $p +8t*90 .B*8Asb= -6 O82 $y $u $k -Bs$_$T +1 o0b O26 O46 i1j *14 ^t +5 s36 $` l ^1*18 -4 Z1 O9A O15 sqkDA +F +F +F ,1s}% q O18 sQX +0 -9 +1 OAB O34 O91 i2k $1 $1 $0 $9 $a $n $a i8b +1 -8 -8 $2 *59 O96 *B7 q O8A +8 -3 -3 o7_s>1 Z1 o0K +0 -1 +9 sdfDB o6A*94 s0AsXGs-y +0 -2 +0 O06 p2 ,3 *31 Z1 sSZ ,3 uY1*89 O97 ^i Y4 O16 ,3 Z1 *31 k i13 [ -2 k t r O02 i62 i70 i81 i96 i8V R7*90 i41 i59 i69 i73 OB5 o1L O01 O43 *A2 y3 O5A O9A [ *67 i1s i2p O49 se1 +B l .4 k ,2 *34 cY3 { o0G i1Z i58 i78 o7> d O95 uls,h O12 $s *27 +5 -1 -0 $. OAB i0M O71 l T4 -2 -5 -3 -4 o3o D5 D0 Z2 E sG= OA4 i74 o6u -5 u T8 i57 i79 ,8 OA1 o5n O86 i7H s8@ *46*92*A8 slFi77 o88 +9 sc[^V ^y O32 +5 Z1 ^7 ^0 ^8 ^1 ^1 ^6 *81 O63 siks];D9 ] [ k $#$! +4 *23 ^4 ^7 ^3 L7c i5_ ] i5S ] $0 u 'E $5 D2 ^f +8 '9 $3 $b ^A +1 Y3iBR i72 i59 i6Rs"/ *79o1r sZ\ O36 *53 s0- .5*78 C $7 $3 sm) sbe O69 c $4 $5 $1 d O56 *79 O21 i31i49i59i65 p5 $G o9# i72 i80 i90 iA0 s\9o7xs]3 u .3 *51sqx $c O73 E O15 o08 D9 t *1B sSB L6p1 $6 *9B o8TsT@ O02 ^A c $8 $0 $9 +2 i2d *54 O23 *43s?. sk6*81] $p $a $p ^7 ^3 ^8 i2y i3a Y2 .5 O56 o7l c $6 $2 $0 o54 *02 *7B O19 -2 o1k o6& O24 y4 $6 O53 ^1 ^0 ^7 D8 o7_ o2L r $0 $3 svY O45 +0 +7 -1 *31 D4 R1 $. O07 '8 ^a s!7 *A2 Y3 OA5 i59 i68 i71 c $4 $0 $1 l O53 c $1 $+ $c $5 T7-1 -3Z1 Z1 O36 o60 *79i2x,6 iBb oBmo0c O18 ] p3 i4c OA5 *04 C $6 $8 $1 $D o2p D4 D0 i30 i3a i3n l *62 O03 $6 $^ c $1 $2 $7 +Bz3 i7a i5e o7H *03iAT d '7 $9 *86sgo*69 sso K $X s^YTA$D $s $e $w i61 i79 i87 i99 O13 Z1 i74 i7e ^4 ^7 ^6 c $1 $2 $9 o67 +8 O19 Z5 i71 i89 i97 iA6 c $0 $2 $6 o4A c i72 i80 i92 iA0 smz *97s\xi4h *65 -5 R0sONi0i d O06 -1 i1l s'S O15 ^1 O17 o6@ $1 *46 +4 O8A *A6 o2+ d 'A $2 o2o i2j o2b [ s|0}st2 .5s0a u d $8 t o70 T2 o02 i97 OA3 Y1 i71i89i99iA7 s-1^Ks5c ^d *64 i2q D9 o7a o0z O13 s@3o3l O62 O72 s^; f *02 o5P O42 D5 i1a i3f Z5 '5 { O02 +6 O02 so0 T1 c i71 s>ql$J O43 oBU +5 +7 -8 -6 *73 O52 C $5 $1 +A -8 +A O34 t k o2l i81 i99 iA8 iB3 i84T4 c $5 $4 $0 s.7*7B.1 ^B l O42 i7e i5a o4m +0 c o0p $5 -8 *40 *89 c $2 $2 $2 $4 O08 E $9 $4y1l o8i*7A i54 i5a T1 +0 l $7 $7 $7 *BA O94 $h $2 $0 $1 $7 c $7 $1 $3 q s{c O48 +1 O23 *B7^g $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 y1 OA4 i1u i2n i3t ^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, O07 i6a i7r i8t -Ai3y c $8 $9 $9 s0H i13 i11 o2c O41 -2 l $f $9 spksa_*B9 O25 p2 K O28 r ^o TA +3 s^i C $7 $1 o06 +1 i7= i3B l $8 $* ,9Y3i4m $d+9 T0 T7 T8 [ i5i O52 *41 l ^d ^i ^m *74 O54 O39 *15 *16 O13 s.9 l $8 $8 $8 O43 i4@ sDM[ l $3 $3 $3 i5c i7a *98 O95 sue i78 i50 *10 ^a $c $6 [ i6i $7 D2 ^2 ^4 ^8 D9 O81 +9 o8_*39y5 *8AZ3sim sP(z2 O12 i2k K.5szM +0 i4z ^M +1 } ^P c $6 $6 $2 Y1sJ&l *93 O61 ] c $6 $7 $7 ^4 ^8 ^6 o2l T0 i71 i89 i97 iA3 } ^l ^1 ^3 ^7 ss9snl*36 sUH *7A OB4 O95 i9y *91 o1a i3Y O45 *12 o2wso0 $1 $5 $1 $5 i61 i79 i88 i91 O54 p1 O9A s1A Z2 T0 O3A t i0V i5d i5d c $9 ^6 O07 Z2 $2 $4 $0 $4 c ^1 ^0 ^0 ^2 O52 D9 o6P *90*04 *93 ] O61 $t $u $g *56 o5d O05 *B5 Z2 o4C +2K o4( Y5 K OB7 -Ao6h c $. $3 o7?^O*82 Y2 O15 s Q Y3 O86 s%9y5 $f $4 o37 o11 o6l slD $o-9 i4t i5h i6e i7D i62 i70 i80 i91 C $3 $6 +9 +A -8 -5*82 s5M O14 $Bs]{ O15 '3 ^2 +8 D2 i6e ] c $3 $3 $3 $6 *24 -0 O28 O17 ^o D4 *57 o0K i7Is!W -4 O03 +7 l s52 -6 ^2 ^7 ^6 z1 ^i O86 O48 -C -D -D D7 O04 y4 si/ s+0*3B$^ c 'C c $4 $5 $8 O92 Z3 -6+A ].4 O7A i8l ^7 ^9 ^7 O03 +2 $j $a $b $0 $1 $0 $9 EKsv> +9 D7 syUsWGs8c i5c i3a T9s6;i7h iB]Z1 $p Z1 OA1 i0Z O06 .6T2 oB"ss.sWf *01,B$l ^I*0B +5 -2 +5 ^G E i5b i5b ^j O51 o6p $s -0 i2t O32 snY -4 i1A O41 *34 $z*89 sLG *02 i3p [ s=d O67 $2 O63 i50 i73 c $2 $0 $8 *63[i7< $, $1 T0 $6 $ $3 u $t sKG'B ^C -4 o4X $2 $0 $1 $8 oB"o8e o13 t *2B^Msr1 $f $8 +0 +D $k O92 Z1szIiB2 y3 OA1 +D -F c $2 $3 $9 O93 O82 O96 *95}o3r i19 i33 D7 } O58 ,5 O25 O13 ^e ^c O05 *76 O74 c $3 $0 $7 *51{,A O01 o1a *18 O0B -3 -9 -5 i0o*A9'4 OB9 O15 O82 i3c i5e D2 y1 o32 *32 O35 o0k $2sTL u 'D $3 +2 +3 -0 $d $i $d ^l}^z i6!*56 O81 o8s +9 o8i c $5 $3 $0 o4V +4 O03 ^x z1 ,5y3sJ% z2*28 i0m i1e OA5 $_ i73 i7a s!V^ZTA o4, $1 $9 $0 $3 *10 o1. $c $o $g O31 t s5( *98 +9 i41 i59 i69 i70 z1 i1i DBD6 -8 -9 -A O52 p3 r $2 $9 y1*0Ai7w d O35 o9D],2 y3 O45 i1S i4-$h K .1 ^9 ^4 ^7 OAB L8 scj E $o D5 *45 ^6 ^9 ^8 ^y$0 $1 ^. ^d ^h T5 } s/,y4 R6^F ^8 ^3 ^5 o6.*A6s'\ -4 *02 +4 O62 O93 O08 i79 i5e o7$ s$b ,6Es]v i19 i39 i61 i79 i86 i94 *02 ^y D6 ^t c $4 $6 $8 *67 o7c ^c D5 } O06 *34 o2t o8u D7 o48K.9 o37 *20 s2A$\ ^a *20 ^S +1 +0 -1 +2 z1s6G -5 *75 *56 ^M O85 *68 o9rsbm +3 *42 O28 s( +5 Z1 p5 *A9 ,A*45 *31 O46 *52 O04 c $1 $_ T2 T3 T8 O35 Z2 ^u O12 $t $c i73 i5a +7 O02 'B*85shl u 'E $8 D5 $7 } O56 r $4 $2 ^U l O41 O35 OBA $X y5 OB1 s4T i1. i3. i5. i7. i9. $b $3 $0 $5 $1 $1 {sT, +3 ^p sk? -0 *04 *53 o15 .6 p3 *68 O42 O4B ^v O61 p2 O29 *02scB D3 sea i6i i7c i8a ^t O43 c $1 ^! $a $E c i11 ^3 ^2 ^0 ^2 OA9 D6 C $3 $7 o6X $1 O53 -1 -2 -1 +9 'A ^h D3 s-_ C $p *76 o6g $@ O05 $ksS^ *34 o0z $>sf,o8% ^3 ^6 ^7 o5< i5p,7 i1a i1c ^1 ^8 ^5 i5U +3 +7 -6 Y5 s7+ O14 O21 O01 spb *10$c*28 c o0t Z2 $1 ^g.1 ^v ^S OA7 O37 .2 s9ylZ1 *59*43 i2$ O05 d 'A $9 ^A D7 $WRB i56 i73 O35 o0w s8_ sEg OA2 o8y +1 +3 +9 i61 i79 i88 i98 sT]*07} *51 -3 c $0 $1 $1 $5 $A { +6 -3 -3 oB&so1 *A8 O59 *52T6] $!$$ ,9$m $(sA[ s2a *74 ^y O05 .3*A9K ]lszZ *72+9s(? *A4^m *86]l -3 O52 $Cs = i5V$x Y5] +1 -8 +1 $l $y $e [ o3_ r $7 $5 [ o3c $1 $9 $4 $9 O23 o2n i4w O03 dswG -7 z1 D2 i9i iAe o60*24 i9l iAa f O83 s15 sxq y4 O26 s5R i62 i70 i82 i96 d O6A c $5 $0 $3 D2 $4 +4 -8 -8 *61 O62 c $1 $# *57 D8 l ] $t c $9 $! i1G s2j O83 c $. $0 $5 p4 O96 OA9 R5 ^h ^m sPD { -7 c $2 $7 $5 c $1 $7 $8 c ^7 ^7 ^9 ^1 $1 $d o13iA+ i2s i3o i11 i19 o6l l c $4 $7 $8 i5a i79 l [ O12 Y2 D4 d u]*B3 iBk $C OBA ^g O23 o8Z c i34 sik s80 +5 ] i7p s26 l O42 *34 T7 T9 T8 *89D6 +2 +3 +2 '5 z1 R0*87$u *8A]s&s [ o4t $1 $? snv *30 ,2 i7R O3B k *75 D6 s5a +1 -6 +3 O65 OA8 .6D4 z2 o1u i78 i59 i5a i70 -5 -7 -5 O47 p3 i26 ] $h ,1 O14 $n ^M *67 -5 i57 i78 *25i4E Y4 O14 +0 +2 -3 D9 l stZ Y5 Y5 O39 -1 -2 -3 -4 z3siGR8 o5\ y5*BA +A -8 -9 } -9 } *61$7 [ o5u *71 O03 ^j z1 *0BiB. q ] [ i75 i59 O07 c s+@ i7v .5 -3 O63 y3 ]iBH u O48 sfj $4 $! $3 K } ^e O23 ^m $k { ^7 ^3 ^7 $l $u $m $p t $h o6y l *78*20s2j k i2v i5e i74 $C O62 i1a i2k i3e *01 i3- [ c $5 $0 $4 +1^kc +7 *65 z1 O08 i61 i79 i86 i93 k -6 *38i33'5 sfF $f $3 *34 o4d o3h D2 *0Asbl i1n u ^1 ^9 ^3 O67 c O41 R9snf i7d i73 *A7y3 i65L8o9t sRvTAo2E sbn d O38 O64 c $@ $7 -0 -B o2g O51 i5s c ^n -1 o2k *01 ]$H +5 -7 -6 i51 i3a i81 i99 iA8 iB6 Kc ^7 ^2 ^8 T9y3 i3d i7d D3 ^z i56 i78 K}^5 O6A z3 $m O72 i5b i7a *60 D6 R5o8rE o62 *56 r $8 $3 $1 O72 O05 -6 ^H iBo +3 ^A o6t l y3 D6 { p5 Z1 $-$. $)*73 O04 ^r .2 *12 {T2 *25 O02 +B l O23 l o5n s7t k O61 i3d i1a o4Y c ^1 T7 *8A+8o6S sm? ] $g z1 *02 sNLty3 i5_ O64 $Csq. O49 $[ D3 Y2 RBi7*,A -1 $b K+0 $d $u $h ,1E *43 E D8 ,3 O43 i31 i3d O82 -5 T8sgvR7 $f $6 d O97 O04 O28 T3 T4 T5 T6 ^O *91 O97 $w { [ *0B o2z O79 c $1 $7 $0 $3 T0 T5 TA R8$S i7U i78 i7e O74 +7 OB1 sue c $7 $9 $8 $U *7B O1B i1s *13 $m $a $w *58D5 i4, snp [sY4o8- D0 O43 $bsZr*12 c $2 $8 $0 O2B T7 o13 sl`s-po9Y i50 i77 iA_ s2? s6iusM= $7 *03 [ c $5 $5 $8 o0s l $5 *75 O63 -1 -9 -1 D3 ^c ^h o2y u d 'A $8 sDQy3 u d 'A $1 r $! +9 [ O12 ^3 $e $r $i $c $k $n $o $d -B -C -C i0z z1 O43 r +3 -6 +3 $z OA2 Y3 O62 o22 *32 i7L sEW sie i71 i89 i97 iA4 O74 O71 O62 o2y c $2 $4 $8 -5 -6 -5 $3 $a O02 Z1 z2 o1. D7 o7. $& O54 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 O93 .4 ,6 *54E+4 i7C O04 +A ,9 o6h Z5 O5B O8A c ^1 ^# i6h O7B i58 i70 ,9o4. *30 *43 r $7 $9 i5e i3d *AB^s *32 $1 l ] $h -5RA $z $e $d .7q s5S o8z D7 +B -0 D3 O62 O54 O62 suo Ci0R o6 *BAi9? ^j O34 O42 ^K c $0 $8 $8 '5 d *05 +3 s%1 O73 +8 o8) szs $q *53 O8A c $0 $3 $3 ER5 c o20 ] o5l ] O17 i5e l r $8 $2 i9hY5 O58 [ +C -D -D [ *53 O82 $t O52 ] c ^9 ^0 ^0 ^2 O71 *58 D5 *81L9D1 i3t i4y *56 *76 s"6Ek i5L '7 r ^J O79 o3@ *39 O52 *02 sB-*58 o17*67 s!+$F oBk O94 *3B o64 l ^X ^X $X $X Y2 u i3Y O2B p2 $k $y $s $u $p *7A O62 *76 +6 O42 i1o i2o i3k i5u p3 -8 -A -8 $1 $2 $3 $* *10 i2b L3 *63 i96 ] i8s i9o iAn r $m $r $o $e o47*59 $2 O53 ^< +1 +C *31-6 i0m i1c *B5,AsOP i3y O0B oAosDH Z5 y3 O48 i71 i89 i97 iA5 *9Bi6u { $l *17 +7 O81 -8 q O8A O65 +9 +B -A i41 i59 i69 i76 $. ,8 OB7 $u O62 O78 *45 { $3 D7 sy)LAo31 saR c $1 $4 $8 ^2 ^9 ^4 ^1 i9jy1 RA-9i7m +3 -7 -0 +4 OA6 s2' O07 i5 O27 L6 *32 *53*89 C $8 $0 [ i0P O62 o9K s*|Z3*1B *36 D5 snc d O36 E ^F i10 i17 d O16 o9r$E c $9 $8 $1 *43 *12 $;$) i77 i7e ] Z1 -2 c $5 $4 $2 .8Z1 i12 i32 ^J O63 sL$,B$. o3i c .7 O41 $= O74 s;x -8 l *50 $5 D0 iA4 Y3 O54 $s $o $p {R9c i78 i58 +7 -1 +7 i19 i32 o19 k i78 i54 i86 i96 iA6 ^p O15 c $1 $9 $6 *71 O02 *A5z3y3 o50 Z1 i4- O02 O34 i5] y5 i11 i18 sBR scx +1 -3 O42 o5g O02 i52 i60 i70 i80 t o7d ]iB(*98 o7, stQo8B+5 ^n D4 o7E t i3* t O62 i7i i8n p5 $| } ^g ^, ^, *45 O52 +A -5 o39 *71 +5 -4 +5 O71 o8e $4 $6 $4 $6 c 'B ^v +2 i64 i76 O02 +3 $a +0 c $4 $1 $3 O82 i7b o5h O95 '6 i5p o4z *18 O2A c $5 $1 $6 ]sG"*7B i5k o6e i71 i89 i96 iA6 -5 O76 o6w O71 c $5 $2 $8 'A D7 sJG $7 $. [ o0q c $. $7 i77 i59 i1a i1b ] -2 Z1 y1 O04 Z2 i1o O52 O12 Y1 y5 i31i49i59i66 iAh $3 $2 $1 $! o43'A sjY c +5 *08 [ {*95TB 'B $1 *24 -4 o2t +4 -Bi0O o1L [ $1 ^* u d $3 +7 i7_ i5i i6n iBd *80i72 i0QK ,7i9M *68 -6 d O83 [ ^d *80+5seS *B9 O83 +5 -7 +5 sSZ .2 ,4 *31 ^t i53 O04 $6 { O38 p5 i9p k *21 $.$? p4 t O35 O12 +2 c 'E $3 .7^a $r OB7 ^4 ^9 ^7 ^V O48 o0T L1 -2 ^p O63 o9u O35 O75 sdp c o73 r $7 $2 i7e i74 i5e i3c *43{ -1 O32 O71 Y2 T0 i5x O32 *67 o75 t +9 *49,Ay1 i2l i3e i4n l o5f ^d O42 i12 i33 u 'E $2 O13 q *14c.A i3f i71 $A D6 +5 .3 soi sph *12sW's $w*76k +1 +3 -2 d 'A $0 i7e i5e d 'A $7 c $2 $5 $4 '8 +6 ^j *41 i3e i72 i1e i3b .5Y1s$/ *14]f i73 i55 i10 i16 swx+8 *57 o7s i7k i7u sA` OA9 o52 o94 c l o2a ^C ,8 O24 $6 D6 k ^t +2 l sK{ O54 o55 +2 Y1 *A1 O56 T1r +3 -2 +5 +0 o24 $c $8 EY3 O04 ^o i3a i5b ,1 y1 c $4 $6 $5 c $0 $1 $8 -0 -8 -8 O6A O31 i6H D5 i72 .3i6x *61 O12 c O75 $c $o $y cs8d c $4 $3 $4 c $1 $2 $! $! ^g D4 k *46 *A8 oAe i52 i60 i71 i80 i4f [ Z5 *36 O3A i14 i12 $a $p *94o5ri9$ k i0b +4 -0 -0 c $2 $9 $8 cs6(Y4 r $4 $3 $e ^d c $8 $1 $5 i5a i77 o2m .6 O83 +6 o77 i11 i31 o6. Z1 o7i 'B i54 i5e T1*53 o7% *23 Z4 O6B Y2o0m ^y*39 c $8 $6 $8 *14 *08 ] ^L ] +6 *64 c $1 $4 $2 $1 $8 $1 $8 o6v OB9 O49 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 O03 E { c $# $2 o8J ^a Z1 $Z O31 i81 i99 iA7 iB8 $b $a $b $y c st7 k i1h ,3l*71 -9 *78 O69 ,1 *71 O52 +2 O13 ^c O13 ^v ,1 *16 [ -8 s0e +2f z1 -1 i67 i70 ^3 O12 $-*37 *06 K p5 l i3a p3 i2- c $5 $1 $9 d o0c *A0shRsCR +2 -1 -3 i58 i71 [i9"Z1 $3 o62 *18 l ] $E O24 o2y O62 +2 O42 O29 y3 +4 o5y i4ZL9E i58 i76 Y4 OA9 i1s i2c $ so` i32 i71 c $3 $2 $9 d O85 c $1 $6 $3 c $1 $9 $2 o6. O73 t ,8 *02 ^j i7f i7e o6t O02 c $6 $3 $0 i51 i69 i77 i82 i51 i69 i77 i81 ^h ^r o7H^K o0C O52 i4$*93*92 ^g Z5 O39 O12 o2r ^e ^r ^i ^f +6 +6 -5 $`$` p5 s06 D1 *13 ^1 ^6 ^7 c $7 $1 $8 T5*B0T6 o9P o99 T0 OAB T0 *50 O23 O02 $1 O95 T0 s{y i3hs]7 i4o i5k ^S ] +1 +1 -6 sTM Y2s7u$h u z1 O47 ^1 ^2 ^7 spd -0 -0 -6 l '8 i72 i55 i7Ed*83 -5 -A c $5 $! s'e i15 i12 sLJ $y $a $w i10 i18 ,A*45.6 i81 i99 iA7 iB4 c $2 $5 $3 r $3 $8 *43 O42 i1a i31 -2 o0T c $1 $8 $6 +9 *03 O31 -4 -A ^i ^g $& s&X l OA5 $! *49 c o65 T2 T8 T5 O62 ^G ^E o2d $z O43 f O3A $- O72 +1 i0h } o1h *97sBA c $1 $0 $9 $4 $.$! i71 i5d l o2t c o57 +5 O9B r $0 $6 i4i *64 c $1 $3 $4 +9 -A -8 E $E O1A T1 O07 ^e O51 O53 *68 d iA*sPt i53 i77 c o0r o1, $- { c $3 $7 $5 $r *78 s8p$T R5 +4 ^2 ^7 ^5 i5r D2 ^1 ^7 ^6 sn2 o0R O31 i3l i4i i5n O61 ,2 ^t sw3i1|sb) +6 *57 O13 ^S O61 i2$ O13 o3E c ^[ $] $y O53 *0A O89 o56 ^cs[S y2cK L6E i54 i78 sGD[*96 uT9s=u $p $l $y *58 '8 D6 i1i ^3 ^5 ^8 i2gsHQs)p i50 i78 c i6_ y2 O72 *64 O72 D2 ^1 +6 D2 i71 i89 i98 iA7 o0c *42 i71 i7f o4U *B2TB*58 iAu ^1 ^3 ^4 s=ti4I c 'E $6 O15 Y1 *47 sbf [ o0F o9G O12 O84 O15 i39 i33 i5d i3a sgv sE= DA O51 o0a *B0 O38 i76 i53 -7 *87 i7G .2 .0 i70 i54 *67 [ *6B*B2+0 -4 *42 O42 s;>o6f} *ABy4 *26 O53 o0b l C $6 $3 $8 O71 -4 *40 i6H u sty o1. +0 c $4 $7 $0 K $S y5 '8 O92 *52 T1Y1*67 o51 o66 O12 ^K i1e i7a O32 -4 O03 z1 ^0 OA5 o22 +0 OA7 O82 *06 -2Y3 *17 [ .5 O21 i81 i99 iA8 iB2 i5d i7e o6Y O47 O56 Z1 -0 sao ^a o2i i7a i1a OA4 O69 y5 p1 s94 i0a i1s i2d iAF$#s'J c $_ $5 TB sSG OBA O51 o3s c $1 $, O76 s@R ^@ ^! D5 *41 ^p ^m TBo6^o6Z $8 O92 i54 i76 i54 i79 *41 *32 *14 c si1 T1 -0 l $s +4 O68 OB1 o0m z1 s6! ] i0m i72 i53 +6 i7u d '7 $4 'B $8 r $0 $4 c i7# o6_ $0 O63 p1 O04 q OA1 O81 O35 *A1 s0_ O14 ^g d O52 [ DA i4l i5a i6n d OA4 slb Z1 $o $b $4 r $5 $4 $0 $9 $8 $7 +0 o5t $_.BE p1 O59 *54 T0 o4r i5O y5 O3B C $6 $0 o0" D8 O05 $m $b .Ao9Hi7d ,4[+8 L9R6*84 i2t i3h i4a i4i +5 i49 i55 i6B $n $i $k $k $o sob *35 o2m i2I i8Sy4 [ *64 +4 o0z i0m i1a i2y i36 i46 i56 c $0 $0 $! $! O53 c $5Ko5! *43*54 ^l ^k O21 ^3 'B O63 o4" c $0 $0 $7 $! s3ssOm*0B d '6 $2 i21i39i49i57 c $1 $0 $1 $! o1& OB2 OA9 k rl*A7 O26 ,5 c $1 $3 $2 $4 u $1 $9 $9 $1 .B^N [s2G*A9 s5Psmo -0 ^g *02 o0r +2 i71 i89 i98 iA2 o0Kp5 sAG O24 y5 *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 $7 -7 s98 s94 i72 i80 i91 iA9 sh}*04 i2g*30s0( D5 *57 -F -F -F ,4s{I -9$= +1 -9 -0 o7W${ O52 O02 c $8 $* o5u T0 +1 +1 +5 +2 +3 +5 Z1 O43 sqPs?%o4. +0 +5 +3 -7*43 +9 +B +9 'Ao48 iAz O82 D2 E O31 c O7B Cs6E $2sDX DA C O7A -B Z1 +6 -5 -5 +5 -2 -3 o0M *43 i21i39i49i56 ^h O51 $g $a $g i50 i75 O19 *1A D6 *07$!sz0 o28 *12 o6x O51 o1i+6 +9 -2 -2 c $x $2 s34 c ^A O17 *30 -2 -4 D2 i3d O43 o1W o0b t *56 ] i6O o4j O31 c i5- i5e i7d O71 f OB8 ^^sOPu i3G *56 *64 o7> *06 O09 o2d c $4 $f $r $e $e O29 o7z $ps[Zs@t sxN$g*20 ] sau O48 $h i0A r u d $6 O49 *84 ss! [ O23 $3 D2 Es_SR9 y4 c .6*13 i8? .B*50 *37 O48 s%m $b $e $g D4 O26 O74 *39 O21 K c $1 $7 $5 c $4 $4 $8 d 'A $5 o0[ ^zs&5+1 u d 'B $6 c $5 $6 $3 $( O09 c $7 $9 $0 c $7 $2 $5 +8$@ c $2 $5 $9 o2* *51 sF_ y2 O38 $D O1B 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 O24 p1 o82 t $c c $8 $1 $3 s2ei86 O48 Y4 c $6 $8 $8 c $4 $5 $3 c $6 $2 $5 c $4 $1 $7 i9v iAz s+D*27 o2M O02 o3u o0p i13 i37 *74 O34 O03 ^L +0sZJ p4 O65 O49 i5z q O6A c $6 $5 $7 c ^y ^M i8|$a O61 o6g T4'8s7t i1fD9K +3 -8 -1 +3 +4 +3 +3 +4 -5 O62 $A i3d i3d c $0 $1 $6 o7D *56R5 c $5 $1 $4 T2 ] $8 i68 i76 o2, c i1h i72 i3e O91 Y4 O85 o4O sKM O0A sYut $1 ^1 -0 o1j +1 T2 s!j OA7 i1L sl2 p5,9 $5 $d .4 +7 $R O47 i1a i7e s+Y^W i6, smG o9j -8 o9l [ $1 [ +1 -7 -6 $m Z1 'A +7 Z1$3 s9_skjd sqY*B1*96 z1 i1j i32i40i51i61 *63 z2 O92 $x O63 O71 sGsKl RA s.Y O52 d O03 *20 O41 [ $4 ^M y3sSc r O81 o5& O63 sj{ O94 OA7 ,7 *17 D3sCi*25 -8 *93 *73*93E T0 T8 T6 i47 K srl o6% i4K E $4 $a o8=sMl$Q $. O07 O14 O53 +4 O94 c $1 $0 $2 $6 c $2 $9 $3 OB8 O38 ^> sI3 *12 ^k D6 i5s ss3 K o9n O04 i1a $r Z1 } *09 *76 $t O72 .5o8R*39 o1p ^c 'A o7l D9 $r ^s } i31 i1a *87 O67 } o0m l O1A O04 sah iB# O56 .5L5 R4T0 sms c $8 $3 $1 o6Z -0*51 i19 i38 sBP O13 *76 i72 i1e i0O i1c i2t i83 c $2 $4 $9 ,B*04T4 $d $e $p ] *34 i62 i70 i82 i95 s$S sST D4 ^z o6) i41 i59 i69 i72 o6s.5 t ,5 ] i3s i3q ^8 ^3 ^7 $_ $s *76 O72 $t D9 O51 o8F c $0 $2 $7 c $4 $6 $9 sM- u O71 r $7 $6 cY1*51 $u O72 $z O63 i7a O01 i2r i3r i4a s!6 o8ZD6 i3y u c $2 $3 $5 $s -7 o4o [ ]s1m c i57 i0. } *13 O03 i0q i62 i70 i82 i99 [ [ $1 $/ O74 oBf$% o1f *20 c $4 $0 $7 c $6 $0 $1 *53 O13 o2/ c $0 $2 $4 i1e i72 l i4_ *A4s'Ou *26 O62 o4/ '9 ^d O02 d i3m +2 l$z c $# $3 *13 o0f ]*76 $g O52 o1x ^l c $9 $4 $5 *51 +1 stM$P ^t *23 o8v D7 O62 [ ^.,7 L6 O68 s)dY4 s + O6B y2 sjQE*71 i12 i52 i3v i4i c $4 $9 $0 c $2 $6 $7 +A -2 '9 o7s D3 T5 i3g O43 D5 O12 C $4 $7 i76 i55 [ *05 i3s k o5s Y2 D6 c $2 $3 $8 *30 D3 D4 i6s -2 *52 $GsHr i7e i7a y2 O52 s}p O12 ^y s3Q{*49 o00 ^1 ^7 ^8 ^4 O37 s40 -5 o61 i15 i55 c $6 $0 $9 O82 O98 Z2 smy ^K D4 D2 *53 *42t o0p] i5a i75 sup kY5sdS i70 i58 ^T O37 o5i i6r *B4$@ i8i D6 i77 i50 O31 o4_ *6A Z1*12RA i5b i7e i7% i82 i90 iA1 iB0 o8R*21sX` -3 -5 -4 -6 +2 +5 -3 sh. +7 K s"j*90T1 c $3 $7 $7 -5 -9 -5 y1 z3 O08 O02 Y2 O57 $3 $D ^D O35 u d $7 +0 +1 -2 $j $F o9L*12sI& c o1y O95 i2e l $t $e $s $t $@ $7 .6*35 LA +0 -5 -3 O0B $L O95 { $s c $9 $1 $4 o2Q O39 O13 i9s O02 c o62 $m $a $y $1 o54 O41 $S { c $5 $7 $7 O89 ] s5ts@0*02 *80 *30 i71 i89 i97 iA0 E sco o6n D7 O43 i6a oAUsB2$o -5 T0 O32 ^o -7o4e*B7 i9Ms(E +3 -6 -1 $F*A2 *90 $R O9A *1A^a $/*1Asu* shp u 'E $0 *67 *86 +1 +6 +6 $3 i8_ OA1 *65i3@*B0 c $3 $4 $8 $l O2B c $6 $5 $5 O71 o6j o4I c *45 o3g i7F ^n O32 O05 O65 -4 o0P +1 *14 c $2 $8 $7 $s $m [ i5. c $2 $6 $4 o7V O76 c $8 $8 $5 d '7 $8 Y3 sPT O42 -6 *67 o2. D1 l O96 -3 o7M o3Y c $! +A Y1T3swF $c $9 D8 o1! d O9A .9 +C +D +D $7 $@ ^o ^i ^b ^R E i8z '9 +5 O59 *98s;1 o7j p3 ,4 k +7 -4 -4 o7g ] +5 O91 T1o1co8{ *94 O15 R2 OAB L2 c $6 $1 $7 s(Eo4f o65 -7 d '4 Y4 o3xs?o d '4 d i6z O73 r O05 O04 Y1 iBt i62i70i81i91 i32i40i50i69 *5A O67 sk| O21 O3A O54 *25 R7*89R8 $8 O63 oBP}-7 ^Qs?W ^1 ^8 ^6 c $2 $9 $1 $2 $3 $2 $3 i71i89i99iA9 O74 *91 i6e [ i0f i1e i2r .5TA i79 i5a *24 i12 *2Ay5 *23 k +5 -3 -0 i5o i6n +3 +3 +9 D0 k t i3e i4l i5l iB6s"rso| +5 +7 +5 O47 i4d O81 $' -8 .3 y2o00 +7 $3 $1 $q $a $z +3 i4k i9a OA4 set $r +6 ^6 ^2 ^0 ^2 sL.i7* $! $2 oBu { D1 } ] $z $i $t *98s0( c { i4u O34 l ] $S D2 T0 o4# sh'o4Y O81 i81 $x $2 u d 'A $0 O26 .0 *12 i2p *12 l *30 -4 -3 *24 o03 ^1 sR2sU",1 soLq c $6 $1 $3 O91 d i2g t O0A $o Z1 d 'B $1 O42 -7 -3 -4 -4 *20 c O25 y3 *86 O34 OB4 s;S z2 o1y s!* *16 D1 i4e i5r $i *89 *A0.9o1s slfo5d*96 $i $f $s y4 O7A so5T7 +7 -3 -1 $2 $0 $2 $3 +A -3 i1u i2b i3b s7S +4 -2 -2 ^4 ^4 ^8 O13 o2y i5d [ T0 ,5 i71 i11 i1u o3i +1 ^b [ $@ o9S.A ^3 ^3 ^8 $2 D0 +0 $2 O58 ,1 ^2 ^4 ^7 $9 -8 *61 O47 s&^-6 *63 D3 c $@ $3 T1 $7 c $@ $9 *81^R C ^g -0 O32 O56 sFe O3A l +0 +3 +9 +7 -1 -0 T0 T2 T8 +B *9A ,6 O04 T3.1s%( i53 i5e k D4 O8B sar r $3 $5 c so0 $! +2 +2 -0 *53 -5 *45 O04 +0 -3 -7 o54 +7 c $4 $0 $6 t O32 O35 ^c t O03 d o4y*A6i6$ O9A O35 OB1 } s.w i81 i99 iA7 iB5 o2u c O03 i0T ,8s*8 se} ^J +6 oA|kz2 c $7 $2 $6 l o0c O6A iA* c i46 sEyC*64 *B6iB3$K O62 +7 Z2D9 p5-1 DA l +3 -0 +7 C $5 $3 i2p D5 i0s ^p +0 -6 -1 $1 ^- *9A O7A 'A -2 o40 *ABsu$ i5h T0 u ^C O05 ^h o9~ c $0 $2 $9 i62 i70 i80 i92 O47 *03 *80 *25RB *24^q qsnh +1 *87 c $1 $4 $6 +8 +9 -A *04 O12 i32i40i50i60 *A7sCo -4 ^r i4D ,1 O63 ssi R6oBf l o4z Z5 O64 i9x .9 sbs R1 l p5 O53 O7A [ i4b i9o O63 sdx l o0d o30 *63 o3& z2p5 D7 O12 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 O84 sqA D3 o0N [ $r u o2u R3 OA2 o9D *20 '9 l i71 i82 i93 ^b D4 i7h O98 +1 O24 Z5 $3 $. K]s,c ] $M ]*68,B i81 i99 iA6 iB4 *52 ,3 sm` i2G T0*78spq $t O85 i1a i2u i3l z2'8 Eo9A i5a i3c O72 $t i2l O61 -5 *24 -3 O03 *18 i6 O2A i82 i90 iA2 iB8 i73 i5e O04 $7 ss4 *60 O03 sdh '7 $e D1 ^N i4s -0 i5a i3b -2 o3J Z2o9Q $6 l O19 +8 t t ^t } sbJ C} p2 O34 r $0 $5 D3 i5n $k ,A sva O3B l +7 o4EsZM O34 Y4 c $6 $9 $! Z3 O54 $7 $A O46 i2| O34 q o0Uo8> D8 oA1 l o89 s!?{ O01 o4x iB8$`*4B s3a s1* $j $o $t $s -6 $p $i $n $c $h y5 O7B o1U [ i4i i5n i6a i6` c si! D2 -5 spM r o0H c $_ $0 z1 T2 oBAo3" $5 -7 ^B*B8 r $5 $2 $b $u i76 i50 c $3 $9 $6 'B $7 O03 $5 +7 o83 $. $5 OB1 $3 }ssO*1A i31 i1e scf z1 ^a *45 o0n O52 +5 u d 'B $9 E k *32 o2G D5 O54 d '7 $5 O06 p2 [ spC +0 *35 sDJ O45 *30 l$J ^v *31 z1s/ysN5 o11i9, i5f i5f sgp*A7 i71 i89 i98 iA1 o9y iB1 i1C i51 i1a l $b $a $l $l c o40 $N c i50 i5e O82 $b $3 $3 $3 $3 $m $x svR D4 O63 i5a i76 'A l o8m $h { T4 T8 T5 d 'A $6 *4Bq ^G l } ^k ^!LA $9y4 ^Z l i58 i74 D2 $e l $! $! $! $! T1*75 O91 $9 i7u O84 sQHiAMse3 *57 o56 OB5 [ O45 r i3d i1e o1e D7 *89*B0y5 $3 ^S *3B*37] *31 i3n l o6k O37 i9E *47 $p $l i4= o0s O15 o3u l i4U O03 *31 y4 O37 o1I [ O64 *10 t OBA D8 i5a i7c d OA5 c $3 $5 $8 $J $j l O26 O93 O91 $msn} i15 i15 ^-sH4] $d $a $b o49E $Us'? *59 iAd O67 OB1 -B ^C +1 k O23 [ $h o3, $a +7 i2d O79 $n +7 y5DA +1 -4 -4 iA#D7^P ,3 +0 o5k O04 O79 $n ^O ^H -5 *75 ${ O65 $, O2B +C -9 $m *76 T8 T6 $0 ^0 c $9 $1 $5 O85 OB1 i2y i77 i53 c $2 $2 $@ $@ ^KshU c $6 $! $6 +8 *40 *34 ^M O42 i82 i90 iA0 iB9 c $5 $5 $5 $! R5 O94 c ^8 ^0 ^0 ^2 -9.1 $d O8A i6o O32 *4A O6A T2 T8 T6 $A [ r -2 -4 -4 $7 *98 *30sZS { { c $2 $0 $2 $2 z2,8Z2 $2 $0 $2 $4 O12 ^o K T6 i5, -7s)t i42 i50 i61 i71 u T9 skos}. c i5_ $]+7 i0c i1h T4 +3 +0 +3 -5 +0 +3 -6 i5e i3b $\ '3 O64 spg *2Ay2 i8c oBY +3 K coBrY2 $5 O21 s#DY2[ *75 o0J s,Hss6 i41 i52 i71 i89 i98 iA0 i4h o2r i2t i3u i81 i99 iA7 iB0 Z4D4 .0 -5 Z1 O91 ,9 sDBsR^i0t i3e i5c O04 p4 O31 K c *86 i3b i5a d O25 i3b i5b i5c i7e ^m o2i +0 o2q *46 O35 l $0 $0 $0 ^i *03 c $. $9 d '6 $6 $4 O62 f O68 +9 p4 o0w *25 slNy2 i57 i74 l o8e *8A Y3 O21 $ToAr -E -E -E o64,8Z1 c ^M sri i9mz2 o3o i3k O15 q c $2 $8 $1 ^h o2t $Uo7| O43 i50 sjp iAf$b -0 -4 -4 c 'C $2 s3r+5K +0 +7 -6 ^js!< $2k Y3{ o6k [ ^7 ^7 ^5 r $6 $1 *20 D5 s^"'7 d O4A o5l O98 sJ/ i9e O54 *A1snu T0 o3v c $9 $2 $1 c $x $x z4 O06 o3v D6shs k ] *40 D6 O41 O02 O94 d O02 D4 i63 Z3 O53 $3 +5 y3 OB3 +3 -4 +3 O19 sQI } sD5 i4e i5n i6s +6 -3 +6 *87oA# c $4 $8 $6 u $i -0*57 -9q*69 O56 OA3 OB7 OB3 $K i9% o80 +7 i8v O5A O85 y2D8 c T3 $1 Y4 O02 O02 i9i o42 O74 T1 T6 T8 sbt ^Zsg6sxJ +1 o2b ^7 ] ^c i1j ^t l O17 Z4 O51 i6r 'AsFU o72 .1 ]]]]]]c syu -4 o0G o0e -2 *19 O23 p1 sbl *7Ai11 O12 $l E *25 o0m T7 $3 $b $7 s1. ^m ^m *69 O92 i7{ *02 k *13 i5e i75 i76 i59 syn [ ,1 sfn R8+B O54 ] $M ss5 sa4 sfCE *14,5 '8 K T6 O06 i0Z O0B O7A iBh ^< $> O92 $y $t O89 $s $o $w o5D i8So9F $r i7t saq { O45 t O42 z2 c $ $3 *5A$X { TB }s@k C O85 *BA i3d i5d +4 O54 ,3 $7 k ^A DA o2f i81 i99 iA6 iB8 ,7 -6 c $5 $9 $1 p5 i2K i21 i32 i43 oB2Y3*8A o7s *57 snws@) c $8 $5 $0 o4; *15 O9A +1 +3 -5 p1s(a o17 [ sdh*46 i7Y O36 i7O Z1 +9 D2 -6 i77 i55 O31 [ Y5 i4_ O54 *69$G -1 -1 -8 p5-0 i5t i6o ^A O21 T3p5 sys o0_ o0b c -5 [ skh *48 O83 -2^2 O02 i4f o34 t c $- $2 'B $c D6 D5 sAO } O59 i6i r $3 $6 OA4 O51 OA4 O87 *6BY1 c $_ $4 sCfssh o2c sck -B $9 c $5 $8 $9 sTG O86 R8 i1h i2i i3n z4 O16 i4e O13 ^W *97 y2]s^W $a O29 O63 *87 O21 *4A $3 O23 i8Y q O16 'A i54 i70 *74+6 [ o3r [ E K srg OB3 C $7 $0 ^a O41 o0m^a i5a *04 +5sk9*29 *9A *89 *54K*A3 *41 D1 *65iBBsr< s{8 ^. O1B $2 $0 $2 $9 +7 *57 s#al*48 o7u *67 i51 i1e [ K E i74 i54 stYsvp i3e i5b i14 i54 c $0 $2 $3 O2A *85 -2 o4y T4D5 o1B *10 *50 O32 *74 *65 i6E c $4 $6 $0 *A0 O56 ^j O21 o34 +3 +5 -0 O35 *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 O84 -9 i34 i42 i50 c $2 $9 $5 i73 i59 .3 E -5 D1 sk]d O41 $4 K O97 siJ T1 $8 *95^2 ^r i1t ^4 c o58 *65 o3r O42 *ABz2 ^b +1 O72 o6u s<}R4 *A8.6$| OA3 ^Q l o8d ] -2 *53 +5 o89 +9 [ O57 K s?K*40D4 *59seZ cs,.+5 $>$= i60t $1 *54 *68u 'B o6l i45 i55 u OA3 s(= $x O92 o4E t o8Q [ O91 i5. snh s{J^Q [dR9 *16 O03 sbM O23 *A8 C $4 $6 ] $R i3e i4y ^T O13 ^0 ^3 ^0 ^2 oB+Z1+4 o0h *82 OA1 +1 +5 +3 i7x O9A o8G i0r i2b i1o ] T2 p4 c $& $1 s7a OA1 D1 $m $A [ o3k E *15 o0s s5t $2 $0 $1 $0 $# u 'D $6 ,8y4r *14 r *63 *25 D1 ^d O51 o3l +1 $o *65 O97 ^6 *35 i58 i77 O18 u i19 i30 o1s i0g O14 ^y i2a i3n $nsL@ s_. l [ ^Z u *75 Z5 u sXb^yi3q .5.2 $+ O94 OA3 OA4 i9l D7 ^M O31 s9s -5 l +1 -3 -2 'B D3 o6C l $s *74 .8 O97 i34 T4 o1e *31 +1 +7 -0 +7 *13 +0 *B9 O65 c $4 $1 $8 Y4 'B D5 *32 ^s *65 *58 D7 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 O9B O3B D7 z2 o0m *50Y2 l o3c -2 -A +4 *25 o9e O63 i17 i14 +9 +A +B i3e i79 OA1 D9 E i2j i3a c OAB ,7 scK ^V O12 *34 +5 $s D1 O03 O84 i91$n -0 -5 -3 $f $A *89i1m $AsUpiAk C '9 $1 $n $e $s $s +4 *02 c $4 $8 $0 $0 +3 +6 +3 Y3 O35 c $5 $0 $6 ^7 ^6 ^7 o4< Z5 O1A $u O52 +2 -1 +3 skWs!* *50 +0 z2 *31 D3 p4 Y5Y2 $1 $9 $9 $1 $@ o6` t c $5 $1 $3 smp $k i8o Y5 OA3 i61 i70 i80 *58s_R OB5 L6 O12 $l T0 D8 D5 *21 ^j p2oAFs+# y5 O43 O04 $s c $2 $8 $6 $t $o $g i15 i14 $j $a +1 i0i O2B .7 *08 sh[^e *17$s ]o1h i52 i60 i70 i88 -0 -0 -7 p3 *68 -4 o67 +0 +0 +5 ^d i1l $d $u $g c o1e ,7 +0 i77 i54 o1Hs[. i71 i89 i96 iA8 c $1 $8 $4 $4 O28 i61 i70 i81 'A D3 C 'A +5 -2 -2 i71 i3b i4z O53 o2z *21 D5 D4 i89s)'*17 o1K k +A O62 o2p +3 o6o *61 +C -B -B o2l *42 l ] $B i0b i1a i2r o3U siR*20Y3 c $8 $9 $7 o3s c +5 '9 i7D o6a i3I c $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 O01 l o3l ^3 O07 $d i5c i5c i82 i90 iA0 iB0 o8% c O02 o33 O74 o2o c O51 $6 iA/ .A O64 i13 i14 i5e i78 *61 { i14 i34 $1 $2 $* $* *53 -0 R3 O7B s'D i4h'A i1e i5d $s $o $t *96 O52 D1iAq C $4 $1 o6e +5 +0 -9 -1 $7 o61 *15 OA9 O24 sp> sYl O67 $^ ^2 i85 sck O61 o3- [ $%sLHl c $0 $. sB#sKW*15 OA9 OA3 i11 i51 $2 $0 $2 $7 C $4 $3 c sa@ so0 O51 $! $l ^a o15 [ i2y l O56 s ` R8 i6f *64 k +5 O43 q EsJ^ i7do5v k $x c $4 $4 $9 ^A D4 Z1 o5_ ]s\o $_$! O14 O1B $0 $4 $0 $4 $$$# ^3 $d O07 DA^' c $2 $1 $! c $5 $9 $7 i3- [ ^4 s6P O02 s\N o0a $p $r $y +1 -0 -5 o6` OB2 i32 i1e K o56 $2$0$2$1 s0S K o7- ] TA O6A O12 $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 DA*38 } ^F +1 +9 +1 $9 OA2 LA OBA i7? ,8 OB7 T5 o6c [ c $4 $1 $6 OA8 C s13 Z1 O61 O62 D3 o2_ $2 $0 $2 $5 +9 -8 -1 *21 i0m [ i6o ,4 *04 .1 *41 -0 i1! $= $1 sW" O39 ^h ^x i0t i54 i62 i70 i3g i4e i5r -3 -4 -3 *76l$P R1z1 ] o2d *A0o2jo9l E o5v o6` i5X o7s O51 ^1 ^@ skjo7+s f c $3 $8 $9 +3 -5 -2 i32 i3d *56 o5j sck O21 c ^ ^1 o8+l DB$5 o3d $1 ^s O82 o19 [ } OAB O51 $9 $8 $! -8sdU s4) syk OB7 i67 i78 O64 ] ,1 -8 E i6Y t $8 -7 O83 i75 i53 TE ^o } c $3 $8 $7 *79 -9 i10 i14 -5 i5n $. $9 O02 $A +7 $4 ,7 p5 O75 o59 sQF D1K i4d i5e i12 i35 D5 *24 *B0i6N sUyY2 o8.l Z1 O32 Z4 OB6 *50 O53 o3J $1 $8 $0 $5 y3 O37 *B7^U p2 O62 '8 ^!s7j i11 i16 D6 *82 O82 TBo1R $3 { o6s c i78 o0K ^R D7 O13 -2 O64 O91 Y2 ] o6n ^a O61 o0J *76 i3n c i77 i57 o3s [ p2 oB! sbq o1z*59sJV i4L .4 *52s/6 [Y1$h *81y4 i50 i74 D6 ^m *98 O63 sag y2Ki7R i5e i5a sio O64 Y4 i3d i7a i3b p4 '7 l r*8A -8s9' s\J O45 O75 D4 o2b i3b i5e t i5y i8a i9n iAd O06 ^X *B4 i32i40i50i68 [ ^Y o1i i7c i7d *36 D3 [ iA(syP$m O53 t i82 i90 iA1 iB5 O73 l *B5 'B i82 i90 iA2 iB7 } -1 o8c 'B $b O72 l O23 o8( ^f +1 c o85 i4y +3 sKN ^_ $_ -0 o3c $3 $c $2 ^@ O28 t .6sk} i9? O93 *87 Y4 O87 'B $3 c $6 $5 $1 LB ^! O4A i31 i73 f ,1 O29 -2 i3l O25 Z1 i72 i80 i92 iA9 o3g *02 $7 $a '7s<) i72 i58 *A6 O31 T1 O9A *69 $1 -7 ,1 E -8 ^S t O4B ,5 o5B i6u D4 f O86 sf`s#OsD{ o8#RA $c $0 o4cK $s iAi $y $s O95 O49 O47 *30 i3c i7c i74 i7a *54 o0K $po1r *38,A Y2y2*96 .7Y2 o6e [ $h $e $x +4i7S c $9 $0 $3 o3w *31 p4 s_; O32 ] o7n [ ^L o3nY5 O91 $k *12 o1j i5e i77 i71 i89 i97 iA9 i44 i52 i60 *24l ^j ^r O56 E Z5 l o4b i5d i1e ]Y1TB O12 *30 O31 $1 $1 $! OA1 $6 +A c i32 u O45 $_ D1 ^5 c s8! i5- D2 *54 O12 -9 OA2 i4n T0 $1 $e O42 K t OB5 *51 O68 O84 ko3% Y4 .5 s z*93y1 *34 o2x D4 t $1 $9 $5 $8 s*Hi8i +5 O63 o7K t O32 o2. O87 i9l ^. r O23 ,6 y1 i89 -9 } ^b i0l i1i i2l T7Z5 ^d ^o ^o ^w $NsWp d i3J O29 p4'B i2a l *19 i4s Cs`" uZ3 O03 $7 o77 D6 -6 T0 *A2o0i o7s c o5) T7*64 D2 ^b i2i i3t i4e i82 i90 iA2 iB5 -0s6_K y1 -2 O14 C +8 O54 s#! c ^c ^1 -8 O04 ] ] ] $i l o6g O42 Y4 i3W O36 L7 s1j Y5 O14 c $4 $4 $9 $0 Y2 O64 .1 +6 -7 i7o O43 sAT +4 -6 +4 $>$> i81 i99 iA9 iB7 -5 '6 k i1m *68o5bRA sSP c $1 $4 $9 -8 DA +8 O42 *13 $A +1 +2 -0 $u O2A o7p OA4 $1 $+ i14 i11 srEK c $2 $8 $0 $3 ^g O32 *02 ^b O13 ^C D5 $i Y4 O36 o3v O02 $6 ^g ^o ^d $!D6 s1J O91 .9 +0 ^1 i10 i50 +8 c O7B z1 ^j o5j +0 D6 o2w D8EsT; i5{o6S^d $i O12 '7y3 i51i69i79i87 u O67 O2A o6oc[ +3 +3 +8 Y5 i4- O28 c o30 i4A t *5AseLo5s O65 Z4 +2 o71 i18 i58 s>}'9 shv O02 ^X i79 i19 T7 ^1 OA9 ^o +8 o6a ^El o1l *13 c $8 $8 $! $! t i4y ^7 ^2 ^0 ^2 $- $m oAf +7 -0 -3 i9J ] ] ] $d $o $g -6 O04 ^Cszx s3Xtsi! *34 +1 $o $r $e $o i4m i5a i6n i1bo9Zc i6O K T5Z1*87 T0 o6s s3U i5e i76 $b $a $l $l *03 O78 c $3 $d *01 $t [ ,7 t +0 O13 ,7 '6 *54 $4 $5 $1 $2 +2 +2 -3 y3*69*68 i35 OB5 OB6 *32 *42 ^' ^( O95 o9{ iAJ O94 *64 O3A stl oA1 l y5 O4A O45 ^L OB3 s{" ^2 D5 r $5 $8 O31 T1 *40 O34 O7A ,6 .1 o0L p5 kd $K t +0 -2 +3 o5v D0 *80y5 $s *31 i81 i99 iA6 iB3 $K r +5 +5 +6 +2 -5 -5 *32s2Ts?d s1\$<'8 *B1 O6A $7 O54 c shj O67 *BA *67*0B$x $h $o $b ,7 +0 t sHP stf i15 i11 K } Y5 O8B d iBa O74 T2[ o8Q sYj O1B ,Bs]x O14 i4y k O18 i4y -7 O03 o3ii65 l i6t $0 $5 $1 $0 oAmi5& .6L9s>i +6 c O52 o4g $iiBH i7;s_>s,q ,5{ -5 D3 o6Os9" t o0S o30 o62 *26 D6 O02 O82 u *30 -0 $a 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 O02 o4- [ z3 'B $0 } o1c i6# OB5 D6-8 *32 i1u d 'A $4 l $S $csGZ O21 O52 ^g ^s s|7 O61 *87 D2 O2A y3 i6i O02 D6s#X O54 $3 c $7 $7 $4 $v D7 -2 i3b c $8 $0 $1 OA6 *3B O49 *15 o2n -4 i5i O31 l o4v +A -4 -1 -4 -4 *50 +2 *76 +8 C $3 $9 sKC O47 O38 } ^s i71 i89 i98 iA8 *31 i1a Ei8x O01 $p c $9 $3 $6 E -5 l ^n ^a ^m } O8A i3n D5 o4d si)T6i0! c $8 $9 $1 sjc c $6 $6 $3 i57 D8 $b $o $s $c $h *79 'A *01 [ $t c $5 $0 $8 $2 O32 Z3 TB O62 $_ d ] *78 O6A D7 ^~ skn o1o c $1 $7 $6 l O92 $x D5 o21 O2B smH r ^S o7h o8i *21 O25 ^p t -6 -1 i21i39i49i55 [ Y5 O36 sci -4 -6 -5 -7 O75 sik ^R o0y,8 o3B o2b *32 O12 r u $r D5TB D2 *54 +8 D4 { $P l *98p5 i81 i99 iA6 iB7 Y4 O24 o4fsDV D7 p4 D6oBmy4 +6 O73 Ei31 sAE OA6 i72 i80 i91 iA8 i72 i80 i91 iA7 *15 .1 D8 ,8 *A8 O04 iBz sOI O07 so=i3l.A +2 -8 -9 O71 'B o65 t +0 -1 +5 sA2 ] o6g *94 .2 O05 +9 +9 -3 ^Psp6 p4 *16 sae i2m i4d i5o i6n ^P +3 O93 sO| Y1 csP;} +0 -2 +5 k o3- +6 -1 +7 sXw O45 sTL ] i4_ O71 } $6 +7 +0 +1 -6 i0S D4 +9 -B -A sslsAd se3 $! *62 O42 i91 iA! c $@ $5 iB5*28 i72 i80 i92 iA4 +1 -6 -0 -5 -8 -5 *35 r i34 i45 i56 sXa oA_ R5 O62 s/cp1*73 .BR4 O39 K *52 o1A $E u o5?*64 ^e ^n ^u ^J i6m i7a i8r -0 -0 -5 D2 l ^M +7 i12 i13 s'}sB`*8A $s $y $r $u $p oBf ^A +6 *76 o5t *02r +5 +5 -6 *40 O24 oA# $s O57 o2x *01 *85o0d s%} ,2 *64 ] Z1 T6 $j { *53 O62 i72 i80 i92 iA6 d O28 .8*60 sg7 *42 o0D $d O52 Z1 -A s(=^\ -B D7 i0P D2 snks27 o4R o3x *23 $2 $1 $! $d ^l i3c i7a o87 O52 se3 T1 i3@ sZD OB8 o8O +6 $@ szu c $0 $2 $8 'B soa $3 -8 o7e O43 +3 D6 $9 { O29 *69 O5A i7a i72 O19 *0A iAasT,'B u d 'A $7 K O84 -9 i5e O62 O24 O51 i6m ] O49 +3 } $1 O36 C $4 $0 d O23 i2m c $@ $4 C $4 $8 c $6 $8 $9 s5Z O91 o7s *35 D2 i8_ l -5 *46 *82Y4 o0w z1 K +2 ^C +2 C $6 $1 O92 $m '9 o7y i1r i2e i3s l ^d ^r ^a ^h y4 Y1 +5+B iAm O04 $3 OB3 d ^a'4sO' ] O38 o0t ^D $m D9 O03 f $/ $1 o7C sjZ^^{ ^a ^g ^n ^a ^m ^y -2 +1+B i77 i7a +1 $s oBg sU} sgp O24 c $9 $5 $0 c $1 $6 $9 -3 ^r D1 $l *27 o2n spWsxz O21 i6e *06 +6 o60l $$ O72 ,7 ,6 y3 O32 $b { O17 *86 Z2 i74 i55 Es{J*52 s31 o77 o4x O21 T3 O13 sz_ i2r i3l i4i o8; l o74 o3u *21 [ T2 D8 $2 t $w O18 ^Z *25 O32 $x+0 *60]E c $1 $7 $3 i82 i90 iA0 iB2 l $i $t $e o7_ T0 i3f i7f $($( $s $o $b O41 ^i ^a ^n ^a i62 i70 i82 i98 stD O02 Ei9msPD s,Rs`Ei42 $z D4 [ o5g z2 o1k '7 $! std *78 '9 -8st7 i7h l ^3 ^4 ^7 c $1 $9 $3 *20 *50 -1 i4a O43 E Z5 d OA3 '7 O36 *31 $s ^k $8 $a i5c i5f $k ^D T4Z4 *8A p5 O19 O31 D4 -6 D2 o0D i40 i51 O26 sh{ o4r Y1 O6B o32 t r $6 $4 *5A*57$! *73^B $t O95 i3M -7 s1L c o1l Y2*B6 O48 D3 i1t -0 $7 ^7 r $7 $1 c $9 $0 $4 s!P*69 c $9 $@ u $2 $0 $0 $0 i2C o3u ^m O48 sS& ^0 ki9dt o4o *24 ^H L1 o93 +8 ^!,A i0f i1l i2o +5 -0 +5 *62 O32 ^y o1k c o58 $a O54 i7m O25 i8C -3 l O0A .5 i73 i56 Z1 O72 p3 *16 D3 i4k i9;s0k o6c [ +5 i5z O14 *59o8_ o5{ c $4 $5 $9 ^a ^g ^e ^m $"$" $s -5 c $7 $0 $5 c $3 $4 $1 O07 p3 ^R D3 i7bE K*50 +1 -2 +5 *68 o6r c i50 $c *67 c $5 $8 $7 su}i6" sU}]*53 ,1T6 O81 $9 Z1 O53 $r $h $o +0 i5t o44,5 f [ +5 [ -2 i0$ OB9 *28 O21 o0C $a $s $u $s t ^e i19 i34 T3 T8 T4 c$1$2$3$, Z1*35 ^y ^k ^s p2 OB3 s+vZ5 i6R D0 c $6 $1 $8 l'Br [ o5i +5 -1 -2 o9) O15 i6k T0 i5f O13 '8 i4_ $3*47 i42i50i60i70 O62 ^M i81 i99 iA7 iB9 $7 $7 $7 $7 i50 i76 o8m O93 -0 -5 -1 [ o5n c $2 $1 $2 $5 y2D6 *70 O01 c $1 $6 $4 O52 i5@ O52 $2 $6 $0 $4 i7j OB2 i0s $a -7 o6. RB$p i0f i1r i2e o3h [ snu D9 -A i70 i10 $- -4 sCR t o77 sezd T0 O74 suP o81*4BDB c ^1 ^8 ^9 ^1 c $2 $3 $! i51 i3e $r *A9 *A8z1 $d D5 ^d *40 s2w*20 *62 +2 *30Z1 ,6*19 *64s;4 *40s9B O61 ^i $L r +B +C +B -6 l i4x s^{ O92 o8~ r $6 $0 -0 -8 -0 c $_ $6 *49saxsWk c $2 $9 $7 *03 ^a -0 O52 *31 *34 *45 O67 i71 i54 +1 +1 +6 *2B*9A*46 Y1 O75 o0D ,7 TBi6j $b $5 Y4 O32 so9 O42 i3J -4 O13 RA ^f i1y +3 -1 -2 i51 i69 i78 i85 $0 $1 $! $! ] $B sD1Z3c s4A sub OA2 L0 z1 Y2 O96 u i2v *13 +2 -0 -1 o1a -9 oAb i0L O23 sig i6k D4 u $7 $7 $7 i5d i54 l i4h $a .3 *68 *78 -0i8A i6F svm o1o O71 O43 o2n [*92Z2 O31 o0D o0t z1 *62 o2s s0j i37 i3e l ] $R *68*46 +2 -3 -5 O1A ^q }D8s/e i75 i7e i6s O21 ^$ $$ i4z *64 i4X *4A}^9 $e o8v i58 i73 c $3 $@ i30 i3e } ^1 s_f c $1 $3 $! $! i3a i4s i5h O5A o8c i2c i3h i4i o8o l OB1 $2 +0 -5 +0 $i Z1 o5' OAB +6 -0 -0 iAn O64 i72i80i91iA1 i5a i78 *15 O13 D2 O07 $n O79 *A4 smW i5f i5d i51 i69 i78 i81 OA1 +A i4b t O43 O4A i5u O21 .5 C OB2 i1e i1f i5o i6g t *63 c $6 $8 $0 [ srz c $3 $5 $2 OB8 $Y *87 O92 s1M $b $a $a ,1 D3 $=$- +0 +0 +9 i5b i6o i7y o2h*A2 $! $! $! $! '7 D4 i5r l O23 D1 ^0 Y3u snl C O3A OA1 o2< sTB iAk o6~ c $2 $6 $8 snw c $7 $@ sgR c $9 $3 $1 i74 i53 O21 ^l D6 O97 *08i2u 'B +7 ^l *03 *67 o6- D6 +7 '9 o4. '7 $s oAi O98 o8e Y2 O43 *67 *56 *13 i4y i41 i59 Z5s`j i0v i1i i1e i3c sc| r *36 p5 $l *A1 sal D1 o2h -1 *43 O23 D8 p2 { O94 sme sGi$8 i0b i2g i1i c i72 .1$n O15 o0j O02 *02 +3 sjGcs!K -0 ^J D2 O59 O71 $a i4t +2 $n l r ^f { $k c $8 $1 $7 r $5 $7 TA O49 ^u *31 c $8 $9 $! k i3h $s -8 sv= i1h O29 i72i80i90iA1 c $2 $8 $3 i0a i1n o7z l i70 O21 O31 O83 D3 D4 c $ $7 -2 i0m i6i i7n i8g sRvi2' o7~ ^6} Y4 O2B O13 -4 -6 -4 D7 D4 -2 ^k O03 +6 OA1 sae D0 o2n ^c s1g O7A *86 -8 -2 -9 -3 c $7 $6 $0 O12 i3g ^k +3 $e $w c $X ^X $x ^x l Z1 $y +3$?s^s r ^M O52 Y5 E i4c l +9 D5 sUG^0 ^s i1j *9Bsu,i1c i76 D5 i70 R6 L6 oA? Z1 O71 sA` +6 o39 i21 i32 i43 i54 *31E [ i33 o6t O03 $D r O24 ^m $9 $5 $! s$bo4lsuO r $7 $3 OA5 i9v sah O13 o0C *52swJ sFS o7( s(1 *18 p3 *48 u ^x $x c $1 $4 $! i7q $a OB4 l ^o ^r ^p +4 o3g sbk +2} r $4 $7 i18 i18 sYhZ3 Y2 o9i *28] O39 -1 p1 OA5 O07 i4n *65 OAB o3- r O63 -0 } r $4 $1 *87 .1 i68 i79 *87.4 l ^o ^i ^b o5v l p3 o19 -0 $1 E *13 y2 O91 D5 ^e i6r i7e OA6 z1 o4V $_ ^1 i7a i78 *05 O03 s5s O51 i44 i16 i11 [ ^b i8Z .8 C O04 O19 syk c*18K sq@s){ z1 OB5 E R1*A7K R9Y5 c $9 $2 $6 *68^a c $4 $2 $5 c $8 $7 $9 c o79 p4 o0x *9A +0 ^B $r *98 p5so0 ]D5 O67 O98 Z2 sp% $o O65 ] o1r $@ i61 ssm iB< O34 O56 $- $x O32 $7 i71 i56 t s9! O78 ^- o7U i7f i7d o65]*2A s;.$N $M +0 -5*2A ] $w D0 i5x ^j $s so3s+K.5 s9# sAR .4cY2 } d O04 +7 ^F p3 K o7a +8 c $5 $. i3s i4e i5r $1 $2 $3 $_ o8n O91 *28.1y2 y2 OA6 p3 -3 i0c i1a i2n o9)^d o6C t O09 i1j s,(+7 '9 o7n u i8, Z1 o59 syd OB9 o1j s$T .6 O36 o68 -8 r $6 $2 *51ss9 O01 $x sxp i82 i90 iA2 iB6 O02 o2- O62 -1 c $8 $9 $2 o97 c ^E O14 p5 O23 p1 O03 i2f O79 i3o i4t c $9 $* i51i69i79i88 ^x ] } i22i30i40i50 i71 i89 i96 iA3 +3 ^m sh6*9Bi6Z s1;i1a ^T D3 i71 i89 i97 iA8 iBu o5$ OA1 u*08 sJK *30$l $L*6B ^1 o8k O95 O73 O53 +3 o4_ o3/ *1B^M +5 *65 ^` l } +0 o3i *53 -2 -2 -5 s0)*56sAX } c sVR .1 [ +6 *43 O41 +4 i4z o1M { *25 *54 sXR$9 swy i38 i72 i72 i56 O28 sDU *03 O51 ^n i81 i99 iA6 iB6 i31i49i59i67 D7 o7- Z1 $. oAssG- shL^t l ^p ^u i19 i18 ]R6 r $6 $8 i6" O84 *A8^0*4B i3U E O53 i11 i71 -3 *64 *25 o2p -0 *05 D0 s!2 $9 o76 c $5 $2 $4 *3B[r +6 o78 Y4$b $i $c $y C $4 $9 d 'B $2 i21i39i49i58 s,&Z3 o6m l i1a i79 $3 $* $t O42 } O13 slny5 s3M OAB p4 sz|^c ] y4 $5 oAt '5 $3 -2 *05 i9a O61 $9 $6 $! c $7 $1 $5 +0 D8 s/X O85 ^c *30 -5.6 t *31 c -3 c $4 $9 $6 i81 i99 iA6 iB0 $8 { *35 k c $8 $3 $8 s52 o71 O52 *31 l o4g O15 O52 u $1 $9 $8 $9 i1a i2p i3p c $3 $1 $9 i72 i54 OA3 *80 y2 $a $d $e $r +6 $e i4_ +5 ] O45 ^9 t O05 O36 iBM O62 l i96 iA6 iB6 $p { c $6 $0 $3 O83 +0 -4 *42 [ *40 k $_ [ [ *34,6 c D7 i4Y c c d '8 +5 -4 -6 oB *90^. *18-7 $# $3 s0/i6@ t ,7 i1o -4 -2s>Y i78 i5a $2 $3 $0 $7 i3a i74 O41 i2o *56 o69 $1 $9 $4 $5 T9-1,A i67 i76 $n o9e Z1 $c i5e i6r i3k i4o i51 i69 i78 i82 $o +8 s%(c*9A i9p O57 $1 $2 $@ $@ *65 o0r Y2 $2 E +5 O68 *20.2 [ o5l i0r +D -E -E $s *68 *32 *25 ciBd ^p O52 ^j *24 p1 s12 $h ^a R4*7B r $8 $1 o0.^w i0A i1u i2g -Bo6{o3I i72 i7d O32 D1 o8C O35 O08 f O8A o8a *28o01 iAc O78 +3 -5 -1 DB^cs05 $2 $0 $2 $6 $1 ^_ srn d OA6 c $3 $3 $! ,7o3r D1 T1 y5 { *B5^! c d 'A $1 ] o2W +2 +4 +4 *1B$5Z2 [*09Z2 Z4 O38 LB *47*80 O84 O98 i5c i1a $r $i $k $i ^4 t o4t *45 $* ^1 *91 o9r $q$l*79 D7 $i [ $9 r $3 $7 { -0 t O91 oAk D5 $0 O21 O62 i4N s5=shD i56 i66 i76 i0b D5 D7 $1 O0B s3X .6 D1 i4p -2 *12 +0 r $4 $0 o7L O1A i51 i69 i78 i80 c $= $1 *52 [ k o61 $. *64 *34 OB3 ^B D4 s1b *75 o6e Y4 [ O46 *51 O32 *30 +0 s23 $4 $c *13 r *67 sH5 i1a i5d i3/ o2Ssqis>L scJ ^l '9 s|9rE i8G D1 ^B O56 $a OA6 o7bsV& $7 O82 O61 OA1 l y1oAX iBLR5 sNK i52 i60 i70 i81 sUso9so6& li6R *69i8z O14 z3 K*70 i71 i89 i96 iA7 i5hsC6 -4 { OB8 $m $/ O71 *45 o0g i71 i89 i96 iA4 i81 i99 iA8 iB1 i81 i99 iA8 iB8 s%JoA|^e ] $3 ,2 *52 +4 +1 i51 R6 O93 *83 $G D3 +1 i5w [ $s $t $a $n c $0 $9 $5 c $9 $1 $8 .6 +0 D5 $a O32 +5 i5c i5b i74 i59 c $6 $3 $2 O53 y2 i81 i92 iA3 i61 i79 i86 i91 ] ,2 $3 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 O48 $& *35 O91 o8_ i25 i33 '9 i5t i70 i57 i6f *76 *08 +4 -5*79R7 O3B c Z3 +6 *43 y3 O07 i5j O13 O28 o3c T2 { t -0 c $4 $2 $7 s.) OB3 O12 O07 i7, [ p1 O63 o0C*A4 +5 o3k i1f i1f '6dsx0 i33 i74 +1 -0 +5 i1O t ] ^( o4F O09 .1 O64 o8! *8A O54 sGWi6;o8; .4 } *24 O56 l o9e } E o78 O72 -5 o0r O24 sdg } o78 E sBi O15 sxS $a t +2 -3 -9 $2 T6 i5e i54 D6 +A Z1 O15 z2 O0B 'A $i O54 ,1 +3 } O52 Z4t ,1 i1i +8 +8 -0 c $9 $4 $! i9Z c $1 $3 $9 o6Os6X i78 R6 L6 i41 i52 i63 i74 slL $C*74 o4N *23 o7r O82 -4 o52 i8_ p2 s;qp1 O32 ^S +9 +9 -1 o4p D1 O24 *74 K .0 [ ^N o55 p4 s19 Z1 r p5 c ^1 $3 D4 ^A $7 $! Y2K*1B i5n *76 i0f i1l *75*12Y3 *0Asb+ i52 i11 i3? i3M O34 o0k *34 O13 i41i59i69i78 l ] $D $b sbf '5 Y5 $j $o $g k OA9 Y3 o2Y t c $9 $2 $! iA2 l O59 d $7 lY5 c $6 $0 $4 [y4 u ^" C*9B l.6 i4P O21 OA6 *62 *73 s2C*42*B9 ] O71 $1o4f O51 O62 ^d ^a ^b *67 *B3 O76 ^r *03 *78$r ^M -1 i9B D3 OB5 ^q z1 s.KY3 c o2n c $0 $7 $8 oBpsgP[ l O39 $% O71 snG c i1i $0 -7 -7 c sIC *21 i4t O84 s.@ K o14 s^_E} *A2$h o3% c $4 $6 $2 R4 *A5 O67 ^dsV6*BA $! O02 o0x ] sBT O42 i6< o6t O93 p2 i4E E *95]D4 i71 i57 .4 soV O37 D7 k ^g ^n ^o ^l $_ $p c $7 $0 $4 y3 O53 Z5 O0B ^3 { T3 l o2j O32 -5 c $4 $8 $2 c $2 $6 $3 c $5 $9 $6 s7q *B6sk^$| s*-*06 D0*A1 +0 +2 +3 O61 *41 i7E O07 *17 O82 +5 ^p O34 i7ccoB) y1*57D2 Y3 o0F i1p] d '7 $0 i5p O12 K O93 $m $e $w ,1oB@l RB p2 +0 -2 -5 i62 i70 i82 i93 $s *56 p2 $S K c $9 $8 $6 i31i49i59i69 i5f i71 q O36 i2E $e D4 $ks"ac '4y3 ^b o2n ] *20 sic O23 -8Y2 i9O -6 -7 -9 -8 ^p o1k i0r D6 $a O85 i17 i10 O76 f c ] O3A o3Q l c $3 $6 $2 -9 -C c $ $9 O54 Y2 '7 +5 o5dsw/ E R3 i4i i5t iB@ u 'E $4 O12 Z3 *90 i14 i14 z5 O17 k O08 t Z1 OA3 *24D6 $4 O23 oB@ T8 OB4 o6* Z1 *A9 O24 O51 s5Qs 2 o7) o3l *21 o7X ^z O24 OA8 snd D4 -7 r $8 $0 i5- -6 t -8 .A s1x O27 $5 $a ^MK i16 i35 *B5o0Oskr iAf { $e O13 $1 $t $e $s $t O89 +5 [ l O21 *74 s=uD8iB< $9 $@ i6o i7n i8e $tTB i9a iAr iBt [ o5f i52 i60 i72 i80 *49-8T7 *21 O38 d ^t *04 s%L O52 y2 i6n i7o i81 c $9 $6 $! '9 i9t slu *B4E$W $2p5 D6 *05 i76 i5e p4 o15 *93^R +5 o4v ^S r O05 Z1 ] o5g Y3*37 *41 O68 s8l O81 T4 .8 O04 o8z i4sss2.A *15*59 O87 $n -8o9,sG\ ^i ^b .8Z3 sbH^0 R0 R1 o1vs,C iBH*06 c 'C $7 ^w O34 Z5 O34 iAe O72 O17 s+v Y5 R7d*8B $a $b $c $d O51 o1h *06 O42 i6m i7a rsly o6w ] 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 { O74 sd%o7p ^X O89 o7Q i42 i50 i61 i72 i3f i1e O02 $f *78y2sKS o4fsS0 R6 o0W r ^R p3 *34 Z1 k -7 [ sYB $_$* i58 O23 s",o1M $_$. i97 O63 *61 O02 slz i42 i50 i60 i78 -5 o62 p4 s-* OB3 i31i49i59i68 ] +6 ,4 r sRG *13 ,1 sJC o1z ^j [ $0 ko76 i76 R6 L6 iA]*65 i5d i7d c $2 $k i52 i60 i70 i85 D0 o6g +B -9 -A O12 -4 sbe O57 c .8i5j D2 D1 D4 D5 i72[ *03 O59 D7 $0 O19 o6y l TAo1{o9e +2 +8 +8 $2 $m $e u L8 *21 O24 O54 oB` t $1 $0 $* $* O76 *03 '5 $5 sr1 $1 $1 $@ $@ -1 o08 *05 o4i O36 { z4 'B [ Z1 l O2A ,4 Ei4@ i2R c i5s D1 o3v *23 $M [ [ $f Y4s(\ i1a i70 Z1 D3 +5 -4 -7 -4 'A o8m sik O38 OA6 t O54 cs0< smO*95i9X i79 R6 L6 +C +C -B *B1*94$8 +2 -4 -4 +5 -1 +5 ss# i12 i14 -0 -6 -1 i12 i15 $v O41 *31 ^f } sN- i13 i53 -4 -8 -8 +1 *52 o7W iA0 O73 ^s O63 o0J t $* i6* ^4 C i5e i6r i70 +0sGo -2 ^c i0h ^d siX O75 $A $2 $. ^C p4 ^Gi6= i78 i7a soU +3 +6 +6 +2 *35 *03 o1t O92 -9 +9 -B +A i4m i5e r D6 ^G D3 +0 -3 -2 O64 i0k +1-A +0 -D $s [ O32 *69^@ iB6Y2 y5 O91 R5 R5 i0j i1a c $f $1 ^s l i3s.3 '6 $k o2- *01 ^o ^l o3t O53 iBn O75 +5 $Cs8e $esfNl $w D8 [ slt k K sd{iB) O13 *31 O78 $u ^e O71 *65 D3 *69 '8 OB2 O43 O03 [ ^3 ,2 soa [ o3[ O12 *01 D1 ] ,2 *74 +5 i5# }+1 O79 D8 c o77 i1H -3 *57 ,6 +3 o5- O03 R4s-vq T7 o13 C '7 $2 $f $u i01 TA z2 c O2A syo z1 i1t '5s+{Z4 OA2 [ O1B '9 O61 O76 i8g O13 ^x *56*12 i4? ] $o f +0 } p4 ,9 i75 i5e l s12 $b $6 i52i60i71i81 $n O65 i5d *05 o0b K O63 O74 ] $h sg` O87 Y4s6} ^g O95 o0e o3l D6 o2d +5 o49 +5 o47 +2 o75 R5 O13 s%<$u R8 O62 Z1sd! *10 +7 Y2 -1 i0g O14 i1t s.8 O69 sQu o39i1v Z2}*01 sAe *54 D2 oAl ^m -4 o8H $4 $b i62 i78 t o4y z2 o1l i2|o8L*9A [ DB O91 $$ Z2 i61i79i89i99 i7e -8 O31 O42 *20*39.B D3 -6 *52 O2A i6mo0q so0 T7 t s52 *62 O02 Z2 o0P O06 *A7 s^% 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+ O28 c $9 $2 $5 c $6 $0 $5 t o0n } o1o 'B Z1 [ $ $m o2V*B6 T7 O93 p1 O82 'B O23 y3 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 T4 OA6 Z1 c i68 O7A O21 s#+ O52 p1 *A7-6Y1 *02*24y4 D5 } $e *67 c $5 $8 $2 +1 i4a T6 o56 O34 *70 i5a i7b O08 c d i5z l D8 $7 O18 z1 s_P ^C *1B O09 +2 ^L l ] $C -7 o80 sC1o6Ps}% oAl 'B i5n +3 o6j O02 Z1 O59 O28 Z5 R4^q svf c $6 $9 $2 $2 ^B c ^7 ^0 ^0 ^2 ^_E o8a +9 *39o0i O43 ,3 o0t o3w +0 ^L *B6Ci61 i0s i1k sSW i49 i59 sMQsTd$u i1d i1d i76 i56 $k +8 i13 i33 *0Bsk-*A8 D5 i7c sJD sJB ^cY5 +5 *12 s.1 c o84 s3- o7v i7t *48 O43 +7 -6 -0 $.*2Az1 $/,9 c o39 -A O79 O43 *B3 $< o1l *53 +0 -7 +0 *03 O43 *06 O34 $1 $2 $3 $? +6 -4 +6 T0 T1 T5 T4 *47*39,9 Y1 o4n O94 ssX +4 -5 -6 O2B s7k oAL *87 O13 q s%{RB c$1$2$3$& i8k D6 *B0^g ^N *06 O52 K o53 *1A O83 *09 $f $o $e { -4 c i5" s^'$u +1 ^r -3 ^v c $5 $2 $7 y5sfy y1z5 o1u O56 T0 O13 ^1 -2 -8 -2 z3 T4 smYo7n ]p2DA D9,A*9B s0HL8 c $6 $4 $0 *8B.4TA *B9 O73 ^c c $? $1 '8 *74 +A O06 c 'C $8 c $5 $1 $8 +0 +7 +0 O71 +5 +0 +7 +3 $2 $6 $1 $0 +A -9 +B 'B*31o1! *46 -7 i1o i2t i3o Z5 OB7 D3 i4m O72 $a T0 T1 T2 T3 O07 *78 $l i5g i8k O65 u 'E $7 $h $u $h o2F O03 $6 c $2 $9 $6 O63 +5 Y2 i7R +2 -1 +2 ^h ^g ^i ^h +8 o0y OBA i7C i71 i80 i91 i5c i5d -6 *23 sus O72 s8= i81 i99 iA7 iB3 Z2 c D1 $1 $5 $1 $0 sdR O31 OA1 $Z $0 $0 $7 $! [ o4w o4f D6 D4 r O83 $!$. +0 O24 O51 -7 T6 $9 r $6 $3 sre O5A y3 i5m *53 +2 -8 +2 r sie *24 *15 c $2 $4 $! l ] $s $t O04 O04 $r *32 O92 smoc O51 i5N *04 D1 }*21 *87$2 ,2 z1 O29 +3 ^i -0 ^l ^p *40 Y2Z1*29 i0w *30 +9s-"C *76 Z4 O02 i2` O51 '9 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 O32 $A i80 i90 c o6_ i6u +5 i42 i50 *23p5 '7.5-7 o71o6j l ^t ^o ^h c $9 $6 $1 *53o96*32 O84 d { o2+*29*27 -5 ] iB% O59 o2+ $1 $9 $5 $6 i65 i75 i85 *61 O03 k $IEy5 i3a i4m i5o i1c i71 i5e i7f K d p3 i51 R7 L7 ] $b +6 *73 DB t O07 z5 l ^a ^g ^e ^m siz O05 OA2 DB O94 O83 o8t o5m i5_ O7B s5+ $L O69 s72 o3. O56 o8' *39 +5 i0f i2e i1r D9s_;^U o60 Y1 K O4A u i21i39i49i54 $/ O3A sjQ u o8s i19 i10 o1A E +C -0 c $5 $6 $9 ^n +3 $1 o6c soli31 $1 o6l D2 O03 K i33 i76 o9R O51 i3m c $ $8 +8*42 s3o o0~ ^S i29 .2 O25 $1 c ^( $) o3) D2 D4 'B $2 D5 o7a i75 i56 o57 o63 +1 ^D *51 D2 +8 o7_ ] *59 O73 sBci3b .6 D8 ^RL8*9A se'.9 -7 i7t i6< +3 { ^2 D4 -4 D6 $gsA9.5 ^D o2D i6m O06 i52 i60 i70 i82 i9Rs;c i8- T0 *5Bi7i'9 O73 o6Y *59 i71 i89 i96 iA2 i5n ] *06 i0G +2 ^u O72 o0v i7N $5 $5 $4 $4 *A9i2g i5O O45 $1 $3 $7 $7 i72 i80 i91 iA5 O37 *1A Z2 O2B ] O72 i5d i3e i82 i90 iA1 iB9 i82 i90 iA1 iB8 slK i16 i19 'A O42 -1 ^A D2i9^ i71 i31 ^t*B8 +5 i51 ^a *24 O91 +B .3 K $o O43 l *86 *41 O39 Z4 D2 K O03 s1x E ^C i42i50i60i77 i34 i71 i1i -6 ] +5 $-$* sCF o46skr c $6 $4 $8 O0A *92 Z5 D5 O23 ^3 ^R .1c c 'D $9 i0j i1u c $7 $1 $4 ^A D3 swn*67 $ $! -B O0A ^Q i2a -4 O53 *56 p4 o5l c $9 $8 $5 'A $w i49 i58 i6w [ O05 f ^u O15 ^s i0h i81 i99 iA6 iB5 *16s@.$[ *BAY2 c $0 $9 $3 i1a i73 D7 Y3 O32 -1u O23 C ^o *30 *04 +3 R9sn+ ^z O42 s4[ l OA1 i5l -6 $d $a $v $i $d c $8 $2 $0 c ^e ^d o0w D8 c $8 $2 $7 ] RA O1B c $8 $2 $5 } i1d O42 o5! O52 *32 c $4 $9 $7 i30 i71 O82 T0 srL c $7 $2 $9 $@ $3 l [ ^V $m $o $w $Z O3A *18 O03 c ^9 ^7 ^9 ^1 c $7 $9 $1 i39 i59 o3x O42 $ $7 D6 $m c $9 $1 $3 c $9 $4 $9 D6 $t o3- OA1 L8 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 O48 o9{ s(Osu8'A s]|i0Ps0c y3*8B D1 i5n O53 ^- ^g c $6 $7 $1 $e $s $s O61 o8e d '7 $6 y2s0W *59 o90 'B $5 c ^1 ^! c o88 +9*35 f O67 E c $2 $7 $9 c o2k *42 *41 i2s ] *06 *15 } +2 i5x l ^x O31 O03 D1 c sa@ se3 i0a i1l i2e z2 i1o ^v } y3 +1 { $4 c T7 $1 O02 ] T6 Z1 -5 i7e ^1 ^3 ^0 ^2 o70 Z1 $1 $f d O2B i6m i7a i8n i71 i89 i97 iA7 sdc sjm O49 +0t ^C } c ^6 ^8 ^9 ^1 c ^X $X $X ^X u '6 'B Z2 sy! z3sVC i1q i31i49i59i64 s8@sfzC t ,9 c d 'A *A9 o9n $. $o $r $g y1 O5A O38 ^h *31 $v $e $x k .3 o8> { { c { +1 l o48 K sTDo5O t ,3 o1b o0r O54 p3 O51 i3o T0 std 'A O62 +6 D5 OA5 O52 i4r i9Q i3I}s-t p2 OA4 o1L t k i3b i32 i34 i1a c ^7 ^8 ^9 ^1 q O78 o4U c T4 k i41 T5 i72 i12 i3d i32 [ i45 $5 Z5 O56 i1d i71 z1 i1s ^PK .5Z3 i51 i69 i76 i87 ^r O96 O5A sas i31 T4 i7e i1a c $7 $6 $8 spvswl *12 o1b $]$[ *B8ssJ +5 { *B0 O07 -4 +2 $A O02 +6 so=$= i74 i5a o0k *46 i13 i34 $v $i $m O08 z1 o7R D6 c o6e l o5- +B O73 *69 'A sy- +5 *46 OB8 D6 Y4 O85 ^k } Z1 +B -A Y2 DA -2 sdy sau O43 *B1i88*64 suiD8 ^n D1 O61 $ksy# sdy DA $v O67 Y3 D1 i9?l $2 $2 $2 $2 *74 *65 c r $5 $3 l i7e c $e $5 c $e $3 c $2 $b s|qc*8A ^C O32 o2& o5K +0 -6 +2 O12 $6 i49 i56 '6 Y4 +9 $a y3 [ c $t i7a +0 -6 +0 D6 ^p u $9 $9 $9 $r $p +0 -3 -6 $9 $9 $! *68+3l c$1$2$3$/ $e +0 i3t i4h i5e i1b i1c t o8m $g Z1 [^fK l -A Z4 l O96 ^h o1c sa6 i52csdD i4a *36 i17 i17 i1? OB4 OA2 *B7 O21 K -2 -8 -3 so0 T8 $a ^Y soO +1 -5 +2 ssJ s^4i3d o9d O63 OA3 +5 ,B $9 O53 R5L5*B8 O6B d O63 i73 s1S -0 *63 $v $i $n $n $y O08 [ i2F +2 ^h o0j } u $, O82 y2 O32 i3c i7e +4 -3 +6 +2 -6 -3 +9 -B +9 s1i } '8 sWE O94 p5 i3i i4n +0 -4 -4 s\[ o8K O9A ^y ^a ^d O03 ^1 ^a } *31 O24 { s1) -A -C -C +0 +4 -1 o0o *13 ] i31 ^i } p1 i4< O45 $1 $9 $4 $4 c $1 $1 $* $* $_ $6 +4 i4b c $5 $5 $! ^c ^r ^a ^m ^G *31 O0B o9L sEY O52 Y5 O8A Z4sBW c $1 $1 $@ $@ s14 O52 k ,2 o9u -8 i50 i60 i77 y5 t $S Z1 +0 $! iB[ O47 $6 $6 $6 $6 i3l c c $1 $0 $0 $! +3 -5 -4 $6 $! O27 E $1 $9 $5 $7 iAUty2 i0s i1e *20 o5s sF| s/M O95 +A $9 *4Ai7? i41 i59 i65 i5m i6a i7r +1 O24 ^n ^o ^o ^m $m *26 *76 i5I DA c -5 D2 +0 +9 -3 r $4 $9 +0 +4 +4 { ^F +6Z2 .9*BA so0 T4 i75 R6 L6 $+o8Ys^x o5l*6Asi( $p O75 Z2 OB5 $K O49 z2 O2B p1 iAh O56 c $- $0 k o3_ o8S c +D +E +E p2 O54 { *06 { O06 z4 ^S O82 C $6 $6 $6 i51 i5c i72 i80 i91 iA6 i82 i90 iA1 iB7 *79 O82 O42 +2 *63*49 i3d i72 O94 L5 y4sg{ ^m ^b -4 $A +2 O36 *A4 *4B sP^R8D2 sF3o34oBn i82 i90 iA2 iB9 z1 *13 sJS p5 i9r $2 ^2 u $1 $9 $9 $6 i0F s7Z O5B $@$* o4Z o5p o7n s7O E O71 -6 $7 ,9 } c $5 $7 $6 c $4 $3 $6 $c +B c $9 $4 $1 $7 O62 o6r [ O04 ^P T0 i3y l $e $n $t O52 i2u K $e i6q sBmd +1 *54 ssg s(Us2Ds]I ,BY1+0 *2BR4 ,5 *43 ]k i3a i72 OB4 TB c T8 O04 $6 $a i5f i7a c ^d ^1 *83 O54 *A8 O71 O42 +2 L6 *6B u O51 E i3$ *81 -0 +5 r *70iA9+9 i77 i5e c ^a ^2 $b $8 Y4 [ D5d c 'C $0 sRT i30 i1a i3b i31 K ,3 i1c i3a *04 *B6 O34 sqey1C i75 i54 oAQ *31E*B3 i32 i74 d $3 K[+A snR OB2 d '6 $3 O53 ,7 i71 i5b i1a i5b o0t *31 i11*41 o3= '5 ^! ^R $5 $ziB^o7z i51 i3d O24 -0 L9 s1k sd, *7Ak .7$R $O-A L9s@- +5Z2 *52$vo0d i62i70i80i99 l OB7 O54 sISZ5 d 'B $7 i1a R2 L2 $csu8 i77 R6 L6 O71 y3 O91 o7J E$# oA;.1 Y5 O34 o5d O71 LB$z O78 d O46 -7 q O48 i3k O26 O04 o3l ^M O32 O83 .5 i70 R8 L8 O0B *3B p2 i52 R6 L6 'Bts\| i38 i3e *9A O72 *95d*60 ^x *31 seO s0HrY3 '6s9[ O31 y2 O61 *73o59s'T ly4 s_\sbK-0 [^@ -9sQ= o8P-2 dsOQ ^V O42 c d '9 o69oBMK *14iA9 Ck *12 O1A K ^Eo6biA) l*B6 ^rs6;*48 r O8A *15 *0BsRJ .7 O74 $*$+ c $e O31 O19 ^b *02 c $x O19 *57 $=,8 +9.9 o53 ,6 sES iAb o1} c $0 $@ i5E $5 $! *97i2p *8B O64 ^M *46 ] $j sg]^RK i61 i72 $j $o $h $n l o0z '7 ^n i46 i59 *47 *75 $8 $@ O82 -9 i1a i2x i0s i1a o69 *71 s4a i4r i5e i3i i4s $i $s $t p1 O92 O97 o4y o2k i18 i12 *59 O42 O24 $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 { O3B sM<]y3 Y4smP $s $o $n $i c $6 $9 $1 O73 $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 O21 sbH O52 +4 sD|*21 i7P o9\$/ o9+Y4 $`l-B *96i6/ i4r i5y $A +7 +A o6_ *57 $A i0a ^m ^k sPk D7Y1 *14 O35 O91 K i7l D2 ^m o3n c sl1 so0 i5d i53 i31 i70 O52 k o6T c O27 .3 *5B O13 o2S *31 o3j swu ^b O48 D3 o5t Z4 O46 O21 E O53 *64 ^m f ^t *34 i6p -7 $ O56 t o5u i78 i5e i3d *63 sDC O81 ^Y s9coBE i3a i73 -0 O13 i51 i69 i77 i83 *42 } *47 O71 Z1 srt s8F O92 -6 i5r O51 i2o K *25 p1 y1 O39 o9_ *98 i7i +3 OA1 T9 -5s\s*07 o3L c O3B -3 [ Z3 o74 o85 i82 i90 iA2 iB4 $NE O7A ^R d 'B $3 ^r +5 *68 s)r O21 sld l O97 O13 i19 i16 $- $7 i6? O51 ^S sFM '9 { +8 -2 -2 $d *92 O0B +A -C -C syI ^n ^o i55 i5e Y5,8T2 ,7 O12 s1F O03 T4 } OA2 T2 $1 so0 T5 *52 *24 O42 s\c o5! c $ $4 ^o ^e ^n R6 ,9 OB9 O62 *65 i6m i7e O85 O29 *05 ^u D5 ^A *26 s'v o2e *34 $e $n $t O23 i2e i0A O13 o6" D3 O72 o4K c i5g o4a [ s07 $m +6 c $4 $7 $2 i24LA -1 T2 *13s7y] T3 $1 sSO sK!T0 o1d o2e i81 i92 iA3 iB4 O42 Y3 *7B c ^2 $3 o1i ^v i7t i8o c O32 i0F *02 i18 i11 O05 ^r o3# o71 Z1 *13 sau $0*30svi s&l^#l snf sgb -7 D4 s6b $z { o4s -0 i71 i82 i93 iA4 iB5 ^x -1 c $2 $9 $4 c o87 '9 D4 *50 *02 $m O83 D7 +6 [ $0 +0 K o34 z4 y4 O69 i7r i8e c $8 $6 $0 i34 i3d *42 o3b i50 i5a i5c i7c { O32 i15 i19 O06 Z5 o0J z2 D2 i3c i1a y1*90 c $9 $8 $3 .0 y2 O57 sIN OA9 o6T 'A o7b c $4 $0 $3 o76 Z1 D7,3 o86 Z2 o67 l u s5R D6 +4 Y3 O52 c $5 $3 $2 $4 $. i3e i5f i8pD5p1 c $9 $5 $6 o5~ sS9o1O i6X t O02 z2 L6 O27 O79 'A$esT, sw1sdS i21i39i49i53 c $3 $8 $4 sP| O43 R8 o5F sng *37 +0 sc^R2 skv *30sbRo0I *58 OB3 l ^d ^o ^o ^w -6uD9 '7 $n D7 i4y y3 $4 [ +3 snz c$1$2$3$= i78 i57 y4 O67 L7s?{ i79 i7d y2 O34 i51 i69 i77 i89 OA6 *A4 z3 O3A p2 skl O47 o7^ O41 ^v -0 -9 -3 sOW-3 -5 $1 .B z3 O5A sdi s_N*71 s&'s5L-0 +4 +4 -8 O25 .A O19 r +0 sh\ -5 $3 i3f i7e ^E ^D i31i49i58i60 D6 i42 +8 OA2 i8r $fsc) *85sL8 $5 +5 $4 Z3 $4 { t o63 *96 *85 OB7 ,A OB8 s25 Z1 T4 $3 p1 O57 O25 O19 D2 y3 ^B Z1 $y +7 .5 o1m O18 -0 sJE]y3 D3 ^8 ^e ^c ^i $@ O02 +A -B -9 *B2o1A +3 +5 -6 c $1 $5 $! ] ^Y O23 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 O14 o0G i42 i55 o70 $9 O52 *25 o9B i2" $gsb, *34 ^p Z1 O42 i71 +8 i1q O7B ^f ^V i8A*32*14 c ^b ^1 +6 o2s z1 O49 i51 i62 i73 i84 z1 ^w ,0oA#^^ c $0 $7 $9 o4& OA7 c $5 $6 $8 '9 *76 $c o8i O74 *51 O87 *87 *64 o66 $a i0f E ^i ^r ^t $7 $* i52 i3a ,4]i92 i36 i79 $d +6 ^X*89 K -1 c $0 $5 $8 srF*21i0G c $7 $. C+8s\Z s?& O03 T5RBy1 oAu*32 i7b i72 sMP s6c^Q OA8 O35 OB8 c $6 $1 $4 o67$Z i5m i6a i7n *42 *21 s%VscrslY sCG O91 O06 i0g z1 o69 Z1 c $X ^X c $2 $7 $1 +5^" sKZ o3z c c $2 $7 $6 c $7 $5 $2 c $2 $7 $4 { $1 o8B sLD O03 *34 s1I Y5swu ^S O14 i3a i4s i5d i2f +4 o2i i17 i18 i61 i71 i58 O71 swM O64 O3B ^W sD$ O32 +7 c $8 $0 $2 D4 *14 i1a i11 Y5 O16 i14 i31 spx ^r,3 i51 R6 L6 i6A Z1 sWw z2 E s5?*7B $g +6 O32 y1 *86 si8 k *04 i3b i3f $2 $4 $! O17 *39 O57 i85 +7 OA8 +1 +1 +4 +4 +6 +4 *41sL+i7x c ^1 ^a ]i7- $1 $6 $1 $0 $d o6x i8K C *49 O67 i8tt c $- $7 *32 ^A i8v ] '8 i0n f O65 O36 y2 O09 T4 O52 $6 $1 -6 s,Jo9}swq $CsD7 O76 +0 i7Q *52 o3k o1o o2n $0 -5 y3 [ $4 o5v ] O82 i19 i31 c $@ $0 +D -A i6@ O02 $@$_ $s O34 i7I c $7 $6 $9 sae $1 -B -C -B O21 i42 D7 O05 -6 i7d synY4 o6s O01 u L6 +5 O04 o2; i51 i69 i77 i86 c $8 $5 $6 c $8 $4 $3 i19 i7a *49 O53 -6 *12 *43 ^m E i2x OA7 r $7 $0 i6, O73 +2 o4s o1< ^z } +C +D +C c $3 $9 $1 D5 o1a 'Bs&j $n o7l s`n'5Z5 i31i49i59i63 o6z [ s.ID2 +5 o79 d O8B [ o4j +2 +2 -5 *65 o67 +0 +0 -8 ^s O26 c i33 ] *36 O43 i14 i10 srW i70 i1e ^B O32 i8i i9n i3c i31 i81i99iA9iB9 sSM D6 $B O93 D0 c i30 o4)sbn i1x o0a ] iAh o3n *35 swf Z5 s6J O34 $s +3 o8ts(h i4h O2B -0 o52 su7 ] ] $e O34 O09 *02 Z2s!7 ,8 OB5 p5 c $6 $8 $1 *46$7 +B [ sev{ +5 -6 +7 *76 +5 +8 o5s R8 D1 i22 i30 i41 i50 -0 ^2 to9l+B $*$$ O4A ^r *23 o1d i11 i31 i51 i71 $ss+) -6 *63 c $8 $3 $0 $b $9 ^Ql-3 c $3 $# T3*93f *46 O05 i5d i3d s74 +8 $o $h $s *A2sr, z4 O24 *85 +5 $b O53 i79 R8 L8 i74 R8 L8 $3 $x *3A O16 i42 i54 s*h OA1 z3 iB* y1 O03 $ { sbR oAv i15 i35 Y2 O84 +5 +6 -4 c $. $4 +8 spi *39 *35 ,8*82 c o69 *54r*B0 l i8a i1P sj0+0s\s ^ ^2 o4o *03 i7a O21 O86 E *05 O35 i66 O31 $/$. ]]]]]]]c +3 $m O34 y3 ^A ^L +2 i0p '7 ^D $y i6m i6a i7n s#O*78 i77 R8 L8 i72 i3d ^& O03 +6 *60 O58 $u D8 t *73 *41 O34 OA5 iAS sT& $y Z1 oB{o6X i51 i69 i76 i88 c $3 $6 $4 $1 $0 $2 $6 *32 *67 -2 -5 -8 } ^w i96 i0b } i3a i7c 'Ap1siT o4- *54 D4 o5k DB*84 ^l ^i o5g p2 O76 { o6z O23 +6 +7 +9 +8 scA $! O21 O83 s?` T0 T3 T9 } O14 Y3 c O12 -2to9< i5c i3b i1r -5 p3 *65 $1 o3u ssS +B -C +B Y4 O37 $a c i1o c i1a $i -7 O62 O72 z4 p3 *16 *05 s@Is3x *78 +6 s7(sce ] t O02 o7zlszM $0 $2 $0 $4 D2 *46 o2M c sjOsYis?f i34 i1e i8d i9e K o1k r o4- o8si66 *78 -6 +1 +1 -4 C+As>s i72 i32 $1 $9 $9 $0 $! D9 -7 R6 L6 o55 *B5 O27 D5 { i9L O62 ^a *36 [ *05 O81 $1 O83 o3r O72 i6A +1 +8 -9 i56 i61 i72 i52 i1a $f $0 i52 i1e i71 R6 L6 -1 -3 -8 .7C i17 i11 sHRE*05 Y5y5T2 c $9 $1 $7 c $7 $& +3 r *6B]k OB5 L8 *7B O64 O21 O25 o2u i3y ^( '4 y5 u ^--B i5x D3 i34 i72 i2h l o4do37 $l $a $n $d +2 +2 +9 r $5 $1 i52 i5d O52 Z3 O79 O36 y5 i21i39i49i52 o7` l $X ^X ^x $x o0B*0B i74 i57 iB".2 c ^! ^1 'C $7 *46 o54 +D -C -C ^-sj%sr\ +0 T2 z1 -3 $fsO]-B o9Wi1poAb O82 o0M i5Z .7*85*4B *68*06 O89 *81 i52 i60 i70 i89 *02 $o DB*04 i61 i74 i87 *86 +7 R5 +4 l -4 D7 ^d -3 O27 z5 svYo7c i76 i7a ^K O42 r $3 $9 D8 suy c $` $1 ^G D3 $2 ,2 Y1 ^G $2 D3 sYS o4V K *64D7iA8 O03 $1 sLB } -3 ^p } c $6 $8 $2 sP[Z4 stP c $4 $4 $$ $$ ^5sK? $3 $3 $3 $! +6 -0 -3 R5 l +4 +4 -7 +6 ^b*07d +4 i1l D3 scR s|k O38 O78 o6wo0[ $o O42 O07 k Z4 D3 D5 O04 T4 Y3 O12 i7a i3e O64 ^d i1cs;5 ^1 ^B z1 *50 Z1 T4 d O5B o5xD2 s3#^p c ssO u $1 $9 $9 $4 +0 $* $p $o $x sjbEo5A i21 i35 o5r -7 *54 +7 c $7 $6 $1 T1skr o0V +2 R0 O21 O18 .As#j i42 i50 i60 i73 O81 O42 Ky2*17 o2i ] D3 ] o2s c i5i i6t -0 ^u D3 o1g i5T $#$* O07 z4 say c $4 $1 $9 p4 O23 .B o7& oAx O5B OB1 $1 '6 i3- *34 -6 sJt^h c $7 $8 $2 +6 *54 .3 p5 i2/ i5/ sDW T5 D4 $k *51 o7GsLm sqD i3w OB7 i6j i7a i8n c ^C c $8 $1 $9 O17 O51 o8SoAw y3 s1b O75 -3 *03 +1 c *65 o65 O12 z1 i9a iAn iBd $R O7A $2 $D } +9 O61 y4 OA2 *35 ^B .7*51 Y1 *A2 O62 $1 $9 $5 $0 *05 l O36 c $1 $0 $! $! c $8 $. ^4 $4 $1 *02 sN4 O93 OB6 $%$$ i42i50i60i71 i3e i2s y2 c ^1 -7 o5g o8j D7 $%$^ ^b O8A K *54 i9Io7b i8-sP8 c $6 $8 $3 ^h,1 $2 $3 $! $! -3 *16 ^l ^r $1 o04 y4 O43 c $b $a $b $y O68 ] su? c ^6 ^0 ^0 ^2 K -0 i76 i7e ^} -4 i5d -7^k D3 i24 *89 -7 O89 *69 T0 s3! c $9 $9 $@ $@ L7iB2 +B}l o77*16 O59 p3 oB8^miAZ ^po1a c ^4 ^8 ^9 ^1 ^M O06 i1u i2z c $0 $7 $1 o0g *34 sBG $8 $8 $* $* $i $a $n D6 l O91 l $e $r 'C $9 l $1 $0 $1 $0 O26 *A5 O08 sSd ^z o1Z *41 ] +8oBL[ $! O84 ^R .5 i31 i74 c $5 $3 $6 s2+ *20 s29 *15 O12 +5 o72 c $2 $7 $3 o8eRA sgd OB5 c $0 $3 $1 c $1 $7 $9 $3 $p $k sgL ,A O04 sJl i13 i35 O16 p2 l T4 '8 i32i40i50i65 O5A si3 ^2 i0S $N u c $9 $2 $4 sRJ -A Z1 c $2 $* '8 T6 c $1 $4 $2 $8 i72 i5d OB2 Y4 $1 $1 $* $* i7r p5 D7 $5 o0S i3x [ [ O43 o0n *61 O46 oA^ { ^9 s($ slH O18 +0 -5 +2 $b $t T6 o70 *29sg5 +0 +6 +6 sueD4 u $0 $0 $7 K ^S i73 i3e O03 ^5 c o90 snj $m $y $s *7B^Z ^J D3 i38 i3a O62 $n o4_ '9 oAj +5 +8 +8 c $9 $5 $4 u $2 $0 $0 $9 o77 l O53 o2e o4k +6 O07 ssu d OB8 oAZ $1 $9 $9 $0 $* $^$( o64s"Ur O7A $p O76 $5 O32 c $3 $9 $4 *9B^I '8 k +4 O81 i1e i31 D6 $9 s3S +6i6sR0 ] o5x [ o04 O5A [ i40 i59 o7" t O13 s;#p1 K ^g us+M ^t+9TA i3d o1r *71 ,7 OA8 r R6 O18 i18Y5 u $y +1 +2 +7 +4 +5 -6 iA6 iB6 iC6 *93i6s .4 o5i p3 $j O62 +4 +4 +5 sEG$? i18 i17 iB* OB5 Y1 $A $5 T0 i2d +2 sui $=o67 O98 p4 $9 i60 +1 o8A O61 i3l -5 *25 $w $b .6o0Z i2k i0t o87 +6 O46 ^S Y3 i4m c o95 D8 $b i40 i57 -8 *53 $m O43 T3 T9 i0p i1h o1a i4- ts3B t o2X $n $k oBZ '8 T7 O59 O98 .0 -4 o05 so0 si! i7o i8n i0e i1s o4b *42 szl*B8 sis i10 i31 *17 +1 O61 i3a i4l i5i T8 TA T9 D9 +6 O81 si1 T7 i41i59i69i79 L9 O72 sk/ y5 O04 o44 *56 O82 O92 O34 ^p }E o8e '9 O07 sR0 q O08 i1. i3. i3e i7d c i81 ^h *32 $8 $c $8 $d sbl O39 D1 C T1 O02 ^2 c i47 O81 } z2 p1 O87 { $i { $2 +3 o6e i0Ho8O *57 o56 i63 i70 i80 *54 D7 c $@ $8 [ i2q *36 o3g c $4 $. iA; c $2 d ] $1 $# o8L i5c *24 i6i i7t d OA7 i1b i3e *15 O34 +1 *04 ^R D4 c $- $9 d i7a o4c c ^z -1 O51 ^2 T8*9B ^c } i62 i71 c T3 T2 o2y o3k [ ^g '7 d 'B $8 *02 ^f i51 i3b c $5 $@ sjPs0H rk*B3 o5w +7 i3e i4l ^n ^u $@ Z2 $k *57 s.@ [ O73 l sys $y D1 T2 -0 C '7 $3 o1/ i9j i3c i3c ^a *15 s38 +8 *35 *41 i3d i7e $!*05 $/i8` $s -1 ssV ] *79 O52 'A t i79 i1a i7a i70 [ '8 ^g t -A -6 o5t -7 u i3b i3b c $8 $4 $5 i6z D4 i37 i79 $'$' T1 ,7 ls8OC z5 O18 o0z } ss1 *0Bi2v ^. ^t o0g +6 [ ^x '8 -5 c $8 $1 $6 '8 -6 D5 *46 +5$% +5 k o0j o1( O12 $r i3.*32i80 cD5sK\ i52 i31 $s i0h -3 o4s o9D^M*A4 kcs*K .3*7B] 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 $w+7y2 i7P c i16 i56 sv9$p Z1*4B.2 ^k D6 *75i6-iB# r O47 OA3 o7J i31 i42 i53 i64 i11 i72 *46 { ,8 O0B c $0 $9 $! o6c 'A c $8 $2 $9 o6t D4 c ^J i5b i3a *15 Z4 ssL*89 y3*74 O34 .5 i51 T6 $1 d ] O08 i3" -9 $5 z4 O46 O72 $$ '5 c $7 $9 $6 u OA3 Y2^P s26 $1 l i4n c o81 O08 o6| OA4 sWd O1B k ^u u sS$ sns s9H-5 k ^G $6 $6 $0 $0 c $5 $3 $8 +3 $c } sNG *56sP% O73 i67 iB$ i1d i3e *B4*25 i3e i70 o6- O05 i0K +1 -5 o6g i3j k 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 O82 *98 R5 s4a c $7 $0 $6 R1Y2,B i16 i36 O53 ^F sp$i9/ O23 y4 TBo35 Z4 O32 c i7@ i0-s?T i3R t o3t D6 o6* T6 O67 O4A Y4 } i41 i59 i68 i73 $m OA4 ^l o3o Y1i5] ^3 $3 *93 -1 l *75 o4q [ O95 E r i62i70i80i98 { ^7 *73*90i13 o3L [ i6d O81 O02 $* i5d i3b o85 O62 $0 O82 *53 *57 -2 o3j DB $e $tD8 $1 o1M i0c *23 t o2z OA2 p2 O27 oA. o6m c i73 i58 i0T r i82 i90 iA0 iB1 O6B p3 iBlu i15 i32 o1Z L5sEg *39DAswj *41K i62 i70 i82 i91 $r +0 y3rt i51 i69 i77 i84 D1 +5 $k O53 snOZ3 ^g O52 i2C *20 y4 O65 i82 i90 iA1 iB6 *A0p2r sp- O56 D0-2s;j r $x +2 +4 +2 i72 R8 L8 *7Bo74D3 O83 s6L *50 i77 R5 L5 *51E +9 +9 -0 ^yc -0ksFK $f $e $z O53 ] K +7 -4 +7 ^R O35 $Xss, +1 -4 -2 $1 o8_ Z1s>v*98 $2 o62 K O57 i1a i2s i3e $ap5sT9 r*57 +A +D *89 [ $` OA8 O87 $n*85 .Bs]!snu O15 O8B *38 *57.5 i11 i52 T9-9 i72 i7c *30*B7 +5 -0 -2 i71 R8 L8 o6k $s sos +A -1 +0 +1 +8 O36 s<& *2AZ5*B0 *51 K o0f K -0 -2 -6 f t O5B o8g D5 o1o +7 i0t O04 o2h o5Z c o7< ssl } p2 svs *24 o2x i7$ +2 *95 si+Z5u oBG *A1i7R +2 -0 +5 'B,7 { iB# -0 -8 -7 o19 *51 +9 o76 $. $h $. $d +9 -3 -0 $2D3 o0m o5w *58 O87 -7 o10 +9 -0 -8 +9*36 +5 -3 -4 *23 t s"4o56 *60 O51 *75 *67 $L $2 D6 s;AT1 sth +3 *75 o9J *06 OB9 *09lo7! O6B -8 $# c o59 c o5a o4m O02 D2D9s=} $L D6 $2 $! $@ $# $$ i42 i51 O23 D3 T6o8]*01 o74$. s*-p1 +2 +B O79 O84 *78 O8B o3n O41 O92 -8 i59 '8 O09 O9B sp*Y2 +9i7K +4 +B $9 $* .AsR+ O58 D4 p5 ] D4 T7 $7 i0P .5 o9-o2qTA $a Z2 *63 D7 sPG E *78 -B iBG OA8 i0s i1c $0 -2 s;fy5 i3e i4l i5a oB)u i7e O85 *63 O53 i7c i3c O57 c *18 -3 O63 $9 $x $y $z i5B c $9 $5 $! t o3k O21 O74 o3- O71 s'% O32 ^L ,4 o3F l o7- ^y i1n c $- $3 s3L O94 OB5 i12 i10 O41 *40 i8h D5 $. +1 ^1 { +5 +4 -3 +5 iAg *82 O72 $2 $1 $0 $6 c $- $8 i16 i15 stn i83 i92 iA1 z1C OA1 OA3 ] -4 o5k O04 Z2 ,5 *03 ] o64 l iBl D6 O92 -3*14 t y2 u ^a ^1 o3g -4 $n $i $b $3 $! i89 i98 iA7 $)$! i48 i58 i5B.1 o5e E o5y -3 ^s ^s ^a ^p o8U *61 O52 i5d i6o i7g O81 i79 oBm s%5o2Mt +3 -0 +6 *59 Z1 O53 y2 [ +9 suy D8 +4 } -3 -5 -6 *51c u *46 D7 skt +4 -0 +4 c i4o } $3 -3 *32 R0 T1 *50 o3l o9) z1 O71 ^YsiI l o6- *36 '6 i73 [ [ u d 'B $7 O29 shp c $7 $* i7J $6 $c +3 $1 sAzo9$ sfKs8tD6 ^k z1 z2 O63 $y $u $p i2X [ p1 D3 '9 d f O9A o5h *43 i35 i3e u $2 $0 $1 $0 t O58 O74 o2" $2 $8 $0 $3 s,!$fd DB O05 i2w *03 i7d i3d -4 '6 O02 O63 ^t i5t i7s-8 T0 *78 OA1 ] OA3 c $7 $6 $3 c $4 $8 $1 O73 p2 c $8 $4 $6 i13 i73 o3b *43 $1 $2 $3 $+ so0 T6 o8-] ${{ $l -5 q z3 O1A c $$ $4 [ i21 +B O74 z4 O36 i14 i17 O21 smb r $c c $9 $0 $6 c $4 $9 $1 srn *20 -0*18] $? ^1 o79 l -0 D5 O41 *30 +1 $0 $8 $0 $3 o47 o52 ^T .5 i25-4sg` k o31 KZ1*97 szk tRB,6 y1 R1 *74 O31 s$\'A i3c i32 i71 i5f i0G ] i5e i7c i5a '6 o2V Z1 ^l *04 ^\ O83 s`> $1 $0 $! $! c $0 $4 $7 i4e i5n O15 Z2 c $3 $7 $1 *54 o3l i0J $d l O24 c $6 $1 $5 *B7*58 O21 *25 s(=s0X+0 c $2 $7 $8 $8 *96*85srN sko i5D c $0 $3 $9 'A O52 i9M i72 i3c O03 C O84 sh{ LBq l T7 O25 { p3 i3c i5c z3 z4 O07 d +7 o1F c $1 $9 $5 $2 i4W o1w D5 *63 OA8 s_l c o83 $1 $& O71 $y p1 OB6 ^' ] s^p OA5 *BAr '7 Z2 '9 +0 ,5 ] *03 $1 $5 $! $! k *17 $. $7 $N*B2K s4go2L +3 O53 c ^4 ^0 ^0 ^2 o2C t o0W { i0s i1a i2l c $z $M [ +7 o5Y -1 ^i $0 O12 c $6 $8 $7 ^R *31 l ] $K o0f $1 c $8 $5 $9 Y1,3 sAci1. s1v ^M D6 $l *57 $r $e $n $u i5d i1a o9Ok -8 *8A O68 d D5 ^o *39 Z3 O1A *59 O53 Z1 $f $e $y *52s9vswm +6 O74 i11 i33 i31 i7a sdb D5 D6 sRl O2A -7*46Y1 ^MsJ, *37 +B O35 *7A O53 i41 i59 i68 i75 [ o0W -3 $9 O63 .4 s\F OA7 i41 i59 i68 i70 i51 i69 i76 i89 c $m soy $1 O43 i7j l [ sat o6j D8 -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 O5A l Z5 O58 ss_ l ] $M T5 $3 i32 O43 i7e i1e -8 o6b *84 O53 c $9 $6 $4 l ^d ^l ^o ^g i6d -5 c ^5 ^8 ^9 ^1 $d ^d *05Z2o3e i14 i15 *31 ^m o7r O41 z1 ^h T0 ^e i4l i5y *04 l O91 $" y4 O26 K $@ $4 $4 -8 sBL D0 ^( O71 s.L [ o41 i6o O91 -1 { i6y O29 -1 [ -5 i60 i71 i82 $A ^1 $A $4 .B *25 O29 o43 *57 ,6 OA5 sS2 k^b*1A *42 ^w z1 z1 o0l }scN } +4 i4r OB2 *94 '8 *75t Z3T8*37 -2*12s0; } +9 c $6 $5 $9 { O98 *31 i4d ^2 ^3 ^0 ^2 o2| L4^" T0 T9 T4 O42 y4 s6. o5r ,7 R5 i3d i5c d O26 *05iB+*32 c $! $3 o55 l TAi2u $@ $8 $1 o8d ,6 D3 i7? syI l Z4 { ^i O15 [p1sOr ^j q O49 LBtR7 i49 i54 +5 i3o ] ] $1 i5b i5d O81 seo ^YE i6n c *B9sr@ '8 { '7 ^C O15 i6K Y3 s2c.9*5B i55 i66 i77 i1a *40 *92s>v*04 i1d i1b O8A O81 +A o4d O71 sS}sG!Z3 c Z3 O53 i7a i5c o4D c *65 O65 i61 i79 i86 i99 sxP$8 y4 K O26 *58 D4 suo +5 oBki9@ *34 ^x c $0 $1 $! $! o3X O05 o0' *58 p5 D6 i2e i3r i4i i31 i51 O2A s58 D2 i8g O82 $. $h $r i81 i99 iA6 iB2 $4 *98 OA9 c ^_ ^1 sLxi0h D2 $- $5 $D i7p [ *B6o7< {*20s0z ^B +5 c $8 $8 $8 $! -6 $z c $8 $2 $6 i59 i68 i77 *49 '9 $7 OB3 o9q*58s2w +A O54 O91 o6p D3 O08 i70 i1a Z1 O95 *69 *12 $i $e $s ^1 OB6 o3n ^k o3D l OA1 -9 i77 i5a l o9i i3b i7a i4Y Z4 O08 sp}i8py4 i1d i3a +8 -4 -4 *05 -1 D5 ^' i2u l o2r c sdQT3 ^1 O45 i12 i71 i91 iA2 iB3 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" c $2 $5 $8 $7 sk[sjf*40 $1 $9 $5 $1 i6u$% O42 .2 i4_ '8 c 'D $3 *25 O34 ^y ^e ^k T2 ,5 -5 *74 s0HK p1sy} p1 O9B [D3 dEsBj {*18t $0 $0 $2 $2 l [ ^Y i1u l soE u 'D +4 *45 *B4i7R $s -2 O62 i7r +0 O72 K ,2 *23 o4_ O7B sDS o0W K ^xT1 .5 *23 O24 T6 O31 o7o 'A z1 L4 +3 o1q o7C D6 o2m ^d o0k o1. o2h *26 sg/ O92 Y2 $*$. *2Ao8k i62 $9 i3e R4 L4 O14 c i75 O43 C +5 o8c O51 $$ t sSa r O37 +3 +B $! D3 i0s i1p ^m ^e ^-.B $2 +4 Y1 ^0 ^0 ^8 ^1 +2 -0 -9 +7k oA O5B s i0J O65 i0A O32 R2 i57 i5e *30 c s0U $2 $0 $1 $0 $= -0 -7 -9 -0 -7 -2 Z3 Y3 O74 +4 -9 -9 +3 -2 +8 $?$& +4 +6 -5 +3 -6 +4 i1b i12 +3 +5 +9 $x O72 { y1 } O94 +4 -B *3Bt t*0B +0 +6 -5 +5 +5 +8 i70 R5 L5 s9uCT2 *16 O43 sO-*B1$e $os6/ +5 +6 -2 $5 O4A i53 i7a $s i3t s3/ *57 ^k +0 $i *78smC i54 R6 L6 O0A ^f D9 sWCo7Q*B4 ,6i56 *7BsAKE Z1 o0t +1 +4 -3 +2 +6 +6 +3 -7 +5 *34 o0k O95 DB O06 o3E s4. OA6 r $4 $8 +2 -3 +6 ^2 ^! sht $xD7 roBjk sb9i8% O2B ^3 Z2D6 $csTo *85 '7 o6w]c O31 K .2 T0 *02 sWpsul O73 o3f +6 o5w seoy5 i51 i69 i77 i87 *49.0 s(vZ4 $p $e $w c $3 $. i72 i80 i90 iA9 i62 i70 i82 i92 *70 *41 O52 C *0A O07 i82 i90 iA0 iB8 *A8L7 o5S O18 y4sqoiA& ^A *56 +2 $M t ,1 *02 *82 O04 *02 { Z1 T3 sx@ s0c O89 sp&d Z4s=w O79 sK+ ^Y *87^a sSC i51 i69 i76 i83 i31 i49 i59 i60 i31 i49 i59 i62 -7 o6b i41 i59 i68 i76 *37 O4B i17 i35 } ^o O0B { .0 sO!$j y1 K .2 O53 Y3 $0 o63 y1 .2 K $0 *98 O12 p2 s0C suxiBa D2 *30 i6fs}m $qsZV s0R i72 i7b sIc [ O13 O63 K l $1 $0 $1 O56 ,8 o5- '8 OA2 +8 $1 O46 O29 -5 s6f i3J o6K *05 f O1A i34 i75 sdm *42 o5R s3S i3{ O4B ^K *17 O64 Z1 t D4 f O64 $z ^l ^H r Z1 o0B O01 sTK O14 y3 { -6 D0 o5N K +4 .1 OB7 z2 s>d sNY *23 O82 T8L5 i76 i57 i6 c D5 L6 f -6 O7B +6 i4. i1e i74 o02 *20 *65 +3 o4k t i76 i5a i32 i19 sa_ sFI i1e i7d '5 $8 Z3iAO p4 Z2 $1 $3 $* $* $9 $8 $! $! '7 $. c $0 $9 $! $! $1 $9 $5 $4 c $9 $3 $! $6 $9 $* $* syf*B0 $1 $1 $? $? sb2 i3_ +5 scl $1 $9 $4 $7 $8 $9 $! $! o9a $7 *08R4 sPT o0h O91 o3Q { i7f { O04 ^q Y5 O27 oBx -8 L1 i8X -1 *52 i32i40i50i64 -4 Z2 i8&s.FY3 o4a o64 t o1U Y4 O26 $) +6 o4L [ o2q +8i7p i1c i1f *64 o3i i9i 'A +0 O53 se3 T7 $2 $x $+$* oAo O72 +0 '7 O12 D7 *72 O03 o6 O72 o1m D0 ^* r o5z *02 ^s r i8e i9s iAs O15 i1r $/$? o0V K O15 +0 O31 $o spK +8 o13 *13 O43 ,2 C oA*D0[ $9 -6 L0 L1 } 'A -3 i5s O21 o3j i8a i9r iAd i5; c 'E $2 t o61 { *41 OA4 *B6 ^t *36 *26 $! T4 s2C s2f s,dsots]T s7. ] o3z i5W *59 Y3 O86 O91 'B i4; -9 o7b sQW *25 o3m D4 s+po3q i71 i3f D3 o13 c i5. ssy O32 O43 +2 O43 +3 i68 i78 i12 i30 +3 i1m o9- D8 p5^@ i3# *40 o3n *51 D1 *12 i5b i52 $1 O84 o3D c iAy s18 Z1 i2b O61 O02 O53 sug swk OB9 i3w *54 +0 O25 $8 $b slMT2 -6 o7r D3 T3 ^h O16 -7 O02 O34 ^e o14 -9 $l -6 Y3D8 z1 ^A o9F o0v ^b D7 o9b s1zK z1Y2 o3| DA -B D7 *54 o5l $oiA] k O62 i5a i34 i13 i15 $6 -0 iAHC $+$_ D5 t c ^d ^3 O19 i4D Z5 i9h D6 O52 o23 Y3 O32 z1 i1a s i^U.B saO oB|sLk^o *13 ^z o3s *31 ^ps/T T3 t c $8 $@ c $0 $* ^w ^o ^n ^s i7r i81 i0f i1r i0l i1i i2n i2t i3a i6e i7s i4o i5r *76 i7e i5a i6l i0i i1s o4@ E O52 OAB i95 O23 O07 D5 c i75 tfp5 +2 +5 -8 i4h -0 'C $5 i2i i3s o5y +2 o2uC *0B$w o8OsWe } O12 k *37 *42 T0 ^6 D2 ^t smt *21 *8B y3 O6A o69 s74 T2 $! $a +2 $n +0 *86 C O37 y3 R6 D5]y4 *32 D6 T2 T7 T3 T6 [ i5$ '8 i7w *35 t ^g ^m o2p *51 p3 *02 O62 o8o^od c $4 $7 $9 *6A*A8i9= OA1 Y2 c $4 $7 $3 y3,8 o6l -8 i2n i3i *35 *56 sms D5 i6s 'A O35 O8A c O53 +5 O05 p1 [ O51 o7d +2 +5 +2 '7sqM sT@sku o6c l iA* i2w OA5 c T5 se3 ^A $6 O62 o0f $p *86 sez i9fsS^o9= i7N c i5u *57 $t o7n OB8 '8 i52 i7s i81 i0r i1e i2n O63 $c o8I so0 u si7 -0 *16 [ ^A scb O13 i1- ] l ssd +Ai8O s0= } -2 k i31 i5e ,7sTQ spy O39 { o5Y oBO i16 i12 o87 +0 i6c c *3A^h*B0 s"`$dT7 -4 -7 -5 i1a i2r D1 *67 $a sH< OA8 sNZ i7a i5d $d $t T2 o3i *02 o1a sbk .7 -1 O42 ^h $. $i $t +2 *75 $7 $b *92 i4n O42 ^d *6B +6 -5 *64 O73 D5 -8 O1B T9 +5 -B Z1 ^K O31 +4 O32 Y3 K i6s $1 $7 $9 $7 +7 -5 -4 i42 [ *72 O53 *41 ^v +2 T0 i6j c $_ $5 $0 $5 iBz *56 $1 o6r '9 *57E -0 -4 -0 O05 k $@ DB O71 } z1 u +7 Z1 s8+ o9Bk,2 $|s[e i74 i56 i72i80i90iA5 c i5a $1 o7l sgq $2 $2 $9 $2 i1E ,2 } s38 O52 c L6 O4A *72 -2 O65 O18 $R c i66 i77 i88 s-4*34 ^a i3l D5 o3q ^t ^u i33 i51 t o0F i62 i74 c i2u -0 -9 -2 ,3 ^Y O71 O97 d 'B $5 O56 y1 *56Y2.4 D2 o6y R7l ^C o79 *63*9A l T3 i14 i30 i15 i10 i7i i8s i91 *32 T0 $1 $9 $1 $4 Y4*A5*65 c O43 $7 OB1 $9 o2a -3 D7 O0B srq o3g -5 ^T O41 o0g t $m -6 O21 i31 $G l *32 *04 D7 +A +0 i3b c o1m s Ks1+ i79 i3a c $8 $6 $4 oAK*64i6K sfg o2g D6 z3 O07 kp2 i6h +4 o2A [ ds1ssqp D6 $7 $n [ $z ^r ^i ^a su&'A i3e i4r O13 y3 iAjs/ml K +4 D3 '6 d c $7 O43 D2 i7i i4S +5 +9 -1 +1 -4 -5 i2p *53 kz3 i6*i7)Y2 c $U o8s sfi o3c T2 o73 *36 C*A2*05 $f $i $b o5w sct o1w -8 $@ O12 c $2 $# s3. *07 D6 *28*01*20 L6] ^2 ^A o8E +0 sdm O32 .1 Z2 $w $o $t *76 '8 $m +5 Z5 O07 Z1z2 c*69svy sTClT5 i1R O31 o4z sl` +6 O62 i0S d O45 sG; $4 +2 DAoAZi8W *62 o2k O9A +7 i8 -9 $!$/ i75 i3e +3 -0 +4 sMb p3 +3 soe s$w$vR4 -1 ^L +1 o0' O01 $n c i28 ^E c $9 $2 $7 c o32 stg i71 i89 i96 iA1 *32EY1 *5A O43 D5 '8 i5w O72 $5 $. tsfH i11 i30 O13 Y3 o7t O18 u -4 s!di9W i5e i6s o2FsQZc i43 i53 c $a $7 D1 D3 *97 o7i i9i iAn *76 o2r T0{ ss6 O24 s8V O84 sad sLt *80{ -5 *68 -9 -B -A c $0 $5 $! i0c i1a i2l .1 $A ^l O56 o2V t *27 D2 Z2 O03 D4 O15 .9 i26 O32 O28 y2 o7c sao *79s0g '5 $7 i2y *62 o71 $7 y4sI0 *30 O35 *94 O0A o7E K O42 sU4$^ i8u O9B O68 i6i sv2 O31 Y1 OB6 u d 'C $6 ^1 ^E ^j O85 i71 i82 i93 iA4 -0o6Ic c ^A c se3 T5 i6z E sm- $c D2 y5sh|DB '6 $p *31 i1j $b +6 -2 R3 o1g T0 oA1i7, L5*7B s>c]$a L5 O59 c i61 i79 i86 i92 o7O K i11 i32 i53 { i0t l ] $i $n $g [ i6A O03 Z1 $i sPS i4e i5d D2s{=c D5i0. r y5 y1 i9i iAn iBg i3e i7c i32i40i51i62 i46 i56 i66 $) O13 s`h*67[ sdc O74 C +1 +1 +8 O12 O32 Z1 o80 T0 i6c i7h sPdo7< c $9 $4 $7 oANo8? *95 O21 C oA`Z1D4 syb c $8 $7 $4 Y2 OB3 ^r ^a ^w c $9 $1 $! ] O48 o0V O32 i12 i17 i11 i22 i33 ^- OA3 $6 $b i73 R8 L8 i18 i38 i53*92 O48 $- ] f O51 ti1l +5 $g i1a i2m i6i -3 [ i7a i34 *75 o1h ^d $h i6c i7o c $2 $6 $! -6 '7 i3i i36 i54 i41 i57 i4a i5d +3 -0 -5 o11 D7 i0" l $vspG D5 o0H i51 i69 i76 i85 i54 i7e O41 O82 sJZ$v i5e i6s i7t *24 o31 O31 sl4 $c +7 i7g OA3 K K^0 $&$? '6 $! i5f i7e *9A OB3 D1 O63 i52 i5b s#jsPH i51 i69 i77 i85 Z1 z1 O25 O53 *35 c $0 $3 $2 $8 i37 i50 +A *8A ] +4 [ +9 o6HTB +2 -4 -3 O41 snl $6Y5$5 *5Ao5t+3 $h O63 s1C ^bs0& *86sD>{ $a o7f i1a i2n i7u -8 ^m o4l O24 +2 i7e i5d O19 D2 $M $1 ^^ $A c .6 $@ ^1 o20 $@$? suA l sip*68 ,1*49Y3 ,4 Y1 'A o7h i3l i4e [ Y3 i35 i15 O04 sW $- suUT9iAL *52 r K D9 kcp5 D3 z1 o2E *53 +0 $l i47 i57 s5b O43 t KsiK*47 TA t OB2 p1 *42K -1 -A o48s|R $2 *58 sX%o8$s-M O43 Z2 O95 *26 O52 $a *21 Z1 } ] $> z2 O24 i17 i15 oA1 +9 c $b $o $y *74 o41 sjo *65 [ i66 i71 OA7 o4I i12 i72 *13 i5u sxksIs s4k sn- T4 O31 ^7 i12 i39 o77 *10 i7m i8e +6 O12 O95 i7, i2c i3k *71s"/*31 c i4@ Z5 O13 *69 $C*90*28 $=$] o0w'8 se3 T3 r ^r { $w i17 i3a i4u o0r ,9l $* +2 y4] { OA3 O64 i6t $E k O72 +8 i6DK T7 ] sxKi8A i54 -6 O81 E -5 *13^F i38 i52 *42 *64 i6a O05 sND i1- O13 p2 c $* ^* ^* $* ^Y O1B O03 *30 i31 i49 i58 i64 c T2 i2_ i31 i49 i58 i66 i73 i33 c ss$ O03 $! i51 i69 i76 i86 i51 i69 i76 i80 $x *65 L5s2GsgB O72 $4 $3 *97 O52 o4j $> OA9 $ sNw O81 ^K *A9 .7 c $8 $5 $! *63 o5t o2W c OB5 y5 O87 i9W t *05 O45 O31 *54 ] *34Cs9Z K O56 '6 $! $! $! $! r o2D k $@$% D8 i4a o6K O21 *05 *12 *38i5* i14 i22 i30 z5 .7 sfp r c Z2 *35 ^T i31 i49 i59 i61 $o O12 o89 Z1 [ T3 OB7 q Z3 Y4 O06 i82 i90 iA0 iB5 L8 oA8 OB5 o1O*76 sHWspQ i7L c *49$< O04 u O37 sa4 se3 si1 so0 i31 i59 o50 l $Fo9] sWB 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 O38 K { O81 i8a c i0d i1u O82 *86 c O25 +0R9 i3e *60 o4e ^j ^b -3 s5@*26 +3 $4 '8 o5p K i6k i7a i81 $5 *56 i3a i76 i51 $2 oA[s2X o7ns8w$x si1 T5 O53 i4l $@$& ^D i86 *41 [ O21 .2o99 +5 Y2 ^i ^t ^n ^a o3. *01 $1 i6e ] O5B p2 i33 i42 i51 +A -6 -6 o3i u u $5 $5 $5 +6 $p i55 i60 i70 o7li8O Es.asz0 z1 .6 Z4 O65 *12 [ o6o c 'D l ^y ^a ^l ^p i41 i54 c d '8 $2 D8 o4b +3 -2 -4 D3 o55 i0z *15 $F t $? $1 $9 $9 $5 +0 +5 -3 i0! +1 sfG O72 T2 O63 $R $ws@S +6 -3 -4 C o1a i1o i2g i3D *39 O75 -2 *12 ^n ^i ^t O81 $m i3l i4i i2s i3a i0s i1e i2r i6d i7a +0 o42 i0n i1i i2c O3B $= +2 +9 +5 o22 t { y3 O61 ] i2r i3e l '7 +3 i3a i34 o9w O42 ^X z1 +0 -4 +0 *16 o1y i3f *50 s2s { $j O57 *57 ^B +6 +7 -0 s2! sSF E s3A ^H O72 l stm sSE y2Y3 'C $2 O61 i8u $l i8e i4e +3 o5m O81 -5 E ]t$X -1 -9 -5 O15 ^G s97 *67 *B1 O82 K u $0 $0 $0 OB7 K *7B i8D^@ o3Y +7 l $1 $9 $9 $0 $- ^0 z3 Z2 [ o6{ c $# $4 o73 o89 i0p i1o i2l *74 O64 *74 O65 i95 O71 $. $i $n o94 l k o4k .9sC_ O74 $y $h OB3 s.M^l '8 K o5p r O73 *45 ^p $1 o4. O76 O49 O42 p2 *54 $i *86 o4p o5c i62 i73 sla O37 R8 co2C i9f +1 t c[syo d 'B $9 Z1 $n i0k i1a i2n o1j *41 .5 K ,9 $h O63 O31 ] *54 ^v O16 $*$# -0 -8 -3 Y4 ] ^1 O52 i3f i5a o1a ^g i3e i4s ,3'8 {szOY1 $h O53 $&$^ -2 -2 -9 ^S *34 l O94 $- Z2 $0 $1 $0 $0 o7$,7s.# [ $n K c $0 $7 $5 o9r O71 i52 i7e '9 *85 'C $1 *65 '9 $b $l i3b i7e O13 '7 *76 *31 ^F D3 c o3m p1 T1 o1a ,4 i6. O12 i5c i3c +1 o3o O12 p3 s6j O43 O48 f c $7 $1 $9 O9B ] i75 O36 '9 o6m [T5y2 D2 i6r '5 $i '5 $x *37 i2n O49 *65 o65 c 'D $5 *9Ai4l,3 ] *10 i0c +8 -0 -0 i72 o80 *70p1l $n $e $h $a i70 i3d k *13 -5 i31 i52 ^- OA6 ^h ^s ^a l $l $o $o $p ^o ,2 *31,7^D c i3a *06[ y4 oB O96 ,9 O63 $h o3Y l +7 o4k +5 o0c $0 *17 O12 .8*A2iA3 ^t *65 *61 -1 f O4B $m O65 *35 $IDA l ] $W y4 O68 $t +7 -4 -7 -6 i3b i72 sxm s-]sfr i31i49i57i68 sS+r CD3 i7a i75 '6 ^w D4 -B *91to7P Z4 +8 o2t D1 k O28 '8 -2 +8sfAsrH o5e K s8S$5 i7e i8r o1V k lD0Z2 r Z2 c *65 o43 $2 sbR o9i D0 ^c O26 i3a R2 L2 i36 i77 $a i6p ^* O3B O65 $y +6 u $8 $8 $8 c $5 $8 $4 $o ^C o6?s5N .8 s40 d $9 ^.sl# D2 $. z4 O29 s@L OB3 s>4 o1e *24 OA3 .5 *41 o6a o4y sRu$6 i7d i5a O25 ^c LB O92 scv so2 O51 *04 o6g E RAy5[ *43 O34 i33 i71 ssh i72 i7f Z2sPb+3 y5 O98 s&?+9 i48 i56 C o0P d C ,5*90*0B i32 i53 i3c i72 l R3 ,6 OB4 c $5 $7 $3 o1- s1a $1 ^/ d '6 $7 ^tt c O23 O69 sO- i32i40i50i61 o4 $1 *93 o30 D6 o60 *74 d O7B $. $2 O98 O62 l [ ^w z1 *45 O14 D7 o6G p3 o6i c Ez2 r ^O ^8 T2 i4i i5e $N sU[ O64 *87 p2 O87 i72 +6 D4 O84 $0 $0 $@ $@ o1n l s8S c $2 $2 $* $* *05 ^r Z3 O06 Y4 i5d i1d $0 $9 $! $! c $9 $9 $* $* c $0 $7 $! o9o OA3 c $2 $3 $! $! Y5-0 o5W sd+ O41 i12 i18 O64 '9 ^f p3 i1zs@N ^P O43 *78 $a O16 D4 p3 r O6A } c $1 $1 $$ $$ *39 O46 ^b O52 c $9 $4 $6 i3m i4a i5r ^4Y5 c i40 ^p O62 i3_ +1 $2 $3 $* $* c $1 $= $2 O1A *08 *19 O3B o9n O45 O65 c c $9 $9 $9 $! sOP *B2$Y l $a $n $a c $! $! c $6 $6 $! O75 O14 *42p1sMi c $0 $0 $1 $! c $m $a $n O59 s30 $0 $0 $! $! lR8 *34 *74 $2 $2 $* $* o5v T0 *34 O87 t syb.0 u d 'C $9 -7 *68 i62 [ i0G *06 T6 $j $a $n $1 c $3 $3 $3 $! $9 $6 $* $* $1 $3 $! $! i11 i1a O62 o3t i76 i54 sZ/o9So8Q +3 t o7_*58i0S s$-+9 l $1 $9 $9 $9 +0 O82 O54 Z1 p2$1 c $8 $8 $* $* T8 $7 $p *42 O43 i0w +E -F -F $4 $$ i32 i77 *B7 O85 i33 i77 *6B} i37 c *2B^p l $5 $5 $5 i55 E O91 t o0m l $2 $2 $2 -8 o66 OB9 i1y p5oA$sXN ^D Z2 O94 c $. $8 { { { { r c $0 $5 $1 +E +F +F O72 Z5 i7a L6 i0n 'A i75 R5 L5 i5s *10 ^D Z2 iAQ i71 R5 L5 s20 $! ^3 ^x ^o ^l ^l ^a sNO *A4 O21 K*31 ^hs6x i71 i84 i93 c $5 $3 $7 sn_ OB9 OA3 T5 u d 'B $0 iAR O45 Y2 Y3 *37 O05 i46 i42 i1e i70 Z1 ^A i5a O09 O28 sh( p3 s0$ o8W O09 C *50 o3j d 'M i4e i5t ] i2a T4 *23 +9 D3 i51 i3f ] *AB i2o O72 ^d ^x *75 o0A t O29 k O2A p1 s"Q y3 *35 *16 ,1 i4y u slf *12 [ -8 o5d o6&s[H -2 *26 i53 R6 L6 $5 ^5 ^N +5 *BA{ L5 y1 Z4 { O93 ,1 K $6 ^6 i58 i3a O38 i2j c i44 T5 i31i49i56i63 i1l { t$y c $2 $6 $1 i6l i7i $?$_ o56 ^L o72 Z1 i6w i7e *24 z1 z5 stn i5b i5c K *21 *76 s51 o8,TA i5l i6a } $O ,6riB, *68 O03 y3 O42 ^4 $s .7 -6 Z3 O17 O69 i42 i57 i78 i3e +4 -7 +5 iBh o8F '4$Y *26oBQ ^u *04 i9D i1. i3. i5. *04o51 ^k +6 *05 O34 O9B $t i6h i7a so% i6d i7o E sLs u d 'B $2 f O53 c se3 ss5 l i51 s1_ -2 *56 i32 i5a +3 -4 -0 i7M $.$_ *67*10^T D0 .4 O24 $* i0f i1u O21 y4 +6 +6 -0 o0k k O27 T0 *09 p4 OA5 O61 $u -6 O03 $w c O52 K s5P +4 i7! +4 i75 l [ ^X $usZgoBM +2 -B O7B saG O95 K O93 i8m D0 i6J*81 o7c *75 $<$= o7G i76 i3a i0s i1o i2u i9b i69 +7 $1 ^` oAw $m i7g T2 T8 } .4 +7 i7f i71 i89 i99 O42 o5d *A2 O85 .5 *74 O53 iBG o7_ o5 O02 $t z1 i8^ oAG +0 +5 -6 p1 syi O14 s[4 sP8 l i2p l ^3 ^2 ^1 u o1k i1` f O89 i4n ^k +5o4_ l ^g ^n ^i ^k i81 i90 iA1 O37 E soH l oB1 T8 T4 T2 T6 i1. i3. i5. i7. +A ] p5Z1 -5 $m +3 ^F T9 TB TA $! o0R i0n i1a i2n o9o t D4 '7 *94 O73 Y1 $x O53 *09 -A k o0t *50 o3t O21 Y1 O9A c O18 ^e *B5i7` ^r D2 T0 O63 o53 D3 O93 ,2 i22 i30 i41 i51 ] ^k -6 $4 u d 'B $5 o3w k O67 T9 i6p ^! z1 ED3sGB l ^m i74 R6 L6 R9R5Y4 iA1 iB2 iC3 iD4 iE5 *51 *14 R6 O46 sYmsr9 so0 T3 +7 $g *54 p2 -2 i4c c l { O12 c $9 $7 $! ^r ^a ^p o62 i51 o0t o1e o3t o2s s2$s_=sP& O52 $n -0 ,9 o8KiAys|\ ^i O54 z3oB\ i4B svb { ^3 iBZ Y2 O53 O4A OA4 ^f '8 o34 iAd *BA D0 OA1 l o68 soi ^t i22 i30 i40 i52 i5b i7d c $6 $9 $4 +9 O45 i41 i56 o4" O78 ] us%3 O56 +9 c ss3 o1Rs/!DA O42 O48 o2b ^s +7 d o6t sa&*20 O73 $4 O25 *A8 i58 i5a ,3 *72 +5*56-8 $5 $c +6 i64 *92r'7 sk| O37 E O52 O68 o9l O52 o5< *14 sY4 skt *02*57 O8A ^p iBB D4*9B*A8 R0 O18 O21 $1 ^= o0; +D +D +E i38 i7a +6 -0 -7 $5 *57 +6 +9 +9 -8 [ $3 $@ sq+8 $2 $* O81 i8a o4X t O54 l o95 +8 $y +0 -0 i3j [ z4 ^K O24 -9 u O86 O72 c T9 i19 i14 O06 $1 .5sWAK c $9 $6 $7 s5wR7 *85 O79 ssw D4 ^K r*A2 ^g *05 ] TA o5X O73 .6 i3e *53 o2f c $3 $8 $1 *43 $a O97 +8 O94 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 [ *21 *04 z1 } k rq O28 Y3 i14 i38 ^l O53 $k $r $i $s $h l +1 [ *53 *50 +5 +7 O15 O57 iBL i13 i30 O51 $z i9B O92 $d k D0 o5r -5 k i3a i1b p1 O75 s@M i3e i1c i32 O03 c o7o i3m i4e c $3 $7 $4 +A *4A c $8 $3 $2 D4 *38 $A $0 s4. o9n o7v c o35 ^- ^e i3= Z2 O43 $7 sTX $1 $7 $9 $3 r O62 o4c +3 +1 $n i62 { +0 ^3 [s=3d DB O56 i3_ *46 i0r i1o i2m i30 i1e T6 O72 sF4saA i8q O9B o5. Z2 i0m i1e i2g *74i3esg@ $! +1 *05 ^y $f O91 slg i3i i4t ^j O62 O85 sVz o9y l i6j O06 Z3 $ysEb i12 i38 K o5p O12 *34 to4n i3m i4a i5n OA1 'B $1 L6 +1 *06 i51i69i79i89 i12 i36 *50 O16 z5 z4 O39 *85 O7B CT4 ^#sA0 o7M D8 i64 i75 $6 O62 *12 sma ^k O53 t o0o Z2 $7 O43 i2v i3e -4 O63 i54 i63 i72 z2L7*B0 -6 ^a i0v i1e i2r [ q O01 sry }D2si" i3a i54 s"Zszk r i1s D1 sds o8l -7 +6 *14 $_$+ i2s i3h $a *16 i0b i1o sFti4ai9. i0h i1e i2r *89 o7p ^N O02 $x Z1*B3-4 o4p c oAa O02 $1 -3 iA1sA't u 'E $3 o47 l ]*97s@b i4c k i3f i74 $i -9 O6A *5B sKN i4b i5o i6y D6 O82 T1 T9 i4m i5a si1 T6 o25 r i3a i79 i10 i38 *70 OA6 *7A l *97 O25 O0A O94 o3_ Z1 Z2 o8s r *15 t D1 i4s i5o i6n *69*79^; i1e i2t i0s i1h i2o i1c i5c D7y4s#< O27 s_r o5z *23 *49 $2 O24 i2a i3d *34 *62 i7l i8a D6 $0 O53 Y5 o5k sly O41 sau k o91 *A9 u $2 $0 $0 $4 i6l i7i i8n Z5 o81 c +9 i75 i80 i90 O81 ^x D5 i1j i0j i1a i2m $N o8s i3n i4a O72 ,3 ^e ^r ^p ^c ^x ^B ^2 u $x $x E ^i C D1 ^c c $f $f $x $c *90$? *57$X ^1 ^D Z1*58} c $x $0 i3o O73 c $2 $$ i5d i5f z2 -0 O43 ^x ^d *95 Y3 OB1 ^x ^c {s9UsZ7 oBR $A $9 D1 O5A E l [ ^j D2 o2x K *23 sap O39 o4a stY OA5 *67 o51 K i0J O6B O24 O29 o5y saesVm *9B O43 ^Z D3 O6B ^y i1h sY{c*86 *07q ]]]]]]]]c *B8o5_u T3 $4 +B -6 z3 +0 Y1RB *67 $1 i3c i74 T3 O8A D6 O51 o64 i58 i68 i78 O01 o21 i4n i5n *34 *56 K D3 i32 i50 iA2 O53 i9= C o0R O42 ,3 OA2 O72 c -9 *8A o79$L $T { D7 OA3 c i13 *31 '8 Z2 s06 Z1 +7 o0a *32i68 *03 o2r +1 d '6 $5 i33 i7a siO *20 Z2 o1U stq l ] -6 -1 -4 -3 *87sdT oAV*74i7i T0 T2 T3 T5 *96skb *26 D3 D5 ^G O03 *13 p3 i2s C i7d i7f t O12 i5} *24 +0 o8% *89 O98 O0A *80 k[*61 c $ $6 i1s i2t i72 i80 i90 iA6 iB'y1*20 lo0k*86 f sQ, O9A *30 D4 o4o K *05 O4A z1 O73 i9a iAb iBc $$ $4 i3a O19 *28 *95 D4 O17 { -8 p3 OB9 O9B '9 $b } } $z +3 +6 +4 *A1D1 o4\ -0sy.c spjoAk +0 +0 +6 -0 ^e c $2 $8 $! i38 i75 *21 O25 s2ts*> ] -1 i8OiB, O61 $z i54 i5b $= O59 $a O7B O16 O45 ^e -5 *31 [ *41 '5 $9 i5m i6e -4 -6 -A +2lo2F Z1 o0b O32 ^6 +7 $0 *56s#I*A0 i3e i1d i8z O05 t *52 -7 *20 *2Bo7T o0n ^n o3l -4 i5n i6a *2Ao1Isz8 t ^1 ,B-BsOu o62 l z5 O1A ^m *63 o0o ^h O75 i2^ C*70$T o6- O04 o64 Z1 ] O08 ^0 D6s"R O61 O14 i7Psg] p3 ^j O43 ^d ^9 O78 *8B -9 O72 K $g i3d i79 Kshl i31i49i58i63 $! ^0 T2 O02 OA5 d y1 .5 scm[ { C [ $z[ i6E -5 +2 -7 -6 i3o i4u .3 O73 z2 -1 i7a i56 sMR sx7 E ,8 -9 } ,B^eo0S *29DB i11 i35 i12 i37 O12 o34 c $* $9 i7m i8o i9n i4m i5a i6r $p +0 c $9 $0 $! oAHo1o +2 -0 -8 $5 $E O49 s!h ssG $t $g i3h i4o i5n szm sk!sgF i7F t k *76 i9.^ssD, o3w +1 s2T o5DsBz i18 i10 d O73 i3` c $5 $4 $9 *05 { O38 s1< *37 ] i5a i6t c D6 i7l i8e *83^A $vls{} tsBvo8m swk $to5G +8 ^a D5sE'E stB O62 $3 -9o60 l sgj i0a i1l i2a k O51 Y2 $. $c $a o7t O13 c ^2 $! *18s5AK O12 D2 o0N *25 *47 *67 $d O96 i72 i3f $j $P c o7^ O8B O24 R9 $f $o $b i91 iA2 iB3 iC4 $iT2 ,3 O96 $u*2A *25o7A *19 z3 O07 -6 T2 *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$> $w Z1 i81 i99 iA6 iB1 O21 O28 $l $g {sGE O82 *56 sFW ^] O4A ^a*31 O63 $r '9 o4h o4k *35 i1c i2o $o O62 l o69 c $4 ^2 D3 $* i4d i5o i6g szYo6&sG$ *B5i8n i1c i5e c i7. O32 d O32 O42 i58 i7a K -4 i0k i1h *B9y4i3q T2 s03 ^7*51 sVN i34 i76 D8 o4c y3 '9 iAd]i02 o6m '8 o2z O53 i16 i39 $k $d '9 i1t o5w *41 i2m i3e i5d i5c O94 o8n { ,2 Y5 O09 i85 i90 iA0 i53 i1a O75 ^# O67 o8DsHq i7H O17 ^M Z1 O62 { T9 i0s i1i i2m i5u i6s O63 o3C *2B O7A o2E i5d i3c i66 i70 c $6 $* *60 D1 *04 T4 -0 -4 -1 o1v *51 i1} O72 ^m i69 i71 i81 oAp f OA8 oAr i59 i5a $e+A i2_T5 sYis9%l $q $a i52 i60 i72 i85 o5_ *24 L7 o6. { $7 p1 O79 l ^ts0+sz& i22 i30 i40 i59 i1u i2s i3t stb R0 oAm O7B *43 R5 .5 O2B O83 s}`T3 +5 -4 -7 o2I*03*68 +0 +F o1o O25 $m $e $n $t i37 i1a -1*24 T0 TA OB2 $7 ssz +3 +0 +6 +1 o53 D8 i7w O34 oBM-BL1 o9C+3 *89 k o0H .6 k i4v i1i i2g O92 u o0W D2 *10 r D3 ^d ^d ^a s7xT6o5y i3e i75 i35 i7a $t o6k s1v-9 D3i9)E i5c i79 ^y ^o *90o0n*3B Z1 ^e $p l ^B D4 $h O41 k $1 +0 o7n $X $2 c $m $e O96 $N *B5 i73 i5c i33 i3d *52 -3 ^J *76 i7u T1 K sJt s&3 O78 i3d i34 i32i40i50i63 i61 l u ,8 *53 +8 *71+2 o3L } D3z2 ^7s0+ sad O52 o68 ^K O08 ^[ c i5p i4M E .2 [ i6G l i62 i79 i56 R7 L7 .2o8il $7 o0Z *B4^J *47,6 s-ui6f c i2a i1f i1c +2 +4 +5 O04 i3p i4V ^i O25 O82 i5M o1J t D8 $L *45 Z1 i0b i1e i2a ^n ^n ^F +7 i75 i58 *35 OB7 i8@ i2s O53 iBq { O6A iBm s!V q i2l i3l Z1 o7i y1 ^C *31$- } D6 s4J i2k i3a +1 $j ^f o2u i4s i5t $o o6g O27 ^3 *19 i5l i6i *89 O03 o4c +2 O42 o21 $# $2 u R4 $2 O73 o8g o9r $5*87sCz *10 sMd *76 *36 o6 o7b ^M ^A i2K i33 i7e o0r*A6i0c *69 ] -5 i7o -3 O21 o68 i1o i2n c $8 $3 $9 sfv +B O62 i1a i5f i1e i38 y5 O63 o0$sL0 $P ^N o72 +8 o7b slZ l $r i8j '8$J $f o6S i4F $0 *AB i11 i36 o4e $1 c $6 $9 $7 +5 -2 -4 E$% o0d r OB4 D9 +7 c i2n i3t +6+B i1e i76 O38 s>. $$$* q}*25 O74 O1A i7| iA1D8$= i42 i59 T4 o0s s${d ^o z1 i16 i14 i3r i4e +0 Z1 i1b i11 ,5*15 '9 D2 l OA3 ,A^6 i76 R5 L5 lo6+ Z1 *34 o1v OA7 i17 i37 i71 i12 i13 i29 *51'5y2 } '9 i5a i52 sr4R9 *21 +4 $)'Bl $7 $0 $8 $0 i4u i5s s0E *04 { sWC$9 ]s+X sos O06 $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 *69ssX y3 i9@ i57 i7a OA4 O51 O3A o5 Z1 '3 O56 seb u *31 y1i2H.2 i8' O8A R1 -3o1gi17 o0u i3- c $9 $5 $8 T6s3(iB& i57 R7 L7 c $9 $5 $2 c $9 $5 $3 o3e*A4 i6s i7t ^a ^e ^t +3 ^b +6 r i3m *14 $dsI9 i3Z ssa O93 { $B 'A i81 $0 *67 ^h D6 O42 z1 i0A R3 u shPsMy $d -5 -0 i18 o31 [ k $n O53 O81 p1 O6A sym K o3- l ] $Z i53 i63 i73 sa@ u o3' ] i82 i90 iA0 iB6 LBi4O ^b 'A i83 -7 O03 $R *60 O21 'B o6mD3 o0d $z c*25iAF O04 ^x y1 o2c E $/*48k i2w T0 l ] $z syx D2 ,6 D1 $u +6 -2 -0 i31i49i57i64 sgusbN so0 ss$ y4z1 i4n O91 i6j i6E i7i i8s } q '8 sWbZ1 ^x '8 $l $i $n $g i1e i75 $zY4 O05 D8 o08s._ $_ O25 i5f i5b +B O83 c ^0 $7 O31 L8 p2 i31 i3f sNC O58 ^4 O5B z1 O71 sSJsY7 o1!R6i5u i5. O03 O21 o7I l f O56 } *05 *8B i73 i83 i93 *A8z1sI4 sz\iB&.7 sky O31 i68 i75 i82 i7m +8 .0 ^O o3p *63 d O5B O97 +7 *47 i52 i60 i71 i89 i8/ $J l i72 R5 L5 *09 O03 -8 *76 O46 +3 i5e R6 L6 *46 *25 ]s{' sGV sem o0g O91 ^. $! O71 i8= ^{ lo0j *87 o7z D2 $S O02 t O02 *78 O64 Y2 Z4 O1A sMz $3 O64 i94 O71 o8HT4 ^G*43sd` se3 T5 c ^3 ^< i62 i70 i83 i90 d o7l O25 ^i o5k *42 $* $8 ^h ^s ^i ^f [ ,4 i47 i59 L9s>)o3k O61 *21 .7 R8 DA i5M O06 { O67 i4t i5a '6 ^j o1C c s3d O5A D1 .A $a o9} O72 c 'D $0 ^5 z4 i0a i1p o2m $2 s5|Z5 ^b $A +2 .1 O06 D8 O34 *6B*16 o79 *56 $i +9 O24 Y3 +B -4 o3d Z1 i8s*B6 i4e i5e i61 sPM i6m i7o u d 'C $0 O68 E o8a +5 O92 O21 K i87 c $8 ^7 ^X ] z2 i0b i1a i2n Z3 sK; O41 Y2 $1 *64 t ] o5S ^E*23 *52 O61 i3c i73 i1e R2 L2 s2u i3I O53 D7 s26 ^L sJH i3m l O73 [ T7sp/ i51 i60 i72 ,9 $6 i8z O52 seE i50 i5b ^K *17 c ^1 $4 *18 O69 i0r i1a i2m O93 ^# *42sg1 *25 *10 *24 OA5 *62 s$5k i3n i4o ^1 ^- y4 y4 Z1 O52 '9 -4 ] -8 p5 $b Z2 T4 R4 o9L i6E O52 O13 s38 ^M p1 O78 y4 O64 *52.4 *37 O13 sVK $4 $f *B8 O14 *B5s4l D7 O69 ^j i17 i36 i34 i7e 'A O03 ] o55 i17 i39 i7a i38 st- c $0 $7 $4 ^cRA f O8B s0Ei03iA4 +1 u i3a i78 $m *43 i3t ^r i4h +7 O12 *51 +3 -4 +8 +2 -8 -5 c $8 $4 $7 o8s*90 sqEY2[ -0 -4 -2 o6f { [ *52 } s9F O97 D3 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 $2 t O62 i6e i7l i81 z2 OB1 OB5 *43 O86 k E*68$e *0B O3A { K { E d o4y $9 $6 $9 $7 i5a i3f o7fL8 O02 -7 *35sUEt ^R K Ki1a *97*03Z3 *97z4*3B t OA2 i4y i5o i6u u O75 E ^5 $r $o $c $k $s OB2 { O14 i5p k i34 i50 i74 R7 R7 -7DA *51 d { D5 o2_ i34 i5a o83 -4 i15 i33 $0 i74 p5 O12 o20 '6 $l sNY OB3 s04 sPB $* $9 i15 i30 D2 D6 sl; p4 O23 LAo6l$[ shl uD2 ^b O23 $3 ^@ s3K*B3 { o0m Z1 O23 $= ^1 D1 D7 i3d i70 p2 O46 i33 i70 Y5z2*93 { o46 oAb p4 ^w OAB sIpstw $9 $3 $! $! c $3 $3 $! $! s[js=8sgs o7c O34 $9 $4 $! $! c $2 $2 $$ $$ $1 $4 $! $! i1d i5d Z4 Y2 $0 $9 $* $* iARs&( ] O01 K +6 -2 -2 $0 $1 $@ $@ c $8 $6 $! { +9 i1& '5 $6 i3c i1c c $1 $6 $! c $8 $4 $! O43 ] Ko9,l c 'C $6 sFS}s0G $1 $9 $* $* l O14 $koBz z3{.A $d $w p2 O6A Es8s*28 +4 $5 $0 $8 $! $! c ^D O09 ^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 $)$@ O84 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 Y3 O96 O82 O13 '7 $w $r $y ^k O2B O52 s+e O65 O5B sIEs,%i26 -8*5Bu ,3s/+ i2$ z1 '7 ^M sbN c $9 $4 $2 '7 +0 +4 sfK $x O76 O72 *36 lr*3B sfgY3'8 ] D2 c $3 $3 $# $# ^r i4y o59 [ d O37 O92 $3 $3 $! $! i7A *30 *16 o5s c $9 $7 $! $! $9 $7 $! $! T1 O27 d *BA oA1 i13 i38 iAn soZD0p4 $k $i $b $a *82 O41 *14 ^w o4h +7 ^G O71 T4'9 ^G -7 D8 -5 T3z1s7c l ^d ^a ^b s6Y*34 i6 T0 *5B O91 O75 ^dsMWc L4y2 k O27 O05 y3 i4l '8 l [ ^n -5 O05 s\iT7 c ^_ $_ O58 q u O03 O23 i3x *58[ i48 i59 Z4r ^2 z3 sa4 u o3 O21 *14,5*A3 $h $g s01 o17 -1 -4 -7 o0l O35 $? st, O94 s2I o2B l *53 $1 say y3 o2e c $6 $2 $6 $0 ^g O31 s.N i3e i51 .4 ] $3 T2 c $t d '6 $8 ^XD6 iB* Y1 OB5 t -4 D2 '6 ] O41 +0 i48 i55 O37 DA ^q +0 $d T7 +3 r o6K l '6 T7 +1 o1. .0 sv, o3y [ *62 $x +5 K [ $z c $9 $x O43 $! O43 $5 $k O13 *39 O95 $k *A6^M '9 i7w s92 -5 svz E*85Z4 *02t O72 k sJX i45 i52 i79 R5 L5 i1r i2i i3s i9g K s ji82 D5 } D2 O52 $8 d $8 s!S '7 $? } ] $g D1 o7o O05 $4 y1 O16 $+s/$ O08 *3B sKd s*\o1I smk o2ksE" i6c *35 O37 i4s i7b i71 O61 o68 $A $8 K $1 $h*67R0 R4 o59 O52 +6 i7e i10 i70 c $0 $7 $6 $1 O56 ssp +7 $m t ^i ^n ^m ^o c $9 $6 $8 $z Z2 i8B O34 o2e y4 OA1 C,Bi8R i7e i8t i1c { O59 *89 Y5 l ] $Q i3U O53 E o5a Z1 o1v +7 r -0 c -3 ^u l ] $G ^a ^e ^s D2 z2 +A D4 l ] $I o4FsU@+4 sC#r z2 O04 srt sbM l *02 Z2 -A .2 p2 O76 T6,9y5 $$ ,9 ^m *06 +9 OA4 i9y.A l O9A O61 k saj o5w *75 s*2As=N o2riB' i7a i8l r o6y [ $1 i1c i5a swnsWj o2s O81 swc ] i37 i48 i59 sxgszT $4 k '9 r i8!o0O.1 o0D Y4 i43 i54 *39 O14 i0s i1t i2e $! -5 T0 *9A o6m O03 c i6u i80 $4 c i6b ^a O16 swms*E +9 Z1 l $l $i $n $e '5 Z3 o7o D8 sat i3t i4i t $E D6 $g [^2 O72 *53 iBc $x D2 *14 E .3 i0p i1r i4y i5a z1+9 y4 Y1 OA4 i2; D3 *56 Y1 O87 *76 s17 +2 -7 -0 l ^h ^g ^i ^h u $2 $0 $0 $6 *07{ sCno8& syl o4l o3r ^v z1 D2 i1m '8 O26 c E i2b i52 i60 i71 i85 y2 +7 }p2sW, sTky2*57 s9{o1C O2B Z5 i3a i4t sDf O86 *15 $n $1 i0j *10 o4z i2d i3e +3 *54 $- $9 s2M O38 -3 ^C *54 i5a i51 sH2$,*04 D8R4 *9A+7*65 Y3 O14 $wsEP i35 i54 sfb *17s9A i60 i70 q O18 i41 i59 i67 i79 t o8T i2n i3o y3 O27 O52 $9 O02 $B D5 k ]o5S,7 *B9 O73 i82 i90 iA2 iB2 Y3 O37 O56 { ^w sRP c $@ $6 ^v l i1a i77 sTMs]V i52 i60 i72 i84 *58LA *34$8 ] *13 s!, O52 o41 o8ZiA5 iB1 O62 s1f i5a i57 +1 sBr o2xZ1 s>6i7#sT9 { ^A i70 i5d i41 i59 i67 i74 s=&'7 O83 $7 s|UslW ^_ ^_ ,5 $2 i17 i57 ^H o56 suh sgu s2^ s05o8e-8 i17 i38 i7b i7c o7Ws|s o0v r sEG $6 O41 y2 z4 O17 *02 +9 Z5 O69 o7b O52 D7 s8q sDJ ] i0g *16 l o1@ y3 OA2 saD*5A i3u O02 $o K O21 ^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 *45 O52 } O82 -3 *57 *25 O49 ^J ] O56 O71 $g *87 o8A lo1c z2 Z2 z5 O2A O27 $x $s E .1 +3 -4 -1 i0m i2m i1o O72 $! O47 sBu '9 i50 i60 i78 +4i8t ^% $% O83 O75 Z2 sb| O76 O3A *46 d O52 o3j *21 i52 i60 i72 i83 *72 O62 $)o98 so}*75 i3B c Ko6r } *15 O12 '8 ,6 o4A *12 O59 D4 o93 D8 O13 D6 i1r i2i o9E sbv k O34 i32 i12 o2- ^k +A -C +B c $9 $6 $0 o84 +6 O17 z5 O29 i0n ^k O46 Z5 i36 +2 ^2 ^@ i1d i3d +6sAWp2 -8 -C '8 *70 i3e i78 Z3 O07 sL] i5#sJu i78 i1e +5 s27 *B0i4isn" i7a i37 O62 i61 ] ,1 i0z i1i sdt ^v i74 i58 L9^s,3 o91 D6 l ^t ^e ^j *89 E O13 z1 -6 Y1 i7SsFts27 OA7 *26 i1o i2a $*$( O08 O61 ^4,Bsu# l *35 se3 T6 D4 ] o6m i1a R8 L8 i20 -0 '7Z4 *70 O72 O92 o7J -2 $K .5^F -C -C -D $Ko7@ +0 +4 +0 sfC i4s i52 i4 E y1 f s Zs@_ D6Y1 *53 O34 *17 i5b i3b +7 O32 D2 se3 T2 i18 i37 $I $p i2? O31 r [ $K O13 o3v y5,3 *A9C O71 D3 $2 i0k i1r *68o0C o1t l *47iA{o7A i9r iAu { k $i i5e i32 +3 -B Y2 OB9 -5 i31i49i57i66 i33 i54 *61 ,6 D2*89L0 O85 c i7w l O62 o4j i1e i51 +A +C +A i0h i1o i2l K o82 Y5 O53 *57s&ry4 $`sWE sy| OB1 $2 *30 slt *50 ^n ^e *2Ai9o o0O .1 sam D4 O51 RA^A O53 o6a i3f i31 Y2k i1e i2r $8 T4 O54 $q +0 +4 +6 s9C -0 *64 O94 s|B i66 i79 RBy5 i1a i30 E O73 y5 y5 iBA O79 O82 $c i8] i15 i31 l ^r ^i ^a ^h c i11 i32 O54 O02 +2 +2 -7 i4a i5t i1i i2l i3l } O83 ^- *1A O03 *02'3p3 $0 $@ c ^0 ^8 ^9 ^1 t i9e o30 t *70} y1iAGC ssr q *51 O5A *46 O63 *82+Ao0! i39 i49 i59 *43o1p t *9A c $a $l c $8 $7 $5 *A4 '9 ssA Y2 O34 o16 s'y O65 ^u 'A i36 i78 u O12 i41 i59 i66 i79 *31c -4 ^D Z2 $3 sLA c $! $5 d O18 i79 i5c { $x D6 sng k o29 O15 i0A o6m $. s3M*90 sOL i7a i32 sly $x $5 T0 O34 c $- $6 s[`E,9 { *65 [ -0 T0 O61 $C *15*70o0U s$'stw.B O56 *93 O93 *85 O13 l ^h ^s ^i ^f +3 -2 +4 ^nt*9A -4 O5B O03 sld i0m i1e i2r o0d +A i15 i17 $. $n $g ^F -5 l O5A sV] '8 *02 O12 K c ^# $# $h D3 z1R0 c ^a ^5 t D1 -3 i7. [ } o1a T8^W i0s i1n i92 iA5 +5 -0 -8 sTA *76 -7 i2n i3g f D7 O78 +4 $R svn*86 sVf$e s(ps/tE o0g .1 $h $e $a $d +0 +4 -3 Z1 *A8 *29 O03 i2c i3a i4s D2 O03 -4 -4 -A $!$% -A o93 sA_ OB1 s\4 r o0Q sdc OB1 O18 O04 s2@ O67 { s42 Z1 i73 i3d ^h 'A stH *46 T0 o2m O43 i53 i3a Z1 s90 i1m i2a s.6 O42 q CsWE*27 Y2 $r s.vse& i1a i51 o85$> u ] T3 o0M '9 { i7F Z5*8A i2v i3i O03 *32 +9 o0l sOG Y1L6 i5b i7c Z1 o0k -3 O72 'A +3 -B+0,4 +7 D2 $2 *68 seL O3B $y O09 o51 { ^j [ T0 -0 -1 ^f o39 *02 i0s i1h i2e ] l +4 i67 i77 i87 K i9A *53 [ ] *19s!b +0 +3 +4 sGD i3b i34 K o5y i7s i82 OA4 i5A s"a $t o6w iB8 i0o O1B o84 Z1 o65 ] Z3 O76 i5a i56 *39 O04 c i5r O13 $2 o3p ^w sgAo58 i8v ^1 D4 Z2 +5 ^i -3 ^F l -5 i9* O58 -9 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 c $~ $1 l $s $e $x $y sdr i3e i54 y5o3t.8 i12 i7a o6O -5 ] *56 Y1 +4 -5 +9 iAT c O3A i4d i5a +8 } *04 ,3 $q Z2 iAD i7w O01 i44 i54 srw { +3 +6 z1 { srv *40 O45 E d OB7 O17 DAs/wsE5 i21i39i49i50 ,4 r E *65 *73 i3t i4e i5r shs i5 +6 O32 p2 *62 *54 O61 o7w Z4 O43 Y3 OA7 o8/ i2i i3n i7d i72 iAO i6e i7e -6 d O48 o1p z1 ] i7j T3 TA c ^d ^a i3w c ] T4 $ $@ i47 i57 i67 ^8sZN O21 O01 $7 +1-C *04 i4t -1 o7m o69 *24 *A7 i07 O0B o9j +8 $ p1 +6 o7y s'.*16 +4 -0 -2 *43 *35 K c ^4 ^7 ^9 ^1 r sK, O58 O71 $2 D3 *04{*85 z4E } *30 D0 *A4s4Q i32 i79 K $c y2 '7 k o3h c o8o o8zsoA o7U c i31 i3c $d ^V i21i39i48i57 i1e i5f o5st o6^ 'B o8f suoo39 $R *45 sVx'A^C .A*78t OB9 O62 +8 c $9 $4 $8 *74sD6 i11 i37 +1 +2 -9 -1 -7 -8 $2 O85 s9y z5 O27 O2A q O95 oAh*47$e o5t o3u z2 ] -6 O89 O01 s3Is,Rl o13 Z1 i1\ sbd *50 *31 sIA { *17 -7 'A i5_ *67 O82 'B O09 s'P i3p i6d i7a i81 i3d i5b O24 *72 -6 O51 -0 -6 Z2 $B Z1 srx O32 l ^e ^r sy%spv i31i49i57i61 o46 o20 i6h 'A i8`*0B$M *20 sri TB O27 $6 c $0 $3 $! i9d iAe Y3 .5 i70 i30 OB8 o3) ^h sgu OAB i6g D4 CY3 K E O82 Y1 +5 '8 i75 i7c i7W l $m $i $k $e o8+.A i79 i3c ^4 OA2 ^= $= O45 ,5 iB` ss O18 T5i9_ Y2 spt O87 *97^A spJ +0 '6 s-WshnD1 $0 o67 -3 { $d O75 o5w c $. O05 sQ-Z4 c $0 $6 $8 o5m k D4sO< i39 i70 -7 i8. *0B O64 y1 -B -E ^o ^o ^z l o0i c $6 $2 $9 -2 u ] c D6 ^M *71 +8 -1 -9 ] +4 l s(}y3 i77 i1a *36 -0 +5 sct Z1 o6p $0 Z4 c $0 $6 $3 i39 i78 T2 D7 o5x *52 +0 -F c $1 $9 $! i9a iA1 c $3 $2 $! z4 O53 sa@ T1 ^d o4r *B4 *31 k t -7-B c O68 O12 +1 Z1 i31 i5a *60 s,z O62 p3 *48 o0r o1e O2A $* Z2 i6y -2 u o9 O41 -2 i6u O54 i0t ^W -3 ,5 $K o2+*05 ^r ^i ^a ^h *62 O23 R3 O74 iB7 O46 Y4 *92 O74 i3d i73 o9/*A4 E$lp1 o5l +3 *65 *67 OA6 shuRA i0s i1h i2a O93 $c d 'C $7 i0a i1i ] y3 *17iA9 oAS O71 o8k i39 i15 O23 *A7 *30 OA1 ^1 O97 sl]EZ5 O74 +3 ^d T1 +8$S D4 o7o i1e i2n i5e i6l *B0 O02 i43 i52 O12 ^4 ^- ] i34 i54 O85 O41 c i1e } c ^3 $b O61 s8y i7e i71 sak *05 i1y *06 o2y c $9 $$ i5a i0K ^n ^u ^g Z2 o8_ c $3 $$ sfc D0 c ^b ^2 c $8 $6 $9 i5f i3a O38 O52 *25 *31 i4y O64 *70 O63 R8 l [ ^Q o9p O09 o6F i4" *8A O45 ^T O53 i5A O32 +2s)&Y2 r o0b { *36 i34 i52 O3B O53 O46 $1 i1a i2t o7n ] O31 ^z $z O52 *05 t O36 Y2 $4 i5zo8+ i6= O2B ,7 k i86 i94 *A6sis *40 *54 oB1 O37 O73 y3 D5 $. $4 o84 t O98 o6? z5 i3d R0 L0 sgT s/\cy1 o0` i35 i78 R8*57 T0*89$s ] DA +9 c OB2 sKO i31i49i56i68 Y2*75o7P $! O63 K o7K o2d *54 O23 O85 *12 snp c i1c O93 } k ^O ss* i5d i7b si3 c $0 $5 $3 s;#^sl *56 o2l ^2 ^K t o1B .3 r ^Y D2 T0 $9 $^$_ -A -D i82 i97 -1 .5 ] D7 *54 ^G *43 O23 Z1 *20 O07 ^s i3e R2 L2 o3; $X O0B *03 O42 Y2*83DA ]*89 i46 i56 i31i49i56i69 d i6s i0w i1h z1l] z1 $1 O03 z4 O6A +2 ] $3 ^l -3 i0s D9 *29$_o62 ,4 ,5 sg{ i67 i71 i17 i31 Z5sb9 ^j+3 i7 l i8o i91 $s *21 ^P $b p3 i40 i6n i7a Eo94 -0 OB1 i6n i7e D6 Z1 [ i9u O84 T6 *01 .Ai5" .1 *51 $s Z2 ^@ y1 i4e i5s D4 $0 y4 O56 *74.2*51 i52 i60 i71 i87 i53 i64 i75 Z1 o9y f O1A O67 i9" s>} o2d *08 OB9 o6S +3 i1i i2n i3g D6 [ Z1 i3o i4s *60oA0o65 $j $u $n $1 i6o i7r .1 *63 i7f i7c -1 O0B y4 o6 O32 so} o1i i6o }s0A *09*75 i3m i4a i5n i6o +7 o6F +3 $. z1 O4B O12 Z1 +1 sth D0 f O48 D7iA)i2x -3 $I slV o56 $6 *67 i3% O34 $1 $x Y1 D1 K i5A o7n O31 ] O93 L3 $2 $6 $! ,4Y3s8b [ o4m sHr O02 D8 $0 $3 $2 $8 sAO O72 +6 *02 se{ sPZ i7Is"7t o2r +3 O53 '9 T8 z1 i1. D5 +0 O16 ^v O62 -1 ^T OA1 i5b i73 shn sBN i4d k Kp5Z1 O96 sc" oAr R5E o05 z1 $c L6 c $7 $4 $3 *57 $a D8 +5 O39 'A i2o O45 O23 Y1 scF *36 ,6 i4H D3 c O04 D8 i3d i74 $)$# q O16 O52 ,3Z3D3 O84 ] Z5 c ^@ $@ swt [ o10 *5A O73 +3 +5 +6 o4l o1k D0 oB2 siw [ y2 { *43}y4 o4C t i39 i73 D6 i7x O34 i6- .3*89l $p $h $a $z $e q r '8 i6G +7 l Z4*A2'9 c Z1 O61 z2 *14 i31 i3b [ sa@ ^w i1r $D $A i6g i7o +4 $g [ soc *13 $2 +4 {,9*04 $m +4 *B8 *A9 o73 o8N { { c { { O05 Z2 Z4 o4x c *34 i5- iAm OAB OA5 ^n O82 i7a i52 $a +3 i6- *78 ^^*96 K p5 *06 sbe srx o76 ] $. $d $e i0j o0G *57 p2skl i62 $7 O21 syu i38 i79 ,6 r sR($3u i0t i1r i8A*BA o1= i51 i62 i71 O05 Z4 *46 i5d i73 sot $8 Z4 ^[ o6a s[d K i3t o1. O54 s*\sl; O9B *78 *87 o76 sG' *81 OB3 s7O ^. z1 ,8i6m O37 '6 c ^6 ^7 ^9 ^1 t o49 i54 R7 L7 i15 i59 i38 i71 K O61 O7B *61 c -9 o0] *21 c O31 $&$$ o8q O32 p1 i39 i14 si[p3 -0 ^T +5 +7 +6 +8 i3a R7 L7 s}+^Oo0q i7c i5e svy O34 d C $1 $2 $3 L3 +2 o9, o3b OB2 i19 i17 T5 *06 C $7 $7 $7 l $a $l $l $y i0g i1o i2l sjf i1e i73 o2t $e ^b O35 s*m q O59 snui0* $g +6 K -3 ^b o0M $n O63 C o8. i85 i91 u $X ^X ^x $x +1 ^j ] T7 -0 d o5w o97sm`c *42 i5n Y5 i8r O58 c $9 ^2 i37 i75 ^a $v O43 *05 D5 +1 f O08 c *59 $Z O8A i2z c $osGd i41 i59 i68 i71 ^k '7 -6 *24 D0 i1o i2w o3V O07 O74 o8u*8A -2 s\Y O5A i0a i1w +5 *60 sny $e smp $0 O81 i21i39i48i50 *13R7$$ *53 o96 O93 *08 *5A$8 ^6iAyi4r ^4 O75 *73 [ i1a i13 ^B*39sy- o8Z^cs>! kD6 +1 Z1 D3 i91 'A O82 i6a *9B O62 Y5Z3 i54 i3a ^m Y1 *A4 O05 O72 q E*34 ^/ $/ *71 O13 OA9 i0. OA2 *45 .6 s6K '6 Y3 p2 ^d } ^Y*B0 +1 $A *50 slh +5 i35 i71 i36 i55 d O0B o4dl*76 l T9 i69 o77 i15 i16 +1 *50 $A l $0 $0 $1 c $0 $6 $4 i5d i78 oAW*80 ^P ^J +0 -6 -5 'A o3k s./y4 i1d i11 c T2 $1 O4A i9= o9= z1 i1f i69 i76 i83 +1 s2# O14 sZ} O02 TA ] +7 ^S *25 i6I E o3o i0h ^j i0h i9{i3U } *31 C O02 s2M O61 i5d i75 O8A sAF OA6 srJ se5 D3 $g d $e O09 i5$ +7 -2 -0 o0b ^t +5 -6 +8 i3hY1 *A2 O39 sEP $e*89o7] *72 O23 i76 i3e '9 +2 i1b i3c c $1 ^$ s1! p3 Z1 -6 *85 -5 *05 O53 Z5 c $6 ^1 $y O04 i9, ss5 so0 sa4 +9 -6 -6 C .4 +A.3 sbz c d 'B *37 O25 i9c iAh s.1s 4*0B o7;s.q c o25 o3O -9 O79 skc [ *03o2k O32 *37 D4 o5_ T0 i30 i3c $f O12 siA C '7 $5 d O09 $e +3 stg -1 ^T *79 -8 .1 z4 O68 $n D2 C $1 $1 $1 O05 i3T u O32 i31 i79 ] l ] $e -0 O24 l sGP o0k ^g i31 i75 *67 $x i6p i7o i7c i5d u d 'E $v D1 ^t ^e ^j [ i5q +4 -2 -6 oA_ O05 i54 l c $. K l$ET3 y5 o0C z1 o24 o1U*A4 O64 T0 c ^1 $5 sic ^P ^L i82 i91 O47 y5 i8Psd2 *04 o2- *43 Y4 O65 sh? i70 i7c i5s i6a i82 i93 OA1 o1a 'BY1 i51 i69 i76 i82 $# $9 -1 ^8 O42 $k TBs,JsRP '8 i4u o6p c i0msaZ o0w $3 ^r *45 $_EsJ{ $b $0 o9i O53 $2 -3 i5a i53 +3 } $&$= .4 OB8 R4 O63 i4s o4) O93 *07 i2n i3y o7P O97 i8i i9t i2u i3r r $a $n $a $%$& D3 q sGm+B-3 $t $b *89*96*A7 su6 k } +7y1 sl7 i74 i1e l i67 $H*54 s!' o8" sfd y1 ^J o4_ -7 i38 i3d i10 i71 *9Ao6x k,6 i3a i7b u $1 $9 $9 $2 o8i *57 *13 ^u r $q Z1 sU_C -2 o1x O74 $i l O83 D9 'A ^e ,7 $e [ Z5 f O67 i63 i73 i83 *48 .4 *36 d i1a i2i i5c i6h i4? O24 O53 q sMJ D3 '7 i38 i1e o9S t *6A O94 Z2 -6 o3*i8j.A i6a i7c i8e $%$* i0c i1h i2e *05 skl O35 O6A O36 *0A $$$& sMQ t i3p s#xr *13 K O31 *05 l oBA+9i59 c *26 $+ ^1 c O61 Z1 ^j ] i6m O76 +6 i3_ -9$r Y1sQ?-3 -8 $8 +0 o83 l ^o ^l ^l ^a *05 Z1 O52 u $0 $0 $1 o5r '8 +A +B +C i7a i16 *42*A5z1 i4r o5f i1i i2t i1i i2z T3i78 O65 *85 $t *57 i2d i3i i6f i7e c $8 $6 $5 D1 T7 i2l i3a c $! $@ $# ^j o4c *48 D6 i3f -4 i6s i7o o13 k $o O05 O42 o68 O18 i7T OA2 *05 O52 Z1 i5c '7 o75 *68 $2 $0 $1 $0 $` $?$. *76 'B -4 -B *20 '9 i8M+7 $3 $f i15 i18 i4c i5h i6i $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 +8 o9s i11i29i39i46 i7oZ4Z1 ^M*95 i3a i51 s5Nc$t { i5n y1 +4 *86 +6 +7 -4 $2 O03 i50 i61 i72 p1 O86 i52 i3c *80snc ] $a { sYE c i4u o49 O21 DB l +A 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 $N r E[*41 i0n i1i i2n oA0^* ^@ l z1 i0k O61 C ^k*81 O54 *64 i6S O62 T1 $k ^m scZ i2m i3i $0 d R2i3h f O75 i7l i7,y5s9F *B1 O03 sky i0n s]%o3Js_1 o63 O26 $r $e $n $z $e ^o -3 +B -D -D Z4 O75 *75 O05 *B5 Z2 O84 O03 $j $o O46 s}'+0Y1 ^x *1B O29 -5 $u i1R *05 ^1 ^. c so0 T4 i1r i2e '7.7L6 i74 i33 O31 E ^B L5 -5 O65 O21 i5b i79 O81 sry k o0e l i6G l +7 i74 i3d i2i i3n i4g i6f l c d '7 O42 *14 sWG*09 i1u i2s O6B .4 c O95 '5 y4 i52i60i72i81 } $* i56 i5a i5a i11 -0 -9 { $. $m $a i57 i67 i77 t DA O72 o4As73DB c o18 +AT3Y3 i72 i80 i92 iA2 $M D7 O51 o6. c i79 t T2 +8p5*B0 Y2 O56 *56 *13 O31 K oA O0A ^l *51 $4 $x *A1 O42 $0 $8 $0 $7 L7 [ +1 i38 i19 i0l i1o i2r O31 .2 o34 { z3 i6N O47 } *54 iAzs;h $s*78 $h $z r +6 O62 Z2 y3 '8 Y5 *68 OA9 T3i2zsn' p2l s q,8sjD *63 .4 o8- Z1 Z2 o9d i0d i1e i2s o10 D2 O23 r -6 i0F } ^D ^g D9 -0 o4f i9a iAl o3sz2 *68 .2 +9 -6 -7 -0 ^9 ^P o22 sjqY3^r *3A T2 ,5 +0 -9 -2 O07 L6 D5 R6 o57 *61 O21 *13 u d 'C $1 o28 E i6t i7h -5 O63 -2 -6 -2 O72 siS $=$( l z2 i0h i1a i2r O52 *67 i15 i53 p4 ^r rst}^H f O18 ^v *54 $z $a $r $i $f oB+shZiAF r c K i2a i3t $s $7 s7p,3T5 i41 i59 i67 i71 O25 sM} p3 s0@ l suy ^2sz@s>< O32 o4w z2 +2 o5* Z1 *20 ^1 z2 +0 i8s OA1 s>k s Ksof z1rsO2 o6Cs`U T7 O92 *6B O84 O15 c *45 $6 O09 f +F -E +F sQgo1E D3 C $1 ^s $d i63 i73 O08 k i1u i2c i3k t*31sgl O72 o3! s#_*7A .3 *51 i7a i51 r O24 skg ^s [ O02 z2 O89 su[ i8m $. T1 -3 o4. { '8 *14 O8B siP i5e OAB p3 O51 } +B o25 t T7 TA T8 T9 spWls&S +3 +6 -8 D9 $p O67 *A0 o8> i38 i77 i62sJY i5O O02 sV-oAz o51 C o4M s^u oB= O74 O72 *52 +9 -6 +9 ss$ u +7 *56 [ i0@*82*3A $2 ^r $os,xs;L $x i6d i5f i7d *84p2 } ^8 o2k OB6 iAU ^d o4h i3; o6=*37 i21i39i47i53 O83 *57 *35 ^g *64r O52 r i6z o5s i58 R7 L7 smksln s(HY3 s81 O79 o09 -1 T0 T6 T9 +6 +8 +9 Y1 *85 Z2 O12 O71 ] iA4 +B *86 o7j Y4 O78 +8 sjs O7A s2h o7V K ^D O32 ,1 soWE o8& Y5 O1A f O49 *62 O72 sgJ c [ K i5m i6o i41 i59 i67 i77 i5d i70 s5TsRk O13 ^A O52 $q OA3 oB, i6k i7i Y3 t O23 o6e o2n $C *31 ^N } y2 c OB8 i9V i8T l ] $l r ^l Y1 s1H D1 T3 O02 ^@ $=$[ l $d $a $y O52 i59 o53 t oAk*70 +0 -6 -4 $i +3 $;$' ,5 O64 Y2 D2 } o0?*69 i35 i53 i6e i7m i8o i7Q l sos$c *1BdE spc $4 $u $s $ $y *52 iA_ O46 K O3A [ t +4 ^a O27 sEp i7e i5f { oB! O63 $K c $2 $0 $0 $1 $! i31i49i57i65 $o O87 i8r i9e O75 s3] C L8o7W i32 i58 i1O C *03 i21i39i49i51 i13 i7a O63 sAF l 'B +5 O04 i6_ $m Z2 {-8Y1 o5U } D5 u ^T O34 TBi5C som i0q i1w i3a i53 $UD6s*q E[s{. $1 $9 $4 $1 O71 sXO sV* q O56 ^D ^4 .6 z4 O54 $l k szZ*56 *13 K O46 f i3q O05 O13 ^@ o5a *68 o0? OBA *65 i7w oBe*45 l RA O81 c $2 $? i1r i2c *67 K *42 $s .A+4 'C $0 ^C O24 O26 Y3 r O84 K -A *A9 '8uD0 L6 k +0 o2k $1 R0 O43 s@| r i5_ *41 ] *06 ^7 } '6 ^2 s1!C ,4 i4k p1 O59 O75 o4d *53 R1 o01 o0fsEa i74 i3a i72i80i92iA1 *62*54si& o1v [ r O32 iBP*62 T0i3l O82 -0 O0B '9 *42 ^_ ^2 s6V $0 $2 $1 $3 iB1 iC2 iD3 iE4 i1u i2n q c *30sK= i5d i52 i5_ K *76 $o o6f *42 ].6 i72 i5c sFBD2$+ i54 D1 sQZ i69 O32 i61 i73 i54 i34 i79 i7b O54 *6B KswP*56 c slt *51 *54 +5 $D i5J *73 O19 p5 O8A i9=$fy5 ]L3T7 *02q sI{smG,A *93sX?saU o7{ R3,6u -BsXA cZ5oAT o8^ *52Y4 i2b*47t sp$ y2*15 c ,1 O97 *BAY4{ *85smD Y1z3 s3koBa O96 u L6 Y4 ^0 O21 stO so!o8] *89i4Y +Ai4N .9*02 $,o5Q *38i5@ $lsF` y3,4 snJ D6sP. i3F i3) o9#i7F ci2cp1 O97 z4 i6Cq i0; O85 o6r o9V o4_ OA3 *B8Y3 +4$Ysdv *67C *53ss#sIw sf9l 'Ar s9(z2 o4)*5A o2's/\ *B0 *62 O42 c d 'C T0 T4 TA 'C $3 'C $6 $7 $f u d 'C $8 $6 $d T3 T9 T4 c ^a ^9 i3" C '8 $0 d '6 $0 c d '8 $7 Y1 soD C d $1 [ r O45 sr9i1z sbM+0 O34 Z5 .8-7 i6c*ABR9 *81+7 ^b O57 *02 s-l O98 O91 i91 iA1 iB2 *5AK sx,,8 +5*2B i90 iA1 O7A *65 o81*A3 si; OB3 i8d i92 s2)-3i9' *B8sbp -2s'/ .6*9B*0B s4.*74 s|\ O95 *07 *B7*A8+A i87 i92 *B2^3 sD;{ o51 O13 i3{i7V iA, *B5 o4Q*0A y5y1u Z2i7\ i0Y*B9.4 -3i1/ o7O$&{ -1Z2i7M Z4 O56 i5L T6 O17 ^- O54 *65 sxt *26 u *61 *12 i9K i9! OA6 o8Y *02 ^d f O73 Y5 o4y o4! ^S O13 i8* [ o1f u Z2 -9 sc! p5 r .3 O35 Y1 .1 y2 z1 *16 O61 o86 T1 O64 p5 $g *20 O74 Z1 i1| $a k K O81 i9* i8f ] i5J +3 l $c +5 Y3 [ sd3 ^A O43 y5 p4 iAm -2 D6 s5j $a ^2 $k *73 r *26 o7s K p5 $l sok sqa z5 r Z2 O74 $x O14 r o1g D7 r ^r ] y2 Z1 O45 z5 O57 O76 [ z1 O84 -2 L2 D1 [ +3 i5b } K *15 ^F o64 $B O13 o0= i7e L6 i79 R8 L7 i3f R0 L0 i78 R0 L0 +1 T8 R4 Z3 *16 ] O06 -1 K ,5 *29 *83 O32 D9 *79 O94 O82 si3 K r $r ^s i0s ^E i44 O12 i2U u ] o5. -6 ^X ^1 $x 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 ^X o1i [ o1_ O51 o4h *51 sl1 u *83 +3 *36 o4z O53 $R f +6 O7A ^p ^f +0 O25 D3 o7l -3 -7 ^m D5 z1 T0 se4 O43 i76 } *30 OA1 +7 '7 ^@ s0_ oB5 *AB *02 o5_ c i4_ $1 smn $! O06 sln O43 $k *54 o52 Z1 sio O23 O24 $7 *07 +0 d [ '8 *32 -7 $! i0T O52 c $7 T3 o4t ^b r *02 O52 +4 $7 [ i7x *52 ^p $m O05 *54 $n D6 o2i *31 snm sEU ^e '8 i18 r d o6c i6d l O81 i4B t p1 O35 D8 Z1 ^P t o86 O92 *98 Z1 sou +A Z2 i4j T4 t i5 -6 $r L8 Z1 i5- Z3 O75 T0 OA1 $y *54 O64 k o10 *01 soi o5t shr sug o1n { t R4 +4 Z1 O12 D5 suw +9 o83 { o5c *75 D1 l i7v OA3 -A T4 O02 *12 i1g -5 sjy +2 *62 ^t $i *27 O52 *65 i4h i0w O81 [ ^C *31 $f OB1 ^h +5 ^d *56 i1h ^d '9 o4j -2 o04 o7u $p z2 O25 s2@ K r *46 o1s z1 T0 '9 -6 o3l ^i *52 *02 *52 +6 *07 D2 z3 -1 $a i5r Z2 o4- *64 D0 +1 o1t i4b -4 z1 o3a t D4 *15 k ] o0p $t *13 O64 -6 i5z D7 *86 D3 +3 *23 ^V '8 c ^! $8 *78 { ^1 s1c D3 +6 O81 O12 *20 syt *56 ^l ^P z1 Z1 o5- +7 z3 -2 -1 *70 O64 *57 $9 i0h *15 c oA4 -9 $c { ^0 swh o08 z2 *14 o5z [ $L r K *02 } o3l sld [ Z1 o5- o0- } r *02 K sck -5 R4 R4 *04 +6 $x { O04 $v i1 l -5 T2 R5 s1z $L o1n } i1- i3- i5- i7- K ^H o2s u oB9 Z1 *46 ] ^b i2/ o2u +1 $p +1 $t O52 $7 +4 *24 ^d O43 +7 src O23 ^( sbd *50 *25 *40 O91 +6 -5 $2 sa@ sl1 *68 o6y [ sez sjl $/ Z2 -8 o7f D8 $f *10 -8 Z2 +6 o4r ^o *34 r O32 ^1 *29 O04 o0m +4 Z1 O03 { K o5- O83 o5r +1 c o4w i0z O04 -8 si1 T2 $p D3 $p D2 ^a o3z i0k ^g -1 ^3 ^k O46 o0M z1 ^a i3. k o5g -0 -2 ^B d k O37 'A o9q O42 ^4 sbm D7 t o7x *30 O26 o47 [ suo l -4 O82 *84 o84 o2b O53 'B r i3t *60 sui *23 o2r ^v +1 D4 -6 o65 D1 } R0 D3 $b D3 $4 sax O03 Z3 ^c '9 ^y z1 i4g ] *43 i2f $e ^H c o9! +B O02 o6 c Z1 i2a *51 ^o *68 O52 { o61 } l ^e ^N ^i Z1 i1- i3- i5- c o15 o4g ] *87 o81 $7 z5 O08 *54 D6 $n z1 T5 -0 i52 *74 -3 D5 $w t i3e D3 'B o6n +3 i8o l '8 O51 o0w $r i63 Z1 -2 $7 +3 *62 s69 s71 o6i +8 o0z -9 k { *48 '6 o5l s5! i67 [ c i3e $D c o5h c *02 o7Y l *71 O35 D0 skv [ { D1 O23 p1 *68 *20 o4- +6 O12 $m t i62 *74 O56 o6f O24 Z2 o7s i8_ Z1 t o1h i44 T5 $b *69 o4Y D2 l snL r o7O i8R c y2 +5 *85 o8. $v Z1 p4 c $8 $7 $7 $1 } C $. O57 i7> ,1 T8 o3e $- $m $e $t $a $l $g $a $m $a c $5 $5 $! $! $9 $9 $@ $@ $9 $4 $@ $@ c $0 $0 $* $* $1 $1 $$ $$ c $7 $7 $@ $@ c $1 $2 $* $* $0 $1 $* $* c $4 $4 $! $! c $8 $3 $! O29 ^6 ^Q s89 Z2 o5L $6 $1 $9 $0 s5Z q O1A Y1 Z3 O61 D9 $W O31 *10 i7k O39 Y1 O73 Y2 Y2 O26 *79 O42 Z3 D9 O61 o3M ,6 y2 +0 i7k Y1 O39 q Y1 O1A s2J i21 O42 ^P s05 ^A u sRC sTJ '8 s17 sFB $1 O09 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 +6 -3 +6 +8 -5 +0 -7 -5 +0 +5 +6 -E -F -F +5 +8 +6 +2 -5 -0 +4 -9 -2 +8 -C +5 +C +B +F -2 -B +E -B +4 +8 +4 -1 -C ^x ^4 c ^D ^D $0 $x c $e $6 $7 $B $c $x sjh OA3 +7 o0d y3 D8 o2r K i8t -2 *15 O97 p1 E $) O07 Y2 '7 *25 *B9 +9 *6B O34 $q O71 OB4 Z3 O76 O97 } u o1A y4 Y3 O76 K *A7 .5 O23 O26 O24 D7 ,5 O73 O35 ,3 O03 i3b O52 sAS O23 stf scC i1m O19 O25 *24 iA4 q ^g z2 -9 ^O sq9 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 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 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 i0p i1l 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 i3c i4h i5i i80 i95 i5c i6a i7t i0j i1e i2s i5m i6i i5m i6a ^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 i1o i2m i1o i2s $a $n $e $7 $$ i65 i73 i7o i8r i2t i3h i4e i6n i7i i1i i2n i3d i87 i98 O41 $m $a $n i7B l ] $c i6d i7r ^0 ^0 ^7 r y5 OA9 sjN*57 ^BsN@ z2 O05 O49 $m sprs!x O97 ^K *8AT1.7 }sx&.0 Y1iBKC sqJ] $DsMt *5B O49 *54 R7iBw OB4 $z soa*58 i6@'9 OAB o0K i9s i8R,6 i0s*A9 O05 i54 y4 *46*A9 shZ D2sk7 o0Cs*? i7_sh}sUR O76 D1 slr*86 *A4Y3 O62 O19 'B *6BuD8 o4osxd ,3.9 D0]sVm sh9sGro7s EZ4s(3 ,7Z3 *A1o0W oB^ O02 O61 ,5 Z3s|o iAHE,3 T5o8l OA5 $k s_T O72 O31 Y1 *96 O3B '7 u *5BusKs .7sgR *5B,8sLu o4ysOD *63-3 r OA6 ^nD1-A o10 O39 s^) z2 O73 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 O2A y4 O39 ^$sZ/ sSN O1A Eo1Z s;g^` i35 i79 *30 OB7 ]Z5 ^B O93 *25 i3d i3c *24 O5B i18 i14 i1a i7b i31 i15 s7, ss{{r sRZ sY%iA= OB8 O27 CZ2oBa i1e i77 *12 O52 *18 }$9 suwo5W s3< O65 D6 sb0Y3*A5 OB6 oBh s4f i59 i34 i7a i14 oBM O18 K svw i19 i55 i21i39i47i58 i17 i12 O58 r O53 sE; O5A ^z i76 i36 i54 i1e R1iAC+A i13 i19 k O74 O73 i13 i17 i7to8< *92 O8B sbE O04 R0 sa9 o5y*96L6 }*6Bsyb sO+s3& s3W Y3 O89 q $=$! i34 i3b i3b i33 i5a i33 i1c i14 i31i49i57i63 *A8 O71 O24 R3 se0 $+$! $@$> $*$? T1*93o30 O64 *62 i77 ] i4y i6s $1 $? $1 i4y $1 i6s $6 $6 $! $* k i55 O91 E ^B $o o8M O12 ^F z1 i0N *43 -7 D2 z1 K o9C o7h E z2 T4 *43 *30 O42 O21 saM o1A C $1 $4 $2 $8 ^J O15 f O45 $0 $+ $0 $* -0 s17 $1 $0 $9 $4 O52 o7b $1 $3 $2 $4 Y2 ^J .2 o47 s8A L7 ,5 o30 *48 +8 OA1 $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 O23 *19 O81 *70 O23 E o6% O54 Z2 l $1 $4 $3 l '5 $3 l ^1 ^9 ^9 ^1 $6 E ^e ^v ^o ^l O42 .4 LB s"C O12 *30 *68 s^j r O53 i65 *06 +4 -2 +6 $6 -7 i0y i1e k $i *54 R7 +3 s*ED1 d O72 i3b i74 z2 ^a sy3 E +0 +8 -2 $2$0$3$1 $a ,1 sjfs,O ^l i3l i89 i93 i8l i9e +5 +9 -0 $r z1 i89 i90 -0 z1 O02 z1 i37 i71 +8 -4 -7 *19 O16 $G O02 '5 $. Z1 i7t ]*A2^" O08 ,9 +2 D4 *43 i7t i8e +7s@.^D i78 i18 i1a i2i i3l O45 y5 o68 D8 i4i i5o i6n +0 -8 +2 iAHsj( i7r i8o c i3. O08 T9 *76 *47 *79 OA1 spf t i7S *75 '8 -3*60s*o O03 p3 O51 $v o5c -0 O31 $_ O51 *54 E O51 r ] O72 Y2 O42 *52 s3T o7t O46 Z2 $8 o0d O42 +0 *08 +4 -A +4 i4v O82 o1# +6 +9 +7 i0a i1n i2g i33 i53 -3 -9 -4 o9J OBA i6L T5 Z1 'A O9A i6N *A9 .8 o8w [ -0 '7 Z5 O28 s'X +8 -0 -2 i4i i5n i6h i50 i31 ^a D9 c $0 $) K ^l $7 -0 oBKcT9 s9c OB1 o1p } i3a i1d o0p $x O64 $0 O51 $S $9 -4 sPV i22 i34 *53 sbm se3 sl1 u o9d sa8 +6 o7. i88 i99 -2 -5 -4 ^ ^5 i8M $v O67 i44 i53 $q[ DB { *6Ai6b sm7 slm s9?.2 t o8L O09 ^! s!o +B -1 +4 '9 s ) O41 c $# $7 +0 -2 -8 O23 $d -2 O02 L1 O04 sCnsoE q O7A ^w sil i26 i30 i5F i1e i2s *54 q O06 O46 r ^e ^x i1u i2l i3i c ^K i2e i3r sr) i1b c i6QDB i81 i94 i7y c i4" i81 i91 O32 $s +2 i18 i39 O1B o3M i0r i1o i2s i5s i6h i5s i6e i0d i1a i2v K o7G +6 $O y5 y1 O39 i74 i7c l ^r ^i ^a O03 y3 i8s o1o i44 i55 i66 o1n .5 oB/*38+B i7n i8a z2 *03 *67 OA2 R1 c $2 $0 $! sA8 ^@ ] +3 *34 r c ^0 $1 L9i9Zi31 i13 O53 T1 +8 i6a i7y o0rsVh sud c i2l +7 ^w -2 O53 i6t i7e o1k c -0 O16 { +8 O12 O23 t o66 -5 -8 -6 i7u i81 { O06 f i5i i6c D5 $_ i1e i2n i3n +8 -7 -2 o4s *41 O62 *4A p5 +5 *78 +4 ^Z *6A,6 o2@ T0 o3@ D4 i1u i2t O23 -2 $d .7 *76 t *93 i0t i1r i2a O31 O21 *45 'A +2 s/F,5 s1$p3 z1 $f o9z T0 O72 *9B *15 O89 OB2 u O4A *83 *24*40*0B O71 K i9V { *32 *32 O96 *25 O32 T7 i3i i4a *75 o1r i6a i7g *40 O62 ^k o6u c sl1 sa@ K o3d s9K i2V o5b l i3@ O37 o1z ^T $ Z2 O32 o3@ i0f i1r i2a s9_ *68T4 o7r t $! O32 i7u i8l i0k $e i3u O63 Z1 o7p L0 o1. ^hy5 T0 O12 spy *92 '9 Z3 $S O75 s|Wt*13 +6 o92 *54 ,9 {*80sp- OA2 O05 i73 i3c D0 s30 o1) o6R O1A i0j i1e i2n Z1 o5. o6j E *96*A3E ^x ^3 y5 Z3 O47 o2g o1d i6L OA5 c i5g i5a i6l i7l i30.A T4 ] y3 ^B *25 D1 ^U i4r i5o r i7l .9 O35 iA? i6e i7r i8s $A z1 i3a i4t i5a Y1sFV i73 i3f R7s/AE $5*26 sBw O02 K { o1s i3n Esx?Z4 +1 'B o1. O27 O87 [ p1 O0A *46^D sMjsQH $Y l +3 i4a i5n i6t i4- o0e *13 o9A sSe O5A +8 i7- Y5 O71 O53 Z3 o12 $! i1m i2a i3r Z1 O51 o2r Z2 T0 -A se6 R3 Z1 o6t }D4 O64 i4o i2. o0d c*25E i82i90iA3iB0 *31 .3 sLTsHD s56LBY5 o0S O16 y2 r -7 Z1 sEH $rk^f c $e $d sKu { O42 i39 i18 $3 i6@ o4y l +0 s+ysqf*75 *56 r -9iA* O45 i0L Y2 *20 +0 c $* $2 o95 p5 i5y i6o i7u l ] $O +7 O24 *41 *40 l ] $N $6 *57 *8Bo3_K $h -3 c ^3 ^7 ^9 ^1 i58 i5e i3oLA*18 i13 i1e *A0s4q sBjiB& *54 o0H $@$) O27 Z5 sVJ o2p O35 sh# O0B sgH *16 o5w $$ l Z1 t R5 i39 i75 i30 i51 i80 i91 iA2 z1 $i $s *57 i16 i17 c ^$ t O04 O68 O15 Y4 t o8D *6AsV0i6$ O21 scs $$ ^1 s'Xp4'9 sOE { i66 '7 l ] $e $d l ^y ^b c $* sAJ OB8 s2Ds?!o6$ sQF y5 q OA2 s6Y O34 T0 i2p sTJ^Ts#> E ,3 *A9z1 O54 $9 i36 i1a C '8 $3 } ^q o0d } $A $C O57 o5j .2 d 'D $1 O43 ^C $-L7 -5 -8 -6 -7 O67 } *59^OiBd $* O51 ET4r o7i i3X O15 *16+5 i38 i54 '6 $? sfl sun D4 $5 $f ls@S T8 O15 o3~ $d o0p +2 -1 +6 c $7 $5 $3 $5 -5E o6k r sck O57 i59 i36 q O35 .6 *16 iAl -2 $4 c 'D $7 +5o0ysBH Y2rT4 i1W o0/ d $5 -6,4D5 -3 $b i00z1*08 o0| $! $@ $# $$ $% ^! O69 ^y ^l ^u ^j OA3 O74 o6h *34 *8A O62 O91 sQN +2 c ^a ^d i67 $0 R5 O05 *35 *31 O06 Z1 ^K z1 $x *45 *17 O51 O9A $E $9 $d [ i7p R7 O21 ,9 o1" RA i6A O36 s17 *57 i12 i50 oApT4 c ^N s&@ i6m i7a i8y sTm .0 i5b i3c *43 t -5 $0 $c D6 sby R4*93u $0 $d s O68 s]e R3 [ $b O73 O38 i75 i7d Ey4s^y T5 y3 *97^cK } *1A z5 O71 c C '7 $4 C '7 $0 $. $b $g o2n Z1 } sVR c *07 -0 $,$- sumY5L5 T5 Z2 O14 i0T O69 .6 O53 O62 OA4 L9 $* O57 i7s i8o i9n *48 O73 *97 o95 oARsx) r sL1 '6 *19sv? O35 ] Y5 c $1 $6 $! $! i58 ,6 i1c i3c o2n } i14 i1a +8 *70 O54 D3 t OB2 k O45 i1_ *93-4sY| i3c i1f -0 ^5 s/P O6A O57 T3 sbu i5a i17 *79 i9n -7$us/x i35 i58 s!-*61 *76 -9 *40 i7j i5s i6o i7n sjR i3f i7d O9A iAe i1r i2m z2 { p4 $J +2 +5 -3 +7 *62s^+ u ^3 ^2 ^1 sjv skP i9r -A i5s i6t $k $h $a $n s2M O53 sln s3y $e o0d *19su4 c OB2 $g $i $r $l l ^r ^o ^o ^d *57 $0 *98 O52 $e $2 o8b Z1 $9 $&$@ i36 i73 { c { { i1d i13 T7 O5B +9 -D *67 O34 o7( sDr ^/ ^1 +E +F +E T0 T6 T2 T4 i2k i3a i4s swn O87 z5 y3 O78 i79 R9 L9 ]L6$_ $YK s tz2 i7a i39 $bo9P*7A i2R K i3f i5f $z $i $l $l $a s.AR8 sX'*32*40 C ^7 O16 o6t c $0 $4 $6 ^t ^a ^o ^b i1I O12 $0 K o4C O81 $u Z1 i40 i56 i51 i33 $9 $0 $* $* O24 T9 o0\ O45 +A O42 s?_*AB$p i3TC i7a i8y ^_ ^5 i59 O02 z1 *15 -4 [ ^I OB1 O32 ^- ^- i2i O9A $d i0t O04 o51 +6 +6 +9 $_ l *18sF4 i3b i3d { $_ +8 +9 -5 c $7 $x t$9o0F $Go9`RA -5 *25 l o6oTA sPloAF Z4 O53 sao s8B c $_ $x i7P ^t O83 o6p r i74 i5c i87 i99 Y2 ^S +5^` Z1 o4h i1o i2s i3t $a *73 O03 c o1G l ^t ^f ^o ^s i7f i5e D0 p1 O15 i3m D2 o50 s@Lq*39 sIN sgz ^" O61 $7 s4_ s.B *30 $) O8B o1F R0 O46 [ r o0L i78 R9 L9 ]'6Y4 T3 o76 y5 O39 ^! O71 Z1 i71 +5 -8 -4 o2- o1w ] O86 i5i s1d *76^wD7 -0 -3 -4 o0{ i3k i4i sx* i2U D3 *49*71L8 i52 o79 r $b $o $o $k O53 -4 iAx*BA $1 ^c *31 ] -0 $. $p $l s8DsNO sB$o9% k sej *02 *05 [ sps saw ^3 *02 *20 $t } o4d $i $v $e i13 i1a i4o O21 q O69 o6o Z1 sDH i2n i3d s*R O92 O46 *35 *76+8s6b o7Fc o6r ^C -A *8B O21 ^l ^i ^o k ^M K i0k i1i i2t *15 i6T i13 i50 $a $l .4oB` D3 sbz O23 o2c *65 i66 i24 T3 i37 z2 O03 ^s ^i ^m i2h i3a D1 -3 $4 o3E Z2 O95 $s T4 i5b i74 st* ^2 ^B i9z E '5 i2. $Ys4# c ^8 ^7 ^9 ^1 i4e i5m i49 T5 o2@ [ s2_ $q O31 .1Z5 $+$# O52 i5@ O31 $6 sel sto s/H.B st_ $C D7 } o3y D4 O5B *32 O47 o8M O52 s$OE { T1 *57 $o *53 sbn ss$ se3 O29 $x .8 Y2r *24sfO ] ^q z1 ^V -7 '7 i1o q O12 O7B s%B i22i30i40i56 skW i22i30i40i57 i32 i3f i6t i7a i8r O72 *9A i1v -4 s./ '8 z1 i5n i6d s4+$j ${ s?M O86 O32 } i7A *30 '8 [ *31 c u O38 i2m i3o i4n $2 $9 $! +9^jD8 i47 i58 $E D8 *1B*31 sjy O45 $A i50 i3e i74 i3f i0e i1r i2i $I O71 $1 R5 K T3 OB1 t c $0 $- i1b i1f +3 -7 +8 O04 { $2 *14 c $6 $2 $2 $3 i22 i31 c ^1 $? ^b *64 *54 -8 c ^( i22 i33 sgM -7 O94 i11 i7a .3 *24 R7 O43 O75 ^D *62 c O5A D2Co4N O53 Z1 k i17 *6A '9 [ o6k -2 '6 i5r sPW i71 i10 c p5 O3B i16 i37 i0c -6 $b $i $j $u l ^g ^n ^o ^l p2 *36 O76 ^2 ^G ^ ^3 i8 { *A1{sWY ^@ O15 LB o4? O54 q*21+9 -0 -9 -4 D6 $R $_ $i ,9 +0 *04$Q ^f O72 Y2 .7sdK $a $l $l $y } $z o34*36o00 i3e i4m $~$! i39 T4 D1 -7 i2# +9 Z2 OA2 i3f i70 *46 l i71 i1b -6 -6 -9 snh *64 O54 -4 *89D3c $4 $8 $0 $0 Z1 i1l l ^m ^r ^a ^f i0m i1o i2o Y2,0'8 +7 OA2 *53 $L ^2 ^C i7`ts?7 o5D E k i4z ^; O57 se&D2*45 *02 $d o97s,M*0A LAt-3 *61 -4 i8p i9e iAr $. Z3 O81 *43 o2% Z1 $g i5i i6n i7a sh. i2. O94 p1o0isR6 s1Y ko8^^Z o9s $e i1w i2i i2e i3p ] -4 [ t } i7a { ]z3*93 i2e i3s Z2 *68 .9 s96 O72 i7* Y1 *02 o20 i5t i6a $1 -4 ^x Z1 to3E L3 O07 Z2 +3 s]5i37 $9R6*3B d O14 o1r O45 O45 ^m sHr c ^9 $4 i6t i7o i8n o3i *15 R1Z2sbg i74 i14 i5f i7f O82 l $= $a ^g ^j iB#iA4 +0 Z2 i18 i33 i1d i1f i0c i1h i2u $A *26 i74 i7d i90 iA9 $8 i64 $" l *65RBk ky5sh$ i1I $0 O12 O82 r sOs O14 ^P i63 i72 i4o i5m +D -9 $9 $7 $@ $@ o4- -6 T2k^p f O42 .4 K i50 R7 L7 sft O43 *42 *15 *43 *70o9x,7 ^S ^J i5c i75 i5c i77 i1a i1f i7n i81 *98 $e O52 { T8 -0 spm o9H ] sje i74 i3c C O04 l $j $o $h $n +8sKlq DB O13 $4o9u y4s_" $1 *03 k K ^M DA { ^w ^a ^s Z1*9A i11 i3e se! +6 *32 i87 *A7 spw $s s2F E $f ^R *45 s[I.0 $0 ^@ i51 i69 i76 i84 sdq l ^m ^o ^c O27 o3S s&0 *43 ^y *23 D4 *25 $3 r o9% i1h i2a i3r i07 O83 *53 { O07 L3 o1c D6 *28s7z i72 i5f i1a i2n i3s s1& O43 { $a k Z3 $+ [ i6X sIQ OB6 c $2 ^4 sir O64 i5o o5y u siv o5y k $b O13 O71 D4 ^N *32 D6 *43 }]sbB i77 i7d o0D z1 ^t O45 o7m $1 $i $t $y *94 O06 i0k i1u Y2 -2 s_! L6 $h o4[ *97z5 *31 $r T9 T4 i2t i3e oA1 D5 O63 *34 *36c *32 OB1 iBp z4.7 O3B $n D9D9 o6i O12 s[s$/ *06 *31 z5 z4 cy4 +0 i6v o6p +9 c ^2 $7 L7 O52 c $1 $6 $4 $5 o9& oB$*89 O34 Z1 O32 o5w +5 +6 -0 i0c i1a i2s O04 E $u O43 c $+ $9 i3f i5b *14 *65 O89 l $h $o $o $d sa* O92 *86 O34 z1 sKQ*70 c $^ $1 *08 O45 t o9l p4 i7. O83 R7 *67 seo sd- O78 O12 t } Z2 +9 sJb $& ^& i1c i7c i3b i5f -0 O24 *65 [ { o0C z1 sg|DAi9m o30 r *30 o8C*A6*25 *84o5w $K { ^P ^M +8 $g t*70iB} Z4*57 i2d i3y OB2 k l o9G $nsQE ,9 O45 o9ti7{ i0g i1r i2e ^$ O19 sJY +0 +4 +1 $0 ^2 O14 $1 i1M O69 Y5 smi *43 o13 OB2 $h i1p i2o i5 t OB9 +A $5 $5 $3 $1 i52 i60 i72 i86 O68 s9I [ $a *53 r f O3A oAD O58 ] i6N *84sd"*47 ^f 'A +0 +7 -2 $ai9$+8 ^n ^o ^n u i6_ i75 i35 +8 -2 -4 sak D6 ^b ^x *58c i62 i77 c $7 $8 $! p1 i4a O5B OA4 r O63 [ K *15 ^, ^1 i4s i5i i7u i8r c o4l $s o13 O2B iA" *50 i7u i8s *63 O64 p3 *B9 ] s"Wi7M D6i0Y i66 i75 D2 ^, $y o1u O7A s5O $5 O26 'A d *13 $M i3p i4a i1u i2i *4B^P{ *1B]t O61 $i .3 t TBsMW i0a i1m i2a i13 i39 +6 +A +6 *3A '8 ^f ^x i2x i3i c sb8 ^Fo8w i21 i38 $z O51 ] O83 l ^n ^u ^s O89 z5 O01 s@us3d koAn-4 ^x O54 -9 Z2 *91 O48 $g +4 $$ O02 i1u i2g T7 p4 i6m i7i i7a i8s i91 ^4 $! O26 Z5 +8 +8 -2 i9j OA3 ] i43 c $3 $5 $! oBio56$# srs saj i1r i2u i3n ssb k i5h -8 c $1 $3 $8 $5 u [ ^N i73 i32 o0S *34 i1d i3f i39 i56 O64 D3 ^`sSBl D4C *21 *72 ^n i0b *76 q $6 O73 ^K O48 ^1LB s>J*A7 o51 o6b *43 $3 l ] $V O39 Z2 i8 R9 i2g i3e i4n $h *54 -3 i33 ^HKl [sl9K o8sp5 } i56 *86 *95 $p *05 *16 *23 OA1 Y4 ,6 O98 o5s Ey3 O91 R3 c $6 $9 $! $! i86 i95 O59 *93 i7s i8e i4 D6 i34 i73 *45 t l [ ^z r ^m r O35 *25o5x +B O64 *19koA@ +C -5 i18 i16 *32 i6_ D2 $o ss6 o25*67 l ^o ^s ^i ss- i3f i5c DB O64 *43 O59 $qDA O27 s-x *B1$i *A7 OA9 sz1 t*7Ai9e $ $n l ] $X i34 i79 -8 Z2 o1Z *01 O54 T5 i78 i3a i58 i34 i3g +7 +2 c i35 i1a T2 oA2 $o*08 i7Js_D O02 c $2 *52 o9t O8B u $2 $0 $0 $8 O47 $6 i5e i52 *48 *36 O81 z5 t $R D4 i2c i3i $k $r $e $e r ^I saz D9 o89 s1h i52 i60 i71 i88 T3o0f Y3 O38 D3 $n -1 $3 +3 +9 -6 C,6 c $* $3 O12 z2 T3 i1L u [ D8 ^H Z2 O13 i46 i51 O03 O4B -By5 i61 i74 i83 i38 i73 $5 $7 $0 $5 s%$i2. o19 D4 l $1 $9 $9 $7 sfa $P -3 +BY2^J O65 o0v i6h i7i *08,1 L0 Z1 i1e i50 i3a i4l i5l l $0 $0 $3 i52 i32 i83 i96 i21i39i48i51 i09 +2 i1e i2s i3t c $1 $7 $* $* l sdk s#8 O21 O02 O13 ^r ^e ^v ^o i1i i2s i3h O91 ^f i5K O26 ] -0 o7z $p $t i5i +7 $di1uR6 $)$% c $1 $5 $! $! c $= $2 *13 su[ sPN u $1 $9 $7 $9 C*70 E p4 D6 *60Y2 i6t i7a k *42 i8Q z5 o6J O27 o6p o5l K *53 O41 -7 O67 sx;^d ^v ^u c $0 $6 $! s Esu*s^@ O43 O5B +8 i2a i3b *91Z3 ]*A9 $)$/ i39 i76 $0 $9 $$ $$ o9UD1 sHh+4 c ^1 ^7 ^9 ^1 ^t '7 *98 +1 $V r p1 t O62 i4t i5a i6r D5 s13 l [ ^U T7s;c iAN O52 l $ $g *72 '6 l ^w ^o ^n ^s z2 *15 *48 +8 O2B *65 +8 { O34 i1f i3e +3 { K $. $c $n i2a i3c ^s 'A { R5 i2n i3u c $o $n i57 T6 L1*18 s[K*A9o3O sov *82 O06 +4 c ^' t p4 y4 O7A ^9 iAz D1 D6 $8 $8 $@ $@ *78 R6 p4 Ky2 svD u *54 ^9 { i3n i4i *16 O41 *35 *92R3s'9 *B7LB*86 *95 O82 l $m $e $n [iA/ o4b O57 *57 ^a ^r ^t ^l ^u i7o i8m i8f O05 O21 o3y,A } ^Q y5 O0B o6% [ Z1 *68 '6 $. +2 ^8 u $7 $8 $9 i7#iBf o87 O31 D3 ^6 i1f i3a $9 $1 $! $! c $A D3 ^i *42 K $h .AY3 OB6 .4 i1b i14 O31 T2 i0l i1o i2v i1b i1d CsTyoAv i1a R7 L7 *68 O43 ^j c i6@ $8 *75 s7! *34sB! ^G $v i1a i2g *82 O81 C^S i5e i38 ,8 o7h i3s i4o i5n O61 TB t spl k i33 T4 i38 i58 i42 i58 l ^n ^o ^o ^m l ^e ^e ^n ^k o2A .8$V,B $m -1 *62 *52 s=O^k u $2 $0 $0 $5 *84 O06 { svL s!uswj i38 i50 sPA i8c i9a o4W sM O56 $_ i25 +2 p2 o3l o0H *B4K] R0s)V Y2us(I D1 D8 i17 i7a O15 p2 s^co3o*0A *40 O27 T0 TC s6L ,8*15i6T c $9 ^8 *A3saU i14 i71 sX- O49 Z2 i37 T4 R4 o57 -0 -D $zs{t u .4 O74 i38 i53 o6m *43 i7t i8o i9r c i25 c $1 ^^ $1 $3 $8 $5 i8t i9e iAr o9wi5_ i52 [ D9scs p3 ] *B9 o9y -3 ^r O16 sma i1o i2v s%]*59C o41 O02 s]bshb] L5 OA4 O9B T0 TA T6 i63 i74 O4A q z4 O56 T2 O87 O19 ^W *32 *1B*83sTV T4 o5i -2 D0 *54 i8e i9r iAs D9 c s15 -2 O53 i1a $2 $4 $* $* [ *53 $a i7c u sy1 ^p $p Z1 o3t c ^a ^7 c $6 $4 $8 $2 c $8 $1 $! *06 o4k iBJ i53 *68 T4 o0H y1Z5 i5b i70 i3d i3f i56 i5e *B1}s'E d sr5 O95 ^X O62 $@$/ K T8 $w o6a s4XD3Y4 c 'E O19 y4 *08 ^p O62 sO0 o1u $y i3d i33 O62 o8s O6B p2 *58 O26 o2g i4k s&2 *95 O82 se\ i3e i56 $2 $1 $* $* i2g i3o i7e L6 L8 i34 i58 i21 i39 i48 i59 O79 $E O18 iBL i21 i39 i48 i58 +0 'B c ^0 ^7 ^9 ^1 i66 i77 i1a i2v i3e ,8Z4 O93 ^U $0 $a O56 $$ i2g i3e s5+*58s|\ $2 $7 $! $! C+2 O5B s6. L0 *47 o7A D7 O23 s9, O62 OB3 y3 [ o0t *3B OA4 ,3 ^1 O18 y1 O04 +5 s9J i67 O45 $^$$ s6< s}I*48D4 o51 $9 $7 i2a *42 *41 $s *25 ^d i0O D3 Y5 O62 s18i5P *47 O06 T6 T9 i4c i5i iA| O48 o1- '8 i67 O82 o5X O19 i70 i3f spv ssy ] ssE E i5a i58 *48-5+B i0s i1h i2i D3 i93 *03 *47 p1 o3a D7 +3 *54 O95 O63 $4 o0E O98 $/ OA5 ,6 -0 o1- '6 sie o6h T3*5BTB *85 O62 $X*A4*A3 o1o O53 Z1 o0C{ o3t *06 *53 smb *59*73 *04$wo85 c $7 $6 $4 ,5 s>K OB9 iA3o9e*4B c T5 i5- i58 i30 i5e i6n i71 Z2 ,4 O14 Z1 O62 ^3 .5 *74 $) i4( k *07 s)zoBLi9b sSDi4) t o7P s9. $&$! s)X$yLB i18 i7a sy9 i4c i5a ^c O82 O54 p1 s]W]o55 $?$+ u d 'C $7 ^pD6 i3i i4t i5a *47 ] o3F { u d 'C $5 siw O31 O36 *36 i6x i22i30i40i55 O42 K $a R5 s1n $y $e $p Ki0V i19 i50 -3 } k +9 shB $9 $9 $? $? ^2 c i7d i74 i1a R6 L6 i1f i12 OA5 O39 T7 i39 i53 E *79 O37 ^a i2l i3a i4n RBsa4o9! Z2 *21 $. *45 $1 $9 $9 $2 $+ i1l i2a $osG& O05 *20 *32 T7 D6 i8x D6 L5 o5t Z1 *A9T6 '9 $. sMB O93 } *9Bo9y Z1 .1 O23 sBk*21 T2 k i22i30i40i53 i3h ^k sp_ D2 O83 *10 O97 z1 *23 i5f i1a i6q+8 *1A^4o06 D1 *21 $U o3s *51 *36 { o2R T0 OB6 O52 $2 $8 $1 $3 i59 i3a c ^x p2 O7A $2 $1 $7 $4 i3r o6h *15 $t ^7 O32 O74 *14 O32 T3 *B9 O31 $M r*B1[ o7#Ko8$ O58 c R2 q*8B'A T2 O63 $7 $f Z2 { +7 *75 O31 O17 y5 ^3sH| $v *43 ^FsO8 O89 o6- t O6A i7s y3 O1B $d *21 O64 *63 $/ l *37$4,9 i4d i5o i6m o6m } O09 y5 i21 i39 i47 i56 +B +C -A p4 o8! l ^D i74 i5d szd } OB8 *32 O21 z1 +5 -5 $T szn K y3 ^P O27 { O0A si3 O63 DA D1 Y5 O46 O45 .2 { O7A o7r s5>*45 oA; O82 sRX s>X}K t o2T K o6U s/l+1z2 i5c i11 [y5 Z3 O43 o9t E l o4+ 'A $? o3z { i4r O91 $k p5 ,A +9 i7r*84s3x s8,*75^A -4 $V T8 o7E s;@*27,7 O62 y1 ^H ^C *2B^l *72 O16 ^E D8 Y2 *04 { i9g$z TAp2 i4a i5r o5+ [ r O6B OB1 o60 t i2d i3o i32 i51 *41 *16 *07 *53 O31 $5 O73 i4, ^f O0A *36 *13 O62 O5A ^$ O34 -4 i2T O24 O1B i54 'A i11 i1e TA .8 *60 -1 +2 -4 +3 o4b -5 -3 *60 *18 O62 *25 $) O91 i1b i3a *76 { *56 ^a Z4 Y1 O32 Z1 +8 o7u D4 [ $y sBSo9$*75 i30 i78 i61 i75 s.m+2 *38$r o0Y *65 sSr O86 R6 r o65 o9H *B0d sNSs'g i7a L6 L8 *65 O25 -3 c $L *47 o40 O02 sdn z5 O35 c $8 $& i1, $3 i8< *19s^RY1 c $1 $~ ^s O43 Z1 *05 -5 ] O64 i57 ,9s' s1G svP i65 -8 }T3 o5 D3 'B *23 scL u i7a i8i O17 O01 ^j $, ^1 O92 ^( O17 Z2 sdT i8e i9n *97$h i1A O41 *84 ^s '8 ] i7T O23 $e $r $y i3e i52 o8d *58 i6e O94 } ^4 +2 +C i6d i7e i8r y4 O5A y5 s.K *20 o7? O35 p2 s.R ^h $m O75 *65 *61 O54 .4 $K +3s9. *B5 O76 C]p5 ^s Z1 O43 -1 skv sCZ s0I ^K *36 i91 iA2 iB3 iC4 iD5 i5a i1b *17 *76 O23 $l ^1 O0A +3 +8 -6 o8/s%Ri5a $a*AB o5g *53 i2V K swz *81C$a q O89 o1t-4 ,A O72 c i7u i3c i1d ^B *57 $- *57 c $0 ^9 s^nlo3x Y3 q O7B $O *25 c $t $y o9fsz4 f O5A T0 sl4 l [ ^p i9F *51 Z3 O23 $3 +2 o9$$= o9B}s1W shS [ s60 *75 Kz2 i35 i59 $_$) O51 o4N *26 *37 ] $F *35 K ^h O62 O91 o3H oAc*37iA} O23 O17 soe $o*2Bsj& i33 i13 i7f i3f sn+ s"esyk*18 D1 R0 O64 $g [i7D *46 o2d +5 c T1 O27 $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 t O41 i5a i52 i60 i72 i87 +5 z1 o3_ c i8e i9r T7^Ksix skay3 +5 +0 ^r sJR$y snb -0 *42 i5n l $6 Z5 i7S,AT1 *95 O71 O02 +8 Y2 DB .1 } i53 i5c +7 -8 -0 +1K i78s,| ,8 $_ O84 R7d*5B *73sCSscu i53 i3e $. $b $e ss& r O1B p2sQN*29 O97 ^1 c s28se(*BA tKs%K TAs`"f O05 i35 O64 *69 d i2o sDq .4 O58 $nsWl O23 O17 '9 ^k i7e i3b i1l i2e E O23 -5 $j *B3s%M$0 } O59 +4 -2 +9 Y1 O68 $3 o58 sZ0snf$% O63 $i p3 i60 D0 D7 t $9 iB" y5 O07 *23 +2 .2i9( *B0$B 'A O23 ^t ^u ^o r o41 i30 i3d Z1 $j K i4a oAE ^' *04 o4k *82 O85 O61 i8k { O83 -4 L4 o69 i0m ^DR8sun o01-4 c $5 $* c ^- $1 z1 $z *01 s81 O87 } O63 o0A +B +E $*T9 *A3*62i9' *14 O12 T4skY ^1K*89 o6R s 2$t*91 .2 -8 ,7 T5 +4 +A +4 R9'A,2 sVD O24 -3 ^o slt s>I*08$? o94i3l Z1 i8v ^NsCU ^E -1 +4 +5 -8 i6r i7e i81 i5y r i1i i2l *71 -8 O83 O51 d T0 O85 -1 $8 i1i i2d i1a i35 *60 *54 O17 ^m i91 iA0 iB1 T8 TA T9 TB i31i49i56i67 *23 i2- } O49 *78 Z2-7*52 sgY s"{ O06 i47 i53 i0k i1i i2n i8; i83 i94 ^1 *36 ^Z O41 O02 ^' T3 D7 *45 -4 $1 s3f*BA ^C '9 *45 T6 i5o i6t O52 } -0 *39 srL*7AK O02 $q $1 *41 O63 o0x o8X i4a i5s i6s *98$W ssx c Z1 *01 O21 $. $h $n z2 E O73 i2l i3l i4a y3 i9@ O7A O82 t s3$.3o4e -7 i6_ c .9o7SoA5 *45s") *12p2 Y3 *A8 sze i4b i5e i4u i5n +1Z1 O13 C O96 D1 Y5 C O42 *05 i2* O34 ^J $L O63 sgV i6u i7s *40 O42 O61 +3 z1 +2 i2k i3e $_$= Z2 -8 *02*8A o0t u *54 *37 L4 +4 O92 *84$K Z2 *53 c +3 -8 -4 t T4 Z1 o4a -3 -B $8 $/ z2 O73 E o6SZ1.A $* -3 spr R7skjK Z4 T5 O23 spj ] Z1 u $m s24 y2 Y2 c i70 ] i88 ^n stk O62 *78 D4 i20 o0n o62 *15 +0 *67 r o4G *41+7 i61 i3o $q O02 i2v i3a [ ] ^H o0t o1h i22 i38 i16 i33 [ 'B ^ ^9 i44 i52 O12 .1 { o7u O04 ^p i2S [ o6l *60 ^ ^8 .9*76i2h sl_ O42 -8 i5e i6r i7s i9o iAn i80 i97 $C p3 ,A*18 s2q OA5 s&u c seu p2 p2 i39 i13 *89 Z1 *51 O23 Z3 +9 O23 T0 stj +D -1 c '5 $1 i6h i7a i8n $D z2 O05 s0\ i4t i5o i6n $a s6W +0 C i72 i11 i43 O73 o7h *56 i1a i2n i3o $3 $1 $! q O96 i60 i71 i60 i72 *31 +3 *51 $3 k i76 +8 ,2 D3 -5 -8 -7 i9$ ^d ^n ^a ^b Z4 O02 $h r ^0 } o72y5*83 z1 $l Y1 o0I $9 ^D srm E i2i i3k oB'o7bi6# i17 i3d o2q i3i ] ] $q +8 $m i8m i9a iAn i7e i12 z1 o2y i8k i9a i5O *52 E z2 T3 *81o2i i50 i60 i79 D3 DB O07 +1 $h slk O93 -7 *02 *06 R5 o64 D1 ^O $1 ^+ *20 O34 O63 Y2 i4r i5u *21 i0G i3d i4o i5g '8 i5m *24 o0O -2 $h i0f i1o -0 'A +2 +5 +8 i5t i6a i71 T3 $7 o8g l D5 ^e o5y scw D1 O72 D8 s0a ] o5y Z1 i5k i6a i8Z iB3 O02 ,2y5 *25 ssv i1u i2b ^z -6 i8M O53 i82 O32 o6s sdy y2 T8 sczo1N O51 T3 Z1sKb^C i3i i4d i5v i6e i8s i9a $0 O57 O5A i1N $4 $* i3i i4m $?*65o4_ i41 i52 i63 i74 i85 O42 i4o snb o0L o8[^D o4| i0k i1a i2m ^0 *20 c i40 T5 i20 i38 '7 } D3 sck O78 Z1 o5u o42 ^2 $a ,5 T6 O83 $. $b ^o sat +0 ,4 L3 ] u ^2 ^1 .5 O7B ^1 ^j i66 $2 O06 q T8 iAu O46 i5s i62 i7e i8r i9s -0 $e -A*A7$Y O31 $m z1 ^R i5d i6i ^n $1 -5 { -5 } -5 c T0 O84 *35 D6 ,5$N '6 ^m q i5s D3 o71 i1n i2a -7 $b s!s*1Bst2 z5 O36 i61 Y1 $u i5- i1a i2r i3t D4 $y [ sBO i1d i79 ^2 ^F i0h i1a i2m D8 ^k +B -3 ^y +7 'Ao4* s,3.A oBP Y1 OA5 ]*A2spc i6E k .2 K +2 +8 -3 $5 ^j i4k i5i *04 +8 D0 $T Z1 ^A *74 C O82 p3 .0 OA3 i0k ^d ^a ^e ^l ] Z1 o5y s|9+2R7 i3a i4s Y2 ,3 i2d i3a i0j i1a i2c O73 i6t i1a i2t i3a $n i5e O1B r i3g i4e y1 *8A O05 $@ D7 $A ^5 i70 i88 ] i1e i2g O53 Z2 i6l i7a i81 O13 o4K l O54 $y sn,*54 O65 $c l ^i ^n ^m ^o iA< O7A ^G *31 O82 -1 ] T6 Z1 Z2 O93 -A $w -4 sgl y1 E OA1 o0.-B,0 O15 +2 scD +7 $2 $0 $1 $2 $! i12s8( Z1 i7r O42 i4= sk@ i7x i81 DAld oA1Y1 i89 i99 i7l i8a i9n oBK o2q ] i3i O23 o36 i6e i7m i6e i7k t ^J i9t iAo i4o i5n i6e o2g ^a i1e i2l OA6 O1A .3 O24 i76 *43 $e i4c i5e s-/ c T5 i5_ $($? oB7 l +5 $4 D4 D2 { R5 D4 o1o L0 i4s i5a $0 O32 *03 ^z O94 o9g k-7^n $A Z1 r $x *78 ] Z2 o5- r D2 i1a i2m i3a i4zDAZ2 ssv +4 +4 -1 i6- o3- R3 o47 -6y4 $r^0 z4 O73 o08s4B *67 i65 *4ArT1 $x $a ^4 O23 O63 o3z u D3 T1 ^u O53 i52 i5f O04 } Z5 $b -1 o6b $m $/ $7 i7w O25 O51 c o38 $O,9 *53 $a o3IoAT T2 TA sl' $w +4 o7f D8 i1r i2o O23 K i4c i5a i6t i4e i5y *21 r O85 *1A O5A s8> $1 ^z i9y iAo iBu O41 $h [ sn' $r -1 $r -A *19i9E -A O35 D0 *01 } $! D9 s^= O04 *25 k+7^J ^0 O12 i7c i3a s5@ o7m +8 *3B Y1 O42 *35 o7A i1o i2o i7i i8n i91 O7B iAH OB2 $; i6, *04 p5 Z1 O74 $9 ^6 K Y3 +5 +8 -0 OA7 OA4 sn4 i4& O47 i7e i51 i58 R4 Z1 sua o1a O63 D2 $t $a*73sb' *24 src *42 O46 O41 [ $h *25 *93 i3t i4u $2 $U OB3 *B8 *31 o7_z5DB *61svI*84 i77 R0 L0 i8a i9r *76 ] sK2 O35 iBr *07r i51 i30 DB,3 i1a i17 D1 D2 ^I D8 $! i2r i3a i4n i17 i16 i5h i6a i5h i6e +0 OA1 i14 i59 DB O15 y1 ui8# i5d i31 O43 $4 i2c i3h i4e i31 i77 i74 i3b O68 s/a s`z*73 *35 ^h $-$( '6 i4g ^_ ^7 i5a i39 s[zo8U *14*57t s]CY5{ K i0x z1 ^L z1 i33 i5e i77 i3d i21i39i46i56 i2f i3a i3e i4s i5t i3s i4s i3e i34 ,8 D3 s6$ o8o O12 '7 -4 i65 i79 ^y $y i2g i3a *81.A *25 ^a i2g i3h i3z *62 o4N O13 $vsI6 ^e ,6 $R O23 to4S i34 i59 i5c i58 O92 T3 i55 r ]s}/*61 i33 i1a i37 i3d $=$/ R7Y1 ^c $2 *34 sas O6A i0p i1o i2r $R p3 sod i3s i4h z1 o3_ ^6D9 s$1shW i3s i4a c O01 Z3 $# +0 i68 i72 Z4s zZ5 OB9 .A i6w i7e i8r i02 ^l i5m -0 i2a i3s sUK O06 sw. *8A-0 i0h i1e i2l OB3 sgU *46 *60 i2d O45 *43 sf1 O9A KsYNo9C s._ s07^5sS' ^ho0.*94 ^T O1B sCJ .6f i0b i1u ^B i1R z1 O83 $N k o6}s1- i4h i5a *14o1C*68 *17Eo9R ^-s1#'5 kiA8q { *24 spA i84 ^1 O83 s\Ii1H smI $]T8sL; r+A O42 i7P o7o i9= O86 } $o sqb s5>i0n +1 ^Y i53 i31 i8F{sF4 o6h '8 $x *54 D4 s.0 i1f i5e o1) i7e i8l i91 O62 i8? $2 *78 sHK $. *40 O14 [ i1e l Z2,8sMs s$%o3's a *65 o2t *24 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 O83 i14 RB i3a R1 L1 l ^t ^a ^o ^b T1 +6 d i3s s@=C .0*9A r Z3 K *62 $+$. k ssy soBssU smc c $6 $7 $! -As Ss.1 O03 f ] i5c i54 ^g *65 sqds#.sI4 Z5sJ)p4 c TA O73 i38 i12 i54 i41 i59 i66 i72 s8b i5~ i3o i4r i36 i58 '7 *30 i1e R7 L7 .2 ,6 T0 T9 T2 R4 *45 R4 ,4 O72 O81 +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 c i89 o52 l q OA8 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 su* OA2 $6 O41 O4A i8v T8 O31 O18 o2Y O3A *4A^d siN l i1; O82 $I K s5(T7*93 s_3o9n iBy i42 i50 i62 i77 p5$E t +7 $d sMH t -6 u c ^3 $1 o14 ^3 ^h t OA9 d 'B $6 -D -F $7 *64 c ^a ^3 c $2 $5 $! o6# O51 c ^b ^5 *4A i8b O78 iBksJp R6-6 c -6 o3^ O28 ^( *69 O34 'D $7 iAu,1+B ^r ^x O52 T0 $@ i1l i2l i3a R0 L0 ^Ds@` $c $w d 'C $9 O03 D7 $y .4 ,3 +0 *56 stl k D0 $w $o $e *65 $n *62 O01 r OA3 oBq o1! $g *5B O65 r ] K o2l -8 $6 ^H $*$@ *69 O35 O32 ^Y O59 O27 O74 O45 z2 O32 *B8s0e*74 O63 sV* i18 i1l i2u szW *84T9 s0U sif oAzsg} o0Fsu+ s2**60 i1d i3b i22 i36 +2*1B +A $o O12 iBj$] } ^3 c O85 ] z2sg= *45 $1 -4 i33 i56 i1e i52 i0o i1s c $! sl1 i52 i60 i73 i80 T7 *20 i5e i1b O8A *07 O38 ^I o49 $0 *23 $? Z2 ,5*15*23 l [ ^v O82 $6 *16 L7 o1i*27*B0 i25 i32 i0m i2d i1a s(' i1b O23 i1b sGa i2j .8 O7B i81 i95 i3c i79 O14 O87 y1 l ] $U i52 i3f s26T5y1 ^n-A O49 O47 T6 O12 o02s3O] D4 r {R6i92 *02$8 i5e i34 O45 *50 i6h i71 i36 i3e i18 i36 +9*A0 s1M *20 ^r Y5 Y4 O18 $.$# i3e i31 ^Y O12 O53 oAJ $0 i32 T4 ^8 *43 *A5 D6 $j i2i i3m *6Bo21 '7 $U *6BT5 ^m -7 l ] $u o3Fsh6 i2n i3s i11 i7e $\o7P ^z +1 *60 O35 $r *21 Z4s.E i92 iA1 oAR O15 O7B Z3*B7 i8P s;5o43 lp4 d O64 Y2^V i57 i1a O03 skK E O4B [ +8d c $% $1 i1o i2d R6LB y5sRBRA o4KsRN oBwR0 ^j O5A O81 +7.0 i4K O53 Y4 sw^ ^g D8 O46 +7 Z4 } r i2r [ +6 ^a o6t -5 d 'P $a*24 O59 Y5 i2m i3a i4r p4 O25 T9 i49 i52 s6e i2b i3i $7 $9 $1 $0 O31 *16 *26 i6t O36 ^d r $z [ ^H ] i41 i59 i67 i70 T3 O3A O98 sWOD9o5a i38 i57 $C -1 $0 O05 i1l i2i $. $c $h ^R O25 D8T2 so0 T2 c ^T ^S u snN z5 } l ^t ^a ^c sO]$b*94 Z1 OA7 +5 K C sfD z2 *34 i6g t +4 D3 i1l i78 i7d cs+!*36 i3b i73 c $4 $u $s i66 i72 -9 i6- ]o9B ,1 $D i3tiA_s/C Z2 $2 ^P Y2 } z3 i97 O2A Z3 s/= tsa1i0S *40]iA8 D1 C *10 ^9 O24 sa. Y4 O15 +5 C K ,4[*96 O64 i8! O6B o4 O54 i31 i49 i57 i60 sY!y3 O72 k +5 -8 -6 O02 ^v $^sx7+9 sz8 ^y ^b ^b ^o ^b O92 $6 ETBk i23 i34 T2 T7 T8 i3b i75 ^k ^l ^i ^m D4 R3 *57 .6 *53 T3 O29 i21i39i48i55 D7 O32 Y3 s#dLA sku +A +A -C $5 O12 k $h +0 *32 } swko9C O03 R2 ^o '8 i1i i2z i3z C ^y k $v *43 *35 *14 i2v l i1b o7_ O12 o2@o0q iAT k $_ $_ [ $T -4 C s29 i2i i3c O14 ^3 o0QD9 +2 p1 O23 i0M i1A i2r OB9 k srG l srR *06 O12 *B1 i6u i7l srb $. t s3A t c T4 T6 *32 $6 src +5 o0h i2i z1 -5 *31 i4c i5o +C +C -D +2 z1 s03] *61 O61 +6 i1d *65 i87 i96 k o6g O12 o4a i62 i71 i82 *21 suo } o2_ RB *27 O13 O14 $3 O34 ^u *96*37 *89oB( +4 +4 +9 s12 oA0 O14 $k i69 i78 i1o i2l i3d $h $e $r $e i1o i2l i3i i0k i1a i2r K *43 -5 i7e i31 O2A y5 +9 -4 -4 u $3 $2 $1 ^l c i8n i9o iA1 l ^i ^t ^n ^a *14 +3 i2w s 3 ^y OA6 i7d i5c [i5+ o0E *65 y1 ^P *15i9giBQ o4S O52 +0 -4 -2 O02 $1 Z2 +9 -4 -0 O46 o3s *B6o75 i7s i84 $f $C *21 O36 q i0a o6c ^, c $7 $2 $! } ^k { s+;$P i1c +2 i5k $2 s@}*94 o14 p1 ^e ^d ^i ^s ^A O63 l *74 *62 O45 O35 ^1 ^_ seu ^w [ T0 -9 O84 Z3 i7s i8a +6 -8 -5 i82 i95 t $$ Y1 ^5 T4 $x $e T6 TA T8 O72 o74 -B -D -D i30 i52 u ^9 ^9 ^9 ^1 $Ds&\ K t *45 $3 $4 $@ $@ i1f } o38 O72 i5r i6i z2K T5 D1 $x $b sS% OA3 s2{ $o*A6 c $0 $0 $8 $! -2 'A O49 Y1 +3 i2n i3d i4i '8 O61 ssJ^k*90 T5 D3 O0A *35 } ,6 O23 $x $6 +3 +4 -1 O93 s{l ^e *16 L0 O12 l $s $i $d $e c o36 *78 O31 sD} z4 O65 Y3 O17 i83 i91 i83 i93 T5 z2 } ^6 i4e i5a $p Z2 Y1Y2oAs o4qTA] O23 ^V O85 +2 iA1 ^! -0 -5 -7 i47 i55 ^g L1 ] ^5 f *39 .A O86 $% $5 O19 r '9 s.m spP +8 -5 -7 i2n i3a i4n T3 T7 TB *47 ,4 ] i0W c $9 $9 $? $? *43 ] *20 ^N C O48 O96 o9B snY y3 } i31i49i56i62 i7d i16 i7f i19 sn} f*03.5 i31 i13 i2z i3z i5a i15 T3 $2 o1H u '7 o5. u d $9 [ O95 u s#i o8/ O59 O39 sS7y5 $k D5 iAZRB D7 Z3 i48 i51 *73 o59 i1o i2c o7i +3 D7 ^n o0p t i79 i3d O26 y3 i91 iA9 O01 sta $1 $4 $@ $@ i1r i2u i88 i92 OB4 .B +4 l shj i5g i6a i16 o21 Z1 i81 ^V $8 *50 O56 *78 s71 o3OC D9 [ D5 -3 L3*AB -5o14Z1 O94 O32 c ^a ^D i1o i2u *4B o07 O12 saj $L Z1 i1b -2 i3d i50 'A -7 -7 } o7u i3d i51 -1 $v *3AoB1 O6B *83 O7B K ser i1i i2v ^q *01 o0j ^f '7 *1A 'A i7r { O5A p1 *46 Z1 p4'9sGO O06 r smZ ssL ^B T7 OB6 $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 *12 O2B *3A l $1 $9 $9 $3 *21 i50 -0 -9 -6 l $4 $4 $4 +6 -9 +7 i6p-9 O53 l *70 y3 -6 $p $a $n $d $a $1 $9 $9 $0 $# -4 u $>p5 +2 sQA O0A $U o8s i2} i4n i5g i1b i5b i39 i3f iAjT4 ^* ] O13 d i4n i5e O41 [ $w LBo2FsFC $q O43 i7f i71 OA2 s0B ,9 o6r t +4 i66 c $e $s +6 $+ o1& O4B y4 O32 '8 ,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 $1 $9 $9 $0 $+ -9Z1*34 *13*87 i4k i5a '8 o1w [ O71 o5k $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 O63 *42 D2 i3h $p -4 i7k i8i -8 ,4 lY3^k ry4*2A o67 Z2 *69-1Z5 $w o4N T6 i31 i11 O35 p1 O15 d D6 O57 i1o iA+ i1y +7 .3 O82 OB9 i5h i6o -0 sgc Y3*85 c o5@ D4 $u o8] 'Bo7-scB -0 $c l i94 $m ^k O21 y4 O43 sBZ i12 i1e ^6*95 i4a i5l i6l sIH*28*31 to64 so0 se3 si! skb $l $i $k $e s?Xi52o79 ^ms&\ R9 s/c O37 c $7 $6 $! ] o56 Z1 O95 srz i3j l $-$! +5 +7 -8 ]*30+9 D4{ $c.B seO u *41 +1 O1A ^a ^i ^d -9 -D KsP_Z5 O83 'A i5a i13 } soi s6C sqGoB\^D i27 $a +1 c o2y O31 o0Y OA8 o9y OA2 i7c O72 +1 Z5'8 $3 *12 Y2 $Y O71 O25 f *A6 -6 O2A -5 L3 [ [ [ c [ i5a i38 +1*B7 t $6 O18 sn5 -2 *63 i6n i7a i81 +7 r $. $x O51 ssS u $3 $3 $3 i46 i55 OA5 sSc O97 i3e i38 OB3 DA i5e i39 i38 i5a '6 i4p i7b i73 *83 K $%$( $%$) i65 i75 l ^5 ^9 ^9 ^1 O71 '8 $g $_ y4 sbJ T2 -2 *75 i65 i71 sbL Z3 *58 O01 ] iB2 C $x ^x D5 o5N O71 ] $2 o5o o2r *04 *07 s7# s20'B O47 q i1a i2v i3i c $5 $4 $! c $2 $2 $# $# *62 O43 D4 i7b i70 $Vo9' o79 -6 O15 $5 l O75 i2f o5% O18 Z1 -0 -0 ^_D7 Y5'8iBn *62 l +6 -2 -4 E oA3 '8 *72 i3c i4a i5t $6 $6 $@ $@ i3e R7 L7 i5f i51 O14 { *4Bi7` 'Ao8C t'7 c $9 $6 $! $! T2o9Q i6a i7r i8i $y ^i +A -0 -0 D7 l OA3 i7#qs}m s4lk*62 O69 c o2k i3c i33 i5c i31 i7o i8d O62 l ^M O92 $& iA# p5 i50 $z -4 y4 O3A r *59 O58 o0E O23 z2 E ^c *40 { sea O16 sza soh i51 i10 sVX c $4 $2 $! *A1 O07 $6 $6 $! $! o6' $2 O57 i12 i3a O46 sx@ D2 ,3'5^6 y3s9V ] O3A [ t ,9 OB1 i1o i2n i3i *83 $_ O12 i13 i51 { s1h ^. ^7 *13*46s5i Y2 O71 $Y o9Fs0_ $T o13 slY^@ i1c i12 i6n i7t *18 D8 $? D5 K i4a l s!. $d O32 O68 *34 u O24 D3 *13 i6n i7d O51 K u*76oB{ s-( O89 T3 +0 $C c $2 $2 $4 $1 i31 i55 i1i i2n i3k Z4 O6A ,6 $8 *68 OA9 k sNy sDx$n *02L2 '8 i02 $2 i2a p2 -2 i4i i5e i6s *73 D1 *38] q O52 C$f i75 i7b .1 *04 oB$*0BC i6r i7s O89 ,6 l i4d s1y [ o06 $v o0J T3 o2C s%asUc$_ s06 +1 ^m O84 s^D O03 O81 i9<-2'B sLrs.z i7a i5f i76 R0 L0 -3 D2 u O13 ^1 $C $4 iBX i6r i7i Z5 O7B +6 -0 -4 o6#iA& i8e i9s *07 *3A O19 *94 O75 +4 -6 -9 *47 *36 *97$u $j r si3 O03 i2o i3r o0e Z1 k i52 i60 i72 i88 s9B ^ZR8RA +3E*BA c $0 $8 $7 $0 i1q ] i2o i3p ,7 *53 O42 sdp i8< O83 *91s[n i6r i7d O64 $u i57 i31 i3a i7f o3A*54 D6-1 o4b [ ^N Y1 -1 i52 i19 s0? p5y1 ^_ ^z Y1 -7 o0^ z1 ^t ^o ^p r $a $n *83 O12 $_ i75 R0 L0 T2 y1 p4 *35 O69 r -2 i8_sZRs>J c ^2 $8 i6o i7m s9Li9_ i05 D3 p4 *32 $9 $6 $! $! y4 O46 s7y ssZy2 i67 i72 o9e K $=$& } $n O37 T0 -0 *01 i11 '8 i43 r $R i67 i77 C O32 C $5 $0 $0 sasC $b O56 *90o2Y l '5 $5 s6g $0sGk.4 o1^ $9 $3 $@ $@ $A O24 i8}i7Q i2c i3h ,9sZ9 c $b $a $l $l O41 $w [ d O17 i2p i3e sby saRD0 'B ^1 .1] i5b i51 ^eiA' i1' *23 s0Y-7$g o8B O02 T8.9T4 Z4 OB2 *83 *53*57RB i5f i54 }s#hi1d i12 i73 Z1 o5c i7e i11 O04 -5 i51 i34 OA9 ^h i45 i59 oA3 'B OA1 R0 i7c i71 $x O45 sHJ i3d i7c p5 i2F c si! sa@ O71 c } i53 i33 i38 i18 O95 i8d '4 $6 l ^l ^l ^o ^r i68 i70 o4x Z1 o7S [ sCS c $5 ^3 $j O12 O03 ^@ i3 D0 O8A o9z i68 i71 s1F'BsX6 $7 $# O82 +1 i5c i76 st@ O93 s8+ ,5 ] i5f i52 $,$? *18 O17 O34 ,B ,1 *5A,0sho $_$^ D2 sgc i2b i3o i9.s"j *8AsLJ s?4 O02 T0 *03 i7x *67 +4 s7A O84 *16 s!Q i3c i3b O13 *03 iAeE} '5 Y4 i7a i55 { ^k i17 i1e T1 +4 r*1Ak i2i [ +0 -7 *03 Z2 o9m i3c i7d E $R *60ksL+ ] O01 } k sir -2 $?$* ,B O15 s/9 i15 i56 skm -5 O19 *0B y2 o1o C sVq O53 l '5 $1 *30 ,7 $1 $7 $! $! sh7 *20 } i82 i98 szao9vl i39 i50 T4p2 c $8 $7 $! $! O65 $k ^o -6 O12 Y4 o3K u y3slIsrJ D7 $D $1 $6 $* $* l $2 $1 $2 o04 O13 c $3 $1 $! $! r *45 ] D6 o1f Z2 O34 $7 .6 O79 o95 sL2 $b $r $r D5 O4B i41 i59 i66 i71 i41 i59 i66 i76 c $9 $5 $@ $@ i21 i39 i46 i57 s3g*3B O89 y4 D9 $* D7 *62 D4 O43 s2G*19 Y3 Z5 O69 O7A O72 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 *13 O78 $z $1 $2 $3 $4 srj K o1I T2 *71 O65 c $6 $6 $* $* $7 $7 $! $! -3s8h c ^1 $@ l $a $b $l $e '8 o12 T1 o2? i41 i66 o59 o78 c $0 $9 $* $* {koAY i2g *30 i1_sT_ +1 ^2 i73 i7c O92 i8g i7a i8g $s *17 $2 $8 $! $! i6n i7o i8v Z1 ^W l $0 $6 $0 $6 'C $8 s6ot*01 ^Q*58 i35 i3d o6f o8c $1 $8 $! $! Y5 { sI]*27 -6 ,7 D5 .4 sy$ c $4 $7 $! '8 o3i o49 *13 i6b ^G z2 ^D ] ^b ^u ^s $/ [ i3X sCD i5f -4 C '9 $8 .0 -1 sCY $m O34 o0t $! s.- OB4 oAX *43 O75 sL@z1 C *78 O71 o81 -5 *40 i54 o67 smg [ t *65 -7 $f $o $p i16 i31 $g r *21p2s"V i71 R0 L0 skos56 *52 O45 ^3 o16 o2V [ O15 i51 z4 O93 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 OB8 o1y oBN i4l i5o *06[s\m *A3Y2.5 DA D9 O37 O21 .6 *57i3t*A4 c OB4 TA $2 $9 $! $! i2s i3t $D $S ^n K +7 sfb OA3 ] c ^e ^8 -1 r c ^e ^2 ,3 O37 -8 O16 D8s3*^7 i0wsK6+8 i5e R7 L7 i41 i59 i67 i75 $3 -9 T2 T9 l-0s;7 c $9 $9 $$ $$ i7d i3e c ^1 ^b -6 *85 i72 i1c $j $u $t $8 $7 $* $* '8 D4 +6 swK T1oB8$x sn@+3 sy[ $p $y $x $k O83 i6j i7u i8n s-$ O97 $Q smo ssk$l*B0 Z1 i4e O71 i9> R5 Z2 +0 *86 i7c i73 ^a ^m ^a ^m i32 o75 i8D c iBx O65 +0 *16 i3n i4y i35 i51 *02 z2 } i30 D5 sAB o4t *73 O34 D2 *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 o0u O06 *97 i75 i1e i4~ *42 Y4 c ^0 ^c O51 O25 '6 *84p1y3 D6 o0w O23 $t C $x ^x $x ^x *43 [ { c $3 $3 $@ $@ O35 O1B 'D $9 +8 Z2 C '9 $5 i2s i3h i4i O45 l O65 k iAw O26 $($^ +8i2z[ *73'8 iBP i3a i37 s;xsJX *2B O46 $8 o1u sh4 *71$h i22 i30 i41 i52 i7e i78 *93 O72 i3e i32 ,3 i6c i55 i3e O68 o8% u 'E ^E *26 $%$! l $1 $9 $8 $8 D4Y2 sCQ i5o $k O13 o5e z1 l O62 o5?.7 srD O54 sn| *90 o09 *13 $9 $1 $* $* O3A *65 D9 $2 $6 $! $! C T3 sRh*02 *03 $r $5 $3 $5 $8 *45o0I $8 $8 $$ $$ sl7 so0 *12 O54 Y5 O41 o4y T0 $o $s $4 $4 $$ $$ y4 O79 -9 } p1 O43 i4r u i93 iA1 i0s i1i i2l O45 *23 c $1 $> O19 svu o5D *29i7rl slz '6 r *65 O32 z1 $n i45 i51 O45 Y2 i0L i67 *53 $5 TA $v D3 $B p3 i6g i7i i4s i5t i6o $2 $5 $@ $@ $u D8 } D1 $* O45 .B i4p *57 *63 *20 O96 ^P OA6 ET4 l $0 $0 $7 d i5n *34 $c i7c i78 ,8 { c $3 $4 $! $! *52 O05 Y2 *68 OA6 ,1 O34 *79+9 sCU [ [ [ $1 $2 $3 *53 *72 o8qoAA i1e i35 O53 -9 $1 $2 $# $# $0 $7 $! $! T4 o0n c $0 $0 $@ $@ $. $m $m o0os?U.0 $1 $8 $* $* O41 *63 *6B $4 *86 i6t i7t i1b i3d '9 *53 i89 i97 o5d *87 i73 i5b O98 O8B $-$? ^D o4m O38 $6 $6 $1 $! $! o2n d O58 T7 *97 OA8 i3u i4r *21{ *B6 O63 +8 i1c i7e i0g i1a i2r i7o *35 s3L [ } l ^s ^i ^m $# ^1 i37 i12 $8 ^@ K i8l *43z1 [ i32 o23 *2B O94 $8 $4 $2 $1 L4Y1 sHPo5C s?$*23t .7s>'*A5 s+y,2i7* i52 i39 *35 Z2 O32 o67RB ^@ +1 O23 Y4 D3 E sTP i5f i3c *59 O96 o7o *81 *72 T5 ^T O58 *6A D7 -8 *7B O62 oAF $9 $8 $1 $0 i3x OB3 k ssS i27 +1 $a $s $a $h $a $b s;jz2s2L i1t i2o *64 +8 i5a *50 D3 $? O74 E i31 i76 [ i4* l [ ^c i39 i52 '5[y4 c $7 $+ -2 *03 scu s!Y ,7 o1g i8r^2r i64 T7 o3e *13 -9 D1 $1 $2 $3 $& sy(k i4r i5s O01 sl. i31 i7d D0o3 T7 L6 y5 O79 p1 *50 O25 i4m i5a i6s o74 D3 i6k i7e i98 iA2 *09 OA2 ^x ^2 D8 o2d } T6 s1+ *89 O04 i50 i60 i72 O76 ^L iA< i62 i76 Z1 *21 *31 ^D *04 r i3i i4r y2 o6E z2 i1n *1B$os#s $7 $7 $* $* i79 i5d i1o i2u i3r o6J l r i5;s>? s|2i9%*26 i3w i4e i5r Y2+5 s5U O82 o4E TA i1a i2v i3i i4l i8s i91 O61 T2 $i ^B t i7f c i9w } p4 i0L Y2 c $C $C *43 *20 ] R2 R3 T2 O79 i3f i5d i7w i8e i9r sz9 i32 i11 i59 i32 D5 +2 K Y1D8s6\ O13 O78 s$^ c o7# $c [ *56 ,9 T8 o9/ $m o37 o4` i1a i7o +0 $E *50 O26 z3 O38 i2t i3i l ^x ^a ^t ^y ^m ^4 s5q E i1l i2e i3x D7 O14 i5i i6o sl- O31 i58 i32 o7s i6t i3i r i1e i2n i3t i79 i81 i91 O21 $k i8n i9o l 'C i32 i15 i5i i6d sWK ^#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 l -6 +3 k o4c k o1P i78 i88 i98 Z2 +3 c i5e i6y i2t i3o i4r i3m i4i $!$, r*A8.6 { i8V OB2 l i7n i8e ^Z Y1 ^e ^k ^i ^l ^i i7n i8g -9{sks i7Y i2r i3o i4n '7 .4 s,_i4A -6 -C OB2 .9 Z1 p5 s5l p5 i3a i4s i5s *9A $3 i5y i6o i8@RB*59 *46 D7 o71 Z2 k -2 s+c l $9 $1 $1 O01 i8i *65*39 ,2iBG y4 O86 i9e iAn R1 O64 l s1a o86*53o9F z3*8A*83 sbS i6r i7s i81 ^Y O23 Z3 O74 i34 [ i0c o5m ^V O31 +D -0 '8 ^4 o4b c f O39 o8[ '6 ^h *13 ,7 } ^1 r *02 O81 o5y o93 O74 Z1 sw\ LBo70 ^G z1 ^r O16 o2x i3n D5 $ $_ i8i K o5f $z i5t i6e i1a i2r i3k i7S O5B K -7 $9 r $w $o $o $d *73 O24 d ^a k T5 K q .7 O79 i6e $. o5 +6 svRi9@s=s D1 $o i3b i4y Z1 *31 i2e i3t *32 Y1 E $6 $@ O73 -8 $z o7z s3H +B -E *05 ^o L3 p5 *B4 sE! OA2 s3n ] o50 +1 } i3a i4n i5t $3 $3 $! rY5] i3k i4i i5n '6 ^p i6p i7e R8suis1d o2u o3e slG sAZ +2 O41 o0e *31 OB4 ,9 O14 D3 i2l i3s O25 $S +A*34 i8A OA5 o4V O52 ^i o2g T6 z1 o9w l szl r o1a i45 o58 $i l +6 OA9 O96 D5 K +2 sil C $e $1 shS shr D6 i3a i4r i3d*18 s8mspV ,6 t sa3 o99 -A -0 $E i7e i34 $y O64 s.9f ^N $i *58 O06 R0 R0 K ^y i33 i57 O54 z2 iBf^8 $3 $3 $# $# s5w c $8 $8 $$ $$ c $1 $9 $* $* o4i T1 O73 o9o *68 o0k OAB o3S s_G D7 o1h $. .0 i4n i5d i6a o7o .6 i9C o0a O28 OA6 z3 y3 O34 *13 D3 [ i1b i13 } sey i5n i6i O54 O21 *45 p4 *31 p5 ,5 Y5 c ^4 i71 i1f ^bsZ? O54 $t $3 $? s0k i8%t^b O74 o7S stl l Z3 O36 $e +B i2i i3d o0z t O15 t iA- -B i20 i31 EL8c c $7 ^3 O46 O75 sbs ^j ^W z1 ss0 i43 i52 i61 c $, $3 O51 ^i ^o ^U t O27 *80 i76 i1e '7 $J c D1 [ T7 '7 $W c $3 $D +1 -E z1 i4_ r ^% o0c kls*K i4i i5a *A5 '8 i75 i3d i2t i3a i4l i0f o15 +1 +4 +8 $i $e $r *A0[-8 D8 O15 o96 Z1 i31 i50 $&$> +B -A -C c $* $7 *71 D2 r i7h O03 D2 ^W +8 o4l ,1*37[ $/ O52 $@ T6 i1u i2f i3f +3 -4 -7 i4m i5i $i $a $l sO+ Y4 O6B i1r i2a i3n -5 Z1 *63,4 u [ T3 D6 $5 $)$^ O67 s,A Y2 *43 q i50 l Y4 o1u lsex } i40 -3 i76 i16 l O56 '6 sND t*70 i7r i8r o5r Z1 c d '7 $9 i6vsq} o8+c c d '7 $3 sRe $H Z1 +0 D7 ^/ z1 ] o11 ] i1h i2r { o6t O84 Z1 i92 iA8 i1h i2i i0Qi6!s=A [ Z1 o2u o6W O03 O75 o2C o7z o8o { O21 c {s;.iB# -2 ,7 c d '9 $7 i36 i5a c -B O2A +4 i5Q $6 O05 $2 $1 $2 $5 ^T i0P oBSi8'i7r i9r iAe o5VsVn $1 ^2 t,A i2l i3i i4n i5n i6e i5l i6i i7n y5 O81 K o72 Z2 ,5 O64 i7r i8i i9o i3f i1d } o3y +4o9" soy t k T3 sfF T4 *65 $! ^g ^n ^i ^r ,2 *65 i2e i3d *92$&i9U i59 i68 i79 iA' i5u *68 +1 O45 s8. O08 D2 o1e sdh c $! ^7 $! i85 s-+ y3 o5s $- D5 o8P$Ct o0t o1o i5r i6a *73 O69 $5 $G O82 Y1 $m $k *7A O35 f .9 i3m i4e i5n i6i i7n i8a .6 i8a o2jk *32 Z1 D5 $R sAi *08 O47 i38 i51 s 'sjC [ T9 i4w ] o1% 'AZ2*01 o1e $7 *27 O43 ^p KiB5 o4^ Y3 O8A O01 O54 o0d i1o y1 'B *28^6 ^#*28TA O34 l o0k o4CsZO*45 L0 c k ^1 *32 *91 O35 *85 O23 OAB o9> o5| i9( s;oL9 s0E-9 *1A.2shQ *70 O56 K *83 T5 Y2 *01$]t o3d ^z s5e -1 *52 K T6 '9 -Bcy5 $.[ $7 $+ iAo O96 o9a O43 $2 *02 i6h Z1 -4 $g T0 T9 TA Z3 p2 c $2 $7 $! i1r i2a i3z $g O98 k p3 +5 $8 $x *65 D9 i50 i60 i70 O81 O48 L0 ^f -0 -5 -6 O62 *03 *A5 *B7 '8 i2So7v l $f $o $r $m t o7K O14 i1H [ o6/ *21 o28 ^j c f O26 KsQHi7u K *47 o6x Z1 *B5 O58 iAZ O26 Y1 l ^r ^a ^w c ^d ^2 i0F *23 ,7p2'7 $O Z1 i7h -9 *76 $5 sfH oA4D7 iAW O32 o20 c si! so0 i7d i19 *A7s7v O52 Z1 $q sm. oA3 Z1 R0 ^# o2S T1 sRD i54 i5c R0 ^B o0m T4 C*68 i5s i6t i7a *46T6 i2l i3e i4r i54 i5d q '9 ^M ^G i3a i19 *12 *42 s4c $!,6 *04 O41 $n $i ^H ]*62 i8k i9e [ { *35 i0;sjU O85 D8 $L O48 Z1 *27 ,7 r o0g i1o i2c i3k O17 ^r [ D1 ^v $C O12 L7 o6h i42 i50 i61 i75 o0z -9 O53 $5 $8 $7 $4 O34 D6 +2 Y2 ,2 O67 OA1 smj *25 $0 O63 c sg9 sK@*63 z1 O02 o1B Z1 $b Z1 s9_ i2p i3p i42 i50 i61 i76 E i6S ^Y D3 *50 s1- O12 T3 i1o i2u i3l O82 T5 ^$ ss$ smu o4 i4o s%mrY2 i2r i3i i4s ^N O63 o9h s\# O62 i1_ } $tsbk i1o i2h O74 ^2 *AB -1 i5d p3 'B ^6 T2 -2 -4 -6 $1 i2. *48 D4 +1 srg $5 $0 $! O24 $. D4 Z2 D0 s1 sRC *57 O16 '8 o6u D3 o33 [ ^E D3 ]$0s?R c 'E $7 $|$| c ^e ^9 .5 D3 $G O12 sGj*6B-A O24 $8 ^8 iB` O46 i6a i7t i8e D5*5Ay1 c ^e ^3 -6 L6 i1o i2y O84 *12 *47 o4v stg O12 $d +3 $M O12 o8Fs\o sC[ O4A i4* ,A*61 $v -5 +4 $0 O61 o09 +1CR9 z1 '8 c ^a ^A *04 $n O41 *B0 '8 ^ysoE Z3s=* c $7 $2 $! s27 C c ^e ^f +4 $u *42 ^f O82 T2 ]sN4T6 o52 $x [ q O2A i5d i50 ly3] $m -2 O61 o0H i5p i6o R7K *29 O32 i1^ T4 -6 o8K c Y2sCe*19 *80 O36 ^C ] *A4 O21 Y2 *24 sH[s\MiAT Y5 D0 Z5 O43 i55 i1a sHgs5! $4 i5r ,2 T7 i8a i91 o34 *20 c $u $p i6a i7m o8. O31 i3e R0 L0 c T5 si1 i72 i1d i1d i7a O98 $# D9 D3 *56 k ]+4i8J y5s"8 D5Z4D5 O1A $t f i6o i1c R2 L2 l i5t +0 O36 d $y +5 K i8u l z3q i0a i1n i2i src -1 r *23 $j *57^@iAR *21 +4 l OA4 $$ sPN +7 i8S $1 -0 p4 i4n i5i *84s.g syR c $a $m i0B *83 O2B i51 i7e i6n i7e i81 ^*iBh+8 o1J Z2 c *29i3S sGM $6 $* c o27 *B1 O86 slL '8 i53 R4 .8i8% sB2*34 oBC i35 i13 *B9.7^m Y5s>%^h $* O12 o3k o1c o8a $x *84s(b *56 'A O72 ^2 sy] $l +1 o85 *97 T9*80Y2 i56 i32 sY* O01 T6 O35 i33 O82 O32 +A -B -C -5 *50 K i5d i1c O96 *18 y2 *37 *20 sJ' 'A O23 O72 i62 o6o $d i6s i71 i82 o2- +4 $5 $5 $! i38 i70 OB2 o0q sej c T1 so0 ,3 ,8 *03 sbe i3d i4y Z1 p2 'A i0m *70 *25 O63 $0 O8A i0N y3 ^j ^T ^J $! ^3 i1* i19 i79 +5 d O75 s'+ O43 o4B [s3w +0 +2 +8 } o8! $3 *18 o7b +4 i1e i11 *60 $s $t u sET$rsU- -9 o64 s7R *41 o82 ^g i4g p1svj,B Z2 O06 *B6 O62 *46 $v y3 p5 s9* -1[o3Z Z3 O6B sJ3 $e O62 c $# $6 i6t i7o i8r O32 sz" O63 'B sS8 OA3 T3 si1 ,7 iBd O52 O41 O3A s5G E *30 $z O8A O54 slio96sH$ i3o u i3Q c $7 $/ o02 z1 $o o0v i65 *52 .2 o0l i6r i7l sbi s7L *15 $u $p O51 [ $a *26 ^8 $9 c o68 sL3*46 ^x^X^x$x$X$xu i3p i4e i5r $l $z o5Ss5c $l ^b sf$ i1a i16 l Z5 O57 q O68 *29 O64 Y4 O38 *10o1L O18 s.N .2 C z1 i61 i71 i80 smj -3 $s O87 O73 ,A sgo *76 D4 .4*61Z1 +4 -6 -1 C d '7 ^@ z1 O15 $z $2 s;5^ssiA +4oB$seR .1 s56 $! $0 i30 i3f sKR c $3 $0 $! O2A O12 LA i8= O53 C '8 $5 c R5 [ -5 } ] +2 O43 *67 'B -3 *74K $b *58 i4h i5a i6n O43 ,2 c ^$ $$ *97-8i1i i37 i5a i52 T6 ,1 *15 E +7 ^e $,$; i3x O46 } slc i5d i32 i4j *21 D1 D3 D5 $m ^i c ^R K i4s o1usf(,3 T3DBT0 -3 ^2 sPJ -6 O84 *79[ OB2 s}) i43 sLW O03 Z2 *74 c ^b ^a $n O58 $n k +0 -6 -8 -1 -B s4y O98 O6B O16 ^a o9x D6 OB5 T7 $,s9(*57 sxr] *63 o1l -9 *01 O13 c +4 O03 *50 *12 R6T7sl@ +1 z2 ^8 O62 o92 O21 c ^3 ^6 ^9 ^1 i4N u Z2*A4u p5 i5. i3b i4e i5r p2 -A O83 s$j i7K ^e .2 p5 O41 $H $* OB7 +2 o08iB| o1h o2e c o5- O06 c ^j O18 o8# D7 p3 -4 t *02 ^0 K O54 ^^sS( i3t i4a c T7 so0 L9]Z5 si1 T3 *05 K i5d i12 i4L OA3 t o9h s43 i0O ^L i5a i16 scz O52 $T O58 smK T4 O74 i6i i79 i39 o0W t O43 C O08 z2 $c T0 s-M -4*B4*AB O7B *12 [ *70 p2 OA3 p2 *75 +5 c i8i i79 i7c i7i i8c i0c i1l i2a c $5 $+ +0R2E $x $t [ O71 O05 O13 $. o9` i53 i3b *21 l +4 O51 sjm s g i2m i3a i4n O72 L0 i1a i2c i3h +7 } $5 $2 $8 $8 +5 o0j '5 .3 +5 +7 +8 i4l i5e i6s u $4 $5 $6 s;v O85 i8i i9c i3a R6 L6 i7d i75 ^G O62 i75 i7f i54 i31 i5b i57 i5b i54 $p *64 c ^4 ^c i7t i8i $#$) sS%$wswa d 'C $5 *75se0 t DA O29 O72 *13 O1B l s^d i7d i1a d 'C $0 O73 ^i d 'C $3 d 'C $2 szc *87 OB1 sZAiAh .0 *61 i59 i1a i1m *45 ^v -6 i6i i7t i8o i7u i8s i91 i1e i36 i34 i1d i30 i73 Z5 O17 OA2 *97 i65 i77 o4g $u -6 ^@ i4B ^' O57 i28 i36 ^H O71 $3 $3 $1 $8 Y2 OB3 p4 *BA O02 o06 y2 i1a i2m i3e i2r i3g i4e '7 -3 t *78 i3g -1 ,3.6 i6G Z2 i37 i76 iB% c O94 O28 o5D Z5 ^y Z1 [ *A9 O1A z3 s?x^. R9 $0 i21i39i48i52 sFq{s-6 sSL i6l i7d i7a i3b o2= i39 i74 *49 O14 i2p *30 O73 s&2 o2K o3o i2v [ $D $7 ^6 -1 i32 i3c D6 *36 O41 *B7 o4O c si1 T5 T7z1 sh!Y1Y3 *01 [ i6v Y1 OB8 sMC D3 t i1o i2o i3l sNM r O5A O01 *67 ,2 i76 i7d u $1 $9 $8 $3 *5Bo8U p2 O83 iB@,Bl p1 OA9 O7A i7D O59 o6a ss! p3 t o0Y O31 Z1 *74 i6i i7g i2x ,6 O4B ,2 iB2 D4 DC [ o2u Z1 -5 $M r T4 c T2 T4 T5 ,3 $C t o0V i6{ O62 c $3 $1 $! s1q O91 i8 *7B ^F *13 l ^y ^l ^o ^p i7m i8i i1e R5 c $6 $^ o5l Z1 +2 +8 -4 T5 T9 ^- ^3 so# O02 p2 ^v +7 syF o47 } *56 s40 $/ $p $%$@ seV i5O *42 K k $\$\ K O48 sGE i7o i8v Y5ssY p1 $n O57 ,7 -9 $! O57 *02 d i7i i8o z1 o3m i0b i1r i2a Z2s0M{ L4 u O98 .B D1Kk k -2 sir O07 i1_ $=$$ O41 o7i sG9*B1Y2 i7l i8i $E'9 ] -3 ^2siR o0b i4o i3c i4h ^( O06 z1 sow '8 o0E siq k Z1 O24 i7d i1e C '8 $6 ,5+A*63 o7a OB5 $($# i8% i2n O52 O64 q ^B O04 z3 *78 OA2 ]*84 t s"( O31 Z3Z5 $RT2 sI0 p4 i44 ^l $1 i3s i4o O31 i3/ i3u i4k y5 p2 O19 Z1 O54 i5d i58 *27up3 O37 -0 T0 t T6 D8 k c $& $8 D2 R1 i0m i1i i2c ^l +6 O73 o64 f O87 -7 -1 K *52 +7 -8 -5 ssd]s1r sS>so6 O7B ^S *25 i75} o0h ^s i3b i3c i65 o87 i4- *30 O31 sar [ $6 ^@ i54 i3d s8T*09 o9" i51 R8 L8 $0 O57 +BK^w O37 *59 p2 *A9 O52 O15 y4 i5a i6s i7s p2sX-] O02 o56 *40 o7y sP'*81*7A sJO O03 Y5 i1u OA1 s<*[p1 O1B s{y z4 s}ts.g$g s1a O0A z1 Z3 ssx $J O63 i2h i3o O8A O31 sY\sHi*89 s<6 O17 O35 ^B O86 O82 i6n i7g sWxR6 .3^O+A ^1s"{*0B sjm t *29 O13 o29 l ^H z1 O13 R2 [ O98 y4 s_# OA1 T9 T7 +0 $V O73 *B0 sSf $isw; i9+ O62 sD@ sE( ^6 z5 sK6s0f*6A *79o9r ^l *56 i1i i2n i3o i19 i1a ^@ o70 z3s2HL7 i76 i7c i5Uo0c C o1C $! ^2 O63 *52 r sr;i7&+A *54 +6 k p2 k O31 $y *15 *73 TA[z2 qiBv*53 s;To5@ y2o0Ysl/ O84 -8 Y1 ,7 st8 squ K z2 O23 ^p -7 *B0i5Bo8O Y4 p3 O4B D2RBsd8 skb K *5A O06 K p2 R2sX{i3c i60 i78 szy $5 ^@ *19sbS*14 sNK^b [i7a i10 i36 i8g i9a O23 -1 y2 i50 i5c -9 *56 ,5 y4 O5A sdj i9E c z1 o6C l [ ^k s-2 s8r E s1W *38 O23 .4 c $0 $# sem -2 D9*08o9& i1a i2y i3a D6 } Esb6Y2 '8o7% O21 O19 +8 *63 i3zi9M ^U O06 d o8b Z1 o2w ^n d o5n oA,sEho6Y sQA [ i8g i2o i3n [ O72 *42 k K t *04 k .5D4 i1a R5 *76p1E o1@ -8 +3 Z1 *A2+4 c '6 ^E D8 O76 i0Y OA5 *BA *A5$9 rT5 i8g i9o $2$0$3$2 si1 ss$ O75 i63 T8 TA '7 ^t i13 i55 o0y r .5 *83 i2p i3a *86 o6c i9S *A1 O83 OB8 p2 oAL '5 i2l E i16 s9F i0p +8 i12 i59 -1 } i75 R9 L9 O23 ^W i55 i35 i1a i2s i77 i87 i97 ^$iBF O31 s-F o0g Z2 sZvi4S Z1 D7 iAGo7j $_ $5 $4 $5 p3 OB7 O0A z1 *71 c ^9 $3 sp@sGk D6$, o8< O68 i4j i5a i6n O13 p2 i6i i7c k O94 *58 l i1r i2i i3c s3v sS| O39 *98 ^C ] O97 o2t l o21 sYEu[ $.$; -1 C *2Ai4* i31 i58 o08 Z1 *87 *46 i3d i11 Z1T2sAL o4'o5[ p5 k $u $w z1Z2 O23 $! s;\R8-9 i6o i7u i4o i5t OA6 O37 *04 o41 ,3 O02 o6d ,7 s1@ Y1.A *04 smv +1 sbq *86 O14 i4o i5p L0 E o9?i2i t *94 O1B iAh] OB9 o6f Y5 +5 -C *54 O75 i16 i50 O52 sko o9$ shv[ O2B r i6g i7e i8r +4 -0 +6 'A +1 o5_ u spc*A0 d o8i *64C i7e i70 sAX OB5 i56 i1a l-8o8` o2r O43 $y o4f D4i5DsP0 L7 l c T3 i3_ *57K *41 Z3 OB9 o5o t sBQ i8a i9l iAl *34 $y { i2c *96-4TB i2g r O07 sO' $. *54 t *35 $4 ^@ $b O35 i91 iA0 iB2 s5T sGO^W*32 $i O03 s#5 *84^S i11 i59 *56 *30 i2y i3x *98 ] ^C O6B +4 l i6/ o4f $s o9oy2 i54 i14 so1 i38 i45 i52 D2 T4 q O09 *64 $x o2a$es@V $f D3 ^isU- c $p ^u z1 i1e i2r i3i i0c i2m i1a ^C p2 i1e i2k $>$+ Z2 +A D0 i65 $6 u D3 $. $r $o O17 OA3 Z3 O63 y3 c i48 O07 O78 { O51 o8o i3T *32 O92 *86 s+A y3 O58 y1 O1B $V { i3d i76 i9q$u +1 skw c i52 T6 O81 -0 i20 { Z2 O02 iA_ i6r i71 $3 ^d +4 O01 K O12 [ +2 i1m ^n ^e ^p i2m i3b i4= O73 *A8 ^x ^a ^t $9 $1 $3 $3 i1d i31 c ^m ^i D3 $x *0A} $S D3 *42 ss- i8x *14 O04 T7s%H l $i $a $n sw8 -3 o8k [o5x*A2 [ ^u i0v *07 o0v ^q ^, r O5B $G *27 D5i7ciB! i5R O1A s@! d o9i i3i i4n i5a O3B K *57 $n D2 Y3 $4 O54 D5 i7x ^x +5 c $5 $$ i3u i4n k ^J i44 i50 i1- i3- i5- i7- i9- ^m o58 sX8^k s9X O78 z2 sH"o4? r O51 K i5x +2 s4FD6^d s\lo5ko9B O62 o6Z s&U slN OA4 *14*75s(1 i47 T5 L8s!zL0 O6A sNJ o8t D1 i35 i12 D6 O36 D4 } ^5 +1 s%* sub O72 $4 $5 $6 $! '9 -3 o5n { $. $e $s i94 O42 y2 y1 DA sVbsi- O06 o7! O68 o0MY3 T8Z1 O65 c sZT cszp k i1- i7< OB1 o1J c Z2 p3 t -4 sgn -2 c ^1 ^@ i59 i38 o7! -5 l ] $r sly O43 ^g ^e ^l i9e iAr Z1 i4a [ s5fdY4 Z5 O81 O56 O49 i7m i81 ^D O43 p3 O62 ,8s8y$/ c $4 $2 $0 $! i9e iA1 i77 O2B O31 o19 *40o8OsZb Z2 -3 $E O32 Y1o6ws9V [[[[[[[[c D3 ^X p3 O69 $$ i9Gp5 $5 OA2 C +8 O65 y2 ^Q l ^P 'A i22 i30 i42 i50 s(3 i3h i4i -A^b*48 o1J O3B sWI $V $8 s%DR5 $i $c i7e i3d q*74 O61 .4 $y sLp $b *12 i3c i39 o6. ^m ^F *46 s(= O2A s3R $=$> sDF*85 l [ ^y sJRi0N*43 ^z +7 i2l i3l i4o O17 *B1 r o4t $Q O28 skX -1 -8 -4 i51 i1d i1a i2z s-t -8 *24 OB4 O72 s_No8h sb@ O49 $] oBE O6B i32 i13 i32 i18 Y2 -0 $t i4f o5w i3a o1U O53 t $s $h $e $e $p i1a i14 sD} OA3 l oBO o7N p1 O35 suz o3f O36 ^p +5 -9 -0 soJ i1a i2k lswZ i76 i58 O43 t Z1 +0 -5 +8 ] O12 i57 i17 'A*15T5 i76 i7f K O03 p1 O52 T5 R0 z1 D2 Z1 *85 D2 $+-A ,5 O9B O73 *A8 u T8 *73 O43 s1X O03 E .5 -1 { i2b i3e i4r i2s i3i u sCK +3 '9 *8A*15 +6 $u i1a i38 o6s*B3-2 O23 O54 D6 ^3 i34 i70 l $7 $1 $1 O13 T3 i3c i5f +0 -6 +4 +0 -2 -6 ^M i6i ^3 } i0b i1r i2o *06 o4m ^p K -7 -A -A i1i sih O13 ,9 z4 O16 o4v O05 r ]*81i6R OA2 ,2 o3Tsp< d o5b sgO *23 O86 +D -8 s i3p ^a ^g O36 Z1 O32 ^r oBKs@C O57 s'I O65 d E O95 y3T3 s3z,9 O4A R8 p2 *28s`$+A o7Oi8Y$n k o91 o3a s41 $j O86 ,6 O83 r R3 +1 sjo +3 s,2*41 Y1 *89 O43 sbh i3e R8 L8 s%k$C p1 O6B *02 *17 l D5 i7x i5l i6o O42 } O32 srs T7 p3 o1v*81+7 i5w o9t O19 ,9 D2 Z1 o3n *83 O73 *1A d O95 E i2k *46 [o6yiA* z1 O0A *07 D3 Z2 o2s -7 c$S -4 r i1o i2n i3s *96 O02 $_ -0 o2q p5 OAB $9 u i71 R9 L9 oBE^$ r $p i4a i5c t y4 *A6 *59 O07 Z3 Z4 O07 O29 p2 s-J *56 $4 seoRA oA' i6r $r O24 R8 p1 i62*84*27 i7a R8 L8 O75 $u sax o3z o9]$d.B l $1 $8 $8 O73 *51 $3 o6z O02 Z5 sj5D8 *75 *63 O12 L1 *71 ] o83 t D0 O56 i2C D0 i57 L5 R6 *58 O92 p4 i8e i9t o6g $b $i*69 i73*A8 +4 *82 $Qs{w *16 D0 O04 E O53 O7A y3 R4 *57 *60 $i i5c { TBsjd O14 O75 i74'B OA2 O1B [ R1 R2 sJt i85 O1A y5 O2A Z2*B2 *48 *68 ^t y2 s3;o6o O74 sdf sbw O07 O85 $5 i2l *23 O89 i7t i8y szfD7 l $0 $0 $9 *0A O25 d i3e R1 L1 '8 i0z *52 shl o1y OA3 O51 Y1 *63 DA O19 stv $h } K *17 K R5D8*A2 $w *86 *18 D7 O27 $i d o4b *57 o0( '7 u $1 $9 $8 $8 t i59 i1o i2o i3m $T O31 shz -2 O31 shao6c*A4 o82 $9 +8 k *12 y3 s?>[ dY3l i89s;c l $4 $0 $4 { '8 ^b *64iB, Z1 -1 +7 O5A L4 T0 T7 T8 T9 s*ls)Ny1 *80 '6 sia i6e *46 O7A O18 $8 $7 $7 $1 o0t $? i8csiy } s/e D6 D8 q sK\i8k ,8T3s_a o3>^c *B3 O53 ,2 -0 o2g *75 u o0B s=4o7y [ $z O52 iBv t o9N K o40 Z1 i1o i2o i3p l '7 $5 l '7 $2 i4e i5r i6t KR7 O72 K i9! $1 $l i0jsF"*8B K *63 *83 O32 *20 Z1 *21 *36 O92 k srDs{c$. *B6 'B Z2 [ t i6s i7t i81 { i61 { O23 i83uD9 $5 Z2 O15 ^e $t ^n } Y5 O18 Y4 Z2 O21 i0s i1a i2s sC0$h O49 Z4 sbc^t KL6 i1b i85 O63 o3d 'B OA2 O0A [ -5 f O38 ^l +6 +7 ^s ^i ^h ^t sKy o5f O74 O63 i82 ,6 ,7 *67 s12 i1i i2a L3 +3 i1i i2c i7a i17 i2e i3v i4e z2 o0g *15 i19 i52 i38 i12 i19 i7b i36 i50 ^q r D2 $+ i4x O92 i46 D8 O02 Y2 p2 oAL i1e i2d i3r ^2 ^1 $3 i0P R1 i0f i1a i2r +1 i67 o7a +5 i3x ] ^w ^o ^b s6c c o6S Z1 T4 ^0 -5 o1_ +0 R4 ^A i8e l D1 $_ l +4 *30 i1k i2a ^t -6 i4i i5m u ^m -4 t i4i i5l O14 $g o4I u i8b i9e i62 i71 i81 szo *04 *73 i42 -7 i4b i5a srz srd } ^5 Z2 -7 Z2 ^C i5o i6p o7r *34 i1y i2l i3z i4y i1y i2r o0v o1- l ^l ^l ^i r ^Y r o0a O51 *46 ] i82 i91 iA3 l $h $e $a $d t i8h *51 Z1 O53 i1r i2e i3a $s $i $d $e ] R0 T1 '7 o6w { i52 -2 O07 ^k *12 O42 $v *43 O02 i64 i70 D4 *02 ,5 $H i1i i2r i3e i3j c r f -1 L0 i1e i2t i3a OB2 ssR ^K O25 r z1 D6 i7a i8r i9d i0h sli $M O51 Z1 $7 O41 o4O iAG OA3 $8 o7o D8 o0d shL E i0j i1u i2s *89 [ O31 .B O83 i7C +5 o6A c i6l i7e i8r ^a z1 } *48 O62 i1a i2k i3a i38 -4 i4o i5l T3 TB Z2 T9 i7i i8c i91 O51 o3L ,3 r D3 s85 k o8N o02 $I i9e iAr iB1 i4p i5i *23 $k i60 i73 i33 i44 i55 i1i i2c i3h i2t i3t o2m .6 sgCR6*61 ^M *68 sbjt sye i6a i7h i31 ,4 O31 smf o83 *65 $D D1 i44 i57 i1a i2s i3t *45 s2_ i1a i2s i3a $P -5 i5h i6a i7n D6 i66 i0l i1u i2i +1 $0 D7 T6 *54 $s o1b syc spm K *37 -4 T1 .7 T5 T8 i1u i2k [ $7 *45 ,1 $v d O5B $1 +2 Z1 i3a i4t i5e i5t i6a i7r i6c i7a i81 o9cY3 i1s i2a T1 T9 T5 d K Z2 *47 saA +2 s1= i91 l $7 $0 $0 $1 s8! ER4 i4p i5a i43 i54 i65 ^r ^u ^s O74 i5s D1 $f $j O74 o0r Y1 $+ Z2 r c o0k *27 $d $i $4 o4o i32 i43 i54 O65 E i3d i4a i5n D1 r { i6n i7g i81 i5i i6k *17 *06 Z3 $8 i5i i6a i8n i9e i6l i7o i8v ^Z *31 $3 $k i2t '9 i8O { s21 p1 O36 l +1 o3w i1V O31 $M *90p4T0 i5e i6m i8u i9s i2t i3c i4h i4e i5l i6l i5y i61 i72 i1l i2o O04 T4 '8 $K c $! $6 i9e iAd *86 o30 T9 OA4 l $i $e $s r ] o0v i8m i9a u o6t i81 i97 ^X +5 i81 i96 $o $r $y d k O5A i0t i1e i2r t r D2 i1a i2r i3o i1a i2r i3e $* O72 O51 Z1 t i65 R5 i2m '9 L5 l ^F -1 $r o7- c o6- f O75 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 ] stw o1u } -0 i1e i2v i2a i3n i4g [ $p -7 i2a i3n i4i i6a i7k i8e ^_ *06 z5 O45 -8 o4b i1a i2t i3t O21 Z5 O06 *20 ^* +1 i7w i8e *53 sur i6! -6 ^R ^D ^{ $} i6V ] i1e ^D ^f ^f ^o iBn OA4 O09 i4E E O92 sgx o4s '8 o7S *34 i7r i8a i7r i8d *54 *86 i6i i7a o0s O46 ^i -4 ^F T6 .1 o48 k L6 $V $. $p $k Z1 i7n i4t i5i i3e i4n i5t O64 *62 O72 i3k i4a o1. ^h i3o i4l i5a *29 .5 } OB3 l $n $e $s $s *64 +4 O04 i1e i2o oAD *17 O15 c o80 L3{^u O04 Z5 o69 i2a z3sYBsap l[$7 [ *15 K KE*98 $n *24 $/$- $^$+ s9eZ4.9 r D3 $ $- $ $, -8 O24 $~$^ i45 i55 i65 i69 i77 ,4o1.sh- ssu sM' O3A o2j *60 ssZ -6 *70 i69 i73 $@ L6 sr$[ i1o i2r i3t y5 O8A $Z Z2 o61 i5h i8AsFW D8 OA4 +0z3 *76'7 f O76 $g T0p5 '8 i6j $k^Ys_( p3 D9 O0A sQ>R1 i5r i6y *3B O94 i9v O78 t *27 *37 O9B O45 *25 R5 *42 $' OAB D5 R4 s?m'5 $FD4 $m l o8u O13 D7 $ Z1 i4e $a sQn O41 O63 i1e i2l i3i O07 $1 *05*93 iAm^^-B skz O58 o8* $0 $= O15 s^b O48 s|` scj i5- $3 i5a i6t i7e D3 i2. i9s iA2 s@ST7 ^z O31 Z1 o2'T7 c $$ $3 o3s Z1 O24 $r O15 o3p D6 k o0v *05i9d*18 o99 Z1 i4n i5a +3 r *34 Z2[r ^z Z1 O31 sd} sd{ -1 Z2 [ +AsNus}% O71 *A0 i31 i40 i51 i7l i8l i9a d oBm i0b i1l i2a O26 +1 *53 $y i18 i50 i7f i74 *53 $g D7 O93 l i5z D7 l $i $s $t s9=L2 c i34 T4 *46 *16 i6s i7t i8a i1m i2i i1m i2b snc +2 i12 i1d i43 i58 *4AT0 i3c i7b ^g ^w +5 ] i3x i38 i16 i35 i7d i33 i5a i3b i38 i2t i3a i4n i59 i1e OA3 D6 ^w ^w i5d i36 D2 L2 l f O46 i7h i8a *15 ^p *71 i3V f $g O76 i5a i54 $*$% $*$^ i33 i1e i7c i59 i37 i7e i3e i11 c $7 $9 $1 $0 i7t i8a i91 i5e i13 $_ O12 i84 i93 iA2 i70 i80 i93 i1b i34 t o0M i5c i52 i7l i8o i3c i35 so@ i22i30i40i54 i5c i33 i5c i34 i14 i7e i1d i14 i11i29i39i45 i0b *17 c $5 $8 $4 $9 *03RAz4 i5{ l ^d ^e ^e ^s o7a O42 i6n i7s *A7 O27 O95 [ Z4 Z2 $* +5 $w r -4 $] O07 O65 +6 o4/ O8B o7(TB i1i i2n i3t o2Vs8f l i42 i0p i1l i2a d OB7 Z2 +5 $* o1j Z1 z4s5x o7m -8 D0 sfw O68 sDx i2o i3k svA i2b *14 *75 O41 ^g i2\ ^cY3 i3l ^z i90 ^z O31 O12 *52 O52 $G i9gs6j l O38 sV#,4i7y ^/ OAB *98sYJ l ^k ^l ^i ^m O3A *19 OB6 s1p *12 $v O42 ^. O62 sda oA< i1c i2h '6i5N^_ L6E^C } r D0 r $w o2j -5 } o55 ^n ^w ^o ^d slW.7 r $h ^9 -2 *60 } D4 swG +0 O92 i14 i53 i5i i6n i71 sCioAA s@` p3l } z5 z4 i0m i1a i2m K OB2 *51 swE ]oBHZ4 i68 i77 i4l i5a i6s $$L7 i1i i2p i3p i6a i8d i7n $i O13 i3h i4u i7a i58 $s $t $a $f $f o2E *62 O04 l $0 $4 $0 $5 ^; ^; O15 Y2 ^e $l $i $u i3o i4p i21i39i47i51 $l $o $g $a $n iAZ$o*71 z5 O48 $s $i $m $o i67 i79 c $1 $1 $2 $! O12 l K ,9*03$; ^J D3 u $7 $4 $! $! i3o i4l C '7 c $1 $8 $* $* i56 o67 i3o i4o $7 $6 $! $! $5 O39 $0 $1 $? $? i8d i9e iAr TB TC $o $a $f O47 O2A i5G sbW O98 [soH c $1 $1 $7 $! c $1 $4 $* $* O93 O62 sJI ] ^7 ^d o2. u d 'D $6 D5 s7n O78 D4 $2 $0 *17 r c $1 $2 $1 $! $y O23 srv ^c i31 ,4 ,5 Z1 ^s i7! i69 ^, ^. $6 $f spZ l c $5 $6 $! O68 ^s $0 $8 $$ $$ $d $e $v i7a i57 $2 $7 $* $* c ^c ^8 i2e o7o $1 $9 $4 $0 *16 O04 D0 f 'B +1 Y2 c $1 $5 $7 $! T1*A8$q c ^e ^a i63 i77 $0 $e O19 $y $0 $b OB8 $( *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 $! $8 $6 $! $! i8e i9r iA1 C '8 $9 i52 i30 -3 $4 ^ksA({ ^p 'A i2& *10 i03 srk O23 $3 $1 $@ $@ [ O52 $z u $2 $0 $0 $3 i3G l ^h O0B o7\ i6l c $2 $6 $! $! 'D $2 $p *61 $gt $p *73 k^@ iBx i1a i78 $1 $6 $@ $@ c ^2 ^f sTX*49 suA *16 '7 siT*7A *37*67 i6" i12 i7e i37 i74 '8 $* *A6i0B sBFi9I $*$) i1e i56 y1KsZ} O06 'B *58 s13 D5 c ^i ^n ^i ^m iBY^ws>W i39 i72 Z4 O29 Z5 iA=s;,*05 [ $N c O96 d iAG $8 OA3 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 O23 *32 O74 c $7 $8 $9 $! $0 $1 $$ $$ Z4 Z5 O29 O83 O42 $c i5Q O43 o6w +7 ^i ] ] f T0 O34 c $8 $0 $! O03 R3 $1 Z1 +2 O4B O43 *14 } $0 $0 $$ $$ O05 o5\ sbq $2 $8 $* $* { *37 O81 $b OA4 i73 i7b i58 i37 $2 $5 $* $* o72 *43 $4 $5 $@ $@ $q $p $5 $6 $* $* l^3^2 O59 Z2 l ] $m ^2 ^8 ^6 ^4 O91 l *51 c $6 $9 $* $* *15*41sYx i1a i2b i3a l ^t ^o ^o ^b i2n i3k i2r i3b '7 $+ OA3 RA [ ^V O34 sVc $2 $1 $$ $$ *02 o51 $0 $7 $* $* O53 ^P c $0 $1 $* $* ^1 ^4 ^3 ^3 c $5 $2 $! $2 $5 $! $! } L0 i2r i3t l ^r ^i C $9 $6 $9 lo94d i1p *46 D5$ysLi iBs$5Z4 i5u i6r i9e iAr iBs s]u OB9 l ^kz2 *A8.8 *06 s({ O29 i52i60i72i82 l $_ D1 sV,^x.7 shn p4 L9 *4A R2 O27 T1srz,A D0 D9 R4i4of l $1 $9 $6 $9 O13 $s O42 *52 t oA5Z5 K *79 O41 i39 i1a DE $1 $3 $@ $@ -9 s25 i53 i7e i53 i7d Z1 d O56 ] O2A *70 swcLA $2 $1 $? $? c $0 $2 $! $! 'U c $/ $2 t i22 $6 $5 $* $* $0 $6 $* $* o1[ iBpoAei9h $1 $8 $@ $@ $5 $5 $! $! s 1 *A6 OB2 i5b i76 i9a iAn i5b i77 D8 D9 $5 $5 $@ $@ s.D,3 Y3 O37 y3 O75 t q $5 $5 $* $* D2 D7 i7g i8a c $1 $4 $! $! sRA*A4 c $8 $5 $! $! s64 $2 D2 D8 O14 ,2 *B3s3) *68*57 $o $v $e $r *5B*70{ c $t $e $s $t ^z z2 z2 s6F lo9) l o81 *45 { p3 .9 y5 oA9 iB7 s3G i5li9* $3 *57 sBU ^f ^l ^a ^h { i16 O64 p3 ^e ^e ^z ^e *21sXa^I ] smy [ ^x ] $x O72 -B u z2 O2A y1 sgv o0m s}=s0) p2 $5 ]o9F $!$~ [ ] ^x $x *48 *47 c $y O95 r C Z5 O82 O09 $r oAg i35 i74 *98 u sc@ k $- $o Z2 i1c R0 R0 i3f i1f ^9 *24 i5i i6a i7n $P k ,9^p T0 D9 i38 i7c T2*03 .3ksHl y2 ^N i2p i3i *7B^UK i9A O6B *14 O2A ^ s(Z K Y5 sa@ si! D0 p1 O21 i20 i39 c ^3 ^5 ^9 ^1 $2 $6 $2 $9 tZ3s}> $7 $9 $8 $1 '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 O5B OA6 i45 i50 i30 i59 T4 p1 +5 ^U O32 O72 s5O *3AL9 ^xi9x *A2 '8 C $1 $0 $0 s.& i2S sZY sZM i60 *36 +6 { o9Z $i $d $e i24 *10 shp O01 c $2 $9 $2 i3S*A3 i0Ps)N Z2 o8p i2c i3o T3 z1 ^zsDBs`a o5B +6 K ^Z R7} i4\ $5 O3A O73 ^S [ ^Y i50 i32 OB5 OB7 R7 R8 p5 i8! i5V i5d i56 i2z i3a *20 y2 O61 E OB1 s6T sky D1 s6P sTc $u ^g $3 *36 *30 ^g ^j O23 ] s8D $q -5 i37 i7d $($= sUN st7 u i36 i1e p5 *92 *01 i46 i58 *43 E O63 sSX oAa-9 l $a $g $e OB8 R1 s_. i3f i75 l [ ^h -7 *74 *64 OA2 u l [ ^b i0j i1a i2s sd Y1 i3e i55 o6l *14 i4\ O3A $5 i8i i9a i56 i3e ^l i9n i2d '6 sHc.B l [ ^x O23 p3 ss3 o3r *78 Z1 ^V D5 i78 i3c slVsY].7 ^9 O72 ^OsG' ^Z ^M sf2R6 '7 o49 $5 ^! o3b t o3b { u $1 $9 $7 $1 i72 i3b c ^y ^m *84$b ,6 T3 c $= $3 $+ $5 *45 $8 l $0 $0 $4 *29+2s(. c +0 $>*4Bc i77 i7c $B $Y sr. O62 $w d OA1 *45oAlK sGX o9G u ^Z +3 i3n i4e i33 i12 s}Qi6Y .5 .6 i71 i32 R4D7 c T2 so0 st) +5 ^g *49.3o2z .1^RoAA s'} '9 $M $P *21 c $8 $? p5sC?$3 +0 d *52 Z1 sa. O41 *8AsWR$u sit s$Asgz$- ^[ s[d i72 i1b l ^d ^n ^i ^w i64 p5 -3 O65 i39 i16 +6 sNY $T k $H O15 } ^3 $v -7 suOs}ys]m sW3y3 *97i6< i2s i3s i4e o2M d $4 Z5 i2u i3t sA+ $e r DA *86 o2V .1 *87 E -0 O26 o52 sh' s0M i9J$< D5 ^' E ^X -1 *42 p5 O73 sO< sm! .3i88 iAO*A6^r T7 i98 +A,B i8u o0C Y4 O29 *A4 i51 i12 s5W *7A DA OB5 p5 c $i $n $g ^m ^v .8o5r i4i -8 D2 OB9 *53 O74 z1 ^O $H o50 i1b i72 c ^! $2 K o8X i3b i78 i5U O57 c $o sn_ l y5 O64 i2n i3c i4e O17 q s2Llo6W *49^M Z4 Y3 O43 } i2b i7l i8o i9v $1 i7? {R8 u ^@ c ^1 $- i3i i4n i5h .3si1 *54 +4 -6y2 o2X Z1 $+$% O1A q i51 i39 [o75 s 1 i13 i1c -2 .4 O15 T1 OBA i7y $x c $s $h { o6S csrHsWP .2o9) O67 *B9 s4i o6y $k $h *37 i2k i5n c $* ^* K Z1 o40 c ^. $1 D2 $M s9d*13 $T $M ^A O26 s1> oB@ O3B r y1 y5 +3 *60 o5A o45 *24 *70 ] O65 i7C o7E .2 '7 K $H D3 *0B .0 *20i6a s\)ss2^, ^7sP- i77 i37 l .5 i5a i14 dc D9^6 i58 [ sUC i42 i50 i61 i78 *16 R5 s.O sy{ *A8 O35 $! O25 l $m $a $n *65*36 O83 *64 i28 i38 sd3 u *41 -0 C ^w D7 o0Ws^xs2v i3a i59 iBr O46 Z2 O04 D7 u C O42 sKX OB2 sg0 iBg sKj *18 O56 t o2K snU$. iA& i79 i3f $& { *70 c O09 iB1 iC2 iD3 s!--5$( i5f i1f Z1 +1 o6^ Z1 O04 O38 p3 O26 t s6s -1 O25 uY2sW7 s{S{z1 o5H K OA2 O76 O32 O21 +3 r DA $b *98i5CiA- i75 l T3 O37 $o O13 o8_ O02 o6f } i58 i39 D2$c c $5 ^2 i11 i29 i39 i41 c o5X *95 O76 lp5 $1sgk$- c ^F c $6 ^7 c $u k'A i1a i2g i3a '4 $4 O62 sbd ^v z1 }siGssA o5> c ^H O32 ^I i7c i56 $1 *74 { O64 i5P O72 s|C i7c i5b i36 i53 l [ ^r O2A Y5 sJU O27 -0 i3O +0 s&{o3P sdcs4V[ O16 z3 sup O21 i62 i70 i81 i94 O34 i1v *72+2 c ^3 $4 i21 i39 i48 i54 i5i { i5RsDI ^`o0ts0< O63 sEv c $9 $? y5 O39 T3 s9G i77 i19 *03 *36 O67 ,1 i3| i0bs3{iAd i1a *37 sgz i0m ^O *02 c $9 $- O59 R3 $4 $# ^N O78 LBs,Oy4 O63 o3r $p L6 Z2 *20 O14 sz0 $u o4o *31 sev $4 ^$ c $3 $+ sCH O62 $E Z1 i3a i4n i5e *60s}2K o3@ [ ^1 $0 c $# $8 $o O81 i10 i3a ^. ^3 i1i i2g i3g z2 ^v s4\ r O84 ^. ^8 s31 Z2 i75 i31 +7 -4 -2 D1 z1 Y1 O85 o3$ O42 iB. O8A $g T1 .3 s6? ^5 ^+ c o1a R0 O13 i4z Z2 ^w O52 i80 o6. *1BTA*31 c $2 $_ +4 -3 -0 D4 $Q [ o17 +C -F O65 D7 i5f i72 ^, O42 sb@ O23 +C -6 s`Gi7D s,9o25 $i -0 *3A O05 +4 +A +6 ^1 ^$ i57 i19 { O46 c o0h u -3 -3 -A s09 O81 RAz1 sQO O27 OB6 E z4 -D -D -E ^1 ^` +A +E O63 o0i swL O65 l o5d { y3 *81 O53 *29 O14 ] $T $, { d O38 o0B i0v '9 i3b i70 oBE ^a ^r ^a ^s +2 -4 -6 p5$rsQR -7 -C O93 sht sav O05 ^3 $3 ^! +A +C -B i7e i33 } o6p O05 o4a $3 ^1 z1 ^D ^B O3A O67 +2 +8 -9 K O72 R4 i45 i10 i7a seg *54 sSG -A -A -C $C Z1 o6f -4 i1l i2m s$s i7b i3b $- O32 O16 d +5 +6 -8 +6 D3 y3 y1o3a i77 i7b s*x c $+ $2 $l,8 +9 -8 -6 O35 Y2 ,5 -3 -6 -A $7 ^! sMN ,A o3y O0A $!$= +1 +5 +4 o4$s`0 T3sgcZ2 s$7 *B6o9m .0 $k o0so7[ t O0B +1 z3 i3a i11 $$$) i71 i14 -B -F ^m srw i76 *04 O1B s_T O82 $3 OB3 +9 i30 i13 -6 -B -B i7b i1a i5f i3f i6i i7a i8n s6! [ $< ,B $. ^9 s8N i3c p3 ] O48 z3 O24 i36 i56 t O31 z1 i2n i3d i4e $6 o2r scy ^- r *08'9 -0 i0C cTBs&P $1 *07 O43 c so0 T7 *9BY2 ] Y3 O95 o1u *57 O69 *65 O12 ,B *20 [ O41 o9s D3 i5& O07 c so0 T2 ] i4- O03 *3B]Y4 i9m iAi O06 z2 i24 i38 i20 p2 k ^0 z3 ] ] *64 z1 O35 *71 l Z1 i6x o3i +4 Z1 i62 sT2 O57 y5 i24 i35 o32 [ O3B R9 c i24 p4 z4 O5A *15 sK` D0 o1q Z1 $2 sY2 +6 -0 -5 sQ)o2G i32 i14 sGB +7 sLys_xo9c *19sl[ ^b O14 o8JE l ] $g i85 i92 c $6 ^2 ^y ^l ^o ^p soM '8 o2t D1 {'B^z s}&^9 i2n i31 i5e r i77 i3c i18 i3a i74 i7f $T O52 sdXo3D i97 iA9 z2 ^b $m $a $r $1 $0 *06 *67 '7 *46 $7 Z4 i6a i7m i8e l^9^1 $6 O62 O61 l^2^2 O74 D9 z2 *71 K *20 d c $2 $9 $! i98 iA4 i58 i31 *03 i1b c $4 $5 $6 $! c $7 $4 $! $r $y $o $g $a i0o i1p O09 *28 O21 i3i i4a i5n ^2 *31 i9a iAd +7 -5 +8 i1a i2p i1a i53 ^G o5i *A9 O57 q i3t i4i i5n c $5 $7 $! *B8*24 r z3 i8h i9o i9a iAs o9* 'A i4/ OA4 z4 ^y O28 -7y1s0L z1 o59 +4 -9 -0 $d l o85 *75 i56 l o2NsfV o1x D9 { O92 c $1 ^4 +3 Y2 i36 i7d s3_p5 ^b -7 $s i52 i4a i5n i6n OB3 i0a C T5 o1o ] i6g i7e c $w $q *02 ^) ^( -6 O74 ] i4p i5o i6Z sNg O94 R8 OAB $. $m $y s]%u $8 O42 Z1 O51 i0w *67 i70 R0 L0 *65 *24 +9 Z2 i4e i5A O6A sdI i1f i3d O06 '9 sjqs@p *57oA?Y3 O72 ^l s0V i1a i58 u d 'E $5 Y5 o5k u d 'E $4 K i1W O26 i4s u d 'E $6 i56 i7b i56 i7e *45 ^r u d 'E $3 o9U t ^g '6 $t *25 i1d i12 su9 -5 s6f sra { ] i35 i42 i50 c ^e ^5 iBB O04 o8K { oAq O23 *51 r K O67 *14 i3r i4a i5n O03 o7@ c d '9 $8 c ^a ^f s5wT9i6Z sA|sFjLA c $8 $2 $! ^f { *14 D1 O75 $6 O34 c c d '8 $9 ^6 Z1 i3d R4 L4 C '9 $7 se3 ] c $4 $? l O21 i31 i1a i54 i5e i37 $i*95*76 i52 i35 c ^b ^8 o3Su +C -B +D k OA5 z2 *50 *53 t ^m c $1 $4 $3 $! ^e ^n ^u ^j k i49 { o4q i4j i5o *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 O6B s,s *62 i55 i1e ^r ^m 'A O43 $+$@ i4a i5m i6a OB3 Z4 D5 K *43 c ^f ^8 s2#*31i1e i56 i35 s6P } *61 i6n c $7 $9 $! $@$- i12 i20 i30 i49 O9A oA# d 'E $1 s-l l*24o0O -6 O75 ^K *15 i1e i12 ssT E E O48 T0 o2M c ^d ^9 s/, ^" t iBf o7f t c so0 T1 o0z o1e Z1 ^o [L6 *07 *83 O74 i1h i2o $! +4 c $3 $9 $! i82 i90 iA1 iB3 -2 t } r *50 i80 D0 o2l Z1 i44 O15 q slc D0 c so0 T3 +3 O03 $w Y3uD8 *01 $f C '9 $3 c $3 $6 $! d 'D $5 O95 O31 $. $t $k i53 i3d D8 o1S O9B O95 spT l *32 *40 z1 ^I o49 T2+AK T0 T1 T9 u 'F i1f i71 *A4s3B -7 Z1 -3 O29 Y1 O6B i4C i8o i9r *3A O93 oAJ O92 'B i9) i1C { D2 i33 i52 svl tY2,5 Z2.1z1 i39 i58 s7E O98 +AR5 i7d i76 $s $o $u $l O76 O52 sGw i72 i80 i91 iA4 i15 i50 *54 $3 OB8 i8" *A5 i2s i3t i4e $+$? o1! T0 *51 ] *25 c i1R o2f*27 O5A OBA *80 z1 *29 O13 o37 i3c i77 i76 i3c y5DB z2 -0 $\ $' s*O *37 O79 $4 ^c Z1 ^g O42 O94 i3l i4y i3h i4o sdS O62 Y2 {svLo5& i57 i5f i57 i5b i50 R4 iAE $r O57 R8i7+ i1e i37 .5^,o75 s7R OB7 OA3 o3{ $v L6 i3g *02 i7c i77 ^r '8 oB% s'0 skB i7c i70 K i3m c $3 $- i5e R9 L9 i26 i35 ,1^s sFX$y $a u i7a i8t i9e r-8-7 T0 T3 T2 T6 sap } oB*Y2y4 i11 i3a i5f i50 -6*60 O76 s8s sqS t ,2 -5 i27 i38 } p5 L8 O92 p3y2p1 T2$u *A2 O13 i3j i4a *30 O45 OB4 { o20 $ME i38 i11 $d Z2 $_Z2'5 s[X O89 '3cs$? D6 $w scEs#O z3 O41 E i4o i5d o4t Z1 Y1 TA y2o8>Y1 ^_ ^g i10 i58 -5 ,1 ^ ^7 i3b i4i i5e i86 i90 *57 D3 +3 $v } O82 ^M Z3 $9 o5j Z1 Z3 $3 O65 o6p ^c ^c ^a i2e i3c l-9 k $l z1 o6x t s.= ^m $z i2e i3a i4m i5i i6n Z2 *53 i55 *47 Z1 $f u $1 $A ^G ^M i10 i1a Z1 $q i55 O91 +1 c i80 i91 $m o0g i3l ] $3 i5e i6r i7o O51 O05 i38 i76 $_ $h lp1*80 i7c i5c O06 l d O38 y3 sl! c.2*B1 T5 o0S O52 $@ D5i12 soC c +0 $8 *53 O52 $x i7y i44 i51 i22 i35 s6z ^l O36 k { $v i22 i39 s0| c ^m ^a ^i i2i i3g Y1 k i8r i9u ,3 $+ O15 R2Z2 O69 ^4 i0n i1a i2r sngo6N*0A o5x o0k Z2 O53 [ i4k i5y [ i6f l sjs +2 *57 ^B $! *03 i0T Z2 O37 i8r i9a O07 s/A O75 T6 i0i C seg u $H +0 +6 -4 o0e O72 Z1 *25 D3 i7g c Y1.7C i64 i73 sMDiAD y2 $L OA5 D3 OA6 .4 O57 $b O45 sCv*B1sL# T4 i4_ ^B R7 sDUy3 $_ Y1 O41 Z4s(g*04 i3a i4r i5d i1r i2e i3e K *98 o8k O23 o8K s89 +1 i24 i10 i77 OB3 -B o8` $! ^7 O63 s24 d i2s Z1 .2 ] o0e *61 i7k i8e R4 *74 i1y i2a *07 D5 *14 i2- $2 +3 snl '9 i1o i2s i3e i99 iA0 [*7BY2 siK z1 T6 O82 OB8 y1 i6d D7 $2 $5 $2 $6 *20 $G s0L o7r O16 k $b k $u -5 K *50 y2 O36 i9s D6 o0t o2e *B6D3] f O03 ^Esa**1B i1d i51 i72 i81 i90 saF c p1 o5p i6u i7n srk T2 *57 o79 o5k -2 ,5 -2 $c O42 k o6f O53 O12 q ] O83 $4 $4 $9 $0 i4u i5t i9& *53svD*73 i9/ o6M u O14 $p O21 i3l swpsGPo1W D4Z4.4 i7b i8o +9 D0 +6 Z4 O85 o30 i1k i2i i1k i2o i71iAV*04 $. $h $k $w i7_ i1l O31 *98 D9 *32 ,7 o5s $M y2 o43 i66 s.+ i2n i3j i4a i5o i6w seq i4' O43 i83 i95 *74 c *12D5^F i96 iA6 o3e { s., T1 i1_ o0w Z1 z3 E O41 o4K D6 o5n t i47 i51 D5 -1 ^2 i42 O24 p3 t o7S r y4 O48 -0 -5 -8 i6a i71 i83 O91 o7s +B +D +C i3c i1i +D -B +D *17 O06 '7 i3h i39 i17 -3 -C ^t ^A l i3f i19 y5 O9A *2A $z T0 s0k ^c s.f +4 -9 +6 i1i i2e i7e i19 o9a c $/$( $) ^1 i2d p4 k '5 ,4 *6A k O26 i1i i2b D0 c O91 i0t i1r i2e i5o i6v D1 i8y O23 ssW i6d o2c Z1 i8j $. o0w { *18 -5 *62 i91 iA1 O6B s_9 O83 } p4 o7e ^NoAE iA=ui9` *93 O07 O78 O74 K ,3 *17 .9*17*0B $_ O41 +4+0'9 O63 Y2 +5 oAr+2 $l ^3 OA7 DA *1B O01 -8sTM *32 *73 ^b srz f O96 z1 'A $tsX- i77 $? O42 i3. sSJ $7 OA4 r $k $o C i0M o7|^7+9 *47 *26 ] O49 ,5 $kK { K *35 *64 R3 D1 l o79 O26 d l '7 $7 O63 $0 o7T r *92o1.TA D7 o2h *78 -A i10 i20 i30 -6 ] O74 o3m ^b .6 C $FspO *B8 -7 OB6 O08 O09 $k $4 .4 *56 O64 E *46 o6j E OA1 ] *64 o5w *18 O5A ^h i75 i1b Z1 *48 O32 ^t ^u ^c i7~ ^4o9K i6l*97 ^bsU8 R6 D5 l*85{ $$ o80 *23 i2w .5 O84 sELET2 o88 *34 oA%o1.] Y5 O94 D4 *6A D1 .AsXU*31 s | OB7 R7 *60 c i54 i3e D4oBJ $2 *32 *86 D4 Z1 p2 *A2 ] o0Y D4 ^y-0*A4 $p *34 c $> $1 i1f i3f $3 $7 $1 $2 O58 Z1 *7A d O46 z1 O34 T3 o11 z1 sUb*64 *07 i8b [ u $1 $9 $8 $4 l '6 $5 i1o i2o i3b $. K o0i *46 Y2 *65 t $F *64 ^j O94 l Y2 sCZ-2,1 $M [ -7 l '6 $0 i1t i2i o0p k i70 i3b ^x p4 $o T0 i31 R5 R4 ^7 c O09 i8i *B3 O45 O6A r -A $e O65 *47 ] *26 i3r i4y { i1a *40 O59 O34 O23 i3r i4i O3A R2 *46 O24 ] i57 i3a spw sZvKoBH ^1 OB4 O3B i7h s2$ z1 T5 O61 ^b] RAD7^K $6 T3 $6 T2 l o1V i8qi3o *37s8OD1 i0v i1e i5a i6m i7e *9BD4*52 i12 i51 i6a i7d i8e Y4 +7 l i8c i9o *14 o1R d*60s,M $o O47 D9 .3 .9$i sa@ ss$ iBw ,7 *34 O61 O24 *75 o8, D4 t O35 u T5 [ K *BA -9p1 sZS o5M [ i3s i4t i5o y5c*B7 i11 i29 i38 i45 i58 i14 s4T OB2 q $9 i5. i4k 'A $l *51 i51 i38 ^i *76 R2 *72 sJg l y5 K O81 .0]$8 ,1-2 *59 D2 *91 *04 O84 +9 i0j i1o i2s Y3 Y1 $x *20 r $# O01 sb. [ iAC c ^ ^2 li6H $l'A s)ho8yo3* c i55 T6 -1 K { i60 i71 i80 { ^! sCA $6 O61 O62 Y1 $Z Z1 +4 i0B ]s_x O36 i1E *0Bo1K iBu *B1 O06 { ^b Z1 $, *52 [ O37 o0b O64 O31 c $7 $$ O61 *37 O94 ^H i2r Z1 c ^g ^n ^i ^k c y3 l i6d O26 s/uD2ssK R5*B6 *38 O26 ^S $* *34*9B 'A $C ^X *31 sjG Z1 i91 i73 R6 $e f O16 ,8 -4 l '5 $4 snG c sej +7 $0 O15 ssts0< $v O24 O23 $g { O84 $8t+7 *76*6A p2 c Y4o1ps7b T2 ^K ^F OAB i4o u l '5 $2 $B ,8 $d i81[RA iB8^jsX\ o5g i7o l{$7 o61 r iAE O57 $r *56 } -6 i7f i72 ^k $t i7Ws5U *2B+AsBC OA2 E i9? Z4 { O62 sy3 $v D7 O21 i2s i3s i4y s8n[ i5e i51 Z3*43 i2v } oBIszti9q OB2 t O02 *21,1 i2s i3s i4a *32 sI4 O13 i3E *68 *85 o5z Z1 '6 $~ o9N *BA O29 D1i4ap3 *09'7sO2 o3a Y5 ts4% O67 i6a r $s $e $x $y i2s i3s i4i l ^e ^d ] ^C O54 *45 $v -6 s0g o5] O45 i6i i7n i8e O25 $u i7a i3f l ^n ^u o6a *36 sIG K y2.A c*15.6 i3e i58 *97t ^+ ^1 i78 i5c o5W O41 O3A $i i70 i1c ^Ksil+6 s@1sCn l '5 $8 K O37 O8B [ O67 c $f $u $l [ ^I o1X c $8 $) i36 i12 sOw'9s\e ^t ^a ^b o21 Y2 c $8 $+ D8 y2 O4A sdl ^S { i3G sMT .5 $* O54 s4H] *74 [ $* T5 z5 O2A i5\ *51 *25 ] *46 ] O24 z2 o1E c $D $/$; i71 [ c $) $j ^s O06 i3K i0,o8Y i0! O81 o2coAq s2j*63E sXK $- K i30 i75 *B0 OB2 svm *13 O71 k *64 *AB*39DB s,h O57 i1h-AD0 sNk *A5T4] i5tsTq o4> i78 i7b $% O52 Y5 O23 c q *05 o11 Y4 l +7 T0 ^! i4d '9 u o0W y4 O53 ^G O48 ^K O64 o2b } i4b i5e i6r oAE$( s0w D3sH} ^9 ^+ $2 ^_ y3.1'7 y1 O19 { so3 i50 i13 i6e sml i1c i70 OB8 D4 i1c i72 s7d o3P] i56 i34 Y1 [ O25 -0 c $2 ^- iAT c i3d i4i r ^k D5Y5 i78*A5 *35 Y2 Y5 *53 i7l i8e i9s i5P O63 *86 l [ ^f *34o9m { O28 O72 *76 ^&cs;* +3+C O5A Z5 D6 O31 y3 O65 +2 *93 O21 .3 sgo Z1 *14 i55 T6 O34 o6n $r y3 O15 k 'A $! t O85 z2 p4 ss$ O87 ^qsV( $($- } *32 t } k c $~ o61 { O52 Z3 [ *31 t O31 R4 O04 Y2 O82 l $i $o $n Z2 s59 -1 *61 *12 O5A l $o $u $t *65 ^k i3@ O81 c $f $u $l u d $5 Z3D6 O01 $n D9 E O19 k-2.A o2t *53 O02 q i50 i33 i73 i1d $z i1l O42 O54 *30 *64 R1 -2 sA0 p4 oA2 c o29 sQlD3 *23 } s-E[ T1.8 i32 i57 o7E { sz| O26 +2 sgb D3Y5 sSQ*B7 p5Y3 i3b R2 L2 +8 i9O Z2 o8o i2n i3n i4y *02 s@2 o8<*7AE i45 i58 *A0 { spno0# O5A k .3 O51 D2 ] -8 O12 i5b i56 *31 sE9 Z1 *69 .2*B4D8 o9w*32sTE O28 q o8h c i8y c $. $1 $7 $1 $1 $6 $3 $2 i52 i61 i72 Y3D7l o4ws\2[ i51 i7d $7 $5 $5 $9 $8 $2 $1 $8 sy8 } o5x i73 i7f i6%sZl O74 O23 L9 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 O35 Y5 K O6A l ^g ^n ^i ^w .B O02 s.8 OBA T7*54 Z2 O24 i53 i39 sDv s9_ Z2 .7$S OB4 K *68 i2d i3d i4y i5a i12 $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 c i4e i2p i3o i2m i3a i4s ^d ^e ^e ^s i5i i6s i71 i3d i4r i3d i4o 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 ^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 O26 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 i69 i76 i1a u i88 l o22 z1 i69 i71 c O24 -2 o7r c o34 i13 i54 c o3c i13 i58 o3F D2 i7f i59 *57 } f O8A ^E *43 sfk ] ] i14 i7b ^c -7 r s8Z *40 *57 ^4 } D5 spz $a *38 k ^8 O13 $g z1 i11 i73 O27 ^M -2 +7 l i7a i33 O06 i2h o2a { -9 s91 O75 $1 r $L $d o41 r $o -6 i0f '9 i15 i71 o3p u *47 *58 i3b i1f +3 p1 Z2 *64 o4a i7f i51 +4 $v $0 Z2 O26 i1i sry i5a i59 i2k } $f *32 o7g *98 O02 syl Z2 s1t ^5 *40 z1 i0F T0 i5H -5 i3e i1f i5f i31 i1b i19 o13 o2S '9 O43 *79 O8B $Vi7? $F o7r 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 O08 c l $1 $9 $8 $1 *31 +1 c ^2 i75 R8 R8 i9ti1\o1t o0/ z1 i54 R5 R5 i71 R8 R8 c $3 $2 $2 *80 Z4 O47 ,4 ,7 -5 Z2 c $9 $1 $9 z2 *23 O91 O51 'A o0q l *02 i4p Z2 o8t Z1 O86 K $6 O15 +1 C $3 $2 $1 O17 ^P y5 O18 c $5 $5 $0 O28 ^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 O32 sDB +5 t c $2 ^5 c $? $9 k sbd $+ o70 *03 O2A sLg c $$ $2 c $1 $) *60 -8 c $2 ^9 c $2 ^7 saZi1k$! s0_ [ *28 '7 c $* $5 c $* $6 l Z2 O83 c $5 ^8 c ^` $1 r Z1 k *46R8{ c $1 ^7 c $1 ^5 c T6 i6_ c $9 ^0 *68 Z1 c $$ $8 O07 o4z +1 R1 +1 R0 r i3t O19 ^; t D8 O24 ^- ^2 c o1T ^_ ^6 $c o4n ^1 ^+ Z1 t [ c $& $6 ^6 ^+ sfr D4 z1 ^G z1 ^f z1 ^v c $+ $5 c $+ $3 +2 $f +2 $6 o3s r *43 suo DAi4&*16 ,9 DA Z1 d O65 O13 z2 *23 spe c $0 $_ $? ^? Z1 o2s $1 ^0 *01 *51 t d t D6 i6w $y i2D c *25 *61 o6g oBmsB4 O42 .0 '7 o59 sbM l c ^b ^f s04 O61 } o78 *83 Z1 O54 t O15 z1 $k ^3 { ssv K l $! -1 *40 $j O02 c D0 D8 Z1 O64 .6 *4A $2 $0 $3 $8 *B4 '7 $6 $2 $2 $3 *21 *73 *52 z1 $5 $8 $1 $8 { o0q o9j o79 *36 $1 *51 i0d O64 +1 $w o7m t O61 *43 *62 O82 p4 *A6 p1 i47 o0S *45 ] *37 ] shf $0 *85 y5 O38 k o23 *65 -7 .6 $3 $3 $3 $6 O62 *74 $0 $1 $1 $5 $, O02 } *35 *50 [ o58 o1n *17 o6z [ l $5 $8 $4 $9 ^m z2 *49 p5 O24 f $0 $s o4j o6Y c ssz -7 o26 O61 d O83 O51 $_ $7 $1 $1 l '9 $2 '8 i1. O02 -6 i7e i16 i30 i15 O42 d i3q k r *32 o3l Z1 ] -4 } .3 o4e o15 O24 $c *51 O13 +1 r o9z E o5j Z1 +8 o3U ssa sUe OB3 O04 sna ^4 O31 +7 ^D k ^X ,6 s91 *4A]i6U sHN t O46 O07 c T0 snv k $@ 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 $i *62 l +5 ^E o33 $R *70 s90 $m d $a O7A T4 i4- sbp i7t T3 K ^1 o1f ^x } ] i7r *32 o7j { i8@ $5 i82 i90 iA2 D3 Z1 o1q c ^* ^* ] *45 y3 $! O76 i5L T6 i60 *62 o8B D6 o6m ^1 u -3 ^E O51 qz4 c ^e ^h ^t ^W -6 ^H *63 slx s3q T2 [ d *51 D5 O82 o2g O36 ^b O38 } p4 +0 Y2 T0 st5 $J $B { i0C i4> *A5 O76 O53 *75 i00 sdD $e *31 u ^D '7 i2h -2 O54 z1 ^M smG c $7 $4 $! O83 O04 ^z $5 $3 $8 $9 sYC O09 +1 $A L6 $M T7 t sBZ ^g -6 -3 i4z *63 { c *76 O54 $a o2d O32 i0r ^z O63 $a q O48 i8v { $7 i63 ^Z *65 *52 o1a +4srS u o4s i4b *45 $x D2 ^6 O02 T5 D1 .6 O04 Y2 -2 Z3 O13 -2 D1 ^Q $Z $9 *36 o0G [ $J *84z4-6 o1e Z1 o74 smr *41 +1 $1 $2 $3 $% Z3 O07 Z4 iAE $r K o9, [ r snw z3sG2 s1R i0x *0A O09 C o31 s2ip4+A ^j } ^ ^y ^m s9L LAy3 ] $O $n -1 K *68 ^k $i *06 +0 *52 $. ,8 ^d O63 -6 i4b $x *45 C o1e i6d { ^W } o5l D6 $t *03 sWs O01 q O0B $Hi6W *42 D1 Z1 o1o Z1 o7i L6 l o42 ^e O46 T0 ^j T7 O83 Z1 -3 $3 $5 $! c o7$ r i1k '5 ^z fY5,0 o53 u ^d $S -5 *79 p3 O65 *90 O26 *62r i4. t $@ OB1 sr] $L -1 y2 saR *80 O59 Y1 ^T $. Z4 $f Z1 O57 p3 O52 O2A sfHoAm s1q l O71 Y3 o1DsYj +4 O74 i42 *46 O93 -2 Z4 *41 i68 $0y1 $E -6 i4q *47 *17o8h O92 ^S ^1 -3 u o2i Z2 Z1 +2 o77$.*41 stJ d O7A $a O04 -2 Y2 o4_ o7s o3e 'B -4 *78 D1 i0Z -5 o69 $+ i0T Z2 o2G o0P L6 ^C o0^ $2 i6a +3 ^2 *63 O47 $s O3A p3 k R4 O6B O19 } O83 o3m o60 *23*B3 '8]z3 *12 i0a o0f ^7 *25 O13 ^I i0S $1 r O41 ,Ao6% *1B^^ *5AY5spr O97 ^O sO; o5D O81 $.$' o5a +9 $/$) O31 *28 o5g Z1 $?$~ +1 i18 $_$; 'Bo8j *18p5 ksovC ^Y*35L5 O04 o10 ^s c +9 i8d $]$= $?$> $$$_ i3* O61 O71 O12 shs i7Ro4%s^y p3u i6a z1 *78 i6k $0 O26 Z2 L4o2Ik o3}L5 ^d*68 Y3i7s*54 L0 +1 $$ $7 o3 *53 ksqP*26 O45 ^j $x k sOW*20$G *47 *34 ,A O48 i69 { D2 sgy i9A*50^@ -3 -6 o2a sml i15 r R3 s1j O05 Z1 $u O31 TA *05LAi2L o5j*A9 o43 $1 t o0f .Bo9F c si1 ss$ R8i8' i4k Z1 o8#sOH o8o Z1 O3B i1W ^s ^g u C i58 OA1 i5Ai8^ siS ^x$p*A9 u o1d sd) i0fY4 o35 Z2 z3 o3j [ r +5 .6sXv c$1$2$3$< c$1$2$3$> ^8 $6 O3B sj ,3 o50 ^b L2sW.i9Y $X [ *56 R4 *61iB@sSn ^X^x^X$X$x$X i3c i37 O43 $k $_$# $c l $c t i12 i1c sBM i3d i39 skg i21i39i47i55 i21i39i47i50 [ o2G [ i0E i0E i18 i57 Z3 +5 O45 -3 i3d i54 '9 T5 $H *60 l i36 i5c i36 i57 i59 i5c $,$* $#$- $;$. *98 +5 i14 i1b $/ i53 $1 Z4 i37 i57 $&$_ $'$( i3e i36 s4m o3D Y2 i59 i33 i32 i5d i5d i55 i53 i1c O45 o4z i1f i34 $z *23 i21i39i48i56 s9% i1b i17 i1d i10 i5e i18 DB D3 o0T i50 i11 oB- i3f i3b i57 i35 o3P l *12 i31 i1c i33 i3b '4 q 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 OB1 } i5c i13 i5| c $9 $2 $6 $3 i6W*B4 sPr csS}Y5 i8M O16 *73*30sLV ^n R1 D2 K O36 y4 sRb o5x Z1 c $5 $8 $1 $8 *50seT Y1o2ly3 $q k sc$ iAb{*27 sJ2,B $X *56 Z4 $q O65 i7c i52 sKR O87 y4 O97 { ^y .8 *38 c $8 $9 $5 $2 Y5 -A O08 iAX i58 i3b -1 K y5l+5 .0z2R8 i4ero1! $g-8d se`T7*80 c $8 $0 $4 $8 o8I$U sxwo8] iBN z1y3 z1$7 sxfl o30 O27 r siGz2*30 *50 i0B s#s y4 ] $n O0A ^/ -1 *31 r ci6T K *85 ]*ABsw! i7c i72 z5 O68 i7f i76 ,2o4u ] *13 ] O93 C *65 O5B *95 $ $* sha soKi2ds1P Z1 o5@ .3 O72 l O95 *91 OB8 p2 OB7 o5t o1j ^ul*89 *20 c *14 i14 OA8 s^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 O57 O3A r f O43 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 O19 Y5 $4 $5 $* $* i5[ T0 TB T4 c $3 $0 $0 $! O61 $+ s6N t c d '9 $0 ^8 *43 c $5 $5 $$ $$ i1v *60 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$& O74 { c $1 $0 $* $* $8 $7 $! $! *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 $! $! O29 -5 c $2 $0 $* $* *57 O15 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 $* $* *0A O06 s|. i19 i71 +6+D +6*A9*61 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 i1e i39 d 'C $6 'D $3 o2} 'D $4 o2) c $0 $0 $9 $! $7 $7 $@ $@ u d 'E $1 csALy5 d 'D $3 C '8 $4 c si1 T3 su3 ciA/s5d sE3s%@ $9 $4 $* $* *45 { *25 $8 $7 $@ $@ i55 i31 u d 'E $7 sP?s4I i51 i36 i6) $4 $4 $* $* c $2 $2 $4 $! z2 ,7 O89 $n $i $g $a $m *A7 OA2 i5H $6 $9 $? $? $5 $9 $! $! c $0 $3 $! $! iA! O56 O81 *23 *16 syoszn ^b ^b ^b ^2 c $9 $1 $! $! c $9 $5 $$ $$ OA3 O34 o1j c $3 $4 $! $2 $3 $? $? ^s*58 O68 ^$ o75z4 i70 i5b [ $z *A7q O03 l O28 *BA Z4 i5e i1d i3- r } c $9 $6 $* $* i19 i77 ,8 O45 *43 ^x +6 l oAf y2 O43 y2 c $1 $2 $? $? $D O26 sT& i6IiAu i56 i16 $1 $2 $3 $4 $5 $6 slo +5 z2oBc i76 i33 $8 $6 $* $* D3sX- *65*94 o7do34 r'9 [i5d *72 OA9 OA3 +6 o74 *80D1 u.9k *07$c c $3 $1 $1 $! c $6 $4 $! OA9 o2v DBo1i *49*67 { i65 o61sPJs5n i38*31o79 $4 $6 $! $! ^6 ^5 ^4 ^3 ^2 ^1 smFZ5si! $2 $7 $@ $@ ^2 ^5 ^6 ^3 o1J OB5 o9nY2*06 c $8 $8 $@ $@ K o3c i2j i3a i4n o3P [ O47 O74 TA o5V O74 *27 $m $a $r $1 $2 $s $o $n $a $m O06 RB ,6o97s4f rl*4B *32 O24 $3 $9 $2 $@ $@ O62 s;- O4A $9 $8 $$ $$ O3B +2 O61 sj- o7V Z1 O37 +6 c o4S OA3 O21 *A7 Z1i5k +4 Z5 O58 i6Z u o77sEq*93 sRv Z3 O26 saisLf i13 i7e sVMs!\ Z2 Y1 O87 ] O29 *92 O97 i7# [ i39 i3d i52 i1d i1a i7f o3Z'B*51 k$U ^z}*B9 $0 $8 $* $* s6Ly3 swp i9uRB O53 O85 z5 c $5 $0 $0 $! $6 $7 $* $* i3,s$b p5*63-8 $Y-7k i5> k ^r i11 i1c $3 $2 $! $! Z2R1 c $5 $6 $@ $@ 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 $$ $$ z2*12D9 $? O26 .5 *16 o3s ^' tz2LB O1A Y3 $1 $4 $* $* O36 $. $0 $2 $! $! oA;K*30 $@$^ $2 $2 $$ $$ i38 i55 $j $a $n i4Ss?' O85 iAG *A6 s^,oAF ^7 -3 *ABseK $z O71 O54 Y3 *41Z1 C o6b '9*08sRU s?E c oA6 ]o2!s[( s'r *37 $R s9Q i3s *87 O41 ] ] i6@ K D6 O16 sIK E +4 siC l *0As;@sqJ saC saZ u i5. o6o o2x O4B { C o54 O91 i0L sYi Z1 $U o5G D6 stR*57 o6t ^u ] ] *13 Y2 y2 s^I 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 O05 O96 C O68 Y2 s5J oAA O15 i30 i55 O63 Y4 *75 Y1 -3T1 $5 +3 *16 ,6 *46 *A3 O43 iAE*27$Q sN3 i37 i55 i37 i51 s]hsBU ,4 i7y $4 O58 sBC*50 O06 z2 $A '6 s6T O17 *97 l *37 O94 $k ,4 sfn *A4 O35 i0rtLA ^6*98 z5o8Dy1 C ^5 $z ^x i4G +1 Y5 $* O4B O64 o3f skn ^p l +6 i37 i70 y2 .0 sMW { Y3 o9i i3e i12 *49 O24 O73 -1 su- -0 *32 i3f i79 *35 *51 T8*69k f ^t O17 u i7R sa5 O62 u sAL $F ,1 Z4 O65 $q i3b i76 C +1 iA7o3F *26 i7t s93Y1^M y2 *57 s90 Y2 O46 d iB4 sWF Z3 T3 O02 ^d.4 O34 -5 O34 -7 *85i6/D7 O83 Y1 O48 s1^ OA3 sY3 i1b i32 L4 +4 i3e i7b sVF i5d i77 sXT i72 i34 sDd-5Y4 i2b t i1e i7f s9^ O5B C*14-8 OA2 ] i96 ,2 O87 set sCs z3 O48 $Z O56 .1 y3 c D9 +8 *87 s]cR1 r $V $4 C O03 sHU o6s E *51 $2 O94 i74 i5b i1e i13 i78 i5b ] Z1 ^f T2 i2_ D7 +7 *03 O6A { s1B '5 O51 s5A sN6 *43 O73 sdk +5 sM! ^l i7h .B OB7 ^< $z u -7 O23 O1B z5 *40 O02 $j i0W o2j shV $v Z1 O57 p2 [ o19 ^Y *65 i57 i34 i1o i2t i3h -4^F,B i1c i51 *60*72'3 i5b i1b { scs +4 Z2 OA4 z1 *56 ,BD0 ,5 D8 sKO ,6 { O38 Z2 TA 'B *21 y4 i4K y5 } D5 z1 K i5A *06 z5 O59 i9L o5Z] sl` i7f i56 ,8 +9 Z1 i0U z5 O83 ^n i17 +6 O76 ^M ] *16 i6V k .B +B *15 *54 +3 y2 .3 O46 sM+ OB7 spY l sfk p3 -0 o9U O61 Y3 i51 i35 i51 i32 ^9 p4 O91 s A cs)CL9 i56 i1e i11 i79 *63*47o2c sng i3t i52 i7b $?$= *21 C i4_ O84 ^i O7A z2 Z3 O45 O91 *78 *13 o0G p1 sb+ +0 O53 O73 -4 $B *56 o5Ss2e .8i3. i5a i1c sy6 Z1 ^' i42 i50 i62 i75 i7' O73 i7b i56 O18 *06 { D8 *79slI i32 i40 i52 i61 o3Y i56 i3c u.4 i58 i5d sy' } p2 O05 u s0GDB sD*DB ^r u $9 +3 $U $S Y4 o1p Y3 *61 O23 +2 i6A u O14 i1[ o66i9g*95 O16 *2B O17 i79 p5Y4 ]i5O seqsKt [ o6N *10 -0 o6p $X O12 k $@$< i0I O53 s1P*09 T3 OAB oA& *42 Z1 D1 *52 ] i52 i60 i71 i84 i12i20i32i41 O14 $M Z1 *75 $m ^M *16 ] T5 i7A ^t O37 o3f $1 *69i7Ns%^ d O65 O52 i31 i7c i38 i56 T3i2EiB" sKI sRMo7^ k O16 oAJ R2 i28 +0y2 sJV K i4S o59 sPS D1 L0 o9hd O05 -4 *76z2 i37 i11 Z4 O23 s&_o4XTB .0 .6 *01 *15 *13 .1 *60 sM4 $l ^O z4Y3 i1e i17 o14 ^6 i42 i50 i62 i74 $w k o0i c O71 sar i41 i59 i66 i74 [ O14 s2V O43 y3 sHW *13 Z1 [ O52 shw ^9 i2+ i7c i79 -1 O24 i5f i56 i0I +2 i4K } y5 ] $8 *50 ^L i7e i77 p1 -2 O57 i7e i72 spE oAn O26 '6 ^Z ^L ^B O83 -0 *39 +6 -1 -2 $XoBn+7 [ i58 O72 *15 O93 ] cp5smh +7 -4 -0 O75 y3 +0 -8 -4 +2 +6 -5 Y3rsCj s1sR3 *2A Y1 O74 ^v O56 z1 i8a $w $q *87 i88 *07 *18 i5y i0r O71 c -0 D3 $n l D4 $# +6 -7 -9 sms O04 i0$ D4 $f $b *56 O7B $[ i13 i70 sfZ $l -1 -5 -4 i5f i74 +C -4 $!$^ i7e i56 i55 i3d $! *45 o0d o1u +5 +8 -7 s5% s5, O9A O17 O4B i37 i52 { z1 Z1 s5f i3e i7f saf p5 O57 *27 *76 i30 i57 ^5 y2 K-8{ t ^d sC% s8F*93*5A ^{ K o0I -A$Ci9o $6 k i3f i73 $u t ^Y*31 o0=sKg i7f i5d i13 i57 '7 o1n D9 O23 +2 -D +C -E -E o5i K i0v o4w L2 } +0 $j z1 r $i l s7. p2 [ slm $a -7 $R ] ssr ^a ^p ^a ^p ^u ^k ^a sA7 i5k D2 -D -E -E *23 i0F i79 i3b i7Ft*2A i7b i77 ^a ^v ^i ^v $t ^p +A -E $'co8L i7e i10 +5 +A +A o3V*96 ^o ^l ^l ^e ^h ^r ^a ^m ^m ^a +5 o2q i71 i13 'A s97 i1d i76 s6w O21 { $" +C -A +C i75 i3b i75 i3f +2 -5 -4 o0s Z2 ^BC $ *84 s7.r$S so. s1u *72 O73 sqs [ O93 *12 } ,4 d -A-4u i54 i3b +1 szl ^k ^a ^k ^a ^k .9K ^# ^@ +4 -C r ] i0Z O61 O8A $) s'f oAV ]rY1 y2 O47 i70 t s1$ OB2 iB9 O24 $u *3B } ^p *05 O05 O23 '6 i5w +4 -6 -0 z4 O07 OBA sCM *32 Z1 $w +4 O92 -8 T4 i7b i78 R1 O23 *42 ,1 ^z i4_ r i0Z ] o7 OA6 O19 C y4 ^/s6S i4g l ] O42 i3U t seY *30 Y2 tL7 i77 R9 L9 -6 *96 *04 ^P i56 L5 R6 c $, O59 O76 *23 y2 $c $r $o $s $s O52 y1 .2 O36 +3 $p $i $e $c $e O47 } ] $9 $! T7i5P ss2 T4 i3c '6 +9*56 cs.! sl9 i52 R8 L8 kEoA{ o3i OA5 O43 R5 -8 $w y2 $Y O93 Z1 i58 p5 $h -2 l +7 -8 O14 T5*A5*17 ^F u y5 $2 i3d R5 L5 D0 t O36 sqe }s5T Z4 -4 O95 i8y*59 $q O86 Y1 i1a R3 L3 i51 R0 L0 Y5 OA9 i4 Z1 l $0 $9 $0 $y Z2 d '2 $1y3 *38$6 D6 o3F $@ O92 O83 oAo -7 i7e R8 L8 t ] { sb-o0k l^1$1 p2 O17 } o53 s/}rp1 i4o +8 iBzud } o5v i92 OA6 $4 -0 ^I sw8 O02 s," O61 s5EspK] o8,Z3 RB O67 '9 c sSa *02 o0m*93 *72Y2*0A O16 O72 k *3A O85 o60 ,A.4 D6 OBA p3 $3 l '5 $0 Z2*B5s`O $mDBl +0 R2 -6 i3i OA4 O03 D6 $f [ D1 d OB6 Z3 OB5 p3 *75 ^, O28 *B6fs{# D5*86 *8A O46 Y4 .6 O71 s4@*65s i62i70i83i92 $g $n $. ^6 suc i2e i3l i4i -2 -C y2 -4 p4 z1 ^x c T6 T2 Y1R4 $y $e $a $h O65 T9 .8 s-k O49 DB $X E $% ^1 $3 ^# O24 ^W $Ts/nl *13 *68 iAp $7 O03 *20 O6A u Y3 o3e *17 *13 i1b i7b i1b i7a i32 i16 -2 *31 u c ^5 $6 i2e O2B z1 ^8 c y4 O53 O19 s4/ O67 } O2A '9 R8 D4 K sah $a u +0 T7*7A$h ser Eo0zo2v i6i svt T5 *67 o5i 'B +2 +D ^< OB3 i9N O2A *B1 O0A *01 se1 i57 i3c i57 i3d +9oA( i7d i39 i7d i31 '9 ^! Z1 -6 Z3C i16 i7c i51 i13 D4qoAZ ^3 -6 saW s;# O23 sm+ s%7^` i53 i30 $9 ^- iBS OB7 $r *61 c $2 $/ sGS +D +D -E sG6 i5n Z1 { i1d T0 ^S *36 r O72 'B [ o4X +6 -D +6 -C T0 T2 T5 T7 i5e i12 O21 Z5 *87 Z1 *56 Z5 O53 Y3 O8A p5 Z4u i9KK +9 +D i59 i5f s0rsyS ^- ^8 O38 T2 Y4 p1 s5b O73 $m *15 *2A O06 { O52 i34 ^s *30 c $x $3 f O2A OA6 c o1A O61 R7 o6o *20 O15 R7*32 i7d i1d O64 sI1 *90 *42 ^g ] i16 i53 i3c i4k } $v ^- ^9 sr+ i2r i3i i4e D1 sn_ i1u i2c sr! *47$R ^Ns\Q i7ks7k o69 D1 $f $r $e $a $k KiAEs-S Z4 OA5 sK%$W ] O64 +6 sTc O13 RA *36 *13 O24 $U O89 O47 i4& L7s7S i3b i1b c ^2 ^# sECsWV O3A sgp f i4g r $< oB4 i34 i11 *43 ^7 l O57 $n $v i1a i56 i1a i55 *25 $p *45 +7 -C $Z *76 i4- p4 o5@ *24 D4 *87 OB4 O57 o69 $f i12i20i31i40 i59 i3c i59 i3d sFA +4 +6 -8 i4o } r O64 *68 O07 } *A2 +2 -8 +6 saD ^- O63 O2A *12 *06 *94s!W c i29 i3b i1c i1o i2m i3m $a +0 u R4i43o9z i2m o52 l $. $n $l i3b i51 p4 *82 *10 *91Z4D3 sre D5 i10 i72 i75 i1d Z4 O37 o8! l $. $m $d *40 $s O59 *85 O46 *50 K c i57 i39 r +1 +6 -9 +6 *15o4S sVN O8A sH6 O03 ,6 D2 C ^y *57 O21 R5 D4 l ^e ^r ^o ^f u i6. sxK i33 i14 { +1 o5f i41 *04 O08 p2 *56*B2$& $. $m $c -A LA O53 ^b syss#^o9g szx *84 i9@ O65 c $1 ^= i7d i51 c $1 ^~ -B -B -D i3a i12 .1 T0 $i k Z2 +8 i79 i1c i79 i1d s3ToBeo7t D0 $m ^i ^o ^a ^y ^. O16 z2 +6 -5 -9 $M $B $M $L y1 $L c $1 ^_ t o8h p1 OB5 p2 O39 c $6 ^4 s +3s;< s4X i32 i3b -4 ss] O98 s.k sgE i2L*0A*32 s7D O12 *32 O14 -8 s'ho8B O24 '8 sae *74 i3C u D2 i1,sZ| O18 T5 p1 +6 u D6 D9 OA8 s}u LA '7 i44 i52 i60 *75 *13 szSi9Ki3! c $i $c O14 $n ^M i2b i3e i0H i1e i2l i4o i3l $6 $1 $2 $0 $? $1 $9 $8 $9 z3 O39 $3 $3 $1 $9 tsC+Z3 Z3 O23 l $7 $3 $9 $8 +9s.[ '6 i24 i32 i40 *76.2 u i24 *32{,A o0S sgL Z3 OB4 sczo9. shY sc2 c $_ $7 $1 $1 syt O8A ^v*0B $3 $4 $8 $3 Es[xo0* $#$. $O D4 c K p1 l '5 $9 i67u o0b *43 i2n i3c *49 O67 *14 $7 ^O Y4 L4R8 o1( u D6*A8 -2i40scY [ u O41 D7 Z2 i2i i3m i4e p1sTE +3 y1 O23 q i38 i7b k*86 i7r i8o i91 oAy O51 D5 D6 L6 r $o $l i0 i6x i71 i82 i2c r .0 O74 i4e i5k *68sG\ o5? i6? i4e i5c $. C *53L6y5 O34 o3y u i21 ^2 i5r i6u i5r i6t O67 sU\ *A6*B5,A $Q c *09 O34 o5h Z2 [ O84 seh $8 *13 *B5swf siz O01 O7A s2h O3B OB2 ^] i5n i6g ] { *56 ^- ^6 iB_*24 o7. -2 i1o i2r i3r $c z1 o07 D2 Y2d R5 Z2 *41 E O7A *01 i9)sC] $($! $$$+ $+$} $;$] i2s i3u O51 O25 i3k $-$/ ssj i3T*32sjs O13 -0 K ss. ss7 O64 O32 i8b i9e iAr OA1 i2D sjr i8t c o2a swr $ $+ u i5Y s0^ Z1 *78 *62 $^$? c T5 i5. i3"*2B i54 *31 i9t iAe iBr i2s i3k *A2*87 +B O89 s;e O24 $g i5a i6y snh *84 O54 i0o +7 svM p2 O45 ^2r$l $. $s $h i5g { oBn [ .0LBT2 i6t i7y i81 i9t iAi o1i ^r +2 T6 *42 ] ^g *B4 O37 i8v i9e l ^d ^r ^o ^c E[-6 i1e i2l i3e i5g T1 st^ .1 O29 ] o42 O4B [ O28 o0d r K i5e o9_ OA7 T5 -3 T5 -0 sKx i89 i94 z2 O38 O32 k p1 O81 -1 T4 sIs i9J oAo i1e i2l i3l i4t i5r O04 ^M l $. $j $p ^M O36 +7 *07 $. $p $h l o8- i9s iAa $. $p $s i4a i5m i6e $p o0b O43 i77 *53 sun K o23 c i3- } R7 o0A Z2 O54 C sgw o6. ^t i3a i39 r i4h *16 ,2 i8a i9d iAe sry ^l c T7 se3 o5! o2l o6 O13 iA) i1a i2d i3a i2m i3s ^N O54 i0Q ] $c $y ^D ^A D4 o3p siE u $U D6 i2i i3n i4k c o3- i62 ^I ^1 ^e ^h ^t O42 'B O64 $9 i3g i4a $/ $2 o1_ z2 T2 i2. [ $m O13 $Z y1 f } -0 O53 $b t [ o7Y i4t i5e i6r *50 c K .3 C ^g C i6i i7d i8e i7a i8k i9e $y o5x ^d O32 Z2 K ^f i2t i3o i4n i3a i4y D2 o7q O46 i4Y c y3 D7 *52 *70 szt i4w i5a i6r i3a i4g z1 O91 y3 $_ -4 *50 $e i1a i2m i3b i36 k i5c i12 i11 i54 O03 p5 '9 l o5, i4w i5a l o5< L0y5+B $q -7 O41 o0U i3f i4a i5n i1o i2b i3b ^e ^n ^i ^l i3b i4i o1J OA4 O13 ^W *80 O51 i1o i2b i3i *65 ^z i2i i3s i4t O81 o6I i5o i6c $5 z1 i8m i91 i1n i2d i9m iAo o62 o7_ -7 i6. i75 $4 i81 i93 c i9- o6d +4 ] ^1 *06 D4 o4/ s@_ i8m i9i i2r i3n i4a o2t *24 i1a i2t i3r c i5# +1 *04 slk O04 $$ -8 K i1a i2t i3e ^Y *64 D3 -1 c i3i i4c i5a T2 Y4 [ c Z2 Z4 sev i2l i3d Z1 -0 o9t u i7n i8d O53 .4 i0j i2n i1o i8u i9r $r T4 i1a i2y i3l i1e i2p 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 *A6 O26 o15 '9 O04 p2 i2e i3n i4t i6d l o1A Z3 y2L0 +B O7B $r i6n i6o i71 i81 i3v i4a ^=*68 i7s ^j so0 se3 u 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 ^m ^r ^a ^f i21 i30 i40 O74 o0g i8s i9t ^l o4h ] $S O37 l *61 D5 i6v i7e i8r T0 TD *05 O42 o2s i3c i6a i7y i81 y2 O42 $- *03 R3 T7 i32 so\ O16 c Y2 o1&s^3 *54 'B Z1 l *69 $f O57 Z1 $S O32 s8l ^P O15 E '9 *83 $3 $9 $! o6n o7- sLf OB9 i3i i4e $1 $2 $3 $^ s8B z2}LB i4p i5e z2 $A i4e *34 k K *15 i7d i8e i9r [ i4= $e O25 O18 +0 i0K c +1 u i5E $Z D2 i51 i69 o78 i4Aszxo8\ $! o6o i3@ '8 -2 $3 i0d $x i4r i5i i10 T2 .3 O82 O42 i1a o48 [ $u sdr $1 ^F O25 i4r i5t $o o6w i3m i4a i5s $. $a $u ssg *75 Y2 E i52 *17 O71 O25 O51 +2 +0 E R2 T2^IsY| i80 i96 ^h y3 O12 oAs O42 T7 TA i2o i3c i4k $& $5 i4i i5c i6e $m i2i $x O71 O63 c T5 T4 $G ,1 D3 i2u i8k i9i i7T t $4 d ] i6a T1 i1p i2p d OA9 i1p i2a O42 O92 p3 $d stm T7 } c $& $4 o7^ss# f O34 T8 DA } +1z2*34 i59 Z3 ^r o81 O32 .5 D9 o5a i0p *40 c o5y K i1e i2n i3a O14 ^2 Y2 $2 Z1 o22 Z1 i4y Z1 i4s o7Q O61 *71 .6 ss5 u i3m i4o '6 i3m i0P s0c *40 o58 i4o i5w z2 *04 ss8 T1 k i2_ ] i2n i3g i4e o1k ^i T6 O41 i8s OA1 '5 $r o1&*B2s2T T2$8*84 i7a ,3 i86 i96 i1a i2n i3k *42 r i0K +1 c i7t i8e i9r O82 c O82 u uR1i5B i4( i5e i6r i71 +3 z2 -9 t O02 D3 OA1 D4 u o7I ^W *75 K *40 o0B *A7*B2 R2 +1 Ey2 i9o iAr *9BsTs i8a i91 iA0 $o k l i6* o59 *30 T2 [ Y4 D1 ^W E sn2 i4i i5n i6e -0 $) ssa l O92 Z1 i1i i2l i3i $0 $D i7! R6 ^a ,1 i3r i4t i5y o03 r i6H Z1 i4i i5a i6n c ^1 ^e ^h ^t ^M sr1 $h^z i7k i8e i9r +4 o7T O52 $O O12 Y3 i8g i91 i7t i8a i6F O02 c se3 T7 O32 $L i7t i8h i22 i37 Y2 i52 E [ oA4 } i22 i30 ^C ^A o0T ^P ^i D6 K i7s k i4Q k sgd $. $g $m i6E O09 ^' O51 i2z i3z i4a T6 i59 sra l *64 *30 $. $g $s ,3 T5 i8L $k sbp i7! i4u i5l s2j E *63 d O29 $z D5 o5< $+ .7 i8l i9o Z1 $O i8b i9a i1y i2n i23 i33 i4i i5o O14 $i ^F ^e +0 { Z3 ^V O15 O28 z3 O96 i59 l i2v i3i i4n D5 i3r o2f p4 O62 d i1i i2m i3p i1u i2c i3a +7 ^G [ ^X *12 p2 r O34 *70shZ $0 .4 +5 D4 z1 o7b *34 i83 i99 O21 stl y4 D7 ,4 $M O23 ^6 o73 *52 o12 k ^4 i4b i5i $v $6 O31 o2U y2 $- O42 $i $z $e $f O05 s.p i8L +6 '7 i3z i7e i59 sLs i1h O42 r ^s $9 $- Z3 i7b i59 O25 $d ^t ^n ^e ^c i7f i17 *76 scv i7f i13 i15 i57 i10 i59 i2r i3i i4a -0 t *36 o31 *70 ^s $b $9 $4 $2 $6 oA7 +5 Z2 ^@ -7 smb l $. $t $w $3 $8 $4 $1 O62 *27 O27 o1j o42 i61 i50 $g ^t o1z *59 *34 K } D2 o2S -1 .2 O82 *54 *37 i7s i8s $$ $3 i2i i3k i4e *31 sns i4e i5r i6o $6 $4 $8 $2 t o7! i6a i7r i8d o8i $k *45 *72 c $$ $5 i2r i3i i4n p2*B2 +2 ,4 +A D2 i5a i6m i7a O84 -7 o8ly2 R7].8 O05 y2 '6 i00 O97 c sA6 *76 O57 O04 z5 Z1*64 O04 'B *78 i8fi1lsLJ *B6 O95 $c Z2 l $2 $3 $4 D1 $0 c $a $8 Y4 D3 oB7 D8 srK O4A *68 O48 s45 O83 L7 sUC^A*B5 *02 s@G O56 p5 ^Z ,3 O5A ] y4 O64 *03 srp ^f o7s O93 *27 *14 ,7 K sqZ l sa4 sg9 sM($z o6n $y svg OA4 $k O57 -1 o44 u D1 $_ l '7 $3 *A5 O35 p1 [ D4 O73 $? +6 $+ O53 r o43 O8B *24 iAp *30s;Rc o20 Z1 $3 i66 oBc.4 *57 *53 l O27 ^2 .5 o4d ^d o64 c $d $1 o6H *0A O34 -4 O29 *12 i2- *43 *56*BA s7- L6*B6 *B3L7 R0 O25 o0v i75 O17 stz o4z *6AL5 Z3 O25 { *A9 i4a i5g Z5 O46 Y3 i4a i5b $- O52 sPm^1*74 i2b O14 sd" $P O78 iBP OA9 ^B L7*3A Y2sjc i4a i5a +A O95 $j d i5m { O13 r i1o i2o i3n OA2 O17 i2d ,8 $L O73 sjp$z '8sfC i8e i91 D5iAa T4iB& $g*3A o4w ^l 'A$Nl E O72 l '6 $4 *68 O21 *80y3 u $1 $9 $8 $2 O21 O5A z2 O93 O0B i6n o1- D4L8 O36 f t R7*0A O23 p2 O82 i0Gs^u Y5 O56 O01 $4i51oA< *4B]u ssBi77*08 i4e i5r i6b $x O79 '8 o7/ O65 $+ i5p i61 i72 D2D9 *B0 O36 $8 O28 su- +5 ,B s0k O97 s_< i99 O01 *12*A8 T2 TB sK# O72 s4| q seW O5B -2 '7 i2- } sJW O92 O62 O35 O25 o6E d O36 +8 p1 Y2 $p y5 O93 oBf O26 $2 R6 O81 '9 p2 *30 i54 R4 i69s]ZD7 sLoT1 sSe] i59 L4 *16 r $# O5A O95 *70 *61 T9*38o7a R9Ky4 i36 L3 R5 Z4 O87 s/x OBA $d sbpi7!s_) ^3 R1 D0 ,8 l '5 $7 [s]ok O03 o48 s-GZ2 ] *6B OA8 Z1 i5e y1 O73 l O86 K ] O79 *30 -5]sXw ^4 i7@ s+>$eshQ .1 *62 $0sqys&V *06 ^h i9ndspP i6esF\ *02*90 $n o2- ,8 *34 fsq$ O32 OA4 E d OA3 R0 O12 O21 O68 Y4 oB2+0 *41 i6s $d ,9 i0t z2 sTKq,7 *67 .8 d*17 sa@ c *80 o0k '9s.8 O08 ^f i4h } o8G [ D6 O94 s/_ O52 DA^a z1 O28 i1_ D5 *59 O04 r O52 D2 Y5 O93 O41 ^j u [ szp OAB D7 O57 $3 oAg } o59 Z3 [ { Z1 $0 sea O38 $7 o7u OA7 OA8 } [ O13 $m li3C D3 c -1 OA7 i3K O18 ^0oA, $i O36 s9v'8-8 o86 *53 OA2 oB; o2Z [ o8g ] i72 R4 D8 Z2 *21 y1 O24 i5e R0 L0 c i1- $, { O01 s7Vo4F q o8m DA *86 O84 ^/ c +3 $w i0b i1r i2e sq- O94 Z2 p1 OBA i72 R4 L4 i9^l $C $D $p ,1 i7e R9 L9 p2 O37 $|sLy $u d O58 i37 R5 L3 ld +7 i1p t i5g R5-5sjQ o6# Z1 i5e R8 L8 O08 O49 +B $t K O82 ^r i52 R2 L2 s3q O8B sB- OB7 p4 O26 p1 [ *B7 O47 $. $u $k [ DA f l *68 o6y c i12 O62 q y1 O32 O24 ssh k Y3 O03 z1 KsA>t *08 O97 r c i8a O51 *48 y4 -8 T1s(i o5k *21 O75 i2x D4^g *30 -9 i1f R4 L4 *25 *45 $p i75 R4 i50 R4 L4 i5a R0 L0 ] *83 $> O65 s3b i72 R3 L3 svoo7o i57 R4 ls|!$w i1e R6 L6 R5 *41 Z2 o4B O52 *A1 O17 *98 O96 OBA O03 $O s3p*89 *2Bi9wi12 *49 O03 q u*9AT4 O04 z1 sYl O42 O35 i3b R0 L0 *9B^N *08sHD R8 -5 o7 O02 p4 O85 ,5 O23 z2 O79 O68 *18s{\ c i8# +9o7] o7s she o2P O61 s#to8> O51 i0w z2 O35 *03 i71 R4 L4 u ^0 ^1 i73 R5 i72 R6 *7B-2 o6 o8o [ O39 *07 o6z O4A [ KoBQ i1a i2u *12 O52 O63 $6 O2A o2, $5 $x +8 o00 *B3i80c c $6 $x *12'7E o9w *32 O32 $t i6e i7y i81 E[svq $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 s.j] s$RswQY5 ]^mo81 u $D $A +1 q E ,9 OB1 p4 d sbh L7RA *5A] $1 ^& -4 o1B o0p i42 i5@ p4 o2f } $Ws}X smt o3p o2f r $r $o $c $k ^$ O12 c $3 $e { i5i c $B $2 sS.*21s3{ C s04 $C $B $1 $k Y4 *1A O8B Z1 } o12 O17 $1 -9 O18 TA rz1*42 OA2 *20 .A K K o2- i1t i2a O82 o3% O56 O05 D1 *0A] O4A i3q ^i-1 -6 $p -2 { i5r sY`i6y Z1 *56 i5m sLP c T5 so0 *5Ao33 ^F ^d o2V*2B ^2 ^x q O24 z4 O84 s5b [ o6t o36 K OA7 *54 O03 i8d i9a *63s^4] sDsDB iABse- O35 *91 OB1 i1f i5f $8 ^* s9Zs+{sXo *51 $z D3 O13 ^@ c $9 $+ ^@ ^3 sZH*35 c $< $1 sVf$Q s!/c sMV O16 .1 i76 i5c i76 i5d +D -7 sT\*2A] ] *72 D4 $As"{^a R2*69shx O05 q ^B ^D ] *23 *03 +1 O52 y4 l Y4 O61 ^q i7e i53 -2 o3P s79 $m o4w Z1 $f l Z2 $7 Z3 O16 z3 i3s Z2 *31 $b sby $! O76 k K ^P f O3A k syp +6 s87 '6 ^y i0c -7 d o1I OB3 Z1 $c i2c -0 O25 k z1 l O42 $2 Z2 Z2 *63 O06 $y O63 *62 OB2 $0 ^w *37 $3 $j o1k $! u i5H c ss$ se3 z1 i29 C ^k *47 Z1 so0 ss$ u $h i2t O23 $. $g u O23 $j T3 r r -0 $1 d D5 $1 d D6 $1 d D7 o7i $l o3z *93 i3a -0 R3 L0 ^s l $g O34 Z5 O35 Z1 O13 z4 z3 T4 sau sa. o2C -3 r *14 D5 q i01 O54 O21 ] u o2U $0 i2y [ $w *43 i6} O49 $r -4 o61 Z1 ^O ^M *56 se2 O01 o42 +2 ^7 d $f *79 u ] -3 $I Z1 z1 t r O12 R3 f O65 t +5 ^r i2o L7 $k k { O51 *41 Z1 *04 Z1 $o i7r o0q $5 { *27 Z2 D2 +7 o57 u i2m o76 ^h O91 D6 $n i1. $. i3. i5. c i6* O24 sat o4w i2m K R4 Z1 O42 +9 $b $w r K d O0B r ^q spc k c $U c $X o21 u $z O06 z1 } z1 sjr ^j O46 r Z2 O73 i2_ l $k t o2i $j o0m d O16 ^D *76 $t z1 ^I ^c O32 t $7 ^4 O34 ^4 i3r i01 o0a O63 Z1 o2o p1 O83 *76 *37 $k z1 o4c $i *10 O41 i7v o9n c sa@ ss$ *40 '9 t i5N O26 i1v O05 'A $C $R } o4u Z2 o0j i0- D6 '7 T3 i6} $r O49 *63 o3q O65 $/ O72 ^h -8 *BA i4w '9 i0q o3g k o2O *01 L1 *50 O32 Z1 o9_ O34 [ o56 *04 *17 i2n scf D4 *21 T4 slj { sdf +8 ^r Z1 i31 o0s z1 O93 i1x O35 O32 } *25 ^z o2w Z1 ^q } ^h Z1 sod ] i1. i3. $. i5. *53 R5 se3 D9 $e L8 ^8 c D1 i14 ^a c O64 z5 s36 O36 ^5 D7 $G l O37 O14 $M o54 u +7 i34 srj o94 u k $e -5 i19 O06 o2- +6 l *32 o4c u u o5U { o61 $2 r $q t l $8 O24 $o u slR *41 O47 $l i78 R9 T1 T4 T5 T2 u sTG *47 -9 $v O69 i3t u +0 L7 O05 z5 O05 z3 u ^M L0 ^z ^W *52 o37 i1n p2 O14 $B O43 se3 si! u o1p Z2 *31 *74 smu i4b o2d Z1 o1z Z2 'A T5 -2 $5 q O5A $j ^k o12 ^4 ^4 *14 } i6p z1 i14 -6 o0j L1 i4y r o5S '6 u i2I p2 $4 $u o7u $0 i2s *A7 '8 O64 [ o5c ^u *71 -0 Z2 $4 O13 s4s R0 } O31 o8r -1 sly $0 R7 i2r t Z1 i6f O71 -0 c $$ -0 +7 ^b { +1 Z2 i1Q z5 O45 r p1 O39 i5# l Z1 Z2 O34 O03 R1 o7c o4a i1x O32 O35 R9 O24 o68 q O09 *46 sIE c *32 $g *41 '8 ^R O43 i4I *98 o8_ Z1 t -4 f O2B c o6M *06 l $m $0 $9 z1 $% O23 K ^2 i6U sU $i i89 [ ^H O35 c so* O63 -0 D9 O16 D6 *9A str ^z o2h $d *15 d D2 ] i4" O45 s2* r k suz *25 *84 '7 o2c } Z1 seu r D4 ss9 i1 C ssk ssT Z2 O32 r *40 t O06 O32 i4w ] $y O03 T6 '7 srv sdk ^v i68 *68 k ^P K ^* $# i2' o5v s'k $m { o0s i39 sut D7 $x t u O14 p1 ssn *45 z5 Z1 O27 o0r swz D6 o0( K O14 '8 O05 $S $_ O53 *95 *5A i1. i3. i5. $. '7 Z5 Z1 o1c o1j $1 oAO c O25 ^, ^1 o63 O35 z2 r +8 +8 O17 *58 Z1 O25 *51 o71 D5 $? O63 *52 O13 p1 i7V -6 D6 K o0( +2 iA5 O38 skf $m t { O45 -5 Z5 O74 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_ O74 szn D6 ^ ^i $+ *74 sa@ si! so0 c ^, t *64 O12 su! iBV .A $1 o12 l $0 +B p4 *51 o2b p1 R6 $3 Y1 D2 *27 *15 snp r sKu O06 ^1 $f -5 i4H Z1 C O75 l *37 o82 $O ^k $b O32 sts O54 o54 o6i { *21 sak -A ^@ O13 i0X O52 ^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 $$ $$ OB2 O64 T6 O24 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 $$ $$ 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 O16 $s $e $p $1 $7 $0 $! $! c $1 $0 $3 $! c $2 $7 $! $! l *32 $g $0 $3 $* $* $1 $9 $@ $@ c $2 $7 $* $* c $8 $7 $8 $! O03 o69 c si1 T7 c $2 $5 $$ $$ O43 ^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 $! $! O25 +2 c $9 $5 $* $* i6s i7e i8p $5 $0 $! $! $5 $5 $% $% $0 $3 $! $! [ $t L5 o3d $5 $8 $* $* c $8 $3 $! $! *32 *41 $g $4 $2 $* $* c $6 $5 $! $! c $5 $7 $! $! $3 $5 $! $! $1 $9 $! $! $5 $5 $$ $$ c $9 $7 $* $* c $6 $5 $6 $! o4z O56 [ 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 $* $* 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 $* $* l [ smb *34 O13 stc i00 o6m O52 -4 sYN $F $c o9w $? ^! i3o $4 *31 Z1 ^V z2 i6d O26 i5j u s^B ^7 '9 r O37 k O69 O16 D4 spb *50 ] sP8 sfM c i37 T4 ^h z2 $u i7' O69 R0 R2 D2 R4 $5 $1 $0 $2 c i02 i18 i28 $5 $8 $0 $2 ^n k r p2 'A K s4G oA2 OB2 O47 Z4 *74 $k $U .2 s7H o9j O14 *24 '5 s6Y *62 *75 *10 $J } *65 s8- z5 O27 Z1 o76 sgd *79 O83 p4 s2I O64 O37 t o6Q +0 ^M $! *41 *04 Z1 ^x ^k Z1 *06 O26 -2 ^3 *70 *76 -2 z1 o5R *46 $d ssk -5 O56 ,3 i2g 'B sV3 *34 $6 sVC sVA d sgr ,2 z2 O34 c O13 O63 *86 y1 O06 K szs O08 Y2 O26 sOP ^Q *12 *83 D5 sFA *01 $H O17 o5K u $v Z2 d O42 [ +2 Y5 Z1 i3s i2r *81 r +7 i7h $2 *05 o6U p4 $J k ^y i3_ *92 O46 .4 [ O45 *50 sMZ i42 i50 i62 i76 ^_ T1 i1s o2l O23 *34 +2 $d z1 ^G Z2 t K *04 s1# s1D s1g sPS k [ D4 d R6 $5 [ D3 i1c i2V p3 *30 o82 { oA2 o40 r o40 u z1 ^W sIA p3 D1 Y5 i21 i39 i46 i59 O13 i5G Z2 *10 +3 $u i0y i42 i50 i61 i79 O43 -2 O02 $" sBE O31 sPM smu +4 sIS u o33 sWL seb z1 sYP O15 p3 O02 '6 o7N i21 i39 i47 i52 sVP O12 *65 $L *60 Z2 *48 D4 i5V O61 ^L u O52 s1H O07 y2 sl1 T5 sZI i1I *34 u i6- u i61 ^3 O14 o3L u -4 $! z1 O12 Y4 ,2 sOD i11 i29 i36 i46 O43 *23 -2 *63 slp Z2 *20 sM7 i59 T6 -9 O16 ^p D1 *05 { i42 i50 i62 i79 i11 i29 i38 i43 i11 i29 i38 i46 { L6 l y3 O36 O54 ] O21 ^V ^B } o36 sls ^a sO4 i7Q '8 +D -C -B +5 z1 D4 *BA iA_ i1p +6 sdp k *3A O36 +C +E +D $v O21 D7 +4 +5 +8 *03 r ^z $P D0 $P D1 +C -3 +C -7 o2k sus [ t *42 +C -D -B Z5 Z1 O35 *58 O91 +0 +0 +A ssj K -9 O16 } o6g O65 *76 +0 +5 +8 $x O25 $& o67 s*@ O31 ^7 ^i K D6 f O18 *50 +9 -1 -4 o2h *15 $d O35 $n sat t o2q o5r $c ^t spk spi o0s d +3 +A +3 i2% D0 T7 O24 O23 o28 [ [ c [ Z1 i6e -0 -8 -4 *36 ^B l O28 ^e +A -7 -7 *23 C *3B '8 $d *23 *61 o7u s2# +B -8 -8 *58 ] { se3 sl1 u o2L o75 $$ +6 } $G ^q K R5 O63 f *98 O27 $x O06 *A4 O86 d *83 O75 i1x -5 +F -0 O24 *36 *71 '9 *71 '7 o0. z1 -0 $u -9 O35 ^f $n *07 +8 -4 -5 O25 D4 C o21 D4 *87 l +C +E +E Z2 $* +6 +C i2h } c T4 sa@ +E -C -C i4k D5 ^T ^C i0c z3 O31 -1 -D spS c D4 t { -5 T3 o4M $7 +D -4 u ^9 ^9 c T1 i1_ $D $9 *58 O25 Z1 ^C ^F ^x ^1 c $5 $b ^D ^0 u ^5 ^5 u $A $A $6 $x L0 L0 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 O53 T2 o3P u ^3 ^3 u ^c ^1 r i1y i3p ^S smd ] *05 o0a O38 -6 c ,7 q O5A *07 ^a iAx [ i9n p3 K 'B r *52 O23 i1K O05 -9 { Z2 +1 *69 o95 *54 o5l *10 t O81 Z1 o39 Z2 O94 *59 [ L6 c *09 p4 { O65 ^6 o61 O76 ,6 i8m O28 i2a *A7 p4 O67 o2F +1 *26 O06 R3 -7 i68 y1 O86 $t O4A snz '7 O78 y4 O6A $p *04 ^t f R1 R4 Z1 O0A O13 *34 '9 $6 O81 $T $C i4 -0 OA1 *24 -2 DB [ R4 o2y D3 O2A saq O76 O63 $h $u -1 $n *15 *12 -4 o0o s89 D0 y3 OB1 [ O5B Y1 O45 O8A { *A5 O73 $o ^, *06 o69 u $1 $9 $8 $6 $s o1b l O0B q ^e $= O31 suw *03 y3 $x $g i7- u *97 o93 ^; $; l O24 $8 Z3 O97 o04 L1 *62 i0z O78 O2A *63 O83 O4A u -4 Z1 o61 oBg [ O32 O34 *84 O68 *A6 O25 O23 o13 O34 E i8r OA9 *12 i2e .5 i6y sur p5 *24 D7 Z1 i56 O82 r oAo O15 i9. OA2 c i15 *08 O4A $6 $V O85 $7 O38 i5- *32 T1 z1 o3f sxe i8X t i5f *03 $j *07 $j *02 O13 iA\ O59 $n p3 Z1 -4 t O87 .8 p2 OBA OA7 Y5 iAj O85 D4 OA2 $v $t r O54 D1 *34 l ssi ,6 *60 +3 i2e ,4 i4a O08 o0f D7 T5 O85 ,5 O12 i5e O53 .6 p1 o8a $8 p4 Y3 O68 y3 'A ssf O15 y2 o3z k o02 D5 D2 T5 D2 snq *24 D7 p3 sNr ^V O74 O05 ] spk R3 OB8 O06 y5 o01 ^d r k O16 p2 f o3s O61 K DA s,j -3 i34 Z1 *24 i2/ O02 OA1 oA6 O47 '9 r i4v c T7 si1 c sa@ T4 z4 l ^o ^g o9^ i5S *67 o89 Z2 o3q o4x p5 R7 } $X ,2 *35 O32 R4 D0 o1M Z1 ^9 Z1 ^8 Z1 ^X siI *53 i1s T2 T5 T8 T9 T0 T2 T7 T4 T2 T6 TA T0 T2 T1 T6 $! o3n T1 T8 T7 T1 T8 T3 T1 T4 T9 T0 T5 T3 T7 T4 TA T9 T3 T9 T6 T0 T7 T3 T4 T0 T3 T1 T4 *45 R4 c T3 i3& c o8! O57 i3- $# O62 sar i1n k $o Z1 D0 $) ^- ^+ ^! i78 o1P r o6l O84 $z *37 ^c $m k ^5 i57 i1d o2a K i1c -6 D3 OA1 O54 $i *60 D2 i2u sjc i1c i30 $N i3R O04 u i42 *12 $4 q O3B -3 $9 -3 $k -3 $n i5b i1d q O38 i3/ '8 o2x ^x i2c z1 ^c O56 i3h } i34 i17 ^m o85 i3c i51 i56 i5c i1c i76 l O26 i59 i1d O34 $n $n Z5 O7B O42 slL o7o o0d i7a i50 i56 i33 i52 i60 i89 i71 $8 z1 f sns *B1 O45 sgf ^r $6 O16 D2 O45 } o6@ *67 ^# O52 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 O74 i1a i2r i3s i9i iAs iB1 O21 o2? *65 o2t $3 $% i5i i6g i5i i6l i3i i4k i3i i4p } o3p ^k l ^l ^a ^m k p2 O62 $J [ i1a i2s i3i *57 i8b $! C o1y [ c $& $9 i2y i3l i9u iAl i1e i2a i3r i1i i2c i3o $. $i $d +1 O67 [ 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 *10 i38 i49 i58 i67 l $. $s $g c $6 $& i2r i3r i2r i3k i2e i3e i4d C T7 $. $k $m d O23 i4p i5e i6r i5a i6t i71 i3k i4e i5r -7 O05 D4 i5t i6y i5t i6t i8u i9n i1a i2m i3m i5m i6o i7n i4h i5e i6r i4d i5e i6r i9s iA1 $u o3w i9a iAb ^h ^s ^a ^w i5a i6s i7t i8t i9o iA1 i2n i3t i4e i63 i79 i46 i54 i46 i52 i6e i7v i8e $. $b $b $. $b $h $f O01 i3z i4e i1w i2a i5y i61 ^6 T1 $d $o $m $e i7, O25 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 i3s i4u i1o i2k i3e f i41 i7v i8e o6u +1 i2n i3n i4e i3e i4r i5i i1r i2y i2m i3m i4y C O31 [ 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 O34 Z2 i1a i2u i3r i7g i8o l ^d ^a ^e ^h i3o i4m z1 *60 r c ^" $" i3n i4s i2a i3k i4e i4g i5i i5r i6i i7a ^s ^i ^d c $) $9 i93 iA3 iB3 l $. $g $g *40 Z1 $h i28 i35 { l L6 $. $m $h $. $m $k i2i i3l i4l i8t i9a i8t i9h i8t i9i i1i i2g i3h i2c i3a i4r i2n i3e i4r 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 O41 l $. $t $h O42 { T6 Z1 i80 i1d i2r i1d i2o o5! t i2v i3i i4l i4i i5r O74 +9 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 O54 O04 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 i2i i3d i4e i1i i2v i3e $0 ^7 Z3 $5 i30 i41 i52 i3d i4i i5e i8s i9e i8s i9i $0 ^b i8n i9a *50 Z1 O32 i7n i8g i9e i8t i9a iAr i5e i61 i70 i6i i7c i8k i4e i5l i6a c i14 T2 i8p i9e i7c i8k i9s i2t i3i i4n i2o i3k i4e l ^f ^f ^o i8m i9o *18 O75 i1n i2e i1n i2t $1 $9 $9 $2 $% i3b i4u i31 i42 i51 i6a i7d i8o l $. $b $e i5i i6r i7e i6r i7e i8a O13 *21 p1 i93 iA2 i3u i4e i3g i4u O53 $H ^c i5u suk ^d i1a i2d i3e i1a i2d i3d $. $e $e i7r i8i i4 +7 i4 +6 i1r i2i i3a [ i2Z l ^h ^s ^a ^w i47 t O05 *41 i59 *02 l ^g ^i ^p i2g i3a i4n syd i43 i57 ^E u ^6 '8 i43 O57 $. $s $l $. $s $d ^l ^o ^o ^w i1l i2u i3e i3l i4e i5s i5s i6h i7a i1o i2l i3a l $. $m $t i5n i6s i5r i6b i2o i3o r $a $m i6n i71 i83 l $. $c $h i2r i3r i4o l ^l ^l ^i ^p *43 { [ i7o i8w i91 i4n i5t i29 i39 i0a i2c i1b i5u i6t i2r i3a i4t i9l iAe iBr i0z i1o i2c i3h i4o i3n i4e i5s i6o i7v i8e i4e i5m i6a i5l i6a i7n i7a i8c i9k i8y i91 i1o i2o i3d i97 iA4 i2s i3p i4e i7t i8o i9n i1o i2p i3p i7o i8t i9d iAa i8o i9s iA1 i4i i5e i6r l $. $i $n i3r i4e i5s i4h i5o i6o i7g i87 i95 i9h iAi i27 i37 i5l i6e i7s i68 i73 i6o i7g i81 i7m i8o i3h i4a ^, ^) o0h o5i i5! ,6 l o7! o0n $8 i36 o49 o1u i2m o0j $6 $6 l $5 $1 $6 $3 $0 $9 $9 } o7? y4 o8h s{wo8o sNP s[}*45l ts=).5 O01 sw] z1 $v O38 *B6$W D0i3es`} l ^k ^c ^a ^b c ^2 ^4 ^9 ^1 R9s"Qi0Q [ ^Q O91 R8 ,B y3*BA y4sW! R6iB? l ] $v -3sS$ s1J ^RsaQ l ^n ^e *13 O27 l ^2 ^1 ^0 ^2 l ^s ^i ^h ^t i7usw% o7li89 c $b $e $l $l o5p OBA *96*01 i7#sHhsQF l ^o ^n ^o ^m us`asV, l $i $l $e s%0D5-4 T6*97 ^@ O46 O91 *6B ^y i8-s"* $. $n $o ^N O54 O7A *A7y5 *02 sKG OA1 ^q*58 ^5 O78 [ss] +7*05 r $i $l $y $1^a O12 svk Y3 l ^r ^e ^v ^o iBko30sGh l [ ^g D4 i1i O69 O38 D8 O82 T2 *A1 ^NRB l ^l ^o ^o ^w s0D l ^d ^e ^b l $i $z $e s[Mo5f L5TA sP] soK O43 iAw p5 O92 Y4sGY T1Y1 z2*35 l ^r ^a ^p l $y y5s%Y RB O04 *A8 Y3iB; l $i $n $e l ^m ^e sJ#l *07 O28 p2 C*4Bi60 l ^9 ^9 ^9 ^1 c $s $e $x $y s#"Z1o0N L7*02 TB O71 [u-8 l $l $y seV^F*B5 c ^a spF*64 $Qs0To9+ c ^Z *25+A O04 'B L7*2B Z5s<) c $m $i $k $e c $l $o $n $g o7? E $z s$t O64 [ Z3 $a i11 '9 s_.i7u $R ^8 i8a O3B ^Ys*y*0A *79s;i $.T4 $gssy sL=o9EL6 sBC OB5 *73 Y3 Z2 .2 *A1$c $D Z1 $2 E$x E$* li6! i8HsQL i4msW6 ^Is[l {sV.u i4o O21 O7A OA4 D5 ,3 *A5Z4stv spR$hDA *80T3oB} O81 O53 s3N ^f O29 s#&D9 O21 o8M t $U R7 p5[ R5 D6 Y3 o5j *02 *61 *87 O03 oA2z2 i8L OA4 +6 OB9 O5B $f D8,A D8{ i4.s'( Y4 O02 ] +0z1*8A s O^h ,4l *70sOu^d oB9$H [*82r ^t ,3 i5giBLsR4 OBA $Z OBA $R O54 k OB3 y4 s<5 o4p K D8 O0B Y4 ] O02 c *43 O92 s`B q O19 OA4 o0X iB.CK ,6 ^z l O45 L6 y3 c O3B O45 d z1 .5 { s`D*43 s"8^g y2si- O13 o8* y2 O39 O41 y4 r sna,3 sLOsS"L5 ,B ^O O81 }$.*39 s\%$rT4 *A8c*12 O45 $k $8*35 [ i6b ^T O84 *A1 '7 O78 q ] O32 +7 -3 OA8 C*3BD8 *75-7 } *85 [D6 *B9*73$t sdmsp} sOb .3 O84 O21 K O73 l$N Z3 O82 $Xs]h ss"-2[ z3 u o21 O89 y1 o1H O05 oA#st]L6 O92 *09 sVr O5B o8E sOUZ4 i8wi6j O17 p5 s|G-3 se6DAy1 $Ks2F o8Ac ^e ] O29 $e u sqg*A5-1 Y1 p3 i8v Y2 q O68 Y2 ,1 *86i1e *70o96$> ,4iB2 O75 ^d O63 o8/.0E o1A O91 ^ls g K oBn sHM O98 o9$ sxq *58 +3 *64 O67 oA(s+go0a OB3 p4 O06 Z5 i8l *8Assx si2 O52 i3w s;V y4 O64 st% O83 sOK ^ds|" O62 E *27 qE o92 O86 $Y ti90 sR?Ep1 O76 i3s *09 *B6*42 OB3 -0 o7esG2l i6fskE +3sUT sJ` O04 O69 O41 s-Fp2 i5jp2 s7(q*4A D3i9} Z5R9 O86 s_> *9A ]sgr oBt O81 t D9 O29 Z2 OA3 o7, ] D5*A2iB? O14 p4 $ *89 OA5 Z1 o9s O93 $e $7 C OB7 O1B ] O59 R8D3sRE OB1 $r O26 s4X $k ^2T8 O78 $d *A4D1 y3 OB4 i59 R2 L2 sF1T8 iA? OA9 [ .6 O63 f*90c o9G D4 O87 i74 O96 sIh q O64 p1KspO s*4Y1 $v'8sd4 ,2 O42 d o2i OA8 O73 sw9 ]sats0$ s`3 D6 OB9 sKO O51 *5A i7gsva$o O53 y3 i77 R2 L2 sGs O61 *58.6$g $ls9i O1B $o u O56 ] s2P ^1 O8A O17 $a i74 R4 s1{R6 i1a R4 L4 s"x O8A R6 q*B8 rs3'*0A OB8 O83 o0c.B o6r*82*96 y2sJy i77 R6 o6rs5[ R7s(b +9 O7B D6 i6isFu *53 Z4 O46 ,3p3sc, t O5A Y5 $r*74 y2s'+ *56 *83 O18 o6rs=W sv<$n DB$x ly4{ Y4 O01 D2 i3f R2 L2 iBksoR *30L8skJ o1aC[ i15 R0 L0 $/T8 i0iC*B5 *39] Ci8bszS *37c s6B s$Ao1H O64 s 6 +9 O78 iA4 o7D T2 O46 i3a R4 R5 i71 L6 o1z{ i78 R4 i1a R9 L9 i34 L2 L2 $_sJ'D1 t]scd i14 R0 L1 sIBs7i i6di9! ssd O61 q i1a L0 L0 i59 R4 L4 i70 R4 i55 R6 i55 R4 .5,3r i11 R0 L0 i19 L1 R6 -4 s{I O07 O12 q OB9 Z2s;\+3 c^c sU.syR O1A i2q s%+'5p2 O12 .1 O25 sw_ O06 *B2 O31 i56 L4 $isj5t '9Z3l [soW $, O65 [ i4f*87 u*A9 o0- OB8 } i74 R0 L0 O8B o8p OA6 i79 R5 i79 R6 *62T5 sMs O08 z3 +9 Z1 O16 *A4^usO' *05] tR7sK4 i74 L6 i1d R2 L2 i76 R4 i3d R8 L8 i54 R8 L8 [ oBI O04 i9hz3sQU O59 k i76 R9 L9 OAB i2? *A7 ,By1o4n i71 R6 sfY*60 i53 R0 L0 i58 R6 ^K*74 *A4 O87 Y5 {y3D8 i52 L4 i1e R3 L3 sRdoA" s#t i83i6X *63 $0 O91 O13 i1* sk3 s?5oAd snr *21 O72 *70 *76 .5 o4i p3 ,A sBh z5 O92 O24 O71 z5 .2 d OAB s2V s_X ^` OB9 s7F z5 O87 oA?RB f O2A *50 C p4 O63 O24 *12 z3 s=Hz2l Z1s\J*63 .0 O34 *29Y3Z3 y5 Z1 } Z2o7x O4A su1 s`$ i3c i53 O3B o9x y3 y4 o0t Z4 O07 k O45 K z3 sNt O49 Y2 O35 L4 *86 p2 i35*08sM_ s.l '9 Y2 sm! Y4 O38 C O47 i10 i76 Y3 $* i9s u '4 ^@ $_$( *41i6c s1- i54 i32 *08K C ,9 T3 O42 i7f i70 +2 Z2 soE O86 i2M *46 $> O93 z4 O12 o4J *19 ] DAiBS sGUsTr*B2 Z2 ^t $l *38 OA5 .3y1sxS *63sz1smp ro1lo8" Y3 c *61-6 O71 *50 O43 s{1o82R1 i70 i31 s{/ o8M O52 i69 *54 z3 s0y *63 O91 $0 i34 i51 OBA stx C [s0c*B2 *36 ^s O82 uo6tsG[ i1@iAE o9M D6 sFO oAK t O61 i5L i17 i7e i1d i52 t $O i51 i1f i33 i3f sU|*19 st$ry4 O3B slO s16 O93 *06 i51 i19 *A8s0/ y4 *06 p3 i1c i6* -0 O46 z3 Z2 i3y,6 s24 d iBp o3e *37 $R Y1 suC i1f i74 shzL4sD$ E*59y5 sDg z2 ,7 [ f *75 $^$* -2 Y2 i53 ^v O26 $m o8d *23 i31 i18 OB5 z2 { 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 O42 q sXG o1J,A Z5 p4 s(e i7d i79 O54 $V i1b i37 $!$+ T0L4s.5 O51 [ Z5 .1[*A5 O48 s@i OB1 O34 *03 .4 O53 O52 C .2 $p R9 ^>sJ* +6 y3 D3 Y2 *02 l L2 *80 ^` O8B *04srx z1 y4 p3 K DB +8*14sXd *08 +7 z2 *24 ,7 Z2 { o0p*62 i7Z[sP@ i31 i54 i31 i56 O01 *50 Z2 z1 O09 *27$)s|o 'A ^J *12 sos *34 o5g O0A i30 i1d i75 i30 i3a i1f s_` i71 i19 i12 i75 Y3T2C D1 o7= i30 i10 ,5 c TB,BZ1 ^" r *63 *83 O89 O3A s!z slT O25 .2 +5 Y4 O01 Z2 *50 ^$ O46 i9` s7_ *27 Y5 O1A O56 Z3 s1` i30 i76 O48 sLh i75 i5d sAy .0 Z1 L2 z2 i1f i31 sQK [ i2J i3a i30 D2k,1 y1 O05 O51 Z5 [ T8 O21 O0A i1b i75 i13 i52 i78 i5f o0!K $, O56 s_6 sar*27y4 $($@ R3 r {se8s0m c ,6 O23 $. O36 i3a i56 i10 i1d i10 i56 i15 i70 ^6p5} i5f i77 i1a i3l i2u i13 i79 Y1 *07 sk* skF k i1_ i3f i1c i3f i1b *37Y1+0 i9& E O21 suE ^3 O87 $G O76 ^f s5(i6R*84 O15 D3 oBhsCI *4A O27 Y2 u i9V 'A oA-s+Q{ swq *71*57 i3f i37 r *47 Y4 *65 i3f i3c ,8o2V o32o7^ i56 i5d +0{,1 ^, O86 i37 i13 $3 o5j i1d i3c R4 '8 sa$E O73 svB d Y2 -9 -A O05 O7A +4 R1 c Z1 $i sen $PoAdr i5c i35 ]u*48 o4W OA8 o6;sE% i58 i36 p1 o0v o4p i0Y $f i1k $! i3d i3b C o2x O94 +6 *78i1H Ki8q O1A y3 i3. ^y +6 i38 *31 +BLA *43 O72 $# sKw sfJ i7b i3d o5+ K ^? O57 R9 i2n i4s i3i i3a i58 i1c i77 ,3 $T i55 i38 ,6 o9n i77 i5f i36 i10 i36 i14 i0Y .4 s.S s'>o9v i51 i7c *37 O45 sZV i35 i7c E o2W T3 *3BER2 o6s *51 *BAsS3 i7f i34 i1c i10 C *05 *BA $h i12 i58 iA. +6 l*49i4O i6U O36 o5e *B7^ sgR p4 *37 *15 sw si; i70 i5f R7*A7*41 D4y1,7 *76oB2 +7 { +1*64 i0b i2l i1a i74 i1f z3 O86 skeZ4Z3 T0 ,7 o2p OA1 i7f i5c E O46 E,2*46 *49i6Hs3_ o59 O21 y2KsxZ i78 i33 i7a ^k i11 i55 +7 *79 oAPoB^*9A r .6 OA6 c sGj OB4 i1b i77 k $6 OA3 O12 *30 y1 *89 O13 *03 $; y1.9*03 O63 o3C L0sS2 i54 i35 }i9Z$3 i5e i56 sA* *45 T4 $"$? o73 O92 i8# *03 p5 O65 *1B*43 i39 i10 O96 Z1 Z2 i57 i1e ,2 sdc sv1 O53 t $h CT7Y1 d *B5 O65 $_ r *43i4j iB-Y2-1 sCg sr| i5c i59 ^i{*13 y5svx O28 *42 *30 O35 T1 i4k i78 i37 i37 i18 i37 i19 i54 i3c K-5*02 d -4 k^@s80 } Y5 OB8 sPl ,2 i7* *4A Y2 O27 i3b i79 s]A ] O94 i50 i1d y3s,B sc[ i4/ OB7 i3f i77 sSc *78 Y2 i3e i13 o6`soK .5 Y1 i3r p1 *26 r O45 i78 i11 i78 i12 O29 Y3 i5b i78 i0d i2a i1r i2EoAY*69 *32 O54 s,ps"Z }*4BZ2 s?wi8C O36 E y2 ,7 i73 i1c Z2,3 *89o2* o3P ^1 R0*10 i76 i1d sbI *6BiAJ O52 $O sKB $&$/ $;$/ $A T7 *67 k O82 s{go1z^T O73 Y3 R8{$B ^z *61 seL C -1 *05 O57 [oA!sQs *A6*43^j -0 i86 p4 so\*04 O37 ss; Y3 so6 Y2 [ *B9tshW i1c i15 Y4sy7} K O93 iBX O83 o3+ *A0 $#$% i1d i78 ui70 sdI T3sTr ]*04 i30 i54 i38 i7d -4 ^l iAa*89 ^M O85 i30 i7e C ^D *79i7q ^L o93 y5o5d z2 O92 cR2 i3f i51 .7 $0 *30,9 O46 Z1 ^m sczk D6 Z2 $) O72 $@$; O18 *21 *67$;*49 i18 i74 *B7,1*72 .3*14K O87 *26 o6d ^X^X^X$X$X$X ^KY5 s(yC ^,svo ^0z2'6 Z1 *07 O15 O06 s*I ^(ssqt s>[o2Dk to7< *95sxk^q iA3Z2 si$L2 *69o97$% o0#*06l i3d i1b i7c i1a i59 i10 oAB $j O52 i15 i54 ^+*49 O6A y1 s2)*A3 s1,i2_ i58 i15 o2t -8 i58 i1e i79 i5b s"9s_m ro8@Y1 O57 O67 t k Z3 OB2 $k $o $m $a $l +9R1 i50 i30 $m $o $m $o $s s%OsgB sq? ^7y1s.z i5e i33 o4&sBu $j $a $k $e $r o4N.5 i6Jsa&s\j i39 i5a *50D8 *72^os6l s0] sTU $y $u $n $i $s *B7oAO ss/ +3 O57 k Y1^b ^b O17 O8A i1e i57 i56 i3d k+5*75 s+t uTB ^2 ^e ^e ^f i1f i3c i12 i77 O39 ^i i5( c d 'C $1 c d '6 $1 o0&s*{k $2 $0 $1 $0 $) d 'C $4 u d 'D $2 u d 'D $5 i1= sM& t O85 c ^8 ^b *96T4 c d '8 $4 d 'C $8 c d 'B $2 *2B o3ni2k*51 c ^b ^3 c ^b ^7 *5A O04 *73sqYZ4 +2 O07 i19 i74 *A7o3Wi9V sGf iB( u d 'D $8 c ^6 ^b i55 i5c i55 i1d O97 ^R C c ^1 ^d c ^1 ^f s9>R9 c ^e ^c c ^f ^7 i14 i1c siP i5e u d 'D $0 u d 'D $4 'E $6 c ^d ^e c ^d ^d sl8 O45 T6 TA c ^c ^a T5 TB O75 o59 o4{ *36+5*B9 T0 T6 TB c ^d ^7 O65 O43 T0 C '9 $9 c d '7 $6 .1 o1V O6B O3B p1 sJc i5b i50 i19 i5a sO- 'E $0 i19 i51 sA? O84 ,9i4M C '8 $7 c ^2 ^a i12 i3e z3s)q i14 i58 Y4R1 sP7siT Z5y2iA2 ^^sF@ sL5 sh'T7 i17 i1c i76 i31 sDwi9)K OA4 o6( O74 -6ksCe O3A sCA *23^Q o8X} R6*B3sES ^+Y5+7 i7a i10 c ^7 ^e T4iAQ$G +3Z4 y5^p sg_o9F *05Z5E s_? O86 u O48 R4 O03 O27 c T5^z i14 i56 i14 i55 i54 i11 i7c i76 O5A *8B O76 Y2 i7a i1d i1c i3b k O34 *0A T7*63L3 O27 *A5 K ^; OA1 i30 i58 *76$xy5 sCRo5R-5 D4i7>y5 s!l o2$ O74 i5f i73 O64 O97 o2Y Y1LA o0eZ3 OA4 sA[ i13 i3a ,A O09 sz1 sFbsz| p1y5 *2Az5 $UiAi s-s O92 s@Z OAB O48 sRc r O74 i0xy2shx Y1stgo0v i3d i53 oBn^$ s0QsGFi6C o0@Y5s}l s , cT1i0* i7b i35 +3 *60 OB2 i71 i38 O14 Z3 T3 ,2T4Z3 i5] ,Bo1# i11 i70 i11i29i39i43 i1b i7c i3d i19 i3d i14 i5b i13 i18 i1f i11i29i38i40 $+$$ $+$/ 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 Z1sdF i5a i1f i51 i7b i3b i30 i5d i17 i35 i7b $'$? i38 i3f i3c i11 i7e i18 i5c i38 $($; i50 i38 i31 i7b i3d i37 i55 i5f i5d i38 i18 i7b i1c i36 i1c i38 i31 i1b c$1$2$3$; $@{i7> O93 *8A sDx.1*60 sjc d O52 O97 O85 Y1 Y3 O6B O36 s,K *83i5T LAR1y3 o5J$ *86 rs `*4A oBas/8+A o7k OB3 sE2 o7w^'o2i s ^*61 sw;-9 q O31 *26 sQZc s{Ro4Z s/' sxi OA9 *98sQ<+A sy$*B8 R8 O89 Z1 ]sQZi3) sj! Z4i7NDB i1$ O0B D7i71 *27 O96 $%$? $$$( $&$( $!$< sD2sqZ p3q*71 $~$* $$r $ $~ $<$! $_$" $_$% $&$# o4>i8EsBa Y5 D2 $^$! $>$. $/$% $/$, $/$= .6^&iAH k*05 *34iB6 ^;,8 O07 O54 ^u O38 OA6 [ $s p3 OA6 O03 p2 Z5 O63 } i8- sh+ OB8 *78 i72 L6 $r dY2 i3. .4 i50 T6 O71 o4s .6 $S l -8 iAv s0) s0/ O41 z5 o02 ] C T2 sjG c d*7B$d p1*34*B8 T7 -5 ^B *63 p5 ] o9u i3s O62 i1o ,3 K $t i2d K snD *89 O31 [ $O o6e y2 o0Y t i92 ] ^t ] ^E o00 $a o2R o0K s&v ^" O61 ^W *46 $@ O92 $s *53 u L7 $3 $1 $2 $! [ o4L $5 O15 Z2 O46 Z2 c K *30 i31 ,5 -8 $# smL y5 T1 $8 $4 $* $* s2j E $8 +2 O45 y4 *25 $d ^mp3 q O67 ,6 c T6 ,2 $@ *05 p5 o6y s2D o0T c p4 i8s o8j t O03 ^l q ] O4B C O86 [ O62 i0P s1X ] iAA Y1 $dC z1o9i*56 *30 o0I ,8 s91 y3 T9 [ c r s = OA7 [ D4 s14 y3 K T7 *04 .0'3*2A O03 Y2 D3 y3 $! +5 ^a o0Z *31 *54 *31 ^D *41 ,4 t *51 o6$ Z2 .2 $R z1 $+ Ci5E i6N $z $E O21 i0g t L7 i59 o62 *35 ^H i52 i60 i71 o7a O52 ^Z z1 $L s72 $l +7 i80 c Y4Y1 *0ADA *73 *46 o17 C O0A o5U s5v ^R spc *20 $k ^Y +2 $Z Z2 o64 $0 $7 $! *15 .6 sW[y4^I o2b i0L u sKs O21 Y4 O35 Z5 O64 +4 Z5 O57 O71 o7h +9 D1 ,8 } s3F i7g K ^msM$Y1 ssY*40 sbS *14 Z2 O25 z1 ^A ^B *21 o7M O72 i0Q l '8 $6 ,5 $5 Y2 O53 o43 $3 O72 Y4 $n Z1 C ^t $J *70 r -7 y2 $! +3 y4 z5 T6 i7S s27 c -4 c sjc $/ .1 ^a 'A ^i ^j $8 $$ oAxp5 O72 T3 O53 q s2B i1@ *10 o43 O61 i8C ^w ^a ^j s6c c Z1 -4 C O43 i2u ,2 $F $z O64 'A ^C s6c Z1 c $A $B TB O83 -A O21 *27 *56 i4-y5 ^T +1 y2 +4 o5d T7 *50 $m o4O *67 $M y1 D3 $! y3 y3 O54 y4 O94 $y } o7K *34 o7f o7X } $2 $# O43 $7 skS y4 ^M i58 i19 i7c i19 i59 i7c i7d i13 sY%Z2 i19 i7e i38 i13 i33 i19 i7e i15 sa5 *73 *30 *26 s75 -8 *70 ^t c Z1 -4 [ -7 $p i11 O23 o54 *26 *63 ] { *61 } ,5 p5 sPF OBA *94 D2 O62 i61 D8 $8 $9 $5 $2 t *60 D4 i1i $1 $7 $7 $3 ^$ O64 *24 '8 oAT sni *08 D7 $# $4 *4A O42 .7 *85 O32 *30 O53 Y4 *17 .0 *35 O64 Z2 *51 O32 o9, l *07 .0 *52 *74 K *17 +6 *17 *05 [ ,4 *38 i2m ,8 *61 +8 sGE .4 sin $2 $2 $2 $4 i41 i66 o59 sLT *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 c $, $2 sj=o5` c ^$ $4 $9 ^! ^8 ^* ,9*BA c $3 $, ^0 ^- ^3 ^+ c $4 $% ^4 ^@ c $9 ^4 .8s)Y c $% $5 c $6 ^9 c $5 ^9 c ^# ^1 c $* $* c ^9 $@ c ^9 $8 ^= ^1 c $3 $_ c $? $7 c $* ^1 sD0 c $6 $? c $6 $- O3A p5 Y5 $@ ^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 c $2 $5 $6 { ^' $/ -A c $1 $9 $8 i6V ^u O67 C $2 $2 $2 f O75 *4B *B5 O09 i19 L1 L0 i11 L1 R0 } O76 [ ^4 Z3dD2 l $1 $9 $8 $0 l $1 $9 $8 $6 l $1 $9 $8 $5 D2 DC 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 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 Z2 d O86 OB2 Z2 iA_^yp2 -3 O94 sCP *43 -1sv0 *97 sv@ O95 sw.,2 *A4,7 D6 '9 l $8 $8 $1 l $3 $1 $1 l $0 $6 $6 l $0 $0 $2 O03 Z5 c $e $4 c $e $8 -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 l $9 $9 $1 l $9 $9 $9 +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 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 { '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 $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 O75 $ 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 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 O65 s'6 *28 i8p ^h*27 p5Y5 R1 ^` +5s^Y+0 K,8E O87 .B +B iBLo9M }t*6A *89-1 $* K sxV $g -4*A4 [ $9 [ q O05 '6 sfs T0 +8 [ [ $9 O03 ^j o1y O21 o53 -6 o0p o2n o4k D0 D0 o3b o4o O34 [ y2 Z2 } $1 $0 $0 $0 o0r D3 o0k D2 f O27 O62 ] ] $n $e O04 ] ] O82 } } ] o6e l ] $f $s $e $v $e $n $a $n $n $e $M O04 smn t ^! Z3 { ^a $6 z1 -9 O32 ^P c o2A u $4 o2o o91 u $W r K K Z1 R4 *21 *78 l $g *32 Z1 i1p k l *04 r i2u '6 o3t c i5K $h L8 ^s i87 O49 sbz *04 $i ^p Z1 i7r $o smP u z1 o71 ^v $5 i53 T6 Z2 o5b ^l -8 o7# } ^1 o4n l f O1B R7 O34 -0 O84 c o4+ sdb O31 R3 *40 s%Ts;j$i u d 'D $3 *65 O14 Z1 ^?sj> s_q *72 K O71 O62 *BA o68 .5 +5 -4 -A z1 o4k Z5 Z5 O56 i8q Z1 L6*16 R6oAU*17 ] o11 oB_sUX f O15 D5 y4 ] OB3 l iA] O64 i7f i38 D4 E [sI7 i4g } -3 Z2 D4 $. $e $c l skL i5e L6 i07 D5 i1b i31 O0A p3 O21 sq7 i0< i5e L4 c o4N D5 $F oB`i5l *74 O49 y1 ,2 '8 *35 ^p smQD0 $9 i95 $w $i $s $e ] o8W i1a i2d i3i K s1S O43 y2 {[d Z3sP^ iAN { C OBA iA2 O59 'A T5 O82 O83 ^b O93 o2` ^u ^g ^u ^A $R r D6 *82 +1 T9 O21 ^9 *53 $hsB) d o3b +E -8 $7 k o9F $t *24 T1 O41 $X i73 i31 $, *54 sgCp2} i1a i2h sBt o5H K D4$e $d o59 $b +4 O61 O8A ^< i71 i15 p1 oB2 iAC s4Q O71 o7h O81 ^- *63 ^e ^( i3) +8*82 i4e ] $J $$ O73 i58 ] $c $r $a $f $t s,mK *09*80$i sbdL3 i59 i68 i74 y2sgz.5 ^s skc +3 *43p5o92 O24 +5 i5f O95 o0M O45 ] stOtR8 snkz2E T7 ssg -8 O04 z2 i9a *69 ^/ O45 T0 T8 TA *40s!I *70 O13 *79 E O24 o3Y *40 p1 O67 $6 OB2 { $Z O21 O37 l i76 $A iAk s`l*70 i6o i7c ^0 T1 *38 'A T0 *43 o9D ] s_?z4c i64 R5 sN4D5 ,9d $ *69 O35 iA* $T D1 O8A *67 ^N i7w i81 sDvLB i3h i4a i5r T0 T5 T3 T8 O18 R4 Z5 sl, o88 R7 ^2 *0A sN7 O26 $@ 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 O58 $I O52 y4 $.$< *96i55 sPi i3g *10 *23 $i r o3? OA8 s#g p2 O16 o5t ] o9Q p5z4*59 c *80 $9 ^g i2o i3g *31 D8 *86-6sUW i40 T5 O91 OAB o84 O12 ^j o51 O04 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 O32 o3K D1 ^` iA1 iB2 L5 sbL $1 E sxDi0xY4 T2 T7 T5 T4 i6* -0 o9DKo7- O24 T1 s7E u $A $D ^c*1B*49 i58 R0 L0 O63 u d OA5 O52 o08 z3 $m O57 f O09 ^8 T1 ck*5A *34 ^Q C z4 O1B q *21 $/ oB;rDB i79 i30 y3 OBA ^Z O37 O64 T4 sbS O94 *13 } O52 $X i2i L1 O28 *92 Z4 i5b i12 T0 $x i5+ *54 O28 se\ D0 i5Z O3A i3d R2 L2 i55 +9 O81 .1 *21 o2j *24 L4D1z4 o5I ^1 i0p i2l i1a O95 Y1 $x o0M ] O45 o2+ *27 $,$# -0 y3 sFosME -1 R0 *13 o1W O9A O09 *5A i77 R8 L7 k Z1 O71 *50 +5 i37 i14 i37 i17 i53 i7c sM( O02 O76 O81 ^8k} i78 i30 i39 i1b C $* swx o5s Y2 i3a i57 OB2 i3S *A6 O38 OA3 z5 +0 y3 +B -C -D O43 +5 $zL8*5B Z1 i41 i2r i3g O23 O62 z2 o6n $9 $B *80*B7 t *28 k O4B *AB O58 -A [ O21 q $' E s i i7e i38 d 'D $2 [ y3 $* O45 $p D4 z1 O62 l $. $l $i $M.B$n o73 o5O *34 o0k *30 p1 i16 i52 .1 O63 i7f i5a Y5 O16 Y2 l $. $b $g ^V K ^g O65 i4A z1 i2r i3d OB3 $O d $c i11i29i39i42 iA& O47 c +0 *74 i2r i3n { .7 O56 ,4 sMp O62 i8J .4 } *09 Y3 o7i [ $% +8 O28 $> r $e ^a i1b i73 o01 l ^S O12 .5 $& *85 K r *14 d 'D $6 sSf c o4V i13 i5a o6f -4 +3 i5g ] i1i i2n i3n -3 D4 Z2 i7P *42 $B D1 i2i i3l i4i *14 *60 z2 o2T ^c T1 o5c T3 '9 $3 ^q $r i4E i0< O97 ]z3 R3*B5 i2r i3m z1 i17 -4 ] -1 t s3t $s $a $n slq $! *24 E *37 c $3 $8 $! *34 $n $Ds#! i3f i78 ]z5 L6 O6A [ slJ -2 Z1 o1d Z1 O7B +7 OBA s78 *02 Y2 +9 OB1 O35 '4 T2 $q i3i i4o i5n O94 $h i16 i76 y3 *20 O54 so8.7 i3f i7c OA7 T1 ,7 $- ^+ *35 $3 T4 TA T7 o4X '8 sET O49 sk> O19 k iBqi1y T2 T9 T3 i6E O74 k q O16 k s6Jswfl i5n i6t i3b i4l c $1 T8 $" Y2 OA8 sJw ^F r O4A p4 *70 s\h *51 OA7 i12i20i31i42 sek O75 { y4 O62 i3d -1 o9u O36 O41 T0 T3 T4 T6 o3a z1 i4!T0 i35 i3b ^x o4m y2 *8B O15 c T2 T1 T5 $)$+ $F +7 -1 -2 C k *27 OA8 i3u i4r i5a T0 T2 T7 T6 $L D2 z1 c ^c ^B O32 ^$ .5 *41 s2p i6o o1p *41 $z i3y i4e sUY i37 i3c i7/ *46 i19 i54 T0 ^K cZ3 ^' o2i O72 ^` *7B snQ O97 sa@ +1 i52 R6 i17 i55 $a u O43 s/w D6 .5 sRU O04 *5A O36 O3A ^M K sex T2 T9 T8 $)$= O61 ] k d D2 o4s $b $b $s O1B Y2 z5 o9J ^R L8 ^8 ^x { { i32 i5! O32 i9m O18 i52 i62 i72 i5- O03 O28 *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+ OA5 E p3sP_ sa@ so0 u i1k [ $M -0 y2 c so0 si1 se3 sjQ i3a i4m i5i O46 T0 *93L5 p4 '9 *21 T1 i7L $k t sszskj ^0 O63 sfk $] o4[ +0 sc. skC O53 ^n o3n *37o7. Cs0W+A -2 T5 i6+ O18 O31 ^- '5 *85 +1 D8 OA6 OB4 i76 i30 *63 } sl- sPUiBd C O01 -5 T3 ^H ^y C +9 szG O0A $W D4 *62 C } O42 O57 s*Q i72 i80 oA7 Z5 l O95 $L*47 R4 *46 Y1 '8Z5o81 O27 swo f +0 O16 c $a $f l $i $v $e O07 i1n OB1 $9 oBs$m Y1 o34 i13 i7d D5 o7M +5 smk $. $e $d $u i88 i94 Z3p4*69 o4z { i88 i95 O85 D2 OB2 +5 ^# i3P D5 oBF i56 i1d p4 s0T OA3 D3 o1- ^a l $6 y2 C $2 q r o5H *04 sry ] sso *65 i5b i33 +7 *59 o5s D6 Y2 f O5A i2z^js5j i5e i58 co4ksU\ Y3 O34 Z2 s1z T7 TB T9 i59 R6 sl9^y *15 i5D *50 *03 $w s2i*73L5 i98 O61 ^b ^4 ^0 ^9 i0@ oA2 i8h i9i T3o4L *64 .1 T7o2J i81 [ o92$l *74 k O24 o9jsOei1a i5e i30 *42d*06 } $d R0 O21 O59 o1V sWS -3 -A -5 O61 o7V i17 i3c stA *57 i3t k ^J C i4] O43 K i2u o8# D9 *41 *47 +3 i04 iA2$P '9 sDz OAB z5 Y4 O79 i1u i2m i3b y5 OA2 i7o i8r i9d +4 { s#c $c $r $a $z $y O52 ^9 OBA O96 O39 z2 OB2 Y2 c K *68 ^tK iAF ^7o8( T6 i6_ O21 $X [ *75Z3*65 Y2c*49 *13sMz *02Y4 i4@ ^M *52 O23 $D $3 z4 O0A O16 r R6 z4 O07 O56 ] O67 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 O56 Z5 scf T6 z2 ^i sEdl *30*86*84 K $d s18 u sM2 C ^4 O69 l c $8 $# ^2 o42 sM6 *69p5 O41 t o0> z2 i7s sQ{ iC7 iD7 iE7 TB O61 p2 i4d s$? i2 E T3 d i18 i1e $gs^; E .6 O03 i10 i54 r $e $s $t *14 *26 +7 -4 +8 *83s'j o5qZ1 $A o00 O48 $7 -0 l Z3 -7 sdlZ2 O21 { l sKc O15 ^e Y2 sZ9 i31 i1d oA` z3 D5 s[DY3 s$Q i1b i33 O43 c $d z5 O64 O37 *90 o0r o2i i9h iAo -1 y3 ^O O48 .7 O25 -2 Y2 o56 i7i i8f $d y2 i7i i8e o1@ ^s i6Q O02 *BA '8y2 Z2 O94 D7 y1R0sP_ -1 p4 O6B *36 u i9a iAr i4e i5l i6i o6y O71 s/A$gs-# T2 T9 TA *54 ^c '7 i11i29i37i44 O98 O05 s2m +A*4AT9 C'B*74 o2D k o0K *02 syO OB1 i0c i5C p3 t O45 Z1 *10 $0 O72 [ l o2f s24 *40 ^G snM i4a i5n i6g ^. *03 $p oBF^wt O61 O1A i8C i5f i58 iBM iAM ,9 o3e,2p5 DB ] O41 l ^l ^i ^o p5 $v T4i6D li0G+A i7b i12 Z4s`" i61 i72 R8 O64 o5m -8 *32 O95 O24 sWX o6y snj o82 *79 i5f i57 i7n i8k s0p Y3 $p *93 O61 o5O +0 O82 sHF O0B i7n i8c i12i20i30i41 *13 D9 o5E O02 o7MlTA '4 $q T2 i61 i71 i81 [ o0M o5I O74 O24 o1- +B O24 i32 fsvh O29 K p2 O71 z2 O31 Z1 o43 d O4B T2 T6 TB T3 o05 l o5= K 'AiA_ u o2i z5 O0B +5 }*89 *24 O36 O08 f $( O65 ssv o5x +9 Z1 -8 .2$o z1 r ^r D9 $J Z1 s0a s%y[D6 o01 i07 *B7 '8 O15 *04 i16 i77 sd1$|.A i19 i3a i3f i38 *21 f O02 sBD Z2 $5 *73 i76 i11 $C $8 $"$_ i1b i5d o0c *86 i7d i34 svjs)5i1E i3a i4d i5a dstv i5c i1b i7r i8d i91 R0 o1r '6 f O45 i8c i9e '4 t c ^6 ^c $m $a $y $1 $4 ^>s.o $c O36 i34 i18 $a $n $g $e $l u ^E ^D ^- O41 s@2 O17 $4 siuy3Y3 O91 stk i7c i51 i8. o7l iA$ $. $k $g Y5sgesSZ i1f i73 t ^1 $2 T5 i5_ i7b i5a *59 D5 O54 o3D $l *53 *32 '8 $# o4No9'se_ O57 ] O5B ^WsVL i1b i18 $Z *9A u { ,2 p2 O17 Y3 i74 i37 p4 T5 seF ^L.8 *14 -7 O81 O25 l c ^o ^r ^p ^i ^m ^e ^s O95 [ i31 i17 O24 sLO l $e $n +7 o68 p2 *71 O47 ^e ^c ^a ^l o5N t +2 i72 i13 ts}= Y5,5sE{ ^@ O5B C s49 f O05 i3m i4o i5n i39 i7d O87 stk c $7 $2 $1 $! z5 } O47 i1h i2a i3n Y3 *9B i88 i93 ^d ^u ^m *71 *62 i40 i50 i61 O34 [ t -6 i1j *09 O54 ^i T4 *16 *47 i8i i9l iAl i5U O14 [ c d '9 $6 $d o11 u ^e ^2 D4s=QZ3 sb/sth l $. $s $k i59 i69 i74 p4 *17 skcsbvsr[ *53 i32 o4d f $p -1 r $b $o $y i8n i91 y3 *21 o72 sln i52 R3 L3 Z3 [ D3 ] $! Z3 s@Bz2 i4l i5o i6v i2s i3c l $s $h $i $p $d *61 -0 R5 O12 Y3sfa shA *75 ^A $= OB5 $e o8[ O94 O2A t *A3o7O^4 i7c i54 i13 i7f O14 $L O08 -0 $G z4 O17 sk! s9)d] sds u p2 O94 O4A i36 i17 ^U t ^v *94 O57 $4 i5- p2 $n }oBJy1 i1a i2n i3e s8W c sSI i2s i3m D4 $c o14 Z1 sd O5A l $1 $0 $6 c ^8 ^4 ^9 ^1 D7 DA ^n *26 i55 i32 ^+ O13 se3 si1 sg9 T0 D5 D8 c ^b ^6 c o5W sNJ i1e i18 i4r i5d *B3RA Y3 OA5 *60 O03 p1 o5v *20 '4 $5 L8^+ '4 $7 i59 i16 s7h D8 z1 '4 $2 ^X O78 l -5 i79 i38 i1i i2t i3t i3p i4h i21i39i46i54 sBD i3p i4e i2= O31 D3 i52i60i73i82 i1k .2 O42 +6 R5 { -4 o35 O2A $m $t T3 T6 T8 ] O52 D0 DD Z2 $0 i3SL6i8d *87s_&Z4 *68 O0B sDI Z2 o2m D5s70 O27 o1y i03 K o6H OB7 q O65 O31 D2 T6 i3i i4s i5s L5Z1 D3 Z5 c $d $f d 'H $1 ^9 z4 *46 $_ D4 i50 i7d '7 d L7C saX i32 i1d sa\ i3i i4s i5h o9y -5 c $e $s $t i1q { i2e i3e O61 o8g l $i $f $y *83 O63 s2j '7 i34 i42 i50 oA1 D8 Y4 *71 } Z2 O71 c $8 $0 $9 $2 Z1 +9 i85 i78 i7f R4 [ s;= O21 *86 i5o i6c i7k .B*87 l ^r ^a ^e ^b oAE^*i5l +6 i3j *41 *86 *42E sx4R1Z4 i1f i7f iBu O05 *80 t i1f i75 i8k i9e iAr i47 *47 Z1 o5C l $1 $9 $8 $7 l $1 $9 $8 $2 r $a $l o4~ Esq!-3 +7^Gs'l i31 i5d $y i1p K O08 c s5( i2@ '8 O41 r *36 Z2 $8 p2 i9! i7d i54 O64 Z5 *46 Y3 O57 ^' O32 k } r o6C O13 i3b R1 L1 Y2*41 f '8 i5m k ^q oBl d ^6 *06 O62 *B9*6A so0 [ o6L oBgsEG i6n i7g i8e i8k i9e iAy O32 *63 O91 i8q Z1 i5m c ^. O25 p3 } so_ l o8- OAB i2a -9 $0 *35 LB O16 s",^) T5 T7 T8 E d O04 s0Y Z1 O18 c ^8 ^e i7i i8l i9l i2o i3m i4a +4 +9 +6 ^e ^c ^9 ^4 $Z D5 o0b r z2 T6 T8 T9 ^5 C ^B $. o6g $b l O38 p4 l ^f p3 p1 o9. $1 O81 Z2 o0b o2u o3e i34 i10 c $. $f $r sHrs-G] s<9o8g f ss0 $<$, i2a i3k y5DB-9 ^jY5 c ^O i7d i52 *01 o8s [ R2 d O4A Z3 } O85 r *35 [ +2 O36 .1 ^1 ^x Z2 s52 o0D i6r y4 $u ^i ^k ^u ^s ^t ^_ O12 ^- o24 *20 i58 R4 L4 i6e i7r i8o i0f i1u i2c O35 Z3 Z3 +9 { l O21 Z3 +6 T8^2*A9 s,C$c*82 i5k i6i i7n s>+^Eo33 l ^y ^a ^w i33 i7d R6s!l $$ *54 'B *35 O52 u si; ^y ^a ^l O42 oBo s2C O71 { $! $9 i4- o0e Z2*B7*8B ,B^K O31 O78 p1 o0l Z1L8 o5^*29s|t i9y iA1 *95*6A $Hp4 $. $i $r E^A d D7 +3 O36 i87 p2 o8- i39 i7b sp9 i8is?/ D1 i5n i5d i1b spS O1A i7f i3e $|iA@ saeo0v ] o7c K O3B [ $! $6 i5a i6p i7r i5f i13 p1 O65 O31 i53 i36 ^x*7B t sLG .3us!G *65shc ^l ^l ^o ^r u ^d ^a *20 $2 s+0 i3a i18 T5 *43 p1 o0s i3a i17 O54 +1 *71 ^d z2 K ,7 i1c i17 *41 k { i15 i1e i9&*43 +1*08 ^_ ^@ } z4 z3 *95Z5 O51 i4A snM o83 saz Z1 i60st]oB> O92 OB7 R4 t *B0'B -1 i1_ -9 oA0 $?$) *72 s{n OB1 s@6 l $. $u $k i10 R2 O16 o0H Z2 O67 K *17 O41 +8o3v i0b i2r i1a y1 D6 O42 s@? OA2 K *59 C $b *34 i7t i8t i9e ] +9 O14 u iB$E Z2 o0h i56 i18 i6N $z O26 so0 ] { '8 +3 $Y D5 O23 $h $u $n $k $o i11 i74 s}Ws>{sJ0 i5f i75 c $1 $0 $3 OB1 .A .3 c $3 $2 $6 snIs@/ c *25 O13 *86 $3 O5B ^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 d T0 OA5 $o $e $s i7d i15 *52 ^s } o4a *34*A8 ^W O05 $2 r $m $a $n i3c i7f -2 ^e p4 *64 ,9 $s [ o2Y l $. $n $e $t y3 o1a $0 *74 i5od $2 $$ Z1 *21 $1 D9s 5*AB sibo0Z L0 o2a OBA ^o i6% O71 i2[ O54 f O84 i13 i72 o5u O96 $j $u $n i1c R4 L4 { *31 *51 st1 u s6c Y1 D8 D7o1L i5r i6i i7n O43 O31 $x i4a i5s i6t D3*26 O23 +9 $J $a $n $1 o0h $a i4a i5s i6h sXpsx1] l ^i ^m ^e ^s D3 R0 +2 t *57 O3A y5 $O { O25 Z2 c O91 s92 i1e i2r i3a c i8- s6^RAscg sbU D1 ^s z2 *13o7vs_w $! *24 *50 R1k k '7 i7U u o7S O68 TB c $1 $9 $0 o97 [ O21 [ $X O8A z1 ^I i1o i2u i3n i0w Y2 i57 i5c i2l i3i i4p sJW s]o'8 $6 $5 $3 $7 O82 *27 OB8 K i3d i38 ^! +4 *B6i9k^r i59 R6 L5 i1p i2r O83 DA sVuk*05 o4v O01 z1 o3z ^W $2 O05 i3f i58 i7a i81 i90 r t O41 i33 p1 ry4 $e i7a ^iT8 i12 i1f -8 o5m O72 TA *03 sjx O62 *13 u ^c ^a $LoA; .0*3A $m ^1 .0o4e *19$/s-b c T4 -4 O76 +B o12 O48 *02 *8A O92 c c i23 sb3 i7c i8k -3 sfk i18 i72 s@T O08 z1 sIZ.2R3 $?$" i50 R0 L0 o53 $e oBZ O5B E s RT6s&Q i6N O26 $z *04 T6 O63 $a o00 i5F O31 $l Z1 o8c o57 '9 i8x OA1 sZb i79 L5 t Z3 +8 d i42 ] ^> u ^0 ^5 u ^c ^2 i2f i3f *39 '7 sDMs2Xo7F o6U +7 O43 $x O31 i2o i3v i4e D0 R4 i9s iAe i6a i7i c i49 T5 ] O35 T3 } i5p i6i $w o4m o2$*B1 $1 ^> i4e i5r i6a ]RA Z2 O26 -0 o4l c ^1 ^c *B6z2 $g -0 oB$Z4*24 sIR sacY3 *65$+ i1rsW5o0! c ^7 $9 i0s i1u i2p $3 i9= .1 O46 +8 OB4 i8< o1n ^t *62 *09 O37 p1 i44 i3i O43 c ^8 $6 i8c i9h iA1 l $l $i $k $e i1o i2m i3b i1h i2i i3l i7a i30 -8D6*29 Z5 OA5 u ^0 ^a s{5^.sST i1h i2i i3c $8 ^. *58D2*B8 Y5 O5B *05 T6 i1o i2m i3o ^3 '7 *A8}*10 c $0 $? i30 z1 ^o z2 L3 O05 c $0 $; .1{ i0f i2r i1e ^z ^2 ^a O54 u c $$ $0 se3 si1 ss$ $. ^0 o4v '6 +A O45 c ^5 ^d }s|li7. o0a O46 ^@ ^8 o3uiBC oBV i1f K O4B O04 $x *71 Y5'9 i3a i4n i5o o0o +6 $@ ^4 ^, '8 $2 ^/ i3n ^T *51 swB.8 f O76 T2 T7 T5 T3 *57 i3s i5a i6n i7i u i8N i1d i37 y5 Y2 O26 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^- O42 z1 i9c iAa s`8]+9 i3k i4i i5e *41 d smt O81 K ,3 [ [ i8j $b $e $s $t c ^! $8 D2 O32 z2 ]dD5 i2t i3m $. ^5 sf< +2 $7 p1 sbp *89 o8e *25 *13 c } $X O52 R5 .8 O71 $- ^2 z4Kq .0 +5 O23 i9U,B $! ^6 u ^4 ^a snxs.6 sFa L6+7 fp4*71 l p2 K i2t iAX O59 i1e i2n i3i i2n i3t i4o $. $g $t O71 O04 $f ^4 $b l { *02 r $m $e $n O8B O57 $l $8 D4$Y,6 $. $t $c O06 O45 $$ iAB i1w i2e O06 y3 *76 i9A iA6 $0 ^! $% O51 $l O35 *14 .3 c $= $9 *62 o12 *45 o4M .2 o32 ^9s&_ sg3-1 { *75 o0v +1 o2u R3 ^B O67 O04 i17 i5e *40$2scN $F $M i72 i83 i92 $6 ^- i0k i1a i2k $7 ^& $0 o6( OB2 *A4 t c ^8 ^d ^1 ^& *50 o7. i2c i3k i4s $7 ^1 o28 z1 i14 i73 i54 -8 c $I $b *73 -8 ,2 oB< c $+ $4 c $+ $7 i9e iAl iBl u ^7 ^0 L7 ] OB9 Y3 y5$]s@F o4k i62 ^2 ^+ i55 i30 c ^6 $1 Z4 O8A c i41 T5 o0h o2l u +5 O81 o0u O53 i9s iAt sxZ o4g u *76 p5 i3e i4p c ^0 $! sxg ^lsWR -5 r [ ^f .A O37 c $1 $2 $8 $! i4f i5a c $) $0 $3 ^- Y2Z4 sAU oAO {sVO+9 o1& *13 o4D O21 $. O63 i33 i11 s>/*A7sJY i3b i4l i5e c $7 ^4 s;M OA4 *24 c $( $8 +8 O08 c ^% ^1 u ^4 ^9 -3u*29 s`**9A$` s(!$z L9s$a^| -A O9B i33 i17 i4o i5v ^2 Y1 OA1 p1 O8A c $[ $1 c ^5 $9 ^s p1 c ^? $1 c ^5 $0 *62 O46 R5 O31 c ^5 $3 } O12 k *72 O39 i42 i50 i60 i1n i2i i3m i3l i4l i5e c $+ $8 i12i20i30i47 $M $a $r $1 ss1f o32 ^c *75'B i2o i3n i4e i2r i3a i4m *68iBg O54 $O i0W *41 o0H '9 i50 Z4 *42 ] O31 ^,s&Q sE(} *57 o5R i4| ^G R5 O81 D4 K i32 i41 i52 ^s ^s ^i ^m p1 O82 sL+ i1m i2a i3n o8= O0B z5 O72 R3 sDgZ3 ^l ^e ^g ^n ^a i2a i3t i4e *78 $w *50 *03 O27 R2q*09 y1 *8B O86 R3 -5 o2- T4 O14 i6{ O24 y1s/|f i38 i15 O62 z5 O27 O1B z5 Y2 i22 i30 i41 i56 i2= C '7 $6 [o37st6 i14 i51 i16 i78 O02 O46 ^K o6H y5 O75 O02 i56 i7c i92 iA0 O82 O13 l $0 $1 $3 -1 o3P i75 R2 L2 Z5 q O9A O03 *76 Y4 { o5z *15 ^p szi } s_R$g ^. $p *03 i3Ji2r s'2*4BsG3 f ,B O87 ^a ^k ^i ^r ^e i1b R7 L7 iAFsP\ $( O51 o4K [ Z4 OA3 u i5- Z2 oAw O24 i32 i40 i53 i62 s?V ^T O53 u *91 O67 O13 o2S c oAm -7 TA O8B r Z2 *05 R4 D6 +8+D i2r i3r i4e ssj i5r *42i5x*34 i5tp5 OA6 *A0 } +1+E i54 i38 s0S Z2 l y4scv*20 O07 $n O05 c ^uD7 i3e o2f $d $e $v $i $l R0 ^g D3 t Z1 oAQTB [ *10 y2 i71 R3 L3 $% O09 i79 i34 -5y5 i4Ht *B0sE`s stx l +5 Y3 O0A s3s O07 OA9 ^a ^m se2 Z3 [ Z4 *42 $g T0 O47 O53 $4 o96 [ sD_ i2m i3b i4a Z3 Z3 O56 i3b R4 L4 $=$\ D8 o8? i32 R4 L4 i14 i3c $j $a $n $7 *B1^$ *87-A*20 i1b -5 O4A *A2 C sP. OB7 i1d i77 ] oA1 $h $a $y $m $o $3 o93 Z4*A4s1s o41 i3H l *39o3! sIV O3B OAB l $s $i $o $n O34 i5] z4 *4BiBc $1 Z2 O81 O92 +6 so@*A9R6 i4n i5e i6s { o1i *13 slk*87 Z3 { '3 z5 } o1Oi7uE .6*03*79 y1s}K O35 $5 svt i59 R3 L3 OA7 ^I *46 O51 sMv *56 Z2 *A8 +A $^$) R3 +0 Z5oB|D2 ^, $, sAws@0*70 i5a R8 L8 s9 D2 $! O18 sU"-0 $&$) *59o3e $*$> T1 i3m i1c i5b *40 *35 z1 $S Y3 o0H R4Z2 ^t OA8 i4, c $w $o $l $f i7r i8s i91 o5z O03 s%7*6A *06 ^w i0J O65 i18 OA5 u ^d s4b -3 $t t Z2 i3y o4l u D4u i2r z1 O38 O6A z4 y2 p3 slt T6 z3s=Co9e i15 z1 u $B *73 o8n O02 ^y i87 i91 ^9D7 s8.i3E ^# O62 ] szZ $?$$ $. $h $u *67 T3 $g i0r *59o8TsqL O24 K $p R1 ^p sAj O0A *BA c $f $a $i $r $y sCO i01sn` u i26 'B*03-8 l ^e ^n ^i ^l OA7 se+ i21 *28 O87 E c ^p s_F *08z5r o5p sek o7X +0 i54 O62 o60 *98 o71 +8 K,7s?Y i9hsiqo6U ^k ^c ^a ^j Z5 O46 i7f i75 o67y3 L3 O45 *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 i2t i3h i4i O73 o6Y s1K O41 i1s l $E .1 OA6 o1A '8 i1v o5r $4 $1 $! o30 r i2C*5B o7J k T7*69i32 i53 i3f o9h O62 Y1 o5F L9 l $# +7 ^/LB ,2*83y4 O1A iB\ y4 *20 +9i05 o91 Z2 o5- *40 Z4 O45 *58$n L3 O56 *A3 o1k [ p1 T4 O12 Y3 sS+ *87 s81 o64 i3r l ^x ^e *57 $! z3 O36 i11 O06 O13 *48 sW| K.A 'D $8 ^f *18 o2` o5W O62 p3 O03 *61 T2 o2[ s8G c $1 $2 $9 $! $w $i $f $e +E -0 i3c i52 O4A sIO oBo O36 'AsBq O25 T1 ^#E sFn $m $a $r $i $a o3C [ $0 $6 $@ $@ c $8 $8 $0 $! c $5 $7 $$ $$ $8 $3 $* $* +A -7 -6 ^e O53 $$ T3 D8 i8J c $2 $5 $* $* l ^1 ^1 ^0 ^2 z4 O59 C^U $6 $5 $! $! .2 i17 c d 'A $7 C 'B $0 o5h*98 i33 r O18 z4 *15 $P O25 suZ suQ +A -3 +A c $1 $0 $# $# suI $9 $0 $@ $@ $w $o $r $l $d c $2 $7 $$ $$ [ i2A u o7,} $l $a $r $r $y $f $o $o $d c $7 $8 $! $! C*08 $f $o $o $l o0g T6 O15 c $8 $0 $8 $! $c $a $n $d $y C 'C $1 *A7 O37 L5 p4 c $9 $1 $* $* s(7 c $4 $6 $4 $! $p $u $s $s $y s4o] O23 O38 c $2 $1 $3 $! sBQsmr c $7 $0 $0 $! *31 O29 *57R6o1k sOu lsz O35 Y2 $| K *07$PsZ? O57 oBS *4B O73 O13 $h ^9 *91 *37 z2i9E ,6i5d i3b i54 i3b i58 .9.0 D6 O63 i77 i7f s9= O25 s5@ *0A O79 s,z $u oA[ OA7 i2y -4 sKn^0 s7@ s7N ,6 L7 -6 i3f i54 O91 Z4 $a *68 r s2| ^l i5v s7" s*9 *69 *68 s*? $2 $5 $$ $$ O02 o4h $9 ,3 D4 *50 sSRR4-0 s9e $k u D3 s*$ $2 $1 $# $# $3 $8 $! $! c $8 $8 $# $# $3 O23 O95 i1o i2o i3t c $1 $1 $8 $! ^n ^e ^d ^e l $9 $0 $9 Z2.0 $5 $8 $! $! $4 $0 $@ $@ D9 *39 O26 sP>sYh $5 $8 $@ $@ i7b i3c $8 $7 $% $% i9`s+Fi5` y1 -6 O06 q O24 s^V i16*85 i7v i8e i91 i79 i35 R4 $9 c $1 $4 $@ $@ i64 *65 i75 i5b ^e ^f ^4 ^a d *07 O32 i75 i5f +2 +7 +9 l $5 $5 $9 z3 -2 +C +C +E u z1 *31 ^#^@^!$#$@$! $4 $5 $$ $$ i4a l ]t*3B *47 $t .4 O7A c $2 $0 $0 $6 $! c $0 $9 $@ $@ sQC sQB +1 c srD c $0 $8 $* $* i71 i39 k Z2 l '6 $8 $5 O83 $&$+ O2B -1 l '6 $3 i1a i59 T2 '7 T1 T6 T2 T7 sSN $.$~ o0C OA5 O52 c $0 $8 $$ $$ ^$d KLB $J L5 ^ *69 i1i i2j O05 o43 *28-3 s94 i75 l {-5s)8 l $4 $0 $8 OAB L5 $0 $5 $* $* i1P,B LA+0z2 l $7 $2 $1 c $5 $8 $! y1y3so4 O72 o3G $7 $2 $@ $@ o98+3y1 l $7 $2 $2 s@6Y2 O13 ,6 $6 $3 $@ $@ $8 $1 $* $* y2 $f *10 ds,e y2 L4 i13 $5 O23 z5 l $7 $2 $6 o2% s`\ O15 O51 .9 O05 y2*07.0 O15 l ^ysZfC sm@ y2 O54 *A3 i3m i4e i5r i7e i3f Z2z1D8 i6M i7A i8R s54 -1 $&o96 *28 O28 *B8C+1 ,4s\w o0+Y3 +6 +6 -C O2B s_H i1: O75 *08 D7 o6' O19 Y5 *61 *68 O37 u $7 $0 $0 s@} c $1 $0 $9 $! s05 +8 q ] c $1 $3 $3 $! c $9 $8 $7 $! i7>sLT s3z o7V*61*5B O92 { *92 l $9 $1 $4 i7f i3c l $9 $1 $9 [ +4 o5o -0 z1 u c $d $0 *71sv)*38 i35 i18 O75 sck D3 s1Z O5B i34 *74 L6$r*19 ^1 -3 +1 +1 +E OA5 *36 ssr p5 s*f $" s}q OAB $@K r*27+8 O08 z2 $a $u $g l $1 $5 $0 l $8 $2 $2 l $8 $2 $6 $w -4 r l $0 $2 $2 sKh i34 i15 l $0 $2 $1 $u r sLl O12 Z4 l $0 $2 $9 c o42 i7c i1e }+A *9Bs=& l ^r ^u ^s $. $i $n $t i12 ,6 O83 O38 s!S i1t l $7 $4 $7 $6 r D5slZsQm $, [ -6 -D c $c $e +0 +C +C l '7 $8 iBGi2, O78 s=k K s8{ O84 i2t i3t i4y *B5Z2s#1 R0 -6 +E -D -D l '7 $0 c $5 $0 $* $* l $3 $5 $4 *71i12 *76$/E ] q c $1 $1 $4 $! $y *16 c $1 $8 $8 $! $7 $2 $? $? R7*24 i9RskM c $3 $2 $@ $@ c $6 $1 $! sP4D1 c $2 $9 $2 $! i4y +1 i3g $7 [ -2 d O27 $@ 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 O43 z1 O51 .1 s9a *04 *53 $y ,5 } c $1 $2 $4 $! $=$* $G c -0 c $9 $9 $8 $! Y3 Z3 OA7 l $3 $9 $3 ^2 D7 c i8roAb Z2 o50 +7 ^o ^y i40 i50 i60 ,7 'BsU( *7AsxW i31 i10 O14 o40 iA7 o95 s?e^# l $. $r $u c $6 $1 $9 $! *54 OA4 T3 OB3 $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 i7e i58 +8 se, i7e i50 i42i50i61i73 ^m z1 D5 c $0 $6 $! $! sIpsTW *4B *37 +A ,8^/ OBA $F z1 sabsN/ O35 } *30 R4 +6 -5 c $5 $1 $! $! ^1 O56 K $d k swv l $8 $0 $1 O31 ssr *15 c $7 $7 $# $# $j $u $l $1 $9 $6 $$ $$ c $0 $1 $1 $! $3 $2 $* $* O71 c $2 $8 $3 $@ $@ sg" OA3 *14 *45.8 rsEts.E i2n i3e i4s T1 T8 T7 T2 R3C c $1 $8 $1 $! i13 i74 i56 i38 c $9 $3 $? $? o6@ '8 *A3s3h O67 *75 i7g i8o i9n *05 d $2 $6 $? $? R0*5A q*57 '7 $$ c $a $3 c $a $5 d sam oBzi9` $0 $4 $@ $@ s20Z4 i4o i5v i6e Y3 *17 iBzo9fz3 T9Y4 i2e '7 R0o4| f '7 c $2 $3 $# $# T1 T8 T7 T9 O05 z4 sP[ $1 $0 $? $? sLZ sqX +B*25 L1 T0 $j $e $s $s $e Ci58 $7 d O62 D0 *06 O87 {{i6w o4u t o2B l sxr $9 $8 $? $? +0 +B +1 i76 i1b T9o9pi9^ *5B O05 [ E swy O2B sl6 p4 o33 $- oB9 O05 c $9 $0 $9 $! $7 $8 $* $* i6a i71 i81 *B8[Y5 i22i30i43i51 O35 O45 *25sta i1d i30 $-$; c $2 $3 $2 $! s)0Y5 +A -E -E sa,*94 TAi5IDA c $4 $4 $* $* f O18 z2 o5' +0 ^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 +1 O28 T3 srh l $1 $8 $2 sV&o1P c $1 $1 $5 $! c $3 $3 $$ $$ [$\o0P d '3 p1 ^2 D7 i7i i8d i7n i8t i91 d 'Q ^h Y2 i1Gl $2 $2 $# $# OA2 .4 *85r*68 c $6 $3 $* $* d o0p i4j i5u i6l c $2 $7 $@ $@ i27 i37 i47 i12 i20 i32 i40 c $1 $7 $1 $! c $2 $4 $2 $! o8C O35 $2 $0 $? $? ] $+ l ^t ^o ^n ^k sp2s4{ c $3 $4 $@ $@ c $1 $8 $! $! o9J *13 oBT l $9 $9 $4 O12 i7T Y3 o6h o0H $r $8 $r $0 R7 [ oAV O47 sPg d O12 O96 o8( oBH i2n i3t i4i L2 u i4? *32 O01 i13 i3c l $i $d $e oB/sCu *45 *52 c $7 $1 $1 $! *81 O32 *89 O63 O04 i0Q O26 $+ *24 $6 $4 $@ $@ $4 ^r DB*94^b o0Q sck c $5 $5 $* $* $@$~ .4 sgp c $9 $9 $0 $! c $6 $6 $! $! st +0 i2m i3b i4o $f $e $b $9 $5 sHo i8i i9n iA1 E *05 i1c i53 sfq R1 '7 l ^9 ^0 ^0 ^2 i1c i50 $R *12 r $i $v $e s9b sfm r TB O74 ssgs7",4 syU i34 i5c L0iBNE -2 z1 Z1 c $b $o $o $k Y5 O1A Y3 i06 s'; } O24 L2 C ^X $X $X ^X sL6 *52 } p2 t o5J O5A Y2 O1B .8 ^v sXf-4 o2I*49 r *05 Y1 -5 $* i0d i2l i1e i11 i29 i38 i42 Z3 OA6 *58 i92 O9B s3I R7,2sr( Z2 o3u Z2 i78 $Y k sux sLp^_ su} i0H i2l i1e i3l i4o sfc ^k i22 i30 i41 i57 sW, O91 iB4 ,3 Z1 sj[o3= $Eo3t O95 O23 o0W C O47 o8) O51 O5B RA O5A ^U ci2lL8 sf0 l $0 $1 $4 *50o67 sf4 y3 ,3 {z1z3 oBa +A O98 RB sR# l ^h ^s ^a O04 k *06 s7A y3 O41 r o2D Z1 o3v $> O14 ^S C z3 oAx O87 O61 Y5 R8} R6 *65 *4A}^$ sVT s#i O8B *04 i0K *43 l $0 $9 $9 ] D1 f i3* O61 Y3o91 *23 ^W p2 O07 *65*15t *10 o4w Z1 sH! o27 p2 L0 o21 z1 q *03 y1 i75 l $5 $1 $1 p1 O65 [ O76 +7 svB *15 st6*63 i32 i40 i53 i60 i0g i2e i1r O54 Y3 k soB l +B K -9 O25 t sXD O62 i11 i3f Y3 i0_ OB5 y4 O7B i13 i3f i1H i3S z1 o5k i11 i29 i36 i43 se3 R0 i6i i7e i81 smJt *34sIa*52 i74 i1b ^q *57 O23 l $! s*D DB u sK9 z5seS'A sU,z1T7 sIU d p1 O15 *75o1rsg1 'E $5 Z1 s2^ o6? E O5A *73 { $TsLU*91 i30 i53 .4 Z4 o12 *04 u i68 T7stc*04 u $9 $8 $8 ^0 *41 O91 *01 ^H ^4 O28 l sz2 l $1 $6 $8 Y2o7u l $1 $1 $8 '9 Z5 i8n i9c iAe slr r d o93 *72 i3r u i6P i3b i52 p5 O37 l $k $h $a $n o2I k l $1 $1 $6 z1 i3k *A6p5 Y2 y3 o9Y c f s1& O53 $I i68 O34 i8W D1 sZ5 $s R7 ^T O37 .2 svB .0 oAI i1b i15 K *92 sHF c $o $l $1 *52 ^, $z i53 i38 y4E*49 i1d i73 f O62 i53 i34 D8 o7= c $1 $8 $8 O54 k Y3 o9& O35 i53 i3c R4 O02 r T9 ,8 i78 OA4 o3@ O84 *AB k $#$? *26 Z2 D2 l $5 $2 $0 O02 ,6 z5 i52 i38 o4z l { i0H i1e i3l i2l i4o O63 DA $4 $8 $0 $7 sIg*82} sfp k $3 $3 $0 $8 c $h $e $a $d O48 Y1 o5F i82i90iA3iB2 ^5 c c '5 $8 i5f i16 oBj O04 *83 O41 *61 i36 i7e *14 ^q R5t *10 Z1 o4w c '5 $2 ^QsrR i0u $3 *13 d O52 +4 $Y Y2 } i5V *8AsQA scCk l $2 $5 $6 ko4g $3 $2 $9 $8 i30 i17 *69*7Bt l $2 $5 $2 ^C ^1 l $3 $3 $2 T2 ^I *A5i6; $5 $0 $6 $9 svp O74 iAU O35 *26 O42 $o O63 c y3 *20 $V Z4 Z1 O75 o4} E se+ f O4B i3R*23 D9^[ *04 $y *53 O05 C z1 *52z1sDL l $9 $2 $2 sZT O23 Z1 sdg l $1 $7 $8 *89s.Ks!X oBO O83 si" sZ= p3 $T .4 y2 K i5f i1d l '8 $7 Z5 O0A *71 O56 *01 sVQ O1B *06 r s|1i29 l '8 $4 *62 ^f *B3 O19 *A3 O27 [T5K } sUO l ^2 ^0 ^0 ^2 z2^W l '8 $9 Y1 ,8 i4b i5u oAU O0B o5s Z5 .6 O94 *87u sf( $C $T l $3 $6 $0 i44 *54 L6 sxi $e -2 *34 Z1 +0 z1 ^l ^l ^o ^l sx' o0a T2 l $0 $1 $1 Z5 O65 $q K r .7 ^V O78 ^l o1K.1 q O17 -1 i76 i1f ^F O19 y2 O4B -3 O21 *A0 p4 i9x -A '3 p2 O82 k [ [+As/u o2 ^t sge i9" i52 i13 $7l^m .1 '5 u $1 $0 $1 sHh o6v u u O86 oBM ] s?R Y3 O6B $v '9 o4@ i56 i3b *74 O48 *7B c i69 +5sgm$_ i23 i39 c i61 i1) i7cs=. $Y *63 i32 i40 i52 i69 i32 i40 i52 i65 *75 o5L *68iA1 i50 i3f i13 i1d $h $e $i $d $i T2 T9 T3 T4 ,1 f s9O p2 l O48 i2| [ sRN T1 T8 T6 T2 O59 T2 i50 i34 *16 u D5 s7W O67 i4E s,M Z1 iA7 {s>ty1 O71 o2E s0v o6_ z3 O43 i5 O04 *72 ,4 O29 i73 i17 {+3*A5 +9 *9A s*R*79 O26 -5 squ{sAz sUD L0 '2 s4F r O18 p4 d $d l $0 $8 $9 'BZ4[ .5 ^w o2V y4 sGE*67sfj $Y-9 O41 f $J .3 l $f $u $l s8Y i1y i2s i3g i4i i5e k*08-5 O14 O51 *63 y4 k [ O16 p5 l $8 $9 $9 R1 *5A O69 O37 O17 s9+ r^8 Y3 O43 t *54 *20 ,9 r o51 TA y2 *B8 O47 $& O32 i14 i79 *35 O71 y1 O56 { $% Z2 p2 ] i1f i15 f i1J O89 O06 *35 T0 TB T7 T3 D7 $+ *A7s,z *31 ^@ se8+2,9 o0O u *53 d ^* O51 $J*23 O37 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 l $4 $0 $9 E o2W *43Z2 i71 i36 $i Z2 O15 sz4 sFl ^F O81 o1v f O69 i11 i7d Z4 O75 Z1 ^t ^m *B0 O69 o5V O43 u ^o ^l ^i ^m i1a i3e i2k Z3 -9 } sro 'A scZ z2 $s L9rZ1 D2 Z2 O67 O87 l $2 $6 $2 y5 +5 l l $o $u $s y2 *65 d*29 RA O52 i1b i30 sz1i07+7 i50 i15 oBLY5 o4v i0x O13 R5 o0` r D1 O54 Z2 $h *50 *25 T0 T1 T2 T9 i4^ O14 f *10 -7 o1@ i73 i34 l $3 $1 $3 $0 o5; i8~ T3 o0p ,6 o4X O4A Z5 ^s O1A ^b d i51 i37 LAsV, sP9 O87 L8 L3D8 sPf $! O19 R8 $3 O25 sZM Z2 y2 i4m sE3 *84o0DY4 oAVs#D O95 O42 i5e i6a i7r $h $a $p $p $y O67 p5 $K c ^5 ^1 ^0 ^2 i32 i40 i51 i63 y1 *08 i32 i40 i51 i66 i32 i40 i51 i64 i97 $5 '8 Z5 .5 D9 i2l i4n i3e s9& $. $u $s sCv sCx ^P o5d O02 sJ= Z5 sCn *68 $7 *83 O59 O14 z1 ^t ^a ^p .3 i76 z3 Z2 O47 $,$< ^f Y2 ^! O43 T0 $j *A6 O61 O71 o3| O81 Z4 T0 $V y3^Z*8B o5, O61 f O84 *35 $v $a c *06 O94 .4 d Z4 O95 *A6 $l $a $u $r $a u sYU O48 i0Z sBO O02 z2 O52 l D3 i0' Z1o7.y4 i1b i39 ^s ^p ^e ^e ^p i10 i78 ^E z1 p5 -0 Y4 K O45 o3e*A2*65 slB *38 O38 sWG *80 O12 O4A s!C O18 $N p1 D5 z2 O62 o2? Y4 { Y4 K k o0f i3i u i11 i5c O36 LB *41 i7x i4e i5n i6t o2HDA i0P ^E oAH i5i $q i6K O13 iA& ^K O21 $_ O75 sXA slo i2l z2 ] i19 .2 sBK Z4 O0B sL9 i72 i39 $.$] O27 $L o1I +2 i6s i70 sCJ *40 i6K u *04 ^0 z3,4 iAxsc6[ sGH ] *86 O04 D0 spe ro2E i3e i4m i5e ,3 sNU ^< c Y4 ^3 O24 $C *31 i99 Z1 [ y1 Z4 O69 sjK ko2niBS *81 t '7 sTW -6 D1 O92 Y1 $^ c i7! s\4 i1b i7e i1b i7d i3K O0A O85 $0 O14 Y3 $v O6B O56 *50 k *62 ^4i9\ i57 i30 O15 } *81 O68 sO5 z3 O47 Z2 $a $b $b $y $,$/ stysAn l [ ^u O75 *67 [ ^X ^f +8 ^X *14 $M O27 o7K O13 snZ K [ ^U ] O46 ^b ^o c $6 $5 $6 *09qs?l l ^6 ^9 ^9 ^1 i3v i4e i5r O74 O93 y1 ^G o3G O52 z4 $a *81 i3v i4e i5n E*29 o0) o4j -1 i4a i5n i6o +8 O8B r z2 i1k O16 sn. i7i i8g O75 +9 Z2 T1 O82 ^ O9A DA -5 $( p1 o0i O47 z1 i70 i19 O24 *31 $C -0 Z3 i4d *42 O37 o5Vs&J c ^g ^o ^d $l *23 $"$( sn| sFo u t*05*57 s4Is)*l i1c i7d T0 T1 T5 T8 $]*B8 ^! *51 sAq L7 u iBA*19 sV{y2*45 ^X *04 *38 s\u O59 svT i8a i91 iA3 ^J R6 soAb $I T6 sy1 O36 O14 L0 c $3 $6 $3 +4 Z2 -1 T3 T6 T8 T7 ^3 z4 D1 T3 T8 T9 *52 Z2 *73 ^s .A O02 i4i i5k c $3 $3 $4 R0 y1 D2 i5C C $0 $0 $1 C $0 $0 $7 $K oB5 o4U t c $3 $8 $3 i1a i2r i3d sms ^' i1g i2u i1a i2r i3u o2l $k O81 O25 i6i i7g i8h Z2 o86 *38 O57 Y2 $3 i1u i2e o24 u ^r o2x ^1 Y4 T0 T7 TB ^Ys`%sW' O04 y2 Y2 c $8 $9 $4 O35 T2 +0 i1o i2m i3i -3 O59 O24 y2 Y2 c $2 $6 $5 c $0 $4 $4 c $6 $1 $2 o5o*90*51 *20y5 O62 *A7 i1u i2f $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 *82$_.2 $5 ^# O46 '9 i3e i4i $5 ^- O02 Y3 -8 ,9 $5 ^4 O76 D5 q iAA $$ ^8 .9^S} i2l i3v $5 ^_ $6 ^. c $. $n $e $t o1csRx o4w .6 i2l i3m '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 c $) $4 o7$ O24 c $& ^1 c $4 ^@ sWA*03LA R8 $N c $! ^5 i99 iA9 $C R7 o4m *07 ^8 R1 ] O25 O17 { o9SsaAs/U +1 O92 i8s i9t iAe s`4^Co79 c $0 ^4 c ^ $1 ^6 p2 c $0 ^# uRAR7 O86 O54 i1a i2t i3o O05 ^m O64 sjq c $0 ^@ i4e i5s i6s D9s]^ ^e $7 $u O67 i5t i6h $a o6h +3 ^l y5 RA o8\iAQ sjx .4 $k d O27 .A R9.9 O81 O24 d K O62 o6$L9 i6t i7i i8o o2j Z1 c $8 ^* sl; D1 i1r i2e i3n c $8 ^4 qs(8 .Bsh8Z4 ^b oBh O27 Z4s*Q $z *72 i26 i34 T3 T8 T7 c $* ^8 c $* ^2 $. $s $t O6A T4 +3 c $? $8 R1 -3 c $? $? $7 +0 t $N D4 c $? $5 c $^ $2 c $, $6 O14 *29 s70 Z2 $4 ^8 c ^4 $5 i7u i8t s/s c $@ ^3 l ^i ^l ^e ^h s/- z3 *15 i0( O0A c $1 $] c $1 $^ l $. $v $n i4o i5n i6d ^@ O54 c ^_ ^7 Z2 z1 O25 c $1 $< c $# ^3 i3k i4e i5n T5 i6Y $5 [ *20 z2 K -2 scj T2 ^9 ^@ c $2 ^8 c o8$ c $/ $7 y3 O18 d o1I T4 i5rL8*19 Z2 O72 o6zlY1 f O16 i3k i4e i5t c $5 ^7 *70spr ^t ^a ^h i3n i4g i5e sib Z1 c $% $6 Y1p5.9 DB O12 y2 o5c i3s i4a i5n o0[ O23 ^7 ^& *A7 ,9 O45 c $% $0 *25 z2 i6a i7n i82 $x ^b li44 *70y2 sxs +8 o6B +4 -1 Z2 *9A^8sXT -5y4 O04 f L6 D5 c $4 $_ ^4 ^# { +B i6a i7n i8t c $4 $& c $4 $# c O92 i9o iA2 i11 i1d $0 st1 c $4 $+ i15 i3d L5 i6g T2 TA T4 $&K *3A i7! O4B i2e i3m i4a i5n i6d i7o ^3 c o7bs[h*34 *A3*98 $# O61 T2 TA T3 sml k r]i9w $3 ^_ O27 Z3 c $$ $6 ^3 ^# ^3 ^! c o3! z3 o0f L8s*P*39 c ^2 ^! ^0 ^@ c ^1 ^* ^% ^1 i2e i3g c $3 $/ *59 O25 *59 O27 $i r i0n c ^& ^9 sgOq i4n r D9oBc c o1! l +A O45 O81 d D5 c o16 O76 s6q $< c o17 i5l i6l i7e ^. ^9 O03 O34 ^d $u $8 i3- .2 i2i *68 ^- ^7 ^5 ^! *27 O45 sAN t $T *76 ^5 ^@ $7 ^_ *19 O08 -4 Z1sE"-0 Z3 c O85 ^* ^5 o7Os7T $i t O51 *98 ^[ ^1 *26 D2 Z2 i0] sZ$ O69 i86 i91 .9 O76 O91 OB5 o3t O47 c $2 $& i90 iA0 O24 OB6 sYR.8 *14 u O8B i51 O04 [ p2 c $4 ^5 L2 O02 $u *51 $9 ^# $9 ^. i1a i2k i3u i7i i8c i9k c $; $1 $) O83 ^3 -5 R5 O04 [ q $s OA6 i75 i1f ^1 ^< *85 i7e ^6 ^% Y1-0+5 T5 { i51 i14 c $, $8 f ,4 T0 T9 TB O53 o9, c $, $7 O78 O81 sgj p3 *3A O25 O23 $_ ^9 sAX^PsPK i76 +9 i4o i5y i2t i3r i4i slx ^i Y1iBY-4 iAj iA3 OB7 l ^d ^d ^a $i .4 c $( $9 sgj [ $3 ^* l $e $t $t $e $3 ^. $3 ^5 $3 ^= i7d i33 i6o i7l i81 $g O48 ^V O67 O46 ^R ^1 O76 $G -0 c rKT9 $x D5 t z2 o2g O35 *43 R3 -2 sna O74 o4o r $a $s $e +5 [ .3 c $+ $+ sn4 sn0 +3 ] y3 T9*62 $7 ^. *32 Z2 O04 Z4 $h o4c $7 ^$ $0 ^9 $0 ^( D1 $o OA7 o5e *37 OB8 Y2 R4f i9y iAe iBr ci4OR0 $! ^8 O96 Y5 i8r i9d iA1 $- ^5 O5A *B5 ^$ ^4 i5a i6n i7t $4 O81 D7 T3 L3 '6 +1 r -5 $? o3s C $* ^2 ,1 O21 $* ^0 TAs=!$< Z1 ssu *56 D9 +3 c $5 $= T1 O54 +6,A*01 O41 z2 *95i0n s-\.3 c $5 $- O46 -2 $(s8U O15 O68 shQ $@ ^8 sV7D9 $@ ^5 $@ ^0 Z1 $m O46 '7sb)D8 sz|i21 $4 ^- s0$*0B ^@ ^7 l ^t ^u ^o $3 Z4 ^dsB[iBH O73 s23 $? ^6 -B ,8 r$i*B1 oBi [ $8 ^- O82 O06 i3s i4i i5e O91 OA3 O83 *A4*41 O5B [ f OB4 c ^- ^4 -6s+{D2 $. $t $t O42 *96 .2 O94 O13 l O23 z2 ^3 ^4 ^9 ^1 ^1 $7 O26 O35 [ $' i6g i7h i8t $ *57 c -1 i3b i10 s*y^W i6; O53 ] z2 -2 K O01 ^z d i19 K ^{ O0B O13 D1 Z2 ] $F $0 $4 $0 $5 $5 -1 c sex t O81 o5T O36 ^z +9 svg -6 i6f i24 -1 i02 ] d Y1 o1m ] ,2 z1 -7 *40 ^- O86 O45 scw i4l i5i i6f O92 O35 O13 ^9 C i27 i1p i2e Z1 f O38 O27 q ^m*98k R8 O25 $3 r +9 O52 ^$ smRi9K o1n { spu sJt O14 ^i iBE O76 z1 o3x $k ^w i4o i5l i6a D7 *30 t *04 K *82 *84 i4o i5m i6a *51 O69 s8q Z1 R1 Y2 '8cy4 o7g*36^% ^@i9' +4 *92 i11 i29 i39 i40 c i24 T3 +3 o0$ *50 o34 *42LA slJ-7 ,5 Y2 r O04 R0 ,7 s)N o0Y O43 t R1 i16 i1d o31TA D6 -6 ^5 D2 O6A ^W O76 *58 o5c o69 $n i5a i6r i7i O67 i1w s+} ,6 ^g *70 *05 s9o*7B *32 $9 i4o i5c i6k sMB } i21 i39 i46 i53 o42 i50 i61 $6 $m i7l i8i i9f sRA $R T6 *85 Z1 -9 -6 Z1 syg p3sGS l o7T -0 i57 t *83 O92 o7=] o1I ] O84 O58 O84 O49 O67 s1T +5 *29 *50 O18 z1 sot i20 -3 i0( +6 ]*A1iA2 .5 ^1 ^l ^i ^a ^j *07 O71 o1I O61 o92 Z2 i11 i29 i37 i43 D3 ^i u i5! u i2S *10 s37 o2}$? seo s25 o5! .1 *6Bs)D -7 sla t o0H O6B ^* i4mo1Ys$3 c i1W $* z1 $. $a $z T0 T8 T3 T1 +6 y2 OBA OBA -A i7b i18 i1i i2k i3i *46 $E i2p i3e i4r ^y l +7 *23 z1 *9Ai7T ]s4;$q O03 O9B *20 ^6 t i1d Z1 d i5, '9 i4r .3 O29 O71 f u OB3 q O07 s(J] ^i *02 ^M ^W O52 { d i5r oA] $) q *89 o1e s2m } *75 D3 K D4 t *30 *76 O67 $. sfo *20 O54 $t *92 -4 D1 *10 Z2 fz5 o04.A y4 O4A o1m L2 y2 O4A o5v O82 ] $i $c $e $s +6 D3 D9 T3 ls!Wz1 c o07 'Bs$< -1 ^5 O8A T9 T7 T8 TB +5 ,4 $e O52 o1m u st% p2 O94 { sxr sqn oAO,1oBt i1s i2d *43 ^y *82 l ,0*97R4 i8e i91 iA0 OB2 O97 saG O67 o6m l *20 $t O54 O27 ^h K $5 p5 O53 ] D3 -7 i7c i1c i4t i5i i6n O93 O4B -2 i56 i10 -4 ^4 D4 O59 Y2 sdc -0 i0V E O17 y5 O52 iBK *94 O61 slw O35 .0s\Qs[Z *79i1v DAL8 O68 p4 *A6 o41 i59 i67 l ^n ^u ^g i77 i38 i4j K s4y OB2 OA2 l p5 o0Q O49 i48 .6 *10 Z1 i5p -6 ^# $- *17 R3 -4 o26 $t *28 i3n Z1 $L $9 s8j $4 o1l o7/ *98 O75 ssd ,7 *64 sSN $e p1 *58 +7 i3i i4s i5t R9 -9 $6 i7g l $. $p $m i7n i81 i91 t O07 Z2 o2d i3b*68R9 oB=s6x p1 z2 O25 O15 O41 sp2 suh K +4 .8 O52 O1B y5 sD. ^m*42sj. O43 D4 D7 i8* *03 -8 O15 l o5x ,9 srv ^^*A4 s^# O34 O2A i61 i79 i89 ] s94 i71 i89 i98 Z2 O14 ^u ,2 O61 *63 smp +1 Z2 Z1 i5= s7* ] i1m i3p i4l T8^Z*85 o0n t OB1 o2a $9 *61 O02 *76 i40 t ^Z $z sry sgl l s0- +6 si1 se3 u ^w*4B o0n o7X *24 ] p1 o9;i2M O3B sf( i41 i66 o78 i1a i2h i3a r $$ s3u OA8 l *03 T8 *70 s^$ O05 z3 k O15 t *53 +A i1e i2i *13 o7v i9 s?T O14 -1 Y2 D7 Y4 i68 *54 *35 *72 c $0 ^r ,9 T2 sEdo3h t+3sXh iB8 *AB l ^s ^i ^d ,6 O81 svT O23 .6 Z3 O69 l ^- ^n ^o ^n iBM O63 svs O21 [ O1A ^8 O53 O19 ^S ^* +8 i3c i19 i4y i5b s5Q s5? z5iB2 lz5 .0 D5 O26 ^b *45 ^1 *50 $b O73 o6+ i3b i15 O82 o01 kp3 ^5 O41 r $h $o $o $d '8 ^N *58 .6 $. $l $u c i6i K O0A ^l *21 sfP *09p1r O04 $- O46 $r o6PR8 $U { O56 Z2 o4@*A8 *A3 O36 y2 o1I O94 i8s i91 iA0 i8s i91 iA3 c si! sl1 $2 $2 $4 $1 LAi6q $. $l $a $= O05 O43 z1 o5z *47 { iB! z1 C o1f Y3 o0E suI [ i17 i7f i8n i9y O21 k R0 R1 o07 $i d r -2 ^k i8n i9c +3 '7 O6A o8; *6A *A0 O9B i43 *53s|>s]i t sBv T4 } O64 *81 i11 i29 i37 i46 i7k Y1 i4s i5h i6a -3 ^$ 'B*31s;T $w i2d R7 o3y snP D6 *43 O14 $m o6l y2 i8t i9a iA1 $q.BiA? o6V p4 o7- } f O65 $2 i8x OA1 p1 +5 l ^l ^i ^a ^j R0l sbl O98 *26 O85 sfu i5# -A TA *8AsKj$g *24 i3a $p i8lTB k $Z O37 OB3 i6M O73 O84 r stp { Z1 *26 t i3G } i7X O54 o4y z2 z1 *64 c T4 T8 i2Q *20 p4 O86 $- u -5 *74 $? O56 u -8 D5 o5z -4 i7! $2 O42 O16 sBf+4+5 O54 i8i *51 O71 *51 OAB o0K '6 ^G $p *15 ^n ^a ^m ^m ^a s.A $Y k r Y3t i0r t ^8 l z3 o1c z1 Y2 O09 $b *94 stY $* D3 *30*3A us`/ $. $k $r O3B *16 -3 k R3 T0 *13 l $i $l $y i76 .1 OA7 o0g z2 O26 *54 t}*08 } s1d *30 ^3 R6 O76 s_3-Ap1 K O62 i6& z2 ^y $7 $5 $! i7a i8d i91 i6l i7l i82 $j O02 *32 i7m [i6m OA9 ^i $. $c $c z4 O85 f R6 D2 i3g T6 s6^ s72 o0a O92 o76 ^O -6 Z1 o4n Z4 O36 sjRo0I sa3 O15 Y4 O5A *21*7B*73 i4r i5o i6c OAB *20 D1 r $a $n $e Z1 o48 O42 $v k Z2 +2 R7 i75 su\ ^0 Z1 } r ^@ o5G y5 o6B *25 DAo4a l ^l ^i ^a ^s i7n i8o z2 O54 y1 *52 ^b *51 ^W $/Y4sCZ i42 ^z i1f i10 ,0 i6h O6A D4 T1 i7O Y4 O8B i2r i3o i4l '5 y3 o6. l ^l ^i ^a ^r O18 Z3 +8 O53 p1 i3c Z1 i7n i82 D1 O3B O65 $B $C s\*T1o2? .8 .9 i92 iA4 i3h t t i1M i5_ *97 o6a ,5 saN +4 Y3 .3Y2 -7 *67 ,9 d O62 K O68 Z1 O32 s}y R6 O65 o36 ^j r -5 Z1 ^r O32 *46 } '6 O16 l l $s $i $s t i0h u o14 o4X Z2 t r k Y5s+Xt $? .3 Z2 s0G l $. $l $u k *18 i0c i1r i2a o4y -7 o7M O03 Y2 O57 K L7 O64 $l O63 $f *34 $? *87 OA1 K LA O82 *A9,Bo2e syZ$? i8o i9n iA1 +4 d $9 $2 $6 $3 l f sns Z1 i1j i2o i3k i4i svq O41 O09 sb8 u c *51 Y1 ^/ '8 $h T6 *49-4*6B *32*8B o41 $v *42*27z4 $3 i3f O56 O49 Y3 ^A ^C $i O15 Z2 T1 T3 TA *1A+0 O84 ^x .3 o6@ $3 i7y Z2 *17 *A1 OA8 -0 OA8 o0r i0c i6!o6*o3C { i1x i4a OA6 O81 i79 *A9 ^K s5c o60r O32 d -2 T3 T9 T7 $% c O56 +9 D1 o1x u *39} i2d i3e i4r i52 i18 { O05 Z4 o3x O9A O23 *6AsyLD2 Z2T5i4x i2p i3l i4e OB9 i1- O13 Z2 ss5 i56 R0 L0 z2 i5L O36 i1n i2g i2o i3c i4o ]s"t i1d R3 L3 p3 O71 siA3 i2d i3d +5 *79 s*9Z5 i2d i3f y2 O23 o1X ,3 ^V Z5.5 ^- l O52 s3^ ] o3W i0b *57 z1 *24 -6s7p $p $o i54 T7 s$;+0 { Z4 O05 s@S O61 $1 c *60 u O34 OB9 [ [ [ $7 s4_ p4 sb" l O61 o6s y1 O52 ^3 K i1k O42 i9e iAr iB2 o21 smH oAtsn@ R4 D5 i4y o3` sK>Z2s=1 i2a i3n i4k sFr,4 y1 $@ o0( -7 +7sNE*48 *2B OA3 i4i i5l i6l p4 o1a o2n o7s $* sUe O71 i3g i4l ^P ^4 O45 $1 $H O03 c i3g i4i *17 i8H O07 $. $E $A l d 'C O06 { O52 i55 D3 s94 O01 o5L i9h iA1 iB2 i57 R0 L0 o4i O01 L6 +6 o68 D2 i39.3*91 o2- O7B OB2 O91 i2m i3e i4s i2m i3e i4r } *74 i3- s63 i38 L2 L2 O13 ^v o18 i8l i9i iAf Z1 o5u ^s ^a ^b ^b ^a i3t i4l i5e OB7 O53 o63R7s%A i12 L1 R3 O69 -0 *07 $p T8 D5 O43 ^Z Z3 iB1 i51 R4 L4 r O42 O51 o0s D1 y4 *65*9B l ^o ^p ^y ^h i73 +6 +A $- o1as(m i4d i5r .8 O6B o0k p1 Z1 o75 -6 Z2 *68 o1y T5 ^E O06 o01 o1r Z1 L7 *47 i01 i19 i31 i29 $ $. $p $e o8p *84 +5 $O i2k i3k i37 L3 L2 s^a,7 i11 R3 R2 +3s=J O52 $e E r*8Bs_U ^k $$ d O05 D5 -7 $o ^Q D5 [ i2A c } $6 i1x z1 i39 L2 L2 l $. $j $m ^9 D3 OB4 TA y2sk= ] $@ o3h r ^F +6 d O51 O12 $. $b $r i99 [ Z1 *54s}a $p .6 o1D *21 i6s O09 D6 o0g o0Qs|{ ^f '7 $s p2 .5 sZ-'AsJh O7B $c +4 T5 i3m i4i i5n r $e $t $t $e T6 $n sWT Z1 $d O21 ] k Z1 { { s/R*36+7 T2 T7 TB *73Z2 O52 K ^3 D0 O92 [ i8b [ i6o i7o i8d R0 i15 *A9f*94 k O71 Z1 sdW Y2 O42 u O96 O03 sdN O62 O0A *B9 s2x $n O94 i5- [ i6e i7y z1 ^4 } z2 u *6B*1A c o7M s4@ *65 *38 p3 O18 Y3 O31 sbU o0t O52 i76 D3 O52 s7- O76 Y4 *01 sdb $2 i57 s2a o1f O05 ^# o0g*96 R6 T7 O32 y2 y2 $G i6D ski i4z $2 O04 i6o i7y i81 o65 +1 ^l^e*7A $u*98 i72 L4 O42 i62 o7F -1 s-FuD9 Z2 z1 O73 .9q '9s,P i2p i3l E R3 y3 O29 ^n R3 L3 i2n i3k i4e O14 Z3 O14 Z5 ^r ^a ^e i9t iAe i4i O79 o1u sBm '8 $N TB O2A '7 i2p i3h o1d y1 o8)$z i7B Y1 u oBo D3 +6 } o1a Y4 OB8 i9e iAs iBt $5 $4 $* $* i2C O13 O58 s3< O75 p5 s+yo0D -0 '8 O41 z4 -1 O34 *25 z2 r +0*03p1 '5 o2z K o4C +2 $i t o3p $d *46 q*8A i2b i3r *A1+2 *45*28 iB* Y1 i5b i6e i7r O72 o5k *74 r OB7 i21 i39 i48 i1a i2l i3a *2Ao8e i1a i2l i3o $7 t +0 t i4t r*B3 o3 ,4 y5 OA2 O34 +6 oAX OB1 OA8 RA o43 z1 ^- $7 u i5C $. $s $o *10 D3 r D3 o52 p3*BA*A1 $. $s $e o7/ ,6 $V [ r i3S *B9^bs$X *93$usg! O57 $* ^R o42 C p3 o7g *64 ^z i31 R4 L4 t i2F $h r $y saq z1 i4i i5e i6l p1 s'i O53 i5P O63 ^9*B3 *24 $p i3a '8^b O42 $a '5 $g i5b R0 L0 i4t { *63 i78 R3 L3 o3n u +5 ,6 ^5 *31 y3sf5 r D3 Z2 ] sio i5r i61 i72 D1 $F O0A *72 [ o54 o7o $2 D2 o44 k $0 $. $c $m *84 O48 $g O92 'A +7 OB6 +2 o59 r -3oB* O38 -0 iAk O61 *13 [ p1 sHs O15 D3 Y1 +3 ql O04 *B0 D5 OB5 O93 p1 r ^j O25 o0i i0v [ $7 [ i55 R0 L0 O05 z3 O61 *36 ^s R7 *56 O26 Z1 $7 $1 $! -7 $5 i80 O02 O52 E $e i4m *90 O29 oB_^t O23 ^w $ip2sf7 o3i -0 i62 i81 i70 i90 s2z O61 ] ^9 sgk+A s0U t D3 i71 i81 i91 -7 O56 *94 o0r R4 o3_ K OA5 s $ $/ l $. $c $c $ $$ } R2 i3f R7 L7 o77 -6 i70 R4 L4 $lp5s3k O13 i5F E O19 K RBi4ei5A ^1 -9 coBu O54 $2 s_k sOi OA8 $@$[ i6o i7v ^- i58 o0w sw{^BZ5 i9p iAe iBr *2B O14 o2W u i1a R5 L5 *A7oB$ l'2,4 i5e} $=$" $!$; E${,2 $!$_ $+$< [ i0m D5 i9k iAi $+$\ ] i79 .6 K +7 sE4 i9w iAe iBr i15 R2 R3 Z4 O53 z1 $}$+ $}$( $}$# i3a i4l i5d s7J i2a i3c i4h u i39 iBfi3NRB L6 O9B sH- i38 L1 L1 $%$/ *A9 $g i5d R4 L4 i22 $r i7a R9 L9 +0 O23 y2 O42 O87 ,4 q sHci4\ i19 L1 R3 O15 o1> $$ R7 o0K o3g sE5oA^ $%$= i3o i4m i5a Z2c*B8 i32 i40 i51 i55 R4 L4 *30 O08 ^b Z1 o3i c -2 O45 c O54 O48 -2 swc O54 $u Z2 O37 .6 i8Q u ,1 O82 O87 $P -3 o3M K T0 o3L i1e R5 L5 ^b -5 i5a R6 L6 o5&s,++8 $z Z3 *02i3y *87 +0 p3 O52 $- D1 i76 L5 p5f ^0 ^s iAk z4 O5B i1a R3 R2 L0 +2 ^x '7 O82 stC i2a i3c i4e y1 s"o O74 sm"} i72 L8 L8 *18 l $g $a O42 o35 y2+5s[W r ] ^k R6 +6 OA3 $a ,1 i3e R5 R4 Y4 O71 Z4 O68 o1u -0 i78 R6 i12 L0 L0 ^1 i21 i3^k i73 R1 L1 ssx Z1 i16 L1 R2 L3TA i4n i5c i16 L1 R5 OA7 *30 Z1 -8 .7 y5 O1B i7n D2 O24 O26 $f ^q l ^i ^p ^e *70K i38 R2 L2 i8a i9m o9} s-* Z2 *45 i8a i9c sRf[^& *93 r O85 $+ i2- O24 i9^ R0 ^9 i19 R5 L1 *A3sP7s!l R0 ^4 i29 i34 ^r $b i8a i92 *56 OB2 O04 i22 Y2 i8v +0 s4k i6i $6 -9Z3 i34 R1 R2 L0 T7 O3B i35 R2 i2s i3h i4a o6s $1 p4 O08 ^W D1 ] $. $q $a r O69 sqH O36 $2 i70 R3 L3 i2i i3e i4n Z1 O42 .3 $+ E r ^k ] k D2 ^k o44 $0 k sEl { i3w ^p q *62 O58 oA,^Z*07 ^s T5 O28 o5Z o1I sC%sDu O18 $s i8f i9e z1 O52 Z1 .Al z1 O68 ,1z5 i70 R6 siXsKa z5'8 O03 i4m sf-s7[ *A1i8f O05 $D -9 ^5 O64 sWn OBA i41 i50 i61 *32o9vs^E sm5 i4i i5t i6a i50 ,6 O14 y2 O61 ] Y2 L9 O85 *85s8H i3z r i9z iA1 *15 i3u k sfcz1 i1m i2o ^n ^i ^m ^. -1 t i6O svwp5 i4*s_W*B7 o18 *31 O52 ^1 E r O49 i3p i4l i5e *48'7*05 *70 +9 OA6 l i1+ i2m i3i i4l y3s9Bt i3b R7 L7 o6t } s.q C^n s9I*50 i3n i4a i5n sZl u ^1 ^8 ^9 ^1 *B0i4q se4 Z1 O31 i2s i3t i4o i9s iAs y3y1*BA o2g { *14 *27 ] *89-B ro3z sM^^} o4Os6$*67 OA3 ,8 $2 $o O65 D0 i32 L1 L1 ^I *78 O08 Y2 y3 O8A '7 sat Z2 o73 oAz c o2u d i1( O25 *3A l ^e ^d ^i ^s ^\ o69 O04 o1F $1 i2,-1 *7A $[ OBA i77 R4 L4 se1^k$w s=D.4*98 o0o q O26 $# O71 ^o,2+A DB O15 .Bs*H y1s_Z y2 O78 sDLs)q*38 R7 O81 i9i iAa iBn O48 *28 sr%s o spX*6B u ^7 ^9 u ^7 ^2 Ez4s!o Z4.7D4 $@ O5B *AB i6m i8n i7a i36 L2 L2 i2 u o5ro3Y i3i i4l i5l $a p1 O02 $9 o4h i6d i7r i8a i3a i4n i5n sA? st2 OBA se`*75 i1b R8 L8 $K D0 i5t [ Z1 *2BsPk $4 r i54 i19 i32 i7b $i $e $s $t i6g u l ^c ^c ^a $?$- u ^0 ^3 i1c i3f $ +0 o1; l oBy O38 i31 i16 i35 i1d c spv sicT5 i12 i1b sY+ ^F } O27 $3 l ^k ^n ^i i31 i7f $>$! i54 i1b i8W D1 O27 i5f i59 i1f i5b i1b i38 *16 snp i22i30i41i53 u ^d ^3 $q $u $e $e $n i7f i52 i1a R4 c $8 $D sfY sRXi6< sRW^p o5p Z1 } i7g i8h i9t *4B O25 u ^3 ^0 i11 i7b i10 i5b i17 R2 csnP i19 i73 Z5 O51 *0B D0 O48 q O85 { i14 i3a u ^d ^d i30 i14 u ^D ^E 'AsgO i2a i3r i4i i7b i1b i37 i45 i53 .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 $1 d D4 stb O69 i59 i18 i5d R7 L7 i33 i18 sor { i8t i9h iA1 i5d i11 *A5 O26 s$# $;$, f z2 O2A i32 i7f i58 i5b ]o1j$+ i1e i10 i74 L5 i35 i1c sryz3 i3o i4m i5e ^I *03 o0 cc i14 i72 i5a L4 i19 i53 sX.^3,8 u ^A ^C 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 i14 R6 L1 i5f i12 i0j i1o i2r o1l d i9i iA1 u ^f ^2 i4l i5u i32 L2 L2 i3c R8 L8 o05 '8 $[$; i1a i19 K -7 sez +5 i11i29i37i49 L6 O72 i1a i57 i7b i5d i51 R4 i38 i5d u ^a ^b *3BR1 i7b i55 sY=*72 c ^E ^E i7e i55 sRWsvU *14 Z2 D7sdxz5 i18 i56 i7o i8l z2 +0 r u ^a ^6 u ^a ^5 u ^b ^e c $) $2 z1y3*56 *7B^< O83 $B D1 *48s|b O24 OA5 $S s@is^0 u ^b ^3 c ^B ^F u ^e ^e i76 R2 L2 $5 O71 i4@ Z3 O87 i7c i57 O59 E D9 Z3 i1e i2o i3n y2lr i30 i5d i74 i1c i39 i7e i5i t *83*96 i1b R2 L2 i6i i7f i8e i58 i5f K i04 T2 o1A s#B i79 i31 i1f i70 sX{ z3 { i4e Y1 DB ^E sL_ s#= *52sBw,9 $B $8 o0f Z3 ^4 ^x i33 i1c $$$/ s39 ^4 y1 *40 t -7 O03 o7] O78 sQ| i39 i5c { i14 i5_ u i58 i33 i6{ c ^5 ^b i18 i1b c ^e ^e D2 O84 sa$ $t $e $r $r $y O38 o3f i34 i5b i3c i12 ] o6= u $C $C i18 i3e r $s $i $s C o1o Z2 *05 D9 Y3 i54 i5f i16 i1e sDp i77 i32 C o1i o3<.A u ^A ^A oB$iBB i5b i37 i56 i15 $C $E c $6 $5 $3 $7 i57 i18 i7e i52 k^d Z5p4spP c ^C ^A O0A f i17 i58 E -A ^x t $a $p $p $l $e i58 i17 p4 so7 i54 i30 $|$? O0B ^_ i14 i75 sP"z5 sst [ i7f i73 i5d i59 C $I c ^c ^F .4 Y1 stk s#GLA i30 i5e O19 c i7d i32 i35 i3c *47 O68 u $F $E sh# O35 *65 i7b i3a s 7 O92 s]" o2Z s#7sX- L7 L7 O31 R6 O86 c u ^8 ^8 u ^8 ^6 ^f ] i52 i7d s s i1c i18 i11i29i39i44 c O04 -5 i7e i36 *3B$} O94 .5 i5X i3a i15 i11 i5d i3_ O37 i7e i54 sp6o6\ i11 i5e K o6m ^/KsV( i9b iAe y2 *10 $f snr *21 sOr u $A $C O72 } *24y5*46 [ srs $9 D2 s@0i8p u ^6 ^5 sRL,8{ C +6 sz! O2A *46 f O29 $X O62 .2^d s24i9TC sJaT8*38 ^.Y3s>H i5+DB*54 i8_ t sia Z2 szh ^%s[A Z1 syh s#n O45 o4g i6- +0 o1u ^k ^i ^r ^e i7) l O3B d $@ O27 Z3 .3 ,6u O82 z1 O15 o4a smZ o64 O81 Y3 $m s1m ^d ^o ^o ^l ^b s!z DBz4sh. i1!*5B i2w i3a u ^5 ^8 sEy ^a ^h ^a ^h iBNE u ^5 ^7 sBk u ^5 ^2 u ^5 ^3 y3 OA4 i0= E ^n ^a ^a ^m $P D5 s?!*67i4T ^G r u ^2 ^f u ^1 ^5 seCL6s-x c i10 T2 Y2 o8w ^l ^r ^a ^k i3i Z1 ^y ^g ^g ^i ^z i78 i31 *5A^`*85 ^C ^0 c $b $e O63 d *08L3oAD Z1$C *31 'A i87 i97 $7 O23 s_W Y1 *04 o3=*09 O31 $; O25 -5 -9^` O72 z1 [ s0p o1e ^n T0o2; p4*47 c $2 $0 $3 $8 O24 o49 *97 o9o ls-e ^a ^i ^r ^a ^m i3c i57 i6o i7n i82 ^r ^e ^t ^t ^o c $D $4 O41 *68 O38 ^n ^i ^a ^r D7 sem OAB iA; p3 sDx *68 ^y ^n ^o ^t +5 ] $9 Z1 [ q ^> O3A O75 z1 O75 z4 p2 O18 *51 sUh OA8 $( t^(s|O $j t ^y ^l ^l ^i ^b Z4^7 i3c i4e i5l i27 i39 O45 { ^x sr, *70s9FD4 i58 i5c ^l ^i ^v ^e ^h ^a ^l ^l ^a R3 o5m r $i $s $t D0 ^" O37 f O58 +5 +1Y3 d o5j *0A O23 p3 su1 OA1 p5o2E $g ^3 f D5 O23 L4 ^}s^ O3B 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 O04 ^p o1U*58Y1 $f $a $l $l $s $p $a $w $e $l $d $o $u $g sSs O47 i1c i39 $s $a $u $c $e o7]iA# l ^2 ^9 ^9 ^1 s+g i1c i35 ^6 o3a i28 i33 s8, O49 sZ+ $b $e $l $l $e s5-s}li8( $p $i $o $4 o5d $k $a $r $m $a O83 i1' sjC o7q *67 sL! $w $o $o $d $y s1ps^.+3 s9-*58 *2BK szfs6MK ^R *18 c $1 $3 $9 $! $j ^2 O07 sl* +3 *32 y4 y5 O02 sT+ o6s ] i36 i3c ,3 ^p t o4qo2asX4 y2 o91 Y2 *04 o8es[p $u *02 z1 l o2g O7A k o9@ ^t ^s ^o ^l o62 $1 o4m .3 ] -5 o6= sjO p3 i1a i2o p4 sao LBsG3s.A z1 O28 -1 sz6 ^7 $T $f *25 s=1 CoAX$8 R1 K *56 ^j sik D9 $R O0B p3 o2i k o9| *50u[ i67 Z1 li1R*3A { K ^d '8 *14 o1F ^1 s.D u O62 +5 ^j i61 *25 *A9*B1r T1 T8 T9 TA OA2 i44 $9 o2a o77 l -1 -6 i74 ^n ^a ^n ^o ^c ^oso" -2 Z2 sP$ R2sw@ p1 o6d o77 *20 [ R0 sOa s1r R6 C D6sFl o7g u $e ^p iBCl s1M z1 i8e i9s iAt +1 d u c $i $v $e i2o i3w *51sO? u i2' D3i7w i3e i16 T1 T8 T9 T6 +8 +E l ^l ^a ^o ^c ,7 D1 p4 '8 k q O59 sec r i2o i3v i5joB< OAB -0 RA *64 '8 d O92 *81E r *42 *53 s4c'7 i3c R0 i3 -7 i8l i91 i3d i5g i4o D4 o7@ o6i .7 O92 f +0sjd l s6p *35 i5l *41 ^2 ^k s1^ Y2 szM '4 $o r O28 p3 stw } +6 o73 T3 T7 T5 T4 *40y2 O15 Y3 i52 k u i2D y3 $m sK` O37 i1q o1i o2n T1 T5 T6 T7 '7 sdr $4 O83 -5 [ d ^s o1p Z2 R9 *9B+0 *21 d *53 ^m -7$^*6A i49 i59 i67 ^t o1o ^e O57 Y5 *69 O76 { ^Y { ^P i2< O45 ^L [*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 O43 K -0 O74 s }s4a-6 i60 O02 D5 ^t $e o7k *63 s01 *31 c d 'E O72 [ *32 '3 R0 O76 ,6 s91 O09 $1 o4J*3A Z1 f ro4i o4osqE d O93 *45 ,0 O08 ,8 O15 '8 z4 ^csh7 *31siZY2 ] O76 z4 i12 *61 p4spk ^f ^a ^e ^l o1a *03 i4i '8 .Bi0> $b shb i12 i5c *52C] *02 sdl *57 r $i $t $y T2 T4 T6 TA $9 R8 O83 y4 O68 *34 sGk soz K ^ O82 i3g .2 $v stk Z1 T8 i7h i8e i9r +6 $5 i3HTAi28 O32 $1 D1 i7b i8e i9r ^6 i42 O05 $2 O08 o9t s/[ O41 s-8 O79 i65 s\2 sMi,3 O7B o48 q O16 E ${ i52 $9 us!j ^f ^t ^w c se3 si1 ss$ $LT6 ] i3i L7 Z3 O0A i53 f ^a ^k ^a ^b -0 t ^T u ^5 ^b ^n ^e ^y z5 O27 Z2 ^fsP< i3p i4i i5e $] O32 i3# k ^i ^a ^h ^n ^a ^v ^i $ O52 o0A ^Q Y2 ^M C oBe ^7 O84 O35 -1 i9A O04 ]iAY ^a ^y ^a ^s y4 Y4 ] $^ u ^1 ^f ] $J T2i8N O23 Z4 i8Gp1 O02 o51 -3 L3 *31 o1! D1sCa ^n ^r ^u ^b O14 O95 o8rsYQi1A l $1 $4 $7 ,0st o8n s8(s-C$} O42 *08 *58 [ q O27 i1f i58 O25 u *10 O19 i5f O31 p3 O0A OB7 O12 O62 O02 z4 i5V*06 K [ i2f s6. L0 $w $2 -6s*[s(a s6H scj $z *73 $t Z3 D4 o59 o41 i50 i60 i75 p2 OA9 O05 Z3 O46 RA*BA O91 R9 i5g i6i i7r O67 $F i0c i1o i2o s|lto9N $w $e $a $k i5A *06 O92 $J O41 *51 Y3 z5 O63 T4 TC sM? *43 +8 R1 R3 +5iA O75 .5 i5X T1 T3 T8 T7 u ^5 ^1 Z3 o5. ^3 Y2 *B7$k T2 T3 T4 T7 C 'A $8 O39 [ l T0 T2 T8 T6 l $2 $1 $6 sOY sNU { O25 O37 *01 i4t i5t o6o [ sf/$| u ^1 ^8 p1 O97 *29 i7a i91 i8s Z4su%s08 s4t o9/ T0 c $4 $8 $! s4f shd*54 Y4 k O62 RA z5 z5 T0 T2 T8 T5 O03 L6 sXV u ^1 ^0 l $. $j $o s+Ii37L3 u ^2 ^b -0 o2p o62 .5 l $8 $9 $4 O52 o1P sMY K *30 o0b o4fs9W*16 O08 ,1 s2@ { c $4 $1 $2 $! Y2 +5 t O23 sm+ O05 o28 D3 ^@ ^1 $2 $3 i3x i4a i5n o53 } ^g i2r r c OA1 O04 D4sV; c $j $o $h $n o1qD7sVG O05 Z4 c *46 p2 O58 Y3 *34 +5$x swp t iBS O12 *27 O13 o8% D6 i3l i4o i5s Z2*A1Y1 o9? c o0v *20 K i6- Z1 Y2 y2 O43 o1T r o1g u +3^k -8^| p2*46 $v *81 O58 $! O49 K $7 Y2 t +5 i77 o2n r o3s T0 T9 T2 T3 o06 *46 *10 O81 R0 *97 O95 O16 c $5 $2 $0 $! i3r i4o i5n o6a ,5 s43 p3 OA9 s1G *40 -6 o1e o2g $1 DB OBA y2 saE se4 i5Z [ sI7 sc5 } O0B ^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 O12 sef O71 O32 $a sG`^t*A4 *57Z1q sPM ,7 se{i9&E *09 K OB7 st}o8\ c ^d ^e ^r '7sT9 i32 i40 i51 i65 R0 i1e ^YsR#^O ^D ^D l d '9 $7 O19 -5 OAB i53 i17 c $5 $f i2U+7$- sNx Y1 } +5 s4" O9A s#i i6o i7o i8l s_j D3s>h*87 i47 o1g $e R3 i6b O4B ^G i0c i1o i2c d r O0B q o9{ O7A sy{ O35 i7) O8B O94 ^x ^9 O24 Z2 .1 i0c shk ] o1* iAJkd O48 $8 Z5iBK^l OB6 siJ O73 o1y $K p3 $2 Z4 c O35 *73 D2 i5l C sra D1 sK0siH -2 z2 s2* *42 D6 sma D4 sYA o1m O28 iAs*64 -7 O42 sVM sou '8 i0- O03 i2p -4 -D o5d d o52'7 +D +D -1 sRU $F $C y2 O25 $p d $t E *76 sdL u sm9 sU7o3& T8 o5T ^S Y3 sC0 O15 T1 ^s ^e ^y l $2 $0 $1 l $. $g $m *03 o5Q } $i l ^o ^l ^i ^k i74 R5 O43 svy s30 *65 *94*47 o1T z2 -5 c $i $o $n Y2 ,5 i77 i31 L9 sn2 O42 sVvssQk o0d O37 q i38 O71 i12i20i32i42 *05 -4 +2 ^o ^n szG i0B *83 $. $t $m i73 i19 i71 R9 R8 i3e i4d i5o o5A T7 s1w D6 sdE O05 O53 Y4 *73 p2 O85 c $] ^[ i4a i52 i60 .6 $4 i2i i4g i3n u i5Q }p2oA" ^bsoL $h i92 O49 '8 R2 *AB O25 Z4 O53 O03 O05 ^_ *5A OA3 O1A l $5 $6 $7 i59 $7 o1Y O31 ^s ^s ^o ^b ^7 $m *ABy3 c $t $i $o $n *A1 O1B si2 i60 -2 o5a o79 sga *80 *21 o09 *02 T2 Z1 *13 i64 { O42 s#6s*{ E [ ^1 o8k O65 O0B O49 sEo ^1 o2e r T6 ,5 o7/ t OA5 iAS oA2 O64 sha o4l shb ] Y3 O17 Z2 O14 Y2 o48 *02 i9e iAs iB1 i3b R5 L5 ] O42 Z2 T0 T2 TB .9sw| o3z p2 i50 i39 *60y2 K sWw { o6o s4l i5< l O03 R0 T2 TB T9 o0` O23 *13 $g +6 z2 *07 o2a l $0 $2 $4 i9h iAe K o25 +1 i5u ] O06 i49 $/ E o1f z2 d ^s $s $u $c $k Z5 O07 k *43 *48 l $3 $0 $5 c $4 $3 $2 $! +0 i1e c $i $d $e $]E{ i1f i13 $($_ p5 i9r l $1 $4 $5 RA O26 OBA i1Usx9 R9 $9 i1a O04 i72 *03 k O65 -0 suQ c i19 i5e ^e ^s ^o ^r '8 $Q O25 $^ *1B .2 sZ1 oBT O05 i0g +5 T2 TB T5 ssn ^1 O09 [ $N Y2*A8 z2 *73 T4 TB TA z1 o8= { o7= s@tp3 i5U k O35 $5 d RBZ4 ^6 O56 scS stS z4 Z2 O1A +5 R0 T1 T8 T6 T4 sm2$! o6j +2 c +1 Y2 { *81D1 i9t iAs $. $6 sRw L5$N p2 *53 O5A ^e ^d ^o ^c { i3g c o2@ o4d Y2 s*& i8f i91 ^c -1 i32 i40 i52 i67 y1 i52 ^a ^u ^q ^a ] se2 *63 T8 u .B ] O37 *21 $5 Z1 *30 i5o i6v i7e i50 +2 ^0 ^x sgqy4{ R5 O21 Z1 D1 i7_ u ^1 ^3 Z3 O34 ^5 toBM i04*2A*8A ,1 O35 O47 $V .7 iBK*34Z5 R9 O71 i02 sqZo8P syx^u i16 R2 R3 D0 sbj Z1 $= $< sJC O62 sm; s*Y$,*82 i0# D6 k ] ^b syt O59 i7$sS|i4s DB+5*46 Y4 *A8 i2a i3d i4o i41 ,5 *46*A0^F o50 o34 sne K c T5 i5+ i2a i3d i4e c o2- i3@ D5 i74 i12 l $o $n y3ds]U R9 o9[ O31 iE_ $b O73 sa+ *A2y4 *82 'A i1d i15 s8js.}^s O12 s2z i40 z1 o2c *31 O5B scr y4 oAk p1 $f O17 i7i i8n i9e k O21 i0j O0A i5Z i1c i52 $f $l $a $m $e O16 ] z3 $] O81 ^t *31 iBPy4 O54 $. $v T8 Z3 O59 i0#Y2 y4 s.4 [ sC5 E O61 sJT r $i $o $n o2b $u T2 T4 T6 T5 ,7 i8g oB7 O35 ] $g $a $n $g i3g i4o i5n i80 i98 iAAs]VY1 c $1 $8 $5 $! o0Z *31 K ^< O05 sc3 *A6 ] l $1 $5 $4 u D4 O43 i27 i32 i1s i2d i3f D2 -1 O34 ^e ^c ^n ^a ^l y3 O54 s}v O19 i2N ] *85 D2 OA4 *59 l $5 $3 $8 qsZm iBT c L0 ^p $x O19 .8i4G o6;sZL ,6 $p ^_ *04 { *B7R7 ^P L6 c]Y5 c se3 so0 si! saU $i u ^9 ^2 O63 t $| oAz iB8 p4 k srJ y4s,zK i9)D1 u ^9 ^1 Z1 O91 p4 $s $a $r $i c $6 $7 $8 $! Z2 i4j ] i72 i33 i1l O26 O31 $. $s $b Z1i5w ,4 *67 i76 R4 L4 ^! z1 O64 O82 ssz sN- $R O04 ^J O56 i3l i4o i5v ^4 i0w u ^9 ^c O74 .A sqm }s,Z -7 -D u ^9 ^a O35 z3 T2 T7 T9 T4 i8t i92 O42 $e suU r $i $s $e i0s i2m i1i l $. $s $d $7 D7 q'B su@ $9 .7 z5 O38 O43 sL0 sbc +2$/ O68 $h *73 $1 i6L O06 o1{ *32 o3= u ^9 ^d o54 o40 sgZ l d 'A o7< K ^a ^i ^v O02 i34 T6 i0p *4As@7 O24 ] f $m O4B *24 *36 o6c OA9 Z2 o1D i4r i5e i6a O31 o0c $x y3 K si6 *B8 ,1 O07 i1u O73 C oBv $1 O4B ^g ^l ^a ^b ^q ^i } *24 *74 c $e $9 o24 $+ O02 i6r i71 i80 f D7 $s*14*97 Z2 *67 $r $a $v $e $n i41 i53 o60 s+h o15 [ +5 OA3 sYV Z1 *38 *30 { *35 sC0 .3 L5 t szv+A+4 E*52 }d o0W p1 $v O36 Z5 Y3 O46 l $d $o $m $e ^i D6 i10 i1e l $9 $1 $0 fo1tk $. $c $k C [ +6 L5 c +2 -A +2 k o50 o52 $0 $8 *67 scu '7 l $9 $1 $3 sg8 O73 -B i73 o61 +D -6 +5 o61 i1f -5 i52 i1c $^ l i5a i6k +7 L8 ] O05 l ^3 i9bY3 $G ^f ]*93i5l s6wi9, O71 Z2 k o16 +3 R6 p4 i6q O39 T3 O5B skj ${ K ,4 .1 z4 y4 i5a i6h *0At*72 i3l ] O68 $a o3E -4 $_ o62 c o6+ c o6! E .A sW9 c $5 $2 $7 $! *73 ^y O42 i7f i11 *06 O57 $i i1i R2 *35 i8@ q O29 t o5o ^g smj oA# [ T7CiBw s}#i3pr O9B $' r sL1 z1 +A ^s o1l o5o [ } san z3 o3z L1 [ i2A { [ sJm^g i5f R8 L8 -9 { '9 Z4D7 ^OsOj i8es;E sD![*9A O62 O03 O27 $r i4r i5m i6a c o6T i0t i2m i1i '9 *62 o0t o2s s+a i4G O03 O57 s\U O9A o3h]-4 oA2 $! T0 T1 TA T9 q O27 c L2 i7e i35 i7f i1f i8T *03 Y1sMR *03 y4 d $B O47 R1 r y2 -3 y5 O85 skF s\G O5A sSLss5i4s O42 R7 *45 sa3 T0 T9 T1 T3 O23 ^j $# $0 d 'E $2 $8 o4c L6 o6r $9 $7 o7a $2 .6*74Z3 o4Vs!).A Z2 D1 Z4 o0G s2G O47 o0e i67 O1A $0 -5 -6 -A sz_ o9`i7osiE O91 p2 i62 O41 o45 +2*B3 l $0 $1 $7 *16s[!*57 c $2 $1 $8 $! o3] sb- Z1 ^j i88 O64 y3 l $7 $9 $2 OB1 ] { o9l,8^d +1 l i5a O2B *07 O71 o3K O53 i6i *54 z3 i2c O09 D5Y2 $b z2 i3a i5e i4t l $7 $2 $8 Z1 sn. *37Y3Z3 D0 o2R O07 Y2 y2 o0Q Y4 o3Y $1 i5c i16 Y4L7 oAP p1 o6w p1 D9 p1 o6p *19 O83 ,6 i0U o4h ds=^[ D8 ,9 E $= s)o O76 o2$ *95*52o2L .1*2BE *16Z3 l d 'E o0j z2 i6u o7s ,6 *45 *30 { O53 i77 R5 $@ $5 C O25 { o8x T1 Y5 O71 i2R i4Y O36 O06 -8 ^n ^e ^b T0 ^A o3N *47 -0s5*Z5 ^B ^V f O84 sGEi2u i8d i9o ^k R3 *45 T1 szf +7 R5 o4I l o9i i4i i4m *25 $O k o5 O13 l '8 $0 ^w ^k ^**B0*07 s-V o6L E Y1 ^K T1 i7FLB $;$@ R4 o53 T3 T8 TA *AB +6 $E -3 D4 } i5M +3RBy4 o7d O61 *B1c *14 d s6, ^l ^a ^n ^i ^f $M $a $y $9 L1 t D5 Y3 k ^y c $7 $8 $6 $! *26 O15 *56 s06 o2 k *91 *20 O49 O02 o4# s4y D5 sg0 o1! D6 i5! RA O37 l $. $m $r R5 +2 k *54 R3 OA6 y2 s3`*53 c *B9 O71 *A4 O87 O06 o6s z2 *14 svm l '8 $3 ^/ sTa OB4 O91 o6b l $. $m $p } svr l 'A $1 E.7*32 *73 O57 iAR+B K $& OA1 oB0 l $. $g $s *69s+jZ2 O07 -1 i4 '6 s_f*B3 sNn O59 Y4 D5o82,9 sZ/ R7*B4 l $. $m $n sC$LA $s $e $p i6m O91 c $2 $1 $0 $! sp[ T1o7Vi9N l $. $m $k sq2 EoAP -6 $j K *50 +1 y3 O62 ] l $. $m $g l $. $m $d } r +0 O71 O48 y2 sP1 O42 T9 O65 O03 T0*A1 $E O04 t srS Y2 Y1 *80 D4 -2 *13 O21 f ^e ^l ^a ^m ^p t $1 O05 sb! $s $h $o $t +7'6i10 T4 *54 $5 ^1 L6*36D8 spsy3 l ^5 ^4 ^9 ^1 o4o O29 sXH sZR $FscEo7s q { O18 o3x skb D7 i1B i8G i8g R8 o1f *31 E*B8 y3 o0s O53 ^G u O32 $0 $7 ] i5m ^s i9y *82 O25 *03 O18 s*S O06 ^X c $1 $2 $5 $! Z2 i4e sZj o2m *03 i25 o3a O34 $w o6* -3 O73 ^& o3e [ $z o00 s|<*07] *B4sN- ^9 sD8 O17 o30 R1 $o $i $d O93 T3 [*BAZ1 c T5 i5& d f O0A i0p *80 o0Z ^D O62 *92 i4s o5h st<[f y4 $y p2 O0B ^6 L3 O02 O76 {sN@ *4As`1s@4 si9 u $1 $9 $6 $2 C y4 *BA$8 O26 z2 srv u u O67 i0s s2y ^p O03 O85 i7A O23 sb!y3 r K Y5 D2 Y4 +7 oBbE $P $D t Z3 O32 s!WL2 s1P z1 i73 [ u K o0` T0 T9 T3 T4 z1 i5e ssN$J i51 o69 $4 *5A O39 y4 O87 O71 ^7 *12 stc O5A iBG] o1P r T6 o7)i9k i5%c O52 o1d z1 o0m ^i o1W ^1 l O74 K Y3 OA4 .5 i17 L1 R2 +2 ,3 slm $w i92 $4 sVQ O0B ^c Y2 o7P O03 sy' ^D ^B se) O0B c i8o i9d OA2 i2R K O04 *20 +D -1 -C *B4R0sZr +2 ^t O0B i5t i6t i7e OB6 *21 q i51 i7f ^s ^u ^s ^e ^j *A0sBZ *34 sKY -2 p1 O36 k $m sOn i0a i2d i1s $0 LB ^y ^o ^r [ $v O24 ^T '8 O41 $7 $6 $8 $9 z3 $B O29 k*60 y3 o7t *6Ay4Y1 i17 L1 R0 Y1 O1B ,1 *21 O42 z1 O42 y2 s*HL8 o5g z1 -2 O68 O03 d '9 O89 LA i11*7B [ *59 ] i1_ O81 o0m O63 ^j p1 R4 Z2 -6 *13 +6 $g sp+ *17 +5 o1W t ^a ^n ^u ^l ^e ^e ^l $b s3G $c $h $i $l $d sfB O35 Y3 Y1 s}=^0 i53 D0 ,6 i4Z Z2 t$]sf( TA O38 O62 p4 o0x f -4 l $. $g $b T1 T2 TB ^, *70 ^7 R3 ] ^0 ] R4 l ^h ^n ^i ^l $3 $8 $6 $5 D9 o8> *59i5r $- O73 t i1- Z1 sgh y2 y2 O83 $3 srl i5g i6h -2 -2 -A $2 ^9 ] sSh O5B p5*A1 *4A'9i6' ,5 O17 T0 TE s%ro2p .1 $Y O97 +7 o50u O15 +3 -9 oAi r -4 [ c i3H $r $i $d $e $r r *07 *64 O94 T2 +0 i64 O3A T5 *45 sy= i5s i61 i70 ^' E c i3* ,2 i2z o24 O02 $+ i9r iAa sI8 o56 $# o2v z2 i5&p4 i7f i77 o0}*86 .6 $e o4m ] .3 .6 $m p1 o7c O41 *68 ^y ^n ^i ^t O93 O03 sxY o0t *91 '7 d u sSz o2_ *06 OB7 *43 O47 o7E f O69 K T5 oA1 ^js_%*8B i14 i77 *24 o8. '5p1say ^$s^riA0 t o4# O5B *A9 +0 c o99 } E Y4 o52 D1 i3r i4i i5c T2 o7l T3 TA T7 O34 C o9> p5 o1H $6 T3 TA T4 +2 y5 i9r iAs i77 i3b i4l i5d $, O01 { i32*B6 RBZ4t ^e z2 ,7 O02 C d $5 O42 sl_ i38 R4 L4 K *12 Y2 Z2o08 *59s7?i5u -A^5 ^isUa Z3 t $1 *02 o0s R6 O42 [ +2 o0w ^% ^$ t ^+ ^n ^i ^b ^o ^r Y2 -1 Z5iB9 t O86 D6 i10 i7c O02 i4n D7sMF c '5 $6 z1 $3 { s0m c '5 $9 '5 r i7c i3e smw O98 L5 o0k o1h O07 z1 c $1 $3 $7 iB# sa- l i3r i4i i5s *BAsOB Y1 OB7 ^s ^e ^v ^o ^l Y3 $s ^b o7! *50 t d O64 'A i8w i91 -2 i8H y2 *35 *10 i27 p2 *B5 O68 p3 o5y ] O2A ^n i2p ] z2 +6 ^o $p i5r i6m sG2 O36 .0 Y1RBo34 OB3 C $@s6M i36 i3f ^o $v -2 -4 -A *A3D9o8> L3 l O56 $n z2 o7. i0S $@ $3 ^e ^c ^i ^l ^a o2p DB O02 z5 o7i +3 *25 o6z T1 .2 *51 sWo DA O83 sQO sya $9 o2n o0s u o2B o2I l D1 } o7j O52 sMj $x O83 z2 O0A i6_ R5 o66 R6 '9 ,3 o0v q O1A z1 i1f i30 *87 *7A i06 y4 K i25 y1 o2| { sKE [ d TA sJIi3C ^E o6b .2 *41 c o9$ *26 O65 O64 O72 $} D8 z2 o43 *71*6A*40 T2 T8 T4 +3 O84 s0PZ3*06 i7v O68 *67 [ [ $2 sfe o6L *75 t i5r i60 i70 ^R spm o10 o20 d s2@ O6A $Y [ u i5x i61 i34 L3 R4 sx-K c i02 i13 i23 i37 Z1T6Y4 { O87 $G O06 i1Y] *39*46 *67 s1/ *71 O37 o6;sWk i52 O12 -6 i5, i30 i7b } O95 o7j R2 O51 tsM>l s#W sPE .5 .3 OB6 o1i y5 i30 i7c ^i ^t i3c OB5 T3 TA TB ^z ^b ^d -0 R3 ^2 i6a i14 ^l ^T o1F sZR OA8 '9 o0q *42 *14 i0Y Z1*03p1 i8[ Y3svM $xi9v o3G C } i1w i74 *72 .4 D5 O4A O12 $. $t $e $a $m i06 i5t $a $c $l $e i0k i2n i1e y1 O28 ^o Y1sm^TA O16 y1 ,5 +9sfa *72so[ O24 O19 p3 *B7i3$s"6 l $2 $4 $3 oB! c o2x r oB(,2 shy u '4 d [ i02 i10 i2D i3e i4c i75 i19 +4 L5 T0 O4B R0 l $8 $3 $1 $I*7Asn= i3a R6 sp, i12 *61 s93 ] ^4 ] sdx z2 O2B sw= i5gt o70 +6 i0t i2e i1r *43^X *82 O38 O92 ^4 C ^9 +7 o79p3 $f s39 $s $o $n $i $c o0F o2V s#w z1 i28 szl l o0k ,3 R4 Z1 sFQ ^j ^a ^m *87^5 sH2 o0b i2r $a $r $m $y i6k O42 c sa4 $! .8 O62 Z4 O63 o60 l R1 C 'C y3RB i8o i9w iA1 s6% l *73 o3p +9 -2 -6 ^^ ^_ ^^ o1y -0 c $l $i $n $g c $1 $3 $7 $! $Z*97Y5 }s#gy4 Y2 O45 Y2 *BA*B7sS, t $T i9q O43 u O68 d l *63 i3l o4o i53 i35 Z2iBZ rt*61 *1A O4A s9K$! i02 i12 i2M i3a i4r oBn O06 l $7 $1 $8 $w $i $n $g l $7 $1 $3 $*$' $'$_ ^x*94 i8u^9 $/$+ $/$$ $/$# $>$( o4a Z2 ^) ^= o0s ] s0^ o4j +3 l ^n ^i ^t l ^o ^r ^y ^g i54 i1d Ki0AR4 i70 L5 $w $i $n $d T1 T2 T3 T8 '6 $_ csCh i0p i2t i1e *34p5*9B s0g T3iB,o0` oA@ Y3 O85 { *06 $1 R3 O86 *08 { +8 -6 -4 s/cL1 o4b O12 R4 $2 -8-D K i4S O08 iBo O5B i54 R2 L2 *34 r u ^o ^c ^i ^r ^m ^e ^d o03 i3a O03 i0q $/$\ $/$] -C -D -E $#$( O56 $w *0B O94 *30 C $gC+B $_$/ i3b R8 L8 O86 T0 iA[ T5 -6 OA9 *59 t $; o3Hk ^s ^o ^a ^h ^c .8[iAi sMb { O93 T9 DB O27 *73T6*B3 ^a ^n ^a ^d i74 i10 $<$" iBN .1 t i4G [ i1" scU $<$/ $`$* K $] ^l ^l ^i ^w $<$? sRl C q $<$_ p4+0 $!$} *37 OB1 *A0 o0` O85 r C 'E $1 z5 O47 } o8e +1 O02 i1w $d $u $d $e i0t i2n i1a $o $m $y f o4I i1b R5 L5 +8Z5sOw ss8 ^a D3 o2s [ O47 ^Q $@$= c $1 T1 sCfsW{ s%v Z1 *59 $~$@ s{K O94 i4L cp1*14 ^E ^" Z1 i21 lR8+9 u $1 $4 $3 D3+1$% *74sQ4s`p z3 +5 ] E T5 E ,2 ${ Z1 d z1 i4s T3*97y1 *62 '6 s49 o0l i15 R0 R2 $; O02 -7 sul l OB3 O93 i5s i6t i7e z1 i41 $?$| O49 i9g t $`$_ rE $=$@ $^ OB9 O12 i3c i50 $c $l $o $u $d $e $i $g $h $t O31 $1 shJC i4e $r *80y2[ $w O37 [ l T7 f*63p5 *46 o7E y1 $T O35 Y3 $1 $"$/ $+$) ,2 -3 i13 R0 $l $i $o $n sS_ z3 O25 u .3 D6 $?$< O06 o99 s7u ^m ^a ^e ^t {$< i6. .2 $2 i6T i11 R0 r Y5 o3H D8 K *24 $L O86 +A C ^n*2BsMr i15 i3c D2*70sh@ O16 z3 ] i7e L5 L6 $$$= *15 Z1 *80 O45 l o1N o3z ^e ^r ^d ^n ^a ^2 C O51 o4o *81^r $[$, o0Q } i77 L5 T9+7y4 t i8C E o1W l $9 $0 $8 O53 o43 u i65 i1o i2e +B+1L0 u i66 i3/ OA9 i2y o4e $|$# ^i ^m ^a ^n $"$# s7U s`L $=$; Z4 *69 O32 $'$/ i1o i2i $`$! K o7z Y1 $"$& o3P,6 s/% O97 o2H i3a i4l i5a i2- skb i4C +8 D3 svy Z2o9S D6 L1 $)$$ ^k ^r ^a ^m $%$" r E z2 o7w t o3l $8 l ^d ^n ^a ^h u i62 s[noBrE st2 o0j i7o i8c i9k Z2 O96 o73 ,4 u ^A ^B z1s2H.6 o3B +1 +6o1K -3 f O12 *18$V[ sF0 Y4 OA2 sr" r *70 p5s#6$! soETAZ1 RBiA& O42 sfn *71u 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 O56 Y5 O06 sOH O62 i8J o6\q{ o53 $4 O82 R7 O82 Y4 s-}oBED0 +2 o4A ^j}TB i56 R1 L1 i7b i52 z3 ^B O17 *20 i1e R3 R4 *3B O79 i4N saF ^l ^r ^i ^g ^t ^h ^g ^i ^l s*/ O46 z2 $' D0 Ko51o6b i1c R2 p1 O19 i11i29i36i44 $o ^s i0c i5d R6 R7 ^s ^i ^s ^e ^i ^g ^n ^a o0G OB1 k l $3 $2 $9 Y2 OA5 i7f R7 R8 soq Z1*48oB[ s7l i3d i59 L5tRA c ^c ^f i1e L0 *A7 ] OA1 o5D sX< +4 s>F O3B y5 O89 *41 o0f ] t s6z i5d R8 L8 ^o ^k ^e ^n i2n i3i i4t $3 o82 +8 o1B $4 o54 -2 L3 ^y ^z ^a ^r ^c O03 i4L s#h O78 oB6 D5 i3b i53 y3 O94 sqF R7 O14 s*J O51 z3 [ *8A K E { sT& s*X { ,1 O9B $x Z3 $x Z4 i3d i57 s!E O32 D1 $1 +8 R7 O59 T1 L5 ^d z2 sr4 siZ ^v d L5 o6k ,2 [ O51 $! *37 D2 +0 y2 o3f *72 OA2 O42 O32 T8 scu ^R *18 c O52 $0 $p i7q $' O62 z1 shp skLKl Z1 f O5A OB5 ^( iBN Z3 ^J i2o z1 LA OA2 ^@ ^6 l O42 ^2 O62 { Y3Z2 O92 O05 *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 i5q $5 *B8q -B{ *BAsXJ *15 *30 $_ O08 ^i ^r ^f $0 y2 ^o ^e ^l ^c $t ^3 *92 OA4 o0! O34 i1d i36 O61 o3y $$$^ *29,2i0" O36 D4 i7d i55 q { o74 *ABsIS OB3 { iB! ] ] ^1 ] ] ^0 i16 L1 L4 i4n i52 *6B O35 *06o87 c $1 T9 +0 D3 O25 $P*72 *48o6/y2 $a $l $e $x c ^c ^7 O34 i3# l $5 $1 $4 i78 R5 l $a $l o42 *54 $d $a $n *39 O47 o1> o3D $l s@t ^ *20 .0 O6B u t O17 sa4 ] sSg-A*05 i2m i3b i4e sb}oBc O46 ^& O7A se6 sK; *73 iA6 O32 Z1 i64 *68sl. R8-1 O41 Y5 O34 *63^b] *43 O29 ^X ^s ^a ^m i2u O72 sB8 ^a ^t ^n ^i ^c [ ^V '6 Z2 $h o13 o01 OB8 *7B $,-5sy. Y3 o7u *23 o1W i42 i53 i61 $T *80 O08 s(L ]o5} O52 Z5 ^g ^d ^b i3a R1 R2 T6 i0N O79 oBj -B O05 s3(t*50 i0j i2l i1u sr& T7o3ji43 z4.8 o3g ,6 s@8 O45 { +0 OB3 O19 ^9oB8 *08s+= z4 i68 O64 i56 R2 L2 ^y ^h ^w ui3L $t *38 D9kiA- sry ] s8N[ *29 p3 ^h ^t ^a ^e ^d ,4 *20 $p *27 O4A i5v s#uo1B }s2/ .1 O61 o8o i8o i9v O36 ,8 T1 *38sWxsq] iA;-Bs8F sznk sIJ-0 l R2 s1p u i55 D2 ] ^g Z4 O62 { $i O56 *36 R3 i4t O04 y3 O08 T7 sBb sHx i0@ T9 O35 .7r OA9 *B1 *72 O62 -0 ] o5e ^gsIE Z1 i6& si- l o1u i77 i12 sWzu +9 ,A *98 DB O16 o2n i4b p1 .6 O36 $0 ${*A1 tsoR i5a R7 L7 ^r $Y ^XE i1w^m y1 o6u O46 *8B s(KLB } *A7 srs $m O12 OA1 O34 skz spO*9B R0 ^s oAg sdI O28 sa4 se3 sg9 se3 O73 T1s(URA i77 i10 i14 L1 R8 O83 { l ^- ^x ^e $j $o $s $h i42 i50 i63 i70 d O19 o4O Z3 O62 $g O52 T8 O74 o5V sDMY3 slu $7 D7 i3, z1 O04 *56 i0h i2m i1a o5T O02 +1 su5i8e ] ^1 ] +2sZtZ2 i6j ,4 O25 l r $o $n Z2 l +4 D1 L1 p5 y3 OA5 i3+ r -As1; i1n $7 *39sA= c $3 $2 $5 $! st4 O13 {s`.+B t O06 p4+Br +0 -A +0 Y1 i98 ^j o55 r i01 i13 i2M i3a i4r +3 q o52 o1E i3f R5 L5 o7= O24 D7 ^6 i19 R0 L0 o1w i17 i6o i7r i8d i3e [ [ y3 O3B sOG ^E k 'E $4 o0Z K *31 i31 R5 L5 ^i ^r ^t ^u ^p .2 o0g q z1 O21 sm0 so= $X C $. $j $m so+ L5 O8A c T4 si1 y3 ssD *3BZ2[ $D .1 O75 $ ^8 c OA2 R1 $. z5 r O45 i5a R3 L3 u $E $1 L4 O12 i70 i39 o82$" l $0 $1 $2 i73 R6 R8 O32 *37 iAR ^i ^b ^i ^h ^c z1 i5n sxNo6r^C O5B i3F s5| *6B'Bs"7 s8* i7yi6n i55 +2 f O9B sb# $a$h*7A i3a i5o i4m $3 *53 O23 OA3 $K O03 i5G i61 O01 .9 +7 ^a ^r ^o ^n Y3+B skg +0 s"] s!e O21 i78 i10 i75 R5 $8 i4e ^U O04 O06 OA8 c ^6 ^5 ^9 ^1 O3B *A7 u ^e ^n ^o -AZ3 *BA}$x R0 .2 Y1 O48 O53 $3 i4K[ l O35 -5 i70 R2 ^Q t y4s1; ss0 Z2 i32 i41 i59 i70 R5 .4 O53 l spe *23 s32 ^i r s2K +4 s.z '7 z4 srsr l ^h ^t ^a ^b *19 O97 k O06 O9A o0u ^q i3d*A6} o4p o3e i54 i39 Y1z4 l $0 $1 $6 o8r ^2 s}' *30 OBA ^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 c $$ ^4 c $$ ^0 $8 *43 +0 +6 ^- ,6z1 i8r i9l c o4$ s}h O89 O61 O81 L8 d *B0 O64 o5# O14 f .0i44q O03 O04 K f O17 i22 i30 i41 i59 shG c $5 ^0 OA4 O09 *73'AsT` $T O16 O69 c $| $1 O43 sN9 y3 ^9 ^* *21sfai56 *47ko3b y1sI(T8 c $6 ^@ o5v *71 Z1 O79 O97 Y2 O54 OB4 OB1 i7H c $1 $| *52o9] ] o4x i3w i4e swf O94 i1msMR*39 O15 $m i91 T7 R8 ^n ^o ^m ^i ^s *79 *48 c ^- ^2 c ^- ^7 c $6 ^3 O26 $a ^+ ^7 c ^* $2 *40*97 c ^) $0 R5 st3 *30 O32 $t ^7 ^+ O57 ^4 sz, $o *7B p1 ^3 O4A ^N O39 OA4 s@# $$ C *94 o0t l $. $r $o c T6 i6- Z4 O47 seu O14 c $0 ^* ^f O43 l $. $h $k i77 R1 L1 c $% $3 c $1 ^+ c $1 ^( swj O32 *27 O75 O43 O85 ^= ^2 c $1 ^& ^u ^p Z1 R7 D4 R9C y3z2l c ^4 $* i0y $c ^f *08 z4 O52 *B1 c $1 $5 $6 $! ^v O49 +5c$# c ^. ^3 L1 +5 Z1 i3o i4v $x ^o *A9E sr|^Q +E -3 D4 q iA\[q i2n i3n i4i t$< +E -6 c $= ^1 $x ^v c $d $e iA$ $X O3B L5 *21 i9v iAe ^J '6 sH, c $4 $/ OB3 p2 i1.*10oAB z3 ] *64 o98ui9* c ^ ^9 -2 si5 c ^ ^4 ^e ^t ^a ^h O74 o8U su?i2O O13 i4X t sLH c $. ^5 $3 ^& $- Z4 i9f iAe c ^* ^1 $4 D7 O81 stz { ^o ^y ^k s5p O18 *6A t O32 Z3 $4 ^= c ^3 ^# $. $j $o OA2 O16 *53sL@R5 c $^ $7 $2 ,2 p5 rs69 s+%RB*74 s.? i57 k s5fD6i3o O45 z1 o4f *84 o8j t O98 s'ju$K i3a i4s i5t *14 -2 $i c ^4 ^! i8l i9e iAr i9o iAs i8t*49 OBA L3 o68 p3 TA y3 ] O62 i51 $4 o69 LBc$j o1p ] O01 *87sS( ^3 ^@ c ^3 $* ,9 iB7 T3 [ o3i O85 Y1 y3 *96 *45 OA4 D3 D1 DB T1 T3 TA T6 O9B *8A c o3+ i3n i4i i5s -5 R3 +3 $> ^1 D5s8gR2 c o3, $> ^3 p3 OB5 *A6 l +6 $j ^0 ^& c ^& ^1 O14 Z3 t c $6 $% ^0 ^+ i4i i5r i6e l $1 $5 $9 O34 O36 c ^2 ^@ *12 sas ].AL5 ^w sX[ O95 *48]*84 -8 [ l i3o i4b ^o ^m $3 u O42 O05 '7 c ^1 ^- c ^1 ^$ *30 $t O32 +0 Z3 c $; ^1 O4B sVC $} c $3 $% ] ^2 L7 O1B i7/ i2 ^k c $8 ^@ $. $m $r ^l E D1 .9 L9 O05 r i3q c $3 $( c o3$ c $/ ^1 l R6 Z2 T8 O07 *B8 O12 ^b c $d $2 c ^+ ^1 c $3 $~ $c OB2 $9 *19dy1 i54 i16 $+ ^0 i2e i3m $+ ^4 -2 i2x T3 st2 Y3 R0*49 c ^@ ^3 c o4* O61 o3p { *18 O71 c $8 ^5 ^o *28 *14 z5 c ^2 $0 u o2W [ o3e *17 i1e R2 o64 *20 ] u r c ^_ ^0 sA1^# c $# $0 O56 *36 r ssH l i1i i3a i2n i76 i5f o6n $1 ] sra Y1 O4B Z4 c $8 ^# i14 L1 L7 O37 p1 R7 O05 *B8L6Y1 *67 $0 ^? ^1 p4 O91 oB. -2]L0 ^g k OB7 O04 o3} o0w D2 i7c i30 c o1V *B8,Ao1* i9i iAf iBe O9B { K Co2x-4 z2sw? *58Z4 ^n ^a ^o ^j c ^/ ^7 su. i1b i78 z5 Z2 O35 c o1_ $0 +6 ^5 ^_ i6c i7k i8s sjB iBU O19 s3C ^l *21 $2 O12 ^* ^2 O45 d *79 *57 O04 Y4Y1{ i2G O45 O17 *96 Y4 *56 *B1 O76 skm Z1 O98 *98 s-m i7# O39 R2 ^d ^* ^8 '6 D1 o0K ^8 ^$ y3 O7B *3B z3 o23 o0t d i11 i29 i38 i47 i7Q-8 sb7 o8 O34 y2 OA8 O42 iAQ D4 Z4 O32 *1B*97sdq R6 O41 d 'E $9 *A2^vsMK i4S O53 o3isA}i7& c $2 $= y4 OB3 r i3. T4 i4a i5l i6o ,B O63 $B O19 c i2s R6 *A3*53 *0B O15 ^q $a Y2 D8 ^" ^\ .9*71 oA8 } O07 ^t O67 s@` +2[s@= c ^6 $4 $i $c $l $e k *54 $9 ^m ^s ^t ^e ^g so3 i4j o87 u $9 ^+ l $3 $1 $0 s8^ o53 ^s O4B O61 s$4 i1m i2i i3l sMe D4Z4 O83 s/, ] D1 u c $0 ^- s1g D0 O08 skn ^e ^n ^4 O62 ^1 ^= o95 u [ i4o $i $a o0m O84 s>* $` i0- O85 $| ^1 i2m i3p i4i i7c i3d y4 O83 O12 c $0 ^7 i70 R2 L2 ] p2 O49 so$ T0,9z1 O28 slz k i1Y O83 +A *03 ^O i5q { Z2 ] i4j $_ ^4 o04r k OA3 T9 O14 O56 y3 $_ ^2 sFd*67 ^i R2 Z1 *14 $j i77 i1b Z3 *54 $3 d D4 O93 O91 oAh $< ^1 z1 ^5 *30$5 z3 O29 $B T4 T6 T9 i8o i9c iAk ^t *81 D3 q O0B ^}*83 O28 o9; ,1 ro3k-0 $u i3o i35 i16 *50*29 c $( $1 c $( $0 o6r $9 o7a $7 $2 ls.3 D1 u c $( $6 O35 O19 Z2 +4 l O16 ^5 $3 ^$ o4r p1 srg E d c ^@ $3 c $! ^! *50f.3 i2k i3e i4m s3b srg sny O24 $n O93 D5 saX O09 i9c iAo ^i*20sjJ sK. c $) $8 $. $a $m O93 O07 O15 o57 ^ashz $3 ^< O07 i5l o1e L5 i9c iAk R8 $- oAP'B i9/s]@*A7 $. $t $o ^2 ^= O45 s@h d 'E $4 Z2 slx s6a *18 O26 *69$_r D4 E *85 c $4 ^0 D3 ^& ^2 ^- *5B O65 O5A o4F ^2 ^/ [p1i6] c OAB k i7!R6,A *5AR7 ^2 ^# c $8 $~ i75 i13 Z1 d O75 s9q ^w R1 O89 -A Y5o1[ .2 D7 O86 T9 O16 q i7c L6 L5 O68 -8 $4 Z3 o5g c $+ $6 c $8 $> Z1 $3 i7e $. $t $j *86 O87 s ` s6q O07 z2 sqc K z5 o65 c $8 $, s61 Z2 O6B } ^z z4 +6 +0 O12 D8 Y2 c $& $3 q OB5 Z2o4zs{- $7 ^2 kswM*34 l $i $e $r c $; $x p1 l $4 $1 $0 *02y4s%C O23 Z1 s1R OBA O25 $6 ^$ R0 i2a O12 sf4 O83 l O53 i0s Z3 O54 *21sHw*B1 $0 ^. i7c L8 $0 ^) i2r i3i i4c ,2 { i1e i2u c $= $7 O87 oA# *70 $& ^6 c $= $5 $z O61 o71 O43 u$' $& ^2 $& ^3 i7Q O14 $5 ^9 ^G p1 O58 oB**70*1B $& ^8 ^b ^t $0 ^~ $>$& $0 ^_ i5 { K *12 $K u sFw i75 i10 $! ^9 *17 O1B *06 c*40*4B $5 ^7 o5y i60 o75 *12siN $5 ^( iA% i76 i39 $5 ^* $! ^# $- ^8 ^x ^e ^l ^a O15 o5j $- ^7 $- ^4 z1 o7p O46 '8 $4 $A O63 i97 O45 ^k ^;o3ei3o *41 i2e *A8 u O49 i52 R2 D4 O32 Z4 i1PsQH ^# +7 R6 +4 o5uD7o7B O02 O03 ^& $; smq R5 i5= y2 O75 O58 *3B oBy O26 { ^L l +1 Z2 i1n *54 O14 r $l $i $n $e i1e i2y *13 O28 t OA4 .2 Z1 O14 O34 O75 D3 $* ^4 z3 O27 c ^! $3 $* ^9 +1o5b +5s1S,4 s2e c*48 $6 ${ OA3 ^q ^g sfh]l O78 p3 -5 *25 $N O54 +2 -4 c $5 $/ ^u*0A c ^. ^5 c $5 $# p2 *15 ^4sk;^3 +1sxv i4B*67 Z1 ssu $g o5p ^i ^l ^e l ^g ^n ^i ^r $2 ^0 s6e ^b *A1i9gY3 i9PD8s9g $2 ^= o5T Z1 Y3ksGn o04 *45 f ^c O7A i4m *90 $2 ^> O23 sPV O13 c O18 z1 i1f i51 T9 t .5 O05 u p2 svw sD- c ^9 ^d $! ^y R9o1O i0m i2g i1a O82 s,B $4 ^5 i6V O67 ^u OA2 { C Z3 O37 $m oBeo7E p1 *96 O98 R5 C Y2 .4 y4 p3 i2H u o7wY2 z3 +1 r ^7 c $9 $% $) ^8 R5 *64 O63 c $0 $( c $0 $/ O51 O8B D7 c $0 $, sol c $7 $A ^et ^d l y1]-8 ,7 OBA c $1 $6 $5 ,2 o4x $? ^7 spf^b*36 $? ^3 $? ^2 $8 ^& ^j i2e Z1 i20 i31 i41 O46 O18 soYsky $8 ^! { O72 O92 $8 ^7 ^- O53 *9A*70C *75sji+9 Y4s(6s!A iB& i3h*9B O25 ^U .Af i0X *60 O65 O84 c $5 $2 $9 i1u *50 *14 $i -2 o17 R2 *A2i9{ $8 ^_ *A5.0LB ,9fd y1 '5 *36 [ D3 sPus@aTA CoBDY4 *13 Y4 $( ^5 O95 O05 O31 $i c $9 $> K } E s1R OB3 sl7 D4 u ^7 ^a s3Xp5o0Q f T1 o1Y *13 $D O26 $9 ^= c ^9 ^a $1 ^5 sx, z2 L9 O86 $j o17 $1 ^) l $5 $0 $1 C $4 $5 $6 ^m d s`w.1 u ^7 ^b T7 o20 p2 OA4 $! K y1 D5 c $5 $8 $3 i3c R1 L1 u ^7 ^c O08 i2c i4y i59 i2w*08^q sBc oAc O07 $7 $& sd7 i1a i2r i3m $@ Z3 $o $z p3 ^o O45 i4d z1 i12 i20 i30 i45 } L9 O71 O75 i5, sbM*B3 i15 i5f $I $1 i22 i30 i41 i54 l '9 $3 Y1 O75 y1 ^i ^h ] $K ^G r O4A D1l$F D2 O54 sbn^] u ^7 ^e *84i9ds!U c $5 $4 $1 O56 +5 sD-i6gY5 $ky4'B O68 R5 *83i7P Z1 z1 *09 o7;T8 i58 i1b OA2 O18 y4 OA4 *35 $. $t $r O62 i6K O05 i8- O91 T9sIzs(u c $7 $4 $2 s-L u sDF $@$+ .Bs*w c $3 $1 $8 *25 .8 i3+ *02 i0p i1r i2o i3d O57 D6 O21 s>/ z4 $d $a $r $k c sti *41 O75 i4l i5i i6a s*6 i1Uso[ $. $t $p O46 i8K -3 u ^7 ^x D2 *76 -9 O71 +3 +1 OA3 l*84sf5 *B9 O09 sbG t sxk *42*86 *49 +5 o14 O52 *12 s34 c $6 $2 $! -0 +1 r sebsHt O12 y3 .6 sfa 'A O79 *B7 +1 o0X R1 O47 $g o1\ O36 K sa@ T6 Z5 O78 *18 [ $V O83 o1L Z4 O13 iBr O18 o04 d i7a i81 i91 Y2iA7,7 O61 $* c *83 s96 O72 i5t i6i i7a [ $c i5b i6e i7a o5n *25 p5 i1U OB6 O7A i10 i5f *06 O3A p4 *15 $9 Z1 sh8sul O08 $6 *8A K o4k O52 z1 } Z1 O46 z1 i5e i6v i7e i4i i6e i5r c $7 $0 $1 r *19 Z5 Z5 O02 s$f ^5 '9 z1 ,4 i14 R0 *14 '5 q .4 R8 $& i5w o81 -7 o4e y2 scp c ^2 ^d O13 i8M sH, O57 ,6 O32 } O08 L7 *63 sfJsS/ *26*7AD0 *40 c iAg*B4sw] u ^4 ^3 T0 o6m o3n +2 O28 *91 i7& *A0 *5A O46 *59 D9 sW8 *97o8u$[ O92 *37 k O74 i4q +2 $N T0 O84 d O89 o1D so4 s=F*97 sAN*AB*18 *64 *42 ^| O06 O6B srB OB9 L0k i2g i3g i4e } -7 o4a o3l z1 u ^4 ^7 s90 i0d O93 O96 O82 sr3 T3 T4 TB i9rs+pz2 sV4]$^ i9s iAt iBa i82 i90 iA0 i34 R4 R2 .1 D6 oAg O13 .Bs\kL6 '6 z1 *54 sjc D3p3 T2s!(iB- ^l ^i ^a ^s o0| OA3 sqQ i0q i1a iC* o75i6D ^l ^i ^a ^t ^t ^s ^u ^d r $l $o $n $g o6r o7a $9 $7 $2 o5r R4 t c $8 $1 $2 sVf o1~ p3 R9 T7sP5y1 O54 K $q *53 i6k i7e i8r +7 u R6 i4L O32 O04 O1A iC! i1b i2o $(s,Dy3 *23 *97 O93 i6x u u +0 i71 R1 L1 O96 Z2 R9 s5r Z1 O04 y1 ^x R4o9) k O98 p4 c$1$2$3$) ] p1 ^' i2d z1 ^k O94 i7t i8t i9y $f o1e y2 $p O25 *49 -A R6y1 i44 q O9A o3; *12 -5 s7z R7 *97 $Zsc[ *67fs1$ *A6 O53 O97 $< i2f -3 O51 ssa c si1 T4 sjF l ^hs7y*50 i3f L6 L5 $2 d D7 i4i i5c i6k i51 R6 R4 +4sD)*16 i6`*3A Y3*79 i4Q O5A O05 i7l i8l i9e ^l D1 E k Z4 OB2 T7 TC Z1 i2v $m $o $d $e csSb u ^4 ^c D7 *29 i9\*8A o1- o0B i32 L6 L7 O53 d u ^4 ^b $g $r $a $y $2 O72 s1E y4 ,3 *60 D4 T7 TB O73 k $. $n $p $. $n $r *6Ao7g i3a L6 L0 i9o iAm O48 p5 $V $0 O63 *29 LBY1*98 $* ^/ L7 *67 i8m i91 iA2 i19 R0 L1 iB!*31 *53 u OA3 i15 L0 L1 sg_ +4 *64 O87 i8" Z5 i87 z2 O49 D4z3 ^m ^o ^m i1b L3 L6 syK $8 ^z O91 *12 s36 i5t O72 sWF,1*7A D4 i4C *83 O73 L5 i5h *14 O71 z1 o6w *B6^YY1 O16 K .6s+[ R3 o4n ^6 K Y3 O86 O9B i79 R8 R9 i7b L2 L1 f O5B $? ^P sc< so0 si1 c $l $a $n $d ^Y $w i0S *4B O72 Y4sep i0VEsc> i1f *37 l $. $m $x +3 L8 oB_ sG$ *13 ,2 i8o i9u i6n i7t i8e $r ^p D3 ^J i8n i9g iAe i1u i2d i3d O6B sya f o1w $4 c ^w ^e ^n Y2iA1$1 ^F O38 O51 *97 O63 D8C+B R4 i5E $s $h $i $n $e .6 O46 .5 ^qi9O kZ4K sRtc^Q su4R1*43 y5 se6 s;Li7vs)G i7e L1 L3 syu +5 o6h D7 k O6A k O54 R5 scx z2 i3d i4o i5w R7 t L6 Z1 i77 L7 L6 *31 O74 o5$E s #sh) c i16 ^5 } TA*9BsJ\ iB7 O53 $. $a $e i7c i53 $= O54 O92 C ^4 y2sG^ O43 s,l L8 u ^0 ^c R3 R3 $" u $. $a $n $N*58 i76 i3b sCM i9a iAn iB1 $t $a O8A ^= $a $n $x l $o $r $y T7 O83 sk9 i35 i5d *89 OA6 c i18 i5i i6r o0M ] sDZ^^ *60*94-1 -8 o0a *79*62*39 Z2 -5 *42 i7f i53 i5g i6i z3*3B*75 ^2 o4l $4 d Y2 i52 Z2 ^4 $a $c $u $t $e s8c Z1 i78 L8 L7 $l $i $v $e '5 $3 L5 r .5 sdU u s6- p3 p1 o0b K $5 O85 ^2 o4V s?R O52 O75 L9 $t *B4 ,5 D2 sc4 *7B O27 p2 O87 K -B ^S oB< O92 *36 +0 { sk\q i5d i6e i7r t o07 .3 ] u ^d ^8 $b $u $s $h o51 ] $6 skm O05 OBA O93 c $2 $5 $0 $! ^7 +6 ^4 K ^k sHC i8i i9r { $) *36 +5 ^] O8A i0g i2d i1o sn, i3f i52 O12 Z4 } O86 i58 i1f c '7 Z1 i2n i3c i4h } R5 iBi O25 *03s<7 }*B3*54 sCN l Y1 O64 *96 O39 $i O27 i3S *A7 i22 i30 i42 i56 c ^9 $n O35 D4 ^0 c ^7 ser *32 y5*07 *42 O54 i55 i11 Y2 p4 R7 i80 i3b i57 u ^d ^1 *8B svf O65 O94 $e i1o i2w i3e *36 i1w o3} *25skGs'y O75 O83 R8 O16 ,3 O04 OA8 i1e i2r i3n o42 +2 O12 ^b O64 R6 o3i *85 st# swA c u ^E O41 OA1 i2k i7c i55 T8 O02 sr4 s;D Z5 O03 st6 p4*56 O58 z5 { sue sq1 oBb *63^X D6*29Z4 O45 p2 i7c i1d *4Ai8( s0L^Y iB*R4 *23 y3 o0d D8 i33 i5d t $_ $h O74 sgQ O5A so= O49 ,1 ^b k $8kRB DA -4 $6 Z4 sti O93 s$= ^U $q $i Y2 L5 d O38 Z2 -5 oB2o34 Z2 i5x *4B O16 L4 z1 Y2R7 i7e i17 +3 +D o0z $q l $2 $3 $7 s3( $v $a $l $o o32 u [ .2 k f O34 i7h i8e $- O51 Z1 y1 OB8 t Z1 i5i y4 } O84 i2d z5 O07 ] o2r *29 *98 o1ay5 *3Bspv i5a O61 D6 { i9u O2A O63 D9 sk0 *50*8A ,5 r $- Z1 O51 sk9 iD_ OB1 s*L sXH *40sdj c ^W *01 z2 z3t i42 i60 i50 O29 sSH K o6k l $2 $8 $4 i0k*20 *8A^& $-$$ c i6R $J O68 i4j i5u i6n ] $Q .6 O49 E i3i i4e i5l $f $l $o $w o3O O01 l $1 $9 $8 $4 i52 R1 L1 s5q D2 DD *5A}Y4 $b $a $n $d i13 i3b l O07 d o0t Z3 o4y OB7 c Z1 i5t O79 i7d O45 *48 o8xp5 i11i29i38i48 s8o seN ^p z2 s8n i11 i75 i44 $h O71 O53 spM o7t i6n t sw,i8$ *03 o3e D8 DB R3+7 q O8A c ^m l $i $s $h *0B O74 i11 i7c s;Io6B O73 syN O83 seu *2A O83 slB O72 ^A p1 *8B O92 u O13 o6B D2 sm1 i3n i4c i5e l $. $a $e { *30 z1 $^ OB3 O41 Z2 O54 Z5 O42 ] R0 D3 '7 i64 i72 i80 i6P O72 i4k i5i i6n D4 DD $e*41C $5 $2 $7 $4 se7 smw ] i53 i5f sFj $M $a $r $0 $1 z5 l O38 O34 +6 D2 {u*81 '9y2 o69 ^n $h O13 [ O24 Z5 ^s $# Y2 $x d 'H $2 +A O19 *82 *12 sU4 O41 o7R O61 O85 o8g sq' c ^z s8c sDaoA@ i11i29i37i45 spI si! T2 O48 Z4 i2a i3s i4h d $e T1 T9 T3 i3a i10 [ i4H 'T O82 O62 l $j +6 *5B$N sjl *05 O53 D8 O91 u i51 OB7 T4 i15 i1d .8 .2 $1 L1 sfx OA8 O07 Z2 o2y $. $p $r $o Y2 Z3 +1 i71 i17 Z2*25 i71 i16 d O74 o3l i4f i5e i6b i18 i5d T2o6* *8B O58 sze Z2 ^6 i18 i5e sh_ $g T6 TB i4n i5a i62 L1 i0h *B6s3U i3e i5a i4l $r $a $i $n *A9*B9 E*32y4 O16 ] O63 i2u i3e O4A Y3 ^A OB9 *74 lsjNz1 Z3y2^1 [ O93 O34 $. $n $i d 'G $1 sBF o2s Z1 i18 i53 .8C*46 i5* $* $6 $5 $6 $7 u *20 skd O52 Z5 f snc *71 $y *9Bsc7 ^b s93 i7a i8m *03 o1! $NsAjiAc $d O58 c ^f ^6 i3p i4p OA5 TA l iAb i9b iAe iBr i5o i61 o8/t $d $0 $d $e ,4 ] L0o8k *75 O43 ^Os._ o1m^[*45 swX[*67 iB-Z5 .0 *37 DB O41 O76 i14 i57 p1 o5y $e+0c i77 L6 $; Z2 ^j O74 +7 slo '5 i24 i32 i40 O34 ,7 i14 i52 [ O24 $v ] $+ o1j ^7 s2s o1y *27 i0c i2n i1a $3 $& L0 { $8 $# i32 i40 i52 i66 O57 O59 d O28 ^Y sE0sZm *23$y*A1 O51 O82 Z4 O76 i2a i3r i4l r $o $u $r O18 i7P iB7 iBzi2M O7B O84 i32 i40 i52 i64 s0b.4*80 o1w+As}e D4iB\ ^_ O13 sRj *60 *42 i30 i7d l '9 $6 O51 O78 +7 -D ^l O49 s(` *27 k sOx,A i3b i36 Y1i5* sua p1 *A5 *A6 ^m ^i ^k O29 'B *3A c $F $C O46 -1 O51 i8E *24y4 s!G O18 *B2 s_u i72 i80 i91 .0*20s)G $%s/[*73 DC DB OB2 i9W K i37 O84 ,9 l$< L0 T0 l $2 $8 $7 r sa3 i2p i3p i4e s\' OA7 sEK i7d i57 $% O2B OA1 s7ls@h{ {RB i24 i40 i32 O12 OB6 i8{ o90 *96 ^a z3 i15 i7c i18 i7f i18 i77 $,$$ o2f i45 i7b i34 ^o ^j DA O63 O21 f-2 u $B $E $_$> sow i70 i3f i53 .9TB i1f i50 i3Y D0 O43 O36 f O49 DA i18 i52 sAbo8! D4 'B i54 i70 i62 i14 i30 i22 i7f i39 i7f i37 s5# i22 i30 i42 i58 i7f i32 O59 snD s`- L5 O32 'D $6 i10 i3f i55 i7f i55 i7d D2 t Z3 z3 O29 *72*70z1 s;r o4r O95 u ^B ^A lL3s(M *32 O49 tL4 i5d i18 *6B O84 r ^o ^d *15 O59 O25 $0 i8o i9t 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 O65 [ s-g O75 *20 o4fs+Q $b $u $g $s i7f i16 Y2 $, OB3 i2v i3e i4n $o $p *03 O4B ] 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 s9_ r c $3 $2 $8 $! i42 i61 i50 i70 i19 i7f l $. $t $o O67 o1C O25 $r ^R OB5 *31 i5b i14 i7b i14 i76 i5b i01 i27 i19 i32 i01 i27 i19 i38 i3g i4l i5e O09 c i6B*92 o8=s*b i11 i29 i36 i49 '7 i14 i22 i30 O25 Z5 OB4 u O43 D4 $_$& $'$[ $>$) i7d i37 { R2 i52 i14 O95 O46 } $4 $2 $0 .2 i8d i15 i7d i50 i12 i50 i17 o77 o69 d 'J $1 i56 i36 i50 i19 i19 i72 i16 i7d l $. $t $j DB O76 i5b i16 *38Ki6l i5d i30 i5b i15 sed l i16 i75 O21 o2t i02 i10 i35 i21 i17 i7b D1 DA i17 i70 T4 +4 C*B7o7" O89 O93 -A *48$R o8j Z1 T6 i6- *8A D1 o1- i17 i52 c i5M *B0sG\ i7o i8o i9d $\ O75 *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 i11 i29 i38 i41 T1 ^! D1 $9 $5 o1d s7I l ^w ^o ^l D1 i5s O42 Y2 $I Z2 i6c ^d O36 Z1 $f r*24'B O82 o2M o4{ s}!*7A Z5D6 *14o9S o9>s0[ *39 O03 *19i62^I ^w'B r O08 p3 Y5 $c { $^$< t Z1 i1- R8 l D1 D3 oAn '5 $k z1 i5o L6 i32 i5b sRD$z O29 p2 *05 -5 -7 s4$ *13 o8b t o3G O31 i0! c $i $s $m D0 O31 Y2 $Y O24 l $a $n y2 *64 O82 *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 o6t O35 .9 O4B i4p i0V ^b i8s i9h se4 ^c O05 Y5 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 Co9XD5 i12 i20 i32 i44 i5e i50 O07 D1 u o4J *52 $e o6f O23 p4 *A2 OA3 T5 skD d O76 $. l Z4 R6o2p O03 z5 *93 O39 i14 i1d .A.9 sbS*81 }sUqK $7 O46 L1R6 i4s i5s i6a d T8 i4J O02 i1b R3 L3 i0m i1a i2r i3c i4h o08Y2*80 i0s i1p i2i o4# D6 o6- i5- D8K*6A O14 z4 ^7 *27 -7i8i *86 ,5 i55 i10 *21o9(*4A u $E $2 OA1 i65 } o8z } $b $i $t $c $h i7S T1 ^-scy +5 svi i35 i1b oB(to0j *4B O63 D5 *B3 O23 i1u T4 i7b i1c i71 ,8 s$d i9n iAg Ci2F O15 *8B iAFs@h L0 p1 '6 i19 O17 -Bi1, s7j $k ] O14 i53 R3 L3 D1 *56 T8{ i8e i9r iA0 Z2 O76 ^Y o2b s/L O94 $s $w $o $r $d l $1 $0 $8 { spj o0Os\9 $Y *67 i8K -3 y4*21*84 $m $a $r $9 l $i $s $m o7dy4 i78 L5 O93 i0V D3 OB6 sSn D4 sa9 Z2 sun l D9s*Ui5A s0, *97 syi i76 R6 *7B *5B i2z Z1 s>lsP7Y5 *13 O31 $b $l $a $s $t c O8B $1 l^d^d l^d^b l^f^4 i5a i30 f o21 sx< O72 O01 o42 } i60u l^d^3 sp. i18 i7c ^i s1l sgi^k*96 O9A *9A z5 O56 i1b i51 i2r i3c i4e o3j Z1 o7o } i1f i16 D3 d l^1^4 i4 { *6BsNC i1f i17 i5jZ1o9_ i8y O97 Z3$ht r $a $b $l $e i1f i14 O3B *78 r p5*A9 O82 *94 '9 O65 .8 l^9^2 T5 T9 T7 suP -4 s6x i9i iAa sr% [ s8M +4 o8y l^5^6 +1 ] i5u i2s i3t i4r ^F T4 -1 l $e $a $u o9S ] O23 stu O12 { y4i9p l $. $o $r $g z2 T2 $w $i $s $h l^b^6 i9i iAl ^i o1r i56 R4 L4 l^b^f l^2^a *B9*46sU[ E O54 l L6 OBA O54 o6B D5 o2p s,|u,7 o1k Z2 o63 i9o iAo sAE*86 c $c [ oBr $F z1 l^0^9 o5K O1A f $a T5 sP] -3o1, p1 o5s *86 $2 i8K -6 E iA3 o9e sdXp5o6y y2 d z5 Z2 O27 l^8^1 O41 o2R .1 O48 i31 d L7 O82 szO O09 i1d R7 L7 $4 Z4 c $0 $2 $1 $! s`>D5 L8 s5s l^4^0 OB9 o9l Y3 +3 d *7B O8B OB2 O75 -5 i53 i14 i2d .1 Y4 Y4 d spi sEml*57 -4s#hE iA7-1oA7 o6i +3 $w *31 sJ0*25 i4h i5e i6a i19 i1b $4 D3 $0 [ i2y O54 +A Z3 $g O62 R4 *30 l^4^8 O72 o7Z i1G '8 O9A i3e i37 i18s9Q l^8^f i5k i61 R1 o0e c o06 C.1 l^a^f l^a^b o8jswl s|b*38 *A0+B s6a*4A $s $u $p $e $r i53 i1f ^c O4B sh- o0g r^Gl sdz -A} sd< ]*B2o5x l^e^0 l^c^9 l^c^f l^c^d u o83 L6 $y o9r c o3t *62 O54 o2P k o1p OA7 O36 s6@ i2) $[$[ ^L O19 O85 O94 p1 u ^f ^9 i8s i91 iA2 $f $a $k $e *73D7l $Q D5 O14 *53 O52 T5 o4' Z1 } $s $p $o $r $k $q O59 i3n i4d i5o i4a i51 p5 y3 *39 o47 y5 ^LD3 K$Ou i1c R6 L6 ]uz1 *67 *59 i4s i5e i6p D2 O45 $? O09 O21 s6; sCh c i8osZn } o3f -0 u i41 i7o i81 i99 o8{ E *96 oBI*AB^F *B7q *2A*71 ts/?*60 sP_ s91 $t c o9M { R3 [ *25s+Y oA; i8n i9s i1c i5f i1a i2n i3u O76 *76 s?L '6 D3 O36 sbt u ^f ^b i58 R2 L2 O42 o2b D9s&b .6 z4 O12 ^b O3B sNr slj $u Y4 -8 $a $u $x $c $o $m $i $c }i9O soS i3d i35 R1 u i7m T5 ] O63 l O27 skX*40 i8n i9n *12o40^1 o3c o0- i4/ O12 D8 T5 Y1 i7A c t smb *06 DA i9m o8s o5z *23*A7*75 sZ# O47 k s3X t $7 d D7 p5 sDB o4K u ^F ^B i34 i19 i8t i9s sDV$y*12 O14 Z4 ^o ^t $/ z1 ^}*58 .0oA? z2 D5 o3m $aZ1sl% i7o i8w $# O18 ^L OB3 s3$*98^U ^3 O36 t szg ^3 o1e i8. O82 o7l Z1 u { O87 $x i7y sv. i4b O04 d i4a i5u i6g s/_ $3 ^j l $6 $5 $4 o7nz1 Z4sr, *02DA y3 slI $; o7i O58 D4 $d $a $m $n z4 r i7b i54 i18 R0 sal O91 s90 [ i0 z2 l K O43 o0b $1 $8 i4=*78s$] Y3 o99 *89 O18 u Z5 O43 sqAZ4 Z2 i7u { p4 +4 C i7b i58 OA5 -5 *65 i74 R3 L3 i8e i92 c ^E ^F u ^a ^8 *59 '7 ^- o0j -5 -1 Y2 O64 sjt [ +5 oAe i5- u [ sxs [ O31 +4 d $5 *30 Z1 TAi1e^D K o5t i77 i34 sth ^P ^4 c r y3 O74 +3 O01 O26 o6r $9 $7 $2 o7a sXBp4 *A1*B9 o3ws+$snj D2 $? O45 Z3 D3 sLg l $a $n $e i1> O34 O63 i5g i8k O6A R8 oB_ O36 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 L4 D0 $X +7 p1 o7o *35 t i5g u ^a ^0 +2 z2 *92 *91 +8 E o9s sgfy3 $k p1 O26 o8m *B0 O19 ^; O46 i5f i11 o0- R1 O12 s5L -A Z1 $j *14 i3e L5 s8w O96 t i3L $k $i $d $s stk Y1 i16 i57 i1f i39 s/Bo04 svG s\Os.W O42 L5 o6B D3 i8t i9a iAs *81.6Y3 i79 i16 i77 R8 R9 i93L6 O34 Y2 -5 s=z $K ^M O76 i07 Z2 $. $m $p s'! r'BL0 $f *16 ] R3 spk sbF*A0'A K i4+ s_I*25*93 *83R4 Es#U ^8 t s-l O91 s25 o3m s'4 O64 D9 i4e i51 i69 *67u i41 i52 i61 o7H -9 -7 *09 o6k { T1oA/} i79 i15 o7k r p3 L9 s0n O32 *89 ^b sNr O18 C $L O68 i8b i91 O51 i2T s!0 $6 i8t s2w $g $a $u $l O85 C Z4 O52 Z2 -4 sr? o4l *35 c o43 ^8 d O3B $j '6 -1 sr2 i5e R2 L2 u ^b ^7 s7K *30 *53'7 O7B O43 c i0v i2n i1a ^w K $i O98 z3 o1s O41 Z2 c iA/ s8C s2t ^E*59 *57 *07 *13 *48 D9 ^' i7d i17 o5Ws%Q i39 O5B O01 *62 *82 *31 o0Z Y1 { $/ { $Z T0 o8C sYE^, l $9 $1 $7 k r Z2 p5 sNB O5B E +1 +C -E +C CsnX ] y2 *74 *20 *56 s>fi6Z i72 i17 *60 z2 O65 C o1S ] sm5 O58 ,2 ss; +9L7i84 i3e R5 i2y $a $r $i $m i7a i8d i9e i6l i7l i8a si1 ss$ u sHz O54 sv6 Y1 svj O52 D6 R6 { O37 o0t D7 y2 i8_ O84 O89 $N i8r i9o iA1 O36 *12 d i6b c ^Y sub O62 { O83 Y3 ss1 ^w i7y i3d OA9 sko seV i13 i3e O76 $I u ^e ^c l $4 $0 $7 o6? E D3-7T1 o73 i8# p2 OB9 ] s9v *A5 [ *73E*29 u ^e ^9 s%O^wo9M *81*61y2 O84 T3 i33 i5b i52 L7 u ^e ^6 o6m *35 E OB6 y2 i3b *68 u $1 $9 $6 $8 r i3u E o0w T1 ^g,2 c sbY *96 O15 u $1 $9 $6 $7 snc ^< OA1 '8.1 p2 DB i2{ i9A O04 *A4 +8-D T2 +A ^6 $2 $8 $C s3k i51 R2 L2 OBA *34 -6 szJ*82 $G O26 s2k $h s?r svO O37 *13 i53 R2 L2 to5oi9u u ^e ^1 $m $a $r $2 $0 i9n iAc iBe Z1 t O25 ^l*37 Z4sP_ *56Y3s/B i1i i3d i69 o75 i39 i7f *90*50k l o6W o0O skr ^t ^e ^j i4m i55 i1c ^C ^e O91 oB. +3 Y3 u*64sNH o6f T3 f C l ^l ^i ^a ^t i3d i10 ,2 i04 i36 i1c O1A p1 s'r liAkL3 O26 $8 O8A Y3 $t O28 ^z *38 o4o Y2 O13 *74sb5 Z1 i2 *23 $r $u $b $y +1 O57 i1c i7f i7c i11 O04 -6 o43 O03 i6u D0 O04 o3% ^H z2 *5A O32 ] o4g O2A ^x } D3 O26 p4 ^b O41 y4 i0g i2m i1a sl1*17 ^S O75 i7d i12 ^e ^n ^o ^t ^s ^% z1 O02 i5A l iB7 iC7 iD7 c $5 $1 $! D9 L8 Y3 *34 O79 Y1 O4A y3 ^Z D2s,} *31 Y1 o0Z *43 t *13 i1c i7b O32 i3$ OB2 *74 D7 i29 i60 ^6 L1 o23 O35 K ^5 i5i i6f i7e $z d oBYriAu E y5 o6A OA7 s0X +0 i1d i54 i0U l $5 $No3nsiB s>Ks%. i05 O65 i7e i79 $S *51 O46 i7? -4 u $D $E i1d i16 sW@ u O94 $j $a $n $1 $0 *34 ^k O1A *32 ,A i1d i58 Y3 O1B i5e i19 $? .4 i5e i10 t i11 ,1 s7K *86 sgo u o65 *93 *43 sXM OA1 d sby O37 T6 i3* O71 i52 i7c O18 O06 '9 $Y su1 +7 r [ R5 $! O74 $# O87 sD< y5csLU O42 ^m +4 O67 O82 *21 i01 i19 i30 i26 i11 -3 *8B O38 ^d K i6k $% O92 shg fy3 shf O15 z2 'A ^J o07 *80 T2 ^E ^3 [ O17 sMrso> iA0 O25 sD+ o6W *42 i50 i14 O1A y2 ^k s1a *4A$sY5 i70 i1f u ^E ^B $a E *9A *40 O75 O24 i0, *62 i50 i16 -4 o0d z2 T1 y3 p5 sWS i34 i12 D6 o0( i50 i18 y2 $Y o1> i39 i3c sDs O51 sK2 .2 sGQ i4x } sa4 o9! y2 O49 ^,TB iB]*24 D7 o8R s=. O35 i5b i1c *60 r i37 i3f stl o54 s#;Y1*48 DA*27 O9B p1 u i6u ]o5E *04 i6* i6a i72 i82 i5@ } o72 $e *42 OB1 i3s i4t i5i r*B4 sz[ O86 $- Y5 z5 O8B -7 i5A OB7 *28 +3 +E i2e i4i i3r T0 i5a i2c i3t i4o i16 i71 i3f i39 c $2 $1 $8 -8 OB4 t $1 o3f *52 '6 OB5 O01 s!m D3 Y4 {*1B i3a i13 swe L3 t Y1*71 y3 K O67 O32 O81 $u *04 i59 R2 i9l iAi iBf O05 ,3 o7- i8i i9o o3c C O74 O43 $n $a $m $e O71 k Z2 u $. O9B s-& s'- ^h O91 s{* -8 D5 o57 +1 O65 O31 *04 ^9 i6/o9W i8c O48 '7 $_ i5F*69 R0 o22 s3t ^I T7 $! p5sv! y1 K O36 i1u i2m i3m o5t +3 c $~ $3 u $3 $4 $5 O35 ^f r s9M q*84 i9e iAe srd ] *08 O07 O86 $Y $3 OA1 i8_ i9e iAl i78 i39 .8 O02 o6f z1 ^x z3 T0 d [ c ^3 ^f o6l z1 y3 '4 ssz $R *6As[G^s *63 O26 sLJ $}${ R6 o3g Z1 i7e $3 i57 i3b i2e i3e i4n *86 *69 O84 o7c *03 $c i13 i76 *04 son $/ O63 *B2 O37 r E i3u $+ O15 i0Usm+-7 +5 ^2 i8i sZ( O74 i1u i2a i3n +0 O73 s54 '6 i5f i55 i7g i8e i9l D1o5q ^D +B O69 -5 *38 O6A K ^A i0W dc*2A $5 .9 sf| O67 z4 sHk DAs8%*42 $t R5 o9O -7 Z3 -5 t o7X $h T1 c ^2 ^B T8 } i17 i79 Y3 O37 p1 o5f *93 c l $8 $0 $5 Z3 -8 f OB3 o4! O13 ^S O67 i1T ,2 o8t *B5 O83 i3e i4m i5a i12i20i32i45 q *8A O7B sq0o2+ o6 O15 soK *92 $v O26 Z2 *16 'A o9d sen Z1 $. $m $n s'7o8o i70 i37 O13 { [ c $8 $5 $2 $! z5 $A *46 $R O28 Z4 u oAO O42 O1B O76 O0B s4` s-S *59 $J $a $n $2 $7 *95 K o5t ] } O53 .2'B O27 $A s#z$f sn $2 $i $o $u $s i79 i14 d srw sbS *13 O91 sgX o4s O04 K O75 ,3 OBA '7 i4; iAE^>sOT o1io9@ c i5u *06 z1 sl< o17 l O5A y4 qi0l o3p *46 $d Z4 Y1 O47 O89 .B i1e OA2 o1d y1 O87 i7y $x o6} -1 ^c s_FD6 i17 i3b Y5o2s} D7*65*1A u^b^0 *05s0T i3y i4b ]k^& OAB $r LB *31 ^# OA7 *2Bs!gT7 Y4 Y4 ] ,2 Y4 Z1 ^g O57 $d $o $p $e u $C $A u^d^6 i34 i1c -5 Y4 ^_ ^b T3sN4i8d i36 i3b L6 +8 i5< si! sl1 i58 Z2 u O8A { i5b i32 i1n i2o ^x ^e ^s sWS*B2 *63 D1 *92^k i18 i3c 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 i5e O03 i1n i2u u^c^b *54^}*69 i15 i79 O05 Z5 D5 slZ '6 i6T $2 L8.5 O64 l D1 $9 $5 o1d -5 i3e i4t i5a T0 T9 T3 T7 T7 TA TB T2 T9 TB T4 z1 Z2 O16 T0 T3 TB TA O07 slk l $a $u $x i3t i4b i5a T0 T5 T2 T1 T3 T9 TA T4 D0 s9A T3 T4 T9 T7 l $. $l $c O37 O41 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 [ 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 O53 T3 TA T6 T8 T0 T2 T9 T8 T1 T8 T3 T5 $s L7 s1_ i2g i3h i4t [ *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 O52 i3e i4r i5n i2n i3n i4a T1 T4 T6 T9 O34 $3 p2 i2m i3m i4e $. $t $l T1 T8 T3 TA *81 +8 $. $t $d $. $t $z T0 T6 T1 TA T5 T8 T9 *20 +4 $9 C -5 i1a i3a i2m o0b o3e o1l *8B oAd 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 O13 i1e i3e i2l l *13 i53 l $t $h $e i4y i51 i61 T2 T6 TA T8 o6e o7d o0y $9 $7 i3h $1 i1k Z1 p2 O08 *24 l $. $p $g T5 TB T6 T7 O62 ^1 ^t ^i ^r ^b r $o $u $s T0 T4 T8 T6 r $d T0 T6 T1 T8 T3 T8 T7 T9 r $i $a $l T1 T9 T3 T7 T1 TA T5 O07 T0 i2i i4a i3n T3 TB T5 T6 T1 TB T2 T7 $. $c $i T0 TB T6 T7 T0 T4 T8 TA i4e i5s i61 T1 T9 T4 TA T1 T2 T4 T6 .7 ] -7 l $a $s $e T2 T4 T8 TA ^5 D6 o1@ O43 i1h i2e i3r i8o i91 iA2 T2 T5 TA T2 T8 T9 T6 T0 T2 TB TA *61 *25 i9a iAs iBy T1 T5 T6 T9 T2 T6 T9 T5 o0k *35 l $. $g $d l $. $g $a ^p ^i ^k ^s l $. $g $p T4 T7 T6 TA i6o i7r i8e i1e i2x i3y 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 o0r ^k o0r ^g slb u $. $g $y i1i i2g i3e p1 o72 i4# l i9n iAg iB1 i4i i6l i5l T1 TA T4 T8 l i1p t o5T i4r i5o i6n i79 +6 l i13 $. $k $e o7k sbr oB2 D9 O26 O27 *A2 O49 R3 -4 t T0 T4 T6 TA i9v iAe iBr T6 T8 T7 TB T0 T6 TB T4 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 O52 i60 Z1 i3e i5t i4n O13 y2 R1 ] [ i42 i51 i60 i8e i98 T1 T2 TB T3 T4 T9 TB -9 u O24 k K o22 T4 T9 T8 } s21 i3r i4l l ^e ^c ^i ^v r $s $h l $. $q $a i3l i4i i5e i9l iAl -4 ^$ o0y $9 i3h $7 $1 l $. $t $p l $. $t $r l $. $t $t l $. $t $n l $. $t $g i82 i92 iA2 T0 T8 T6 T9 i9w iA1 D3 ^s O41 *24 R3 i31 i41 i52 i31 i41 i59 T1 TB T8 T1 TB T9 i2r i4l i3o i2l i4n i3i l ^i ^m ^e ^d O74 +1 i2n i3s i4t i4j O02 i3l i5r i4e i0c i2o i1h i4j O03 } Z1 *42 i4i i5d l $. $d $j i0s i1c i2o i9s iA2 iB2 i4u i5i ^m ^o ^t $. $g $u D4 o2g i2S +1 O51 $y *81 *A6 '7 ^o D4 s1d i8r i92 i8a i92 iA3 i3i i5a i4t i3i i5a i4l o6r $2 i7a i89 o97 u i7Z i2| O23 i8r i9k Y2 O24 y2 y4 O64 O02 $3 O09 $x ^j T6 T9 TA T2 TA T8 i2c R4 o3; k $v $g i2e i3v sa7 i2e o6b o3c si4 T2 T6 T5 T7 ^g O49 i3i i5g i4n i4o i5o T2 T8 TB i4o i5c i0h i2n i1a i9c iA1 T0 TA T4 T5 O19 r T0 TA T4 T7 i9e iAl iB1 o1e i3w o4a o5r i6e i2' O41 i1e i2n i3e ^e ^e ^n ^k c ^q o3j z5 O34 i7r i8y i91 *BA E o0f +2 ^P *42 i1h i3l i2e T5 TA l $. $o $m t O14 Z2 i6- +9 i0n i2c i1i l $. $u $s i9o iAd +3 ] Y1 $. $a $g O45 Z1 Z1 O13 f 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 s3. Z4 ^l ^e ^v ^e ^l d $r d $y i7n i8d i91 OA4 O35 i1e i2m i3o o0t o1e o3t l $. $e $u l $. $e $t l $. $e $e T0 T5 T7 T9 $. $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 L6 $2 i9n iAd i7n i8t i9e i6o i71 i89 l $a $r $y i9n iA2 L6 $e '7 q i8n i9g $i $k l $. $s $c l $. $s $i l $. $s $h ^e ^i ^d l $. $s $n l $. $s $t i3l i4o i5r O36 T3 i5i i7o i6t o1; O32 i6g i7i i8r i3a i4d i5o i0n i2g i1i o6r $9 $7 $2 i7n i8n i7n i87 z3 i4y O36 i4e i5l i6o *13 o2b i7e i8r i93 c $o $u $t R7 -0 O12 T2 T3 TB i1l i2a i3y z1 *03 O52 ^l ^i ^v ^i ^c K o3b K *54 *02 *54 ^0 T3 T9 TA i1n i2n T4 TC T7 i7i i8f i9e DB s68 o1n i0w D1 $9 -5 o1d $5 o0t o2s o3t i1a i3e i2r T0 TA T4 T1 $1 O26 z2 l $. $b $j l $. $b $h l $. $b $b l $. $b $v T2 TA T7 p2 O27 K i65 d o3_ D6 O16 i4o i5m i6e d o3h i3o i4b o5a i6b o7o T2 T6 T9 i8z i91 iA2 O21 o3n r D6 z1 l ^x ^o i0i i1l i2o i7r i8y i5a i7a i6m i8u i91 iA2 i7r i80 z5 *72 [ ^4 O41 *12 +2 $. $p $y $. $p $a l ^n ^r ^o ^c i3e i4n i5i i8a i9k iAe r $w $a $y i3a i5e i4m T0 T4 T1 T9 ^d ^i ^v ^a ^d se3 sg9 i2n i3k i4i i9t iAa i9t iAy ^t ^a ^h ^t $. $s $v $. $s $i T7 TC TD i0s i2m i1a i1n i2d i3e i1n i2d i3r *65 *8A '7 ] *14 i9o iAo iBl i0t i2m i1o i6l i7i i8f l i6@ { *31 o32 l $. $m $u l $. $m $s l $. $m $m i7d i8a i91 l $. $g $e ^o ^r ^y ^g t $2 i61 i7< O83 i8e i9d iA1 $. $v $u l D3 L5 i5n i61 i9r iA7 y2 D3 *65 i5r i62 o0U u O68 +6 Y1 +2 [ i28 i31 r $u $m l $. $c $r l $. $c $v l $. $c $g *3A O08 O56 $k } *42 Z1 i3q -5 i4a i5e i6l i1o i2j $n ^f *23 r $i $e $s T1 T8 T9 i4n i51 i2e i3r i4t i9t iAy iB1 i2r i3r i4y c T1 sa@ $2 O52 O03 *50 i5i i6g i7h D1 $6 r $c $y $. $a $i i1i i2k i3o *21 o3p ^- ^n ^o ^n i0h i2l i1a i27 i31 i4n i5t i6i $. $s $y l ^9 ^4 ^9 ^1 o0y i3h $9 $7 $1 i0c i2e i1h r $o $v $e $r i9i iBg iAn i2a i3r i4k i7o i8v i9e ^n ,3 i2i i3g i4h i6a i8s i7s i9i iAd i9i iAs l ^m ^' ^i i9d iA2 i9d iAs ^o ^n ^r ^o ^p l $e $n $c $e i0a i2l i1l T0 TB T8 i2i i4t i3n $. $w $s i8o i9m i8o i9l D4 [ p1 i0d i2n i1e $. $t $n i3r i4e i5t ,4 $2 l ^d ^n ^i ^h i0c i2l i1o i2o i3b i1a i3o i2m ^s ^m ^a ^d ^a k O51 +2 i27 i33 ^o ^t ^i ^t i7a i82 i92 i7a i82 i91 O24 *8A O45 o78 *20 p4 } E Z1 OA2 L1 { i0D ^! ^p ^e ^p i2r i3l i4e L8 s4k p2 i2i i4e i3l $k R4 .0 ^y ^- ^_ ^- *02 i3& i11i31i51i71i91iB1 i2N $j l *30 ^1 i8z r +9 -E i73 y2 ^1 ^4 o24 r O05 *46 K o2] o0m o5u o3z r *2A O04 '7 *32 o3l ^, o4y i59 o62 z4 +5 o2k $2 o0y $2 $6 o3> Z1 ^v o5b $a z1 i2X .4 +5 o0g i2a y4 ,B ^0 } -0 ^2 } O35 O17 l ^J O32 sHY$!Y1 $Zs}S *05L9 i42 .5 Z1 O56 o1v*09 O15 *B4 OB3 *14$b y3 L7 us3,y2 siy O61 smN E^NiAy O05 K *46 spNsRs O51 R8 T0 O29 *62 OA2 O9A s0'*26R8 T9s&%s1+ z3 $d i6$ +2 st1s|U y5*64 ^h ^c ^i ^m o4] $)s27 y4*24sao y3 *34 ss1^x *70 OA5 *02 i1L -2 o3A u -1 +1E $5 *32 O36 OA2 *08 O79 *21 *02 $3 l $i $x [s&%sdx T5*40sng E OA2 Z1 O56 O94 O67 +7 ^3 O37 o16 T5 '6 $w O36 O13 o1b O96 O02 o56 l ^t ^o ^p *07 R7 ^d i8d *60 o1f +E -9 Z4*67 ^a D6 *10 OB7 Z3 o0h }$6C c $e $n $t ^z se^ O69 O57 Y1 O67 *8A o1x O0A +3 -D *89 O36 lz1s?- i8} c ^m ^e o9( O64 *25 l ^m ^a ^ ^i s(P i4w O28 i6= O48 y2 *4B O14 R5 ^k *37sTz y1sCJ,5 { *B6 rskr *B5Y4 L4 o5E $p Z5 c ^t ^a ^c D8 z3 O36 swe } $Oi9W l $u $m R8 OB3 i4d O93 z4 o2Y c k }D1i9< O56 *08 o7D O82 *81 ,A l $ { E O93 c ^n ^u ^k,7su| o0s *24 ^ ^u L7s0q O8B *45 D1 svZ O27 $i Y2 $0 O84 O05 sAG +7 sjh $r ^c*34sj1 O16 Y5 su),0sin OA1 i9f O96 s2U OA3 s|d OA2 OBA *AB *63 c $o $u $r s]' s'i O54 .6 O6A i8a *41 O53 *75 *04 s&' O06 c ^t ^e ^j KsO7Y1 sCvoA|slv s]h [ soA s8M O1B s'" *43 si1 c O57 c o0? sng*80 l $s $e $s $c Z3 O46 *54 *64 ] s.-o8B r $h $e $a $d O57 f s!4 K f Z2 q O15 i9q s15 sw, O45 $TT4*B6 s O3A Y5 o53 Z5 ^vsq_ ^Z*31sP= s0D O09 *39iBHZ5 o28 O36 s&j y4*90'9 D4 sfK i9]*17i0# sA) O57 *15 *23 k O89 O09 o6Y O92 +6s/sC0 c $. $d $e C OB2 ^D *60 $3 s7>^( p5-7 +4 { { RBi9b y2o4h l o7R spo ^> O7B *79y1 i7Ns>qi9P sby O31 ] s29 $e *8B O04 Y2 $ O06 ^^*2A '7 $# z1+9Z1 sAO u o87 O61 ^- Y2 o8l ^4 l oAC sPissZ syt O8A O59 sC+D4*04 soJ O64 O89 O26 f l $a $m ^y O49 C $a o4x -9 O79 *06 s4W s4z z2*19 OB4 Z1 o5. ^y O9B o3y *20 OB6 O41 s$Sl c $i $s $t o6i O85 r $a $g $e s}CsQ[o9K $"sLmD8 Y5 ^2 O3B ^; sBDsbQ sjt*82sU| Y4*B8 $''9$Y R6l*1A o62 ] c y1 '7 ^1 'B O37 Z5 } O18 O15 sze T8 .0sT| [ Z1 -7 z5 Z3 O8A sUh i5i O12 $Z*41r ssr*80] ^a ^n ^n ^a ^w O16 O48 oBz D6 l $o $e $s ET9 *17^_ O56 i3x O73 s5} o8x Y3 OA9 s&_ ,9 O53 O64 *42 sT$t K O8B ]y2z3 c ^u s{js0i D2 T3 O36 T0 c ^s Z5 O16 O37 sos saS^ds|, O46 O68 c ^f o0m i1o qs . '8 y2 p5 c ^l $d *19 E*B4$N t*09o8u u*B8,5 O56 *47 o0f +7 $w O54 $[swS O25 Y1 { c ^E O8A Y4 ] O64 i8! u O1A ^m [$cs39 O76 Y1 i0v O68 .1 *69i7W O2B y2 c ^h ^g ^i ^h s)m]$j o3S O76 s[Q *47 OA8 -3 o2c O6A z2 o3I p4 s@e*16 oAho4j saYsF+$% O1A O1A o0@ ^q O41 c $l $o $o $p *65s>?t c $t $h $e D8Ei0$ l -3 D6 O56 sm\ *5B s1%oB1 Es}`k syV.A *64+8*3A O24 r Z1 O25 *9B Z2 p2 O53 o5u ^o ^h i61} sYK O0B *97 u o7" s!Y$\ +1 ] O4B z4*87 $5 Z2 O91 i4, O82 $2 O36 o83 *28 O84 sbu *06 iA4sIXt iA9 ssD i1LtT6 s9bl $5 O91 Z2 i3g *14 o7hEsxz Y3-0 oB5*78 O75 O1A s9l O94 $Y O7A i0` [ O8A sG[ ,A*06 Y3 s,y O17 sM%sBuT8 y1 O58 L9}z5 O53 $Z O79 i2Tts5{ o3k D0 ^j*72 ^d*B1$S +8*60 s*j ^U*B8 Z5 o51 }sHPu z5 ^3 t O73 r i0O O48 s42 i5p ^1 p2 $d O67 *95i3v p2 *40 *5B -9 O45 srvs _ O94 R9 o9# oA5 i6^ O73 +9 saRsSY O42 $i p1 O28 ,9 O34 snt O6B *30 O9A Y4 o7c ^Y O4A shvs{O$m s_; f O63 O05 sk. }*76+9 OA4 O26 .4*A8^p O38 C i11 ^w -A sMX .1 O45 O36 O45 DB i9kssUTB Z4 O38 .9 i5T u s*X^v O15 sfn +BsCG.A K O23 O65 O13 sjw +As%8^. k O4A O91 sTv $e O6B O24 E u D8 OB7 O85 ,A O54 $v Z2p4 i12o9VR8 sKn sgA O34 z3 oA# *21 d i42 ,9Y3D0 o0j o2b O25 O79 O02 d O04 iAss-8 O85 O25 -A O26 y3 .1 o4r ^Z*8A OB2 s.3 *6As7- o1h k o45 +3 sz|'6$d t o2$ svV z5 s02 O18 +5 O64 *97Z1 O95 'B O97 O6B Y2 o8iZ5 o6, OA2 D4 O04 y4 *21 u *42 +7 o0m OA1 o5o O31 *25 *79 z2 O67 y4T6 sv* y2 *32 O95 ,5 *26 k p3 ^#sx_ p5 i6f y4 +5 *98 p1 *50 Z5 O26 *B5*A0 -4 z2 iBu ] *03 O02 O13 O96 i4n s}'s4uE *B4 $g O08 R1sl3 o5!Y1 iAjui6U ^# O72 { *64 O72 c $1 $2 $3 $[ *48 O86 T1 $' s@ms}&L6 o6f O42 s9% } O63 o7_ *74 Y2Y4 ti0hsU# O52 s"! s+} sh5 O6A k i1g DB Y2 Ei32 k Y1 O73 si3 +0 i92tz4 O23 $y syB O15 s^B q T1 $i s0>*52 *BA *34 z2sW?$A [$C *67 O85 -5 p3 o8W O12 $9 Y5 s20 O12 *40 ^m *57 *51 Y2 OB6 ^q-7.6 *B0$\ *48sbK i5o i6$ O63 K d OBA ^l ] O65 sl3sB4i7L ^y ^d ^d ^u ^b s1w*1A ] O97 +3 l .0 O42 ^b O41 i9i O2A *B4 O08 $g $T p4 O85 sAQ *30 E O96 d *47^Y *95 OAB ^= sj9 D1*26sF% y2 p4 *58z5s(5 O41 O52 O96 K O1A y1 k o3n z2 O58 z4 z4 OB2 sT|*9As0H i9;sZ{ sYX*87 ^f O26 o3o i3b ^h ^t ^r ^o ^n r D1 -3 y4 iAb O1A o0z } z1 y1 s1g { s|c'Bz2 +3iAt O72 $] OA7 st; iBS O68 sQ* -8i3d*74 o4m'8s37 OA4 O87 s3G O9B z3 O47 O73 *92 ^x u st! i38 K ,9 TA o8q.A *96s>g*9A sO4i8^ ^7*27c *60 O84 s9d s7#sb4 sFL O36 y1 O45 [ Y2 i0a p2 $H $B z1s%?.2 z3 O14 Z3 s?o s$z sop*7B sbn k sfn sEu OB9 O58 i4x O43 $z O15 *61 sy. O32 +1 O4B ] +0k i5l O72 *A1*06s*g O93 O15 D8 } K O8B D9 s|-s2a O07 $@ sV/ O87 -5 iB; O31 o10 O42 u ^| $| y5s$b *1B O74 ^l ^i ^b ^o ^m o87 ] c O18 O16 sz" c*2Az2 *9B O86 sKP O39 Y2 sfds"{ *89 O94 Z4 O89 .8*30 Ei9\i7H O36 sL( i9K sLF O26 skQR4 ,BsJgi1Y s_N*58 o0r O91 Y4 OB8 OA6 *4B O93 *79 $R*87k O87 -A K .B $5 .7 ^y ^t ^t ^e ^p szb+B ^t sgc iADsl1f O03 E } .Bs]eT8 *31 y4 i4d d R8 O06 $/L7 s#RsMj*35 z4 O28 p5 sfMT0 T0 o1A o0b y2 o0z z1 } -2o73Y1 ^= O8B z2 O48 *A1i1m *04 ,6 i8F*15 O63 z2 slb Y1 oA)s0+ t $F O4A $e.2 *A7s!#so; -6{ *05 o1h s+j y5sbyD5 O61 ^? o3j].6 s+! T0 k i2! sG. .6D5^n ^s ^e ^n ^o ^j .B O74 *27 O86 O13 O57 $0 *57p1p4 [RAZ4 ^p srk qs1jsUO .1RAt Z1oAh$C O16 O97 O85 *69 ] O59 *27 k r p4 i64 O14 R6 ,7 o7r*34s]x ,9 k $& p4 'BsdFi7v C^ss^c *13 Y3 i9H O2B se_ O06 o9e*34*73 *23 i2f o4 sKT y5 O36 { o9y slj srh O6A $[sk] *A7i9%Y4 [^! s'D$} sd? z5] Z2 *38 sTYo2o sd@ O63 y5 O49 i0n u O3B } o9z Y1 s/s *30 O26 ] sr4 Y4 *85i3psJ` r *43 O74 *9A sG, O91 $6 o9w [ O75 O04 *9Bo7vTA p2 O67 $d s]P^? *09sc@ O64 s2L Y2Z2 sWA T0 O84 z3 -8 O93 co0x R7T9^] i84 i2e O3B o3W ^9R9 ^h ^s ^i ^r ^i ^e,2 O5B O05 *8A}*04 ,9s#B o1OsymsYm sOeT8 oAu.3C *51 y2 O96 z1 i5c s62 Z1 O9A *6Bo07s^) O59 i3_ *84 [sSs s'- i01 i8o y4 D2 k Z1.9 o9@ O06 u ^q*89 sd*}R0 so, O42 O81 O16 p2 z2 *69d] sqv iBi O16 c^\sP| sxXY1$E ^y ^n ^n ^e ^d oB= O09 i8F O9A $'LA -6*25,A K*B8$& *A5 p2 y5 $4 o2e *70 O59 ^y c O07 o0z O72 O12 OA7 ^K O92 p5 O71 ^e u O48 o9a o9"Ki00 *51 O29 $n O84 o5p *89o7u*14 .BoB'Y2 .1 o5k K ^u $> OB1 sDj O76 OA2 s6v *86 O62 f .4 *60 ,5 DB ^u p5 Z1 OB1 O2B z4 q O5A O02 +0 .5y5 i6Ms^f*A8 O67 O78 ,6R4 K O96 O42 z5 Y4 O94 O87 oBh s1` sn#*AB oB}Z5Y2 c O18 ^r ^e ^v ^e ^n i5H O57 OB8 r O41 i5a OA2 $a l{z5 s7!-7*53 i7D O59 s!t O42 o1u k o3k i6s O73 Y1 s7& ^H OB6 O71 *69si4i9L s5@ O63 .A O54 Z1 i3a y4 ,5 q ] +4 $1 s)@o3Y O17 ^A ^L sH|Z1T2 .5i5B ,7*17sQn ,8 ^y t sdn O17 ,6 sPy l iBIt*79 k i58 $6o8y sc(sr(R8 c O16 O18 }sSX *93oBOs0H *94 r O72 y2 O68 $}o8B O59 c *87 p2 i2o O38 .A Z1 O54 +0 { *B0i4I R4 y2 s&uscS ts0E *3A O92 O24 D3 ser *58 D4 Y1.4z4 O26 ,4 u-5s?U *57 *69 Z5 O7A O18 o3n sTl q } o7P ^l *20 ^9 *76*34$5 st7 O57 *B8sr5*59 Y2 O3A O36 sj4 O37 ^c d *35 *15 $0 sgD*06sdJ o3f*78RB z2 O96 O24 ^d Y2 DB o0p urz5 c i0W O78 t.8} O62 ,7 *75 *67 *98 $4o1l*40 *96R0 p4 o7l o6a R7*53 Ci8n *72 OB5 k T7*B1+1 O76 *04 ] *31 O48 +BLBo1c }-5-1 iA9t *7Ascq O78 i2x O47 OA4 *38s(%R4 z5 D8 O51 o31 O65 O23 ,4 s.8L9 *03*57k c $o $v $a ^g ^o ^b rCs-2 O76 oAS s.y 'A O01 T4 o9BsO( o45 *14 }soI k^g sw[ss_ D0 se6 i6aT1*B6 $0 Y1 O71 D9 t $c sgd *19^` i8!sbI iBT^y sN-Z1*60 O39 O65 Y1sim^b $4 D1 s62[ O03 ^$ i8d.A o32sqBsS0 o8h p5 o2w d o6! *46 T3i8Q $T O83 y5 d .7*76s8v *73 O62 *08 O3B $F R2 Z1 '8i5# i75 l +1 f *64 i2v p1 ] i4i i1#*7As?U *7BT3 o5j +8 Z1 *B9s9C o4psL^o7i o2R O69 o0K *09 l [ Y1s@sk sMh,A sshsVu *62 O38 sfjs)E s?Iku Z2 o1- .0z3 r*73 su;iAY s/r KsPE$c $k $a s2c [ $D O0A C O42 T3 o2$sUV y2 *B0 D9*A3R4 i9y O95 *23 ^' O2A c *80 i6H*A7 s1u$, } O85 *A4 Y5 O58 p2 T3{ -6s-_r ] i4- *A8$F OA8 s2 *A7 *63Z4s<$ slZ *A7 O04 c*72Z4 T0 $b ^P [TAy4 sw0soK sNMi9T i6#.2 OB3 s2L *14 *02 i1q D3 u $4 -4 *94 iB[qs4! oBpL9TA se5 O39 *94 +8 s!Q *07 *08 o8BRB D1 o3O [ oAG ]$tsi^ o7} sCPlR5 s-0*A5slP sql d i6x O01 Y4 OB9 i62 ] y2 .3 O62 *B3f i5ps>X ^e ^g ^d ^o ^d R6 D1 z5 O39 c z5 O18 ^o ^h ^w O43 s2i { O8B K T3$L c *26 O47 p1 $v O73 i6N*B5ss( o2' } .3Z2 s#_ sT2 O85 s/O ED2LB O9B .7 } sVR ^asW(y4 Ks#/D4 [ O96 T6 Z3 O68 *03$6 Z4sV| +1oB! *09se1 s[`$j $DsJG o0vf D5 o6o sjX$$sf^ ^y ^l ^l ^e ^n *05 OA5 o4d-9 *39$N -6o9> o1k L4 ^koAx i3L r y4s}Z u o2$ OA1 sBGR5sd4 *3B]] o58 O31 scF O15 f f O39 .4 [ o4% O23 O3B *2B D2 +5 i5# d*42 sdzo2a ] o7u p3*B3 O65 -3 O64 s2oz1 sFOp2 OB4 { p3 u O74 *43 O32 i7w y5 [y3*B3 OB8 T6 D3 y3 O62 s76$f LA$t ^y ^n ^n ^a ^f Z3 O24 sUE $o O27 { O2A i39 *9B-6 l O78 *30 O92 sE+y3 O72 OA6 CsY7 i5iL8$t D9'7p4 s_v$c O49 l '8 i35 R5 L5 *1Ai9D] ,8K *02 O87 i35 R5 L3 'A$) p3 O15 Z5 sj D0 Y4^2sa% +7sZj O61 p5 O72 O64 OA4 K O19 O46 O78 *67 O86 O72 Y4 O63 o7hi6u c$J *A2 y5 O03 O78 y4 L0o0hi8) q D9 k O68 sta O94 Y3 *46 $u OB8 *67^jsGY O26 i2p i59 L9 L5 O6B $2 y2 i56 L1 L1 ,6*09sV( *B8 -7 {s#Bo0j O38 Y4 $hY4 D2 [ O2A s>b$c *39.6$m o6=Z3Y3 *71 OA6 k t Z1 y5 i9' O93 i34 R2 sZL*B3i8z O84 *2B $c s6?+5s3h c O03 O59 sJesXa-4 O34 s6E T4s*v O3A $y s}JsV**57 ,4{p2 }iBMi1f s!2^w ds"l *A5oBX[ $"*3A Z1*23+2 *1B ] O78 *79^` i71 R4 R5 O07 s}* $b K O36 *8B .7$m sE\ O63 oB8 Z4,4q ^'sLG O54 *65 o6r *2B]$g OB6 Z5 iBg O17 i5O O53 O2A $M srG -2y5sL" i2l u s"'*A9Z4 *B9-1 q *87 -B*34sG$ i73 L4 Y3 O64 K *93o6yse, $8 q lDBi76 .3LA *64 O41 O4B {s]%*20 *58 O92 +1sSg *4B O42 O79 ,4C R9 O65 y2 o7T+9 ,9 *21 O47 sH< O81 y4s}@ i3b R5 R4 syY*12 ^fs^2*A3 Ed*80 i70 R8 s53s^}Z4 i39 L5 L3 y1 o0q OB9 ] O75 $. O6A i0s*BA +3]s+3 i3a R8 L8 s/asu0 s_Eo1p R9R7sG3 T6$8Z3 OB7 *02 $.Y1sI; s&^p3sCo ^jy5 i4p*B7 O32 OB3 oA} o0r T5 sukTA $k*29 O78 ,7 OA8 O3A +4 O95 O95 i9y o6Yr s)Jo6$ i39 L3 L4 OB6 -7 o4us5@y3 *32 O2B '8y3y3 s(r*54R6 i6!oB=$! uoAI i3h *20 O48 *70 i10 L2 o41Z3 T3sD(sp[ *4Ai5a -1 O05 sI.Z5 iBMqy4 ^n ^a ^m ^o ^r i5a R9 L9 OB4 o9d sG/ OA3 O8B i5o *47i0i i3c R1 R4 $j p4 ^5.B z3 O5B z3 O52 i5w D6y3 $ s^l *9A q O78 y3 i6c O92 O7B oB{ O31 s(o-5 iBZ}*74 i5e L7 L6 ^gK O86 D8 oA. z1sT"'A s4r-5] O23 s@( *12 O86 ] p5 OA9 D2p4 R3Z4 i3e R1 R0 O89 y4 R8q Z5,7Y1 T9ssv *BA*20 p1 ^a O67 OA4 O73 E O84 T3 R9$@ p1 ^l O43 O45 $#sQv srl Z2 O12 *38 s)uy2 *69$l y2*70 K O7B i12 L1 R5 sFa^(s<) ^xs#c O63 $1 o6v*92 *10 O05 O48 ^z i3m*43 TA,5y3 i35 L2 L2 p5 O92 L9 R9sNT s@l-5 *57^( s@} OB9 i1a O53 y2 K O2B *21 DAo20 sT*R8 sE**41 kz4 sx)p3 *6B^e LB O95 t D4seZ$9 i57 R7 L5 y2shRsmB ds`! +B*31 i18 R2 R3 O93 O7B ^j i37 L3 L4 '9 t O73 Z5 OA1 O48 T5 O93 OA1 o0u O1A LB O87 $Y Z2 O98 .5 ,1 O69 $_ O29 y2*29 O8B u -4-8*40 O56 *87 sIA O18 *20 y3D8+7 O18 D1 *A3*B0i89 *43sMg L9^f -4s9& ^s ^d ^e ^e ^l fsq9 t-0l Z4s;[ D7s-8^r sK8 O63 *2A*34 { +B O69 -4 O85 $m O19 s_E*64 i9F O73 *A2 s[" O24 ,8.3*24 oAa^h O7A saG p3 o76^w s_`+5r $)sFU *B8o3h *A4 s*L O63 D0s80u s.g$y O82 ^e O19 *54 o3c *95 O78 O4A O52 K i7o s{$ O4A *09}Y5 syDT8 s46 O34 *73 o2f O96 }sj{ .7y2[ Z2 o6P O64 .9[*A3 y4s\! i1e R2 R0 O95 +A O94 L8 O35 oB#s]7Z3 sSJ} i72 L6 O68 .4 oAZ o0t *92 O72 s=s O65 i52 O19 *A5 O43 Z5 sIdsNGi2s OA6 ^g i14 L2 O53 sR\ *68s?Q *3B ^w O54 ,4D8*28 oA" O02 i1r o6gs*k*89 o3k ^u ] s_} O24 O0B O73 O75 sL\ O5B o2r shO OBA -4 i37 R5 L5 q*80 i16 R2 R0 Y4 O07 O6B ]i5ml Z5s&Issy s?NK*83 O84 $j $g O68 *3B .3sYt i73 R4 O65 ^H D1 swf sok O75 *79.2D9 iBS sgd O02 O94 ,3 +3 R8 O76 -6 *37 *B8sj2*71 Z1'B Es89 Y2 o7f OB4 sXPi83 +4 O59 sRi*23 ^d spP OB8 s!c$q $. O7A ]Z3 'B*20 i1f R2 L2 ^r*78 i31 R4 L3 *89D5*86 *84*52R6 suf O73 -4s5< ^ou OA5 R6 D5p2 +8sViY4 sK5*14 ,8^2 o3m $o i31 L2 L2 *78 O92 O93 *35y3$6 ^wT6y4 K i64 L8,3 i1a R5 R4 *5Bs+\d +1y4 Y1+A O8A +1 *49,8} O78 O45 sO1 O73 *92Z4sCI Z2 *50 [ DA O87 ^u f .3 O37 ^b i1d R8 L8 O04 ^g O78 f .8 s Ess%f *B5i1fo1v i16 R0 L1 i59 L5 L6 i1lo4.d O92 r sK_$w *30y4so[ O7B p1 ,2 O57 *A7 p1rs=a sE>iAm i2i ^z +A*02-3 sU['8 *79D4o3p sOCT8 ^Ps{R oB^D6$w su2 -8 *62 sR& O19 $s Z3 *14*A2 *15 O95 O0A l -8 O86 -1 sih y1 O03 Y2f *40o0rp2 rs;U OB1 o24 OB7 sR" -2 s'ry4 D6 i1o O57 L4 t D2 O89 $; i38 R0 L3 s(| O75 s8U o3d z2 *A3i2e $z OB1 s KE s&%D0 qs\. o8&,6 i27 $3 O21 s*y i3l *59 *98 sxDD7sGl s'=*15Z2 [p4 ,5 $a Y2svP *54d O62 s]F ^m] O62 *A3 L9 *2Bo80 O2B +3 i17 R5 L1 +2s$W $7 O34 ,9 OB8 ^x OA3 O65 sm` *2A$c y2 ^* Z5D1 i14 R4 L1 s^X Z5 O28 $y *A1 i2s O59 [sp*+0 s[r $j OB4 y5 O97 +4sl(sY> i1b Z4 o0tT7 O94 $; O73 z2 ^k *53 i0csf# uf*14 i5su p5D9 $v O62 s_V^b O83 O43 i2o OB1 Y4 syas@` +6 s+^ O27 i5i*76 O6A t y4 i0eoB6s!@ i3c R5 $D -9 OB8 i38*89 +Bo3z +7 O38 li5r Ey4sJ{ OA4 D4 O97 O3B *48 O54 ,1 O45 d TBsd4 O7B o5S .1 O6A *B5o2m *21 O19 *BAo8i O04 sRf *81 *A9+B$v skg]RB O05 o3U *53 O62 '9 ^olT9 D5 o4+ *7Bo3m Y3D6 s52Z5 s8Uo1k OA9 .1 Y1 O63 C *56 sRM O43 p5*75 R4oBi $oE y4 O47 *B8 O65 $o oA&p3t *84 O5A sq-sAfo4l O26 *12 L9 s}k O63 [ [ $3 [ [ $5 *23 OBA O0A O09 *8Ao5f *07+9$c OAB ^e i0n*09 i0] ^[ +BD3 *89tY4 OA5 OA1 +0*95*16 o82 OB8 s(6,9,6 $s *53 O9A $us;$y4 s|fo1h y2 O71 O3B O34 s,< ^o i1' z3oB]s1s *1A D2 O39 O13 skS i85 OB8 O07 *A3 O23 i39 L2 L3 i58 L4 sp' o1V*58+3 i18 L1 L2 s5X O83 z1 c T2 i2. ^[ O75 D9 L7 i70 R1 L1 sOT i5c R9 L9 .8 OB2 *04,1s3r O71 s2x srL}*35 $]sc@ E.4 s`{o45i22 O3A OB1 i3c R4 sVk O16 } i32 R2 R4 sY? i32 R4 L3 i3c R5 R4 ^e*72scT T4z1.4 i94*4BL0 sWQ,3y2 *26iB8s]D Z5 O17 *06 T1-8i25 i7e R3 L3 i16 L2 L1 OA2 k *79 i32 R2 L2 Z3*1A.6 *54*3Ay2 i19 R8 L1 i72 R2 D3 o3j Z2 T0 o9A i31 L3 R5 s7a ,2 u i12 L2 i17 R3 R2 p1 O03 O53 O95 $x Y1 s#rs>) O28 z3 i55 L4 i19 L2 L1 Z1 o3! r O53 z4 } $t O4A *38 i34 L3 L5 i37 L0 L0 ^vc i59 L2 L2 k*09z1 iBM*35 sD{i8=.0 i70 L5 L6 iBG soX O32 c *98 Y3 *94 O14 i16 L5 L1 o4gR7 sJh*A5 t +4 Z1 i33 R2 R1 i34 L1 L1 *20 z1 O37 *12 *68 i36 L1 L1 i8` *67 y1 O43 s_} E O26 ^% $l t i88 O32 LAi0ao6h *72 } z1 *13 D5 O95 o1E } ^no8O+7 sn; iB(s.X +BsxG sp5 *75L4 i95 i4| O0A i13 R2 R3 y2y2TB *52 R6 i17 R3 L1 i6m y4 O07 .1sat*69 i3c R5 L5 *28$1 i31 R1 R2 i16 L1 R7 s^eD2y5 i33 L3 L7 *26 +4 z1 f O17 D5 i35 L1 L1 *17 O42 o4K $0 p5 iA8*BA} O89 ^> T4 i37 L1 L1 O08 $b Z1 Z3 o6s +7 O48 iAa i51 L4 i52 L4 L5 O47 +0 O84 *19Z1Z5 O89 $a Y1 '7 O51 i70 L4 o0Do9} O21 ^y i37 L3 R6 o8p *20 +5 L0 OB7 sQD i10 R0 R2 Csfws$h i6p o74 i33 L4 L3 i70 L6 o8[ O69 oAS z4-B Y4 i0i i78 R2 L2 i1e R5 R4 i57 L5 L6 i57 R3 L3 s3g O2B i2@ L3 O58 C O97 o8X $1 D6 Z1 o9cDB O34 { s*r O93 iB= D7 O27 o6!s\$o7V sc! i79 R8 R6 i3f R4 R5 O04 ^m Z5 i37 R4 L3 i52 L1 L1 i57 L3 R1 L1 i57 L4 o7J O4B k i18 L2 L2 O74 '8 l -4i7!iA0 sY'o5) *12 O93 t sw o90i2E l.3} i39 L3 R6 c $7 $E *B9rR6 ^a ^d ^a ^d i7Ys70*64 i30 R4 L4 sk6 u ^7 ^f u ^4 ^8 *24slwo3C ^l ^a ^m ^a ^j o31 ,4 sc6K .7iAs$H { O95 O16 z1 $A{st| u ^7 ^8 i53 L4 i53 L3 z4 O16 u ^7 ^3 c$.*92 ^e ^o ^j Y3s0Ly3 -5 OB3 sW7 E OA2 $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 *68 OA7 E u ^0 ^9 *56 O68 u ^c ^d *3Ao6ts|O u ^c ^e u ^3 ^b y5Esk. i5a R2 L2 *36*29syo *45.0o8[ s!c ^yT5D9 i1f O09 u ^3 ^4 *59 O98 i10 R0 u ^3 ^1 u ^3 ^2 saTY1s1F k o1P O49 i3i O02 $#*03 u $B $C u $B $B ]*A6r i55 R1 L1 *19 O78 i3d R1 L1 O51 so '9 u $2 $A i74 L4 u $E $C i3d R9 L9 *52 O51 i4` O46 c ^3 ^c sph*12sR6 i15 R4 R4 ^a ^R o9=s5boBl u $f $3 u $5 $B i76 R8 o3b *02 c $f $x .8p4 s-`L2 sa4R2sI7 T7 O05 i5e R1 L1 i32 R4 c $A $8 $/u *A3 O58 O2A i15 R2 i51 R1 L1 i53 L1 L1 c $A $a i54 R4 L4 c $A $E o3v^I u ^f ^0 i74 R3 u ^f ^4 *06iB9*A8 li4V*A3 $8 -3 i37 L2 L2 i37 R4 s[t i71 R4 $k O32 u ^a ^9 R5 L5 i50 L1 L1 Y4*58*B3 i36 R2 i3e L6 i31 L0 L0 *38smoq sFU i77 L8 L8 D2 $1 D6 u ^b ^6 C*75 u ^b ^4 ^s ^l ^l ^e ^h i55 L1 L1 ^9 ^x u ^e ^7 u ^e ^0 u $D $2 u ^B ^B Cy3 sma O78 R9 ^a ^m ^m ^o ^c Y2o5A u ^F ^A i58 L1 L1 o07 y4 ^[ K *90 Z5 Z5 u ^E ^C Y4-4] s#9 o7t O21 s#( ^a O31 p1 sve t O57 u $F $A u $F $F sQc sQn Z1^k p2 *87 *63 T2 [ K sw% c ^e ^C c ^f ^b c ^9 ^b z4 O7A $5 ^x { o4# D7 O85 y4T3D5 O08 r u +3 sk5 *A7 O98 $/*25 o5B *15 i3y O13 o2D oAa*94 sE> c $B $C OB1 y5 } L8 L9 oBt O28 ^s ^o ^s c ^D ^B skM sk] sRno1YD7 sL C u ^D ^C c ^x ^A T2 *51 p2 O78 i3M c ^c ^d c ^c ^c o1Q u sFS u $F $1 o5} i9f} OB7 C o1Q csev*4A sDq L2 '7 *53 R0 R4 ^w k t O47 z1 ,5 u ^8 ^4 ^d ^e ^t *45s@Lo8; $h s+j k*08 L9*78 D1 O36 y5]D8 d *67 sczp1 sLv *27s`Q *21 $W Y3 *93 o8}}^p i0ay1s $a Z2semssY i4k R3 r +0 +4 +A Y3{iBP $0 *95 OA2 i5> O83 L8 *64 Z5 *32 O39 r o4? c snj o8< *78 +B +E +E sLs o5h O39 +0 ui5A ${ y3 oAw +0 -1 -A +C -9 -9 c O84 *63 ^y ^l ^l ^a ^r *96 c O43 ^3 Y4+2p5 sF< $O K s2D ^0 RBi0> sfy $o O21 q +B +C -1 O05 O13 *60 o22 +0 +D +D *68 sZ8 C $2 k R2 $6 z4 s*l*0AT9 K$AC *05 z5 +7 *30 Z1 q O74 C o0j OB1 sNj f *75 *14 i3z i4O D7 o7% O51 s(i p5 ^w -4 +8 +F s2D d O1A s(J O15 -9 so@ O05 *26 -2 $5 s"+ s52 'B O83 Y4 Y4 .1 *52 c $n $v se= s"! $k O06 ^D O4B *1A -6 su5 { *20 u i50 i1b s_W E sTn *9A s1c i2j t *23 p5 s*\ *20 ^` i1b i54 O16 $_ -8 -F -F s&` s&q $'*A0s{A *64*A9ss/ o3W T3 Y3 o5>iB# i7D z1 *64 *32 Z5 sBl o0c ^s Y1 k TA i74 i16 Z2 O09 { i2 *68E OB3 *9B O67 *32sxf *07lZ2 *01 *4A O57 '6 q T5 *45 T1 { Y5 '6 [ y5 *A7 +7 +A +A -5 -E p3 .A i0& spq sn! i1c i73 .9^;s-] D6 O47 ^U ] ,6 -6 o7, y1 { ,B o0iy2 s)+ *A1 C O08 i3d i58 *9B O74 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 O53 D1 *15 s'Y oA) sXcs^U D1 L3 i7f L6 -8 -E o55 Z1 t s'= sx= +2 O57 O38 ^y $F o9w $c *63 $0 sdY r } u k sr^*A4 sUA L0 o56 ^e ^n ^i ^n sN$ O49 i3S z3 p5 s$f O76 k l *1A L0 O27 O08 *20 s)Z *41$vT8 +A +A -2 '4 Y2 R1 OB5 r +C -1 -1 R4 Z5 O67 D9 L0 s8z i79 i17 *B4*09o4; *AB O89 ^3 O04 iB4 o5p t $t o7f *30 o2a O07 Z4 i79 i1b +9 -C -C $2 Z1 L5 +D -E -C i30 i12 sFD p4 *6A ^u $4 ^y ^d ^d ^e R6 } l snu t c $k $i $s $s i75 i36 *21 s0I s_G sem O45 -2 *19i5U u +A z2 '9 *76 ^P '6 *23 s6N $O O45 o6e [ ^- sFvoBV ^e ^l *54 *69 O03 O56 -6 -D -F -F O37 slR $!$] ^) O14 u O41 d -2 i72 i10 sye *68 u t o25 $!$> i72 i19 -3 -E -2 $h O54 *98'Bo3Z i7e i1f s@p $0 k .5i7W sui u swe *63 s@k s@" $`$} $`$~ L0*83 Z3 T1 p2 C z3 O52 ,2 O72 O29 -2 '4 Z3 z4 D8 ^n O7A r i7u s9[ O08 spb z3 l sz; *40 O61 O42 +1 -D -D z3 O49 +1 sYT D8L1 s*^ Z3 o6w s4di25t i3f i50 s*a ^( *25 +0 O86 s9u +1 -C +B s9a s*# s,u c *97*0Au q s0! i7b i33 O19 ^d z1 R4 $v sZW O01 s%w y3 .2 *42 ^l ^u ^j i79 i37 i2sTB^l L0 p2 s3G +5 sZJz3 Ks1+ O82 sa_ *75 O92 $b ^p sAn sS? +A -2 -2 sdSsR^r TAo3m^n O31 i9& *03 o5e L2 D3 Y1 Y5 i6B i8P O72 o8! O76 Y5 se@ K E ^- -2 ^$ O75 z3 'B sN1 o8 O02 o7+o6X Z5 O51 p2 y2 L1 O43 *86 sZz s1B t l [ i5q O34 ssm i9?*63 i1d i50 r *83 *9B Z2 O74 y3 z1 sDz *32 +F -E -E z2 srp c i4! +2 -E o7y *12 O84 } sNy i1d i38 T3 O53 i7)sA *31 Y4rsPR +D -A -A $K q y2,8*03 i74 i38 O26 i3? sP{ s5b [ T2 i70 i12 s"= i7& { s"4 *89 } rs[ko8n iA-y2T1 s"[ Z1 *15 s"m sE$ p5 O3B s"k *20 o5X $$ k o6r z1 oAr K o1n u o2,sN+*72 *1A ,9 *67*37*A8 Z5 .4 *81 O19 o1) R0 -7 s14^_ +E -7 sNT y3 TA s-R O54 ^- Z3 *74 O61 D9 o6W d +0 d +7 O14 o2e c ^1 ^1 ^2 *36 $1 O48 OBA srz r *32 c ^3 s5v sS` l z2 O9A O02 z5 z2 *A1y1-2 l o4! s5I O39 ^i ^j s5= s5' su y3 O27 i2? r ^* i7D O29 *20 $/ O62 $w $o $r $d $|$@ p1 o7& O6A Z3 O57 sAS o2k $p *21 *10L6+6 *53 O14 iAl -4 +B*A7[ $h $o $o $k OA4 p4 O48 smG .7 -7 O89 $| [ scb i7! O75 $; *18 *50 sQ^z2Z2 $l o5p ^k *82 T5 sT% $w $a i7c i10 z3 ^s i13 i78 ^p ^m ^i ^w O65 O23 i8 O16 sgn T0 ^j D4 $` i7c i1b Z5 O23 D5 -9 -F O35 i8' *34 $c d $f i4u i3f i12 soXs\- s*\y2s9G Eo7`*9A +0 +B +B $% $3 ^y $j *92 E o9t -A -F ^t ^s ^a ^e $j $e $l $l $y ,4 OB4 sdN O59 $} O96 ^- D3 d O65 K R5 '7 [ *41 K RB i75 i16 y1D8 sUL sUW +7 i8I sU? Y1 y5 i10 i3c ,Ap4 O07 ^F u $1 z2 O45 D3 -4 -B -B o2w ^8 O4A ] *0A O19 $M O96 t O89 i7d *50 $4 L4 $q $- t y3 *72 OA3 o3I d o0f i2g L1 *71 sz8 O37 Z1 sLT }sl* *12 i2- p1 svg i8e R8 *45 O05 o5\ ^k ^r ^a ^p c $l $i $l $a { ,2 *73 ^y ^b ^b ^a *69 D3 O31 si' y2*19 s)OsHQ p1 ^y $h $a $l $l Y3 k i74 i15 $g $o $n $e *A9*A0 $y z2 ^n $5 +0 +0 O79 ^f *05 $k $a $m $a s(A O02 y3 { ,6 Y2 c $g $o $o $n $s $e $e $d O78 oAZ sIS s1Y y1 ,B O06 o5d i16 R0 ^O {i6& OB8 } $i {*89sCT c $e $v $e $n i77 i14 co2er -8^j*B2 p4sA- $s $h $a $h $s $i $d su& ^Q o1x k Y2 O51 O42 p2 p4 $I s-9 i9u*24 ^p ^o ^o ^p p1 .4 -3 O4B i5> *B7sAV i4IlY1 *5B 'A *64*A0 i9X K $t $o $k $y $o i56 i7f y1 O36 K ,9i3D T0 L2 u i9V D1 ^3 sCS Y1 s-_[ *04sGr*9B z2*1Au O04 ^& ] O73 o6P $U s9S Z2 Y1 D9 $c $u $l $l sJ2 s($ Y5 O41 q O17 $l $i $z $a *A9 O17 ] ^n ^u ^j sr= o3%oBD i3b *75 d .5 ^a ^m ^a ^r Y3 $J *35sy8R8 s^N^] o0I ^Q *35 O69 -9 ^1 i1X O62 i11 i29 i36 i47 O65 r i9p 'B o6a s*z c $c $l $a $w Y5 o74 Z2 k sL? r u i69 $d $e $l $l $a o4a^b ^t ^a ^n u i6' s0r L1 d ,7 ^o ^n ^a ^k .0*7A*26 $c $h $e $n D2 d o5e Z3 o5i o6C$jD3 *9A O46 D5 q o4M { u y3 O7B $d $a $d $a o9# s52 $j $e $n $n $y *23 o5Q [ sgs o3p s,qs>JsO8 o3T*72s*D ^|*0A ^o { y3 '4 i3Y ^k ^o ^o ^n *21 ^p O25 s})t*83 O13 O13 $o o6R*42'9 -0 ^[ ^n ^i ^d $i $s $a $a $c y1 O18 *AB svx t p1 ^e O45 O16 t $C ^V '5 Z2 se# O32 u *69 O02 Y1o6P*82 sP0 syC T7 s6Ck -0 O67 O86 -7 sG2 i1a i3e i2s ,2 s'Y ^o ^o ^g ^H p2 z1 *51 } *58 D6 r O14 o4= O62 c $m $o $o $n *36 ^x i24 *42 p5 -2 y4 s,E su4 R1 p3 sNE z5D8 O86 *82 sGw O41 D9^z *14stEr sXL sXE Z1 stb *18Cz1 o1^l } i5N iBosxQ ^d ^g *70 o0U +7 R6 r i75 z3 *61 Z3 *35 K i4C o65 O81 i79 i18 q ss! u $_ O45 u iB3 ^g ^i ^g i7f i1e $c $h $r $i $s Z5 O69 i4r R1 R4 OB2 O78 ^4 sJ1 ] ^I o7b u o3V sAe R0 *62 +6 $3 i1a O68 $r o4n R0 tsOFsyF }o8Y i72 i38 *07oA&i0y ss& r *31 O56 i8t i72 i37 *2B O14 $` c ^* [ $0 D7 z3 .5 s;V [ ,9 Z5 D5 ^a ^l ^l ^i ^v sbu +7 *63 O13 sDh sif O26 o5\ u ^x *35 k y1*75 sT9 p5^z ^= O2A ,8 O26 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 O85 Y3 o1O '7 lC$/ y3 *23 O0B *41 o1NR8,A i70 i7f T4 O54 srY u sD6 *04 -4 '7 -0 y1 Z2 +8 *65 R3 s#,Z1 O38 i1t .1 Z1 *70 *30 $) i1J O98 R0 sa2 k r i2F O58 i8O { s8O o5w $j i73 i35 *25-0y2 OA5 o0y R6 i38 L0 *14 sCP ,2 p3 '8 ^6 C ^e ^v ^a ^g ^a [ Z4 Z5 sMg sR$s"=i0q $e $l $l $i $e *06 $q su3 O21 smy$" O17 Y2 i9. O46 K ^k ^o ^o ^r sZC $@$| $2 -A D0 $s $e $n $s $e s$+p4i8s L1 +1 s9Z sbL l Z2 $s $t $e $e $d y2 .5 s*']*37 *85*03*A0 *A0 OA2 K i8y*75siM r,9 z1 l O57 O45 z2 *75 Y3 y2 R7 O13 $o O13 i12 i57 s1e i4d 'B o0q Z1 s6N$Lp4 u*97 }Y2o9F ^W *03 sbf z1 i3@ -0 O45 t i4, i9. K O46 sv8 OB2 s91 Z2 i8v Z2 i8o ^b ^o ^o ^b i1b i36 { *40 sEp sEK *67 ,8 E L3 O98 uL5C $m $o $e Z2 i88 oB3 O07 z1 *41 ^d ^l ^o ^m $r $o $s $s i6R sJA ^q $4 z1 sPK t ^F D5 K O13 $Jo8'oA" [ D7 $0 p1 o0v $r*46*53 -2 f [ D7 R5 $k $e $l $l $i *32 t O37 sJX ] sX% O0A Z2 c $m $a $n $n i32 i40 i51 i68 ^t ^i ^m R2 i3c *92 o9t E i42 i50 i63 i72 u *35 E*48 O92 { sCE i88 *64 i5r y2 T0 $s T0 $Y iA$ry5 s#X ${ O31 ,4 O65 k Z3 t O61 Z1 O25 z1 *08*58 sO) ^t ^i ^t $9 s4G *38sDnt sOC i1c i37 *71 D3 o5G s3U ^o '6 k sES[.B $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 O47 i11 i5b *31 o4; iBf*86 O35 f Y4 *53 $s $a $r $a $h Y5 sg+ O1B i79 i13 ^p Y3 s@siA' se9 z2 O15 f sj0 Y5 o3- O79 O67 .2 O69 +3 i5E o49 i79 i1f $p $e $r $e $z i9+{sNg D4 i5D s5) R1R2s3} *81o4tY3 Ez3 i1m O57 O47 { ] f u O02 R0 i70 i38 z3 O9A ,7 O02 syV Y1 $; sO_ o5i R3 i0e f D9 ^7 ,1 *56 O45 sO5 O16 sG5 oA[sV$ $n $i $n $a K '6 C r O94 E O45 K *09 O23 } sLZ $; u Z3 sM3 ^s ^s ^a ^b c $b $o $m $b s_7p5sJ& sM3 ^I O18 O39 $| Y1i9t sMZ sBq sQ-tf .5 *40 q O93 *26 O06 o28 Y4 '9 sVb u ^s ^p ^a ^m O17 R6 *53 +1 { Y2 *16 l -0 O25 O63 $Ns`4*07 y3 +9 ^n ^o ^l i0@ oA2 OB9 sgl $9 sMp Z1 -0 u sPa ^k R6 [ ssAo0= ^n ^a ^h O31 O49 $a $l $a $n $a D1 O49 Y1 ^c i58 z1 i72 i1f DB*A4 ^f $v o4yo5VoBN O1A Z4 ^b O57 srg r *14 ] *27 i70 i17 i70 i16 ^n ^a ^r ^a ^s ^&R8*8B ^g ^b $U O18 D6p4 O75 K o6U o8@{ss/ *61 '5 O09 o4c O69 ,2 sNF $0 Y3 R5 t ] sQV s$k R3*23 Z2 o28 y3 O69 i92 O05 *70 $6 O45 sBZ O0A $8 *15 sl4 q O94 D1 Y1 O49 ] ,8 ] st| s'6 O13 ^I z1 *B5 O16 ^k ^e ^e ^l ^s O75 i1$ z1 O28 O21 T5 L5 s#L OA5 ^C *42 p2 RA i0e y5 iA% OA3 sdx *53 O37 *74 O32 O04 *97 *46 O17 *34 ^!Z2 .8*13 sgv Y1 $b $a $h $i $a c $d $u $d $e i5) sI4 i5$ ^! sCp *20 $$ Z1 -5 s6v o5f C OB5 *A2 O34 ^S t +8 sDX ^E ^H p3 *93sC\ *16 *48 ^csb^ $N K i0M s_J s9u -7 L0 Y2 s;K o4XZ2*76 i1Us/@ s*M s/E -6sow sRI Z2 $a $l $i O27 Z3 { ,7 -7 $d $e $a $d O48 z2 l $) sT7i3J l $] *93 O2B sWS o6G i5M sD4 $^ o9a u ^Y O3B i60 sN7 -2DA 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 { O59 Z3 *05 Y1 sm^ $" { oA3 p4 O82 ,A $M *78 O2B f *35 O59 l L6 u O17 sra*2BC i8a *18 O21 sBx O16 CslR$D *52Y1y2 si/ D5 Y4 ^! *4B O24 {*95^1 str OA5 $l $i $s $a ro9s*26 p5 $! O27 Y4 *13 d L6 [ O32 O65 sts *B5 O26 syH O35 } sEW $Q D4 ^h ^c ^a ^b f *13 s8I Z2 [ svI +1 d $C O58 o9M o3a O13 s8A ^m ^u ^b o09 L4 ^U *07 o1= .7 O47 z2 $6 O21 OB8 Z5 z1 O21 O28 sEo $s $h $a $k $a $l $e $v $i O85 L3 *98 K [ O57 Y4 sSE o0# l $w $i $l $l $s sSs $s O32 [ r*60Z1 i5q o21 sqA s=* Y1,Bo1G ^M $D s=# $b $o $o $n ^^sN@.7 y5 } r Z3 -4 .6sqgy4 K*0Ai8` O34 o65 sT2l $R O07 s*w O5B $e $m $m $a RAl $s $a $r $a t i62 *31 $c $h $i $l $l i78 i17 ^y ^b ^o ^t $d $e $n $n $y s5x [ Y5 u O26 r Y3 saV ^J L3 [ sgZ *20 i78 i1b *73 O37 $P O27 $j $a $v $a sX* L9 O62 $g $r $i $n Z2 oBh O56 z1-2*59 sXs z4 O2A s&+ OB1 $z ^v C OA3 p1 *82 O59 ^H L9s_U *07 .2 $t $i $f $f $^*45 ^W ^B i76 i18 i73 i10 i73 i11 $7 z5 D3 Z2 o3j sG! O81 *5A O08 *85 shl ^n ^a ^i ^v ^a OB9 *89 k u O79 s02 O45 *46 y4 T4 *47 O21 s9J R2 d O1A d O14 k $} $k Z3 sQ9 c o2$ i1d O54 Y4 ^i ^h ^c i6Q O02 r i23 sNa T4 '7 D4 $* O15 .6 *01 Y4 swY Y5 *42 R5 *42 R0 $ -6 +9y2p5 E Z4 shv O46 O95 O34 i53 i1b r i2P ^0 Z2 $'*68-9 $- sgV l z3 -3 -5 iBjs_O*96 O73 oAn *09 O72 s0pZ2 ^e ^l ^a ^v *AB O29 *29 *3A O38 ^8 O59 ^7 ^C sAK sOF ^U sZ+ D0 o5N sZ! O29 q D8 *78 O25 l [ ^i ^a ^m ^n ^a ^d o87 o0j s.% i30 i56 se$ *41 y3 ^t ^t ^a ^m L6*35t $e $d $w $i $n ^s ^m ^r ^a l sd, sQ OAB shu ^3 *94 '7 y3z3 c $m $i R6 *61 $8 $7 $2 $4 .6 [ $b $r $b $l $o $g LB O06 $* $1 $5 $9 [Y4u *71 } O49 sW#$o*70 q O03 y1 set .7 $` *03 $y $a $c $c $p $a $g $a $n Y3o88*AB suy y5 O06 O07 $l $w{*49 uiBS O85 *09 *53 O0A $A d $#$> *62 Y4 sd6 $e O29 u Z1 ,B sd/ $a $b $y $s $s *39z3 i3% } ^a ^v ^a O28 *54 O5B u sDx s04 O86 sO6 sOH*A5 o9- *97 R6 -3 O25 R5 *3A,2$= O97 C O34 $< s K r d sFos'rE o3B*B0 ^f ^i i66 +2 l DA $u TA *72o5! O85 *51 i34 *74 *32 i05 R8 O34 T5K*25 *B0*49s"i y3s74 O63 f D6 ^[ O15 '8 s8t[ -4 L5 +5 Ks$Ss}Z sv2 O76 +3 *14 *63 r i9w O35 u *37 saw Z1 sd4 i42 i1!*95.9 *06 $) T1,2$F s'F iAd O67 E O34 *5A OA3 s'2 $B *72 Y3 O12 Y2*27sHx sILl ^YY1*87 $s $a $l $s $a *32 O3A o3= *03 slU O53 -2 p1 l i5C so" *09 k OA5 D3 O46 o6f i2i i4e i3t iA%ry4 D6 z2 O92 q O61 u z1o8H $5 d D4 s3) O37 ^q i78 i16 $n $e $e $d $5 d D5 Z2 $u O72 +7 s4V s1U O3B O29 i6Z $n*80 *74 i5_ o3Hs}S -2 R0 svB .0 *15 s0Su*7B *BA O6B i5@ $# sbm z3 O3A $l $o $u $i $s +5 C $b $e $l $l $a s|H k z5 $d $i $c $k q ^# *02L4o63 Z2 o30 c sv0 i9V O26 se{ E oBMs-DL0 i56 i19 i01 i12 i2n i3o i4v ^aC,1 r '5 O42 ^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) Y5 O42 OAB $8 $6 $? $? c $2 $4 $@ $@ c $2 $4 $! $! D7sGz c $3 $8 $! $! c $1 $2 $6 $! i1j i2a i3n $g $e $n $e $s oB? c $7 $5 $@ $@ i0j i2n i1a $3 $2 $? $? $4 $9 $% $% $2 $0 $@ $@ ,2 i0" *12 Y3 $= $e Z4 o3u O58 oBX $6 $3 $! $! $0 $3 $% $% c $3 $7 $# $# sNs c $0 $1 $# $# $a $l $l $e $n sy& ^1 d *57 *28 OA3 +5 s5Ei5s{ $5 $0 $$ $$ d $w ,4 i9? ^s ^g ^u ^p $4 $6 $# $# us!1 c $7 $3 $! $! ^e ^b ^a ^b t O12 i3J $p $e $e $k Z5 ] O31 p1 d 'R $0 $3 $? $? $1 $5 $% $% z2'A '1 $1 $8 $? $? O34 C *94 c $1 $0 $2 $! $6 $0 $@ $@ c $1 $8 $0 $! $2 $2 $% $% *04z3 *B7f c $3 $2 $3 $! { i8V O49 d i4, sm/ OA1 $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 *9A O06 sZp*6B $1 $8 $# $# $/p5 sQjiA,} T4 $( OBA $0 $9 $@ $@ $4 $9 $@ $@ c $9 $2 $? $? 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 $* $* 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 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 $! O39 s[2 ^% *93 *2A O08 Z1 sa? s, c $0 $5 $% $% $C z1 *07T3sF{ c $5 $2 $! $! O86 *16 y2 $2 $8 $# $# c $3 $9 $1 $! c $2 $7 $3 $! i3i $y O08 *41 i4y i6k +7 o0b O29 p2 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 $? $? c $9 $2 $* $* sIs '8 O3A 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 $% $% i1F O0B $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 $$ $$ s8wi1^-B $2 $9 $@ $@ c $0 $7 $# $# c $3 $6 $6 $! z1 $x O59 t o3e $P *36 O06 $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 y1 O8A *18 s4B*34o7f c $8 $4 $* $* c $3 $4 $0 $! ^l ^e ^e ^r $N $o $v $1 $1 c $4 $9 $? $? O1B *05 ^? ^? c $4 $0 $7 $! c $6 $5 $1 $! $9 $5 $# $# $*$] Z4s\7r c $9 $8 $% $% c $3 $8 $5 $! ^u ^n ^a ^j *56 z1 OA4 u^H*8A c $9 $5 $% $% c $7 $8 $* $* c $3 $0 $5 $! c $3 $4 $5 $! c $6 $4 $* $* sZg O81 ^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? O49 Y4 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 $! O63 -A OB1 ^_ ^* d 'E $0 c $4 $2 $3 $! O92 O27 Y1 $9 $0 $? $? $3 $7 $# $# s;ms#l*A2 i1a i15 o6r*01l c $0 $2 $$ $$ i4T*90 c $5 $8 $@ $@ oAB$' O6B r y4 ^i ^r ^p ^a $0 $5 $$ $$ c $1 $9 $? $? d $8 O75 ^i ^r ^p ^A $6 $7 $# $# y1 O94 K $2 $1 $% $% c $3 $7 $7 $! $5 $0 $? $? ^l ^r ^a ^c *34Z4 o8bk c $b $u $l $b c $8 $1 $2 $! *19 $! r sn& 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 $% $% O65 Z5 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 $! 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 *69 O48 i3] *30 z2 T1 s7A O43 O73 c $2 $0 $2 $! y3}^a l d '9 $6 *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 $! c $3 $5 $4 $! z1*14iAs $1 $9 $$ $$ c $1 $7 $$ $$ $l $o $l $a d 'E $7 c $3 $5 $$ $$ +5i9$$O c $3 $2 $? $? $3 $5 $$ $$ $r $o $s $e $s c $9 $8 $# $# f '9 C d '8 $1 $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_ $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 $# $# $l $a $s $s O39 O4A s*I O76 s&K C Z3 +3 l $t $a $n $i $a Z2 *06 $j $a $n $a c $3 $5 $7 $! c $0 $5 $! $! $8 $4 $@ $@ d 'D $4 O18 O36 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 $? $? $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 $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 O12 ^e ^e ^r ^t c $3 $3 $2 $! $q L7 c $1 $8 $7 $! $8 $7 $$ $$ c $2 $8 $2 $! c $9 $7 $@ $@ $6 $8 $$ $$ $0 $7 $% $% $9 $3 $$ $$ $s $a $a $b c $9 $3 $9 $! 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 sUm p2 O7B R1 +A O3A c $1 $9 $7 $! C 'A $7 c $3 $4 $3 $! $2 $4 $? $? ^(sxU c $4 $6 $@ $@ $0 $2 $? $? c $8 $2 $# $# i02 i12 i2J i3u i4l s4ZsQv[ c $4 $1 $5 $! O19 $ o0n c $4 $2 $$ $$ p1+8.6 c $1 $4 $1 $! c $4 $0 $4 $! c $3 $5 $! $! i7f i5f } OA9 $U O28 O91 $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 c $1 $0 $? $? $+$^ c $3 $4 $4 $! $1 $3 $% $% c $5 $2 $5 $! $y $o $l $o i6tz5 O4A sb^ sR9*1A $q O67 Y1 $f $i $l $l $y $p $a $n $n $i $0 $f $e $e y4o8hiA* oBd*39 Y3f i92 iA0 iB1 iC3 i1m^y oA3*90 $k $a $t $z $b $a $r $u ^ r sT(sEz O28 i1J $m $o $f $o +6Z4 -7sa\^d i76 i35 T6 ,2 O9B szYZ1^W *06o39*B9 sLe $p $a $l $l OB4 L0 l $w p1 $s $a $s $h $a Y5C ^8 s7e [smU *58 O94 sJq i57 i5d R6 Y2 s#< O32 o1` *53*08 O94 O26 c T5 +4 sC c sk$ sk> OA7 i27 y2 o0Zr*3A sgx *13 o5d ^i ^c O62 C i6' }i7s$} sWtk $! *A7 R4 i3i $X $J sX(*60 sU& O85 sd& +B *78 z4 $? 'A o3D y2s|R .Ai4Z O86 O0A O8A *1A ^r ^o ^o ^l ^f *B0L2 ^n ^r ^o ^b sk8 o4 sl0 z5 o8Q ,7 r *26 u ^9 ^0 ^0 ^2 s@f *76o7;R9 R3 o1t Y2*52 $q $u s"%*35k p1*15*20 s,|$7i8P y1sZvy3 s!h i12 i5a s_& y5 i2R O13 O53 sne i1nq y4sF)y2 *31 s8v iA@ y2 Z4 o93 $K O58 o0b p1 O25 *03 *57s(i sjds;Z} *87i4; sP.*1B $t O01 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| O5A E O07 *42 ^h ^s $= z3 ^g ^i ^b Z2 ^y *92.9 z2 i0l *A9 $K p4 *64o3D sVY s,Bz1 *57q sriY5*48 o3x y2 L1 +7 sC= s5X Y3 { O56 LB R1 st[ i09 *64 s"x s%,Z4 q { O19 s_h *72 O16 *23T8q sBt u T4 O68 Y3 -B p2 +0 $] Z1i7$ ^!l$9 O06 d $) ,7 O97 R6i9Eo0W o5> O73 i1{ T4i2^*14 i9Qz4 s+1 D7 ^Y E s-4 *96o7 *92 qp5s4. ^n ^o ^r ^i $j u $m $o $o $r y5^,*9A .7^Ck *82[z1 ^u ^r ^e ^p y4 O49 z3 OB1 sP0 '8 *94 D3 *17C o1Dp5 p1*B3o7c *8A o7= O24 ^m ^a ^d ^/ O62 *5BR2*56 o7m s5i $g $r $o $s $s y3 o9g O89 *64 *70 O08 ,A O65 s,!o4Ri0a O68 *67 sB" O58 *28 Z3 *A7 oA.R0*71 $a $d $d $l $e sv( sR$ $d $a $v $e T9 C O6B O2B s&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 O28 *78 C *83 *39 o6T d O29 s'qiB/ ^n ^e ^k s\A*79si" *02 sdl Z2 r Z2 p2*25 oAN O14 O85 ^n ^e ^g o4>T7 t^6Y2 q Z5 O26 $y s8R s\p*38 { i4+ *96sMN T2 OB4 sP6 T8 +5 o7^p3k *75z3T0 Y1qsa* ^s ^i ^r ^i O63 p5 i0B O48 o0ofu *78 O6A Y2 i35 *86 sXysNs i53 i7b i5c i1f $#$^ i5c i10 ^d O91 ssx *26 ,5 O92 i2> o22 u C oAd i7c i37 i7c i31 i51 i16 $m $i $s $s $y $($$ *3A O49 ^M d i52 i7f ^i ^g ^a ^m i18 i1d i5e i59 i11i29i36i45 $=$# i10 i1c i57 i15 i5c i30 sI? +4 D3 *71 i17 i5b q O26 Z5 i17 i3e O13 spw $<$# i33 i1f $h $e $l $e $n soY i34 i5f i15 i1b $l $i $b $r $a .6 O6B *10 OA3 o2H c y5 $d i18 i1c i17 i73 $t $e $r $r $a i17 i7d 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 ^Q y4 i3e i18 $a $r $c $h o3[ o1c i5f i30 i5f i36 i5f i38 i33 i5c O47 i6f p2 '6 Z2 i1f i35 i1f i33 o3#sF*$P 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 i38 i1b i37 i5f i34 i1b i10 i75 i32i40i52i63 i5b i7f i1e i16 i79 i33 L0 ,4 i0$ *40 s5g i1b i16 i74 i17 i12 i3b i59 i1b i1g z2 O82 ^1 ^s ^e ^y ^e T1 ^W i32 i1b -6 k i6x Z3 +7 O45 -2 $,$] i35 i7f $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 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 i38 i5f r L5 i1f i55 $6 O34 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 O63 i3s o46 o43 sax +6 Z1 i4c O51 Z3 +2 $m $i $l $l $s sap $y OA8 iBN ^e ^k ^i ^n } Z4 D1 s4V ^> O0B O1B sd} c$1$2$3$" q O49 ^s y5i0QY3 Z5 *20 O08 ^8 $w $K c oAC ^9 o6s i66 l +2 $Ws,} $`p5 sO} t OA7 s>tY2R9 $Z R6 $3 d oBx sVW OBA T0 i0? O63 t .A .5z1s?n O65 i4= syts-= *3Bsi; O5B q iBL },B-A R5 O04 $n o00 [*67Z2 $8 d Z5o1h L7 O32 T9 OBA Z2 o76 i7z } z3 OBA -0p3 $r $e $a $l OA1 O15 [^, Y3*7B f O75 T6 i6'k u { Z1 O08 i1a T2s & s&F*A4 *64i3L*28 R2 o5v D2 $` O31 sl9 '7 *14 ] p3 O93 ^Ci7j*37 O89 ,9 *92'3y2 O89 sI| ^u ^m o62 sNT O57 i7T^& ^u ^l i4= O15 L0 $l r i6h O6A f *86 sgk 'B ]sWn *A8o6!^| *68 O15 z5 p2+0*72 s!_^< z5s|* ^yp5 z2 i3h i84 +A i4op4q z1 } $m z3.A$d $- [ p5 O4A R6 sEb sEr o9k i0s c ^r } o2lz2 swa $u$xi43 +9 O95 p1 s68 s3Wi9KsHo O14 sa? $d $a $r $e p1 sl7 $0 seu ^e ^t ^a ^t L6*71 *86s$>i8| *01 { $6 -7 o5# sYr O97 *B3 *A3.0sr= O45 ^7 O23 f $f ^8 +0 O73 O53 y5q $9 q ^l R8 sH=o3[ D0z5-8 $Y [ $h $a $m $a $n $c $l $u $b i9gs0$K z4o2u $w q '6 $, o0Z*10i6P D4 *89 O09 $y L8 +7 O85 [ Z3 o56 p5oBt*96 '8 i6P O86 y4 y5 i6t ^d O36 *35 R4 ss3p5o1g $x Z5 ^y ^n ^n ^u ^f *65*B6 $) $7 O4A d^Ni6H t f O4A smt i6i O02 sKc i9V O26 o6w { i4e i52 o2H T3 o2o R5 +2 sh, O14 ^k *78 *46i1'*23 z4 *17 sOw s8l l E*23o1W sO. sOjL6 u i31 $e u [ qo0^ ,Ao8C u i32 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 p3 O95 *08 d *52 s c $0 $% o2p D0 D4 syioA+z2 c $< ^1 c ^{ $} ^^ ^1 c $> ^1 r z1 i4f c $_ $! c $+ ^1 l L4 $4 ^0 d OA1 sP* O45 O53 ^@ ^4 $4 ^& $4 ^/ $! Z4 $4 ^* $; ^2 $s s1_ L7 c ^= $0 $@ ^! R3 o2c c $! $? c $> $8 c $> $> c ^@ $# +9 OA2 Z2 ^i i8u s_1*7B syz R5 *34 c ^^ $5 c ^. ^9 c ^# $5 c ^# $3 c ^# $2 i12 i0f D4 sg- ^( ^3 $) ^0 $. ^, s02z3.6 o6& $2 $b o3t o1f $b r ^$ ^5 i3c T0 $! ^? ^ ^0 t o3R r ^ ^6 ^# ^2 ^# ^4 $0 ^[ $& ^7 $0 ^# $0 ^+ $0 ^- $0 ^< $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 c ^5 $- c ^5 $/ c ^5 $% shs $5 $_ ^8 c ^* $9 $_ ^0 c ^* $! ^S +8 t O4A ^W } o3A -1 u TBi2* c $- $- c $. ^9 ^1 ^{ +3 O47 ^1 ^; ^1 ^> ^1 ^/ c $; $0 c $; $4 $7 ^5 c ^$ $2 L4 Z2 D0 s7b c ^$ $9 i5K O64 $9 ^< $9 ^5 $9 ^0 $9 ^^ $9 ^_ ^f O75 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 ^# ^. ^6 c ^2 $@ c $# $! c $# $# c ^_ ^6 c ^2 $- c ^2 $+ $/ ^2 d O81 $+ ^2 $+ ^9 c $3 $) c ^9 ^@ ^! ^7 ^! ^5 c ^1 ^. c ^5 ^@ c $8 $- ^0 ^_ c $^ $5 ^0 ^( ^0 ^< ^3 ^. c $9 $/ +1 R4 c $$ $9 c ^0 $= $< ^< c $. ^. c ^< $1 $w u ^7 ^* $3 ^4 c ^, $1 c $4 $( c $4 $, i3q { c $9 ^! o0D ^I ^7 ^_ c ^0 ^( [ Z1 R3 ^7 ^# ^7 ^= c $% $9 c $6 ^! c ^# ^3 c ^$ ^3 c ^$ ^7 c $5 ^@ s8$ t L4 l c $@ $@ c ^. $2 c $/ $9 c $/ $/ ^9 ^) c $# ^1 c ^_ ^5 oAwsk?L5 c ^2 $_ c ^- ^3 *32 O38 c ^- ^0 O26 $r ^+ ^3 ^= ^0 c $@ ^4 O06 Z4 c ^. ^6 c ^. ^8 $4 ^6 c $, $5 c $) ^1 Z4 *10 O17 c ^* $4 c ^7 ^# y2f c $. ^3 c ^8 ^* c ^8 ^@ c $^ $3 ^! *40 c ^0 ^` c $? $6 c $? $0 c ^. $4 c $% ^6 c ^9 $! c $/ $0 '6 +1 O71 O41 [ c $8 ^0 +5 } i9Cs4` $ *47 O3A O95 sR5*15sl4 D2 suq c ^% ^3 'B $I [ o3U ^t ^a ^m [ o3I [ o3J c $) $7 c $) $5 c $7 $~ o5N O02 $, ^. c ${ $ ^7 $6 ^9 $6 ^= $6 ^< $6 ^> ^)s9v $6 ^& c ^, ^1 $$ ^7 ^> ^1 c $= $8 $5 ^6 c $7 $; $# ^@ c $7 $( r o07 $# ^8 $2 ^[ $2 ^? $2 ^; $2 ^# sfn [ $2 ^( $2 ^+ *30 R5 +3 } $c ^; c p1 O45 .A *06 O3A C $9 $8 $7 *06 p4 O93 i41 Z1 sca o08 z3 O64 *52 'A C $5 $1 $0 C $7 $0 $0 C $5 $7 $7 O6A *65 c $0 $2 $2 p5 .2 C $8 $0 $0 c $7 $5 $5 sY7 C $1 $5 $8 D9 *08 C $2 $0 $0 C $4 $7 $7 C $0 $3 $3 O29 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 u $3 $6 $0 O18 ,6 p5 O56 O49 r $p O17 OB6 O76 O71 *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 *03 sqt L1 l O75 o8h o0Z $Z O18 ,6 C $7 $8 $9 OA9 O05 C $1 $5 $1 C $1 $5 $7 *61 o6O s}Wy5z5 c $7 $3 $0 C $3 $0 $0 l OB4 l slM C $7 $2 $7 i2b O92 p2 O54 i4r u $1 $6 $1 $} +5 C $1 $8 $2 c $4 $9 $5 { O37 ^' O95 O12 C $0 $1 $0 C $1 $2 $1 C $1 $2 $2 C $1 $2 $5 i23 Z1 *63 ^^ O54 *42 c $7 $7 $1 u $1 $3 $3 O26 q O71 *19 K *61 ^q y2 c $3 $4 $4 slk O1A C $9 $8 $9 C $6 $2 $6 [ R3 shf c $1 $7 $4 C $1 $4 $7 O25 D0 ,5 c $8 $5 $4 C $3 $3 $1 ^t ^e ^l i17 L1 L1 i3e R4 R4 i79 R6 R0 i7e L7 L7 i12 R5 R5 i12 R5 R3 i5c R8 R7 i14 R7 R7 i3f L6 L2 i51 R6 R6 i39 L8 R4 i19 L1 L1 i35 R4 R5 i79 L7 L8 i79 L7 L7 i30 L7 R4 i5a L0 L0 i15 L1 R3 i7f L3 L6 i7f L3 L1 i1d L4 L6 i34 R8 R8 i79 L8 L8 z2 o0Z i1a L7 L3 i59 L3 L6 i7d R2 R1 i13 R0 R5 i10 L0 L0 i35 L6 R1 i59 R8 R8 i1c L5 L6 i16 L6 L6 i3d R8 R8 i39 L7 L7 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 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 i72 R8 R8 i38 R7 R5 i34 L7 L7 i5a R8 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 i79 R8 R8 i3d L2 L6 i58 L5 L7 i7d R7 L9 i7d R9 R8 i35 L1 L7 i30 L5 L2 i12 L2 L0 i13 R7 R7 i13 L0 L0 i3a L4 L4 i7e R0 R0 i1a R5 R2 i1a L6 L4 i17 R6 R6 i72 L7 L8 i70 L0 L0 i54 L7 L7 i1e L7 L5 i3e L1 L7 i78 L6 L7 i57 R6 R6 i34 R9 R9 i6n i7i i8e i11 L7 R3 i33 L6 L3 i3a R0 R0 i32 R4 R0 i12 R2 R0 i3c L7 i30 R6 R6 i10 L7 L7 +1 i2x Z1 i36 L4 L4 i5e L1 L6 i37 R2 i1b R5 R5 i3a L1 L7 i35 L3 L3 i39 R7 R7 i52 L7 L7 i1c L4 L6 i72 L8 L6 i1b L0 L0 i37 L0 L4 i35 R5 R2 i3a L5 L5 i1a R7 R7 i31 L3 L6 i15 L7 R3 i12 L3 L1 i1e L5 L6 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 i33 R6 R6 i52 R1 R3 i7a R6 R6 i78 L7 L7 i3e R6 R6 sQ;*25 i52 R0 i50 R6 i75 L0 L0 i75 L8 i75 L2 i75 L6 i32 L0 L0 i3f L4 L4 i14 L7 L7 i50 R7 R7 i31 L7 L7 i15 R7 i5e R6 R6 i19 L3 L3 i5a R0 R0 i57 R8 L5 i33 L7 L7 i72 L5 L5 i3a L0 L0 i32 R0 R0 i1e L6 L6 i70 R8 R8 i31 R6 R6 i18 L0 L0 i52 R8 R8 i17 R0 i3d R4 R4 i50 L7 L7 } y4 s^U o2z C [ c ^x ] $x [ ] C ^x $x [ ] $x c ^x [ C ^x ] $x ^g o52 c ^6 i5t i6h i7a i6l i7l O73 O29 y3 K +0 y3 +0 K $g o1o s / u i4F o42 *24 O28 y3 Z1 O63 i3i ] DB $n Y1 p3 $t o6_ y1 p4 '8 $o o7y p3 K $+ y3 ,7 $3 E ^` ] ,1 ^c y5 O94 p1 '9 *87 *24 o6c y3 syh z1 o3c i64 Z1 $0 $h +8 K *95 D4 .3 o5z ^T ^V Y2 $t y2 y5 y5 Y1 z1 ^o '8 Y2 t $x -9 i61 ^t -6 y5 r .4 i1w Y1 ^c O12 O61 Y2 o7u $n -0 R1 o2e ^s s.8 p2 } i4m p5 o55 y4 Z1 o4c $s $e o8e *58 Y4 D5 D3 o6t Y3 -8 } ^L O73 $g { Y4 O35 ] ] u s!+ ^= O0B ] ] ] T0 $2 -8 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 i01 i26 i19 i30 i01 i26 i19 i39 d 'F $9 d 'F $7 d 'F $3 d 'H $0 $4 $q L4 i31 i58 i49 i62 d 'G $5 *31 T3 o7t L8 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 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 i2- O3A D1 DD i11 i29 i36 i48 i02 i23 i10 i31 d 'L $1 l ^4 ^9 ^9 ^1 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 l ^6 ^0 ^0 ^2 l D7 i5z t O63 ^9 i01 i19 i33 i28 i01 i19 i33 i29 i02 i21 i10 i35 i02 i20 i10 i34 i02 i20 i10 i36 O4A *09 i12 i20 i31 i46 i12 i20 i31 i47 i12 i20 i31 i48 d 'J $9 i02 i10 i36 i21 i01 i19 i34 i28 i34 i50 i42 i12 i20 i32 i47 i3[ [ q O6A } z5 O03 ^k *79 O31 y4 O23 $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 u '5 $9 d *81 O63 d o2G -2 scu o8x +0 ^/ ^7 l^d^a l^f^f l^f^d l^f^5 l^1^e l^1^b l^3^d l^3^7 l^3^0 l^1^9 l^1^5 O03 o3O Z2 i6- l^9^6 l^9^9 l^7^8 l^7^0 l^7^1 l^5^4 l^5^b 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^e^e l^4^a l^4^c l^a^e l^a^c l^e^4 l^c^4 l^c^a l^e^c o5M D1 l^9^c l^6^f C^X^x$X$x *78 *A6 sa0 l s(%*94 i8U $T O73 ssI *03 ^0 sqQ O04 p1 $l p1 $k Z4 [ t *53Z2 o3b Y5 y2 s/5 ,Bdq O27 d Y4^?LA O0A R4 $K c O34 *43 o2X y4 $4 p1 Z1 R0 O12 $z s,y y5+6 ^; D6 i3q i4d s'$ swN O14 ^2 C O58 O0A ^T E L1 -0 i8U O73 $T *03 DB p2 *BA Y1 i3X D0 R2 t *12 OB9 r R0 o5I p1 .6 p3 ] O34 z4 sXj D6 R1 O49 u i0O ^n ^a ^r O64 +9 L7 $4 O14 p1 O83 *41 $) s'_Y1*81 c $4 $7 $4 $D$8 u^e^8 $4 O35 i3b *45i5# y5 O2B ^#i9}*43 sf3sE+ Y3 O09 stv R4o3o OA5 *17 D1f ^`'A shR*71*85 L0iAR Z5 OA9 s<4 O93 O48 *19 O41 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 T5 T7 T9 T8 T6 T1 T4 T3 T5 T2 p2 O28 c $5 $6 $6 T0 T7 T1 T5 l $3 $4 $9 l $3 $4 $4 O83 o7m O04 l $3 $4 $2 l $8 $8 $9 l $8 $8 $7 l $8 $8 $4 l $8 $8 $5 l $4 $9 $4 $` $1 o9! O61 l $3 $1 $8 l $3 $1 $9 o0Z Z1 l $6 $8 $8 l $6 $8 $4 l $9 $5 $8 l $9 $5 $5 l $9 $5 $6 l $4 $7 $7 l $4 $7 $8 ^E ^4 l $0 $5 $0 Z2 $z l $2 $6 $6 Z2 $! *76 o6. q $1 l $9 $6 $5 l $7 $4 $4 $h *50 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 l $2 $1 $3 l $9 $3 $4 O64 $@ Z2 *65 p1 o5a ^0 O24 O0A Z1 ^g o78 $a $C l $0 $8 $0 l $0 $8 $8 T5 $9 l $3 $0 $3 l $0 $7 $0 OB2 O16 $t k l $1 $4 $1 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 O05 D3 D2 i6@ O63 -1 O25 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 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 l d 'B l $5 $2 $5 l $5 $2 $1 l $5 $2 $3 k s52 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 l $7 $1 $9 l $7 $1 $0 O83 O02 T5 *37 *14 u $8 $7 $8 } O37 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 l $3 $2 $3 l $3 $2 $6 u $6 $1 $6 ^! z2 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 iA~ u $D $1 z3 O52 s36 u l $5 $1 $5 l $6 $6 $9 l $0 $9 $1 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 c $9 $0 $2 u $3 $0 $0 c d '6 *76 $. z1 ^N u ^D ^D o2T Z2 tz4 *03 $t l $2 $2 $0 O24 o21 u $5 $5 $7 u $5 $5 $4 O24 z4 l $6 $4 $1 l $6 $4 $6 l $5 $0 $5 l $5 $0 $2 c R7 l $5 $0 $8 O34 R4 c $R l $9 $9 $7 l $9 $9 $3 ^b ^A O74 T1 D5 +1 O38 u $6 $6 $9 ^0 *32 *31 l $7 $2 $7 l $7 $0 $5 l $7 $0 $7 l $7 $0 $0 ^e ^B l $6 $2 $3 l $6 $2 $7 u $8 $2 $2 u $3 $1 $1 u $3 $1 $3 u $3 $1 $4 t -0 l $5 $8 $2 l $8 $6 $4 l $8 $6 $6 l $8 $6 $8 l $1 $0 $4 u $9 $9 $8 l $2 $3 $1 l $2 $3 $2 ^F ^1 l $8 $1 $8 l $8 $1 $0 l $8 $1 $3 l $6 $5 $2 ^K ^J c $a $d c $a $9 Z4 O53 '5 ^F L5 O04 l $6 $5 $5 Z2 $e *90 sb6 se3 ^. i1/ l $8 $0 $3 l $8 $0 $8 O37 .4 l $0 $1 $5 u $4 $4 $0 u $1 $8 $8 l $3 $9 $6 Z3 D7 u $2 $7 $2 ^< O16 u $5 $0 $0 u $5 $0 $1 l $7 $3 $7 l $4 $4 $0 z2 ^e l $4 $4 $6 ^t '6 l $4 $4 $5 l $4 $4 $8 l $5 $8 $7 u $3 $2 $3 l $8 $7 $8 l $8 $7 $7 c $h $a $h $n z3 +2 l '7 $9 c $c $c c $c $0 c $c $2 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 l $2 $1 $9 l $4 $3 $5 l $4 $3 $4 O4B Y3 ^m l $1 $5 $7 l $7 $5 $6 l $7 $5 $5 l $9 $1 $2 o25 p1 l $7 $7 $8 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 u $7 $2 $2 l $4 $5 $1 o54 s4y r z3 -1 l $1 $9 $9 l $1 $9 $3 o7O O03 [ i4v Z1 l '6 $9 u $2 $3 $2 u $7 $9 $9 l $7 $7 $0 l $7 $7 $3 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 l $0 $3 $9 l $0 $3 $3 l $0 $3 $2 l $0 $3 $1 *94 O85 Z1 l $9 $0 $1 u $2 $4 $6 u $5 $6 $5 c $7 $7 $3 Z2 s85 c $2 $x i1z R0 O26 Y5 O12 sgo l $7 $8 $8 O12 Z3 T6 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 O12 $* Z5 *85 O83 l $7 $6 $7 l $2 $8 $1 l $2 $8 $3 l $6 $0 $0 l $6 $0 $9 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 O91 u $8 $8 $3 u $8 $8 $5 u ^C ^C u $4 $8 $5 l $3 $5 $3 l $3 $5 $8 l $0 $9 $2 o4f r Z1 l $6 $1 $2 l 'C $1 l $4 $8 $7 l $4 $8 $2 l $4 $8 $9 O82 T7 l $4 $2 $5 l $4 $2 $8 +6 i4c Z1 l $2 $9 $4 l $2 $9 $8 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 $~ $~ $6 ^3 $- $2 $- $3 $5 ^8 $5 ^2 $; $1 $2 ^8 $p $o $o $h $e $x $a $m $c $a $l $l $s $s $t $o $r $y $t $o $o $t $t $o $o $l z3 O56 $m $a $z $e $s $o $n $g i20 i37 $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 O95 O42 $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 C *51 $4 i3b $p $r $i $d $e $f $l $o $r $a $b $i $a $s $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 $m $e $e $t *06 ] $h $e $a $v $e $h $e $a $v $y i71 i81 i92 i51 i69 i79 $* O43 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 $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 $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 O35 $* $g $r $e $y ^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 $z $o $o $m $a $r $d $o $r *83 y2 $c $r $u $s $h Z1 O16 $8 $b $e $a $r $s $d $u $n $g $s $a $l $l $y $m $a $y $b $e s4o Z2 Y1 D5 r $t $e $e $n $s $t $i $l $l $g $i $r $l $s i4c O16 $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 O14 $* $f $i $z $z $c $o $l $o $n O35 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 ] $b $e $a $s $t $f $l $i $p $t $a $r $o Z1 $? R5 +1 O13 $0 d ^f ^o ^o ^r $c $r $e $s $t $d $u $c $k $k p1 $n $i $c $k $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 O52 $p $o $r $k Z2 o2b O01 $h $o $p $e $s $m $e $o $w $m $u $s $i $c $% i61 $d $o $l $l u $1 $9 $7 $3 $f $a $n $g $g $l $a $d $b $r $o $w $n $d $a $d $d $y $b -B $m $i $l $e $a $r $r $o $w $g $e $n $r $e O37 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 $d $r $a $m $a $d $o $o $r $F O32 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 O4B t sa@ se3 si! 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 c i36 $o $p $a $l $m $o $o $s $e z4 O26 *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 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 O37 $b $a $s $s se3 d 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 O05 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 $s $n $o $w $b $a $g $g $y $l $o $r $d Z3 *06 y2 O28 $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 O82 y2 i63 i71 i82 $s $n $a $k $e i20 $a c T8 i8_ u $p $a $s $s i9< i8L d '8 l c Y4 ^a O23 { O27 +1 *10 Y2 O51 ^s ^p ^o ^p ,5 $r O61 O42 sg5 T6 Z3 [ $M y1 i39 T0 Z2 i6X O47 *04 Y5 p4 T8 O05 O64 O0A sy* *05 O24 ,2 *31 s87 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 ^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 ^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 O73 o1m ^] ^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 O04 ^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 O38 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 ^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 O01 o6# Z3 OB7 $1 *42 O3A ^},B.B *62oAW O76 O96 i7I.8 '0 ^> K O85 R7 Z2 L6 O74 *1AKt s}Po8% slj*81 i6*iB^s7; i6_Z4*27 O96 $A o52[ +3 -6 $7 [ Z1 i4v Z3 l +3 r -A Y1Y4 k R1 $A d *47 *08csZy *B4 O3B s1! *B2 O4A y3 D3 p1 +6 z3 sZ! O79 ] ^' *72usZ0 .4.8*73 D8s@H*6B seQR5Y1 *2B DA i5B p2 O08 L5 *02 i58 o30 O56 sm` y3 O52 i3?i6UsaB O15 o5x k $A R1 z4 srn O59 c*36s9> O82 O47 *17 o85 o7y C ^P $3 d D7 Z4 $4 ]o6u O98 [ O82 O21 Z3y1 i4lsx, i2@sT9 sC1,A*52 $0 *73 O45 i0H O04 $4 D8 $0 +2 ^q i51 ,6 .3 o3a ^a O42 i3w $3 O43 i2i O73 ,4 o3w O74 ] ] [ k y1 *54 .1 ] ^f '6 $% O06 $2 [ i25 ] o4s Z1 s26 p5 o2c { [ ^S o2a o5b O73 ] i2u O23 i3i o0l -2 O53 $g O43 i3k i9E O73 o67 D5 ^x $x O42 $d R5 o0m o3w O61 +3 ,2 ] o0r *42 o4w O63 O46 Y4 Y4 o3p +0 o2i .1 O04 $0 Y1 *05 O52 E $9 O32 O81 o7i y4 ] OA1 D5 ^7 K o6i D2 D6 $1 O62 $0 s8k O12 o4g ] i2n o73 -6 r $n $e $s $s '9 i57 ^3 Z1 O32 $0 Y1 ^t ] K ] ^2 o71 ,3 k ] *34 o4a *21 Y2 O32 -1 i1y O43 y5 i5y O74 O02 i64 O41 Y2 -2 ,2 O02 o58 *03 *32 *13 l ^1 ^8 ^9 ^1 o51 .4 r o35 o10 ,3 r o37 O43 i1l O41 *42 o1s D3 o0t y2 ^p ] -4 o3o i43 D7 o0p *53 [ +1 *31 O43 i2m O04 o1w i66 O01 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 O52 O24 i2d o2T O31 E $m D5 o0Y l *53 +0 k y1 D1 o2x k *12 i03 i71 ] i31 .3 k o68 o76 ] i56 i45 ] ^8 o16 r ] ] ^8 $1 sea $9 Z1 E i3z ] z5 i0r O18 o1k O21 f *72 O57 O54 E $x $d O42 p2 ] ] K o2k .3 $@ o64 O62 i3x Y4 O07 z1 O64 ^4 i69 ] O52 $j suo $1 ] y2 y2 o54 D2 o0t *20 O52 i4p Y1 $1 O23 o1A E Z1 o3c O21 i2o o4i O43 y5 D9 ^I o4m ^0 -4 Y1 -7 $3 o15 ^6 i85 O32 o1e *14 i2i O63 Y2 *27 O42 i52 } p2 O0B O61 ] ^8 ] o3p -4 r +3 O52 y5 O31 O74 i0y D1 o1o O21 D2 $8 k o22 K *71 ] O21 O02 o13 k .1 O41 O41 -2 Y2 i10 *14 o2g O62 o4u O62 O32 o5y o65 [ i50 $9 i2o .1 o0m ,6 i0w -1 y4 O84 Z1 +5 i53 i52 +6 o10 ] Y5 O24 -5 O51 o56 -4 i5e { i17 *15 o48 o67 ,5 y1 *35 *20 O72 *23 *24 r D3 *50 o3a D5 ^0 z1 } i3g O42 ,7 *61 o59 $3 o1c i1s o5c K o52 -6 O52 i1o y2 i2c O42 i2p o3p o70 -4 O51 } z2 D3 o2o Z1 +B -7 ,8 O65 o52 o0f D3 +0 o23 ^e O72 $g Y4 O14 c $8 D6 o46 O53 O02 i1h p2 O92 [ o2k +6 [ O41 i60 O82 -7 i4& $o o2j -1 -1 $8 D5 Y4 O53 -1 D3 i4* o1e *53 i89 .7 z3 { { *71 O21 ] q O25 q O18 *20 y1 *13 O71 o2e o0f K o89 sa5 O02 { { o0m O15 ,1 +0 o2d ^3 D4 K r *42 O52 i2y O32 o1w o6h [ o0c o3m y4 Z1 O84 o53 K D5 s0! y4 *95 O06 $w O41 c o72 O02 soa O03 ^m K ^s O26 $0 o1y O23 +2 f O26 O13 k Y3 o2m y3 E T3 O71 o1v [ i0e o26 .0 O04 i3k o2s -6 ] o5q $1 Z1 D6 o1m D3 [ +0 o12 $6 +0 o4u O51 O25 f k -5 Z3 i6y O12 +1 $4 D6 $1 r ,1 D8 ,7 Y2 o72 O01 i4e } y3 O64 i6n o7d o2s +0 o5h D2 O21 -8 R7 i36 ] ] ^0 ] O61 O02 y4 o4c +0 o2y -4 o1o y2 [ -2 ^s O02 i6l -5 s20 o6y ] sie O42 K Z1 $0 o5n *34 o8- K o1y +4 o1A Z1 E o2n *02 O12 y2 *10 K ^2 ] -6 o78 o66 *54 +3 Y5 O53 O31 o4i [ srp o2o o3s i19 Z1 o2m i3i o2m i3y D5 ^c ] +1 Y3 o55 o67 -7 *52 O52 i1r O62 Y3 i2A l O41 O41 ^a D7 o4I sIu *21 *23 o71 D3 +0 Y2 *73 ^t O23 i67 O21 { o05 $2 +6 r O03 k *34 ] D4 $7 -1 o24 o2b *02 $7 Z1 D2 +3 $s o62 o44 o1i i1S D0 i08 o29 i57 .1 o3e -0 o2o o1a *54 -5 +2 O21 $8 D2 o0s i2i o35 O01 ] o4G l c ,8 o5e .4 $1 i86 $4 .4 *86 *50 o2b ,3 D7 o3e ,8 -7 o6u O21 *20 o3s o15 *13 -4 .2 O72 o3c o3e D4 i6t O04 [ $1 $8 .1 o0w i65 .5 +0 $3 o4k O63 D4 ^y o5e o4r o2r { { o0k y2 i2c O63 i35 [ { i51 ,6 o91 .8 i2p ] ] si. $0 O71 Y1 K i32 K i31 o76 E o1h *32 O42 o4d O42 +0 i4c D2 o2d -0 *03 f *20 O37 Z2 O56 K o76 i77 .6 i1e O41 o54 -2 o46 -6 y2 c O41 O62 -5 i2\ O23 $2 o1o +6 O02 ^t y2 $. O72 Z2 O43 [ D5 -6 O12 s81 o06 -2 o2K E i2n o0w O03 Y2 $5 s52 -5 D6 o42 y2 O31 D2 o0z i1a D5 O72 -0 -2 o0r k K o5d sE ^L O23 ^2 { D5 $9 } q O46 O13 i3l o82 $5 *31 o0r o0w *34 ^k O52 ^h ^t ] ^7 ] o0l O32 K -5 +2 O43 o3f z2 *53 O61 Z1 $9 O02 E i51 $5 o78 ] i72 z1 ^9 u i5Z ] i7r ] skp o9m O72 z2 O53 i1o o51 +3 *54 ] *64 p3 $7 [ D4 $3 o0F ,3 ^0 *05 O61 i4k y4 O82 y4 Y5 O06 -1 -9 i90 +4 .1 o2y o3h +7 o62 u O34 y3 y3 O52 s80 .4 d O04 O02 i2o o39 ,5 ] i1t [ o3g l { { i18 K *36 o88 Z2 y2 *40 +2 i3i O53 r -4 } O23 i2b K ] $8 R4 ,5 o2v k T0 $1 $1 o5y +7 O42 i2y o0l k i2e ] o65 Z2 o18 *01 o2n -0 +4 '6 o48 O71 o2z D3 Z1 D6 u i8z O53 o6i o0c o56 +2 ^w O21 o33 k D0 ] p2 O3B i2a -1 .3 +4 o0k K *35 o1o -0 .5 $2 O41 *35 o1i O42 -3 O42 -2 i29 D7 ] o5m s86 .4 O05 $9 Y2 O84 $0 o0w D3 *20 .1 ] ^9 ] o2c +3 k *43 ^6 *30 o2r Y5 D7 O13 o50 K i20 *03 i6- 'B o3o o4t r i52 Y1 l s14 *31 $1 E se3 ] o0W ^s o1t o5a *54 si* i3y O61 lse3so0 [ siy o1I E D2 o60 D3 [ i1j +1 o00 i7g O23 O03 i36 o44 [ +3 *40 i44 *34 .2 Z1 O31 +6 i2\ $2 O23 Y1 O23 $1 O71 o5a ] Y3 +1 r ,5 y1 o1o o0p *53 o73 c D6 $8 o3g -0 o2T E O31 i6x O03 ,3 *24 [ *43 r o1I D2 E $1 .9 f O67 [ [ $5 [ i38 { [ O21 i1i o4j -0 i45 ^8 ] O02 i50 ^4 O61 o30 +2 o3m *03 i50 ] $s $i i64 o56 $3 o85 D4 i2i D1 $] -0 o5u .4 i4a $1 O43 f ] -1 K ,3 } *50 o1u -3 p5 i44 ] $S E $g O41 o1e *67 ] K -1 o2h O01 o3p ,2 O02 o2j si1 O53 o2a o0t O52 O92 *A6 *A9 L7 O07 o82 D9 E O32 $9 o0y +2 i0H $4 O04 y5 OA3 y5 y3 [ O61 *32 ^7 k O04 z1 ^o t i61 $2 o16 ] *64 .3 *31 Y3 O02 O72 ] ^3 o84 o79 *53 o3l p4 *04 o0r *35 $0 *15 o60 { ] *45 o0d o6- O32 O12 i3k O21 i54 si+ o0r *34 ^5 ] ] o1b *01 o3p Z1 o5r i5a o0j *51 -7 o63 ] ] ^5 ] ] ^7 ] ] ^9 O63 ^r ^m [ +0 i28 o07 D5 ^w D5 i6a O03 O72 i5e o0W '8 i58 .4 o6c -7 O02 i1o O02 i1e o3b D5 O51 p2 O0B i66 D1 o0p '9 o0w ,1 o2k O52 *35 i63 o90 o80 r o16 r o14 [ i35 D0 O32 o0g c sa@ T1 o56 $5 [ o0m y2 ,5 *41 ,5 *42 $1 O03 *20 o2s R4 O54 Z2 } O62 z1 o76 o62 o2v O51 ^m o1j o4u +5 o0e o1i c o66 O43 ^x ] i68 +8 D3 $4 sr1 o3m o2u ^m O13 y5 O32 i3y O32 i3s s58 +8 i0n O51 -4 O02 Y2 O01 +3 o3e $4 $1 $9 $9 $2 $* Z1 O02 $9 o4m [ *32 O02 i1l $m $g $* O53 i58 o04 } c +6 O73 o6m *24 k i18 r Y1 i52 Y5 O73 O41 o2k o1u o2k o1e ^s O51 [ i53 O24 o0F l { +4 y1 o62 O51 Y5 O03 +0 s17 O31 $d d ^l ^l ^a ^4 $$ ^# u O75 Z1 shm $m R5 $n +8 u -2 $7 O61 R5 $4 i7s R8 Z3 o0d u ] $V O53 o4R $d o3% D1 Z1 $8 O16 $7 D2 Z1 ^6 d $u O9B c $l $a $v $a O25 ^f i3g O62 i4e i5l z1 O16 Z2 *30 ^$ o8p *64 r o1i p1 Z1 o6F f o68 l +2 ^L *32 ^3 $p $0 o2 T0 Z1 o6= o5x O21 d d sgd u i44 o5h o6a iD4 iE2 iF0 *03 o2P u i4@ iA. O67 O91 *37 *05 O06 o03 } s5$ *05 o5B i4r O03 D1 p1 i4- z4 z5 O75 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 O75 s23 Z2 $U O26 +6 Z3 s5e l D6 d i7c i15 i12 i3c i7c i16 t o06 sn8 i3' t p1 o0w z1 o6l C k $2 o2k *21 $p s97 z1 i2H $a ^6 O15 o75 O25 R8 O04 ^w ^_ r sil i7f i31 -7 ^3 { i4J i32 i51 i40 i60 r O06 ^u ] ^R d C i21 sEA '7 $* D4 O62 s1i *34 sm_ i6o O74 i1f i56 O78 i3t ^- ^T L3 O02 Z5 { i52 i70 i60 i81 i3d i12 o61 o5l t '5 ^9 i0n O08 i12 i20 i31 i43 iB4 O38 R2 ^b o0e T6 o5u *89 i16 i1f '5 i3r '5 ^i o5q $n O75 o4z O23 R3 i54 i17 o2u D6 ^l ^e ^e ^h i66 +2 i7y i81 i90 i6a i7n i89 l $. $h $u r *05 Z2 c $b $u $s $s p1 spw ^e ^c ^i ^v O39 $y ^p O68 l $i $l $i $a i39 i1d i5c i15 z3 *17 z3 *14 O74 l +0 ^/ i4o i5n i62 l ^b ^o l $a $n $c $e l $a $n $t O02 i51 i1i i2m i3m +0 L5 t i7n i8c i9e i3i i4k i5a i7t i9r i8o *05 i5i Z1 i2l i3f i2l i3k i2l i3t i1o i2m i3a ^y ^t D1 o1d $9 -5 $5 i7a i81 i99 l $i $t $i $c i5t i6i i7n i2l i3i i4t i8o i9r iAd o3w $h i9s iAt iBe *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 i8i i9f p1 i1t O41 r $i $n $e i8i i9o iAn i55 ] l $. $a $z l $. $a $s l $. $a $i l $. $a $n l $. $a $m l $. $a $d c $! o4a i4r i5m ^a o12 o2z ^4 O52 y1 i9u iAn o6i O31 O46 $n Z1 i4d i6m i5o $. $i $s $. $i $m $. $i $l i4v i5e i6r O09 Z3 +5 i0i i1a ^a ^s O43 i2a i3v i4e i98 iA6 $. $b $s *42 d i3l i5t i4e D1 -5 $9 $5 o1d l ^w ^a ^s ^7 ^1 ^0 ^1 ^4 O93 L9 $b ^[ i4a i5r i6i i7a i8r i9k ^a ^n ^i ^n r $l $i $k $e i3y i41 i6l i8s i7e L4 '6 l $. $c $a $t i0b i1u i2b y4 OA1 ] i2l i3v i4e i4l i5l i6e ^w ^o ^t *02 o1o i4b i5l r $a $l $l $y i4k '6 i4r i5i i6c $7 *51 O31 iE. snj o3v c $4 $] i7i i8g i9h i6a i71 i89 i3o i5e i4n r $s $i $o $n u K O21 i4e i5r i64 i4e i5v i6e i1a i3d i2n o2Q u i2n i3a i4t i2n i3a i4l [ sts ^0 *70 i8d i91 i9g iAe *71 O4A z1 D5 i1. l $. $n $u i4s i5t i6i i2i i3p s2y D7 D6 i2i i3v T4 TB TD T3 TA T6 o6w O01 i8c i9k iAe i4r i5d i6o i8a iAd i9n i3n i4d i5e $6 o2Z i3e i4l i5e i8t i91 iA0 l $. $c $m R1 +4 i3o i4n i51 i9k iAe iBy u *75 D5 i3e $3 l $i $b $l $e i2n i3i i4c i2a i3c i4k o8q c i2t i3m i4a i4o i52 i60 O41 $2 i0p i2l i1o r $i $l $e $& $a $m $p $; i4a i6t i5n o7# u l $. $s $b i0k i2l i1i c i4+ $s $g i2r i3l i3o i4v i5e i2e i3e i4t i1a i3a i2k i0c i1r i2i l ^g ^o ^l c o4a $! i0n i1i i2g o6j +2 $. $l $k $. $l $r i3l i4l f { O13 s2f i3l i4s i1! *17 iC1 iD2 iE3 iF4 i8r i91 iA0 O41 $a *32 i9n i8a i9m iAe i41 i59 i69 Y1 o5y i21 i30 i41 ^l ^i ^a ^r $i $b $l $e *A0 '6 i5e i6s i7s i0z siV l c o4W i21 i33 i41 o0( K i5t i61 z2 t +7 i1a i2m i3o i2a i3m i4o i8n i97 i4a i6a i5m i0r i2n i1e ^o ^p ^y ^h i4a i6a i5r z1 s3e $S ssP c r $i $s $h -5 o64 i9a iA8 i0g i2a i1r O01 c sRu i5l i6o i7v i9i iAn iBe i5n i62 i73 i0m i2l i1e D1 -5 o1d $9 $5 ^a O42 i8o i90 i0b i2s i1a ^o ^r ^c ^a i4b i5e i6a o6r i7a i89 o97 $2 ^5 s!f i7k i82 l $. $y $u i8i i9f iAe $. $b $f $. $b $m sgw $7 $5 d $p ^9 i1o i2h i3a i6i i8a i7c -0 $; D1 sih $a $s $h $e y2 o44 k u O79 *81 i5d R2 L2 *8B O16 $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 i18 R0 L1 s8Gz4z3 sXr*8AD1 *64*80 o3o *37 O43 O35 z4 o0c o2q sg2 o1j o41 ^Fsd- ^O^NZ1 sPQ$! i32 L3 R8 u^{ u ^7 ^d sF(fy2 i10 L2 R0 i7.y4 L2 $- i4e s49 *07 K*91 } +3 u *B2 '7 *03 -1 p2p4 s*m*29 i5f R0 R2 i20*B2u i5Ck ^k O17 $d OB1 s8t D7^2 ^a ^n ^i ^d i18 R4 L1 O25 ^p o16 K ^$ o1p $O $5 i38 L5 L3 i55 L5 L7 s9z OA8 i3f L6 R1 ^o ^r ^e ^n c L4 O27 .A O79 o1i c z4 -1 sS; T3 T9 T8 T6 i1f R0 L2 O82 o3 ,4 *3BZ3sH5 O6A i91 'A sm+ $1 i2d Y2 $/ O23 +4 o56 ^k si3 o6d +2 $3 o4j R1 [ i6e o5b D7 +0i5JsXQ sm; O4A O42 *5B*76y2 $t $i $a *24 *02 $Pi8Gy3 $m $o $e $t T0 T6 T9 TD ^|sld i5a R1 L1 O23 o4w Y1 i50 R1 R2 EsZq *72o3PLA s}/^xs{S O53 o0R o98.3z3 T8s_4 se2 o59 o3f $4 sc0 O9B s@y p1 i1a R4 R3 *47 T4 $X o8j O93 i1= +3 O02 ^p K $9 D2 } i58 o0e i8a o6a o4_ ,9 o1i ^A k *54 K Y4 O93 *0B tD1*B1 $l $l $o $y $d snm p1 O23 $k O03 $2 c TB OB6 O9A E sA[ ^`*85s6} O16 D4 sb9 i5e L7 R4 R2 r R0 o2`*A8 i5` O23 c $M $C O82 f *7A$k $. o2, i19 L2 skY OA9 p5 O15 Z3 i3c R6 ^e ^e ^l ^f [^; O14 d O89 Z4 O37 sjB $2 $g Y3i8e*68 '6 $Q O84 *80 c*B5 o2g d *90*45z2 spKf i36 L3 L5 T3 TB T6 T7 z3sC4 o4s -2 *6AiA& O48 sat i0j i2s i1u seo $n ^p ^a ^p o3h $r o0Ys+m f ^T L8 { *78 oAUsPz *B6sA"sV4 sGk$4 OB4 p5 D2 $, R6 ss8 i52 L5 R8 Y4 O42 [ Z2 $e R5 O49 i4u T0 TA T9 TB i31 L9 R4 u +6 ^I i36 L3 L2 D2 $; R6 [ Z1 sj2 O82 o0p *34 i59 L7 L5 T2 TA T6 T7 o3Q O24 O5B R2 o5o o6f O03 y2sxn $L -1 O36 *A1sS@ +8 O91 o5c i7p D2 Y2 y3 ^@ $y p1 k ] o2r Z1 *67 D6 L0 O31 ]iAd $m ^C u i3e R5 R6 o63 i80 [ sg2 ] O6A O28 i0} R0 L0 p3 o2o u i1E i17 L0 R2 K D2 $9 f O43 i5c R0 R1 f *74 O02 O74 *62 sXO O82 sgT u oApc *59 OA2 D6 O79 L6 o4v O59 ^g ^a ^w ^s s-\ *09 { i0j i2s i1e i78sVzsIH D4 o5+ D4 +4z2y4 $A u O24 i7a R0 L0 O21 $5 c $f $e $r s+& OB1 D6 sGM u O05 .0 i15 R0 L2 i54 R6 -2 .6 ,9y1 $ -3 E i5c R1 L4 i5c R1 L6 k*37sqt $T O45 [ *92i9_ ^v *61 O13 ^e z1 E d{*A3 ^i *52 o0j y3 T2 T7 TB TA ,1 O24 z2 O74 $` O32 L4 $l $e $o $n R6 Z3 iBO kR1*84 O94 i0W o2j D0 y3 *35 k{$W +2 u p1 ] O02 i72 R2 R1 y1*94o2| i12*A8 o7y o4x O02 f z3 ${r z1 *04 O31 Y5 .4 O64 z1z2o9E i55 R3 L3 -7 $B O04 '8 s 5 i1. $. i3. i5. i7. o0k.8iB( s24 T0 ^a ^t ^l ^e ^d o0i i2b i34 i4t o2s O41 ,5 ^5 ^e ^p ^a o9=*A4 d *32 O21 $8 s<)'3 i19 R3 L3 Y5 iB, O26 ${l *14*7B [ o0t +2 ^n ^i ^g t *2B O86 swb Z1 y5 O7B *2A $f $a $i $t $h D6o0] T4 T7 TB TE p4*6B sH% O47 *47z1*56 srz$X,7 *72D1 [ $6 i6s O23 O04 O72 Ci4AoA= DBC$G i70 R0 $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 p1 s.W O37 szlY5 o5i O86 sq/*60 sX- Z5*B3^U R3 -7 R3 -4 i3$ f O21 ,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 s5G+8E i31 R0 L0 i0d R6 sct *45 O86 Z5 R6^j i31 R0 L1 T4 T8 TA T7 $i $n $c $a $s $n $i $c $e *26 T6 O15 s3s [ i73 R4 L4 {sO0 iB[p5 k ^x OA7 k +0 '5 O02 srp o0l d OA9 T1 i4k O62 i36 [ k $1 sx;o5TZ1 i30 R0 R2 i8t i93 ^y ^v ^a ^n i17 -5 O18 *42 y5 p3 oA4[^4 O21 ^u $k $y $l $e *6B OB3 r R1 i36 L3 L1 ri0' *A1 o95 O85 O17 '7 sG^ *95 D8 u *68*15sBl o2* z1 q '9 O21 T4 T7 TB TA l i1l $' ,9 k Z5i1a s\d*89$s r o6o '7 R5 o2c K ,3 *20 k$g k i3Q *62 i5h Z2 O6A ry5D9 $m $a $r $s $h *27p1p2 *8Bs^X z2 o1o c sgV i31 L7 R4 i3b R0 R1 *98 y2 O89 i9j O54 ^o ^n ^u ^j s}_*4A D5 i4g s=, *06^g RA i9X O37 }i09T4 o81 R7 ^l ^r ^a ^c c o0z i6- O53 o6c o4y *46 O52 y3 ,1 +5 +7 ,3 ^s ^e ^l ^o ^m TAy3sgw p1*41^W i34 R1 R4 p4 R4 i11 R0 R4 o59 o31 p3$d i7s y3 sVuo1{ L6]sH& o2k -5 Y5 Y2 O39 i11 R0 R2 s8r E OB5 z1 L0 $1 *70*24 i51 L7 T2 T7 TA T5 s?l iB/i2= $p $w *34*26s{i -5 i3i O96 i16 O15 OAB O75 o9v *15 *41 *52 '7 i1i O71 sX- siqsLys8j Z3 o7o sWX *5B*09 T0 TC T7 T2 O5A i5 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 T5 i7A O6A 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 O4B Z4 Z2 o0( *15 o1*R7 y1sa(sXk T2 TB T4 TA $j $u $l $i $e O95 z3 y3s'hT6 i19 R2 L2 ^l ^l ^a ^w c sMu $f ^v z4CTB *83*A0 ,5d s0Xz1s8@ i5e L6 L4 f O28 o3p o0z o4q $9 $7 $2 s(W toA]si& $0 O45 ^e ^n ^i ^m *A7^W*46 o1h O42 D6 s82 i7c R8 L8 '9 o0K $x [ 'B O61 li8m sT$ o0i sa1 o2w i32 $f ^m ^c sX[sWk r +0 } +3$CZ5 OA4 l s\x i57 R2 L2 ^l ^i ^a ^n sg9 so0 si1 i55 R0 R1 sba i16 L1 L3 i74 +6 Z4 O64 s&1T5T3 oA9 DB o2r i3g i16 L1 L7 *46 L7 s20 Y2 ,8 .6 o7K sK4 O43 R5$%y5 z3 O72 LA o0D '6 o0n Y2 O43 OB3 T7 *07 OB3 i7 s*ny1 Y1sPZ s y2 O71 *04 s3e +5 $o $y ^t ^i ^h sL7 O81 o2N o3; '6 O31 Y2 D1 i18 L2 O28 y4 *36 iBuo9I f c O08 $7*40 $n $a $s $t $y ^l ^e ^w ^o ^t i2 sqt ,5*31Y5 O65 slb Z2lz2 '6 sqg $6 -5 { z4 *81 Z3 *72 *63 ,7sMDK ^g z3 y2K*31 s\"D4 O97 *30 O56 T0 TA T9 T3 sge*3B ^4*27 s/YR9*48 +1 sc5 ss0 i67 o7a sln$] O01 O43 o8v O15 u $8 r $a $u $x *93o26 p1q ] .2 $r O63 i5k i6b i3m $o [ O41 O37 rsc9f *42 y1 -0 T6i9^r *19s2] *81i5x*A9 o5s O1A sUt s2B u .A$Q i6% +9 K O24 Z1 O28 t *7B] RA.5 $P,B O06 Z2 r O61 +4 o1c o75 o5d o69 o3j ^- o0\ O9A $fp2 *36s+{ r *98 OB5 o2H Z1 u O7A ^u O75 ^N sQx E o3s s|3 O5A o3Y Y5 O36 Y2R6s!; $1$EiBB ,BsK# p4 o3z $p*7A .0y3 ] z2 o07 ^2 Z3s>S *5B$"'A ssV u O16 C u i0N O16 *47oB{ T0 T9 T7 TA .1 OB3 sA? o2- o3h *19Y1 $7 i54 i2L C sn^ i2C l T4 T7 TB T8 ,5iA/ +1 o2w s.q Y1y3y3 i84s!xo09 L9$ZR1 *B8y4 K +2 T0 ^l O35 -2sk0*31 i34 O14 O53 sT1 $- Z5 [ Z5 p1 o7d T1 T5 T2 TA sH^ OB2 $( o5r O02 ki2t Z1-3si; Z2 O37 Cy5sNg T2 T7 TA T8 *8BD1 p4 O03 O8B T0*62L2 o48 .1 o1f [ svD *A7s`,+2 *63 [ -3 z3 R1 O15 *34sf; f O37 ] O47 O32 *75] d *20 '8 d OB1 l su+*87 s*v$C ]^>-B +7 swg Z1 z1^u spT OB4 q o4msvat O64 $4 oAr O14 O54 R0 -1 s,} O98 o3j DB p2 *26 '5 'B *94 O35 *A7 { o6i EsO; O0A i0_ s]` O5A p2 y4 o3/ u u } o2E ^usFp T0 TA T9 T5 .7i5i[ Z4 OA6 .1 Y4 OA3 i34 L3 R6 K Z2 *58 i14 R0 R2 *15cY2 o5c *57 Y2 c p4 s5u*24 [ [ $0 O21 o5k Y3 y5 OAB ,5 *6B*B0sHZ $m K slf i5p Y5 *0B*B4i9D i3x OB2 O24 sJ= p3 ^N O6A O6A c sn4 R6 .2 O83 T0 TA T9 T8 *67 O06 y4 i1f i2, l o53 o34 O0A *79 ^o o6e O24 *35 ^, d i2L E O25 O64 f csAw Y3D7 i0jsCo *26 ,8 *5A O79 O58 o2. R7 +3 ^s ^u ^p u *05 -5 o53 z4 OA2 *80 Y1 ,1 o01 oBAr s U O54 o6u s;P O27 sl' O68 $f i8o i9y fy4 o0ZsTp $r $m s`%$$*81 o0P r o9i^{ O45 OA8 .9*6B $r*60 o9?*8BsX2 o72 k z3 Z1 o0m O48 i29 T2 TB T3 T7 Z3^e .1 O06 Z4 o0( o6) O03 O9B { O7B O19 *58 Y5 .1 *07 *43 Y2 [ O27 -B ds4.$w o5o Y1 O21 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 $_ O48 k } O98 ]*18 l i06 y4 O52 o5- T0 T4 T1 T6 y5 k O54 i3u O52 sYCR8 sA)*1A T2 TB T3 T8 i5v O83 O41 D5 su ^0 *34 } *76 *25i7_i31 *24 .7 o70Z4 i4b O02 Y2D9 O23 o8_ sFTD7 *A1E oBE[y3 i4hs"GswR $% ^* } *6B '7 o11 -6 iE1 iF9 iG9 iH5 ^e ^s ^u ^o ^m sgr y1 $* ^K *35 R7 O64 ,0s%a*54 O05 c $2 O4B C ,6 sxI oA\+0sB1 D1EiB$ $t ,3 { O98 ^4 $y *16 *13 Z3 O95 i35 OB3 ^p O08 o7* o2i *95*51] O9B ^j s^%Z4Y5 i5dRA *03^z} o3d p1 *82 '6 *95${ $. $g $o $v o7w^K o7*o2isqY i62 i80 i70 i92 *16 ^1 $au-4 sNv +A 'B o7g c T3 d s-s [ o1g '6 +0 i5S ,4 O42 O2B .8 $& snR ^b z2 *89i7q o68 -5 i4o i5o i6n $Q O31 o4e O13 p1 *9B o99y5D2 o0s O61 { -5 ,4 ]y1*98 $@'8 somp1{ ^wsFqiAE OA9 ] R7 i5d *62 *15 Y2 c $A $D s)G^9*69 *20 Y3 } *9B -A c O03 y5 *9B $Go9e*A5 sg- O72 sa5 *B6 i32 D7 ,4 O41 ^m -5 i83i3. o82 } O14 O24 ^C '5 +1 o0n i8(*43 *20 s60 [ $1 k .3 *23 k *30 *67 r O84 i6a O31 s$o y5 O2A $g .5 OB6 $} oAo$)K $%*2A$3 .2 *05 $8 *43 Y1 $M O04 $O D5 y5 OA6 O21 d *A2 Z1s;Ed c i4& O42 p2 O79 ^/d ,5 D2 OA6 i8n O08 O43 T1 T8 TA ^s ^y ^d s7O O71 E y3 c O73 i4y $4 $u o5e *BAi6Mo7S y2 .4 u O48 snw -5 L6 o4a +0 *14i6n i1e $h i4a i5r $i o0s O21 ^s ^y ^a ^r O06 t d z1 $Q O42 snh suo o3k *14 [ o0l srw ^e ^k ^a ^r .0 O6B p1 ^n ^o ^t O03 s/< $U u O1B c T6 T2 T8 ^c ^i ^n ^o ^t T7 TA TB T8 +4 o10 p2 i2) Z3 O8A *64 T7 o0K slG sdO -8 OBA s7G o4d i4l i0. OA2 s3B i4T f O47 *28o3gs$l +0y1*13 O91 i5? R2-2 O52 R3 o66 T1 T4 T7 T2 i6LY2{ O15 y1 z5 *14 i0c k o2m i9} *79 O7A sQz sZ5sr1 i6q T3 O43 $s oAR O36 D9 +1 se1 i32 st3 sl7 o75 ^^ O68 s&d spG^L*1B *38 TB O95 [ Z5 o68 o3fY4 ,3 o2J O01 D3 r T5 R8 o0u ^m O56 R8 D4 K } D3 *4A O06 i3x i5n i4a Z5 l O03 O95 $j $j sik ^W K Y2 o7? o2t r o0- D3 y3 +5 Y2 o7f T0 T2 TB T8 i78s7) s3? O46 O05 i3. *20 o0g OA7 o5a sx9 i61 i89 i75 ^s ^e ^l ^o ^p [ +1 $3 Z4o3n.6 O53 ^5 O58 Y3 O47 R1 Z4RAsby O53 ^7 O83 i7K spG ^L O21 p3 '9 r i5e o5c O02 $4 z5 *36 i2i i4e i3v O36 D6 *85*04 *91-8 ^K o1e *9A O9B O67 o92 $Y ^0 ^2 i6i o3e $r O24 $/ .8 O04 -8 i5b i1z O43 O61 y1 O52 i8` o9e p2 iB) O78 o4m +5 y2 i2t ] sdF*35 $B*96*98 O32 O64 LA+0 LAo1d*68 O21 sln $? $@ $( y3 ^e ^l ^o ^m $? $( sSq O46 O63 s71 ] .0Y1*76 qZ2 O76 +2 -A s;io6M o4p *40 p3 O4A Y2 ss8 $9 O92 *02 *89 ] sdX o2j *34 o77 ^+ Y2*3A O18 T0 -7 $g -0 c sy. $M $O O04 -3 d o1f z2 O93 T1 T3 TB T7 o60 D3 D8 Z4 *05 y2 oAJ *89 $s y3 O62 *76 i7t $3 ^c -2 i3d Z4 *06 $p $u C L1 R0s8d spR $h $P $I szI $i OB7 sS+ E ] o5Y +8*19 -4 $8 O71 $/ $5 c *4A sr O32 p5Z2 ^6*B5 i4c*49 -0 $v y3 scf o7n $x s'd $. $f $j K s1x p4 $s z5 o0w +2 R5 st9 -8 ^j ^A u *54 *10 O83 *9A R8 t iAKi49 *07$' O27 ^l c oB. p1 O31 O65 o5 O13 sdh O8B O34 *8BT8s=& i52 i71 i62 *65 D1 O52 *34 } p1 } Y2 D2 Z2 o29 i7x D5 K oBH i0G +A O28 p3 i9B *43 $Y L6 i7o siE y1 i0, O49 Z1 *A7 O35 *08 o7D Z5 ,3 O78 y2 r *27 y3 O38 i5a z1 *36 [ o4j $7 sB\Z1 i5z q oA7 u *32q ^- O63 *06 s-* +3{Y5 O03 ^w u $. $f $i z3 *19 i4z .3 Y4 *58 R9 D7 .6 i8Q [ y3 -0 Z2 i4- scR O95 ^r*AB E Z2 O93 O76 ^L '7o1u*20 y4 *38 O23 o4?z4 *79s;6 *48s%2s#+ iAH O62 sO3 o37 *13 *32 o3x svY svW svR Y3 O29 s=n y3 O59 c ^< $> o2! i3V L4 *89 f D4 s06 } ^lL9{ O52 o5q O34 O74 sDe s*2sNs^R y5 O9B ^t $N o3n *75 i6- T1 T4 T7 T5 $. $c $r i33 R4 L3 *32 o3p *32 o3s p4 O31 *20 O02 .5 .1 'A OB6 o4$ $$ c i11 i09 O1A f ^m ^a ^ ^i $)ssL o1v i52 se1 i61 o73 T0 T2 TB T4 o4D *40 T1 T4 T7 T8 o6V O09 p4 T2 TB T4 T8 *0AK iBL-5] R0*79 E $8 O63 O84 $c D4 ,6 $Y ] TB Y1 ^e ^r ^u ^s sM;^i ssm{ O14 Z2 o1w .3 sw&o8l ^z o3a o75 o6u T6 TA T7 Y1 s1F i4n *58 r Z3 o0h *B6q y5 O78 sji O05 u K s2P O5A c D1 C Y5 i33 R4 L4 i7) *31 y5 O74 -5 O12 s9n [p5 T4 TC T7 TD o3E s4. ^g sg* +A k *49 O58 R3*59 f O13 $WsR8 Y3Z1*B1 o5r*39 ,7 O75 ^( O46 $; sxI [ E O81 f $m T6 T7 TA TB +0 z5 *43Y2,B ^M O69 o2u ^i $y O07 se@ E ss;$K o1* O47 z1 s8@ o0w o6p o4v +2 sf4 ^x -2 O31 i3r i5t i4e ^u $k sRf*75'8 D2 y2 OA5 *35 D6 i4y i6s $1 o89 o97 $(uiBv K $A t O42 Y1 OA8 u o2s *30 q s4. o6g *02 ^/ O8A $. $u $a i0vsTF y5 O02 O51 C O64 sdG } i1c O23 *30 skJ *32 R5 ^t o3^ $V .7 i39 *25 '9 *68 sri d Z1o0{ i4b +5 l O34 -7 ] o0D OA2 ,5 $s O63 O04 o2S sqi E O76 Y2 ^t o3R o3p } z2 scl uT8*56 T5 TA T6 T9 iB1 iC2 iD3 iE4 iF5 $/s d k s2c k E ^y i48 +7 i79 R1 L1 *70 i4g o0Zs(a '6 o5* *A9 s5q E T4 T8 TA TB T7 saq i0M OB7 ^w O23 shX D4 *24s[F ^a O13 O54 $1 t ^9 o2r $7 i8^i9dz3 Y4s * i4h i2i K +3 $e l i4V i6Z sNg i7V K T1 T3 TB T8 *72 $i o0@ Y5 O31 $5 ^^ OA9 T7 TA TB T9 z4 TA s*AB i2kk T5 T7 TA T9 o4i^4 o2T o33 o9joAao79 +1 srD $2 -0 O12 $/ OB9 u o4i *02 sz. Z1 i27 sik ^R o0z $9 o4q $7 $2 T1 T2 T7 TA -AsnFi40 *29z1p1 *42 O59 -1 O1B ^e *32 i8J y1 O8A O75 *B6 Z1 c O08 O07 +3 ] siy $" $' $f*87 z2 *15 } ^k o6d $3 +2 si3 d *69 O58 s.(-B y2 y2 'B ^P O13 Y4 o1w se2 $4 o59 sc0 o3f ^K i71 i7$i4f s_4 $) OA3 o3ZsTHsXw q$+ i11 *14 r $J o64 -5*7B ^k p4 i4u *A7 ^K O42 r o1l z2 -7 ] scSstS'A i7a ,3 O28 p4sy;} l $. $n $r ^2 z5 p4d*A2 *83'8sma sT@skRoAo l $. $n $p ^n $o OB6 o5c T7 -2 $3 [ o54 i51 o4h +0 s3p i0i sd[csnO *A5sus D9 L9 O05 o1y sl1 $f $l se2 o2r sc@ y5 D2 i6c O92 D4 o6i Z1 iAP O01 D3 [ i6e oAC ^t c O9A szY $u o15 $7 si0 .2 $2 T5 i5- T5 i5. s20 ^Q oA=D3Y2 o0t -7 i0h o74 O74 ,2 O16 p3 *31 i1e t o8Y D7 Y2*63 O41 i6m sp&o2fp4 OB3 f .1 sq)f*6A Z2 .2 O63 L7{$2 O61 s!a i9k ssU } D5 o0d p1-AD6 Y5rs3l -4 O13 -3 p1 O72 i4s O52 i2t i4h i3c $) y2 ^m *A0 O42 i4/^1 R6 Z1 [ sy $f*16sOm ^z ^a [ i41 -7 sea i37 i41 i59 s/x s/H o0z i5a o3i i6d o2l $r *34 *40 ,5 z1 ,4 *40 -4 C Y1 *17 $K OA5 $2 o2w i0_ } ^CY2l { O02 ^v *78 O8B O7B s{Ri3X OB8 O19 T1 ,A i3v*24 o0d $9 D1 $5 i3b *68 +3 sxu o2d O32 O32 -4 p4 +6 -7 } R6 ^c O32 i2g i2s ^l +1 O42 t i4, *41 O52 o70 RA*47 sY*$OsqF O32 i2f o56 OA4 z2p1smj s0G O52 ,3 s06 T6 s4Z [ *53 O8B ^g O45 Z5 spP +0Z4 o1y -4 sD1 c Z3 O12 i5T *35 O68 R4 O57 i46 *35 Z4 z1 O53 ] +0 K O06 R1 O01 o2G C o4@ O56 Z3 o1q si9 D3 o72 o6l i42 O62 } $m O61 i3b +2 k*B1u ,4 } O38 O32 o56 q *5Asd8 T0 T8 TB TA ^j -2 $Y [ $N $j $u i49 u O35 Z1 sd&Y4 p5 y1 O12 o5f *06 *04 o6z *53sD#t f *93 O48 $+ ,A y1 .9 p1 O05 O94 y3r,5 spG D6 sbk ^0 $6 sm0 so0 ,6 s[b]z4 ^1s6f*16 [T6*83 O36 +1 ^k -6 *9B $R OA7 $! d ] i50 O56 *20 $5 o0i i32 $f sa1 o2w *27 O15 f o5( ] i3@ O29 t y3 $1 f +1 O37 sla o1O i72 i80 iA1 i90 o1p ^r O43 $6 Y1 s*ty2y1 T3 T5 T6 TA O81 OA5 E [ $. o1d +6 r $m -7 q sbB lshzz4 o58 i3_ T6 *43 ^' z2 Z4*83 O46 i3A $h O52 s%&Y1+3 ,7 $) +7 i11 R3 L1 s^]^mscq *56 i7X s@u *56 i7, O26 '6 o4m t oB c O85 *53 { { r O31 ^x i0vDBs4D p2*6Bu -1 OB7 o0b *30 i52 i71 i60 i82 -0 se@ C +A i2r s5t $/ OA5 lo3u*A2 spgi7hoAN z1 *84 *24-A*B3 *01 O51 ] O8A i9) Z1R9 } sRm z1 .4 O61 i3- *43 C $! s6Z qsrsz4 y3 i3. i65 ] ^7 i66 ,7 o2m ^s ^a ^e ^l o1u O54 *B6$D O9A i96 y2 o2k p4 o77 *41 $. i11 i29 i41 i39 y5 *74 O75 ^J C s{_T6sB< o19 .0 o43 *27 ,7 Y2 o36 D3*71R9 o0x i11 i20 i41 i6f *91so) ^e ^e ^r ^g ^a Y2 R9 ^i o4o i7/ *97 'A^bY2 o2f s._ q O85 D8 o81 O08 c R3 $. $i $o o7O*81 D6 ^d r ^x .4 ^p ^3 i5t o93 K *61 OA2 s8N t $> *A7li0n y1 K $y *94i0n,B +B$7*8A O89 i5* q i7a +8 *41 o2z u i76 R6 R8 s3E *18 o5I -4 $p O42 O51 $d o3W Y3 T3 c sSa f O37 OB9 $Z ^V i5< [ q *51 k O42 O62 i6Ky4 '5 y4 [ } E { ,4 Z2 c T9 i9- r$cs\4 *3A O12 $Y $g O41 o52 s$**52 ^y ^a ^j z2 O07 *48 *63 stD *B7 OA7 ^6 *25 ^- o3qs{D s`"*15 sT]iA4^s -0+9se@ O32 ^T -1 ^@ s80 i1e +5 [ { *64 -3sh^ p1 o4p oBu OA1 y5 O02 O75 c i48 O64 sLi O0B s)ZsBr*43 i3c i5i i4h $) o5m k O63 -B ] O02 q p2*57 LA O13 s!]tD7 Z2 sWx T2 T9 T4 T5 ,BsXz*73 D1p4 s{Ss.`i2k D9 O69 $p D5 o34 OA6 s>B i6# k D5 o4_ i52 i60 i80 i71 sjzs*e-7 $1 o6a *3B ] OA9 s|) iBc T5 *69 -6 o58 y5 ,B s1I *26 L8 O31 ^f D9 *45 O94 T4 T8 *65 O71 ^_ O02 i2^ O57 R8 *A1 z1 $0 *24 O48 $u T4 *63 o4a $! s@0 *02 $N *07 s.e.AK syg o2_ O78 Z3 .5sq3 d oAn OB8 l o01 O82 *93 OA3 ^f *57 T5 D3 O07 R7 *06o0HsPu sxG ^z O61 D2 Y2 i3n +2 Z1 iB2 ^s o3R O48 ^W i7c O12 O12 i4E ^J *78 o63 +3 p5D8LA -4 *60 T6 z5 i0# ^s ,7 i60p5 O52 i2v s4T c *72 o7m s_1 Y2 O35 +5 *31 *63*B3stD c o5O i2u } O26 {s8m o5t o3m ] o4l +2 ^'*B8+B z2*90^v }$Bs*y o2Z ^g i3K l st1 Z1 i48 o0q i3_ *84 RB OB9 i4b O37 o3a Z5s7$ s${*04 O23 Y1 o4w *A7.6 Y4 O04 ] $; [ .5 O98 Y2 k D4 T3 O5B K O6B O57 p4 o0b -4 T0 TA TB T4 $F $D $F $A O84 ^r sc?s_/ O32 o1u R0 +3 t O32 O72 *B2 i6U o5e z2s@v o1O E i7u Y4*6B T7 O53 o5d D2 $g .6fz1 i5n '9 o0z i6a o72 o4n o53 CY2 i68 o75 *6AspK { *20 O4B *30 O56 $2 z4 Z5 d O6B o4i *23 ]o0Esy} sdP l $. $g $h O41 soi O8B O25 o3c -6 +7 ^, i9u*75 $" O79 *9A $; *01 i9s iA6 y3'7Y4 sy1 *25 Es3RiAU K Y3 O51 sM@ O58 i9o sr, D3 *46 *76 qs3|z2 O07 shv Z1 $> o3m ] i02 i21 i31 i10 OA6 *A6 O53 sBe k y5*90 o8?s/a ] smb *34 ^m ^, o1e r c T8 T2 T4 f *06 O13 sd9 i1r i3s i2e k '6 l RBD5*34 R1o7T sd0 +3p2s1' ^rZ5 ^zspIf s{%'A E O78 oA; O68 sw[ z1 O42 $Q i1. i3. i5. $. i7. r } *42 -4 T6 d O54 *19 L5 +5 D1s\] *63 OB9 Y3 *95 O26 sc' ^t *82 OB2 iBg .5 Y1 *36 i51 i71 i63 O3B *43 { Z1 O05 O72 i9! o23 O41 o6# O06 Y2 iAf s$csW7,6 sCM *32 $Msi7 O09 z5 O01 sre o81 y3 *05 '5 z5z5y3 o61 [ o53 E K i9$ $usR# o0b +3 ^6sP7 d$c*72 o0p i2k se9 i4i o85 p3 OA1 *24 z2 T3 DB $@ o02 i32 R5 L5 *A8 O41 Z3 r o3Y o9> p5 syk O61 *34 D7 o3v o2a $t ,6 O28 l $. $g $n *05Y2*71 i5 y2 sb0 O3A o4i i7! o7m *61 $j s1T ^o ^g ^u ^h u O32 k $U [ R3 saS spS ^g *31 ^$ O87 o65 Y3 .0 Z1 OA2 O17 T7*81*78 Y3+5*18 O03 ^2 y1 ^"*73 i4,c*83 T9 y4 O06 $3 *86 i5o r [ T0 T2 TB T3 T2 TC T3 T4 i6a i82 i7n o9a -8 r i01 *35 o0N y2 l L5 O65 $N i7x o8G s/J,4 o5t K O1B $| s/? ^b -5 s9l o0b o63 o5FZ4^R o4xDA O53 ,5 D7 *35y3u Y4 *9B ] i92 *34 *32 ,6 O18 iB= ^b o2k o4j sa@ T2 $. $b $n sW< O37 .A o8( [ T9 TB i4zsxQ *B1 O04 E $T ^d*ABT9 s8& $k T8 R7 O98 sg7 i5e +7 o1t .0 *67 o13 D4 slO O32 ,5 +0 sd& i0c *13 O3A i97 i9c o7K ] seo sd- $,s-, *A8+4'9 ]*B5saz *A2*57sH% l $. $g $l i41 i63 i52 i74 T2 T3 TA T5 sm`sPQ+3 *36iA? i66 *63 ] -2 [ $3 O06 *97 Z1 L6 -2 *4B 'A i1l O32 d*27 O94 iB4 $gsb5 sn7y3$4 ,9 ,6 ^o Z2 *10 i6r o5o 'G c OB4 -7 i1_ *43 ] sjf [ i30 qT0 z2 *67 C Y2 $ i9m spc*20*6B T0 TA TB T6 y4 C -7 $u o7up1] i9@ O04 i7a i91 i82 $0 -6 sBV*87*2B '6 Z5 p1 *BA -6sB\ o76 .6 o36 +1 ^s siA y2 OA4 ,3 OB9 Z1 *27C*69 -9 O18 O49 p4 O6A Z3 stf +4 O63 ^3 *25 *13 -B iAB -5 i61 y1cR9 T1 i0* i6y i71 i80 s8&s\/$k *B1*71 ,8 $/ i81 iA1 i90 O24 sr4 i9/ *A7 Z1sM{RA o5k i6s i4i o5c s9y Z1 iF1 iG9 iH4 iI5 y2 .4 *4B.4} $8 O28 s'[i9( o4@s[% R5 '9 R3 $r ,4p5 $y *12 ^c ^k i5w ] o3k ^| *12 T0i7Uz2 su2 RBc sSd+2 $+ O02 Z2 o4a i1o O32 l}D8 O0A ^[ i62 i82 i70 i91 D1 '6 -3 ^h *50 o0di8} *32siz O03 ^V s'8 O46 O1B o82 t*69y3 ,3 o0n *4BE snqT6o9? o7, -5 *64 O54 t *01 i32 i52 i41 ^a ^m ^l ^a O45 C tZ1$3 O32 o3+ q O04 OB9 s*} O57 -8 saA *31 L3}p4 Y4 ^e OA4 $$ '7 c O01 D2 O19 *24 *08 O89 *AB*29*31 s6p i0g i5a $a ] k ^o [ scR i4 r ^n +7 i19 R0 R2 saq y3 s*U O96 *86 O84 t T0 TA TB T7 sjisP)$* O59 i3_ shP i1a sp6 o6s o32 $e z2 l O65 D3 $% +1 O03 ^o *A0 O38 $6 r t Z3 O03 ^s ss! O4A i7o '9 i8-o1e Z2 ,1 z2*5A iA? [ O57 ,A ^P *24 ] *70 d [ O73 o6u $n k -0 +3 ^e ^p ^o ^d i5r i3= o1r T4 Z1 i8< s4@ s3t r c $o $n $l $y ^x O79 T1 T8 TB T2 o8G oA2 i0I ] ,3 O45 T0*A3 ] ^e s3b ^i O94 *51 +5 y2 *05 O61 $!u*56 *7A OB4 y1 i0, i4& *16 {o5t i3r*65 *06$y ^q i2w T8 Z2 O47 i40 i55 p5s;F +4sfH*40 sa1 -5 o13 p1 f ,A s_^^S [ i5j D7 *40 d O21 } $^ L3 z3 ssz i5a R1 R0 O56 D8 OA5 s.Ki6. o2b o3s ksrv O02 $k k +2*1B.5 ] $Y ^B *39 y5 O9A o4a stY -AiB.$i $f shl $6 O71 ] $< L2 '5 i3d o5l O98 i4 -6 -4 O87 i39 $6 O12 ,6 O56 r +0 O53 s1m D6 O32 i0n i5a [ sc0 Z1 $? o5m o7g D8 { { O5B i81 r ^T O58 sq' '7 o0U *56 ]s9c[ ^6 Z3 ,2 *52 *04 Z3 s9w sao O73 i3b R9 L9 T3 OA6 i61 i79 i96 i89 i0U -7 i32 R1 i72 i91 i80 iA7 i31 R4 R2 i6w ,6 -0 i8p +3 i5s -6 OA1 s'G syP $m *71L8*41 y1 *17 O12 o2u O41 'A *54 T2 T3 TA T8 *B5sNg o4f D1 *45 Y1 Y4 i1f R7 L7 ^4 so2 i2b o56 sa3 ^G .B O14 y2 ] r O37 ^g sIdi7k o4s i52 o7u i8t sm ,3 Z4y5 s& p5}*96 s!q $u oBM L2 t s*G$t{ O39 E .3 *60 O6A +3 *36 ,2 *19*07 O52 R5 o33 Y1 o40 i13 o2i O73 o1; O0A sd7+A*69 p4 O9B D9 ^a p4 O61 *02 ^1 *24 $L ^7 i20 i38 o44 o16 O61 o71 T1 o30 T4 T9 T7 TA *51 -5 $D O6A T6 -7 sae -2 ^3 *35 .4 *35 s/|sn9 s6= d ,6 -2 .1 sqt *07 $g oBb oAz O8B T3 i3& r $u $p Y4 $a *B5 OA1 ,1 ,5 i3H i28 s28 se( i3d *74 +1 $a L3 i4k O84 D6 O96 O1A ^m scd $5 R8K *32 O41 sv[ O04 ^^ *37R1 Y5 *13 O25 ,6 Z2 s#F i1i O64 s5w i6Z +BY5 i4e [ ^o se_ i7a o3i i5I l $8 i4& o7b i7? '9 oAP$- O54 o55 *5B O25 p4 DA o88 *87 o04 $6 i2z '8 i7e i91 i8l O19 slt Y3s=R o5l '9 ^k $z $4p5 o2@TA*B8 i8# *84 O42 +2 O72 ,3 R0s+u $i $f $y i63 i80 i70 T0 T3 T4 TB O72 i6j *94 O05 O94 O73 $; *72 ^o d +0 O73 *70 -5 T0 T3 T4 TA z2 R1 O57 *07 *21 *23 *41 T0 T7 T4 TB ^w O18 o27 *45 *54 *56 Y5 O78 ^Y O41 o1e y4 O43 i4n O38 ^s o0y ^d *16 *30 q O82 *27 *96 Z1 ^o ^v ^l ^a ^s O57 *76 $ystP soA p4 sb. o2m s8E o2z -7 *32 sb8 T0 *96+1i8D i6k O02 T8 z2 i62 i81 i70 o2a $e i50 o68 +8 $7 *48uo5B o5f $1 ,4 ^1 se3 si! ss$ $" OA4 f *15 ^6s%} sOQ O64 o7. O27 Y2 so* o4. '6 sdi Z2 } ^l O32 +8oBg o23 *02 k o1f O6B o07 Z2 -5 i4r i6n i5i *A5 -9 O43 Y2 *12 z3 K } i04 .2 -4 O34 O6A E o7` ^k o69 .1 o14 -3 } u } ^G D5 o6g *89 O86 sQP O41 o7y ^! O38 Y5 s[g O68 o2+ *10y2{ *A7$y Z5 D5 O75 T1 T2 TC Kscq o92 i91 r O12 d o0p ,2 -5 O29 p4 s8&$- i1V DA $5 O25 t *63 r OA3 K s0 O92 r o1e O54 sQ< d } D2 +0 +2 ^1 sYR p4Y5sv- D6 ^^ ] i0m *63 z2 i6n *40 T3 T8 TB i45 ^6 s\wi20 oA[Z5z3 i61 *37 O34 ^w rT8*50 o8o Z2 C $r i3d } O54 f O8A sfF ^e O48 i1p *01 stz o1c ^M i14 R5 L1 ^1 *16 $4 R0 D4 R4 Z2 *0B$li8| ,3 ^6 ^K six sQ5 p5 O58 i5v ] o0w o3g O94 sx3 *B0 i76 R1 L1 ^k O19 *41 Z5iAYsvT o7P*48o7f ^* ^^ +4 i0t Z2 *84 i61 i79 i90 i89 O97 OA2 s*2T7o0K sb0 Y1 $r Z2 i5D *50 +9oA)sk; o5U y5 .2 y4 OB7 { D1 K +6 o3e i4i i6a i5t O56 sQP o8E ^t -7 +8 ,A O04 i3u ssk R9*76 o1V u i6h i8r i7e O87 L9 *97 O53 *98 O63 O93 O04 O91 ,5 O57 o9&i47 O54 ^3 O06 $3 i4qy3Z2 O72 K *31 svm l *13 ] c y2 $b $a $g $s *34Y4 i44 '8 O13 i8M i28 Z2 *35 .6 O65 T1 T5 T6 TB ] *B6 O31 i1. i3. i5. i7. $. D6 O16 l sj] OA5 .3 o13 +7 s0s R5 +0 D6 O73 su> o7y O05 T6 sRJ O39 -5iA. O51 O72 ] i6b O02 -7 *72 O41 *3B i33 oAe o7g $l o2ws|L i33 L3 R8 *B7 p5 O57 p3*95z5 o8( OB7 s<+'B *53 sn7 i17 ] Z3,7z2 E r i7! T5 $r ^r *20 { O65 *21 Y5 k +0 o3w syb u i9B $d ^t ^i *72 *09 Z1 i42 o6! .5 ^b R8 scH s%2 O87 .4 o68 i4G ,4 Z1 T1 T2 T5 T9 $a ,6 D2 L0 +5 s3h ^i ^r ^a ^m slf o5d -1svt +0 o3z *73*AB ,5 i54 T2 TC T3 T6 *92 i7d O93 i80 O02 L8 sFa D3 ^e O94 -8 K t o7/ *98 O25 p3 o6s ] u O82 i77 OA5 O39 i72 i92 i80 iA0 ^U $6 L0 l '7 p3 *60 sQai6HY3 szZ szR T7 R7 ^l ^a ^o ^c i01 i31 i19 i29 {t*39 *65 o6< T5 i4e i4os&Ds=d $s $z s0r l ^Q D5 p4s}pi5H T2 TD TA T3 f O3B Z4 stn k o6m [ T6 q D9 O43 y2 *A9 O08 ^8 z5 c *05 ^fi1biAq *81iB}.5 Z5D9 *49Kc s/* K O72 T4 oApo6Rs]^ +5 seS sWm-4*78 p1 o5g Z5 O83 oAa.4 i2w ^q s6^ scg $. $l $v $k *17 .2 +0 ^A O98 *A3z3shl o14 K k $9 ^l o49 +2 i5c R8 L8 $3 *32 o8q o0r *17i3? i1d R9 L9 Z5LB.5 s4` s4o suU$] O54 y2 i6z $O u $5 $6 $7 oAw*12p3 *17 i0Z i5c K $3 o21 i5G*2AsGv i35 R1 R2 *29T2 i6E OB1 y1 i75 O8A E $. [ T0 TA T6 T7 o0x i1p i4L t O31 $w o3x f i90 ^T scR O23 o2y ] i3s ] O53 *1A ^g *13 ^Ko8Zss{ r i51 seIsL# f O25 iA{ O67 y5Y4y2 -B O95 ^Uo7^ o35 O95 } k Z2 i3I s.r c z2 +1 O62 $, *57 soV O37 O89 i0a z2 p5 $r .3 y5 OA8 sj. O95 *29 -3 o12 +8 $f p2^# c*59^' o40 D1 *58[Y1 iB!i0cd z5qs%S o0l y2 O7B O42 .0 o3J ] *23 $y ^B O12 z1 O36 o09]p3 o9x*B6 o8# +9 [ $K E s6]oA&o2h *40+A RB ^l O0A -6E*B5 ^> i6u i51 +4 E p5 OB2 CsdPd Z2 shv o0l +3 i78 L4 $qsn0 iAgs'vo7O ^t ^i ^l O57 Y5 o4Y c ] $o { +1 i27 s6J l '3 ^z O13 o0j i1k o23 o17 Z5z5 i2A { $+ O2B .7 O03 iA2 *9B ^x ^z i16 sr8 $q i3i R6*57 o4m s37 O43 +8 ^n ^u ^f O61 OB3 $ ,2 *21kY5 OB4 oAX s.}$,s+' o0 t sr@ srE srV $9 O41 T0 K E *38 E i4[ T2 Y4 ^l sc) O9A z5Y4u O3B Y1 *10 o4W q ] O65 ^0 sm0 ,6 $6 so0 O13 k c *A7 ^r*5B O2A oB1 } $6 $2 $6 $0 .Ao5' *80 +3 L4 $0 $z K sds +3 $z iAl O63 o0i i53 R1 L1 o6;o8`.A ,7 +7 $) o3u +4 *31 ^7 O68 $E o3$ l C O47 *15 p1 o5k o3* ,4 O16 ^q y3 ,4*58*8B sFz slO O32 o6s^h L8 } sQ\i7j $!*57*A8 [ i1P O52 O62 ^x o1i ^6 ,7 O49 $% o1B ^C $- z2 -Bz5} *5B O92 i8p i7# [ T0 T3 T1 T7 i7I t RAsD" O62 o1! $1 o79 O82 i6p O24 -0 sei -0 s{"o6{ ] shl *34 sas p3 l } sid R0 k z3 ^w i3J t ^P O23 y3 } *60 i3%spK i4zsPH l Z2 D0 s}? O46 q o5g O14 i8t i91 iA1 q O14 *36 $% O82 *BA z3 *28 Kss[ i0l i2c i1u o5! .4 O63 *30 } K k q s8O o32 sqB *41 T5 *41so#T5 sR=o6u ^7'BLA T1 i25 ,2*6A -6 E +B t i5* sS) z2 i9e O83 D1 $B i8v *68 s7E *47 O13 o9L T4 $G O03 s}| l*81sl7 ^2 sv9 ^4 o60 O91 +2 $3 f O12 O28 ^9 se6 $d su3 o6f *14 o2b o3\^hsHP O3A spF o31 +0 o5r i9$ E O63 $8 *74 K o0y R6 -7 i82 i90 iB2 iA0 $h O32 *25 O74 i8l sXZ *32 O83 z2 *40 *39 dRA Z1 O46 y1 iA\sNju O31 O04 .0 D3 iB( O73 o2w sny -7 O91 O02 D4 o3z O43 o3z O42 .2 -5 K $" D1 Y1 -A ^J ^t ^i ^f oBx s$7 O32 i3z -2 i50 i72 i61 T1 TB T9 T8 R1 i03 o5G *50 l *12s36*80 -6 o7e $jK*25 +5 o22 i5K l o2r i3r i7o i9a $0 $o i72 i80 iA2 i91 sat r spoo9c i39 R2 R1 *91o4n [ o3p { i6s R7 O23 d ss'i34 *B9 t i71 i89 iA5 i99 *63 L6 s3!Y3sxZ *8A i64 O69 i2j O51 '2 p2 sq.d [ q o4m i2n i4e i3c O0B p2 ,2 O3B OB4 O41 Y1 *3B {z3 O24 $d T1 T5 TA T8 i2b O32 i9Bo6t^m sAb sAz i6pi8+*B4 T2 T9 T3 T5 spT l +5 o2z y5 ] t O25 .1 oA_^O i46 o33 '8cs8( T1 T5 TA T9 do5Mq O24 $_ Y2 ,7 +4 i47 Y2 ,9 y1 R9 c i9z*85Y5 T2 TC T3 ^h s7_ R4 O12 s%NsbRr E O31 T2 ^+*62D6 $z L8 i15s0} ^m o4c RAo68 *46iB5s?N T9*B3 ] spG OB8 Z2 *54s'\d $$ R6 [ i3f -1 sij o0i $f o2w sa1 i32 p1i6c s%2$F $wi8o *A8,8 O37 i6M O05 s?4 DA O1A K -1 T1 oBSq*83 $g z3 *03 *57 ^s i6h s;/ i1u $e $w o4t TB *13 i1e i4n T1 T7 T3 TA { O05 Z1 O41 *31 $u ^" O05 D5 i1- i34 R7 L7 $m $i $t $c $h s#V Z4 $r i8e iA0 i91 y3 O5B p5 O3A o5e [ O37 O41 *16 O83 *8A r *21 *05 *08{+0 Y2 *30 i33 o7g $l o6j OA1 ,7s+v $L C c oB4 Y2 *35 O62 Y3 [ s2P ^1 *86o9)sS# i11 R3 saz O35 O23 O12 i21 i2z O14 o3U ^= r OA1 ^1 c $d $u $n $k Z2 OA6 OB2 O87 srv Z1 i9O O23 O25 i2i *27 L1 O42 o18 p1 sId i2s l $. $c $k O23 i5y p5 O92 ,5 L1 O41 Y1 E $7 o0/ T1 sV( f O9A i6wTB O05 O81 L8 i2l +0 o8!o7v c y5 sm2 O62 +4 Z3 y2 Y2 O63 +As z$- [ i4f sb, Z4 +6 c se3 T1 O37 *14 q $R O79 *6A^[ i51 o2y f O52 .8 O86 iA_ t o4B y4 E O67 T0 T2 T5 T4 o1. ] c $. $z $a $v d o53 .2 [ R5 k $. $a $t Y4 O41 K sqk*B8 Z4 +2 *0A i4 O64 s7n i0k z1*25*92 i01 i12 i3a i2M i4r -7 *57 i59 R1 L1 i5d i7g i6o sL%i6i*54 O13 o3l i4o i6a i5n ,7 *75 s9p k s92 -8 *80o9? u'9s]t sRGZ1*26 O13 o3x T4 TB T7 stw O78 s7 O04 Z2*27 sy% *97sv".2 ^9sXqs>d q s8. T6 o0$ syN syM syS $f+2 OB7 ] O83 O21 LA O51 sus O78 O62 ] T0 i14 $9 $3 ss6 i35 *24Z2Y1 *32 O83 $8 l z1 o0d $9 D1 i3b $5 *7B 'A o5@ $3 o4R l *16 i2H i5k O25 +3 o6q spj O87 o82 R6 ^p i72 i90 i80 iA2 O32 Z2 O35 o1d D2 r i30 *31 *65T0z5 *02 L3 oAq k O94 -4iAq z1 ,3 *25 i9Oy4D7 o3q .2 ,6 sum ^PoBI $< o61 $u i33 si6 $b i54 f O28 ^p O53 o7_ sk&o4s*80 o0B +3 D1 o2e o33 ,2 $' *63 D7 o13 Z3*56Z1 l $. $c $n s3g ^k ^n ^i ^m O34 T0 q i8t *64 i7o ^H $w$2s<& i3h i5n i4a *04 $w s%N$" '8 Y2 ^4 t ^i ss]Y2iAf i65 .4 O09 o0w O34 z1 *31 *46 i0$ *10 O89 o4c -6 c smk O02 y4 k o0d *06 o0H ^r O63 z1 s4d OA2 o8+ O6A sT2s+B^3 i7o i99 i81 c sd1 s.[,B,B p2*32 l $. $m $h ] O5B i6(*49*38 O51 i6s o2l o30 sGh -6 ,2 i1d O05 o2g Z4 O0B y2 i8n i91 iA0 O73 R9 $x T8s.+ s4V [ Z4 -4 ,3 *A0 O12 d ^b O15 -7 i2% k c se3 T3 s*l T9 c i55 O62 ^" ] i40 $1 y1*B8p2 p5 OB6 +B k ,5 .2 R3 '4 ^z k -3 +6 O81 +A y3 O62 E s@A r O14 O3A } o41 o0d -3 y4 O75 ^k O49 -6 $B *98 o1e -3 s-b O45 o5ps4B $8 O46 z2 ,9DB $_ $, sl] l 'B $4 .0.0,9 O72 R1 E $_ $' o7r O01 $Isgn ^e ^g ^d ^e sl" *96p4 $6 o1h O62 T8 Z1 T4 T6 TB T8 i7v D1 Csuy sX i53 R4 L4 C sTy +4 *52 Z2 $l swJ s9z $$ o8i ] s'@*2A*76 Y4 z1 O07 L8 ss$ O57 i5h i7r i6e D5 o7i p5 R1 D7 *76 $/ ,B O49 OA2 $2 +8 O71 smd ^o ^h ^o ^m $( u *57^x*8A ^k ,7 T2 T9 TB T8 } s18 O37 $n o4i +2 -5iB;o5c O08 o0t ,0 O02 sar z4 *36 i22 $H O45 D2 *70 D6 ] ^^ ^k *96 ^) i8c sSvsi9 s+= o0z k s+F L6 +6 '9 q Y4 O97 O64 $7 $od] ^k *52 O12 i62 i70 i91 i82 $5 O62 *58 O59 R3 $# $7 o1o *32 l $. $m $v o7a +5 O52 o4ly5 *B4$> .1 o8! z4 s0D .2 z2 ] ^4 ] iB/s6' ^g*84 *37y3 z1 o7g o2v -6 +2Z5s2` o2v -0 O94 sFR *23 DB i6O O3A *67s+k,A iB'D9 o2v -3 i7^ O7B p3 z1 i2R sx[ d O98 i9k iAs *07 o0k O67 Y2 y3 O41 r O2B s&; '7 *25Z4 O35 r *B6 O34 O94 y5 -0 o2c o7% oAd^# i5< *30 *86 ^P o9'+2 $o*14iBY s_+o8$ i3Z D7 l $t ,6 ] o5q o2y ,2 set Z5-0 RB O02 OA5 y1 *41 $v O12 s7z { ^g*8A *26Y1 Z3 i1a '4 Z5 i1h Z1 O51 *32 i12 i4_*B6 *69,8 R7*38o3y i9N *56 *71*63$y $0 oA1 Y2 *68 *76sqS s$y i1H $! *57 O96 ^| o2u [ *20 o1q u R9 R4 O97 T0 -9sQU i52 i72 i60 i89 ] u o42 Z1 z2 D7 oAMsg8 i18 Z2 k O43 O9A ^@s%w ^q Z1 O0B sB9 y2 Y5D0Y5 l $. $m $w z2o0noB3 '8 L2 O5B *30 L2 o7a i2a i4e i3v z2 ^I Z5 o6m $]sw>*90 O76 i5L $#o9l i32 i40 i61 i52 ^b ^u ^h $a Z5 Z4 l O61 o0H O41 ^4 $Iy1Y4 O67 O54 $2 *24 q o0s o0= r *35 o3( -0 o49 *42 [ y2 O24 o3Y seo *54 O4B OB3 T1 T2 T4 TC $% $. p2 ] O9A y1 i1= Y2*12u o5e o6x T1 TB T7 T5 i02 i20 i10 i37 z5,9y5 C -7 OA1 sub O72 f *53 o2e Y1 $@ O74 *14 o0z TA RA O42 q o1f sCVr O92 i4t *64y2 u $+ T1 T2 T4 TA ss$ T1 +8 *14 i03 iA4 $Ws^2 *03 '9 ^B Z5 s4V $g O73 O97 y1 T4p1*9B i8ei3p c $8 $5 $7 O39 D3 sA6 i17 R7 L1 O93 o0o ^9 E O3A ,5 .3 O24 O05 $5 o5o ,6 *61 ,3 O17 $o -AtC o07 D2 *56 *50 Z4 O4B C ^X $X *23*5B i62 i82 i71 i7U z2 ^ O78 scp .3 *26 ,8 i0n T9 *90 i2s i3s i4w sy] D0 O39 O43 oA- { o6v O82 sjo$? L6 O06 ^% *12 } o14 l $. $m $y q DA T5 ^T +8y4*40 R4 o54 K d u z1 s9Z i2m *35 o1P -3 c $o $r $a s%^D2r s_[Y3s'z OB6 T7 O91 s@) s13 K o8qq*93 *34 o42 f T1 OB4 o13 i62 O31 } y1 T4 O25 sAB*53p5 [ $7 o4j .1^t*31 z2*1A i11 i29 i43 i39 $l p4 $e oA { } s0G $"s7* i4o i52 o6a o8h o5H l d $i O62 *51 slLso@ +5 o4p y3 $+ O74 o9^p3 *46 O72 TB i8e i9v iAe *34 o4u R1 O95 O84 oA9 i42 i60 i50 i73 i9I^Z i42 i60 i50 i79 i1C D2 { ssyp5$| ,8s{h*34 i8'*64 ss& y4 +8 l $. $m $z *52 ,4 O9B OB8 ^2 o4y *64 Y1 [ +4 .6 OA4 $L $s *97 iF; { o1m O43 y3 k y2 $f { o1e RBDA *27 O07 Z2 y2 $F sF4,5*87 O21 o6n $ko7.+7 ^` O08 *A9 E s5q T4 $( $3 L0 *74 O05 ^y O75 [ $w i0q ,3 '9 Z4'A s;m+B i72 K O6B i7d *50 ^b z3 sy7 OB2 [Y2*43 o2e D7 $& i5w p3 $1 O7B sB6 ^x o2e D8 sa, sa> O92 L9 sa4 R2 oBr E O02 O6A i8TZ1i6n O47 Z2 o4e i9+ { o6| Y2 *0A -7 O67 Z4 C z1 o6k O01 l $9 *47 D6 u o2$ $j i49 $u p5 .0 .4y2iBr i34 R5 R4 [ L1 O01 D5 k i0c i2a i1h E o5P *40 R0 y2 .4 ] o2rs{s q $w k *56 -3 Z2 O03 z2 ^B R3 o4& $8 O5B i2y $B $E y3oBk o4q o2a d*B1 o17 O1B sn) s8L O42 O52 $e Y5 *19 O04 ser*8A*32 r K ^0 spW l ^c *34 i7b } y2 sg3s|0sIu sL5*03 O61 $v +4 +A oBS $e ^3 o2d O9B T4s6> '9 $x i9Z Y4 O51 '9 $& s[^ O8B i17 $2 R0 t +3 T1 T4 T9 T8 r $o $i $d [ D3 R0 i4y i6s i89 $1 o97 s\yEsn2 O83 i14 ^1 *74 i5c*8A O17 Z3 C z1 '8 i9P *43 *50sX4f O36 z3 o6fse! oBM O03 *86 O8B *9A*32 s"PY3 *25 syA O35 s0_ -3 z3 i4b z1 $^sLU o5k o3n K i5c ^n ^i ^k ^a ^w .3 O78 -1 O45 u +5 s?ci18*B4 i43 i61 i52 i69 D1 $5 d ] Z1 i6b O14 O83 oB= sdn ,2sLe*65 K i5w R2 *56 i9s iA1 iB1 y3 *10 $9 $0 $5 $! i1e i3r i2a ^k si3 $3 o6d +2 D4 T6 sHr ] ^0 i36 so5 i46 o50 T2*B2 OA4 OBA i0A R4 i2a i3t i4h i4= *78 sJU Z4 O3A y5 } O04 C OB3 O48 ^f O62 o0g *0B^}E i71 i89 iA1 i98 i7XZ5z3 +5s+? sBd*02s%8 -2 O54 $h Y4slx D7 *05 L2 t^L$' T0 T3 T8 TD R3 O43 *26*9A o7/,6sL! sk_ } O54 *8A oB3 i30 ,4 T1 T5 TA T3 +B $E O49 '8 -3 z2 s2# O14 '7 $; '7 $> p1 sy9 O28 -1 Y2 O24 *13 *45 R1 OB3 ,0 Z2 L5 T3 .0 *76 Y1 ,A O75 O24 ^a +4 *07 *15 K o8$ 'A $D -7 *32 K o8o *61 $i i02 i10 i31 i21 o8/ i5a l O54 *BA o1P c -3 O95 q ] O14 ] y2 r ^+ f { O18 *65 { [ $Q O31 T0 *75T7 i27 *16 K +4 ,6 D7 o3y [ r D0 O12 R9 d O1A sKA o35 } sB4Y3 i6l ] *B6 O38 o7t y4*08 suk s#L *20 o33 T0 T3 T8 TB i4a i6l i5e O05 s]o O65 $j s'1i0p$e } O81 L0 O71 R6 T1sIZ$M *5B*43 O7A +0 [ y2 O81 D7 i5i C *97 o3N O72 *47 OB4 O32 *63 T1 T4 T9 T5 } $} i7s i8m iAn i9a *47*70TB Z2 sem iD1 iE2 iF3 iG4 iH5 O02 *34 Y1 O14 '7 L7 Y2 p1 s1? o8B +5 i6= y2 $> s3b ^p ^i ^r ^t z5 'A y2 O34 ,3 s7L ] o6f [ { Y1z3$j LAp5 Ei0e i2a i4g i3n i7n i9s i8e D3*8Bi43 o2g *46 t Y1 O42 smt -7 i8x D9 *A8^}} rsf*$/ O35 ^T +1 OB6 TB s(B E O21 *21 s6I ^k $3 +2 si3 o6d [ } ^t iB9 K s6% O42 ] i3o ] o4o $z DA ^5 O41 s V^] r ^0 K D1 o3y +2 i61 o0f o2c -4 .5 sBS *75 D3seAz1 s5n *52 E +8s}$u i5/ O93 O86 y5 E O38 s.p s"L O19 s!asb8*76 ^n *42 Z2 O13 [ ^2 D9 $V O81 O04 D6 i25 O61 T0 T1 TA T7 srT O03 .Bo1Psp{ $8 O03 *09i9U i37 z2 $8 O05 o1O *86 O9B Y1 OA5 O63 $t p4 ,3 D7 z1 o4V ^s O32 O29 T4 ^$ Z1 t +5 y4 O09 Z2 O23 O12 O23 ^o O14 y1 $3 Y3 ^F sl3*2A O02 y5 -3 o5a p5 sne sDAt stS 'A $C $A l i7x D5 o9J c s!a *76 R0 i1% +2 D5 *79 i5O y5 Y5 [ O23 O47 O73 *03*84} ^s ^e ^c ^a ^m } } y2 *84 T2 i4c i5k *14 d O23 -7 $i O0A sg8 o4q y2 sLc ss% O92 { $t o1a o5m i6o $a o8k u ,5 i7i i9n i8o K i5, y2 O93 $Y i6t o3d R6 O75 *26 ] O87 *61 szN OA2 y3 *13 u ,B k o0k -1 k s10 s/;q $r $t $y ,9D2sg2 s2U *53 o47 k R2 { $W -2Z5D3 -3 o57 i2s i4a i3h O94 $4 { $% flskt { $3 p3 ,1 r *2B O52 o2d Y1 o3e su$L9,3 K L7 sBR i5P O72 stF stC *3B *83 [ t ] stS O53 D6 $f*96Z1 -7 $1 O41 ^5 [ o5x O67 o5| o4n *40 oBy D1 s&<^O-6 O41 -3 D1 O36 *32 .B O71 i78 -A *29i1{-8 -7 TA D8T3i5d o9Q OAB Z1 L5 o2l } o76 p1 [ K *68 *15 O72 i3o O59 i5l O02 k $k O63 y5 ] $d T7 ^V l o3t *90 'A q Z1 O84 *06 L0 { Y2 *40 D4 R1 } k s!b *29 O06 o20 o1h ^x $1 p1 i6/ +6 D4 k i41 i52 i74 i63 i85 o0p Z3 iC1 iD9 iE6 iF9 ks/6,5 T2 T5 T3 T8 s.X O42 ] *B8o0/swJ OB7 ^< TB ^J O15 z1 -3 d y3 E *35 ^F *37 sh. i2. i2n i4l i3a } ^9 o0b $3 o3#sPq y4 O82 } } s1W } Z2 k o6c $e *17*B5 -1 i55 L2 Z1 i8Y E O39 ko9[L0 s&@ O53 { *78D8 o3d *45 ,3 y3 i4a i9. } ^r '8 $/ *73 *15[*85 T0 T3 T8 TA .3 z2 o2g y1 c OB4 y2 O19 O23 Z2 ^h $f o60 $1 u i11 i32 *18L7sp+ ss6 $B L0 u O14 *84 } sp1 T2 O3B sKa sSc O17 k ^8 O93 *B4i9O *89o4G{ i23 *63 Z1 O76 ,6 .5 O32 y4 i3d o6x -7 d *68 p5 ,5 O9A O45 i1u $e o4t $w O45 p5 k $P o6v*72K D4 ^f Z2 o5s ,8sDd-4 $X +8 ] T2 O41 iBV i4e i61 i5s $`sQKt T3 TB TA T8 O75 ,2 L1CiAM soty4 ,A.8 oBp p3 i3c i5t i4a o4N se_ OA3 o1A o5z +6 ^e ^u ^s O68 Z4 o3y o2c R3 E .4 ^a -6 s2e Y2 O98 p3 u $K Z4 O73 D9 i5A sB`Y4 *24 OAB { ^w ^o ^r ^h ^t ^Vs4\ s`M s9F O49 Z4 *5A O65 *AB s7a O46 y3 *92 OAB i9x ,B o6G O2B i13 o30 *A8 ,3 u ^K *15 *B8 $o O65 *90 T1 i1a $e o32 o6s sp6 s8w $x o2u i4e i5e o3t o9p stL iAx E *45sIRi7# i8i i9n iAe O45 -6 [ *09 o47 $a o0r -4 sdT i6j i1e $h $i i4a i5r T1 T4 T9 T2 ^d ^o ^p O25 K O45 O32 *53 -4 o51 O21 ^3 r *06 i9vz4Z5 d Z1 Y1 u i11 i31 i51 i71 i1T'7 O58 s7h slO i6Z o3o O65 u OAB $y O81 o7b R0 shd *80 O47 Z4 y2 i9m s2f$U ^m ^u ^r sg?s4V s>T*B1sQ3 TA O5B y3 [ OB1 i42 +7 *28i1B z3 p1 C'B { i68 E^=s+a Z4 i2u sp5 C i4F i61 i83 i72 i16 *63 ] s)Z { O62 sr3 $6 $5 sb5 o4b O41 z4 sy' o25 z1 s/A s/o ^d ^o ^r O32 E *69 o83 o7v $, *79 i9Y*B7 sJW O06 z4 o1d *12 sdi l s}D*73 T3 TA T4 T5 ^o ^t ^c ^e y4 OA2 O72 o0f i3k $. $g $p $. $g $a Y2 $a s&R [ o5t ^t -7 usA& ki4bs+v $TsTVoAn ^K O14 u o0< sl] ,2 O61 O75 s7A *52 -5 z2 ] OA8 [Z1i7s Y5D6 -0*45RB *60 K c $2 $7 $8 $/^r z2 i4i l $e $r $y Y3z2,B .0 +2 O3A [ s?b O3B k sp7o6W +3 i3d o0M $2 O91 OA3 ^b*A7i2} *A8*21^y *82 i3l k *13 K *60 ^c o81 [ *56 sgo ,6 O03 { O56 o7D y5^- O02 TA O62 O07 D6 ,6 *07 $! i5G sbW o1G y2 Z2 Z4 r d $t $y c $7 $3 $2 o7a s\G Y5,9p4 -2 $i ^| OB9 O52 ^m D5 o1o i79 i95 i89 $w o0s RB O74 $$ i8C O2A $w y2 sKHs=" i8s iA2 i91 z2t i6s Y1 O73 i6i i81 i7e $4 sxm sr8 +4 ^c ^k o3k ] i5w i2v O62 p1 *1B *B2 ^" *51 .BsVN *94 O57 +8 *BA K ^t ^s ^e ^f z4 +1 slj ,3 T6 T9 T8 TA O71 O95 su3 sk8 sa0 o5k o79 O26 O12 o1c ^p .5 r i5c $^ Z2 O3A f T1} i0e *93 o1o O58 -9 ^f O35 o0l o1c i2c ] o4b E*61*3B sYE*37o8% o0f i4a *90 i1_ O81 *24 O72 i6P o0f i4k i0i ] *46y4sq< O04 y2 +2 oA/ +B i2H *31 O37 [ o4L O93 o94 T3 i2n i4r i3e saqiAPy3 p1 o0d o7m O04 $b $o y2 *03 $= *04 .5 ^, ,3 s1* i1u *52 ^J*A3 T8 R7 sgv o7` OA9 ,9 $^ $s o2X D9 O6B T2 T4 T8 T3 ] i4a $9 O31 z2*8Ay2 sHm D2 o2y $5 Y3 z5*58 ,4 i49 i9e $S $h Z2 O32 T5i9T*37 RB]sjf O12 iB? ] i4d t o6Z c iA_ o0q i2i i4s o3d o54 i7g OA3 i8i iAg i9n i9n iAe iB1 sjI .7 O82 oBp i5n i7s i6e '8 o5p T4 ^I o2u +3 o59 *34 O05 ^m ^o .2 o20 f O58 Z2 sMs *47 T3 o6u -7 iBHs6i O52 ^f ^4 O35 ^r O7B i1r *26 D8 i0$ ^l sc) stV *10 *32 t d OB2 ] -A D4 iBn $R *03 Z4 i2u T2 *58 s|@ *65 ^" p4 o9x T7 TC TB Y2 O09 o9d *56 OB6 O53 *47 f ] O04 O31 *29 z4 O65 *83 $k +8 O94 o6j OA1 E L5 u o3s ^a .6 *68 *40 R5TB i82 iA0 i90 iB9 z4 Z1 O76 i2- O61 $A D2 *B3s4< O63 sda y4 c^t s]FoBh *40 O34 u O31 Y5 [ O58 O71 i5JTB D5 O01 +4 +5 ^p { *43 ^a sjz ^k K o1D *59 Z4iB|s;E O58 *34 sj' s#! q O92 O73 s5L -0 i54 ^+ O29 l i7q O31 O31 o9C Z2 i4x o1o $* z3 o5h i0g z3 $p OA8 *A8 i87 O49 z2 O52 p5 r Z1 $= O16 p3 k O34 sP? $u OA7 ss= u ^v sjc { T1 i68 *48 ,3 O06 O0B ] O59 sra sjR } d o5- k s(u*2Asy# ^ ^p ^o ^t *59 '7 *05 o4u $+ Z2 i5s o76 z1 -2 -1 Z1 OA6 $> i5Q O0B TE TD iBC i2j o6o D4 O42 O42 $+ Z4 c *18 i4d i6n i5o *43 y1 *13 *49 -4 t s-g s2Z L1 DB ^W *31 o3d K $e +3 L2*50$E i4y *20 y4sKYK O92 $k s24 +1 o63 R7 *84*9B sh6y3R2 s9b p1 o4G { *32 O47 s3Q { s6c ^7 $E O68 O0B O95 o1sp1 ^_ *32 sfK D6 $^ O12 i5Ps_D Y2 O9B *07 c o5b o4o i2u ^j o10 o5A o2k o5r O0B *68 *43 $# s36 z3 ] $. $s $u o62 .3 o1n k y4 O87 O58 i63 i89 i76 skA*49-A oBE D0 c i10 i01 $k $i i8t.9 y2 oBb L5 $N O65 sPk t o3+ O41 Z4p5l i0s O62 } r { $gC*3B O67 o62 *05 D7 $5 oB2 k i4' $1 D6 *45 O31 i7V o0y o5h O97 sv+ *A7 i41 i59 i68 ssO oAp o6R -4 ,5 Z4 ^X *35 $6 y3 L3 s4c O64 o08 i7z^i o0s R3 s50 +6 ^N *23 *06 o4r O21 [ i55 Y1 o1G $T O16 o0i o3d swisvW i01 i12 i34 i23 p3 k ,8 c sd$ *70i74y2 $2 Z2 O23 Z1 o0s *34 O06 s&; R1 y3 t srR *91 O43 +5 $7 y3 s8d E i17 *15 y3 *16 O52 O72 o5h *21 ^6 *61 *48 K TB p2 o2h D5 i24 ] sNr O28 r Z2 O76 Y2*56o4t $w { Y2 $6 O75 ^N s16 'A o3e *40 z2 s2L d O03 -5 O32 y1 O2A d R5 O79 -4 Y1 C y4 q DB CstA] O43 $s O95 r *38 O91 O63 ] O74 s-= ,2 k *02 E o62 *31 O05 O12 i32 *45 ,2 O87 O03 iA2 o2y +0 o33 o47 i9d *18 s+G OAB u q y3 O67 o7+ s f i2v ^z } sa2oB;Y3 T3 TA T9 T6 *0Bz3$p $w*60s)> d^k *01 ] O51 O73 +8 O02 O43 *74 i3R O08 s bo1Ou f O48 sh/ q .B y5 -5 O01 p1 'A z1 D6 scm ^a ^l ^e ^b i5a y3 -3 o4u T2 T4 TC T6 o0t O87 ^D y1 O97 ^x z1 O2A *15 ^N O39 O85 iB! Z3 T8 RAR5D7 *3A O19 o0e ^B y3 z5 +3 Y4 $a D5 O98 sNv O03 D6 *60sxg*03 O34 '5 i2n *40 i23 -0 o6&L7,5 ] ^w *38 o0f *36sY< sae D0 s.o $d R0 uo6F s.e o0e ^s $n O84 O19 $h O43 ^1 sjp C o8X o1d $6 .1 z1 O56 -A -B $F OA1 y4 O2A $& p1 Y1 O31 D6 i8a C $N [ Z2 o7M +8 L7 K $1 -5 T8o5Ts0? O08 y5 T1 o5E i4y $1 i6s i89 o97 L9o6.^h ^d ^i ^o ^v sfF *70 i9i iA1 iB2 ${sWM z1 O67 z4 O5A O32 .B O13 D0 Y2 O31 ^R O3A O45 *71 s5n E *52 O02 D5 *10 $M $n .B OA3 ,2 o5c $4 O02 i4i .5 Z1 $0 O03 i4M O14 o2p D3 ^f sm_ O75 O08 ^b O42 d t k D5 *35 o0p *89 O08 ^( [ s.z sk4 sk, o0v o4o O51 z1 *23 OB7 O36 ^( ^q t *A9z2 *35 $} sc[ O8A O76 i3s y3 O69 d L3 -6 i11 i56 RBR2 Y3z5,2 i70 i35 i1b i7f i7c i36 $}$} i57 i7c i51 i17 $;$? $}$> *1B K O08 spi -4 } *52 -6 i16 i3b $)$. .0 *38 $($} $($` $($\ -4 z2 Z1 $+${ $^$[ sTf i11 K $]$. k Y3 O71 i7c i17 $]$^ $|$* $|$$ $|$& $<$~ $=$' i54 i37 i15 i5d $|$^ $+$> L3 -4 *A9 *A5 i58 i13 i58 i12 ^v O79 i5c i39 $<$[ $+$( [ ^p $1 o48 D1 $!$[ i50 +8 $<$( $7 +2 i3d i4l i61 *67 $9 o0a o1i i7c i12 O02 ^k $<$] $<$^ $ $= $<$& $\$& i34 i16 i13 i7b i13 i7c $<$- $\$~ +0 *56 i5b i30 y2 $. O73 i3f i17 $#$[ i14 i7f i39 i5d i18 i3f $-$\ O02 ^d $%$] i7b i31 $%$; i7c i39 i40 ^2 i33 i7f p2 O0B +4 oA0 K s4h.1sWX $f Z1 +4 $#$, i59 i7d i59 i7f i0- o7r $n $q i7c i14 i37 i1b $$$\ o9s 'A O7B R4 i8v } OAB $"$@ $"$^ i19 i3c $`$\ i21i39i46i51 $"$$ i16 i7b i16 i7f p3 O1A o5< O02 ^4 i77 i15 i6&sqM i15 i3a $n ^n i3d i15 T2 T8 TB TA oAVsSt*41 O0A ^S $[$" D6 i31 $~$> $~$< $~$. $~$] i36 i7b $}$- c $i $n $a i38 i5b i33 i16 $,$[ $,$\ O54 +3 i33 i5f $,$^ $g $7 O39 ^; *A0.4*08 K O59 O54 $>$~ $>$| $>$_ $>$@ i78 i13 $>$' $>$% 'A *87 $^${ o2m *57 sc2 OB2 } o42 *65^"t p4 o0@ D5 i12i20i31i45 i1f i36 i14 i78 i12 i79 i12 i74 i10 i7d k Y1 i0s i2k i3e i41 o2z i2t i7b i57 $^$> i59 i13 i50 i37 $'$, $'$# ${$' $2 o6e k ^k D2 ${$- ${$, ${$= i16 i5c ${$] ${$\ $[$+ i3f i55 $[$) i0n O13 K $[$> T2 TB T4 i59 i1c $[$_ $[${ $'$@ $'${ $.${ $'$~ i3f i13 $'$) *03 o27 $$$< DB oA* i19 i5c i70 i15 i59 i3f sQWs^WsHt $&$[ $&$] $;$= $;$< i7d i30 k o33 O62 .A O78 ^7 $7 -2 O69 O81 O4B O94 *A7 O09 l Z3 y2 i3b i18 i75 O8B ^g*45Y4 i35 i17 $z D2 u i9 $'$; ^q ] i36 i18 i36 i5d $|$( $|$- i59 i15 i1f i77 $V$0*B5 O59 Y5 *0A o0G Z1 $|*20o9z *68*71.6 Y2 o45 -5 i7PT8TB i55 i7e i33 i7c i55 i7b o01 ] i18 i5b i75 i37 O31 o2j i50 i7c $;$} ^w ^e ^n ^a i3a i16 Y1 O02 *43 ] y4 [ sqZ s.Osul o5Du*82 i2m +1 s03 T3 +9+E i15 i5c $!$| s.# i74 i39 $-$# $-$% $-$& Z2 oB5 $-$, -6 ^s $`$> $-$} $o $z Z4 OA7 sgj *2A O75 .0 i1z f { [ $`$| $^$~ o7i +8 i75 i14 i1t ,9 o66 *24 c $3 $8 $5 Z3 t OB4 sB's*C y1 *02 O51 O04 *74 o0k o6k sq8 *90sHwsvS $y O52 t i7b i30 $"$\ l $. $v $c i18 i79 $8 O14 $,$> sr3 sb5 $6 o4b $5 o0o y1 ^z O94 *7B $_$] $?$; $?$, $?$^ OA2 Z4 iD1 iE9 iF9 iG5 $?${ $?$} $;$$ i54 i1c lsaY i54 i15 O31 ^9 y1 *59.2 o2n[Y1 [s{8oAx s#o O51 i08 O68 o9= o41 y4 OB1 KoAY t i5X O23 o4l f +7 o4i *48 p3 O76 ,7 *04 f *95 *21 O43 $b L0 T2 f OA5 O65 O85 +5 O41 $6 o9` O01 p1 $y O03 *79$oz3 ^s ^m ^i ^s '4 ^S r $i $c $l $e -9 *0A O72 T0 T2 TC i3e i42 i50 r*BA D6 o4k O21 -7 O48 D4 Z2 *59 o7o *56 y1 $s $w sR@ i2m sa3 i5s i66 o8o .5 *45 o4z -5 iBy O17 ^o ^c ^r ^a ^m Y4 $1 i3i i4n i51 O35 O25 T1 T2 T4 T8 o5y O64 *0A O76 i69 .5 K i31 i59 i41 su#s[.*51 $$ i0* *73 'A Y2 o8e O61 sUx O41 OB9 O74 { o49 ] *84 i6c t +8 ,B[ss2 i8l i91 iA1 ^(*38 O8A D9 O42 i6. o31 *21 L0 } sb_ $i o81 $4 p4 o0l ] o1c i2c o4b o2j ^k i6d i8r i7e $;o9Y $k $1 s`W O65 st. *56i6G s95 O45 L1 i1o ssN O12 Z1 ^x ^j Z2 $4s<@$& O12 '5 *20 O23 O04 -7 *38 O32 *12 Y4 i1e i4a i5r $h $i ^N '5 o61 p3 sg4 ^s ^a ^r ^k ^o ^e ^z ^a ^m k o3o s7o ^z O72 sc`o4G o2j +3 *43 iBy O43 OB4 c $. $b $e [ Z1 +5 T7Z1*4A O13 i3_ o1a $a i6o o8k o5m s$8*06o4r l $. $l $k O21 $h ^p ^o ^t ^s *31 o0L E $^ Z2 l o5m *31o2y } +0 i31 o56 *78 *15uiAA o1L [ sLe O13 i41 i9_ O45 i46 *61 -3 'A o62 ,1 T0 T1 T9 TB -A^] srN D3 $1 o3o i3v Z1 O29 $y -7 O04 $B O62 O5B OA2 p4 c*4B^; ^A $5 t f O3B Z2 ^l i6g O12 $! O42 Z2 c $p $i $n $k T5 T9 TA i4M +0 o0z $c o2a *56 se0 $w D6 $s D4 ^w Z5 O26 qy3 $5 i42 Z1 o24 ,3 .5 *54 o4z '8 o5v y1 O52 Y2 o1e D4 o4c O17 -1 y3 r O41 -9*68Y5 oA0 DB q *53 i71 D1 c $b $o $l $d -B D4 ] o8)LB ^2 .3 sNm p2 OB3 o6F O05 ^n ^a ^l ^i ^m OA7 O06 R8 $L ^w O63 p1 ] ^c ^d ^r ^o ^c o41 *75 $l iBa O91 O07 i28 ,3 l $. $l $b i3r O42 O56 O47 O46 '7 p5 +5 o0y y5 OA3 $Do9_.A o0T o1B O6B R0 sHq*54Z3 O13 '9 i7o ,6 k +5 o62 t O72 D0 y4 O67 E DB*60 sbv D5 u $2 $0 $1 $3 O62 si4 o0S ] i14 i35 $9 ss6 $3 f O57 o5d o0T T3 *83^3D2 o1a o3t i5i i6a O1A t O73 y5 O41 D6 $2 shg Z2 o3a k o48 Z4 *78 O15 *3B*89 smq -0 ]*02i6w i9a iBd iAn t Y2 ,7 O05 O6B Z2 *34 *25 i3f shz O32 O6B .2 K k y2 -4 $z *54 O06 suz s,7 .3z2*4B O63 srw O51 k ^r sC> O8B R9 +1 .0 +3 .4 O3B oA& o41 $l *75 sh4 iA0 O25 o0? ^! *31o9+*28 -5 i2d d seg $0 z2 *09sz9 $+ o85 O12 +7 o8R *21 i3x o5m [ +5 k O45 R7 iA" ] i73 o34 o15 $y O64 $1 $! c O13 -4 K o6o E iA- O1B R5 *45 K ^s ^e ^d ^i o1U c $9 $7 o7a $2 sfLi9V iEt o3$ Z2 o0r q u k sy$ szo syI O59 $k D3 *17 Z2 D1 O4A s'p q O17 R1 o4q Y4 OA9 +8 OB4 $z O21 D4 i7s [ o1j Cp4 T0 T2 T8 TA z4 D4 O24 se2 o59 $4 sc0 o3f i2n i4i i3d o7s *41 [ o1z o7a .5 Z5o5e [ o1x s5l k sfp O71 uo4ss') o2e i38 i5e i6a oAg i6us@*Y2 o54 ] D5 $9 $4 D2 i3b ^r ^g sd8i7O z1 D4 shQ i23 ,6 *23 o1f $! Z2 O42 .2 D8 Z3 o4a *02 T6 o8/ iA& O34 O06 -B s5; Z2 r *46 *28 c D4 $@ ^d K o3s s,9 ^a Y3 ^t O69 sgc i4u ] *32 i68 D3 i68 D9 O73 p2 o3i y2 +3 { o06 O61 -2 ,3 y1 O17 ^q ,7 D5 uKo2R OA4 Z4 ] O62 .2 ,1 Kui1K Z3 o9r o6i i6v ^Y p5 { i0m o3v ] Z2 O42 O3B T2 sCSs#* *A2 O76 k -2 -3 OB1 syl *25 *60 R8^wZ1 s=hz4 y2,AZ5 i3i i5e i4n K r i51 *08 Z1 szEsSL stq i6q*03 .5 *21 O42 i48 i8Qz5 ,1 -0 r ] { O91 o99 $p { sdo t $1 y3 c $. $i $n *94 O64 '7 sEU O14 *23 ] skP*46u O03 y4 *56 o6f 'A *91sl0 O58 *39 sr5 +2 i2r o5g *12 o1h $3 i4p ] *48,6o34 s>hD8k z5 *91 O46 o68 .5 K o4t u +0 i4a O45 T0 $5 i8 o5s o44 O12 c i4m O6B O52 $a $r o49 *02 o3g E *54 O58 y5 r s0 K *9Bo3+ z3o5u O8B sec *B0 y1 O61 O84 O1A q T8 OBA OA7 ^w OB4 T7 ] O91 ] T1 TA T9 s0& i3& [ s?j O69 $x sg&^# OB4 O82 *BA o2k*A6o4j R8 o7x O02 o5g t o33 i6a o3i o1Y $p R3 .4 E o51 T0 R6 s/r i4# O64 o0o *02 *A4 t i66 ] *63 u o76 O02 o5z u o78 s73y5 r $w $i $s $e ^B i1b D2 o1t o94 O45 O0A z4 i3s y3 .8 O14 i2z '7 s.z l O51 o5* .4 *40 q i0v^[ sk' O53 R4 $5 O83 s$s { s?S *78 $9 $7 $1 t s<+ O23 i2x '8 *60 O56 i2i D5 s?!o0U*56 K y3 O7B z2 ^a $c y2 o2j i45 -1 k K *54 O45 i5$ C sK# O23 o2h *03 y4 Z3 O58 ^a ^m ^a ^b ^o y3 *62 sGx *13 R1 o6\y1 $z *50 O43 T3 TA T4 T8 o50 d $i O41 sDN O2B oBt O42 ] ^b y1 OB8 ^u D6 z3 p4 ^^ y2 *98 O36 ^U ,1oB$K ^e ^z ,4 i2i ^p ^m ^e ^h o68 } { O62 Y1 O73 *56 D6 z2 E o6t ] p3 O0B iBx iBz ^n *32 i4i i6o i5t d f o1o *05 o7< ss9 TD TB scr so3 .5 $7 o3s $5 K *64+3TA *4B O93 *06 o39 O24 $u O52 sko i1a i3a i2d C i18 O16 ] O23 Y1 y3 Z5 O45 o89 O02 *97 r o3h K O56 o53 $2 O23 Z2 y2 -2 u o2R K D8 *67 *81 .5 .3 o2z *68 Y2 sPU snt r s41 *89 R2 *76 ^9 *14 i7h *25 Y1 DB o3o [ *49 K o08 Y2 *53 O41 s@W i4t i6r i5e T3 TD TB *18 O54 ^l O65 ] Y5 *48 se& O91 ^y T1 so0 Y4 O29 *73 scu *37 Y1 s*A o3n i2k $p O76 -8 *07 K *04 sik p5 sNhi7Bz3 D9 ,6 O63 Z5 { i2x O53 o5u sc9 i9! oAi o8e y4 *71 s7e K oAZ*51 o5q$e sw1 sw5 s!P ] ^9 O45 i5- '8 y2^9{ i34 Y4 o4o $8 s5X O12 O34 D5 s<_ p3 Y2 O4A s/P *16 y2 .9 O72 szp Y5 O42 sQH y3 O67 Y5 +6 i1o i3a i2n o8/ .0 R6 ^b K i7u O6B -5 O39 y4 O24 z5 T1 T9 T3 T6 R6 o5h i6_ 'B c ] spc O45 Y2 [ ] R7 $. $a $d D5 s7n T6i3R i2r O43 skg ] l d $5 i41 i66 $2 O57 y3 $6 *87 $4 E sn9 $4 *AB o9z OB1 O15 Z4 Y2 p2 O41 D6 [ Y5 u i5X sKO O51 i5t i7r i6a DA iA6 sAQ O23 p3 'A o5d o0s o1V sWS t shi LA $3 i34 o5T c sSY +0 ] *75 k O02 D8 u ,1 sKM i59 i77 i68 -1 ^l s+n i5l i7n i6i +B *45 t sgl -B iA3 O49 R6 O63 i98 .8 iA3 $g O65 O73 o2K i4e i6a i5l s5+ O05 Z2 R3 i4, $2 ssg ,4 O95 t srp o4d *41$kL7 *74 O56 $? o6i +3 O38 O26 i0] o5?oAH i5* ,6 sX1sAi O49 R5 i3v O01 { st5 q y2 t *75 *B7 O64 sm^ $1 t O62 $1 ^; .AR5 i0e sn_ T6 i0@ rD4*45 RB^` c ^7 $/ OB7 ^( O36 O8A R9 l i6% +9 c $` $4 O06 O45 y3 c $h $o $p $e c ^- $9 +0 r c $` $6 c ^- $8 ^7 o1c i41 i58 o6c c $` $0 o7b ^m O34 ^s ^e ^m ^a ^j $^ ^0 c $` $2 $1 ^| c ^7 $# i8s^^ ^w i0c *37 $4 O43 *56 Ku*93 ^p O5B y2 '6 ^l D1 c ^7 $$ o8d o7o i4i i5o i61 $8 ^^ c $9 $; *34 } *71 $9 ^[ Y5 O02 $~ ^1 c ^8 $$ O84 O34 c ^8 $# $~ ^7 p2 O64 u c ^8 $. o58 -4 c ^8 $- $#*50 c ^8 $( ^r ^e ^u ^a ^b {i9UL1 d O32 Z1 $6 O26 OB4 s.{ y4Y5 { Z1 *31 O32 d '6 $8 ^[ $@ ^6 i1a y3 *57 O25 '8 f ] *25 $8 ^~ c ^/ ^6 $8 ^` $8 ^; ^` O1A $8 ^? T0 .6 ^7 $2 $2 $0 $1 $2 $$ O42 i53 $8 ^4 .5 i5e $8 ^( $8 ^/ i3r [ i4i O65 $8 ^, s`R ^P^Js.) $8 ^% o5c D3 *27 ^u $f o4o $y *7A T4 *7A T2 L8$-z2 ^a ^v ^i ^s $? ^4 $? ^. ] K Z2 i31 -6 i5a i7e i6t sgk i6u p5 *27 i2i *53 oAh*89L4 i6e O21 ]o6?^I i3d '8 s!q O14 s&9sG. i4a O71 k O27 i4p s3^i22L8 $) ^9 y2 r ^t c ^( $0 c ^( $8 c ^( $9 ^^ ^2 +5 ,3 $P R1 ^a c $9 $, s4n o6g *56 s08 ^s o10 c ^3 $_ $4 ^{ i4k i51 i62 -5 o0r Z4 O26 c $+ ^5 c $+ ^4 i51 ,6 *60 $4 ^_ c $+ ^3 { O46 c $0 ^. i7e i82 i91 ^@ ^9 sjP O79 +AiA$ O36 ^2 ^@ ^0 ^@ ^5 ^@ ^6 o5n D3 $4 ^% $4 ^# i3- snq D8 $e ^p ] i0j c ^ $2 $4 ^+ -4 O71 $8 ^, ^7 c $< $5 c ^2 $= c $~ ^~ *63s $7 ^= z1 ^| o52 -4 *56 $7 ^{ $7 ^| LA sC{ O13 o8x K O54 y5 o5v o0Z c ^e ^r ^o ^s sb5 u i1i -0 ^a ^v ^a ^j +8 $8 O36 *A4 s6t $% ^2 $7 ^^ s6y $= ^4 $= ^5 Y1 -B c ^! ^4 $[ ^1 o58 k $3 ^` c ^% $8 o4s $1 +3 D2 ^2 ^% ^2 ^$ i9wsA7 ^e ^t ^i ^l ^e ] o3h ^2 ^, [.7,9 $y $1 O64 *6Ao9X c ^0 $. ^8 ^) o44 ] uY1} c ^0 $% *56} O0B -B c ^0 $_ *B6*62i3! sljz1$n L4L1 $` ^9 Z1 se7 $=*B9*04 *15 O6A sC" s.d O87 i5AT7s9d O8A q $3 ^) ^2 ^_ $3 ^% o6z u c ^0 $@ +A$6 c $` $8 ^2 ^` c $ $# O53 'A *1A Z3 O9B ^n ^e ^i ^l ^a O4B Z1 sUE i32 i3k o2r c ^8 $0 ^k ^u i0f O12 *31 c $( $7 D8 f c $( $2 o4x '8 i5O l Y3 K .1 *47 ^y ^t ^s ^i ^m $s $c O13 .8o0-D3 c ^5 $* i34 *61 c ^5 $$ *52*7A o4K '6 { k *16 o1e O31 *52 .2 i6"d oBu$) *B4o8B *86sx8 D5 *43 $9 RBi8$ o9{z1RB c ^* $3 iBWsvMY2 p3 +7 o1o o4r R5 *42 ^e ^l ^c ^n ^u *03 ,3 *67 c $5 $^ c $, $4 c ^5 $@ K O76 O84 i25 -3 o2& *97sC* o4i +4 Z1 $s $f z3i87i1O o8u ] i0b O13 -4 c ^ ^7 c $, $. c ^7 ^* L5 O73 o53 o33 y1 ^q T1 o2w ^1 ^[ Z1 t r ^6 ^# $% ^@ Z5,9 ^6 ^) ^6 ^, o2e k [ ^1 ^" ,2 .A c $& $0 s1e oAd c $& $5 $ O13 $7 $- ^1 ^( i2R*4A -5q ^w ^h ^1 ^, i8k } O32 Y3 Y3 +2 c $; $2 c $; $5 $e Y3 O24 c $; $7 c $; $8 *57sahs#v } D2 Y2 ^w ^s s?= i19 ,2 c ^$ $6 O12 y4 ^Q*48 O12 y2 $9 ^& T0 TD T9 T3 ^v D6 c $` $5 $9 ^> c $` $7 ksw4Z2 c $` $3 ^) O03 se. $9 ^7 c $` $9 $9 ^2 $p Z1 O62 i75 [ o27 *23 o0t i5l .6 +4 O0B ^S y2 o0h $9 ^~ *5A p4 sjYsw=r c $~ ^4 ui8k^' $7 p2 c $2 $( c $2 $) T0 R3 *27 O4B c $2 $" c $2 $> *91rZ2 r Y1 *47 O71 o5u c ^. $7 y4y5 sb4 -9 O03 sqh -A s3. u *5A*A8E oAq K O08 z4 z3 o21 s+_$e$x -5 *14 c $< $9 -7 ^e +6 *65 c $2 $| c ^. $9 c ^/ $/ p2 i4' ^[ ^5 o0A o1e ^8 ^! ^8 ^# ^8 ^& c ^% $5 ^8 ^+ y4 O32 ] DA $1 ^8 ^. ^8 ^; ^8 ^> sqZ$; c $4 $) c $9 ^^ ^; ^1 ^; ^4 ^; ^9 $1 $q ^* ^7 ^* ^3 k r Y4 [ i1[ ^* ^0 sA` k D2 +6 ^5 ^. E z5 O34 ^5 ^* R4sW@ ^5 ^) o3z -2 O31 p2 ^5 ^% c ^/ ^1 *42 k ^3 p2^p{ Y3Z5 i39 O12 $6 q sud OA3 o0i Z2 c $4 $~ ^2 OA9 ^? ^3 o5n *45 ] ^e ^r ^o ^b O06 ^w Y3 O14 ^2 ^5 p1i8i O43 y3 +4 OA4 OA3 o3(.A ^4 ^= i75 *16 c T5 ss$ c ^_ ^9 s,Y OA3 o3o o2c o52 *53 o30 O65 Ks^U +1 p4 OA3 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 OA2 -8 O03 OB2 z3 o2b L8 [ Y4o4TL8 ^} ^1 D9 o9e c ^@ ^5 i0usg& O65 *7A *45Y4 c $~ $6 c $~ $7 $+ ^5 $+ ^3 ^9 o70 $+ ^8 } i46 ^& ^3 O94 O47 ^& ^0 ^& ^7 O16 Y1 *0As@y o2b L5 qi4h c ^9 ^. c ^9 ^, c ^9 ^* } i40 c $/ ^4 ^R O13 c ^9 ^# c ^9 ^! c $3 $] o0l i2e i4- i5a O26 $. *43 Z4p1 o0@ O24 +4 Z2 s$[L4*89 o7Z c c $3 $; c $3 $= ^% ^8 ^% ^4 iA2 *98 ^% ^2 ^% ^3 ^% ^0 i35 { [ ^! ^2 ^! ^3 +4 s92 c ^= ^1 c ^= ^7 c ^= ^8 c $1 ^> ,3 p1 c ^1 ^= O21 o0T szf*71sW{ T2 TD TA c ^1 ^+ .1 y4 *06 *1A O47 c ^1 ^~ c ^1 ^` o15 -0 ^o ^r ^u ^a ^m c ^6 ^* c $^ $9 *24 o4k y1 ^x O97 ^~ ^1 $] ^1 c ^2 ^$ O18 *40 kK*82 c ^2 ^- c ^6 ^~ ^3 d O97 Y2 O6B o0p *45 ^0 ^) i33 -2 R2 O86 *90 ^0 ^* O21 i5^ ^0 ^. ^0 ^# ^0 ^$ i9V*6B*3B ^0 ^= ^0 ^> $6 ^_ ^3 ^) ^3 ^* *90 *05 ^3 ^, ^3 ^- y4 O26 o69 i42 O91 O02 y4 E $=*B6[ ^3 ^$ C -4 O83 $& d ] ^3 ^= c $+ ^9 y3*13svw o0j ss1 i9t iAc iBh spydt s0x k o4, i44 Y1 sb8 scGTA $/ ^3 c ^3 $$ sj2 ^3 ^^ so^,BsTA ] o8y r R4 } c $9 $[ s,% } z4 OA5 c ^0 $2 O23 z2 Y2 c ^< $2 c ^< $3 O21 i1d *07*B2t c ^( $3 o8u D4 $` ^2 *60 O53 K o1v c $] $1 s<| ] *64 $a c $4 $= O48 f T0 T4 T8 T2 K O61 *54 O12 $h i5m O03 i5*s[. o97 T0 o3. O4B r *07s&Z $} ^0 sdi *32 ^4 ^& c ^3 ^@ ^4 ^/ p5 $f D6 c $4 $` ^4 ^< Y4 *68 O42 i0M o1a ^b $! Z1 *24 r d i81 ^i o57 O12 $5 $ D1 K f ] ^v ^k sjo*0B R6 o1y ^e ^c ^a ^r ^t $uL7 ^w O51 snX sY2Z2s0G ^% K *01 i8x D9 *32 O02 ^T sm4 D2 O18 sP? z3 OB5 iBi O6B O58 { R0 z1 .1 o4p suJ-0*52 $Ai9gz4 o1+ t o4k D7 sjz K ^k K o13 O28 l ^7 ^` c $? $4 ^o ^s ^e ^p {R0 c $1 ^} $3 R2 i4e i2W o17 *14 sc- OA3 ^7 ^$ L0sQ< o4k o3o [ o2- o0z o0c sea ^7 ^- ^T t ^a O13 c '7 T1z4 ^h O23 i32 p3 c $% $2 p1iBB o5q,1 Z5 k O79 c $% $4 u O64 y2 O35 y5 o1p ,2 c $6 ^% c $6 ^. p2 o2. c ^` $4 L4 r c $5 ^$ c $5 ^! i2H c *93 y1 O03 *25 O75 .2 o4c *B1ssVz1 s3muz4 f O19 c $5 ^= [ Z1 R2 O36 ^_ K o4c .1 c ^# ^2 c ^# ^9 c ^$ ^0 O28 sE3 O38 c ^$ ^2 i4y .2 c ^$ ^4 c ^$ ^5 c saw c ^$ ^9 c ^$ ^# c $$ ^9 i9e iAr iB7 i7<*1A sa>o9Z c $$ ^1 c $$ ^6 c $5 ^_ $J ^S K Z4 *15 y5'7T4 i27 +3 *61*59} L1 i3e Y2 K O52 $6 ^~ o2t o3u l $. $p $w Z5 O72 Z2 c $/ $5 $HT6 Z1 O16 D5 *82o2\*71 c ^9 $* T4 TB T8 T9 O34 *01 *62 l $. $p $a *25 $r OB4 Y3 ^r ^e ^g ^o ^r ^k -3 Z2 O1A $s s ^7 $> ^8 c $2 ^+ ^c R4 c $/ $8 ] o1u ^o ^e ^l O53 $q *24 OA3 .5 c ^% ^7 ^6 ^@ *B2sam} c ^& ^2 sy%i1LDB *34 O04 Y1 o2r *21 i3Js8"t c ^9 $? c $6 $; L5 -2 c $6 $= c $6 $# ^s ^n ^e ^w ^o o77s6$o4- c $6 $( c $6 $) sn6 c $6 $, i3b '8 c ${ $1 z3 i28 s8sq u i9U O86 z3 i26 t*84^M Z1 O03 $0 T0 *90 O03 s14 OB8 sMT c $? ^0 +5 d siU ,7 l $W*58 ^[oA@ ,6 Z1 [ *3B[z4 o1zZ1y4 [ q z4 z3 *65 $EY3L7 c ^1 $( r $i $o $u $s [ *78 O4B s9)^kz1 .8 O13 ,2 *A4i65 .8i7hs"5 ^2 *40 o0>*A7 i1a i2b i3b *70*A3sok svJ c $7 $, sg=*79*60 *79 *A9 p5^O O43 i44 o6e o0t O27 '8 c $0 ^& o5bD2.7 c ^ $5 c ^ $4 R9i7` ^9 C O85 O5B sAe ]y5.4 *50*2B y2 +7 *56 *73sf4T4 D9 *61 $s $d d svt c $7 ^~ ^` ^1 O86 $h c $[ $2 $[syF c $7 ^& K o1a O03 i4q i4h OB8 ,8 c ^% ^2 Z2y5 O09 D6 c $7 ^0 O51 *02 o37 sGOs07 o8w*87 ^ws!B^D Y2 u $B y2 o8v O35 i99 iA8 iB5 O15 Y3 q Y1 [ o2k *79s9} O9B O36 i4t o5h +7 +8 K [ sj6 ^t i02 $# ^9 Y2 O43 } c $2 D4 c $) $6 D1i7_scA c $) $3 -9 .A [ sK" o15 .2 $7 si0 $2 O14 z1 z5 {o3m O39 i4# c ^0 ^! +6 p1 'A o2O u O9B 'A u sVX snRo6$ sj!s&6 sHCskS oBTC,2 O5B [ -8 L0 o5c z2 .4 .2 c $. $- O96 *06 O7A z1 O78 *25 ^6 ^! c $8 $< O2A O51 T0 T3 TB T6 c $8 $; $, ^7 $, ^6 $, ^5 $, ^3 $, ^2 ^%*80{ O23 $0 i5N *56 *A0 OB8 ^9 ^. ^Ds|,*41 $( ^3 $( ^6 c ^( ^1 $ ^2 ,A O2B i9= $ ^0 $. $e $t $ ^6 c ^. ^0 c ^% ^5 c $' $1 ^6 ^_ ^e ^y ^k ^s T4sHE*63 sau *57 i2rY2sj6 c $ ^7 ^1 ^% $6 ^` Y2 R6 ^Z u y2 o61 ^I ^L t $6 ^? $6 ^0 $6 ^2 $6 ^5 $6 ^7 c o86 $6 ^( $6 ^+ $0 [ $6 ^/ *86s@3 $6 ^! C$[ i4s O02 c ^, ^7 +0 s{8 O08 $$ ^! $$ ^( $$ ^3 u Z4 *27 i71 i72 i83 c $= $& c $5 $~ O21 sj\ saM O51 o0r [ Z2 k R7 ^4 o0k s7c iAP c $= $6 c $= $4 c $> $9 $5 ^; $5 ^< $5 ^= ss2 t O0B C z2 +5 *31 *24 O4A O72 OA7 i0Q ^]} ^8 u $5 ^/ ] *28 z1 o7n $5 ^& { k Z3 c $7 $= O82 o60 s9ji3jz2 $< ^$ ] i59 $p u -5 O42 $1 c $7 $) o3s *45 },A*09 *84 O34 o6n o2f +0 c $7 $] *A9 O17 OB5 d $# ^7 $# ^4 $# ^2 }oABy2 $# ^0 k ^f O32 o2a O71 O01 s[S i7W ^! C i2f .1 s&ys_9sRr $2 ^~ c $5 $( srp ,1 O47 $9 ^/ R3 i2e $9 ^( i34 -0 q*73 $z E O63 Z5 OA6 iBdi4O dsW<^v *3A T1 $2 ^% ^b ^a ^c *46 O61 .A OA8 } *B1 E o2y $2 ^, O92 sW{ *37 y5 o5b O42 o2d *02 -2 *07 *06 p4 o10 D6 o4z ,3 *43 o6P E O93 r K D5 y1 oAb { O52 O7B *50 k K *13 C $0 $8 $9 $w O43 *79c i9i O2A T4 ^t ^u ^p C $2 $1 $0 c $4 $8 $5 O56 O1A c $7 $8 $0 d O26 O02 ^=oB_,9 ^j O09 s!wi9JoAo ,7 *B9 s"^ ,B O04 y1y5s)s o20 p2 O03 *93 d ^M r $f $o $r $m ^D *85 q O84 *70 $; OA5 sg. *B8 C $0 $5 $9 C $7 $9 $3 O87 k sRy*6BL0 O29 } c $3 $8 $6 u $4 $8 $6 K *40 c i4g i5e i6r iBL.9L4 i47 *30 sIP i3m L0 ^u D3 O62 s.* K C $3 $6 $9 q p1 O7A $d o0f z3*AB C TA D8 z1 O15 K i62 O4B s!k ] O91 ,1 so1 i28 i58 o63 D4 z1 T7 p2 O36 z4 oDa R9seK O71 $. ^2 O13 Z1 +0 *35 O02 $0 C $6 $2 $7 c $0 $3 $7 D4 OA7 K ^a O25 C $6 $4 $3 O71 Y5 l*A3^p o49 i53 o02 o11 C $2 $3 $6 O61 sjx D4 oAl O72 *53 o5z c $5 $1 $7 T1 TA T8 T7 sh. O93 r Y4 o63 o0p *20 o4! p3 O39 *2A snk i1b o3$ [ p2 so$ o0p *21 *31 ,5 C $6 $1 $9 O31 D1 Y2 C $9 $2 $8 t O12 Z5 sY} O56 R6 c $6 $2 $8 c $7 $8 $1 c $7 $6 $2 O71 ,4 ^s T2 T6 TA T5 c $5 $7 $1 [ o74 *26 *46 c $3 $5 $4 C $3 $4 $0 *65 oBr C $7 $4 $6 C $3 $4 $5 C $6 $3 $8 TBZ4 o2v OA2 *31 R0 p3 i32 [ Y3 O48 sH!csMg $1 *28 $9 *16 sTk { O46 O02 O36 OA3 d $s O6A u p2 O63 y5 Z3 O91 o6f o8t O31 ^n O06 skl c $4 $6 $1 C $9 $4 $2 u $5 $0 $4 *23 o4a ^b ^a ^g u ^V -1 o8x ,9 C $8 $1 $2 K o3g -0 ^m K o3r D4 *42 *32 i4y .5 s!o O72 T9 skLi2u o7g*97.6 Y3 O41 i0s u $9 $1 $6 p3 -5 $4 O32 c $0 $5 $6 Y2 o62 o0e *10 T6 $z $^ +0 sdk r { r C o0O O45 -5 +6 som O26 p4 -6 o36 C $5 $0 $1 D2 $7 c $0 $8 $1 ss" O85 y3 f *96 O34 szX O73 *A1 } ^' .2 ,3 o2k scb Y3 i0- p4 T0 O62 o13 o0O i3B K *8A O26 Y2 O02 -3 iBN O21 p3 K } *45 sZc Y2 O02 -0 *26 O5B q *21 C $6 $1 $3 C $6 $0 $1 O02 o2z s^' O1A iA& O24 O59 c $5 $7 $9 f T8 O08 $? O03 c y2 C $5 $6 $2 +AR4 sWs-7 O73 { u $4 $7 $3 C $7 $4 $1 p2 O5B C $8 $7 $2 C $0 $9 $5 C $1 $3 $5 C $1 $0 $9 s*T ^T o6@ ^m O86 *8A C i9Y E O92 o6b O3B o4H u $9 $4 $0 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 'B Z1 r .3 D2 ^]sq8slL $c Z5 C $4 $2 $0 k [ sau o31 } ^a ^v ^e ^n C $1 $3 $0 *83 p4 O13 c $7 $1 $6 d O5A swU i33 $0 C $1 $4 $5 y3 E O62 C $2 $5 $1 $* O52 -3 i33 $6 o0j D4 $f O54 T5 c $8 $3 $5 c $6 $4 $7 r i20 -0 C $0 $1 $2 C $0 $1 $3 c $4 $2 $8 sP@[y2 c $8 $0 $6 c $3 $4 $9 c $6 $4 $1 O96 k p5 ^o O21 ^S OA4 O57 O19 t R2 i3a iAs lo8`*0B ^rz3 O5A *B6 ^o O24 s58 +3 OA2 i8x *42 c $6 $4 $2 L7Y2*5A $1 r ^3 C $7 $4 $5 i10 ^H C $2 $3 $4 sDUR1 C $7 $5 $9 O4A Y5 O12 ^l o32 s59 o1A k o1D u L6 o0t c $0 $6 $9 o3g +7 *06TAZ4 y4 O25 $u Y3 $F i3i i4a i5d o8i Z5 Y1 u R9 *49 i3koAgC Z1 *B8 *80 *A0 *16 *62 O96 -6 sgq +7 Z1 *28 st/ T0 T6 TC TD }*2B C $9 $1 $6 *A4Y2i7l c $6 $7 $9 sbo O03 o60 Y2 o4| [ O7B K c $7 $2 $0 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 i1e L2 L0 i1e L2 L3 Z2 O21 O61 i58 L5 R8 i76 L1 L4 i12 R5 R4 OB1 $m OA1 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 i3f R4 R7 i56 L2 L8 i3f R4 R1 i51 L3 L6 i56 L6 L7 i36 R1 R5 i1d R9 R1 i30 R2 i33 R4 R5 i33 R4 R2 i3a L7 R2 { ^f i17 R5 R3 i13 R3 R4 k i2 s4; i11 L2 L6 i74 R5 L7 i3f L6 L1 i11 L2 L1 ^a ^l ^o i76 R3 R4 i58 R9 L1 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 O8B 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 *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 i75 R0 L6 i5e L7 R2 i54 L3 L6 i3f L2 L0 i3f L2 L4 i3f L2 L7 i74 R6 R5 i18 L4 i18 L5 i72 p3 O83 i32 L5 L3 i32 R2 L4 i5a L0 L2 O83 $2 i71 R1 L5 i38 R4 R6 o0H +5 i54 L7 L5 i19 R7 L5 i54 L7 L8 i3f L1 L5 i3f L1 L7 l D3 O16 i38 L9 L8 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 i3a R5 R6 i39 R5 R0 i7a L4 i53 L3 R2 i5b L2 R5 sL O16 O53 o5d y3 [ z4 $f y1 .4 *34 *51 OA6 c r { -1 i6d i7r i8e *13 i2v o6x .7 } Z4 p3 ,A *01 i7l i8o i9l k ^e i52 ^4 i53 OA6 p4 D3 ^B o1l z1 *47 sr,D3*2A Y5 O74 s5]f sxg O76 slp -6 .0 iB_ O26 s5)o3! } y3 *78 o0c *15 z1 f O7B *81 O49 Y4 *78 ^x o2_ O32 i5q T0 o44 y5 k ,5 i5b *26 $e ^k .2 y4 o6o O81 o5e Y3 i0s *63 $s *34 y3 i68 +4 .6 Z4 *97 D6 o8a ^b O24 $n *32 E -B i7B i4@ i4y $9 $7 $1 i6s o60 +8 y4 *76 szC.2$R d p1 ^r f *A6 O8B -2 *42 y4 +9 *57 ,3 p5 Y1 ,6 *68 O25 } i6n z5 R8 d ^U ^7 +4 i1_ r ^' r *12 -7 .4 *25 Y5 oAh ] k i82 C q O12 l $. $b $i O92 o3w o8e ^* o63 [ .6 *96 o7e C *24 -0 Y3 D9 san d *4B -7 *BA -7 $p $_ O14 i0n R5 i9t i5_ t i7a i9d i8n o0p $' +6 ,4 o0h shk o0r y1 O03 y4 '8sWh o3W d T3 $2 -2 +2 y3 o3m Z2 l D4 -2 { o8Y i6U } [ $D ,7 O89 -6 q p2 OBA $= $f $. $z $a y4 OA5 D8 K o4q Z5 Y1 $q O61 k D9 i6= Z2 s0H Y3 *50 ,2 i3y $o Y5 ,6 -7 o0w o5l [ K f O24 p4 $6 ${ $F z2 O28 i2g D1 ,4 o15 i49 o3s o6r *65 ,8 T5 +2 s4x Y2 O23 $/ R5 Z3 ^4 *04 ] o3X ^p *40 O73 O78 $3 *24 Y3 -0 *6B O93 Y3 *81 Z3 o7c o0w o4s o3G sr9 *97 +4 slw p1 p5 o5T K ^# p3 O81 i70 O47 Y3 OA4 O52 i7W $1 .4 O15 O69 o6a Y2 $b O5B { i8e i9r iA3 D4 o06 *06 -7 T1 O73 syr K ^| i7e $T O93 z1 -A E R1 ^J O12 ^u $. y5 +7 p2 o6y *64 p1 *8B o5s Z3 [ *01 O23 Y4 o9a i9s $0 O52 T2 $& L7 o5_ p3 i2p *51 ,3 +6 Y4 $y *38 $A $H D1 $n ^j i8w Z2 [ p5 o5u O07 Y3 Y2 $/ p3 +5 Y2 y1 O43 $_ D8 $. O51 *52 Z5 Y2 D5 *43 O38 y3 $d $y p1 i5/ Y2 $S f O84 OB9 O32 p1 T6 O19 *08 *43 O03 O03 z2 $1 *42 O46 $r O4A O04 Y5 *04 o4o D7 ^c *67 Z3 .6 o4g .2 s52 *15 O57 D5 Z1 o82 ,9 ^F 'A y5 +7 Z2 y4 y4 -4 iBg*71D2 *27 Y3 ^c *47 o58 +4 *01 TA iB! $J O84 p3 Y2 +5 ^! -7 $7 OB1 y4 $D *25 O42 O01 K d o0_ $_ i61 o70 .1 i3w +0 Y1 s16 *07 i4_ i6f $R ,3 *69 O51 i60 *B4 O64 se" ] y2 T7 *12 i8l z1 ^- .4 y4 .2 *20 R6 o5k O15 ] d OB5 -9 Y2 i6o [ O06 $2 sS3 l s32 y1 +9 *80 O21 ^8 i1c O23 *64 Y4 y3 y5 ^h i0@ O42 [ -2 y5 .B oA3 o0g R1 *34 y5 l $m $e $n $t p1 ^d *78 O24 Y1 ^a *A2 Y1 +5 *64 *54 i8D O81 o4d sws *78 Y1 O24 i3T E T2 T3 TD TB *83 i6Q O57 *45 i7m y2 *05 k i1c srA K s6d { Y4 snw *18+4i0t Y5 y3 'A *42 D3 L6sSe +8 sfg $u i54 i0.sR@ ^E ,2 R0 { i8w [ Z2 E Z4 Y4 z3 z1 .4 syh ^p ^X -7 i7O ,5 ^9 *21 Y2 Y4 O14 ^J i7d $4 E i7W y3 o3t [ O45 O51 $a -7 o7d O81 p2 ^, Z3 srb ^, $1 iBD Z2 -B E iAx 'A R4 +5 $> Y2 } *01 ,4 i4J o5M *46 o4s Y3 Y1 ,1 p1 $% Z2 *07 ] OA2 Y3 L0 u i5w Y1 o0k *31 OAB c o84 *35 o41 -0 O63 ^' c OA9 Y5 scn ] Y2 +B o5p T4 +9 *37 O41 o40 $y $h o3g K Y4 ,3 [ i5O $o $u ^m OA2 ss( s,/ p5 [ .3 *05 i1f O85 .2 T2 T4 TB T6 K i9. o7f -6 y3 o8r ^[ *56 +7 y5 o4" s"f 'A ^, t iA_ o11 O42 -2 D4 y5 O49 $q k l .5 *31 .3 i5b sex Y4 $8 ^B ^J $z i6b *96 O17 f $0 o1a O01 *A7 O84 i1. E $I d O39 ^s o44 *10 o42 y4 O63 Z5 .A Y2 D9 Z2 i6= *50-A$b o0n *24 ,2 o4. p3 .5 D4 *26 y2 ^a $h l T1 { .2 { .1 i7- *37 K O79 y4 *41 Y4 i00 K ^j ^A *75 O02 ] T0 ] o0R -9 ,2 i72 i6r i72 K ] Z1 D6 *54 o5m Z1 ,8 -8 i62 *12 i2d ^2 d O68 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 O12 i8;s|? c $n $e $t $'sgE L9sIb o2S E D2 DF O4A k *62 i1l i2o i3v q OA3 ^p z3 i7f i8e i9b i02 i35 i10 i20 O08 -4 spi O17 O45 DB DF D8 DG c ^n i82 i90 iB0 iA1 $k O52 i11 i29 i41 i36 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 i42 i50 i72 i63 i22 i42 i30 i53 i21 i49 i39 i57 D2 DA i31 i59 i49 i66 i31 i59 i49 i65 i12 i33 i20 i40 i01 i19 i35 i29 D4 DA D4 DE i4v '9 D4 DI O42 .9 *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 o1E E d 'F $0 ^7 *43 L3Z2.3 $6 O82 d 'H $3 d 'H $4 y3y4sTa d '4 $7 O0B O87 p3 y2 s6n $" i7! sO* i31 i58 i49 i69 i31 i58 i49 i63 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 O24 sw* s(_ i12 i31 i20 i49 i42 i60 i50 i78 i12 i31 i20 i42 i12 i31 i20 i44 i42 i50 i76 i60 O46 O4A $r i12 i20 i44 i31 d 'G $3 d 'G $2 d 'G $4 -0 Y5 OB5 -2 o1e '4 $0 iBd O17 sei O82 $n*04y3 -2 O53 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 k ^b *13 Y3 OA3 o4n { i02 i10 i33 i22 i22 i30 i57 i42 D7 DC D7 DF D7 DG i01 i29 i19 i32 i01 i29 i19 i33 i01 i29 i19 i31 i32 i52 i40 i64 i32 i52 i40 i69 $1 O04 i01 i19 i31 i28 i41 i59 i72 i68 i11 i38 i29 i45 i11 i38 i29 i41 i11 i38 i29 i49 DN o2u r o1d O79 i4g z4 *28 O62 o64 $0 i52 i71 i60 i80 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 ^m o1g i01 i19 i32 i26 c o49 ,9 szm i4# $i *67 i52 i60 i83 i72 D9 DB ssc ] o49 ^g o0s +5 i22 i30 i58 i41 i32 ] D3 DB [ [ ^0 ^2 ^4 i32 i53 i40 i61 O14 +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 i01 i28 i19 i33 i01 i28 i19 i32 i01 i28 i19 i31 i01 i28 i19 i30 i01 i28 i19 i36 i51 i77 i69 i82 d 'H i94 iA2 iB0 '8 i04 i12 i20 i01 i19 i37 i26 l $. $l $s 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 O03 i8a i9n iA1 *07o8( ^e ^e ^f $"*A1 i42 i50 i77 i61 i41 i67 i59 i72 i41 i67 i59 i74 '6 i12 i04 i20 O17 L5 *13 +4 *15 i01 i19 i33 i27 d '7 i74 i82 i90 i21 i56 i39 i49 i1a o6s sp6 $e o32 o5I O34 i32 .5 o6k *64 i02 i10 i32 i20 T3dsB" $e K i22 i30 i42 i59 o5a f O0B o3s i4w i22 i30 i42 i54 i22 i30 i42 i53 i51 i77 i69 i89 { { $4 $2 $0 i01 i19 i39 i28 i01 i19 i39 i26 Y1 *75 O23 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 i11 i29 i40 i38 OA7 Y3 i3x o2v ] i3k O82 o0j s7j '7 i72 i64 i80 O0B i7% OB5 O01 u L0*A5 '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 i41 i59 i79 i66 '6 i54 i70 i62 i42 i61 i50 i74 '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 i11 i29 i36 i42 i31 i59 i69 i49 sd8-A r i3n O63 Z1 O79 O78 i32 i40 i67 i50 i32 i40 i67 i51 d 'L $8 i02 i23 i10 i30 d 'L $5 [ $x ^x Z5 *96 i02 i10 i37 i22 i02 i10 i37 i21 O42 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 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 i2!l o25 i61 d 'I $7 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 i42 i62 i50 i71 i22 i40 i30 i56 d 'J $4 d 'J $5 y1 O43 *31 ,1 o0D O86 i7Wo9%o9N q *74 O7B i32 i40 i65 i50 i32 i40 i65 i52 c $9 $2 $3 i01 i19 i38 i29 i01 i19 i38 i28 *B6di8a s2g i21 i39 i58 i46 i41 i59 i78 i67 i22 i30 i56 i41 i2v i3e i4m i32 i40 i61 i53 o0w k sx1*30 d '4 $2 O09 *29 i41 i59 i74 i68 oB@ O49 ^fksj2 i21 i39 i57 i47 { $0 $4 $2 { ^E o4e i42 i50 i71 i60 Y5Z4 O03 $c l i3/ o7] i4. i51 i69 i81 i78 *93 '4 i01 i31 i19 i27 z4 Y5 o99 O35 *20 s9! c $i $s $e O34 som ssm *05 R1 } o3R r q O9A s\4 s@s O07 +5 o0/ z5 sUZ*80 O05 R3 Z2 $) O71 $$ i02 i10 i31 i22 i41 i59 i76 i69 y2 *42 l $o $r i02 i21 i10 i34 o5o O02 o2CiAns8J i02 i21 i10 i32 i02 i21 i10 i38 sav R4 s'l $v $7 i02 i20 i10 i39 d '5 $9 '4 i3t d '5 $7 O32 i3b D6 DE D6 DB O32 i3x o6=$>*4B i21 i39 i56 i47 i51 i69 i80 i78 o15 i5g $7 o3b d 'J $8 d 'J $6 .1 *32 o5& *87 i82 iB0 i90 iA1 i21 i39 i54 i47 i4v O45 c i01 i19 i34 i27 i01 i19 i34 i26 i21 i39 i54 i48 [ ^0 ^2 ^4 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 O06 O23 *12 .6tR5 E s08 {{{{{{ i9OLB z2 O04 d O92 D7 srg u s)No6} *85sj@ OB9 OA1 O34 Y1 O74 $@ Z1 $O O9B { '6 O9B OA8 'B O06 Y5 Z5 O38 L4 O96 ^Z L0 O73 ^m O72 i7g ^5 R2 $7 o84 ^h y1 y4 +7 -B iA6 ^d E *04 O28 i6e +7 i5a L4 L6 Y3 Y4 i2p O42 k *30 *23 sa3 O38 o54 p2 *60 i0t i0g C i1q R4 p4 p4 i73 '6 .2 y5 y5 *24 o76 O34 Z3 -3 *10 o08 { *95 o0b $b o3P r i13 *04 +5 $z .5 s06 *40 E +B *20 $V O23 T0 O08 O15 O37 Z5 l $. $f $i u $7 $8 $3 .6 Y1 *20 c $0 $4 $9 i64 i80 i72 o3i *76 u $5 $2 $0 C $8 $6 $0 i1a i3e i2v *B0 u C d '5 $4 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 u $3 $5 $7 f ] O37 c $6 $2 $4 u $1 $3 $0 i84 O42 u d '5 $4 c $a $s $e u '5 $2 } i3N C '5 $6 ]oAa O37 o0V } i3G O96 z4 { Z2 R5 O93 o8v i5S o9! O7B D3 k O69 O93 R5 o2c z2 o6T O1A oBm *A7 y3*74t y3sq)s'Q i1i i2e i3r 'As!v*94 p2 sx) i7'sw# i2c o3k o0k -5 ] i61 .4Z4o01 sb0 +0 +4 ^n z4 {*89sx+ $6 r +5 L2 ^b ^` L0 -1 r O68 l^d^e O4B OB1 i3z z1 O03 ss%*78*97 o5. T4 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 ^k i2G l^d^2 l^d^9 l^d^8 r f O59 iC4iD2iE0 i7r i8r i9y l^1^a l^3^f } f O69 l^3^e l^3^9 l^3^6 O46 *56 l^3^4 l^3^5 y3*91sG" *4A O07 sJe Z2 D2 i12 O12 ^[ O12 y1 i0z o0T D5 'A i5" o5n ^a ^n ^u ^t l^9^5 o0m i1e i3c i4s i5c O86 *16 sz> i0n i2t i1a i5/ O91 l^9^3 l^9^8 Z1 o2p O51 ^d l^7^9 l^7^3 Z5 O75 D5 l^7^6 ^v $a l^7^5 ui7o^H y4 O76 R3 l^5^5 { O79 sfx l^9^a i68 [ *31 l^5^d l^5^e l^7^b l^7^d l^7^e Y4 O2B l^b^9 l^b^8 l^b^2 l^b^1 O13 Y3 D4 o9x ^` iB1 iC9 iD5 iE2 T4 TA T8 l^b^b p2 'B ^I t 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 l o7K O43 D8 $4 l^2^7 l^2^6 l^2^5 l^2^4 i8F*AB *87 OB6 O41 R6 $z o2* O01 l^8^3 l^8^2 *74s+n O32 o2j l^8^9 z3 o5b l^6^7 d $a $n l^6^5 l^6^2 d $a $l l o7` R8 O43 O32 l^4^3 l^4^9 l^6^e l^6^d O53 *24 $q l^8^c l^8^b l^8^d $? L4 sPU O21 o0y .2 l^4^d -7 o2a i1l E *10 o2h si) ^e ^d ^a ^b c o0S R5 i60 l^a^5 l^a^1 l^a^2 p1 O02 o1- $I $p O08 l^e^1 l^e^3 *03 o3x l^e^6 O67 *2A i4^ 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 OB8 o0) i2e i3x i4a s2v t o94 l $. $f $m *53 o5v l o44 o43 i65 *31 i1l L8 R9 sB; *25 syA *17 O52 i3x *28o3hi6i *73 *72 C srW C $A T2 OB1 *86 s5F ^a ^m ^a ^k *48 T7 O1A O5B i5a i6n i72 T1 T9 TA T2 } ^F c i9v{ s,.s]g ^z y4 i3j o2D sg= sGW z3 o3r +5 p1 *30 oA5 T0 z5sR( Z2 i6z i1a i3e i2t O56 ^r $b i2o i34 i4b ,7 o9a z3,9$5 d Z3 +3 o5b i0Fsi|i8L i7c O01 O32 ]'7z5 ,Bp5 o4m $5 ^J $k RB*48 sneiB9K p5 Z1 { '6 ${ t i1, -0 O7A *16 c D4 $2 $h O6B O64 Y5 i3g { i29 o9k^"C r OA1 ^o p2 i8M *B8 ^$szo O32 d ^s s?- $e i5/ f c ^i ^t ^n ^a R5 i2o $a c k ^lY1 s'3s&# D3 O43 sv.z1 Z2 *31 r O4A o1q ^@ ,B O12 o5, p5 *92 +8 *B1 *62 i8q R9s$Gi7/ R6 z2 *17 *01 d $k y5 +B O67 z1 T3 T6 TB sh_ z4 u i4f p1 O8B *62 ^e ^e ^p ,2 i8f $w O67 -4 O01 i54 *87 E s"wT4^I s5. O23 sVT } r o3R R4 O63 *43 o2X s3B t*63C } *50 K z4sK| O31 ^^ -7 i8+ O06 *52*B2 p1 o7h *83 r sxko6;$G o3e sRK i3o i41 i52 D4 +2 ssc *09 c ^t ^f ^o ^s s7q O48 [ O82 O94 y4*12s[3 s_e '6 $$ $8s7. sd *50 O13 f O02 o1SsEX L1 -4 i3K T0 ^n ^o ^j Y2 $' *80 *38 i2r i4n i3i s[z O19 +1 o4{ *24 *25 z2 O41 s.0z4z2 $# ^J [ i21 o62 +4 i2P ^n ^a ^c ^e ^p K *8B s8\ shP C *B5i3x -1 d i4C '6 sX& shy L6 *38{ l L4 *23 sxv +6 O14 ^q q K o3f i0m i2t i1a l ^t ^a ^b $d $u $k $e $l O25 i8u i9s iA1 D5 $9 *43 [ s | i6u O05 i2s O43 *06 OB2 -3 u '7 $b T0 *6Aqy1 i1U .B O01 sa` O89 *1B srjo5+K $^*A7 -5 +3 R3 s0( c ^e ^n ^i ^l ^; p2 O67 sW4o9r i9e iA9 K Z3 +B s5b L0 $) O89 [ T3 T6 TC p5*6A cL8i3w ^w t o3B o13y5sNK $a R2 ^k ^n ^u ^k ^s sN!i7G i9e iA6 *17$7 $9R9Z2 sr3 sb5 o4b $6 $5 c $3 $7 $9 -0*59s"| RAo8A *7Bi9!sfg $\ O4B oBe O12 k O29 c $6 $7 $0 c^1^e c$4$a p1 *43 $1$B sZJsQJ $9$D c^B^a .9} u$f$d $T Y3 i9e iAv ^1^A ^1^F u^0^6 $d$A c$d$F u^8^F u^4^d d *45 c$d$b c$d$c $D$2 i9e iAa u^4^4 u^4^2 ^p ^i ^z u$F$d u$F$e u$3$E u$F$a u$E$B c$d$3 *04*32sV\ $D$e ^5^B c$a$c }Y4y2 z4 ^e O38 u^f^8 c$D$9 c$a$F c$a$x i1l i2a i3c c$e$b O14 ^e ^x Y4 u$5$d c$e$C c$e$A ^o ^g ^r ^a ^m u^3^F c^b^e c$3$E u$6$E u$6$f C D5 sx| u^b^c u^f^A [ D4 Z3 u^d^b u^d^c u^f^f sr@ OB6 c$B$a u^f^5 c$B$B c^3^x u^d^4 $B$9 $B$5 $B$0 $A$7 u^F^D $B$x c$0$e $4$D $4$E u^6^e c$0$x u$b$8 c^x^4 c$b$E u$c$8 u^0^e u$c$b z2 i7o c^x^5 '5 d ^B u$d$3 l $. $i $o ^a ^g ^l ^a u^5^4 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 c$C$B c^D^A *82*84s$W u^3^f u^3^e ^1 $0 *01 $C$3 o15 $7 i5g o3b u^1^4 c^0^f i1a i3a i2b u^9^C u$2$a i7e i80 i90 c$c$4 u$b$d $C$9 o5s i83 O31 OB1 *19 sbt ,3 u$7$a $4$C ^F^C c$4$e c^4^F c$F$E $E$x c$F$a c^A^2 u$F$7 u^d^0 u$8$A c$5$a c^f^9 u^a^x u^c^c O28 L0 c$2$a O12 '8 u c$2$c u^c^8 u^c^6 u^a^2 u^e^5 u^e^4 O65 C O42 Y3 OA4 Y2 *92*36o83 O2A z1 i17 s\2*61 C -7 *72DBq ^zp3 sb&o9m st-*34o3c O07 *2A R7 oA^ ^i ^d ^u ^a sc6rsSk O46 *6A o2$s|R oAL y4 *09 O37 s l .Bs>s sE/ p4 OB3 *8A*9A sby l ^e ^k ^a ^h ^s O14 o4< o4m O67 T0 TA T2 T7 o6`*38 ^zo1Z*2A t O17 +0 *82 O48 szy*62 O01 i5n O8B o3p } ^4^A *52D2 z2 ^4 sjez4s=K i1xs/k*AB i82 i90 iB3 iA2 D4i79i9< *09s8MY5 i42 i70 i50 i61 t +2 i9" } O1A O27 i5C O67 { o6` *06^_ i41 i59 i72 i69 *46 OB9 ,1 q ^a O6B o1M o77 *A7 o4Q-9f i2L '5 s)Ms!J O12 ^1 o7v O1B O39 D7Z5Z3 y3.6*29 '9 $' o6B O32 T0 T5 T1 T2 T7 T0 T5 T1 T2 T8 O56 $/ o6q { T0 T4 T6 T5 T3 c $1 $D E O8B T6 TA T8 T7 T9 l $0 $4 $3 l $0 $4 $9 i5a i6r i7s l $5 $8 $1 oB$sWm T0 TA T2 T6 T8 -3C l '9 $0 l '9 $4 c sGI k oA7 l *39 l $9 $7 $3 l $9 $7 $0 l $9 $7 $8 T0 T8 T4 T2 T5 o22 *60 D6 o0O T2 $i O09 i5e so9 i6n i71 RA sq&E ^a ^E $s $h $i $m O16 *08 *92 ^1 O51 i2r i4s i3e T1 T2 T3 T6 T5 O0A O35 $3 $E $3 $B ] ] O91 p1 *32 '7 o5. *45 l $3 $4 $8 }$=s&a l $3 $4 $7 l $3 $4 $6 l $3 $4 $1 *04 i2x O49 i1v O2B .7 T0 T5 T3 T4 O12 Z3 *41 i2i O9A O5A i9r iA6 iB6 ^7 o73 } l 'B $8 l 'B $2 l 'B $3 l 'B $0 l 'B $5 c $8 $5 $1 O32 O35 Z2 OA7 O07 z2 ^7 r $q i5m $. $c $l l $4 $9 $8 Y2 s96 Z5 *27 ^B ^7 ^B ^5 ^B ^8 p2 O0A O56 o4s '8 O03 sy! +0 +4 $$ oAZ O64 ^?sl4 *04 $y l $3 $1 $6 p4 *42 r l $3 $1 $4 l $0 $6 $5 d [ O42 l $0 $6 $7 ^6 ^x i7. o99 ^h ^t o2u i8i oAt $) $$ O71 O91 Z1 -1 $r u p2 O76 l $6 $8 $7 l $6 $8 $1 o46 *84 Z5r D0 ^@ o43 s1. *57 l $9 $5 $0 $3 d ] o1r ^h l $4 $7 $5 l $4 $7 $9 s7n O36 i0k d s0k O7B t $* z4 -3 Y2sqW ^E ^a ^E ^C l $0 $5 $4 i5b i7r i6e i4/ 'A s>^ T0 T6 T3 T9 T5 i11 i3c s>} R9 O02 c $4 $3 $0 l $2 $6 $1 i37 i1f l $2 $6 $8 Z2 $. o0r o2p usJ1oBo '6 D2 c ^D ^5 O6A 'B $g $N i2n i4s i3e s1^ Z1 ] i3[ o3v l $. $s $y T0 T8 T7 T9 TA l i15 $B $3 $B $7 $E $7 Y3 d snp{p1 ^j O39 ^3 ^A ^3 ^B c $l $i $k $e f Y1 l $. $s $v o1a k Y4D1 i4w .5 O26 O83 O56 ^^ *05 $] o3[ *86*7Ap4 *64*42sF[ O42 ^I ^Z z2 o19 f C $8 $0 $6 c ^3 ^B l $. $s $r c $4 $D d *28 O13 O7A *87 u L5]o7. l $3 $7 $0 s0, D0 l $. $s $o '7 O13 $s l $6 $9 $4 l $1 $3 $2 c ^e ^r r stk l $1 $3 $8 l $1 $3 $9 srf c l $9 $3 $8 l $2 $1 $5 l $. $g $t -3 '6 l $2 $1 $0 o2; *31 ^* D1 l l $8 $9 $3 l $8 $9 $2 i2i i3c i4k .7 +6 LAs|O sF. o6/ $6 i2~ Cs8qp1 iE4 iF2 iG0 l $3 $0 $1 sE+iBn l $3 $0 $2 sb, O49 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 T5 TA T6 ^/ z2 t oA1 O34 p1 O06 O21 l $1 $4 $6 c sa@ T5 l $1 $4 $2 u i43 l $6 $9 $7 l $6 $9 $5 l $9 $4 $6 l $9 $4 $0 l $9 $4 $8 $. T6 u i4! s 2sy* s0X p4 *5A *70iA5 s(\i5< ^D } R3 *16 r O4B l $5 $3 $0 l -4 c ^E ^C l $5 $9 $4 tkZ3 ^u $f $y o4o l $2 $7 $1 l $2 $7 $3 *93z1z3 *21 sdE O24 l $5 $3 $4 o5T O72 O64 sX5 srf c $e $x O4B ^z ^a i74 $w o8u oAo *12 $g { -0 ^% O56 z5 o1r u i4J i9o iA1 iB1 $F $U u ^3 ^B 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 ^(sp% $5 +3 L8 i4e ,2 l $0 $1 $8 $@ L4 l $8 $4 $6 l $8 $4 $2 R6 { O21 $c $A ^C T4 $< ^> ^T $1 l $3 $6 $2 l $3 $6 $1 sfSo3Cs'i o3b O52 l $3 $6 $8 z3 *06 L5 O86 ^]Z3*51 ,7 +6 Y2 s#0 sDK O47 RAZ2y3 ^p ^i ^t z3 *07 $s O13 $c i2h i4e i73 i84 o5r sAk k O35 l $1 $7 $6 *98 *31 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 $1 c $C $4 O26 ^b skr ^c ^a ^m svr i48 L2 O07 '7 s4& OB4 *50 svw o0M d C 'B $4 s,xi6$ O19 ^& u $1 $6 $7 O68 i2d K l $1 $8 $9 z4sR{ +1 O84 c ^a ^i ^d sv] ^C ^3 ^C ^7 s *03 -3 T6 o0@ o0i o2w $f i32 sa1 i8& Z4 O78 ] T0 D7 p2 q y3 o67 D4 s%D O64 [ z4 +5 *41 +0 l $1 $6 $0 i2l i4a i3l l $1 $6 $2 o1a i2u i4. i5s i8e O5B i34 Y3s'cZ3 $a O27 u $7 $x c $B $1 u $a $c c $B $F '6 z4 Z2 o0o O25 q $2 u $0 $C D9 r u $0 $D *30 { u i68 Z2 E^n l $3 $2 $8 l ^w ^o ^t f OA1 l $3 $2 $0 u $6 $1 $8 *50 t o6Z i42 i50 i79 i62 l ^w ^o ^b sDj i62 Z2 u $a $6 +2 *46 o2Z '7 $S Z2 c $. $m $k u $8 $1 $4 R7 sjb u $a $F Z2 *51 l $4 $9 $5 l $4 $9 $0 l $4 $9 $3 p3sl` ^7 z4 l $6 $7 $5 l $6 $7 $4 l $6 $7 $9 o4n k i30 i41 i51 l $5 $1 $3 $K u ^K z5 *60 O3B o0e c $7 $3 $1 c $7 $3 $9 c $7 $3 $8 u $D $8 u $D $5 C '6 $2 C^t*97 $di6as{( $7 Z5 ^r '5 o3i soP O6B o5+ $. $d $o z5 O84 OA9 O57 *19,1D8 d +6 s[z O54 l $0 $9 $4 o9u*8A o70 ^a s74 Z2 L3 z2 *63 p5 +0 O09 d u $E $9 l ^8 ^6 ^9 ^1 u $E $0 i2g O34 u $E $6 $9i9g *36 $J OA2 o8\ l $0 $1 $9 u $E $D s23 d l $2 $4 $8 u $1 $5 $7 sYy o5u $3 l $8 $4 $5 i94 iA0 *4A]*45 c $d $D c $d $E z1 O07 z2 l $1 $5 $8 O13 o2b c *05 D7 ^@o70s%p c $d $7 iAO*96*40 y1 sFs *75 $5 c $9 $0 $7 o25 *31 *65 K O47 Y3rK d*B4*93 ^c ^A u $0 $2 $1 c ^n ^i l $. $e $g l $8 $5 $6 l $8 $5 $1 l $8 $5 $3 l $8 $5 $2 O4A } si$ u ^D ^7 i3v i4e i5y u ^D ^B u $4 $7 $8 Z3 o0j s1w r p1 +4 ^a O43 -B c -0 u $6 $0 $1 o9u c s!nsW` i2g O32 OB1 slq O43 o1u OAB c $4 $7 $5 *ABy1o2' EoAq +4 q O53 o2t i6e i7m i8o ^5 ^9 O47 ^?R9 i0h *67 sv' L4 l $. $p $s c ^o ^l ^i ^k l $. $p $t l $6 $4 $2 l $6 $4 $3 l $6 $4 $5 l $6 $4 $7 l $6 $4 $9 -0 o4= l $5 $0 $4 l $5 $0 $3 shi -3 $Q*47 i7u i8e l $5 $0 $9 ^4 sb1 u $3 $8 $1 ^p ^i ^s Z4 O15 *86t*4A l $u $p O84 'A i0Hi8$ sd? O68 d o0T s6B o0w T1 O41 i5s $b i18 ^s ^t ^a ^h ^w sb< so/ i2' s'k ^h -2 ^S $S C i4Q z2 -2 o50 $y R0 z3 o6? *45 $d o4R slW O63 Z3 $0 $r s8$ saD OB7 i5A Z2 -4 i38 l $7 $2 $4 u $9 $0 $5 '7.3 l $7 $0 $4 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 l $6 $2 $9 -4 $* *45 sl8 } *A0 o85 *87 i8o i9o iAd ^t ^c ^a ^l u $3 $1 $2 s8e u $3 $1 $8 s8h OA9 z5 T0 spR c $u $m O52 R3 l $8 $6 $1 l $8 $6 $3 l $8 $6 $5 i1u i3e i2n l $8 $6 $9 o0* z5 svN t Z5 O12 sUKiA+ i9Z*1B l $1 $0 $2 z4 o3y l $1 $0 $7 { sn9 l $1 $0 $9 *19*81*19 $0 sd7 D5 i89 o6g i97 RA sz[syF sB) l $2 $3 $5 l $2 $3 $6 O61 ^B l $2 $3 $0 z3 +8 T2 T3 T6 T8 u o5= R5 ^v ^F OA6 t l $5 $7 $8 l $5 $7 $0 l $5 $7 $6 i4[ ^F ^7 o9ss4%*19 o2a o1w l $6 $5 $8 z3c*5A sBn l $8 $1 $5 ^d i48 l $8 $1 $7 C i4* T1 O57 O26 z5 Y2 O54 c $a $e c $a $D d o7b c sei z4 OA2 r ^@ o1m ,3 *34 o2f ^s ^e ^o ^n *30 *2A c $0 $a c $0 $7 $2 c ^h ^s ^a l $4 $0 $3 $v $u u,BsUa $s $, i42 i50 i70 i61 l $2 $7 $0 c ^e ^D l $6 $5 $7 l $8 $1 $2 l $8 $1 $4 l $9 $8 $2 T0 ^1 O13 l $9 $8 $6 { O54 o0L p1 -0 f *56 sn$ oA) p2 O3A '6 o3e k O12 k l $8 $0 $6 l $8 $0 $9 O02 $+ 'A O21 y1 o5* Z2 +3 spj c $7 $5 $9 $4 T5 ^q 'B ^4 ^B o4. Z3 i12 i20 i45 i30 O08 ^( sbn z3 O73 i12 i20 i45 i32 o1d D2 i5c i69 o75 ,7 O02 sfv ^m ^r ^e ^t l $3 $9 $1 l $3 $9 $7 ^t ^r ^i ^d ^q '5 i4n i51 i60 u $5 $0 $7 i31 i58 i49 i67 f O54 o9\ $` O05 c $f $7 c $f $5 c $f $8 c $f $9 $9 Z5 O83 $# c $f $e u ^E ^8 O83 $h i7o i80 O8B O85 l $7 $3 $0 l $7 $3 $1 i6s i8n i7o o61 T5 sbf Y2 i42 i62 i50 i74 o2m -3 c ^A ^D c ^A ^C L3si{ c $c $y i1e i4a $h $i i5r d $p c $1 $C c $1 $B Z3 O93 ^R l $5 $8 $9 sy. O84 -0 O4A +A*48*47 D4 -0 o6@ *76 T2 TA T5 T4 T2 TA T5 T9 l $8 $7 $3 l $8 $7 $2 LA f O29 swm o1f K O65 l $2 $4 $1 p1 *18 s9rsE3 k O41 R1 L6 ] *50 -9 -E O83 sa1 s'DK*70 ^d o3s K O0A ,A s*6 c $c $1 $. $a $c c $c $3 $. $a $q sdF s1! Z2 u $9 $4 $5 u $3 $6 $8 O52 L4 -2 i2x u $7 $8 $6 l $2 $6 $0 z2 o10 l O3A ^k *15 r l $2 $0 $4 l $2 $0 $8 l $5 $6 $3 o8| Z1 i79 l $5 $6 $9 l $5 $6 $8 o8} u $7 $1 $8 O53 R1 o0o o1s *6B O16 c $d $x o7! Z1 R9l O46 O49 R1 l $0 $2 $6 l $0 $2 $7 $r $a $m $o $n s]|Y4i8b O21 o52 } f -0 -F l $8 $2 $1 ^s ^t ^s ^o ^p l $8 $2 $3 ^s ^y ^e ^k i96 i7s O37 l $4 $3 $7 l $4 $3 $2 l $4 $3 $0 L2 i4e $- l $1 $5 $3 O06 sEA RBk{ c $4 $0 $9 *B5 O68 u $B $x s3t O68 *89 u $B $A u $B $D u $B $9 s3+ sf2 l $7 $5 $2 l $7 $5 $3 o2b $1 o4c o0@ l $9 $1 $5 l $7 $5 $9 s8X ^l ^i ^m ^a ^t s8K O14 i1G *3Bu^@ u $2 $5 $8 C L4 l $. $u $a +0 s1y +1 $& c s8w o1u o5h $X $Y s7c s7b i0G $5 z1 [ s6q O72 $& $. O25 ^d ^F o60 d O05 u ^4 ^B u ^4 ^1 u $0 $7 $3 ^H ^R u $4 $7 $5 l $3 $8 $2 i8h i9t 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 O52 K Z1 D1 R4 +5 o3z l $7 $9 $6 s;Q O25 l $7 $9 $0 l $7 $9 $1 l $7 $9 $8 l 'A $9 l 'A $8 L0 o21 ^e ^s ^i ^o ^n l 'A $0 $m ^k l l 'A $4 ^8 ^e ^2 i56 o75 $8 i3N c $a $b $l $e l $4 $5 $9 l $4 $5 $8 ssH soB l l $4 $5 $0 suN$yT2 Y3y3Y4 -5 $S o2e -7 } O12 Y2 Z5C l $4 $0 $6 c $D $1 l $4 $0 $5 ^d o2r l $4 $0 $1 o5F Z1 q sbd O03 i2B i9c *04 l $1 $9 $5 l $1 $9 $7 l $1 $9 $0 i4r *54 o4e o2FiBi o4e O69 T2 y4 O29 i5_ c ss- L7 i1* OB2 o4t -0 '8 Z4 $$ O06 ^f ^E i5t i6s *70 $2 u $2 $3 $4 c $b $c c $b $a c $3 $6 $8 ^7 q k sy6 [ l $8 $0 $4 f O61 l $6 $3 $8 l $6 $3 $0 l $6 $3 $4 o91 K c $9 $A sp8 O61 O06 } Z3 k sa. i3. i4a i7b ,5 O14 R3 u ^1 ^F O06 *A3 *82 c $E $2 c $E $1 c $E $0 u $0 $2 $9 u $0 $1 $3 [ i0s y2 *75 *76 u O59 $H *B8L8 l $8 $3 $5 o4?*B1 -5 Y2 i1h i3l i2i l $0 $3 $8 u o0U o6R l $0 $3 $4 $$ O64 sM#i5K l d 'D $2 l ^ ^p ^o ^t u $A $7 d ^c $6 $C y3s5b[ l $9 $0 $2 R1 ^g l $9 $0 $7 l $9 $0 $5 s&3*51 u $2 $4 $9 u $2 $4 $8 L0 L5 u $2 $4 $1 u $8 $9 $5 O08 *63 l ^t ^n ^e ^c ^)} f O06 iB# ^s ^k ^c ^o ^r +2 -F c$[ o4t Z2 sa0 D4 o7d D8 u $0 $9 $3 i15 i5b iC1 iD2 iE3 iF4 iG5 D1 $$ u $0 $6 $5 $R $N o19 Z4 o0h D5 *18*96sgR R5 Z5 ss^ O42 $% ^A ^4 ^A ^8 ^A ^9 l $7 $2 $0 ^@ *62 ^5 ^A O48 p1 i5t i62 '7+Ay4 OB1 t y5 o2+*45 c $3 $a O53 z3 +1 $f *13 o0j ^* ss# ] Z3 i6j l $4 $6 $7 l $4 $6 $2 o58 p1 l $4 $6 $8 f O19 ] l $4 $1 $6 o9bs,l l $4 $1 $3 slKR4*0B $,*82s{8 C ssN ^0 ^D $/ O75 c $0 $8 $3 l $1 $8 $6 *48 *08 Z4 O61 i2l i4p i3i *06s6/ sbP O14 K +4 l $7 $6 $5 l $7 $6 $4 l $2 $8 $9 Z5 Z5 l $2 $8 $0 'A q O29 ^{ -0 o0g r ^c ^d O49 -9 $% ^Lr*59 l 'E $9 +5 -F l $6 $0 $2 l $6 $0 $8 l $. $b $i $z c ^f ^l ^a ^h ^0 ^2 i6i $r o3e l $5 $4 $8 l $5 $4 $2 r 'A l $5 $4 $0 l $5 $4 $7 l $5 $4 $6 o77 ^7 s%c ^7 ^D s6b R0 OA1 O4A $y R1 d c s2* *A8o0Dz1 s7G*A6 u ^F ^B u ^B ^C ^+ z2 c ^B ^C o0q +5 O8A *36 o9w i0n K O13 i1d i57 l $9 $3 $7 ^a ^t ^i ^p Z2 s9j sqg D3 f *87 u $9 $1 $3 c i1F se2 sc0 o3f $4 o59 u ^C ^D i14 OB7 s0*sHti1V $. -8 ^w z2 *25 [ c [ s3f K O02 c $D $e $? Z4 l $3 $5 $7 z5 i71 O34 l $3 $5 $0 l $3 $5 $1 l $3 $5 $9 spusi_ o12 L0 s2,*9Bi4@ OA9 o8) ^W O15 so> z2 *72 z3 *83 $2 R1 i8& O78 Z4 l 'C $6 i3a i5a i4r o43 f l $4 $8 $3 o3f +0 ^6 *41 l $8 $9 $6 l $4 $2 $1 l $4 $2 $3 l $4 $2 $7 u $4 $6 $5 O25 z2 Y3 l $2 $9 $6 l $2 $9 $1 ,5 OA2 k ] Y5 O63 O3B R7 D1'8q y3 p4 c $6 $2 $1 o6|o9s l $6 $1 $0 l $6 $1 $7 $g sr( l $6 $1 $5 l $6 $1 $9 O17 *54 OA3 $f $0 $% $ $6 $0 $? c ^3 ^% $0 $( $/ $9 i14 i2- i3j D7 $3 ^0 $0 $~ c $$ $( c $$ $% $~ $9 $6 $& ^y ^o ^r ^e ^l c ^# $* c $( $) c $* ^_ $2 $; sl@ l $2 $_ $~ ^4 $~ ^& o1r ^H $2 $i *03 $= $5 $8 ^6 $+ $3 c $/ $- o2$ O42 Z1 ^4 ^[ c $= ^= $~ $7 $_ $3 ^7 ^@ ^^ ^^ $7 ^8 $9 ^4 s6z l $9 ^3 f O82 c $? ^4 c $? ^? ^- i8O O7A ^( ^) c $% $@ O01 swf $. $0 r f O36 $9 $. $9 $, Z5 l $9 $% $4 ^9 c ^# ^@ c $_ $* $5 $_ c $* $& c $^ ^^ $9 $? $1 $` $2 $` c $) $( c $@ $! c $@ $? $@ $0 z3oBR $0 $& ^* ^9 ^l ^l ^a c $# ^4 $% $9 ^> ^- c $! $% c $! $# ^> ^< i2v i4n i3i $7 $% $, ^4 $7 $/ c $! $~ $7 $? $* $0 $* $4 Z5 q $3 $` $^ $6 *51sQvo8H $3 $, $3 $$ $. ^! $- $0 $| $1 $- $5 T1 T2 TA T6 $# $8 ^7 R3 s80 $6 ^1 K ^0 +0 $! ^/ $- $8 $+ ^# O95 s?[ ^xo7, ^> ^> $9 $( ^) ^! c ^9 ^^ l o5u ^4 i21 i47 i39 i56 $$ ^@ $5 ^0 O67 *24 O2B ^i $; $2 $; $> ^@ ^$ $8 $% c ^* ^9 c ^* ^4 $= ^7 $= ^* $2 $^ c ^1 ^_ i4i i5e i62 $p $o $i $n $t i0K i1i $s $k $i $e $s i0m i2k i1i $a $l $s $o $w $a $d $s i3i i5o i4n $t $a $k $e $n $m $o $a $n $s o47 Z4 O95 st t u ^5 ^7 ^9 ^1 $j $a $d $e i6t i7t i8e '6 $^ *04sgd 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 $Vy4syo O06 -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 i20 i30 i20 i34 i72 $8 $c $l $o $t $h z5 O24 O76 $w $i $t $c $h T4 $@ sGk ^S '7 i6c i7o i81 $w $a $l $k O43 p1 +0 $f $a $r $t $b $a $c $o $n $j $u $i $c $e ^ ^I c $4 d Z5 O26 t Y4L6 $v $e i6. O82 C ^_ c sa@ so0 si! $j $o $y $s R0 $! *06 i0H i1a $o $k $a $y s8m $s $t $e $i $n y3 s9* $a $l $t $o $s ] $q ^Q i8% $@ O38 $9 +8 *83 o5s o5W O02 $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 $- O45 $a $x $i $s Z3 +0 $r $a $c $k T4 $@ D2R7LB $r $i $n $g sG& K O26 Eo6I} i32 i52 i40 i61 $s $h $o $e $s $w $e $n $t i8% O38 $@ O75 } T9 O59 z2 L7 i0n i2k i1i $a $b $c $d $e $s $w $i $s $h OA1 o9\ i7e i8s i91 $t $h $a $t .7 u $w $h $a $l $e st7 $! .5 ,A $v $a $l $o $r $o T7 ^m ^l ^i ^f Y2*B5sKC $t $h $i $n $g i5i i6c i7k L7i8h 'B i4K OB8 $g $e $a $r Z2 $M $q $u $e $s $t .2 y3 z2 O47 $g $u $m $b $o y1 y5 $j $o $k $e i89 i99 iA0 o4w t $p $a $r $k $m $o $s $t s1= i04 $a $m $o $k i81 i91 iA2 O2A ^T *47 o54 s)os*eoB$ ^% ^$ ^# ^@ ^! $g $a $i $t $p $a $c $k Z3 .0 $B $1 $b $r $a $v $o p5 ^- Z1 i62 i71 i83 c $+ ^+ $t $a $t $s *84 { f O24 O9B $3 szb i7s i85 si3 *31 $l $i $n $k $h Z3 $# O16 c $4 $M $e E $p y5 O38 E $4 i10 i93 iA6 iB9 i6a i7s i81 o1, } O42 ^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 O54 $d $e $a $l i76 o68 i0d *51 i6a i71 i82 *06 Z2 $i $c $k $y Y5 O04 $t $a $p $e $r $s $t $e $a $m $h $o $t $e $l O17 q d O8B sU, *36 c T5 d $s $i $c $k s-o u $c $l $a $s $h { Z3 k +3 *78 $t $r $a $i $n $t $r $a $i $l rsYN.5 o0d R9 $s $p $u $d $L *41 $e $d $g $e i52 i61 i70 i1a i3a i2t $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 Y2 O98 Y5o0fs 3 D7 +9 $p $r $i $s $m .5 o0N ,4 $w $o $m $a $n *98 *79 T2 TA TB O24 r *30 i7l i8d i91 $h $y $e $n $a z3 o0n sxL $S $V i2v i4l i3e sqa*91*78 Z3 y3 $m $a $t $c $h *62 o18 *46 sXMRAsIe +4 ^c ^S [ $+ O1A ^t ^e ^n t o9v L3 o56 s0y ^5 *96 l ^6 ^8 ^9 ^1 $l $C u s0` L5 ^G } $r $o $c $k $y Z1 O72 o48 $c $l $a $n $c $l $a $w c i62 skP ,3 c i6a o2Htsj? ,3 *02 D4 sah c d se3 o5R Z1 +3 $_ [ s@\ *52 O21 O68 o72 p1 '7 +1 $h $a $r $t $O $1 i9o iAl y3 o9g i49 i53 o59 d $w $h $i $t $e $h $o $n $e $y i4n i5e i61 ,1 l i5r i60 i71 $f $a $c $e $s T1 O56 $6 ^W $L o01 i8n i91 iA9 $b $r $a $t o4y $4 o5e $u $w $a $t $c $h i60 i81 i70 Z2 o8u O45 *15 $l $o $s $e $r .2 { i89 i98 iA5 $g $l $o $b $e ^S O64 Z1 *8A Z1 r } f $h $i $g $h c T3 si! $a $r $m $s Z5 [ O37 c i45 i66 i74 o80 o7r O25 *18 $f $i $x $e $d *79 O97 o0A Z2 ^P o84 *36i9! $s $t $i $n $k $s $t $i $n $g *45 -7 ^0 $g $r $a $i $l i16 o2j sy4 $h i6z i71 '8 $I $e $n $t $r $y $r $u $l $e $r $t $i $t $s r $g $e $n $y $n $u $d $e O19 Y2 $W Z1 y2sn>+4 $b $i $m $b $o $d O82 $n $g o6V $I R0 *06 $! o55 *78 $a $g $u $e s59 q $l $o $c $k $s $t $w $i $c $e ^j z2 i23 i34 ^2 ^1 i70 i80 i99 i70 i80 i91 $m $e $s $a T6 T7 T8 T9 i0b i2o i1r i6l i7e i81 s4v si! T4 *68 ^j O43 i7s ^t $i $r $a $t $e $p $a $n $g c i2* ^k +2 $3 si3 o6d ^H '7 L6 D3 ^8 o68 l $. $h $n $p $a $d $r $e z2 i73 *74 O83 d stp c ^4 ^1 ^0 ^2 s?@i4- $b $l $i $n $k $b $l $i $n $d o8$ E i9g iAo iBn i5i i6e i71 ^m ^a ^I $r L5 p1 O68 s68 +5sKJ^a i2v i3- i7a *80-9 O01 f t O41 Z3 *23 O53 ^p '9 c sdl ] c o1* i65 i76 i87 $p $i $n $g O42 ^m O8B ^9 d z2 D3 ^H Z4 i3e i5e i4l i84 i91 i84 i93 i84 i99 i30 T4 i71 i80 i92 O15 z3 t i3t i41 i52 $!*B0c ^0 ^q o3e o6o i1Y L4 $w $i $l $d $s $t $u $s $k O15 O21 -9oAq $f $o $r $t $h i5g i61 i72 p1 spx $s $h $o $c $k $m $u $c $h i6i i7o i81 $m $a $i $n i69 i79 i85 i6t i71 o0g i2i o3t i4a i5n i62 i72 i6o i7t i81 $w $i $r $e c ^w ^o ^l c $i $s $h i90 iA0 iB2 d -5 $# *97 Z4 +5 $* E O3B $t $o $f $u $M $* '6 p5 y5 $c $r $a $s $h i2m O46 o52 i63 i78 Z3 D5 o4u EoA! i8x O04 O81 sdj $. O0B T1 $p $i $p $e $r i1i i2l i3e $a $v $e $r $l $i $s $t c si! ss$ $e $y $e $s $g $i $z $m $o Z5 k i5o i61 i72 O81 o6v $! l i4- $d $e $n $i $m o2! k q O2A O23 $c $l $o $w $n p1 i5@ $f $i $l $e $s i62 i80 i70 i96 o2#] $h $a $l $e p4 ,3 $v $i $l $e ^4 o62 T1 $2 Z4 $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 *85 { $7 L0 i3= O42 $7 L1 O13 sv| Y2 Z2 o0D k R1 *12 i4! c si! T2 c si! T3 c^G.B O1B Y5 *B6ssz-7 i92 iA1 iB4 p3 $q $o $n $t $o Z4 O28 d u i1. $. i3. $f $r $o $g '6 L5 $n $o $v $e $l z2 i1m *13 u ,4 } O16 $6 svV i8e i9n iAt .7 } i11 i20 i32 $w $i $n $k $w $i $n $e o43*BAZ1 -7 R2 $s $l $a $s $h +8 p4 $o $d $o $r c o67 $p $i $n $t $o ^q z5 $p $a $r $t $s i1u i3b i2m $t $r $i $o i32 'A $e $o $u $s o1_ $z i70 i81 i90 ^0 ^2 o3e $r i6i Z3 O13 i1i i2l i3v $f O28 D3 R2 i00 $t $o $p $i $c +0 $$ o14 k K $s $c $a $b $s $m $a $s $h i7l i81 o15 i5g o3b $7 z1 '6 $0 $l $i $e $s '6 L2 s1k ] $8 z1 c '6 L0 $2 sqr t q t O52 sgs c $s $o $b $e $r O52 iAA ^5 d o6t [ u i7N d *20 r $t o2( l O58 $t $u $r $n i50 i75 i60 *54 $a i35 c p3 '8 $s $h $r $e $d +9 O06 $m $e $l $o $n ^a O72 iA4 $s $h $o $p Z1 O16 $= i77 i88 i99 sH=o2z $s $a $n $g $0 O32 y5 $TsbW i4c s3* O16 O51 s5# c T2 d $o $z $o $n $e $r $o $m $a $n c ^ ^I $t $i $r $e i4d i51 i62 *B2Ey5 $p $o $r $t T2 i2& $w $a $n $t O73 ^5 i8r i99 $c $o $c $k i4a i51 i62 $l $i $r $a $n $o $t $e i4y i51 i62 O9B o5B O09 i8r i93 s23 *48 T7 $0 $w $e $a $r Z3 o2l '9 Y5 }s?0*59 c +B T6 $T [ o5H O31 i20 i37 i41 i1a i3t i2s $a $j $a $r $+ +7 $d $. O39 [ D6 o3g *8B *A8 o1y *41 [ O1A $+ $b $u $y $e $r $? O71 $b $i $s $o $n $r $u $s $h ^y ^a $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 O24 sHC $r $a $g $e O72 .A Y4 i95 iA1 *5A O45 o16 z2 $z O16 O71 O25 O81 i16 '9 R0 ^3 z5 $g $u $n $s s0q -4 z1 ^L i7n *45 iBPsn=L9 d *64 $c $a $n $s $t $i $m $e $s i28 i34 i6o i7r i81 'Z $o $c $e $a $n +Az2 {*85 oAt*53 $n $a $k $e $d i3a i5d i4n ,A*B8Z1 sOe +6 ^` O23 $* [ i72 i81 i92 i72 i81 i91 $a $c $e $s $B -3 T1 Z4 $2 ] *08 i59 i60 i70 $s $p $a $d $e +3 [ $_ *56 i5f +7 $d O45 p1 $$ o0J $l $e $g $a $l i24 i31 *02 ] y1 c i5* $v $i $o $l $a Z2 [ $. $c $o $n $e ^ ^s^i^ ^s^i^h^t $t $o $n $e $r i94 iA5 iB6 *02 o3f $i $r $k $e $d u $c *57s{q{ k [ z3 $r $! i35 i41 i59 ^\l i5n i61 i73 ^Y z2 i89q $m $a $n $e $g $r $o $w $l ^V +3 q O23 O2A i3a i40 o59 i3a i40 o57 $m $o $n $k $s o2Y '7 $. o7` T1 +7 'By3 sDTy4 $g $u $a $r $d .8 o2p $m $a $t $e *71 ,2 $6 y5 $f $l $o $a $t $n $e $s $t $* o23 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 O24 *53 f o64 $! c i59 T6 i2c i4r i3a p1 O03 $y OA9 y4 i83 i97 i83 i98 $r $i $t $e $s c $i $l $y Z5 z5 O28 i8n i9g iA1 l $0 $8 o52 *09 O05 $w $i $e $l $d p1 $O i2s i3u i4k sCb $s $n $o $r $e R2 $8 $8 d D7 $% +5 ^7 ^9 ^1 o32 sun sjk c i43 T5 *04 R3 *42 $l $o $r $d $s d O27 '4 y4 sl1 T1 $l $o $t $u $s i62 i72 i83 o3# +5 C o77 o0P $r i0j i2c i1a $c $i $r $c $a .4 +6 l O23 d k ^K $c $z $a $r $h $e $a $d $s $? +5 d $m $a $n i8c i9e iA1 $t $r $a $p $s $w $a $n $d $r $e $w i99 iA3 o7f *23 D8 $d $a $i $s $y s0% O31 i82 i91 iA2 $a $g $e $s i1i i3a i2k ^5 o17 r i7e i81 i90 $O [ c d so0 o08 $J s9u O05 $h $e $l $d [ ^I -1 $h $e $l $p O17 '6 $l $a $i $n R6 i3a O54 o1F i44 i53 i62 $p $a $l $s i2s i4r i3e $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 K O78 D4 s.? $f $a $n $s $t $i $n $e $v O58 s4% i6a i7h i81 $k $i $n $k $y i90 iA7 i90 iA5 O41 *23 Z3 i7z i81 $v $e $i $l c o8* y3 O89 O43 K $n $u $t $s *45 ^h z2 o0! i0f i2i Y4 O52 r i6y i0a $P O64 sGB '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 ^@ Z3 O46 $c $a $s $e y4 l '8 { ^* $7 d $p $e $a $r $l $d $i $s $h $d $o $r $k c O83 Z3 $p $i $t $a r *01 i1l o6m Z1 c $_ d ] $t $o $a $s $t $V O29 c i58 T6 $f $u $n $k $y p2 ^a $l $i $t $e $v $i $x $e $n ^f O58 o2u *87 O02 d $# $c $r $u $e $l -1 o26 $b $i $r $d i5u i6s i71 sy5 i71 i92 i81 *02 y1 ] $n $e $w $s $b $o $a $r $d *05 O28 $s $t $e $w $i $7 i6d O13 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 O14 i3A z2 i1_ ^e ^g ^r ^o ^j p5 i6& i6s i71 i89 t r o3R O05 ^? $d $r $i $n $k +F -4 l $0 o52 $8 $e $v $e $n $t i6c i7k *65 d i4s i6a i5t sy9 $7 c o4# c o4_ $c $o $p $e i6u i7s i81 i4u i51 Z1 -6 ^* sxa .9 O63 $l $i $l $t o0x O56 ^3 } $6 $r $u $n $e *89 ^y $0 $l $s $c $o $r $e c Z3 O83 i8n i90 $7 i0x i7l i8y i91 +9 i6s $2 $U [ u o3y D5 $m $a $l $e $s $c $r $e $w l o52 $0 $8 $s $a $i $d $c $o $u $r $t $c $r $o $w $5 $- c i7* $/ -0 Z2 i6x Z2 i6n f O24 $6 Z1 i4c si1 T4 $j $u $n $t $a O41 o1l k $s $p $a $r $e $s $t $a $r $e $s $t $a $r $k c $. $d $k $n $1 i9e iAy Y3 D3 $r $a $d $i $o o87 OA2 o2> u i11 i31 i51 o1K O47 $# d $n $o $s $e ^e ^y i5k i6o o81 $f $i $n $a $l +5 ^C +5 ^D O87 K O32 R8 ] c i56 c i53 O51 ^R c ^- ^x ^e $y $a $w $n $f $u $r $y $d $i $r $t i82 i93 iA1 $o $a $k $s o13 O73 iF1 iG2 iH3 iI4 iJ5 i6k r [ $m $i $g $h $t i3s i4w o6J ] $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 c d sa4 ^m ^S ^0 $c $p $i $n $u $p l K Y2 i22 *42 *52 +F -A $m $a $t $e $s l $. $d $z $. $e $r $a $r $t $s c i27 T3 $w $a $r $p $w $a $r $s i50 i76 i60 $n $e $c $k c T4 ss$ z2 $2 i1, Z2 i37 i59 i48 l $. $d $o c T2 si! i7y i81 $k $i $l $o i4k $9 $s $u $r $e $1 i35 d *84 O06 $w $r $a $t $h O42 sjb D8 $s $c $i $o $n $p $a $t $h $* ^k i32 y3 $e $a $r $s $1 *A2 $e $a $r $l $s $p $a $c $e i6s i8e i7t $h $o $m $e ^o ^i ^l ^u ^j ^l ^o ^c 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 sf_ $d $o $g $s Z3 k } $8 Y1 *43 l d 'D $3 $s $e $a $l i60 i70 i81 i60 i70 i82 $6 $- $n $o $e $l $l $i $v $e $s c i17 $c $h $a $t c i1$ $? *34 o46 O01 r *98 O56 i5M $Q Z1 O78 $j $Y $2 $d $e $l $t $a i82 iA1 i92 O45 O49 $m $i $m $e $d $s $l $u $t OB1 i1& i9X l O54 i4k $5 i8i i9r iAl O29 y4 y3 $0 i4+ '7 $c $r $a $p O03 O03 .6 $c $a $t $s $n $o $r $m c ss$ T4 o80 *95 $s $u $n $g i92 iA1 iB1 $j $u $m $p i5n i68 $l $a $s $t $p $l $o $y $h $a $r $e $m ^a i74 oAo o8u $w i82 i90 iA1 $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 i6a i79 i89 $b $e $l $o $w $f $o $u $l Z5 s4x .2 *52 o0W *31 ^0 ^k $d $o $d $g $e O25 Z3 $c $u $b $e ^o ^l ^b ^a ^p i3t i5e i4l $d $i $v $a $s $h $o $n $e i29 i33 i29 i38 $g $a $t $e $s $} +A *63 *23 R4 ^0 i9l iAe iBs $p $u $n $k c ^i ^m ^e ^d D1 i3K $s $a $n $d $e $a $s $t $h $o $l $y ^o O28 sAV o8M $h $o $l $e $c $l $a $n $g $c $r $y $p $t i22 [ $f $a $r $m $s ^e ^c ^n ^o $. $g $l $b $u $n $s i98 iA9 iB0 $b $u $n $g d sr3 OB3 ] $u $g $l $y *14 o7@ i72 i83 i94 c se3 T4 +6 y4 $w $a $g $o $n O34 ^8 { Z1 c O27 i31 i52 i41 $e $l $i $t $e O05 $/ i7h i8t $d $a $d $o $s c i11 i32 i53 i74 $m $i $e $n $m $o $u $s $e Z5 O45 $- c $0 d ] i65 i72 i97 iA0 i2m i4n i3o i3n i41 i52 RA 'B $f $a $s $t $e $a $g $l $e O29 K y4 $0 $_ $i $t $e $m $g $r $a $m ,6 i75 O41 i2o i34 i4b ,7 $c $l $o $s $e $s $p $o $r $t O23 [ $* T5 TA T7 sa4sc *57 ^t ^n ^a ^s ^a ^w spx *34 szi *79 i72 i82 i93 y3o0i *53 o1$ ^o ^M st`*82 z3p5 $j $a $s $o $n Y4 ,1 p2 TBko6u r sbq ^d ^e ^n ^w ^o cY4Y3 t skC O59 O7B y3 *81 O84 *70 O52 z1 sDH $c $h $a $i $r ^s ^u ^n ^i ^m q O13 Y2 sGH ^g ^n ^a ^d K s3r ^k ^s ^u ^m i0" O67 O35 $X y2sKp sRw D6 s&^ $,$~ $_$~ s&S i1a i2s i3u s&N s&O o2; O75 $t $r $a $n Y4s29 $v $i $v $a $s sB# $t $i $t $a $n O95 sk2 i3m l $. $t $m l $. $t $l ^2 O32 o4us#W *7Bi5l o0 Z5 ^c ^l ^s $a $h $o $y s&. ks+Hd T6 i0! $f $o $r $u $m } sJ6 O25 *52 z2R0 l $. $t $v q O7B O07 o31 y1 ^o ^w ,4^n ^g ^a ^w ^o ^w ^n ^a ^c ^s $r $a $t $s Y1 O92 ,8 ^m ^a ^l ^s ^i sM' {sEio20 ^8 ^n *87i9[ sV9 o4D ^a ^k ^i ^t ^a K O56 O43 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' ^c ^c ^n ^o ^m ^s ^o ^k Z3z4 *73 E *93 ^h ^c ^a ^u ^m ^e ^h ^t ^a ^k o3bz1 *80Y4o1w ^k ^s ^i ^f .3 so* ^d ^o ^h ^s sTA sD4 O28 o1I O37 O39 *46 sF8 p5 sQ? O96 ^i ^m ^a ^k $k $i $r $k Y4 O02 OA5 O1A *32 ^t ^e ^p ^y ^m O85 $6 ^n ^o ^n ^a ^c ^j O58 $m $o ^f ^f ^e ^j s6Y k ,2 r ^_ T4 ^e ^L O58 Y4 *07 O58 c $l $a $t $e *B5 $W O19 z2 T4 OA3 d O32 o6y $}s i-9 ^a ^w ^a ^k O91 z3 [$' ^n ^o ^n ^a ^k *82 *54 E *39 O45 LA c ^y ^e ^h $p $e $t $s .0 O56 $/$< o6> *20 ^y ^n ^a ^d $m $i $l $o ^y ^n ^a ^f o4C *45 ^g ^n ^a ^h ^t sE< oBc O61 O28 O0B i6c R9 $l $e sJno3`s*Z ^i ^n ^u *28 $E O86 ^e ^J O41 sh5 sP3 Y4s42 sY5 *52 sy! [ saE O13 O47 $I-9C sZg*72siv $b R3 O08 $b $a $s $h ^j ^a R7sgs $a $u $d $r $a ^% *01 K i59{ O18 ^e ^c ^y ^m ^j ^g ^l ^a ^r ^o ^c .5 y5 $1 i43 z1 ^a ^y ^o ^r ^t ^e ^e ^l ^y ^m ^k ^r ^e ^j D2 $I Z1 ^m ^a ^e ^b ,2 iB2 i9#^( $d $u $m $b ^j T6 O12 ^t $s $i $n $g $h ^u ^n ^e ^m ^o ^a ^h ^c ^t ^d ^j i07 Z2 ^1 ^M L2 sds sA[ ^v ^n s|>*18*47 $e $l $m $o -3 i18 z4Z2 O12 ^c Z1 R1 ^a ^n ^i ^b ] i86 p4 $) OA3 ^i ^r ^k ^i ^f $s $h $u $n z3 O76 ^a ^u y4.7sda O05 *25 ^a ^n ^i ^v ^a ^n ^i ^z ^y ^e ^b ^o i0s i1p i2e ^n ^i ^m ^r ^a sXf OA2 Z2 D7 ^t ^p ^e ^h $. $m $i $l sB1 +4 sQ< ^d ^n ^a ^e ^m *5As^Kc *03 Z3 sMQ*57z5 .1 spm sKZ T0 ^a ^n ^a ^i ^d O57 { *B6 ^s ^d ^i ^j ^e ^n ^a ^n ^a ^i ^l D6 sZS O45 O75 *31 O59 f *53 O46 $r $a $c $e u *92 ^s ^r ^a ^t ^s Z3 *12 y1 s&Q p1 *63 O59 s'v z1oAH +2 R4 ^I *76 *07 $G ^o ^b ^a ^c sAL Y3 c $d $e $n lse3si1 o73 u $Y sQN ^o ^b ^a ^g Z1sA* *23 O56 i5l i7v i6o y1 sp! O37 ] i1K *63 i74 i36 *A0 O14 ^v ^e ^l ^l ^i ^b O63 p5 C ^f ^f ^u ^c ^g ^n ^a ^r ^o z2 $k *76 Y2 -3 Z3 OA6 s=` ^c ^u i41 i51 i62 z2 $z ^a ^n ^a ^z ^y ^a ^h ^c *26swKiB\ ^a ^m ^e ^h ^S k O75 $e $t $h $a $n $w $h $o $r $e rsM'o9L O58 C s=- ^a ^n ^a ^k ^` ^` [ y2 +1 L9*56i7, ^i ^r o81 sub r O85 ^b ^m ^a ^i s1% o1F sO4 ^o ^n ^o ^j s=5 t sUR ^c ^n ^m srq Y2 s1V sDh^j O14 sEb ^o ^d ^r ^o ^g tz2Y1 ^b ^r ^o O54 i1$ i9x O16 ^y ^a ^c ^e ^d O75 O53 s`* ^i ^w R5*A8*2A *25^-*4B s`= s`3 ^c ^m ^j ^e ^v ^i ^h i3h p1 tZ4slb *05 i2L o1e i3i i6e i7n o9m O6A 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 sD_i6( i8i i9s iA1 O7B *45 ^f ^l ^c sCB $5 Z5 ^a ^w $r $y $a $n ^a ^i ^n ^u ^d *89 O98 ^s ^h ^t ^a ^m ^! *47 *5A o5s ^h ^s ^u ^r ^c ] st% r,B r,A ^? ^= *12 '5 i43 *60 i1u Z3 O3B ^W Z5 O54 O6B o0P r O69 ^o ^t ^a ^g L3 Z1 O3B y5 $p r Z2 p5 $6 sys $3 $I O63 O31 $m $a $r $s $v $i $c L4 '5 i9u iA1 *30 O15 sa7 D6 *03s<'o3H sIVY2 *56 i8b Y5 O96 $g $r $a $n $d i6i i81 i7n ^p ^i ^r ^g ^s ^o ^d stv -8 '7 sfn ^y ^n ^i ^a ^r ^o ^h ^c ^a ^m *94 K O34 O76 y4 O84 Y2 +6 Z5 O85 OB3 O13 i4) sR0 ^t ^i ^h ^s *15 o0U sa' $s $a $m $e ^Y ^1 *75 z1 $f $o $r $d i1e i2a i3t ,3*B3 ^o ^t ^o ^s p3 O28 ^a ^t ^i ^m OB1 Z2 *84 K*68i4O ^o z2 o5l ^y ^S i7f i3b D0sNb i3m i5r i4a $j $o $e s!R+7 ^l ^u ^d ^b ^a ^a ^t ^i ^s ^r ^e ^n ^w ^o *38s^Z O63 C p5 ^a ^t ^i ^r ^Z o1R r i4y i6s $9 $7 $1 i78 i1f ^( ^( ^y ^e ^l ^i ^m ^c ^r ^a $f $i $l $m $s s6J ^a ^n ^e ^j ^i ^h ^c ^a ^s O61 p2 O24 ^i ^n ^g ^a '5 i1l sZ1 ^y p1 i59 ,5 ^d ^d ^u ^j $l $a $t $h u O23 $F O59 $I se\ .3 ^a ^w ^r ^a ^m c $n $e ^y ^k ^l ^i ^m c ^x ^n ^i ^j L9 [ sX2 sX7 ^i ^g ^i ^d $g $d ^a ^k ^s s$Z O8A ^g ^w ^a ^d s5Z *06 k d u *A6 l i7e i82 i90 ^t O87 *6At *21 q O61 o3^ D8 ^t ^s ^o ^h ^o ^o ^h ^s sZp [ Z2 R8 ^+ ^- $t $h $r $u c $. $u $k su/*BAK ^^ p1 *31 i3& *37 O48 ^i ^j ^n ^a ^s .8s7r $n $e $v $a TB*20s_^ i3) *43 $p $h $i $l *97Z4 $a $n $u $s z3T1 i4my1 *19 p5 } $a $m $e $n ,AZ4 r O56 Z1 $, O54 p2 s08 ^s ^y ^h ^r *A0 ^t O87 svQ*51 .5 $1 y5 $i $n $a ^i ^n ^i ^h ^c { $T O14 ^a ^i ^z ^e ^k $ei8c c O39 *7BsHyi0; OB2 *4A $m $d s@A ^S ^z ^m ^a ^c ^d ^l ^o ^b ^k ^n ^i ^l *35 O56 z5 k sFd ^; ^/ *70i1n*B0 ^; ^) sw\[ sJ! $m $i $n $d $a $z $e Z1R0 *53Y4 u O04 p3 R4 ss) K*38*67 sTc O13 ^u ^l ^b ^% ^_ sRf i76 i13 $P O78 ^- ^I { u Z2 i4' *B0 O5B O7A z5 ^' ^; ^i ^f ^o ^s $e $r $g $s ^a ^j ^a ^r ^r ^e ^h ^t ^o O97 *25 $d z1 i8l O23 $r $e $a $d $s ^. ^( ^y ^k ^o ^p o4> *02 *97 Y1 *79 ^e ^m ^a ^n ^r ^e o5* Z3 *04 O86 .0 sG3 O98 O52 i3r i41 i32 i42 i50 ${ ,2 OB4 *15 *B8 i7P *42 O0A T1^;r i73 i1f *97 O26 ^a ^l ^u ^h ^c ^a ^m ^a ^t sD5 z2 y2*70$4 D3 sKs *58 O05 ^i ^c ^u ^l O52 Y5 ^n ^o ^m ^a ^r sc&*B3 o3X *06 *62 O56 y3 *B9sv. *68y5 sGe sYv+3s$9 ^n ^i ^a ^l ^p $a $r $i $z ^p ^c ^a *82 O56 ^n ^e ^z ^o ^r i36 i13 $v $e $i $n $s Z2 R4 svQ st%'9y2 o2# o43 $k $a $t $h $y O25 *73 O12 sv6 $u i43 $x K -5 $1 ^g ^g ^a ^m ^8 ^7 O59 *26 sCD ^c ^o ^d ^y ^k ^n ^i ^p ^e ^l ^y ^t ^s iAd D3 i9eiBT c ^[ sa4 ss$ skh o3e O14 *26 *56 u O4A O94 ]^; c o28 r*81sO. c ^; ^x ^u ^n ^i ^l ^a ^j ^n ^a ^g c o22 s?x o42*64.1 ^x ^y ^n ^o .6 O05 K { D7 L7L3 i32 *81 ^a ^l ^o ^a ^p sIV z4 *A5 } OA2 *50 i4R i4m i6n i5o ^s ^s ^y ^b ^a { i2V z3 o3A $e $l $v $i $a s?! ^e ^c ^a ^e ^p ^e ^s ^a ^h ^c $i $o sgU i1n t ^A $b $u $c $k $s K sGd k O6B +4 d ^l ^e ^r ^u ^a s(}*91 ^d ^a ^r ^b $x y5 .7 o9Z $j $o $a $n i1x i2c r $? O75 sb& O13 *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 Z3 u o4a ^g ^n ^i ^j ^g ^n ^a ^r ^t ^d ^i ^k ^s Z5 O76 sYQ c $a $v sr9 ^s ^i ^n ^a ^h *81 *48 OA5 ^5.2 $M O16 } ^g ^i ^w ^t i74 i19 ^s ^i ^n ^a ^m z2L8 c $e $m $u O61 O38 sQrR3 +7$,*59 ^o ^k ^i ^m ^o ^k ^i ^a i3i z1 sH$$( $l $o $c $k $e ^b ^e ^d ^s ^i ^n ^a ^y z1 sig O83 i24 ^d ^u ^a ^l Z2 sgx ^k $z O46 o3! -2 +4 +E *B5 O19 $W sl? o5b ^z ^a ^t Cz5 ^z ^a ^q Z3 *37 o94 O72 O39 ,4 z1 R1 o2W Y3 i3N $d $e $l C '6 t o2S E iAI p3 ^a ^e ^l d *97 z2 o5W i7X sX3 sK{ p1 p1 O25 $r $i $n $g $o ^e ^i ^t '6 o1l kp5+B d o0C l i2% $c $a $i $n $f $l $a $t *1BsQ# O68 s>E *29 O47 $s $e $m $i sD5 [*37Y5 ^a ^e ^a l ^4 ^8 ^9 ^1 i8R +B o1G y2 O64 oB) O25 ^e ^i ^r ^e ^t ^a ^s y3lr ^r ^o ^n *B9 O71 LB TB *26 *30 ^e ^o ^t ^e ^i ^m $Do5D d D4 o4w ^o ^r ^t ^s ^a o9O Z5 O26 $u i31 O26 Y4 o0F $Z $d $a $r $e $n ^e ^i ^f ^i ^j ^n ^e ^k ^e ^d ^a ^w y4 *B3 *63 K O34 iA2 o6T ^e ^l ^a ^p D7 d $s $e $a $l $s *94 O34 K ^g ^n ^o ^y c z3 *A0 O51 ^n ^u ^a ^h ^s sNj oA< O14 ^u ^d ^a ^r ^m ^d ^m i4y i5b i6o z1,Bs]^ r o7[ ^a ^i ^t ^a ^k i82 .7 i7H ^i Y2 $g $w $e $n s-6] ^e ^n ^i ^t sZ[ t^% R7 D3 [ oAt*43 $k $a $t $e sQX Z3 *15 $' $. $i $q r*32s"4 i2Q O18 O2B -3 sZf O36 i42 sZ| ^z +6 $p $d ^n ^a ^f ^r ^i O39 $J O01 O67 $d $r $a $g o1=c s,1 ^l ^e ^t ^a ^p ^o ^r ^t ^e ^m q $. ^y ^r ^t ^g ^n ^a ^v ^a ^k ^a ^h ^s Y4 O58 $y $o $n $g $t $i $m $e Z4 [ p5 -3 ^o o7k i0@T9s!L ^j ^n ^b o0G*5B^I s,m y2 s4D ^m ^m ^a ^s ^s ^n ^a ^k s,B sCQ *10 o9O O26 Z5 O82 *70 p2 O42 s,K o1m ^] y3 *84 Y4 o3v ^g ^n ^a ^y D3 Z3 ^e ^i ^x ^e ^l i18 u ^g ^n ^a ^g ^g ^n ^a ^f *76 i2h ^z ^i ^z ^a ^y ^e ^n ^o ^m KsBq l d $6 $p $m ^( Z5 ^g ^n ^a ^k *75 sji ^o ^y ^a ^m $0 $6 $0 $4 $5 $5 f -7 $a $l $a $s $0 $3 $0 $1 $4 $5 $1 $1 $0 $2 $8 $8 $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 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 O71 *53 o2E *84 u $@ $2 $1 $3 $4 ^Y ^O ^n ^a ^y ^r ^b ^o ^t ^u ^l ^p s+S{u O15 -8 ^w ^e ^d c ^h ^e l -7 $0 $2 $3 $2 $6 $7 $0 $8 $2 $0 $1 $3 $9 $0 $5 $1 i0` Y1 Y5 ,5 Y5 ,9 ^e ^a ^j sFp $H i0G ^h ^c ^n ^u ^m i0H $* $6 sG9 ^o ^g ^o ^i ^d ^r ^i ^m sc{ ^a ^a ^d $2 $5 $0 $4 $8 $5 z3 O25 { ^a ^a ^l lp5s ^ ^i ^e ^t ^u ^c i6a i8g i7n ^o ^r ^e ^j O7B $. C ^o ^r ^e ^h Y4 ^Z OB1 *49 p5 $2 $3 $0 $9 $5 $0 $@ $2 $2 $4 ^p ^m ^c syXsQ{ K { +3 *A4 OA3 O8B ^b ^a ^l ^e ^n ^i ^p c $n $o $m $e Z4 ^X O68 suF -4 OB9 $0 $2 $0 $9 $4 $9 ^p ^m ^s $1 $1 $2 $0 $1 $1 c $~ $2 $3 $9 $1 skj d i9i iAo iBn ^k ^l ^o ^p $0 $5 $5 $2 $2 $6 $k $h $m $e $r ^e ^i ^t ^u ^c $' c ,5 o8O $1 $4 $0 $8 $9 $0 Z1sB[i9O +6 O82 $2 $2 $0 $3 $1 $9 c $@ $5 $9 $5 $9 ^e ^y ^a ^k ^o ^g ^e ^t sc" $? o4_ $1 $2 $2 $7 $7 $8 +7 i5O O02 ^e ^y ^a ^k c $0 $6 $0 $8 $6 $0 $T p1 O18 -0 ^; {*07i7# ^u sbd iB+sq7 $l $u $t $e ^w ^s ^m O67 *56 *4A *8B O16 D2 R6 *9Bz2^I i7Cs/.+5 ^o ^i ^d ^a ^r o81skby3 $4 $9 $# $# Y4 Z3 O1B Z1 O39 '8 $.$[ i2t i4a i3h $2 $8 $1 $2 $4 $0 O52 { O12 o7ji2H*31 $1 $1 $2 $2 $2 $8 s5qZ3] O43 L6 ^n ^a ^p '5 C O07 R6 OB4 $m $i $l $e $s ^a ^r ^t ^u ^p i5{s3F f i0, $( O24 ^e ^k ^a ^m R3z1 u O48 Z4 $' t ^n ^i ^w *B4 O28 c T1 ss$ szk } r $` +5 O35 i0u $1 ^k ^c ^i ^k i34 i41 i59 c $@ $9 $5 $8 $6 i01 i15 i20 i34 i40 i51 y5 o5l $0 $5 $0 $7 $0 $7 OB1 o7h l $^ $s *08 c R1 Z4 ^r ^n ^a $c $. *8A Z4 O69 u $f $r $a $n $k $m $a $r $c $h ^e ^l ^a ^b oB`t ^a ^r ^o ^c o0sY1y4 ^i ^s ^e ^d ^a ^b ^m i4a i52 sd" d o24 E ^a ^n ^i ^g i1c i59 Z3 *67 ^o ^l ^a ^k ^k ^e ^r ^a ^d p2 s{Q o8g O53 TA O91 *80 O51 o1@ i6l *83 $r $u $i $z ^p ^o ^p $b $l $u O05 o4K E ^B ^i ^m ^e ^k ^a $Q $1 ^p ^e ^d ^o ^j ^n ^a T2 K $f $r $e $s $h ^e ^s ^i ^l ^e ^K s%W [ Z1 o9q ^o ^t ^i ^v sqW ^o ^t ^i ^l ^ O02 sb| ^a ^t ^a ^m $m $o $p $s ^t*12,4 ^y ^d ^a ^e ^r $m $a $l $t ^s ^o ^r ^e ^h c si! sa4 O51 z3 *85 *0B,0k $k R7 ^0 ^J $e $a $t $e $r $ho5Esz_ *2B O15 ^l ^a ^z ^i ^r Z5 OA8 O86 sPB $c $u $b $a p1 sNU ^s ^i ^r ^k *39 DA sZX $u $2 sI< .Bsq{i1R $o $r $t $i $z $; $p $V O25 O61 +4 $v i2s ^r i3d L1 Y3 ^m r $X O58 ^p ^j ^m ^k ^n ^a ^r $g $a $r $b *62 sMr *BA O35 *60 i8e i9y $f y5 ^y ^h ^c ^t ^i ^s ^i ^r ^e *26*23 T0 TC T8 *62s6P$Y i1i O92 Y3,3*AB ,5 k *09 i3\ '5 c ^3 ^1 ^2 -0 R5 $j $u $d $o *89Ci27 sFL '5 Y4 ^3 ,8 O3B *13 L3 K $I .1 O75 Z2 $V p2 i5m i7n i6a ^a ^p ^c O4A D7 *94 ^e ^r ^g ^i ^t T0 O16 i7sy5 ^n ^o ^n ^a i4y i6s o89 $1 o97 DA szm $h $1 z5 Y3 '6 o1f s^J sYh ^n ^i ^e ^r $0i0w ] i34 O92 z5 q o9k Z2 c $m $i $n $x ^h ^a ^b $" i4n o6l *90 O47 $Y *37 o62 s*8 +1 '5 ^e ^i ^n ^r ^a ^o ^l ^a ^g *53 z2 ^k ^u ^f O52 sL1 q s=D z1 sK8 ^e ^d ^a ^l ^b c ss$ T1 *40sxb *81 y2 O17 ^a ^m ^u ^k ^a sNH y1 s*N *09 O06 sT( i3d i56 i7c i58 z4saj ^oY3 $>$/ O15 +4 ^n ^i ^e ^l ^k $y $v $e $s $a $a $r $o $n *13 Z4 ^e ^m ^w ^e ^n z1 $+ OBA $o,3*59 $a $v ^m ^r ^e ^g ,6 Z4 sp* Y3 ^c ^e ^m { O63 O58 L6 ^s ^u ^m ^a ^k o0g q z5 *67 o1o O32 i2k Y2 D6 o0g f O91 *27 Z3 O9A O53 ^c ^a ^d '9 se2 $ $p ^n ^u ^d *35 O93 ^s ^a ^t ^e ^b ^n ^i ^w ^r ^e ^a ^t ^g i27 y2 O38 o2g y1 i6` *56 O6B *58 Y4 ]Y3*37 uo05 ^r ^u ^t ^r ^a $c $i siX O53 o08 O74 q *05 *21 R0 $ Z1 O1B L9,A O37 z3 ^a ^t ^i O14 $_ D2 o0 t O75 ^r ^a ^e ^p ^a ^n ^u ^y ^y ^s ^i ^a ^d O52 [ *48 ^g O59 ^e ^t ^i ^h ^w ^e ^h ^t ^e ^l CZ3*25 i23 *78 p2 y4 ^e ^n ^o ^l ^a o2/iBx o0# *06 i2q O62 R1 $0 ^r ^a ^e ^s ^i $o *BAsj+ ^e ^e ^n O53 L1 ^s ^p ^s ^a $p*B0u u q o42 D3 D5 sr O54 p4.4 ^e ^e ^g $) O4A $7 ^o ^n ^i ^g OB7 O68 sD. ^l ^i ^a ^m ^g O42 O79 Z4 +8 o3g Cs0QZ3 O61 D0 -7 sXG O47 r z3 R6 sJ7 ^T u ^s ^a ^g OA4 sE; ^r ^a ^m ^o ^a ^v ^e ^d *48 O63 z4 s_T O68 R0 $c $l $e $o q O51 +5 *06 D3 sMf *85^m*50 *59z4Y2 ^r ^i ^m ^a ^r d u 'G $f $o $w $l ^n ^a ^i ^r ^b ^r ^i ^m ^a ^d ^h ^a ^c ^i ^m ^f ^e ^t ^s ^k i11 T3 $D ^9 K ^w ^e ^h O74 O94 O04 o8; ^^ i4b i6r i5e i5N i4p ,6p4l o3 i8e i0\sQl s3| *68iATY2 i42 i50 i63 i71 ^a ^l ^u ^a ^p ^r ^a ^e ^d ^z ^e ^d iA.o7[s ^6 *35 r O93 sn5 O36 i4a i5n i61 sli *86 ^n ^n ^e ^j ^k ^n ^a ^b d Z1 O32 ^r ^o ^t ^i ^v oB` soE Z1 c $9 $5 $4 $! i28 d O94 y3 i7% D3 *6B,8 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 ^d ^i ^r ^a c $. $j $p ^j ^y ^m oBP $(*57 $e $a $v $e s}< ^F*B0 $5 sLN swe o3a c $0 $4 $2 $! ^r ^e ^l ^y ^t ^u ^o ^n ^i ^m ^r ^e ^w ^o ^p ^e ^i ^r ^u ^c ^h ^d ^r ^t ^s ^e ^b ^n ^a ^l ^u ^w } sAu i7e i89 i99 i4a i6e i5m ^a ^i ^b $r ^A O76 $5 o5! K O09 y4 i4a i6e i5l ^a ^i ^f s}s .9z4} *9Ai5< p5 RB O28 ^a ^i ^g ^c ^l ^m sVSu c $5 $9 $0 $! ^Ys,J $m $o $v $e *14 sa\ $7 +9 O46 *50 sM+7 ^y ^k ^a ^h ^s c $8 $4 $1 +2 i2K ^n ^i ^g ^o ^l Z2 *8B $g $a $m $u $t s6} ^y ^x ^e ^m ^s $T *87 u $a $d $e $l $a ^n ^a ^t ^n ^i O15 i41 Z4 *37 [ ^s ^i ^w ^e ^l s6` ssf Z2 T2 O7A sWM s6U ^r ^a ^h ^c O43 .4 $w $i ^a ^n ^i ^t ^x ^x ^e ^p ^a i01 i13 i2J i3a i4n sd9y1p4 ^p ^i ^l L6sBR$q +7 +7 -2 +2 -3 -A ,3 R8 c $2 $6 $9 $! ^y ^o ^l ^e ^n ^o ^l ^e ^d i72 R8 s|b $+ ss$ *05 sq6 ^i ^m ^o ^a ^n ^i ^f ^a ^r sq! O06 Z1 -0 +9 -E +9 i1e i2t i3e O91 z5 L3 *35 O35 R0 s5o f ^V *20 sTh u c $8 $5 $3 $! i71 L9 ^n ^e ^l '5 L3 Z1 z1 O6A sWk{ ^a ^y ^a ^r -9 -9 -C +3 +8 +6 f sHi O26 Y5*02 Y5*01 +C -9 -B E O58 ^v ^a ^j ^a ^y ^a ^l O19 *03 t i1S O6B ,1 sq` i8q O57 Z1 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 O18 o3V +0 +A +3 sSk ^i ^r ^i ^s sQv q r '6 sQr +A -2 -6 OB1 $} sYQ $q Z4 ^ iB>o8m { se8 O5B s1] +5 +9 +7 c $4 $2 $5 $! ^t ^o ^i ^r +2 +6 +2 sj= $. $u $m ^a ^y ^o ^t *A2 O31 o0> -3 -7 -4 c $3 $5 $9 $! sL} O06 $u $n O07 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 OA9 O24 $B $l $u $n $g ^_ ^e ^v ^o ^l sWsDR i3Vo9v c i2_ O04 ^F *03 [sNGsL' *97 ^a k L2 O13 O28 o0{ O5A *B9 s<9 ^o ^r ^a ^t 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 +9 -7 +A ^s ^s ^e ^j O61 z4 z5 $s $l $a $p OA8 sFn ^n ^a ^g ^o ^l Y5 o04 LA Z1 +C -8 -7 ^i ^f ^a ^g ^f ^b ^e ^p ^a ^t r O67 +0 o77 i02 i15 i2J i3u i4n +C -1 -B ^m ^a ^i ^l sQ_s`n +A -9 -1 [R1o7m ^z ^a ^h ^c +1 -A +9 i7b i1d ^h ^a ^e ^y *49iB[ ,8*15L7 $P L9 ^e ^z ^a ^l ^b ^s ^i ^o ^l c $4 $6 $5 $! ^e ^v ^i ^g i03 i10 i2N i3o i4v $Q $T *48 Z1 ^+ K D7sTp $r $u $t $h +7 +7 -0 i29 O19 *59 ^n ^e ^l ^a 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 *9A $z O46 D4 $K T5 +C +C -8 ^e ^s ^a ^b $g $a $m $e $r ^o '6 $n $o $r $t $h O81 z4 *07,7$O *0A O68 $m $a $r $2 $6 +A -7 +A ^b ^b ^m s/E s- f O61 ^2 y5 ^u ^s ^t ^i ^m O25 z5 ^t ^r ^o ^m O52 O74 c $7 $8 $2 $! O72 z3 +A +A -1 ^r ^e ^z ^a ^r ^n ^i ^y O56 ssh O42 O74 ^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 scr Z1 s'D*38 ^u ^g ^n ^i ^p ^n ^i ^a i0m i2l i1i ^e ^i ^l ^e ^b i2N r sqJ OB1 O07 ^n ^i ^f +9 -8 +B sU@,3y3 +9 -8 +C *27R4.5 i02 i18 i2J i3u i4n *A4 O19 *B4 Y1 O05 R4 y1 ^w ^e ^d ^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 $! tsgB *94z3*58 ^d ^i ^a ^z c $9 $8 $4 $! O53 stM l p2 z2 ^f ^a ^l ^o c $o $s +8 +8 +B +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 O67 i3X sU* O93 s*V sy) +B -3 -7 +B -3 -0 OB2 O57 L8 OA3 sB+ sk5 slj +4 -F $t O08 ^g ^n ^e ^g ^m ^d sf{ OBA ^e ^y ^a ^h ^k iBir *08,7 c $3 $7 $9 $! z5 +9 $s $a $k $e T2 TB T6 z1 Y5 ^n ^a ^n ^o ^k ^g ^b ^r skz '6 ^z ^z ^i ^f i3y Z2 O51 o7pY3 ^e ^t ^n ^a ^d -8 -F s*i ^g ^n ^a ^e ^c ^o 'W ^d ^l ^a ^w o9T,3Y3 *15 O95 i9h oA1y2 i32 R2 sHt K s', lsa4si1 i60 *34 +8 -7 -A q O3A C ^d ^r ^e ^h s2b Z4 Z4 O49 ^l ^a ^i ^r ^t +1 D4 d ^e ^t ^a ^k ^s *A1 O08 sCe c -1 -A -9 $g $a $m $e $d L2 $a Z4y3D5 s'h s+W -1 -A -1 s+P $" O24 $o z3 $k *15 O13 $b $r $a $n $d *81 O48 c $2 $4 $6 $! $/$^ ^r ^i ^e ^m O28 O15 i8> s'@ +2 -A +3 c $4 $7 $8 $! c $6 $3 $1 $! O63 z1 p1 $[$} .5 s). O7A O27 'B ^? u O56 +2 -0 +A ^n ^a ^r ^f *B1y2RA k*2A c $5 $6 $2 $! s%G o9L O87 ^e ^h ^q O48 +D -C +E c $5 $8 $3 $! k$> s'ep1D4 -1Z3 s2!z2sLb ^s ^i ^w p5sT] i31 L6 *95*B7K +3 Z2 c $2 $5 $7 $! $v $o $n $d $a $a $d $a $m +1 +D -0 T2 $2 o4i Z1 +4 i0u i1a i2t *76snLq +1 -0 +C iA)*36 o7_d O48 $x E i03 i11 i2J i3a i4n *12svT u i4& s)w ^! ^* c $4 $3 $7 $! s)a *20 Y2 $_ o7i $a s]9 i4i i5e i60 +6 -9 +B i61 $9 *67 c $1 $3 $8 $! i2N O4B *85 O08 o0, -5 -D qs56 r O23 ^& ^@ i9'sQO D9*50 c $7 $3 $5 $! L0u suq z2 O29 Z1 +1 -5 +A K sp| l $. $i $r c $1 $9 $6 $! s='sJbsO\ ^9 O13 Y2 z2 +2 $5 ^x +7 o3Wi4A,6 s-P O19 *86sLv i5i } *87 sn] ^g ^a ^n { sog s&x ^g ^n ^a ^t ^z o2f }*38DB o0c ^a y1 O09 Y3 p2 O41 srV o4UsqN p1Y3oB6 o6y i6v -4 T4 R2 O62 +0sz@ s0K O1A ,9 { +9 $\ c $5 $6 $7 $! '7z2Z3 +C -E +D *57z4 c $5 $3 $6 $! +B +C +E +2 -D +2 i9)y4 D7sp0 l $. $i $d R2 ^q O72 z3 O38 l $. $i $e $x o2g $b $e $n $z o79 i2i o1% k r +5 -7 +A ^c z4 *4A*B8 ^r ^a ^c ^s ^o $w *63 ^g ^a ^f -1 i2R O16 $V OA4 *36 sn1 T2 } o0f *46 r $o $e $s D6 o12 $DZ1l *98sY` $i $r $a *12 } i01 +2 +2 +A { L2 s&6 c $l $o $w $e O07 .6 ^N ^n R2 *05 ^' o8,Z4*A1 O59 O85 $B c $9 $5 $0 $! i4l i5l i6a i8"Y3o7^ s>O $. *43 O52 p1 D1 +1 z3 o39 z2 O45 i3] s>T ^s ^y ^m $f $. i4y $9 i6s $7 $1 OA4 *A9 *01 s9- i56 O23 i1o o0f *41 +0 -C -1 ^o ^r ^i ^m o1bi35s+a sDw C *92 O18 c i2$ so=*4B *71i5[+9 i4l D7 c $1 $5 $4 $! c $5 $1 $3 $! c i2/ +3 +3 +E s>* c $1 $4 $8 $! sElt s>% ^- ^( ^- ^# Y3*36 *40 i47 o3t O52 c $9 $0 $2 $! }*0A^w z1Z4 *71 +0 y3 +1 z3 s8v s(x *32Y4sjz ^" ^( i6l i0Z *56 Z5 u O95 s(h o1X-2 s0| *36 i9c iAk iBs c d 'C $2 c d 'C $5 $s $h $o $e c $9 $7 $1 $! c $9 $7 $6 $! o3}$+i7P *56 u O62 O65 R0 i8$ OB1 C ^n ^a ^p ^s O21 d i3n sgQ i22 i30 i41 i2a i4e i3k ^A o5K z1 ^nD1$p *05 -2 *34 p1 o90 *65 O13 z4 $h $y $d $e O81 s28 o37 R0 T7 TD c $j $a $r L5 sgw $F *BA C d 'B $1 }o5' p2 *78 { $x O28 $g i72 *61 c d 'A $6 D1 o0Q O34 c $d $o $w $n si9 i21 $4 $7 $8 L3o4e Y2*86Y3 $zp4 Y3 z1 c $3 $5 $1 $! i4y $1 i6s o97 o89 *82so7 L1 *15 o0d k $y $q R7 Z3 c $8 $0 $2 $! c $3 $7 $1 $! +A .0 ^; ^' O89 O75 RA*85 c d 'C $4 $j $u $n $e E sR, c $3 $1 $9 $! ^e ^v ^o ^n +7 +A -9 O03 O49 *0B } ^s ^a ^i ^l ^e sNE O71 TB O19 $" z2 iC; O19 $5 *82 -AsA'] *7As8' O34 o1F O0B i8- k^^ +A -7 -0 i6j i8l i7u -3 o2r i4q r O12 p4 $# T0 T5 TB +A -9 -D sFg .BoA8s2d i46 t '6 T1 i1dp4 -4 Z2 O78 s!- *87 sGf Z2 s#1 ^a ^d ^a -B C i02 i12 i2A i3p i4r +0 -1 -E c d 'A $4 c $6 $3 $8 $! i0m i2r i1a c d 'D $6 $f $a $y $e d i8_ D4 p3 sYu o3%sN- u $F O23 i33 i41 i59 c d '6 $9 y3y4 O91 *19 z4 d *50 D1 K [s+d c $2 $9 $1 $! *02 '6 t iB. c $3 $5 $8 $! [ *52 Z3 OA5 C r oB6 i2c i3o i4l O04 O74 i9G O78 R4 i3v i5r i4e $z O15 *62 $j $u $n $o C d $8 s@N*76szP ^s ^n ^u ^s +3 +3 +D $n $i *72*09*29 c $7 $2 $8 $! o3& l -2 $y $v O03 ^j y2 ,Az2 i7j R9 r*16 s)` O48 $[$' -4 i4i iC? sW0 L4 Z3 *02 Z1 O71 i4e svp K D7 o5c k $usgkk oBnt +C -5 -7 ,4sh3 sjbsY+Z3 o1i i04 ^s '6 s!^ c $c $h $u $g ^k ^c ^i ^r $l $a $m $e s7g ] z3 sti [ T3 T0 TC T6 iAHsD} c $t $i $k $e Z1 sJd O51 *93 *A3 $b $r $i $a $n i3d i4r i5a DA i96 c $8 $2 $1 $! [ O94 sY\ ^j r O05 c ^b ^c +2sm% L8 '9 y2sGfsIe ^y ^k ^c ^u ^y i3p D7 q D0 O64 -4 -F $? o63 Z4 c s-' Z4y3 ^e ^m ^a ^n '4 i0p O03 c O49 i3o i4c i5t ^1 z3 } y1i8osf6 c $w $o $l $f c $9 $2 $6 $! L4 *02 Z3 *96^Vd f .0 i02 i14 i2m i3a i4r c $2 $3 $7 $! sZ6y4*28 $M $a $r $1 $7 $M $a $r $1 $2 s=m c i38 ,6 *06 o5f o6[ O42 c $5 $4 $0 $! O05 Z2 C *18 O31 *19 Z3 s73 D3 '7 R5 s2y $N^ji7} o0l L5 i9i iAo i9i iAf k i2i O52 sm{ r *4A OA7 *05 y2 $p $i $c $k $y c $0 $6 $9 $! c $1 $6 $9 $! i7L O2A c $2 $8 $4 $! c $2 $6 $7 $! z2 Z1 O29 c $1 $0 $6 $! c $4 $6 $8 $! $b $r $i $e O61 $3 i3p i5r i4e spq{ ^e ^f ^a ^s i21 T3 Cs7? DA O47 ^n ^e ^h ^w $h i92 ^u Y1 s2i r D7 *0BiA| c $0 $1 $3 $! +7 OB4 z3 Z3 $q Z2 ^s ^m ^u ^b +B -8 -6 O15 O14 sNHo2gy3 $z $e $a $l *80 T5 c $3 $4 $8 $! sJ.Y4k *52 L0 $K o5B +A +A -0 O18 *98 OB9 i18 T2 o1y sc1 *47Z1^j O97 *2A s/# *04y4 $M $a $r $8 i0H i3l i4o i2l i1e ^Fs@mZ2 '6 o4O c $^ $4 c $5 $6 $0 $! c $7 $5 $3 $! c $7 $8 $1 $! skf $o E c $6 $3 $2 $! *19 D1 p3 OA2 $i $d $a Cs7Z $m O18 sC-Z4C ^7 Z3 i5y D2 i4c i6i i5h O13 suH $d $e $c $1 $0 sr5 D1 sq( d ^r ^a ^j {*67f $|+A C d '7 $3 ^s Z2 c $7 $2 $9 $! $d { c $m $o O1B u i0A sl O4B c $9 $5 $7 $! si! ss$ u i5t i7e i6t -3 s0b c $2 $0 $5 $! sD $aZ3,6 c $s $k $i $d ^l$@ c $6 $7 $5 $! L6 '9 sm} *46sB$ c ^6 ^f O18 *8B sz| ^l ^l ^u ^f c $i $s O2A *39 $d $a $z $e $d K p2 O1A } } +2 c $4 $6 $3 $! T8 D2 c $0 $9 $4 $! ^_ O62 *1B $f $o $u $r O52 ,5 ^e O87 $p $r $o $d i0w i2l i1i i1uy4 L3 y4 i4y i6s $1 i89 o97 -8 $2 so9 O74 $i $b $i $s *06s-**1B $+ *56 *17 D1 Z2 o2V -3 $s $l $i $p $s $r $e $n $o *05 O1A *02 *89 OA4 ]o1 +9 +B -C C o60 $a $r $y $a $n $u ^l *25 c $1 $2 $0 $! i6i i7n i81 ^( ^$ o0g i2u i3m i8@ +A o08 $x r c $j $o +1 +A +2 f *32 o6^,3 ^y ^b ^u ^r c +5 -1 -A ^[s+= K l i04 s/C T3 TC $E c [ i7l i81 i93 O39 ^1 '6 shb *8B*2B,8 ^f ^e ^i ^h ^c z5 +5 *25 ^a O8B +1 +C +B se+shdsEt oB?iAz,8 i8Zk o4k OB1 $X sdr L6 $I *24 sc) *78 *A9 $f $e $b $1 $0 z4 *29 z2i1v c $5 $6 $1 $! TAshZ c $7 $2 $4 $! O56 sqJ $9 O25 R5 o0d D1 $9 $5 i3b *39 D3 -5 }L6*78 -3 -F L5 OA7 OA2 $0oB] c $8 $7 $9 $! ^d ^d ^i ^k $v $i $r $u $s c $8 $5 $7 $! uY2s1p i4q o95 -3 -D c $6 $1 $4 $! O23 z5 st2 $'$\ $r $o $a $d i3[ O12 $b $i $r $t $h O58 .3 O41 sYo y2 r -3 E *2B '9 T2 i2s i4n i3o sxo l $. $s $u *04 O46 c $2 $4 $9 $! iBc scw sFm +4 +4 +B $8 d D6 $( $Y sxh su| $j $u $n $3 $0 l o4t T0 ^D O64 sh/ ^s ^l *74L0 o0z $9 $7 $2 o4q iDh s5}-7 su+ +6 -F c $5 $4 $2 $! +6 -E ,7 +4 Z2 $M $a $y $7 f K O04 L1 s4\ r O1B sI{ +4 z4 c $3 $7 $0 $! sJ# c $9 $0 $4 $! $q o0$ ,B E o2u O82 ^c ^i ^b ^u ^c ^E Z1 -7 { Z1 o0i *34 O67 z4 z3 *85 o7s *A0 O4B c $9 $1 $2 $! i8yo4R $j $a $n $e ^m ^a ^r ^p O37 O7B [ y1co7% ^d O74 y5 $7r+2 k r R1 $J $a $n $1 $7 $J $a $n $1 $3 $7 sgc {Z4oBR p1 o7i i4r i5i i6n o6so8Gi1B Z1 ^l i4b sGp c $0 $2 $7 $! sE8D0 ,8 Z3 sgm z2 l*76R0 c $3 $1 $5 $! o4o p1 ^e ^p ^o ^h ] o64 $. *92 ^a ^r ^a ^l c $5 $3 $4 $! i4r i5i i6a .Ai9f*95 $g $r $a $p $e *62 *57 +7 *70 u O52 p5 o63 $! ^D $B O29 .A siLK s35 d OA3 $1 c $8 $5 $0 $! u i5# i0h i2l i3l i1e i4o $k $a $l $i c $4 $3 $8 $! q O58 z1 i1u i3t i2n ^t o1r C d $3 i3j Z1 Z2 o70 O02 C d $9 c $2 $5 $6 $! i7e O41 y5 C *43 ] c $g $r $a $v $e o4y -3 o5p o6e i7d i3f O84 O05 O93 s"Y O71 d O07 ky1,A sm( $1 y3 O28 l d 'A $7 y2 O43 y5 t i2c c $7 $3 $1 $! O95 sh[ $d $o $r $a i00 i16 i2M i3a i4r C d '8 $3 o3s o1w oAs*1A sb9s*O $p O62 Z1 siV o0n o1i +9 $2 i6s D1 $+ C 'D $4 *98.Bp4 i6i ,5 i7U O81 $j $a $n $1 $6 ^a ^r ^z ^e c $5 $3 $7 $! Y2 O12 [ p1 ^) o2$ Z1 O42 ^k Z2 -3 iA%s]7*0A *50 K D1 l $. $k $g ^z O93 z1 o2io6Q ^4 i0( $s $u $i $n $g -5 i55 $p $l $o $p $W L1 -1 sdo l o2r o0t c $2 $1 $5 $! si> l d 'A $6 T3 i3f O73 'A se* y2-3syH c $8 $9 $7 $! $N $o $v $2 $5 l d 'A $3 z1 { $s p3 } l .2*04$7 s?P O42 i3j o7i O51 l $. $k $e s?^ c $9 $2 $3 $! { r O32 sF8i8E,3 iE& i2Q+4 O53 *24 '5 L4 O21 sQUE O52 ^a $l*30 -0 o17 *B8iBf CZ5 O19 suJ ^z ^o y4*19D2 o52 *03 $m $a $r $i $e p4 sO[ sB< o0T O62 i0G t i8n i91 iA2 ^m O54 s?9 -6 O42 o1O O52 O82 [ O41 iE$ *3AR6p1 ^o T1 ^g c $9 $0 $1 $! sBe O04 *85s;OoA' c $2 $8 $4 r o5" o6I$M'A +3 o1e ^s ^s ^o ^l -0 .3 O43 o1u c $4 $5 $7 $! +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 O02 -8 +F -1 $b $o $n $e $s $g o5i c $1 $6 $5 $! i0h i1e i3l i2l i4o *54 ,4 $v o6- sw/ -7 sTk O01 o71 *50 z5 s?} O71 K ^f D2 z4*28D2 i56 O13 i4Es7@R8 {.7s$U s%Y^7*12 ksyqs[K c $7 $0 $3 $! O16 s&s d $1 ^s o32 O52 s=P p1 OA9 ^x ^i ^m iE! i37 } $o $l $d $e $r Z3 ,3 ^s ^a ^m ^u ^d o39 l ^n y2 c $3 $1 $0 $! ,3 +6 ^k ^c ^o ^h ^s o1e $2 o5a D3 i5f DA O2A ^> o69 '9 z2 $c $h $o $u i61 R1 $s $u $b $s $6 $f $a $c -2 +0 sf4 Z1 o5k ^t ^r ^o ^f $p $e $t $r $i o3k *14 EsW!s#( ,7p1Z4 ] p3 '9 o44 '6 $b $o $n $z $e o4i $t $a o6Ry3sSm ,B*39 $l $o $u i0n OB6 O08 i45 o33 ^e ^l ^a ^g c ^t ^a ^r ^u ^m Z2 p2 d sbw ] s@jC ^1 -1 O65 sH- $s $a $x $b $y o3V Z3 O83 O2A o1e $t $w $i $s $t ^l o2s $u $t $y $p $e O46 i4^ -1 o4x $n $u $k $e $m ds|l,7 $a $u $s $t i5o o2n $f $l $y $s Z2 *90 $e $s $d $o $l sE?s)q *29oAj Y5} -0 -C -D $m $o $m $e $s $z $y $a s'_ i0`Y1s{d OA7 o4( O95 *4B sDwsm( o78 $4 s.s} o0w O39 Z4 RA$p s*P ^5 *65 o04 o0X u $h $i $f $l $y $h $o $r $u $s O83 Z4 sy4 Y3 ^d p1 O27 .6 p3 $t $a $s $t $e *1B^|sAK *61d o3k +0 $e $e $8 $6 +2 o0H f *16 +2 -6 -9 s /+8 K O58 o3l ,1 i57 O03 i2z ] $s $a $n $d $i i8i i9d iA1 o5i t $m $b $u $l sw5s'5 s,T sMai00 s7d ^i O07 $c $y $t $o ^k ^r ^u ^t s,W o3m .4 [ K o4t Z4s[B O01 o2m sQ@ o6 O15 $s $a $v $e $1 ^S O6B L9 oA) $h $u $i fs?`sn? sD9i0Y$f o7c *16 $5 *52 [ ^N o1u sL3 i9^ O86 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 sRp O4A [ k y5 s,} o11 o9b O81 *72sew *79}$[ ^a ^r ^a ^c ^l ^a ^g $n $k $o $s $i +0 O36 $* $r $o $w $l $e smJ *17ts?d sZ3 O91 *B7 D1 R7 O05 -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;. $] O34 dT9*73 $t $g $o Z3s;\i6d D5 O57 O25 D9 i2i i4e i3n *B7 'A i8t ^d ^r ^o ^f ^y ^a ^l ^c ] K +0 s,. O16 +7 *82 OA3 D5 O3B OA5 p3 o3t O51 $Z L4 O56 $7 skw *03 ss+ O52 +D -0 -1 y1 '4 -A ,7 u i5' ^v p4 R1 K sX( O38 *4B +B o2k O81 i1f i53 se" *50*79 i1o i3e i2k ^i ^d +6 i54 p2 *59tY5 suM c p2 D3 O79 p2 O4B sN? ^u ^r o43 R1 so| ^l ^a ^v ^# r *52 $g $y } o1k $f $r ] $B *69 ] ^l O5A i4' } o1w sl`*A1 D7 sA$ *30 ,3 *52 Y2 *71 O65 .7 o3f *52 $5 o53 [ z2 +1 } o1R *53 -5 [ u i19 z2 O0A ^# O69 oBM ] T0 *07 O21 .0 Y2 *86 *70 Z1 o5% k *B0 o4V *85 ky5s^Y ] o4b ^b o3a u ^3 O02 *3A *81 [ i2s i4k r R3 *07 O38 ^e ^p ^m ^e ^t O54 O01 ^r o5pi1] ^l ^a ^p $a $r $i $e $s E i9| OA1 i54 O32 +0 -B -2 i9X O23 O23 o36 o10 R3 $$ z3 *62 ] sui y1 s@Y*70 *05 o5e o3H DB [ i2y $hDB*27 *89 ] $b $l $o $g $s $c $h $e Ep3 i4g *23 y4 *58 $p O43 i5y p3 svk D0 ^% O69 ,B O41 $J o2t $r $ $^ [ i2d z1 ^& sXDfi0, ^* p3 i1. i3. $. i5. i7. sy? E *A1 [ i2g O41 $2 D6 L0 O16 Z2 *96 T0 Z5 R3i99 Z2 Y5 slY*06sUV i2( O74 *9A Z3i4e s9" t $s $u $g $a $r } *91 Z5 O39 ^_ t $= O96 ^b ^a ^l ^f $ $# O63 -2 z3 s/4 o7k D3 ] i2- +D +D +F $t $r $i $a $l o15 o6u D0z3*7B R6 C *64 ^n ^e ^p ^o $f $u $c $k y2 Y5 ^b ^o ^l o3j *85 .1 .0 +0 *36s`n{ i42 sky y1 skm O27 { *93s[{ *18sR#*B9 O14 O25 O09 o0& ,8 o4k $3 $8 i5a syP *20 O43 so0 D1 o0p +8 o46 z2 $)K D9 LA o2k i4a s;Jc t i4< ^b ^o ^h *03 i5w O08 i5f sBu *35 Y2 o4c p4 ^g ^n ^u ^b i8q Z1 O57 *01 o3K $m $i $r $a $v $a $d $e $r p1 $V ] i2i Y2 s.f qs8.sFu ] i2h q O6B s;pshV+8 s1w -4 ^m ^a ^l +4 +F o56 ,6 i11 .4 Z3sa/ +4s$2 sbJ OB4 -5 *73 O41 ^y ^a ^d c z4 y1 Y2 sw[c i3z D5 O31 i6i L0 q K *42 r Z2 s!J i8g i5i t ,A r Z3 ^0 i1u i3t i2t sdp L5 R2 ,7 R1 O63 s/( .6 i5r i5e y5 r ^x ^n ^i ^j O23 i3t diBl.5 O73 o1g ^s ^u ^n ^a [ ^} i5a i24 O76 t L3 [ o2p *05 i3o o1m ^2 *71 o0D -9 o4y $4 $u o5e D2 O94 i76 i96 i86 *86 sf_ O72 *31 K O24 i2, i4z Z1 y1 y2 O6A $ } Z2 y5 O93 O62 O42 z4 { *60'B o2p r L9 *96 ^a ^y *A0fs(\ i67 *02 ,3 -2 ^8 s7e T2 t $D s]is+Y l i1Y OAB R6 y5 sHe ^s ^a ^h i5a +7 o1o sWt ]o27^+ sg) Z1o22*80 y2 *AB o0k *35 K O03 { i1E z1 sFi O94 O35 O43 i3t ^l ^u ^j c $6 d D4 $6 d D7 $6 O43 +7 -6 -A i8@ O16 O53 $h [ r O51 s#p o1? D7 o5DsM][ D2 y3 Y2 Y5s6s s#H ^c ^t O31 O5B ^o ^c ^s ^i ^d $p $e $n $t z2 *23 { o4b z2 $h $j i5& y3 ^e ^s ^u ^m ^a $h $p O61 i3d s#U L1 i1w y2 *64 O62 s#P i97 iA5 iB3 $u $n $i $t $e $a $u i22 '8 '4 ^L *5A*B8 o9D $@ ci8} ^v '9 i8t y4 y2 l o0] ^s sl3 o0i } *20 o5d O41 sde sNa *17L1 $y o5t O79 s|@ sv_ Y5p4 Z4 *16 O52 ^O i75 i17 s-)qD0 qs,6 O23 y3 } *5B OA5 u i5+ Z2 y3 $rsUr O12 ^2 Z4 D2 -7 .3 i4m ^a ^v ^i D0 *7A s}g$W*03 -0 o3d sOH t i04 -4 s"] $K i5O z3 *43 i7'sN_ .3 i48 sK*s|% Y3 o3A f O69 u p1 oAo sFf L7 O85 s?u,B $D OA6 $) D7 *68 *98 *2AoA9sjf Z2 O59 ^a ^l ^r ^a ^d *39p3 f O31 ] p3 sQC i6(z5Y2 O07 o1 t o41 ^s p2 O04 ] oBc i16 *32 p5 s6A o0i o4n ^p ^o ^m o4v O31 R2DBi9F o2s p1 ^U Z5 O48 Y2 u R9 -5 D8 R0 D6 ^S$*sUs O76 $i y1 OB1 i52 s,H O68 sq] r O87 +0 i59 sX` *56 +6 $v $i $c $k $y s0> sg] $t } D5 s-! Y4 o6y -5 OB9 o2[ O42 siu L0 Z2 O42 *03 y5 sA0 *20 *47 O68 Z3 sg% sDo y4y1s/l Y3R3 i3a *04 o60 O21 s?M *35i8g i5l +4 D0 O24 y3 i0A *31 *25 o4C sx^ K i1R s@^ OB4 iBr sN0 *52T1 } [ i3o ^l ^e ^d ^o ^m ,B $J O41 u ^9 ^8 ,7 *26 r ^m ^a ^h ^s sN, u i6+ iA6 *83 E $} $e $r $i $e ^b ^o ^f D1 $c i5i z2 O75 ^4 ^p ^o ^b sGF sC4 i0k s5s $0 ^o ^p C ] *69 O83 -9 O52 i34 *18 K .6cf d ^1 c $C $9 i7Gsc@z3 { ^y O67 i1e i2v i3e sN` ^m i2x Y1 O38 z2 r s6k sI, p2s u O37 ^p qs(Ls8O L3s>S[ O2A l O59 ^+ O43 O83 i7a sdG O84 +0 i3w $f ^o O03 c $t $o $y i6x O72 +5D8Z4 L6 s61 ,8^8y2 f^5 sMr iE0 }sB( c $C $b E-7i4[ Y5 *87 +A L8sZ *40 ] $a Y1 R2 D4 $a Z5 ^9 } OB1 $\iB> o6E p2 '9 y5 *51 *48 sF( c $D $d { *70 L2 $t $w $s $p $i $k $e c $D $8 s3Ry2Z3 $b $a $r $e s_0 *75 o0z ] *05 .2 y2 sTo sx'L7iA2 p1 $c y3 i31 O51 ^k ^s ^u ^t s30 *30 u $d $7 O6B l O47 d u $d $B sM@ s/p D7o6Ao0# $)$_ Z3y4 o0m *54 L2 L2 ^= K s,K O09 i4W *7As'p *B6 c $I ^R *B1sf>p5 Y5*5Ao74 s`C C O12 ^c O04 $7 -B i3s i5e i4t s/9 Y5sZzsHE ^x ^0 O71 $s z5 *B2iB!$y i3c $a E^[r s!q*91 si! T1 s;B$B ^x ^5 Z3 o6k ^o ^i ^t ^a ^r i26 d o3u i2w $po1f Z2 R5 $e ^< z3 $r $i $t $a ^` O75 ^x ^6 sr,.9Z4 o45 Z3 s+q Z3 s.8 T0 O14 i1A sYT O08 z3 *67 OB9 l i5C p4 iAP O9A $w $o $l $f $s Y2R9*41 ^e ^t ^a ^n ^x ^8 *26*58 u $4 $E O05 $< p5 O4A ^D ^F s+K sZ=s`Y ]i3< $0 O04 O14 O72 O21 z2$8K E su] $' k O54 *03 u O3A o5S s#D i7f i3d o1)*A5 Y2 D2 O31 .A ] o2u [ k Z2 o9u DA i6w O13 k p1 O68 ] i5E c +6 u ^1 ^6 ^e ^l ^a ^h u ^1 ^2 ,4 K *A9 +7 ^F i8j t O59 iB *4B $g $u $y $s p1 ] O68 u ^2 ^D +3 *41 [ ^MsT=T1 sWQi19K f$S ^3 y1 } r p3 O08 s&e*B4 } o81 *94 OA2 $p $a $n $t $s -7*08 i1)*14 o0v i2m s;. p3 z1 i96 ^b z2 *56 iA& ^_ O54 $s $i $r $e sRD*28 +1 { *21 c ^i ^l ^a ^b *32 K OA2 D8 L6 R5 R1 ^a ^p ^l ^e ^k sU2 o2r *54 *38 O83 u ^2 ^0 *69sG[ OA8 O28 *42 .8r i2( r O62 *43 ,3 y5 O83 O03 i2n s?u O4A z5z2] su= { *31 Z1 [E'2 DB*23 *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 O05 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? Z2 ,5 i3, -4 $tsR]TA *65 z3 *32 o2r i2n c O52 *4A*23.A u ^1 ^B c $E $7 R0 *54 c $E $8 c $E $d s*m O25 -0 i9o +0 i37 { k *04 O2A s|t z3 o0g -4 ^` -2 sf3 *46 *8A^R.4 o7(Y5 OA4 r [ y3 D4 o5& *02 i0, O17 u ^6 ^8 $k $i $n $g $s ^CL4{ O4A p5 R1 $h $o $s $e Z3 i54 Es;' s7g z3 ] u ^6 ^a o51 .2 fsMq*A5 O94 O94 OB9 *0A i4W o0P O42 -4 y3i6yY1 k y1 { u $A $E o3k o0v O42 i1h o1f p2 $g $o $t $h iA$*A7 O42 R3 s)1sKki3, ,2i1vsjC sHv u $A $F T6 R2 ,7 O32 i11 y2 y2 O42 *38 i9D ^6i3 sW1 $e $d $n $a s&Is"asVN *16 O0A *35 ] o3+ sLs L3 L4 O42 *42 t z4 O98 p4*76 o4p Z2 $_ $a o7i s@_} $h $o $p $e L3 R1 ^B ^x i5c i14 o73 *57 $. $s o11 p4 ,5 *7A o5Y OB8 oBQE^r L6s}U u ^8 ^b i3t D0 O02 $i O31 DB T8 -1 } O85 u ^8 ^c z1 O89 o7g O43 O72 *19 O86 $w $o $r $m $s -4 o5a s ` s c u ^8 ^d p2 D1 $b $a $s $e $d O86 o4J { D7 L0 L6 TB *12 ^r ^o ^t z4 +B -9 oA8 ^3*9B*35 i1b i55 u ^8 ^0 $w $e $s $t *78 O95 O86 { OA4 Z2 *01 s *02 o3/ s1a R5 sB" s5X { Y3 u $C $E swF u oB| ^t O13 D3 O43 i2t u $C $D -6 ] $7 c ^e ^6 i15 i1f o3g *54 E i17 i1b s0K ^Q '9 s-F $d $e $c $a $f O9A C s-{i3^R3 O95 y3 O68 Z2 ^w szI k o84 O24 $-$` i39 i5f i17 i78 Z3*29 ,1 D8 f o3A z4 $a i8b i1d i55 ^k ^c ^i ^s o6o O15 sQi so/ O58 '6 i5w 'B ^_ Y3*27 *67 -4 ^p ^o ^r ^d c O73 L1 ] sPE ^ O24 i78 i36 *60$% sQb s^q oBW O24 *58*43o13 $$$" K R0 T0 ^7 ^l '6 O4A C sQ1 s$/ ^e ^z ^a ^m c *06 *90 O74 r ^d O53 L7 R6 i0s .3 q $_ ^o ^r *A7 O87 D3 +A O64 $"$= Z1 O57 ^g ^l ^i ^o ^t O3A z1 p3 LB $s $l $i $d $e i56 [ i8a i93 scV RA o3r D5 u ^E ^A i2K+8 Z2 E p1 t *B3 O86 o1b +0 l ^o ^t ^c ^e y5 } Z1 s#g Z3 O4A l K *63 i32 i5f i5e i16 [ O3A *36 *03 O02 u $D $F u $D $C $~$$ s,! [ $h i5r Z3 *68 ^r ^e ^d ^i ^r q *40 p3 $j $r T8 Z5 c ^a ^e R9 R9 ^t D3 i18 i3b O01 sad ^n ^i ^b ^a ^s u ^F ^e i34 R4 L4 u ^B ^F o42 *56 ^w ^a ^p p1 y3 $c i36 i1d O61 o1o u $D $9 O2A q } z1 } ^a ^u ^q o71 *15 $b $r $a $i $n c $i $o $u $s i52 i16 } ] ^d i5e R6 R7 +7 Y1 *67 i5f i3b u $D $3 *39*0BoAM L1 O62 O57 i8S 'A s+G ^8 T2 s7e i1P o53 y2 z2 O53 R8 R8 *42 o1! -9 sda i3e R0 i76 i37 i37 i5c i58 R3 L3 o4&*10 u ^b ^2 i35 R4 L4 $+ q i2A{sn/ i16 i5d u ^b ^d $*$[ *06 R7 sA5 o7t *02 st_ ^Y } k K i1f i32 i7d i1b i39 R4 i78 R1 L1 i9PY5 i71 R6 R8 ,6s+4R2 ^e ^i ^m ^a ^j o9r o4o c u i7W OBA O42 o0j -2 o4' l o0j -7 i1d R6 L6 D6 o3- c ^E ^3 c ^F ^B .5 Y5 u ^f ^e u ^f ^a i3a L4 K $8 i59 i17 s+2 i3o [ sj u ^f ^c i1c i56 Z1 O79 q i11i29i36i40 ,3 'A o3h O62 si[ O74 *56 o1R o6y i6a o5a *40 +4 i03 C Y2Z5 *25 $7 i36 i1b i17 L2 OA5 o7o z5p5 o0c i6n $3 i2h u ^f ^7 ^o *15 i36 R1 R2 i3f R1 R0 ^l ^l ^e ^w c ^7 ^a i31 L3 R6 p1 -B sH spC p1 o1h ^e ^d ^i ^h c O14 s0Y O51 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 O52 o3u K sNw u ^A ^E iBu O56 i38 i1f K ^a -7 r +2 O52 r p5 i1f R6 L6 O53 TA r sg3 sx!Z1^- i3b i11 o6s O41 O21 ^k o99 O62 C*6Az3 i7e i3- u ^C ^F $d $e $v $i i78 R0 s!9 $j $a $m $e i55 i17 s#K ^m i0l i37 i5d i4s o0m O75 i7k *54 ] Y2 i14 i1f O42 so, o9l $V $2 ^n ^n ^i ^f $V $B O8B *A1 c -1 $q c ^3 ^b spc OB1 u $f $A K o0p i1c i78 ^# *52 r *06z5 $'$- -9o4ei5* u $f $C *67*0B ^l ^l ^e ^d z3 ] *62 +6 Y2 u o4Q ^d ^u ^c i52 i17 { o5e i35 R0 u $c $x ^r ^a ^m o5A *25 *15 o0- O5A O73 t u $2 $B *65 i4e ^t ^n ^i ^p i76 i14 D4 '5 ^p DB o0v y2 i1f i38 L5 L6 [ sYy sab OA1 O21 O71 i73 R3 L3 i12 i3d ^t ^s ^u ^g *94^0u sLf OA8 OB8 i7f R8 L8 $s o0b OBA s@) ] [ y4 q +3 [ i1f i78 O24 Z3 *15 i1f i76 Cs&}i4F o45DA i40 $7 u $B $6 i53 R9 L9 ^s ^w ^a ^l R7 R7 sm4 ^y ^a ^t ^s [ E y3 +4 i61 c $F $D Y5ts\R $$$; O52 Y5 'A ^% O35 $Dz2 O81 *0B ^n ^i ^r ^e $s $u $c $r $e +5 O02 *03 ^l ^l ^i ^k ^s $f +4 Z1 o5Zd'8 s # D5 o49 [ $0 [ o17p5*80 $k $o $r $e $a D6 i2r u ^d ^f k O31 K i16 ] *63 f O19 O21 z3 p4 O63 o7_*76sKZ ^y -7 i64 O13 d ,8o0so5? i18 i5f y5 O68 *67+8L0 i14 i3e i14 i3d i18 i5a +6 $r svc d Z3 +3 *35 *61 u ^3 ^8 ksPh O68 d .5 $. $m i71 i18 O6A z2 *42 ] o0c o0m *76 *03 o3s i75 D3 i1c L3 *84 z1 OBA D1 i5+ o0o ,5 c ss$ T5 *3AY1sqH oBg O29 Z5o9. i15 i5e i71 i37 s]*i2P O31 o8Q z5 i54 O72 y3 ] *16 *76 O02 O3A o4" u ^3 ^5 .1u O68 $] s"p$U{ i77 L4 L5 o5o *13 ] ] Y3 O65 z5 o2U O53 ] Y3 ] *98l^O c $8 $A s,*i9u*B5 u ^d ^7 s*to9Vi6\ i17 i1f s92 *57 i8M O67 Z4 i1f R3 L3 O61 $2 i36 i1f *89o3S i76 i38 t $Z ^i ^l ^a ^c o0h O71 o5y $1 i38 i5c .7 O05 i72 R5 Z4 O09 s"` i1f i54 $h $u $a $n $g O65 sFO o0s ,7 $z $e $n so_i2(o27 u ^3 ^c o06 y1 $t $r $o $y ^T T1 *A4D5i1- i32 R7 L7 *97^8 i22i30i42i51 sqV^E O27 ] o7B u ^3 ^E sk^ O41 $6 *60 OA4 C sb2 r O61 $f $i $s $t sZQ i52 i41 O08 '8 -8*68Y4 i2i o5v ^z $k $e $y $s *09 O76 D5 o4f ^x ^a ^m i1c R6 i62 +7 z5 ^w O35 O32 ,1 z4 }iBe d i0z o4s *62 u ^0 ^7 ss6*28$B i4c *23 Z2 O23 { ^z ^i ^r ^a ^a ^n ^e ^r i79 L3 i31 i1f i5b R8 L8 i35 i5f i74 i13 ^8*19 -3 D1 s"H*02 o1C u ^n ^n ^a i4e i5r i6i *27 Z2 O07 +3 R5 skb [ O23 Z2 O23 [ ^h ^a ^e ^l sJ;i89 *96Z4 $e OB2 o2l .0 u ^0 ^d o0t +5 Z4qZ4 sa4 C sf| D3 d *30 $x[,2 Z4+9 [ $3 +1 ^a ^t ^l ^a o9Es,&*20 O43 o3x ^T ,6 i4e i5n i61 sa4 r [ D1 { f O04 ] ^y ^z ^a ^l ^4 c +8 ] O71 i0Z u ^7 ^6 D7i1Bs.| i3 ] Z1 i8y Y2 *51 D3 i3Ri7' i11 O61 Z4 O67 y2 T9 O41 O15 o50 ^f $k $r $i $s ]$Ko0D ^r ^i ^s ^e ^l ^a ^y u ^7 ^5 i14 L1 R7 O96 ^| E s $d$k {-7 i4m D4R3 $pZ2 D0'B szt i1o t^G Z2+6 O81$z z1^7 -1d DB$c s+ $8Z3 i42-7 o5z ^9c D5$7 co5F $6-8 +6*56 ^ho4 i7- O02^y o5d +7c D7$i iAr +3o3p smk i1f i7z oA4 {i1a O02u $ D1 p5Z5 o55l O51p1 -6-8 [{ L5R5 +8-9 i6+ o2@ $(u lo4a +3*12 o5sl i6= $% $o$s ^7^0 $1O72 $4+8 s48 DAl $gl $1*02 L3O02 O02i0f [o2v i8j $@z2 s52 -3o0G o3` O12o0p o1w $] o1p o4Et o6. O03^1 ^d^5 $\Z1 Z2-8 dO09 $5o65 i2w i2u o8d i8u $ZZ2 $ZZ1 $^l '9o7n oAw *AB ko2l T0i3y *32'9 [o10 *75t T0i6_ o7Yl cO51 sbn se5 l-5 *10*42 $u$r ^0O12 *35r ^gT1 o3G D2^1 o5l $su ^7c O03$r o1! ^6z1 o4h -2*10 ^z$z i7@ R0z4 ko6 O09 $7$6 l+9 D1i1. -2D1 ^_O12 o0-} s30 O31o3a +0D4 [o0l O93 $_Z2 ko1a i4wl O02d }p1 O94 i4:l o0p'6 i6J *79O81 $jc i4# i0=$1 si ^e^w $pZ1 +0-1 -1$7 +1^l p1o7o co4l slw i6,O02 $3i7< t$` ^\R1 +6[ OB4 i2nk i97 T4[ D8$7 o3+ O03^u '8z1 O54l o24 o0bk o0X ^ad fO47 ^5 o4= '7Z2 O84 -8O04 O03d $.Z1 O03sld iAx s0/ L4L4 cO03 swp [o2z sj\o6 o3= -6Z2 ki0b lZ4 Z5{ *79*95 i3M $:Z2 l*75 sunD4 s4 T0o6r [$8 ^3Z1 o7@ '8t o9z O74 '9c ^eO21 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 O02*20 [+2 ^4T1 Z2o8t ^6i05 ssc p1s6w $t$b d $eO53 O41o3l t^\ z1Z1 $ O16 t$T z1i1e sb0 D3^@ ^tl 'Ai7s z2-1 O52D7 [o33 oA9 o2Mc $2*14 rc p1O9A *15o5 ssp i4ec p1t *42p1 +3i4k do6u Z2O82 O12$* ^cO13 *71'9 o7y ko2d o3g-4 o6c }^b qO05 }i56 $h$ O81'9 *02O21 $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 $7O62 i2= sa. $ O18 $7o61 syz $/@o O61O21 Z3l i3b i8y dO94 i3eD5 ^Jl sml D8O61 $uO52 +7$% $X*56 {$w o16 o1v o6` -5'6 i3ml dsg0 i7= }^k ^ O62 Z1o5_ ^BO32 o3ic o3 O21 i4d sgj sa3z5 k$d sfa slZl R6t i2[l $5i6 ^7^4 usCK +4Z3 +6O32 t$; iAq o1h+0 -9l O32^e kO13 i31 p1+2 o8n $1p1 o4d '8^a $%Z1 dO37 $x$p Z5$6 z5sG6 O46T0 $2T0 i5A ^& o2d-0 o1sc *76'8 z1o3- ^/c i92 o8& Z3O74 *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 o3mO41 i0fo15 +2c $Xt i2ul stz @b srb i7jl *50O15 cD8 @h o3r D2*02 +8Z1 i4; o3 R0 o6& O83l snc i1z ^k*13 $3$i p1O02 *03oBc @a *21R0 i5P o6I p1O19 i5$ +1$n i6a Z3O53 +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 p1O28 p1o0b o6od o1c $3T2 di7, li5t o28 i6_D2 [o4j $yD8 $4-7 T1k *65$! $uo7u O81o8s -3O41 i8. $2[ $8DB lL1 T0r -6-5 i3= i8d s2e $Wl z3{ i4S $iD2 +2D3 i3i[ o2*d *53*46 '7i5_ $1O51 sh ^6^a Z1T4 o0t$9 s47 s07 o08z2 OB1$3 i34 i6rZ1 O32*35 -1o01 *57o7s +5'6 lO03 ^A ^ji0h u$! ls' $xD2 sy1 ^ZL0 s0 z2 }O03 Z1Z5 $?Z2 p5z3 p1i5s swd s51 i3 D0 ^ z1 O72l o4g o71+6 T3i3f $C p1D1 $zZ1 $X $4o4o Z2-9 ki2z z1^4 $!T3 ^rz2 $ep1 ^g $.$9 p2O0A ^1i16 $!^0 s14 T5o7 o31 p1+9 ^y L0Z5 ^qz1 l-1 O02+1 O62T6 s38 oAj +3+5 s25Z1 $4{ O03O43 uO02 '9i8r @3 [o0d $2*68 do0z T7^2 o0bp1 *04O32 O71o81 i3nl ^7^f o1Kk $eZ1 i1b }D1 l+3 O06d *BA i8Rl O03D1 O07i5 i12 fO59 qs2 ti0B -4D5 $-Z3 co3m z2L1 D1^d +1p1 o16*31 ^/r O73 ['8 o1z d+1 to0F o7, OB2-B i5+l $&Z2 s0) o8A *76 o7P '8*76 -2k o7F i5Nl o5.Z4 T0o7 uT1 i8iD6 ^tO13 i4qr $0O82 i2sO32 $wZ1 c$+ $ii3 ^3^c i2\ R3p1 O05z5 o7m$1 {Z1 $lZ4 i3p} Z3o0j '7$. o0V Z2O31 i10d *13o4B -8[ o6mc c^A OB2$b s26 $+ $YL8 s3f o7] *51[ D3$. rT0 i9h ^1^c ^nd o7>c i68 $($) c^2 o4Dc $!D9 {^a o7sO51 p1i4g $1+7 *53*20 sv, di4, ^t$. lO95 dO53 $jZ1 z1-1 i3p*03 R0^1 i5;*34 i9a s24 i1do1z o4, R5Z1 o1r i00^d o6wO71 sa6 D3+2 *12l p1OA3 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 p3O73 i3^O41 z2-0 *45o0g i84 D1^7 cL0 sbg $*^$ *57O16 ^! ^c*12 L3+3 $.-5 o4tO21 sdil +0T2 R5R5 O46$1 o0'{ Z2-4 o5x qO12 *97$q z1$d i4* sec ^o} $`O02 s2a }^c O04p1 o9g i0f-1 o0m{ sud$3 ^9^6 stc O24d p1o5k l+4 i4k ^` o67 +0z1 $qL9 '7c Z3t o1r[ *58'8 O07 R0'1 o4% ^Az2 sjh ^h^a [o3z doBa Z2O03 ^]$[ di5 $> oAk }O02 O04L0 T2+1 o0aT2 O32$7 slF [*05 o3g*30 o76Z1 o3n[ ^5^c $Qc stm '5q ^8^3 dT6 ^B dO32 p1O74 ^Mz1 o0H o07$ $!O21 sbe i6: l^m D1+3 Z3$- $<^< *06l o91D4 *67 ^k'7 z5O25 o9eO63 L5O32 $-$x ^vO14 $yZ2 o67+8 *67o75 $$^# o6k[ -5t oA1 [+1 ^l^k O62c $%i61 [i1z '7$9 i8f 'BO71 i54*31 sj *54-4 u-5 O02^X p1O34 $ $3 o1yp1 o2. D6d O81R8 i82 +8-6 O21+1 O03$! D6$9 O01r fO43 O31-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 O26d o0kO23 ^c^1 d'9 i3mR3 $9o76 c'9 si* $2$x ^8z2 sdm ^ z3 p1o5g -7+9 -AZ1 s86 $z{ $-$. $G o4cO02 '2z3 '8$a i6E R0} fO65 O34q ^GZ2 O03^g lO23 D4o0m *86+7 ci8 l$u O0B $AZ1 p1O72 soe O0Ai0 ki0r -0c D6$0 O61$+ fi01 $ +0 $qd o1;l sbk fO91 o4A *74*65 ^n$1 Z1o0K ^K^J s4& p1+5 z2i1n o44d [o3_ o0L O41i2o kO12 $!-5 Z2d $-Z4 $i$n p1O36 o6cl u+7 T0^e sz t -3D2 $id ^S$S O71+5 *56$1 O21+6 $:d o2d-8 lssd o3 } CT7 i2g sl4 o7= uo6A o27 O23o2n $b$a iBs *74$k -4o0P ^tO12 [-3 i4 +7 '5^z $5O52 i2y T6T5 Z1$2 dOB9 [o1o T4'A se, ^H i9o dOA5 O45 *45p1 z2R1 p1i6r $4T5 ^.^t '6Z2 o6; *10R1 rf o6.*07 l$q i6%c c$x O04T3 -4Z1 *21o1e i3z -3+2 ^sO14 i1b$s i6I se8d *13*42 R2o2v z3+1 $#o0w $0+5 sas p1O47 l*35 [$@ p3O4A ^v} *02*97 dsh6 *76*68 $7O52 $2O53 o8ru LBO92 sb7l $3k Z1L5 O25p1 p1O98 dO67 spt i0i *67*86 snk o9m z1*50 }$% o2-^k $!O71 ^;$ i6` fO7A s65 $;@p l^D lo6. $2$! i6w Z1iB8 sw $1o7l i7k $ sro oA- $!O61 ^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 *30O41 cL5 lO26 z1^d ^Rl T7t i27[ p2O04 }i1f i47c do0f sce s5b *20-0 o4sl i4El i6zc ^WT1 O32o0k [$r o4yo2k sed o5Ac s1e su1 o4iO31 p1O68 o60Z5 $PL9 o7^ [o3 p1c [f $>$ [$i $j$o }O04 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 +AO82 ^ci1j t*20 L0c $8@m c$k -7l cO53 o6W p1o0h ^ $ [d $zZ2 o4; *02i0s up1 +5p1 O01+6 T7*64 o1Ul o64$o ^md p2O58 -7-9 }^e -4O31 fO53 o73o89 c$^ i6g i09} $9*01 k'9 ^2$$ *65*67 ^.z2 ^gp1 [z2 -1^8 ^4^4 i05p1 i7b s1+ @ed +7Z1 O46z2 o2b-0 O02i5e $oo6w ^i^M L5O04 @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 ^7O21 T8D5 O45l i5i{ o04 ^Sz2 ^4z2 seb sb2 R0O13 ^V$v o23R1 s6e o1%u o6@$1 +6-5 '6*54 ^g$7 o8m*67 to86 *50O53 ^mo2i $VZ1 o2r^v -6^@ o5s+4 $bO72 O12o4 $e^d *37$k $-D5 o5$Z3 O73OA2 ^.^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 O93L9 -1{ O87 sPs $*$1 o5Kl ^ z4 ^aO12 $1^c O43l o8go9r o6/$6 o1ki1u $"i7! $4O62 $iO62 $!^D t$" qO86 [z5 DB$4 i2- o0gd ki3f i7* i7, *74O41 @9p1 T3i3- i1kT6 $3o6= $1+6 dO81 o81sub o2d[ rZ3 T7o5z *71[ ^< ^ki1i Z1*34 '7o6z svg +9o8j $V$6 *85i7e oAs Z1O03 o6TT7 o0iu $q$w i2$ sh-o0g o1j*41 D5*45 Z4O61 oA7 li6t *27D2 O21f ^MO43 *53T4 *97syi i5KO64 i4@-8 ci31 ^5^b i5#-9 o4T svn *97 DAo91 dOB4 sx+ DBO71 i1! O12$s oAx sunsjk +5+7 *13p1 OB2l Z1T0 $7+1 $9+4 ri4, +0o44 Z2$5 }z4 $2O51 o0uk *87o0p o4G *31q $-$+ R7l L9O62 $uO62 sJgl O14^g o6d-6 r$; '9r tO72 $`Z1 o8Ec Z3$5 o61T5 L1-0 *A9+3 $JL5 s1I s,g +6R5 $ R5 o0W*31 $6T2 o4Uc O02^j ^c^4 {o6t +6$A [*64 so& i3mt $pT2 o0Ku +2$ i4 *37 o6M$2 kc o4Iu uo1d ^[l sfj +6O42 ^zL0 [$- kO31 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 i6aO02 O16$_ $f-3 o3O +9i91 $ui5- dO21 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 *40O42 o15[ i3e$Z $3$ o4;^c ^y^o o7f p1O76 *36O32 dsam @bi5 i5^[ sprd ^Zi4X z2R2 O14i0T o7&$y sBLp1 O0Ad $ *52 i90 z4O46 i2j sb7 s7f O02'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 -6O51 s28 o7 $l @6 s5 s09 ^sL0 *16O43 dO07 ^x'8 $.O63 o4"o0! lo6k o3np1 i3-c di4y o7cZ1 i3h} i4% i0s$a $eZ4 C^7 slm $fO82 O05p2 sgml o7mO81 -0^2 *74+5 L4 o9@ t$F s9 i1_ o6tD4 -8*BA o1kL4 D3i3_ O51Z2 s3Tf sw6 o7#R4 L2O02 $qZ5 *62*73 -3O02 {$i di5o R0o1 scs ^6D2 to61 OA2 o54O41 {^d Z2*53 'Bt *65O42 O51*57 $"u }o0x s2eq *46Z1 o0kO41 $" D6^b spj ^eO12 i67*53 p2O2A D1^p $o*82 i4!c *40'9 $vD5 s3e$7 $xO92 [o1t ^yi3_ i15r +6$0 +9Z1 i4.r @5+2 T3$1 T6Z2 rs1 i74 i5q{ *06$1 sms $q$a O09$ Z1i7o f@a z1o4, -2u '6$i $1-6 *78s71 i6mO06 p1O09 $N*65 '8-2 -1$5 s@, z1o91 L1O23 $X$2 OB3Z2 $pL6 *24k o5/i0A iAs -6i5, O81seo Z5OB6 shd i00o6m p3O0A $mZ2 $7Z3 L5O62 +6*57 i1d o1q^& ^k$a sor O2Bo2 to0V r'A o4' o0=^b O39 sAcp1 O15 T0i3: O72^l sNS O61O14 $hZ2 ^wz2 $1*74 -2r Z1i4K o6p*56 O02z1 o8i*57 o5 @e }'A T4i4! o5,O61 Z3D7 i46 O61*9A ^N$H s23 }o0 ^so2y i1-u k+1 -0$u ^j*41 i1p i5L scf *25 i4? qq $4+2 fO64 O06R1 Z1-3 i2w@o $lZ1 d*03 $_$+ O13o1u s!+ -0$1 $hp1 +4*53 o89Z1 *72$q o5ei2U l^4 sx) i37 uo0W o7<*67 i4P Z1ssB *41d oA o9iD0 i5E ^Ct o6xO51 O71O21 o2? o9x i56l +6*75 i6q sp+ $1O53 z5R5 o5N '7^ +0*32 ^a^p O13i1j O04Z3 *61O12 $_$i @8k p1i5z i3uq -6$8 -1*13 $sk o5.O41 ^8+1 s9 O01 @5 $xl ^lo3 o51$k o0sO31 o4@ oBy Z4+7 o2: $3srl [O32 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 OB1oB3 $ ^b *40q oBr dOB8 *68D6 $9*14 Z1ss& i9e OA1D8 $@u ^AD4 z1o2O o2H^H $.i12 Z2$, shO $y$s -4z1 o65Z2 *65^z $4p1 i46i42 T5O62 O01*42 iA! $d-8 $Po6. z1^i $LO73 r'6 d^1 -4-1 $-Z2 O82T7 *46l Z2$v i3jl ^@^p $5O41 Z3o4a O23q O21+2 L5i6g O21^k ^6^4 o4tZ2 i3! u$m *05+3 ^W o6x +7i6y -7i7t L4'5 O01i4u L0L0 i4aD2 D2-2 sd* +6d ^Pz1 Z1^4 ^kO15 +5*78 dO75 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 ^mO12 D4o4 -0d Z5O43 *03o5_ c$? $u^? i3y*42 s, q O32O42 p3O65 loB1 ^6L1 $1O58 }^w *32^s o2rq o1oL0 z2o1. $0c *50*41 $T sx! li8a si. -8DA $iO54 s74 sft o6/ ^0-5 i0d^7 L0^h {$6 O42-4 oA3 $8{ O13+0 s37L1 i31o0s *62O03 L1R1 i7iT5 $e$m oB9+8 R7Z3 ^Vi1c +6Z1 fO27 ^1'8 D3sao Z1i8x i01$9 [z1 i65'9 i74i8z sm8O21 li3/ D5d sdq '4[ z5O62 scv o6l+3 o1eo2d s1/ o7% ^/z2 fi6o z5o7 fO49 R7*67 to9H D6'9 o5K rs0- i4qo5u i3:c O03Z5 *01R0 $8d o51c o0f^7 Z5$a O02+3 ^>o71 ^ei13 s90 o0dD5 lZ2 O37p1 o2su $s^k i62[ o3wl L0p1 o4aZ2 *03O43 T3$D -5+2 p1+7 s6a o70c $6$2 OB3Z1 $-@T *01$f $Ml lo5< *16 *37$" i1Eo8E O72c dOA6 ^c+1 *12o1b -7$5 ^l-8 O62O13 syj Z5$c sMk i9u *25z2 T0$9 O34ssp ^2$* fO76 *65l Z1+1 D3i4, R7'8 lo5n +6k $t$h o9sD3 *98O71 Co6: r^z p2O06 $k^m $xf *21O41 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 ^#O61 o56$6 i0P^E s9G R2l $:c c$" o8$ $ i2H O12$6 $i$d *03sbe Z2O23 s2 '3 $s$4 $Gc *B1O03 ^pc '5$r O52*67 *54o3 O31-2 {^L sx* T2^) *41s9< ^/^7 i5F ^bD4 sla +7l o8) $hi8% di6b qO4A sac O02L5 o1k^s '5p3 $ O73 o5 '6 '8*70 T0$} ^s+7 sbp -BZ1 *35t qr $Ru R4R2 s0q O96-6 D0i2m Z2$7 $l D2+3 c^< [s7+ $sD7 o7w T0T5 sv6 *74O54 i8zr -7o80 *02^b ^#$@ *87+8 tD1 i17C fOA5 ^_T1 $#O62 *61*21 -5*68 z3o12 uo7% si\*12 o1N ^1$" sdP $*sln $%t i3v +7-6 *72 +At T6*65 t$> O75 o14Z4 o4( $@@i o5m-6 {c l^{ *42T0 o2v p2^T $@L4 o2cD0 +4[ O12$ i4ho2r *65[ li58 $2*78 ki7g -2d o85O62 o93+8 *01i11 s20$! T5o0S {i8* $nO82 $D*57 $7OB3 sx^ o7bZ1 p4[ *74k i4,-5 $d$w *78Z1 sl! fo68 l$j $b$u o2nO32 $lO62 o01p1 'Ai9 *57o7, [o0W *06T6 +1^b O63$. *76i5 o7#*76 Z2s7@ O02^x s _ i7v u*68 T2T6 O04i6 O04u 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 *40O41 $_-0 -6O05 i3; Z2-6 sb1z1 ^8r o4w D5$i O03*34 ^6O12 $3Z2 o6P*75 $7Z4 s1.*57 *72O03 ^s} o0gq *13i4y ^?z3 tT9 tZ4 }o71 $$+7 Cr $2i6R *10z2 ^i} o34t o5e$2 *83O59 ^f*21 *50R5 ^0r i1, sm+ iAo $!^y $K$! dO63 -0i1r sgll *A4O05 O07d *05c o8[ O24^m O52O31 Z1+6 '6$2 r^a $2$k Z2*64 $ { D0Z1 k^m -7*87 dO38 $&u $qLA *67-7 $8-5 D0 siO *21-3 i3/'8 D1L0 *4BO63 o9'^s O35l *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 O42^d p2O09 z5O35 [o0n ^j$s +0$i p5i0; o3uD2 ^/$/ R1C *31$r [z4 i4_O54 }i0z ko3- ^h^m T0^F sF1 @ki19 fO48 ci7u $H R6 +8z1 sa- Z1i7n o8, ^q o6 Z1 si_p1 to6 p2O85 i60c -6d Z1i7% i8@ O46 ^+z1 O02C +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 O02o3y s42Z1 T0o4r $6+7 $3t cO02 s32 o6) Z1*35 o5a[ p1o0s i7+ tr *89+8 stj o7Y i9dT0 *30O01 +7r i9 O52 f$m sO= ^!z2 se0 o8bZ1 O32u i91 R4D0 p4O3A i9_ T1'8 +5s36 O02*23 o6 D1 Z1$0 do0H li6/ '8o7a o8T $rZ1 @z$8 +BO02 sgb DAD5 '9q T0T7 o0ri0p s5_ i9f ^_z2 {Z5 +5O01 +1Z4 o05t o4L O43$! i3xd so.*40 DAoAa R0Z1 ^go78 o2Nl o3p *42z1 Z1T1 R6O06 *84O23 O41} o4H O91+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 O32i3: i6 c $;Z2 ^Cu o9y 'A*84 ssb R5Z4 i3_*46 sq o9v R7$x s0rL1 o1bo0r O04^l *25R5 $9$4 p1*80 -2$) $Uo7# T3'9 oBz *01^R $3Z4 +0O42 li2p c$0 s42 +5*87 p1*63 i2^ $kO13 $to6w o1aD2 o6M o7u*67 o6c'A o0! *06 D3$b sdo co06 Z3OB5 $M$W $zo3 o7( i0H ^ri1t *56*76 o5-*40 swk sh7 O61$1 L1*15 ^AD3 O02-7 p1'6 Z1o9_ o9b T2^` [o3j sxy*40 Z2$! o5H$i o3Ec D7+A o3? i3%C T6o1C O09l $2$% q$3 R1-3 $"Z2 ^bsrz $3O61 z1$i $d*21 ^.z1 i9r-A $3d D3^p +6$; i0o^N di7u o55+6 ki1h ^Dz2 D0o3n o94l ^ O24 s9. -3$1 ri3t ^qL0 Z1i58 $P$s $j*07 ^&$2 i0?$! z2o1H ^ID4 i1v O07k o0Oi3B Z2^$ $(Z3 Z4O42 *40O34 *53o15 $o+8 O02+8 o11z3 l*83 $iO92 ^f^a dO36 p2*B1 i1. o3A p1O17 o3!-2 $*D7 $ O41 O21*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 p2O6B ^zz2 *08$* -0*21 O91D6 @r*62 $Q O41Z4 p5Z2 $z+5 i3l^z $zD4 i8m o7o'A ^c*16 +0Z1 c$v p1seh T2d i2< $9Z2 i66'7 lO75 ^>o2 O52$$ Z3sr& +1o25 -0O12 $9i7. -8-6 ^qz2 Z2o70 $D$r p1O25 o5+*67 +6u $c-B o8q L5*21 -8z3 i51k Z1RA s9lZ2 i1uZ3 oA3Z1 +1l z1o0M p1o0l +4+0 RBO0B r-A sn6c $1o6c *20O32 o1n ^; o8x o0Di6r O32c O84c ^SO12 sw, ^^ o7zl O32^6 o4x+2 Z1$! $0O72 -3+4 o1sz1 lZ5 }o4d $fk skl p1z3 o2[ '9Z2 *42^k o3ul O91R9 o3K o6mp1 '2p2 srh i21 o0; lO78 k^w k^n ci5/ tD8 $sO83 $Z*76 o5A O51o3s O12^o ^ai15 -9} s9^ +5*65 *51{ o77Z1 @0s3_ -2T4 *30*02 o9t ^pz1 O13i0M *02o3e qO82 ^1o63 *76o6. '7Z1 s1wr p2z5 @sl s5, $5O51 $no2- $aOB4 $z*23 {$- O26} i3nZ1 ^S^N *05O35 o8 O02 O02q O14+0 Z2si9 +0*20 T9[ o5 Z1 +7o6x Z1ss o87Z3 i98s18 $aZ2 O85l 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 O81-9 ^q^n *14Z2 ^s$b ^#i1k i3& z1i00 i4f[ [$k Z1+B O05s6 z3o8h c^@ Z1i81 oB2se6 ^O^M i8/ +3^d +4i44 sckO21 o79t dO31 [R1 *25o0B $z$x -0+7 o3f*72 o3Ic i10i39 $.*45 O05'A i4/[ Z4O53 saf [i1d $g$n di7 ^h^r +5$- ^-^j -4$* lO24 ^>o1j $4k 'AO61 s._ o88+9 L7O52 ss_ so, s.+ ^iO23 u$" O21*30 [*12 R3T7 +5*53 cslt ss\l o0J iA2 Z1o5- z1+1 i7u-8 s1Kc z1$ $Cr i93 $)R0 lO12 ^f*18 -5O05 T5} *68-6 spl ^SO14 D5$, +6-7 '2 T6Z1 +0^/ $ti4C *34l uO21 *27 *65+3 siR }o0, C$1 O02$k i63Z1 o4r*10 *64O72 -6o5t svb o7g*98 i0at *05l L7o6. o4tZ3 R4D1 o6Q $h$k o3hp1 {o7k co56 *83*47 *67o7r z2p1 O24z5 o7$s$b $s$u lo0c +0O92 p1o5f sskp1 -2*05 $L $cT0 i3c'6 [O21 o6T '9i8e +1*06 $k+0 $?Z1 $7@i -0D7 O06Z1 $R k'6 R1o0e o8Ml z3o2- ti7l sjl $7D2 -2L3 $+$5 o0MD3 D7$5 O01^o s4@ s3c i5xO32 $| $ ^8 z3'A $1*21 *20o2. ^qp1 Z1i8v *63D3 $5+5 T4sau }s0- O24o2r Z5O49 T3o71 D8o7t i09^e i58 p3O34 O35$ z1sf* *54l $2Z2 Z1srz sBk o5J $ @1 st@*41 i0a^K o64l o12L0 ^,$, ^kO13 $.+0 ^g'6 i17$+ o0P*23 $d$4 li1: $/c D6$g ^mO31 i6Ec *74+4 o1l*13 ^7'9 $+*56 +4$a i6-*78 s80 r^I o1B*10 i48 o8rO71 ^G^M *79-9 scp ^<$ ss% ^p^m *50O32 $v-5 o4 O54 o2lO31 ^Rz1 l-4 O02^% i6w$y -1C i4l'8 ^$ +7i7f {i6W o8U o5_*24 -7o6- i0k$o p1OB2 'A+3 o8L ^yL0 T0sM ^di8d '9o4h Z4O84 s2*Z2 $0*85 O92sA1 +6O02 O71$v $1@s sdxz2 p4z5 o0Lp1 $e$n -4O12 O32i1e lo2t c$[ s03 o3g-5 O28q ^iz1 O12^3 o4_o7s ^/ s91 o0R+4 ^gO31 i4hD0 o79c c$N $(Z1 $&C slj ^lc z1O54 i4&O03 i0h^e i6/ s1#'8 T2Z1 D3-6 *18o5g o1s+0 ^i^m O81-6 oB+ D3-1 p2O93 sdLu oBu i8MO53 o3/f +6Z2 sA O53 O12$. $0Z4 +7o6_ ^zL1 i4eZ3 o6a@9 $e$l O45[ p2O82 s7c cTA $mt D6o60 D1^s o0Md L3} ^h$m do5n $+$# D4D7 o3w*32 s, ^6t uR0 ^1'9 $P$E {'9 O32+2 i56 Z3-8 ^Wz1 z3@k ^;^s p1sbp i2hl *05-1 ^PO31 ^zi4_ '8$Q $,c $ O0B i40^k '7Z3 z2u ^Iu s*< c$3 s0aRA $ki8o i64 o1S -7o14 ko4 i0,r $-f ^{R0 z2l o5_@p }$o o13k $( R7 $,O02 *10c Z3O96 Z1{ p1*98 r[ O42slL s3q '9-2 o1Oc i42sky L7o07 ssa i77$3 sek ^6z2 o35 s8M*02 $7C $a$p o2 ^= O41-0 D2R1 [$A *23o3y sbr *87c o3! *89-7 i3x s4x^E cR6 o2; i9b $!C i1m i1c{ $S$V O02o2 s9 k s0| o8k$e se* -6o7r +0+0 *76i7u R4O04 $!Z4 i2:t *05O02 do0T dO41 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 OB2LB OB2iBb ^ti5t i8z'9 O21^3 O31$y ^di1s O31r *43$a o1@-8 s71 O62^3 i37c $ *03 O32*30 i1a*40 o8a+5 sBF o0^z1 O21^L ^c} *89} iAt -0i0c p1o0w -4'6 i6A *23*05 ^T -7i4x +4i4z O12s2z O17*20 O51*75 o62l ^Yo5d cD7 O51$6 O17l {scs sB3 '4Z5 z1i14 ^Lz1 ^-z4 $9Z5 sb- *61^ *36c O41$G skh $#$g s@. ^Sz1 ^@*13 dD6 Z1@a sr *65 '9o6m $9t Z1-5 csd1 *35*54 o2P ^a^n O32k D5o1a i35q O13$1 [i31 *46O05 *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 p1O13 i7D O82'A $-C $ s9a D6i66 $#r ss, O61o6 ^O+6 Z1o6 sa!r i6mZ1 -0^9 $M$L do5w '4sc z5O63 *42R6 i15 $ ^: -8l R8R8 +0z3 $x{ o32 i2y*62 [i5 OB2$7 *A6O26 ^j+1 -2R1 O06l o0fD1 p1O96 p1o5d si l c'5 R0l $,$0 p3O7B $!O53 sPN o5eO61 ci0M i3_+5 O14L0 t-0 i4F oBo -5$S *67i65 di6x $nZ3 rO51 '7o6! p1$i '6z4 Z3o14 o77*A7 lo7e D7Z2 -3i33 o4io6! i3aO02 O03$6 p1*67 $*T5 {+7 i01'B lo68 *51+1 i4aO52 L0O51 Z1oB0 R7o6 *14o1X $x*31 $wc ^_$6 {o46 o1zq O0Bl $$-7 Z2o9m to1y -6O84 i3ei2s i83 $s$ o0Ik O51i44 ^-D3 *15$p siB$V $/t *52o5B so@O05 O41^i i0v*07 D5o2_ *71O01 o85*75 lO58 o3_D4 ssn ^b-3 O43*05 ci6R '5*13 o04L1 ^4sb1 i5u*68 $c$b p1O8B p1o5c ci6$ *20*03 ^:s( *26^f +5T4 *9A@5 ti11 R5i5, i0_l ^zO24 +6$L u+4 *B8*A9 i1uOA1 dsrw '9i8K $7Z5 lOA3 *21^j ${L4 $Fo1g $dOA6 p3DA i7.*79 do8o O05$0 s7W*74 L0O31 }o1a $DZ1 *53smb ti62 o8|Z2 o9r$i T2O02 st# shD^F i60Z1 z1o2N $0i5k i5_o9o @a-3 ^d$ kD2 sc$+2 '6$0 -8o3b D2o0l O01O93 z5*21 z1^R O83Z1 o34l slho10 o3az5 o6jD8 *10oA9 *20c s16l L2i3l i0k+4 sb, *12o1j Z2o4- Z3o9r i1/ $iO12 z1^p -8*8A qoA2 [o2q o6-Z2 +0s@y $mi7g kL2 'B$e shr $ $2 $hL8 $f$j ^psx- '5o0d ^1-9 O04*78 sIEc ^m-7 *82O06 o0g+6 ^2D4 i59*02 o7&-3 *62i0z Z4O46 i5*$* p2D1 $ -0 *34o3r R4Z3 $oO15 T0o2S $5sk1 {+9 -5$3 -2o3x -1$8 *56-6 *7AO64 ^t*34 }*91 'A$] *57*93 ^[O15 r^k Z5@a li4; ^6*07 -9*98 i16 o4xp1 $y^i $$+6 D4sg *06s7A li2% $aO73 *10o8# i2f$# [$9 O64z3 '9i45 $5D8 -9$% ^bo8* ^tO24 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 O28^z Z1o54 +5O04 +9D3 o7il -4^j sbs^j ci4- o6:@9 L7i6d to77 '6D2 ^h} +8*9A *63+1 ko65 o72$e qi0y O14i1G D2^f z4O5A o6sd O65$/ ^P^4 d*57 O82+1 sCs^! '9i1t -2O52 ds2q +6o77 O57$ *B3*B9 i6p*28 iBi ^,z1 O14Z4 '7+6 D5*87 ^*$- {*34 i8Zc Z2-3 i85O53 D7o7. *60$3 T3$" i8uu i4.t sf6^c iBrRA $mO43 k^8 i1xz1 +7o54 spc s- DA -8-2 s8z slyO41 sC o9B *04+4 [i45 *64o66 i4ei52 z1c +4+1 i7eR9 O64$9 $%$! $0Z5 D4o83 $ p1 ci61 {i4J lo0z D2o6y s2k$h p1O23 i05^! O62p1 D1*31 ^N$L O01o4i svt $9Z3 o4Fz3 o1mo0e +5O61 O41f ssw sr$ se ^Z D4-B Z4$9 i0^z2 *87sti o2"u +8$@ O81$m sjx +6@d R1+0 O42i4e s1! o8Z*67 o3d^z O91Z1 r*30 z1'B co90 o7sshe +8o7b shRZ1 ^rD5 Z2i7u si2 snyp1 *71O03 $3L0 ^dL1 O56O01 sph*91 sDIO52 z2+8 i48L2 co7+ ^g^h ^1s8x $nk 'A$7 *79'A i3^^x lp3 ri7u r^5 o2j*60 f$8 *30-4 *51O35 O62^l -7o6b -8*76 ^,r O05o1 i8* $b$. s12oA0 *97siu i9r $MZ2 oAcO07 ^LO19 i5fO13 $1i9 }i0A o15O24 O82*86 soIc z3@j o2n-4 o0eo3l *25+2 o5 +6 O36D1 o3iO02 O31Z3 T0$D ^AoAa D0i2j O89l i3gO43 $f^f D8^\ $0O15 s8g +8$m o1q T8O02 *20o5X ^"R6 z4$e o8zD7 +1O28 l*40 '8i1. sgl O41'B sbku L1i27 '5o3k i6d-5 ^gO23 o8- $c$t cO23 +3^2 Z2o73 sDL i5ri3= i4w T0$6 srYu O81sz o7k*63 o9eO72 dseg z2$k i55r *53O13 i4i*64 s0g k$p o5fZ3 o4jO31 oAp'B *62o2s Z4o93 o5rz4 *36'6 $vD3 *74sds ^1Z3 Z3^3 $a*16 to7S $_$? *13s73 T2i0I Z3o5E $M$* o1s*84 z1o6w *69O92 i6fl sdj*29 $b*34 o5bi62 i0u^c s- D5 o6SZ2 *60-8 o47 $qz2 OB2s24 z1i5/ o6pT1 o7_T0 @iZ5 p2Z1 $7*98 $mO32 s#,} li3a z2z4 iAb *80'6 *98*85 -8o9l O34^p z3sT7 l@9 O81$f *A9O52 $k^D p1*57 i3R *78o4! O52*78 D3$X to4T s18*85 *12$! O6B[ i4 [ sa7o0b p5z1 $ *84 *20o0l o05z1 z4*58 OB2iB9 $)o64 o0M*13 D2-6 o51l O7A[ $n$b sZs *97o93 ^XO31 sbpi7t ^Ql $r$F t-8 O36$ OBA^4 o6p+9 *98@9 o5aD6 O71*56 ^_O13 Cs4b p1O53 *56r Z2o0_ i7fc sDF o56o8s L5T4 i1h^d O15$t iAeO72 D7$0 $b^a *04i4t p1o7h {^k sph o8_*87 sa9 O64$0 T3} $4t $3*74 O42l O93O41 +0Z2 O64l $L*16 ^c*46 i2g'B O42'B s05+8 L7t *35O12 TBTA O09L0 *41O34 *81o3@ $o@1 O42i4= kO23 *86o8s c^( k-3 '4^8 {o4_ s0B o3i*53 *35^# 'B+0 {-0 syo {R3 i4]l Z1o59 ^Fi0B snh ds5- OB3O04 *32^A -4$! o6n$y ^Po5d s* '3 O16r Z3^J ^W*14 Z2i7d o2) Z1^B ^: k$; @y{ i6Si7h o6n+3 p3O01 o3lD0 ^hO71 *86i6; smZ$e O62+5 p1*72 }O14 ^.$? $KZ1 O34*13 T5i0p O05*41 O71'B DA$1 co1V *98+0 L8s5s L8O17 @0l ti2F O93-7 O23i2i i8U *23O03 $oz4 o0tq o4D*78 z3sis *32*45 O13R2 smo L7O07 ^7-3 d$g $6s19 {i6L i4&o7b ^si1j @4{ *68o6r s8c*01 O53o2e o2Wc $xO64 Z1$c o2A O15*15 O81$1 i4N i1&r z2o1s -1l O04'3 *56o5j ksgd Co1a o7UR3 D3R3 s2M o90*96 O85O43 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 lOBA Z2o1n fO18 '7Z5 o4Od o36 [$^ @6*53 o0Wskt svz rz2 s79 $KD3 o0zO13 -7o8! $)^. *34O51 $2o62 -1*91 }$? s-/ $3$% sAT Z2$e z2s4x fO03 '7O51 OB2$0 s3qp1 *02*7A z1o3_ o9oOA3 p1i7o O24^g TAs09 s0^ L8O35 ^['8 *35+1 sdc-0 ts0e $%$j *35R4 $3@o o0Q$w o4 $5 '3p2 '2o0- z1^L *03i3e o4) *45z1 p1i49 $vL5 sGtO41 $ o3Yc ki12 s.z $1OB2 $Kc p1i4m p1s1+ s8qZ1 *21i50 Z1sua Z2s85 -B$3 -1$3 +2o0z LB@5 o7T o66$/ *73 o7#u i68Z2 T9*41 $=T8 uo95 O51i6r i6" '8i6P *46o54 $HD3 i4%u $sOA1 $8-7 *05i1y uO74 $C-1 o1_ +B*9A ^r*67 s,E$B i4p*57 i6(l O61i2@ $siAi O25i3z '6$l $xO93 $c^t 'Bo8f o3xO42 +5*60 R3k $o$x i50$9 *01o6! o9uc OB3LB uo78 i2h$3 $t*13 $/Z1 o4 i4o D2O45 O96l *32D7 o1fp2 -3+1 Z1i93 *20^1 ^w$w i0MO71 O03^@ *50O23 O36z3 ^L$8 -5o62 D3l 'B$I *63ssN O72+1 z1+3 -1*12 *14i2- o2 sy? o4S ^6$, sx8*70 +2*30 @wd i7r*8A o2cO41 ^CO32 +9@s O35+0 oAv ^#^@ sp= -8o4b $8O42 D9+7 L0^f sij o9dO63 O35$n ^gu O03-0 ^7$+ iA--B -6$z *24R3 p1O5A *21i61 o4/ csL, $gi0r {i65 t+4 O29d ^!T4 sx_ +0O12 ^,^- o51O13 O31i67 O42$% siaOA1 i65R5 s%$ cstC +1o2b o2ek L2Z2 O56Z1 i5I D5i4B ^+^a se- +5*54 O21$g +7i4/ ^Ki71 *36*17 $xD5 Z3+5 o4.Z3 O63^2 li0S O62O02 z1i1s ksej s-K $S{ o1L[ sx, o2Ju *32i6_ o2b*32 ri6, R0O24 *30sdD *62o6. ^mO24 $uZ1 s1^Z1 o4 *B0 $e+B '9$' $!$, O04'8 o3H $RO23 OA2*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 O02z5 D2-4 *15*23 ^*R1 s6Wc D9L7 sai ^nstk '3d R8 ^i^g -1z3 Z5O05 @1o8! D1Z4 Z4O02 $st o1ai2s oAuLA $_$t -1s9s fO74 s0^Z1 Z1$7 *46^P O51i3q o4oc $?L8 +2*02 +A*8A o70$9 $E+4 *04l '7^@ i5wO72 $5[ *27o2n $f$1 *90O26 oAsO42 -6L6 o6^Z1 to8% -8o66 }$P *76o6a s1l -9-4 i7j *84o84 c} swbZ1 @Do7} $gO52 ^e+3 $?O45 ^_k $O*86 *02+9 rO15 svp i4r*49 iALoBP O04^q i3H i3!*93 o77*10 sd` sjH o0gp2 $A$Y o81scw Z4o6a u*56 ^2o42 ssbk ^r+A o3/O45 i58O23 '5z4 O32o2x oAOc O43*43 p1sl7 i97$5 ^dO13 c^8 *78O53 *03o0h o2m^d ^M$D lo4b $8*A5 o81*63 o3oi3k $1-7 sa^ *32$k O41[ 'B*52 di4* i2isJp OA3l -1o7m fO3A O59$H O53sln o9u ^pZ2 z1Z4 o58'7 svy '7$t O0AR0 o4< o6t-5 $,O93 o47d z2@a }s7. o6oC o1wz1 O34z4 i6\ Z1i2c *30f Co3d *24o31 o23 i2O ^%z2 *31*74 ^io4_ i7p*70 i4%+6 +0o4o -8R7 $eo0d c*21 O72-5 *47T4 *30O32 *B9O65 ^#^+ li7k Z1*31 [i4l O24$r sn.{ $k$4 o7.-2 slT $2-9 *30o82 OB3[ D1$1 *28O05 s.b Z1$b iBaO74 O51^2 i7X'B $+Z2 co50 sbJ *BAO02 o1oO25 ks2c D1'7 o4c*67 D3R2 O64-6 i9i'A O81o5+ ssFT3 o0s+6 ^?$, o8vD7 *64*57 [sLe sm` O64O32 R6[ o65O81 $LO12 i5 +6 o24$# lo0C i2: Z4$_ [i5: T0L3 ti8u o2k*01 t$V tsUR Z1R1 ^zi8" o5wsct ^dO31 $5O21 i4@@7 o3e'B ^1z4 i1-d o3t+6 L5-5 @3o8, ^cD3 O17q to2T *97*21 $ld $B$e *54o3l *72o7r ^7^3 sn8 +5D1 [-A s9d*13 Z1i4] stL i7wl -1L8 ^<-1 o6BO32 c+A ^[i1v ^"^\ O32L4 o0*z5 kssy ss=u o19[ i47D7 s23d o4K[ i4li8h $1OA5 i5el i7cc DBO64 -7i4; s; ^7-2 l*5B o0ai93 f$f $l^b O27$i D2i7i s., O04i6_ o0i+1 -6T2 i5i+7 o6q -6*70 o5-'8 Z1i2v i3zi5& o0_'2 o7QZ1 T4sIs ^@O71 rk 'B*35 skgo4 loAf o67l '8$N s13Z1 O62$n 'A$ o3R $!$3 O81$9 t} T6'9 s1k O48p1 cO24 oAr *39o58 i5s*10 o8jD7 *86O14 $&o67 -Ao93 T4o0H -8oB3 o80+7 o5Wt O12sx. li6: O42$ z1i8t '9$M $lZ2 i8x Cs04 *30[ ^e'8 soa[ o1-o0B {O03 $6L1 uo5L $;$; -2o7* *17+7 o79Z1 o0Zz2 *36^- *57$% ^ip1 o1sd +2oAs $tsbL $$O61 D5*12 *15+3 $&c sm7z4 ^t*65 *41 -0^= [i5- *41D1 O51o3L csb1 @r$g *A6O42 *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- i2vO01 +0*31 o4F i18r c*75 R6i74 sBtf o5+ i2D-4 O02'4 $2o9 ^t^u T5O13 p2O79 sztd ^kO46 '9-4 +5-4 ^6'8 T9i9_ $a$3 *65@5 sjfO37 $@*68 $e[ ^8^i o0z} ^-O92 $%O81 Z1o7e O42^I *16$R s5w p3$9 ui4C $vL6 ^kz4 O2Al }$O O98Z1 cO52 ti9, $7k i6Xt Z2*45 slM sdF sjV o2z$ ^"$" s60 }@D $5T6 -AO01 z5'8 $6*9B ^a'B ^Y*32 ^D D6s2; ^H^C $I$! *08 O86O52 i12i0f p1snd L1O35 -8Z2 @n} ^P*42 i4@o3n s2z to5 $-@j *12*68 +6$& z5O18 O71c *18l uO31 T4T5 *56se2 '9$2 i4+*47 O12q $oT0 sv? [i1y *79-8 d$p sv3c +0'B D6o3@ *0A-0 '8$@ i5MT4 ci69 o39*71 sn2Z3 *73O21 $4DA i5| skm-5 o1nl O35-1 to0Y q$e o2u$# i3t^r ^ho5. o7E o2o^@ o0t*91 '8R2 -0z1 p3O06 o58p1 cs0I {$0 O12L1 r+8 o9!O61 sp z2 i80sdz *12^k o9d$6 ds0f L6O06 -7-3 *8At $r^p $#O42 $UT4 -1R0 o6N sz7 ^M O42[ i3I -8$% o3@D4 *54+0 kss[ o4K@h p1sMw i8= {^C i6M O06$1 *49O53 *63slp o5= O24$7 o6w+7 p3i4, ^mO15 o70$k ^!O71 i3q ^t-2 o0=r O15o0j o10p1 D2o0D $q*02 i4Yu T2*03 i3* [o3c i3Si4& *34sm_ uo7I ^b*24 $7o0Z i9Tl i70t o6Fo8s saQc o2{ $7O54 st8 $1*41 p1z1 *27*76 O78l *53OB2 o3WO5A $8*68 O1B D4^p D1o2c c-3 z4o6= sqdo1l Z2i88 s3^ [szp slv sgq *14c '5o2k lo3_ O53*96 p1i4` o2_*06 o2` O91oBz i31O91 $_O75 si2Z1 [o2d s2ao1f o0ML1 {o0q $6T3 *56'7 {i1d fO36 $3i6@ sg o3l i4 D6 smg o62*56 O61*64 i3p^a p3O28 O07$1 o3pc o8cC qO29 ^dD4 +8D4 o82O21 O03p3 ^e$7 lss& -2o3j o7A *63T2 ^8$9 z1^x o4@$! @,^v $msh= *43O53 O04z2 o1p^c -0*31 $4O23 o4lo1k li51 sfy$o rp2 *61^R RBZ1 *36o3g z1$3 o2pO35 *56s40 Z2+4 O72Z5 R5Z2 i5xl T4+4 o9E -0^& *16i5a suo+5 o52l O53Z2 iBTk +6$p o7eO43 O26^t O37l OB1Z2 -5O02 'Ac o1si0g o5}s}$ s4+Z3 sAjd O73O84 dsCf $(c +1@a O82$: *35o7A o5l+3 o0ro2k Z2RA s8,o33 O56l i2/i5/ *05o00 $x*71 o62T5 i56i55 o7?*75 fO85 O53t $@o58 i7iO34 'B+1 o3i*B3 *32+5 o1k$! *64O61 'B$6 rz3 seAd ^n^t s7+ o09*13 -5T0 i40c $@Z2 fO37 $Du sngi3t R7O41 *98o7 i4@r ti3p o6lz4 i2` O83sa1 $^@m i3/+4 {^R ^%D2 o05$ i3to7n si& ^po1k *07*18 o0r^b *56$3 z2@A O16^D s2_^g ^K^T Z2o3 o5d'9 '2o0< i47o1g *40O24 sI? O45R0 *65-5 Z3} O28O0B o4m+0 @r'5 Z4$e sps Z2s1t uo83 qD1 i4hsfK -9L9 s70 o2yk T4-6 ks3H t^d '3R2 D3o1h o2gD3 i8ol o6iO12 s83o1f {o7= '4s0 Z1$9 s6$[ i3@ $KsbC c*14 -7oAD ${L5 *52^p o5tZ1 Z2i78 O07R4 $mOA4 +2o1b ^8i4d r^s $Bo3z O52d o5uO61 T7R7 @2oB9 O24R0 $m+4 @np1 O19r i8a*18 ^o*58 o3k^z R5st3 T0se4 fDB she ^bO35 *75o87 T8T4 svYT2 $>@n i3%r ^kO32 O61+5 ls/, @a*03 TAZ1 'Bo6? o11$/ shVo6m ss0Z2 Z4'8 R9[ T6$9 saU d+A i9jOA3 O01@k Z4OA5 O85o1g O05sL sct o9s+3 o4ed O02i2l $3$2 ^oL0 Cs8M -0i2n o41O02 O82-1 *03o3w o5*^o +4D3 ^zO23 O36+3 CZ2 i79 *68o0k smsD5 $GD5 {*37 -7^3 o6yl us1c i43 ^sO52 z3O01 ^#O75 O52$G -3*45 ${L8 ^:c T8$1 *03$ *40*73 L7D9 $B$G ['6 slS o1m*65 OA1i2k i9#+0 O21o0y o5kz4 sdb ^v*31 i3s-1 z4-3 $)O0A O51T3 Z1i1l $&^$ suz$s ki2n O41p2 R4i45 '9O61 lo1i o6S@c +0$$ lshj o4cc -B-9 o1-'8 ci7. $d@p c$R $AT2 ^Sz3 O25 O52^O R1'4 ^6-1 r$! O03$5 i3;'8 'B$m i17 cz2 O24Z5 o1-*74 -0i7s *78'9 *91o1a si! i8@+A R3*72 slnO43 o0LL1 o2vd {O12 $nOB4 sk@ i41*04 *9Ao9J -5+4 $it o6@'8 ^KT2 Z3o0 O04$v *40$s D5D7 ^Ti0P o6b$m ls6- ^eO31 '4o0> ^DiA! sb1 dsP +7-1 R0o1r o1do3? Z3i7x *0Bl ssop1 lo2a oBlD8 $@o5# O31o0Y Z5*27 ^b-2 O31o8r *64O53 @Rz1 +6i7u ^x T4st5 p1O49 iB0 $,$5 i5-D2 p1oB2 $D^S O03^L *06*67 D0s30 c$f i20{ o6*Z1 O91[ O34Z1 $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 O53R1 do2U o4at +Ai81 ^P*92 swx ss* +0@z ^Z$" $kR7 *8AoB3 O62o3t $!*25 lo1b i8$ *12R3 i3Dc T7-0 i3bk o0r^E r$r '6^a O72*13 o7s*A5 $p$0 $sO64 o63d $_$0 i4o+8 O52$9 *01*83 o1wq o14-9 @h[ *48O43 $,*74 p1R9 Z4o2h D2s3- ^7*27 *02o3a s0. O56$/ ^R Z5*20 i8v*68 o34^M i2T[ ^Nz1 o0ko1. s* *A0 s38c ci8r sHl $mo2r O12sna $MZ1 R0i1e *63o4h R7o0K to3" sthD0 ^y} C@6 $AD6 O24+2 *80O47 O63scH O83o6h ^(D1 l*39 seu s56 *06R7 cspv $6Z3 o7si6t +9O71 o3, ^p*B5 tO93 o2Mo85 f{ $#*97 L1[ -Bsae o0WD2 s5 Z5 @1c D5O04 D3i4k sku D1Z1 *06R0 co77 O07-1 sy! t$* skC*98 ^$*02 ss3 $"i7" D9O32 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 T3O43 i16o21 O21o2? O2A$_ csaw i1Hc $1i7? ^4} O12c sckz1 k^s O12^E $]i6: sa=$5 f*31 T0i85 i3\ Z1*68 *40i8j z3i5} i5:+5 Z3o5i $bZ3 *31'A sw7 $0-B +3$4 O06{ -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 $0O12 i0m*02 D5u ^= OA1o1a O32Z5 o0vO41 T1r -2R6 O02$g R8Z4 o7s+2 $3+2 k^J o3l^, D2-5 +9o8i uOA3 O42o3D st) o2l-8 sCL-6 s@c o84+6 o2gi4k iAmO02 $yi20 $d*19 s9, ^ci3t L5$n o2 sh\ spM *34o3h oA/ i1`*91 cso* s8^ *96sdr i3S Z2C $dD6 i5cd O62$w i7.o99 dO16 *50O16 *73o0d $s-8 @6i9! @5-B sDw$e R3t @0+9 T0s.% $OZ1 i76+9 o6X $9z1 o6#O51 *8Ao0W $ *35 D7O12 -3sTB O01o4x -6^k O04O49 s0+c D7$1 $D$E *83O81 O35 O41*78 [o7i Z1*57 D0i4o -3-B lD9 o0d$z '7q ^Gz1 *12$ -0O13 o5io6n *A6l $p*73 ^Ho6O -1$q sWC Z4-2 sxk ^2^0 o7tO32 i4_O53 +4O54 $t*86 ^x*20 *58D7 p1svg i8zO52 i5p^; qOB3 O24o21 *01^0 $?Z4 $P$# O07$n *97O07 $4sr1 ^zi8z $=O02 *67i6; stE o5vT0 i6-Z1 o60*98 si: sBO ^`^k i55u o91*74 $W ci3H o5aZ1 @2+9 i4v o0ei1s $vZ3 i57D8 oB_O26 -3+6 ^1Z4 D0o4e Z1i3| $aDA u^$ p1suk o8Sc c*86 +7i8, -2o0d *87Z1 }+9 ^ r -1o08 ^u*71 s3gO32 $?-7 i3nc t+6 *98o1d -9-8 s1a dskz OA3$f o2e*89 '6$p $9*04 *43*47 o8<*78 O82R7 '8i2d sor{ OB7Z2 o0sl ^P *A1i2+ *57o7a O51$; *65$n O14i4+ -6-9 OA1oA6 i7Lc [*72 'BO51 s0b *89Z1 }'9 z1o2_ i7/ ^a^h '7} koA7 s6o$7 $!$) R8$1 *97-8 ui54 i2no1+ *01soi sSF *32i1u ^Y o1Jt O39$ o4v'6 p4z2 saqZ2 o6i[ C^X o5? i4u+2 +1'2 $1DA *83+3 '9i8, o0M'9 o4x-9 O26z5 DA*BA ^Ez2 o1;O32 $ri7t o0p*59 *32o3h sIiT7 '2o0, i95oA@ *6BO84 $(R8 i5pO12 *3AO24 o8v }^P DA$+ $n@0 '5+4 o9xsmt O83$# +6*60 +1$t D7o8z O63i4s DBo9y D6o5_ i6V f^9 o5Zc i0:O32 i0h*67 oByO38 '8i4_ [st o5q*40 $TO03 i3KT0 s4oZ2 c*68 *52+1 $+O94 ^FT7 [$v '7$e ^gD4 i6 +8 ^w^M o7.[ sW7z5 O93c '6^G o4pk *69o67 C$X '5^b *31@3 i71O25 o44+1 o0p+3 p4O03 s34 ^gO52 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 o2TO74 $uO34 Z2$4 *67*85 t$X *07R7 lOB9 Z1iA^ '6i4g o5_u L8*08 iBu }L0 ^zO42 +2z1 i2p su_ O91O06 O04Z2 i39 ^jO21 rsJ! o9$ D4o4/ *53^& O62Z2 i8mD0 kR9 cst` p1i5y o8d} ^ d saz p1*03 k$e i4id Z4$r o4Kl *4A O63R6 O71*53 k*07 O92*98 Z1o8j O38 $G$A $pO92 '7$n o52c o3sc $3$k O52L4 c^G *B0'8 s - $cO73 r$] D7skt T8o5l t^q sIR O51z1 *01^v i1Z Z2o8n s6_T0 D3sVF }O37 ^ho23 +7$g '5o4d *A9oAy i2 ^k L0Z1 o28z1 i2D *34} O53$H @ML4 $xOA7 *43*48 i52-2 s8Wl O87O21 *09*91 +8O08 *18O75 o28*12 -0z4 o1md O64i6< sra *83D5 $6i8t s1_ Z1i6/ $1^z R3s1j R5s1n i9Ec cs2* *03*41 ^s-3 o5V doBt -6-2 o0D$ *17O42 $%+8 i5D sj-{ T8D2 D0$t sB } i5/T6 O01$p T6$ z2i1o O51*68 p1LB O63Z3 ci4b s2 }OA3 p2O73 ^m^W str sze p3O04 sb6 C*9A Z3{ i6( i3Ll +AD4 o87+0 i41$2 $t+9 @io4e ^mO32 T0d +4*23 i0w*30 sl2 Z4sj! Z4i4, D5i72 *74O31 s5* D3o0S ^3O14 L7*13 }$r $1*28 tR9 i3wp1 o45Z3 o1xu $8^b 'Ao7l $x@c $/O75 $1^I z3o0f }@b D8$b o3j*62 *70s+' $[L5 i54-8 O05$/ so; O62i6a LBiB3 i0OD3 *05Z1 p1*91 ^c*30 O75Z2 [i1P i5; Z2o2y O41O61 OB7Z5 L5d o5yu }-0 Z4Z2 o2l*42 o97[ o4s-0 o4f*04 o1.p1 O21i81 $t$ O54T5 c+4 O62*01 i3i$x syV sa.O41 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! *76O41 -B*B0 tO71 $3$* *58D4 i2a-9 i3hZ3 doBm o0A^Q s +[ i3w*54 O52$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 $mO72 i3jk tD3 O57$0 o5ri2 o1z^j ^8t *04*73 sul $*@5 -1*43 C^0 o8-Z1 o77k T0s. +4o3g o8z} i3? ^aO61 ci1i O52Z1 *9A$3 ^H^R CT9 -3o97 Z5OB7 sef z3o8 *94O06 s19Z1 *53$L {$9 p1*17 i40D6 -2f '5$2 O45{ p1o1a i2t'9 O93i9e swfO94 s09O81 [o0F D2^N o03-1 ^k*78 o6&$2 o5k*42 sGj CssN O13p2 i4z*64 oB5*AB i5oO23 O51i2T i5r@4 sd7d *84$# ^1l oB[O12 i27i0H p3D0 $%^g i80[ o5W[ sa@c sauO43 DBsbl o5F 'AT9 ti03 ^$o1p D4+3 *46{ z3'8 D4T1 i59O02 -7*76 ^3^7 +2i2d '7$J O81s21 {^9 ti3L f$9 O38^s @o i5g{ d*68 *5AO06 T0*43 -2$4 sHa *76o6g O62@U i4g$# *06T4 '3$L ^o-3 o7ft $kC sof stBscl D6*05 ki7d O54^[ Z1o3n *08'5 i0PO83 -6sS @8^3 O42'6 R2r +B$f D7o1h *54i6t qi01 do0t *60o3R '9^k O12l o3dsmF $.Z3 r*57 Z1i6f O05z2 O71s2x o6ci6P s06 ^a*20 $XO62 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 O14sa? O02O35 +0@t O05^_ o85o7y $r+6 ^Bu '9O06 sl4Z5 k*54 o2D} iA7o95 ^i^s ^1o3w s41 O62-8 'A$e @d*96 u'B kr *97c l*B9 lssi s39DB *81d -1*21 Co2( ^g@a o7L *41O21 s7^ '8i02 i3# $h*37 s9w *7A ^M+1 $aoB8 *42^w ^a^V -7o5g '7sat i4i+5 o1E Z2oB5 s5=O42 o73*36 Z2sxn $-Z1 sdt^v p1o7i *76O52 o5r'8 }o0b sn+ i5y^C i5W s3F +9sif o6WO83 $nl p2O8A T0+0 Z2R1 lO63 *37*87 i0yz1 o4lu *06i2, z3o1c sid*91 O94*31 @p$* i2oZ2 +2^8 su ssyO32 dO74 ko0k *46D4 *B7o3a D9r o0?^! z5$; O02i2^ oAn-1 Z2O13 s31o77 $6$m $.^= smO'5 D5*65 $p*86 *84 $g$N $G*75 ^@O15 *03sjx i80k ^li9n O72^2 skB p1O08 oBk D2o6B i2El o6%O83 i32$% +3o4i i2sO02 [o2t skp $>Z3 $9OA2 o5.*45 O61$p $uD9 O41sku ^mo3n ^f^0 o6R p2i60 Z1i21 D4o13 '9o4j o6 O72 *02$i ^&$; *ABoAz o5CT6 O01L3 s3u O67+7 sm3*24 *3A'8 [*09 s1w-9 ^7*09 O85*67 ^t+1 OB3$6 O64$! T4$3 rstk -5o6= '5o0m o3_Z1 ^7q $b$l ^2o1Z $%$f li15 {T3 ^Tz1 slt*50 +8iB9 '7*30 O92i20 *61-4 $1@y i5-D0 -3-0 O17u ^7z5 -Ai82 O02z2 *57$n i0n'A s5.O23 i3a[ ssW T8i4 Z3o6@ sgwp1 O72sa1 *45*01 {O92 -Bs21 ^1o1f $*^k i7sR8 D6$7 o7MD8 $ko78 @v o69^n D6O31 ^Wi5j o7@*97 O15z3 -6*85 ^A+1 svd O43+2 o09*54 skL-6 ti5y ^FD3 [*02 O91o8_ i4\ [$a +Bs7a $s+4 i3f-4 $gO73 z2i3p ^m-4 sC6t +4*86 ^g^w i7K i9Sl @e p1o6d *20s9! o4Ct *90L0 -4O82 O27d o9y-5 sysZ3 }*63 oBs sx[ ^Md i6zo5s sle Z2o1- f+6 sa2k z4L5 o4Lu R1$7 O81*78 *32p1 o3ct T5*31 -5*97 z1@b uR5 i4/O12 o3S o7ho8i o7j{ $w[ ^@*62 Z5O52 O71*86 *54$ $7*87 i5ei8i ^{O06 L9 D3d sHn $h$z sakD6 -1^0 o0Y$r O03R1 qO83 snm @-$a *25*54 O59*16 i93-1 [i1Z i7uO84 +8+7 [sez $x^! $j*A4 *5AO73 *A1O07 '7u ^p@m oB8Z1 D4-7 o48Z4 o71o1t '4c D6$m +5o79 sS^l +5o9y *03i1r sCM*68 kd Z1sb+ O13$. *79i9n i0g@C *14z5 s9! @j[ z1f o2;*31 $aswc *07O58 Z4s93 o1@*21 $ O26 $Kt '9T4 s @ s97*67 i3Q i5w*57 shvO46 *41^v o9ko8d $vp1 O84l sv0$! *A2O76 $W$8 o0['2 O06*20 o8c[ @nsC8 $0o87 *89o7p Z2o0K ^Io4m *73O31 o2t$e o6n$4 OB1-B snz'7 o7?-8 '7+5 $J*80 O32o3@ T2r L7O82 {$` $,o0H D3o9c sfs -7$v l*74 C*61 uOA1 ^pu dsgr -0D1 $no9e o4q[ i7_D2 ^7Z3 O51'9 O42$o $ O19 ^%z5 $3r @g$ o0a^f R6ss8 i1t-0 D0O56 +0o4i O89i1g T5[ qi24 o2rc $zOA2 [$s i2LC z2@2 $5O91 -0O56 $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 $aO31 -9O25 TAT0 *20O41 O94O81 i71+8 to06 ^|l T1[ ^.^, dl o6aO42 O61$| L5Z3 Z2DB i2k[ +0i2j o4p} i31p1 kz3 i5eO23 '2$ s7} L7o6h sa/ p2o0l o5TO72 O06O32 i6Yt s@+ *37$A o0f$1 $U*37 '6^j $;O02 s2L R0^9 $qL7 T4o8o L1o2n @9*A9 i90c i2! s1!Z2 +1i1u *A8O35 tO91 p4O94 s#+ i2/ O27*A9 o1tp1 LB@2 D0i1V *13sc2 D5*46 DBO05 R9Z5 *63$j u$o -8o6b +6s57 i6Psf6 s8 ^T^Q -1^i i8c*57 o8e'9 O61o68 s58+8 *35*24 ^!*40 T3Z2 *18O62 +4O62 sa+ o5u[ $;*01 sdc^B $2z4 -3sCg i7_c $3^d o6= *28c *52 *65'9 i9P o13Z1 *B9o2o $.O05 s28T0 p2D3 D2'A o1ai4- L3-5 *B2O89 i3m+2 o2rZ3 o7kr $m^+ z1^ s4n^M o71$7 ^3o2x +7OA2 ^Iz2 sdbO31 i1,i2. *49$2 z1iA1 p2O95 k$q co32 '3s.` [o0q i47*47 sdXr $#+7 +1'A p1o5y s54 o3h[ o5-1 ^w*53 +1Z2 O04$3 i5# o0_ O14{ 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 O24o4 -5*46 $D$I i3q{ i5eZ1 R0^s i1:} sgjL5 *12p1 o3t^s sxa o3Cl i53*81 o64i3r O03O94 i5f*03 D1i5+ o5{ ^1c o2r$. i4T o55Z5 i6nc $6^6 $8O63 oA1+9 R1$0 O83c Co4b o2R i2d-1 ^k+4 [$b O42^D -9$! *63o1l o0rO24 O05c s2t s9 D4 *54O12 f@6 sfd i76D5 i4cl o97^! s5bL0 i5-$3 i2G i7]} [i1# i1q{ @m*AB i83-7 Z4*A8 ^s-1 *BAc -1*27 O73o8! RA$0 $6*B9 @uo53 z1$T i1d*65 @l'9 p1OA7 $f*91 O31$8 si+ +3o0d ser*26 z2*65 o2 ^? -8^1 sui*23 oAak O91s92 se. *36*28 r@e O02o1. D2Z4 o5& $eL8 $OO53 $+@3 *3Bl ksd3 *A0T2 o0$*54 +1+2 $A$a O62se< O23o36 to1B T0+1 i9/D8 i60*62 o4X +8*70 T5o4} u*63 i4fp1 se9 i0/i1) o5X o8%O31 D1$$ O47c 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 $@O12 O56O74 scZu D3$? ^ri4y i7h$2 T4r *67s1/ ^sp1 @c*24 sw9 iA_O46 i2_l o2g$# Z5$8 DBi01 i9k*A6 i0Md o3nD2 O54$. O43+4 OB3RB qO19 i2rO01 ui4O $8q i4w'9 O81o8- *0AO7A *02o1a O32Z3 *70Z1 $<$1 -7i68 oAl'B $Ft o0fRA O72o6u oA2$! $_d o7Uc tO62 $P^^ shM $3-8 $9{ +6c i21^2 s54-1 o4wf O12i5 s!2 p2D6 {sue D2D2 sa2 *95*5A sls^a i6d*60 i4A '6i3m i8zO05 +8o7_ o2G *7BO64 i56+6 o5t+2 +3o6e i0zz1 T5*45 o28l Z1i7N +7R5 o4 L5 *67$0 sreD5 ^u i4 *81 *59o90 O43f slm$w RAOB3 }O21 @u*82 +AO62 s 5$8 O21-0 *57@9 sjf*7A $aO02 ^%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_O05 sLF s6, $"p1 O13L0 D8$f Z2O26 ^L$i +9$. ^.-1 $6+8 *01z2 ^lO36 i6aO05 T6i0N $-O12 +6$! ko6f o7W'9 D6^t p1sGb $sO43 i4k[ O01o6, $YL7 s38O52 iAnO64 i4M+0 *53o8o iAe ^c$m *50u Z2-A li1Q {$x co0r i6y-8 o91Z2 s8j l$7 O73t [o41 *83i54 to66 o7or o88o9! *94O73 o6o*61 '9i6* O42sa i5.T2 Z1$% co2$ $tO02 O15O41 o9% -5O03 o3sC sfJ $2+4 }^6 saoZ4 i5_*97 O56*28 ^jc ^lD2 *36T9 ^.^f Z3sdz -5*74 skf O74$# o5w*75 o0mz1 Z1O52 *97D1 o7W T9*29 s8* $4sdr siG +1O24 -2o4y k^h t-3 $dO02 R4D6 i3N p1D9 i52$A i1b+9 o2*z1 p1O57 o5GD6 -0+6 t*37 srZ co3- s29$e sqw sf+z1 o70^i uo3s Z1i9s o0({ l$% o73$+ ^1O73 i8hR7 *68^? T5o7h dsS i9.+B +1$f *54O23 o18^M @2o94 O13^e o3h i8! -8q $m-0 o5,Z2 O05q }i7g s7! i67Z1 Z1O83 lO76 o8gk s3j $liAx }o0v ^Eu O02$" oB O0A O32o2 i33i40 *86D3 -9*01 sfc^k $7$j o58Z4 p2z2 o0YZ4 d^s i8aO53 *76*34 O04o51 ssl O64$@ O03Z4 i6[ @5^9 o0vl O63@f s* l*79 $+Z3 *59D2 $b$, s0! DA$b +9i8 fO5A ^7*35 D6sng ^m*08 o3+D6 i0}^{ i7aZ2 +8*76 *40D4 D9D4 O71o6j ts52 D7$8 p1o7d T8o04 'B+5 DA-A -7} $b^h O08i1a L1R0 $\l o13$_ Co4F l*7B ^0z2 i49p2 o55*78 o3Ql $ $m R0$8 oA+ +7*98 @v[ $ED8 $fZ2 kZ1 '5o1g RBO02 $o+4 o8.$1 $/s1. i4s@b o50^b $]i3[ i1to4e p3Z2 o82*79 ^[L0 Z3su- $Uc i6l*83 O02O13 $7sgc sog o4m*07 o59d ciA2 cs2I ti7P tO26 $3O92 z5O61 c*58 $I^R O21o9x $ki5f $ sMP o3F $+O53 slc i1C{ O32D1 -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 $9O72 T5T7 ^8z4 ^d*0A i18 $++7 Z1o4! o5) O81D1 o4Yc o4qD5 R4*30 i6N *17-8 smd o0g*34 O24*36 i5c*24 $2O32 s!^ D6+7 'Bi5n *73$_ s1L Z1i3: i3go98 *58O91 [$3 +4'5 D7i1q $2D4 Z4o8 *56o2l *89^q ci9G @i T0s8 i8_Z1 lo8d O23$l +3T5 o5u$3 $8O41 '4^d $di0t ^mT5 *63o5t *56Z2 i4/ *84u O32@= +8$g ^v'6 -8+4 +1D7 sgr +8^a O03o66 o5hi5C R9+4 s8t[ ^eO46 O16o3 s9_r d*45 o4^l +5l -1^3 o80i0* *82T5 smr *74*94 OA1DB O84*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 ^nO31 *48i5K O31O43 csgV o7y^j *5A o0hu o7- sh^ i3| ro0" i3Wl $fT0 *09O03 Z3$1 Z3O54 o6a*36 T6O12 -7s., $r*A9 suoo4! *20o4 -5+8 i42c 'B*97 ^a$v +2sui i7,O25 *31O24 $1s7_ '8o0E sa; $$i0* $_O25 o4.D6 O01i8i i7D^1 *30*43 o02Z1 o6t} o4loB2 $Jo1o shb o8rZ2 $]o4[ sgi ^c^a sa7Z2 O52^$ s52o71 $5@w p2O56 {Z3 ^@$ ^fi10 O93O07 *08O45 z1$h i4tD0 D3T3 o8: p2O02 *26o3G D5l D7$ ^9O31 O27 o7 @6 -2'A @1o64 o3lo0H s30*65 $+^N so^ to75 O41^K O82*48 o94Z1 -6o5z i4o-3 *74L5 O14R3 sly D5$w p2i4 O17{ s0 q O68Z1 D5o7D o0w*05 *73$m @5$7 o5n{ sBZ o6 $k i5T O89$i ^Bo7X O0B$' O72^m sa? T5-3 o5/@g s3@ s1& ^9$G 'A$? p4Z4 O12s81 sf6 sb c +9D7 ti5N T9Z1 sbyl $$D2 *45o6` qo0s s7OD8 co1A L5*34 *78O62 $*i2e $r$! $k{ i3h[ i5x+2 sAF *01O61 'Ao43 i1r ti9N oA6 $p*64 O01*38 R6^! o0bC [L0 ^2i5d i7Ml ^n^n *57i3s o4pD1 L0O16 i84+7 -4*03 CsO= i3@k Ci21 *75$m }^$ fi41 '6o3t OB3s7f i0oz1 si z5 $+sla z2o4Z +9D0 ci6b O81O12 z4c i4< snq i37O03 i4!{ *46i5g srXo3k ui6\ D2z2 i69+7 qO26 o99*19 o0yr D6sGM O23L5 O73R8 OB1o1s O05$+ o5a+9 i3l[ $$i01 $@O02 O14-1 *76scv o5mk @eO12 d+0 $u$w L7*17 *27^2 Z2o9! D9o8d rR0 O71T7 @1^a *15$u i2w*03 o1rt i4Nu i6=c p1*7A Z3RA $;u z2c O52'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$ $][ tOA2 $2l srHO21 -3^$ ^.i1/ i5` [i11 O09T5 T4o5i +6+4 s7v OB3O17 o83*65 D7^n fO83 D2$o O94O26 o2zT4 O62^a s5. slz'6 O06'B $1*89 sws$9 -3*75 li8t +9i8d svjO52 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 O23siL c^ O23Z2 o7: *32*25 *53[ {^0 o69s74 $k*A8 *40O27 $;-7 $3^N i02^l s2? Z1o07 scj *57*06 i52R2 *87i88 fO75 ^n*03 $p*61 sw-r *9A@0 $s*68 {$s tO42 ^fO61 z3@d +4+3 [o0S *54-8 sgw$7 *43suo p1o2r z1*32 i5zO14 D6i01 Z2i5r o61O76 O23^m -2-1 sH@Z2 o7m+8 *46o7E O03z5 *06*15 R7O43 O56L5 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 R4O51 sc7Z1 s;Hu *87$7 o2w $rL5 O43d z1sf_ i8=O53 *24i6^ @1+8 }o2# O72T2 DBsab +3o8a sAZ O09o2 Z2i5x OB8 oByO26 $fO91 $8*23 *76-9 L3{ $dR0 o1D*21 suw *19$2 z4-2 O48 'B@z ^p'A *72'6 {^E $4*86 *14i0m O16 $!^% i3uc +8} o3rO42 z4z4 o0v'5 D6o2w Z1o5c Z2i7Y $6O73 o7H ^Mi6i O54i6i $5@6 $7z2 o8# -0O25 Z1$n sp< {^8 Z3-A r*14 o4xc z4l $t$g ^Bz1 +5D4 i5oL4 OB3l o8Kr ^yO41 rO05 s!(D5 $.$$ o2B-9 O16^a $yO04 {*65 o3P z1+2 i0Dz3 $*^+ Z2o5F $i-9 sO8 ^pz3 L6O4B O07-0 $pl O25l 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 O8Ap1 $:T6 s-@-8 *56o6q [*76 o1up1 s46 C'5 i8t$0 T8O31 z1^G i4cc O58 O61s8m T2i0y o8=s_g p2OB9 li5e -9Z1 Z3p3 ^3^< *78$6 z5O24 R0R2 p1^a ^4$s se7 O41Z3 -8@6 i9m Z2O28 -0-7 T2$! s[iT0 O62i6m OB2C i7es17 Z1^h o67$A *75o1h o9bi9/ u@E $+-A s53T0 L7$4 Z2O21 T5*67 +4o0t O05D3 *0At -1'7 $8O92 '9i2l -2Z1 sl_ +8R2 i1" $_$s O71$E -7Z3 +5O62 Z3o0m o8l-7 Z1*97 ^vR1 O4B T4O8B *A1O16 ro6U o6!k -2o0g sZ+O01 +9p1 sL3'9 co64 o3Yl i4rO91 i3!c *01o6. O23i1b i35 R0@o D2p1 '5z5 '9u o91*A9 -4o7e ^sk fZ5 $a$6 *A9o9J $G$E i1V o27+8 ^l'9 z2@i O13^S z2@q '8$h [i1w ri1k '9$1 $F*23 p1*69 $AZ3 sn7d ^az2 li1\ Z3O63 *14 R4*64 o1%z1 'Bsoa *09O34 p1-3 -5sb- i4,c sdc-3 sf7Z1 O72z1 $r$n i3$ o93D8 -5o1_ {$2 s.7 sndO02 $E[ R3O73 z2o1l O34O52 ^di31 o1ii04 D8@7 T3si1 o4$Z1 '9R8 z1t o6 @a $ro6 *07+0 Z2o2d +4$N o87O52 $m*28 sy5i31 sO% $g$s C-7 -8O61 i4=*86 Ci9v qt i74^3 i0" O83$M sm- *A8s0x o2# @Sz1 ^4C o4dO71 [-6 ^r'B $TL6 o4,*06 ui6r ^iO12 '9*83 z2*74 *53q -4-2 o2Vt o9! sA9 O54$y Z4O13 ^O +7oAo $#o69 $4Z3 +3^b fOA8 +7u +0*37 sfm z1o1* i5H *41-0 T0i3m O02^b -2*26 $9@O O19p2 O04'5 p4O1B T4O02 d+B se,$5 $od i7mT4 *21i4t i62Z2 T4sc$ O93l Z1o5C s7x *41$z *B6*89 sOK [T1 O14O32 o0kc o6.^m -6i62 O09O54 Z4D1 i5oc O18R0 $' O13$y i0vd p2O45 ^kR3 p2Z3 *75o6e se [ i1G *86o30 -8*53 o7zo8o i4K$4 $x$t z5@a O08*63 R7+9 smlk o8dD9 o0D'9 o7$'8 o49 s1cR0 o9` s8d o8kO23 ^1O56 ^ *20 o1eZ1 R0$} *67s- *15f ^m*40 usLH Z4i0= -5*16 +0R6 $N +7O41 o54p2 *85+5 $Gr z2o1- *49O24 i5nZ1 scF oBE o0p-1 uO83 *87o7z s,G -B@r *43$3 $!*04 $5o7o *01scx T7@E -5l +8*78 $9o84 O52o4g *45s2_ sau '3sd: si[ $9$O *23*86 ^s+2 *35o2m sZb T7o22 ^8p1 @%+6 o0fO32 [$: +7sfb [o4t $s[ s9@ cs2m stw T9L9 o4jo80 D3o0N i2k+4 li67 iA7 $/D3 spyp1 $< s1$ $0*67 Z4O15 @5R3 D3i7D i3o*20 $#O61 ^p'5 sDm O12i2k +5L0 o9A[ ^Ui10 Z3^# s5V'A z2*51 $U tO03 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 dO65t dO64u duO64 d t Z2 d t y4 dtO65 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 $1O71 -1 ^X $1 $W $1 $D ,1 .2 +0 $X *02 y4 y4 $* ^+ $. $- $. ^* $? $/ $| ^| { { { ^z z2 ^z ^d ^Z ^A ^* z4 z3 o2Q Z2O32 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 O72 $*O05 O04y2 O04$6 O03-0 $*O01 ^w ^q ^w i0e $& ^W $v +1 udOB1 ^t ^z t Y5 t o2K t o0$ ^T ^D T4 L7 T4 $1 T3 t T2 T3 T2 t $SO13 $S $W $s $e s=+ r Z3 ^r y1 $RO54 $r $t r o1_ ^r l r i7z R2 R2 $q Z3 ^q $. ^P ^A p3 D5 p2O75u p2uO75 p1O08 [ ^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 fO49 ^e $# dOA3u dO53t $D $W duOA3 d u +0 dtO53 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 $. ^bO52 'A Y2 +A $\ $! ^a ^9 $4 $9 $% $8O73 $! .8 ^/ -8 ^7 y1 *63 T2 +6 $# $6 $= .6 $* ,6 $! -6 ^_ ,5O03 +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 $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 O61] O42^| O23*02 O12f $*O12 O06z2 $,O05 O04^Y O03,2 O02^4 $WO42 $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 ] 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 p2O76t p2tO76 p1O53t p1O06 p1tO53 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 $m *73 ^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 ^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 $6O04 .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 O71c$2 O71$2c O52$t O41$a O37t O1A O14C O05y2 ^W $L $v ^c u y5 Y2 u Y2 y5 up1O06 u d +7 ^U ,4 ^! ^U ] u ^t z2 tp1O82 t i1l ^T ^G p3 ^T ^G t ^a T6 $\ $+ T6 $* T3 $# T1 $s ^Y ^S ^W sP* t so* $s ^i $s ^a s1*O42 s>. $r $a $p Z2 ^p ^u ^p i0P ^p $g p5 ^J $j p4 o3z p4 '9 ]p1O06 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 KO07 $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 $DO52 dO49 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 *76O13 ^7 *65 *75 L5 ^7 $! *6A $O [ $6 $% *58 $5 -7 .5 $. *45 *41 *40 E ^@ $4 -3 Z1 $3 $A *30 c } $. ^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 O61Y3Y3 O61$* O51$C O28t O24 O15z2t O15tz2 O08z3 O07K O04t$* O04$*t $x $\ $w $s ^W $J ^v z1 ^V $z ^V u z4 z4 u Z3 r u y4 Y1 u Y1 y4 ^u K u $D $A t Y2 Y2 t R6 R6 t ^Q z5 tp1O74 t $h Z5 t d D4 $t ^b t ^9 z5 T3 o05 T2 T0 T1 *71 T0dO06 ^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 '5 ] p2 [ p1 Z2 u p1O12{ 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 $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 dO32u dO05 d u Y1 duO32 d t d $A d ^A D9 D5 ^x D4 $a D1 $4 D0 t d ] [ c $@ Z2 $c ^s C i5T ^C ^I cdO05 $c ^b c ] ] $b Z1 z1 $b z1 Z1 $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 $# ,8p1O06 $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 *2BO14 .2 ^2 $1 Z1 $1O93E +1 $v ^1 $S $1EO93 ^- $1 ^0 ^c $# ^# $. $* $/ $* ^? ^/ ^Z $z ^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 $@ y3O63 y3O62 y3 o6f Y3 o0d y2 o4; y2 o1c Y2 $a } y1 l Y1 $. ^/ y1 $x ^z O82l O43$1 O41$* O41$. O3B O27y2 }O27 O26y2 O21^y O12C O06z3 O06y1 O05c O02$0 $w Z3 $w $u $w ^n ^V $E ^v ^c ^U $Y ^u t y5 Y2 t Y2 y5 t o3. t +A T8 $8 T7 T6 T5 T6 T0 T5 T6 $! T5 T2 +0 T1 $t T0p1O07 $! ^T sZ* t ^s ^t srh sr* sJ* t $s $b sa@ s21 ^S $! s>< ^r ^I [ r d R3O43 $Q Z2 ^P ^V p4 p3O51 p3 'A -3 p3 -3 'A p1O06c p1 i7. p1 i7 $o Z2 $O u $o $P $o ^I oB3O24 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 T8 $l T5 l o4i l o2m l o11 $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 $o ^G $f $G $1 ^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 $2 $# +9 ^* -9 '8p1O05 $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 ^zO31 Z5 z2 Y5 Z5 Y5 z2 z4 K z3 { Z2 Z3 o7% Z2 o4d $. Z2 E $* Z2 c z1 o4* Z1 $? ^Z -1 ^yO31 ^YO14 y5 Z3 y5O73 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 O73$8 O71$; O61^J O54R5R5 O52R5R5 O52$D O51ud O51du O51$3 O16C O15u O14c O0Az3 $w [ ^v $v $v .7 ^v ^u $s ^U ^C t z5 y1 [ t y2 t y1 z5 t y1 t T8 tp2O65 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 l } r l r i6c ^r i0e ^r ^A R2 z2 [ r q C -5 q -5 C $p $l p3 r p2O5Bu p2uO5B p1 Z2 t p1 y4 u }p1O06 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)O25 o98 o97 o8# C o7? l $o *75 o7! } o6U o5D o6u o6o o6e o62O51 $) o6( o5q o5 E o57 z1 o51 .4 o4@ $1 o3l y1 o3g o33 o1yO21 o1y o1k K } o1d o0@ T1 o0* t o0m Y3 o0h ^s o0g p1 o0e o01 ^N E $n ^M l z1 lO54 l t d l R6 R6 } l r l o6s ^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 ^JO35 ^J ^T ^J ^A $J ^* i7( E i7/ D1 i6kO12 i6@ k i5, Z2 i5g ] ] i4H i4H i4. ] i4_ i3 y4 i31 ,4 i3 i2z ] i2r i2pO42 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 dO62u dO31 ^D $v duO62 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 ^r D2 y3 D2 y2 D2 t d $2 t D0 p2 ^d $* c Z2 $C Y1 $c Y1 $CO32 ^C ^M ^c ^f c *65 Y4 C ^1 $B ^B $aO63 ^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 *54 $. *53 -0 *43 -6 $. *43 *40 c +4 -3O03 .3 o13 *35 .4 *30 $b $2 Z1 ,2 Y3 y3 ,2 y3 Y3 $2dO04 $2 C .2 -5 *21 *54 *21 ^+ *20 $! $! *20 ^2 $& $1O52 $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 *05O51 *04 E *03 .3 $+ $. $& $* $$ ^$ $! ^` $= { $. ^% $& ^@ $@ ^Z z1 c $z Z1 z4O0B z3O08 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 y4O09 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 O73^# O71$. ^X $7 O51p2O0B $*O46 O42R3 O31^r O2At ^\O24 O19 O14f O13*43 O12^\ O07y2 ^w ^h $! ^W ^v y1 ^V ^s l ^V l ^s $$ ^v u Z1 y4 u y4 Z1 $u ^t $U $E $t $i TA ^1 T7 i6. T6 o1) T4 T1 $* T4 ^s z1 sX* $s $w s.V z2 $s ^U ssg $S $s $s o6f $S $J ^S i0E si* ^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 p4O53 $p *42 p3 Z1 { p3 r d p3 d r p3 $8 $! p3 p2O6Au p2uO6A p2 r l p2 l r p2 '9 p1 Z1 u p1 Y1 u p1O84t p1 u Z1 p1 u Y1 p1 u i71 p1 u 'A p1tO84 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-O51 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 lZ2O24 l Z2 lO24Z2 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 iA# E ] i9s i9L C i82 l i81 i8 i7_ Y2 i6xO03 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 fOA2K ^f ^n o0b fKOA2 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 dO94t dO14 d u D5 d u $0 dtO94 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 cO31$9 C sI& c oA0 C o11 ^C ^F ^c ^e c$9O31 $$ 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 ^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 $0O02 -0 u d -0 d u *05O23 -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 Z1O61 Z1 u y4 z1 o4l z1 i1D z1 i1# Z1 $a Z1 -3 Z1 $! $Z $1 $. Z1 } z1 $* } $* z1 $Z ^Z Y5O74 Y5O23 y5 t ] Y5 p1 y5 o7c y5 ^A $= Y5 y5 [ y4 y4 C y4O64 y4 o4v y4 o0K Y4 o0+ y4 i4r y4 i4 Y4 $1 Y3 Y3 y1 ] Y3 Y3 Y3 y1 Y3 Y3 i7- Y3 *35 y2O42 Y2p1O07 Y2 o4d Y2 ^L y1 Y3 Y3 Y1 p1 'B y1 o67 Y1 o5c Y1 i6X $. Y1 D1 $x Y1 t ^X $x $x t Y1 ^x sxl $m ^x $m sxl $x $d $x $c O84 ^#O62 $.O61 O51y5t O51ty5 O43R3 O41$1 O31k O25z1 O24o73 O16z2t O16tz2 O14t O12dO04 O08p2 O05z3 O03Y3Y3 O02+5 $w Z2 [ $w [ Z2 $w Y1 $w i3s ^W $v $V ^v svM $M ^v $M svM $u Z4 Z4 u Y1 uO34t utO34 ^u ^s u o1R [ u ^K u $A $a ^u $1 t y4 ^t ^w t sD4 ^t ^S tp2OB5 t o3X $t ^l ^T ^B T8 T2 T5 o7o T5 i7! T4 i1& T4 i0/ ^T *31 $. T3 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 ^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 p2O5Au p2O38 p2uO5A 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- { ^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 KO81 [ ^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 ^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 i5JO13 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 $h $b ^H *32 ^g ^r $g i2j ^g i1t ^G $F p5 $B ^f ^l $f $b *10 $f *10 $b $f ^e ^w E T3 E q Z1 E o6Q E iA# ^e $E E D4 $7 ^e ^9 E $7 D4 d y1 u dO73] d]O73 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 cp1O03 c o6Q c o5M ^C i0T c D4 $2 ^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 ^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 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 $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$ *01O17 +0 *12 *01 $. $. $# $$ $* [ $- $+ ^( $) ^! $* ^! $! $z $Z ^z ^l 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 z3O47 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 $! $y Z2 $y $u ^y ^f Y5 Y3 [ Y5 [ Y3 y5 y1 u y5O75 y5O74p3 Y5O23u y5O03 y5 u y1 Y5uO23 y5 u } y5 } u Y5 r Z3 Y5*08O53 $= y5 Y4 Y4 c Y4 Y4 ] Y4 ] Y4 y4O02 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 $xO31 OB2i7i O91$U O82 $.O81 O62u O62i36 O61$? O51o0p O34u O32$C O32 O28y2 }O25 O21$= O17Cz2 O14^\ O13i1R O09z2 O06Y4 O04K O02$1 $X $W Z2 ^w i0p ^w $. $v Z2 u z5 y3 u z3 y3 uO52t utO52 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 ^sO51 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-. ^rO41 r p1 E RA K R6 R6 D7 R6 D7 R6 R3O42 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 ^,p3O86 p3 l } p3 } l p2O84u p2O64u p2O57t p2O12{ p2uO84 p2uO64 p2tO57 p2 p4 p2 *74 p2 ] p1 y3 u p1O72q p1O34t p1 u y3 p1tO34 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 o3RO12 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 { $J ^j ^j i0w ^j $d } ^. ^j $iO51 ^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 i3LO53 i3b +5 i39 $. i38O71 i37 ] i2z i2t T3 i2K o2w -7 i2K -7 o2w i2iO63 i1N C i1c ^a i1A y2 *30 i12 *7A i0y $y i0l i1s i0h i0f i08 i0e i2c i0C ^L i06O03 ^H ^N ^h ^C $H $1 ^H $1 ^g z1 ^G ^S f Z2 .3 ^f $z f Y3 k fO82u fuO82 f k Y3 ^f i16 $F i0S $f $g ^f $g f .3 Z2 $f $1 E Y4 ^e p4 ^J Ep2O0B 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 dO45u dO23u dO12t duO45 duO23 $D u i59 d u +7 d u $2 d t y2 d t Y1 dtO12 d t o11 d t ^1 d t [ d o11 t d i7; $D i59 u di0eO04 $D $d d c 'A DB d 'A c $D $a D8O51 ] 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 ^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 $c $b Z2 ^B Y1 ^b ^u ^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 $aO93 $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 [ $8 D0 $_ *8A *87O02 *87 $% $% *87 $. -8 -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 *67O13 -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 *50O23 +5 ^! .5 $@ -4O51*34 ^4O12 ,4 o1G +4 o10 -4 $c $e *46 *53 *45 ^7 *45 $. .4 *43 ,4 *35 -4*34O51 *43 $0 $4 ^1 *40 $B *40 $. $4 $! $^ ^4 -3 Y1 ,3 o0v .3 o02 -3 i3 $3 $D *37 +3 *30 i7# $3 $! ^@ $3 $2O51E +2 o0M -2 i2S .2 i2a $2EO51 $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 $! *16 *14 o4- *12 ,1 *14 $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 z3O0B 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 [ ^y ^w y5 z1 t y5O42 Y5O32K y5O12 y5 t z1 Y5 s83 y5 o5p y5 o1v Y5KO32 y5 +5 } } Y5 Y4 y2 Y4O72 y4O52 Y4 o8g y4 i4E y4 i4b y4 D4 Y4 C Y4 { { y4 $. Y3 Y3 t Y3 Y3 E $+ Y3 Y3 y3O62u Y3O61 y3O53o0s y3uO62 Y3 t Y3 y3o0sO53 y3 i3y y3 i3, Y3 E Y3 y2 Z1 E y2 y4 u Y2O71$. Y2$.O71 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 $* O92 O62E O62$@ O61o3p O61i38 O53o3M O52o6k O51o2@ $.O51i5y O45i4i O43o3f O42i5p O42i3j O42i2f O42$1 $*O42 [O42 O41$ O32t O31^x O28 O26u O24Y2y2 O24y2Y2 O24p4l O24lp4 O23y2 O21y5y5 $x $2 O19Y2C O19CY2 O18C $!O13c O13*34 O12i6X O12$C O09z1 O03y4y4 O03i1Y O03i1t O02f O02$. $.O01i0b $! ^x ^w ^W $W o6W $w $l ^W ^D ] ^v [ $v ^u ^x u TB u sE* t u R6 t up2O86 up1O42 u p1 ,8 u p1 +6 u o5D u $M u K d u i79 ,7 udO53 u d ,7 $U $u ^u $# t z3 y3 t z1 ty4O62 tO82 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 $* ^! $T sy" $sO31 $s ^X sua stR l $s $t ^s t ss8 E sS3 l ^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 $. ^r y1 E rO0Ar rp2O0A ^R ^L R5 R5 '6 R5 o1R R5 '6 R5 R4 R2 o6h R2 *26 R1 t $. ^r qO21t qtO21 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 p2Z1O68 p2O79u p2O68Z1 p2O3Au p2O05q p2O03 p2uO79 p2uO3A p2 T0 '9 $- p2 'B p2 'A .3 p2 '9 T0 p2 *47 $p *24 p2 .3 'A p1 Z4 } p1O83t p1O43u p1O31u p1uO43 p1uO31 p1 u o0M p1 u i82 p1tO83 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 o88O93 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 $! o5WO23 o5s +3 o5- o2- o5L +9 o5g o5f o57 y1 o5$ *75 o5; +6 o51 R6 o5+ o4y o4t +6 o4I y5 E o4iO54 o4f o4c o4b o4a $s o4& ,3 o4@ ,2 o4- +2 o3zO42 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 o11O42 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 $MO41 $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 $ k Z2 k y4 y4 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 ] ^jO14 $j i3- $j $g ^j ^g $i u ^i ^T ^I $H ^i ^D iAa i9L t i91 i9. i9- i7#O23 i7-O14 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@ i4yO62 i4y $1 i4v $x i4tO03 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, i3yO61 i3y o4- i3y D6 i3x $f i3U R7 i3* t D4 i3q $b i3q ] i3jO52 i3i i3* D4 t [ i3d i3A -0 i3= .2 i31 i3@ i2x i6s i2s i05 i2p *43 i2hO52 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 $d Z1 t d y3 t dO71u dO63 dO07O81 duO71 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 $!cO13 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 $aO41 $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 $. +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 $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 $@ $1 Z3 t $1 Y1 $1O82 $1O64 $1O62t $1 t Z3 $1tO62 +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 z5O48 Z5 u o58 Z5 o58 u Z5 o0G ] z4 K Z4 *61 $+ Z4 z3O3Bt z3tO3B z3 s8 Z3 Z3 s10 Z3 k +5 $. Z3 k Z3 +5 k z2 y5 y2 z2O39t z2tO39 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 Z1p2O86 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 y5O92 Y5O46 y5 t y1 y5 o5s y5 o5b y5 i5; y5 i5- Y5*69O76 y4O65 y4O41 y4O09C y4 i4y y4 i4i Y3 Y2 +B Y3 sMd y3 scf y3rO41 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 y2p1O06 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 OB2i8i OB2$1 OA1$1 O91o0D O83 O82O53 O73o5H O72$2 O63$ Z3 O63i2, O61Z1 O61Y1 O53i3S O53[ O51Y3 O51O24 O51$r O51i3y ]O51 O43y4c O43i44 O43C$1 O43$1C O42O42 O42o3. O42o1u O42i2M O42-2 O32i6 [O32 O31^at $!O31 O25y2 O25y1 O24i1x O23y4 O23*20 O21y3 O21o6n O21dO04 $!O21 O17z2t O17tz2 O17C O16z2 O15C O13p2'9 O12Ki2j O12i2jK O09y1 O08-2 O06p5 O03Y1 O03i3x O02^K O02*56 O01o1u$2 O01i0ai1r O01$2o1u ^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 up1O93 up1O67 ^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 tp2OA6 t o0G t i7@ ^t i6s t i5T ^T i0S t ^F $C tdO75 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 $sy5O54 ^s ^u stT ssz $2 sr* t $s $p snx sM[ y2 smw sM* skK siyO61 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 ^.rO31 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 sao p4 l p3O8Bt p3tO8B p3 ^b ^j p2O98u p2O79t p2O75t p2O6AC p2O5A*23 p2O0BO61 p2O05C p2uO98 p2tO79 p2tO75 p2CO6A p2CO05 p2 'B $m p2 $a $. p2 +9 ^P *23 p2*23O5A p2 $2 $- p2 ] p1 Z1 t p1 y3 t p1 Y2 u p1OB5u p1O81u p1O71E p1O63E p1O62c p1O56t p1O51t p1O49 p1O03t p1 u Y2 p1uOB5 p1uO81 p1 t Z1 p1 t y3 p1tO56 p1tO51 p1tO03 p1 t o51 p1 t p1 o7a p1 o65 p1 o61 p1 o51 t p1 o0m p1 i4b p1 ^h p1EO71 p1EO63 p1cO62 p1 'A r p1 $a p1 ^8 p1 *08 r ^P $@ ^p $@ ^o ^Y ^oO12 ^o ^t T0 ^o ^t ^o $o ^o ^m ^o i0B ^O ^G oB9 oB4O03 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 o6BO41 o6% +9 o69 o6* ,7 o65 K o6. $4 o6, $1 o6[ $] o5+ Y1 o5*O32t o5x $1 o5u o5*tO32 o5= T1 o5s -3 o5r o5p o6e o5p +4 o5p o5HO13 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 o1SO53 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 ^mO41 $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 lY5O13 lO13Y5 ^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 kY3O43 k Y2 y2 k y2 Y2 KO92 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 i9aO63 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@ $@ i6yO12 i6y -0 i6_ R8 i6r i6; o64 $. i6; $. o64 i6g L3 i6E ^e i6b i6% +8 i62p2O42 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 i3SO63 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 ^hO61 ^h ^S ^h i1m ^o $g $m $G $f c $G c $f ^G $1 $g ^@ ^f Z1 z1 ^f z1 Z1 fO98K fO74 f u ^F o2G fKO98 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 EO71 EO32$9 ] E T5 $* E T1 ^e p4 y1 E oA1 ^e L1 $e i6c u E i4t ^E i1r E $A $1 E$9O32 E $7 Y4 $e *61 ^t E ,5 $2 $E ^4 o01 E $@ $3 E $2 ,5 $e $1 E $0 $d Z5 dOA1] d]OA1 dO91t dO02u d $W duO02 d u ^S d u o91 d u ,B dtO91 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 cOA3$1 $CO12 $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$1OA3 $c $0 u $c +0 { C ^# ^C c ] ^c } ^b ^y $b u $B o0T ^B ^J ^B i1J ^B ^F $B ^A $B ^1 RB $A Z2 ^a ^Z ^a Y3 } $a Y1 $AO81 $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 $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 $6O01E +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 *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 *32O03t *32tO03 *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 *27O07 *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 $1O93 $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 *02O12 *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@ z5i0rO18 z5 ,6 t ^z*53O23 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 Z2OB3D8 $!Z2O42 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 Z2dO07 z2 ^B o2b z2 *30 ^H z2 +1 y2 z2 -0 l Z2 $& Z2 $! $\ Z2 ^. z2 z1 Y2 Y2 z1O34 Z1O03 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 Y5Z5O63 Y5 z3 r [ Y5 Y3 y5OA3y5 y5O93E Y5O83t y5O82K y5O68 $*Y5O64 Y5O63Z5 y5O63,5 y5O63[ Y5O34 Y5tO83 y5 t T5 y5 T5 t } Y5 t y5 { R4 y5p1O0A y5 o5m y5 o5g y5 o4o y5 o0V y5 o0r y5 o0M y5 o0D y5KO82 y5EO93 y5 ^D Y5 +A Y5 ^A y5,5O63 Y4Y4O08 y4OB4k y4O82y4 y4O64O02 Y4O08Y4 y4 u $6 Y4 u ] Y4 sbB y4 s4v Y4 s4+ y4 r y4 o2i Y4 o0T Y4 o0p y4 o0P y4kOB4 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 y3O01 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 Y2y5O65 Y2 y5 u Y2 y5 Y2 Y4 Y2 Y2 Y2 Y4 Y2 Y2 C y2 y2 ] y2 y2 y2O43y5 Y2O24y2 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 y1O34 Y1 t Y4 y1 ^s 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 OA1o9k O91o0V O91$2 O91 O83o88 O81 O73t $x *70 O62i6z O61$s O61^s O61o0$ O61$8 $,O61 O52y5y5 O52i4y O51^r O51i3r O4A O43y3Y2 O43Y2y3 O43o1u O43i3L O43i1W $!O42Z2 O42y4 O42o0M O42i2h O42{E O42[ O41y4t O41ty4 O41i5s O41i3s $ O41 $*O36 O35y1y5 O35O21 O35dO03 O34y3y3 O34}q O32$.Z2 O32y2y2 O32o0u O32i3. O32i2p O31o0c O31i4M $@O31E $x $2 E O28u O27z2 }O26 O25up4 O25p4u O25o4) [O25 $ O24 O23y3 O23p1'9 O23i3i O21o4@ O21o2zi3q O21i3qo2z O21*31 O21+0 O21$* O21$@ $=O21 O1Bu O16z3 O16Cz2 O15t O14y3} O14}y3 O14i4* O14i3- O13Z5Z5 O13^z {O13$s O13o2H O13f O12i2e O0Bz5 $*O0B O07z2 O07u O07*21 O06C$* O06$*C O06+0 O05z1 O05o4* O05D1 O04Z5Z5 O04Y2y2 O04y2Y2 O04r O04ql O04p1TB O04lq O04i5$ O03z3 O03Z1 O03^e O02Z2y5 O02y5Z2 O02Y4y2 O02y2Y4 O02y2 O02^t O02i3b O02i1h O01p2 O01^JT4 $x [ ] ^x ^- ^x ^x ^w ^z ^W y4 y4 ^wO21 ^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 uY5O32 uY2OA5 $UO91 uO51p5 uO42*03 u T4 ^u ^t u sIY u R4 t up2O5B up2O04 up1OA4 up1O52 ^u ^p u o8I u o76 u o3S ] ^u o3_ ^u ^l udO05 u *79 u*03O42 t Z5 Z3 t Z3 Z5 tz2O63 t Z1 ^3 } t Y5 tO61] t]O61 tO43z2 ^tO21 $t ^w *53 $t $w $T ^U t T6 ^T ^t $t ^t t s*+ { t R6 ^T ^R tp2OA5 t p2 +2 t p1 +B t o8L t o7A t o0W $t ^L t K Y2 tdO08 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 ^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* {$sO13 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 rfO43 $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 [ 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 p5O09$a p5O02 p5 i6i p5 'B $z p5$aO09 p4O0A p4 o0S $3 p4 $. $k p4 i5p *20 p4 ^a p4 *42 r p4 $3 o0S p4 *20 i5p p3Z1O09 p3O8Bu p3O09Z1 p3{O08 {p3O08 p3uO8B 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 p2OA8t p2O9Au p2O87t p2O86t p2O85u p2O72c p2O6A p2O64t p2O5Bt p2O3At p2{O02 p2uO9A p2uO85 p2tOA8 p2tO87 p2tO86 p2tO64 p2tO5B p2tO3A p2 s6c p2 $q p2 o2e o0b p2 o0b o2e ] p2 ^m p2cO72 p2 c $0 p2 $0 c p1 z1 u p1 z1 t p1 y1 u p1 Y1 t p1O62t p1O62l p1O57l p1O31 p1O25$e p1O08r 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 p1tO62 p1 t +9 p1 t $8 p1 t +7 p1 t *45 p1 t [ p1s8 O07 p1 ^R u p1 o0h p1lO62 p1lO57 p1 K u p1 iA; p1 i60 p1$eO25 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 oAAO21 oAa $! oA6 oA1 ,B ^( oA) o9pO62 o9l o9B *89 o98 -3 o9% *69 o96 o94 $. o93 o91 o90 C o9^ -0 ^^ o9^ o8z o8Y u o8uO61 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 o7yo4xO02 o7y o7WO12 o7v -2 o7u +6 o7T C o7^ T2 o7S c o7O $1 o7o o7nO21 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 o6cO12 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, o5zO32 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 o4uO51 o4u o4T +5 o4S *34 o4N T2 o4L ,5 o4kO52 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.y3O72 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 o3MO53 o3l z1 o3l y5 E o3HO65 o3FO71 o3D .5 o3d .5 o3bO52 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 o2SO42 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-O25 o1X *02 o1x o1u y3 o1uO42 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 o1CO71 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 lY2O32 $l Y1 lO32Y2 ^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 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 kO1A ^KO12 K s9b ^K ^S ^k ^S k q z5 KqO13 k o09 K l +7 K i8% k i6@ k i58 K i46 $a ^k i1- ^k i0l kdO04 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 $. ^JO71 ^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 iBoO92 iB. iB- iA@ iA/ i9%O04 i9iO45 i90 i9@ i9[ $] i9- $- $, i9. i8*O14 i8mO24 i8BOA1 i8a t i8 +A i8 ,9 i8* i7@Z5O25 i7@O25Z5 i7W $k i7! T0 i7n $R i7M *35 i7eO41 i7 C i7 +B i77 i7/ .6 i71 ,8 $. i71 i7* *07 i70 $! i7( $) i7/ i6zO21 i6.O72o6o i6X .5 $! i6x i6W .9 i6T +0 i6s D0 i6q -9 i6o o3x i6.o6oO72 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 i5eO03 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 $! i4eO12 i4e ^c i4e i4DO52 } 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 i3sO61 i3s i5s i3s i06 i3S .7 i3rO61 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 i2xO41 i2x +3 i2w $x i2w $t i2w $q i2w i2u *54 i2t $r i2s $g [ i2s i2p *34 i2n c i2n ^A i2n i2MO62 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-O71 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 $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 fOA1] f]OA1 fO96*20 fO8Ay4 fO56*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*20O96 f *12 u f*02O56 $f $) $f { { ^f ^f } E Y4 T1 E Y1 o1@ EO42i4L EO41D7 EO41$4 $@EO31 $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.7O41 E *74 Y4 ^e ,7 E *68 $1 E$4O41 E $1 *68 E $ E ^/ $D Z1 d Z1 [ d [ Z1 d y3 u dO85u dO81t dO64 dO53u dO31] d]O31 dO24u dO04snr dO03c dO02t dO02 $d ^x d u y3 duO85 duO53 duO24 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 dtO81 dtO02 d t i0J d t $8 d t *76 d t +6 d t $4 dsnrO04 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 D0p1O04 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 cO81so0 cO21 cO04q $c ^w c $u $s c TA T9 c T9 TA C T8 Z1 ] c T4 ^c $t cso0O81 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 C $c $1 C } } ^C $. ^- ^C ^c ] ^b z2 E ^BO12 ^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 'Ap1OA4 $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 $9O71 $9O01^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 -7O05 +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 ^6O61 $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 *67O52 *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 $5O61 $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 *50O51 *50 i5e $. .5 $. ^5 -5 $. -5 } } ^4 z5 t ,4 Z1 ^4O61 -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 $/ .3 Z5 Z5 ,3 Z5 Z5 +3Y5O53 $3OB1 +3O21 -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 *35O31 *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 *31O42+3 *31 o2b *31+3O42 $3 ^1 *30 ^s +3 $! $3 $* [ $3 '3 ,3 ^3 $@ ^3 $! ^* $3 +2 y2 y2 $2O31 +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 $1O23 $1O05 .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 *12dO04 *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 $0O51c +0O23y2 $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 $0cO51 $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 *02p2O0A *02 o0s *02 $A ,3 *02 ,3 $A $@ *01 D3 +0 } $0 $ -0 { $% ^$ $* $# $@ $! $) $( ^) $. $@ $. $! $/ ^/ $? $! $! $# $! ^@ $, ^. $` ] $- $- ^* $/ ^_ $- ^< $z Z4 $z Z2 y1 $z y1 Z2 $zO63 ^zO61 $zO21 $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 Z5Y4O73 Z5O73Y4 $*Z5O65 z5O49 z5 sCA Z5 s7% Z5 r Z3 Z5dO6B 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 Z4Z2O23 Z4 Y5 Y3 Z4 Y3 Y5 {z4O72 z4O47t Z4O23Z2 Z4O23d z4 u z4 z4tO47 Z4 T3 Z5 } z4 t Z4 sWS Z4 s17 z4 r z4 Z4 oAa z4 ] K Z4 i26 Z4 z4 ^1 z4 z3O46 Z3 $W Z3 T8 z3 sc8 Z3 s.` z3 r z5 z3p2O78 Z3 oA Z3 o84 $ Z3 k [ Z3 D4 z3 *81 Z3 $. -6 Z3 -6 $. ^z $3 z2 Z4 z2 y5 z2 Z2O23{ Z2 u +0 Z2 t d z2 T5 z2 s0M Z2 s0g Z2p1O21 Z2 o7- +2 Z2 o6b +7 Z2 o6@ Z2 o4p z2 o1# z2 o0t Z2 l $f 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 z1p3O08 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 ^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 y5OA3 y5O96t Y5O84O02 y5O84E y5O83c y5O82,7 Y5O73t y5O72 Y5O63*40 y5O54C y5O32+0 Y5O15 y5 u T5 Y5 u '8 } Y5 u y5tO96 Y5tO73 y5 t } y5 } t y5 sRD y5 r E y5 o6o y5 o5r Y5 o4- y5 o1i y5 o0s y5 o0g [ y5 $j y5EO84 y5 D2 y5 D1 c y5cO83 y5CO54 y5 c D1 y5 c 'A y5 ^B y5 'A c Y5 '8 u Y5 *82 y5,7O82 Y5*40O63 y5+0O32 $y +5 y4 Z3 *56 Y4Y4O04 y4 Y4 u y4 y2 c y4 Y1 y4O84 y4O63 Y4O42 Y4O34$@ Y4$@O34 Y4O32c y4O32$a Y4O04Y4 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 Y4cO32 y4$aO32 y4 *71 *06 y4 *63 *50 y4 *56 Z3 y4 *50 *63 y4 ,4 t y4 $4 E y4 *42 y4*38O23 y4 *36 l [ y4 +3 y4 [ -1 y4 *06 *71 y4 *01 Y4 ] y3Z4O51 y3 Z1 y3 [ ^z [ Y3 y5 Y3 Y3 D3 y3 y2 t }y3O64 y3O53 y3O51Z4 y3O21o0b y3 t y2 Y3 t D3 y3 T3 y3 t [ Y3 o9. Y3 o7. y3 o3x y3 o0g y3o0bO21 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 y2y2O83 Y2 y2 l Y2 Y1 $a Y2O42 Y2O32l Y2O32 Y2O17C y2O08 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 y2p1O04 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 Y2lO32 Y2 l ,B y2 i4d y2 i4 Y2 i2v y2 i0b y2 ^E [ y2 E y2 ^d D4 Y2CO17 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 Y1Z5O23 Y1 $@ Z1 Y1 z1 Y1O23Z5 y1O14t Y1O0A Y1 $x Y1 u $E $! y1 u y1tO14 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 OA2 ^x ^A O93 O92o83 O92+8 O92$1 O91$A O82i9et O82$. O81oA8 O81D1o2e O81$2 O74u O72c$! O72$!c ^x *64 O63$A O62$7 O62$. O61$z O61O81 O61O05 O61$w$j O61to9R O61o6- O61o1m O61^c O61^At O61*73 O61*52 O61$5 $*O58 O56i4b O54$1 O54[ O53o1S O53$3 O53$1 O53$. [O53 O52rp5 O52p5r O52o30 O52i5w O51^z O51o0l O51o0J O51i3* O51$i O51$d O51^6 ^x ^5 O46[ O43y5D9 O43Y4c O43p2O04 O43o4. O43cY4 O43$A O42o11 O42i62 O42$@ O41Y5] O41up1 O41p1u O41o2x O41o0D O41^I O41$.-2 O41-2$. [O41-2 O3A O35Y1 [O35 O34Cf O32o3f O32i3y O32i0n O32D1$1 O32$1D1 O32$@ $*O32 O31Y4t O31$w O31tY4 O31^t O31o3u O31o2z$@ O31$@o2z O31o1w O31o1s O31D1 O31$0 O25Y2f O24z1 O24p2 O23y3Y2 O23Y2y3 O23tK O23sbW O23^o O23Kt O23f+3 O23^2{ O21o0w O21o0T O21o0G O21l*30 O21i54 O21^e O21^d O21$8 O21^8 O21*30l $*O21 $.O21 $x .2 O1B[ O19u O18O13C O18CO13 ^*O18 O17Cz4 O15k O15f*02 O15*10 }O14 O13p5 O13i2J O13$@ O12y5O52 O12^t O12o4g O12^j O12$5 O12$.{ $X $1 O0Az2 O0AZ1 O08O04 O07z3 O07p5 O06u O06,1 O06-0 O05u O05K O05c$2 O05$2c O04^j O04$2 O03y3 O03^wu O03o84 O03^m O03i7. O03i0I O02O71 O02^v O02o1j O02^o O02$2 O01Y3 O01$^Y1 O01i5x O01$5 O01-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 ^vO13 $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 uO43 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 u d y1 ^u D5 } u d +5 u D4 t u D1 p1 u D0 u *87 u +6 $U } $! ^* u } t z4 t Z2 D6 t Y4 T1 t Y3 R3 t Y3 D6 t y2 *42 tO31O41 ^TO13u tO04d ^T ^W ^TuO13 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 i4 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 T0O82 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*O23t sR*tO23 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-O35 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 } s1$ s0v s0O c s08 Y2 s04 $# s03 l s03 c s?0 $# ^S s.- $) s-( $- ^s r z5 ^. r $y rO34z1 rO27t $r ^w ^r ^u rtO27 r ^t $R $r ^r $R r ] p1 r o3q { r L0 $r $j ^r i4s ^r i2z r i2v rfO5B rfO4B r d c r ] d RA } { R7 R6O03t R6tO03 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 }qO46 qO1Ap1 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 p5O86 p5 t 'B p5 o8 $5 $. p5 i7q p5 i4s ] p5 ] i4s p5 'B t p5 -A p5 $5 o8 p4O05K p4 t 'B p4 o7l o6a p4 o6a o7l p4 o0B p4KO05 p4 'B t ] p4 ^a ]p3O0B p3 k *53 p3 i0a p3 ^A z5 ] p3 '9 p3 *53 k p2O9B p2O95t p2O85,7 p2O6Al p2O38O78 {p2O02 p2tO95 p2 s3c p2 p1 p2lO6A p2 l [ p2 ^j p2 c p2 $A $a p2 'A *32 p2 -8 y2 p2,7O85 p2 *32 'A $p *23 p2 $0 Z1 p1OB4t p1OA1] p1]OA1 p1O76t p1O73O03 p1O53] p1]O53 p1O07D7 p1 u i6R p1tOB4 p1tO76 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 $& o94O45 o93 T4 $' o9. ,2 o92 o9* ^@ ^( o9. o8S o8R L8 o8q D3 o8O -2 o8% K o8c D1 o8C o8a $1 $- o89 o88O51$A o88$AO51 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 ] 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*O42 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/O62 o5X o5w *52 o5w *23 o5T u o5T *02 o5s Z2 o5s *21 o5rO02 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 o5FO31 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 o4BO52 o4b $x o4b $W o4B $! $! o4B o4A $1 o4A o4) .6 o4# .3 o42 +3 o41 R5 o41 $0 $. o41 o41 o4# $# o4< o3zO41 o3z t o3Y L3 o3_ y3 o3x D1 o3x c o3x *20 o3w ^j o3w +2 o3u +4 *31 o3u *31 +4 $! o3u o3TO12 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 o3DO51 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@O51 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 [ $. o1wO31 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 o0WO41 o0wO21 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 o0sO61 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 o0MO42 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 o06O61 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 $MO21 $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 KO31 k ^x K $w k R0 Kp2O0B kp2O0A 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 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.O52 i9 O31 i9u L8 i9qO15 i9m oB1 c i9m c oB1 i9e $1 i9 +B ] i9A T9 i93 oAA $] i9[ ] i9 i8-O34 i8. s=+ i8s ] i8h $1 i8h $@ i8a i8a i89 $. i83 o9. i82O42 i81 $1 i8@ $# i8@ i8/ $. i7z i7Y $* ] i7u i7tO52 $! i7r $= i7q i7pO42 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 i74O53i6g i74 $A i72 $D i7. +2 i71 D1 i70 i7, ^' i7. i6z } ^t i6z o7o i6/ Y3 i6x $A i6=O01 i6x i6W -9 [ i6w i6t i6s $! i6qO02 i6n i6/ ^L i6K L7 i6k i6j u i6I c i6* i4* i6h -0 i6g i6e i6g [ i6eO21 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 i61O01 i61 .5 i61 $! i6. ^1 i6= $1 i60 *AB i6. -0 i6% i6& ^% i6/ ^$ i6_ i6 ^_ ^* i6? i5z ,3 i5ydO06 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 i5cO62 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 i54O62 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 i4vO45c i4vcO45 i4u *52 i4t *63 i4@ T6 i4* T3 i4t $3 i4s ^z i4r ^s i4r $I i4r *54 o4e i4q $r i4PO14t i4PtO14 i4o i0@ i4m l i4m i4g i4( $m i4l -1 i4k $+ i4k $/ i4k $! i4jO03 i4j r i4i o5c i4i o3z i4I c i4/ i5* i4i *16 $. i4i i4i i4h T1 i4f T2 i4f $A i4bO02 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)O16 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 } i3hO32^h i3h o2c i3fO12 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. ^$ i2zO42 i2z *32 p4 i2Y +1 i2x Y1 i2@O51 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_ i1yO43 i1x ^r i1x $5 i1x $. [ i1x i1w ^7 i1w *03 i1v -3 i1uO41+2 i1u ^s i1u+2O41 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 i11O51 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 fO81 fO78 fO76K fO6Ak }fO69 fO63] f]O63 fO32 }fO2A fO24K f u -7 f u *21 ^F $S } ^f $s $ f q ^f o46 ^F o1G ^F ^M $F ^L fKO76 fkO6A fKO24 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@ EO31T2 $eO21 ^E u i3E ET6O41 E T2 Y4 ET2O31 $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 dOB1O04 dOA3] d]OA3 dOA1O03 dO83t dO67l dO62l dO56 dO51t dO05O92 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 dtO83 dtO51 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 dlO67 dlO62 ^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 cO91$6 $CO51 $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$6O91 c $3 Y5 ^C ^3 $c $3 c ^1 z2 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 $AOA3 ^aO92p5 $AO71 ^aO13 $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 $AdO62 $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 $9O41T0 $9 T4 $9T0O41 $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 .8O62 '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 $@ -6O06 -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 *67O42 *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 *62O06u *62uO06 *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 *58Y3O12 *58O12Y3 *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 $4O73 ^4O41 $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 $_ *40O02 *40 o4i +4 +0 +4 *40 *25 $. *40 $. *25 $@ *40 $@ ,4 $3 Z2 .3 Y2 r ,3 $. Y1 -3O51 +3O43 $3O42c ^3O13 $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 $3cO42 $3 C ^3 ^b *37 p2 'A *36 o1n *36 $1 ,3 $5 p4 *35 o5q *35 o1I *35i4iO52 *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 *30O61 *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 $2O52 [-2O41 $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 *24O21u *24uO21 *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 $1O51 $1O31D3 $1O01 $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 $1D3O31 ^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 $0 $z Z1 $0 Z4 Y2 $* +0 Z1 +0 y4 u +0 y2 u +0 Y2 *73 -0 Y2 -0O45 -0O31$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$gO31 ^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 *02p3O08 *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 Z5Z5O13 $ Z5 z5 $ z5 Z5 Z5 Z4 Z3 Z5Z4O19 Z5 Z3 Z4 Z5 z3 r Z5 Z1 Z5 Y5 oAq Z5 Y5 -1 Z5Y4O42 z5 y4 { z5 { y4 z5 y3 Z5 Y2 *43 Z5 $/ Y1 Z5O59.1 z5O48t Z5O42Y4 Z5O19Z4 Z5O13Z5 z5O0B z5^wO35 z5tO48 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.1O59 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 Z4O54} 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 Z3y5O85 Z3Y3O23 Z3O23Y3 z3O07 [ 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 Z2OA1] Z2]OA1 Z2O63 Z2O37 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 Z2dO13 z2 ^D z2 C z1 $/ 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 $!Z1O82 Z1O62u Z1O51i1r z1O45y5 Z1uO62 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 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 y5Y4O53 Y5Y4O38 y5OA6E y5OA2y5 y5O93 y5O85 y5O82c y5O74-5 y5O73.4 Y5{O73 y5O72O41 y5O72[ Y5O64.4 Y5O64$0 y5O56u y5O52t y5O38E y5O27^m Y5O25 Y5O24-5 Y5O23[ Y5O21 Y5O14$@ Y5$@O14 y5O13 Y5O02E y5O02 y5uO56 Y5 u ^S y5tO52 y5 t i58 Y5 T0 ^1 Y5 ^S u y5 s2Y y5 RA c y5 RA $A y5 R5 { y5p1O47 y5 o9i Y5o8MO12 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 y5EOA6 y5EO38 Y5EO02 y5dO0A y5 D8 Y5 ^D y5cO82 y5 c RA y5 C $l y5 C K y5 C *05 y5^AO92 y5 $A RA y5*A8O53 y5-5O74 y5 *59 y5.4O73 Y5.4O64 y5 -4 Y5 $2 Y5$0O64 y5 $0 y5 -0 $. Y5 ] y5 y4 Z2 ,8 Y4 Y5 *02 Y4Y4O02 y4 y4 u y4 y4 K Y4 Y4 D2 y4 y4 c Y4 Y4 ^_ Y4 ^_ Y4 { y4 y4 Y4 y2 u Y4Y1O62 y4O82E y4O76R3 y4O72o4k y4O71c Y4O62Y1 Y4O62T0 Y4O52t y4O43i4n Y4O42[ Y4O32E Y4O13C y4O12K Y4O02Y4 y4O02o6r y4 u y4 Y4 u y2 y4 u .4 Y4tO52 Y4 t '8 y4 t *63 Y4T0O62 y4R3O76 Y4 o9. y4 o7. y4 o5u Y4 o5_ y4 o4z y4 o4l E y4o4kO72 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 y4KO12 Y4 K y4iB)O57 Y4 i8b Y4 i8- y4 i4r L4 Y4 i4, Y4 ^H Y4fO3B y4EO82 Y4EO32 Y4 E T5 y4 E o4l y4 E $? y4 $? E Y4 D6 Y4 D2 Y4 y4 D1 $@ y4 $@ D1 y4cO71 Y4CO13 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*68O82 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 y3O81+6 Y3O58 y3O52c y3O52 y3O51 y3O45 Y3O43k Y3O37y3 Y3O31E 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 Y3kO43 Y3 K Y3 i6- y3 i6- y3 i31 y3 i3- Y3 $H Y3EO31 Y3 E -5 y3 E y3 D8 ,7 Y3 D6 $4 Y3 D4 u Y3 D1 Y3 Y3D1O43 y3cO52 Y3 c -5 y3 C Y3 $a Z2 y3 ,7 D8 y3 -7 y3+6O81 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 y2Y3O43 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 y2O72$. y2$.O72 y2O54i4_ y2O53t Y2 ^x *53 Y2O51y5 y2O51i4- y2O43Y3 y2O42$@ y2$@O42 y2O41c y2O39q {y2O34 y2O15t Y2O09 Y2O08 Y2 $w y2 u Y3 y2 u y2 Y2 u -5 y2 ^U y2 t Y2 y2 t Y1 y2tO53 y2tO15 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 Y2p2O02 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 y2dO68 Y2 $d y2cO41 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 Y1O74$@ Y1$@O74 Y1O51E y1O51*02 $^Y1O45 Y1O43y5 y1O43 Y1O03 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 Y1p1O09 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 Y1EO51 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 *36 *72 ^Y *13 [ y1 ^3 Y1 *17 q Y1 *03 $* Y1 $* *03 y1*02O51 Y1 $+ Y1 $@ ] Y1 $Y ^y $x Z5 u $x Z2 $x } z1 $xY5O06 $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 OB4]] OB1O91 OB1u OA3 OA1O19 OA1t,9 OA1i7NO63 OA1,9t OA1$. ^x ^a O93t O93o88 O92u O91c ^x '8 +5 O84t O84$a O83Z1 $!O82Z1 O82OA1 O82R8R8 O82$5 O82$@ $!O82 O81s28 O81$o O81*89 O81$6 $X ^8 O74$1 O74 O72o2x O72i7f O72$! O71Y3 O71o0z O71^e^L O71DA O71D5$! O71$!D5 O71$d ]O71 $x -7 O65O81 O64i6b O64$a O64$4 O64$2 O63ud O63t O63du O63-2 O63$1 O62O31 O62r O62o5. O62i86 O62'B O62^1o1J O62$1 O62$! O62]] O61^v O61up1 O61p2O0B O61p1u O61o12 O61o06 O61i1- O61D0i0C O61.8 O61*25 O61$2 O61$, ^x +5 '8 O56i3@ O54D5 O53y5y5 O53i2i O52Z1 O52Y5'A O52s80 O52o5q O52o4& O52o2w O52KY4 O52$j O52+1 $-O52 $_O52 ]O52 ^$O52{ O51Y5 O51O81 O51O72] O51]O72 O51^x O51o5b O51o56 O51o4o O51o2b O51o0T O51o0s O51$j*50 O51i6@ O51i3c O51i0a O51*50$j O51-2 O51$!-0 O51-0$! O47$0 O46Y4Y4 O45y5T9 $^O45Y1 O45o7C O45i2M O45$1 O43Z1y5 O43y5Z1 O43y4 O43o7> O43o4@ O43o3_ O43i4B O43i3t O43.4 O43$. $*O43 O42y5c O42y2y2 O42tR4 O42sa1 O42R4t O42o3_ O42o2S O42i5* O42i4c+0 O42*25$! O42$!*25 O42+0i4c O42^@ $!O42 O41Y4t O41Y2$A O41tY4 O41^S O41^q O41o6f O41o5B O41o4& O41o2h O41o1@ O41o0G O41lf O41i5 O41i11 O41fl O41D6$2 O41^a O41$6 O41*42 O41-4 O41^4 O41$2D6 O41.1 O35Z1+5 O35R3R3 O35+5Z1 O35+0 O34p4 O34i3f O34^e O34$c*03 O34^4 O34*03$c O34[ O32y5D9 O32y2k O32OA2 O32O37 O32^p O32o5v O32o5d O32i4z O32i2M O32i2h {O32c O32+A O32.5 O32$2 O32[ O32^! $.O32 O31y5i5_ O31y2[ O31^W O31u O31p1c O31o4F O31o0G O31o0f O31kd O31i4- O31i2e O31D6 O31-2 O29p4] O27i2h O26qZ1 O26qY1 O26q^o O26i2b O26CT1 O25z5t O25z4 O25y2u O25uy2 O25tz5 O25qZ1 O25p4T0 O25i3s O24Z2l O24y3} O24}y3 O24y2t O24y1 O24ty2 O24lZ2 O24i4m O24i4* O24i2h O23Z5Z1 O23Z1Z5 O23Y3y2 O23y3o42 O23y3} O23}y3 O23y2Y3 O23r$h O23Ey2 O23dE O23^6z2 O23$+ [O23 O21^z O21Y1s1+ O21^u O21t[ O21s^A O21s1+Y1 O21p3'9 O21o2h O21o0c O21$k$l O21^k O21i65 O21i4- O21i3q*20 O21$a O21$5 O21*20i3q ^x *20 O1AC O16z5 O16t O16p2+0 O15y2u O15O05 O15uy2 O15] O14z5z1 O14z3z3 O14z1z5 O14Y4 O14y2 O14p2 O14K+4 O14i3C O14+4K O13y2t O13^x^t O13ty2 O13R3t O13o0Y O13kq O12y3y3 O12Y3^A O12Y1^B O12$@^T O12p3O0A O12p2'9 O12o2x O12o1T O12o1R O12^o $*O12^l O12k^D O12i0g O12i0\ O12^BY1 O12^AY3 O12*14 ^x +1 O0Ap1 O09Y2 O09y2 O09u O08y4 O08p5 O08d O07Y2y2 O07y2Y2 O07p4] $x *07 O06y3y3 O06r O06p2 O06f O06$1 O06} O05z2 O05i4v O05+3 O04Z5Y5 O04Y4Y4 O04R4R4 O04p1O05 O04o1w O04'A $ O04 O03y4 O03y2u O03O21 O03uy2 O03s14 O03^p O03o3, O03i4m O03i2n O03$7 O03$! $x *03 O02z1$. O02$.z1 O02y5 O02y4E O02y4 O02y3 O02r O02o7t O02o3r O02o0h*46 O02i2@ O02i1e O02c^M O02^c O02*65 O02*46o0h O02,4 O02*12 O01$YZ1 O01Y4^R O01y2y2 O01$w O01^RY4 O01o5b O01i5= $x $! $@ ^x $. $x $w Z2 -4 ^w y2 ^wO61 $wO41 ^wO16 ^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*71O31 ^v $6 $v $4 ^v +2 ^V $@ $v $@ $- $v ^v $@ u Z5 Y4 u Z5 +0 u [ z5 uz4O71 } 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 uO83 uO73t uO72 uO52d uO51 ^uO32 utO73 u t o4* $u t $A u T9 u T3 K u T2 sEa u T1 Y2 ^u ^T u^SO23 u sOE u sEa T2 u sC* t u ^S u R7 t } u R0 u ^R ^u } r up2O02 ^u p2 ^j u p1 y4 up1OB3 up1O53 up1O13 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 udOB5 udOB3 udO62 udO46 udO42 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-7O51 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 tY5OA1 ^t Y4 tY2O01 t y2 t Y1 $s t Y1 *A8 ^T y1 ^t y1 ^t ^Y tO52$3 tO01Y2 ^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 tp2O84 tp1O78 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 tdO62 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 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+5O21 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$3O52 T3 T7 T3 T6 T3 o5P T3 o0F t .3 k T3 i4* T3 $1 T3 $@ T3 $! ^# T3 ^. $ T3 T2 Y1 T3 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 T0O14i1A $+ T0 T5 T0 T1 $D $* T0 o5b T0 o44 T0 i5@ T0 $D T1 ] T0 D7 T0 *45 t *02 D3 $' T0 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- $sO52 ^SO42 $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#O52 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 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 seCO71 sea se1 c se1 ] s?! E ^s E se@ sd- t sDS -7 sdq ^S $D ^S ^D $S $d scg k scFO71 sCe *50 sCA z5 ^S $C ^S ^C ^s ^c sBv y2 sbv sBTO12 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 *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*O35 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@O43 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 rO21i0w rO05 rO03 $r $w r T2 ^r $t ^R ^s $[ $r s[. r R6 *50 $r ^q rp3O09 rp2O04 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 rfO04 ^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 R7O04u R7uO04 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 R0O21 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 qy1O58 ^Q y1 K $q y1 qOA5$8 qO92OB2 qO62$e $qO41 qO28$@ q$@O28 qO03 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$eO62 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+9O16 $Q -9 q$8OA5 ] $q -5 ^q -5 q -4 -0 $q +4 $q *32 $q +3 q*15O32 ^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 ^pO12 $p ^w ^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 ] p4O23'A p4 o3i p4 ^j $1 p4 $i [ p4 [ $i p4 'A ^ p4 ^a p4 *80 *51 p4 *51 *80 p4 *04 o0r p4 $| } p4 ] p3 Y1 { p3O6Bt p3O6Au p3O54O7A p3 $X .3 p3O14$1 p3O03O6B p3uO6A p3tO6B ] 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$1O14 ^P .3 { p2 Z1 p2 { Y1 p2O9A] p2]O9A p2O96u p2O94u p2O76u ]p2O71 p2O6A$A p2O65] p2]O65 p2O58i51 ^.p2O37 p2O21'A p2O0Bu p2O08+0 ]p2O01 p2uO96 p2uO94 p2uO76 p2uO0B p2 $r Y1 p2 { $q p2 o0j $1 p2 o0f *21 p2 ^N $n p2 i0d p2 $h p2 $D $a p2 ,B +3 ^. p2 'B p2$AO6A p2 'A p2 +3 ,B p2 *21 o0f p2 $1 o0j p1Z3O61 p1 Z2 *76 p1 y3 ,4 p1 y1 t p1 ^X u p1OA4 p1OA3u p1O96u p1O93E p1O82] p1]O82 p1O6A p1O64C p1O61Z3 p1O52t p1O31] p1]O31 p1O15E p1O09 p1O04$_ p1$_O04 p1O02y4 p1O02u p1O02] p1]O02 p1uOA3 p1uO96 p1uO02 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 p1tO52 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 p1EO93 p1EO15 p1 ^E u p1 ^D u p1 D9 u p1 D5 t p1 D4 u p1CO64 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 } ^oy5O13 ^O y5 u $o Y4 Y4 $o Y2 ^oO21 ^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!O71 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 o8pO91 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 o7KO43sK4 o7KsK4O43 o7k *97 p2 o7k -3 o7I Y1 o7h -5 o7e Y2 o7eO31 o7e T4 o7d $b o7d *02 o7C l o7bO25 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 o6uO13 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 o6dO92 o6dO14 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 o63O42 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=O32 o5x ] o5wOA2 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 o5HO73 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 o58O31 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,O31 o4wO63 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 o4jO61-4 o4j ,8 o4j -7 o4j-4O61 o4j *45 o4j -0 o4J } } o4i y3 y3 o4iO31 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, o3yO02 o3y [ k o3y ^j +2 o3y D5 o3- y3 o3y *20 o3y $! o3x $x o3X E o3x *37 ] o3w $z o3wO01 [ 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 o3mO02 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 o35O01 o34O51*43 $. o34 p4 o34 o15 o34*43O51 ] 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 o2sy5O38 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 o2MO31 o2m i2f o2L y2 y2 o2L l $7 o2L $7 l o2l o2k $v o2K E o2j r o2j o3x o2j *34 o2hO41 o2h o5j +0 o2h *53 o2h +0 o5j o2gO62 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 o1yO23 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 o1uO61 o1uO43 o1uO21 o1u -0 $! o1U o1u $! o1t +3 o1SO34 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 o1kO21 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 o13O71 o13 o01 o13 D7 o13 -4 o13 $@ .2 o13 .2 $@ o12O61 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'O31 o0W D4 o0w +8 o0W $4 o0w *35 o0w $3 $# o0W o0VO91 o0V T4 o0v $j o0V D9 o0v *37 o0v $1 o0v $. o0t Z2 o0TO62 o0tO52 o0tO23 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 o0PO32 o0P ^V o0P si1 o0P ^S o0P o2t o0p $m o0p ,2 o0o D2 o0* o7+ o0, o2j o0N y2 l o0nO32 o0NO31 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 o0JO41 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 o0GO93 o0g r o0fO31 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 o0DO91 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 ^@^MO24 $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 KZ2O03 $k Z2 u $K Z2 c ^k z1 k y5 KY4O82 K Y4 u $k y4 u K Y4 ^R K Y4 D4 K Y4 c k Y4 kY3O71 KY3O51 ky3O51 k y3 +2 k y2 ,3 k Y1 i0s KO41Y4 kO2A kO21i0j KO03Z2 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 Kp3O65 Kp2O09 kp1O06 $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 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 } $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 ^ji5 OA5 $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+O73 iAu iAS LB iAi t iA2 $d iA0 iA# i9z i9$O04 i9S ^M } i9s i9 oB5 i9 oA6 i9m i9 E i9D oAU i9. -A i9 $9 i98O0B i90 $_ i9# i9) ^( i8X i9X i8 O32 i8w ] i8t u i8sO25 i8r +6 i8R *07 i8R i8r i8kO61 i8k o4m i8_ i9- i8f i8_ *9A i89 *58 i8@ -9 i8 -9 i88 i64 i88 $0 i84O61 i84 ^B i82 oA2 i82 i80 $+ $! i80 i8_ ^? i8@ i7Z c i7% Z2 i7. Y4 i7 Y3 i7@O51 i7v i8s i7V $? i7uO42*15 i7! T5 i7$ T1 i7S i7R *80 i7Q .6 i7p i7oO82 i7^ o5^ i7N *37 $$ i7l i7iO12 i7- i4- i7i i7h Y1 o7- i7h o7- Y1 i7h L6 i7h i7g i7f ,8 i7d o8s i7d o6a i7d c i7@ D1 i7D [ i7CO14 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 i72O21c i72cO21 i72 $4 i72 .1 i71 $* i7# *03 i7? i7` $@ i7, $/ i7? ] i7@ ^. i7. i6@ Z1 i6y i7 i6. Y2 i6 O73 i6w t } i6v i6uO31 i6u o7x i6u o0f i6u i6- T5 i6s Y1 i6s i6f i6s $7 i6r o5v i6r o5o i6P ^X i6. o3. i6n o7d $! i6m i6LO34t i6LtO34 i6kO73 i6iO72 i6iO23 i6# i7$ i6. i3, i6h i7e i6h c i6h 'A i6h ,7 i6G u i6e +7 ,4 i6e ,4 +7 ] i6e i6DO42 i6d $l i6= D0 i6/ c i6A .5 i6@ $A i6_ -A ] i6a i68 -4 i6@ -8 $( i68 i68 i67y2O43 i67 $) i6+ ,7 i6, ,7 i67 i65 $9 i65 *35 i6. *46 i64 *57 i64 $1 i64 i62O74 i62O41o45 i62 ] i61 s2- i61 o70 i6. -1 i60 *BA i6* $* i6/ i6! i6_ $_ $@ i6! $/ i6, $! i6- ] i6@ ] i6 i5yO62 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 i5uO21 i5u $! i5tO62 i5TO03 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 i5lOB1 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*07O53 i5E i5d t $* i5D i5d $@ i5d [ i5C L7 i5c $1 i5% c i5bO02 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 i54O03 $= i54 i53 $8 i53 $3 i53 ,2 i53 $! [ i53 i52 Y1 i52O12 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%O21 i4x *10 i4X ^1 i4w i26 i4w [ i4v $e i4v } } i4v i4u D0 i4TO13 i4t o5h i4t ] i4sO02 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*67O25 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. i3zz1O03 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@O61 i3-O52 i3@O51 i3w $q i3w i3e i3w D1 i3w *52 i3w *03 i3v o0w i3u ^x i3u o4@ $. i3u i3t y5 i3t o2w i3T ,4 i3SO51 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 i3mO65 i3m $p i3m i3k K i3k $g i3k *01 i3j o5l i3j i5x [ i3j i3iO53 i3i T1 i3i -4 i3. i26 i3h $f i3h D1 i3h -0 i3gO42 i3g ^v i3g i04 i3g ^6 $* i3g i3f K i3f $g $/ i3f i3f i3e o0M i3e ^9 i3e -2 i3E $! i3= E i3d ^s i3di3zO21 i3d ^e i3d *40 i3d +4 i3d .2 i3c $w i3c $! i3c [ i3@ c [ i3c i3B o4C i3b -7 i3B .4 i3b +1 i3aO63 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 i36O72 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 i2xO32 i2x ^q i2x -5 i2x -3 i2WO34 i2w ^s i2v K i2v *53 } i2U i2ty4O82 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 ] i2qO52 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 i2fO52 i2e o93 i2d i43 i2d i2w i2d *31 i2c K i2c i2bO36 i2b i2a C ^E i28 i21 i28 $4 i2- ^5 [ i25 i24 i2q i24 ] [ i24 i23 ,6 i23 i22O32 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 $. i1xO34 i1x $a i1x { i1wO23 i1w i4t i1w i17 i1w ^b i1W .0 c $! i1w i1w i1VO63 i1v p1 i1v i1i i1U ^z o2f i1u y4 y4 i1u C i1TO23 [ i1t ^s i1t +9 i1t ^7 $@ i1t i1s i1c i1s i14 i1s i01 i1s $9 i1s ^5 i1s i1RO23 $. i1r ] i1. r i1pY3O02 i1P ^Y i1pO02Y3 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 i11O61 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 i0qO13z1 $- 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 i0JO35 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 ^HO21D1 $h u $h t $J $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 ^gO71 $gO41 ^gO16 ^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*08O43 ^G $$ ^G $. ^@ ^G $g { $g [ ] $g ^g ] $F Z4 $f Z3 $F Z2 $F Y1 fO96 fO93u fO91 fO7Au }fO76 fO69u fO24 fuO93 fuO7A fuO69 f t ^z $f $s ^M f q ^f ^o $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 ffO05 $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 EO63$8 EO45 $eO41 ^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$8O63 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 } dZ1O71 d Z1 ,6 d $* Z1 d y3 .4 [ d Y3 ^D Y2 d $Y dOA3t dO87t dO81u dO72r dO71Z1 dO71[ $DO62u d[O61 dO52t dO46 dO41t dO15 dO12u dO04u dO04i8- dO04E d}O04 dO03K ^D ^X ^d ^w duO81 $DuO62 duO12 duO04 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 dtOA3 dtO87 dtO52 dtO41 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 dKO03 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 dD8O05 d D6 Z2 d D5 t d D4 t d D4 'B d D0 t $d $D d d dCO03 d 'B y3 d*BAO04 DA i5l DA D5 DA ] $D ^A d'9O01 D9 T9 D9 slL D9p1O08 D9 o3i $+ D9 d { '9 D8 o9g D8 o8t D8 o3q D8 i4_ $* D8 E D8 c $6 D8 $. ^a d *89 u D8 +8 D8 $6 c D8 +3 D8 ^2 D8 ^1 D8 $? ^d ^8 D7 $y D7O21 D7O02^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 D6dO04 D6 DB d *67 u D6 -4 D6 $. $, D6 ^d -6 D5 $z D5O61$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$AO61 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 D3O81 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 D1O81 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*1BO74 D1 $a D1 ^1 D1 $. $! D1 ^d -1 d $0 Z1 D0 y3 *35 D0 y2 y2 D0 Y2 .0 $$ D0 Y1 D0O62 D0O41$. D0$.O41 d +0 t D0 $q D0 o3k D0 k D0 i5= d*08O01 d *04 t D0 .1 k D0 .0 Y2 ] d +0 ^@ ^D d $. $. ^d { $d ^d $! ^_ ^d C z5 Cz4O71 [ C z3 c ^$ z3 c z2 D7 C $! Z2 ^C z2 $/ c Z2 ^c z2 { C z1 cY4O32 C Y4 ] c Y2 Y2 ^c y2 *29 $C Y1 u ^C y1 $- c Y1 $c $y cO91T9 cO84$1 cO52 $cO41 cO32Y4 {cO32 cO13$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$7O13 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$1O84 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 $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 $AO83 ,AO64 $AO53 $AO31 $A ^v +A u ] ^a^sO43 $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, $Ai4 O43 $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 *A4O0A ^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 $9Z1O03 ^9 z1 u +9Y5O06 $9 Y2 ^9 Y2 +9 Y1 T1 +9O06Y5 $9O03Z1 $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 *97O53 *97 i33 *97^aO71 *95 *A6 *92Y5O15 *92O15Y5 *91 *37 +9 $1 ^9 ^1 '9 $0 ,9 $0 +9 $@ $. $9 ^8 z3 $8Z1O42 $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 ^8O43 $8O42Z1 $8O42 $8O14 $8O03 ^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 *89Y4O32 *89O32Y4 +8 ,9 -8 ,7 Z1 +8 -7 -8 +7 -8 .7 *86Y3O02 *86O02Y3 *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 $7O91 ^7{O51 +7O02 '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 $7dO07 +7 D8 +7 D6 u $7 $D ^7 ^d $7 c Z2 +7 c T1 '7 ^c -7 c $* -7 $* c *7BO71 ^7 $B *79 *6A *78O02 *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 *75O71 *75 $u *75 o7f *75 o3w -7 $5 E *75dO05 *75 +7 *75 *26 +7 +5 -7 *45 *74 *45 *74 *21 .7 +4 ,7 -4 ^7 +4 *73 o2f ,7*37O21 *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 $6O71 $6O45E ^6O21 ,6O03 $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 $6EO45 '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 *69O32 *69 o6% *69 $. -6 -9 *68O08 *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 $5O71 .5O32 $5O12 $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 *58O61o7b *58 *86 *57 k +3 *57 i5( *57 *46 $. *57 $. *46 *57 +3 k *57 .2 *57 +0 *56O62u *56O02o7j *56uO62 *56 ^s *56p2O14 *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 $! *52O51 ^5^2O41 *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 ,4y5OA1 $4 Y4 Y4 $4 Y3 $4 Y1 $4O83 -4O52+3 $4O51C ^4O43 -4O31 $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 ^4fO06 +4 d u ,4 d u $4 DA $4CO51 $4 $c ,4 $A { ,4 $a *48 D8 *48 +4 $4 -8 .4 $8 *47Y3O41 *47O41Y3 *47qO17 *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+3O52 *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 *40O31 *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 -3y4O75 $3 y4 c +3 y3 y3 -3 y3 y3 ^3y1O42 $3OA1 $3O93t $3 $w $a -3 u f -3 u d $3tO93 -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 $3iA8O43 ^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 *32O61 *32O03 *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 *31O31i0a *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 +2O72,3 ^2O32 $2O13 ^2O13 $2O12-0 $2O12 -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 *28O62 ^2 $8 p2 $2 +8 $2 ,7 Z1 *27 o7b +2 *73 *54 ,2 *71 *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,3O72 *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-0O12 *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 $1Y1O71 ,1 y1 $. ,1 $. y1 $1OB3 $1OA2c $1OA2 $1O71Y1 $1O53$1 $1O04 +1 $w Z2 $1 ^w +1 u z5 +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 l y4 ^1 ^L -1 K $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 $1cOA2 $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 *12 Y1 k *12 o5@ *12 o0v *12 k Y1 *12 K $1 *21 [ $1 *20 $1 .2 .1 +2 ^1 +2 $1$1O53 $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 *04O41 *04O12 *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 *01O51] *01]O51 *01O31^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 $zZ2O41 $z Z2 o9x $z Z2 *41 ^Z z2 $z Z1 E $Z z1 ^z Y3 ^Z ^z Y2 $z y1 $zO93 ^zO63 $zO41Z2 ^ZO32 $zO03 $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 Z5Z5O43 Z5Z5O04 Z5 Z5 *45 Z5 Z5 ,3 Z5 Z5 $1 z5 z5 Z5 Z4 [ Z5 [ Z4 ^+ z5 z4 ^ z5 z4 $% Z5 Z2 z5Z1O36 Z5Z1O23 z5 z1 $* z5 $* z1 Z5 Y5 Y2 Z5Y5O13 Z5Y5O04 z5 y5 u Z5 Y5 *54 Z5 Y5 *45 Z5 Y5 $1 Z5 Y4 ,4 Z5 Y3 ,2 Z5 Y2 Y5 z5Y2O46 Z5 Y2 Z5Y1O23 Z5O64t z5O57t Z5O52t Z5O51$9 z5O49t z5O46Y2 Z5O43Z5 z5O39t z5O36Z1 Z5O23Z1 Z5O23Y1 Z5O13Y5 Z5O04Z5 Z5O04Y5 z5 u y5 Z5 u ^D Z5 u *45 Z5tO64 z5tO57 Z5tO52 z5tO49 z5tO39 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$9O51 Z5 *98 t Z5 -9 -7 z5*91O46 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 z4z5OA3 ^+ 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 z4Y1O35 Z4O63C z4O39t z4O35Y1 z4O34-1 z4O27t Z4O23p1 Z4O21u Z4O06i2= z4 ^W z5 Z4uO21 Z4 u z4tO39 z4tO27 $ 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 Z4dOA2 Z4 C z4 Z4CO63 $ Z4 +4 $z *41 Z2 z4-1O34 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 z3O45t Z3[O41 z3O3A Z3O35 Z3 ^V Z3 u T8 z3tO45 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 Z3dO05 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 $ Z2O83 z2O61*53 $>Z2O52 Z2O42c z2O42] z2]O42 Z2O23[ Z2O21O61 z2O21E Z2O13y3 Z2[O13 [Z2O13 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 Z2p2O03 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 ] z2fO3A z2EO21 Z2 E oA! ] z2 E $* Z2 D6 $? Z2 D4 Z2 $D Z2 $d } Z2 ^d Z2 C z2 Z2cO42 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*53O61 $$ Z2 -5 z2 '5 $- Z2 *43 Z2 *37 $. Z2 $. *37 Z2 $3 ^* z2 -3 Z2*27O51 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 $. ^z $2 ^! z2 ^ z2 ] ^ ] z2 z1 Z5 ^B z1 z5 $* z1 $* z5 z1 Z1 $D Z1 z1 *1A z1y5O03 z1 Y5 ^q Z1 Y4 ^R Z1Y3O03 z1 Y2 $. z1 Y1 ^m $- z1 Y1 ^! z1 Y1 ^$z1O92 Z1O72 Z1O52$* Z1$*O52 Z1O43y5 z1O42y4 $@Z1O14 {Z1O05 Z1O03Y3 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 Z1dO03 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 +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 $YOA4u ^y$ O98 $yO52t $yO14+4 $YuOA4 ^Y { ^U $ytO52 ^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 y5y4O63 y5Y3O76 [ y5 Y2 y5OA5u Y5OA4O52 y5O94E y5O94 y5O92D7 y5O92} [y5O91 Y5O84$0 y5O83 Y5O82E y5O82 y5O76 $!y5O76 y5O75O02 y5O75+7 y5O75.3 Y5O74,8 y5O74+6 Y5O73D3 y5O68$! y5$!O68 y5O67 y5O64C Y5O63l Y5O63-5 y5O63*30 Y5O63 Y5O62+4 Y5O61 Y5O58 Y5O57i3i y5O54i7 Y5O53o5. y5O53l y5O53E Y5O53D8 Y5O53.4 Y5O52i6e y5O43u y5O34$L Y5[O34 Y5O2B y5O2B Y5O28 Y5O27 Y5O24 Y5O23i5k y5O21o2a Y5O18 Y5O17 Y5O13l Y5O13 Y5{O12 Y5O06$f Y5O06C y5}O04 Y5O03+0 y5O02O71 y5 u z1 y5uOA5 y5uO43 Y5 u D4 Y5 u $0 [ Y5 u y5 t T0 y5 T1 y5 T0 t y5 T0 '9 y5 t $0 $* y5 t Y5rO93 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 Y5lO63 y5lO53 y5$LO34 Y5lO13 Y5 k ] Y5 ] k y5 K y5 $j y5 iAt y5 iAD y5i5yO74 y5 i5o y5 i5m y5 i51 Y5 i50 ] Y5 ] i50 Y5 [ i4; Y5$fO06 y5EO94 Y5EO82 y5EO53 y5 E D6 y5 E *13 y5 E ] y5 ] E y5 ^E Y5DAO34 y5 DA o5s Y5 DA y5 D6 E Y5 D4 u Y5 D3 +2 Y5 D2 o9. y5CO64 Y5CO06 Y5 C ] y5 *BA K y5 *AB K Y5 'A *52 Y5 $A y5 '9 T0 y5*8AO64 y5 ,8 *48 Y5 ] ,8 Y5 '8 Y5 ,8 ] Y5+7O25 y5+6O74 Y5*62O05 y5 *60 Y5-5O63 y5*5AO92 Y5 *52 'A Y5 -5 Y5+4O62 y5 [ ,4 y5.3O75 y5*30O63 y5 ,2 k Y5 +2 D3 y5 *21 y5 ^1 C Y5*19O04 Y5*13O25 y5 *13 E Y5 $1 y5 $1 Y5$0O84 Y5 $0 u y5 $0 t $* Y5 ] Y5 y5 $! [ y5 $! y5 [ $! y4 Z3 *65 Y4 Z2 *67 y4 Z2 Y4Y4O12 Y4Y4O06 Y4 Y4 ^G Y4 Y4 $9 Y4 y4 ] Y4 ] y4 [ Y4 y4 [ y4 Y4 Y4y3O59 y4 y3 '8 y4 Y3 y4 Y2 ^A y4 Y1 o4t y4O85-6 y4O81D5 y4O72-4 y4O67E Y4O64 Y4O62u Y4O62 y4O62] y4]O62 y4O58$8 ^*y4O56 Y4O53$2 Y4O43t Y4O38K y4O37K Y4O35T2 y4O32] y4]O32 Y4O31K y4O23*15 Y4O12Y4 y4O12 Y4O0B Y4O06Y4 y4O02saN Y4^wO52 Y4uO62 Y4 u T1 Y4 u D6 Y4 u +4 Y4 u ,4 y4 u +4 Y4tO43 Y4 t T1 y4 t iAA Y4 t ^D Y4 t +4 Y4 t *36 Y4T2O35 Y4 T1 t Y4 t ^1 y4 } T1 y4saNO02 y4 ^S 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 Y4KO38 y4KO37 Y4KO31 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 y4i0qO62 Y4 ^G Y4 Y4fO28 y4 f o8c y4 ^f y4EO67 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^AO12 Y4 'A o9s y4 $A $b Y4 $A Y4 $a y4*95O06 Y4 .9 y4$8O58 y4 '7 K Y4 *72 ] Y4 ] *72 [ Y4 -7 y4 +7 y4-6O85 y4 +6 E y4 *65 Z3 y4 *65 Y4 ,6 -4 y4 +6 y4 *59 Y4 $5 y4 -5 y4-4O72 Y4 +4 u Y4 ,4 u y4 +4 u Y4 +4 t Y4 *4A 'A Y4 -4 ,6 Y4 *36 t Y4$2O53 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 y3y5O5A Y3Y5O27 Y3 y5 t Y3 ] Y5 y3 Y5 y3 y3 Y1 y3y3O58 Y3Y3O45 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 y3OA4c y3O81] y3]O81 Y3O76 y3O73c y3O65 }y3O63 Y3O62[ y3O54 y3O53T1 y3O53C Y3O53 Y3O45Y3 Y3O41T1 ^.y3O41 Y3O32 Y3O31l Y3O02t y3 u Y3 Y3 $u Y3 t y5 Y3tO02 Y3 t o4Y y3 t $2 y3T1O53 Y3T1O41 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% y3o9tO53 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 Y3lO31 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 y3i0KO32 Y3 $i Y3 E -6 y3dO63 Y3 D6 $A y3 D5 Z1 Y3 D4 y4 Y3 D4 Y3 Y3 $d Y3 C Y3 y3cOA4 y3cO73 y3CO53 Y3 c o34 y3 c ,3 Y3 c ^1 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*75O02 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*58O12 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*27O76 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 y2Y2O63 Y2y2O43 Y2 Y2 $x y2 y2 K Y2 Y2 ^E Y2 y2 c y2 y2 'B y2 Y2 $A ] Y2 y2 y2 Y2 ] y2 Y2 Y2O84$0 y2O82 Y2O75 y2O71y2 y2O71i1a y2O71*04 y2O63Y2 y2O62*06 y2O42T6 Y2O42*87 Y2O32-1 y2O1AC y2O1A Y2O15t y2O15$! y2$!O15 Y2O13y3 y2O04^w Y2O04 y2O04 Y2O02 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 Y2tO15 y2 t $S Y2 T4 -8 y2 T4 y2 t ,4 Y2 T1 *8B Y2 t [ Y2 swS Y2 sLm Y2 ^s Y2 r o3y Y2 r +3 Y2 R0 ^& Y2 ^q Y5 Y2qO12 Y2p3O08 Y2p2O84 Y2p1O06 y2 p1 y2 ^p Y2 oBE u Y2 oA6 Y2 oA. Y2 o9. Y2 o8p Y1 Y2o8eO61 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 Y2i5tO61 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 y2CO1A 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*64O62 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*49O24 y2 *43 o0x y2 *43 o0F y2 *42 k Y2 $4 Y2 -3 *7A y2 *37 Y2 *30 *21 y2 .3 y2 { *28 Y2*27O42 y2 *24 ^s Y2 *21 *30 Y2 +2 y2 ,2 y2 -2 y2 ^2 Y2-1O32 Y2 $1 p3 y2 *15 E Y2 *12 o4k y2 +1 $y *21 Y2$0O84 y2 *06 y2*04O71 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 Y1O61 $!Y1O53 y1O52+3 $&Y1O42 {y1O37 Y1O34r Y1O31D6 Y1O21 $$Y1O21 Y1O03^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 y1fO76 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 *8A y1 ,7 u 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+3O52 y1 $3 u Y1 ,3 t y1 ^3 t 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 $XZ2O43 $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 { ^xO61 $xO52 $XO43Z2 ^xO25-3 ^XO24u $xO02 ^XuO24 $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 OB5iBi OB4oBt OB3+B OB3,B OB3 OB2K OB2iA OB2$9 OB1*67O72 OA9kD4 OA9D4k OA8c$1 OA8$1c OA3oA1 ]OA3] ]]OA3 OA2Y2 OA2O42 OA2oBu OA2o5w OA2K-8 OA2dO0A OA2-8K OA1u OA1tD4 OA1o9c OA1i5l OA1D4t O96 O94 O93O19C O93o05 O93CO19 O93c$9 O93$9c O93$! $.O93 O92Y2 O92sey O92-A ^@O92 O91O41K O91uDB O91o99 O91KO41 O91i61 O91i6. O91DBu $@O91 ]O91] ]]O91 ^x $8 D1 O87o2 c O85 O84i88 O83o05 $!O83c O83+5 O82Y4 O82$w O82p4$a O82o9u O82o4y O82'Bi8a O81$r O81o7i O81o7b O81o42 O81E O81^e O81DB O81*AB O81*42 O81$1 $@O81 O76+5 O74^1 O73i7c O73i5D O72Y3D3 O72Y3 O72o5@ O72lL8 O72$li7b O72L8l O72i7g O72i7b$l O72i6p O72D4 O72D3Y3 O72cT4 O72-A O72*23*24 O72$1 O72] $.O72 [O71O31 O71uD4 O71u*78 O71o7z O71o66 O71o62 O71o3F O71o1C O71i5D O71D4u O71^d O71d {O71*80 O71*78u O71*73] O71]*73 $/O71 $;O71 ^x -7 O6B O67Z1 O65o52 O65o3H O65$b O64Z1 O64u O63y5u O63uy5 O63i6i O63i5k O63$8 O63*76p3 O63*45+1 O63+1*45 O63$? O63[ O62Z1soe O62Y3[ O62[Y3 O62$W O62^w O62^T^U O62T0] O62]T0 O62soeZ1 O62$s O62o3c O62o0T O62o0R O62$o O62$K O62+A O62$A O62,7 O62*67-0 O62-5 O62$3 O62*20 O62-0*67 O62$_ $$O62 O61^zo66 O61Y3+6 O61O92 O61^x O61$r O61^Q O61o9n O61o81 O61o4w O61o3D O61^l O61K O61i5e O61i4h O61i1m O61Eo6W O61^B O61+6i2z O61-6 O61*34 O61$/ $-O61 O59 O57o2v O57$1 O54O41 O54sai O54p1E O54E O54c O54^5 O54+3 ]O54 O53$^Z1 O53Y2$A O53Y2 $!O53Y1 O53o0R O53l O53K O53i7_ $*O53i58 O53i5@ O53i1V O53$h O53*56 O53*20 $>O52Z2 O52$z O52y5$! O52$!y5 O52y4O01 O52Y4] O52Y4 O52O62 O52$st O52seB O52sbf O52r^d O52rd O52o3l O52i7. O52i3x O52i2v O52i2k O52i1oy2 O52$e O52dr O52*75$. O52$.*75 $.O52*43 O52*35] O52]*35 O52,3 O52*24y5 O52$. O52$, O52^! O51Z3[ O51[Z3 O51Z1^6 O51O13 O51O03 O51$w O51^U O51tR5 {O51t O51R5t O51R5*47 O51^PD3 O51p4.2 O51o5= O51o4S O51o4_ O51o2q O51o0r O51o03 O51K$y O51k^r O51k$f O51i68 O51i4o O51i3, O51i2y O51i2/ O51$fk O51^6Z1 O51$$-6 O51$6 O51-6$$ O51$5 O51^5 O51*47R5 O51*25 }O51 O48o5d O46] O45Z5Z4 O45Z4Z5 O45tp1 O45T0$5 O45p1t O45o5d O45$5T0 O43O62 O43o3@ O43i3k O43i2m O43^f O43D1 O43$?$1 O43$+ O43$ O42Z4u O42Z2 O42$Z O42y5 O42y3Y2 O42Y3 O42y2y5 O42Y2y3 O42Y2 $&O42Y1 O42uZ4 $*O42u O42td O42stk O42$rc O42$Q O42p2D6 O42o6j O42o4 O42o0v O42^j O42i7 O42i6. O42i5e O42i48 O42i1h O42dt O42c$r O42^bO41 O42*21+0 O42+0*21 O42$+ O42$@[ O42] O42[$@ ]O42$* ]$*O42 O41Y5O34 O41Y4] O41y2 O41O81 O41O52 O41T5 O41soi O41seJ O41se3 O41sBG O41o5-*56 O41o4y O41o4b O41o40 O41o3t O41o2q O41o1lk O41o0z O41o0m O41ky4 O41i6u O41i6m O41i5c O41i3S O41i2r O41i2h O41dE O41DB O41^By1 O41-6 O41-3D1 O41^! O38o3vo2p O38o2po3v $*O37 O35Z2y4 O35y5T9 O35y5c O35y4Z2 O35^uy5 O35i2x O35i1l O35D4 O35*43*07 O35*12 O35*07*43 }O34y3 O34[y2 O34$wi2v O34^w O34u[ O34tp1 O34^s }O34q O34p1t O34o1S O34i2v$w O34dc O34^8{ O34^2o23 O32y5O91 O32Y4c O32Y4*12 O32Y2$v O32Y2l O32$y O32O81 O32tK O32]r O32^P O32o4s O32o2ry4 O32o24 O32o0g O32lY2 O32Kt O32^K O32^k} O32k O32i3@ O32i0g*41 O32cY4 O32c O32$a $ O32*84 O32*75o5y $+O32.6 O32-4p4 O32*20 O32*12Y4 O32$0Y1 $.O32*01 O32$, O32$ O31Z5u O31}Y4 O31y2^t O31$wo3x O31uZ5 O31td O31t O31stJ O31sa@ O31^s O31R5 O31o52 O31o5@ O31o3x$w O31o21-1 O31o1b O31o0j O31lf O31ld O31K-9 O31i9. O31i86 O31i52 O31i4; O31i2s O31fl O31E-7 O31E$4 O31dt O31dl O31$A-2 O31^a O31^9y1 O31$8 O31-7E O31^6z2 O31$5 O31$4E O31-2$A O31^2 O31-1o21 O31$1 O31+0 O31$. $*O31 O28p3'A O27y2u O27y1 O27uy2 O27p3l O27lp3 O26y2u O26uy2 O26T0 O26s*0 O26cT2 O26[ O25z2 O25uR5 O25u O25R5u O25p4l O25p4k [O25p2 O25lp4 O25fk O25fD6 O24y3 O24Y2f O24y2 O24qy1 O24p2l O24p2E O24o1- O24o0Fl O24lp2 O24K-3 O24i2. O24^g O24Ep2 O24d*54 O24$d {O24$7 O24-3y4 O24-3K O24$1 $@O24 [O24 O23z2Y2 O23Y2z2 O23y2[ O23R2 O23$Q O23p2$2 O23i4. O23i2p O23i1o O23$A O23*73 O23$5 O23-3Y4 O23$! O23 $$O21Y1 O21^w O21ud O21$s O21qE O21p1l O21oA1 O21o0v O21lp1 O21ld O21l*31 O21i46 O21i3% O21i1d O21i01 O21^h O21du O21dl O21D2$8 O21d O21C O21^c $!O21c O21$8D2 O21-7 O21^6 O21*31l O21*04 O21$% ^#O21$# ^#$#O21 $x *20 O1Bz4 O1Bz3 O19Z5Z4 O19Z4Z5 O19y4,4 O19p2'A O18O13 O18t O17z2 O17p3l O17lp3 O17i2h O16z4t O16z3Y5 O16z3t O16Y2 O16tz4 O16tz3 O16R0 O16p3l O16lp3 O16$* O15z3t O15z3 O15^z O15y1t O15y1 O15tz3 O15ty1 O15tR0 O15p5 O15i4q O15i3w O15Cz3 O15Cy1 O15{ $*O15 O14z3y3 $@O14Z1 O14y4E O14Y4c O14y4*48 O14y4 O14y3 O14y2^- [O14u O14tq O14to3* O14qt O14p4$h O14p3l O14o4@q O14o3*t O14o2v O14lp3 O14^k O14i1i O14i0\ O14dC O14cY4 O14^c O14*04d [O13Z2 O13Y5l O13Y5$a O13y4 O13Y3k O13Y2y5 O13y2,6 O13y2 O13u O13tp2 O13t$* O13$*t O13p2t O13lY5 O13kY3 O13i41 O13i2. O13f-3 O13}^F O13^f O13^.^c O13$8 O13,4y2 O12^@^Z O12Y4o0F O12Y4^b O12y4 O12Y2u O12y2 O12^#y1 O12uY2 O12p2 O12o7q O12o5W O12o4c O12o0FY4 O12$K O12i4y O12i3 O12i2h O12i21 O12Eo1B O12^e O12^c O12^bY4 O12^b O12$9 O12}$6 O12-5 O12-2 O12*12 $x *12 ^x .1 O0Bz3 O0Az5 O0Ay2 O0AY1 O09p2 O09p1 O09d O09.1 O09^0 $ O09 O08z3u O08uz3 O08p2*75 O08$* O07Y3y3 O07y3Y3 O07p2 O07p1 O07d O07+1 O06z5 O06y3 O06^9 O06^4 O06^3 O06] }O06 ]O06 [O06 {O05Z1 O05R0 O05^%q O05k O05D0 O05$9 O05+0 {O05 O04Z1y5 O04y5Z1 O04Y2f O04O71 O04o3v O04o09z2 O04i5% O04d+7 O04C {O04$c O04.2 O04,2 O04+1 O04} O04] [O04$@ [$@O04 O03^zZ1 O03Z1^z O03Z1y5 O03Z1Y3 O03y5Z1 O03Y2$5 $x *03 Y1 O03$y O03OA2 O03$*^X O03^T O03smk O03$Qp3 O03p2 O03p1c O03o3l O03^jy2 O03i64 O03i6* O03i31 O03i2T O03i2e O03i24 O03i2?} O03f O03D4 O03^D O03C O03{ $ O03 ^?O03 O02Z1y2 O02Y3 O02y2Z1 O02$V O02TA O02^T O02sar O02^Qy1 O02o5g O02o2j O02i6l O02i59 O02i3f O02i34 O02i2f O02i24 O02i1w O02i1o O02^H^A O02dC O02c$8 O02C O02$A O02$8c O02*87 O02*71 O02-5 O02*21p2 O02+0 O02$* O02{ $!O02 O01}^v O01t] O01$q O01p1O36 O01o5 O01o4t O01o2w O01o2m O01o1g O01kD5 O01i3M O01i2t O01D5k O01$d*46 O01cT1 O01*46$d O01[ }O01 $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 $WO31 $WO12 ^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 $wdO02 ^w d ^w ^C ^w *87 ^W ,8 $w ^7 ^w*67O41 ^w +6 ^w -6 $w .4 $j ^w *43 ^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 ^vO71 $vO31 $vO01 ^v $v k ^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*61O13 $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 uy4O52 u y4 ] u ] y4 u y2 D4 u Y2 [ u [ Y2 $u ^y uOB1oAA uO91+8 uO53 uO51$O uO51'B uO43z2 $*uO42 uO41$5 }^uO41 ^uO31 uO21i1N [uO14 $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 up2O6A up1OB5 up1O62 up1O43 u p1 -8 u $o Z1 u$OO51 $u oB@ o92 u oB3 ] u oAU uoAAOB1 ^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 ufO69 u f D7 u $F ^U ^E u ^D Z1 udOA1 udO86 udO03 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+8O91 u +8 d u '7 Z5 u *7A u +7 *45 u ,6 Z5 u ^6 z1 u ^6 i57 u*63O41 u$5O41 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 tZ5O64 $ 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 tZ1O72 t Z1 ^B ^T $z t $Z [ t [ $Z t Y5 o67 t y5 o44 t y5 *09 $* t y5 ty4O82 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 tO72Z1 tO62Y3 tO51d {tO51 ^TO43 $tO31 tO25d tO21o0T tO15 ^tO13D3 tO12^h } ^T ^X $t ^x t $W ^t ^V $t $u t T3 T1 t T1 T3 t sU1 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 tp2O52 tp2O4A tp2O2A 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 to0TO21 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 tdOA8 tdO45 $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 $@ T8z4O07 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 T6O71 T6O01^W T6 T5 $7 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 T5Y4O63 T5 Y1 { T5O63Y4 T5O13} 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 T0Z2O24 T0Y4O32 T0O51$6 T0O51^4 T0O32Y4 T0O24Z2 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$6O51 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 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 $sO73 ^sO52 $SO43 ^sO32 ^sO31 ^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 sTsO31 sTL ,5 stl +0 stg $$ std sta i8n ^S t .3 ssz $f ^s $s z1 ss,y4O81 ssu +3 ssS T3 sSr -5 ssn i59 ssn ssj y2 ssj *03 sSi ^c ssG y2 p4 sSf Y3 sSC T3 ssb *71 ss8O92$9 ss8$9O92 ss5 $n ss5 ^S $S sr, Y1 l sR*O42t sR*tO42 $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 snHO65 snh -2 snf $1 sna $S ^N } $* sn+ smz smx *73 smW C $1 smW $1 C smVO41 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 sizO42 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 sHTO61 shp $k *73 shMO42 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 sfHO13 sfc sfa u sF7 z1 sF* sf* sf@ s- f $s $f sexO52 seu *02 sET p2 ses *20 seR T2 seq sep ,5 sel $1 seiO82 s/e i6l se@ D0 sec Z1 se( c sec se4 +1 se3O61c se3cO61 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 sCJO51 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^O31 sav *47 sauO32 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+O02p4 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 s6HO73 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 rz2O51 ^r z1 l $r Z1 r$yO74 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 ^RO82 r$!O82 ^rO72 [rO51 $rO41 rO32$j rO31p2 rO28t rO27u rO12d ^rO12 r ^x ] r ^w ruO27 ^R ^U $R u r u ] r t y3 rtO28 r { T8 ^r s1. r R5 *34 $r $R ^r ^R r $q -3 $? r q $ r q ^r ^q rp2O09 $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$jO32 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 ri0rO12 ^R i0I ^R i0B $r i06 $- $r i04 $r i0@ $r $i ^r ^H $r ^h r ^G Y1 ^r ^g rfO36 ^R $f rdO05 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 R7O43t R7tO43 R7 T0 R7 R7 se3 R7 R7 T0 R7 o6@ R7 E $2 R7 C Y1 r -7 +6 R7 $2 E R6O23t R6tO23 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 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.4O52 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 R3 u R3 t -1 R3 soe R3 r *02 r -3 $q R3 i42 R3 i32 R3 i3@ R3dO62 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 R0O32*15 R0O1B 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 ^qz5O18 $q Z5 $q Z4 t ^q z1 Y1 $q Z1 i04 $Q Z1 *34 qY4O12 qy3O67 qy3O57 $Q y1 Z5 ^q Y1 z1 q Y1 y1 q y1 Y1 $Q Y1 [ $Q [ Y1 qO87c qO87$1 qO83o8. qO72 qO6A*40 qO52 qO38$v qO35y3 ^qO34 qO26z5 qO26C qO23-1 qO21l qO1Ad qO16+3 qO15 ]qO15 qO12Y4 qO12 $qO12 qO01k ^q ^x ^q $W q$vO38 q u $q t Z4 ^q t i1Q q TB $[ $q R8 $? q r $ q r $qqO14 ^Q ^q i68 ^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 qlO21 ^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 qcO87 qCO26 $Q c ^A q C } q *B0 q .B [ q ^A q '8 z5 ^q +7 $q +6 $q *47 q*40O6A $Q *34 Z1 ^q *34 y3 $q *34 *32 $Q ,3 q ] $3 $q ^3 q *24 *13 q *20 q$1O87 q-1O23 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 $PO23 ^pO14 ^PO13 $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 p5OB9] p5]OB9 p5O85*12 p5O5A,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*12O85 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 $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 p3Y2O9A [p3OA7 p3O9Bu p3O9Bt p3O9AY2 p3O6Bu p3O69O04 p3O61-0 p3O49u p3O2A p3}O08 p3O01$a p3 ] ^x p3 ^x ] p3 $v [ p3 [ $v p3uO9B p3uO6B p3uO49 p3tO9B 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$aO01 p3 '9 o0M p3 ^6 K p3 *53 *14 p3 ,1 r p3 $1 i6t p3 *17 o54 p3 *14 *53 p3-0O61 p3 *02 R0 p3 *02 r p3 { ^p $3 p2Z3O06 p2Y2OA4 p2Y2O84 p2Y1O05 p2OB5u p2OA8] p2]OA8 p2OA4Y2 p2O9BC p2O94t p2O86u p2O84Y2 p2O7BC p2O75] p2]O75 p2O65u p2O5At p2O59u p2O4At p2O46u p2O3Bp2 p2[O1B p2O17o0d p2O0Bt p2O0Bd p2O0B+4 p2O06Z3 p2O06u p2O05Y1 p2uOB5 p2uO86 p2uO65 p2uO59 p2uO46 p2uO06 p2 u i6K p2tO94 p2tO5A p2tO4A p2tO0B p2 t 'B p2 T8 '9 p2 t p2 sET p2 s-. ] p2 ] s-. p2 $r Z1 p2 ^q { p2o0dO17 p2 $l Z2 } p2 $k p2 $j p2i9gO53 p2 i6K u p2 ^E o2o p2 $d p2CO9B p2CO7B 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 p1y4O74 p1y3O63 p1 y2 u p1 Y2 p1 $X L8 p1OB2o6a p1OA4u p1O93 p1O79t p1O69 p1O68] p1]O68 p1O65] p1]O65 p1O65 p1O62u p1O56s29 p1O51] p1]O51 p1O47 p1O35t p1O14 p1O12t p1O08*58 p1O04p1 p1O04d p1O03O53 p1 ] $X p1 u y2 p1uOA4 p1uO62 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 [ p1tO79 p1tO35 p1tO12 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 p1s29O56 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 p1o6aOB2 p1 o6@ [ p1o5RO05 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 p1dO82 p1 DA ] p1 ] DA p1 D7 [ p1 D4 t p1CO0A 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,8O62 p1 $8 C p1-7O03 p1 +7 K p1 .7 K p1 *76 t p1 *75 'A p1*74O57 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 ^oO32 ^o ^x ^o T1 ^g $o t $0 ] $o t ^O ^s ssP $o s1h ^oqO3A $o o4< ^O o3j ^o o1b ^O o0E ^9 $O ^o $o k { ^o ^k $oi8)O45 $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 oB8O83 oB8O81 $@ 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 oAdO45 oAd *A8 oA@ D9 oA! c } oAc oAaO41 oA9 DB oA9 -9 oA8 Z1 $. oA8 oA8 oA7 $5 $! oA7 oA6 K oA6 +9 oA $6 oA4 Y1 oA4O21 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.O71 o9#O62 o9w o9VO71l o9VlO71 o9U u o9U o9t *96 o9t ] o9t o9( s2) o9rO52 o9r t o9p -8 o9p o9o o0s o9o .8 o9. o0, } o9o o9o o9N t o9mO72 o9. k ] o9k o9I c o9i $2 o9g *79 o9f o9e $E o9% E o9 E o9. D5 o9@ D1 o9cO61 o9b o9a *85 o99 y2 o9% *96 $! o99 o9- .8 $_ o98 $& o97 ^# o95 o94 i9_ o9. -4 o93i9 O97 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*O43 o8-O07 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 o8qO52R4 o8qR4O52 o8q *67 Z1 o8| ^P o8P o8o t o8O $2 o8n o8m $l o8m *68 o8m $@ ] o8l o8kO52 o8k t $1 ] o8k t o8k D6 o8k 'B o8k $1 t o8j [ $@ o8j o8i o6d o8I c o8! i1i o8hO32 o8H u o8g $o o8fO94 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 o7rO01 ] 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-^hO14 o7h o4k o7h *75 o7g *14 o7f r o7f o2x o7f *46 o7f *27 o7F o7e $z o7e *61 o7dY5O56 o7, D6 o7d *14 o7D +0 o7c Y2 $1 o7c o0C o7c *76 o7c *52 o7c -0 ] o7c o7bO15 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]O71R6 o6w $z o6W $W o6w p3 o6w } o6_ $w o6V $l o6u o7f o6u $g o6u .7 o6u $1 o6u -0 o6tO51 o6t t o6t $9 o6& T7 o6# T5 o6S ^r o6S o0s o6S $. $. o6S o6s $+ o6s ] o6s ^@ o6R u o6R i9l o6]R6O71 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 o6fO03 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 o62O31 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 o60dO05 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 $$ o5yO64 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 ] o5oO02 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 o5DO41 o5dO41 o5dO01 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 o5afO0B o5a D3 o5a *40 o5a -2 o5a *07 o59 ^s o59 k *15 o59 k o59 i57 o59 ^d o59*24O12 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.O72 o4-O12 $- 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 o4jO81 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 o4ap2O62 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 o44O81 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! o3zO43 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 o3uO41c o3ucO41 o3u *90 o3u -7 o3u .1 o3* u [ o3u o3T Y1 o3tO71 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^IO13 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 o3jO63 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 o3DO61 o3d o83 o3D D5 o3d ^A o3@ D1 o3d *07 o3. $D o3D o3c y3 o3cO21 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 O63 o2x +3 o2x .1 o2_ ^x o2w o1m o2w K o2w $8 o2w *70 o2w -7 o2w *27 o2w *02 o2V ^U o2v *03 o2uO41E o2uO41 [ o2u t o2U o4A o2u o3J o2u K *43 o2u ^i o2uEO41 o2u *43 K o2u [ *20 o2tO42 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 ^< o2sO32 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 o2hO01 o2H u o2h o2g Y2 o2g ^c o2fY5O76 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 $. o23O41 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@O52 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 o1sO31 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 o1JO41 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- o1gO23 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 o1bO31 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 o0zi6-O53 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$O61 o0w sei o0w o4s o0w o3g o0w o2h o0w i3g o0W ^E o0W *81 o0W $5 o0W $- $. o0W o0w $- { o0w { o0vrO34 o0v ^j o0v .5 o0v *25 o0v *20 o0v *02 o0u ^t o0u ^G o0U *62 o0u ^0 { o0T Y2 o0t y2 o0TO21 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 o0sO72 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 o0kO32 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 o0JO51 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 $! o0GO31 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 } o0DO62 o0dO42 o0D o4G o0d ^i o0d $f o0D +B o0d $A o0D $7 o0$ D6 o0d *36 o0D +2 o0D *13 o0C y4 o0c y4 o0cO91 o0cO31C o0c o3m o0C ^J o0cCO31 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 o02O71 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 ^nO23 ^nO13u $n ^w *58 ^n u Z1 ^nuO13 ^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 ^mO32t ^mO13y5 $m ^x +1 ^m $x [ $M u ^m t z1 ^mtO32 $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^LO52 $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 $mi3uO23 $m i2t $M i2a $M i0B ^M ^I ^m ^i ^m ^H ^mfO34 ^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 lY2O05 l Y2 $l $y lOA1o3i $LO91 $LO51 lO41f lO24p2 lO21 lO05Y2 $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 lo3iOA1 ^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 ^C ^L ^B ^l ^B } l ^b ^L ^a l $A L9Z5O25 L9O25Z5 $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 L4O72o3z L4 sbB L4 s7s ^g L4 r i5e L4 o5f L4o3zO72 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 Ky5O63 ky5O01 $K Y5 c [ k y5 K y4 Y2 $k Y4 Y1 KY4O41 Ky4O12 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 KOB6 KO83t KO83 KO72*56 k{O71 KO41t $kO32 kO25 ^kO23 KO21^h kO13$! k$!O13 kO12d $kO04 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 KtO83 KtO41 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 R3 K R2 t K $r k ^R KqO23 $k ^Q $k q ^k p4 ^C k p4 'A k p3 o7. k p2 *35 Kp1O04 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^JO32 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 ki2?O23 K i2l k i2@ c K i2b $k i2b k i1s k i1r ^k i1m ^k i1j ^K i1! k i1& $k i1- ki0@O51 $. 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^fO32 k { ^f k E r ^k E o1H k E i6a k E $9 k E $5 $+ k $e KdO03 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*56O72 k *56 -3 k *54 K K *54 *02 K *53 src ^k*52O12 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 $jY1O12 ^@^JO73 $JO41 ^JO32 $jO12Y1 ^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 $IO71u ^IO52$1 ^i}O52 $IO03 ^i ^W $IuO71 ^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-O53D2 iA O21 iAwO82 iAt oBr iAo *A8 iAm iAj iAi iAhO63 iAhO61 iAeOB2 iAe iAd D8 iAc iAbO24O51 iAbi6uO74 iA -B ] iAa ] iA9 iA8 ] iA8 iA4 $A iA_ $4 iA4 iA2O72 iA0 o8 $2 iA0 $2 o8 iA0 $! iA+ iA, iA= ^i ^a i9. Y2 i9.O31 i9*O03 i9uO53 i9 t i9s E ] i9 sBn i9pO65i0m 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#O74i8p i8 O42 i8@O32 i8*O24 i8W u i8W T3 i8w i8v i8u L7 i8. T2 i8t i8sO95 i8sO52 i8S E i8s D6 i8R *70 i8q $e i8pO62 i8p *34 i8o o7d i8o *84 i8n t ] i8n *67 i8. $m i8m $* i8l i8k $s i8, K i8- $k i8jO43 i8J l i8J i8i u i8.iAIO93 i8.i8 O69 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 i88O94 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! i7zO24 i7Z C i7z ,8 *14 i7z *14 ,8 $& i7z i7y $i i7. Y3 i7_ y2 i7y ] i7y i7XY3O45 i7x $x i7@O13 i7,O13 i7x i7W $n i7w [ i7v ,8 i7v i7U o6P i7t C i7( T0 i7! ^T i7t ] ] i7s i7rO24 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 $! i7gO41 i7fO34 i7e o8f i7e k i7d .6 i7@ D5 i7. D3 i7. D2 $! i7D i7c $d i7c $9 i7AO52E i7AEO52 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 i6xO72 i6X o0w i6x i6z i6x i6- i6 O91 i6x +9 i6X ,7 $.i6)O65 i6.O12 i6x [ i6W s5i c i6w D4 i6W c s5i i6w ^. i6v u i6v s0z *16 $/ i6v o7y i6v *16 s0z i6v [ i6v i6uO05 i6U u i6u o7s i6u *27 i6- t D7 i6T c i6 TA i6t +9 $@ i6t i6sY1O73 i6sO23 i6s L4 i6s *71 $! i6S i6- s- $@ i6s { i6s ] i6s [ i6s i6RO23 i6r i8! i6R i6$ i6R $g i6r -8 i6- R4 i6pO32 i6p o0J i6p $F i6P*63O21 i6oO81 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 i6my4O07 i6m o5. i6M E $2 i6M E i6m .7 i6m *62 i6M $2 E i6m $/ i6m i6l C i6l $8 Z1 i6L *06 $. i6l i6kO42 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 i6hO24 i6h o2z i6gO41 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 i6dY5O13 i6dO13 i6d u i6d E i6- D7 t i6 D3 i6c +7 i6c [ [ i6c i6B ^N i6b $4 i6B $$ i6, 'B i6aO72 i6aO31 i6a o4l i6a i6t i6a i5d i6. *A9 i6 *A9 i6a *63 i6a *25 i6_ +A i69 ] i6 -9 i68 o75 i68 i52 i67O92C i67CO92 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!O12 i5w Y1 i5wO21 i5w r i6x i5W [ o4. i5w $n i5w i4r i5w { i5vO01 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 i5py4O17 i5pO61i1s i5p r i5p i5m i5o r p1 i5o r [ i5o p1 r i5o o6i i5o i5p i5o $7 i5@ o4l i5o $/ i5o ^# i5nO63 i5N i86 i5n i3r i5n ^A i5n .4 i5n [ i5m o6. i5m ^a i5M .4 i5lO32 i5l +5 -3 i5l *47 i5l -3 +5 i5. ^l i5l i5k s6Y i5k ^r i5k $q i5k c ] i5K .6 i5k -6 i5k $= i5k [ i5j Y3 i5j Y1 i5JO32 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 i5DO83 i5DO82 i5_ D9 i5d*60O61 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 $_ i5aZ1O62 i5aO62Z1 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 i57O03 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 i54O32 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 i51O12 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 i4zO53 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.O61D2 i4x ,5 i4x -5 i4*O23$A i4w $z r i4w ^z i4wO12 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 i4RO13 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 ] i4MO14o2p i4M u i4m $t i4m i2s i4m $d i4m $9 i4m $7 [ i4m +5 i4M $! i4m ] i4l ^L i4l *32 i4@ ^# L0 i4kO73 i4kO21O53 i4k ^R i4k $K i4k $5 i4k $3 i4= K i4k ^. i4_ $k $+ i4k $! i4k i4jO21 i4jO02 i4j i4z i4j $h i4J -3 i4j { i4j i4iO65 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 i4BO53 i4b u i4B i4a i4B ^F i4B c i4b $4 i4aO57 i4*$AO23 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 i45O12 i45 T8 i45 o2d i45 ^m i45 i4y i45 c Z1 i45 $* i4@ $5 $% i45 $* i45 ${ i45 i44O62 i44O27 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 i41O01 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} i3zO43 i3z k i3z D5 i3z $8 i3z ,7 i3z *25 i3z $! i3y ^z i3yO61E i3y $p i3y i5h r i3yEO61 i3y *63 { i3- Y5 i3 Y4 i3+ y4 i3_ y3 i3@ Y1 *56 i3@ Y1 i3# y1 i3y { [ i3x Y2 i3xO46 i3x ^s i3x o5m i3 O81 i3@O72 i3x *70 i3"O13$d i3x $1 i3w o7y i3w $k +2 i3w i43 i3w +2 $k i3- ^w i3v $v i3V C i3uO52 i3u i7y i3u i5i i3u i3t y2 i3tO02D0 i3tO01 i3t ^w i3t o6u i3t $k i3tD0O02 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 i3qO71 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 i3kO04TB ] i3K u i3k r i3k o2r i3kKO71 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"$dO13 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 i37fO65 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 [ i31O62k i31 ^S i31kO62 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\O23$2 i2x +0 i2w y1 i2wO03 i2w ^n i2w i3- i2w *52 i2vO01 i2v K i3y i2v $k i2v i5C i2v i3y K i2v $h i2v ^3 i2uO72 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 i2py5O57 i2p Y4 i2p y2 i2pO42-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 i2MO52 i2m sif i2m q +6 i2m i0a $! i2m [ $! i2m i2l o0K i2L E i2_ L5 ^( i2. L0 i2l $. -0 i2l -0 $. i2l $& i2l i2kO71 i2k u i2k i2j i2k *57 i2k $5 i2 k [ i2k i2j $r i2j o0v i2j i0S i2j -8 i2j *31 i2j *07 i2j i2iY4O52 i2i y2 i2iO73 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 i2gO53 i2gO32 i2GO02 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 i2cO63 i2cO42 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 ] i25O61 i25 i3g i25 i0a i2_ *56 i2_ *53 $/ i25 i24 i26 i2. *40 $+ i24 $. i24 i23 i53 i23 $a u i23 $! i2\$2O23 i22 ^1 i22 $- i22 i21 o0R i21 i31 i21fO78 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$1O52 $@ i1x i1WO53 i1WO01^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 i1rO27 } 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 i1nO61 i1n ^h i1n *71 i1n *31 i1n -2 -0 i1n -0 -2 i1M Y5 t i1mO71 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 i1bO52 i1b t i1B o8@ i1a i2b i1a +9 *78 i1a *78 +9 i1_ ^A i19 ^9 i19 +2 i18 Z1 t i18y3O42 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.O12 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 i0nO51 i0N ^V i0n l i0n i2q i0n ^g i79 i0n ^8 i0m y4 i0MO21 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 i0IO12T4 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 i0HO04$4 i0H $i i0H $d i0H$4O04 [ ^- 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 i0bO52 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 i00O35^J i0+ $# i0+ i0@ i0. $. i0? ^/ i0_ ^@ i0^ $- i0. ^ i0= ^I $@ ] $i ^h z5 t $H Z3 y5 { ^h Z3 $hZ2O32 $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 $hO52 $hO32Z2 $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+4O31 ^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 $gO61o3x $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- $go3xO61 $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 fOA9t fOA8 fO98-7 fO87 fO85K fO83] f]O83 fO82-6 ]fO7B fO76 fO72u fO6B^1 fO68*53 fO67t fO67 {fO67 }fO65 fO64c fO63$R }fO5B fO47E $FO41 fO37*20 fO37+1 $fO31 ^fO31 fO23K fO23$9 fuO72 f u i6G ftOA9 ftO67 f t { f { t f $s $S ^f s0q ^F ^S f$RO63 f ^p f oB9 f o8A '9 ^f o4s ^F o2o $f o0F $F $M $f L6 ^f ^L fKO85 fKO23 ^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 fEO47 f E D8 f E D6 f E 'B ^f E -5 ^f d 'B f D8 E f D6 E fcO64 f^bO25 f 'B E ^f ^B f-AO72 f ^a i1e f *A7 *02 ^f ^A ^f ^a f$9O23 f '9 o8A f*96O34 f *8A f-7O98 f +7 K $F ,7 f-6O82 { f *67 f *64 *20 ^f -5 E f*53O68 f *53 f *43 *20 $f *42 ^F $F $3 $f ^3 ^f $3 f*20O37 f *20 *64 f *20 *43 ^f *20 ^F $2 $f -2 f $1 y4 f+1O37 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 EY5O23 E Y5 EY4O32 ^e y3 E y2 o0T $E Y2 D2 E y2 +6 E Y2 ^! E ^! Y2 E Y1 *23 E y1 EOA2 EO71T7 EO71T3 EO61$$ E$$O61 $eO61 EO51$6 EO51 EO42 EO41 EO32Y4 EO21*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 ET3O71 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 EqO48 $e ^q Ep1O64 $ep1O56 ^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 Ei2rO91 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$6O51 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 +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 ^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 dZ2O61 d Z2 .6 d $% Z2 } ^d Z2 { $d Z2 ^d Z2 $d Z1 $d $z dY3O04 d y3 ,4 d Y2 y2 d y2 Y2 d Y2 $d Y1 y1 $d y1 Y1 dY1O54 ^d Y1 r $D Y1 } ^d y1 $d $y d ^X u dOB5 dOB4O03 dOB2,5 dOA2-7 dO92+1 dO83*38 ^dO82 dO67t dO64o7B dO64'A dO61Z2 dO61o65 dO57t dO57l dO57 dO54Y1 dO53] d]O53 ^DO52O03 dO45O78 dO43t ^dO31 ^dO24y2 dO21t dO14c ]dO14 $ dO08 $-dO05 dO04Y3 dO04p1 dO04d dO03-5 dO02y4 dO02i4k dO01t ^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 dtO67 dtO57 dtO43 dtO21 dtO01 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^RO76 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. doAfO06 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 dlO57 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 ] diB9O35 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@ di6gO67 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 ^e d D9 u d D8 t d D7 [ $d D5 d D1 ] d ] D1 $d D1 d D0 i6o dcO14 d c i41 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*B9O06 d +B +7 d *B6 +5 d $B ^d $B DAY2O42 DAO42Y2 d ^A u DA o9a ] DA ] o9a DA o5f d *AB u d*A2O61 ^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 D8OA1c D8O6B D8O61t D8tO61 D8 R6 D8 oAn D8 oA9 D8 o9* Y1 D8 o7k D8 o6u D8 o4@ D8 iBa D8cOA1 D8 +6 *50 D8 *50 +6 d*84O06 D8 *40 $. D8 $. *40 $! D8 } D7 z4 D7 $z d-7OA2 D7O03$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$1O03 d *71 *35 D7 $_ ^[ D7 d $7 d ^6 z3 $* D6 Z2 d .6 Z2 D6 Z1 D6O94 D6 ^v 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,5OB2 D5O01+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 D4y5O42 D4 y2 *60 D4 ^y D4O21r 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 D2O73 d ^2 u 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+1O92 D1O32 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 D0O92[ 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 $" $cZ3O46 c $* Z3 c Z2 s5% C Z2 *47 C Z2 } $= C Z2 C z1 ^e c Z1 *32 $. C Z1 $* c Z1 CY5O18 ^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 cOB1 cOA4 $!cO83 $cO82 cO73o5R CO63^1 cO63^@ cO51z2 cO51 $cO46Z3 cO41o33 CO34f cO34 ^cO32 cO24p4 $!cO21 cO12o21 CO04 {$cO04 $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 co5RO73 C o5R c o5R c o4P c o4F C o41 ^c o3t c o3r c o3A T4 C o3a k co33O41 ^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 ci7_O31 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 CfO64 $C $e ^C $e CdO07 CdO05 ^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 ^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 ,BO72$! ,B$!O72 ,BO64 .BO62 ^bO62 'BO41u ^BO13 ^BO08 $b ^w ^b ^w ^B ^V 'BuO41 $B $U ^b ^U +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 *BAO56 'B ^A ^B +A $B $a *B8O64 $b*85O51 $. *B8 $b -7 } ^B ^6 *B5O64 $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 ^aO71 ^aO61K .AO61 ^aO54 ^AO42 ^aO42 ^AO12 $aO01 $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 ^aKO61 ,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/ ^Ai2oO61 ^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 ^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 +9Y2O83 -9 Y2 $9 Y1 $x '9 Y1 $p $9O92 ^9O54^d $9O41 $9O31 $9O24c '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 '9dO57 ^9 D5 -9 D4 $@ -9 $@ D4 $9 D2 $9 $D $9cO24 ,9 C s92 *9B 'B *79 *9B *79 'B +9 +A Z1 *9AO82 *9A i60 +9 ^A -9 'A $9 $a .9 $a $9 *97 $9 *95 *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 *96O85 *96O82 *96O42 *95O06$3 *95 o99 *95 o92 *95 i93 -9 -5 E *95 *84 ^9 *56 d *95 +5 *95$3O06 -9 -4 ^9 .3 *02 *92O42+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 ^8z1O45 ^8 Z1 *27 ,8 ^z +8Y5O32 $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 +8O91 ^8O31 $8O05 ^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 -8i7.O15 +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 *8AO34$. *8A$.O34 *8A E +8 $A *89 o1i $ .8 *96 +8 $8 $8 .8 *87 Y3 t *87O71$4 *87 t Y3 *87 o7i *87 o57 -8 *78 *69 *87$4O71 *87 *46 ,8 *73 $. ,8 $. *73 -8 *71 $. -8 $. *71 $8 ^7 *86 Z1 z1 *86 z1 Z1 *86Y4O23 +8 +6 Y2 *86 Y1 y1 *86 y1 Y1 *86O74i5a *86O23Y4 *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*34O01 +8 .6 $$ *86 ^@ *86 *85O63*41 *85O52 *85 o5% -8 *56 *76 *85*41O63 $! -8 ,5 $- *85 { ,8 ,5 -8 $! .5 -8 .5 $! $8 *43 Y1 *83O24 *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 .7y5O64 $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 -7O81 $7O72 $7O63 $7O52 ^7O51,1 +7O51 $7O46$7 -7O42 {$7O24 +7O21o0F .7O05 ^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 -7p1O06 .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 +7o0FO21 -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 *79O52 *79O43 *79 *A6 *79 *98 $! *79 $! *98 .7 *97 *79 +6 *79 -4 *79 } [ $$*78O42 *78 o3b *78 o3a *78 o2i *78 i73 *59 *78 $c *78 $7$7O46 +7 *75 ,7 *75 -7 *74 +7 $7 -7 $7 ^7 ^7 *76 Y2 t *76 Y2 E ,7 +6 Y2 *76O02-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 *75O72 *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 *74O43$_ *74$_O43 *74 so *74 o5w *74 i4_ *74 ,2 *74 $@ *73O42 *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,1O51 *71O21] *71]O21 *71 o1f *71 o0b $7 *14 c *71 *06 *71 } *70}O41 *70 o6H *70 o62 *70 o3p *70 L7 D4 *70D9O32 +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 .6O73$a $6O43 -6O42 +6O31 -6O03 +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 ^B .6$aO73 *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 *67O81-4 *67 o5B *67 o2[ *67 i74 *67 ^b Z2 +6 *78 t *67 *78 *67 .5 .6 *75 $. .6 $. *75 *67-4O81 *67 *32 .6 *71 +6 -7 } *67 $ .6 -7 -6 ] $7 ^6 ,7 +6 +6 u $6 ^6 r .6 *63 *65 Y3 i4- *65O41 *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*47O71 { *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 *62O51 *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 *60O53 *60 t [ *60 o0C *60 i4@ ] *60 ] i4@ *60 i3q *60 i3j *60 i3h *60 i0z *15 *60*80O61 ,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 $5Y1O03 $5OB2E $5O72 $5O62 ,5O61 ^5O61 ^5O31 ^5O21 $5O03Y1 +5O02*03 $5O01E .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 .5p1O03 +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 -5i4zO24 $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 $5EOB2 +5 E i7n +5 ^e .5 d Z2 -5 ^d z1 $5dO02 +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 *59O52 *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 *57O25'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*73O41 *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 *56O32 .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 $@*54O01 *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 *52O51o4_ *52 [ ^s *52 p3 'B *52 o7r *52o4_O51 *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 *50O31 +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 $4O91 $4O81t +4O63 $4O62 ^4O52y1 $4O32 -4O02*07 -4O01p2 $4 ^w p5 +4 u Y5 -4 u d .4 t z5 $4 t Y4 +4 t Y2 $4tO81 ^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- -4i6@O13 ^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 .4dO04 -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$8O71 *48O21[ *48 ^a *A8 -4 -8 *47O51 *47O42 *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 *46O12 *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 *45Y3O01 *45 [ y3 *45O01Y3 *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 $.*43O52 *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 *43dO06 *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 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 *41O12 *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 *40O62D0 *40O42 *40 u y5 ^4 ^0 t *40 R0 *40p1O02 *40 o6- *40 o4z *40 k $A *40 K *13 *40 i71 *40 i36 *40 i2y *40 i0L *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 +3Z4O54 ,3 Z1 t ,3 Z1 C $3 ^Z -3 Y5 u .3 y5 u -3 y5 t .3 Y5 ,A .3Y4O43 -3 Y4 T0 +3 y4 -3 y4 -3 y3 ] -3 ] y3 $3 Y2 -3 Y2 +3 ] Y1 $ +3 Y1 $3 y1 ^3 y1 } $3OA6 $3O62 +3O54Z4 +3O51*04 ^3O51 ^3O26q $3O25 +3O02^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 ,3fO68 $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 *3AO03 $3 ^A .3 $A ,3 ^9 y5 *38^wO52 .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*03O02 } -3 ,6 ,3 ^6 -3 ,6 *35 Y2 *35 u ^3 $5 u *35rO21 *35 p1 { *35 { p1 *35 o4k *35 o31 *35 o0A *35 i63 *35 i5t *35 i4i *35 i2- $3 *56 $3 *54 $3*53O23 ,3 *53 *35 *15 $0 *35 $0 *15 +3 *50 ,3 } *50 +3 +5 *35 ] [ $3 .5 .3 +5 *34 Z3 Y4 *34 Z3 *26 *34Y5O12 *34Y1O04 -3 $4 Y1 *34O04Y1 *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 $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 *31O21 *31O02 *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 *30O32y2 *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*04O51 ,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 $2 Z4 +2 ^ z4 $2Z2O23 ^2 Z2 $2 z1 *51 +2 Z1 .3 -2 $^ Z1 $2 ^Z +2 ^z ,2 Y5 t +2 Y3 y3 +2 y3 Y3 +2y3O73 +2 Y3 s8, +2 y3 ,4 -2 Y2 f .2 Y2 *68 ,2 y2 ^2 y1 $n .2 Y1 +7 ^2 Y1 $! ^2 Y1 } ^2O73y1 ^2O71 $2O52y2 $2O51 -2O32 $2O23Z2 ,2O02o58 $2O01 +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 ,2p2O0B $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 +2fO26 +2 $f .2 d t $2 D6 .2 D4 l $2 D3 $2 D2 -2 D1 $2 $2 ^d $2 c ^# ^2 ^c ,2 ^b $2 $9 -2 ,8 Z5 *28 -5 [ $2 *85 .2 +7 Y1 *27O62t *27O53 *27tO62 *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 *26O13 *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 *25O41^n *25 r *25 o6f *25 o5- *25 o4c *25 o0t Z2 *25 l y4 *25 k ^a *25 i3w *25i3fO62 *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 *24O42c *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 *24cO42 *24 c $* *24 $* c [ *24 $A *24 ^a [ *24 ] [ ] *24 *23 Z1 .3 +2 .3 Z1 *23 Y1 E *23O42 *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 *20O43 *20O35 *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 $1y3O28 -1 y3 $B .1 y2 ^_ $1 Y1 $1 $Y +1 ^y -1 $y -1 ^y $1OB2D8 $1O8Ac .1O82 ,1O51,3 ^1O51 $1O46 +1O42 +1O32i3b .1O25$1 $1O21u $1O03 +1 $x +1 ^x ,1 ^W +1 ^w -1 ^v $1uO21 +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 ,1p3O19 +1 p3 u +1 p3 l -1 p2 t +1 p2 ] .1 p1 Y3 +1p1O04 $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- $1i4sO06 $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 $1cO8A +1 ^C s2E ,1 c .6 ^1 $C -1 $B y3 $1 $b +1 ^A -1 $A +1 ^a [*19O63 *19 *80 ,1 *98 $ $1 *96 *18O24k *18kO24 $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 *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 *14O51k *14 $v *14 s1. *14 o6. *14 o0w *14 o0T $1 +4 o0s +1 ,4 l *14kO51 *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,3O51 *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*21O02 +1 *21 l *12 *15 +1 { *21 *12 $. .1$1O25 +1 *13 u $1 $1 *34 .1 *13 ,1 *12 +3 *10 y3 ^5 *10 Y1 ^f *10 u o1S *10 $t ^q *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 -0 Z5 Y5 ^0 z5 y1 } +0 z5 +0Z4O63 $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 +0y3O01 +0 y3 +0 $0 y3 -0 y3 +0 y2 Y3 .0 Y2 E +0 Y2 ^0 y1 z5 $0 Y1 y5 $0Y1O71 $0 Y1 $_ .0 ^y $0O71Y1 +0O63Z4 $0O54E +0O34$A $0O32y5 +0O32 +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 $0EO54 +0 E $0 ^E $& +0 $e $0dO42 -0 ^D i0F $0 D5 Z3 +0 ^d +0 C i1R -0 c $7 $0 ^B -0 ^B *0AO75+2 +0$AO34 -0 ^a o4o *0A+2O75 *09 o0c *09 -9 +0 *97 +0*91O46 -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*73O45 *07 +2 *07 $1 c *07 *12 } *07 *03 *52 +0 ,7 ^. *07 *06 z2 Z1 *06 Z1 z2 *06O12 $@ *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 *05Y5O23 *05Y1O31 *05O52 *05O31Y1 *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 ] *03Y4O31 *03O31Y4 *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 *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 *01Y4O52 *01 Y2 -4 $.*01O32 *01O21^S *01 ^p $A *01 o3T *01 o32 *01 ^K *01 i1u *01 i1b *01 i0j *01 $h $! *01 D3 *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 $zZ5O16 $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 ^zy5O64 ^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 $ZOB3 $ZOA1 $z $x $9 $zO73 ^zO72 ^zO71 ^zO69 $zO61 ^zO52sm` ^zO52 $zO43 $zO34 $zO24 $zO18y3 $zO16Z5 ^zO13$/ ^z$/O13 ^_$zO02 $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 ^zsm`O52 $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*A1O23 ^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 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 Z5z4O56 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 z5Y4O35 Z5Y4O19 Z5 Y4 T3 Z5 Y4 *56 Z5 Y3 z4 Z5y3O52 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 z5OB1t Z5O98$5 Z5O97c z5O92z5 z5O91u Z5O87 Z5O84 Z5O65$A Z5O65 z5O64z1 Z5O63o99 Z5O58i5f $ Z5O52 z5O46z3 z5O46t Z5O46o7A z5O45o0B Z5O42 Z5O41+2 Z5O39 Z5O37 z5O35Y4 z5O29*51 z5O26$* z5$*O26 z5O23T8 z5O23$a Z5O23 Z5O19Y4 z5O17$* z5$*O17 Z5O16i87 z5O04 Z5 $x { z5uO91 Z5 u ^N Z5 u ^J Z5 u i85 z5 u +7 z5 u *69 Z5 u *65 ] Z5 u z5 t Z3 z5tOB1 z5tO46 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 Z5p1O6A z5 $o u Z5 oAS RB Z5 oA. Z5 o9S Z5 o8J $r Z5 o77 t Z5 o63 -A Z5 o60 Z5o5%O13 Z5 o56 Z5 o4@ Z5 o3x *61 Z5 o2V Z4 z5 o2v Z5 } o1R Z5 o0L z5 o0E D7 z5o0BO45 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 Z5i4HO65 z5 i41 l z5 i3. Z2 Z5 [ ^G z5 D7 o0E Z5D5O75 Z5 $D Z5cO97 z5 c i7J z5 C *A6 $! Z5 c z5 -B t Z5 *B4 .5 z5 'A y5 Z5$AO65 z5$aO23 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$5O98 z5 .5 $p Z5 .5 *B4 Z5 *58 *74 Z5 *56 Y4 Z5 .5 *4B Z5 ,4 ^L Z5 *4B .5 z5*49O73 Z5 *43 Z2 Z5 .3 Y5 z5 -3 Y1 z5 *39 *A7 Z5 *34 Y2 Z5 *32 Y3 Z5+2O41 Z5 .2 t Z5 *2A *73 z5 *28 *07 z5 -1 y1 Z5 *16 *83 Z5 $1 $2 $z*50O43 z5 *07 *28 Z5 ^< $% Z5 $* Z5 $` Z5 $z +5 { z5 ^z ^5 ^* z5 z5 z4Z5O56 Z4Z5O42 Z4Z5O19 $ Z4 Z5 $ z4 Z5 Z4 Z4 Z2 Z4 Z4 Y4 Z4Z4O34 Z4 Z4 .6 $= Z4 Z4 Z4 } z4 $\ Z4 z4 $\ z4 Z4 z4z3O75 z4 z3 t Z4 Z3 *34 Z4 Z2 Z4 z4 Z2 -0 z4Z1O35 Z4Y5O42 Z4Y5O19 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 z4y3O75 Z4 Y3 i2m Z4 Y3 *43 $? Z4 Y3 Z4Y2O42 Z4 Y2 $ Z4 y1 ^@ z4 y1 Z4O83i7w $!Z4O75 Z4O73C Z4O67y2 z4O62t z4O56t Z4O54+3 Z4O53 z4O48 z4O47 Z4O42Z5 Z4O42Y5 Z4O42Y2 z4O3At z4O39p2 ^$z4O36 z4O35Z1 Z4O34Z4 z4O34i1p $@Z4O34 z4O26 z4O25u Z4O24R1 Z4O19Z5 Z4O19Y5 Z4O15z4 Z4O04q Z4O03$Q Z4 $W z4uO25 Z4 u i37 z4 t z3 z4tO62 z4tO56 z4tO3A z4 t *9A Z4 T4 y5 Z4 T3 Y5 $_ Z4 t z4 t [ Z4 ^s u Z4 sqD Z4 s91 Y5 Z4 s7? Z4 s2? Z4 s0& Z4 R8 ,9 Z4R1O24 Z4$QO03 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 Z4i5$O23 Z4 i58 o7. Z4 i57 Y4 Z4 i37 u z4 i34 Z4 i2m Y3 Z4 i21 i4# $& Z4 i1x z4fO54 Z4 f *01 z4^eO38 Z4 ^E i0D z4 ^D ^t Z4 d 'B z4 D2 i2- Z4 D1 $0 [ Z4 ^D Z4CO73 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*52O53 Z4 *50 Z4 $5 Z4 -5 Z4*47O65 Z4 *43 Y3 Z4 { *43 $ Z4 .4 Z4+3O54 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 z3z4O75 Z3 z4 sjo Z3 Z4 o85 Z3 z3 Z4 z3z3O74 Z3 z3 t z3 z3 $* z3 $* z3 $* z3 z3 $ Z3 z2 z3Z1O34 $$ 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 z3Y1O34 Z3 y1 ^A Z3O85-9 Z3O71*69 Z3O69 Z3O64 Z3O53t $#Z3O51 z3O47t z3O46t Z3O43o9K [Z3O41 Z3O38 z3O37t z3O34Z1 z3O34Y1 z3O34o0_ $$Z3O32 z3O25p1 z3O25{ Z3O23o61 Z3O21*85 z3O14$Q Z3O13o93 Z3 $W Z3 Z3 $w o97 Z3 $V o4D Z3 u $q Z3 u ^H Z3 u .7 Z3 u -7 Z3 t z3 Z3tO53 z3tO47 z3tO46 z3tO37 Z3 T9 z3 t -3 z3 sR6 +2 Z3 sjo z4 z3 s3* Z3 $R Z3 Z3 r ^L Z3 r ^7 z3$QO14 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 z3o0_O34 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 Z3i5_O63 Z3 i5i { Z3 i54 d Z3 i51 z3 i33 *81 z3 i2x D3 z3 i2R +1 Z3 i1O +6 z3 i1k Z3 i1f $j z3i1bO54 z3 i0a Z3 ^i Z3 ^H u Z3 ^g o59 z3fO5B Z3 E T1 Z3 E .5 $. Z3 E Z3 ^d Z5 z3dO71 Z3 d i7s } z3 DB Z3 d 'A Z3 d +6 Z3 D5 [ z3 D3 i2x Z3D2O31 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*37O15 Z3 .7 u Z3 -7 u Z3 $7 r Z3 +7 o5# Z3 '7 i2g z3 *79 *42 Z3 *79 Z3*72O04 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 Z2Z4O04 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 z2Z1O42 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 z2Y2O43 z2 Y1 s2* Z2 y1 -2 Z2 Y1 Z2 y1 z2O92.2 z2O83+0 z2O81*40 $#Z2O72 Z2O68 Z2O63.2 Z2O62*53 z2O62+1 Z2O61t Z2O59 Z2O53^w z2O53i1o z2O43Y2 Z2O43o6? Z2O43[ Z2O43 z2O42Z1 ]Z2O42 z2O42 z2O37t z2O36t Z2O36 Z2O35y4 Z2O34 z2O32i0s $-Z2O31 Z2O24l z2O15t Z2O12$9 $$Z2O12 Z2O04Z4 Z2O03z2 Z2O03t Z2O03shP Z2O03o8! 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 Z2tO61 z2tO37 z2tO36 z2tO15 Z2tO03 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 Z2shPO03 Z2 $S E Z2sc O03 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 Z2p2O02 z2 p2 { z2 { p2 z2 p1 y1 Z2p1O23 Z2p1O13 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 Z2o70O02 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 Z2lO24 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^jO39 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 z2i1oO53 z2 i1& Z2 i0E z2 i0b Z2 i0# Z2 i0$ $# Z2 $# i0$ z2 ] ^H z2 ^H ] ] z2 ^H z2fOA7 z2fO5B Z2 f i74 Z2 ^F *37 Z2 $f Z2 ^f Z2 E oA2 z2 ^e i3o { Z2 E ^> z2 ^e Z2dO21 Z2dO09 Z2dO03 Z2 d D2 Z2 DB i4n z2 D9 Z2 ^d -7 Z2D6O81 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 *A7 r Z2 *A7 *26 z2 $A ,6 Z2 *A3 z2 $a *18 z2 $A Z2$9O12 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 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*5AO52 Z2 *5A c Z2*58O81 Z2 +5 +7 [ Z2 *57 Z2*53O62 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*40O81 z2 *40 -8 Z2 ^4 z2 ,4 z2 -4 { Z2 .3 $s Z2 ,3 +B Z2 *37 Z2 *35 $Z Z2 *34 srl Z2 *34 k $< Z2 *34 z2 *31 +5 ^> z2 *30 Z2 ,2 y1 z2.2O92 Z2.2O63 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+1O62 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+0O83 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 z1z5O74 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 Z1Y5O52 Z1 y5 sys Z1 y4 $z Z1 Y4 Y4 Z1y4O72 Z1y4O63 Z1 Y4 ^b Z1 Y4 +4 Z1 Y4 *31 z1 Y4 *21 Z1 y4 Z1Y3O62 z1 Y1 i0i z1 Y1 ^H Z1 y1 ^g Z1 Y1 ,8 Z1 y1 $\ z1 Y1 $` z1 Y1 Z1$XO51 z1OA2i1R }z1O93 Z1O82*16 Z1O74Y2 Z1O72,6 $ Z1O71 Z1O67 Z1O65$! Z1$!O65 Z1O62Y3 Z1O54y5 Z1O52t z1O52*03 Z1O51$X z1O51R2 z1O43 Z1O42.3 z1O41o0c Z1O41$$ Z1$$O41 Z1O38$! Z1$!O38 Z1O36 $/Z1O32 Z1O31+6 Z1O31 Z1O24+4 z1O23^! z1O21o2@ z1O14i4l Z1O13z2 Z1O0A Z1O04y5 Z1O03$7 Z1O03$0 Z1O02p1 Z1O02$9 Z1O01^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 Z1tO52 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 z1R2O51 Z1 r Z1 $q *27 z1 ^p y2 Z1 $p c Z1 p5 s26 $. Z1 p5 z1 $p ,5 Z1p4O07 Z1 p4 T1 Z1 p4 c Z1p2O06 z1p2O02 z1 p2 s6d Z1 p2 $j Z1 p2 ^G Z1p1O0B 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@ z1o0cO41 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- z1i9=O03 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 Z1i6bO14 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 z1fO7B z1fO78 z1fO68 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 Z1dO87 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*A7O35 Z1 *A6 *59 z1 $A .5 Z1 *A4 $a Z1 ^A *37 Z1 +9 Y3 Z1$9O02 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$7O03 Z1 $7 l z1 ,7 i0m z1 ^7 ^b Z1*79O81 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,6O72 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-5O03 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^1O72 Z1 ^1 l Z1 *18 o7C Z1 .1 -8 z1 *17 $. z1 $. *17 Z1*16O82 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$0O03 z1 ^0 d z1 *07 $O ^. z1 *07 z1 *06 } z1 *05 ] z1 ] *05 z1*04O31 z1*03O52 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 ^< $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 $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 $yO85 $yO73 $yO64$1 ^YO45^G ^yO43 ^yO42 ^yO35 $yO34$c $yO34 ^YO13i5m $*^yO13 $YO02 ^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 $yqO07 $y $q $y p5 i49 $y o9l $Y o8X l $Y o8_ l ^Y o81 o0A $yo6fO41 ^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 $yiAqO17 $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$cO34 ^Y $C ^Y $c ^y ^b K $y *9B $Y $9 $y *80 ^Y $8 ^y $8 $y*78O32 ^y *72 $y *71 s0q $y $7 ^y -7 $y .6 *62 $y *63 $y .6 ^y +6 ^y ,6 y5Z5OA6 y5Z4O67 y5 Z3 i57 y5 z3 *3A Y5 Z3 Y5Z1O05 Y5Z1O04 Y5 z1 u y5 y5 Y3 Y5y5O27 Y5Y5O12 Y5 y5 *B0 y5 Y5 *B0 Y5 Y5 y5 y4 u y5 Y4 t y5 Y3 y5 y5Y3O62 Y5Y2O39 y5 Y1 o92 y5 ] $Y ] y5 $Y Y5OA4.6 y5OA3i5, y5OA3E y5OA2O34 Y5OA2O25 y5OA2o5k Y5OA2 y5OA1T5 y5OA1oB) y5O97o7l y5O96*54 y5O96*45 y5O95 y5O93O62 y5O92sn/ y5O92o38 y5O91u y5O89y5 y5O86-3 y5O85u y5O84.4 Y5O83O32 y5O83k Y5O83c y5O82siv y5O82C y5O82.2 y5O82$* y5$*O82 y5O81E y5O78 y5O74o0d y5O74i5W y5O73y2 Y5O73O41 Y5O73r y5O73c Y5O73-4 Y5O72s49 Y5O72+A y5O72,5 y5O71^V y5O71+0 y5O67T2 y5O64t Y5O64 y5^#O64 y5O63.7 ]Y5O63 y5O62Y3 Y5O62p4 Y5O62o5m y5O62o4K Y5O62c Y5O62*A8 [y5O62 y5[O61 Y5O5A$R y5O58 Y5O56t y5O56$r y5O54k Y5O54D5 Y5O53*49 y5O52[ y5O51o0N Y5O51] Y5]O51 Y5O49Y5 y5O48+7 Y5O47*04 Y5O46$3 $*Y5O46 Y5O43i0f Y5O42 Y5O41t Y5O3A Y5O39Y2 y5O38t Y5O37 Y5O36o77 Y5O36*50 y5O34o1h y5O34l y5O34K Y5O32*98 y5O31O74 Y5O31$u {Y5O31 y5O31 Y5O2Bu y5O29i1o Y5O28T4 Y5O26 Y5O25i82 Y5O25c Y5O25*21 Y5O24^y Y5O23K y5O21O67 y5O21o0R Y5O1A Y5O18T0 Y5O18t Y5O18l Y5O18C Y5O17*64 Y5O16-7 Y5O16+2 Y5O15$o Y5O15$n Y5O15i4w Y5O14'7 Y5O14 $*Y5O14 Y5O13$l Y5O13+7 Y5O13$* Y5$*O13 Y5O12Y5 y5O08t y5O07i5& Y5O06-1 Y5O05Z1 Y5O05t Y5O04Z1 $&Y5O04 y5O03t y5O02O51 Y5O02t y5O02t y5O02o2r Y5O02l Y5O02 Y5 ^w y5^VO81 Y5 u z1 y5 u y4 y5uO91 y5uO85 Y5$uO31 Y5uO2B 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 t Y4 y5tO64 Y5tO56 Y5tO41 y5tO38 Y5tO18 y5tO08 Y5tO05 y5tO03 Y5tO02 y5tO02 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 y5T5OA1 Y5 T5 T7 Y5 T5 $1 y5 T4 T3 y5 T3 T4 y5T2O67 Y5T0O18 Y5 t $0 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 y5sn/O92 y5 smp t y5 slJ o5d y5sivO82 y5 sg7 C Y5 s9X ^L Y5s49O72 y5 s3u E Y5$RO5A y5$rO56 Y5 r D9 } Y5 RB ] y5 RA y5 R9 $2 Y5 p3 o8l Y5$oO15 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 Y5o8gO23 Y5 o8g Y5 o8 Y5 o7w { Y5 o7s Y5 o7r K Y5 o7r y5 o7r Y5 o7p y5o7lO97 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 Y5o5mO62 y5o5kOA2 Y5 o5k E y5 o5K E } y5 o5k Y5 o5h Y5 o5E y5 o5d slJ Y5 o5- y5o4KO62 y5 o4g y5 o4D i57 Y5 o4 $D y5 [ o47 y5 o45 soe y5 o4. y5 o4/ y5 [ o4- y5 o3w i5z y5o38O92 y5 o37 y5 o2v y5 o2t .A Y5 o2p y5 o2p y5 o1w l y5o1hO34 Y5 o1c Y5 o0z y5 o0u +3 y5o0RO21 y5 o0q y5o0NO51 y5 o0L DB Y5 o0J $j y5 o0j D4 y5 o0J y5 o0f y5o0dO74 y5 o0c y5 o0b y5 o0A Y5$nO15 Y5 ^N Y5^MO14 y5lO34 Y5lO18 Y5$lO13 Y5lO02 Y5 ^L s9X y5 l o8I y5 l o1w y5 $l $f y5 l 'A Y5 L9 i9A Y5 L5 y5kO83 y5kO54 y5KO34 Y5KO23 Y5 K o7r Y5 k '8 Y5 ^K y5 $K y5 $j TA Y5 $j $s Y5 $j o0J Y5iB,O26 y5 iAu y5 iAs y5 iAR y5 iAm y5 iAJ y5iAaO51 y5 iA1 Y5 iA. Y5i9DO06 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^FO14 y5 $F y5EOA3 y5EO81 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 y5dO47 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 Y5D7O13 Y5D5O54 Y5 D5 Y5 D4 t y5 D4 o0j y5 D3 o4A y5D2O72 y5 D2 +7 y5D0O62 y5 D0 $a Y5cO83 y5CO82 y5cO73 Y5cO62 Y5cO25 y5^cO23 Y5CO18 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-BO73 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*B4O24 Y5 'B Y5 ,B Y5 ^a z1 y5 -A y5 y5+AO13 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*A5O84 Y5 *A2 D9 Y5 'A *25 y5 -A +0 Y5 'A Y5 .A Y5 -A y5 -A [ y5.9O09 y5 +9 u Y5 ,9 o7d Y5 '9 E Y5 *9A +2 y5 +9 *31 Y5 $9 y5 -9 Y5-8O52 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-7O03 y5*7BO43 y5 $7 -B y5 *75 *89 y5*74O75 y5*73O67 y5 *70 D0 y5 *70 c y5 -7 *06 y5 $7 [ y5 [ $7 $y *57 Y5.6OA4 y5.6O42 Y5 *6A +B Y5 *67 [ y5 *67 Y5 [ *65 [ Y5 *65 y5 +6 .5 y5 -6 +4 Y5 $6 y5,5O72 y5-5O01 y5 ,5 sua y5 $5 c [ y5 *56 y5*54O96 y5 +5 .1 y5 $! -5 y5 -5 $! y5.4O84 Y5-4O73 y5+4O13 y5 $4 E y5 ,4 c Y5 -4 *85 y5 +4 -6 y5*45O96 y5 *43 y5*41O43 Y5*41O25 y5 *40 y5 +4 y5-3O86 Y5$3O46 y5 +3 o0u Y5 *31 *A8 y5 *31 +9 Y5 -3 y5.2O82 y5 $2 R9 $y *52 r Y5 $2 $H Y5 +2 DA Y5 +2 *9A Y5 *25 'A Y5 $1 T5 ] y5 *18 Y5*17O25 y5 .1 +5 ^@ Y5 $1 y5+0O71 y5 +0 u y5 $0 u Y5 $0 t ^Y *50 o4o y5 $0 E y5 +0 -A y5 *06 -7 y5*04O23 Y5*03O15 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 Y4Z5O62 y4Z3O58 y4 $' Z3 y4 Z1 $z y4Z1O84 Y4Z1O65 y4 z1 D3 Y4 ^z Y4 $y ^w y4y5O68 y4 Y5 *02 y4y4OB6 Y4y4O85 y4Y4O81 Y4 Y4 u y4 y4 T0 Y4 Y4 r Y4 Y4 *34 Y4 Y4 $1 Y4 Y3 Y2 y4Y3O83 y4 Y3 t Y4 y2 y4 y4 Y2 Y2 y4y2O82 y4y2O71 Y4Y2O42 y4 Y2 t Y4 y2 D3 y4 Y2 *B8 Y4 y2 -5 y4 y2 ,5 y4Y1O62 Y4 Y1 y4 Y1 [ y4 [ Y1 $$ y4 Y1 Y4 $X Z4 y4 ^x L0 y4OB4*10 y4OB2 Y4OA7$s ]Y4OA3 y4OA2O72 y4OA2c y4OA1] y4]OA1 Y4O95 y4O92o0S Y4^.O92 Y4O91*58 Y4O91$5 y4O85C y4O84Z1 y4O83Y3 Y4O82*81 Y4O82-6 y4O82} y4O81Y4 y4O81^M y4O75-7 Y4O75*64 Y4O75 y4O74.4 y4O74 y4O73t y4O73-0 Y4O72sr8 y4O72c Y4O72+3 y4O72 Y4O6B y4O67i4& Y4O65Z1 y4O65,4 Y4O65 y4O64y4 y4O64i6r y4O64E Y4O63T5 Y4O63o8k Y4O63o1e Y4O63*13 }y4O63 Y4O62Z5 y4O62Y1 y4O62o2s y4O62*02 y4O62 Y4O61] Y4]O61 y4O57 Y4O56 Y4O54] Y4]O54 Y4O54 Y4O53i85 Y4O53-1 Y4O52^Y y4O52i4G y4O52-2 Y4O52 y4O51$. y4$.O51 Y4O4A Y4O48u Y4O43*73 Y4O43 Y4O42Y2 y4O42i0X Y4O41K y4O41D1 Y4O37p1 Y4O35 $?Y4O35 Y4O34t $,Y4O34 Y4O32$2 Y4O32$_ Y4$_O32 Y4[O32 Y4O32 [Y4O32 Y4O31] Y4]O31 y4O26o69 Y4O26i2A y4O25$u y4O25$2 Y4O24r Y4O24 Y4O23 y4O21[ y4O21 ^*Y4O14 Y4O13y4 Y4O13t Y4O13i2C Y4O13,8 Y4O12O42 Y4O08y4 Y4O08u Y4O08t Y4O07z1 Y4O07 Y4O06y4 Y4O04-2 Y4O03^c y4}O03 y4O01+3 Y4 ^X y4 ^w ^e y4 ^w .6 Y4 $W Y4 ^w Y4 ^V Y4 $v Y4 u Y4 Y4uO48 y4$uO25 Y4uO08 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 y4tO73 Y4tO34 Y4tO13 Y4tO08 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 Y4T5O63 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$sOA7 y4^sO12 y4 ssw Y4sr8O72 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 y4rO86 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 Y4oA!O42 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_ y4o6&O42 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 y4o2sO62 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 Y4o1eO63 y4 o14 $F y4 o0x y4 o0W Y4 o0t y4o0SO92 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 Y4KO41 y4 K C y4 K *53 y4 $j Z1 Y4 $i $e y4 iAg y4 iA1 ,3 Y4i9PO24 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 y4EO64 Y4 E R9 Y4 E o59 Y4 E o55 y4 E o1u Y4 E D7 y4 E -A y4 E *39 y4 E *17 Y4dO62 Y4dO57 Y4 DA Y4 D9 $7 y4D8O03 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 y4cOA2 y4CO85 y4cO72 y4CO04 Y4 c ^P y4 C K Y4 $c iA3 Y4 c -2 y4 c +2 y4 C y4 ^c Y4 $B Y1 Y4,BO24 Y4 ^b u y4 ^b ^K y4*B6O85 y4*B6O84 y4 ^B y4 -A o0M y4 -A E Y4*A8O61 Y4 'A *72 y4 .A *63 Y4 *A4 'A Y4 *A4 ] Y4 ^A *38 y4*A1O63 y4 $A y4 'A $- y4 ^a Y4 '9 y5 y4-9O62 Y4 '9 o3u y4 +9 D2 Y4 *9A T8 y4 -9 ^A y4*98O42 Y4 *97 Y4*96O41 Y4 *96 o91 Y4 } *96 y4*94O73 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-6O82 Y4.6O06 y4 $6 t Y4*68O42 Y4 *67 ,1 Y4 *65 *87 Y4 +6 *52 Y4*64O75 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$5O91 Y4 -5 o4i y4 *59 D4 Y4*58O91 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.4O74 y4,4O65 y4+4O01 Y4 .4 u y4 +4 t y4 .4 t Y4 *49 i4k y4 *49 *56 y4 *49 } ] Y4 *47 Y4*45O31 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+3O72 Y4-3O21 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-2O52 Y4$2O32 y4$2O25 y4 $2 R7 y4 ,2 o3k Y4 +2 o1z y4 -2 D1 Y4 .2 d Y4 -2 c y4 +2 c y4*29O76 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^1O85 Y4-1O53 Y4 ^1 o9K y4 $1 l Y4*1BO92 y4 *17 E Y4 ,1 *67 Y4 *16 .6 Y4 .1 .6 y4 +1 *42 Y4*13O63 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*10OB4 Y4 ^1 y4-0O73 Y4 -0 u Y4 +0 o9= y4*09O37 y4 +0 +5 y4 $0 $4 Y4 *03 D3 y4 +0 *31 y4 *02 Y5 Y4 *02 y4 y4*02O62 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 Y3Z2O61 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 y3Y5O5A Y3Y5O47 Y3y5O01 Y3 Y4 z3 Y3 Y4 ^Z y3Y4O91 Y3 y4 $A y3 Y4 *0A y3 y3 Z3 y3 y3 Z2 y3 y3 y3 Y3 Y3 y2 y3y3O61 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 Y3y2O61 y3Y2O31 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 y3OB2E y3OB1O51 y3OA3t y3OA1 Y3O98o9k Y3O94] Y3]O94 y3O92E Y3O92c Y3O92 Y3O91o7o y3O91i3o Y3O91 Y3O81O31 Y3O81 y3O74$+ y3$+O74 ]Y3O73 y3O72o0r Y3O72o0g y3O72+8 y3O71*36 y3O63-5 y3O62E y3O62*76 Y3O62-4 Y3O62 y3O62] y3]O62 Y3O61Z2 y3O61o5j y3O61$D Y3O61-4 y3[O61 y3O54*20 y3O53i5y y3O52o0d Y3[O52 Y3^$O52 [Y3O52 Y3O51y4 Y3O51i4G Y3O49 Y3O47Y5 y3O46smB $*Y3O46 y3O46 Y3O45 $@y3O45 Y3O43*10 Y3O42t Y3O42^C y3O41r y3O41$3 y3O41 y3O36$5 Y3O34y3 y3O31Y2 Y3O31c Y3O29 y3O25$p Y3O24i2b Y3O23 Y3O21u Y3O21$+ Y3$+O21 y3O0A Y3O05$g Y3O04$4 Y3O03$W Y3O03o47 Y3O02O72 Y3O01y5 y3O01C Y3$WO03 y3 $W Y3uO21 y3 ^u o1a Y3 $u $j y3 u D9 Y3 u *6B Y3 u ,5 y3 t z5 Y3 t Z2 y3tOA3 Y3tO42 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. y3smBO46 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 Y3rO54 Y3rO52 Y3RAO07 y3 R9 R9 Y3 $r .9 Y3 R6 E y3 ^R { y3 r y3$pO25 y3 p4 i1a y3p2O92 y3 p2 i3. y3 [ ^p y3 ^p Y3 oBr Y3 oBp Y3 oBF .9 Y3 oB9 -7 y3oA.O06 Y3 oAo Y3 Y3 oAj Y3 oA- Y3 oA Y3 o9y Y3 o9q Y3o9PO21 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 y3o7.O16 Y3 o7w Y3o7oO91 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 y3o5jO61 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 y3o0rO72 y3 o0o y3 o0N y3 o0l y3 o0k +7 Y3 o0J -6 Y3o0gO72 y3 o0F *45 y3 o0F y3o0dO52 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 y3i2cO56 y3 i2a y3 i1i y3 i1e y3 i1( [ y3 i0W *65 Y3i0MO24 y3 i0K y3 i0h y3i0EO54 y3 i04 *06 y3 ^i y3 ^H Y3$gO05 y3 $G y3 $f s5. Y3 $F p4 Y3 ^f Y3 E $y y3EOB2 y3EO92 y3EO62 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$DO61 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 Y3cO92 Y3cO31 Y3^cO24 y3CO01 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*B1O74 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*A3O92 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*89O31 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*73O42 y3 *73 *50 y3 [ *73 Y3*72O72 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*69O62 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-5O63 y3$5O36 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-4O62 Y3-4O61 Y3$4O04 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$3O41 y3 .3 swc y3 .3 o5p Y3 -3 i3o y3 *39 ,9 y3*36O71 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*20O54 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*16O62 y3*16O52 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*10O43 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 y2z2O63 y2z2O53 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 Y2Y5O53 y2Y4O46 y2Y4O31 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 y2Y3O41 y2 y3 c Y2 Y3 *76 y2 y3 -3 Y2 Y3 ] Y2 y3 [ y2 Y3 y2 y3 Y2y2O84 Y2y2O73 Y2Y2O45 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 y2Y1O51 Y2Y1O25 Y2 Y1 o5j y2 Y1 i14 y2 y1 ^C y2 Y1 *A1 y2 Y1 *04 Y2 $@ Y1 y2 Y1 $@ } y2 y1 Y2 ^Y Y2OB1 y2O94-4 y2O91Y2 y2O91i1a y2O83slo y2O83o7. Y2O83+7 Y2O83 y2O82o1A y2O81sby y2O81*34 [y2O81 Y2O73-6 Y2O73$3 Y2O73 y2$.O73 y2O73 Y2O72o98 Y2O72-A Y2O72 y2O71-4 y2O71 Y2O65$i Y2O64 Y2O63T0 y2O63skq y2O63^k y2O62.3 y2O62*16 Y2O62$1 }Y2O62 y2O61se. Y2O61^d y2O61*05 Y2O61 Y2O57 Y2O54 y2O53^i y2O53E Y2O52K y2O52E y2O51Y1 [y2O51 Y2O46Y5 y2O46Y4 y2O46$. y2$.O46 Y2O45Y2 y2O45C y2O43z2 y2O43y2 y2O43i4P Y2O43 Y2O42d y2O42-9 y2O41Y3 Y2O41o1N Y2O41,8 $.Y2O41 y2O35Y5 y2O35y5 y2O35i4_ Y2O34o5w y2O34,3 Y2O34[ Y2O32T0 y2O32+3 y2O31o8 y2O31o1x y2O31$J y2O31 y2 $x -3 Y2O28+3 Y2O25Y1 Y2O23z2 Y2O23y3 Y2O23$/ Y2$/O23 [Y2O23 Y2O21y3 y2O21+5 Y2O17t Y2O14z3 Y2O13y5 Y2O12*21 Y2O12 }Y2O12 Y2O0B Y2O0A Y2O07y2 Y2O07 Y2O03$@ Y2$@O03 Y2O02t Y2O02^k Y2O02-3 Y2O02-0 y2O01st5 Y2O01+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 Y2tO17 Y2tO02 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 Y2T0O63 Y2T0O32 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 y2st5O01 Y2 ssc y2 ss8 c Y2 sr, y2 sr; y2 snb y2 slr Y2 slp y2 slp y2sloO83 y2skqO63 Y2 sio c y2 sia y2 sFB o3W y2se.O61 Y2 sex *56 Y2 sdm ^\ y2 sd/ $= y2 scg y2 ^s C y2sbyO81 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 y2p3O09 y2p2O03 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 y2o8vO35 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 y2o7.O83 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, y2o1xO31 Y2 o1o Y2 Y2o1NO41 y2 o1k y2 o1f o63 y2 o1f ^c y2o1AO82 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 Y2KO52 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$JO31 y2 ^J *34 Y2$iO65 Y2 ^i i1b y2 iBe Y2iB5O63 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_ Y2i7`O02 y2 i7v Y2 i7j y2 i7e y2i7dO13 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 y2i19O31 y2 i14 Y1 y2 i14 +0 y2 i13 y2i12O46 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^FO46 Y2 $f t Y2 $F i6t y2 f i5S Y2 $[ $f y2 ^f Y2 E Z3 y2EO53 y2EO52 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 y2dO04 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 C y4 y2CO45 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+8O62 Y2 -8 D6 Y2 +8 d y2*8AO04 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+7O83 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*70O12 Y2 *70 } y2 *70 Y2 +7 [ y2 +7 Y2-6O73 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*6AO46 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*58O75 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-4O94 y2-4O71 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$3O73 y2.3O62 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*34O81 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^2O54 y2 +2 s35 y2 -2 o4g y2 +2 o0w Y2 +2 o0B y2 -2 ^B Y2 *28 *23 y2 *28 Y2*27O01 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$1O62 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*08O41 { y2 *08 y2*07O65 y2*05O61 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 Y1z4O35 $ y1 Z4 ^@ y1 z4 Y1z3O34 Y1 z1 p1 Y1 z1 $A y1 Z1 +5 $\ Y1 z1 $` Y1 z1 y1 z1 $@ y1 $@ z1 Y1 $y k Y1Y5O52 y1y5O13 Y1 y4 $z Y1y4O42 Y1 Y4 i6F Y1 Y4 i0R Y1 [ y4 $$ Y1 y4 y1 ^) y4 y1 y3 Y1 Y1Y3O03 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 Y1O93iB7 Y1O73$. Y1$.O73 y1O71*13 $.Y1O64 $y$1O64 Y1O63t Y1O63s7/ Y1O62o4w {Y1O62 y1O61o0i y1O52Y2 Y1O52T1 y1O51*13 y1O43*31 Y1O43-0 y1O42$( y1$(O42 Y1O41$+ Y1O41$@ Y1$+O41 Y1$@O41 $!Y1O41 Y1O36s0* Y1O32^I y1^!O32 y1O32 Y1O23L0 Y1O23$1 Y1O21-7 Y1O13y1 Y1O13i5- y1O13*34 $'Y1O13 Y1O12 y1O12^@ {Y1O05 y1O04 Y1O03Y3 Y1O02*43 $'Y1O02 Y1O01C 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 Y1tO63 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 Y1T1O52 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 Y1s7/O63 { 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* Y1s0*O36 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 Y1p5O0B 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 Y1o4wO62 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 y1o0iO61 $? 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 Y1L0O23 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^IO42 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 y1i11O35 { 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^GO41 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 Y1dO0A 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 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*A6O91 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 *93 Y1 *78 Y1*75O23 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*31O43 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 *27 y1 +2 -5 Y1 *24 ^q y1 .2 ,4 Y1 *23 c Y1 +2 [ Y1 } ^2 $& Y1 -2 y1 .2 Y1$1O23 y1 .1 $c y1*17O12 y1 *17 o59 y1 .1 *73 y1 *15 ,3 y1 *14 y1*13O71 y1*13O51 Y1 *13 r y1 *12 $j y1 *12 i1q y1 *12 i1f y1 *12 *36 y1 +1 Y1-0O43 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 ^XO62*21 $xO51*01 $xO42$d ^xO25 $xO06s1t $xO04 $xO01i5 $xO01 ^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 $xs1tO06 ^X ^S $XrO82 $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$dO42 ^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 OBAoBk OBAiB ] OB6] OB5OA1$. OB5$.OA1 OB5o8m OB4O53u OB4uO53 OB4oB5 OB4i9s OB4*9B OB4 OB3u $ OB3$1 OB2Z2O42 OB2$z OB2O42Z2 OB2O34 OB2O26 OB2oBs OB2o9e OB2*A9 OB2+9 OB2 OB1OA1$m OB1O36 OB1u.A OB1oAy OB1o9iO42 OB1o7c OB1$mOA1 OB1i8_ OB1i0* OB1.Au OB1$A OB1,A OB1$a OB1$8 OB1$5 $x $b $x ^b OA6O36 OA6t OA5D7 OA5 OA4O35*20 OA4uo8W OA4o8Wu OA4*20O35 OA4$1 OA3t,9 OA3iBi OA3D7 OA3,B OA3*A7 OA3,9t OA2T0iAg OA2oAn OA2oAm OA2oA? OA2o8y OA2o8rc OA2o8b OA2K OA2$k OA2iBe-9 OA2iBe OA2iAgT0 OA2co8r OA2-9iBe OA2*94O31 OA2*68 OA2-6 OA2$2 OA2^1 OA2$. OA1O34 OA1O21O71 OA1TB OA1p1 OA1oB7 OA1o6ju OA1i5g OA1+BK OA1*98$4 OA1.8O32 OA1$4*98 OA1$2 $x ^a ^x $a O98$t O98+9 O98{{ O98 O97tDA O97$e O97DAt O96u O96o7o O95i7_ O95E$2 O95$2E O95$1 O94o9y O94o9k O94o9a O94o4 t O94i8l O94$2 }O93z1 O93Y3 O93t*78 O93sh8 O93$o$p O93oB1 O93o9j O93o82 O93E O93-B O93*A9 O93+9 O93*78t O93-7 ^,$.O93 O92$y O92O06 ]O92t O92$su O92oAw O92o90 O92o8l O92o6b O92o39 O92$L O92i5@ O92^i O92$e O92,B O92+A O92$!-A O92$A O92-A$! O92*41O31 O92$, $+O92 $@O92 $?O92 O91y4c O91OB1 O91O54T1 O91O12 O91^W O91u-8 }O91T8 O91T7T6 O91T6T7 O91T1O54 O91sSV O91ssb O91s4Ao6O O91^S O91R9^2 O91oBy O91o8z O91o8u O91o8d O91o88*87 O91o7u O91o7b O91o77DB O91o6Os4A O91o6i O91o5& O91o4s O91o3@ O91o1o O91o0f O91i8B O91i44 [O91i0V O91DBo77 O91C$8 $*O91c O91+B O91-B O91$a O91+9$1 O91,8Y5 O91-8u O91$8C O91-8.6 O91,7 O91.6-8 O91$6 O91$1+9 O91*18 $x -9 ^X ,8 $X $X +8 E O8A O89$1$A O87Z1 O87Y2Y2 O86$1 O86{*04 O86 O85O32K O85t O85KO32 O85^A O85$1 O84$Yu O84Y4 O84Y3u O84Y1 O84O31sau O84uY3 O84u$Y O84sauO31 O84oA1 O84o57 O84*8A-8 O84*89 O84*48 [$ O84 $ O83Z2 O83O61i5 O83O06 O83s f $\O83R9 O83R8,9 O83o90 O83o8i O83o5l O83o3a O83i9l O83i7a O83i4n O83E$9 O83'B,7 O83$9E O83-9 O83-8 O83,7'B O83$2 O83^1*27 $@O83 O82Z1u O82Z1*78 O82y5 O82Y1$S O82O42^@ O82[O41 O82O31 O82$x O82^v O82uZ1 O82ssz O82s0m^! O82^!s0m O82p4z1 O82o7_ O82o6g*68 O82o60 O82o5s O82o5_ O82o44 O82o0j O82i8z O82i7h O82^i O82D5[ O82[D5 O82C O82*96,6 O82+8 O82*78Z1 O82$7,3 O82-7 O82-6 O82,3$7 O82*16D5 O82$, O82}} $*O82[ $.O82 ]O82 O81y2y2 O81O61T5 O81O54snq O81O43 O81uT9 O81u*83 O81T5O61 O81T2o8R O81snqO54 O81sdj O81scsK O81s04 O81s- O81p3o2y O81o8RT2 O81o8e O81o7s O81o66 O81o5l O81o41 O81o2. O81o1u O81o12+6 O81o0D }O81L0 O81Kscs O81i7s O81i7f O81i62 O81i1-O42 O81i1c $@O81E [O81E O81'B O81^A O81,9 O81*83u O81+6o12 O81$5 O81*21k ^ O81 $x +8 ^x ,8 ^x ^8 O7BO12 O78ET4 O76p1O07 O76oA1 O76K O76i6r O76$i O75z2 O75$z ^*O75T6 O75o6_ O75o3x O75i7k O75$9Z1 O75]^1 O75^1] O75 O74y4k O74Y4 O74y1^A ^X*74O65 O74O62 O74O32O46 O74O32 O74o4c O74i3e O74$d O74*58 O74]] $*O74 $.O74 }O74 O73Z1 O73O05u O73uO05 O73^q O73o7- O73o6m O73^m O73$l O73i7@p4 O73i4' O73i3r O73i0# O73C$2 O73'A O73*87 O73*53{ O73]-3 O73-3] O73$2C O73$1 O73+0 $*O73 $)O73 $#O72Z2 O72y5 O72Y4O63 O72y3 O72Y2*36 O72O85 [O72O51 O72O31 O72O24$t O72O21 O72O02 O72u*06 O72$tO24 O72t$I O72T5 O72T0} O72s3/ O72s1@ O72s1, O72$s O72[r O72p3o27 O72p1.7 O72oAs O72o9k O72o8, O72o7.Y1 O72o7# O72o6z$4 O72o5k O72o5h O72o57 O72o3c O72o3 *27 O72o3@ O72o2 $.O72o1a O72K*31 O72i7p O72i7_ O72i6j O72i5s O72i5H O72i5e O72i5D O72i59 O72i50 O72i4t O72i3o O72D2 O72+B$1 O72$A O72^A O72,8 O72-8 O72*76+4 O72*69 O72*65 O72$4o6z O72+4*76 O72-3-2 O72*31K O72,3 O72*26$@ O72$@*26 O72*25 O72-2-3 O72+2+2 O72-2-0 O72$1+B O72*06u O72-0-2 O72$.[ O72[$. $/O72 $_O72 ^x *72 ^@O72 O71Z3o0l $ O71Z1 O71z1 ^?O71z1 O71Y5 O71y5 O71Y1i33 O71O05C O71O05 O71O02 O71t.6 O71^t O71smd O71s2! O71R9o8y O71o9g O71o8yR9 O71o8n O71o77 O71o61 O71o5u O71o5a O71o41E O71o2i O71o2C O71o1r O71o0lZ3 O71ki2d O71i9m O71i6j O71i5u O71i59 O71i52 O71i4x O71i4ay5 O71i33Y1 O71i2dk O71i2? O71i1c+4 O71[i0V O71^G O71Eo41 O71dO07 O71dO02 O71c*13 O71^BO13 O71*A9+6 O71^a O71*78] O71]*78 O71*71*60 O71^7 O71.6t O71+6*A9 O71.6*59 O71*60*71 O71*59.6 O71*59 O71+4y4 O71,4^s O71*13c O71} O71^@ $*O71 ^X ^7 $x +6 Z1 O6Au$2 O6A$2u O68o6k ^X *68 O68 O67*21 O67] O65Y3t O65O31 O65tY3 O65o3w O65Ki6g O65$j O65i6gK O65i6_ O65i2.c O65ci2. $_O65 O65 $.O64Y1 O64OA1 O64O62 O64$s $!O64o6& O64o4s O64o34 O64^o O64c O64-6 O64^4 O64*34 O64.3,2 [O64*25 O64,2.3 O64] O64^* $*O64 ^!O64 O63Z4$M O63Y3u O63y3C O63Y2^t O63Y2 O63Y1i14 O63O51 O63uY3 O63up1 O63^tY2 O63t*89 O63$t O63srw O63s86 O63^s O63^r^m O63p1u O63$p O63o8u O63o7z O63o5Ti6M O63K O63i6p O63i6Mo5T O63i6@ O63i4 O63i3t O63i14Y1 O63i0Y O63$h O63D9 O63D5 O63*89t O63$6 O63+5*53 O63+5*31 O63$5 O63*47*43 O63^4 O63*31+5 O63$3 O63$* O63$@ $*O63 $/O63 ^(O63 O62$!Z1 }O62z1 O62Y4u O62Y3 }O62Y2 O62Y1,6 {O62Y1 O62$x*65 O62uY4 O62u*79 O62T1$$ O62$$T1 O62stw O62srx O62s28o7. O62s1 z1 O62s1!l O62^*R6 O62R6 O62R5 O62R4 O62$r O62p3$t O62o8@ O62o7.s28 O62o66 O62o4_ O62o3f ^@O62o2y O62o2f O62o1t O62o0F O62ls1! O62K O62i8. O62i7z O62i5ii5P O62i5-,2 O62i5@ O62i4ei5l O62}i43 O62i3x O62i3m O62i26 O62i2- O62^h O62dO63 O62D5 O62d O62C O62-A O62^a O62$8 O62*79u O62*70 O62,6Y1 O62*65$x O62*54 O62*43,3 O62+3 O62.3 O62,2i5- O62.2,1 O62,1.2 O62^1 O62$0 O62[[ $&O62 $*O62 ^$O62 ^@O62 ^(O62 O61^z O61^y,5 O61Y4*1A O61Y3o0L O61y3*96 O61]Y2 O61OA1 O61O73p4 O61O71O21 O61O21O61 O61O19 O61O03y2 O61O02y4 O61$v+4 O61$v O61$uo7x O61u'A O61ti86 O61^T O61sZ$ O61sHT O61sH6 O61scm O61s29 O61$r^F O61R7R7 O61R3 O61R2 O61o8w O61o8! O61o7_k O61o7c O61o71 O61o3y O61o3< O61o2q*13 O61o1Si61 O61o1o O61o0LY3 O61^NT3 }O61$m O61L6Z2 O61L3^e O61ko7_ O61k*23 O61$k O61i8i O61i8d O61i86t O61i7u O61i7n O61i77 O61i61o1S O61i4k*76 O61i3s O61i3e O61i3d O61i3- O61i17 O61i15 O61i07 O61^H^R O61^G^J O61^f O61^e O61D7*34 O61D0-7 O61$D O61$b*30 O61'Au O61'A-6 O61*95.6 O61+8 O61+6Y3 O61-6'A O61.6*95 O61^6 O61+4$v O61-4*35 O61*35-4 O61*34D7 O61*30$b O61$3 O61^3 O61*25-0 O61*23k O61+2+1 O61,2 O61^2 O61*13o2q ^ O61*13 O61+1+2 O61-1 O61-0*25 O61*02^1 O61+0$! O61$!+0 O61]-0 O61-0] O61$?[ O61[$? $+O61 $?O61 $!O61 }O61] }]O61 ]O61 [O61 $x *60 R4 $X ,6 $x .6 ^x +6 O59$k O59i32 O58s-4 O57o2o O57fO57 O57*34 O57]] O56O06 O56r O56d O56'9+4 O56$7 O56+4'9 O56$2 O56-1 O54z5t O54z3*18 O54z2ssw O54^$z2 O54y5o5v O54y4*75 O54Y3o3 O54y2+8 O54O72 O54O01^r O54u O54tz5 O54t*01 O54sswz2 O54$r O54qO04 O54o73 O54o3 Y3 O54o3o$2 O54o0y O54o0bp3 O54$lt O54L5Z1 O54E^3 O54-B O54^A O54*93O24 O54*64 O54^5o6m O54*54 O54*34 O54$3 O54$2o3o O54$2 O54*02 O54*01t O54{{ ^(O54 ^`O53z3 O53Y5o5k O53Y2*87 ^$O53y1 O53O64o43 O53O52$. O53$.O52 O53^V ]O53u O53^sz5 O53^s O53r O53$q*24 O53o8m O53o4MY2 O53o4c O53o43O64 O53o1r O53o0f O53$n O53i6h O53i6d O53i1f.4 O53i19 }O53$h O53$g O53'A O53*97 O53*76i0J O53-7*10 O53^7 O53*65$> O53$>*65 O53.6 O53-5 O53^5 O53*43 O53+4] O53$4 O53]+4 O53*32 O53,3 O53*24$q O53*24 O53*10-7 [O53*02 O53$& O53$@ O53$! O53$= O53^* $*O53 $$O53 [ $x *53 O52$zk $ O52Z5 ^@O52z5 O52Z2} O52{Z2 O52Z1sPA O52y5o5D O52Y4u O52y4E [O52Y3 O52Y2u O52Y2 O52y1,5 O52O92 O52O74 O52uY4 O52uY2 O52T4i71 O52T4,7 O52T4$% O52$%T4 O52ssz O52sPAZ1 O52so.c O52snq] O52]snq O52sd& O52s8#-0 O52s1. O52rp1 O52r^e O52^r*73 O52R5+5 O52R5 O52p5o63 O52p1r O52p1] O52oB0 O52o76Z1 O52o5- O52o4, O52o4_ O52o2y O52$n O52^m O52^L O52k$z O52K^3 O52$j$t O52i8p] O52i71T4 O52i6F O52i6& O52i5t O52i5h*27 O52i55 O52i4p O52i4N} O52i3**65 O52i34 O52i3/ O52i2y O52i2h*53 O52i1r O52i11y4 O52i0x O52^f O52^e O52dO05 O52d O52cso. O52c$* O52$*c O52^az2 O52$A O52^a O52,7T4 O52]$6 O52+5R5 O52,5 O52^3K O52.3+1 $*O52-3 O52*25^P O52+1.3 O52*12^t O52^1 ^@O52+1 O52-0s8# O52$0*81 O52*07O63 O52.0*60 O52*05 O52+0 O52-0 O52$@ O52$? O52$! O52$_ $%O52 {O52{ ^!{O52 $#O51Z3 O51Z2iA0 O51}z2 O51z1*23 O51^Y$7 O51y5T5 O51y5o3i O51y5o0J O51y5i52 O51y5$A O51Y4 O51y3y3 O51Y3o6b O51Y3[ O51[Y3 O51y1sue O51Y1^d O51OA5 O51O82 O51O73 O51O65 O51O19 O51O13t O51$w.2 $*O51u O51tO13 O51T7 O51T0.2 O51t$- O51$-t O51syE.1 O51^sO35 O51suey1 O51sbA.4 O51sb@ O51s5_$! O51$!s5_ O51$RR4 O51$rl O51R5 O51R4$R O51$q O51oAj O51o6=^K O51o5t O51o5!o0z O51o5e O51o50^@ O51o5# O51o5, O51o4D O51o37*02 O51o3- O51o2i O51o1, O51o0zo5! O51o0* O51$M O51$m O51l$r O51K$P O51K^H O51^j O51i8n O51i8 O51i3u O51i35 O51i1d O51i11 O51i0z O51i08 O51i0* O51^HK O51Ez2 O51dY2 O51^dY1 O51d*61 O51^d-2 O51^d O51d O51^c O51$Ay5 O51$A*30 O51*75 O51*64,4 O51$_.6 [O51*58 O51*52 O51.4sbA O51^4 O51*30$A O51^3 O51.2$w O51.2T0 O51.1syE O51*13o1L O51*02o37 O51^! $*O51 $?O51 $ O51 ]O51] ]]O51 ^@O51] ^@]O51 ^-O51 $x -5 O49i2r$3 O49$3i2r O48y3o0C O48$8$9 O47O05 O47O02 O47o0H O47i6e O47i40i55 O47i32i45 O47$2 O47$1 O46y4o4I O46y2.2 O46$U O46so0 O46i51 O46i4a O46i4& O46i2_ O46i0BT1 O46fo5l O46*30 O46-0 $.O46 O45Z1o6d O45y5o9s O45y5-5 O45y4o4g O45y4$? O45$?y4 O45y3 O45Y2t O45u O45tY2 O45s6- O45s3C O45p5$1 O45i6w O45i4x O45i4]D1 O45i4b+2 O45i41 O45i1y O45D6+3 O45d-5 $/O45d O45+6-5 O45-5+6 O45^5 O45+3D6 O45*31 O45$3 O45+2i4b O45$2$5 O45*13 O45$* O45[ $?O45 $!O45 O43y5Y1 O43Y5O32 O43y5C O43y5*60 O43Y5 O43Y4i5p O43y3O52 O43y3k O43y3+4 O43Y3{ O43Y1y5 O43y1 O43O82 O43O72 O43O41 O43^x O43uo1Y O43st> O43srf O43scg O43sbt O43qT0 O43o4i O43o42 O43o3x O43o2r O43o1Yu O43o1rk O43o1Fy2 O43o0F$8 O43kC O43i7 O43i5y O43i5w O43i4Vc O43i4k O43i4J O43i48} $!O43i48 O43i2t O43i2D O43i1l O43i16 O43i0$y1 O43E^& O43d-5 O43D3 O43C [O43C O43^c O43$bR9 O43$8o0F O43$7 O43$6Y1 O43+3s1s O43$3 $=O43+3 O43*25 O43*23y3 O43^1 ^@O43^1 O43*04 O43{-0 O43$@ O43$? O43$! O43$-[ O43[$- O43[ O43^& [O43 ^x *43 ^@O43 O42Z5Z4 O42Z5u O42Z4Z5 O42z3i0H O42Z2o5u ]O42Z2 O42z1Y2 O42Z1.3 O42Z1 O42$z O42Y5o5A O42y4s2# O42y4i4* O42Y3E O42Y2z1 O42Y2y1 O42y2^g O42y2 O42Y1Y3 O42y1Y2 O42Y1o59 O42$#Y1 O42$)Y1 O42$x O42^V O42uZ5 O42$t^e O42^t^8 O42T7 O42T1{ O42t.1 O42T0p1 O42T0$A O42^t O42ssuo4d O42spw O42spK*84 O42sl% O42siu O42s9@ O42s2#y4 $.O42s1Y O42^R O42p1i5+ O42p1 O42o7z O42o5z O42o5i O42o59Y1 O42o58 O42o5_ O42o4y O42o4p O42o4dssu O42o4B O42o3yu O42o3@D7 O42o35 O42o2zt O42o2d O42o29 O42o1& O42o0p O42^Mo3h O42$M O42$l*05 O42Ki3P O42K^! O42^!K O42i8jO93 O42i7 *9A O42i7- O42i7_ O42i6@ O42i5q O42i53 O42i5= O42i3w O42i3q O42i3PK O42i3o] O42]i3o O42i3i} O42i2y O42i2e O42i1r O42i0Z O42i0| O42$i O42EY3 O42E$. O42$.E O42$D$C O42D7o3@ O42d*54 O42D0 O42^@c O42$AT0 O42-A O42$a O42*97$? O42$?*97 O42*84spK }O42*62 O42^4D2 O42*42 O42.3Z1 O42^3 O42*23[ O42*21-0 O42*20 O42+2 $/O42+2 O42.1t O42+1{ O42*07 O42*05$l O42*03y5 O42-0*21 O42+0 O42-0 $#O42 $-O42 $`O42 [O41Z3 O41z1i1i O41z1i11 O41$z O41Y3T2 O41y3 O41y2o6 O41Y2-2 $.O41Y2 O41Y1^t $!O41Y1 O41$y O41$Xd [O41O62 O41O46 O41O12 O41^w O41^u^F O41$u*31 O41^tY1 O41tT2 O41tR5 O41T2Y3 O41T2t O41t] O41t[ O41t O41sy O41sSD O41se(-7 O41sc4 O41sa! O41s5 O41s37 O41$s O41$rt O41R5t O41R5R5 O41^py2 O41p3O6A O41p2Z1 O41p2O64 O41oAA O41o8 O41o7y O41o6e O41o52 O41o4O$* O41$*o4O O41o41 O41o4@ O41o3z O41o3r$6 O41o3n O41o3li1r O41o3f O41o30 O41o3& O41o2w O41o2V O41o2- O41o1z^b O41o1V O41o1o O41o1J O41o1i*35 O41o1e O41o0X O41o0W O41o0d O41o0+$+ O41o0! O41$+o0+ O41^m-5 O41KY4 O41i7l O41i7$ O41{i6u O41i6r O41i60 O41i5cE O41i58 O41i5& O41i3c O41i2m O41i2@ O41i1YR2 O41i1-$7 O41i15 O41i1* O41i0L }O41i0. O41f$E O41^f$A O41f*75 O41Ei5c O41E$a O41E+5 O41^e O41}D9 O41^B O41$aE O41*97] O41-7se( O41$7i1- O41*78.4 O41-7*64 O41-7*52 O41*71^t O41$7 O41$6o3r O41$6*60 O41*64-7 O41*60$6 O41,6 O41^6 O41+5E O41*57L5 O41*52-7 O41.5 O41^5 O41.4*78 O41*42] O41]*42 O41*35o1i O41*31$u O41-2Y2 O41*23 O41*16i2M O41*12o2K O41*10$? O41$?*10 O41*02] O41]*02 O41$0 O41]] O41^_ $;O41 ^+^+O41 $X $4 $x $4 ^x $4 O3Bo3f O38y4y4 O37$&Z2 O37{z1 O37p1c O37^p O37o0h O37c$8 O37^aq O37$8c $x *37 O36Z1^E O36y5 O36y4*38 O36^s O36o6e O36o3x O36k O36i3c O36i2To43 O36^EZ1 O36E O36$1 O36*03 O35Y4y3 O35Y4 O35y3Y4 O35y3u O35Y3t O35y3i3> O35Y3$1 O35uy3 O35tY3 O35qp1 O35p1q $.O35p1 O35o7q O35o2b O35i7s O35i6# O35i5g*50 O35$#i5\ O35dz1 O35$aY4 O35,1i1W $!O35^$ $@O34Z4 O34Z3-3 $X *34 Z2 O34Z1 O34$y^u O34y5E O34y4*64 O34y4*24 O34y3o0Z O34}y3 O34y3 O34Y2-5 O34Y1r O34O01y2 O34$Wo6. O34tR3 O34T1,3 O34T0q O34$t O34snr O34ry1 O34R3t O34p1o2d O34o7w O34o6.$W O34o5x O34$m O34^L*61 O34k*57 O34$+i7. O34i5A O34i4g*23 O34i4- O34i2r O34i1s O34i0! O34^Hz1 O34fO05 O34Ep2 O34cp2 O34$A O34'A O34*64*06 O34^6+4 O34*57k O34,4 O34-3Z3 O34,3T1 O34+3 O34.3 O34*24 O34*23i4g O34+1 O34$/^1 O34$@ O34$! [O34 O32Z3o1F $$O32Z3 O32z2*40 ^?O32z2 $/O32Z1 O32^*z1 O32y5o9e O32y5o3E O32y5D6 O32y5+4 O32y4Y2 O32Y4^H O32Y4E O32Y3c O32Y2y4 O32Y2,5 O32y2^@ O32Y1.3 O32^*y1 O32^Y O32O83 O32O47u O32O46 O32O42 O32^wu O32uO47 O32u$A O32^u O32^T-1 O32sxm O32sMj O32sI3d O32$s*24 O32R5R5 O32R2$@ O32$@R2 {O32r O32^Pp2 O32p2O03 O32p2 O32o95o4t O32o6Q O32o6F O32o5r O32o4to95 O32o4=,5 O32o3r O32o3p O32o3A O32o38 O32o2j O32o2d $_O32o2A [O32o2@ O32o1y O32o1w O32o1u O32o1s O32o1FZ3 O32o1E O32o17 O32o0Ky4 O32o0Di1a O32^J-7 O32i7o O32i6 s0$ O32i5q O32i4xE O32i4w O32i3x O32i3s O32i3b O32i32p3 O32i2s*35 O32i2g O32i2f^h O32i2f O32i22 O32i2/ O32i1j O32i1ao0D O32i11y2 O32^HY4 O32$g*03 O32^F*12 O32$f O32^#f O32EY4 O32^eq O32Ei4x {O32E O32dsI3 O32D7Y3 O32^d O32cY3 O32^c*21 $$O32C O32^c O32[^B O32$Au O32'A O32^8 O32*76Y4 O32*76$$ O32$$*76 O32-6 O32,5Y2 O32*53-4 O32-4*53 O32*42 O32.3Y1 O32*35Y2 O32*31 O32+3 O32-3 O32^3 O32*25 O32*24$s O32.1 O32^0z4 O32$0$7 O32*03$g }O32*01 O32.0 O32$) O32^. {O32 ^@O32 ^!O32 O31$zO02 O31z4^L O31$*Z4 O31z2*30 $-O31Z2 O31Y4o1i O31y3$A O31y3] O31]y3 O31y2D8 O31Y2D1 O31Y2*BA O31}y1 O31O94 O31O65 O31O52k O31O52C O31O02$z O31$VZ3 O31^u$S O31u$L O31T7 O31t,3 O31T0f O31t] O31sMf O31sa^ O31^S$8 O31s2' O31rp2 O31p2r O31p2i5y O31p2i0a O31p1l O31^p O31o8ui8l O31o7j O31o6! O31o5y O31o4i O31o43k O31o3J O31o3_ O31o2v O31o2j O31o2g O31o2f*46 O31o2, O31o1x O31o19 O31o10E $?O31o0Y O31o0U O31o04 O31$mZ5 O31$Lu O31lp1 O31$li7b O31^l O31kO52 O31ko43 O31Kc O31k*04 O31$JD2 O31$j*72 O31i8I O31i7+,7 O31i71 O31i6o O31i6i O31i6_ O31i2nE O31i2c O31i2@ O31i1d O31i11 O31^GC O31fO45 O31^f $*O31^f O31Eo10 O31Ei2n O31doAe O31diA_ O31D2$J O31D1Y2 O31$.d O31Cy3 O31CO52 O31cK O31C{ O31^c O31'B O31$Ay3 O31*83 O31^5 O31*46o2f O31$4 O31.3y5 O31,3t O31$3 O31$2 O31*15y2 O31*12 ^X *31 O31$% O31} O31^# O31^@ O31^/{ }O31 ]O31 ^X $3 ^x ^3 O2A+3 O29y2$8 O29rp4 O29p4r O29$8y2 O28y4*36 O28p2l O28p2$& O28lp2 O28i6l O28$7 $*O28 O27z4 O27o3.y2 O27o0b O27K O27i1v O27$%f O27^D O26z4 O26p4l O26p4$( O26o2h O26lp4 O26k O26fo0k O26d^Z O26d*54 O26+4 O26*01 O26$0 $*O26 ^!O26 O25y5E O25y2z2 O25y2t O25ty2 O25T0$& O25$&T0 O25qq O25q*74 O25q$2 O25p4T4 O25p3*54 O25o4! O25o2p O25o2b O25l$4 O25i5x O25i3g O25i0J O25$4l O25$3Y2 O25$#$# O24^ZY4 O24z5i3o O24z2 O24Z1+4 O24Y4^Z O24Y4*24 [O24y2 O24Y1+4 O24^v [O24u O24tp4 O24T2srS O24^T O24srST2 O24se3 O24R3 O24qD9 O24q*94 O24q*65 O24q] O24p4t O24p4^a O24p3DA O24p3 O24p1i5@ O24$P O24o3=f O24o3@ O24o2-$. O24$.o2- O24$ld O24L2 O24i3yd O24i3r O24i2W O24i2d O24^Et O24D9 O24C,1 O24+9 O24+4Z1 O24+4Y1 O24$&-4 O24-4$& O24^1^m O24*13 O24}+0 O24-0 O24$ O24^@ O24^! $(O24^) $(^)O24 {O24 O23$zy4 O23Z4Y2 O23$=Z3 O23Z2i2T O23y4$z O23y4K O23y4*78 O23y4,6 O23y3Y1 O23y2y5 O23Y2t O23Y2f [O23Y2 O23Y1y3 O23Y1o4w O23O62 O23O4By4 O23O41$$ O23$$O41 O23O02O56 O23$x O23^w*48 O23$V O23^u O23tY2 O23t-0 $+O23t O23snq O23$S O23R0^l O23r }O23q O23p4l O23p3'A O23p2'A O23p2] O23p1o9$ O23p1[ O23o7h O23o6!Y1 O23o4wY1 O23o3g O23o2y] O23]o2y O23o2W O23o2K O23o1iq O23o1_ O23o0h$` O23$`o0h $.O23$O O23^m O23lp4 O23L6^n O23^'^L O23kp2 O23^K O23^J O23^j O23i7, O23i5y O23i5/$B O23i4# O23i3t O23i2TZ2 O23i2b O23i2& O23i1p+2 O23i1h O23i06.3 O23^h O23^G O23^eu O23^ei1G O23^e O23d'A O23D7-5 O23$Bi5/ O23$b O23^7 O23*64] O23]*64 O23-5D7 O23*35Y4 O23}$1 O23-0t O23$0 O23^@ $$O23 $@O23 $.O23 $ $<$>O12 ^x .1 *03 ^x $1 ^+ ^x -1 $X -0 Y5 $X +0 E O0BK O0B] O0Az4 O0AO31 O0Ap2O02 O0Ap2 O0AD6 O0A} ^(O0A O09p5 O09^6 O09+0 O09$} O09^* O08y2C O08y1 O08p1 O08C$* O08$*C O08$2 O08$1 O08,1 O08} $ O08 O07Z3q O07Y4 O07Y3q O07Y2 O07O93 O07O6B O07O36 O07-0 O07} O07{ O06z4 O06z2u O06z1 O06Y3q O06Y2y2 O06y2Y2 O06Y1 O06uz2 O06rp2 O06qZ3 O06q*19 O06p3*45 O06p2r O06L1 O06kp2 O06^K O06^i O06d O06C O06$aZ4 O06$4 O06+3Y5 O06$2 [O06$2 O06*10 O06$* O06$@ O05z2*42 O05Z1y5 O05$z O05y5Z1 O05y5O43 O05y5*97 O05y5+8 O05y4[ O05y3 O05y2D6 O05Y1 {O05Y1 O05O21u O05O12 O05uO21 $*O05u ]O05u O05s1+ O05q O05p4k {O05p4 O05^.o7. O05o35 O05o2v O05i5% O05i3n O05i3. O05i1u O05i19 O05^h }O05$h O05f*20 O05E$0 O05$e O05dY1 O05dc O05Cz3 O05Cz2 {O05C O05$5 O05^5 O05'3 O05$2 O05.2 O05$0E O05$* O05[ O04Z4Z4 O04Z4q O04Z4-5 O04Z3 $x *04 Z2 O04z1^o O04Y5Y1 O04y4i4, O04y3 O04y2+2 O04^Xt O04O72 $.O04$w O04u$* O04$*u O04u O04t+2 O04ss1c O04$/q $/O04q O04p5 O04p2DB O04p2] O04p1o11 O04$_^P O04o57*24 O04o4 O04o38 O04o0xy2 O04o01 O04^N$4 O04^M O04$L O04iA2 O04i6. O04i4$ $%O04i4$ O04i3k O04i2yt O04i1t O04i0Y O04i0jR2 O04i0B$5 O04D6 O04css1 O04^c O04^B O04$a O04+7 O04*65*64 O04-6 O04$5i0B O04^5 O04$4Y4 O04+2t O04*24o57 O04*23 O04'2 O04$0Y1 $.O04$0 O04$* O04$@ O04$! O04]] $$O04 ^/O04 O03Z5t O03z3^G O03Z2i2h O03z2i2b O03z2 O03Z1^m O03y5Y1 O03Y5i6e O03Y4Y4 O03y4*56 O03y3y3 O03y3y2 O03y3k O03y3.1 O03Y3 O03Y2y5 O03Y2 O03Y1y5 O03O93 O03O32 O03O12 O03$W O03^V*23 O03^u^z O03uR5 O03ui22 O03tZ5 O03tk O03t*30 O03t'3 O03t*13 O03$sL6 ^)O03se. O03^s O03R5u O03qo8f O03q O03p2C O03p1Y1 O03p1$h O03^P^! O03o7ki7o O03o6ME O03o55 O03o4cp1 O03o44^A O03o2e O03o1sp4 O03o0z O03^o O03$N O03^N O03^mZ1 O03L6$s O03kt O03K^d O03K+5 O03^jo6e O03i55 O03i5 O03i4qi4h O03i4h O03i3v-3 O03i3b O03i36 O03i2-y2 O03i2-i22 O03i2hZ2 O03i2b O03i22u O03i2. O03i1j O03i1- O03^g$c $+O03E O03^dK O03d$h O03d+B O03d'9 O03D6 O03D4$@ O03$@D4 O03^d-1 O03d+0 O03^d O03d O03cy2 O03Cp2 O03$c O03c O03'B O03*73*48 O03+5K O03*48*73 O03'3t O03*30t O03$!-3 O03-3$! O03^2y1 O03*23 O03*13t ^x *03 .1 O03*04 O03$? $*O03 $.O03 $>O03 }O03 O02z4t O02Z3*40 O02z3 O02z2t O02Z2 O02Z1$! ^_O02$z O02y3u O02y3c O02Y3$/ O02Y2Y3 O02Y2i0h O02y2D5 O02Y1y1 O02y1Y1 O02Y1*34 $'O02Y1 O02O83 O02O62Y3 O02O16 O02$VZ1 O02uy3 O02$u O02tz4 O02tz2 O02sxF$. O02$.sxF O02srp O02soa O02scs O02s27 O02s1+ O02^/r ]O02q O02p1$W O02^p O02o8oO71 O02o5z O02o51 O02o5@ O02o32i6a O02o2z O02o1.z4 O02o1y O02o1s O02o1e^M O02o13 O02o0d$9 O02}$o O02k$k O02$kk O02^k O02i6ao32 O02i64 O02i6* O02i6$ O02i51 O02i50 O02i4n O02i4Jl O02i4h O02i48 O02i3s O02i3n O02i3-i3- O02i33 O02i3@ O02i2o O02i1v O02i1ui2T O02i1u O02i1l O02i1a O02i0K O02i0hY2 O02E O02dO04 O02DB O02D5*10 O02d-5 O02D4 O02^d O02c O02'B O02*AB O02$9o0d O02$8 O02-8 O02.6 O02-6 O02+5Y4 O02*53i1w O02*45 O02*43 }O02*42 O02*41*27 O02*40Z3 O02*40 O02{*35 O02*34Y1 O02$3 O02,3 O02*27*41 O02*15.0 O02*10D5 O02-1 O02$%^@ O02$- O01z3o2l O01Z2$D O01Y5+9 O01Y4Y4 O01y4i8@ O01y4[ O01y2u O01O82 O01O61$@ O01$@O61 O01O56 O01O51*35 $x*01O51 O01O42 O01$x O01uy2 $-O01t O01sad O01rD5 O01R2$d O01r O01p2$* O01p2] O01o7*E O01o7! O01o6p O01o6+ O01o4S$. O01$.o4S O01o3X O01o2v O01o1ip1 O01k$! O01$!k O01^J*86 $@O01i71 O01i65 O01i6! O01i54 O01i5% O01i4v O01i4e O01^f$b O01Ey3 O01Eo7* O01ED2 O01$dR2 O01$Dr O01d,6 O01D3r O01D3[ O01D2E O01$d O01$a O01-7-2 O01*6AO43 O01*41 O01-2-7 O01$- O01} ^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 $wZ2O84 $w Z2 t $W Z2 E ] ^W z2 $w z1 Z2 ^wz1O73 ^Wz1O62 ^W Z1 o5g ^W z1 ^w $z $WY5OA3 ^wY5O51 ^wy5O32 ^WY5O12 $W $y *53 $w Y5 $W y4 $w Y3 t $W y2 z5 $w y2 o9A ^w y2 o2t ^w y2 ,9 $wY1O51 ^W y1 u ^W Y1 ^Q $wO84Z2 ^wO72T0 ^wO65y1 $wO64$u $wO63 ^wO63 $wO51Y1 ^WO46y2 ^WO43,2 $wO42 ^WO34 ^wO31 ^wO23 ^WO12Y5 $.$wO04 $W $W { $W $w $w ^v ^W u y1 $w$uO64 ^w u D7 ^W ^U $w t Z2 $w t Y3 ^w t $8 ^W T6 ^wT0O72 ^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,2O43 ^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 $vZ2O74 $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 $VOB4 $VO72 ^vO63i0S $vO63 ^vO42 $vO34 $vO32$r ^vO25 ^VO23y2 ^VO15^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$rO32 $v $r ^v ^Q ^@ ^v p5 $v ^p ^v ^p $v o9s $Vo8PO52 $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/ ^vi5%O23 ^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^2O24 ^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 uZ5O71 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 uZ3O83 uZ3O23 $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 uZ1O31 $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 uy5O92 uY5O84 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 $. uY3O52 u Y3 ,8 u Y3 ,7 u Y3 *02 $u Y3 u Y2 Y2 $u Y2 Y2 uy2O47 $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 Y1 i27 u Y1 $d u y1 ^8 u y1 *41 ^U Y1 ^U $y u ^X z4 u$XO42 ^uOA5 uO83Z3 $uO82 ^UO81smC uO71Z5 uO71 ^uO71 uO65$I uO64Y4 uO64t uO63t uO62$J ^uO62D3 uO61$J uO61$j ^uO54^K uO53$M ]uO53 uO52] u]O52 uO51$4 $uO51 $*uO51 uO45 uO43t uO43d uO42$X uO42 uO35y3 uO35t uO32k ^UO32 uO32 uO31Z1 ^uO31t uO31o0W uO24t uO24d [uO24 ^uO24 uO23Z3 uO23i5? uO21k uO14y2 $*uO05 ]uO05 uO04^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 utO64 utO63 u^tO52 utO43 utO35 ^utO31 utO24 $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 ^UsmCO81 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 up3OAB up2O62 up2O4A up2O2A up2O06 u p2 up1O23 ^up1O05 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 uo73O41 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 uo0WO31 u o0W -7 $u o0p u o0l u o0G u o0g $* u $* o0g ^U ^O u $N ^u ^n ^u ^m z1 u$MO53 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 ukO32 ukO21 ^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$JO62 u$JO61 u$jO61 u $J $F u$IO65 $U $i E u iBY u iBD u iAR u iAn u i9. Y2 u i8F ui89O12 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 ui0HO13 ^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 ufO6B 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 udO96 udO93 udO52 udO13 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-7O41 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$4O51 u -4 T6 u ^4 i6n u*4AO52 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 ^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 t $Z Z5 t ^Z t tz5O87 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 tZ2O61 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 ty5O83 ty5O69 tY5O18 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 tY4OB2 ty4O65 tY4O02 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 tY3O82 tY3O62 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 tY1OB1 tY1O42 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 $X y4 tOB4 tOB1Y1 $tOA2$u tO98 tO94 tO92Y4 ]tO92 tO91*69 tO87 tO82Y3 tO82o6P ^tO82,2 tO81O52 tO81$I tO81.A tO72D0 $tO72 tO63O12 ^TO63 tO61Z2 tO53d tO52$I ^TO51 $tO51 tO42Y1 tO41o1y tO41$l $tO41l $TO41 tO41 tO32y4 tO31$P tO31-4 tO27^S tO24p4 ^TO24*21 $+tO23 ^tO23 tO16o2? tO13z2 ^tO13i1e tO12 $*tO12 tO02Y4 $-tO01 ^T ^x $t ^X ^t $x t $W Z5 ^t ^w Z1 ^T ^w t $v Z5 ^t $V $t ^v $t$uOA2 ^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 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$PO31 t $P o1U t $p +6 tp3OAB tp3O9B t p3 '9 tp2OA7 tp2OA4 tp2O86 tp2O75 $t p2 r tp1O42 tp1O15 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 toByO26 toAKO52 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 to6PO82 ^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_ to1yO41 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 $1 $T $m t $m t $l Z5 t$lO41 $tlO41 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$IO81 t$IO52 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 $Ti56O34 $t i5_ ti4$O62 ti4 O0B 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 tfOA5 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 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+AO81 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 T9Z5OA6 ^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 T9 i33 T9 DB t '9 D4 T9 $D 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 }T8O91 T8}O81 T8O42+0 T8O41D4 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 } T8D4O41 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+0O42 T8 $+ T8 $@ T8 ^# $. T8 t ,8 ^t ,8 T7 z1 y3 T7 z1 t t -7 y4 T7Y3O62 T7O81 T7O32 T7O13 T7O03 T7O02 ^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 T6Y2O51 T6Y2O23 T6 Y2 D5 T6 Y2 *B8 t ,6 Y2 T6 y1 i7K t .6 Y1 ^*T6O75 T6O51Y2 T6O42 T6O23Y2 T6O15i1T T6O06 T6 $u i0n T6 t T7 T6 T7 t 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 T5O72$0 T5O63T0 ^T -5 ^V T5 T6 ] T5 ] T6 T5 T4 T1 T5 T3 ] T5 ] T3 T5 T2 D7 ] T5 T2 T5T0O63 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 T5fO62 T5 D7 T2 T5 D6 o11 T5 D1 -0 T5,AO71 t *59 +0 t *58 -3 t $5 -8 t *57 p1 t +5 *75 t *57 -4 t*56O21 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$0O72 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 T4i5 O69 T4 i5V T4 i5 T4i4 O46 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*49O17 T4 *97 t .4 *93 t*46O53 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 *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,2O82 T2[O32 T2 T5 o6$ ] 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 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 T1Y3O41 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 T1O42{ T1O41Y3 T1O41o4$ t .1 ^W T1 ^u T1 t Y4 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% 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+AO21 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 T0z4O95 T0 Y3 o21 T0 y2 i5y T0 Y2 T0 y1 T0 ^X ^D T0O84 T0O82*17 T0O67 T0O62o13 T0O61*53 T0O14 $%T0O13 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 T0o13O62 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 $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*53O61 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*17O82 $t *01 *24 T0 $1 $1 T0 ^1 ^- ^t $0 ,1 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 ^s $z Z2 ] szZ szZ sZ$O61 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 syfY2O43 syfO43Y2 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 $sy4O65 $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 ^SOA1 sx9 $! $sO65 ^SO54 sx[ +4 L6 s .O43 ^sO34 sx3 ^sO24 ^sO15D3 ^sO14O58 $sO13$c ^sO13 ^SO12i20 s ,O02 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 svyY5O62 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,uO25 sUW suU sUt o2v sus i5c $s u ^S suoO71 sumO21 sul o6e su{ L2 suG ^S sUC d ] sua o4u ^S u *80 su7 o3@ } su7 i25 [ su4 su3 y2 $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/O31*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 sTGy5O84 stf $h D3 stf D3 $h st- ^F std $M D2 std D2 $M stcO03^V stc $5 st9 +2 $sT7O14 $! 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.O43 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 ssjO03 ssj K i0b ssj i0b K ^S sis +3 ssi o3_ ss! i6z ss) i5I ssi ^S sgt ^S sgM ssfO01r ] ssf i64 ssf [ *35 ssf *30 sse ssd y5 sS* d t ssd s1 ssd $Q ssdi6eO43 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 ss6O51 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 srxO52 $.srxO21 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 srtO81 srt o5v sR* t K srt i0g srt +2 srq r srq i2s srn Y2 Y2 srn o2a srN E srn *53 srn *24 srMO01 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 srgO53 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 spwO21 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 soyO13 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 so0O81t so0tO81 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_ $ 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 sncO12 sNc *54 .1 sNc .1 *54 snB ^@ snaO02 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. sMYO61.1 smy DB sMY.1O61 smX o5S smx *65 smwO01 smw sim smW c [ smw smv o7q smv -B smv +4 p4 smu i7f sm* u ] smt { $b smt -7 sMT .5 sm> sa> sms $ smrO32 smx $c 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 sMjO32 sMJ s10 C smj l $3 sMJ C s10 smj $3 l sMJ smh D6 *31 smh *31 D6 smh *08 smh sMg i1r sMfO31 [ smf smd o1a smd $5 smd ] smd smc ^g smc smBO21 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%O42 sl/O32^g slx slw +1 slVY3O51 slVO51Y3 slv *07 slu i3y slu slt *46 slt slS u sl; sp[ slS slrO61 slRO51E slr i5u suP slREO51 slR c $* slR $* c slr $2 slqO43 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 ^@ $!slgO14 sLG u sLg u slg K Z2 slg sLF Y4 t slf Y3 Y3 slf y2 sLF t Y4 slf D5 i5w slF $6 sleO81 sLE sl! E sle sld Z2 y4 sld y4 Z2 slc $j slC *51 slbO91 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 $)sKZO21 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 skDO51 skd oB5 skcO72 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 sJSO42 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 siQO37 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 siNsNk siI sih $! sig sif sieO42 sieO32c sie T1 sie o4 siecO32 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 si4O03 ^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. si1O53 ^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 } shzO43 shzO32 shz $8 sh_ ^z sHW u } shW $C shw *70 p5 shv y5 u shvO62+4 shv u y5 } shv o3f shv *52 shv+4O62 shv *25 shv shu i2f sht*69O42 shr shpO02 shp *73 $k shp shn shm o32 *07 sHM +4 shm *07 o32 shlO91c shlcO91 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 sg9O32 sg9 sg'*75O02 $! sg6 c sg6-7O41 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*EO24$O se*O13 ^)se.O03 sewrO53 sev $n seu r setdO05 set ^d E set $3 ses y5 c $s E ss$ seS o1F ses { seqO21 seQ u seq *71 sep i2v sep $9 seoO67 s*E$OO24 seo '9 $n seo *54 [ seo *41 seo ,2 seo ^' seN *53 seM o2k semdO03 $= sEm seJO41 sejO12 sej ^3 se; i7n sEi *56 se] i3, sei $* $. sei ^s E D7 se_ d [ sep y2 sec Y1 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 se3O73 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 [ 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 sdkO23 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 sdfO62 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$cO13 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 scKO72 scK K sck $e sck *A8 sck +8 ^@ scK scK scjO58 scj t k scj o4g ^d scj k t scJ ^$ ^$ $s C i4_ sch ^Y sch ^s $= scg y2 sCGO31 scgO12 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 ^* sby o7w sb@ Y3 *20 sbX T2 *50 sbX *50 T2 sbw sth sbv D5 sbT i3k ] sbt $7 sbt ,3 sbS Y2 sbK o5* sb sBO sbs *25 sbs sb$ R3 E sbqO63 sbQ q sbq o7d sbp o2x { sbp { { { sbp sbp sbN c sbm Y2 sbm o20 sbm ^M p4 } sbM sbm sbkO02 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&OA2 ^s^AO72 sa+O62 sa.O54 saX *53 s^AO21 saW saV -3 sav $_ sa@ ^v sav sauO61 saU u sau i09 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 sarO02 sap +2 $. sap $. +2 saoO73 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 sa5O02-7 sa4 r sa4 D3 $& sa4 sa3 $! sa *25 sa- *21 sa *21 } sa2 sa1OA2 sa1O42 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.O43 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 O81o1e s7w i7u s7W $C s7v ^K s7T ^Z s7R ^C $@ s7r { s7o Y1 s7 o1eO81 s7! i5E s7g z3 { s7F Y3 s7f s7b ^g s7a i13 $S *79 $s *78 s 7 $7 s75$ O86 s75 $- s75 $ s73 T4 s73 ,9 s73 s72O01 s72 +4 s72 $4 s71 i4j ^D $s *71 s71 s70O15*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 s5ap2O0A s59 i5p s59 ^4 s58 ^s [ s57 ^V s57 $. s54 y2 s5% *42 s5/ +4 ^s *54 s53O61 } $s *53 s52 c s51y3O01 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=O42 s*3O14 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 { s3CO45 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 s30i4gO21 s3. *04 s30 *30 $S .3 ^S ^3 s3& { s3! ^" s3> $< $s $3 { $s ^3 ^` s3! s2. Z2 s2z s2. y2 s2y $! s2'O31 ^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 s2DO41u s2DuO41 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 ^s *20 D4 s20 +5 $S *20 *35 $S *20 s2. .0 ^S ,2 s2* s2! [ $s +2 $s ,2 $* s2! $ s2. ^& s2& s1z $o ^. s1z $.s1YO42 s1Y ^T '8 s1# Y2 s1x i1h E s1x E i1h s1x D6 ^ s1 O98 s1X $3 s1@O23 s1+O05 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 s1pdO04 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 s17O31 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*14O27 s1.,4O13 s14O03 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 s0CO45 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 $! s09O86 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^NO42 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 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 ry5O93 ry5O67 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 $ROA2u $rO93$R rO74$y rO72r rO72 r ^x -7 $rO63 $rO62 rO61$s rO61+4 rO61^@ ^rO61 rO53+0 rO52+3 $rO51l rO51] r]O51 $rO51 ^RO42 rO41y4 $rO37$g rO28u $rO25^L rO25 rO24r ^.rO21 rO14r ^RO13 rO12p1 ^RO12o89 rO05p4 $rO03$l $RO02y2 $r $x $R $w E r $w +6 $r $v ^8 r $v -5 ^R u y3 $RuOA2 ruO28 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$sO61 $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$RO93 $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^pO71 ^Rp5O02 r ^p *56 r $p -5 rp4O0A rp3O0A rp3O08 rp3O04 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 $rlO51 $r$lO03 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 ri51O63 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 ri3nO63 $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$gO37 r $g ^b r $g ^1 ^R ^G r ^g rfO96 rfO59 rfO53 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^dO53 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 RBOA1 RBO91R9 RBO54R7 r $b t RB oAA RB D5 c r ^b d RB c D5 RB $@ r ^b { [ r ^b RA z1 $X RA Z1 RA y1 c RA $X z1 RA u -A ^r 'A ^u RARAO73 RARAO04 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 ^%R8O53 R8O01R7 R8R8O52 R8 R8 [ R8 o7z $) R8 i8( R8 i4t R8 C +6 R8 *78 ^r*86O61 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 R7O82sfG R7O43 R7O25d R7O15q R7 ^u Z1 R7 t '8 R7 t R7sfGO82 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 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 R6O42 R6O32.3 R6O05 r +6 $w R6 u Z5 R6 t y2 R6 t o5y R6 t .5 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 R5Z2O41 R5 y5 y5 R5Y2O02 R5O41Z2 R5O41 R5O02Y2 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 R5o34O02 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*59O53 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 ^! R4Z2O54 r $4 Z2 R4 Z1 .2 R4 y2 k r+4O61 R4O54Z2 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+3O52 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 R2O02 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^nO51 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 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^@O53 r+0O53 R0O51o3s R0O45i6N R0 T1 R0 sea { R0 { sea R0 sb; R0 R1 ^r +0 o8t R0 o7y R0 o50 R0 o4Y R0o3sO51 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 qz5O76 $QZ5O07 $q Z4 u ^Q z4 q Z3 y1 $q Z2 r ^q z2 .A $q Z2 *32 $Q Z2 } ^. ^q z2 qZ1O12 $q Z1 u $q Z1 *51 q ^Z q ^z $q $z [ q $z $q ^y p5 ^Q Y5 s8q q Y5 ^qy4O71 q Y4 $O $Q y4 i52 q y4 *65 q y4 *56 $Q y4 qy3O74 qy3O65 $q Y3 ^q Y3 ] $q y2 y4 ^q y2 +2 $Q y2 -0 q y2 $. q $. y2 ^q y2 q y1 Z3 qY1O15 $qY1O06 ^q y1 K $q Y1 i7Q $Q Y1 D1 ^Q y1 'B $q Y1 *43 ] q Y1 $_ $q y1 ^q ^y qOB8c qOB3O06 qOA1o9o qO95D4 qO93OA2 qO82E $QO81 qO75*24 qO72*86 qO68o4y qO67 qO65O01 qO64sKm qO63*62 ^qO61*02 qO58$l $qO52 ^qO51o7h qO4Bi1m qO4B*05 qO49^# qO46*85 qO46-7 qO46*20 qO45$U $@qO45 q[O42 qO38*31 qO36,2 $qO34 qO32$1 $qO32 ^qO32 qO31t qO31l qO31*57 qO28*31 qO26se, qO25i0s qO24*30 qO21T0 qO18*20 qO15Y1 qO15o2# $qO15K $QO14 qO14 qO12Z1 qO09i34 $QO07Z5 $qO06Y1 $qO05 ^Q ^X q $x $q $x ^q ^w L3 $q u Z4 $q u Z1 q$UO45 $Q $U ^Q u qtO31 q TA qT0O21 $q $T $q ^t ^q $t $q smy qsKmO64 qse,O26 ^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 qo9oOA1 ^q o95 $q o8Q qo8AO08 q o6. i07 $q o5z ^q o5s i1w qo5gO14 ^q o59 z1 qo4yO68 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$lO58 qlO31 q l o7D q l D3 $q L8 $q L4 Z3 ^q L0 z1 ^q k Y4 ^q K y1 $qKO15 ^q K *20 $q k q ^J $9 q iB2 $Q i9q qi9AOA4 $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 ^G $q ^g ^QfO31 ^q f *25 q ^F ^q ^f qEO82 ^q ^e i88 $Q E -8 $q $e $q ^e q DB qDAO23 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 qcOB8 q $C $c q c *82 q c ] q*B8O08 ^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'9O21 q -9 *B0 q*9AO18 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+7O23 [ ^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*47O15 ^q *46 $q *43 Y1 q *42 s2 $q *40 $# $q $# *40 $Q +4 q $4 $q -4 ^q $4 q *38 *B0 q*37O01 ^q *37 q *35 f $q *32 Z2 q *31 *97 $Q +3 $q .3 $q ,3 ^q $3 ^q ^3 q,2O36 q -2 i4. ^q +2 i2w q*24O75 q *24 D8 q*20O46 ^q *20 K ^q *20 $q ,2 q$1O32 q*16O14 $q *15 i5p ^q *13 q $1 $* q *09 ^q*02O61 $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 $pZ1O62 $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 $POB2u $pO91 $pO62Z1 ^PO53o2G $pO43 $pO42 ^PO24o44 $pO23 $pO21 ^PO08 ^P ^w t $P $W ^P $W ^P ^W $p $w $p $v $PuOB2 ^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` ^Po4vO12 ^p o4G $p o4b ^P o3V $p o3p ^P o2n c ^Po2GO53 ^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^iO12 ^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 p5OA8o99 p5O13 p5O0A*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 p5o99OA8 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 p5 ^i ^B p5i9WOAB 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 *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 ]p4O7B p4O71i18 p4O45'A p4O34O8A p4O08O48 p4O05$v p4$vO05 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 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 p4o4iO31 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 } 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 p3Y2O8A p3 y2 s83 p3Y1O09 p3OBAsNA p3OB4o8= p3OB1] p3]OB1 p3OABs40 p3O92O03 p3O91$6 p3O8AY2 p3O83*02 p3O81O41 p3O7Bt p3O78u ]p3O76 p3O72-2 p3O62o6/ p3O5BO76 p3O5Bt p3O14 p3O09Y1 p3O09^a p3O08sdl p3O07] p3]O07 p3O01$m p3O01*BA p3 ] $v p3uO78 p3tO7B p3tO5B p3 $t o7c p3 t o0v p3 t 'A p3 T3 o2A p3 T0 i6K p3 T0 'B p3sNAOBA p3 sln o6v p3 sgb $Q p3sdlO08 p3 s83 y2 p3 s7. p3s40OAB p3 s*. p3rO0A p3rO04 p3 r *B9 p3 $r [ p3 [ $r p3 $Q sgb p3 ^Q 'A p3 $p i9P p3 oBx p3oAtO54 p3o8=OB4 ^! 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$mO01 p3 ] $m p3 l 'B p3 K o4! p3 $K $5 p3 $k *45 p3iA5O14 p3 i9P $p ] p3 i9- p3 i8G c p3 i8c i9c p3 i83 o76 p3 i7d +8 p3 i6K T0 p3 i5l +6 p3i09O53 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$6O91 p3 .6 ^s ^P *36 p3 *53 *10 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-2O72 p3 .2 .A p3 $1 Z3 p3 *12 o5f p3 *10 *53 $p *30 R4 ^p *30 i2a p3*02O83 $ p3 $0 $p -3 $, p3 $; $, p3 ^# p3 } ^# } p3 p2 $z Z1 p2Z2OB9 p2 $+ Z2 p2 $) Z2 p2 Y3 p2Y2O94 p2 Y1 ^r p2OB9Z2 p2OB9O02 p2OB7t p2OB5 [p2OB2 p2OA9O05 p2O98o5@ p2O95u p2O95+7 p2O95 p2O94Y2 p2O93O13 p2O93t p2O8AO32 p2O8Au p2O89t p2O87-6 p2O85t p2O83O83 p2O7BE p2O7Ai0h p2O79O78 p2O78O98 p2O78O79 p2O73O39 p2O6At p2O6Ao5A p2[O69 p2O64'B p2O63i6t p2O59.4 p2O53u p2O53o5u p2O4Au p2O48t p2O42$2 p2O3B ]p2O3B p2O38] p2]O38 p2O2B p2O29D4 p2O28O78 p2O27o0c p2O23O6B p2O23'B p2O1B*72 p2O1Ak p2O1A p2O18y2 p2O15'A p2O0A^s p2O08t p2O07O8A p2O07i7/ p2 $w Z2 [ p2 ^w p2 $V $D p2uO95 p2uO8A p2uO53 p2uO4A p2 $u ^s p2 u ^L p2 $t Z1 p2 $t Y1 p2tOB7 p2tO93 p2tO89 p2tO85 p2tO6A p2tO48 p2tO08 p2 t i57 p2 ^t ^g p2 TB TA p2 TA TB p2 T7 DB p2 T2 $7 p2 ^s ^S p2 slF E p2 si1 R5 p2 s8+ ] p2 ] s8+ p2 s1c p2 ^r Y1 p2rO04 p2rO02 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 p2o5@O98 p2 o5t +0 p2o5AO6A $@ p2 o2z p2 o1@ ^G p2o0cO27 p2 ^N ^T p2 $m Z2 p2^mO1A p2 ^L u p2 l 'B p2 ^l p2 ^k ^e p2 $j i8J p2 iAx p2iAmO12 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^gO1B p2 $G ^g p2 ^g $3 p2EO7B p2 E ] p2 ] E p2 $e ^@ [ p2 $e p2 DB Y3 p2 DB T7 p2 DB +7 p2 D8 'A p2 ^d ^5 p2D3O79 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 *59 [ p2 $a p2 '9 -7 p2 +9 -1 ^p *28 $s ^P *28 p2+7O95 p2 $7 T2 p2 +7 DB p2 -7 '9 $p *27 *53 p2-6O87 p2 -6 o9u p2*6AO7B p2 *64 'B p2 $6 p2 +5 oAj p2 *59 'A p2 -4 'B $P *24 p2 +3 o6O p2*3BO6B p2 *32 { p2$2O42 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 p1Y3O07 p1 y3 .4 [ p1 Y3 p1 Y2 t p1 y2 +9 p1 Y1 ,6 p1^XO15 p1OB2*46 p1OABc p1OA9+6 p1OA7t p1OA4C p1OA3t p1OA2O03 p1OA2oAO p1O96-6 p1O95E p1O93[ p1O87,9 p1O84K p1O81OA4 p1O7A p1O76ssd p1O76 p1O75O72 p1O72O75 p1O72.1 p1O68t p1O68K p1O67u p1O67l p1O67k p1O64c p1O62DB p1O5A.A p1O52u p1O49^a p1}O47 p1O41u p1O41C p1O39c p1O38 p1O34} p1O25$1 p1O25] p1]O25 p1O21u p1O16o0f p1O14o0m p1O12z2 p1O12u p1O09*89 }p1O08 [p1O08 p1O07Y3 p1O07K p1O07,6 p1O06O21 p1O06sao p1O05O94 p1O05i3_ p1O04u p1O04t p1O04*36 p1O02o60 p1O02*81 p1O02$7 p1uO67 p1uO52 p1uO41 p1uO21 p1uO12 p1uO04 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 p1tOA7 p1tOA3 p1tO68 p1tO04 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 p1ssdO76 p1 sr; ] p1 ] sr; p1 smg u p1 $s i5S p1saoO06 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 p1rO02 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$OOB3 p1 oBD p1 oBB p1 oB7 u p1 oB3 u p1 oB2 u p1 oB0 p1 oA7 p1oA2O02 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. p1o6 O75 ] 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 p1o0mO14 p1 o0h K p1 o0g p1o0fO16 p1 o0B p1 ^M u p1 ^M p1lO67 p1 ^L u p1 ^l ^O p1 l i01 p1 L7 ] p1 ] L7 p1 l $7 p1 l *36 p1 l $3 p1 $L p1KO84 p1KO68 p1kO67 p1kO15 p1^kO14 p1KO07 p1 ^K u p1 K o0h p1 K *31 p1 ] K p1 ^J i0j p1 iBy u p1iB,O06 ] 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 p1i1xO75 p1 i1a -6 p1 i0r p1 i0m y1 p1 i0A p1 i01 l p1 $h t p1 $h $h p1 ^G p1 $F p1EO95 p1 ^e i15 p1 $E ^E p1 ^d i12 p1DAO76 p1 DA o9I p1 [ D7 p1 D0 u p1 D0 'A p1 D0 p1 ^c y1 p1cOAB p1COA4 p1cO64 p1CO41 p1cO39 p1CO03 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*B1O36 p1 { +B p1 ^a z1 p1 'A y2 p1 'A o8o p1 -A K p1 'A -9 p1*A0O38 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$7O02 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+6OA9 p1-6O96 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*46OB2 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.1O72 p1$1O25 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 p1 $& p1 $! } p1 $@ [ p1 { [ { p1 $p *03 $P*02O21 ^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 $oZ2O82 $oZ2O51 ^O z2 u ^o z2 ^oz1O52 ^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 $oO93 $oO82Z2 ^oO65^L ^oO52z1 $oO51Z2 ^oO46^b ^oO26 ^oO24 $.$OO23 $OO13 ^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 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# $oDBO24 $o D6 $v ^o D6 ^o ^d -6 $o D4 ^o D2 $@ ^o $@ D2 ^o d $o C $0 oBx u oBX oBw Z2 oBuOA1 oBtO52 oBT E oB. T0 oBt oBsO81 oBs E oB\ RB ] oB\ ] RB oBO o9H oBo oBnO92 oBm -A oBM ] oBm oBlO65 oBl E oBK u oB K oBi Y2 oBi Y1 oB. iA2 oBhO91c oBhcO91 oBfO81 oBe o4a oBe *B9 ] oBe ] *B9 oBdO61 oBD { { oBC oBc ] ] oBc ] oBB c oBaO61 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 oB7dOBA oB7 DA Z1 oB7 *A9 oB@ *78 oB7 $? oB5 oA8 ^! oB5 oB4 Y4 oB4Y1O73 oB4O73Y1 oB4 iA oB4 $A oB4 -3 oB3 ] p2 oB2OA1 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( oAzO62$p oAz$pO62 oAz LA oA\ Z3 oAz $3 oA. Z1 oAy E oA Y1 oAY oA#O91 oA.O82 oA.O34 oA@O03 ] oAx oAUOB1E oAUEOB1 oAu c oAu 'B oAtO03 oAT r p3 oAT p3 r oA& T0 oAT oAS t oAs $t oAsi87O64 oAs D8 oAS ] ] oAs oAs oAR u oAq Z2 oA-^OO15 oAo D6 oA@ o91 oA& o9( oAo $1 oAn oAmO91u oAMO45T5 oAmuO91 oAM c oAl K $O ^a l oAl ] oAkO82 oAkO62 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.dO3A oAd $m oA# D9 oA! D9 oA. D7 oA! D1 oA/ c oA c oAa $z oAAO32 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 oA7p1O09 oA7i7tO23 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 $? oA2O81o3c oA2O64 ]oA2O31 oA2 o9 s\D oA2 o9 oA2o3cO81 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< o9zO52 o9Z c ,6 o9z $c o9Z ,6 c o9z $5 o9* Z2 o9? Z2 o9$ Z1 o9Y Z1 u o9yOA1 o9Y u Z1 o9y +6 o9xO32 o9X u o9.O13$6 o9X o9x o9w Z2 o9W t o9w *09 o9vO72 o9V $v o9u DA o9u D7 o9u D2 o9U $9 o9t t o9t $s o9t $7 p2 o9! T7 o9s Z1 -3 o9sO71u o9suO71 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 o9pO41 o9p +8 o9OO61u o9OuO61 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 o9mOA2 o9m r o9m o8l o9m o7d o9m +B ] o9m o9m o9l ,4 o9% l $1 o9L o9k o7t o9k -8 o9k [ -7 o9jO81.6 o9J ^W E o9j.6O81 o9J -6 o9iO43 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 o9fO52 o9fO35 ] o9F u o9f $s o9f *B9 RB $) o9f o9EO45d o9E u ] o9e D7 o9e -7 o9e *60 o9dO53 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 o9BZ5O17 o9BO17Z5 o9bO05 o9b *93 o9B o9aOA1 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 $. o99O62 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 o96O21$4 o9.$6O13 o96 o33 o9. *68 o9+ *67 o96$4O21 o96 $4 o96 ^# o95 Z4 o95O61 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 o93O72 o93O53 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 o90O81C o90 o80 ] o90 o73 o90 o0W o90 { k o90 i0D o90CO81 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 o8zO05 o8z $f o8z D3 o8! Z3 o8Z o8. Z3 o8) Z2 o8 Z2 o8+ Z1 R0 o8- Z1 E o8@ Z1 o8yO32s8H o8ys8HO32 o8y r o8y p5 o8y D3 D6 o8y *83 o8. Y2 o8^Y1O42 o8* Y1 o8- Y1 [ o8- [ Y1 $o ^8 Y1 } o8y ] o8y o8x K o8X E o8x D9 o8x ,9 o8.O71D5 o8&O53 o8@O53 o8_O52 o8^O42Y1 o8#O34d o8*O34 o8_O32 o8.O31 o8*O17 o8#O12 o8_O12 o8X o8w Z1 o8w $z o8w $x o8w p4 o8W o3s o8w K o8w C o8w 'B o8w *21 o8w +0 o8@ ^W o8vO51 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 o8rO41 o8R u o8R T2 o8r $o o8r L7 i8i o8r i8i L7 o8+ R0 Z1 o8R o8q o8P Y1 o8pO52 o8p t o8p oBk o8p *85 o8p -5 o8o Y2 o8oO91p3 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 o8NO26$S o8N$SO26 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 o7@ o8j ^j o8j i93 o8j D7 o8j *86 o8j *78 o8i ^Y o0j o8iY2O41 o8iO42 o8iO41Y2 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 o8hO42 o8hO26 o8hO23p4 o8H o4y o8H ^I o8h *68 o8g Z1 o8G Y3 Y3 o8g Y2 o8gO61u o8guO61 o8g $s o8g i8m o8g *08 o8f Z1 o8fO32 o8fO31 o8f $n o8f $h o8f ] o8/ ^f [ o8f o8- E Z1 o8eO71 o8e $k o8e D5 o8e D4 o8e $A o8e $2 [ o8E o8E o8d Y3 o8dO52 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 o8bO21D8 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 o87O61 o8-.7O34 o87 p1 o87 o3- o87 o1y o8_ .7 D2 o87 +A o87 *58 ,6 $? o87 .3 o87 ] o87 [ o8* .7 o8! .7 o8_ .7 o86O32$f o86 s13 o86 R9 o86 i3h o86 i1o o86 i1i o86$fO32 ^* 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 o84O05 o84 T1 -4 o84p1O57 o84 o0B o84 i5+ o84 ^h o84 -4 T1 o8. -4 o83O31 o83O14 o83 o93 o83 o1A o83 C o83 $? o8@ $3 o8/ -3 ^o *83 ^@ o83 o82O52 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 o81D2O04 o81 ^d o81 C o81 $4 p4 $- o81 o80 Y4 o80 D9 o80 D4 ^N o80 *46 o8-*03O26 o8@ +0 o8# ^@ o8! $? o8! o8 ] $/ o8_ $! o8% } o8* { o8_ ^[ o8] ^' o8' 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 o7yO51 o7yO05 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 } } o7xY2O81 o7xR4O21 o7x r o7X o1Z *56 o7X $L o7x $L o7x ^8 o7x *79 o7X *56 o1Z o7*O52 o7X *50 o7$O42 o7+O41 o7 O41 o7$O31 o7x *14 o7*O01^6 o7wO41 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 o7tO34u o7tO21 o7tuO34 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 o7sO23o0s o7s t o7S svl o7, s,@ R6 o7s o6o o7s o6' o7s o4U o7so0sO23 o7S E *32 o7S $B o7s $b o7s*93O02 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 o7pO01 o7p u o5O o7p o5V o7p o5O u o7p k o7p ,8 o7p *70 o7p $4 o7p *26 o7p $2 } o7p o7oO34 o7oO31 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 o7LO92u o7lO91 o7LuO92 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 o7kO41z2 o7kO41 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 o7iO51 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 o7hO02i3d o7h u o7h ^i o7h *64 o7h $2 ] o7h o7gOA2 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 o7dO91*75 o7dO91 o7dO61 o7DO52 o7dO52 o7D T2 o7d sth o7d $r +5 o7d r o7d K o7D i7C o7D i6R $2 o7d DA o7d D8 o7, D8 o7d*75O91 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 { o7bY3O95 o7bO34^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 o79O82 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 o74O02^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 o73O52 ] 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 o72O03d 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 o71O43 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 o6zO32 o6z o5@ o6z o4b o6z o06 { o6Z l d o6Z d l o6z D0 ^R o6z +9 o6@Z5O14 o6Z .5 o6z $5 o6_ Z3 o6.Z2O42 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.y4O82 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 o6xO41 o6XO15^7 o6x T3 T2 o6x T2 T3 o6X o5T } o6x k .1 o6x i7u o6X c o6x ,A o6_O82 o6x +8 o6=O75L6 o6@O72 o6x -7 o6.O42Z2 o6@O42 o6-O41 o6-O32 o6@O31 o6!O23} o6@O14Z5 ^@ o6x o6w Z2 ,1 o6wz1O21 o6wO01 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 o6vO82 o6vO13 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 o6uO82 o6uO21 o6uO14 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@ o6sO74 o6sO41 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 o6si7/O21 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*02O01 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}O12 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 o6PO74E o6P u o6P T2 o6P s7o o6p R5 o6p $r o6P o0T c o6PEO74 o6P c o0T o6p $7 Y1 o6P *68 o6p .5 o6p *35 $@ o6p [ [ o6p o6o $z o6O y5 y5 o6oO24y4 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 o6mOA4t o6mtOA4 } o6m o5@ o6Mi0mO61 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 o6lO93 o6lO91 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=L6O75 o6l*57O03 o6l $5 $@ o6L o6L $@ o6l o6K y3 .4 o6K Y2 o6kO83 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 o6jO51K o6jO21 o6J s1T o6J o9i o6j L3 o6jKO51 o6j *71 o6j +5 o6j +2 $. o6j o6i Y2 o6iO31 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 o6hO32 o6HqO06 o6h i4B o6h $7 o6h ,7 o6h ^1 o6H *07 o6H o6h [ $! o6h o6g Z2 $J o6g y2 o6gO12 o6gO03 o6g o4c o6g o0l o6G c o6g *63 +5 o6g +5 *63 o6g $5 o6G *32 *21 o6g .2 o6g ,1 o6g *02 o6g [ o6fO42 o6fO02 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 o6dO13+2 o6dO02 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 o6bO51t o6BO42 o6btO51 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 o6aO72u o6auO72 o6a o76 o6A o49 o6A o16 *72 o6A i6@ o6a i2a o6AfO38 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 o69O41o3B o69 u d o69 o5Z C o69 o4m } o69o3BO41 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 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 o65O73+3 o65O51 o65O21 o65O13 o6* ,5 u o65 $s *06 o65 o8. o65 o7k o65 o1O o6_ .5 ^n o65 k o65 ^j o65 i3? o65fO85 o65 D3 *79 o65 D1 ^z o65 $A o65 +9 o65 *89 o6 .5 *64 o65 -4 o6- *54 o6 *54 o65+3O73 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 $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 o61O23 o61 sl/ ] o61 ] sl/ o61 sg4 p3 o61 p3 sg4 o61p1O04 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 o60O21 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 o5yO14y5 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 o5XO62 o5XO21t o5xO01p4 o5X ^# ^x o5XtO21 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 O91 o5x *72 o5_O71 o5_O62K o5!O61 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 o5vO32 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 o5uO81 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 o5si83O31 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 [ [ o5qO76 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 o5oO71 o5o o0K o5o $F z3 o5_o8tO32 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 o5nO71u o5nuO71 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 o5mO41D3 o5mO14y3 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 o5lO21 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_KO62 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 o5iY4O21 o5iO86 o5iO81 o5iO21Y4 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 o5hO31 o5hO21D2 o5h ^p o5h oA@ o5h o6a o5H $o o5H i5 o5hD2O21 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 o5fY1O71 o5fO71Y1 o5fO71 o5FO12*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 o5EO32^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 o5Dy3O62 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 o5CO03$8 o5cO02$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$8O03 o5c *72 o5C ,7 o5c $7 o5C +6 T4 [ o5C ^6 o5c *57 o5c *52 o5- c $5 o5c$4O02 o5c .4 o5c *37 o5c [ o5, c } } o5c o5bO73 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 o5AO63 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 o52O84 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 o51O21 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 $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 o4xO71 o4x T2 o4x o3I o4x o0z o4X o0W .2 o4X i5n o4x i4- o4/O81 o4_O72 o4x *63 o4.O63 o4_O61 o4x *60 o4 O51 o4X .2 o0W o4x *05 o4* ^w Z4 o4w z1 ,6 o4wO52 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 o4vO31 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 o4uO62 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 o4pO53 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 o4mO21i0W 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#^KO65 o4kO63 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 o4JO51 o4JO31 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 o4iO92 o4iO01 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 o4fdO94 o4f D2 o4f D1 o4f *75 o4F *21 o4f +1 o4, ^F o4f [ o4eO13 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 o4DO31-2 o4DO31 o4D o1C o4d i6r o4d i4l o4d c Y1 o4D 'A *40 o4d *89 o4D *40 'A o4@ D3 *57 o4d *34 o4D-2O31 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 o4bO53 o4bO13u o4bO12 o4buO13 o4b t p1 o4B $s *84 o4b p1 t o4b o6t { o4B ^C o4b ^A o4B *84 $s o4b +3 o4b $3 o4B$0O72 o4b $! $! o4b $- o4b o4az4O07 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=*94O62 o49 +2 o4$ *91 ,8 o4 $9 o4 '9 $. o49 $, o49 $- o49 o48O71 o48 u d o48 ^T C o48 o6t o48 o1s } $o *48 $n o48 i7| o48 d u o48*96O12 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 o46O53 o46O03i4u o46O01 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 $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 o41O52 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 o40O93 o40O71i13 o40O62 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 o3zO61 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-O52*04 o3.O51l o3+O41 o3x .4 o3X *21 E o3$O01 o3! $x o3w Y2 -7 o3wO61 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 { o3uZ3O52 o3u ^z o3u y5 E o3u y2 o3uO52Z3 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 o3tO52 o3tO51 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 o3sO63 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 ^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 o3qO72 o3qO52 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 o3pO51 o3 ^p t o3pp1O06 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 o3oZ1O41 o3O y3 Z2 o3o y2 o3oO41Z1 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*37O43 o3o +2 y2 o3. o2y o3# o2F o3o $2 o3- o1o o3 o1f *35 o3@ o1c o3_ o0b o3@ o0A o3$ o0# o3O { o3o o3ny4O41 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.lO51 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 ] } o3K z2 o3kO51u o3k $w o3kuO51 [ o3K T0 o3K o6A o3Ko5RO41 o3k o0v o3k l *34 o3K $k o3k i7f o3k i5r ^1 o3k i5. o3kD0O91 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 o3jy5O47 o3j y5 o3jO02 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 { o3iO02^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 o3hO62 o3HO42 o3H o7S o3h o5o o3H o5l o3H i3E o3h +7 o3h *65 o3h *31 Z5 o3h $3 o3h +2 o3h $$ o3h $! ] o3h o3g y4 o3gO61u o3guO61 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 o3fO43 } 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 ^_ o3DY2O53 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 o3cO72 o3c $x *62 $!o3cO12 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 o33O41 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@ o32O52 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 o30O65 o30 t ,4 ] o30 t o30 o5u o30 { i0m o30 -7 *12 o30 *65 o3- ^0 ,5 o3-*04O52 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 o2zO5B o2zO52 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 ^@o2yO62 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 o2xO52 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@O32 o2x *02 +6 o2x *02 o2X $! o2X o2x $? o2w Z2 o2w Y5 $L o2w y5 o2WO01T4 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 o2vOA2 o2vO51 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 o2uO82 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 o2TO31E 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 o2TEO31 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 o2sO41 o2sO31 o2s t T3 o2S T8 o2s T3 t o2S T1 *54 o2s $s -6 o2s s36 *64 o2s o7b o2s o6n o2s i86 o2Si0nO51 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 o2ry4O42 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 o2qOA1 o2qO32 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^MO12 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 o2kO81 o2kO52 o2kO45u o2kO41 o2KO31*14 o2kuO45 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 o2jO45 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 o2iO73 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 o2hY3O34 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 o2gfO59 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 o2eO42y3 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 o2cO81 o2cO52[ 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 o2bO63 o2bO46 o2bO02y3 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 o2AO72T5 o2aO71 o2aO63*63 $_o2AO32 o2aO31 o2a ^v *46 o2AT5O72 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 o25O01 o25 ^j o25 ^F o25 D9 o25 *52 o25 ,3 +0 ^* o25 -1 o25 +0 ,3 o2# -5 o2, +5 o24 y2 o24O01 o24 ^o $o *24 i2c o2/ *46 o24 *54 o2- *42 o24 $! o2. -4 $. o24 o23 Y3 o23 y2 o23 y1 o23O61 o23O41i2c 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 o1xO35 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 o1wO01.2 o1w ^s o1w p4 ,5 o1W o31 o1w $n o1W k o1w i40 o1W $G o1w ^D o1w *51 o1w -0 o1w { o1vO61 o1vO34 o1VO31*53 o1v t o1v sv0 o4d o1v s2g o1v o4d sv0 o1v o22 o1v K o1vi3cO32 o1v ^d o1v ^b o1v *64 [ o1V *60 $. o1V o1u Y4 -9 o1uO65 o1uO54 o1UO41-0 o1U u o1u sm4 o1u R0 o1u +9 o1u -5 o1u *41 o1u *34 y5 o1u -3 o1u $1 o1U-0O41 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 o1pO01] o1p]O01 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 o1oO32i2k 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 o1My4O62 o1m u *32 o1M o55 o1M o41 -5 o1m o2P o1m o0d o1M l o1M K c o1M k $7 o1M k *32 o1mfO3A [ 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 R2 o1k o5, o1k i2g o1k i1, o1k D3 o1K D0 o1k *54 o1k $2 o1@ K o1k $- ^$ o1k o1jy5O52 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 o1hO42 o1hO32y4 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 o1FO01.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 o1eO41 o1eO31 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 o1cO23^e o1c u o1c ^s o1c o61 o1C o4z o1c o2- o1c ^M o1c i4n o1c i1s o1C f k o1cdO82 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 $.o1aO72 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 o18O32 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 o16O54 o16O42 o16p2O02 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 o14O31 o14 T4 o14 o0H *74 o14 i1? o1@ o14 D5 o14*A8O52 o14 $A o14 *74 o0H o14 $7 o14 *52 o14 +3 o1+ *42 *17 o14 *16 o14 $* $@ o14 o13O71T4 o13 TA o13T4O71 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 o11O51$j o11 si3 o11 o5! o11$jO51 o11 i1k o11 $h o11 $G *56 o11 *81 o1+ *17 *42 o11 *56 $G o1- *14 o11 ^2 y4 ^@ o11 o10 y2 o10O37*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 o0zY4O15 o0Z y2 o0zO72 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 $# $?o0YO31 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 o0xO64 o0xO54 o0XO52 o0X t i2d o0x $r p1 o0x o64 o0x o3h o0x i4t o0x ^e o0x D6 Z3 o0$O91 o0?O62 o0X -6 o0x -6 o0x *52 o0x *47 o0x *45 *65 o0.O41y4 o0@O41^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 o0wO53y5 o0w so6 o0w slm o0w s21 ^e o0W p5 o0Wp1O04 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 o0vO31 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 o0uO32 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 o0tO24 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 o0sY4O62 o0s ^Y o0s $y o0sO21 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 o0Si1aO81 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 o0qO63 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 $. o0PO82 o0PO42-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 o0nY2O43 o0N Y2 o0n ^X -8 o0nO62 o0nO61 o0NO52 o0nO43Y2 o0NO32 o0NO21 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 o0mO63 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 o0LOA1 o0LO71 o0lO32 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 o0KO93,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,4O93 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 o0jO83 o0jO41y4 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 o0iY3O34 o0i y3 [ o0i y2 o0i y1 o0iO34Y3 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 o0hO71 o0hO42 o0HO41 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 o0gO74 o0gO51 o0gO31t o0g u Z4 o0g t y4 o0gtO31 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 o0fy4O62 o0f Y4 o0f Y3 u $? o0F Y1 o0?fO64 o0fO62 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 o0EO41 o0EO24$, o0E$,O24 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 o0dO61 o0dO52 o0DO41 o0DO21] o0D]O21 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 o0CO92 o0CO63 o0CO51 o0CO23 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 o0cdO04 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 o0BO32i3n 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 o06O41 o06 snk Z1 o06 o88 o06 +8 o0@ *67 o06 *46 *10 o06 *46 o06 *43 o0$ *62 o06 *10 *46 o06 *0A o05O62 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 o02O83 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 ^, ^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 $nOA1 $nO94 $nO84 $NO64$! $N$!O64 $nO43 }^nO32 ^nO31o01 $NO24$6 $nO05 ^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 ^np1O04 $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 ^no01O31 ^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 $ni6pO32 $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$6O24 $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 ^MY5O15 ^M ^y *54 ^m Y5 $] ^M Y4 u $M Y4 s4n ^m Y4 $m y2 $d ^m y2 $/ ^m $/ y2 ^m Y1 ^z ^mY1O15 $m y1 u ^m y1 D4 ^M $Y $mO82 $mO72 $MO71 }$mO61 ^MO53 ^mO52C ^mO52 $MO51$e ^MO32z1 $mO21$p ^mO15Y1 ^MO14K ^MO13 ^mO12 $MO04$O $mO03 ^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 ^mrO34 [ ^M ^R $$ $M r ^M r $m ^R $m$pO21 $m p3 t $m p3 { $m { p3 $m ^P $M$OO04 ^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 ^MKO14 $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 ^mi1rO24 ^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$eO51 $m $d y2 ^M D5 z1 $M D1 $M d .0 $m $d $m d ^mCO52 ^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 +9 t ^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 *07 ^h $m *07 ^m *05 $m -0 $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 lY5O63 ^ly5O2B l y5 -0 ^l Y5 ^l y4 ly3O32 l Y3 i4l ^l Y2 Y2 lY2O15 l Y2 i5% l Y2 ,B l y2 ,4 ^l y2 lY1O71 ^Ly1O51 $L Y1 t ^l y1 .6 ^l Y1 -4 $L ^Y ^l ^Y l $X i7 ^lO83 ^lO82O21 lO71Y1 lO71o1W ^LO71i1d ^lO62K $LO62 ^lO62 $LO54$J lO51D3 lO51d lO51-3 lO48 ^lO43 $LO42 ^LO42 l $X .4 lO37 lO32 }^lO32 lO24p4 $LO23+1 ^LO23 ^lO21Y5 lO21*13 ^lO16y5 lO15Y2 ^lO14i6h lO14 ^LO13 lO12$h ^lO05i3d lO02$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 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 ^Lp1O07 l p1 i5x $L $P lo9zO41 ^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 lo1WO71 } ^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 $L Z1 $L ^l r ^l l ^F $L l D1 $l $l D1 l LA o8+ l L6 ^L ^L l ^, ^L ^, l ^lKO62 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$JO54 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$hO12 l$hO02 $L ^h ^L $h l $G Y1 l ^G y1 $L ^G *61 lfO46 l $F r ^l ^f 'A ] ^L ^F ^L ] ^F ^L ^F ] $l E Z2 $L ^e ^L $e ^L ^e $! l $E ^l E $- ^l $- E $ldO7B ldO67 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}O81 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 $)L8O42 L8 i4o Z1 l *89 T1 l $8 *34 L8*27O34 } ^l *80 l +8 $. l $. +8 $l +8 ] $l ,8 ^l '8 ^l -8 L7 Z2 L7 Y1 i6t L7 Y1 D6 L7O32i3@ L7O03*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 L6fO04 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 {L5O01 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*58O71 ^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-3O51 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 L3dO03 L3 d s1n L3 $c L3 ^a L3 *75 *03 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 L2fO51 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 L1O31^D L1O23u $L+1O23 L1 ^w ^g L1uO23 L1 ^R L1 r L1p5O13 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 }L0O81 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 K$zO12 k $z r k ^z p2 K $z i5d K Z5 Z4 k Z5 Z3 $k Z5 Y1 $kZ5O23 $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 ^kZ2O31 kZ2O14 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 ky4O62 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 KY1O81 ^kY1O52 ^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$xO01 K $x c KOB1 KOA3t KOA2 KOA1$t KO91 KO82 KO81Y1 ^KO81 kO81$. kO81{ k$.O81 $kO62Y2 kO62$8 KO61*54 kO57,6 kO53O62 ^kO52Y1 $kO52 ^kO52 KO51Y3 ^kO51i4a KO51,8 kO51+2 kO42O62 KO42$. K$.O42 K[O42 k^@O42 kO41.1 ^kO41 K $x *36 kO35t ^KO34 $kO34 ^KO32 ^kO31Z2 kO31p1 kO31K {^kO31 KO25 KO24t KO24*34 $kO23Z5 KO21$K kO21i1m kO14Z2 ^KO14 kO13*84 kO13 KO12$z KO12$n kO12k KO04*20 KO03 $kO02$p KO02 kO01$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 KtOA3 K$tOA1 ktO35 KtO24 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^SO41 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$pO02 K $P ^F K $p +7 K p5 o52 K p5 *7A Kp4OA5 ^K p4 i6a ^k p4 i4u K p4 K p3 $Y k p3 o0x K p3 K p2 $a $k p2 '9 Kp1O76 Kp1O72 Kp1O46 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$nO12 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 kKO31 K$KO21 k ^k i76 ^k K i2@ k K i0N K k $c ^K $k ,4 $K K *02 K $k *01 } $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 KiA1O62 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 ki2iO52 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 i5x $K ^H K ^G Y2 K $g r ^k ^g o11 ^k ^G $0 ] k ^G kfO6A 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 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 $B $H k $b ^5 K 'B $K $B $- K ^B k ] ^b k ^b ] k $a Y1 K^aO25 K $a D1 K *A9 k *A0 o2o K $$ ^A K $A $K -A $k ^A K $9 i5v $K *9A K .9 $1 K $9 k +9 { k -9 k$8O62 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*67O42 $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 *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*54O61 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+2O51 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.1O41 k +1 t k +1 s2g K +1 o74 ^k .1 o69 k +1 o2q 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 o3a k +0 i5F 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 $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 ^jy2O76 ^j y1 t ^J ^Y $jO72 ^jO62$j ^JO51 $JO43i5D ^jO43 $jO34$h ^jO32 ^JO23{ $jO16o0m ^JO14 $JO12 $JO05 ^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% $jo0mO16 $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$jO62 $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 $ji2wO52 $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$hO34 $j $h T0 ^J ^H ^J $h ^j ^H } $j ^h $J $G ^j ^F ^JdO06 $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*47O32 ^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 $IZ5O95 $I Z5 oB5 ^I Z4 o5o $I Z3 oB1 $i Z3 $I Z2 sI* $I z2 $i ^i Z2 *54 $i Z2 $IZ1O74 ^IZ1O42 $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 $iY1O93 ^IY1O42 ^iY1O12 $I Y1 ,1 $iO93Y1 $iO82 ^iO82 $IO74Z1 $iO62u $iO62*51 $IO61c $IO61 $iO52p4 ^iO45 ^IO42Z1 ^IO42Y1 ^IO42 ^iO42 ^IO32^F ^IO31 $iO31 ^IO16$s ^iO12Y1 ^IO12 ^iO04$$ ^i$$O04 $I $v $iuO62 ^i $u ^5 $i t y2 $I } T5 ^i T1 ^i t *05 $i $t ^I$sO16 $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 ^ii3gO52 ^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 $IcO61 $i c *68 $I $C ^I ^C ^i ^c iB- Y2 iBX Z1 [ iBX [ Z1 iB=O74 iB-O51 iBW c iBuO56 iB u $I $B t iBt iBs u iBs iBp ] iBM iB_ K iBk iBJ u iBe$yO84 iBeO84$y iBe iBC ^F iB, c iBaO82 iBaO71 iBaO61 iB8 ] iB5y4O35 iB. $5 iB4O27 iB+ $4 $@ iB4 iB3 ] iB1 Y2 iB1 $9 p3 iB1 ] iB $1 iB1 $! iB0 iB* $# iB* ] iB@ iAz oBx iAZ E iAxO36y2 iAx o9u iA`O51 iA%O05 iAvO81E iAvEO81 iAv iAu sue iBf iAu iBf sue iAt D7 iA# T3 iA_ t iAs iArO64 iArO54 iAr K iAr *8B iAPOA3+B { iAo *A0 iA_ o3n iAnO06 iAn u iAmO64u iAmuO64 iAm c iAM *A8 .7 iAM iAm ] iAL iA_ l $. iA_ $. l $. iAl ] iAl iAl iAh iAg iAEiBpO7A iAe $1 iA, E iAD l $0 iA@ D7 iA_ D6 iA- D2 iAD $0 l iAd iAaO25 iAa D6 iA *98 iA/ ,9 iA9 iA8O72 iA8O32 iA7O71 iA7 o9( iA7 iA6 i9@ iA6 *65 $3 iA6 $3 *65 iA3 ] iA2O42 iA2 o9t iA2 iA1O42-3 iA1 u iA1 iB0 iA1 *9B oB7 iA1-3O42 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 i9xO62 i9XO54l i9XlO54 i9'O93} i9-O72*25 i9.O62 i9.O51 i9_O45 i9.O41 i9-O32 i9#O25 i9 O07y3 i9@O04 ^@i9.O03 i9wO53 i9vO05 i9V u i9u o7h i9U C i9U $9 i9t D4 *23 i9t *A8 i9t *23 D4 i9- t i9t i9sY2O43 i9sOA2E i9sO43Y2 i9s u i9s ^s i9sEOA2 i9 s95 i9s ] .4 i9s .4 ] i9S i9RO21[ i9r o8e i9r o7f i9r -A i9r i9p o7w i9oO31 i9o u i9o o5c i9o K i9O iAK $. i9. oB9 i9;o9lO43 i9$ o7@ i9n $a i9n ,8 i9N i9M y2 i9M o8F i9m *97 i9lO63 i9L E $. i9_ l i9k RA i9k +A i9/ K ^= i9k { i9jO54 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 i9hO27 i9g i8 i9EO73o67 i9Eo67O73 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 ] i9AO21 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 $@i96O35 i96 iA2 i9 *67 i96 i95 Y1 i95O72^f i95 o8@ i95 o1k i95 +8 i95 .7 i95 ,1 $@ i95 $! i95 i95 i94O03 $! i94 s1m i94 D1 i9,*45O51 i9, $4 i93 Z2 i93 *5A i93 -4 i93 $* i92 [ E ] i92 -6 i9-*25O72 ] 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 i8zO53 i8z C i8z .7 Z2 i8z ,7 i8. Z4 E i8y Z3 $! i8y l i8y $! ,7 i8y ,7 $! i8xO43 i8XO12 i8X s*D i8 O95 i8#O51 i8/O42 i8-O42 i8.O24^S i8-O24 i8_O12 i8 O01 i8x i8W c i8v o9k i8v i0v i8V $3 i8V ] i8v i8u t i8u o7D i8u o0M i8U i8u $@ i8- $u ] i8u i8u i8tO62 i8t $W i8t shn i8t s3. i8! T7 i8# T1 i8T i8 t i8s Z1 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_p1O98 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 i8lO92u i8lO15 i8luO92 i8l t i8@ l o6e i8l D1 i8l +9 [ i8l *53 p3 i8l ] [ i8l i8k Z1 C i8kO34 i8= $K l i8k K i8K i8* i8K ^e i8k C Z1 i8* K *67 i8k $6 i8= K $@ i8K i8k i8j D5 i8J*48O52 $. 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 i8gO42 i8g *68 i8F c -B i8F -B c i8f *90 i8. E Z4 i8eO93 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 i8DO74c i8D oA0 i8d o9f D2 i8DcO74 i8D c i8/ D1 } } i8D i8cO73,6 i8cO52 i8c,6O73 i8) c i8bO26 i8b -4 i8_ -B $= i8a l i8a C ] i8A $0 $i *8A ] i8a i89O64^/ i89 r i89 p5 .1 i8/ *9A i89 .7 i89 ,2 i89 $@ i8. $9 i8/ ,9 i8_ .9 i88O32 i88 $S i88 o2p i88 i80 i88 -9 i88 *8B i88 *54 i88 ,5 $0 i8#*84O42 i88 $0 ,5 i88 $. i8_ $8 i87 Z4 i8#.7O52 i87O25 i87O04 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 i85O32 i85 $A i85 +7 i8@ *56 i85 $5 $? i85 $! i8. +5 $! i85 i84O42 i84O12 i84O02 i84o5WO14 i84 o0s i84 D6 i84 c i84 ,9 i84 *84 i84 *58 i8. *45 i8- +4 i83O61 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 i81O25 i81O23 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*B8O35 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 y5O36 i7y $5 i7.Y3O32 i7_ Y3 i7. Y2 Y2 $* i7Y [ i7y i7XO51 i7XO45Y3 i7X k $. i7x D8 i7 OB1 i7x *56 i7@O41 i7.O32Y3 i7-O31 i7)O17 i7x $1 i7!O04d i7*O03 i7*O02 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 i7uO41,3 i7u u i7u C i7u *64 Y1 i7u,3O41 i7TO41c i7t k ] i7t D3 i7TcO41 i7t *84 i7t *72 .0 i7t .6 i7% T5 i7t $5 i7# T3 i7. T2 i7t .0 *72 i7+ T0 *45 i7t [ i7sOB1 i7sOA2 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 i7QO42 i7Q $T i7Q ^Q i7q+8O31 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 i7oO51 i7oO02 i7Op1O81 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 [ i7gOA1 i7gO23 i7G o1@ i7g ,B D8 i7g $3 i7G i7fO81D6 i7f D3 i7f ,8 *83 i7f *07 i7e Y3 i7eO92 i7eO12 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 i7cO43 i7cO12 i7cO01O32 i7c sDW i7c D2 *17 i7* C i7- C i7c ] i7c [ i7BO43 i7B u i7B i7L i7B D4 *73 i7b -A i7b *61 i7b *16 i7@ ,B i7 -B i7a Y4 *37 i7aO21 i7a K ,9 i7a i2n ] i7A E i7A '9 i7a +8 i7a $4 i7- -A i7 -A i7A i7_ ^a i7a i79O31 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+*86O43 i7- *85 Z1 i78 .3 i7@ +8 i7. +8 i7! ,8 i7(.7O32 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 i76y3O46 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 i75O01 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 i72Z2O41 i72 Y5 l i72O41Z2 i72 R3 i72p3O83 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 i70O83 i70O01o6w 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^ i6ZO65o3o i6Z o4V i6Zo3oO65 i6z o1i i6z L6 i6z i5e i6z *89 i6#Z4O14 i6@Z3O13 i6+ z1 i6z $* i6y ^y i6y seO i6Y i6N i6yi0AO13 i6y E i6y -9 i6-Y3O03 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 $S i6xo5 OA5 i6x o5 i6x o2V i6x $m i6x E -7 i6X D2 i6,OA1 i6,O93*54 i6-O93 i6X .8 i6x -7 E i6@O74 i6 O73s = i6.O73 i6)O52^b i6/O34 i6-O32 i6_O32 i6 O21 i6#O14Z4 i6@O13Z3 i6+O12 i6_O12 i6,O09 i6x *04 i6-O03Y3 } } i6X i6x $= i6w Y3 Y3 i6WO24 i6wO13k i6W o7A $N i6W $N o7A i6w i8y i6w D1 i6w -8 i6w *74 i6w +5 i6w { $? i6w i6vO42c i6vO41 { i6v o3B i6V ^E i6vcO42 i6v .7 i6V *21 $$ i6V i6V i6v $- $! i6v i6u Y3 i6uO91O31 i6uO72 i6u R4 i6u k i6u DB i6U C i6u +7 *73 i6u -5 i6u $3 i6u } i6u ^@ i6, u $= i6u i6tO04 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 i6sO73Y1 i6 s =O73 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*0BO24 i6Q i6` $q i6p i4H o4k i6P C i6p $5 i6p -4 i6P $- i6 ^p $! i6p i6O Y2 t i6oO74 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 i6nO93 i6N ^u r i6N u i6n p1 'B i6n o8+ i6n o3v i6n o2y i6N E i6N C ] i6n 'B i6n *86 -0 i6n +7 i6n -0 *86 i6m Y3 i6mO92 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 i6kO05 i6kO02 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 i6iO92 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 i6hO93 i6h L7 i6h D3 i6h .0 $! i6H i6h [ i6gO12 i6gO04 i6g t +8 i6g ^p i6g o4o i6g ^H i6g $G i6g D1 i6g +8 t i6G *73 p1 i6G *60 i6g ] $@ i6g i6g i6fO75 i6f k *23 i6F ^d i6f *34 i6f *23 k i6@ ^f ] i6f i6eO41 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 i6bOA4 i6bO42o0W i6b o7h i6B o3A i6bo0WO42 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 i6aO03 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 i68O24 i68 t Y5 i68 s8 sj2 i68 s8 i68 o2I i68 o1o i68 $O i68D9O73 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 i67O21 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 i66O41$o i66O01 i66 u p1 i66 t .9 i66 s3B i66 $s i66 p1 u i66$oO41 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 i65i5xO03 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,*54O93 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$^4O43 i64O13d ] 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@ i63i3]O32 i63*85O04 i63 ^6 i6 *35 i63 *32 i6. *32 i6/ *30 i6/ -3 i6_ ,3 i62O92 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 i60O02 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 i5zy2O43 i5zO72 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 i5yO91c i5y $x i5y $p i5y o0r i5y K i5y i4p i5y i3r i5y i0a i5y $i i5y D2 i5ycO91 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 i5xO17E i5x $W i5x ^w i5x $N i5x $n i5X i6A i5x i3t i5x i1j i5xEO17 i5X d ] i5 OA2 i5#O81 i5-O72i34 i5x ,6 i5[O56T0 i5'O41o5V i5@O32 i5@O31*23 i5-O31 i5 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 i2yO41p4 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_O91 i2_O83 i2x '8 i2,O73 i2.O71 i2.O63 i2x *61 i2-O61 i2,O41^w i2x *41 i2x ,3 i2 ^x $? i2x $_ i2x i2wO43 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 i2vO71 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 i2SO51 i2sO43 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 i2rO34 i2r t *36 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 i2qO71 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 i2oO02 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 $ i2nO52c i2N T3 i2n t { i2n ^t i2n ^R i2n i50 i2n i3i i2N i2o i2n i02 p3 i2ncO52 i2n C i2n -A i2n *86 i2n +3 i2n .2 i1o i2N *20 ] i2n i2m Z5 Y2 i2m $Z *23 i2m $y i2mO72 i2MO42 i2mO42 $?i2mO24 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 i2lO82*18 i2lO34*10 i2l ^q ,6 i2l o89 $. i2l $. o89 i2l $A i2l*8BO23 i2l *51 i2l +5 i2l $4 i2L ,3 i2l*10O34 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 i2jO73 i2jO72 i2jO51 i2jO43 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 i2hOA2 i2HO63l i2hO42 i2h u i2h s85 i2h s2s +5 i2h o75 i2h o63 i2h o4c i2HlO63 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 i2gy5O85 i2GO52d i2GO34+0 i2gO34 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+0O34 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 i2dO82 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 i2cO82+7 i2c t k i2c s0- Y3 i2c o5w i2c o4z *43 [ i2c o1p i2c o0l i2c L6 i2C l [ i2c k t i2c ^k i2c i6 [ i2c E [ i2C c i2@ ^c c i2c $9 *95 i2c+7O82 i2c *67 i2c *60 i2c ,6 i2C -1 i2c *07 i2c -0 i2! C i2b y2 i2bO52 i2bO32 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 i2AY5O23 i2a Y2 i2a Y1 L6 i2AO41l i2AO23+4 i2A T3 [ i2a sr7 *05 i2a R3 i2a ^P +8 i2A o3l i2AlO41 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 i29O62 [ i29 *61 i29 *53 ,6 i29 $% i28 o08 i28 ^o i28 i33 i28 i23 i28 } $h i28fO59 i28 *74 i28 ,3 i28 *14 i2- '8 i27O52 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 i25O41$@ i25$@O41 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 i21O81 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 i20O62 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 i1zO61 i1zO43 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 i1yO71 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{O31 ] i1X sXd i1x p4 Y5 i1x o0z .7 i1x i07 i1x D7 i1x ^c i1#O82.0 i1x .7 o0z i1 O41 i1%O32i31 i1x ,2 i1x -2 i1(O17 ] i1x i1x i1wY4O37 i1wO53 i1wO52 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^1O36 i1_ ^w $ i1w ] i1w i1v ^t i1v o6S i1v i3t ,4 i1v *13 i1V $0 i1v $* i1u y2 i1uO52 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 i1SO32.4 i1sO01o3p i1s t i1S R7 D4 i1* sMz *45 i1S L0 i1s ^k i1s $j i1s ^h i1s ^e i1S c Y3 i1s ^a i1s*72O43 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 i1pO01T6 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 i1oO32 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 i1mO31t i1mtO31 i1m D4 i1m C z5 i1m c i1m $b i1m *65 i1m -5 i1m *13 $. i1M i1* ^m i1l Z1 i1lO32 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.6O31 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 i1kO62 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 i1JO62[ 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 i1iO92 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 $! i1hZ1O51 i1H Y2 i1hO51Z1 {i1hO41 i1hrO32 [ 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 i1gO62*41 i1gO32srb i1g $v i1g t *64 i1g syq D0 i1gsrbO32 i1G o6# i1g o3n k i1g k o3n i1G k ^F i1g i67 i1g i5f i1g i5a i1g$HO84 i1g D0 syq i1g ^d i1g *64 t i1g*41O62 i1g ,3 i1g .2 i1g $1 i1G i1F z2 Y1 i1F Z1 [ i1f y2 i1F Y1 z2 i1f Y1 i5- i1fO23 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 i1eO52+4 i1eO41 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+4O52 } i1E ] } ] i1E i1e $! $) i1e { i1e ] i1e i1d y5 i1d Y4 u i1D y1 i1dO05o2g 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 i1CO54u i1cO23*64 i1CuO54 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(*71O53 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 i12O61 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#.0O82 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 i0zO61 i0zO31 i0zO12^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+Z2O56 i0Z $2 *65 i0z *25 *87 i0# z2 +5 i0z .1 i0z $% i0- ^z $? i0z i0YO14 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_O61*46 i0+O56Z2 i0x -4 i4Y i0'O43 }i0.O41 i0)O14C i0!O13^y i0>O07t i0-O03i2p $% 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 i0vO53o5s i0VO31*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 i0uO35 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 i0tO23*34 i0>tO07 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 i0sO62 i0sO21 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 i0RO21^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 i0qO21$p i0Q $W .4 i0q$pO21 i0Q $P i0Q o7q i0q i2h i0q -7 z2 i0Q .4 $W i0q*09O07 i0! ^Q i0p Z1 *21 i0pO52 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 i0oO12 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 i0nO13K i0n $w i0N ^R i0n ^r i0n p2 *41 i0N o7@ i0N o45 i0N l i0nKO13 i0N i4u i0N i30 i0N i1T i0n $f i0N $7 $. i0N *51 i0N *43 *15 i0N *15 *43 i0n .1 *04 i0n *04 .1 i0MO93 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 i0lO35^; 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 i0kO43z1 i0KO12 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^KO63 i0J i5c i0J i0F ] i0J ] i0F i0J i0F i0J ^D i0j c o2y i0j *60 i0J $1 i0j ^# i0' $j i0! ^j $+ i0j i0iO21 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@i3FO53 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 $* i0= ^G $* i0G i0G i0F z1 i0f y1 ^.i0FO32 i0fO12*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 i0Ey5O78 i0eO52-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-2O52 i0E $2 i0e ^2 $# i0e i0d Y2 t i0D y1 i3A i0DO41 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)CO14 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 i0bO13-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 D8 y4 i08 *04 i49 i0& ^8 i0/ ^8 ^% i08 ^! i08 i07 ^t y1 i07 o6o z3 i07 D2 i07 ^c i06O41 i06O13 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 i02O25 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^yO18 ^h y4 ^h y3 y3 ^h y3 $h y2 $y ^H y2 ^@ ^H Y1 ^H $y $hO83 $HO62*70 $HO61 $hO5B ^HO53 }$hO53 $hO32*25 $HO32 ^hO23 ^HO18C ^HO16$s }$hO05 $h ^w r $H u o7C ^H u D7 $H $u ^h $/ ^U ^h t *6A ^H T5 ^H T3 $H $T ^H$sO16 ^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 ^Ho6tO23 $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 $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 ^HfO16 ^h $F $H E Z1 $h $e ^h ^e ^H D7 u $h D4 ,5 $H D4 ^h ^D ^HCO18 $h $c ^h ^b $H *A7 $h *A6 ^H ^A +4 ^H $9 ^H ,8 ^O ^h*83O42 $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 $0 $! ^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 $gY4O14 ^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 $gOB3t ^GO74 ^gO51 ^gO43 ^gO41 ^gO23 ^gO21 ^gO18 $gO14Y4 $gO05$w $G ^x $g$wO05 $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 $gtOB3 ^g snf ^g sk_ ^g s.g ^g s9g ^G s8R $g s5c $g s2j ^v $G s%@ ^g $s ^GrO21 ^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 $Gp1O02 ^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_ ^Gi7sO14 ^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-AO61 ^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 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$zO59 ^f z3 ^f z2 ,4 $f Z2 $f [ z2 ^f z1 *79 $f Z1 +4 ^f ^Z $f $z ^fy5O03 f y5 i6H ^F y5 fy4O98 ^F Y3 fY2O79 f y2 K f Y2 *57 $F y2 $f Y1 y1 $f y1 Y1 } $f $y fOB7 fOA8k fOA7*86 fOA6 fOA5O65 fOA3,9 fOA1O61 fO96c fO95 fO92u fO8BT0 fO8B fO86-6 fO84^m fO83u fO82K $fO82 fO81$( f$(O81 f[O81 fO7Ai65 fO7A+3 fO79Y2 fO78E fO76$5 fO75] f]O75 fO74k fO73C ^fO73 fO72 $fO72 }^fO72 fO71 f{O69 fO67E fO67[ fO64T3 fO64s4x fO64o3q fO64 fO63*79 fO62c fO62+4 fO62*34 fO61$9 fO59$z fO59o38 fO59i2s fO59c fO58*57 $fO58 fO57sJN fO57o5d fO57$F fO57$^ f$^O57 fO56*97 fO56 fO54T0 fO51s5O fO51$9 fO51 fO47$^ f$^O47 fO45i78 fO43^J fO42O63 fO42O62 fO42k fO39+1 fO38*32 fO38 fO37O41 fO37] f]O37 fO36t fO36 fO35t fO34K fO28t }fO28 fO26 fO25 fO24-3 f$ O24 ^fO23^j $fO23 ^fO21 fO19O21 fO17D5 ^fO16i02 fO15r fO14$s fO14 ^fO13 fO12*31 fO05O35 fO04] f]O04 $fO03q fO03D5 fO02+3 ^F ^X f $w Z2 f $w } ^f ^v $F $u Y2 fuO92 fuO83 ftO36 ftO35 ftO28 ^F ^T i2X f t $i ^f t d f T8 T0 ^F T4 -1 fT3O64 f t *12 fT0O8B fT0O54 f T0 T8 f$sO14 ^f smg *32 ^f sm/ fsJNO57 $f sf9 i2j $f sdu fs5OO51 fs4xO64 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 fp1O86 $f $p $f^oO03 f $o o7k f oB3 *75 f oAk foAbO28 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 fo3qO64 $f o3g fo38O59 ^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 fkOA8 fKO96 fKO82 fkO74 fkO42 fKO34 ^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 fi9 $? $@ $[ $\ $] $^ $_ $` ${ $| $} $~ hashcat-4.0.1/rules/hybrid/append_du.rule000066400000000000000000000001541320027462700203750ustar00rootroot00000000000000$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 hashcat-4.0.1/rules/hybrid/append_dus.rule000066400000000000000000000003171320027462700205610ustar00rootroot00000000000000$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 $ $! $" $# $$ $% $& $' $( $) $* $+ $, $- $. $/ $: $; $< $= $> $? $@ $[ $\ $] $^ $_ $` ${ $| $} $~ hashcat-4.0.1/rules/hybrid/append_hl.rule000066400000000000000000000000601320027462700203640ustar00rootroot00000000000000$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 $a $b $c $d $e $f hashcat-4.0.1/rules/hybrid/append_hu.rule000066400000000000000000000000601320027462700203750ustar00rootroot00000000000000$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 $A $B $C $D $E $F hashcat-4.0.1/rules/hybrid/append_l.rule000066400000000000000000000001161320027462700202160ustar00rootroot00000000000000$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 hashcat-4.0.1/rules/hybrid/append_ld.rule000066400000000000000000000001541320027462700203640ustar00rootroot00000000000000$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 hashcat-4.0.1/rules/hybrid/append_lds.rule000066400000000000000000000003171320027462700205500ustar00rootroot00000000000000$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 $ $! $" $# $$ $% $& $' $( $) $* $+ $, $- $. $/ $: $; $< $= $> $? $@ $[ $\ $] $^ $_ $` ${ $| $} $~ hashcat-4.0.1/rules/hybrid/append_ldu.rule000066400000000000000000000002721320027462700205520ustar00rootroot00000000000000$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 hashcat-4.0.1/rules/hybrid/append_ldus.rule000066400000000000000000000004351320027462700207360ustar00rootroot00000000000000$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 $ $! $" $# $$ $% $& $' $( $) $* $+ $, $- $. $/ $: $; $< $= $> $? $@ $[ $\ $] $^ $_ $` ${ $| $} $~ hashcat-4.0.1/rules/hybrid/append_ls.rule000066400000000000000000000002611320027462700204020ustar00rootroot00000000000000$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 $ $! $" $# $$ $% $& $' $( $) $* $+ $, $- $. $/ $: $; $< $= $> $? $@ $[ $\ $] $^ $_ $` ${ $| $} $~ hashcat-4.0.1/rules/hybrid/append_lu.rule000066400000000000000000000002341320027462700204040ustar00rootroot00000000000000$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 hashcat-4.0.1/rules/hybrid/append_lus.rule000066400000000000000000000003771320027462700205770ustar00rootroot00000000000000$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 $ $! $" $# $$ $% $& $' $( $) $* $+ $, $- $. $/ $: $; $< $= $> $? $@ $[ $\ $] $^ $_ $` ${ $| $} $~ hashcat-4.0.1/rules/hybrid/append_s.rule000066400000000000000000000001431320027462700202250ustar00rootroot00000000000000$ $! $" $# $$ $% $& $' $( $) $* $+ $, $- $. $/ $: $; $< $= $> $? $@ $[ $\ $] $^ $_ $` ${ $| $} $~ hashcat-4.0.1/rules/hybrid/append_u.rule000066400000000000000000000001161320027462700202270ustar00rootroot00000000000000$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 hashcat-4.0.1/rules/hybrid/append_us.rule000066400000000000000000000002611320027462700204130ustar00rootroot00000000000000$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 $ $! $" $# $$ $% $& $' $( $) $* $+ $, $- $. $/ $: $; $< $= $> $? $@ $[ $\ $] $^ $_ $` ${ $| $} $~ hashcat-4.0.1/rules/hybrid/prepend_d.rule000066400000000000000000000000361320027462700203750ustar00rootroot00000000000000^0 ^1 ^2 ^3 ^4 ^5 ^6 ^7 ^8 ^9 hashcat-4.0.1/rules/hybrid/prepend_ds.rule000066400000000000000000000002011320027462700205520ustar00rootroot00000000000000^0 ^1 ^2 ^3 ^4 ^5 ^6 ^7 ^8 ^9 ^ ^! ^" ^# ^$ ^% ^& ^' ^( ^) ^* ^+ ^, ^- ^. ^/ ^: ^; ^< ^= ^> ^? ^@ ^[ ^\ ^] ^^ ^_ ^` ^{ ^| ^} ^~ hashcat-4.0.1/rules/hybrid/prepend_du.rule000066400000000000000000000001541320027462700205630ustar00rootroot00000000000000^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 hashcat-4.0.1/rules/hybrid/prepend_dus.rule000066400000000000000000000003171320027462700207470ustar00rootroot00000000000000^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 ^ ^! ^" ^# ^$ ^% ^& ^' ^( ^) ^* ^+ ^, ^- ^. ^/ ^: ^; ^< ^= ^> ^? ^@ ^[ ^\ ^] ^^ ^_ ^` ^{ ^| ^} ^~ hashcat-4.0.1/rules/hybrid/prepend_hl.rule000066400000000000000000000000601320027462700205520ustar00rootroot00000000000000^0 ^1 ^2 ^3 ^4 ^5 ^6 ^7 ^8 ^9 ^a ^b ^c ^d ^e ^f hashcat-4.0.1/rules/hybrid/prepend_hu.rule000066400000000000000000000000601320027462700205630ustar00rootroot00000000000000^0 ^1 ^2 ^3 ^4 ^5 ^6 ^7 ^8 ^9 ^A ^B ^C ^D ^E ^F hashcat-4.0.1/rules/hybrid/prepend_l.rule000066400000000000000000000001161320027462700204040ustar00rootroot00000000000000^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 hashcat-4.0.1/rules/hybrid/prepend_ld.rule000066400000000000000000000001541320027462700205520ustar00rootroot00000000000000^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 hashcat-4.0.1/rules/hybrid/prepend_lds.rule000066400000000000000000000003171320027462700207360ustar00rootroot00000000000000^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 ^ ^! ^" ^# ^$ ^% ^& ^' ^( ^) ^* ^+ ^, ^- ^. ^/ ^: ^; ^< ^= ^> ^? ^@ ^[ ^\ ^] ^^ ^_ ^` ^{ ^| ^} ^~ hashcat-4.0.1/rules/hybrid/prepend_ldu.rule000066400000000000000000000002721320027462700207400ustar00rootroot00000000000000^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 hashcat-4.0.1/rules/hybrid/prepend_ldus.rule000066400000000000000000000004351320027462700211240ustar00rootroot00000000000000^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 ^ ^! ^" ^# ^$ ^% ^& ^' ^( ^) ^* ^+ ^, ^- ^. ^/ ^: ^; ^< ^= ^> ^? ^@ ^[ ^\ ^] ^^ ^_ ^` ^{ ^| ^} ^~ hashcat-4.0.1/rules/hybrid/prepend_ls.rule000066400000000000000000000002611320027462700205700ustar00rootroot00000000000000^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 ^ ^! ^" ^# ^$ ^% ^& ^' ^( ^) ^* ^+ ^, ^- ^. ^/ ^: ^; ^< ^= ^> ^? ^@ ^[ ^\ ^] ^^ ^_ ^` ^{ ^| ^} ^~ hashcat-4.0.1/rules/hybrid/prepend_lu.rule000066400000000000000000000002341320027462700205720ustar00rootroot00000000000000^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 hashcat-4.0.1/rules/hybrid/prepend_lus.rule000066400000000000000000000003771320027462700207650ustar00rootroot00000000000000^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 ^ ^! ^" ^# ^$ ^% ^& ^' ^( ^) ^* ^+ ^, ^- ^. ^/ ^: ^; ^< ^= ^> ^? ^@ ^[ ^\ ^] ^^ ^_ ^` ^{ ^| ^} ^~ hashcat-4.0.1/rules/hybrid/prepend_s.rule000066400000000000000000000001431320027462700204130ustar00rootroot00000000000000^ ^! ^" ^# ^$ ^% ^& ^' ^( ^) ^* ^+ ^, ^- ^. ^/ ^: ^; ^< ^= ^> ^? ^@ ^[ ^\ ^] ^^ ^_ ^` ^{ ^| ^} ^~ hashcat-4.0.1/rules/hybrid/prepend_u.rule000066400000000000000000000001161320027462700204150ustar00rootroot00000000000000^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 hashcat-4.0.1/rules/hybrid/prepend_us.rule000066400000000000000000000002611320027462700206010ustar00rootroot00000000000000^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 ^ ^! ^" ^# ^$ ^% ^& ^' ^( ^) ^* ^+ ^, ^- ^. ^/ ^: ^; ^< ^= ^> ^? ^@ ^[ ^\ ^] ^^ ^_ ^` ^{ ^| ^} ^~ hashcat-4.0.1/rules/leetspeak.rule000066400000000000000000000004521320027462700171330ustar00rootroot00000000000000## 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 hashcat-4.0.1/rules/specific.rule000066400000000000000000000030331320027462700167410ustar00rootroot00000000000000## 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 hashcat-4.0.1/rules/toggles1.rule000066400000000000000000000000551320027462700167020ustar00rootroot00000000000000T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 TA TB TC TD TE hashcat-4.0.1/rules/toggles2.rule000066400000000000000000000010721320027462700167030ustar00rootroot00000000000000T0 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 hashcat-4.0.1/rules/toggles3.rule000066400000000000000000000072531320027462700167130ustar00rootroot00000000000000T0 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 hashcat-4.0.1/rules/toggles4.rule000066400000000000000000000372501320027462700167140ustar00rootroot00000000000000T0 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 hashcat-4.0.1/rules/toggles5.rule000066400000000000000000001376611320027462700167240ustar00rootroot00000000000000T0 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 hashcat-4.0.1/rules/unix-ninja-leetspeak.rule000066400000000000000000001540621320027462700212200ustar00rootroot00000000000000## common leetspeak rules ## written by Unix-Ninja sa4 sa4sb6 sa4sb6sc< sa4sb6sc master, tag: vX.Y.Z" VERSION_EXPORT := tag: v4.0.1 VERSION_TAG := $(shell test -d .git && git describe --tags --dirty=+ || echo "$(VERSION_EXPORT)" | $(SED) 's/.*: v\([\.0-9]*\).*/v\1/') ## ## General compiler and linker options ## CFLAGS += -pipe -std=gnu99 -Iinclude/ -Iinclude/lzma_sdk/ -IOpenCL/ ifeq ($(PRODUCTION),0) CFLAGS += -W CFLAGS += -Wall CFLAGS += -Wextra CFLAGS += -Wfloat-equal CFLAGS += -Wundef CFLAGS += -Wshadow CFLAGS += -Wmissing-declarations CFLAGS += -Wmissing-prototypes CFLAGS += -Wpointer-arith CFLAGS += -Wstrict-prototypes CFLAGS += -Waggregate-return CFLAGS += -Wswitch-enum CFLAGS += -Winit-self CFLAGS += -Werror-implicit-function-declaration CFLAGS += -Wformat CFLAGS += -ftrapv CFLAGS += -Wwrite-strings # the following compiler options produce warnings that should be fixed at some time CFLAGS += -Wno-cast-align CFLAGS += -Wno-cast-qual CFLAGS += -Wno-conversion CFLAGS += -Wno-padded CFLAGS += -Wno-pedantic CFLAGS += -Wno-sizeof-pointer-memaccess #CFLAGS += -Wno-reserved-id-macro //clang specific #CFLAGS += -Wno-used-but-marked-unused // ^^ endif # default Linux and freebsd thread stack size is 2MB # default Windows thread stack size is 1MB # default macOS thread stack size is 512kB # unfortunately, this option isn't supported by older GCC and clang versions #CFLAGS += -Wstack-usage=524288 LFLAGS := $(LDFLAGS) ifeq ($(DEBUG),0) CFLAGS += -O2 LFLAGS += -s else ifeq ($(DEBUG),1) CFLAGS += -DDEBUG -Og -ggdb else ifeq ($(DEBUG),2) CFLAGS += -DDEBUG -Og -ggdb CFLAGS += -fsanitize=address -fno-omit-frame-pointer endif endif endif ## ## Native compilation target ## ifeq ($(UNAME),Linux) CFLAGS_NATIVE := $(CFLAGS) CFLAGS_NATIVE += -I$(OPENCL_HEADERS_KHRONOS)/ CFLAGS_NATIVE += -DWITH_HWMON LFLAGS_NATIVE := $(LFLAGS) LFLAGS_NATIVE += -lpthread LFLAGS_NATIVE += -ldl endif # Linux ifeq ($(UNAME),FreeBSD) ifndef PORTNAME CFLAGS_NATIVE := $(CFLAGS) CFLAGS_NATIVE += -I$(OPENCL_HEADERS_KHRONOS)/ LFLAGS_NATIVE := $(LFLAGS) LFLAGS_NATIVE += -lpthread endif endif # FreeBSD ifeq ($(UNAME),Darwin) export MACOSX_DEPLOYMENT_TARGET=10.9 CFLAGS_NATIVE := $(CFLAGS) LFLAGS_NATIVE := $(LFLAGS) LFLAGS_NATIVE += -framework OpenCL LFLAGS_NATIVE += -lpthread LFLAGS_NATIVE += -liconv endif # Darwin ifeq ($(UNAME),CYGWIN) CFLAGS_NATIVE := $(CFLAGS) CFLAGS_NATIVE += -I$(OPENCL_HEADERS_KHRONOS)/ CFLAGS_NATIVE += -DWITH_HWMON LFLAGS_NATIVE := $(LFLAGS) LFLAGS_NATIVE += -Wl,--dynamicbase -Wl,--nxcompat LFLAGS_NATIVE += -lpsapi LFLAGS_NATIVE += -liconv endif # CYGWIN ifeq ($(UNAME),MSYS2) CFLAGS_NATIVE := $(CFLAGS) CFLAGS_NATIVE += -I$(OPENCL_HEADERS_KHRONOS)/ CFLAGS_NATIVE += -DWITH_HWMON LFLAGS_NATIVE := $(LFLAGS) LFLAGS_NATIVE += -Wl,--dynamicbase -Wl,--nxcompat LFLAGS_NATIVE += -lpsapi LFLAGS_NATIVE += -liconv endif # MSYS2 ## ## Cross compilation targets ## CFLAGS_CROSS_LINUX32 := $(CFLAGS) CFLAGS_CROSS_LINUX32 += -I$(OPENCL_HEADERS_KHRONOS)/ CFLAGS_CROSS_LINUX32 += -m32 CFLAGS_CROSS_LINUX32 += -DWITH_HWMON CFLAGS_CROSS_LINUX64 := $(CFLAGS) CFLAGS_CROSS_LINUX64 += -I$(OPENCL_HEADERS_KHRONOS)/ CFLAGS_CROSS_LINUX64 += -m64 CFLAGS_CROSS_LINUX64 += -DWITH_HWMON CFLAGS_CROSS_WIN32 := $(CFLAGS) CFLAGS_CROSS_WIN32 += -I$(OPENCL_HEADERS_KHRONOS)/ CFLAGS_CROSS_WIN32 += -I$(WIN_ICONV_32)/include/ CFLAGS_CROSS_WIN32 += -m32 CFLAGS_CROSS_WIN32 += -DWITH_HWMON CFLAGS_CROSS_WIN64 := $(CFLAGS) CFLAGS_CROSS_WIN64 += -I$(OPENCL_HEADERS_KHRONOS)/ CFLAGS_CROSS_WIN64 += -I$(WIN_ICONV_64)/include/ CFLAGS_CROSS_WIN64 += -m64 CFLAGS_CROSS_WIN64 += -DWITH_HWMON LFLAGS_CROSS_LINUX32 := $(LFLAGS) LFLAGS_CROSS_LINUX32 += -lpthread LFLAGS_CROSS_LINUX32 += -ldl LFLAGS_CROSS_LINUX64 := $(LFLAGS) LFLAGS_CROSS_LINUX64 += -lpthread LFLAGS_CROSS_LINUX64 += -ldl LFLAGS_CROSS_WIN32 := $(LFLAGS) LFLAGS_CROSS_WIN32 += -Wl,--dynamicbase -Wl,--nxcompat LFLAGS_CROSS_WIN32 += -lpsapi LFLAGS_CROSS_WIN64 := $(LFLAGS) LFLAGS_CROSS_WIN64 += -Wl,--dynamicbase -Wl,--nxcompat LFLAGS_CROSS_WIN64 += -lpsapi ## ## Objects ## OBJS_ALL := affinity autotune benchmark bitmap bitops combinator common convert cpt cpu_aes cpu_crc32 cpu_des cpu_md4 cpu_md5 cpu_sha1 cpu_sha256 debugfile dictstat dispatch dynloader event ext_ADL ext_nvapi ext_nvml ext_OpenCL ext_sysfs ext_xnvctrl ext_lzma lzma_sdk/Alloc lzma_sdk/Lzma2Dec lzma_sdk/LzmaDec filehandling folder hashcat hashes hlfmt hwmon induct interface locking logfile loopback memory monitor mpsp opencl outfile_check outfile pidfile potfile restore rp rp_cpu rp_kernel_on_cpu rp_kernel_on_cpu_optimized selftest shared status stdout straight terminal thread timer tuningdb usage user_options wordlist NATIVE_STATIC_OBJS := $(foreach OBJ,$(OBJS_ALL),obj/$(OBJ).NATIVE.STATIC.o) NATIVE_SHARED_OBJS := $(foreach OBJ,$(OBJS_ALL),obj/$(OBJ).NATIVE.SHARED.o) LINUX_32_OBJS := $(foreach OBJ,$(OBJS_ALL),obj/$(OBJ).LINUX.32.o) LINUX_64_OBJS := $(foreach OBJ,$(OBJS_ALL),obj/$(OBJ).LINUX.64.o) WIN_32_OBJS := $(foreach OBJ,$(OBJS_ALL),obj/$(OBJ).WIN.32.o) WIN_64_OBJS := $(foreach OBJ,$(OBJS_ALL),obj/$(OBJ).WIN.64.o) ## ## Targets: Native Compilation ## default: $(HASHCAT_FRONTEND) clean: $(RM) -f obj/*.o obj/lzma_sdk/*.o *.bin *.exe *.so *.dll *.pid hashcat core $(RM) -rf *.induct $(RM) -rf *.outfiles $(RM) -rf *.dSYM $(RM) -rf kernels distclean: clean $(RM) -f *.restore *.pot *.out *.log ## ## Targets: Cross Compilation (for binary release version) ## binaries: linux32 linux64 win32 win64 linux32: hashcat32.bin linux64: hashcat64.bin win32: hashcat32.exe win64: hashcat64.exe ## ## Targets: Linux install ## How to make /usr/bin/install doing recursive?? ## ifeq ($(SHARED),1) install: install_docs install_shared install_library install_hashcat else install: install_docs install_shared install_hashcat endif # we need this extra target to make sure that for parallel builds (i.e. 2+ Makefile targets could possible run at the same time) # the root folder of the shared directory is created first (and is a dependency for the targets that depend on it) install_make_share_root: $(INSTALL) -m 755 -d $(DESTDIR)$(SHARED_ROOT_FOLDER) install_docs: install_make_share_root $(INSTALL) -m 755 -d $(DESTDIR)$(DOCUMENT_FOLDER) $(INSTALL) -m 755 -d $(DESTDIR)$(DOCUMENT_FOLDER)/docs $(INSTALL) -m 755 -d $(DESTDIR)$(DOCUMENT_FOLDER)/charsets $(INSTALL) -m 755 -d $(DESTDIR)$(DOCUMENT_FOLDER)/masks $(INSTALL) -m 755 -d $(DESTDIR)$(DOCUMENT_FOLDER)/rules $(INSTALL) -m 755 -d $(DESTDIR)$(DOCUMENT_FOLDER)/extra $(INSTALL) -m 755 -d $(DESTDIR)$(DOCUMENT_FOLDER)/extra/tab_completion $(INSTALL) -m 644 example.dict $(DESTDIR)$(DOCUMENT_FOLDER)/ $(INSTALL) -m 644 example0.hash $(DESTDIR)$(DOCUMENT_FOLDER)/ $(INSTALL) -m 644 example400.hash $(DESTDIR)$(DOCUMENT_FOLDER)/ $(INSTALL) -m 644 example500.hash $(DESTDIR)$(DOCUMENT_FOLDER)/ $(INSTALL) -m 755 example0.sh $(DESTDIR)$(DOCUMENT_FOLDER)/ $(INSTALL) -m 755 example400.sh $(DESTDIR)$(DOCUMENT_FOLDER)/ $(INSTALL) -m 755 example500.sh $(DESTDIR)$(DOCUMENT_FOLDER)/ $(INSTALL) -m 644 extra/tab_completion/hashcat.sh $(DESTDIR)$(DOCUMENT_FOLDER)/extra/tab_completion/ $(INSTALL) -m 644 extra/tab_completion/howto.txt $(DESTDIR)$(DOCUMENT_FOLDER)/extra/tab_completion/ $(INSTALL) -m 755 extra/tab_completion/install $(DESTDIR)$(DOCUMENT_FOLDER)/extra/tab_completion/ $(FIND) docs/ -type d -exec $(INSTALL) -m 755 -d $(DESTDIR)$(DOCUMENT_FOLDER)/{} \; $(FIND) docs/ -type f -exec $(INSTALL) -m 644 {} $(DESTDIR)$(DOCUMENT_FOLDER)/{} \; $(FIND) charsets/ -type d -exec $(INSTALL) -m 755 -d $(DESTDIR)$(DOCUMENT_FOLDER)/{} \; $(FIND) charsets/ -type f -exec $(INSTALL) -m 644 {} $(DESTDIR)$(DOCUMENT_FOLDER)/{} \; $(FIND) masks/ -type d -exec $(INSTALL) -m 755 -d $(DESTDIR)$(DOCUMENT_FOLDER)/{} \; $(FIND) masks/ -type f -exec $(INSTALL) -m 644 {} $(DESTDIR)$(DOCUMENT_FOLDER)/{} \; $(FIND) rules/ -type d -exec $(INSTALL) -m 755 -d $(DESTDIR)$(DOCUMENT_FOLDER)/{} \; $(FIND) rules/ -type f -exec $(INSTALL) -m 644 {} $(DESTDIR)$(DOCUMENT_FOLDER)/{} \; $(SED) $(SED_IN_PLACE) 's/\.\/hashcat/hashcat/' $(DESTDIR)$(DOCUMENT_FOLDER)/example0.sh $(SED) $(SED_IN_PLACE) 's/\.\/hashcat/hashcat/' $(DESTDIR)$(DOCUMENT_FOLDER)/example400.sh $(SED) $(SED_IN_PLACE) 's/\.\/hashcat/hashcat/' $(DESTDIR)$(DOCUMENT_FOLDER)/example500.sh install_shared: install_make_share_root $(INSTALL) -m 755 -d $(DESTDIR)$(SHARED_FOLDER) $(INSTALL) -m 755 -d $(DESTDIR)$(SHARED_FOLDER)/OpenCL $(INSTALL) -m 644 hashcat.hctune $(DESTDIR)$(SHARED_FOLDER)/ $(INSTALL) -m 644 hashcat.hcstat2 $(DESTDIR)$(SHARED_FOLDER)/ $(FIND) OpenCL/ -type d -exec $(INSTALL) -m 755 -d $(DESTDIR)$(SHARED_FOLDER)/{} \; $(FIND) OpenCL/ -type f -exec $(INSTALL) -m 644 {} $(DESTDIR)$(SHARED_FOLDER)/{} \; install_library: $(HASHCAT_LIBRARY) $(INSTALL) -m 755 -d $(DESTDIR)$(LIBRARY_FOLDER) $(INSTALL) -m 755 $(HASHCAT_LIBRARY) $(DESTDIR)$(LIBRARY_FOLDER)/ install_hashcat: $(HASHCAT_FRONTEND) $(INSTALL) -m 755 -d $(DESTDIR)$(INSTALL_FOLDER) $(INSTALL) -m 755 $(HASHCAT_FRONTEND) $(DESTDIR)$(INSTALL_FOLDER)/ uninstall: $(RM) -f $(DESTDIR)$(INSTALL_FOLDER)/$(HASHCAT_FRONTEND) $(RM) -f $(DESTDIR)$(LIBRARY_FOLDER)/$(HASHCAT_LIBRARY) $(RM) -rf $(DESTDIR)$(SHARED_FOLDER) $(RM) -rf $(DESTDIR)$(DOCUMENT_FOLDER) ## ## native compiled hashcat library and frontend ## obj/%.NATIVE.STATIC.o: src/%.c $(CC) -c $(CFLAGS_NATIVE) $< -o $@ obj/%.NATIVE.SHARED.o: src/%.c $(CC) -c $(CFLAGS_NATIVE) $< -o $@ -fpic $(HASHCAT_LIBRARY): $(NATIVE_SHARED_OBJS) $(CC) $^ $(LFLAGS_NATIVE) -o $@ -shared ifeq ($(SHARED),1) $(HASHCAT_FRONTEND): src/main.c $(HASHCAT_LIBRARY) $(CC) $(CFLAGS_NATIVE) $^ -L. -lhashcat $(LFLAGS_NATIVE) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -DINSTALL_FOLDER=\"$(INSTALL_FOLDER)\" -DSHARED_FOLDER=\"$(SHARED_FOLDER)\" -DDOCUMENT_FOLDER=\"$(DOCUMENT_FOLDER)\" -o $@ else $(HASHCAT_FRONTEND): src/main.c $(NATIVE_STATIC_OBJS) $(CC) $(CFLAGS_NATIVE) $^ $(LFLAGS_NATIVE) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -DINSTALL_FOLDER=\"$(INSTALL_FOLDER)\" -DSHARED_FOLDER=\"$(SHARED_FOLDER)\" -DDOCUMENT_FOLDER=\"$(DOCUMENT_FOLDER)\" -o $@ endif ## ## cross compiled hashcat ## obj/%.LINUX.32.o: src/%.c $(CC_LINUX_32) $(CFLAGS_CROSS_LINUX32) -c -o $@ $< obj/%.LINUX.64.o: src/%.c $(CC_LINUX_64) $(CFLAGS_CROSS_LINUX64) -c -o $@ $< obj/%.WIN.32.o: src/%.c $(CC_WIN_32) $(CFLAGS_CROSS_WIN32) -c -o $@ $< obj/%.WIN.64.o: src/%.c $(CC_WIN_64) $(CFLAGS_CROSS_WIN64) -c -o $@ $< hashcat32.bin: src/main.c $(LINUX_32_OBJS) $(CC_LINUX_32) $(CFLAGS_CROSS_LINUX32) -o $@ $^ $(LFLAGS_CROSS_LINUX32) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -DINSTALL_FOLDER=\"$(INSTALL_FOLDER)\" -DSHARED_FOLDER=\"$(SHARED_FOLDER)\" -DDOCUMENT_FOLDER=\"$(DOCUMENT_FOLDER)\" hashcat64.bin: src/main.c $(LINUX_64_OBJS) $(CC_LINUX_64) $(CFLAGS_CROSS_LINUX64) -o $@ $^ $(LFLAGS_CROSS_LINUX64) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -DINSTALL_FOLDER=\"$(INSTALL_FOLDER)\" -DSHARED_FOLDER=\"$(SHARED_FOLDER)\" -DDOCUMENT_FOLDER=\"$(DOCUMENT_FOLDER)\" hashcat32.exe: src/main.c $(WIN_32_OBJS) $(WIN_ICONV_32)/lib/libiconv.a $(CC_WIN_32) $(CFLAGS_CROSS_WIN32) -o $@ $^ $(LFLAGS_CROSS_WIN32) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" hashcat64.exe: src/main.c $(WIN_64_OBJS) $(WIN_ICONV_64)/lib/libiconv.a $(CC_WIN_64) $(CFLAGS_CROSS_WIN64) -o $@ $^ $(LFLAGS_CROSS_WIN64) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" hashcat32.dll: src/main.c $(WIN_32_OBJS) $(CC_WIN_32) $(CFLAGS_CROSS_WIN32) -o $@ $^ $(LFLAGS_CROSS_WIN32) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -shared hashcat64.dll: src/main.c $(WIN_64_OBJS) $(CC_WIN_64) $(CFLAGS_CROSS_WIN64) -o $@ $^ $(LFLAGS_CROSS_WIN64) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -shared hashcat-4.0.1/src/affinity.c000066400000000000000000000045571320027462700157110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "affinity.h" #if defined (__APPLE__) static void CPU_ZERO (cpu_set_t *cs) { cs->count = 0; } static void CPU_SET (int num, cpu_set_t *cs) { cs->count |= (1 << num); } static int CPU_ISSET (int num, cpu_set_t *cs) { return (cs->count & (1 << num)); } static int pthread_setaffinity_np (pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set) { int core; for (core = 0; core < (8 * (int) cpu_size); core++) { if (CPU_ISSET (core, cpu_set)) break; } thread_affinity_policy_data_t policy = { core }; return thread_policy_set (pthread_mach_thread_np (thread), THREAD_AFFINITY_POLICY, (thread_policy_t) &policy, 1); } #endif #if defined (__FreeBSD__) #include typedef cpuset_t cpu_set_t; #endif int set_cpu_affinity (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx) { #if defined (__CYGWIN__) return 0; #else const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->cpu_affinity == NULL) return 0; #if defined (_WIN) DWORD_PTR aff_mask = 0; #else cpu_set_t cpuset; CPU_ZERO (&cpuset); #endif char *devices = hcstrdup (user_options->cpu_affinity); if (devices == NULL) return -1; char *saveptr; char *next = strtok_r (devices, ",", &saveptr); do { int cpu_id = atoi (next); if (cpu_id == 0) { #if defined (_WIN) aff_mask = 0; #else CPU_ZERO (&cpuset); #endif break; } if (cpu_id > 32) { event_log_error (hashcat_ctx, "Invalid cpu_id %d specified.", cpu_id); hcfree (devices); return -1; } #if defined (_WIN) aff_mask |= 1u << (cpu_id - 1); #else CPU_SET ((cpu_id - 1), &cpuset); #endif } while ((next = strtok_r (NULL, ",", &saveptr)) != NULL); hcfree (devices); #if defined (_WIN) SetProcessAffinityMask (GetCurrentProcess (), aff_mask); if (SetThreadAffinityMask (GetCurrentThread (), aff_mask) == 0) { event_log_error (hashcat_ctx, "%s", "SetThreadAffinityMask()."); return -1; } #else pthread_t thread = pthread_self (); if (pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset) == -1) { event_log_error (hashcat_ctx, "%s", "pthread_setaffinity_np()."); return -1; } #endif return 0; #endif } hashcat-4.0.1/src/autotune.c000066400000000000000000000302441320027462700157340ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "event.h" #include "opencl.h" #include "status.h" #include "terminal.h" #include "autotune.h" static double try_run (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 kernel_accel, const u32 kernel_loops) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; device_param->kernel_params_buf32[28] = 0; device_param->kernel_params_buf32[29] = kernel_loops; // not a bug, both need to be set device_param->kernel_params_buf32[30] = kernel_loops; // because there's two variables for inner iters for slow and fast hashes if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { const u32 kernel_power_try = device_param->device_processors * device_param->kernel_threads_by_wgs_kernel1 * kernel_accel; run_kernel (hashcat_ctx, device_param, KERN_RUN_1, kernel_power_try, true, 0); } else { const u32 kernel_power_try = device_param->device_processors * device_param->kernel_threads_by_wgs_kernel4 * kernel_accel; run_kernel (hashcat_ctx, device_param, KERN_RUN_4, kernel_power_try, true, 0); } } else { const u32 kernel_power_try = device_param->device_processors * device_param->kernel_threads_by_wgs_kernel2 * kernel_accel; run_kernel (hashcat_ctx, device_param, KERN_RUN_2, kernel_power_try, true, 0); } const double exec_msec_prev = get_avg_exec_time (device_param, 1); return exec_msec_prev; } static int autotune (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; const double target_msec = opencl_ctx->target_msec; const u32 kernel_accel_min = device_param->kernel_accel_min; const u32 kernel_accel_max = device_param->kernel_accel_max; const u32 kernel_loops_min = device_param->kernel_loops_min; const u32 kernel_loops_max = device_param->kernel_loops_max; u32 kernel_accel = kernel_accel_min; u32 kernel_loops = kernel_loops_min; // in this case the user specified a fixed -n and -u on the commandline // no way to tune anything // but we need to run a few caching rounds if ((kernel_accel_min == kernel_accel_max) && (kernel_loops_min == kernel_loops_max)) { #if defined (DEBUG) // don't do any autotune in debug mode in this case // we're propably during kernel development #else if (hashconfig->hash_mode != 2000) { try_run (hashcat_ctx, device_param, kernel_accel, kernel_loops); try_run (hashcat_ctx, device_param, kernel_accel, kernel_loops); try_run (hashcat_ctx, device_param, kernel_accel, kernel_loops); try_run (hashcat_ctx, device_param, kernel_accel, kernel_loops); } #endif device_param->kernel_accel = kernel_accel; device_param->kernel_loops = kernel_loops; const u32 kernel_power = device_param->device_processors * device_param->kernel_threads_by_user * device_param->kernel_accel; device_param->kernel_power = kernel_power; return 0; } // from here it's clear we are allowed to autotune // so let's init some fake words const u32 kernel_power_max = device_param->device_processors * device_param->kernel_threads_by_user * kernel_accel_max; int CL_rc; for (u32 i = 0; i < kernel_power_max; i++) { device_param->pws_buf[i].i[0] = i; device_param->pws_buf[i].i[1] = 0x01234567; device_param->pws_buf[i].pw_len = 7 + (i & 7); } CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_pws_buf, CL_TRUE, 0, kernel_power_max * sizeof (pw_t), device_param->pws_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { if (straight_ctx->kernel_rules_cnt > 1) { CL_rc = hc_clEnqueueCopyBuffer (hashcat_ctx, device_param->command_queue, device_param->d_rules, device_param->d_rules_c, 0, 0, MIN (kernel_loops_max, KERNEL_RULES) * sizeof (kernel_rule_t), 0, NULL, NULL); if (CL_rc == -1) return -1; } } else { CL_rc = hc_clEnqueueCopyBuffer (hashcat_ctx, device_param->command_queue, device_param->d_pws_buf, device_param->d_pws_amp_buf, 0, 0, kernel_power_max * sizeof (pw_t), 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = run_kernel_amp (hashcat_ctx, device_param, kernel_power_max); if (CL_rc == -1) return -1; } // Do a pre-autotune test run to find out if kernel runtime is above some TDR limit u32 kernel_loops_max_reduced = kernel_loops_max; if (1) { const double exec_msec = try_run (hashcat_ctx, device_param, kernel_accel_min, kernel_loops_min); if (exec_msec > 2000) { event_log_error (hashcat_ctx, "OpenCL kernel minimum runtime larger than default TDR"); return -1; } const u32 mm = kernel_loops_max / kernel_loops_min; if ((exec_msec * mm) > target_msec) { const u32 loops_valid = target_msec / exec_msec; kernel_loops_max_reduced = kernel_loops_min * loops_valid; } } #define VERIFIER_CNT 1 // first find out highest kernel-loops that stays below target_msec if (kernel_loops_min < kernel_loops_max) { for (kernel_loops = kernel_loops_max; kernel_loops > kernel_loops_min; kernel_loops >>= 1) { if (kernel_loops > kernel_loops_max_reduced) continue; double exec_msec = try_run (hashcat_ctx, device_param, kernel_accel_min, kernel_loops); for (int i = 0; i < VERIFIER_CNT; i++) { double exec_msec_v = try_run (hashcat_ctx, device_param, kernel_accel_min, kernel_loops); exec_msec = MIN (exec_msec, exec_msec_v); } if (exec_msec < target_msec) break; } } // now the same for kernel-accel but with the new kernel-loops from previous loop set #define STEPS_CNT 10 if (kernel_accel_min < kernel_accel_max) { for (int i = 0; i < STEPS_CNT; i++) { const u32 kernel_accel_try = 1u << i; if (kernel_accel_try < kernel_accel_min) continue; if (kernel_accel_try > kernel_accel_max) break; double exec_msec = try_run (hashcat_ctx, device_param, kernel_accel_try, kernel_loops); for (int verifier_idx = 0; verifier_idx < VERIFIER_CNT; verifier_idx++) { double exec_msec_v = try_run (hashcat_ctx, device_param, kernel_accel_try, kernel_loops); exec_msec = MIN (exec_msec, exec_msec_v); } if (exec_msec > target_msec) break; kernel_accel = kernel_accel_try; } } // at this point we want to know the actual runtime for the following reason: // we need a reference for the balancing loop following up, and this // the balancing loop can have an effect that the creates a new opportunity, for example: // if the target is 95 ms and the current runtime is 48ms the above loop // stopped the execution because the previous exec_msec was > 95ms // due to the rebalance it's possible that the runtime reduces from 48ms to 47ms // and this creates the possibility to double the workload -> 47 * 2 = 95ms, which is < 96ms double exec_msec_pre_final = try_run (hashcat_ctx, device_param, kernel_accel, kernel_loops); for (int verifier_idx = 0; verifier_idx < VERIFIER_CNT; verifier_idx++) { double exec_msec_pre_final_v = try_run (hashcat_ctx, device_param, kernel_accel, kernel_loops); exec_msec_pre_final = MIN (exec_msec_pre_final, exec_msec_pre_final_v); } u32 diff = kernel_loops - kernel_accel; if ((kernel_loops_min < kernel_loops_max) && (kernel_accel_min < kernel_accel_max)) { u32 kernel_accel_orig = kernel_accel; u32 kernel_loops_orig = kernel_loops; for (u32 f = 1; f < 1024; f++) { const u32 kernel_accel_try = kernel_accel_orig * f; const u32 kernel_loops_try = kernel_loops_orig / f; if (kernel_accel_try > kernel_accel_max) break; if (kernel_loops_try < kernel_loops_min) break; u32 diff_new = kernel_loops_try - kernel_accel_try; if (diff_new > diff) break; double exec_msec = try_run (hashcat_ctx, device_param, kernel_accel_try, kernel_loops_try); for (int verifier_idx = 0; verifier_idx < VERIFIER_CNT; verifier_idx++) { double exec_msec_v = try_run (hashcat_ctx, device_param, kernel_accel_try, kernel_loops_try); exec_msec = MIN (exec_msec, exec_msec_v); } for (int verifier_idx = 0; verifier_idx < VERIFIER_CNT; verifier_idx++) { exec_msec_pre_final = exec_msec; kernel_accel = kernel_accel_try; kernel_loops = kernel_loops_try; } } } const u32 exec_left = target_msec / exec_msec_pre_final; const u32 accel_left = kernel_accel_max / kernel_accel; const u32 exec_accel_min = MIN (exec_left, accel_left); // we want that to be int if (exec_accel_min >= 1) { // this is safe to not overflow kernel_accel_max because of accel_left kernel_accel *= exec_accel_min; } // reset them fake words /* memset (device_param->pws_buf, 0, kernel_power_max * sizeof (pw_t)); hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_pws_buf, CL_TRUE, 0, kernel_power_max * sizeof (pw_t), device_param->pws_buf, 0, NULL, NULL); hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_pws_amp_buf, CL_TRUE, 0, kernel_power_max * sizeof (pw_t), device_param->pws_buf, 0, NULL, NULL); */ CL_rc = run_kernel_memset (hashcat_ctx, device_param, device_param->d_pws_buf, 0, device_param->size_pws); if (CL_rc == -1) return -1; if (hashconfig->attack_exec == ATTACK_EXEC_OUTSIDE_KERNEL) { CL_rc = run_kernel_memset (hashcat_ctx, device_param, device_param->d_pws_amp_buf, 0, device_param->size_pws_amp); if (CL_rc == -1) return -1; } // reset other buffers in case autotune cracked something CL_rc = run_kernel_memset (hashcat_ctx, device_param, device_param->d_plain_bufs, 0, device_param->size_plains); if (CL_rc == -1) return -1; CL_rc = run_kernel_memset (hashcat_ctx, device_param, device_param->d_digests_shown, 0, device_param->size_shown); if (CL_rc == -1) return -1; CL_rc = run_kernel_memset (hashcat_ctx, device_param, device_param->d_result, 0, device_param->size_results); if (CL_rc == -1) return -1; // reset timer device_param->exec_pos = 0; memset (device_param->exec_msec, 0, EXEC_CACHE * sizeof (double)); memset (device_param->exec_us_prev1, 0, EXPECTED_ITERATIONS * sizeof (double)); memset (device_param->exec_us_prev2, 0, EXPECTED_ITERATIONS * sizeof (double)); memset (device_param->exec_us_prev3, 0, EXPECTED_ITERATIONS * sizeof (double)); memset (device_param->exec_us_prev4, 0, EXPECTED_ITERATIONS * sizeof (double)); memset (device_param->exec_us_prev_init2, 0, EXPECTED_ITERATIONS * sizeof (double)); memset (device_param->exec_us_prev_loop2, 0, EXPECTED_ITERATIONS * sizeof (double)); // store device_param->kernel_accel = kernel_accel; device_param->kernel_loops = kernel_loops; const u32 kernel_power = device_param->device_processors * device_param->kernel_threads_by_user * device_param->kernel_accel; device_param->kernel_power = kernel_power; #if defined (DEBUG) user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == false) { clear_prompt (); printf ( "- Device #%u: autotuned kernel-accel to %u" EOL "- Device #%u: autotuned kernel-loops to %u" EOL, device_param->device_id + 1, kernel_accel, device_param->device_id + 1, kernel_loops ); send_prompt (); } #endif return 0; } void *thread_autotune (void *p) { thread_param_t *thread_param = (thread_param_t *) p; hashcat_ctx_t *hashcat_ctx = thread_param->hashcat_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (opencl_ctx->enabled == false) return NULL; hc_device_param_t *device_param = opencl_ctx->devices_param + thread_param->tid; if (device_param->skipped == true) return NULL; const int rc_autotune = autotune (hashcat_ctx, device_param); if (rc_autotune == -1) { // we should do something here, tell hashcat main that autotune failed to abort } return NULL; } hashcat-4.0.1/src/benchmark.c000066400000000000000000000027351320027462700160260ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "benchmark.h" const unsigned int DEFAULT_BENCHMARK_ALGORITHMS_CNT = 156; const unsigned int DEFAULT_BENCHMARK_ALGORITHMS_BUF[] = { 900, 0, 5100, 100, 1400, 10800, 1700, 5000, 10100, 14900, 6000, 6100, 6900, 11700, 11800, 14000, 14100, 400, 8900, 11900, 12000, 10900, 12100, 23, 2500, 2501, 5300, 5400, 5500, 5600, 7300, 7500, 13100, 8300, 11100, 11200, 11400, 121, 2611, 2711, 2811, 8400, 13900, 11, 2612, 7900, 21, 11000, 124, 10000, 3711, 4521, 4522, 12, 131, 132, 1731, 200, 300, 3100, 112, 12300, 8000, 141, 1441, 1600, 12600, 1421, 101, 111, 1411, 1711, 3000, 1000, 1100, 2100, 15300, 15900, 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, 13500, 11600, 13600, 12500, 13000, 13200, 13300, 6211, 6221, 6231, 6241, 13711, 13721, 13731, 13741, 13751, 13761, 8800, 12900, 12200, 9700, 9710, 9800, 9810, 9400, 9500, 9600, 10400, 10410, 10500, 10600, 10700, 9000, 5200, 6800, 6600, 8200, 11300, 12700, 15200, 13400, 15500, 15600, 125, 15400 }; hashcat-4.0.1/src/bitmap.c000066400000000000000000000165221320027462700153470ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "bitmap.h" static void selftest_to_bitmap (const u32 dgst_shifts, char *digests_buf_ptr, const u32 dgst_pos0, const u32 dgst_pos1, const u32 dgst_pos2, const u32 dgst_pos3, const u32 bitmap_mask, u32 *bitmap_a, u32 *bitmap_b, u32 *bitmap_c, u32 *bitmap_d) { u32 *digest_ptr = (u32 *) digests_buf_ptr; const u32 val0 = 1u << (digest_ptr[dgst_pos0] & 0x1f); const u32 val1 = 1u << (digest_ptr[dgst_pos1] & 0x1f); const u32 val2 = 1u << (digest_ptr[dgst_pos2] & 0x1f); const u32 val3 = 1u << (digest_ptr[dgst_pos3] & 0x1f); const u32 idx0 = (digest_ptr[dgst_pos0] >> dgst_shifts) & bitmap_mask; const u32 idx1 = (digest_ptr[dgst_pos1] >> dgst_shifts) & bitmap_mask; const u32 idx2 = (digest_ptr[dgst_pos2] >> dgst_shifts) & bitmap_mask; const u32 idx3 = (digest_ptr[dgst_pos3] >> dgst_shifts) & bitmap_mask; bitmap_a[idx0] |= val0; bitmap_b[idx1] |= val1; bitmap_c[idx2] |= val2; bitmap_d[idx3] |= val3; } static u32 generate_bitmaps (const u32 digests_cnt, const u32 dgst_size, const u32 dgst_shifts, char *digests_buf_ptr, const u32 dgst_pos0, const u32 dgst_pos1, const u32 dgst_pos2, const u32 dgst_pos3, const u32 bitmap_mask, const u32 bitmap_size, u32 *bitmap_a, u32 *bitmap_b, u32 *bitmap_c, u32 *bitmap_d, const u64 collisions_max) { u64 collisions = 0; 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 (u32 i = 0; i < digests_cnt; i++) { u32 *digest_ptr = (u32 *) digests_buf_ptr; digests_buf_ptr += dgst_size; const u32 val0 = 1u << (digest_ptr[dgst_pos0] & 0x1f); const u32 val1 = 1u << (digest_ptr[dgst_pos1] & 0x1f); const u32 val2 = 1u << (digest_ptr[dgst_pos2] & 0x1f); const u32 val3 = 1u << (digest_ptr[dgst_pos3] & 0x1f); const u32 idx0 = (digest_ptr[dgst_pos0] >> dgst_shifts) & bitmap_mask; const u32 idx1 = (digest_ptr[dgst_pos1] >> dgst_shifts) & bitmap_mask; const u32 idx2 = (digest_ptr[dgst_pos2] >> dgst_shifts) & bitmap_mask; const u32 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 bitmap_ctx_init (hashcat_ctx_t *hashcat_ctx) { bitmap_ctx_t *bitmap_ctx = hashcat_ctx->bitmap_ctx; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; user_options_t *user_options = hashcat_ctx->user_options; bitmap_ctx->enabled = false; if (user_options->example_hashes == true) return 0; if (user_options->keyspace == true) return 0; if (user_options->left == true) return 0; if (user_options->opencl_info == true) return 0; if (user_options->show == true) return 0; if (user_options->usage == true) return 0; if (user_options->version == true) return 0; bitmap_ctx->enabled = true; /** * generate bitmap tables */ const u32 bitmap_shift1 = 5; const u32 bitmap_shift2 = 13; const u32 bitmap_min = user_options->bitmap_min; const u32 bitmap_max = user_options->bitmap_max; u32 *bitmap_s1_a = (u32 *) hcmalloc ((1u << bitmap_max) * sizeof (u32)); u32 *bitmap_s1_b = (u32 *) hcmalloc ((1u << bitmap_max) * sizeof (u32)); u32 *bitmap_s1_c = (u32 *) hcmalloc ((1u << bitmap_max) * sizeof (u32)); u32 *bitmap_s1_d = (u32 *) hcmalloc ((1u << bitmap_max) * sizeof (u32)); u32 *bitmap_s2_a = (u32 *) hcmalloc ((1u << bitmap_max) * sizeof (u32)); u32 *bitmap_s2_b = (u32 *) hcmalloc ((1u << bitmap_max) * sizeof (u32)); u32 *bitmap_s2_c = (u32 *) hcmalloc ((1u << bitmap_max) * sizeof (u32)); u32 *bitmap_s2_d = (u32 *) hcmalloc ((1u << bitmap_max) * sizeof (u32)); u32 bitmap_bits; u32 bitmap_nums; u32 bitmap_mask; u32 bitmap_size; for (bitmap_bits = bitmap_min; bitmap_bits < bitmap_max; bitmap_bits++) { bitmap_nums = 1u << bitmap_bits; bitmap_mask = bitmap_nums - 1; bitmap_size = bitmap_nums * sizeof (u32); if ((hashes->digests_cnt & bitmap_mask) == hashes->digests_cnt) break; if (generate_bitmaps (hashes->digests_cnt, hashconfig->dgst_size, bitmap_shift1, (char *) hashes->digests_buf, hashconfig->dgst_pos0, hashconfig->dgst_pos1, hashconfig->dgst_pos2, hashconfig->dgst_pos3, bitmap_mask, bitmap_size, bitmap_s1_a, bitmap_s1_b, bitmap_s1_c, bitmap_s1_d, hashes->digests_cnt / 2) == 0x7fffffff) continue; if (generate_bitmaps (hashes->digests_cnt, hashconfig->dgst_size, bitmap_shift2, (char *) hashes->digests_buf, hashconfig->dgst_pos0, hashconfig->dgst_pos1, hashconfig->dgst_pos2, hashconfig->dgst_pos3, bitmap_mask, bitmap_size, bitmap_s1_a, bitmap_s1_b, bitmap_s1_c, bitmap_s1_d, hashes->digests_cnt / 2) == 0x7fffffff) continue; break; } bitmap_nums = 1u << bitmap_bits; bitmap_mask = bitmap_nums - 1; bitmap_size = bitmap_nums * sizeof (u32); generate_bitmaps (hashes->digests_cnt, hashconfig->dgst_size, bitmap_shift1, (char *) hashes->digests_buf, hashconfig->dgst_pos0, hashconfig->dgst_pos1, hashconfig->dgst_pos2, hashconfig->dgst_pos3, bitmap_mask, bitmap_size, bitmap_s1_a, bitmap_s1_b, bitmap_s1_c, bitmap_s1_d, -1ul); generate_bitmaps (hashes->digests_cnt, hashconfig->dgst_size, bitmap_shift2, (char *) hashes->digests_buf, hashconfig->dgst_pos0, hashconfig->dgst_pos1, hashconfig->dgst_pos2, hashconfig->dgst_pos3, bitmap_mask, bitmap_size, bitmap_s2_a, bitmap_s2_b, bitmap_s2_c, bitmap_s2_d, -1ul); if (hashconfig->st_hash != NULL) { selftest_to_bitmap (bitmap_shift1, (char *) hashes->st_digests_buf, hashconfig->dgst_pos0, hashconfig->dgst_pos1, hashconfig->dgst_pos2, hashconfig->dgst_pos3, bitmap_mask, bitmap_s1_a, bitmap_s1_b, bitmap_s1_c, bitmap_s1_d); selftest_to_bitmap (bitmap_shift2, (char *) hashes->st_digests_buf, hashconfig->dgst_pos0, hashconfig->dgst_pos1, hashconfig->dgst_pos2, hashconfig->dgst_pos3, bitmap_mask, bitmap_s2_a, bitmap_s2_b, bitmap_s2_c, bitmap_s2_d); } bitmap_ctx->bitmap_bits = bitmap_bits; bitmap_ctx->bitmap_nums = bitmap_nums; bitmap_ctx->bitmap_size = bitmap_size; bitmap_ctx->bitmap_mask = bitmap_mask; bitmap_ctx->bitmap_shift1 = bitmap_shift1; bitmap_ctx->bitmap_shift2 = bitmap_shift2; bitmap_ctx->bitmap_s1_a = bitmap_s1_a; bitmap_ctx->bitmap_s1_b = bitmap_s1_b; bitmap_ctx->bitmap_s1_c = bitmap_s1_c; bitmap_ctx->bitmap_s1_d = bitmap_s1_d; bitmap_ctx->bitmap_s2_a = bitmap_s2_a; bitmap_ctx->bitmap_s2_b = bitmap_s2_b; bitmap_ctx->bitmap_s2_c = bitmap_s2_c; bitmap_ctx->bitmap_s2_d = bitmap_s2_d; return 0; } void bitmap_ctx_destroy (hashcat_ctx_t *hashcat_ctx) { bitmap_ctx_t *bitmap_ctx = hashcat_ctx->bitmap_ctx; if (bitmap_ctx->enabled == false) return; hcfree (bitmap_ctx->bitmap_s1_a); hcfree (bitmap_ctx->bitmap_s1_b); hcfree (bitmap_ctx->bitmap_s1_c); hcfree (bitmap_ctx->bitmap_s1_d); hcfree (bitmap_ctx->bitmap_s2_a); hcfree (bitmap_ctx->bitmap_s2_b); hcfree (bitmap_ctx->bitmap_s2_c); hcfree (bitmap_ctx->bitmap_s2_d); memset (bitmap_ctx, 0, sizeof (bitmap_ctx_t)); } hashcat-4.0.1/src/bitops.c000066400000000000000000000034331320027462700153700ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "bitops.h" u32 __add3_S (const u32 a, const u32 b, const u32 c) { return a + b + c; } u32 __add3 (const u32 a, const u32 b, const u32 c) { return a + b + c; } u32 rotl32 (const u32 a, const u32 n) { #if defined (_MSC_VER) return _rotl (a, n); #else return ((a << n) | (a >> (32 - n))); #endif } u32 rotr32 (const u32 a, const u32 n) { #if defined (_MSC_VER) return _rotr (a, n); #else return ((a >> n) | (a << (32 - n))); #endif } u64 rotl64 (const u64 a, const u64 n) { #if defined (_MSC_VER) return _rotl64 (a, n); #else return ((a << n) | (a >> (64 - n))); #endif } u64 rotr64 (const u64 a, const u64 n) { #if defined (_MSC_VER) return _rotr64 (a, n); #else return ((a >> n) | (a << (64 - n))); #endif } u16 byte_swap_16 (const u16 n) { return (n & 0xff00) >> 8 | (n & 0x00ff) << 8; } u32 byte_swap_32 (const u32 n) { #if defined (_MSC_VER) return _byteswap_ulong (n); #elif defined (__clang__) || defined (__GNUC__) return __builtin_bswap32 (n); #else return (n & 0xff000000) >> 24 | (n & 0x00ff0000) >> 8 | (n & 0x0000ff00) << 8 | (n & 0x000000ff) << 24; #endif } u64 byte_swap_64 (const u64 n) { #if defined (_MSC_VER) return _byteswap_uint64 (n); #elif defined (__clang__) || defined (__GNUC__) return __builtin_bswap64 (n); #else 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; #endif } hashcat-4.0.1/src/combinator.c000066400000000000000000000202211320027462700162170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "event.h" #include "memory.h" #include "combinator.h" #include "shared.h" #include "wordlist.h" int combinator_ctx_init (hashcat_ctx_t *hashcat_ctx) { combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; user_options_t *user_options = hashcat_ctx->user_options; combinator_ctx->enabled = false; if (user_options->example_hashes == true) return 0; if (user_options->left == true) return 0; if (user_options->opencl_info == true) return 0; if (user_options->show == true) return 0; if (user_options->usage == true) return 0; if (user_options->version == true) return 0; if ((user_options->attack_mode != ATTACK_MODE_COMBI) && (user_options->attack_mode != ATTACK_MODE_HYBRID1) && (user_options->attack_mode != ATTACK_MODE_HYBRID2)) return 0; combinator_ctx->enabled = true; combinator_ctx->scratch_buf = (char *) hcmalloc (HCBUFSIZ_LARGE); if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { if (user_options->attack_mode == ATTACK_MODE_COMBI) { // display char *dictfile1 = user_options_extra->hc_workv[0]; char *dictfile2 = user_options_extra->hc_workv[1]; // at this point we know the file actually exist // find the bigger dictionary and use as base if (hc_path_is_file (dictfile1) == false) { event_log_error (hashcat_ctx, "%s: Not a regular file.", dictfile1); return -1; } if (hc_path_is_file (dictfile2) == false) { event_log_error (hashcat_ctx, "%s: Not a regular file.", dictfile2); return -1; } FILE *fp1 = NULL; FILE *fp2 = NULL; if ((fp1 = fopen (dictfile1, "rb")) == NULL) { event_log_error (hashcat_ctx, "%s: %s", dictfile1, strerror (errno)); return -1; } if ((fp2 = fopen (dictfile2, "rb")) == NULL) { event_log_error (hashcat_ctx, "%s: %s", dictfile2, strerror (errno)); fclose (fp1); return -1; } combinator_ctx->combs_cnt = 1; u64 words1_cnt = 0; const int rc1 = count_words (hashcat_ctx, fp1, dictfile1, &words1_cnt); if (rc1 == -1) { event_log_error (hashcat_ctx, "Integer overflow detected in keyspace of wordlist: %s", dictfile1); fclose (fp1); fclose (fp2); return -1; } if (words1_cnt == 0) { event_log_error (hashcat_ctx, "%s: empty file.", dictfile1); fclose (fp1); fclose (fp2); return -1; } combinator_ctx->combs_cnt = 1; u64 words2_cnt = 0; const int rc2 = count_words (hashcat_ctx, fp2, dictfile2, &words2_cnt); if (rc2 == -1) { event_log_error (hashcat_ctx, "Integer overflow detected in keyspace of wordlist: %s", dictfile2); fclose (fp1); fclose (fp2); return -1; } if (words2_cnt == 0) { event_log_error (hashcat_ctx, "%s: empty file.", dictfile2); fclose (fp1); fclose (fp2); return -1; } fclose (fp1); fclose (fp2); combinator_ctx->dict1 = dictfile1; combinator_ctx->dict2 = dictfile2; if (words1_cnt >= words2_cnt) { combinator_ctx->combs_mode = COMBINATOR_MODE_BASE_LEFT; combinator_ctx->combs_cnt = words2_cnt; } else { combinator_ctx->combs_mode = COMBINATOR_MODE_BASE_RIGHT; combinator_ctx->combs_cnt = words1_cnt; // we also have to switch wordlist related rules! char *tmpc = user_options->rule_buf_l; user_options->rule_buf_l = user_options->rule_buf_r; user_options->rule_buf_r = tmpc; u32 tmpi = user_options_extra->rule_len_l; user_options_extra->rule_len_l = user_options_extra->rule_len_r; user_options_extra->rule_len_r = tmpi; } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { combinator_ctx->combs_mode = COMBINATOR_MODE_BASE_LEFT; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { combinator_ctx->combs_mode = COMBINATOR_MODE_BASE_RIGHT; } } else { // this is always need to be COMBINATOR_MODE_BASE_LEFT if (user_options->attack_mode == ATTACK_MODE_COMBI) { // display char *dictfile1 = user_options_extra->hc_workv[0]; char *dictfile2 = user_options_extra->hc_workv[1]; // at this point we know the file actually exist // find the bigger dictionary and use as base if (hc_path_is_file (dictfile1) == false) { event_log_error (hashcat_ctx, "%s: Not a regular file.", dictfile1); return -1; } if (hc_path_is_file (dictfile2) == false) { event_log_error (hashcat_ctx, "%s: Not a regular file.", dictfile2); return -1; } FILE *fp1 = NULL; FILE *fp2 = NULL; if ((fp1 = fopen (dictfile1, "rb")) == NULL) { event_log_error (hashcat_ctx, "%s: %s", dictfile1, strerror (errno)); return -1; } if ((fp2 = fopen (dictfile2, "rb")) == NULL) { event_log_error (hashcat_ctx, "%s: %s", dictfile2, strerror (errno)); fclose (fp1); return -1; } combinator_ctx->combs_cnt = 1; u64 words1_cnt = 0; const int rc1 = count_words (hashcat_ctx, fp1, dictfile1, &words1_cnt); if (rc1 == -1) { event_log_error (hashcat_ctx, "Integer overflow detected in keyspace of wordlist: %s", dictfile1); fclose (fp1); fclose (fp2); return -1; } if (words1_cnt == 0) { event_log_error (hashcat_ctx, "%s: empty file.", dictfile1); fclose (fp1); fclose (fp2); return -1; } combinator_ctx->combs_cnt = 1; u64 words2_cnt = 0; const int rc2 = count_words (hashcat_ctx, fp2, dictfile2, &words2_cnt); if (rc2 == -1) { event_log_error (hashcat_ctx, "Integer overflow detected in keyspace of wordlist: %s", dictfile2); fclose (fp1); fclose (fp2); return -1; } if (words2_cnt == 0) { event_log_error (hashcat_ctx, "%s: empty file.", dictfile2); fclose (fp1); fclose (fp2); return -1; } fclose (fp1); fclose (fp2); combinator_ctx->dict1 = dictfile1; combinator_ctx->dict2 = dictfile2; combinator_ctx->combs_mode = COMBINATOR_MODE_BASE_LEFT; combinator_ctx->combs_cnt = words2_cnt; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { combinator_ctx->combs_mode = COMBINATOR_MODE_BASE_LEFT; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; char *dictfile = user_options_extra->hc_workv[1]; // at this point we know the file actually exist if (hc_path_is_file (dictfile) == false) { event_log_error (hashcat_ctx, "%s: Not a regular file.", dictfile); return -1; } FILE *fp = NULL; if ((fp = fopen (dictfile, "rb")) == NULL) { event_log_error (hashcat_ctx, "%s: %s", dictfile, strerror (errno)); return -1; } mask_ctx->bfs_cnt = 1; u64 words_cnt = 0; const int rc = count_words (hashcat_ctx, fp, dictfile, &words_cnt); if (rc == -1) { event_log_error (hashcat_ctx, "Integer overflow detected in keyspace of wordlist: %s", dictfile); fclose (fp); return -1; } fclose (fp); combinator_ctx->combs_cnt = words_cnt; combinator_ctx->combs_mode = COMBINATOR_MODE_BASE_LEFT; } } return 0; } void combinator_ctx_destroy (hashcat_ctx_t *hashcat_ctx) { combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; if (combinator_ctx->enabled == false) return; hcfree (combinator_ctx->scratch_buf); memset (combinator_ctx, 0, sizeof (combinator_ctx_t)); } hashcat-4.0.1/src/common.c000066400000000000000000000001301320027462700153470ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" hashcat-4.0.1/src/convert.c000066400000000000000000000453741320027462700155620ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "convert.h" #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 70101 #define FALLTHROUGH __attribute__ ((fallthrough)) #else #define FALLTHROUGH #endif static bool printable_utf8 (const u8 *buf, const int len) { u8 a; int length; const u8 *buf_end = buf + len; const u8 *srcptr; const char trailingBytesUTF8[64] = { 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, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 }; while (buf < buf_end) { // This line rejects unprintables. The rest of the function // reliably rejects invalid UTF-8 sequences. if (*buf < 0x20 || *buf == 0x7f) return false; if (*buf < 0x80) { buf++; continue; } length = trailingBytesUTF8[*buf & 0x3f] + 1; srcptr = buf + length; if (srcptr > buf_end) return false; switch (length) { default: return false; case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xbf) return false; FALLTHROUGH; case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xbf) return false; FALLTHROUGH; case 2: if ((a = (*--srcptr)) < 0x80 || a > 0xbf) return false; switch (*buf) { case 0xE0: if (a < 0xa0) return false; break; case 0xED: if (a > 0x9f) return false; break; case 0xF0: if (a < 0x90) return false; break; case 0xF4: if (a > 0x8f) return false; FALLTHROUGH; } case 1: if (*buf >= 0x80 && *buf < 0xc2) return false; } if (*buf > 0xf4) return false; buf += length; } return true; } static bool printable_ascii (const u8 *buf, const int len) { for (int i = 0; i < len; i++) { const u8 c = buf[i]; if (c < 0x20) return false; if (c > 0x7e) return false; } return true; } static bool matches_separator (const u8 *buf, const int len, const char separator) { for (int i = 0; i < len; i++) { const char c = (char) buf[i]; if (c == separator) return true; } return false; } bool is_hexify (const u8 *buf, const int len) { if (len < 6) return false; // $HEX[] = 6 // length of the hex string must be a multiple of 2 // and the length of "$HEX[]" is 6 (also an even length) // Therefore the overall length must be an even number: if ((len & 1) == 1) return false; if (buf[0] != '$') return (false); if (buf[1] != 'H') return (false); if (buf[2] != 'E') return (false); if (buf[3] != 'X') return (false); if (buf[4] != '[') return (false); if (buf[len - 1] != ']') return (false); if (is_valid_hex_string (buf + 5, len - 6) == false) return false; return true; } int exec_unhexify (const u8 *in_buf, const int in_len, u8 *out_buf, const int out_sz) { int i, j; for (i = 0, j = 5; j < in_len - 1; i += 1, j += 2) { const u8 c = hex_to_u8 (&in_buf[j]); out_buf[i] = c; } memset (out_buf + i, 0, out_sz - i); return (i); } bool need_hexify (const u8 *buf, const int len, const char separator, bool always_ascii) { bool rc = false; if (always_ascii == true) { if (printable_ascii (buf, len) == false) { rc = true; } } else { if (printable_utf8 (buf, len) == false) { rc = true; } } if (rc == false) { if (matches_separator (buf, len, separator) == true) { rc = true; } } // also test if the password is of the format $HEX[]: if (rc == false) { if (is_hexify (buf, len)) { rc = true; } } return rc; } void exec_hexify (const u8 *buf, const int len, u8 *out) { const int max_len = (len >= PW_MAX) ? PW_MAX : len; for (int i = max_len - 1, j = i * 2; i >= 0; i -= 1, j -= 2) { u8_to_hex_lower (buf[i], out + j); } out[max_len * 2] = 0; } bool is_valid_hex_string (const u8 *s, const int len) { for (int i = 0; i < len; i++) { const u8 c = s[i]; if (is_valid_hex_char (c) == false) return false; } return true; } bool is_valid_hex_char (const u8 c) { if ((c >= '0') && (c <= '9')) return true; if ((c >= 'A') && (c <= 'F')) return true; if ((c >= 'a') && (c <= 'f')) return true; return false; } u8 hex_convert (const u8 c) { return (c & 15) + (c >> 6) * 9; } u8 hex_to_u8 (const u8 hex[2]) { u8 v = 0; v |= (hex_convert (hex[1]) << 0); v |= (hex_convert (hex[0]) << 4); return (v); } u32 hex_to_u32 (const u8 hex[8]) { u32 v = 0; v |= ((u32) hex_convert (hex[1]) << 0); v |= ((u32) hex_convert (hex[0]) << 4); v |= ((u32) hex_convert (hex[3]) << 8); v |= ((u32) hex_convert (hex[2]) << 12); v |= ((u32) hex_convert (hex[5]) << 16); v |= ((u32) hex_convert (hex[4]) << 20); v |= ((u32) hex_convert (hex[7]) << 24); v |= ((u32) hex_convert (hex[6]) << 28); return (v); } u64 hex_to_u64 (const u8 hex[16]) { u64 v = 0; v |= ((u64) hex_convert (hex[ 1]) << 0); v |= ((u64) hex_convert (hex[ 0]) << 4); v |= ((u64) hex_convert (hex[ 3]) << 8); v |= ((u64) hex_convert (hex[ 2]) << 12); v |= ((u64) hex_convert (hex[ 5]) << 16); v |= ((u64) hex_convert (hex[ 4]) << 20); v |= ((u64) hex_convert (hex[ 7]) << 24); v |= ((u64) hex_convert (hex[ 6]) << 28); v |= ((u64) hex_convert (hex[ 9]) << 32); v |= ((u64) hex_convert (hex[ 8]) << 36); v |= ((u64) hex_convert (hex[11]) << 40); v |= ((u64) hex_convert (hex[10]) << 44); v |= ((u64) hex_convert (hex[13]) << 48); v |= ((u64) hex_convert (hex[12]) << 52); v |= ((u64) hex_convert (hex[15]) << 56); v |= ((u64) hex_convert (hex[14]) << 60); return (v); } void u8_to_hex_lower (const u8 v, u8 hex[2]) { const u8 tbl[0x10] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', }; hex[1] = tbl[v >> 0 & 15]; hex[0] = tbl[v >> 4 & 15]; } void u32_to_hex_lower (const u32 v, u8 hex[8]) { const u8 tbl[0x10] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', }; hex[1] = tbl[v >> 0 & 15]; hex[0] = tbl[v >> 4 & 15]; hex[3] = tbl[v >> 8 & 15]; hex[2] = tbl[v >> 12 & 15]; hex[5] = tbl[v >> 16 & 15]; hex[4] = tbl[v >> 20 & 15]; hex[7] = tbl[v >> 24 & 15]; hex[6] = tbl[v >> 28 & 15]; } void u64_to_hex_lower (const u64 v, u8 hex[16]) { const u8 tbl[0x10] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', }; hex[ 1] = tbl[v >> 0 & 15]; hex[ 0] = tbl[v >> 4 & 15]; hex[ 3] = tbl[v >> 8 & 15]; hex[ 2] = tbl[v >> 12 & 15]; hex[ 5] = tbl[v >> 16 & 15]; hex[ 4] = tbl[v >> 20 & 15]; hex[ 7] = tbl[v >> 24 & 15]; hex[ 6] = tbl[v >> 28 & 15]; hex[ 9] = tbl[v >> 32 & 15]; hex[ 8] = tbl[v >> 36 & 15]; hex[11] = tbl[v >> 40 & 15]; hex[10] = tbl[v >> 44 & 15]; hex[13] = tbl[v >> 48 & 15]; hex[12] = tbl[v >> 52 & 15]; hex[15] = tbl[v >> 56 & 15]; hex[14] = tbl[v >> 60 & 15]; } u8 int_to_base32 (const u8 c) { const u8 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[c]; } u8 base32_to_int (const u8 c) { if ((c >= 'A') && (c <= 'Z')) return c - 'A'; if ((c >= '2') && (c <= '7')) return c - '2' + 26; return 0; } u8 int_to_itoa32 (const u8 c) { const u8 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[c]; } u8 itoa32_to_int (const u8 c) { if ((c >= '0') && (c <= '9')) return c - '0'; if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10; return 0; } u8 int_to_itoa64 (const u8 c) { const u8 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[c]; } u8 itoa64_to_int (const u8 c) { const u8 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[c]; } u8 int_to_base64 (const u8 c) { const u8 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[c]; } u8 base64_to_int (const u8 c) { const u8 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[c]; } u8 int_to_bf64 (const u8 c) { const u8 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[c]; } u8 bf64_to_int (const u8 c) { const u8 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[c]; } u8 int_to_lotus64 (const u8 c) { if (c < 10) return '0' + c; if (c < 36) return 'A' + c - 10; if (c < 62) return 'a' + c - 36; if (c == 62) return '+'; if (c == 63) return '/'; return 0; } u8 lotus64_to_int (const u8 c) { if ((c >= '0') && (c <= '9')) return c - '0'; if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10; if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36; if (c == '+') return 62; if (c == '/') return 63; return 0; } int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf) { const u8 *in_ptr = in_buf; u8 *out_ptr = out_buf; for (int i = 0; i < in_len; i += 8) { const u8 out_val0 = f (in_ptr[0] & 0x7f); const u8 out_val1 = f (in_ptr[1] & 0x7f); const u8 out_val2 = f (in_ptr[2] & 0x7f); const u8 out_val3 = f (in_ptr[3] & 0x7f); const u8 out_val4 = f (in_ptr[4] & 0x7f); const u8 out_val5 = f (in_ptr[5] & 0x7f); const u8 out_val6 = f (in_ptr[6] & 0x7f); const u8 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 (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf) { const u8 *in_ptr = in_buf; u8 *out_ptr = out_buf; for (int i = 0; i < in_len; i += 5) { const u8 out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f)); const u8 out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03)); const u8 out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f)); const u8 out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f)); const u8 out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01)); const u8 out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f)); const u8 out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07)); const u8 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 = (int) (((0.5 + in_len) * 8) / 5); // ceil (in_len * 8 / 5) while (out_len % 8) { out_buf[out_len] = '='; out_len++; } return out_len; } int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf) { const u8 *in_ptr = in_buf; u8 *out_ptr = out_buf; for (int i = 0; i < in_len; i += 4) { const u8 out_val0 = f (in_ptr[0] & 0x7f); const u8 out_val1 = f (in_ptr[1] & 0x7f); const u8 out_val2 = f (in_ptr[2] & 0x7f); const u8 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 (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf) { const u8 *in_ptr = in_buf; u8 *out_ptr = out_buf; for (int i = 0; i < in_len; i += 3) { const u8 out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f)); const u8 out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f)); const u8 out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03)); const u8 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 = (int) (((0.5 + in_len) * 8) / 6); // ceil (in_len * 8 / 6) while (out_len % 4) { out_buf[out_len] = '='; out_len++; } return out_len; } void lowercase (u8 *buf, int len) { for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]); } void uppercase (u8 *buf, int len) { for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]); } hashcat-4.0.1/src/cpt.c000066400000000000000000000026521320027462700146600ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "cpt.h" #include "shared.h" int cpt_ctx_init (hashcat_ctx_t *hashcat_ctx) { cpt_ctx_t *cpt_ctx = hashcat_ctx->cpt_ctx; user_options_t *user_options = hashcat_ctx->user_options; cpt_ctx->enabled = false; if (user_options->example_hashes == true) return 0; if (user_options->keyspace == true) return 0; if (user_options->left == true) return 0; if (user_options->opencl_info == true) return 0; if (user_options->show == true) return 0; if (user_options->usage == true) return 0; if (user_options->version == true) return 0; cpt_ctx->enabled = true; cpt_ctx->cpt_buf = (cpt_t *) hccalloc (CPT_CACHE, sizeof (cpt_t)); cpt_ctx->cpt_total = 0; cpt_ctx->cpt_pos = 0; cpt_ctx->cpt_start = hc_time (NULL); return 0; } void cpt_ctx_destroy (hashcat_ctx_t *hashcat_ctx) { cpt_ctx_t *cpt_ctx = hashcat_ctx->cpt_ctx; if (cpt_ctx->enabled == false) return; hcfree (cpt_ctx->cpt_buf); memset (cpt_ctx, 0, sizeof (cpt_ctx_t)); } void cpt_ctx_reset (hashcat_ctx_t *hashcat_ctx) { cpt_ctx_t *cpt_ctx = hashcat_ctx->cpt_ctx; if (cpt_ctx->enabled == false) return; memset (cpt_ctx->cpt_buf, 0, CPT_CACHE * sizeof (cpt_t)); cpt_ctx->cpt_total = 0; cpt_ctx->cpt_pos = 0; cpt_ctx->cpt_start = hc_time (NULL); } hashcat-4.0.1/src/cpu_aes.c000066400000000000000000001726741320027462700155250ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define IS_GENERIC #include "common.h" #include "types.h" #include "bitops.h" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "cpu_aes.h" static const 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, }; static const 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, }; static const 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, }; static const 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, }; static const 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, }; static const 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, }; static const 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, }; static const 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, }; static const 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, }; static const 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, }; static const u32 rcon[] = { 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x1b000000, 0x36000000, }; // 128 bit static void AES128_ExpandKey (const u32 *userkey, u32 *rek) { u32 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) { u32 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 (u32 *rdk) { int i; int j; for (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 (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 u32 *in, u32 *out, const u32 *rek) { u32 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]); u32 s0 = in_s[0] ^ rek[0]; u32 s1 = in_s[1] ^ rek[1]; u32 s2 = in_s[2] ^ rek[2]; u32 s3 = in_s[3] ^ rek[3]; u32 t0; u32 t1; u32 t2; u32 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 u32 *in, u32 *out, const u32 *rdk) { u32 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]); u32 s0 = in_s[0] ^ rdk[0]; u32 s1 = in_s[1] ^ rdk[1]; u32 s2 = in_s[2] ^ rdk[2]; u32 s3 = in_s[3] ^ rdk[3]; u32 t0; u32 t1; u32 t2; u32 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 u32 *userkey, u32 *rek) { u32 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) { u32 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 (u32 *rdk) { 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] = 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 u32 *in, u32 *out, const u32 *rek) { u32 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]); u32 s0 = in_s[0] ^ rek[0]; u32 s1 = in_s[1] ^ rek[1]; u32 s2 = in_s[2] ^ rek[2]; u32 s3 = in_s[3] ^ rek[3]; u32 t0; u32 t1; u32 t2; u32 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 u32 *in, u32 *out, const u32 *rdk) { u32 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]); u32 s0 = in_s[0] ^ rdk[0]; u32 s1 = in_s[1] ^ rdk[1]; u32 s2 = in_s[2] ^ rdk[2]; u32 s3 = in_s[3] ^ rdk[3]; u32 t0; u32 t1; u32 t2; u32 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 (const u8 *key, int keysize, AES_KEY *aes_key) { aes_key->bits = keysize; if (aes_key->bits == 128) { AES128_ExpandKey ((const u32 *) key, aes_key->rek); } else if (aes_key->bits == 256) { AES256_ExpandKey ((const u32 *) key, aes_key->rek); } } void AES_set_decrypt_key (const u8 *key, int keysize, AES_KEY *aes_key) { aes_key->bits = keysize; if (aes_key->bits == 128) { AES128_ExpandKey ((const u32 *) key, aes_key->rdk); AES128_InvertKey (aes_key->rdk); } else if (aes_key->bits == 256) { AES256_ExpandKey ((const u32 *) key, aes_key->rdk); AES256_InvertKey (aes_key->rdk); } } void AES_encrypt (AES_KEY *aes_key, const u8 *input, u8 *output) { if (aes_key->bits == 128) { AES128_encrypt ((const u32 *) input, (u32 *) output, aes_key->rek); } else if (aes_key->bits == 256) { AES256_encrypt ((const u32 *) input, (u32 *) output, aes_key->rek); } } void AES_decrypt (AES_KEY *aes_key, const u8 *input, u8 *output) { if (aes_key->bits == 128) { AES128_decrypt ((const u32 *) input, (u32 *) output, aes_key->rdk); } else if (aes_key->bits == 256) { AES256_decrypt ((const u32 *) input, (u32 *) output, aes_key->rdk); } } // helper void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16]) { AES_KEY skey; AES_set_decrypt_key ((const u8 *) key, 128, &skey); u32 _iv[4] = { 0 }; _iv[0] = iv[0]; _iv[1] = iv[1]; _iv[2] = iv[2]; _iv[3] = iv[3]; for (int i = 0; i < 16; i += 4) { u32 _in[4] = { 0 }; u32 _out[4] = { 0 }; _in[0] = in[i + 0]; _in[1] = in[i + 1]; _in[2] = in[i + 2]; _in[3] = in[i + 3]; AES_decrypt (&skey, (const u8 *) _in, (u8 *) _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]; } } hashcat-4.0.1/src/cpu_crc32.c000066400000000000000000000106341320027462700156540ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "shared.h" #include "cpu_crc32.h" static const u32 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 }; u32 cpu_crc32_buffer (const u8 *buf, const size_t length) { u32 crc = ~0u; for (size_t pos = 0; pos < length; pos++) { crc = crc32tab[(crc ^ buf[pos]) & 0xff] ^ (crc >> 8); } return crc ^ 0xffffffff;; } int cpu_crc32 (hashcat_ctx_t *hashcat_ctx, const char *filename, u8 keytab[64]) { u32 crc = ~0u; FILE *fd = fopen (filename, "rb"); if (fd == NULL) { event_log_error (hashcat_ctx, "%s: %s", filename, strerror (errno)); return -1; } #define MAX_KEY_SIZE (1024 * 1024) u8 *buf = (u8 *) hcmalloc (MAX_KEY_SIZE + 1); size_t nread = hc_fread (buf, sizeof (u8), MAX_KEY_SIZE, fd); fclose (fd); size_t kpos = 0; for (size_t fpos = 0; fpos < nread; fpos++) { crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8); keytab[kpos++] += (crc >> 24) & 0xff; if (kpos >= 64) kpos = 0; keytab[kpos++] += (crc >> 16) & 0xff; if (kpos >= 64) kpos = 0; keytab[kpos++] += (crc >> 8) & 0xff; if (kpos >= 64) kpos = 0; keytab[kpos++] += (crc >> 0) & 0xff; if (kpos >= 64) kpos = 0; } hcfree (buf); return 0; } hashcat-4.0.1/src/cpu_des.c000066400000000000000000000410311320027462700155060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define IS_GENERIC #include "common.h" #include "types.h" #include "bitops.h" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "cpu_des.h" #define BOX(v,i,S) (S)[(i)][(v)] static const 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, }, }; static const 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 } }; void _des_keysetup (const u32 data[2], u32 Kc[16], u32 Kd[16]) { u32 c = data[0]; u32 d = data[1]; u32 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 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; u32 s = BOX ((( c >> 0) & 0x3f), 0, c_skb) | BOX ((((c >> 6) & 0x03) | ((c >> 7) & 0x3c)), 1, c_skb) | BOX ((((c >> 13) & 0x0f) | ((c >> 14) & 0x30)), 2, c_skb) | BOX ((((c >> 20) & 0x01) | ((c >> 21) & 0x06) | ((c >> 22) & 0x38)), 3, c_skb); u32 t = BOX ((( d >> 0) & 0x3f), 4, c_skb) | BOX ((((d >> 7) & 0x03) | ((d >> 8) & 0x3c)), 5, c_skb) | BOX ((((d >> 15) & 0x3f)), 6, c_skb) | BOX ((((d >> 21) & 0x0f) | ((d >> 22) & 0x30)), 7, c_skb); Kc[i] = ((t << 16) | (s & 0x0000ffff)); Kd[i] = ((s >> 16) | (t & 0xffff0000)); Kc[i] = rotl32 (Kc[i], 2u); Kd[i] = rotl32 (Kd[i], 2u); } } void _des_encrypt (u32 data[2], const u32 Kc[16], const u32 Kd[16]) { u32 r = data[0]; u32 l = data[1]; u32 tt; IP (r, l, tt); r = rotl32 (r, 3u); l = rotl32 (l, 3u); int i; for (i = 0; i < 16; i++) { u32 u = Kc[i] ^ r; u32 t = Kd[i] ^ rotl32 (r, 28u); l ^= BOX (((u >> 2) & 0x3f), 0, c_SPtrans) | BOX (((u >> 10) & 0x3f), 2, c_SPtrans) | BOX (((u >> 18) & 0x3f), 4, c_SPtrans) | BOX (((u >> 26) & 0x3f), 6, c_SPtrans) | BOX (((t >> 2) & 0x3f), 1, c_SPtrans) | BOX (((t >> 10) & 0x3f), 3, c_SPtrans) | BOX (((t >> 18) & 0x3f), 5, c_SPtrans) | BOX (((t >> 26) & 0x3f), 7, c_SPtrans); tt = l; l = r; r = tt; } l = rotl32 (l, 29u); r = rotl32 (r, 29u); FP (r, l, tt); data[0] = l; data[1] = r; } hashcat-4.0.1/src/cpu_md4.c000066400000000000000000000067051320027462700154300ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define IS_GENERIC #include "common.h" #include "types.h" #include "bitops.h" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "cpu_md4.h" void md4_64 (const u32 block[16], u32 digest[4]) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = block[ 0]; w0[1] = block[ 1]; w0[2] = block[ 2]; w0[3] = block[ 3]; w1[0] = block[ 4]; w1[1] = block[ 5]; w1[2] = block[ 6]; w1[3] = block[ 7]; w2[0] = block[ 8]; w2[1] = block[ 9]; w2[2] = block[10]; w2[3] = block[11]; w3[0] = block[12]; w3[1] = block[13]; w3[2] = block[14]; w3[3] = block[15]; u32 a = digest[0]; u32 b = digest[1]; u32 c = digest[2]; u32 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; } hashcat-4.0.1/src/cpu_md5.c000066400000000000000000000236021320027462700154240ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define IS_GENERIC #include "common.h" #include "types.h" #include "bitops.h" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "cpu_md5.h" void md5_64 (const u32 block[16], u32 digest[4]) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = block[ 0]; w0[1] = block[ 1]; w0[2] = block[ 2]; w0[3] = block[ 3]; w1[0] = block[ 4]; w1[1] = block[ 5]; w1[2] = block[ 6]; w1[3] = block[ 7]; w2[0] = block[ 8]; w2[1] = block[ 9]; w2[2] = block[10]; w2[3] = block[11]; w3[0] = block[12]; w3[1] = block[13]; w3[2] = block[14]; w3[3] = block[15]; u32 a = digest[0]; u32 b = digest[1]; u32 c = digest[2]; u32 d = digest[3]; 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); 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 (u32 digest[4], u32 *plain, u32 plain_len) { u32 a = MD5M_A; u32 b = MD5M_B; u32 c = MD5M_C; u32 d = MD5M_D; digest[0] = a; digest[1] = b; digest[2] = c; digest[3] = d; u32 r_a = digest[0]; u32 r_b = digest[1]; u32 r_c = digest[2]; u32 r_d = digest[3]; u32 block[16]; int block_total_len = 16 * 4; // sizeof (block) char *block_ptr = (char *) block; char *plain_ptr = (char *) plain; // init int remaining_len = (int) plain_len; // loop u32 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 // initialize the block memset (block_ptr, 0, block_total_len); // copy the bytes from the plain pointer (plain_ptr) memcpy (block_ptr, plain_ptr, (size_t) copy_len); /* * final block */ // set 0x80 if needed if (cur_len >= 0) { if (copy_len < block_total_len) { block_ptr[copy_len] = (char) 0x80; } } // set block[14] set to total_len if (! loop) block[14] = plain_len * 8; /* * md5 () */ u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; w0[0] = block[ 0]; w0[1] = block[ 1]; w0[2] = block[ 2]; w0[3] = block[ 3]; w1[0] = block[ 4]; w1[1] = block[ 5]; w1[2] = block[ 6]; w1[3] = block[ 7]; w2[0] = block[ 8]; w2[1] = block[ 9]; w2[2] = block[10]; w2[3] = block[11]; w3[0] = block[12]; w3[1] = block[13]; w3[2] = block[14]; w3[3] = block[15]; 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); 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]; } } hashcat-4.0.1/src/cpu_sha1.c000066400000000000000000000170221320027462700155720ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define IS_GENERIC #include "common.h" #include "types.h" #include "bitops.h" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "cpu_sha1.h" void sha1_64 (const u32 block[16], u32 digest[5]) { u32 a = digest[0]; u32 b = digest[1]; u32 c = digest[2]; u32 d = digest[3]; u32 e = digest[4]; u32 w0_t = block[ 0]; u32 w1_t = block[ 1]; u32 w2_t = block[ 2]; u32 w3_t = block[ 3]; u32 w4_t = block[ 4]; u32 w5_t = block[ 5]; u32 w6_t = block[ 6]; u32 w7_t = block[ 7]; u32 w8_t = block[ 8]; u32 w9_t = block[ 9]; u32 wa_t = block[10]; u32 wb_t = block[11]; u32 wc_t = block[12]; u32 wd_t = block[13]; u32 we_t = block[14]; u32 wf_t = block[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; } hashcat-4.0.1/src/cpu_sha256.c000066400000000000000000000203631320027462700157500ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #define IS_GENERIC #include "common.h" #include "types.h" #include "bitops.h" #include "inc_hash_constants.h" #include "inc_hash_functions.cl" #include "cpu_sha256.h" void sha256_64 (const u32 block[16], u32 digest[8]) { u32 w0_t = block[ 0]; u32 w1_t = block[ 1]; u32 w2_t = block[ 2]; u32 w3_t = block[ 3]; u32 w4_t = block[ 4]; u32 w5_t = block[ 5]; u32 w6_t = block[ 6]; u32 w7_t = block[ 7]; u32 w8_t = block[ 8]; u32 w9_t = block[ 9]; u32 wa_t = block[10]; u32 wb_t = block[11]; u32 wc_t = block[12]; u32 wd_t = block[13]; u32 we_t = block[14]; u32 wf_t = block[15]; u32 a = digest[0]; u32 b = digest[1]; u32 c = digest[2]; u32 d = digest[3]; u32 e = digest[4]; u32 f = digest[5]; u32 g = digest[6]; u32 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; } hashcat-4.0.1/src/debugfile.c000066400000000000000000000070171320027462700160200ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "debugfile.h" #include "shared.h" #include "locking.h" static void debugfile_format_plain (hashcat_ctx_t *hashcat_ctx, const u8 *plain_ptr, const u32 plain_len) { debugfile_ctx_t *debugfile_ctx = hashcat_ctx->debugfile_ctx; if (debugfile_ctx->enabled == false) return; int needs_hexify = 0; for (u32 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 (debugfile_ctx->fp, "$HEX["); for (u32 i = 0; i < plain_len; i++) { fprintf (debugfile_ctx->fp, "%02x", plain_ptr[i]); } fprintf (debugfile_ctx->fp, "]"); } else { hc_fwrite (plain_ptr, plain_len, 1, debugfile_ctx->fp); } } void debugfile_write_append (hashcat_ctx_t *hashcat_ctx, const u8 *rule_buf, const u32 rule_len, const u8 *mod_plain_ptr, const u32 mod_plain_len, const u8 *orig_plain_ptr, const u32 orig_plain_len) { debugfile_ctx_t *debugfile_ctx = hashcat_ctx->debugfile_ctx; if (debugfile_ctx->enabled == false) return; const u32 debug_mode = debugfile_ctx->mode; if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4)) { debugfile_format_plain (hashcat_ctx, orig_plain_ptr, orig_plain_len); if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debugfile_ctx->fp); } hc_fwrite (rule_buf, rule_len, 1, debugfile_ctx->fp); if (debug_mode == 4) { fputc (':', debugfile_ctx->fp); debugfile_format_plain (hashcat_ctx, mod_plain_ptr, mod_plain_len); } hc_fwrite (EOL, strlen (EOL), 1, debugfile_ctx->fp); } int debugfile_init (hashcat_ctx_t *hashcat_ctx) { debugfile_ctx_t *debugfile_ctx = hashcat_ctx->debugfile_ctx; user_options_t *user_options = hashcat_ctx->user_options; debugfile_ctx->enabled = false; if (user_options->benchmark == true) return 0; if (user_options->example_hashes == true) return 0; if (user_options->keyspace == true) return 0; if (user_options->left == true) return 0; if (user_options->opencl_info == true) return 0; if (user_options->show == true) return 0; if (user_options->stdout_flag == true) return 0; if (user_options->speed_only == true) return 0; if (user_options->progress_only == true) return 0; if (user_options->usage == true) return 0; if (user_options->version == true) return 0; if (user_options->debug_mode == 0) return 0; debugfile_ctx->enabled = true; debugfile_ctx->mode = user_options->debug_mode; debugfile_ctx->filename = user_options->debug_file; if (debugfile_ctx->filename) { FILE *fp = fopen (debugfile_ctx->filename, "ab"); if (fp == NULL) { event_log_error (hashcat_ctx, "Could not open --debug-file file for writing."); return -1; } if (lock_file (fp) == -1) { fclose (fp); event_log_error (hashcat_ctx, "%s: %s", debugfile_ctx->filename, strerror (errno)); return -1; } debugfile_ctx->fp = fp; } else { debugfile_ctx->fp = stdout; } return 0; } void debugfile_destroy (hashcat_ctx_t *hashcat_ctx) { debugfile_ctx_t *debugfile_ctx = hashcat_ctx->debugfile_ctx; if (debugfile_ctx->enabled == false) return; if (debugfile_ctx->filename) { fclose (debugfile_ctx->fp); } memset (debugfile_ctx, 0, sizeof (debugfile_ctx_t)); } hashcat-4.0.1/src/dictstat.c000066400000000000000000000127361320027462700157150ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "bitops.h" #include "event.h" #include "dictstat.h" #include "locking.h" #include "shared.h" int sort_by_dictstat (const void *s1, const void *s2) { dictstat_t *d1 = (dictstat_t *) s1; dictstat_t *d2 = (dictstat_t *) s2; d2->stat.st_atime = d1->stat.st_atime; #if defined (STAT_NANOSECONDS_ACCESS_TIME) d2->stat.STAT_NANOSECONDS_ACCESS_TIME = d1->stat.STAT_NANOSECONDS_ACCESS_TIME; #endif const int rc_from = strcmp (d1->encoding_from, d2->encoding_from); if (rc_from != 0) return rc_from; const int rc_to = strcmp (d1->encoding_to, d2->encoding_to); if (rc_to != 0) return rc_to; return memcmp (&d1->stat, &d2->stat, sizeof (struct stat)); } int dictstat_init (hashcat_ctx_t *hashcat_ctx) { dictstat_ctx_t *dictstat_ctx = hashcat_ctx->dictstat_ctx; folder_config_t *folder_config = hashcat_ctx->folder_config; user_options_t *user_options = hashcat_ctx->user_options; dictstat_ctx->enabled = false; if (user_options->benchmark == true) return 0; if (user_options->example_hashes == true) return 0; if (user_options->keyspace == true) return 0; if (user_options->left == true) return 0; if (user_options->opencl_info == true) return 0; if (user_options->show == true) return 0; if (user_options->usage == true) return 0; if (user_options->version == true) return 0; if (user_options->attack_mode == ATTACK_MODE_BF) return 0; if (user_options->hash_mode == 3000) return 0; // this mode virtually creates words in the wordlists dictstat_ctx->enabled = true; dictstat_ctx->base = (dictstat_t *) hccalloc (MAX_DICTSTAT, sizeof (dictstat_t)); dictstat_ctx->cnt = 0; hc_asprintf (&dictstat_ctx->filename, "%s/%s", folder_config->profile_dir, DICTSTAT_FILENAME); return 0; } void dictstat_destroy (hashcat_ctx_t *hashcat_ctx) { dictstat_ctx_t *dictstat_ctx = hashcat_ctx->dictstat_ctx; if (dictstat_ctx->enabled == false) return; hcfree (dictstat_ctx->filename); hcfree (dictstat_ctx->base); memset (dictstat_ctx, 0, sizeof (dictstat_ctx_t)); } void dictstat_read (hashcat_ctx_t *hashcat_ctx) { dictstat_ctx_t *dictstat_ctx = hashcat_ctx->dictstat_ctx; if (dictstat_ctx->enabled == false) return; FILE *fp = fopen (dictstat_ctx->filename, "rb"); if (fp == NULL) { // first run, file does not exist, do not error out return; } // parse header u64 v; u64 z; const size_t nread1 = hc_fread (&v, sizeof (u64), 1, fp); const size_t nread2 = hc_fread (&z, sizeof (u64), 1, fp); if ((nread1 != 1) || (nread2 != 1)) { event_log_error (hashcat_ctx, "%s: Invalid header", dictstat_ctx->filename); fclose (fp); return; } v = byte_swap_64 (v); z = byte_swap_64 (z); if ((v & 0xffffffffffffff00) != (DICTSTAT_VERSION & 0xffffffffffffff00)) { event_log_error (hashcat_ctx, "%s: Invalid header, ignoring content", dictstat_ctx->filename); fclose (fp); return; } if (z != 0) { event_log_error (hashcat_ctx, "%s: Invalid header, ignoring content", dictstat_ctx->filename); fclose (fp); return; } if ((v & 0xff) < (DICTSTAT_VERSION & 0xff)) { event_log_warning (hashcat_ctx, "%s: Outdated header version, ignoring content", dictstat_ctx->filename); fclose (fp); return; } // parse data while (!feof (fp)) { dictstat_t d; const size_t nread = hc_fread (&d, sizeof (dictstat_t), 1, fp); if (nread == 0) continue; lsearch (&d, dictstat_ctx->base, &dictstat_ctx->cnt, sizeof (dictstat_t), sort_by_dictstat); if (dictstat_ctx->cnt == MAX_DICTSTAT) { event_log_error (hashcat_ctx, "There are too many entries in the %s database. You have to remove/rename it.", dictstat_ctx->filename); break; } } fclose (fp); } int dictstat_write (hashcat_ctx_t *hashcat_ctx) { dictstat_ctx_t *dictstat_ctx = hashcat_ctx->dictstat_ctx; if (dictstat_ctx->enabled == false) return 0; FILE *fp = fopen (dictstat_ctx->filename, "wb"); if (fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", dictstat_ctx->filename, strerror (errno)); return -1; } if (lock_file (fp) == -1) { fclose (fp); event_log_error (hashcat_ctx, "%s: %s", dictstat_ctx->filename, strerror (errno)); return -1; } // header u64 v = DICTSTAT_VERSION; u64 z = 0; v = byte_swap_64 (v); z = byte_swap_64 (z); hc_fwrite (&v, sizeof (u64), 1, fp); hc_fwrite (&z, sizeof (u64), 1, fp); // data hc_fwrite (dictstat_ctx->base, sizeof (dictstat_t), dictstat_ctx->cnt, fp); fclose (fp); return 0; } u64 dictstat_find (hashcat_ctx_t *hashcat_ctx, dictstat_t *d) { dictstat_ctx_t *dictstat_ctx = hashcat_ctx->dictstat_ctx; if (dictstat_ctx->enabled == false) return 0; dictstat_t *d_cache = (dictstat_t *) lfind (d, dictstat_ctx->base, &dictstat_ctx->cnt, sizeof (dictstat_t), sort_by_dictstat); if (d_cache == NULL) return 0; return d_cache->cnt; } void dictstat_append (hashcat_ctx_t *hashcat_ctx, dictstat_t *d) { dictstat_ctx_t *dictstat_ctx = hashcat_ctx->dictstat_ctx; if (dictstat_ctx->enabled == false) return; if (dictstat_ctx->cnt == MAX_DICTSTAT) { event_log_error (hashcat_ctx, "There are too many entries in the %s database. You have to remove/rename it.", dictstat_ctx->filename); return; } lsearch (d, dictstat_ctx->base, &dictstat_ctx->cnt, sizeof (dictstat_t), sort_by_dictstat); } hashcat-4.0.1/src/dispatch.c000066400000000000000000000455741320027462700157030ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "convert.h" #include "event.h" #include "memory.h" #include "opencl.h" #include "wordlist.h" #include "shared.h" #include "thread.h" #include "filehandling.h" #include "rp.h" #include "rp_cpu.h" #include "dispatch.h" static u64 get_lowest_words_done (const hashcat_ctx_t *hashcat_ctx) { const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; u64 words_cur = 0xffffffffffffffff; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; const u64 words_done = device_param->words_done; if (words_done < words_cur) words_cur = words_done; } // It's possible that a device's workload isn't finished right after a restore-case. // In that case, this function would return 0 and overwrite the real restore point const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; if (words_cur < status_ctx->words_cur) words_cur = status_ctx->words_cur; return words_cur; } static int set_kernel_power_final (hashcat_ctx_t *hashcat_ctx, const u32 kernel_power_final) { EVENT (EVENT_SET_KERNEL_POWER_FINAL); opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; opencl_ctx->kernel_power_final = kernel_power_final; return 0; } static u32 get_power (opencl_ctx_t *opencl_ctx, hc_device_param_t *device_param) { const u64 kernel_power_final = opencl_ctx->kernel_power_final; if (kernel_power_final) { const double device_factor = (double) device_param->hardware_power / opencl_ctx->hardware_power_all; const u64 words_left_device = (u64) CEIL (kernel_power_final * device_factor); // work should be at least the hardware power available without any accelerator const u64 work = MAX (words_left_device, device_param->hardware_power); // we need to make sure the value is not larger than the regular kernel_power const u64 work_final = MIN (work, device_param->kernel_power); return work_final; } return device_param->kernel_power; } static u32 get_work (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 max) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; user_options_t *user_options = hashcat_ctx->user_options; hc_thread_mutex_lock (status_ctx->mux_dispatcher); const u64 words_off = status_ctx->words_off; const u64 words_base = (user_options->limit == 0) ? status_ctx->words_base : MIN (user_options->limit, status_ctx->words_base); device_param->words_off = words_off; const u64 kernel_power_all = opencl_ctx->kernel_power_all; const u64 words_left = words_base - words_off; if (words_left < kernel_power_all) { if (opencl_ctx->kernel_power_final == 0) { set_kernel_power_final (hashcat_ctx, words_left); } } const u32 kernel_power = get_power (opencl_ctx, device_param); u32 work = MIN (words_left, kernel_power); work = MIN (work, max); status_ctx->words_off += work; hc_thread_mutex_unlock (status_ctx->mux_dispatcher); return work; } static int calc_stdin (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param) { user_options_t *user_options = hashcat_ctx->user_options; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; char *buf = (char *) hcmalloc (HCBUFSIZ_LARGE); bool iconv_enabled = false; iconv_t iconv_ctx = NULL; char *iconv_tmp = NULL; if (strcmp (user_options->encoding_from, user_options->encoding_to) != 0) { iconv_enabled = true; iconv_ctx = iconv_open (user_options->encoding_to, user_options->encoding_from); if (iconv_ctx == (iconv_t) -1) return -1; iconv_tmp = (char *) hcmalloc (HCBUFSIZ_TINY); } while (status_ctx->run_thread_level1 == true) { hc_thread_mutex_lock (status_ctx->mux_dispatcher); if (feof (stdin) != 0) { hc_thread_mutex_unlock (status_ctx->mux_dispatcher); break; } u32 words_extra_total = 0; memset (device_param->pws_buf, 0, device_param->size_pws); while (device_param->pws_cnt < device_param->kernel_power) { char *line_buf = fgets (buf, HCBUFSIZ_LARGE - 1, stdin); if (line_buf == NULL) break; size_t line_len = in_superchop (line_buf); line_len = convert_from_hex (hashcat_ctx, line_buf, line_len); // do the on-the-fly encoding if (iconv_enabled == true) { char *iconv_ptr = iconv_tmp; size_t iconv_sz = HCBUFSIZ_TINY; const size_t iconv_rc = iconv (iconv_ctx, &line_buf, &line_len, &iconv_ptr, &iconv_sz); if (iconv_rc == (size_t) -1) continue; line_buf = iconv_tmp; line_len = HCBUFSIZ_TINY - iconv_sz; } // post-process rule engine char rule_buf_out[RP_PASSWORD_SIZE]; if (run_rule_engine ((int) user_options_extra->rule_len_l, user_options->rule_buf_l)) { if (line_len >= RP_PASSWORD_SIZE) continue; memset (rule_buf_out, 0, sizeof (rule_buf_out)); const int rule_len_out = _old_apply_rule (user_options->rule_buf_l, (int) user_options_extra->rule_len_l, line_buf, (int) line_len, rule_buf_out); if (rule_len_out < 0) continue; line_buf = rule_buf_out; line_len = (size_t) rule_len_out; } if (line_len >= PW_MAX) continue; // hmm that's always the case, or? const u32 attack_kern = user_options_extra->attack_kern; if (attack_kern == ATTACK_KERN_STRAIGHT) { if ((line_len < hashconfig->pw_min) || (line_len > hashconfig->pw_max)) { words_extra_total++; continue; } } pw_add (device_param, (u8 *) line_buf, (int) line_len); while (status_ctx->run_thread_level1 == false) break; } hc_thread_mutex_unlock (status_ctx->mux_dispatcher); if (words_extra_total > 0) { hc_thread_mutex_lock (status_ctx->mux_counter); for (u32 salt_pos = 0; salt_pos < hashes->salts_cnt; salt_pos++) { status_ctx->words_progress_rejected[salt_pos] += words_extra_total * straight_ctx->kernel_rules_cnt; } hc_thread_mutex_unlock (status_ctx->mux_counter); } if (status_ctx->run_thread_level1 == false) break; if (device_param->pws_cnt == 0) break; // flush int CL_rc; CL_rc = run_copy (hashcat_ctx, device_param, device_param->pws_cnt); if (CL_rc == -1) { hcfree (buf); return -1; } CL_rc = run_cracker (hashcat_ctx, device_param, device_param->pws_cnt); if (CL_rc == -1) { hcfree (buf); return -1; } device_param->pws_cnt = 0; if (status_ctx->run_thread_level1 == false) break; if (user_options->speed_only == true) break; } device_param->kernel_accel = 0; device_param->kernel_loops = 0; if (iconv_enabled == true) { iconv_close (iconv_ctx); hcfree (iconv_tmp); } hcfree (buf); return 0; } void *thread_calc_stdin (void *p) { thread_param_t *thread_param = (thread_param_t *) p; hashcat_ctx_t *hashcat_ctx = thread_param->hashcat_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (opencl_ctx->enabled == false) return NULL; hc_device_param_t *device_param = opencl_ctx->devices_param + thread_param->tid; if (device_param->skipped) return NULL; calc_stdin (hashcat_ctx, device_param); // we should check the RC here return NULL; } static int calc (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param) { user_options_t *user_options = hashcat_ctx->user_options; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; const u32 attack_mode = user_options->attack_mode; const u32 attack_kern = user_options_extra->attack_kern; if ((attack_mode == ATTACK_MODE_BF) || (((hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) == 0) && (attack_mode == ATTACK_MODE_HYBRID2))) { if (((hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) == 0) && (attack_mode == ATTACK_MODE_HYBRID2)) { char *dictfile = straight_ctx->dict; FILE *combs_fp = fopen (dictfile, "rb"); if (combs_fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", dictfile, strerror (errno)); return -1; } device_param->combs_fp = combs_fp; } while (status_ctx->run_thread_level1 == true) { const u32 work = get_work (hashcat_ctx, device_param, -1u); if (work == 0) break; const u64 words_off = device_param->words_off; const u64 words_fin = words_off + work; device_param->pws_cnt = work; int CL_rc; CL_rc = run_copy (hashcat_ctx, device_param, device_param->pws_cnt); if (CL_rc == -1) return -1; CL_rc = run_cracker (hashcat_ctx, device_param, device_param->pws_cnt); if (CL_rc == -1) return -1; device_param->pws_cnt = 0; if (user_options->speed_only == true) break; if (status_ctx->run_thread_level2 == true) { device_param->words_done = words_fin; status_ctx->words_cur = get_lowest_words_done (hashcat_ctx); } if (status_ctx->run_thread_level1 == false) break; } } else { char *dictfile = straight_ctx->dict; if (attack_mode == ATTACK_MODE_COMBI) { if (combinator_ctx->combs_mode == COMBINATOR_MODE_BASE_LEFT) { dictfile = combinator_ctx->dict1; } else { dictfile = combinator_ctx->dict2; } const u32 combs_mode = combinator_ctx->combs_mode; if (combs_mode == COMBINATOR_MODE_BASE_LEFT) { const char *dictfilec = combinator_ctx->dict2; FILE *combs_fp = fopen (dictfilec, "rb"); if (combs_fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", combinator_ctx->dict2, strerror (errno)); return -1; } device_param->combs_fp = combs_fp; } else if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) { const char *dictfilec = combinator_ctx->dict1; FILE *combs_fp = fopen (dictfilec, "rb"); if (combs_fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", dictfilec, strerror (errno)); return -1; } device_param->combs_fp = combs_fp; } } FILE *fd = fopen (dictfile, "rb"); if (fd == NULL) { event_log_error (hashcat_ctx, "%s: %s", dictfile, strerror (errno)); return -1; } hashcat_ctx_t *hashcat_ctx_tmp = (hashcat_ctx_t *) hcmalloc (sizeof (hashcat_ctx_t)); /* hashcat_ctx_tmp->bitmap_ctx = hashcat_ctx->bitmap_ctx; hashcat_ctx_tmp->combinator_ctx = hashcat_ctx->combinator_ctx; hashcat_ctx_tmp->cpt_ctx = hashcat_ctx->cpt_ctx; hashcat_ctx_tmp->debugfile_ctx = hashcat_ctx->debugfile_ctx; hashcat_ctx_tmp->dictstat_ctx = hashcat_ctx->dictstat_ctx; hashcat_ctx_tmp->folder_config = hashcat_ctx->folder_config; hashcat_ctx_tmp->hashconfig = hashcat_ctx->hashconfig; hashcat_ctx_tmp->hashes = hashcat_ctx->hashes; hashcat_ctx_tmp->hwmon_ctx = hashcat_ctx->hwmon_ctx; hashcat_ctx_tmp->induct_ctx = hashcat_ctx->induct_ctx; hashcat_ctx_tmp->logfile_ctx = hashcat_ctx->logfile_ctx; hashcat_ctx_tmp->loopback_ctx = hashcat_ctx->loopback_ctx; hashcat_ctx_tmp->mask_ctx = hashcat_ctx->mask_ctx; hashcat_ctx_tmp->opencl_ctx = hashcat_ctx->opencl_ctx; hashcat_ctx_tmp->outcheck_ctx = hashcat_ctx->outcheck_ctx; hashcat_ctx_tmp->outfile_ctx = hashcat_ctx->outfile_ctx; hashcat_ctx_tmp->potfile_ctx = hashcat_ctx->potfile_ctx; hashcat_ctx_tmp->restore_ctx = hashcat_ctx->restore_ctx; hashcat_ctx_tmp->status_ctx = hashcat_ctx->status_ctx; hashcat_ctx_tmp->straight_ctx = hashcat_ctx->straight_ctx; hashcat_ctx_tmp->tuning_db = hashcat_ctx->tuning_db; hashcat_ctx_tmp->user_options_extra = hashcat_ctx->user_options_extra; hashcat_ctx_tmp->user_options = hashcat_ctx->user_options; */ memcpy (hashcat_ctx_tmp, hashcat_ctx, sizeof (hashcat_ctx_t)); // yes we actually want to copy these pointers hashcat_ctx_tmp->wl_data = (wl_data_t *) hcmalloc (sizeof (wl_data_t)); const int rc_wl_data_init = wl_data_init (hashcat_ctx_tmp); if (rc_wl_data_init == -1) { if (attack_mode == ATTACK_MODE_COMBI) fclose (device_param->combs_fp); fclose (fd); hcfree (hashcat_ctx_tmp->wl_data); hcfree (hashcat_ctx_tmp); return -1; } u64 words_cur = 0; while (status_ctx->run_thread_level1 == true) { u64 words_off = 0; u64 words_fin = 0; u32 words_extra = -1u; u32 words_extra_total = 0; memset (device_param->pws_buf, 0, device_param->size_pws); while (words_extra) { const u32 work = get_work (hashcat_ctx, device_param, words_extra); if (work == 0) break; words_extra = 0; words_off = device_param->words_off; words_fin = words_off + work; char *line_buf; u32 line_len; char rule_buf_out[RP_PASSWORD_SIZE]; for ( ; words_cur < words_off; words_cur++) get_next_word (hashcat_ctx_tmp, fd, &line_buf, &line_len); for ( ; words_cur < words_fin; words_cur++) { get_next_word (hashcat_ctx_tmp, fd, &line_buf, &line_len); line_len = convert_from_hex (hashcat_ctx, line_buf, line_len); // post-process rule engine if (run_rule_engine ((int) user_options_extra->rule_len_l, user_options->rule_buf_l)) { if (line_len >= RP_PASSWORD_SIZE) continue; memset (rule_buf_out, 0, sizeof (rule_buf_out)); const int rule_len_out = _old_apply_rule (user_options->rule_buf_l, (int) user_options_extra->rule_len_l, line_buf, (int) line_len, rule_buf_out); if (rule_len_out < 0) continue; line_buf = rule_buf_out; line_len = (u32) rule_len_out; } if (attack_kern == ATTACK_KERN_STRAIGHT) { if ((line_len < hashconfig->pw_min) || (line_len > hashconfig->pw_max)) { words_extra++; continue; } } else if (attack_kern == ATTACK_KERN_COMBI) { // do not check if minimum restriction is satisfied (line_len >= hashconfig->pw_min) here // since we still need to combine the plains if (line_len > hashconfig->pw_max) { words_extra++; continue; } } pw_add (device_param, (u8 *) line_buf, (int) line_len); if (status_ctx->run_thread_level1 == false) break; } words_extra_total += words_extra; if (status_ctx->run_thread_level1 == false) break; } if (status_ctx->run_thread_level1 == false) break; if (words_extra_total > 0) { hc_thread_mutex_lock (status_ctx->mux_counter); for (u32 salt_pos = 0; salt_pos < hashes->salts_cnt; salt_pos++) { if (attack_kern == ATTACK_KERN_STRAIGHT) { status_ctx->words_progress_rejected[salt_pos] += words_extra_total * straight_ctx->kernel_rules_cnt; } else if (attack_kern == ATTACK_KERN_COMBI) { status_ctx->words_progress_rejected[salt_pos] += words_extra_total * combinator_ctx->combs_cnt; } } hc_thread_mutex_unlock (status_ctx->mux_counter); } // // flush // const u32 pws_cnt = device_param->pws_cnt; if (pws_cnt) { int CL_rc; CL_rc = run_copy (hashcat_ctx, device_param, pws_cnt); if (CL_rc == -1) { if (attack_mode == ATTACK_MODE_COMBI) fclose (device_param->combs_fp); fclose (fd); hcfree (hashcat_ctx_tmp->wl_data); hcfree (hashcat_ctx_tmp); return -1; } CL_rc = run_cracker (hashcat_ctx, device_param, pws_cnt); if (CL_rc == -1) { if (attack_mode == ATTACK_MODE_COMBI) fclose (device_param->combs_fp); fclose (fd); hcfree (hashcat_ctx_tmp->wl_data); hcfree (hashcat_ctx_tmp); return -1; } device_param->pws_cnt = 0; /* still required? if (attack_kern == ATTACK_KERN_STRAIGHT) { CL_rc = run_kernel_bzero (device_param, device_param->d_rules_c, device_param->size_rules_c); if (CL_rc == -1) { if (attack_mode == ATTACK_MODE_COMBI) fclose (device_param->combs_fp); fclose (fd); hcfree (hashcat_ctx_tmp->wl_data); hcfree (hashcat_ctx_tmp); return -1; } } else if (attack_kern == ATTACK_KERN_COMBI) { CL_rc = run_kernel_bzero (device_param, device_param->d_combs_c, device_param->size_combs); if (CL_rc == -1) { if (attack_mode == ATTACK_MODE_COMBI) fclose (device_param->combs_fp); fclose (fd); hcfree (hashcat_ctx_tmp->wl_data); hcfree (hashcat_ctx_tmp); return -1; } } */ } if (user_options->speed_only == true) break; if (status_ctx->run_thread_level2 == true) { device_param->words_done = words_fin; status_ctx->words_cur = get_lowest_words_done (hashcat_ctx); } if (status_ctx->run_thread_level1 == false) break; if (words_fin == 0) break; } if (attack_mode == ATTACK_MODE_COMBI) fclose (device_param->combs_fp); fclose (fd); wl_data_destroy (hashcat_ctx_tmp); hcfree (hashcat_ctx_tmp->wl_data); hcfree (hashcat_ctx_tmp); } device_param->kernel_accel = 0; device_param->kernel_loops = 0; return 0; } void *thread_calc (void *p) { thread_param_t *thread_param = (thread_param_t *) p; hashcat_ctx_t *hashcat_ctx = thread_param->hashcat_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (opencl_ctx->enabled == false) return NULL; hc_device_param_t *device_param = opencl_ctx->devices_param + thread_param->tid; if (device_param->skipped) return NULL; calc (hashcat_ctx, device_param); // we should check the RC here return NULL; } hashcat-4.0.1/src/dynloader.c000066400000000000000000000012061320027462700160450ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "dynloader.h" #ifdef _WIN HMODULE hc_dlopen (LPCSTR lpLibFileName) { return LoadLibraryA (lpLibFileName); } BOOL hc_dlclose (HMODULE hLibModule) { return FreeLibrary (hLibModule); } FARPROC hc_dlsym (HMODULE hModule, LPCSTR lpProcName) { return GetProcAddress (hModule, lpProcName); } #else void *hc_dlopen (const char *fileName, int flag) { return dlopen (fileName, flag); } int hc_dlclose (void * handle) { return dlclose (handle); } void *hc_dlsym (void *module, const char *symbol) { return dlsym (module, symbol); } #endif hashcat-4.0.1/src/event.c000066400000000000000000000132361320027462700152130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "thread.h" #include "event.h" void event_call (const u32 id, hashcat_ctx_t *hashcat_ctx, const void *buf, const size_t len) { event_ctx_t *event_ctx = hashcat_ctx->event_ctx; bool is_log = false; switch (id) { case EVENT_LOG_INFO: is_log = true; break; case EVENT_LOG_WARNING: is_log = true; break; case EVENT_LOG_ERROR: is_log = true; break; case EVENT_LOG_ADVICE: is_log = true; break; } if (is_log == false) { hc_thread_mutex_lock (event_ctx->mux_event); } hashcat_ctx->event (id, hashcat_ctx, buf, len); if (is_log == false) { hc_thread_mutex_unlock (event_ctx->mux_event); } // add more back logs in case user wants to access them if (is_log == false) { for (int i = MAX_OLD_EVENTS - 1; i >= 1; i--) { memcpy (event_ctx->old_buf[i], event_ctx->old_buf[i - 1], event_ctx->old_len[i - 1]); event_ctx->old_len[i] = event_ctx->old_len[i - 1]; } if (buf) { memcpy (event_ctx->old_buf[0], buf, len); } event_ctx->old_len[0] = len; } } __attribute__ ((format (printf, 1, 0))) static int event_log (const char *fmt, va_list ap, char *s, const size_t sz) { size_t length; length = vsnprintf (s, sz, fmt, ap); length = MIN (length, sz); s[length] = 0; return (int) length; } size_t event_log_advice_nn (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...) { event_ctx_t *event_ctx = hashcat_ctx->event_ctx; if (fmt == NULL) { event_ctx->msg_buf[0] = 0; event_ctx->msg_len = 0; } else { va_list ap; va_start (ap, fmt); event_ctx->msg_len = event_log (fmt, ap, event_ctx->msg_buf, HCBUFSIZ_TINY - 1); va_end (ap); } event_ctx->msg_newline = false; event_call (EVENT_LOG_ADVICE, hashcat_ctx, NULL, 0); return event_ctx->msg_len; } size_t event_log_info_nn (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...) { event_ctx_t *event_ctx = hashcat_ctx->event_ctx; if (fmt == NULL) { event_ctx->msg_buf[0] = 0; event_ctx->msg_len = 0; } else { va_list ap; va_start (ap, fmt); event_ctx->msg_len = event_log (fmt, ap, event_ctx->msg_buf, HCBUFSIZ_TINY - 1); va_end (ap); } event_ctx->msg_newline = false; event_call (EVENT_LOG_INFO, hashcat_ctx, NULL, 0); return event_ctx->msg_len; } size_t event_log_warning_nn (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...) { event_ctx_t *event_ctx = hashcat_ctx->event_ctx; if (fmt == NULL) { event_ctx->msg_buf[0] = 0; event_ctx->msg_len = 0; } else { va_list ap; va_start (ap, fmt); event_ctx->msg_len = event_log (fmt, ap, event_ctx->msg_buf, HCBUFSIZ_TINY - 1); va_end (ap); } event_ctx->msg_newline = false; event_call (EVENT_LOG_WARNING, hashcat_ctx, NULL, 0); return event_ctx->msg_len; } size_t event_log_error_nn (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...) { event_ctx_t *event_ctx = hashcat_ctx->event_ctx; if (fmt == NULL) { event_ctx->msg_buf[0] = 0; event_ctx->msg_len = 0; } else { va_list ap; va_start (ap, fmt); event_ctx->msg_len = event_log (fmt, ap, event_ctx->msg_buf, HCBUFSIZ_TINY - 1); va_end (ap); } event_ctx->msg_newline = false; event_call (EVENT_LOG_ERROR, hashcat_ctx, NULL, 0); return event_ctx->msg_len; } size_t event_log_advice (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...) { event_ctx_t *event_ctx = hashcat_ctx->event_ctx; if (fmt == NULL) { event_ctx->msg_buf[0] = 0; event_ctx->msg_len = 0; } else { va_list ap; va_start (ap, fmt); event_ctx->msg_len = event_log (fmt, ap, event_ctx->msg_buf, HCBUFSIZ_TINY - 1); va_end (ap); } event_ctx->msg_newline = true; event_call (EVENT_LOG_ADVICE, hashcat_ctx, NULL, 0); return event_ctx->msg_len; } size_t event_log_info (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...) { event_ctx_t *event_ctx = hashcat_ctx->event_ctx; if (fmt == NULL) { event_ctx->msg_buf[0] = 0; event_ctx->msg_len = 0; } else { va_list ap; va_start (ap, fmt); event_ctx->msg_len = event_log (fmt, ap, event_ctx->msg_buf, HCBUFSIZ_TINY - 1); va_end (ap); } event_ctx->msg_newline = true; event_call (EVENT_LOG_INFO, hashcat_ctx, NULL, 0); return event_ctx->msg_len; } size_t event_log_warning (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...) { event_ctx_t *event_ctx = hashcat_ctx->event_ctx; if (fmt == NULL) { event_ctx->msg_buf[0] = 0; event_ctx->msg_len = 0; } else { va_list ap; va_start (ap, fmt); event_ctx->msg_len = event_log (fmt, ap, event_ctx->msg_buf, HCBUFSIZ_TINY - 1); va_end (ap); } event_ctx->msg_newline = true; event_call (EVENT_LOG_WARNING, hashcat_ctx, NULL, 0); return event_ctx->msg_len; } size_t event_log_error (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...) { event_ctx_t *event_ctx = hashcat_ctx->event_ctx; if (fmt == NULL) { event_ctx->msg_buf[0] = 0; event_ctx->msg_len = 0; } else { va_list ap; va_start (ap, fmt); event_ctx->msg_len = event_log (fmt, ap, event_ctx->msg_buf, HCBUFSIZ_TINY - 1); va_end (ap); } event_ctx->msg_newline = true; event_call (EVENT_LOG_ERROR, hashcat_ctx, NULL, 0); return event_ctx->msg_len; } int event_ctx_init (hashcat_ctx_t *hashcat_ctx) { event_ctx_t *event_ctx = hashcat_ctx->event_ctx; memset (event_ctx, 0, sizeof (event_ctx_t)); hc_thread_mutex_init (event_ctx->mux_event); return 0; } void event_ctx_destroy (hashcat_ctx_t *hashcat_ctx) { event_ctx_t *event_ctx = hashcat_ctx->event_ctx; hc_thread_mutex_delete (event_ctx->mux_event); } hashcat-4.0.1/src/ext_ADL.c000066400000000000000000000003161320027462700153450ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "ext_ADL.h" void *HC_API_CALL ADL_Main_Memory_Alloc (const int iSize) { return malloc ((size_t) iSize); } hashcat-4.0.1/src/ext_OpenCL.c000066400000000000000000000111221320027462700160620ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "ext_OpenCL.h" const char *val2cstr_cl (cl_int CL_err) { #define CLERR(a) case a: return #a switch (CL_err) { /** * OpenCL runtime errors */ #if defined (CL_VERSION_1_0) CLERR (CL_SUCCESS); CLERR (CL_DEVICE_NOT_FOUND); CLERR (CL_DEVICE_NOT_AVAILABLE); CLERR (CL_COMPILER_NOT_AVAILABLE); CLERR (CL_MEM_OBJECT_ALLOCATION_FAILURE); CLERR (CL_OUT_OF_RESOURCES); CLERR (CL_OUT_OF_HOST_MEMORY); CLERR (CL_PROFILING_INFO_NOT_AVAILABLE); CLERR (CL_MEM_COPY_OVERLAP); CLERR (CL_IMAGE_FORMAT_MISMATCH); CLERR (CL_IMAGE_FORMAT_NOT_SUPPORTED); CLERR (CL_BUILD_PROGRAM_FAILURE); CLERR (CL_MAP_FAILURE); #endif #if defined (CL_VERSION_1_1) CLERR (CL_MISALIGNED_SUB_BUFFER_OFFSET); CLERR (CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST); #endif #if defined (CL_VERSION_1_2) CLERR (CL_COMPILE_PROGRAM_FAILURE); CLERR (CL_LINKER_NOT_AVAILABLE); CLERR (CL_LINK_PROGRAM_FAILURE); CLERR (CL_DEVICE_PARTITION_FAILED); CLERR (CL_KERNEL_ARG_INFO_NOT_AVAILABLE); #endif /** * OpenCL compile-time errors */ #if defined (CL_VERSION_1_0) CLERR (CL_INVALID_VALUE); CLERR (CL_INVALID_DEVICE_TYPE); CLERR (CL_INVALID_PLATFORM); CLERR (CL_INVALID_DEVICE); CLERR (CL_INVALID_CONTEXT); CLERR (CL_INVALID_QUEUE_PROPERTIES); CLERR (CL_INVALID_COMMAND_QUEUE); CLERR (CL_INVALID_HOST_PTR); CLERR (CL_INVALID_MEM_OBJECT); CLERR (CL_INVALID_IMAGE_FORMAT_DESCRIPTOR); CLERR (CL_INVALID_IMAGE_SIZE); CLERR (CL_INVALID_SAMPLER); CLERR (CL_INVALID_BINARY); CLERR (CL_INVALID_BUILD_OPTIONS); CLERR (CL_INVALID_PROGRAM); CLERR (CL_INVALID_PROGRAM_EXECUTABLE); CLERR (CL_INVALID_KERNEL_NAME); CLERR (CL_INVALID_KERNEL_DEFINITION); CLERR (CL_INVALID_KERNEL); CLERR (CL_INVALID_ARG_INDEX); CLERR (CL_INVALID_ARG_VALUE); CLERR (CL_INVALID_ARG_SIZE); CLERR (CL_INVALID_KERNEL_ARGS); CLERR (CL_INVALID_WORK_DIMENSION); CLERR (CL_INVALID_WORK_GROUP_SIZE); CLERR (CL_INVALID_WORK_ITEM_SIZE); CLERR (CL_INVALID_GLOBAL_OFFSET); CLERR (CL_INVALID_EVENT_WAIT_LIST); CLERR (CL_INVALID_EVENT); CLERR (CL_INVALID_OPERATION); CLERR (CL_INVALID_GL_OBJECT); CLERR (CL_INVALID_BUFFER_SIZE); CLERR (CL_INVALID_MIP_LEVEL); CLERR (CL_INVALID_GLOBAL_WORK_SIZE); #endif #if defined (CL_VERSION_1_1) CLERR (CL_INVALID_PROPERTY); #endif #if defined (CL_VERSION_1_2) CLERR (CL_INVALID_IMAGE_DESCRIPTOR); CLERR (CL_INVALID_COMPILER_OPTIONS); CLERR (CL_INVALID_LINKER_OPTIONS); CLERR (CL_INVALID_DEVICE_PARTITION_COUNT); #endif #if defined (CL_VERSION_2_0) CLERR (CL_INVALID_PIPE_SIZE); CLERR (CL_INVALID_DEVICE_QUEUE); #endif /** * OpenCL extension error values */ #if defined (__OPENCL_CL_GL_H) && defined (cl_khr_gl_sharing) CLERR (CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR); #endif #if defined (__CL_EXT_H) && defined (cl_khr_icd) CLERR (CL_PLATFORM_NOT_FOUND_KHR); #else case -1001: return "CL_PLATFORM_NOT_FOUND_KHR"; #endif #if defined (__OPENCL_CL_D3D10_H) CLERR (CL_INVALID_D3D10_DEVICE_KHR); CLERR (CL_INVALID_D3D10_RESOURCE_KHR); CLERR (CL_D3D10_RESOURCE_ALREADY_ACQUIRED_KHR); CLERR (CL_D3D10_RESOURCE_NOT_ACQUIRED_KHR); #endif #if defined (__OPENCL_CL_D3D11_H) CLERR (CL_INVALID_D3D11_DEVICE_KHR); CLERR (CL_INVALID_D3D11_RESOURCE_KHR); CLERR (CL_D3D11_RESOURCE_ALREADY_ACQUIRED_KHR); CLERR (CL_D3D11_RESOURCE_NOT_ACQUIRED_KHR); #endif #if defined (__OPENCL_CL_DX9_MEDIA_SHARING_H) CLERR (CL_INVALID_DX9_MEDIA_ADAPTER_KHR); CLERR (CL_INVALID_DX9_MEDIA_SURFACE_KHR); CLERR (CL_DX9_MEDIA_SURFACE_ALREADY_ACQUIRED_KHR); CLERR (CL_DX9_MEDIA_SURFACE_NOT_ACQUIRED_KHR); #endif #if defined (__CL_EXT_H) && defined (cl_ext_device_fission) CLERR (CL_DEVICE_PARTITION_FAILED_EXT); CLERR (CL_INVALID_PARTITION_COUNT_EXT); CLERR (CL_INVALID_PARTITION_NAME_EXT); #endif #if defined (__OPENCL_CL_EGL_H) CLERR (CL_EGL_RESOURCE_NOT_ACQUIRED_KHR); CLERR (CL_INVALID_EGL_OBJECT_KHR); #endif #if defined (__CL_EXT_H) && defined (cl_intel_accelerator) CLERR (CL_INVALID_ACCELERATOR_INTEL); CLERR (CL_INVALID_ACCELERATOR_TYPE_INTEL); CLERR (CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL); CLERR (CL_ACCELERATOR_TYPE_NOT_SUPPORTED_INTEL); #endif } #undef CLERR return "CL_UNKNOWN_ERROR"; } hashcat-4.0.1/src/ext_lzma.c000066400000000000000000000026411320027462700157130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "ext_lzma.h" void *hc_lzma_alloc (MAYBE_UNUSED void *p, size_t size) { return hcmalloc (size); } void hc_lzma_free (MAYBE_UNUSED void *p, void *address) { hcfree (address); } int hc_lzma1_decompress (const unsigned char *in, SizeT *in_len, unsigned char *out, SizeT *out_len, const char *props) { ISzAlloc hc_lzma_mem_alloc = {hc_lzma_alloc, hc_lzma_free}; ELzmaStatus status; // parameters to LzmaDecode (): unsigned char *dest, size_t *destLen, const unsigned char *src, // size_t *srcLen, const unsigned char *props, size_t propsSize, ELzmaFinishMode finishMode, ELzmaStatus status, ISzAlloc *alloc return LzmaDecode (out, out_len, in, in_len, (Byte *) props, LZMA_PROPS_SIZE, LZMA_FINISH_ANY, &status, &hc_lzma_mem_alloc); } int hc_lzma2_decompress (const unsigned char *in, SizeT *in_len, unsigned char *out, SizeT *out_len, const char *props) { ISzAlloc hc_lzma_mem_alloc = {hc_lzma_alloc, hc_lzma_free}; ELzmaStatus status; // parameters to Lzma2Decode (): unsigned char *dest, size_t *destLen, const unsigned char *src, // size_t *srcLen, const unsigned char props, ELzmaFinishMode finishMode, ELzmaStatus status, ISzAlloc *alloc return Lzma2Decode (out, out_len, in, in_len, (Byte) props[0], LZMA_FINISH_ANY, &status, &hc_lzma_mem_alloc); } hashcat-4.0.1/src/ext_nvapi.c000066400000000000000000000002511320027462700160600ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "event.h" #include "memory.h" #include "ext_nvapi.h" hashcat-4.0.1/src/ext_nvml.c000066400000000000000000000002771320027462700157270ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "event.h" #include "memory.h" #include "dynloader.h" #include "ext_nvml.h" hashcat-4.0.1/src/ext_sysfs.c000066400000000000000000000001571320027462700161170ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "ext_sysfs.h" hashcat-4.0.1/src/ext_xnvctrl.c000066400000000000000000000002531320027462700164450ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "event.h" #include "memory.h" #include "ext_xnvctrl.h" hashcat-4.0.1/src/filehandling.c000066400000000000000000000034111320027462700165100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "shared.h" #include "filehandling.h" u64 count_lines (FILE *fd) { u64 cnt = 0; char *buf = (char *) hcmalloc (HCBUFSIZ_LARGE + 1); char prev = '\n'; while (!feof (fd)) { size_t nread = hc_fread (buf, sizeof (char), HCBUFSIZ_LARGE, fd); if (nread < 1) continue; size_t i; for (i = 0; i < nread; i++) { if (prev == '\n') cnt++; prev = buf[i]; } } hcfree (buf); return cnt; } 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 == HCBUFSIZ_LARGE) line_len--; if (c == '\n') break; } if (line_len == 0) return 0; while (line_len) { if (line_buf[line_len - 1] == '\n') { line_len--; continue; } if (line_buf[line_len - 1] == '\r') { line_len--; continue; } break; } line_buf[line_len] = 0; return (line_len); } size_t superchop_with_length (char *buf, const size_t len) { size_t new_len = len; while (new_len) { if (buf[new_len - 1] == '\n') { new_len--; buf[new_len] = 0; continue; } if (buf[new_len - 1] == '\r') { new_len--; buf[new_len] = 0; continue; } break; } return new_len; } int in_superchop (char *buf) { size_t len = strlen (buf); while (len) { if (buf[len - 1] == '\n') { len--; buf[len] = 0; continue; } if (buf[len - 1] == '\r') { len--; buf[len] = 0; continue; } break; } return len; } hashcat-4.0.1/src/folder.c000066400000000000000000000244371320027462700153520ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "shared.h" #include "folder.h" #if defined (__APPLE__) #include "event.h" #endif 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); } static int get_exec_path (char *exec_path, const size_t exec_path_sz) { #if defined (__linux__) || defined (__CYGWIN__) char *tmp; hc_asprintf (&tmp, "/proc/%d/exe", getpid ()); const ssize_t len = readlink (tmp, exec_path, exec_path_sz - 1); hcfree (tmp); if (len == -1) return -1; #elif defined (_WIN) const DWORD len = GetModuleFileName (NULL, exec_path, exec_path_sz - 1); if (len == 0) return -1; #elif defined (__APPLE__) u32 size = (u32) exec_path_sz; if (_NSGetExecutablePath (exec_path, &size) != 0) return -1; const size_t len = strlen (exec_path); #elif defined (__FreeBSD__) #include int mib[4]; mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PATHNAME; mib[3] = -1; size_t size = exec_path_sz; sysctl (mib, 4, exec_path, &size, NULL, 0); const size_t len = strlen (exec_path); #else #error Your Operating System is not supported or detected #endif exec_path[len] = 0; return 0; } static void get_install_dir (char *install_dir, const char *exec_path) { strncpy (install_dir, exec_path, HCBUFSIZ_TINY - 1); 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; } } #if defined (_POSIX) static void get_profile_dir (char *profile_dir, const char *home_dir) { snprintf (profile_dir, HCBUFSIZ_TINY - 1, "%s/%s", home_dir, DOT_HASHCAT); } static void get_session_dir (char *session_dir, const char *profile_dir) { snprintf (session_dir, HCBUFSIZ_TINY - 1, "%s/%s", profile_dir, SESSIONS_FOLDER); } #endif 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 *first_file_in_directory (const char *path) { DIR *d; if ((d = opendir (path)) != NULL) { char *first_file = NULL; #if 0 struct dirent e; for (;;) { memset (&e, 0, sizeof (e)); struct dirent *de = NULL; if (readdir_r (d, &e, &de) != 0) break; if (de == NULL) break; #else struct dirent *de; while ((de = readdir (d)) != NULL) { #endif if (de->d_name[0] == '.') continue; first_file = strdup (de->d_name); break; } closedir (d); return first_file; } return NULL; } char **scan_directory (const char *path) { char *tmp_path = hcstrdup (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; size_t num_files = 0; DIR *d = NULL; if ((d = opendir (tmp_path)) != NULL) { #if 0 struct dirent e; for (;;) { memset (&e, 0, sizeof (e)); struct dirent *de = NULL; if (readdir_r (d, &e, &de) != 0) break; if (de == NULL) break; #else struct dirent *de; while ((de = readdir (d)) != NULL) { #endif if (de->d_name[0] == '.') continue; char *path_file; hc_asprintf (&path_file, "%s/%s", tmp_path, de->d_name); DIR *d_test; if ((d_test = opendir (path_file)) != NULL) { closedir (d_test); hcfree (path_file); } else { files = (char **) hcrealloc (files, (num_files + 1) * sizeof (char *), sizeof (char *)); files[num_files] = path_file; num_files++; } } closedir (d); } else if (errno == ENOTDIR) { files = (char **) hcrealloc (files, (num_files + 1) * sizeof (char *), sizeof (char *)); files[num_files] = hcstrdup (path); num_files++; } files = (char **) hcrealloc (files, (num_files + 1) * sizeof (char *), sizeof (char *)); files[num_files] = NULL; hcfree (tmp_path); return (files); } int folder_config_init (hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const char *install_folder, MAYBE_UNUSED const char *shared_folder) { folder_config_t *folder_config = hashcat_ctx->folder_config; /** * There's some buggy OpenCL runtime that do not support -I. * A workaround is to chdir() to the OpenCL folder, * then compile the kernels, * then chdir() back to where we came from so we need to save it first */ char *cwd = (char *) hcmalloc (HCBUFSIZ_TINY); if (getcwd (cwd, HCBUFSIZ_TINY - 1) == NULL) { event_log_error (hashcat_ctx, "getcwd(): %s", strerror (errno)); hcfree (cwd); return -1; } /** * folders, as discussed on https://github.com/hashcat/hashcat/issues/20 */ const size_t exec_path_sz = 1024; char *exec_path = (char *) hcmalloc (exec_path_sz); const int rc = get_exec_path (exec_path, exec_path_sz); if (rc == -1) { event_log_error (hashcat_ctx, "get_exec_path() failed."); hcfree (cwd); hcfree (exec_path); return -1; } #if defined (_POSIX) static const char SLASH[] = "/"; if (install_folder == NULL) install_folder = SLASH; // makes library use easier char *resolved_install_folder = realpath (install_folder, NULL); char *resolved_exec_path = realpath (exec_path, NULL); if (resolved_install_folder == NULL) resolved_install_folder = hcstrdup (SLASH); /* This causes invalid error out if install_folder (/usr/local/bin) does not exist if (resolved_install_folder == NULL) { event_log_error (hashcat_ctx, "%s: %s", resolved_install_folder, strerror (errno)); hcfree (cwd); hcfree (exec_path); hcfree (resolved_install_folder); return -1; } */ if (resolved_exec_path == NULL) { event_log_error (hashcat_ctx, "%s: %s", resolved_exec_path, strerror (errno)); hcfree (cwd); hcfree (exec_path); hcfree (resolved_install_folder); return -1; } char *install_dir = hcmalloc (HCBUFSIZ_TINY); get_install_dir (install_dir, resolved_exec_path); char *profile_dir = NULL; char *session_dir = NULL; char *shared_dir = NULL; if (strcmp (install_dir, resolved_install_folder) == 0) { struct passwd pw; struct passwd *pwp; char buf[HCBUFSIZ_TINY]; getpwuid_r (getuid (), &pw, buf, HCBUFSIZ_TINY, &pwp); const char *home_dir = pwp->pw_dir; profile_dir = hcmalloc (HCBUFSIZ_TINY); session_dir = hcmalloc (HCBUFSIZ_TINY); get_profile_dir (profile_dir, home_dir); get_session_dir (session_dir, profile_dir); shared_dir = hcstrdup (shared_folder); hc_mkdir (profile_dir, 0700); hc_mkdir (session_dir, 0700); } else { profile_dir = install_dir; session_dir = install_dir; shared_dir = install_dir; } hcfree (resolved_install_folder); hcfree (resolved_exec_path); #else char *install_dir = hcmalloc (HCBUFSIZ_TINY); get_install_dir (install_dir, exec_path); char *profile_dir = install_dir; char *session_dir = install_dir; char *shared_dir = install_dir; #endif hcfree (exec_path); /** * There are a lot of problems related to bad support of -I parameters when building the kernel. * Each OpenCL runtime handles it slightly differently. * The most problematic is with new AMD drivers on Windows, which cannot handle quote characters! * The best workaround found so far is to modify the TMP variable (only inside hashcat process) before the runtime is loaded. */ char *cpath; #if defined (_WIN) hc_asprintf (&cpath, "%s\\OpenCL\\", shared_dir); char *cpath_real = (char *) hcmalloc (HCBUFSIZ_TINY); if (GetFullPathName (cpath, HCBUFSIZ_TINY - 1, cpath_real, NULL) == 0) { event_log_error (hashcat_ctx, "%s: %s", cpath, "GetFullPathName()."); hcfree (cwd); return -1; } #else hc_asprintf (&cpath, "%s/OpenCL/", shared_dir); char *cpath_real = (char *) hcmalloc (PATH_MAX); if (realpath (cpath, cpath_real) == NULL) { event_log_error (hashcat_ctx, "%s: %s", cpath, strerror (errno)); hcfree (cwd); hcfree (shared_dir); // Attention: since hcfree () doesn't set the pointer to NULL, we need to do it externally such that // we prevent double-freeing the same memory address (this happens if e.g. profile_dir == session_dir) if (profile_dir == shared_dir) profile_dir = NULL; if (session_dir == shared_dir) session_dir = NULL; shared_dir = NULL; hcfree (profile_dir); if (session_dir == profile_dir) session_dir = NULL; profile_dir = NULL; hcfree (session_dir); session_dir = NULL; hcfree (cpath_real); cpath_real = NULL; return -1; } #endif hcfree (cpath); //if (getenv ("TMP") == NULL) if (1) { char *tmp; hc_asprintf (&tmp, "TMP=%s", cpath_real); putenv (tmp); } #if defined (_WIN) naive_replace (cpath_real, '\\', '/'); // not escaping here, windows using quotes later // naive_escape (cpath_real, PATH_MAX, ' ', '\\'); #else naive_escape (cpath_real, PATH_MAX, ' ', '\\'); #endif /** * kernel cache, we need to make sure folder exist */ char *kernels_folder; hc_asprintf (&kernels_folder, "%s/kernels", profile_dir); hc_mkdir (kernels_folder, 0700); hcfree (kernels_folder); /** * store for later use */ folder_config->cwd = cwd; folder_config->install_dir = install_dir; folder_config->profile_dir = profile_dir; folder_config->session_dir = session_dir; folder_config->shared_dir = shared_dir; folder_config->cpath_real = cpath_real; return 0; } void folder_config_destroy (hashcat_ctx_t *hashcat_ctx) { folder_config_t *folder_config = hashcat_ctx->folder_config; hcfree (folder_config->cpath_real); hcfree (folder_config->cwd); hcfree (folder_config->install_dir); memset (folder_config, 0, sizeof (folder_config_t)); } int hc_mkdir (const char *name, MAYBE_UNUSED const int mode) { #if defined (_WIN) return _mkdir (name); #else return mkdir (name, mode); #endif } hashcat-4.0.1/src/hashcat.c000066400000000000000000001123351320027462700155050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" // basic tools #include "types.h" #include "folder.h" #include "locking.h" #include "memory.h" #include "shared.h" #include "thread.h" #include "timer.h" // features #include "affinity.h" #include "autotune.h" #include "benchmark.h" #include "bitmap.h" #include "combinator.h" #include "cpt.h" #include "debugfile.h" #include "dictstat.h" #include "dispatch.h" #include "event.h" #include "hashcat.h" #include "hashes.h" #include "hwmon.h" #include "induct.h" #include "interface.h" #include "logfile.h" #include "loopback.h" #include "monitor.h" #include "mpsp.h" #include "opencl.h" #include "outfile_check.h" #include "outfile.h" #include "pidfile.h" #include "potfile.h" #include "restore.h" #include "rp.h" #include "selftest.h" #include "status.h" #include "straight.h" #include "tuningdb.h" #include "usage.h" #include "user_options.h" #include "wordlist.h" // inner2_loop iterates through wordlists, then calls kernel execution static int inner2_loop (hashcat_ctx_t *hashcat_ctx) { hashes_t *hashes = hashcat_ctx->hashes; induct_ctx_t *induct_ctx = hashcat_ctx->induct_ctx; logfile_ctx_t *logfile_ctx = hashcat_ctx->logfile_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; restore_ctx_t *restore_ctx = hashcat_ctx->restore_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; user_options_t *user_options = hashcat_ctx->user_options; //status_ctx->run_main_level1 = true; //status_ctx->run_main_level2 = true; //status_ctx->run_main_level3 = true; status_ctx->run_thread_level1 = true; status_ctx->run_thread_level2 = true; status_ctx->devices_status = STATUS_INIT; logfile_generate_subid (hashcat_ctx); logfile_sub_msg ("START"); status_progress_reset (hashcat_ctx); status_ctx->msec_paused = 0; status_ctx->words_off = 0; status_ctx->words_cur = 0; if (restore_ctx->rd) { restore_data_t *rd = restore_ctx->rd; if (rd->words_cur > 0) { status_ctx->words_off = rd->words_cur; status_ctx->words_cur = status_ctx->words_off; rd->words_cur = 0; // --restore always overrides --skip user_options->skip = 0; } } if (user_options->skip > 0) { status_ctx->words_off = user_options->skip; status_ctx->words_cur = status_ctx->words_off; user_options->skip = 0; } opencl_session_reset (hashcat_ctx); cpt_ctx_reset (hashcat_ctx); /** * Update attack-mode specific stuff based on mask */ const int rc_mask_ctx_update_loop = mask_ctx_update_loop (hashcat_ctx); if (rc_mask_ctx_update_loop == -1) return 0; /** * Update attack-mode specific stuff based on wordlist */ const int rc_straight_ctx_update_loop = straight_ctx_update_loop (hashcat_ctx); if (rc_straight_ctx_update_loop == -1) return 0; // words base const u64 amplifier_cnt = user_options_extra_amplifier (hashcat_ctx); status_ctx->words_base = status_ctx->words_cnt / amplifier_cnt; EVENT (EVENT_CALCULATED_WORDS_BASE); if (user_options->keyspace == true) return 0; // restore stuff if (status_ctx->words_off > status_ctx->words_base) { event_log_error (hashcat_ctx, "Restore value is greater than keyspace."); return -1; } const u64 progress_restored = status_ctx->words_off * amplifier_cnt; for (u32 i = 0; i < hashes->salts_cnt; i++) { status_ctx->words_progress_restored[i] = progress_restored; } /** * limit kernel loops by the amplification count we have from: * - straight_ctx, combinator_ctx or mask_ctx for fast hashes * - hash iteration count for slow hashes * this is required for autotune */ opencl_ctx_devices_kernel_loops (hashcat_ctx); /** * prepare thread buffers */ thread_param_t *threads_param = (thread_param_t *) hccalloc (opencl_ctx->devices_cnt, sizeof (thread_param_t)); hc_thread_t *c_threads = (hc_thread_t *) hccalloc (opencl_ctx->devices_cnt, sizeof (hc_thread_t)); /** * create autotune threads */ EVENT (EVENT_AUTOTUNE_STARTING); status_ctx->devices_status = STATUS_AUTOTUNE; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { thread_param_t *thread_param = threads_param + device_id; thread_param->hashcat_ctx = hashcat_ctx; thread_param->tid = device_id; hc_thread_create (c_threads[device_id], thread_autotune, thread_param); } hc_thread_wait (opencl_ctx->devices_cnt, c_threads); EVENT (EVENT_AUTOTUNE_FINISHED); /** * autotune modified kernel_accel, which modifies opencl_ctx->kernel_power_all */ opencl_ctx_devices_update_power (hashcat_ctx); /** * Begin loopback recording */ if (user_options->loopback == true) { loopback_write_open (hashcat_ctx); } /** * Prepare cracking stats */ hc_timer_set (&status_ctx->timer_running); hc_time_t runtime_start; hc_time (&runtime_start); status_ctx->runtime_start = runtime_start; /** * create cracker threads */ EVENT (EVENT_CRACKER_STARTING); status_ctx->devices_status = STATUS_RUNNING; status_ctx->accessible = true; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { thread_param_t *thread_param = threads_param + device_id; thread_param->hashcat_ctx = hashcat_ctx; thread_param->tid = device_id; if (user_options_extra->wordlist_mode == WL_MODE_STDIN) { hc_thread_create (c_threads[device_id], thread_calc_stdin, thread_param); } else { hc_thread_create (c_threads[device_id], thread_calc, thread_param); } } hc_thread_wait (opencl_ctx->devices_cnt, c_threads); hcfree (c_threads); hcfree (threads_param); if ((status_ctx->devices_status == STATUS_RUNNING) && (status_ctx->checkpoint_shutdown == true)) { myabort_checkpoint (hashcat_ctx); } if ((status_ctx->devices_status != STATUS_CRACKED) && (status_ctx->devices_status != STATUS_ABORTED) && (status_ctx->devices_status != STATUS_ABORTED_CHECKPOINT) && (status_ctx->devices_status != STATUS_ABORTED_RUNTIME) && (status_ctx->devices_status != STATUS_QUIT) && (status_ctx->devices_status != STATUS_BYPASS)) { status_ctx->devices_status = STATUS_EXHAUSTED; } // update some timer hc_time_t runtime_stop; hc_time (&runtime_stop); status_ctx->runtime_stop = runtime_stop; logfile_sub_uint (runtime_start); logfile_sub_uint (runtime_stop); if (hashcat_get_status (hashcat_ctx, status_ctx->hashcat_status_final) == -1) { fprintf (stderr, "Initialization problem: the hashcat status monitoring function returned an unexpected value\n"); } status_ctx->accessible = false; EVENT (EVENT_CRACKER_FINISHED); // mark sub logfile logfile_sub_var_uint ("status-after-work", status_ctx->devices_status); logfile_sub_msg ("STOP"); // stop loopback recording if (user_options->loopback == true) { loopback_write_close (hashcat_ctx); } // New induction folder check, which is a controlled recursion if (induct_ctx->induction_dictionaries_cnt == 0) { induct_ctx_scan (hashcat_ctx); while (induct_ctx->induction_dictionaries_cnt) { for (induct_ctx->induction_dictionaries_pos = 0; induct_ctx->induction_dictionaries_pos < induct_ctx->induction_dictionaries_cnt; induct_ctx->induction_dictionaries_pos++) { if (status_ctx->devices_status == STATUS_EXHAUSTED) { const int rc_inner2_loop = inner2_loop (hashcat_ctx); if (rc_inner2_loop == -1) myabort (hashcat_ctx); if (status_ctx->run_main_level3 == false) break; } unlink (induct_ctx->induction_dictionaries[induct_ctx->induction_dictionaries_pos]); } hcfree (induct_ctx->induction_dictionaries); induct_ctx_scan (hashcat_ctx); } } return 0; } // inner1_loop iterates through masks, then calls inner2_loop static int inner1_loop (hashcat_ctx_t *hashcat_ctx) { restore_ctx_t *restore_ctx = hashcat_ctx->restore_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; //status_ctx->run_main_level1 = true; //status_ctx->run_main_level2 = true; status_ctx->run_main_level3 = true; status_ctx->run_thread_level1 = true; status_ctx->run_thread_level2 = true; /** * loop through wordlists */ EVENT (EVENT_INNERLOOP2_STARTING); if (restore_ctx->rd) { restore_data_t *rd = restore_ctx->rd; if (rd->dicts_pos > 0) { straight_ctx->dicts_pos = rd->dicts_pos; rd->dicts_pos = 0; } } if (straight_ctx->dicts_cnt) { for (u32 dicts_pos = straight_ctx->dicts_pos; dicts_pos < straight_ctx->dicts_cnt; dicts_pos++) { straight_ctx->dicts_pos = dicts_pos; const int rc_inner2_loop = inner2_loop (hashcat_ctx); if (rc_inner2_loop == -1) myabort (hashcat_ctx); if (status_ctx->run_main_level3 == false) break; } if (straight_ctx->dicts_pos + 1 == straight_ctx->dicts_cnt) straight_ctx->dicts_pos = 0; } else { const int rc_inner2_loop = inner2_loop (hashcat_ctx); if (rc_inner2_loop == -1) myabort (hashcat_ctx); } EVENT (EVENT_INNERLOOP2_FINISHED); return 0; } // outer_loop iterates through hash_modes (in benchmark mode) // also initializes stuff that depend on hash mode static int outer_loop (hashcat_ctx_t *hashcat_ctx) { hashes_t *hashes = hashcat_ctx->hashes; mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; outcheck_ctx_t *outcheck_ctx = hashcat_ctx->outcheck_ctx; restore_ctx_t *restore_ctx = hashcat_ctx->restore_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; user_options_t *user_options = hashcat_ctx->user_options; status_ctx->devices_status = STATUS_INIT; //status_ctx->run_main_level1 = true; status_ctx->run_main_level2 = true; status_ctx->run_main_level3 = true; status_ctx->run_thread_level1 = true; status_ctx->run_thread_level2 = true; /** * setup variables and buffers depending on hash_mode */ const int rc_hashconfig = hashconfig_init (hashcat_ctx); if (rc_hashconfig == -1) { event_log_error (hashcat_ctx, "Unknown hash-type '%u' selected.", user_options->hash_mode); return -1; } /** * load hashes, stage 1 */ const int rc_hashes_init_stage1 = hashes_init_stage1 (hashcat_ctx); if (rc_hashes_init_stage1 == -1) return -1; if ((user_options->keyspace == false) && (user_options->stdout_flag == false)) { if (hashes->hashes_cnt == 0) { event_log_error (hashcat_ctx, "No hashes loaded."); return -1; } } /** * load hashes, stage 2, remove duplicates, build base structure */ hashes->hashes_cnt_orig = hashes->hashes_cnt; const int rc_hashes_init_stage2 = hashes_init_stage2 (hashcat_ctx); if (rc_hashes_init_stage2 == -1) return -1; /** * potfile removes */ if (user_options->potfile_disable == false) { EVENT (EVENT_POTFILE_REMOVE_PARSE_PRE); if (user_options->loopback == true) { loopback_write_open (hashcat_ctx); } potfile_remove_parse (hashcat_ctx); if (user_options->loopback == true) { loopback_write_close (hashcat_ctx); } EVENT (EVENT_POTFILE_REMOVE_PARSE_POST); } /** * load hashes, stage 3, update cracked results from potfile */ const int rc_hashes_init_stage3 = hashes_init_stage3 (hashcat_ctx); if (rc_hashes_init_stage3 == -1) return -1; /** * potfile show/left handling */ if (user_options->show == true) { outfile_write_open (hashcat_ctx); const int rc = potfile_handle_show (hashcat_ctx); if (rc == -1) return -1; outfile_write_close (hashcat_ctx); return 0; } if (user_options->left == true) { outfile_write_open (hashcat_ctx); const int rc = potfile_handle_left (hashcat_ctx); if (rc == -1) return -1; outfile_write_close (hashcat_ctx); return 0; } /** * maybe all hashes were cracked, we can exit here */ if (status_ctx->devices_status == STATUS_CRACKED) { if ((user_options->remove == true) && (hashes->hashlist_mode == HL_MODE_FILE)) { if (hashes->digests_saved != hashes->digests_done) { const int rc = save_hash (hashcat_ctx); if (rc == -1) return -1; } } EVENT (EVENT_POTFILE_ALL_CRACKED); return 0; } /** * load hashes, stage 4, automatic Optimizers */ const int rc_hashes_init_stage4 = hashes_init_stage4 (hashcat_ctx); if (rc_hashes_init_stage4 == -1) return -1; /** * load hashes, selftest */ const int rc_hashes_init_selftest = hashes_init_selftest (hashcat_ctx); if (rc_hashes_init_selftest == -1) return -1; /** * Done loading hashes, log results */ hashes_logger (hashcat_ctx); /** * bitmaps */ EVENT (EVENT_BITMAP_INIT_PRE); const int rc_bitmap_init = bitmap_ctx_init (hashcat_ctx); if (rc_bitmap_init == -1) return -1; EVENT (EVENT_BITMAP_INIT_POST); /** * cracks-per-time allocate buffer */ cpt_ctx_init (hashcat_ctx); /** * Wordlist allocate buffer */ const int rc_wl_data_init = wl_data_init (hashcat_ctx); if (rc_wl_data_init == -1) return -1; /** * straight mode init */ const int rc_straight_init = straight_ctx_init (hashcat_ctx); if (rc_straight_init == -1) return -1; /** * straight mode init */ const int rc_combinator_init = combinator_ctx_init (hashcat_ctx); if (rc_combinator_init == -1) return -1; /** * charsets : keep them together for more easy maintainnce */ const int rc_mask_init = mask_ctx_init (hashcat_ctx); if (rc_mask_init == -1) return -1; /** * prevent the user from using --skip/--limit together with maskfile and/or multiple word lists */ if (user_options->skip != 0 || user_options->limit != 0) { if ((mask_ctx->masks_cnt > 1) || (straight_ctx->dicts_cnt > 1)) { event_log_error (hashcat_ctx, "Use of --skip/--limit is not supported with --increment or mask files."); return -1; } } /** * prevent the user from using --keyspace together with maskfile and/or multiple word lists */ if (user_options->keyspace == true) { if ((mask_ctx->masks_cnt > 1) || (straight_ctx->dicts_cnt > 1)) { event_log_error (hashcat_ctx, "Use of --keyspace is not supported with --increment or mask files."); return -1; } } /** * status progress init; needs hashes that's why we have to do it here and separate from status_ctx_init */ const int rc_status_init = status_progress_init (hashcat_ctx); if (rc_status_init == -1) return -1; /** * main screen */ EVENT (EVENT_OUTERLOOP_MAINSCREEN); /** * Tell user about cracked hashes by potfile */ EVENT (EVENT_POTFILE_NUM_CRACKED); /** * inform the user */ EVENT (EVENT_OPENCL_SESSION_PRE); const int rc_session_begin = opencl_session_begin (hashcat_ctx); if (rc_session_begin == -1) return -1; EVENT (EVENT_OPENCL_SESSION_POST); /** * create self-test threads */ EVENT (EVENT_SELFTEST_STARTING); thread_param_t *threads_param = (thread_param_t *) hccalloc (opencl_ctx->devices_cnt, sizeof (thread_param_t)); hc_thread_t *selftest_threads = (hc_thread_t *) hccalloc (opencl_ctx->devices_cnt, sizeof (hc_thread_t)); status_ctx->devices_status = STATUS_SELFTEST; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { thread_param_t *thread_param = threads_param + device_id; thread_param->hashcat_ctx = hashcat_ctx; thread_param->tid = device_id; hc_thread_create (selftest_threads[device_id], thread_selftest, thread_param); } hc_thread_wait (opencl_ctx->devices_cnt, selftest_threads); hcfree (threads_param); hcfree (selftest_threads); status_ctx->devices_status = STATUS_INIT; EVENT (EVENT_SELFTEST_FINISHED); /** * (old) weak hash check is the first to write to potfile, so open it for writing from here * the weak hash check was removed maybe we can move this more to the bottom now */ const int rc_potfile_write = potfile_write_open (hashcat_ctx); if (rc_potfile_write == -1) return -1; /** * status and monitor threads */ int inner_threads_cnt = 0; hc_thread_t *inner_threads = (hc_thread_t *) hccalloc (10, sizeof (hc_thread_t)); status_ctx->shutdown_inner = false; /** * Outfile remove */ if (user_options->keyspace == false && user_options->stdout_flag == false && user_options->speed_only == false) { hc_thread_create (inner_threads[inner_threads_cnt], thread_monitor, hashcat_ctx); inner_threads_cnt++; if (outcheck_ctx->enabled == true) { hc_thread_create (inner_threads[inner_threads_cnt], thread_outfile_remove, hashcat_ctx); inner_threads_cnt++; } } // main call if (restore_ctx->rd) { restore_data_t *rd = restore_ctx->rd; if (rd->masks_pos > 0) { mask_ctx->masks_pos = rd->masks_pos; rd->masks_pos = 0; } } EVENT (EVENT_INNERLOOP1_STARTING); if (mask_ctx->masks_cnt) { for (u32 masks_pos = mask_ctx->masks_pos; masks_pos < mask_ctx->masks_cnt; masks_pos++) { mask_ctx->masks_pos = masks_pos; const int rc_inner1_loop = inner1_loop (hashcat_ctx); if (rc_inner1_loop == -1) myabort (hashcat_ctx); if (status_ctx->run_main_level2 == false) break; } if (mask_ctx->masks_pos + 1 == mask_ctx->masks_cnt) mask_ctx->masks_pos = 0; } else { const int rc_inner1_loop = inner1_loop (hashcat_ctx); if (rc_inner1_loop == -1) myabort (hashcat_ctx); } // wait for inner threads status_ctx->shutdown_inner = true; for (int thread_idx = 0; thread_idx < inner_threads_cnt; thread_idx++) { hc_thread_wait (1, &inner_threads[thread_idx]); } hcfree (inner_threads); EVENT (EVENT_INNERLOOP1_FINISHED); // finalize potfile potfile_write_close (hashcat_ctx); // finalize opencl session opencl_session_destroy (hashcat_ctx); // clean up bitmap_ctx_destroy (hashcat_ctx); combinator_ctx_destroy (hashcat_ctx); cpt_ctx_destroy (hashcat_ctx); hashconfig_destroy (hashcat_ctx); hashes_destroy (hashcat_ctx); mask_ctx_destroy (hashcat_ctx); status_progress_destroy (hashcat_ctx); straight_ctx_destroy (hashcat_ctx); wl_data_destroy (hashcat_ctx); return 0; } int hashcat_init (hashcat_ctx_t *hashcat_ctx, void (*event) (const u32, struct hashcat_ctx *, const void *, const size_t)) { if (event == NULL) { fprintf (stderr, "Event callback function is mandatory\n"); return -1; } hashcat_ctx->event = event; hashcat_ctx->bitmap_ctx = (bitmap_ctx_t *) hcmalloc (sizeof (bitmap_ctx_t)); hashcat_ctx->combinator_ctx = (combinator_ctx_t *) hcmalloc (sizeof (combinator_ctx_t)); hashcat_ctx->cpt_ctx = (cpt_ctx_t *) hcmalloc (sizeof (cpt_ctx_t)); hashcat_ctx->debugfile_ctx = (debugfile_ctx_t *) hcmalloc (sizeof (debugfile_ctx_t)); hashcat_ctx->dictstat_ctx = (dictstat_ctx_t *) hcmalloc (sizeof (dictstat_ctx_t)); hashcat_ctx->event_ctx = (event_ctx_t *) hcmalloc (sizeof (event_ctx_t)); hashcat_ctx->folder_config = (folder_config_t *) hcmalloc (sizeof (folder_config_t)); hashcat_ctx->hashcat_user = (hashcat_user_t *) hcmalloc (sizeof (hashcat_user_t)); hashcat_ctx->hashconfig = (hashconfig_t *) hcmalloc (sizeof (hashconfig_t)); hashcat_ctx->hashes = (hashes_t *) hcmalloc (sizeof (hashes_t)); hashcat_ctx->hwmon_ctx = (hwmon_ctx_t *) hcmalloc (sizeof (hwmon_ctx_t)); hashcat_ctx->induct_ctx = (induct_ctx_t *) hcmalloc (sizeof (induct_ctx_t)); hashcat_ctx->logfile_ctx = (logfile_ctx_t *) hcmalloc (sizeof (logfile_ctx_t)); hashcat_ctx->loopback_ctx = (loopback_ctx_t *) hcmalloc (sizeof (loopback_ctx_t)); hashcat_ctx->mask_ctx = (mask_ctx_t *) hcmalloc (sizeof (mask_ctx_t)); hashcat_ctx->opencl_ctx = (opencl_ctx_t *) hcmalloc (sizeof (opencl_ctx_t)); hashcat_ctx->outcheck_ctx = (outcheck_ctx_t *) hcmalloc (sizeof (outcheck_ctx_t)); hashcat_ctx->outfile_ctx = (outfile_ctx_t *) hcmalloc (sizeof (outfile_ctx_t)); hashcat_ctx->pidfile_ctx = (pidfile_ctx_t *) hcmalloc (sizeof (pidfile_ctx_t)); hashcat_ctx->potfile_ctx = (potfile_ctx_t *) hcmalloc (sizeof (potfile_ctx_t)); hashcat_ctx->restore_ctx = (restore_ctx_t *) hcmalloc (sizeof (restore_ctx_t)); hashcat_ctx->status_ctx = (status_ctx_t *) hcmalloc (sizeof (status_ctx_t)); hashcat_ctx->straight_ctx = (straight_ctx_t *) hcmalloc (sizeof (straight_ctx_t)); hashcat_ctx->tuning_db = (tuning_db_t *) hcmalloc (sizeof (tuning_db_t)); hashcat_ctx->user_options_extra = (user_options_extra_t *) hcmalloc (sizeof (user_options_extra_t)); hashcat_ctx->user_options = (user_options_t *) hcmalloc (sizeof (user_options_t)); hashcat_ctx->wl_data = (wl_data_t *) hcmalloc (sizeof (wl_data_t)); return 0; } void hashcat_destroy (hashcat_ctx_t *hashcat_ctx) { hcfree (hashcat_ctx->bitmap_ctx); hcfree (hashcat_ctx->combinator_ctx); hcfree (hashcat_ctx->cpt_ctx); hcfree (hashcat_ctx->debugfile_ctx); hcfree (hashcat_ctx->dictstat_ctx); hcfree (hashcat_ctx->event_ctx); hcfree (hashcat_ctx->folder_config); hcfree (hashcat_ctx->hashconfig); hcfree (hashcat_ctx->hashes); hcfree (hashcat_ctx->hwmon_ctx); hcfree (hashcat_ctx->induct_ctx); hcfree (hashcat_ctx->logfile_ctx); hcfree (hashcat_ctx->loopback_ctx); hcfree (hashcat_ctx->mask_ctx); hcfree (hashcat_ctx->opencl_ctx); hcfree (hashcat_ctx->outcheck_ctx); hcfree (hashcat_ctx->outfile_ctx); hcfree (hashcat_ctx->pidfile_ctx); hcfree (hashcat_ctx->potfile_ctx); hcfree (hashcat_ctx->restore_ctx); hcfree (hashcat_ctx->status_ctx); hcfree (hashcat_ctx->straight_ctx); hcfree (hashcat_ctx->tuning_db); hcfree (hashcat_ctx->user_options_extra); hcfree (hashcat_ctx->user_options); hcfree (hashcat_ctx->wl_data); memset (hashcat_ctx, 0, sizeof (hashcat_ctx_t)); } int hashcat_session_init (hashcat_ctx_t *hashcat_ctx, const char *install_folder, const char *shared_folder, int argc, char **argv, const int comptime) { user_options_t *user_options = hashcat_ctx->user_options; /** * make it a bit more comfortable to use some of the special modes in hashcat */ user_options_session_auto (hashcat_ctx); /** * event init (needed for logging so should be first) */ const int rc_event_init = event_ctx_init (hashcat_ctx); if (rc_event_init == -1) return -1; /** * status init */ const int rc_status_init = status_ctx_init (hashcat_ctx); if (rc_status_init == -1) return -1; /** * folder */ const int rc_folder_config_init = folder_config_init (hashcat_ctx, install_folder, shared_folder); if (rc_folder_config_init == -1) return -1; /** * pidfile */ const int rc_pidfile_init = pidfile_ctx_init (hashcat_ctx); if (rc_pidfile_init == -1) return -1; /** * restore */ const int rc_restore_init = restore_ctx_init (hashcat_ctx, argc, argv); if (rc_restore_init == -1) return -1; /** * process user input */ user_options_preprocess (hashcat_ctx); user_options_extra_init (hashcat_ctx); user_options_postprocess (hashcat_ctx); /** * logfile */ const int rc_logfile_init = logfile_init (hashcat_ctx); if (rc_logfile_init == -1) return -1; /** * cpu affinity */ const int rc_affinity = set_cpu_affinity (hashcat_ctx); if (rc_affinity == -1) return -1; /** * prepare seeding for random number generator, required by logfile and rules generator */ setup_seeding (user_options->rp_gen_seed_chgd, user_options->rp_gen_seed); /** * To help users a bit */ setup_environment_variables (); setup_umask (); /** * tuning db */ const int rc_tuning_db = tuning_db_init (hashcat_ctx); if (rc_tuning_db == -1) return -1; /** * induction directory */ const int rc_induct_ctx_init = induct_ctx_init (hashcat_ctx); if (rc_induct_ctx_init == -1) return -1; /** * outfile-check directory */ const int rc_outcheck_ctx_init = outcheck_ctx_init (hashcat_ctx); if (rc_outcheck_ctx_init == -1) return -1; /** * outfile itself */ const int rc_outfile_init = outfile_init (hashcat_ctx); if (rc_outfile_init == -1) return -1; /** * potfile init * this is only setting path because potfile can be used in read and write mode depending on user options * plus it depends on hash_mode, so we continue using it in outer_loop */ const int rc_potfile_init = potfile_init (hashcat_ctx); if (rc_potfile_init == -1) return -1; /** * dictstat init */ const int rc_dictstat_init = dictstat_init (hashcat_ctx); if (rc_dictstat_init == -1) return -1; /** * loopback init */ const int rc_loopback_init = loopback_init (hashcat_ctx); if (rc_loopback_init == -1) return -1; /** * debugfile init */ const int rc_debugfile_init = debugfile_init (hashcat_ctx); if (rc_debugfile_init == -1) return -1; /** * Try to detect if all the files we're going to use are accessible in the mode we want them */ const int rc_user_options_check_files = user_options_check_files (hashcat_ctx); if (rc_user_options_check_files == -1) return -1; /** * Init OpenCL library loader */ const int rc_opencl_init = opencl_ctx_init (hashcat_ctx); if (rc_opencl_init == -1) return -1; /** * Init OpenCL devices */ const int rc_devices_init = opencl_ctx_devices_init (hashcat_ctx, comptime); if (rc_devices_init == -1) return -1; /** * HM devices: init */ const int rc_hwmon_init = hwmon_ctx_init (hashcat_ctx); if (rc_hwmon_init == -1) return -1; // done return 0; } int hashcat_session_execute (hashcat_ctx_t *hashcat_ctx) { logfile_ctx_t *logfile_ctx = hashcat_ctx->logfile_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; user_options_t *user_options = hashcat_ctx->user_options; // start logfile entry const hc_time_t proc_start = hc_time (NULL); logfile_generate_topid (hashcat_ctx); logfile_top_msg ("START"); // add all user options to logfile in case we want to debug some user session user_options_logger (hashcat_ctx); // read dictionary cache dictstat_read (hashcat_ctx); /** * outer loop */ EVENT (EVENT_OUTERLOOP_STARTING); int rc_final = -1; if (user_options->benchmark == true) { user_options->quiet = true; if (user_options->hash_mode_chgd == true) { rc_final = outer_loop (hashcat_ctx); if (rc_final == -1) myabort (hashcat_ctx); } else { for (u32 algorithm_pos = 0; algorithm_pos < DEFAULT_BENCHMARK_ALGORITHMS_CNT; algorithm_pos++) { user_options->hash_mode = DEFAULT_BENCHMARK_ALGORITHMS_BUF[algorithm_pos]; rc_final = outer_loop (hashcat_ctx); if (rc_final == -1) myabort (hashcat_ctx); if (status_ctx->run_main_level1 == false) break; } } user_options->quiet = false; } else { if (user_options->speed_only == true) user_options->quiet = true; rc_final = outer_loop (hashcat_ctx); if (rc_final == -1) myabort (hashcat_ctx); if (user_options->speed_only == true) user_options->quiet = false; } EVENT (EVENT_OUTERLOOP_FINISHED); // if exhausted or cracked, unlink the restore file unlink_restore (hashcat_ctx); // final update dictionary cache dictstat_write (hashcat_ctx); // final logfile entry const hc_time_t proc_stop = hc_time (NULL); logfile_top_uint (proc_start); logfile_top_uint (proc_stop); logfile_top_msg ("STOP"); // free memory if (rc_final == 0) { if (status_ctx->devices_status == STATUS_ABORTED_RUNTIME) rc_final = 4; if (status_ctx->devices_status == STATUS_ABORTED_CHECKPOINT) rc_final = 3; if (status_ctx->devices_status == STATUS_ABORTED) rc_final = 2; if (status_ctx->devices_status == STATUS_QUIT) rc_final = 2; if (status_ctx->devices_status == STATUS_EXHAUSTED) rc_final = 1; if (status_ctx->devices_status == STATUS_CRACKED) rc_final = 0; } // done return rc_final; } int hashcat_session_pause (hashcat_ctx_t *hashcat_ctx) { return SuspendThreads (hashcat_ctx); } int hashcat_session_resume (hashcat_ctx_t *hashcat_ctx) { return ResumeThreads (hashcat_ctx); } int hashcat_session_bypass (hashcat_ctx_t *hashcat_ctx) { return bypass (hashcat_ctx); } int hashcat_session_checkpoint (hashcat_ctx_t *hashcat_ctx) { return stop_at_checkpoint (hashcat_ctx); } int hashcat_session_quit (hashcat_ctx_t *hashcat_ctx) { return myabort (hashcat_ctx); } int hashcat_session_destroy (hashcat_ctx_t *hashcat_ctx) { debugfile_destroy (hashcat_ctx); dictstat_destroy (hashcat_ctx); folder_config_destroy (hashcat_ctx); hwmon_ctx_destroy (hashcat_ctx); induct_ctx_destroy (hashcat_ctx); logfile_destroy (hashcat_ctx); loopback_destroy (hashcat_ctx); opencl_ctx_devices_destroy (hashcat_ctx); opencl_ctx_destroy (hashcat_ctx); outcheck_ctx_destroy (hashcat_ctx); outfile_destroy (hashcat_ctx); pidfile_ctx_destroy (hashcat_ctx); potfile_destroy (hashcat_ctx); restore_ctx_destroy (hashcat_ctx); tuning_db_destroy (hashcat_ctx); user_options_destroy (hashcat_ctx); user_options_extra_destroy (hashcat_ctx); status_ctx_destroy (hashcat_ctx); event_ctx_destroy (hashcat_ctx); return 0; } char *hashcat_get_log (hashcat_ctx_t *hashcat_ctx) { event_ctx_t *event_ctx = hashcat_ctx->event_ctx; return event_ctx->msg_buf; } int hashcat_get_status (hashcat_ctx_t *hashcat_ctx, hashcat_status_t *hashcat_status) { const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; memset (hashcat_status, 0, sizeof (hashcat_status_t)); if (status_ctx == NULL) return -1; // way too early if (status_ctx->accessible == false) { if (status_ctx->hashcat_status_final->msec_running > 0) { memcpy (hashcat_status, status_ctx->hashcat_status_final, sizeof (hashcat_status_t)); return 0; } return -1; // still too early } hashcat_status->digests_cnt = status_get_digests_cnt (hashcat_ctx); hashcat_status->digests_done = status_get_digests_done (hashcat_ctx); hashcat_status->digests_percent = status_get_digests_percent (hashcat_ctx); hashcat_status->hash_target = status_get_hash_target (hashcat_ctx); hashcat_status->hash_type = status_get_hash_type (hashcat_ctx); hashcat_status->guess_base = status_get_guess_base (hashcat_ctx); hashcat_status->guess_base_offset = status_get_guess_base_offset (hashcat_ctx); hashcat_status->guess_base_count = status_get_guess_base_count (hashcat_ctx); hashcat_status->guess_base_percent = status_get_guess_base_percent (hashcat_ctx); hashcat_status->guess_mod = status_get_guess_mod (hashcat_ctx); hashcat_status->guess_mod_offset = status_get_guess_mod_offset (hashcat_ctx); hashcat_status->guess_mod_count = status_get_guess_mod_count (hashcat_ctx); hashcat_status->guess_mod_percent = status_get_guess_mod_percent (hashcat_ctx); hashcat_status->guess_charset = status_get_guess_charset (hashcat_ctx); hashcat_status->guess_mask_length = status_get_guess_mask_length (hashcat_ctx); hashcat_status->guess_mode = status_get_guess_mode (hashcat_ctx); hashcat_status->msec_paused = status_get_msec_paused (hashcat_ctx); hashcat_status->msec_running = status_get_msec_running (hashcat_ctx); hashcat_status->msec_real = status_get_msec_real (hashcat_ctx); hashcat_status->progress_mode = status_get_progress_mode (hashcat_ctx); hashcat_status->progress_finished_percent = status_get_progress_finished_percent (hashcat_ctx); hashcat_status->progress_cur_relative_skip = status_get_progress_cur_relative_skip (hashcat_ctx); hashcat_status->progress_cur = status_get_progress_cur (hashcat_ctx); hashcat_status->progress_done = status_get_progress_done (hashcat_ctx); hashcat_status->progress_end_relative_skip = status_get_progress_end_relative_skip (hashcat_ctx); hashcat_status->progress_end = status_get_progress_end (hashcat_ctx); hashcat_status->progress_ignore = status_get_progress_ignore (hashcat_ctx); hashcat_status->progress_rejected = status_get_progress_rejected (hashcat_ctx); hashcat_status->progress_rejected_percent = status_get_progress_rejected_percent (hashcat_ctx); hashcat_status->progress_restored = status_get_progress_restored (hashcat_ctx); hashcat_status->progress_skip = status_get_progress_skip (hashcat_ctx); hashcat_status->restore_point = status_get_restore_point (hashcat_ctx); hashcat_status->restore_total = status_get_restore_total (hashcat_ctx); hashcat_status->restore_percent = status_get_restore_percent (hashcat_ctx); hashcat_status->salts_cnt = status_get_salts_cnt (hashcat_ctx); hashcat_status->salts_done = status_get_salts_done (hashcat_ctx); hashcat_status->salts_percent = status_get_salts_percent (hashcat_ctx); hashcat_status->session = status_get_session (hashcat_ctx); hashcat_status->status_string = status_get_status_string (hashcat_ctx); hashcat_status->status_number = status_get_status_number (hashcat_ctx); hashcat_status->time_estimated_absolute = status_get_time_estimated_absolute (hashcat_ctx); hashcat_status->time_estimated_relative = status_get_time_estimated_relative (hashcat_ctx); hashcat_status->time_started_absolute = status_get_time_started_absolute (hashcat_ctx); hashcat_status->time_started_relative = status_get_time_started_relative (hashcat_ctx); hashcat_status->cpt_cur_min = status_get_cpt_cur_min (hashcat_ctx); hashcat_status->cpt_cur_hour = status_get_cpt_cur_hour (hashcat_ctx); hashcat_status->cpt_cur_day = status_get_cpt_cur_day (hashcat_ctx); hashcat_status->cpt_avg_min = status_get_cpt_avg_min (hashcat_ctx); hashcat_status->cpt_avg_hour = status_get_cpt_avg_hour (hashcat_ctx); hashcat_status->cpt_avg_day = status_get_cpt_avg_day (hashcat_ctx); hashcat_status->cpt = status_get_cpt (hashcat_ctx); // multiple devices hashcat_status->device_info_cnt = status_get_device_info_cnt (hashcat_ctx); hashcat_status->device_info_active = status_get_device_info_active (hashcat_ctx); for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) { device_info_t *device_info = hashcat_status->device_info_buf + device_id; device_info->skipped_dev = status_get_skipped_dev (hashcat_ctx, device_id); device_info->hashes_msec_dev = status_get_hashes_msec_dev (hashcat_ctx, device_id); device_info->hashes_msec_dev_benchmark = status_get_hashes_msec_dev_benchmark (hashcat_ctx, device_id); device_info->exec_msec_dev = status_get_exec_msec_dev (hashcat_ctx, device_id); device_info->speed_sec_dev = status_get_speed_sec_dev (hashcat_ctx, device_id); device_info->guess_candidates_dev = status_get_guess_candidates_dev (hashcat_ctx, device_id); device_info->hwmon_dev = status_get_hwmon_dev (hashcat_ctx, device_id); device_info->corespeed_dev = status_get_corespeed_dev (hashcat_ctx, device_id); device_info->memoryspeed_dev = status_get_memoryspeed_dev (hashcat_ctx, device_id); device_info->progress_dev = status_get_progress_dev (hashcat_ctx, device_id); device_info->runtime_msec_dev = status_get_runtime_msec_dev (hashcat_ctx, device_id); } hashcat_status->hashes_msec_all = status_get_hashes_msec_all (hashcat_ctx); hashcat_status->exec_msec_all = status_get_exec_msec_all (hashcat_ctx); hashcat_status->speed_sec_all = status_get_speed_sec_all (hashcat_ctx); return 0; } hashcat-4.0.1/src/hashes.c000066400000000000000000001325331320027462700153470ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "hashes.h" #include "convert.h" #include "debugfile.h" #include "filehandling.h" #include "hlfmt.h" #include "interface.h" #include "logfile.h" #include "loopback.h" #include "mpsp.h" #include "opencl.h" #include "outfile.h" #include "potfile.h" #include "rp.h" #include "shared.h" #include "thread.h" #include "timer.h" #include "locking.h" int sort_by_digest_p0p1 (const void *v1, const void *v2, void *v3) { const u32 *d1 = (const u32 *) v1; const u32 *d2 = (const u32 *) v2; hashconfig_t *hashconfig = (hashconfig_t *) v3; const u32 dgst_pos0 = hashconfig->dgst_pos0; const u32 dgst_pos1 = hashconfig->dgst_pos1; const u32 dgst_pos2 = hashconfig->dgst_pos2; const u32 dgst_pos3 = hashconfig->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; } 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 = (int) s1->salt_len - (int) s2->salt_len; if (res1 != 0) return (res1); const int res2 = (int) s1->salt_iter - (int) s2->salt_iter; if (res2 != 0) return (res2); for (int n = 0; n < 64; n++) { if (s1->salt_buf[n] > s2->salt_buf[n]) return 1; if (s1->salt_buf[n] < s2->salt_buf[n]) return -1; } for (int n = 0; n < 64; 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_hash (const void *v1, const void *v2, void *v3) { const hash_t *h1 = (const hash_t *) v1; const hash_t *h2 = (const hash_t *) v2; hashconfig_t *hashconfig = (hashconfig_t *) v3; if (hashconfig->is_salted == true) { 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 sort_by_digest_p0p1 (d1, d2, v3); } int sort_by_hash_no_salt (const void *v1, const void *v2, void *v3) { 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 sort_by_digest_p0p1 (d1, d2, v3); } int save_hash (hashcat_ctx_t *hashcat_ctx) { hashes_t *hashes = hashcat_ctx->hashes; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; user_options_t *user_options = hashcat_ctx->user_options; const char *hashfile = hashes->hashfile; char *new_hashfile; char *old_hashfile; hc_asprintf (&new_hashfile, "%s.new", hashfile); hc_asprintf (&old_hashfile, "%s.old", hashfile); unlink (new_hashfile); char separator = hashconfig->separator; FILE *fp = fopen (new_hashfile, "wb"); if (fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", new_hashfile, strerror (errno)); free (new_hashfile); free (old_hashfile); return -1; } if (lock_file (fp) == -1) { fclose (fp); event_log_error (hashcat_ctx, "%s: %s", new_hashfile, strerror (errno)); free (new_hashfile); free (old_hashfile); return -1; } u8 *out_buf = (u8 *) hcmalloc (HCBUFSIZ_LARGE); for (u32 salt_pos = 0; salt_pos < hashes->salts_cnt; salt_pos++) { if (hashes->salts_shown[salt_pos] == 1) continue; salt_t *salt_buf = &hashes->salts_buf[salt_pos]; for (u32 digest_pos = 0; digest_pos < salt_buf->digests_cnt; digest_pos++) { u32 idx = salt_buf->digests_offset + digest_pos; if (hashes->digests_shown[idx] == 1) continue; if (hashconfig->opts_type & OPTS_TYPE_BINARY_HASHFILE) { if ((hashconfig->hash_mode == 2500) || (hashconfig->hash_mode == 2501)) { hccapx_t hccapx; to_hccapx_t (hashcat_ctx, &hccapx, salt_pos, digest_pos); hc_fwrite (&hccapx, sizeof (hccapx_t), 1, fp); } else { // TODO } } else { if (user_options->username == true) { user_t *user = hashes->hash_info[idx]->user; u32 i; for (i = 0; i < user->user_len; i++) fputc (user->user_name[i], fp); fputc (separator, fp); } out_buf[0] = 0; ascii_digest (hashcat_ctx, (char *) out_buf, HCBUFSIZ_LARGE, salt_pos, digest_pos); fprintf (fp, "%s" EOL, out_buf); } } } hcfree (out_buf); fflush (fp); fclose (fp); unlink (old_hashfile); if (rename (hashfile, old_hashfile) != 0) { event_log_error (hashcat_ctx, "Rename file '%s' to '%s': %s", hashfile, old_hashfile, strerror (errno)); free (new_hashfile); free (old_hashfile); return -1; } unlink (hashfile); if (rename (new_hashfile, hashfile) != 0) { event_log_error (hashcat_ctx, "Rename file '%s' to '%s': %s", new_hashfile, hashfile, strerror (errno)); free (new_hashfile); free (old_hashfile); return -1; } unlink (old_hashfile); free (new_hashfile); free (old_hashfile); return 0; } void check_hash (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, plain_t *plain) { debugfile_ctx_t *debugfile_ctx = hashcat_ctx->debugfile_ctx; loopback_ctx_t *loopback_ctx = hashcat_ctx->loopback_ctx; hashes_t *hashes = hashcat_ctx->hashes; const u32 salt_pos = plain->salt_pos; const u32 digest_pos = plain->digest_pos; // relative // hash u8 *out_buf = hashes->out_buf; out_buf[0] = 0; ascii_digest (hashcat_ctx, (char *) out_buf, HCBUFSIZ_LARGE, salt_pos, digest_pos); // plain u32 plain_buf[64] = { 0 }; u8 *plain_ptr = (u8 *) plain_buf; int plain_len = 0; build_plain (hashcat_ctx, device_param, plain, plain_buf, &plain_len); // crackpos u64 crackpos = 0; build_crackpos (hashcat_ctx, device_param, plain, &crackpos); // debug u8 debug_rule_buf[RP_PASSWORD_SIZE] = { 0 }; int debug_rule_len = 0; // -1 error u8 debug_plain_ptr[RP_PASSWORD_SIZE] = { 0 }; int debug_plain_len = 0; build_debugdata (hashcat_ctx, device_param, plain, debug_rule_buf, &debug_rule_len, debug_plain_ptr, &debug_plain_len); // no need for locking, we're in a mutex protected function potfile_write_append (hashcat_ctx, (char *) out_buf, plain_ptr, plain_len); // outfile, can be either to file or stdout // if an error occurs opening the file, send to stdout as fallback // the fp gets opened for each cracked hash so that the user can modify (move) the outfile while hashcat runs outfile_write_open (hashcat_ctx); u8 *tmp_buf = hashes->tmp_buf; tmp_buf[0] = 0; const int tmp_len = outfile_write (hashcat_ctx, (char *) out_buf, plain_ptr, plain_len, crackpos, NULL, 0, (char *) tmp_buf); outfile_write_close (hashcat_ctx); EVENT_DATA (EVENT_CRACKER_HASH_CRACKED, tmp_buf, tmp_len); // if enabled, update also the loopback file if (loopback_ctx->fp != NULL) { loopback_write_append (hashcat_ctx, plain_ptr, plain_len); } // if enabled, update also the (rule) debug file if (debugfile_ctx->fp != NULL) { // the next check implies that: // - (user_options->attack_mode == ATTACK_MODE_STRAIGHT) // - debug_mode > 0 if ((debug_plain_len > 0) || (debug_rule_len > 0)) { debugfile_write_append (hashcat_ctx, debug_rule_buf, debug_rule_len, plain_ptr, plain_len, debug_plain_ptr, debug_plain_len); } } } int check_cracked (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 salt_pos) { cpt_ctx_t *cpt_ctx = hashcat_ctx->cpt_ctx; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; salt_t *salt_buf = &hashes->salts_buf[salt_pos]; u32 num_cracked; cl_int CL_err; CL_err = hc_clEnqueueReadBuffer (hashcat_ctx, device_param->command_queue, device_param->d_result, CL_TRUE, 0, sizeof (u32), &num_cracked, 0, NULL, NULL); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clEnqueueReadBuffer(): %s", val2cstr_cl (CL_err)); return -1; } if (num_cracked) { plain_t *cracked = (plain_t *) hccalloc (num_cracked, sizeof (plain_t)); CL_err = hc_clEnqueueReadBuffer (hashcat_ctx, device_param->command_queue, device_param->d_plain_bufs, CL_TRUE, 0, num_cracked * sizeof (plain_t), cracked, 0, NULL, NULL); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clEnqueueReadBuffer(): %s", val2cstr_cl (CL_err)); return -1; } u32 cpt_cracked = 0; hc_thread_mutex_lock (status_ctx->mux_display); for (u32 i = 0; i < num_cracked; i++) { const u32 hash_pos = cracked[i].hash_pos; if (hashes->digests_shown[hash_pos] == 1) continue; if ((hashconfig->opts_type & OPTS_TYPE_PT_NEVERCRACK) == 0) { hashes->digests_shown[hash_pos] = 1; hashes->digests_done++; cpt_cracked++; salt_buf->digests_done++; if (salt_buf->digests_done == salt_buf->digests_cnt) { hashes->salts_shown[salt_pos] = 1; hashes->salts_done++; } } if (hashes->salts_done == hashes->salts_cnt) mycracked (hashcat_ctx); check_hash (hashcat_ctx, device_param, &cracked[i]); } hc_thread_mutex_unlock (status_ctx->mux_display); hcfree (cracked); if (cpt_cracked > 0) { hc_thread_mutex_lock (status_ctx->mux_display); cpt_ctx->cpt_buf[cpt_ctx->cpt_pos].timestamp = hc_time (NULL); cpt_ctx->cpt_buf[cpt_ctx->cpt_pos].cracked = cpt_cracked; cpt_ctx->cpt_pos++; cpt_ctx->cpt_total += cpt_cracked; if (cpt_ctx->cpt_pos == CPT_CACHE) cpt_ctx->cpt_pos = 0; hc_thread_mutex_unlock (status_ctx->mux_display); } if (hashconfig->opts_type & OPTS_TYPE_PT_NEVERCRACK) { // we need to reset cracked state on the device // otherwise host thinks again and again the hash was cracked // and returns invalid password each time memset (hashes->digests_shown_tmp, 0, salt_buf->digests_cnt * sizeof (u32)); CL_err = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_digests_shown, CL_TRUE, salt_buf->digests_offset * sizeof (u32), salt_buf->digests_cnt * sizeof (u32), &hashes->digests_shown_tmp[salt_buf->digests_offset], 0, NULL, NULL); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clEnqueueWriteBuffer(): %s", val2cstr_cl (CL_err)); return -1; } } num_cracked = 0; CL_err = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_result, CL_TRUE, 0, sizeof (u32), &num_cracked, 0, NULL, NULL); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clEnqueueWriteBuffer(): %s", val2cstr_cl (CL_err)); return -1; } } return 0; } int hashes_init_stage1 (hashcat_ctx_t *hashcat_ctx) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; user_options_t *user_options = hashcat_ctx->user_options; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; char *hash_or_file = user_options_extra->hc_hash; /** * load hashes, part I: find input mode, count hashes */ u32 hashlist_mode = 0; u32 hashlist_format = HLFMT_HASHCAT; u32 hashes_avail = 0; if ((user_options->benchmark == false) && (user_options->stdout_flag == false) && (user_options->keyspace == false)) { hashlist_mode = (hc_path_exist (hash_or_file) == true) ? HL_MODE_FILE : HL_MODE_ARG; if (hashconfig->opts_type & OPTS_TYPE_BINARY_HASHFILE) { hashlist_mode = HL_MODE_ARG; char *hashfile = hash_or_file; hashes->hashfile = hashfile; } if (hashlist_mode == HL_MODE_ARG) { if ((hashconfig->hash_mode == 2500) || (hashconfig->hash_mode == 2501)) { hc_stat_t st; if (hc_stat (hashes->hashfile, &st) == -1) { event_log_error (hashcat_ctx, "%s: %s", hashes->hashfile, strerror (errno)); return -1; } // 392 = old hccap_t size if ((st.st_size % 392) == 0) { const int rc = check_old_hccap (hashes->hashfile); if (rc == 1) { event_log_error (hashcat_ctx, "%s: Old hccap format detected! You need to update: https://hashcat.net/q/hccapx", hashes->hashfile); return -1; } } hashes_avail = st.st_size / sizeof (hccapx_t); } else if (hashconfig->hash_mode == 14600) { hc_stat_t st; if (hc_stat (hashes->hashfile, &st) == -1) { event_log_error (hashcat_ctx, "%s: %s", hashes->hashfile, strerror (errno)); return -1; } hashes_avail = LUKS_NUMKEYS; } else { hashes_avail = 1; } } else if (hashlist_mode == HL_MODE_FILE) { char *hashfile = hash_or_file; hashes->hashfile = hashfile; FILE *fp = NULL; if ((fp = fopen (hashfile, "rb")) == NULL) { event_log_error (hashcat_ctx, "%s: %s", hashfile, strerror (errno)); return -1; } EVENT_DATA (EVENT_HASHLIST_COUNT_LINES_PRE, hashfile, strlen (hashfile)); hashes_avail = count_lines (fp); EVENT_DATA (EVENT_HASHLIST_COUNT_LINES_POST, hashfile, strlen (hashfile)); rewind (fp); if (hashes_avail == 0) { event_log_error (hashcat_ctx, "hashfile is empty or corrupt."); fclose (fp); return -1; } hashlist_format = hlfmt_detect (hashcat_ctx, fp, 100); // 100 = max numbers to "scan". could be hashes_avail, too if ((user_options->remove == true) && (hashlist_format != HLFMT_HASHCAT)) { event_log_error (hashcat_ctx, "Use of --remove is not supported in native hashfile-format mode."); fclose (fp); return -1; } fclose (fp); } } else { hashlist_mode = HL_MODE_ARG; hashes_avail = 1; } if (hashconfig->hash_mode == 3000) hashes_avail *= 2; hashes->hashlist_mode = hashlist_mode; hashes->hashlist_format = hashlist_format; /** * load hashes, part II: allocate required memory, set pointers */ hash_t *hashes_buf = (hash_t *) hccalloc (hashes_avail, sizeof (hash_t)); void *digests_buf = hccalloc (hashes_avail, hashconfig->dgst_size); salt_t *salts_buf = NULL; void *esalts_buf = NULL; void *hook_salts_buf = NULL; if ((user_options->username == true) || (hashconfig->opts_type & OPTS_TYPE_HASH_COPY) || (hashconfig->opts_type & OPTS_TYPE_HASH_SPLIT)) { u32 hash_pos; for (hash_pos = 0; hash_pos < hashes_avail; hash_pos++) { hashinfo_t *hash_info = (hashinfo_t *) hcmalloc (sizeof (hashinfo_t)); hashes_buf[hash_pos].hash_info = hash_info; if (user_options->username == true) { hash_info->user = (user_t *) hcmalloc (sizeof (user_t)); } if (hashconfig->opts_type & OPTS_TYPE_HASH_COPY) { if (user_options->benchmark == false) { hash_info->orighash = (char *) hcmalloc (256); } } if (hashconfig->opts_type & OPTS_TYPE_HASH_SPLIT) { hash_info->split = (split_t *) hcmalloc (sizeof (split_t)); } } } if (hashconfig->is_salted == true) { salts_buf = (salt_t *) hccalloc (hashes_avail, sizeof (salt_t)); if (hashconfig->esalt_size > 0) { esalts_buf = hccalloc (hashes_avail, hashconfig->esalt_size); } if (hashconfig->hook_salt_size > 0) { hook_salts_buf = (seven_zip_hook_salt_t *) hccalloc (hashes_avail, hashconfig->hook_salt_size); } } else { salts_buf = (salt_t *) hccalloc (1, sizeof (salt_t)); } for (u32 hash_pos = 0; hash_pos < hashes_avail; hash_pos++) { hashes_buf[hash_pos].digest = ((char *) digests_buf) + (hash_pos * hashconfig->dgst_size); if (hashconfig->is_salted == true) { hashes_buf[hash_pos].salt = &salts_buf[hash_pos]; if (hashconfig->esalt_size > 0) { hashes_buf[hash_pos].esalt = ((char *) esalts_buf) + (hash_pos * hashconfig->esalt_size); } if (hashconfig->hook_salt_size > 0) { hashes_buf[hash_pos].hook_salt = ((char *) hook_salts_buf) + (hash_pos * hashconfig->hook_salt_size); } } else { hashes_buf[hash_pos].salt = &salts_buf[0]; } } hashes->hashes_buf = hashes_buf; hashes->digests_buf = digests_buf; hashes->salts_buf = salts_buf; hashes->esalts_buf = esalts_buf; hashes->hook_salts_buf = hook_salts_buf; /** * load hashes, part III: parse hashes or generate them if benchmark */ u32 hashes_cnt = 0; if (user_options->benchmark == true) { hashconfig_benchmark_defaults (hashcat_ctx, hashes_buf[0].salt, hashes_buf[0].esalt, hashes_buf[0].hook_salt); hashes->hashfile = "-"; hashes_cnt = 1; } else if (user_options->example_hashes == true) { } else if (user_options->keyspace == true) { } else if (user_options->stdout_flag == true) { } else if (user_options->opencl_info == true) { } else { if (hashes_avail == 0) { // ??? } else if (hashlist_mode == HL_MODE_ARG) { char *input_buf = hash_or_file; u32 input_len = strlen (input_buf); char *hash_buf = NULL; int hash_len = 0; hlfmt_hash (hashcat_ctx, hashlist_format, input_buf, input_len, &hash_buf, &hash_len); bool hash_fmt_error = 0; if (hash_len < 1) hash_fmt_error = 1; if (hash_buf == NULL) hash_fmt_error = 1; if (hash_fmt_error) { event_log_warning (hashcat_ctx, "Failed to parse hashes using the '%s' format.", strhlfmt (hashlist_format)); } else { if (hashconfig->opts_type & OPTS_TYPE_HASH_COPY) { hashinfo_t *hash_info_tmp = hashes_buf[hashes_cnt].hash_info; hash_info_tmp->orighash = hcstrdup (hash_buf); } if (hashconfig->is_salted == true) { memset (hashes_buf[0].salt, 0, sizeof (salt_t)); } if (hashconfig->esalt_size > 0) { memset (hashes_buf[0].esalt, 0, hashconfig->esalt_size); } if (hashconfig->hook_salt_size > 0) { memset (hashes_buf[0].hook_salt, 0, hashconfig->hook_salt_size); } int parser_status = PARSER_OK; if ((hashconfig->hash_mode == 2500) || (hashconfig->hash_mode == 2501)) { hashlist_mode = HL_MODE_FILE; hashes->hashlist_mode = hashlist_mode; FILE *fp = fopen (hash_buf, "rb"); if (fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", hash_buf, strerror (errno)); return -1; } char *in = (char *) hcmalloc (sizeof (hccapx_t)); while (!feof (fp)) { const size_t nread = hc_fread (in, sizeof (hccapx_t), 1, fp); if (nread == 0) break; if (hashes_avail == hashes_cnt) { event_log_warning (hashcat_ctx, "Hashfile '%s': File changed during runtime. Skipping new data.", hash_buf); break; } if (hashconfig->is_salted == true) { memset (hashes_buf[hashes_cnt].salt, 0, sizeof (salt_t)); } if (hashconfig->esalt_size > 0) { memset (hashes_buf[hashes_cnt].esalt, 0, hashconfig->esalt_size); if ((user_options->hash_mode == 2500) || (user_options->hash_mode == 2501)) { wpa_t *wpa = (wpa_t *) hashes_buf[hashes_cnt].esalt; if (user_options->hccapx_message_pair_chgd == true) { wpa->message_pair_chgd = (int) user_options->hccapx_message_pair_chgd; wpa->message_pair = (u8) user_options->hccapx_message_pair; } wpa->nonce_error_corrections = user_options->nonce_error_corrections; } } if (hashconfig->hook_salt_size > 0) { memset (hashes_buf[hashes_cnt].hook_salt, 0, hashconfig->hook_salt_size); } parser_status = hashconfig->parse_func ((u8 *) in, sizeof (hccapx_t), &hashes_buf[hashes_cnt], hashconfig); if (parser_status != PARSER_OK) { event_log_warning (hashcat_ctx, "Hashfile '%s': %s", hash_buf, strparser (parser_status)); continue; } hashes_cnt++; } hcfree (in); fclose (fp); } else if (hashconfig->hash_mode == 3000) { if (hash_len == 32) { parser_status = hashconfig->parse_func ((u8 *) hash_buf, 16, &hashes_buf[hashes_cnt], hashconfig); if (parser_status == PARSER_OK) { hashes_buf[hashes_cnt].hash_info->split->split_group = 0; hashes_buf[hashes_cnt].hash_info->split->split_origin = SPLIT_ORIGIN_LEFT; hashes_cnt++; } else { event_log_warning (hashcat_ctx, "Hash '%s': %s", input_buf, strparser (parser_status)); } parser_status = hashconfig->parse_func ((u8 *) hash_buf + 16, 16, &hashes_buf[hashes_cnt], hashconfig); if (parser_status == PARSER_OK) { hashes_buf[hashes_cnt].hash_info->split->split_group = 0; hashes_buf[hashes_cnt].hash_info->split->split_origin = SPLIT_ORIGIN_RIGHT; hashes_cnt++; } else { event_log_warning (hashcat_ctx, "Hash '%s': %s", input_buf, strparser (parser_status)); } } else { parser_status = hashconfig->parse_func ((u8 *) hash_buf, hash_len, &hashes_buf[hashes_cnt], hashconfig); if (parser_status == PARSER_OK) { hashes_buf[hashes_cnt].hash_info->split->split_group = 0; hashes_buf[hashes_cnt].hash_info->split->split_origin = SPLIT_ORIGIN_NONE; hashes_cnt++; } else { event_log_warning (hashcat_ctx, "Hash '%s': %s", input_buf, strparser (parser_status)); } } } else if (hashconfig->hash_mode == 14600) { hashlist_mode = HL_MODE_FILE; hashes->hashlist_mode = hashlist_mode; for (int keyslot_idx = 0; keyslot_idx < LUKS_NUMKEYS; keyslot_idx++) { parser_status = luks_parse_hash ((u8 *) hash_buf, hash_len, &hashes_buf[hashes_cnt], hashconfig, keyslot_idx); if (parser_status != PARSER_OK) { if (parser_status != PARSER_LUKS_KEY_DISABLED) { event_log_warning (hashcat_ctx, "Hashfile '%s': %s", hash_buf, strparser (parser_status)); } continue; } hashes_cnt++; } } else { parser_status = hashconfig->parse_func ((u8 *) hash_buf, hash_len, &hashes_buf[hashes_cnt], hashconfig); if (parser_status == PARSER_OK) { hashes_cnt++; } else { event_log_warning (hashcat_ctx, "Hash '%s': %s", input_buf, strparser (parser_status)); } } } } else if (hashlist_mode == HL_MODE_FILE) { const char *hashfile = hashes->hashfile; FILE *fp; if ((fp = fopen (hashfile, "rb")) == NULL) { event_log_error (hashcat_ctx, "%s: %s", hashfile, strerror (errno)); return -1; } u32 line_num = 0; char *line_buf = (char *) hcmalloc (HCBUFSIZ_LARGE); hc_time_t prev = 0; hc_time_t now = 0; while (!feof (fp)) { line_num++; int line_len = fgetl (fp, line_buf); if (line_len == 0) continue; if (hashes_avail == hashes_cnt) { event_log_warning (hashcat_ctx, "Hashfile '%s' on line %u: File changed during runtime. Skipping new data.", hashes->hashfile, line_num); break; } char *hash_buf = NULL; int hash_len = 0; hlfmt_hash (hashcat_ctx, hashlist_format, line_buf, line_len, &hash_buf, &hash_len); bool hash_fmt_error = 0; if (hash_len < 1) hash_fmt_error = 1; if (hash_buf == NULL) hash_fmt_error = 1; if (hash_fmt_error) { event_log_warning (hashcat_ctx, "Failed to parse hashes using the '%s' format.", strhlfmt (hashlist_format)); continue; } if (user_options->username == true) { char *user_buf = NULL; int user_len = 0; hlfmt_user (hashcat_ctx, hashlist_format, line_buf, line_len, &user_buf, &user_len); // special case: // both hash_t need to have the username info if the pwdump format is used (i.e. we have 2 hashes for 3000, both with same user) u32 hashes_per_user = 1; if (hashconfig->hash_mode == 3000) // the following conditions should be true if (hashlist_format == HLFMT_PWDUMP) { if (hash_len == 32) { hashes_per_user = 2; } } for (u32 i = 0; i < hashes_per_user; i++) { user_t **user = &hashes_buf[hashes_cnt + i].hash_info->user; *user = (user_t *) hcmalloc (sizeof (user_t)); user_t *user_ptr = *user; if (user_buf != NULL) { user_ptr->user_name = hcstrdup (user_buf); } else { user_ptr->user_name = hcstrdup (""); } user_ptr->user_len = user_len; } } if (hashconfig->opts_type & OPTS_TYPE_HASH_COPY) { hashinfo_t *hash_info_tmp = hashes_buf[hashes_cnt].hash_info; hash_info_tmp->orighash = hcstrdup (hash_buf); } if (hashconfig->is_salted == true) { memset (hashes_buf[hashes_cnt].salt, 0, sizeof (salt_t)); } if (hashconfig->esalt_size > 0) { memset (hashes_buf[hashes_cnt].esalt, 0, hashconfig->esalt_size); } if (hashconfig->hook_salt_size > 0) { memset (hashes_buf[hashes_cnt].hook_salt, 0, hashconfig->hook_salt_size); } if (hashconfig->hash_mode == 3000) { if (hash_len == 32) { int parser_status = hashconfig->parse_func ((u8 *) hash_buf, 16, &hashes_buf[hashes_cnt], hashconfig); if (parser_status < PARSER_GLOBAL_ZERO) { event_log_warning (hashcat_ctx, "Hashfile '%s' on line %u (%s): %s", hashes->hashfile, line_num, line_buf, strparser (parser_status)); continue; } hashes_buf[hashes_cnt].hash_info->split->split_group = line_num; hashes_buf[hashes_cnt].hash_info->split->split_origin = SPLIT_ORIGIN_LEFT; hashes_cnt++; parser_status = hashconfig->parse_func ((u8 *) hash_buf + 16, 16, &hashes_buf[hashes_cnt], hashconfig); if (parser_status < PARSER_GLOBAL_ZERO) { event_log_warning (hashcat_ctx, "Hashfile '%s' on line %u (%s): %s", hashes->hashfile, line_num, line_buf, strparser (parser_status)); continue; } hashes_buf[hashes_cnt].hash_info->split->split_group = line_num; hashes_buf[hashes_cnt].hash_info->split->split_origin = SPLIT_ORIGIN_RIGHT; hashes_cnt++; } else { int parser_status = hashconfig->parse_func ((u8 *) hash_buf, hash_len, &hashes_buf[hashes_cnt], hashconfig); if (parser_status < PARSER_GLOBAL_ZERO) { event_log_warning (hashcat_ctx, "Hashfile '%s' on line %u (%s): %s", hashes->hashfile, line_num, line_buf, strparser (parser_status)); continue; } hashes_buf[hashes_cnt].hash_info->split->split_group = line_num; hashes_buf[hashes_cnt].hash_info->split->split_origin = SPLIT_ORIGIN_NONE; hashes_cnt++; } } else { int parser_status = hashconfig->parse_func ((u8 *) hash_buf, hash_len, &hashes_buf[hashes_cnt], hashconfig); if (parser_status < PARSER_GLOBAL_ZERO) { event_log_warning (hashcat_ctx, "Hashfile '%s' on line %u (%s): %s", hashes->hashfile, line_num, line_buf, strparser (parser_status)); continue; } hashes_cnt++; } hc_time (&now); if ((now - prev) == 0) continue; hc_time (&prev); hashlist_parse_t hashlist_parse; hashlist_parse.hashes_cnt = hashes_cnt; hashlist_parse.hashes_avail = hashes_avail; EVENT_DATA (EVENT_HASHLIST_PARSE_HASH, &hashlist_parse, sizeof (hashlist_parse_t)); } hashlist_parse_t hashlist_parse; hashlist_parse.hashes_cnt = hashes_cnt; hashlist_parse.hashes_avail = hashes_avail; EVENT_DATA (EVENT_HASHLIST_PARSE_HASH, &hashlist_parse, sizeof (hashlist_parse_t)); hcfree (line_buf); fclose (fp); } } hashes->hashes_cnt = hashes_cnt; if (hashes_cnt) { EVENT (EVENT_HASHLIST_SORT_HASH_PRE); if (hashconfig->is_salted == true) { hc_qsort_r (hashes_buf, hashes_cnt, sizeof (hash_t), sort_by_hash, (void *) hashconfig); } else { hc_qsort_r (hashes_buf, hashes_cnt, sizeof (hash_t), sort_by_hash_no_salt, (void *) hashconfig); } EVENT (EVENT_HASHLIST_SORT_HASH_POST); } if (hashconfig->hash_mode == 3000) { // update split split_neighbor after sorting // see https://github.com/hashcat/hashcat/issues/1034 for good examples for testing for (u32 i = 0; i < hashes_cnt; i++) { split_t *split1 = hashes_buf[i].hash_info->split; if (split1->split_origin != SPLIT_ORIGIN_LEFT) continue; for (u32 j = 0; j < hashes_cnt; j++) { split_t *split2 = hashes_buf[j].hash_info->split; if (split2->split_origin != SPLIT_ORIGIN_RIGHT) continue; if (split1->split_group != split2->split_group) continue; split1->split_neighbor = j; split2->split_neighbor = i; break; } } } return 0; } int hashes_init_stage2 (hashcat_ctx_t *hashcat_ctx) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; user_options_t *user_options = hashcat_ctx->user_options; potfile_ctx_t *potfile_ctx = hashcat_ctx->potfile_ctx; hash_t *hashes_buf = hashes->hashes_buf; u32 hashes_cnt = hashes->hashes_cnt; /** * Remove duplicates */ EVENT (EVENT_HASHLIST_UNIQUE_HASH_PRE); u32 hashes_cnt_new = 1; for (u32 hashes_pos = 1; hashes_pos < hashes_cnt; hashes_pos++) { if (potfile_ctx->keep_all_hashes == true) { // do not sort, because we need to keep all hashes in this particular case } else if (hashconfig->is_salted == true) { if (sort_by_salt (hashes_buf[hashes_pos].salt, hashes_buf[hashes_pos - 1].salt) == 0) { if (sort_by_digest_p0p1 (hashes_buf[hashes_pos].digest, hashes_buf[hashes_pos - 1].digest, (void *) hashconfig) == 0) continue; } } else { if (sort_by_digest_p0p1 (hashes_buf[hashes_pos].digest, hashes_buf[hashes_pos - 1].digest, (void *) hashconfig) == 0) continue; } hash_t tmp; memcpy (&tmp, &hashes_buf[hashes_pos], sizeof (hash_t)); memcpy (&hashes_buf[hashes_cnt_new], &tmp, sizeof (hash_t)); hashes_cnt_new++; } for (u32 i = hashes_cnt_new; i < hashes->hashes_cnt; i++) { memset (&hashes_buf[i], 0, sizeof (hash_t)); } hashes_cnt = hashes_cnt_new; hashes->hashes_cnt = hashes_cnt; EVENT (EVENT_HASHLIST_UNIQUE_HASH_POST); /** * Now generate all the buffers required for later */ void *digests_buf_new = hccalloc (hashes_cnt, hashconfig->dgst_size); salt_t *salts_buf_new = NULL; void *esalts_buf_new = NULL; void *hook_salts_buf_new = NULL; if (hashconfig->is_salted == true) { salts_buf_new = (salt_t *) hccalloc (hashes_cnt, sizeof (salt_t)); } else { salts_buf_new = (salt_t *) hccalloc (1, sizeof (salt_t)); } if (hashconfig->esalt_size > 0) { esalts_buf_new = hccalloc (hashes_cnt, hashconfig->esalt_size); } if (hashconfig->hook_salt_size > 0) { hook_salts_buf_new = hccalloc (hashes_cnt, hashconfig->hook_salt_size); } EVENT (EVENT_HASHLIST_SORT_SALT_PRE); u32 digests_cnt = hashes_cnt; u32 digests_done = 0; u32 *digests_shown = (u32 *) hccalloc (digests_cnt, sizeof (u32)); u32 *digests_shown_tmp = (u32 *) hccalloc (digests_cnt, sizeof (u32)); u32 salts_cnt = 0; u32 salts_done = 0; hashinfo_t **hash_info = NULL; if ((user_options->username == true) || (hashconfig->opts_type & OPTS_TYPE_HASH_COPY) || (hashconfig->opts_type & OPTS_TYPE_HASH_SPLIT)) { hash_info = (hashinfo_t **) hccalloc (hashes_cnt, sizeof (hashinfo_t *)); } u32 *salts_shown = (u32 *) hccalloc (digests_cnt, sizeof (u32)); 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)); hashes_buf[0].salt = salt_buf; if (hashconfig->hook_salt_size > 0) { char *hook_salts_buf_new_ptr = ((char *) hook_salts_buf_new) + (salts_cnt * hashconfig->hook_salt_size); memcpy (hook_salts_buf_new_ptr, hashes_buf[0].hook_salt, hashconfig->hook_salt_size); hashes_buf[0].hook_salt = hook_salts_buf_new_ptr; } salt_buf->digests_cnt = 0; salt_buf->digests_done = 0; salt_buf->digests_offset = 0; salts_cnt++; } salt_buf->digests_cnt++; char *digests_buf_new_ptr = ((char *) digests_buf_new) + (0 * hashconfig->dgst_size); memcpy (digests_buf_new_ptr, hashes_buf[0].digest, hashconfig->dgst_size); hashes_buf[0].digest = digests_buf_new_ptr; if (hashconfig->esalt_size > 0) { char *esalts_buf_new_ptr = ((char *) esalts_buf_new) + (0 * hashconfig->esalt_size); memcpy (esalts_buf_new_ptr, hashes_buf[0].esalt, hashconfig->esalt_size); hashes_buf[0].esalt = esalts_buf_new_ptr; } if ((user_options->username == true) || (hashconfig->opts_type & OPTS_TYPE_HASH_COPY) || (hashconfig->opts_type & OPTS_TYPE_HASH_SPLIT)) { hash_info[0] = hashes_buf[0].hash_info; } // copy from inner loop for (u32 hashes_pos = 1; hashes_pos < hashes_cnt; hashes_pos++) { if (hashconfig->is_salted == true) { 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)); hashes_buf[hashes_pos].salt = salt_buf; if (hashconfig->hook_salt_size > 0) { char *hook_salts_buf_new_ptr = ((char *) hook_salts_buf_new) + (salts_cnt * hashconfig->hook_salt_size); memcpy (hook_salts_buf_new_ptr, hashes_buf[hashes_pos].hook_salt, hashconfig->hook_salt_size); hashes_buf[hashes_pos].hook_salt = hook_salts_buf_new_ptr; } salt_buf->digests_cnt = 0; salt_buf->digests_done = 0; salt_buf->digests_offset = hashes_pos; salts_cnt++; } hashes_buf[hashes_pos].salt = salt_buf; if (hashconfig->hook_salt_size > 0) { char *hook_salts_buf_new_ptr = ((char *) hook_salts_buf_new) + (salts_cnt * hashconfig->hook_salt_size); hashes_buf[hashes_pos].hook_salt = hook_salts_buf_new_ptr; } } salt_buf->digests_cnt++; digests_buf_new_ptr = ((char *) digests_buf_new) + (hashes_pos * hashconfig->dgst_size); memcpy (digests_buf_new_ptr, hashes_buf[hashes_pos].digest, hashconfig->dgst_size); hashes_buf[hashes_pos].digest = digests_buf_new_ptr; if (hashconfig->esalt_size > 0) { char *esalts_buf_new_ptr = ((char *) esalts_buf_new) + (hashes_pos * hashconfig->esalt_size); memcpy (esalts_buf_new_ptr, hashes_buf[hashes_pos].esalt, hashconfig->esalt_size); hashes_buf[hashes_pos].esalt = esalts_buf_new_ptr; } if ((user_options->username == true) || (hashconfig->opts_type & OPTS_TYPE_HASH_COPY) || (hashconfig->opts_type & OPTS_TYPE_HASH_SPLIT)) { hash_info[hashes_pos] = hashes_buf[hashes_pos].hash_info; } } EVENT (EVENT_HASHLIST_SORT_SALT_POST); hcfree (hashes->digests_buf); hcfree (hashes->salts_buf); hcfree (hashes->esalts_buf); hcfree (hashes->hook_salts_buf); hashes->digests_cnt = digests_cnt; hashes->digests_done = digests_done; hashes->digests_buf = digests_buf_new; hashes->digests_shown = digests_shown; hashes->digests_shown_tmp = digests_shown_tmp; hashes->salts_cnt = salts_cnt; hashes->salts_done = salts_done; hashes->salts_buf = salts_buf_new; hashes->salts_shown = salts_shown; hashes->esalts_buf = esalts_buf_new; hashes->hook_salts_buf = hook_salts_buf_new; hashes->hash_info = hash_info; return 0; } int hashes_init_stage3 (hashcat_ctx_t *hashcat_ctx) { hashes_t *hashes = hashcat_ctx->hashes; u32 digests_done = hashes->digests_done; u32 *digests_shown = hashes->digests_shown; u32 salts_cnt = hashes->salts_cnt; u32 salts_done = hashes->salts_done; u32 *salts_shown = hashes->salts_shown; hash_t *hashes_buf = hashes->hashes_buf; salt_t *salts_buf = hashes->salts_buf; for (u32 salt_idx = 0; salt_idx < salts_cnt; salt_idx++) { salt_t *salt_buf = salts_buf + salt_idx; u32 digests_cnt = salt_buf->digests_cnt; for (u32 digest_idx = 0; digest_idx < digests_cnt; digest_idx++) { const u32 hashes_idx = salt_buf->digests_offset + digest_idx; if (hashes_buf[hashes_idx].cracked == 1) { digests_shown[hashes_idx] = 1; digests_done++; salt_buf->digests_done++; } } if (salt_buf->digests_done == salt_buf->digests_cnt) { salts_shown[salt_idx] = 1; salts_done++; } if (salts_done == salts_cnt) mycracked (hashcat_ctx); } hashes->digests_done = digests_done; hashes->salts_cnt = salts_cnt; hashes->salts_done = salts_done; return 0; } int hashes_init_stage4 (hashcat_ctx_t *hashcat_ctx) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; user_options_t *user_options = hashcat_ctx->user_options; const int rc_defaults = hashconfig_general_defaults (hashcat_ctx); if (rc_defaults == -1) return -1; if (hashes->salts_cnt == 1) hashconfig->opti_type |= OPTI_TYPE_SINGLE_SALT; if (hashes->digests_cnt == 1) hashconfig->opti_type |= OPTI_TYPE_SINGLE_HASH; if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) hashconfig->opti_type |= OPTI_TYPE_NOT_ITERATED; if (user_options->attack_mode == ATTACK_MODE_BF) hashconfig->opti_type |= OPTI_TYPE_BRUTE_FORCE; if (hashconfig->opti_type & OPTI_TYPE_BRUTE_FORCE) { if (hashconfig->opti_type & OPTI_TYPE_SINGLE_HASH) { if (hashconfig->opti_type & OPTI_TYPE_APPENDED_SALT) { if (hashconfig->opts_type & OPTS_TYPE_ST_ADD80) { hashconfig->opts_type &= ~OPTS_TYPE_ST_ADD80; hashconfig->opts_type |= OPTS_TYPE_PT_ADD80; } if (hashconfig->opts_type & OPTS_TYPE_ST_ADDBITS14) { hashconfig->opts_type &= ~OPTS_TYPE_ST_ADDBITS14; hashconfig->opts_type |= OPTS_TYPE_PT_ADDBITS14; } if (hashconfig->opts_type & OPTS_TYPE_ST_ADDBITS15) { hashconfig->opts_type &= ~OPTS_TYPE_ST_ADDBITS15; hashconfig->opts_type |= OPTS_TYPE_PT_ADDBITS15; } } } } // at this point we no longer need hash_t* structure hash_t *hashes_buf = hashes->hashes_buf; hcfree (hashes_buf); hashes->hashes_cnt = 0; hashes->hashes_buf = NULL; // starting from here, we should allocate some scratch buffer for later use u8 *out_buf = (u8 *) hcmalloc (HCBUFSIZ_LARGE); hashes->out_buf = out_buf; // we need two buffers in parallel u8 *tmp_buf = (u8 *) hcmalloc (HCBUFSIZ_LARGE); hashes->tmp_buf = tmp_buf; return 0; } int hashes_init_selftest (hashcat_ctx_t *hashcat_ctx) { folder_config_t *folder_config = hashcat_ctx->folder_config; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; user_options_t *user_options = hashcat_ctx->user_options; if (hashconfig->st_hash == NULL) return 0; void *st_digests_buf = NULL; salt_t *st_salts_buf = NULL; void *st_esalts_buf = NULL; void *st_hook_salts_buf = NULL; st_digests_buf = hccalloc (1, hashconfig->dgst_size); st_salts_buf = (salt_t *) hccalloc (1, sizeof (salt_t)); if (hashconfig->esalt_size > 0) { st_esalts_buf = hccalloc (1, hashconfig->esalt_size); } if (hashconfig->hook_salt_size > 0) { st_hook_salts_buf = hccalloc (1, hashconfig->hook_salt_size); } hash_t hash; hash.digest = st_digests_buf; hash.salt = st_salts_buf; hash.esalt = st_esalts_buf; hash.hook_salt = st_hook_salts_buf; hash.cracked = 0; hash.hash_info = NULL; hash.pw_buf = NULL; hash.pw_len = 0; int parser_status; if ((hashconfig->hash_mode == 2500) || (hashconfig->hash_mode == 2501)) { char *tmpdata = (char *) hcmalloc (sizeof (hccapx_t)); const int st_hash_len = strlen (hashconfig->st_hash); for (int i = 0, j = 0; j < st_hash_len; i += 1, j += 2) { const u8 c = hex_to_u8 ((u8 *) hashconfig->st_hash + j); tmpdata[i] = c; } parser_status = hashconfig->parse_func ((u8 *) tmpdata, sizeof (hccapx_t), &hash, hashconfig); hcfree (tmpdata); wpa_t *wpa = (wpa_t *) st_esalts_buf; wpa->nonce_error_corrections = 3; } else if (hashconfig->opts_type & OPTS_TYPE_BINARY_HASHFILE) { char *tmpfile_bin; hc_asprintf (&tmpfile_bin, "%s/selftest.hash", folder_config->session_dir); FILE *fp = fopen (tmpfile_bin, "wb"); const int st_hash_len = strlen (hashconfig->st_hash); for (int i = 0; i < st_hash_len; i += 2) { const u8 c = hex_to_u8 ((u8 *) hashconfig->st_hash + i); fputc (c, fp); } fclose (fp); parser_status = hashconfig->parse_func ((u8 *) tmpfile_bin, strlen (tmpfile_bin), &hash, hashconfig); unlink (tmpfile_bin); hcfree (tmpfile_bin); } else { hashconfig_t *hashconfig_st = (hashconfig_t *) hcmalloc (sizeof (hashconfig_t)); memcpy (hashconfig_st, hashconfig, sizeof (hashconfig_t)); hashconfig_st->separator = SEPARATOR; if (user_options->hex_salt) { if (hashconfig->salt_type == SALT_TYPE_GENERIC) { // this is save as there's no hash mode that has both SALT_TYPE_GENERIC and OPTS_TYPE_ST_HEX by default hashconfig_st->opts_type &= ~OPTS_TYPE_ST_HEX; } } parser_status = hashconfig->parse_func ((u8 *) hashconfig->st_hash, strlen (hashconfig->st_hash), &hash, hashconfig_st); hcfree (hashconfig_st); } if (parser_status == PARSER_OK) { // nothing to do } else { event_log_error (hashcat_ctx, "Self-test hash parsing error: %s", strparser (parser_status)); return -1; } hashes->st_digests_buf = st_digests_buf; hashes->st_salts_buf = st_salts_buf; hashes->st_esalts_buf = st_esalts_buf; hashes->st_hook_salts_buf = st_hook_salts_buf; return 0; } void hashes_destroy (hashcat_ctx_t *hashcat_ctx) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; user_options_t *user_options = hashcat_ctx->user_options; hcfree (hashes->digests_buf); hcfree (hashes->digests_shown); hcfree (hashes->digests_shown_tmp); hcfree (hashes->salts_buf); hcfree (hashes->salts_shown); if ((user_options->username == true) || (hashconfig->opts_type & OPTS_TYPE_HASH_COPY)) { for (u32 hash_pos = 0; hash_pos < hashes->hashes_cnt; hash_pos++) { if (user_options->username == true) { hcfree (hashes->hash_info[hash_pos]->user); } if (hashconfig->opts_type & OPTS_TYPE_HASH_COPY) { hcfree (hashes->hash_info[hash_pos]->orighash); } if (hashconfig->opts_type & OPTS_TYPE_HASH_SPLIT) { hcfree (hashes->hash_info[hash_pos]->split); } } } hcfree (hashes->hash_info); hcfree (hashes->esalts_buf); hcfree (hashes->hook_salts_buf); hcfree (hashes->out_buf); hcfree (hashes->tmp_buf); hcfree (hashes->st_digests_buf); hcfree (hashes->st_salts_buf); hcfree (hashes->st_esalts_buf); hcfree (hashes->st_hook_salts_buf); memset (hashes, 0, sizeof (hashes_t)); } void hashes_logger (hashcat_ctx_t *hashcat_ctx) { hashes_t *hashes = hashcat_ctx->hashes; logfile_ctx_t *logfile_ctx = hashcat_ctx->logfile_ctx; logfile_top_string (hashes->hashfile); logfile_top_uint (hashes->hashlist_mode); logfile_top_uint (hashes->hashlist_format); logfile_top_uint (hashes->hashes_cnt); logfile_top_uint (hashes->digests_cnt); logfile_top_uint (hashes->digests_done); logfile_top_uint (hashes->salts_cnt); logfile_top_uint (hashes->salts_done); } hashcat-4.0.1/src/hlfmt.c000066400000000000000000000213611320027462700152020ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "filehandling.h" #include "hlfmt.h" static const char HLFMT_TEXT_HASHCAT[] = "native hashcat"; static const char HLFMT_TEXT_PWDUMP[] = "pwdump"; static const char HLFMT_TEXT_PASSWD[] = "passwd"; static const char HLFMT_TEXT_SHADOW[] = "shadow"; static const char HLFMT_TEXT_DCC[] = "DCC"; static const char HLFMT_TEXT_DCC2[] = "DCC 2"; static const char HLFMT_TEXT_NETNTLM1[] = "NetNTLMv1"; static const char HLFMT_TEXT_NETNTLM2[] = "NetNTLMv2"; static const char HLFMT_TEXT_NSLDAP[] = "nsldap"; static const char HLFMT_TEXT_NSLDAPS[] = "nsldaps"; // hlfmt hashcat static void hlfmt_hash_hashcat (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, char *line_buf, int line_len, char **hashbuf_pos, int *hashbuf_len) { const user_options_t *user_options = hashcat_ctx->user_options; const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; if (user_options->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] == hashconfig->separator) { pos++; len--; break; } } *hashbuf_pos = pos; *hashbuf_len = len; } } static void hlfmt_user_hashcat (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, char *line_buf, int line_len, char **userbuf_pos, int *userbuf_len) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; char *pos = NULL; int len = 0; int sep_cnt = 0; for (int i = 0; i < line_len; i++) { if (line_buf[i] == hashconfig->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 (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, const char *line_buf, 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 (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, char *line_buf, int line_len, char **hashbuf_pos, int *hashbuf_len) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; 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 (hashconfig->hash_mode == 1000) { if (sep_cnt == 3) { if (pos == NULL) pos = line_buf + i; len++; } } else if (hashconfig->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 (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, char *line_buf, 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 (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, const char *line_buf, 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 (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, char *line_buf, 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 (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, char *line_buf, 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 (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, const char *line_buf, 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 (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, char *line_buf, int line_len, char **hashbuf_pos, int *hashbuf_len) { hlfmt_hash_passwd (hashcat_ctx, line_buf, line_len, hashbuf_pos, hashbuf_len); } static void hlfmt_user_shadow (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, char *line_buf, int line_len, char **userbuf_pos, int *userbuf_len) { hlfmt_user_passwd (hashcat_ctx, line_buf, line_len, userbuf_pos, userbuf_len); } // hlfmt main char *strhlfmt (const u32 hashfile_format) { switch (hashfile_format) { case HLFMT_HASHCAT: return ((char *) HLFMT_TEXT_HASHCAT); case HLFMT_PWDUMP: return ((char *) HLFMT_TEXT_PWDUMP); case HLFMT_PASSWD: return ((char *) HLFMT_TEXT_PASSWD); case HLFMT_SHADOW: return ((char *) HLFMT_TEXT_SHADOW); case HLFMT_DCC: return ((char *) HLFMT_TEXT_DCC); case HLFMT_DCC2: return ((char *) HLFMT_TEXT_DCC2); case HLFMT_NETNTLM1: return ((char *) HLFMT_TEXT_NETNTLM1); case HLFMT_NETNTLM2: return ((char *) HLFMT_TEXT_NETNTLM2); case HLFMT_NSLDAP: return ((char *) HLFMT_TEXT_NSLDAP); case HLFMT_NSLDAPS: return ((char *) HLFMT_TEXT_NSLDAPS); } return ((char *) "Unknown"); } void hlfmt_hash (hashcat_ctx_t *hashcat_ctx, u32 hashfile_format, char *line_buf, int line_len, char **hashbuf_pos, int *hashbuf_len) { switch (hashfile_format) { case HLFMT_HASHCAT: hlfmt_hash_hashcat (hashcat_ctx, line_buf, line_len, hashbuf_pos, hashbuf_len); break; case HLFMT_PWDUMP: hlfmt_hash_pwdump (hashcat_ctx, line_buf, line_len, hashbuf_pos, hashbuf_len); break; case HLFMT_PASSWD: hlfmt_hash_passwd (hashcat_ctx, line_buf, line_len, hashbuf_pos, hashbuf_len); break; case HLFMT_SHADOW: hlfmt_hash_shadow (hashcat_ctx, line_buf, line_len, hashbuf_pos, hashbuf_len); break; } } void hlfmt_user (hashcat_ctx_t *hashcat_ctx, u32 hashfile_format, char *line_buf, int line_len, char **userbuf_pos, int *userbuf_len) { switch (hashfile_format) { case HLFMT_HASHCAT: hlfmt_user_hashcat (hashcat_ctx, line_buf, line_len, userbuf_pos, userbuf_len); break; case HLFMT_PWDUMP: hlfmt_user_pwdump (hashcat_ctx, line_buf, line_len, userbuf_pos, userbuf_len); break; case HLFMT_PASSWD: hlfmt_user_passwd (hashcat_ctx, line_buf, line_len, userbuf_pos, userbuf_len); break; case HLFMT_SHADOW: hlfmt_user_shadow (hashcat_ctx, line_buf, line_len, userbuf_pos, userbuf_len); break; } } u32 hlfmt_detect (hashcat_ctx_t *hashcat_ctx, FILE *fp, u32 max_check) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; // Exception: those formats are wrongly detected as HLFMT_SHADOW, prevent it if (hashconfig->hash_mode == 5300) return HLFMT_HASHCAT; if (hashconfig->hash_mode == 5400) return HLFMT_HASHCAT; u32 *formats_cnt = (u32 *) hccalloc (HLFMTS_CNT, sizeof (u32)); u32 num_check = 0; char *line_buf = (char *) hcmalloc (HCBUFSIZ_LARGE); while (!feof (fp)) { int line_len = fgetl (fp, line_buf); if (line_len == 0) continue; if (hlfmt_detect_pwdump (hashcat_ctx, line_buf, line_len)) formats_cnt[HLFMT_PWDUMP]++; if (hlfmt_detect_passwd (hashcat_ctx, line_buf, line_len)) formats_cnt[HLFMT_PASSWD]++; if (hlfmt_detect_shadow (hashcat_ctx, line_buf, line_len)) formats_cnt[HLFMT_SHADOW]++; if (num_check == max_check) break; num_check++; } hcfree (line_buf); u32 hashlist_format = HLFMT_HASHCAT; for (u32 i = 1; i < HLFMTS_CNT; i++) { if (formats_cnt[i - 1] >= formats_cnt[i]) continue; hashlist_format = i; } free (formats_cnt); return hashlist_format; } hashcat-4.0.1/src/hwmon.c000066400000000000000000003661231320027462700152300ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "dynloader.h" #include "shared.h" #include "folder.h" #include "hwmon.h" // sysfs functions static bool sysfs_init (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; SYSFS_PTR *sysfs = hwmon_ctx->hm_sysfs; memset (sysfs, 0, sizeof (SYSFS_PTR)); char *path; hc_asprintf (&path, "%s", SYS_BUS_PCI_DEVICES); const bool r = hc_path_read (path); hcfree (path); return r; } static void sysfs_close (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; SYSFS_PTR *sysfs = hwmon_ctx->hm_sysfs; if (sysfs) { hcfree (sysfs); } return; } static char *hm_SYSFS_get_syspath_device (hashcat_ctx_t *hashcat_ctx, const int device_id) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; char *syspath; hc_asprintf (&syspath, "%s/0000:%02x:%02x.%01x", SYS_BUS_PCI_DEVICES, device_param->pcie_bus, device_param->pcie_device, device_param->pcie_function); return syspath; } static char *hm_SYSFS_get_syspath_hwmon (hashcat_ctx_t *hashcat_ctx, const int device_id) { char *syspath = hm_SYSFS_get_syspath_device (hashcat_ctx, device_id); if (syspath == NULL) { event_log_error (hashcat_ctx, "hm_SYSFS_get_syspath_device() failed."); return NULL; } char *hwmon = hcmalloc (HCBUFSIZ_TINY); snprintf (hwmon, HCBUFSIZ_TINY - 1, "%s/hwmon", syspath); char *hwmonN = first_file_in_directory (hwmon); if (hwmonN == NULL) { event_log_error (hashcat_ctx, "First_file_in_directory() failed."); hcfree (syspath); hcfree (hwmon); hcfree (hwmonN); return NULL; } snprintf (hwmon, HCBUFSIZ_TINY - 1, "%s/hwmon/%s", syspath, hwmonN); hcfree (syspath); hcfree (hwmonN); return hwmon; } static int hm_SYSFS_get_fan_speed_current (hashcat_ctx_t *hashcat_ctx, const int device_id, int *val) { char *syspath = hm_SYSFS_get_syspath_hwmon (hashcat_ctx, device_id); if (syspath == NULL) return -1; char *path_cur; char *path_max; hc_asprintf (&path_cur, "%s/pwm1", syspath); hc_asprintf (&path_max, "%s/pwm1_max", syspath); hcfree (syspath); FILE *fd_cur = fopen (path_cur, "r"); if (fd_cur == NULL) { event_log_error (hashcat_ctx, "%s: %s", path_cur, strerror (errno)); hcfree (path_cur); hcfree (path_max); return -1; } int pwm1_cur = 0; if (fscanf (fd_cur, "%d", &pwm1_cur) != 1) { fclose (fd_cur); event_log_error (hashcat_ctx, "%s: unexpected data.", path_cur); hcfree (path_cur); hcfree (path_max); return -1; } fclose (fd_cur); FILE *fd_max = fopen (path_max, "r"); if (fd_max == NULL) { event_log_error (hashcat_ctx, "%s: %s", path_max, strerror (errno)); hcfree (path_cur); hcfree (path_max); return -1; } int pwm1_max = 0; if (fscanf (fd_max, "%d", &pwm1_max) != 1) { fclose (fd_max); event_log_error (hashcat_ctx, "%s: unexpected data.", path_max); hcfree (path_cur); hcfree (path_max); return -1; } fclose (fd_max); if (pwm1_max == 0) { event_log_error (hashcat_ctx, "%s: pwm1_max cannot be 0.", path_max); hcfree (path_cur); hcfree (path_max); return -1; } const float p1 = (float) pwm1_max / 100.0f; const float pwm1_percent = (float) pwm1_cur / p1; *val = (int) pwm1_percent; hcfree (path_cur); hcfree (path_max); return 0; } static int hm_SYSFS_set_fan_control (hashcat_ctx_t *hashcat_ctx, const int device_id, int val) { char *syspath = hm_SYSFS_get_syspath_hwmon (hashcat_ctx, device_id); if (syspath == NULL) return -1; char *path; hc_asprintf (&path, "%s/pwm1_enable", syspath); hcfree (syspath); FILE *fd = fopen (path, "w"); if (fd == NULL) { event_log_error (hashcat_ctx, "%s: %s", path, strerror (errno)); hcfree (path); return -1; } fprintf (fd, "%d", val); fclose (fd); hcfree (path); return 0; } static int hm_SYSFS_set_fan_speed_target (hashcat_ctx_t *hashcat_ctx, const int device_id, int val) { char *syspath = hm_SYSFS_get_syspath_hwmon (hashcat_ctx, device_id); if (syspath == NULL) return -1; char *path; char *path_max; hc_asprintf (&path, "%s/pwm1", syspath); hc_asprintf (&path_max, "%s/pwm1_max", syspath); hcfree (syspath); FILE *fd_max = fopen (path_max, "r"); if (fd_max == NULL) { event_log_error (hashcat_ctx, "%s: %s", path_max, strerror (errno)); hcfree (path); hcfree (path_max); return -1; } int pwm1_max = 0; if (fscanf (fd_max, "%d", &pwm1_max) != 1) { fclose (fd_max); event_log_error (hashcat_ctx, "%s: unexpected data.", path_max); hcfree (path); hcfree (path_max); return -1; } fclose (fd_max); if (pwm1_max == 0) { event_log_error (hashcat_ctx, "%s: pwm1_max cannot be 0.", path_max); hcfree (path); hcfree (path_max); return -1; } const float p1 = (float) pwm1_max / 100.0f; FILE *fd = fopen (path, "w"); if (fd == NULL) { event_log_error (hashcat_ctx, "%s: %s", path, strerror (errno)); hcfree (path); hcfree (path_max); return -1; } fprintf (fd, "%d", (int) ((float) val * p1)); fclose (fd); hcfree (path); hcfree (path_max); return 0; } static int hm_SYSFS_get_temperature_current (hashcat_ctx_t *hashcat_ctx, const int device_id, int *val) { char *syspath = hm_SYSFS_get_syspath_hwmon (hashcat_ctx, device_id); if (syspath == NULL) return -1; char *path; hc_asprintf (&path, "%s/temp1_input", syspath); hcfree (syspath); FILE *fd = fopen (path, "r"); if (fd == NULL) { event_log_error (hashcat_ctx, "%s: %s", path, strerror (errno)); hcfree (path); return -1; } int temperature = 0; if (fscanf (fd, "%d", &temperature) != 1) { fclose (fd); event_log_error (hashcat_ctx, "%s: unexpected data.", path); hcfree (path); return -1; } fclose (fd); *val = temperature / 1000; hcfree (path); return 0; } static int hm_SYSFS_get_pp_dpm_sclk (hashcat_ctx_t *hashcat_ctx, const int device_id, int *val) { char *syspath = hm_SYSFS_get_syspath_device (hashcat_ctx, device_id); if (syspath == NULL) return -1; char *path; hc_asprintf (&path, "%s/pp_dpm_sclk", syspath); hcfree (syspath); FILE *fd = fopen (path, "r"); if (fd == NULL) { event_log_error (hashcat_ctx, "%s: %s", path, strerror (errno)); hcfree (path); return -1; } int clockfreq = 0; while (!feof (fd)) { char buf[HCBUFSIZ_TINY]; char *ptr = fgets (buf, sizeof (buf), fd); if (ptr == NULL) continue; size_t len = strlen (ptr); if (len < 2) continue; if (ptr[len - 2] != '*') continue; int profile = 0; int rc = sscanf (ptr, "%d: %dMHz", &profile, &clockfreq); if (rc == 2) break; } fclose (fd); *val = clockfreq; hcfree (path); return 0; } static int hm_SYSFS_get_pp_dpm_mclk (hashcat_ctx_t *hashcat_ctx, const int device_id, int *val) { char *syspath = hm_SYSFS_get_syspath_device (hashcat_ctx, device_id); if (syspath == NULL) return -1; char *path; hc_asprintf (&path, "%s/pp_dpm_mclk", syspath); hcfree (syspath); FILE *fd = fopen (path, "r"); if (fd == NULL) { event_log_error (hashcat_ctx, "%s: %s", path, strerror (errno)); hcfree (path); return -1; } int clockfreq = 0; while (!feof (fd)) { char buf[HCBUFSIZ_TINY]; char *ptr = fgets (buf, sizeof (buf), fd); if (ptr == NULL) continue; size_t len = strlen (ptr); if (len < 2) continue; if (ptr[len - 2] != '*') continue; int profile = 0; int rc = sscanf (ptr, "%d: %dMHz", &profile, &clockfreq); if (rc == 2) break; } fclose (fd); *val = clockfreq; hcfree (path); return 0; } static int hm_SYSFS_get_pp_dpm_pcie (hashcat_ctx_t *hashcat_ctx, const int device_id, int *val) { char *syspath = hm_SYSFS_get_syspath_device (hashcat_ctx, device_id); if (syspath == NULL) return -1; char *path; hc_asprintf (&path, "%s/pp_dpm_pcie", syspath); hcfree (syspath); FILE *fd = fopen (path, "r"); if (fd == NULL) { event_log_error (hashcat_ctx, "%s: %s", path, strerror (errno)); hcfree (path); return -1; } int lanes = 0; while (!feof (fd)) { char buf[HCBUFSIZ_TINY]; char *ptr = fgets (buf, sizeof (buf), fd); if (ptr == NULL) continue; size_t len = strlen (ptr); if (len < 2) continue; if (ptr[len - 2] != '*') continue; int profile = 0; float speed = 0; int rc = sscanf (ptr, "%d: %fGB, x%d *", &profile, &speed, &lanes); if (rc == 3) break; } fclose (fd); *val = lanes; hcfree (path); return 0; } static int hm_SYSFS_set_power_dpm_force_performance_level (hashcat_ctx_t *hashcat_ctx, const int device_id, const char *val) { char *syspath = hm_SYSFS_get_syspath_device (hashcat_ctx, device_id); if (syspath == NULL) return -1; char *path; hc_asprintf (&path, "%s/power_dpm_force_performance_level", syspath); hcfree (syspath); FILE *fd = fopen (path, "w"); if (fd == NULL) { event_log_error (hashcat_ctx, "%s: %s", path, strerror (errno)); hcfree (path); return -1; } fprintf (fd, "%s", val); fclose (fd); hcfree (path); return 0; } // nvml functions static int nvml_init (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; memset (nvml, 0, sizeof (NVML_PTR)); #if defined (_WIN) nvml->lib = hc_dlopen ("nvml.dll"); if (!nvml->lib) { DWORD BufferSize = 1024; DWORD Type = REG_SZ; char *Buffer = (char *) hcmalloc (BufferSize + 1); HKEY hKey = 0; if (RegOpenKeyExA (HKEY_LOCAL_MACHINE, "SOFTWARE\\NVIDIA Corporation\\Global\\NVSMI", 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { if (RegQueryValueExA (hKey, "NVSMIPATH", NULL, &Type, (LPBYTE)Buffer, &BufferSize) == ERROR_SUCCESS) { Buffer[BufferSize] = 0; } else { //if (user_options->quiet == false) // event_log_error (hashcat_ctx, "NVML library load failed. Proceeding without NVML HWMon enabled."); return -1; } RegCloseKey (hKey); } else { //if (user_options->quiet == false) // event_log_error (hashcat_ctx, "NVML library load failed. Proceeding without NVML HWMon enabled."); return -1; } strcat (Buffer, "\\nvml.dll"); nvml->lib = hc_dlopen (Buffer); hcfree (Buffer); } #elif defined (__CYGWIN__) nvml->lib = hc_dlopen("nvml.dll", RTLD_NOW); if (!nvml->lib) { FILE *nvml_lib = fopen ("/proc/registry/HKEY_LOCAL_MACHINE/SOFTWARE/NVIDIA Corporation/Global/NVSMI/NVSMIPATH", "rb"); if (nvml_lib == NULL) { //if (user_options->quiet == false) // event_log_error (hashcat_ctx, "NVML library load failed: %m. Proceeding without NVML HWMon enabled."); return -1; } char *nvml_winpath, *nvml_cygpath; nvml_winpath = (char *) hcmalloc (100); hc_fread (nvml_winpath, 100, 1, nvml_lib); fclose (nvml_lib); ssize_t size = cygwin_conv_path (CCP_WIN_A_TO_POSIX | CCP_PROC_CYGDRIVE, nvml_winpath, NULL, 0); if (size > 0) { nvml_cygpath = (char *) hcmalloc (size + 9); cygwin_conv_path (CCP_WIN_A_TO_POSIX | CCP_PROC_CYGDRIVE, nvml_winpath, nvml_cygpath, size); } else { //if (user_options->quiet == false) // event_log_error (hashcat_ctx, "Could not find NVML on this system. Proceeding without NVML HWMon enabled."); return -1; } strcat (nvml_cygpath, "/nvml.dll"); nvml->lib = hc_dlopen (nvml_cygpath, RTLD_NOW); } #elif defined (_POSIX) nvml->lib = hc_dlopen ("libnvidia-ml.so", RTLD_NOW); if (!nvml->lib) { nvml->lib = hc_dlopen ("libnvidia-ml.so.1", RTLD_NOW); } #endif if (!nvml->lib) { //if (user_options->quiet == false) // event_log_error (hashcat_ctx, "NVML library load failed. Proceeding without NVML HWMon enabled."); return -1; } HC_LOAD_FUNC(nvml, nvmlErrorString, NVML_ERROR_STRING, NVML, 0) HC_LOAD_FUNC(nvml, nvmlInit, NVML_INIT, NVML, 0) HC_LOAD_FUNC(nvml, nvmlShutdown, NVML_SHUTDOWN, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceGetCount, NVML_DEVICE_GET_COUNT, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceGetName, NVML_DEVICE_GET_NAME, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceGetHandleByIndex, NVML_DEVICE_GET_HANDLE_BY_INDEX, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceGetTemperature, NVML_DEVICE_GET_TEMPERATURE, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceGetFanSpeed, NVML_DEVICE_GET_FAN_SPEED, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceGetPowerUsage, NVML_DEVICE_GET_POWER_USAGE, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceGetUtilizationRates, NVML_DEVICE_GET_UTILIZATION_RATES, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceGetClockInfo, NVML_DEVICE_GET_CLOCKINFO, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceGetTemperatureThreshold, NVML_DEVICE_GET_THRESHOLD, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceGetCurrPcieLinkGeneration, NVML_DEVICE_GET_CURRPCIELINKGENERATION, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceGetCurrPcieLinkWidth, NVML_DEVICE_GET_CURRPCIELINKWIDTH, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceGetCurrentClocksThrottleReasons, NVML_DEVICE_GET_CURRENTCLOCKSTHROTTLEREASONS, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceGetSupportedClocksThrottleReasons, NVML_DEVICE_GET_SUPPORTEDCLOCKSTHROTTLEREASONS, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceSetComputeMode, NVML_DEVICE_SET_COMPUTEMODE, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceSetGpuOperationMode, NVML_DEVICE_SET_OPERATIONMODE, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceGetPowerManagementLimitConstraints, NVML_DEVICE_GET_POWERMANAGEMENTLIMITCONSTRAINTS, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceSetPowerManagementLimit, NVML_DEVICE_SET_POWERMANAGEMENTLIMIT, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceGetPowerManagementLimit, NVML_DEVICE_GET_POWERMANAGEMENTLIMIT, NVML, 0) HC_LOAD_FUNC(nvml, nvmlDeviceGetPciInfo, NVML_DEVICE_GET_PCIINFO, NVML, 0) return 0; } static void nvml_close (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; if (nvml) { if (nvml->lib) hc_dlclose (nvml->lib); hcfree (nvml); } } static const char *hm_NVML_nvmlErrorString (NVML_PTR *nvml, const nvmlReturn_t nvml_rc) { return nvml->nvmlErrorString (nvml_rc); } static int hm_NVML_nvmlInit (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlInit (); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlInit(): %s", string); return -1; } return 0; } static int hm_NVML_nvmlShutdown (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlShutdown (); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlShutdown(): %s", string); return -1; } return 0; } static int hm_NVML_nvmlDeviceGetCount (hashcat_ctx_t *hashcat_ctx, unsigned int *deviceCount) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceGetCount (deviceCount); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceGetCount(): %s", string); return -1; } return 0; } static int hm_NVML_nvmlDeviceGetHandleByIndex (hashcat_ctx_t *hashcat_ctx, unsigned int device_index, nvmlDevice_t *device) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceGetHandleByIndex (device_index, device); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceGetHandleByIndex(): %s", string); return -1; } return 0; } /* static int hm_NVML_nvmlDeviceGetName (hashcat_ctx_t *hashcat_ctx, nvmlDevice_t device, char *name, unsigned int length) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceGetName (device, name, length); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceGetName(): %s", string); return -1; } return 0; } */ static int hm_NVML_nvmlDeviceGetTemperature (hashcat_ctx_t *hashcat_ctx, nvmlDevice_t device, nvmlTemperatureSensors_t sensorType, unsigned int *temp) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceGetTemperature (device, sensorType, temp); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceGetTemperature(): %s", string); return -1; } return 0; } static int hm_NVML_nvmlDeviceGetFanSpeed (hashcat_ctx_t *hashcat_ctx, nvmlDevice_t device, unsigned int *speed) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceGetFanSpeed (device, speed); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceGetFanSpeed(): %s", string); return -1; } return 0; } /* static int hm_NVML_nvmlDeviceGetPowerUsage (hashcat_ctx_t *hashcat_ctx, nvmlDevice_t device, unsigned int *power) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceGetPowerUsage (device, power); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceGetPowerUsage(): %s", string); return -1; } return 0; } */ static int hm_NVML_nvmlDeviceGetUtilizationRates (hashcat_ctx_t *hashcat_ctx, nvmlDevice_t device, nvmlUtilization_t *utilization) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceGetUtilizationRates (device, utilization); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceGetUtilizationRates(): %s", string); return -1; } return 0; } static int hm_NVML_nvmlDeviceGetClockInfo (hashcat_ctx_t *hashcat_ctx, nvmlDevice_t device, nvmlClockType_t type, unsigned int *clockfreq) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceGetClockInfo (device, type, clockfreq); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceGetClockInfo(): %s", string); return -1; } return 0; } static int hm_NVML_nvmlDeviceGetTemperatureThreshold (hashcat_ctx_t *hashcat_ctx, nvmlDevice_t device, nvmlTemperatureThresholds_t thresholdType, unsigned int *temp) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceGetTemperatureThreshold (device, thresholdType, temp); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceGetTemperatureThreshold(): %s", string); return -1; } return 0; } /* static int hm_NVML_nvmlDeviceGetCurrPcieLinkGeneration (hashcat_ctx_t *hashcat_ctx, nvmlDevice_t device, unsigned int *currLinkGen) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceGetCurrPcieLinkGeneration (device, currLinkGen); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceGetCurrPcieLinkGeneration(): %s", string); return -1; } return 0; } */ static int hm_NVML_nvmlDeviceGetCurrPcieLinkWidth (hashcat_ctx_t *hashcat_ctx, nvmlDevice_t device, unsigned int *currLinkWidth) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceGetCurrPcieLinkWidth (device, currLinkWidth); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceGetCurrPcieLinkWidth(): %s", string); return -1; } return 0; } /* static int hm_NVML_nvmlDeviceGetCurrentClocksThrottleReasons (hashcat_ctx_t *hashcat_ctx, nvmlDevice_t device, unsigned long long *clocksThrottleReasons) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceGetCurrentClocksThrottleReasons (device, clocksThrottleReasons); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceGetCurrentClocksThrottleReasons(): %s", string); return -1; } return 0; } */ /* static int hm_NVML_nvmlDeviceGetSupportedClocksThrottleReasons (hashcat_ctx_t *hashcat_ctx, nvmlDevice_t device, unsigned long long *supportedClocksThrottleReasons) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceGetSupportedClocksThrottleReasons (device, supportedClocksThrottleReasons); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceGetSupportedClocksThrottleReasons(): %s", string); return -1; } return 0; } */ /* static int hm_NVML_nvmlDeviceSetComputeMode (hashcat_ctx_t *hashcat_ctx, nvmlDevice_t device, nvmlComputeMode_t mode) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceSetComputeMode (device, mode); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceSetComputeMode(): %s", string); return -1; } return 0; } */ /* static int hm_NVML_nvmlDeviceSetGpuOperationMode (hashcat_ctx_t *hashcat_ctx, nvmlDevice_t device, nvmlGpuOperationMode_t mode) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceSetGpuOperationMode (device, mode); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceSetGpuOperationMode(): %s", string); return -1; } return 0; } */ static int hm_NVML_nvmlDeviceGetPowerManagementLimitConstraints (hashcat_ctx_t *hashcat_ctx, nvmlDevice_t device, unsigned int *minLimit, unsigned int *maxLimit) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceGetPowerManagementLimitConstraints (device, minLimit, maxLimit); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceGetPowerManagementLimitConstraints(): %s", string); return -1; } return 0; } static int hm_NVML_nvmlDeviceSetPowerManagementLimit (hashcat_ctx_t *hashcat_ctx, nvmlDevice_t device, unsigned int limit) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceSetPowerManagementLimit (device, limit); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceSetPowerManagementLimit(): %s", string); return -1; } return 0; } static int hm_NVML_nvmlDeviceGetPowerManagementLimit (hashcat_ctx_t *hashcat_ctx, nvmlDevice_t device, unsigned int *limit) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceGetPowerManagementLimit (device, limit); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceGetPowerManagementLimit(): %s", string); return -1; } return 0; } static int hm_NVML_nvmlDeviceGetPciInfo (hashcat_ctx_t *hashcat_ctx, nvmlDevice_t device, nvmlPciInfo_t *pci) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVML_PTR *nvml = hwmon_ctx->hm_nvml; const nvmlReturn_t nvml_rc = nvml->nvmlDeviceGetPciInfo (device, pci); if (nvml_rc != NVML_SUCCESS) { const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); event_log_error (hashcat_ctx, "nvmlDeviceGetPciInfo(): %s", string); return -1; } return 0; } // nvapi functions static int nvapi_init (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVAPI_PTR *nvapi = hwmon_ctx->hm_nvapi; memset (nvapi, 0, sizeof (NVAPI_PTR)); #if defined (_WIN) #if defined (_WIN64) nvapi->lib = hc_dlopen ("nvapi64.dll"); #else nvapi->lib = hc_dlopen ("nvapi.dll"); #endif #else #if defined (__CYGWIN__) #if defined (__x86_x64__) nvapi->lib = hc_dlopen ("nvapi64.dll", RTLD_NOW); #else nvapi->lib = hc_dlopen ("nvapi.dll", RTLD_NOW); #endif #else nvapi->lib = hc_dlopen ("nvapi.so", RTLD_NOW); // uhm yes, but .. yeah #endif #endif if (!nvapi->lib) { //if (user_options->quiet == false) // event_log_error (hashcat_ctx, "Load of NVAPI library failed. Proceeding without NVAPI HWMon enabled."); return -1; } HC_LOAD_FUNC(nvapi, nvapi_QueryInterface, NVAPI_QUERYINTERFACE, NVAPI, 0) HC_LOAD_ADDR(nvapi, NvAPI_Initialize, NVAPI_INITIALIZE, nvapi_QueryInterface, 0x0150E828u, NVAPI, 0) HC_LOAD_ADDR(nvapi, NvAPI_Unload, NVAPI_UNLOAD, nvapi_QueryInterface, 0xD22BDD7Eu, NVAPI, 0) HC_LOAD_ADDR(nvapi, NvAPI_GetErrorMessage, NVAPI_GETERRORMESSAGE, nvapi_QueryInterface, 0x6C2D048Cu, NVAPI, 0) HC_LOAD_ADDR(nvapi, NvAPI_EnumPhysicalGPUs, NVAPI_ENUMPHYSICALGPUS, nvapi_QueryInterface, 0xE5AC921Fu, NVAPI, 0) HC_LOAD_ADDR(nvapi, NvAPI_GPU_GetPerfPoliciesInfo, NVAPI_GPU_GETPERFPOLICIESINFO, nvapi_QueryInterface, 0x409D9841u, NVAPI, 0) HC_LOAD_ADDR(nvapi, NvAPI_GPU_GetPerfPoliciesStatus, NVAPI_GPU_GETPERFPOLICIESSTATUS, nvapi_QueryInterface, 0x3D358A0Cu, NVAPI, 0) HC_LOAD_ADDR(nvapi, NvAPI_GPU_SetCoolerLevels, NVAPI_GPU_SETCOOLERLEVELS, nvapi_QueryInterface, 0x891FA0AEu, NVAPI, 0) HC_LOAD_ADDR(nvapi, NvAPI_GPU_GetBusId, NVAPI_GPU_GETBUSID, nvapi_QueryInterface, 0x1BE0B8E5u, NVAPI, 0) HC_LOAD_ADDR(nvapi, NvAPI_GPU_GetBusSlotId, NVAPI_GPU_GETBUSSLOTID, nvapi_QueryInterface, 0x2A0A350Fu, NVAPI, 0) return 0; } static void nvapi_close (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVAPI_PTR *nvapi = hwmon_ctx->hm_nvapi; if (nvapi) { if (nvapi->lib) hc_dlclose (nvapi->lib); hcfree (nvapi); } } static void hm_NvAPI_GetErrorMessage (NVAPI_PTR *nvapi, const NvAPI_Status NvAPI_rc, NvAPI_ShortString string) { nvapi->NvAPI_GetErrorMessage (NvAPI_rc, string); } static int hm_NvAPI_Initialize (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVAPI_PTR *nvapi = hwmon_ctx->hm_nvapi; const NvAPI_Status NvAPI_rc = nvapi->NvAPI_Initialize (); if (NvAPI_rc == NVAPI_LIBRARY_NOT_FOUND) return -1; if (NvAPI_rc != NVAPI_OK) { NvAPI_ShortString string = { 0 }; hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string); event_log_error (hashcat_ctx, "NvAPI_Initialize(): %s", string); return -1; } return 0; } static int hm_NvAPI_Unload (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVAPI_PTR *nvapi = hwmon_ctx->hm_nvapi; const NvAPI_Status NvAPI_rc = nvapi->NvAPI_Unload (); if (NvAPI_rc != NVAPI_OK) { NvAPI_ShortString string = { 0 }; hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string); event_log_error (hashcat_ctx, "NvAPI_Unload(): %s", string); return -1; } return 0; } static int hm_NvAPI_EnumPhysicalGPUs (hashcat_ctx_t *hashcat_ctx, NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS], NvU32 *pGpuCount) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVAPI_PTR *nvapi = hwmon_ctx->hm_nvapi; const NvAPI_Status NvAPI_rc = nvapi->NvAPI_EnumPhysicalGPUs (nvGPUHandle, pGpuCount); if (NvAPI_rc != NVAPI_OK) { NvAPI_ShortString string = { 0 }; hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string); event_log_error (hashcat_ctx, "NvAPI_EnumPhysicalGPUs(): %s", string); return -1; } return 0; } static int hm_NvAPI_GPU_GetPerfPoliciesInfo (hashcat_ctx_t *hashcat_ctx, NvPhysicalGpuHandle hPhysicalGpu, NV_GPU_PERF_POLICIES_INFO_PARAMS_V1 *perfPolicies_info) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVAPI_PTR *nvapi = hwmon_ctx->hm_nvapi; const NvAPI_Status NvAPI_rc = nvapi->NvAPI_GPU_GetPerfPoliciesInfo (hPhysicalGpu, perfPolicies_info); if (NvAPI_rc != NVAPI_OK) { NvAPI_ShortString string = { 0 }; hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string); event_log_error (hashcat_ctx, "NvAPI_GPU_GetPerfPoliciesInfo(): %s", string); return -1; } return 0; } static int hm_NvAPI_GPU_GetPerfPoliciesStatus (hashcat_ctx_t *hashcat_ctx, NvPhysicalGpuHandle hPhysicalGpu, NV_GPU_PERF_POLICIES_STATUS_PARAMS_V1 *perfPolicies_status) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVAPI_PTR *nvapi = hwmon_ctx->hm_nvapi; const NvAPI_Status NvAPI_rc = nvapi->NvAPI_GPU_GetPerfPoliciesStatus (hPhysicalGpu, perfPolicies_status); if (NvAPI_rc != NVAPI_OK) { NvAPI_ShortString string = { 0 }; hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string); event_log_error (hashcat_ctx, "NvAPI_GPU_GetPerfPoliciesStatus(): %s", string); return -1; } return 0; } static int hm_NvAPI_GPU_SetCoolerLevels (hashcat_ctx_t *hashcat_ctx, NvPhysicalGpuHandle hPhysicalGpu, NvU32 coolerIndex, NV_GPU_COOLER_LEVELS *pCoolerLevels) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVAPI_PTR *nvapi = hwmon_ctx->hm_nvapi; const NvAPI_Status NvAPI_rc = nvapi->NvAPI_GPU_SetCoolerLevels (hPhysicalGpu, coolerIndex, pCoolerLevels); if (NvAPI_rc != NVAPI_OK) { NvAPI_ShortString string = { 0 }; hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string); event_log_error (hashcat_ctx, "NvAPI_GPU_SetCoolerLevels(): %s", string); return -1; } return 0; } static int hm_NvAPI_GPU_GetBusId (hashcat_ctx_t *hashcat_ctx, NvPhysicalGpuHandle hPhysicalGpu, NvU32 *pBusId) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVAPI_PTR *nvapi = hwmon_ctx->hm_nvapi; const NvAPI_Status NvAPI_rc = nvapi->NvAPI_GPU_GetBusId (hPhysicalGpu, pBusId); if (NvAPI_rc != NVAPI_OK) { NvAPI_ShortString string = { 0 }; hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string); event_log_error (hashcat_ctx, "NvAPI_GPU_GetBusId(): %s", string); return -1; } return 0; } static int hm_NvAPI_GPU_GetBusSlotId (hashcat_ctx_t *hashcat_ctx, NvPhysicalGpuHandle hPhysicalGpu, NvU32 *pBusSlotId) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; NVAPI_PTR *nvapi = hwmon_ctx->hm_nvapi; const NvAPI_Status NvAPI_rc = nvapi->NvAPI_GPU_GetBusSlotId (hPhysicalGpu, pBusSlotId); if (NvAPI_rc != NVAPI_OK) { NvAPI_ShortString string = { 0 }; hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string); event_log_error (hashcat_ctx, "NvAPI_GPU_GetBusSlotId(): %s", string); return -1; } return 0; } /* #if defined (__MINGW64__) void __security_check_cookie (uintptr_t _StackCookie); void __security_check_cookie (uintptr_t _StackCookie) { (void) _StackCookie; } void __GSHandlerCheck (); void __GSHandlerCheck () { } #endif */ // xnvctrl functions static int xnvctrl_init (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; XNVCTRL_PTR *xnvctrl = hwmon_ctx->hm_xnvctrl; memset (xnvctrl, 0, sizeof (XNVCTRL_PTR)); #if defined (_WIN) // unsupport platform? return -1; #else xnvctrl->lib_x11 = dlopen ("libX11.so", RTLD_LAZY); if (xnvctrl->lib_x11 == NULL) { //event_log_error (hashcat_ctx, "Failed to load the X11 library: %s", dlerror()); //event_log_error (hashcat_ctx, "Please install the libx11-dev package."); return -1; } xnvctrl->lib_xnvctrl = dlopen ("libXNVCtrl.so", RTLD_LAZY); if (xnvctrl->lib_xnvctrl == NULL) { //event_log_error (hashcat_ctx, "Failed to load the XNVCTRL library: %s", dlerror()); //event_log_error (hashcat_ctx, "Please install the libxnvctrl-dev package."); return -1; } HC_LOAD_FUNC2 (xnvctrl, XOpenDisplay, XOPENDISPLAY, lib_x11, X11, 0); HC_LOAD_FUNC2 (xnvctrl, XCloseDisplay, XCLOSEDISPLAY, lib_x11, X11, 0); HC_LOAD_FUNC2 (xnvctrl, XNVCTRLQueryTargetCount, XNVCTRLQUERYTARGETCOUNT, lib_xnvctrl, XNVCTRL, 0); HC_LOAD_FUNC2 (xnvctrl, XNVCTRLQueryTargetAttribute, XNVCTRLQUERYTARGETATTRIBUTE, lib_xnvctrl, XNVCTRL, 0); HC_LOAD_FUNC2 (xnvctrl, XNVCTRLSetTargetAttribute, XNVCTRLSETTARGETATTRIBUTE, lib_xnvctrl, XNVCTRL, 0); return 0; #endif } static void xnvctrl_close (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; XNVCTRL_PTR *xnvctrl = hwmon_ctx->hm_xnvctrl; if (xnvctrl) { #if defined (_POSIX) if (xnvctrl->lib_x11) { dlclose (xnvctrl->lib_x11); } if (xnvctrl->lib_xnvctrl) { dlclose (xnvctrl->lib_xnvctrl); } #endif hcfree (xnvctrl); } } static int hm_XNVCTRL_XOpenDisplay (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; XNVCTRL_PTR *xnvctrl = hwmon_ctx->hm_xnvctrl; if (xnvctrl->XOpenDisplay == NULL) return -1; void *dpy = xnvctrl->XOpenDisplay (NULL); if (dpy == NULL) { event_log_error (hashcat_ctx, "XOpenDisplay() failed."); return -1; } xnvctrl->dpy = dpy; return 0; } static void hm_XNVCTRL_XCloseDisplay (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; XNVCTRL_PTR *xnvctrl = hwmon_ctx->hm_xnvctrl; if (xnvctrl->XCloseDisplay == NULL) return; if (xnvctrl->dpy == NULL) return; xnvctrl->XCloseDisplay (xnvctrl->dpy); } static int hm_XNVCTRL_query_target_count (hashcat_ctx_t *hashcat_ctx, int *val) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; XNVCTRL_PTR *xnvctrl = hwmon_ctx->hm_xnvctrl; if (xnvctrl->XNVCTRLQueryTargetCount == NULL) return -1; if (xnvctrl->dpy == NULL) return -1; const int rc = xnvctrl->XNVCTRLQueryTargetCount (xnvctrl->dpy, NV_CTRL_TARGET_TYPE_GPU, val); if (rc == false) { event_log_error (hashcat_ctx, "%s", "XNVCTRLQueryTargetCount() failed."); return -1; } return 0; } static int hm_XNVCTRL_get_fan_control (hashcat_ctx_t *hashcat_ctx, const int gpu, int *val) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; XNVCTRL_PTR *xnvctrl = hwmon_ctx->hm_xnvctrl; if (xnvctrl->XNVCTRLQueryTargetAttribute == NULL) return -1; if (xnvctrl->dpy == NULL) return -1; const bool rc = xnvctrl->XNVCTRLQueryTargetAttribute (xnvctrl->dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, 0, NV_CTRL_GPU_COOLER_MANUAL_CONTROL, val); if (rc == false) { event_log_error (hashcat_ctx, "XNVCTRLQueryTargetAttribute() failed."); // help the user to fix the problem event_log_warning (hashcat_ctx, "This error typically occurs when you did not set up NVidia Coolbits."); event_log_warning (hashcat_ctx, "To fix, run this command:"); event_log_warning (hashcat_ctx, " sudo nvidia-xconfig --cool-bits=12"); event_log_warning (hashcat_ctx, "Do not forget to restart X afterwards."); event_log_warning (hashcat_ctx, NULL); return -1; } return 0; } static int hm_XNVCTRL_set_fan_control (hashcat_ctx_t *hashcat_ctx, const int gpu, int val) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; XNVCTRL_PTR *xnvctrl = hwmon_ctx->hm_xnvctrl; if (xnvctrl->XNVCTRLSetTargetAttribute == NULL) return -1; if (xnvctrl->dpy == NULL) return -1; int cur; int rc = hm_XNVCTRL_get_fan_control (hashcat_ctx, gpu, &cur); if (rc == -1) return -1; xnvctrl->XNVCTRLSetTargetAttribute (xnvctrl->dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, 0, NV_CTRL_GPU_COOLER_MANUAL_CONTROL, val); rc = hm_XNVCTRL_get_fan_control (hashcat_ctx, gpu, &cur); if (rc == -1) return -1; if (cur != val) return -1; return 0; } /* static int hm_XNVCTRL_get_core_threshold (hashcat_ctx_t *hashcat_ctx, const int gpu, int *val) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; XNVCTRL_PTR *xnvctrl = hwmon_ctx->hm_xnvctrl; if (xnvctrl->XNVCTRLQueryTargetAttribute == NULL) return -1; if (xnvctrl->dpy == NULL) return -1; const bool rc = xnvctrl->XNVCTRLQueryTargetAttribute (xnvctrl->dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, 0, NV_CTRL_GPU_CORE_THRESHOLD, val); if (rc == false) { event_log_error (hashcat_ctx, "XNVCTRLQueryTargetAttribute(NV_CTRL_GPU_CORE_THRESHOLD) failed."); return -1; } return 0; } */ /* static int hm_XNVCTRL_get_fan_speed_current (hashcat_ctx_t *hashcat_ctx, const int gpu, int *val) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; XNVCTRL_PTR *xnvctrl = hwmon_ctx->hm_xnvctrl; if (xnvctrl->XNVCTRLQueryTargetAttribute == NULL) return -1; if (xnvctrl->dpy == NULL) return -1; const bool rc = xnvctrl->XNVCTRLQueryTargetAttribute (xnvctrl->dpy, NV_CTRL_TARGET_TYPE_COOLER, gpu, 0, NV_CTRL_THERMAL_COOLER_CURRENT_LEVEL, val); if (rc == false) { event_log_error (hashcat_ctx, "XNVCTRLQueryTargetAttribute(NV_CTRL_THERMAL_COOLER_CURRENT_LEVEL) failed."); return -1; } return 0; } */ static int hm_XNVCTRL_get_fan_speed_target (hashcat_ctx_t *hashcat_ctx, const int gpu, int *val) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; XNVCTRL_PTR *xnvctrl = hwmon_ctx->hm_xnvctrl; if (xnvctrl->XNVCTRLQueryTargetAttribute == NULL) return -1; if (xnvctrl->dpy == NULL) return -1; const int rc = xnvctrl->XNVCTRLQueryTargetAttribute (xnvctrl->dpy, NV_CTRL_TARGET_TYPE_COOLER, gpu, 0, NV_CTRL_THERMAL_COOLER_LEVEL, val); if (rc == false) { event_log_error (hashcat_ctx, "%s", "XNVCTRLQueryTargetAttribute(NV_CTRL_THERMAL_COOLER_LEVEL) failed."); return -1; } return 0; } static int hm_XNVCTRL_set_fan_speed_target (hashcat_ctx_t *hashcat_ctx, const int gpu, int val) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; XNVCTRL_PTR *xnvctrl = hwmon_ctx->hm_xnvctrl; if (xnvctrl->XNVCTRLSetTargetAttribute == NULL) return -1; if (xnvctrl->dpy == NULL) return -1; int cur; int rc = hm_XNVCTRL_get_fan_speed_target (hashcat_ctx, gpu, &cur); if (rc == -1) return -1; xnvctrl->XNVCTRLSetTargetAttribute (xnvctrl->dpy, NV_CTRL_TARGET_TYPE_COOLER, gpu, 0, NV_CTRL_THERMAL_COOLER_LEVEL, val); rc = hm_XNVCTRL_get_fan_speed_target (hashcat_ctx, gpu, &cur); if (rc == -1) return -1; if (cur != val) return -1; return 0; } static int hm_XNVCTRL_get_pci_bus (hashcat_ctx_t *hashcat_ctx, const int gpu, int *val) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; XNVCTRL_PTR *xnvctrl = hwmon_ctx->hm_xnvctrl; if (xnvctrl->XNVCTRLQueryTargetAttribute == NULL) return -1; if (xnvctrl->dpy == NULL) return -1; const int rc = xnvctrl->XNVCTRLQueryTargetAttribute (xnvctrl->dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, 0, NV_CTRL_PCI_BUS, val); if (rc == false) { event_log_error (hashcat_ctx, "%s", "XNVCTRLQueryTargetAttribute(NV_CTRL_PCI_BUS) failed."); return -1; } return 0; } static int hm_XNVCTRL_get_pci_device (hashcat_ctx_t *hashcat_ctx, const int gpu, int *val) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; XNVCTRL_PTR *xnvctrl = hwmon_ctx->hm_xnvctrl; if (xnvctrl->XNVCTRLQueryTargetAttribute == NULL) return -1; if (xnvctrl->dpy == NULL) return -1; const int rc = xnvctrl->XNVCTRLQueryTargetAttribute (xnvctrl->dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, 0, NV_CTRL_PCI_DEVICE, val); if (rc == false) { event_log_error (hashcat_ctx, "%s", "XNVCTRLQueryTargetAttribute(NV_CTRL_PCI_DEVICE) failed."); return -1; } return 0; } static int hm_XNVCTRL_get_pci_function (hashcat_ctx_t *hashcat_ctx, const int gpu, int *val) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; XNVCTRL_PTR *xnvctrl = hwmon_ctx->hm_xnvctrl; if (xnvctrl->XNVCTRLQueryTargetAttribute == NULL) return -1; if (xnvctrl->dpy == NULL) return -1; const int rc = xnvctrl->XNVCTRLQueryTargetAttribute (xnvctrl->dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, 0, NV_CTRL_PCI_FUNCTION, val); if (rc == false) { event_log_error (hashcat_ctx, "%s", "XNVCTRLQueryTargetAttribute(NV_CTRL_PCI_FUNCTION) failed."); return -1; } return 0; } // ADL functions static int adl_init (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; memset (adl, 0, sizeof (ADL_PTR)); #if defined (_WIN) adl->lib = hc_dlopen ("atiadlxx.dll"); if (!adl->lib) { adl->lib = hc_dlopen ("atiadlxy.dll"); } #elif defined (__CYGWIN__) adl->lib = hc_dlopen ("atiadlxx.dll", RTLD_NOW); if (!adl->lib) { adl->lib = hc_dlopen ("atiadlxy.dll", RTLD_NOW); } #elif defined (_POSIX) adl->lib = hc_dlopen ("libatiadlxx.so", RTLD_NOW); #endif if (!adl->lib) { //if (user_options->quiet == false) // event_log_error (hashcat_ctx, "Load of ADL library failed. Proceeding without ADL HWMon enabled."); return -1; } HC_LOAD_FUNC(adl, ADL_Main_Control_Destroy, ADL_MAIN_CONTROL_DESTROY, ADL, 0) HC_LOAD_FUNC(adl, ADL_Main_Control_Create, ADL_MAIN_CONTROL_CREATE, ADL, 0) HC_LOAD_FUNC(adl, ADL_Adapter_NumberOfAdapters_Get, ADL_ADAPTER_NUMBEROFADAPTERS_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Adapter_AdapterInfo_Get, ADL_ADAPTER_ADAPTERINFO_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Display_DisplayInfo_Get, ADL_DISPLAY_DISPLAYINFO_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Adapter_ID_Get, ADL_ADAPTER_ID_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Adapter_VideoBiosInfo_Get, ADL_ADAPTER_VIDEOBIOSINFO_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive5_ThermalDevices_Enum, ADL_OVERDRIVE5_THERMALDEVICES_ENUM, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive5_Temperature_Get, ADL_OVERDRIVE5_TEMPERATURE_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive6_Temperature_Get, ADL_OVERDRIVE6_TEMPERATURE_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive5_CurrentActivity_Get, ADL_OVERDRIVE5_CURRENTACTIVITY_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive5_FanSpeedInfo_Get, ADL_OVERDRIVE5_FANSPEEDINFO_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive5_FanSpeed_Get, ADL_OVERDRIVE5_FANSPEED_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive6_FanSpeed_Get, ADL_OVERDRIVE6_FANSPEED_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive5_FanSpeed_Set, ADL_OVERDRIVE5_FANSPEED_SET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive6_FanSpeed_Set, ADL_OVERDRIVE6_FANSPEED_SET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive5_FanSpeedToDefault_Set, ADL_OVERDRIVE5_FANSPEEDTODEFAULT_SET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive5_ODParameters_Get, ADL_OVERDRIVE5_ODPARAMETERS_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive5_ODPerformanceLevels_Get, ADL_OVERDRIVE5_ODPERFORMANCELEVELS_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive5_ODPerformanceLevels_Set, ADL_OVERDRIVE5_ODPERFORMANCELEVELS_SET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive6_PowerControlInfo_Get, ADL_OVERDRIVE6_POWERCONTROLINFO_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive6_PowerControl_Get, ADL_OVERDRIVE6_POWERCONTROL_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive6_PowerControl_Set, ADL_OVERDRIVE6_POWERCONTROL_SET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Adapter_Active_Get, ADL_ADAPTER_ACTIVE_GET, ADL, 0) //HC_LOAD_FUNC(adl, ADL_DisplayEnable_Set, ADL_DISPLAYENABLE_SET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive_Caps, ADL_OVERDRIVE_CAPS, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive6_PowerControl_Caps, ADL_OVERDRIVE6_POWERCONTROL_CAPS, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive6_Capabilities_Get, ADL_OVERDRIVE6_CAPABILITIES_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive6_StateInfo_Get, ADL_OVERDRIVE6_STATEINFO_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive6_CurrentStatus_Get, ADL_OVERDRIVE6_CURRENTSTATUS_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive6_State_Set, ADL_OVERDRIVE6_STATE_SET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive6_TargetTemperatureData_Get, ADL_OVERDRIVE6_TARGETTEMPERATUREDATA_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive6_TargetTemperatureRangeInfo_Get, ADL_OVERDRIVE6_TARGETTEMPERATURERANGEINFO_GET, ADL, 0) HC_LOAD_FUNC(adl, ADL_Overdrive6_FanSpeed_Reset, ADL_OVERDRIVE6_FANSPEED_RESET, ADL, 0) return 0; } static void adl_close (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; if (adl) { if (adl->lib) hc_dlclose (adl->lib); hcfree (adl); } } static int hm_ADL_Main_Control_Destroy (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Main_Control_Destroy (); if (ADL_rc != ADL_OK) { event_log_error (hashcat_ctx, "ADL_Main_Control_Destroy(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Main_Control_Create (hashcat_ctx_t *hashcat_ctx, ADL_MAIN_MALLOC_CALLBACK callback, int iEnumConnectedAdapters) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Main_Control_Create (callback, iEnumConnectedAdapters); if (ADL_rc != ADL_OK) { event_log_error (hashcat_ctx, "ADL_Main_Control_Create(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Adapter_NumberOfAdapters_Get (hashcat_ctx_t *hashcat_ctx, int *lpNumAdapters) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Adapter_NumberOfAdapters_Get (lpNumAdapters); if (ADL_rc != ADL_OK) { event_log_error (hashcat_ctx, "ADL_Adapter_NumberOfAdapters_Get(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Adapter_AdapterInfo_Get (hashcat_ctx_t *hashcat_ctx, LPAdapterInfo lpInfo, int iInputSize) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Adapter_AdapterInfo_Get (lpInfo, iInputSize); if (ADL_rc != ADL_OK) { event_log_error (hashcat_ctx, "ADL_Adapter_AdapterInfo_Get(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive5_Temperature_Get (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex, int iThermalControllerIndex, ADLTemperature *lpTemperature) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Overdrive5_Temperature_Get (iAdapterIndex, iThermalControllerIndex, lpTemperature); if (ADL_rc != ADL_OK) { event_log_error (hashcat_ctx, "ADL_Overdrive5_Temperature_Get(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive6_Temperature_Get (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex, int *iTemperature) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Overdrive6_Temperature_Get (iAdapterIndex, iTemperature); if (ADL_rc != ADL_OK) { event_log_error (hashcat_ctx, "ADL_Overdrive6_Temperature_Get(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive_CurrentActivity_Get (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex, ADLPMActivity *lpActivity) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Overdrive5_CurrentActivity_Get (iAdapterIndex, lpActivity); if (ADL_rc != ADL_OK) { event_log_error (hashcat_ctx, "ADL_Overdrive5_CurrentActivity_Get(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive5_FanSpeed_Get (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex, int iThermalControllerIndex, ADLFanSpeedValue *lpFanSpeedValue) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Overdrive5_FanSpeed_Get (iAdapterIndex, iThermalControllerIndex, lpFanSpeedValue); if ((ADL_rc != ADL_OK) && (ADL_rc != ADL_ERR_NOT_SUPPORTED)) // exception allowed only here { event_log_error (hashcat_ctx, "ADL_Overdrive5_FanSpeed_Get(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive6_FanSpeed_Get (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex, ADLOD6FanSpeedInfo *lpFanSpeedInfo) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Overdrive6_FanSpeed_Get (iAdapterIndex, lpFanSpeedInfo); if ((ADL_rc != ADL_OK) && (ADL_rc != ADL_ERR_NOT_SUPPORTED)) // exception allowed only here { event_log_error (hashcat_ctx, "ADL_Overdrive6_FanSpeed_Get(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive5_FanSpeed_Set (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex, int iThermalControllerIndex, ADLFanSpeedValue *lpFanSpeedValue) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Overdrive5_FanSpeed_Set (iAdapterIndex, iThermalControllerIndex, lpFanSpeedValue); if ((ADL_rc != ADL_OK) && (ADL_rc != ADL_ERR_NOT_SUPPORTED)) // exception allowed only here { event_log_error (hashcat_ctx, "ADL_Overdrive5_FanSpeed_Set(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive6_FanSpeed_Set (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex, ADLOD6FanSpeedValue *lpFanSpeedValue) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Overdrive6_FanSpeed_Set (iAdapterIndex, lpFanSpeedValue); if ((ADL_rc != ADL_OK) && (ADL_rc != ADL_ERR_NOT_SUPPORTED)) // exception allowed only here { event_log_error (hashcat_ctx, "ADL_Overdrive6_FanSpeed_Set(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive5_FanSpeedToDefault_Set (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex, int iThermalControllerIndex) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Overdrive5_FanSpeedToDefault_Set (iAdapterIndex, iThermalControllerIndex); if ((ADL_rc != ADL_OK) && (ADL_rc != ADL_ERR_NOT_SUPPORTED)) // exception allowed only here { event_log_error (hashcat_ctx, "ADL_Overdrive5_FanSpeedToDefault_Set(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive_PowerControlInfo_Get (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex, ADLOD6PowerControlInfo *powertune) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Overdrive6_PowerControlInfo_Get (iAdapterIndex, powertune); if (ADL_rc != ADL_OK) { event_log_error (hashcat_ctx, "ADL_Overdrive6_PowerControlInfo_Get(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive_PowerControl_Get (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex, int *iCurrentValue) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; int default_value = 0; const int ADL_rc = adl->ADL_Overdrive6_PowerControl_Get (iAdapterIndex, iCurrentValue, &default_value); if (ADL_rc != ADL_OK) { event_log_error (hashcat_ctx, "ADL_Overdrive6_PowerControl_Get(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive_PowerControl_Set (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex, int level) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; ADLOD6PowerControlInfo powertune = {0, 0, 0, 0, 0}; const int hm_rc = hm_ADL_Overdrive_PowerControlInfo_Get (hashcat_ctx, iAdapterIndex, &powertune); if (hm_rc == -1) return -1; int min = powertune.iMinValue; int max = powertune.iMaxValue; int step = powertune.iStepValue; if (level < min || level > max) { event_log_error (hashcat_ctx, "ADL PowerControl level invalid."); return -1; } if (step == 0) { event_log_error (hashcat_ctx, "ADL PowerControl step invalid."); return -1; } if (level % step != 0) { event_log_error (hashcat_ctx, "ADL PowerControl step invalid."); return -1; } const int ADL_rc = adl->ADL_Overdrive6_PowerControl_Set (iAdapterIndex, level); if (ADL_rc != ADL_OK) { event_log_error (hashcat_ctx, "ADL_Overdrive6_PowerControl_Set(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive_Caps (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex, int *od_supported, int *od_enabled, int *od_version) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Overdrive_Caps (iAdapterIndex, od_supported, od_enabled, od_version); if (ADL_rc != ADL_OK) { event_log_error (hashcat_ctx, "ADL_Overdrive_Caps(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive6_PowerControl_Caps (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex, int *lpSupported) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Overdrive6_PowerControl_Caps (iAdapterIndex, lpSupported); if (ADL_rc != ADL_OK) { event_log_error (hashcat_ctx, "ADL_Overdrive6_PowerControl_Caps(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive_Capabilities_Get (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex, ADLOD6Capabilities *caps) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Overdrive6_Capabilities_Get (iAdapterIndex, caps); if (ADL_rc != ADL_OK) { event_log_error (hashcat_ctx, "ADL_Overdrive6_Capabilities_Get(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive_StateInfo_Get (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex, int type, ADLOD6MemClockState *state) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->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; const int hm_rc = hm_ADL_Overdrive_Capabilities_Get (hashcat_ctx, iAdapterIndex, &caps); if (hm_rc == -1) return -1; if (state->state.aLevels[0].iEngineClock % caps.sEngineClockRange.iStep != 0) { event_log_error (hashcat_ctx, "ADL engine step size invalid for performance level 1."); //state->state.aLevels[0].iEngineClock -= state->state.aLevels[0].iEngineClock % caps.sEngineClockRange.iStep; return -1; } if (state->state.aLevels[1].iEngineClock % caps.sEngineClockRange.iStep != 0) { event_log_error (hashcat_ctx, "ADL engine step size invalid for performance level 2."); //state->state.aLevels[1].iEngineClock -= state->state.aLevels[1].iEngineClock % caps.sEngineClockRange.iStep; return -1; } if (state->state.aLevels[0].iMemoryClock % caps.sMemoryClockRange.iStep != 0) { event_log_error (hashcat_ctx, "ADL memory step size invalid for performance level 1."); //state->state.aLevels[0].iMemoryClock -= state->state.aLevels[0].iMemoryClock % caps.sMemoryClockRange.iStep; return -1; } if (state->state.aLevels[1].iMemoryClock % caps.sMemoryClockRange.iStep != 0) { event_log_error (hashcat_ctx, "ADL memory step size invalid for performance level 2."); //state->state.aLevels[1].iMemoryClock -= state->state.aLevels[1].iMemoryClock % caps.sMemoryClockRange.iStep; return -1; } } else { event_log_error (hashcat_ctx, "ADL_Overdrive6_StateInfo_Get(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive_State_Set (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex, int type, ADLOD6StateInfo *state) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; // sanity checks ADLOD6Capabilities caps; const int hm_rc = hm_ADL_Overdrive_Capabilities_Get (hashcat_ctx, iAdapterIndex, &caps); if (hm_rc == -1) return -1; if (state->aLevels[0].iEngineClock < caps.sEngineClockRange.iMin || state->aLevels[1].iEngineClock > caps.sEngineClockRange.iMax) { event_log_error (hashcat_ctx, "ADL engine clock outside valid range."); return -1; } if (state->aLevels[1].iEngineClock % caps.sEngineClockRange.iStep != 0) { event_log_error (hashcat_ctx, "ADL engine step size invalid."); return -1; } if (state->aLevels[0].iMemoryClock < caps.sMemoryClockRange.iMin || state->aLevels[1].iMemoryClock > caps.sMemoryClockRange.iMax) { event_log_error (hashcat_ctx, "ADL memory clock outside valid range."); return -1; } if (state->aLevels[1].iMemoryClock % caps.sMemoryClockRange.iStep != 0) { event_log_error (hashcat_ctx, "ADL memory step size invalid."); return -1; } const int ADL_rc = adl->ADL_Overdrive6_State_Set (iAdapterIndex, type, state); if (ADL_rc != ADL_OK) { event_log_error (hashcat_ctx, "ADL_Overdrive6_State_Set(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive6_TargetTemperatureData_Get (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex, int *cur_temp, int *default_temp) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Overdrive6_TargetTemperatureData_Get (iAdapterIndex, cur_temp, default_temp); if (ADL_rc != ADL_OK) { event_log_error (hashcat_ctx, "ADL_Overdrive6_TargetTemperatureData_Get(): %d", ADL_rc); return -1; } return 0; } static int hm_ADL_Overdrive6_FanSpeed_Reset (hashcat_ctx_t *hashcat_ctx, int iAdapterIndex) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; ADL_PTR *adl = hwmon_ctx->hm_adl; const int ADL_rc = adl->ADL_Overdrive6_FanSpeed_Reset (iAdapterIndex); if (ADL_rc != ADL_OK) { event_log_error (hashcat_ctx, "ADL_Overdrive6_FanSpeed_Reset(): %d", ADL_rc); return -1; } return 0; } // general functions static int get_adapters_num_adl (hashcat_ctx_t *hashcat_ctx, int *iNumberAdapters) { const int hm_rc = hm_ADL_Adapter_NumberOfAdapters_Get (hashcat_ctx, iNumberAdapters); if (hm_rc == -1) return -1; if (iNumberAdapters == NULL) { event_log_error (hashcat_ctx, "No ADL adapters found."); return -1; } return 0; } static int hm_get_adapter_index_nvapi (hashcat_ctx_t *hashcat_ctx, HM_ADAPTER_NVAPI *nvapiGPUHandle) { NvU32 pGpuCount; if (hm_NvAPI_EnumPhysicalGPUs (hashcat_ctx, nvapiGPUHandle, &pGpuCount) == -1) return 0; if (pGpuCount == 0) { event_log_error (hashcat_ctx, "No NvAPI adapters found."); return 0; } return (pGpuCount); } static int hm_get_adapter_index_nvml (hashcat_ctx_t *hashcat_ctx, HM_ADAPTER_NVML *nvmlGPUHandle) { unsigned int deviceCount = 0; hm_NVML_nvmlDeviceGetCount (hashcat_ctx, &deviceCount); if (deviceCount == 0) { event_log_error (hashcat_ctx, "No NVML adapters found."); return 0; } for (u32 i = 0; i < deviceCount; i++) { if (hm_NVML_nvmlDeviceGetHandleByIndex (hashcat_ctx, i, &nvmlGPUHandle[i]) == -1) 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)); // hm_NVML_nvmlDeviceGetName (hashcat_ctx, nvGPUHandle[i], name, sizeof (name) - 1); } return (deviceCount); } int hm_get_threshold_slowdown_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (hwmon_ctx->enabled == false) return -1; if (hwmon_ctx->hm_device[device_id].threshold_slowdown_get_supported == false) return -1; if ((opencl_ctx->devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1; if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_AMD) { if (hwmon_ctx->hm_adl) { if (hwmon_ctx->hm_device[device_id].od_version == 5) { } else if (hwmon_ctx->hm_device[device_id].od_version == 6) { int CurrentValue = 0; int DefaultValue = 0; if (hm_ADL_Overdrive6_TargetTemperatureData_Get (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, &CurrentValue, &DefaultValue) == -1) { hwmon_ctx->hm_device[device_id].threshold_slowdown_get_supported = false; return -1; } // the return value has never been tested since hm_ADL_Overdrive6_TargetTemperatureData_Get() never worked on any system. expect problems. return DefaultValue; } } } if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_NV) { if (hwmon_ctx->hm_nvml) { int target = 0; if (hm_NVML_nvmlDeviceGetTemperatureThreshold (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvml, NVML_TEMPERATURE_THRESHOLD_SLOWDOWN, (unsigned int *) &target) == -1) { hwmon_ctx->hm_device[device_id].threshold_slowdown_get_supported = false; return -1; } return target; } } hwmon_ctx->hm_device[device_id].threshold_slowdown_get_supported = false; return -1; } int hm_get_threshold_shutdown_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (hwmon_ctx->enabled == false) return -1; if (hwmon_ctx->hm_device[device_id].threshold_shutdown_get_supported == false) return -1; if ((opencl_ctx->devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1; if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_AMD) { if (hwmon_ctx->hm_adl) { if (hwmon_ctx->hm_device[device_id].od_version == 5) { } else if (hwmon_ctx->hm_device[device_id].od_version == 6) { } } } if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_NV) { if (hwmon_ctx->hm_nvml) { int target = 0; if (hm_NVML_nvmlDeviceGetTemperatureThreshold (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvml, NVML_TEMPERATURE_THRESHOLD_SHUTDOWN, (unsigned int *) &target) == -1) { hwmon_ctx->hm_device[device_id].threshold_shutdown_get_supported = false; return -1; } return target; } } hwmon_ctx->hm_device[device_id].threshold_shutdown_get_supported = false; return -1; } int hm_get_temperature_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (hwmon_ctx->enabled == false) return -1; if (hwmon_ctx->hm_device[device_id].temperature_get_supported == false) return -1; if ((opencl_ctx->devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1; if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_AMD) { if (hwmon_ctx->hm_adl) { if (hwmon_ctx->hm_device[device_id].od_version == 5) { ADLTemperature Temperature; Temperature.iSize = sizeof (ADLTemperature); if (hm_ADL_Overdrive5_Temperature_Get (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, 0, &Temperature) == -1) { hwmon_ctx->hm_device[device_id].temperature_get_supported = false; return -1; } return Temperature.iTemperature / 1000; } if (hwmon_ctx->hm_device[device_id].od_version == 6) { int Temperature = 0; if (hm_ADL_Overdrive6_Temperature_Get (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, &Temperature) == -1) { hwmon_ctx->hm_device[device_id].temperature_get_supported = false; return -1; } return Temperature / 1000; } } if (hwmon_ctx->hm_sysfs) { int temperature = 0; if (hm_SYSFS_get_temperature_current (hashcat_ctx, device_id, &temperature) == -1) { hwmon_ctx->hm_device[device_id].temperature_get_supported = false; return -1; } return temperature; } } if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_NV) { if (hwmon_ctx->hm_nvml) { int temperature = 0; if (hm_NVML_nvmlDeviceGetTemperature (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvml, NVML_TEMPERATURE_GPU, (u32 *) &temperature) == -1) { hwmon_ctx->hm_device[device_id].temperature_get_supported = false; return -1; } return temperature; } } hwmon_ctx->hm_device[device_id].temperature_get_supported = false; return -1; } int hm_get_fanpolicy_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (hwmon_ctx->enabled == false) return -1; if (hwmon_ctx->hm_device[device_id].fanpolicy_get_supported == false) return -1; if ((opencl_ctx->devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1; if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_AMD) { if (hwmon_ctx->hm_adl) { if (hwmon_ctx->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; if (hm_ADL_Overdrive5_FanSpeed_Get (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, 0, &lpFanSpeedValue) == -1) { hwmon_ctx->hm_device[device_id].fanpolicy_get_supported = false; hwmon_ctx->hm_device[device_id].fanspeed_get_supported = false; return -1; } return (lpFanSpeedValue.iFanSpeed & ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED) ? 0 : 1; } if (hwmon_ctx->hm_device[device_id].od_version == 6) { return 1; } } if (hwmon_ctx->hm_sysfs) { return 1; } } if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_NV) { return 1; } hwmon_ctx->hm_device[device_id].fanpolicy_get_supported = false; hwmon_ctx->hm_device[device_id].fanspeed_get_supported = false; return -1; } int hm_get_fanspeed_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (hwmon_ctx->enabled == false) return -1; if (hwmon_ctx->hm_device[device_id].fanspeed_get_supported == false) return -1; if ((opencl_ctx->devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1; if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_AMD) { if (hwmon_ctx->hm_adl) { if (hwmon_ctx->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 (hm_ADL_Overdrive5_FanSpeed_Get (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, 0, &lpFanSpeedValue) == -1) { hwmon_ctx->hm_device[device_id].fanspeed_get_supported = false; return -1; } return lpFanSpeedValue.iFanSpeed; } if (hwmon_ctx->hm_device[device_id].od_version == 6) { ADLOD6FanSpeedInfo faninfo; memset (&faninfo, 0, sizeof (faninfo)); if (hm_ADL_Overdrive6_FanSpeed_Get (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, &faninfo) == -1) { hwmon_ctx->hm_device[device_id].fanspeed_get_supported = false; return -1; } return faninfo.iFanSpeedPercent; } } if (hwmon_ctx->hm_sysfs) { int speed = 0; if (hm_SYSFS_get_fan_speed_current (hashcat_ctx, device_id, &speed) == -1) { hwmon_ctx->hm_device[device_id].fanspeed_get_supported = false; return -1; } return speed; } } if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_NV) { if (hwmon_ctx->hm_nvml) { int speed = 0; if (hm_NVML_nvmlDeviceGetFanSpeed (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvml, (u32 *) &speed) == -1) { hwmon_ctx->hm_device[device_id].fanspeed_get_supported = false; return -1; } return speed; } } hwmon_ctx->hm_device[device_id].fanspeed_get_supported = false; return -1; } int hm_get_buslanes_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (hwmon_ctx->enabled == false) return -1; if (hwmon_ctx->hm_device[device_id].buslanes_get_supported == false) return -1; if ((opencl_ctx->devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1; if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_AMD) { if (hwmon_ctx->hm_adl) { ADLPMActivity PMActivity; PMActivity.iSize = sizeof (ADLPMActivity); if (hm_ADL_Overdrive_CurrentActivity_Get (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, &PMActivity) == -1) { hwmon_ctx->hm_device[device_id].buslanes_get_supported = false; return -1; } return PMActivity.iCurrentBusLanes; } if (hwmon_ctx->hm_sysfs) { int lanes; if (hm_SYSFS_get_pp_dpm_pcie (hashcat_ctx, device_id, &lanes) == -1) { hwmon_ctx->hm_device[device_id].buslanes_get_supported = false; return -1; } return lanes; } } if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_NV) { if (hwmon_ctx->hm_nvml) { unsigned int currLinkWidth; if (hm_NVML_nvmlDeviceGetCurrPcieLinkWidth (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvml, &currLinkWidth) == -1) { hwmon_ctx->hm_device[device_id].buslanes_get_supported = false; return -1; } return currLinkWidth; } } hwmon_ctx->hm_device[device_id].buslanes_get_supported = false; return -1; } int hm_get_utilization_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (hwmon_ctx->enabled == false) return -1; if (hwmon_ctx->hm_device[device_id].utilization_get_supported == false) return -1; if ((opencl_ctx->devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1; if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_AMD) { if (hwmon_ctx->hm_adl) { ADLPMActivity PMActivity; PMActivity.iSize = sizeof (ADLPMActivity); if (hm_ADL_Overdrive_CurrentActivity_Get (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, &PMActivity) == -1) { hwmon_ctx->hm_device[device_id].utilization_get_supported = false; return -1; } return PMActivity.iActivityPercent; } } if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_NV) { if (hwmon_ctx->hm_nvml) { nvmlUtilization_t utilization; if (hm_NVML_nvmlDeviceGetUtilizationRates (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvml, &utilization) == -1) { hwmon_ctx->hm_device[device_id].utilization_get_supported = false; return -1; } return utilization.gpu; } } hwmon_ctx->hm_device[device_id].utilization_get_supported = false; return -1; } int hm_get_memoryspeed_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (hwmon_ctx->enabled == false) return -1; if (hwmon_ctx->hm_device[device_id].memoryspeed_get_supported == false) return -1; if ((opencl_ctx->devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1; if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_AMD) { if (hwmon_ctx->hm_adl) { ADLPMActivity PMActivity; PMActivity.iSize = sizeof (ADLPMActivity); if (hm_ADL_Overdrive_CurrentActivity_Get (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, &PMActivity) == -1) { hwmon_ctx->hm_device[device_id].memoryspeed_get_supported = false; return -1; } return PMActivity.iMemoryClock / 100; } if (hwmon_ctx->hm_sysfs) { int clockfreq; if (hm_SYSFS_get_pp_dpm_mclk (hashcat_ctx, device_id, &clockfreq) == -1) { hwmon_ctx->hm_device[device_id].memoryspeed_get_supported = false; return -1; } return clockfreq; } } if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_NV) { if (hwmon_ctx->hm_nvml) { unsigned int clockfreq; if (hm_NVML_nvmlDeviceGetClockInfo (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvml, NVML_CLOCK_MEM, &clockfreq) == -1) { hwmon_ctx->hm_device[device_id].memoryspeed_get_supported = false; return -1; } return clockfreq; } } hwmon_ctx->hm_device[device_id].memoryspeed_get_supported = false; return -1; } int hm_get_corespeed_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (hwmon_ctx->enabled == false) return -1; if (hwmon_ctx->hm_device[device_id].corespeed_get_supported == false) return -1; if ((opencl_ctx->devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1; if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_AMD) { if (hwmon_ctx->hm_adl) { ADLPMActivity PMActivity; PMActivity.iSize = sizeof (ADLPMActivity); if (hm_ADL_Overdrive_CurrentActivity_Get (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, &PMActivity) == -1) { hwmon_ctx->hm_device[device_id].corespeed_get_supported = false; return -1; } return PMActivity.iEngineClock / 100; } if (hwmon_ctx->hm_sysfs) { int clockfreq; if (hm_SYSFS_get_pp_dpm_sclk (hashcat_ctx, device_id, &clockfreq) == -1) { hwmon_ctx->hm_device[device_id].corespeed_get_supported = false; return -1; } return clockfreq; } } if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_NV) { if (hwmon_ctx->hm_nvml) { unsigned int clockfreq; if (hm_NVML_nvmlDeviceGetClockInfo (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvml, NVML_CLOCK_SM, &clockfreq) == -1) { hwmon_ctx->hm_device[device_id].corespeed_get_supported = false; return -1; } return clockfreq; } } hwmon_ctx->hm_device[device_id].corespeed_get_supported = false; return -1; } int hm_get_throttle_with_device_id (hashcat_ctx_t *hashcat_ctx, const u32 device_id) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (hwmon_ctx->enabled == false) return -1; if (hwmon_ctx->hm_device[device_id].throttle_get_supported == false) return -1; if ((opencl_ctx->devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1; if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_AMD) { } if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_NV) { if (hwmon_ctx->hm_nvml) { /* this is triggered by mask generator, too. therefore useless unsigned long long clocksThrottleReasons = 0; unsigned long long supportedThrottleReasons = 0; if (hm_NVML_nvmlDeviceGetCurrentClocksThrottleReasons (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvml, &clocksThrottleReasons) == -1) return -1; if (hm_NVML_nvmlDeviceGetSupportedClocksThrottleReasons (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvml, &supportedThrottleReasons) == -1) return -1; clocksThrottleReasons &= supportedThrottleReasons; clocksThrottleReasons &= ~nvmlClocksThrottleReasonGpuIdle; clocksThrottleReasons &= ~nvmlClocksThrottleReasonApplicationsClocksSetting; clocksThrottleReasons &= ~nvmlClocksThrottleReasonUnknown; if (opencl_ctx->kernel_power_final) { clocksThrottleReasons &= ~nvmlClocksThrottleReasonHwSlowdown; } return (clocksThrottleReasons != nvmlClocksThrottleReasonNone); */ } if (hwmon_ctx->hm_nvapi) { NV_GPU_PERF_POLICIES_INFO_PARAMS_V1 perfPolicies_info; NV_GPU_PERF_POLICIES_STATUS_PARAMS_V1 perfPolicies_status; memset (&perfPolicies_info, 0, sizeof (NV_GPU_PERF_POLICIES_INFO_PARAMS_V1)); memset (&perfPolicies_status, 0, sizeof (NV_GPU_PERF_POLICIES_STATUS_PARAMS_V1)); perfPolicies_info.version = MAKE_NVAPI_VERSION (NV_GPU_PERF_POLICIES_INFO_PARAMS_V1, 1); perfPolicies_status.version = MAKE_NVAPI_VERSION (NV_GPU_PERF_POLICIES_STATUS_PARAMS_V1, 1); hm_NvAPI_GPU_GetPerfPoliciesInfo (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvapi, &perfPolicies_info); perfPolicies_status.info_value = perfPolicies_info.info_value; hm_NvAPI_GPU_GetPerfPoliciesStatus (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvapi, &perfPolicies_status); return perfPolicies_status.throttle & 2; } } hwmon_ctx->hm_device[device_id].throttle_get_supported = false; return -1; } int hm_set_fanspeed_with_device_id_adl (hashcat_ctx_t *hashcat_ctx, const u32 device_id, const int fanspeed, const int fanpolicy) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; if (hwmon_ctx->enabled == false) return -1; if (hwmon_ctx->hm_device[device_id].fanspeed_set_supported == false) return -1; if (hwmon_ctx->hm_adl) { if (fanpolicy == 1) { if (hwmon_ctx->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 (hm_ADL_Overdrive5_FanSpeed_Set (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, 0, &lpFanSpeedValue) == -1) { hwmon_ctx->hm_device[device_id].fanspeed_set_supported = false; return -1; } return 0; } if (hwmon_ctx->hm_device[device_id].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 (hm_ADL_Overdrive6_FanSpeed_Set (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, &fan_speed_value) == -1) { hwmon_ctx->hm_device[device_id].fanspeed_set_supported = false; return -1; } return 0; } } else { if (hwmon_ctx->hm_device[device_id].od_version == 5) { if (hm_ADL_Overdrive5_FanSpeedToDefault_Set (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, 0) == -1) { hwmon_ctx->hm_device[device_id].fanspeed_set_supported = false; return -1; } return 0; } if (hwmon_ctx->hm_device[device_id].od_version == 6) { if (hm_ADL_Overdrive6_FanSpeed_Reset (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl) == -1) { hwmon_ctx->hm_device[device_id].fanspeed_set_supported = false; return -1; } return 0; } } } hwmon_ctx->hm_device[device_id].fanspeed_set_supported = false; return -1; } int hm_set_fanspeed_with_device_id_nvapi (hashcat_ctx_t *hashcat_ctx, const u32 device_id, const int fanspeed, const int fanpolicy) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; if (hwmon_ctx->enabled == false) return -1; if (hwmon_ctx->hm_device[device_id].fanspeed_set_supported == false) return -1; if (hwmon_ctx->hm_nvapi) { if (fanpolicy == 1) { NV_GPU_COOLER_LEVELS CoolerLevels; memset (&CoolerLevels, 0, sizeof (NV_GPU_COOLER_LEVELS)); CoolerLevels.Version = GPU_COOLER_LEVELS_VER | sizeof (NV_GPU_COOLER_LEVELS); CoolerLevels.Levels[0].Level = fanspeed; CoolerLevels.Levels[0].Policy = 1; if (hm_NvAPI_GPU_SetCoolerLevels (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvapi, 0, &CoolerLevels) == -1) { hwmon_ctx->hm_device[device_id].fanspeed_set_supported = false; return -1; } return 0; } if (fanpolicy != 1) { NV_GPU_COOLER_LEVELS CoolerLevels; memset (&CoolerLevels, 0, sizeof (NV_GPU_COOLER_LEVELS)); CoolerLevels.Version = GPU_COOLER_LEVELS_VER | sizeof (NV_GPU_COOLER_LEVELS); CoolerLevels.Levels[0].Level = 100; CoolerLevels.Levels[0].Policy = 0x20; if (hm_NvAPI_GPU_SetCoolerLevels (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvapi, 0, &CoolerLevels) == -1) { hwmon_ctx->hm_device[device_id].fanspeed_set_supported = false; return -1; } return 0; } } hwmon_ctx->hm_device[device_id].fanspeed_set_supported = false; return -1; } int hm_set_fanspeed_with_device_id_xnvctrl (hashcat_ctx_t *hashcat_ctx, const u32 device_id, const int fanspeed) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; if (hwmon_ctx->enabled == false) return -1; if (hwmon_ctx->hm_device[device_id].fanspeed_set_supported == false) return -1; if (hwmon_ctx->hm_xnvctrl) { if (hm_XNVCTRL_set_fan_speed_target (hashcat_ctx, hwmon_ctx->hm_device[device_id].xnvctrl, fanspeed) == -1) { hwmon_ctx->hm_device[device_id].fanspeed_set_supported = false; return -1; } return 0; } hwmon_ctx->hm_device[device_id].fanspeed_set_supported = false; return -1; } int hm_set_fanspeed_with_device_id_sysfs (hashcat_ctx_t *hashcat_ctx, const u32 device_id, const int fanspeed) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; if (hwmon_ctx->enabled == false) return -1; if (hwmon_ctx->hm_device[device_id].fanspeed_set_supported == false) return -1; if (hwmon_ctx->hm_sysfs) { if (hm_SYSFS_set_fan_speed_target (hashcat_ctx, device_id, fanspeed) == -1) { hwmon_ctx->hm_device[device_id].fanspeed_set_supported = false; return -1; } return 0; } hwmon_ctx->hm_device[device_id].fanspeed_set_supported = false; return -1; } static int hm_set_fanctrl_with_device_id_xnvctrl (hashcat_ctx_t *hashcat_ctx, const u32 device_id, const int val) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; if (hwmon_ctx->enabled == false) return -1; if (hwmon_ctx->hm_device[device_id].fanpolicy_set_supported == false) return -1; if (hwmon_ctx->hm_xnvctrl) { if (hm_XNVCTRL_set_fan_control (hashcat_ctx, hwmon_ctx->hm_device[device_id].xnvctrl, val) == -1) { hwmon_ctx->hm_device[device_id].fanpolicy_set_supported = false; hwmon_ctx->hm_device[device_id].fanspeed_set_supported = false; return -1; } return 0; } hwmon_ctx->hm_device[device_id].fanpolicy_set_supported = false; hwmon_ctx->hm_device[device_id].fanspeed_set_supported = false; return -1; } static int hm_set_fanctrl_with_device_id_sysfs (hashcat_ctx_t *hashcat_ctx, const u32 device_id, const int val) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; if (hwmon_ctx->enabled == false) return -1; if (hwmon_ctx->hm_device[device_id].fanpolicy_set_supported == false) return -1; if (hwmon_ctx->hm_sysfs) { if (hm_SYSFS_set_fan_control (hashcat_ctx, device_id, val) == -1) { hwmon_ctx->hm_device[device_id].fanpolicy_set_supported = false; hwmon_ctx->hm_device[device_id].fanspeed_set_supported = false; return -1; } return 0; } hwmon_ctx->hm_device[device_id].fanpolicy_set_supported = false; hwmon_ctx->hm_device[device_id].fanspeed_set_supported = false; return -1; } int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; user_options_t *user_options = hashcat_ctx->user_options; hwmon_ctx->enabled = false; if (user_options->example_hashes == true) return 0; if (user_options->keyspace == true) return 0; if (user_options->left == true) return 0; if (user_options->opencl_info == true) return 0; if (user_options->show == true) return 0; if (user_options->stdout_flag == true) return 0; if (user_options->usage == true) return 0; if (user_options->version == true) return 0; if (user_options->gpu_temp_disable == true) return 0; hwmon_ctx->hm_device = (hm_attrs_t *) hccalloc (DEVICES_MAX, sizeof (hm_attrs_t)); /** * Initialize shared libraries */ hm_attrs_t *hm_adapters_adl = (hm_attrs_t *) hccalloc (DEVICES_MAX, sizeof (hm_attrs_t)); hm_attrs_t *hm_adapters_nvapi = (hm_attrs_t *) hccalloc (DEVICES_MAX, sizeof (hm_attrs_t)); hm_attrs_t *hm_adapters_nvml = (hm_attrs_t *) hccalloc (DEVICES_MAX, sizeof (hm_attrs_t)); hm_attrs_t *hm_adapters_xnvctrl = (hm_attrs_t *) hccalloc (DEVICES_MAX, sizeof (hm_attrs_t)); hm_attrs_t *hm_adapters_sysfs = (hm_attrs_t *) hccalloc (DEVICES_MAX, sizeof (hm_attrs_t)); #define FREE_ADAPTERS \ { \ hcfree (hm_adapters_adl); \ hcfree (hm_adapters_nvapi); \ hcfree (hm_adapters_nvml); \ hcfree (hm_adapters_xnvctrl); \ hcfree (hm_adapters_sysfs); \ } if (opencl_ctx->need_nvml == true) { hwmon_ctx->hm_nvml = (NVML_PTR *) hcmalloc (sizeof (NVML_PTR)); if (nvml_init (hashcat_ctx) == -1) { hcfree (hwmon_ctx->hm_nvml); hwmon_ctx->hm_nvml = NULL; } } if ((opencl_ctx->need_nvapi == true) && (hwmon_ctx->hm_nvml)) // nvapi can't work alone, we need nvml, too { hwmon_ctx->hm_nvapi = (NVAPI_PTR *) hcmalloc (sizeof (NVAPI_PTR)); if (nvapi_init (hashcat_ctx) == -1) { hcfree (hwmon_ctx->hm_nvapi); hwmon_ctx->hm_nvapi = NULL; } } if ((opencl_ctx->need_xnvctrl == true) && (hwmon_ctx->hm_nvml)) // xnvctrl can't work alone, we need nvml, too { hwmon_ctx->hm_xnvctrl = (XNVCTRL_PTR *) hcmalloc (sizeof (XNVCTRL_PTR)); if (xnvctrl_init (hashcat_ctx) == -1) { hcfree (hwmon_ctx->hm_xnvctrl); hwmon_ctx->hm_xnvctrl = NULL; } } if (opencl_ctx->need_adl == true) { hwmon_ctx->hm_adl = (ADL_PTR *) hcmalloc (sizeof (ADL_PTR)); if (adl_init (hashcat_ctx) == -1) { hcfree (hwmon_ctx->hm_adl); hwmon_ctx->hm_adl = NULL; } } if (opencl_ctx->need_sysfs == true) { hwmon_ctx->hm_sysfs = (SYSFS_PTR *) hcmalloc (sizeof (SYSFS_PTR)); if (sysfs_init (hashcat_ctx) == false) { hcfree (hwmon_ctx->hm_sysfs); hwmon_ctx->hm_sysfs = NULL; } // also if there's ADL, we don't need sysfs if (hwmon_ctx->hm_adl) { hcfree (hwmon_ctx->hm_sysfs); hwmon_ctx->hm_sysfs = NULL; } } if (hwmon_ctx->hm_nvml) { if (hm_NVML_nvmlInit (hashcat_ctx) == 0) { HM_ADAPTER_NVML *nvmlGPUHandle = (HM_ADAPTER_NVML *) hccalloc (DEVICES_MAX, sizeof (HM_ADAPTER_NVML)); int tmp_in = hm_get_adapter_index_nvml (hashcat_ctx, nvmlGPUHandle); for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; if ((device_param->device_type & CL_DEVICE_TYPE_GPU) == 0) continue; if (device_param->device_vendor_id != VENDOR_ID_NV) continue; for (int i = 0; i < tmp_in; i++) { nvmlPciInfo_t pci; int rc = hm_NVML_nvmlDeviceGetPciInfo (hashcat_ctx, nvmlGPUHandle[i], &pci); if (rc == -1) continue; if ((device_param->pcie_bus == pci.bus) && (device_param->pcie_device == (pci.device >> 3)) && (device_param->pcie_function == (pci.device & 7))) { const u32 platform_devices_id = device_param->platform_devices_id; hm_adapters_nvml[platform_devices_id].nvml = nvmlGPUHandle[i]; hm_adapters_nvml[platform_devices_id].buslanes_get_supported = true; hm_adapters_nvml[platform_devices_id].corespeed_get_supported = true; hm_adapters_nvml[platform_devices_id].fanspeed_get_supported = true; hm_adapters_nvml[platform_devices_id].memoryspeed_get_supported = true; hm_adapters_nvml[platform_devices_id].temperature_get_supported = true; hm_adapters_nvml[platform_devices_id].threshold_shutdown_get_supported = true; hm_adapters_nvml[platform_devices_id].threshold_slowdown_get_supported = true; hm_adapters_nvml[platform_devices_id].utilization_get_supported = true; } } } hcfree (nvmlGPUHandle); } } if (hwmon_ctx->hm_nvapi) { if (hm_NvAPI_Initialize (hashcat_ctx) == 0) { HM_ADAPTER_NVAPI *nvGPUHandle = (HM_ADAPTER_NVAPI *) hccalloc (NVAPI_MAX_PHYSICAL_GPUS, sizeof (HM_ADAPTER_NVAPI)); int tmp_in = hm_get_adapter_index_nvapi (hashcat_ctx, nvGPUHandle); for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; if ((device_param->device_type & CL_DEVICE_TYPE_GPU) == 0) continue; if (device_param->device_vendor_id != VENDOR_ID_NV) continue; for (int i = 0; i < tmp_in; i++) { NvU32 BusId = 0; NvU32 BusSlotId = 0; int rc1 = hm_NvAPI_GPU_GetBusId (hashcat_ctx, nvGPUHandle[i], &BusId); if (rc1 == -1) continue; int rc2 = hm_NvAPI_GPU_GetBusSlotId (hashcat_ctx, nvGPUHandle[i], &BusSlotId); if (rc2 == -1) continue; if ((device_param->pcie_bus == BusId) && (device_param->pcie_device == (BusSlotId >> 3)) && (device_param->pcie_function == (BusSlotId & 7))) { const u32 platform_devices_id = device_param->platform_devices_id; hm_adapters_nvapi[platform_devices_id].nvapi = nvGPUHandle[i]; hm_adapters_nvapi[platform_devices_id].fanspeed_set_supported = true; hm_adapters_nvapi[platform_devices_id].fanpolicy_get_supported = true; hm_adapters_nvapi[platform_devices_id].fanpolicy_set_supported = true; hm_adapters_nvapi[platform_devices_id].throttle_get_supported = true; } } } hcfree (nvGPUHandle); } } if (hwmon_ctx->hm_xnvctrl) { if (hm_XNVCTRL_XOpenDisplay (hashcat_ctx) == 0) { int tmp_in = 0; hm_XNVCTRL_query_target_count (hashcat_ctx, &tmp_in); for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if ((device_param->device_type & CL_DEVICE_TYPE_GPU) == 0) continue; if (device_param->device_vendor_id != VENDOR_ID_NV) continue; for (int i = 0; i < tmp_in; i++) { int pci_bus = 0; int pci_device = 0; int pci_function = 0; const int rc1 = hm_XNVCTRL_get_pci_bus (hashcat_ctx, i, &pci_bus); if (rc1 == -1) continue; const int rc2 = hm_XNVCTRL_get_pci_device (hashcat_ctx, i, &pci_device); if (rc2 == -1) continue; const int rc3 = hm_XNVCTRL_get_pci_function (hashcat_ctx, i, &pci_function); if (rc3 == -1) continue; if ((device_param->pcie_bus == pci_bus) && (device_param->pcie_device == pci_device) && (device_param->pcie_function == pci_function)) { const u32 platform_devices_id = device_param->platform_devices_id; hm_adapters_xnvctrl[platform_devices_id].xnvctrl = i; hm_adapters_xnvctrl[platform_devices_id].fanspeed_get_supported = true; hm_adapters_xnvctrl[platform_devices_id].fanspeed_set_supported = true; hm_adapters_xnvctrl[platform_devices_id].fanpolicy_get_supported = true; hm_adapters_xnvctrl[platform_devices_id].fanpolicy_set_supported = true; } } } } } if (hwmon_ctx->hm_adl) { if (hm_ADL_Main_Control_Create (hashcat_ctx, ADL_Main_Memory_Alloc, 0) == 0) { // total number of adapters int tmp_in; if (get_adapters_num_adl (hashcat_ctx, &tmp_in) == -1) { FREE_ADAPTERS; return -1; } // adapter info LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) hccalloc (tmp_in, sizeof (AdapterInfo)); const int rc_adapter_info_adl = hm_ADL_Adapter_AdapterInfo_Get (hashcat_ctx, lpAdapterInfo, tmp_in * sizeof (AdapterInfo)); if (rc_adapter_info_adl == -1) { FREE_ADAPTERS; return -1; } for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; if ((device_param->device_type & CL_DEVICE_TYPE_GPU) == 0) continue; if (device_param->device_vendor_id != VENDOR_ID_AMD) continue; for (int i = 0; i < tmp_in; i++) { if ((device_param->pcie_bus == lpAdapterInfo[i].iBusNumber) && (device_param->pcie_device == (lpAdapterInfo[i].iDeviceNumber >> 3)) && (device_param->pcie_function == (lpAdapterInfo[i].iDeviceNumber & 7))) { const u32 platform_devices_id = device_param->platform_devices_id; int od_supported = 0; int od_enabled = 0; int od_version = 0; hm_ADL_Overdrive_Caps (hashcat_ctx, lpAdapterInfo[i].iAdapterIndex, &od_supported, &od_enabled, &od_version); hm_adapters_adl[platform_devices_id].od_version = od_version; hm_adapters_adl[platform_devices_id].adl = lpAdapterInfo[i].iAdapterIndex; hm_adapters_adl[platform_devices_id].buslanes_get_supported = true; hm_adapters_adl[platform_devices_id].corespeed_get_supported = true; hm_adapters_adl[platform_devices_id].fanspeed_get_supported = true; hm_adapters_adl[platform_devices_id].fanspeed_set_supported = true; hm_adapters_adl[platform_devices_id].fanpolicy_get_supported = true; hm_adapters_adl[platform_devices_id].fanpolicy_set_supported = true; hm_adapters_adl[platform_devices_id].memoryspeed_get_supported = true; hm_adapters_adl[platform_devices_id].temperature_get_supported = true; hm_adapters_adl[platform_devices_id].threshold_slowdown_get_supported = true; hm_adapters_adl[platform_devices_id].utilization_get_supported = true; } } } hcfree (lpAdapterInfo); } } if (hwmon_ctx->hm_sysfs) { if (1) { int hm_adapters_id = 0; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if ((device_param->device_type & CL_DEVICE_TYPE_GPU) == 0) continue; hm_adapters_sysfs[hm_adapters_id].sysfs = device_id; hm_adapters_sysfs[hm_adapters_id].buslanes_get_supported = true; hm_adapters_sysfs[hm_adapters_id].corespeed_get_supported = true; hm_adapters_sysfs[hm_adapters_id].fanspeed_get_supported = true; hm_adapters_sysfs[hm_adapters_id].fanspeed_set_supported = true; hm_adapters_sysfs[hm_adapters_id].fanpolicy_get_supported = true; hm_adapters_sysfs[hm_adapters_id].fanpolicy_set_supported = true; hm_adapters_sysfs[hm_adapters_id].memoryspeed_get_supported = true; hm_adapters_sysfs[hm_adapters_id].temperature_get_supported = true; hm_adapters_id++; } } } if (hwmon_ctx->hm_adl == NULL && hwmon_ctx->hm_nvml == NULL && hwmon_ctx->hm_xnvctrl == NULL && hwmon_ctx->hm_sysfs == NULL) { FREE_ADAPTERS; return 0; } /** * looks like we have some manageable device */ hwmon_ctx->enabled = true; /** * save buffer required for later restores */ hwmon_ctx->od_clock_mem_status = (ADLOD6MemClockState *) hccalloc (opencl_ctx->devices_cnt, sizeof (ADLOD6MemClockState)); hwmon_ctx->od_power_control_status = (int *) hccalloc (opencl_ctx->devices_cnt, sizeof (int)); hwmon_ctx->nvml_power_limit = (unsigned int *) hccalloc (opencl_ctx->devices_cnt, sizeof (unsigned int)); /** * HM devices: copy */ for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; if ((device_param->device_type & CL_DEVICE_TYPE_GPU) == 0) continue; const u32 platform_devices_id = device_param->platform_devices_id; if (device_param->device_vendor_id == VENDOR_ID_AMD) { hwmon_ctx->hm_device[device_id].adl = hm_adapters_adl[platform_devices_id].adl; hwmon_ctx->hm_device[device_id].sysfs = hm_adapters_sysfs[platform_devices_id].sysfs; hwmon_ctx->hm_device[device_id].nvapi = 0; hwmon_ctx->hm_device[device_id].nvml = 0; hwmon_ctx->hm_device[device_id].xnvctrl = 0; hwmon_ctx->hm_device[device_id].od_version = 0; if (hwmon_ctx->hm_adl) { hwmon_ctx->hm_device[device_id].od_version = hm_adapters_adl[platform_devices_id].od_version; hwmon_ctx->hm_device[device_id].buslanes_get_supported |= hm_adapters_adl[platform_devices_id].buslanes_get_supported; hwmon_ctx->hm_device[device_id].corespeed_get_supported |= hm_adapters_adl[platform_devices_id].corespeed_get_supported; hwmon_ctx->hm_device[device_id].fanspeed_get_supported |= hm_adapters_adl[platform_devices_id].fanspeed_get_supported; hwmon_ctx->hm_device[device_id].fanspeed_set_supported |= hm_adapters_adl[platform_devices_id].fanspeed_set_supported; hwmon_ctx->hm_device[device_id].fanpolicy_get_supported |= hm_adapters_adl[platform_devices_id].fanpolicy_get_supported; hwmon_ctx->hm_device[device_id].fanpolicy_set_supported |= hm_adapters_adl[platform_devices_id].fanpolicy_set_supported; hwmon_ctx->hm_device[device_id].memoryspeed_get_supported |= hm_adapters_adl[platform_devices_id].memoryspeed_get_supported; hwmon_ctx->hm_device[device_id].temperature_get_supported |= hm_adapters_adl[platform_devices_id].temperature_get_supported; hwmon_ctx->hm_device[device_id].threshold_shutdown_get_supported |= hm_adapters_adl[platform_devices_id].threshold_shutdown_get_supported; hwmon_ctx->hm_device[device_id].threshold_slowdown_get_supported |= hm_adapters_adl[platform_devices_id].threshold_slowdown_get_supported; hwmon_ctx->hm_device[device_id].throttle_get_supported |= hm_adapters_adl[platform_devices_id].throttle_get_supported; hwmon_ctx->hm_device[device_id].utilization_get_supported |= hm_adapters_adl[platform_devices_id].utilization_get_supported; } if (hwmon_ctx->hm_sysfs) { hwmon_ctx->hm_device[device_id].buslanes_get_supported |= hm_adapters_sysfs[platform_devices_id].buslanes_get_supported; hwmon_ctx->hm_device[device_id].corespeed_get_supported |= hm_adapters_sysfs[platform_devices_id].corespeed_get_supported; hwmon_ctx->hm_device[device_id].fanspeed_get_supported |= hm_adapters_sysfs[platform_devices_id].fanspeed_get_supported; hwmon_ctx->hm_device[device_id].fanspeed_set_supported |= hm_adapters_sysfs[platform_devices_id].fanspeed_set_supported; hwmon_ctx->hm_device[device_id].fanpolicy_get_supported |= hm_adapters_sysfs[platform_devices_id].fanpolicy_get_supported; hwmon_ctx->hm_device[device_id].fanpolicy_set_supported |= hm_adapters_sysfs[platform_devices_id].fanpolicy_set_supported; hwmon_ctx->hm_device[device_id].memoryspeed_get_supported |= hm_adapters_sysfs[platform_devices_id].memoryspeed_get_supported; hwmon_ctx->hm_device[device_id].temperature_get_supported |= hm_adapters_sysfs[platform_devices_id].temperature_get_supported; hwmon_ctx->hm_device[device_id].threshold_shutdown_get_supported |= hm_adapters_sysfs[platform_devices_id].threshold_shutdown_get_supported; hwmon_ctx->hm_device[device_id].threshold_slowdown_get_supported |= hm_adapters_sysfs[platform_devices_id].threshold_slowdown_get_supported; hwmon_ctx->hm_device[device_id].throttle_get_supported |= hm_adapters_sysfs[platform_devices_id].throttle_get_supported; hwmon_ctx->hm_device[device_id].utilization_get_supported |= hm_adapters_sysfs[platform_devices_id].utilization_get_supported; } } if (device_param->device_vendor_id == VENDOR_ID_NV) { hwmon_ctx->hm_device[device_id].adl = 0; hwmon_ctx->hm_device[device_id].sysfs = 0; hwmon_ctx->hm_device[device_id].nvapi = hm_adapters_nvapi[platform_devices_id].nvapi; hwmon_ctx->hm_device[device_id].nvml = hm_adapters_nvml[platform_devices_id].nvml; hwmon_ctx->hm_device[device_id].xnvctrl = hm_adapters_xnvctrl[platform_devices_id].xnvctrl; hwmon_ctx->hm_device[device_id].od_version = 0; if (hwmon_ctx->hm_nvml) { hwmon_ctx->hm_device[device_id].buslanes_get_supported |= hm_adapters_nvml[platform_devices_id].buslanes_get_supported; hwmon_ctx->hm_device[device_id].corespeed_get_supported |= hm_adapters_nvml[platform_devices_id].corespeed_get_supported; hwmon_ctx->hm_device[device_id].fanspeed_get_supported |= hm_adapters_nvml[platform_devices_id].fanspeed_get_supported; hwmon_ctx->hm_device[device_id].fanspeed_set_supported |= hm_adapters_nvml[platform_devices_id].fanspeed_set_supported; hwmon_ctx->hm_device[device_id].fanpolicy_get_supported |= hm_adapters_nvml[platform_devices_id].fanpolicy_get_supported; hwmon_ctx->hm_device[device_id].fanpolicy_set_supported |= hm_adapters_nvml[platform_devices_id].fanpolicy_set_supported; hwmon_ctx->hm_device[device_id].memoryspeed_get_supported |= hm_adapters_nvml[platform_devices_id].memoryspeed_get_supported; hwmon_ctx->hm_device[device_id].temperature_get_supported |= hm_adapters_nvml[platform_devices_id].temperature_get_supported; hwmon_ctx->hm_device[device_id].threshold_shutdown_get_supported |= hm_adapters_nvml[platform_devices_id].threshold_shutdown_get_supported; hwmon_ctx->hm_device[device_id].threshold_slowdown_get_supported |= hm_adapters_nvml[platform_devices_id].threshold_slowdown_get_supported; hwmon_ctx->hm_device[device_id].throttle_get_supported |= hm_adapters_nvml[platform_devices_id].throttle_get_supported; hwmon_ctx->hm_device[device_id].utilization_get_supported |= hm_adapters_nvml[platform_devices_id].utilization_get_supported; } if (hwmon_ctx->hm_nvapi) { hwmon_ctx->hm_device[device_id].buslanes_get_supported |= hm_adapters_nvapi[platform_devices_id].buslanes_get_supported; hwmon_ctx->hm_device[device_id].corespeed_get_supported |= hm_adapters_nvapi[platform_devices_id].corespeed_get_supported; hwmon_ctx->hm_device[device_id].fanspeed_get_supported |= hm_adapters_nvapi[platform_devices_id].fanspeed_get_supported; hwmon_ctx->hm_device[device_id].fanspeed_set_supported |= hm_adapters_nvapi[platform_devices_id].fanspeed_set_supported; hwmon_ctx->hm_device[device_id].fanpolicy_get_supported |= hm_adapters_nvapi[platform_devices_id].fanpolicy_get_supported; hwmon_ctx->hm_device[device_id].fanpolicy_set_supported |= hm_adapters_nvapi[platform_devices_id].fanpolicy_set_supported; hwmon_ctx->hm_device[device_id].memoryspeed_get_supported |= hm_adapters_nvapi[platform_devices_id].memoryspeed_get_supported; hwmon_ctx->hm_device[device_id].temperature_get_supported |= hm_adapters_nvapi[platform_devices_id].temperature_get_supported; hwmon_ctx->hm_device[device_id].threshold_shutdown_get_supported |= hm_adapters_nvapi[platform_devices_id].threshold_shutdown_get_supported; hwmon_ctx->hm_device[device_id].threshold_slowdown_get_supported |= hm_adapters_nvapi[platform_devices_id].threshold_slowdown_get_supported; hwmon_ctx->hm_device[device_id].throttle_get_supported |= hm_adapters_nvapi[platform_devices_id].throttle_get_supported; hwmon_ctx->hm_device[device_id].utilization_get_supported |= hm_adapters_nvapi[platform_devices_id].utilization_get_supported; } if (hwmon_ctx->hm_xnvctrl) { hwmon_ctx->hm_device[device_id].buslanes_get_supported |= hm_adapters_xnvctrl[platform_devices_id].buslanes_get_supported; hwmon_ctx->hm_device[device_id].corespeed_get_supported |= hm_adapters_xnvctrl[platform_devices_id].corespeed_get_supported; hwmon_ctx->hm_device[device_id].fanspeed_get_supported |= hm_adapters_xnvctrl[platform_devices_id].fanspeed_get_supported; hwmon_ctx->hm_device[device_id].fanspeed_set_supported |= hm_adapters_xnvctrl[platform_devices_id].fanspeed_set_supported; hwmon_ctx->hm_device[device_id].fanpolicy_get_supported |= hm_adapters_xnvctrl[platform_devices_id].fanpolicy_get_supported; hwmon_ctx->hm_device[device_id].fanpolicy_set_supported |= hm_adapters_xnvctrl[platform_devices_id].fanpolicy_set_supported; hwmon_ctx->hm_device[device_id].memoryspeed_get_supported |= hm_adapters_xnvctrl[platform_devices_id].memoryspeed_get_supported; hwmon_ctx->hm_device[device_id].temperature_get_supported |= hm_adapters_xnvctrl[platform_devices_id].temperature_get_supported; hwmon_ctx->hm_device[device_id].threshold_shutdown_get_supported |= hm_adapters_xnvctrl[platform_devices_id].threshold_shutdown_get_supported; hwmon_ctx->hm_device[device_id].threshold_slowdown_get_supported |= hm_adapters_xnvctrl[platform_devices_id].threshold_slowdown_get_supported; hwmon_ctx->hm_device[device_id].throttle_get_supported |= hm_adapters_xnvctrl[platform_devices_id].throttle_get_supported; hwmon_ctx->hm_device[device_id].utilization_get_supported |= hm_adapters_xnvctrl[platform_devices_id].utilization_get_supported; } } // by calling the different functions here this will disable them in case they will error out // this will also reduce the error itself printed to the user to a single print on startup hm_get_buslanes_with_device_id (hashcat_ctx, device_id); hm_get_corespeed_with_device_id (hashcat_ctx, device_id); hm_get_fanpolicy_with_device_id (hashcat_ctx, device_id); hm_get_fanspeed_with_device_id (hashcat_ctx, device_id); hm_get_memoryspeed_with_device_id (hashcat_ctx, device_id); hm_get_temperature_with_device_id (hashcat_ctx, device_id); hm_get_threshold_shutdown_with_device_id (hashcat_ctx, device_id); hm_get_threshold_slowdown_with_device_id (hashcat_ctx, device_id); hm_get_throttle_with_device_id (hashcat_ctx, device_id); hm_get_utilization_with_device_id (hashcat_ctx, device_id); } FREE_ADAPTERS; /** * powertune on user request */ if (user_options->powertune_enable == true) { for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; if ((opencl_ctx->devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) continue; if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_AMD) { if (hwmon_ctx->hm_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 hm_ADL_Overdrive_PowerControl_Set () here seems to fix the problem) * Driver / ADL bug? */ if (hwmon_ctx->hm_device[device_id].od_version == 6) { int ADL_rc; // check powertune capabilities first, if not available then skip device int powertune_supported = 0; ADL_rc = hm_ADL_Overdrive6_PowerControl_Caps (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, &powertune_supported); if (ADL_rc == ADL_ERR) { event_log_error (hashcat_ctx, "Failed to get ADL PowerControl capabilities."); return -1; } // first backup current value, we will restore it later if (powertune_supported != 0) { // powercontrol settings ADLOD6PowerControlInfo powertune = {0, 0, 0, 0, 0}; ADL_rc = hm_ADL_Overdrive_PowerControlInfo_Get (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, &powertune); if (ADL_rc == ADL_ERR) { event_log_error (hashcat_ctx, "Failed to get current ADL PowerControl values."); return -1; } ADL_rc = hm_ADL_Overdrive_PowerControl_Get (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, &hwmon_ctx->od_power_control_status[device_id]); if (ADL_rc == ADL_ERR) { event_log_error (hashcat_ctx, "Failed to get current ADL PowerControl values."); return -1; } ADL_rc = hm_ADL_Overdrive_PowerControl_Set (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, powertune.iMaxValue); if (ADL_rc == ADL_ERR) { event_log_error (hashcat_ctx, "Failed to set new ADL PowerControl values."); return -1; } // clocks memset (&hwmon_ctx->od_clock_mem_status[device_id], 0, sizeof (ADLOD6MemClockState)); hwmon_ctx->od_clock_mem_status[device_id].state.iNumberOfPerformanceLevels = 2; ADL_rc = hm_ADL_Overdrive_StateInfo_Get (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, ADL_OD6_GETSTATEINFO_CUSTOM_PERFORMANCE, &hwmon_ctx->od_clock_mem_status[device_id]); if (ADL_rc == ADL_ERR) { event_log_error (hashcat_ctx, "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}; ADL_rc = hm_ADL_Overdrive_Capabilities_Get (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, &caps); if (ADL_rc == ADL_ERR) { event_log_error (hashcat_ctx, "Failed to get ADL device capabilities."); return -1; } int engine_clock_max = (int) (0.6666f * caps.sEngineClockRange.iMax); int memory_clock_max = (int) (0.6250f * caps.sMemoryClockRange.iMax); int warning_trigger_engine = (int) (0.25f * engine_clock_max); int warning_trigger_memory = (int) (0.25f * memory_clock_max); int engine_clock_profile_max = hwmon_ctx->od_clock_mem_status[device_id].state.aLevels[1].iEngineClock; int memory_clock_profile_max = hwmon_ctx->od_clock_mem_status[device_id].state.aLevels[1].iMemoryClock; // warning if profile has too low max values if ((engine_clock_max - engine_clock_profile_max) > warning_trigger_engine) { event_log_error (hashcat_ctx, "Custom profile has low maximum engine clock value. Expect reduced performance."); } if ((memory_clock_max - memory_clock_profile_max) > warning_trigger_memory) { event_log_error (hashcat_ctx, "Custom profile has low maximum memory clock value. Expect reduced performance."); } ADLOD6StateInfo *performance_state = (ADLOD6StateInfo*) hccalloc (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; ADL_rc = hm_ADL_Overdrive_State_Set (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, ADL_OD6_SETSTATE_PERFORMANCE, performance_state); if (ADL_rc == ADL_ERR) { event_log_error (hashcat_ctx, "Failed to set ADL performance state."); return -1; } hcfree (performance_state); } // set powertune value only if (powertune_supported != 0) { // powertune set ADLOD6PowerControlInfo powertune = {0, 0, 0, 0, 0}; ADL_rc = hm_ADL_Overdrive_PowerControlInfo_Get (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, &powertune); if (ADL_rc == ADL_ERR) { event_log_error (hashcat_ctx, "Failed to get current ADL PowerControl settings."); return -1; } ADL_rc = hm_ADL_Overdrive_PowerControl_Set (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, powertune.iMaxValue); if (ADL_rc == ADL_ERR) { event_log_error (hashcat_ctx, "Failed to set new ADL PowerControl values."); return -1; } } } } if (hwmon_ctx->hm_sysfs) { hm_SYSFS_set_power_dpm_force_performance_level (hashcat_ctx, device_id, "high"); } } if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_NV) { // first backup current value, we will restore it later unsigned int limit; bool powertune_supported = false; if (hm_NVML_nvmlDeviceGetPowerManagementLimit (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvml, &limit) == NVML_SUCCESS) { powertune_supported = true; } // if backup worked, activate the maximum allowed if (powertune_supported == true) { unsigned int minLimit; unsigned int maxLimit; if (hm_NVML_nvmlDeviceGetPowerManagementLimitConstraints (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvml, &minLimit, &maxLimit) == NVML_SUCCESS) { if (maxLimit > 0) { if (hm_NVML_nvmlDeviceSetPowerManagementLimit (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvml, maxLimit) == NVML_SUCCESS) { // now we can be sure we need to reset later hwmon_ctx->nvml_power_limit[device_id] = limit; } } } } } } } /** * Store initial fanspeed if gpu_temp_retain is enabled */ if (user_options->gpu_temp_retain > 0) { bool one_success = false; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; if ((opencl_ctx->devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) continue; if (hwmon_ctx->hm_device[device_id].fanspeed_get_supported == false) continue; if (hwmon_ctx->hm_device[device_id].fanspeed_set_supported == false) continue; const int fanspeed = hm_get_fanspeed_with_device_id (hashcat_ctx, device_id); if (fanspeed == -1) continue; if (device_param->device_vendor_id == VENDOR_ID_AMD) { if (hwmon_ctx->hm_adl) { hm_set_fanspeed_with_device_id_adl (hashcat_ctx, device_id, fanspeed, 1); } if (hwmon_ctx->hm_sysfs) { hm_set_fanctrl_with_device_id_sysfs (hashcat_ctx, device_id, 1); hm_set_fanspeed_with_device_id_sysfs (hashcat_ctx, device_id, fanspeed); } } else if (device_param->device_vendor_id == VENDOR_ID_NV) { if (hwmon_ctx->hm_xnvctrl) { hm_set_fanctrl_with_device_id_xnvctrl (hashcat_ctx, device_id, NV_CTRL_GPU_COOLER_MANUAL_CONTROL_TRUE); hm_set_fanspeed_with_device_id_xnvctrl (hashcat_ctx, device_id, fanspeed); } if (hwmon_ctx->hm_nvapi) { hm_set_fanspeed_with_device_id_nvapi (hashcat_ctx, device_id, fanspeed, 1); } } if ((hwmon_ctx->hm_device[device_id].fanpolicy_set_supported == true) && (hwmon_ctx->hm_device[device_id].fanspeed_set_supported == true)) one_success = true; } if (one_success == false) user_options->gpu_temp_retain = 0; } return 0; } void hwmon_ctx_destroy (hashcat_ctx_t *hashcat_ctx) { hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; user_options_t *user_options = hashcat_ctx->user_options; if (hwmon_ctx->enabled == false) return; // reset default fan speed if (user_options->gpu_temp_retain > 0) { for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; if ((opencl_ctx->devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) continue; if (hwmon_ctx->hm_device[device_id].fanspeed_get_supported == false) continue; if (hwmon_ctx->hm_device[device_id].fanspeed_set_supported == false) continue; int rc = -1; if (device_param->device_vendor_id == VENDOR_ID_AMD) { if (hwmon_ctx->hm_adl) { rc = hm_set_fanspeed_with_device_id_adl (hashcat_ctx, device_id, 100, 0); } if (hwmon_ctx->hm_sysfs) { rc = hm_set_fanctrl_with_device_id_sysfs (hashcat_ctx, device_id, 2); } } else if (device_param->device_vendor_id == VENDOR_ID_NV) { if (hwmon_ctx->hm_xnvctrl) { rc = hm_set_fanctrl_with_device_id_xnvctrl (hashcat_ctx, device_id, NV_CTRL_GPU_COOLER_MANUAL_CONTROL_FALSE); } if (hwmon_ctx->hm_nvapi) { rc = hm_set_fanspeed_with_device_id_nvapi (hashcat_ctx, device_id, 100, 0); } } if (rc == -1) event_log_error (hashcat_ctx, "Failed to restore default fan speed and policy for device #%u", device_id + 1); } } // reset power tuning if (user_options->powertune_enable == true) { for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; if ((opencl_ctx->devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) continue; if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_AMD) { if (hwmon_ctx->hm_adl) { if (hwmon_ctx->hm_device[device_id].od_version == 6) { // check powertune capabilities first, if not available then skip device int powertune_supported = 0; if ((hm_ADL_Overdrive6_PowerControl_Caps (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, &powertune_supported)) == -1) { //event_log_error (hashcat_ctx, "Failed to get ADL PowerControl capabilities."); continue; } if (powertune_supported != 0) { // powercontrol settings if ((hm_ADL_Overdrive_PowerControl_Set (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, hwmon_ctx->od_power_control_status[device_id])) == -1) { //event_log_error (hashcat_ctx, "Failed to restore the ADL PowerControl values."); continue; } // clocks ADLOD6StateInfo *performance_state = (ADLOD6StateInfo*) hccalloc (1, sizeof (ADLOD6StateInfo) + sizeof (ADLOD6PerformanceLevel)); performance_state->iNumberOfPerformanceLevels = 2; performance_state->aLevels[0].iEngineClock = hwmon_ctx->od_clock_mem_status[device_id].state.aLevels[0].iEngineClock; performance_state->aLevels[1].iEngineClock = hwmon_ctx->od_clock_mem_status[device_id].state.aLevels[1].iEngineClock; performance_state->aLevels[0].iMemoryClock = hwmon_ctx->od_clock_mem_status[device_id].state.aLevels[0].iMemoryClock; performance_state->aLevels[1].iMemoryClock = hwmon_ctx->od_clock_mem_status[device_id].state.aLevels[1].iMemoryClock; if ((hm_ADL_Overdrive_State_Set (hashcat_ctx, hwmon_ctx->hm_device[device_id].adl, ADL_OD6_SETSTATE_PERFORMANCE, performance_state)) == -1) { //event_log_error (hashcat_ctx, "Failed to restore ADL performance state."); continue; } hcfree (performance_state); } } } if (hwmon_ctx->hm_sysfs) { hm_SYSFS_set_power_dpm_force_performance_level (hashcat_ctx, device_id, "auto"); } } if (opencl_ctx->devices_param[device_id].device_vendor_id == VENDOR_ID_NV) { unsigned int power_limit = hwmon_ctx->nvml_power_limit[device_id]; if (power_limit > 0) { hm_NVML_nvmlDeviceSetPowerManagementLimit (hashcat_ctx, hwmon_ctx->hm_device[device_id].nvml, power_limit); } } } } // unload shared libraries if (hwmon_ctx->hm_nvml) { hm_NVML_nvmlShutdown (hashcat_ctx); nvml_close (hashcat_ctx); } if (hwmon_ctx->hm_nvapi) { hm_NvAPI_Unload (hashcat_ctx); nvapi_close (hashcat_ctx); } if (hwmon_ctx->hm_xnvctrl) { hm_XNVCTRL_XCloseDisplay (hashcat_ctx); xnvctrl_close (hashcat_ctx); } if (hwmon_ctx->hm_adl) { hm_ADL_Main_Control_Destroy (hashcat_ctx); adl_close (hashcat_ctx); } if (hwmon_ctx->hm_sysfs) { sysfs_close (hashcat_ctx); } // free memory hcfree (hwmon_ctx->nvml_power_limit); hcfree (hwmon_ctx->od_power_control_status); hcfree (hwmon_ctx->od_clock_mem_status); hcfree (hwmon_ctx->hm_device); memset (hwmon_ctx, 0, sizeof (hwmon_ctx_t)); } hashcat-4.0.1/src/induct.c000066400000000000000000000074321320027462700153610ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "folder.h" #include "shared.h" #include "induct.h" static int sort_by_mtime (const void *p1, const void *p2) { const char **f1 = (const char **) p1; const char **f2 = (const char **) p2; hc_stat_t s1; hc_stat_t s2; const int rc1 = hc_stat (*f1, &s1); const int rc2 = hc_stat (*f2, &s2); if (rc1 < rc2) return 1; if (rc1 > rc2) return -1; return s2.st_mtime - s1.st_mtime; } int induct_ctx_init (hashcat_ctx_t *hashcat_ctx) { folder_config_t *folder_config = hashcat_ctx->folder_config; induct_ctx_t *induct_ctx = hashcat_ctx->induct_ctx; user_options_t *user_options = hashcat_ctx->user_options; induct_ctx->enabled = false; if (user_options->benchmark == true) return 0; if (user_options->example_hashes == true) return 0; if (user_options->keyspace == true) return 0; if (user_options->left == true) return 0; if (user_options->opencl_info == true) return 0; if (user_options->show == true) return 0; if (user_options->stdout_flag == true) return 0; if (user_options->speed_only == true) return 0; if (user_options->progress_only == true) return 0; if (user_options->usage == true) return 0; if (user_options->version == true) return 0; if (user_options->attack_mode == ATTACK_MODE_BF) return 0; if (user_options->attack_mode == ATTACK_MODE_COMBI) return 0; induct_ctx->enabled = true; if (user_options->induction_dir == NULL) { char *root_directory; hc_asprintf (&root_directory, "%s/%s.%s", folder_config->session_dir, user_options->session, INDUCT_DIR); if (rmdir (root_directory) == -1) { if (errno == ENOENT) { // good, we can ignore } else if (errno == ENOTEMPTY) { char *root_directory_mv; hc_asprintf (&root_directory_mv, "%s/%s.induct.%d", folder_config->session_dir, user_options->session, (int) hc_time (NULL)); if (rename (root_directory, root_directory_mv) != 0) { event_log_error (hashcat_ctx, "Rename directory %s to %s: %s", root_directory, root_directory_mv, strerror (errno)); return -1; } hcfree (root_directory_mv); } else { event_log_error (hashcat_ctx, "%s: %s", root_directory, strerror (errno)); return -1; } } if (hc_mkdir (root_directory, 0700) == -1) { event_log_error (hashcat_ctx, "%s: %s", root_directory, strerror (errno)); return -1; } induct_ctx->root_directory = root_directory; } else { induct_ctx->root_directory = hcstrdup (user_options->induction_dir); } return 0; } void induct_ctx_scan (hashcat_ctx_t *hashcat_ctx) { induct_ctx_t *induct_ctx = hashcat_ctx->induct_ctx; if (induct_ctx->enabled == false) return; induct_ctx->induction_dictionaries = scan_directory (induct_ctx->root_directory); induct_ctx->induction_dictionaries_cnt = count_dictionaries (induct_ctx->induction_dictionaries); qsort (induct_ctx->induction_dictionaries, (size_t) induct_ctx->induction_dictionaries_cnt, sizeof (char *), sort_by_mtime); } void induct_ctx_destroy (hashcat_ctx_t *hashcat_ctx) { induct_ctx_t *induct_ctx = hashcat_ctx->induct_ctx; if (induct_ctx->enabled == false) return; if (rmdir (induct_ctx->root_directory) == -1) { if (errno == ENOENT) { // good, we can ignore } else if (errno == ENOTEMPTY) { // good, we can ignore } else { event_log_error (hashcat_ctx, "%s: %s", induct_ctx->root_directory, strerror (errno)); //return -1; } } hcfree (induct_ctx->root_directory); memset (induct_ctx, 0, sizeof (induct_ctx_t)); } hashcat-4.0.1/src/interface.c000066400000000000000000036001271320027462700160360ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "bitops.h" #include "memory.h" #include "convert.h" #include "event.h" #include "inc_hash_constants.h" #include "cpu_aes.h" #include "cpu_crc32.h" #include "cpu_des.h" #include "cpu_md4.h" #include "cpu_md5.h" #include "cpu_sha1.h" #include "cpu_sha256.h" #include "cpu_blake2.h" #include "shared.h" #include "opencl.h" #include "interface.h" #include "ext_lzma.h" static char ST_PASS_HASHCAT_PLAIN[] = "hashcat"; static char ST_PASS_HASHCAT_EXCL[] = "hashcat!"; static char ST_PASS_HASHCAT_EXCL3[] = "hashcat!!!"; static char ST_PASS_HASHCAT_ONE[] = "hashcat1"; static char ST_PASS_HASHCAT_ONET3[] = "hashcat1hashcat1hashcat1"; static char ST_PASS_HEX_02501[] = "d57c2900bd83d5098003bf803ad7e204260a84ac164f12e03552d92280a6943e"; static char ST_PASS_BIN_09710[] = "\x91\xb2\xe0\x62\xb9"; static char ST_PASS_BIN_09810[] = "\xb8\xf6\x36\x19\xca"; static char ST_PASS_BIN_10410[] = "\x6a\x8a\xed\xcc\xb7"; /** * Missing self-test hashes: * * ST_HASH_01500 the self-test can't work because the salt is part of the code at compile-time * ST_HASH_1374x missing example hash * ST_HASH_1376x missing example hash * ST_HASH_14600 multi-hash-mode algorithm, unlikely to match self-test hash settings */ static char ST_HASH_00000[] = "8743b52063cd84097a65d1633f5c74f5"; static char ST_HASH_00010[] = "3d83c8e717ff0e7ecfe187f088d69954:343141"; static char ST_HASH_00011[] = "8368ba576d44779d4ca110c234fbfd32:22868223712338656660744185004422"; static char ST_HASH_00012[] = "93a8cf6a7d43e3b5bcd2dc6abb3e02c6:27032153220030464358344758762807"; static char ST_HASH_00020[] = "57ab8499d08c59a7211c77f557bf9425:4247"; static char ST_HASH_00021[] = "e983672a03adcc9767b24584338eb378:00"; static char ST_HASH_00022[] = "nKjiFErqK7TPcZdFZsZMNWPtw4Pv8n:26506173"; static char ST_HASH_00023[] = "d04d74780881019341915c70d914db29:0675841"; static char ST_HASH_00030[] = "1169500a7dfece72e1f7fc9c9410867a:687430237020"; static char ST_HASH_00040[] = "23a8a90599fc5d0d15265d4d3b565f6e:58802707"; static char ST_HASH_00050[] = "e28e4e37e972a945e464b5226053bac0:40"; static char ST_HASH_00060[] = "7f51edecfa6fb401a0b5e63d33fc8c0e:84143"; static char ST_HASH_00100[] = "b89eaac7e61417341b710b727768294d0e6a277b"; static char ST_HASH_00101[] = "{SHA}uJ6qx+YUFzQbcQtyd2gpTQ5qJ3s="; static char ST_HASH_00110[] = "848952984db93bdd2d0151d4ecca6ea44fcf49e3:30007548152"; static char ST_HASH_00111[] = "{SSHA}FLzWcQqyle6Mo7NvrwXCMAmRzXQxNjYxMTYzNw=="; static char ST_HASH_00112[] = "63ec5f6113843f5d229e2d49c068d983a9670d02:57677783202322766743"; static char ST_HASH_00120[] = "a428863972744b16afef28e0087fc094b44bb7b1:465727565"; static char ST_HASH_00121[] = "d27c0a627a45db487af161fcc3a4005d88eb8a1f:25551135"; static char ST_HASH_00122[] = "86586886b8bd3c379d2e176243a7225e6aae969d293fe9a9"; static char ST_HASH_00124[] = "sha1$fe76b$02d5916550edf7fc8c886f044887f4b1abf9b013"; static char ST_HASH_00125[] = "83377286015bcebb857b23b94331e2b316b6ecbe9fbf26c4fc"; static char ST_HASH_00130[] = "0a9e4591f539a77cd3af67bae207d250bc86bac6:23240710432"; static char ST_HASH_00131[] = "0x0100778883860000000000000000000000000000000000000000eda3604e067a06f2732b05b9cb90b8a710996939"; static char ST_HASH_00132[] = "0x010045083578bf13a6e30ca29c40e540813772754d54a5ffd325"; static char ST_HASH_00133[] = "uXmFVrdBvv293L9kDR3VnRmx4ZM="; static char ST_HASH_00140[] = "03b83421e2aa6d872d1f8dee001dc226ef01722b:818436"; static char ST_HASH_00141[] = "$episerver$*0*MjEwNA==*ZUgAmuaYTqAvisD0A427FA3oaWU"; static char ST_HASH_00150[] = "02b256705348a28b1d6c0f063907979f7e0c82f8:10323"; static char ST_HASH_00160[] = "8d7cb4d4a27a438059bb83a34d1e6cc439669168:2134817"; static char ST_HASH_00200[] = "7196759210defdc0"; static char ST_HASH_00300[] = "fcf7c1b8749cf99d88e5f34271d636178fb5d130"; static char ST_HASH_00400[] = "$P$946647711V1klyitUYhtB8Yw5DMA/w."; static char ST_HASH_00500[] = "$1$38652870$DUjsu4TTlTsOe/xxZ05uf/"; static char ST_HASH_00501[] = "3u+UR6n8AgABAAAAHxxdXKmiOmUoqKnZlf8lTOhlPYy93EAkbPfs5+49YLFd/B1+omSKbW7DoqNM40/EeVnwJ8kYoXv9zy9D5C5m5A=="; static char ST_HASH_00600[] = "$BLAKE2$296c269e70ac5f0095e6fb47693480f0f7b97ccd0307f5c3bfa4df8f5ca5c9308a0e7108e80a0a9c0ebb715e8b7109b072046c6cd5e155b4cfd2f27216283b1e"; static char ST_HASH_00900[] = "afe04867ec7a3845145579a95f72eca7"; static char ST_HASH_01000[] = "b4b9b02e6f09a9bd760f388b67351e2b"; static char ST_HASH_01100[] = "c896b3c6963e03c86ade3a38370bbb09:54161084332"; static char ST_HASH_01300[] = "e4fa1555ad877bf0ec455483371867200eee89550a93eff2f95a6198"; static char ST_HASH_01400[] = "127e6fbfe24a750e72930c220a8e138275656b8e5d8f48a98c3c92df2caba935"; static char ST_HASH_01410[] = "5bb7456f43e3610363f68ad6de82b8b96f3fc9ad24e9d1f1f8d8bd89638db7c0:12480864321"; static char ST_HASH_01411[] = "{SSHA256}L5Wk0zPY2lmoR5pH20zngq37KkxFwgTquEhx95rxfVk3Ng=="; static char ST_HASH_01420[] = "816d1ded1d621873595048912ea3405d9d42afd3b57665d9f5a2db4d89720854:36176620"; static char ST_HASH_01421[] = "8fe7ca27a17adc337cd892b1d959b4e487b8f0ef09e32214f44fb1b07e461c532e9ec3"; static char ST_HASH_01430[] = "b2d0db162e30dfef1bfd606689a3acbc213c47ef3fd11968394191886075249d:32002"; static char ST_HASH_01440[] = "84ebe1bc3d59919a8c4f9337d66bd163661586c828b24b8067a27a6dc4228c64:05662"; static char ST_HASH_01441[] = "$episerver$*1*NDg1NTIz*8BFCg/YJBAuZs/wjbH3OWKe69BLr5Lao26ybpnD48Zk"; static char ST_HASH_01450[] = "b435ffbacea34d5eb0dbc4d69a92f0152f2cf4cd364d34c2ece322ca22d8b334:21217"; static char ST_HASH_01460[] = "8b9472281c36c3a693703de0e0f1ffab8fc0ecdd3bc5ead04c76dd74ef431e49:70108387805"; //static char ST_HASH_01500[] = "8133vc.5rieNk"; static char ST_HASH_01600[] = "$apr1$62722340$zGjeAwVP2KwY6MtumUI1N/"; static char ST_HASH_01700[] = "82a9dda829eb7f8ffe9fbe49e45d47d2dad9664fbb7adf72492e3c81ebd3e29134d9bc12212bf83c6840f10e8246b9db54a4859b7ccd0123d86e5872c1e5082f"; static char ST_HASH_01710[] = "3f749c84d00c6f94a6651b5c195c71dacae08f3cea6fed760232856cef701f7bf60d7f38a587f69f159d4e4cbe00435aeb9c8c0a4927b252d76a744e16e87e91:388026522082"; static char ST_HASH_01711[] = "{SSHA512}Bz8w5q6qEtB1Nnc8b1jfTvTXVTwohWag33oghQGOtLChnkZTw/cuJaHQlLJEI3AWKZGCRyLA6Phujdxo+is7AjA2MDcyNjY1Mg=="; static char ST_HASH_01720[] = "efc5dd0e4145970917abdc311e1d4e23ba0afa9426d960cb28569f4d585cb031af5c936f57fbcb0a08368a1b302573cf582100d40bd7c632f3d8aecd1a1a8eb1:812"; static char ST_HASH_01730[] = "eefb67342d62a5d8ac84e8ae89d0f157f03749bd0427c80637003a4760feefdb36cbe11ba35ab2015b3691e2e83803178c986aa85f29e6f56938b469a31ccd7a:6576666"; static char ST_HASH_01740[] = "ce77bf8a8ca9b9cf0ed67edde58ed7fafd4542ce1378fc8bd87b05656ebf92e5711517d5930c18de93a71990e77e1037423e5b64c2f293be7d859d7b6921622e:1512373"; static char ST_HASH_01722[] = "07543781b07e905f6f947db8ae305c248b9e12f509b41097e852e2f450e824790e677ea7397b8a9a552b1c19ecf6a6e1dd3844fa5ee5db23976962859676f7d2fb85ca94"; static char ST_HASH_01731[] = "0x02003788006711b2e74e7d8cb4be96b1d187c962c5591a02d5a6ae81b3a4a094b26b7877958b26733e45016d929a756ed30d0a5ee65d3ce1970f9b7bf946e705c595f07625b1"; static char ST_HASH_01750[] = "138c00f17a1a0363f274817c91118f019aff09f937bfdaea844280a0c0e7811267cc4735d967d8640eed1218268c1c4a76fec8f7aa551491b353829f3a654270:885142"; static char ST_HASH_01760[] = "7d02921299935179d509e6dd4f3d0f2944e3451ea9de3af16baead6a7297e5653577d2473a0fff743d9fe78a89bd49296114319989dc7e7870fc7f62bc96accb:114"; static char ST_HASH_01800[] = "$6$72820166$U4DVzpcYxgw7MVVDGGvB2/H5lRistD5.Ah4upwENR5UtffLR4X4SxSzfREv8z6wVl0jRFX40/KnYVvK4829kD1"; static char ST_HASH_02100[] = "$DCC2$10240#6848#e2829c8af2232fa53797e2f0e35e4626"; static char ST_HASH_02400[] = "dRRVnUmUHXOTt9nk"; static char ST_HASH_02500[] = "4843505804000000000235380000000000000000000000000000000000000000000000000000000000000151aecc428f182acefbd1a9e62d369a079265784da83ba4cf88375c44c830e6e5aa5d6faf352aa496a9ee129fb8292f7435df5420b823a1cd402aed449cced04f552c5b5acfebf06ae96a09c96d9a01c443a17aa62258c4f651a68aa67b0001030077fe010900200000000000000001a4cf88375c44c830e6e5aa5d6faf352aa496a9ee129fb8292f7435df5420b8230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018dd160050f20101000050f20201000050f20201000050f20200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; static char ST_HASH_02501[] = "48435058040000000013303638353333303430353632363637323238330000000000000000000000000002aa8c03531d05376358e25a5248ba2b45e2a2c5d4cf88d71258a797ac501653bbbb4512d8f1ab32584641df9e40e098c5df48acc3baa9ba60ea99968f9377d8a596d33fd762366677b37683fc00693899edc9569c284cbe15c570f56379000103007501010a00000000000000000001d71258a797ac501653bbbb4512d8f1ab32584641df9e40e098c5df48acc3baa9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001630140100000fac040100000fac040100000fac020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; static char ST_HASH_02410[] = "YjDBNr.A0AN7DA8s:4684"; static char ST_HASH_02600[] = "a936af92b0ae20b1ff6c3347a72e5fbe"; static char ST_HASH_02611[] = "28f9975808ae2bdc5847b1cda26033ea:308"; static char ST_HASH_02612[] = "$PHPS$30353031383437363132$f02b0b2f25e5754edb04522c346ba243"; static char ST_HASH_02711[] = "0844fbb2fdeda31884a7a45ec2010bb6:324410183853308365427804872426"; static char ST_HASH_02811[] = "022f7e02b3314f7d0968f73c00ba759f:67588"; static char ST_HASH_03000[] = "299bd128c1101fd6"; static char ST_HASH_03100[] = "792FCB0AE31D8489:7284616727"; static char ST_HASH_03200[] = "$2a$05$MBCzKhG1KhezLh.0LRa0Kuw12nLJtpHy6DIaU.JAnqJUDYspHC.Ou"; static char ST_HASH_03710[] = "a3aa0ae2b4a102a9974cdf40edeabee0:242812778074"; static char ST_HASH_03711[] = "$B$2152187716$8c8b39c3602b194eeeb6cac78eea2742"; static char ST_HASH_03800[] = "78274b1105fb8a7c415b43ffe35ec4a9:6"; static char ST_HASH_03910[] = "d8281daba5da597503d12fe31808b4a7:283053"; static char ST_HASH_04010[] = "82422514daaa8253be0aa43f3e263af5:7530326651137"; static char ST_HASH_04110[] = "45b1005214e2d9472a7ad681578b2438:64268771004"; static char ST_HASH_04300[] = "b8c385461bb9f9d733d3af832cf60b27"; static char ST_HASH_04400[] = "288496df99b33f8f75a7ce4837d1b480"; static char ST_HASH_04500[] = "3db9184f5da4e463832b086211af8d2314919951"; static char ST_HASH_04520[] = "59b80a295392eedb677ca377ad7bf3487928df96:136472340404074825440760227553028141804855170538"; static char ST_HASH_04521[] = "c18e826af2a78c7b9b7261452613233417e65817:28246535720688452723483475753333"; static char ST_HASH_04522[] = "9038129c474caa3f0de56f38db84033d0fe1d4b8:365563602032"; static char ST_HASH_04700[] = "92d85978d884eb1d99a51652b1139c8279fa8663"; static char ST_HASH_04800[] = "aa4aaa1d52319525023c06a4873f4c51:35343534373533343633383832343736:dc"; static char ST_HASH_04900[] = "75d280ca9a0c2ee18729603104ead576d9ca6285:347070"; static char ST_HASH_05000[] = "203f88777f18bb4ee1226627b547808f38d90d3e106262b5de9ca943b57137b6"; static char ST_HASH_05100[] = "8743b52063cd8409"; static char ST_HASH_05200[] = "50575333e4e2a590a5e5c8269f57ec04a8a1c0c03da55b311c51236dab8c6b96b0afca02000800005eaeee20c6cc10d5caa6522b3ca545c41d9133d630ca08f467b7aae8a2bbef51aa2df968d10b9c4cfb17a182c0add7acb8c153794f51337e12f472f451d10e6dcac664ed760606aabdbb6b794a80d6ce2a330100c76de0ff961a45cca21576b893d826c52f272b97cdf48aca6fbe6c74b039f81c61b7d632fb6fddd9f96162ab1effd69a4598a331e855e38792e5365272d4791bf991d248e1585a9ad20ea3d77b5d2ef9a711ef90a70ec6991cb578f1b8bdaa9efa7b0039e9ea96f777491713047bdd99fa1d78f06f23406a66046b387d3034e46b1f84129bba853cc18fa49f107dc0290547258d30566a4b1b363ff4c1c16cb2f5f400059833d4b651bfa508200cbdc7a75fc57ef90eb1d90b0deea8505753332d454f46505753332d454f466236710e2e2477878e738b60d0aa2834a96b01e97764fe980243a06ad16939d1"; static char ST_HASH_05300[] = "50503326cac6e4bd892b8257805b5a59a285f464ad3f63dc01bd0335f8341ef52e00be0b8cb205422a3788f021e4e6e8ccbe34784bc85abe42f62545bac64888426a2f1264fa28cf384ff00b14cfa5eff562dda4fad2a31fd7a6715218cff959916deed856feea5bee2e773241c5fbebf202958f0ce0c432955e0f1f6d1259da:688a7bfa8d5819630a970ed6d27018021a15fbb3e2fdcc36ce9b563d8ff95f510c4b3236c014d1cde9c2f1a999b121bc3ab1bc8049c8ac1e8c167a84f53c867492723eb01ab4b38074b38f4297d6fea8f44e01ea828fce33c433430938b1551f60673ce8088e7d2f41e3b49315344046fefee1e3860064331417562761db3ba4:c66606d691eaade4:8bdc88a2cdb4a1cf:c3b13137fae9f66684d98709939e5c3454ee31a98c80a1c76427d805b5dea866eff045515e8fb42dd259b9448caba9d937f4b3b75ec1b092a92232b4c8c1e70a60a52076e907f887b731d0f66e19e09b535238169c74c04a4b393f9b815c54eef4558cd8a22c9018bb4f24ee6db0e32979f9a353361cdba948f9027551ee40b1c96ba81c28aa3e1a0fac105dc469efa83f6d3ee281b945c6fa8b4677bac26dda:53f757c5b08afad6:aa02d9289e1702e5d7ed1e4ebf35ab31c2688e00:aab8580015cf545ac0b7291d15a4f2c79e06defd:944a0df3939f3bd281c9d05fbc0e3d30"; static char ST_HASH_05400[] = "266b43c54636c062b6696b71f24b30999c98bd4c3ba57e2de56a7ae50bb17ebcbca1abcd33e9ad466d4df6e6f2a407600f0c5a983f79d493b0a3694080a81143d4bac7a8b7b008ae5364a04688b3cfae44824885ca96ade1e395936567ecad519b502c3a786c72847f79c67b777feb8ba4f747303eb985709e92b3a5634f6513:60f861c6209c9c996ac0dcb49d6f6809faaaf0e8eb8041fe603a918170a801e94ab8ab10c5906d850f4282c0668029fa69dbc8576f7d86633dc2b21f0d79aa06342b02a4d2732841cd3266b84a7eb49ac489b307ba55562a17741142bac7712025f0a8cad59b11f19d9b756ce998176fd6b063df556957b257b3645549a138c2:f4dd079ed2b60e77:f1f8da1f38f76923:fd862602549f6949b33870f186d96cb8926a19d78442c02af823460740be719eba41a79388aeefb072e1ec7cb46b2f0b72e21fb30bd3a6568d2b041af7f9dc0c9cce27ed577e5aabb9ab6c405f1c4b189adbee8c9fb6abf4788b63a3ae05a02c192187b9d7246efe5e46db9b01bf8f4be05f7599ae52bf137743e41d90dceb85bd6ae07397dcc168bbc904adfebb08e6bc67e653edeee97a7e4ab9dab5e63fec:56e3f0d49ea70514:e754055008febe970053d795d26bfe609f42eda8:0c3283efd6396e7a2ecb008e1933fccb694a4ac0:8f79167724f4bdb2d76ee5d5e502b665e3445ea6"; static char ST_HASH_05500[] = "::5V4T:ada06359242920a500000000000000000000000000000000:0556d5297b5daa70eaffde82ef99293a3f3bb59b7c9704ea:9c23f6c094853920"; static char ST_HASH_05600[] = "0UL5G37JOI0SX::6VB1IS0KA74:ebe1afa18b7fbfa6:aab8bf8675658dd2a939458a1077ba08:010100000000000031c8aa092510945398b9f7b7dde1a9fb00000000f7876f2b04b700"; static char ST_HASH_05700[] = "2btjjy78REtmYkkW0csHUbJZOstRXoWdX1mGrmmfeHI"; static char ST_HASH_05800[] = "3edde1eb9e6679ccbc1ff3c417e8a475a2d2e279:7724368582277760"; static char ST_HASH_06000[] = "012cb9b334ec1aeb71a9c8ce85586082467f7eb6"; static char ST_HASH_06100[] = "7ca8eaaaa15eaa4c038b4c47b9313e92da827c06940e69947f85bc0fbef3eb8fd254da220ad9e208b6b28f6bb9be31dd760f1fdb26112d83f87d96b416a4d258"; static char ST_HASH_06211[] = "87914967f14737a67fb460f27b8aeb81de2b41bf2740b3dd78784e02763951daa47c7ca235e75c22ec8d959d6b67f7eedefad61e6a0d038079d3721a8e7215e415671e8c7b3dbed6453a114e6db89a52be9a9c1698a9c698f1e37f80d7afaf0efba82b6e5f5df32bd289b95343c6775e2c7f025ef1d8bfae84042a92546e15b635b5fade3aef6ee52a7a5ab018d33ea98bc115dfc62af606187fbab8cbda6e8417402c722ca8c2b07e6ca6a33bf94b2ce2a819a9f8cfaa5af70e3af6e5350d3a306f036f13ff5ba97d5728d5f6413b482c74f528211ae77b6c169215c5487d5a3ce23736b16996b86c71b12d120df28ef322f5143d9a258d0ae7aaa8c193a6dcb5bf18e3c57b5474d24b843f8dd4e83a74109396ddb4f0c50d3657a7eacc8828568e51202de48cd2dfe5acbe3d8840ade1ce44b716d5c0008f2b21b9981353cb12b8af2592a5ab744ae83623349f551acf371c81f86d17a8422654989f078179b2386e2aa8375853a1802cd8bc5d41ce45795f78b80e69fcfa3d14cf9127c3a33fa2dc76ad73960fb7bce15dd489e0b6eca7beed3733887cd5e6f3939a015d4d449185060b2f3bbad46e46d417b8f0830e91edd5ebc17cd5a99316792a36afd83fa1edc55da25518c8e7ff61e201976fa2c5fc9969e05cbee0dce7a0ef876b7340bbe8937c9d9c8248f0e0eae705fe7e1d2da48902f4f3e27d2cf532b7021e18"; static char ST_HASH_06212[] = "d6e1644acd373e6fdb8ccaaeab0c400d22eaa0b02e2a6649e065ad50f91e2f81fc5e1600d1cdf3b4ee72a7326a9a28d336ec65adf2d54661e1a609dd9941279fd64a9c513dfb0192734fc1e1014cdd0a399e89a0860c4077463c18609f5218254edd998adb11a02271723d1aa094550df385dd8e080cb42ed1349f69c0a6bad4b37e6dab1effbe0095471a8d640679422fe1533a21f10cb6d15e5ee8cde78e677acf3d09d008e9fbf57f09c1c57f19e51ff54631e0e2adc2ee2832425c1ec718d96a17df7e55aceffb7b23a1872f32795d4491c739e21b01e19a1b7dfcb22709c9d9302154462664a668ea635664df65804bf680ff07026d6f5b225762a3a270df832d47e7feb6277a228454a3ba9b5bbade23ecaec0eaf31ad1dbac31754c970a212bd44c9278bc6076f096a2eed602e04a70c6f7fa94ef4e75299692e5dcc6f1a7e6032b9b765e9e61faeed3f9efacc0a15b1817e74d48ec11a13d15811c7e2c4d12f36d35a04131d02f14184fc15bc20e79115dc7c980b681a19a225964469787df481b68a8f722f2bd3115dbbcb3c8ac1b07d742f78f30635dea29dfb1db83e89fc85a30b0379fc8aa69a4ea94c99052685d38c9559a1246284cdc32c5110eb8c6741352cd42e09e6389d4765c58aa84d51867cf86fba69d29eac1cd7fac2f36603d2fb2af146c5d4c2bedb4f6c6d0f387f0a8d635e33384df60f8d2415b"; static char ST_HASH_06213[] = "3916e924d246e5ceb17b140211fff57b67150b3dee53fa475261d465b0ee3e56ee820e6ba3958d84c61508f028b2a112e9005877784e07deddcf310d01ba81710b620533790456d20d17c8fda84f9d93bbfe41509b931a417b82d68ed9b0bc9641b79a5bf8f71bcdbba979dfb7566a5b8ccc221f80722c1ce7ec81be4a8c880b1b057e681c187504eabf4eea32f7b81383defd4616618a99852d1678a6520883c8f3564e6dcf874150a060b9a44748d97f95b223b089ac847e31fb5a2db3656d7b57decff65e2c5c9af5bdece7a1845caa9df805fc1f7e56bf545d854beec27a9640bf1697c195e5f95b82c20d76c5a56ff4283219caa5a618e8caace9d0fcde0df6ee6e043ccbc78fd06a602cc638f7ae4675063b840ee08ffa9e143553bffd20126fa30f95e013aabf103f12c3ceeb284c80dc335fe2e78580d6ddfa80511aba9db7c93838cae0db40b9dbeccbf9d160032d334a9c35156721c746b51131baf6855fdfc1edee3099b8e4abc619e1c60e3ce68615e1eb42bd8d338046f7c854a60defe395e0d7168786a3035c9735cd42433dd0c46dcf8b5cb2c28905df80476561e55d6310b25f74d78b651ccd3484332c59a6ad490e29ea267db5ce4a47c9dcde39f420ba0755ea7e5583a3a562925acaa125d5056795b98135825232aa543a460137cc84235b85dd44d65e01e6eb1ade1b970f3ffe2b9762f5a7f261037e"; static char ST_HASH_06221[] = "5ebff6b4050aaa3374f9946166a9c4134dd3ec0df1176da2fb103909d20e8b3c9b95cbbd6d1a7ad05411a1443ad6254e059e924d78bab6a0463e71cf7c3109b7ef4e837bf6d7a548dd8333c451b59d1132098f44c6ff19c6cb921b1de3bd0aa675e0478a05f90204d46a5d6ff598bfa40370ac8795928a6d2e0f1347696e3cfa329738170fe54298981d84f40c63d1a338c5db62679338e849124a28a79a8e505bb89a4673f0457b2737a00b908116310281b5b2eb66c6fda5599196b313d51ef26201335d715c18f6b128454a5601671e619bdcce8e54acb47d498c4161614a05063bff5497a4a3d99bff1fce2a163727af2fe9ae7512461b9dcebf3a4f1031d6235d8ce09b734294d0cedc04eafc6295f212b1b080e7b9745580d0dd18e99cfd95afef982762d5aabeaa2d3a928dcf36322cc06b07fd719c88e0b9a2625a94a77502d4bd40a85ba138cbd0cf9561aa395dc552801f68cce16e5484a672aa5b78665dc531ab1e3e728185929dc443b7f4c8a5cb687c6589bb3f4ddc2a8639d959b839b0813d50e7711b761622c3693a92e540e4f932c6c89bf4e1bff1d69151848c3d01b2f6aba52b58e5b393f6cd58ff0d2e040b1205b042b5a28d5b12cb0cc95fa32f1bcdebd4c82d889a5d87c45dcfd34e80b19bf7be35696e0fa0cbd9338b314de24c1ee7bbc0a3b6824f86af2aa5d127d21444985ff566e921431938f6"; static char ST_HASH_06222[] = "9f207bec0eded18a1b2e324d4f05d2f33f0bd1aeb43db65d33242fa48ac960fad4c14d04c553e06ad47e7e394d16e0a6544d35fb0b2415bd060bc5f537e42a58b1681e991e2ec0b5773f6e8e5766e5fcc7335b19dd068d1f20260085ecda8eba366ff1521997c5654630ef09ba421b871a3dc66aa0dd5eba8a3bc7052398a7ad779506d86cbf687e76cd9dc50969e222820d2f905c0550995a9c068725bb6c8b04358c965ab77221fdfd829e57ce54cac6e2fa62db15043d720b72fa8962dd718a0b42c34577af9cb4a5ed04c1ae17b7af470c0d8b77987dc9e2d2593a52458c4acb83b628b1488371de85f78a2e25aeaebc18d20a8c3007d08949e93b80087707afd1fe4e07a0afee4244e5270f768e234b86852aa1556c53ffc0d6f60661369a484d55d063119e71e70af1ec775908466cac7b12bc22e1a9525c2bfa9f83f7901c8e0a1d56387ef65040b750656b0b75791738b5b7e453f24167eae56c057c94e1e4cf1a0d08894225f11b45bc31827cad1dfe62e148549385953aa16a0410dba231aace3a7b9fd9b1c2b930f01193377b59736d8a8959ca5b449655f79a4dbec0da566083f90caa2490b01a10c0a86dd4aaa719bdc1e4233db17217f03509cc20dab7246730e3f964944990690b6dcc84936e1dd487bd154ceefe58a838a0488cc93b854a112ea67f6802d2f409915e648ee5cf5fdc3c12e41acbfab7caa9"; static char ST_HASH_06223[] = "721a7f40d2b88de8e11f1a203b04ffa97a1f5671623c6783f984cc7c55e04665f95a7f3fd52f402898aaaed68d048cc4c4fabf81c26832b589687dad082f3e4e0f23c7caba28118f21a4cbb8f32b25914ff4022e7c4c8cdd45411801c7c6bde4033badbdcb82f96c77b42025d13fa71415b3278138100ea58ee4476c81ce66f78e89c59ac22cf454684ea7e8c3900374662f23c9491891b60ed7ce8231a7ac5710ee87b51a3f7bd9566a60dc6e7e701c41f3810d7977314b321e8194349909f2ca458a976851d854eaeb934c8df2b5e063d416d3d7c464e28173a0bbba88ec75cf8fe68f21067739b2473bd804fd710de1e4d3ae9451b374edcfd8e3cd613b23aeae272e0923007482dac26a7532ab09af8aad57cd7f1c451bc260cc912d5830cb0d5332f792519e009ed5450171434e5f0f2ba9e003676933a86d83c766419fac98a7ee232eeb593d1686528fab576d5f393d82f9602bcd65975153df205b6d1bc50dacad2ea5bb184696f978efd2b1c1656bf87e03a28a536c48320c430d407ff6c2fc6e7d4ae7b115e79fd0a88df08eca4743178c7c216f35035596a90b0f0fe9c173c7d0e3d76c33a8fce1f5b9b37674bd12e93fb714c9cbba6768c101b5db8f8fd137144453f00dccc7b66911a0a8d87b198807f30be6619400331c5746d481df7ad47a1f867c07f7b8cd296a0c5e03a121c1a7a60b4f768bea49799d2f"; static char ST_HASH_06231[] = "cf53d4153414b63285e701e52c2d99e148c6ccc4508132f82cb41862d0a0ac9ea16274285ac261c339c1508eec9fea54c33e382458662913678f2a88a84959a678e238973985ec670d50252677430587ee28b72bfa5edfb2f79c40b734ba8a54a3662642a6ab067e75f41154688ad4adb5d6decd891462dd537188195a51e06fa5baf22b69d0f472cfeeae77ab9a90091731863af1d8b5b380da179fa7d5227ef031732b1ae06e0fe34c0b28b7a64eac34e5a08e09d7001394b3afc804ac69bf819cdd2d383fe96a721f7c683628da8e529d84bdaa68d702573d8f7ef26f75d1bd5c91efa88cb33b1e9c006b87981c55ed3b8063ab7068f8e99b128bc56ea3e883efa55d6f340b2681e50405d91f5f6d76cdbeac404944164d329d3ee01311de0bc6547310f126b5a4c0e9fb74825f91faefa60b7ac828819d4544c1872ff5041e61d5cf093553f427358b2181046376d7b876e1bccf0774d5d251b7c922c214bb5c70c715165d028e1dca73e7adeca3396d77f6e597a10dd4c58f37fdbbdc1d04cd8890ba4c5025776a88a349bb925add13193becf1ca10fe32536db0c0b06a1ef799fb692e304b3716ca5a8a80859c4012ca3e06701b46b5a32f4d10e285a0cdaf6c24e0d98139e7f306e52503c9b503aa28f1fbbb236284907068074fcb3e267e3c4aab2bd3b79b24a7a08106bb55850fa2bb8e2f6d9919a6743cb822c164"; static char ST_HASH_06232[] = "e9e503972b72dee996b0bfced2df003a54b42399e3586520cf1f69475ba32aff564e40e604a505af95ce15220f558ae815e94ce4953882a8299ee3fffb12e9bd62bf8e2c41c0a8337ce20d45715440cc83e394200d351c5b04be5b70fa11b8467320a091a1d703c88cc7b26fd114795c04a973b3266ba97f55d4b4e4771bb1b4a6aabc9d57e03f0ae7c8a77dfc3d37078efba45031e7d63bb514726e2f2dc6da8cce167a17e36b32c326a5bcaa2c4b445f6e10e1f899a9adcc2a698769f900b7909f7aec52fc9862d75286ffda67933f9c52e5c681d590ad0329b85f8db0f6bb6daa3b2d55b62c65da37e3e7fcb99954e0abe20c39724e8fb2c7f839ec67d35f151dfd8c4dd4bc8dc4393fab291efa08cc0099277d219a0ba4c6272af3684d8043ed3f502b98e196dc7aa0291627613179199976f28eff08649acf70aa0c0dc5896ed13eb18ea28fdd6c460a9c7cfedeab5ac80a3c195226cfca094a7590fa2ae5ed2133ba09b5466b2049b6291f8dcf345e5718a4c0ef3f9c8d8e07d0e5dddd07452b533fbf243ef063fb6d26759ae725d8ca430f8cf17b86665d23bdff1c9dbdfe601b88e87cb7c89f23abc4a8bb1f0b7375cc29b1d81c950ffe92e16e2080e1d6270bbb3ba753322d2b623caed87213e552c33e699d4010f0f61df2b7f460d7cd82e70a711388f1c0b591d424259d3de8b3628daf62c6c5b71864eb0e7d31"; static char ST_HASH_06233[] = "de7d6725cc4c910a7e96307df69d41335e64d17b4425ca5bf1730f27820f92df9f20f3e855d8566eb5255927153f987348789666c8e563e366a09e68a8126b11c25ac817b2706dde5cec3946e64332b21b41b928985c1a637559ead5b4fecac74ff0d625ef6d8be93dea3eaca05394f23ee9e079d3504a77b4c0b22d3cfcafa9c670966bfa3a5f30539250d97267a9e56b5a1437b1fd2ce58f4ab78b52ba61d01c28d7a6b726d92c8819711c70f820690cf2b9bbef75f196ba87fb5f72a29e213096a8be3b6e6d0ff3dc22563dc9e7d95be68ad169c233289fccfdc2f5528c658cb178b4e78d54e96cb452859b01dd756ca0245bdd586fb450e84988071428c80af0a6dc5f16dea8094da3acb51ac5d2a710414256b2423e0333584437ea9a65a07f06bd241103a478d137e9a274a78a19d3ca121f1bc10e4c9e5fc277d23107db1fb447f71ba0f92b20e3ead77cffaca25f772182705a75e500d9aab3996bfda042f4bdfe35a3a477e355c76a711ad0f64848d6144073ce6ec4152c87973fc3e69626523463812061c51f51fc08487e8a4dbae1ca7965c11f222c607688b3384c5c29d4fe91d14d2cc940a6a9d94486d1823261928d88f56fe00e206d7a31734de0217afd38afa3d2cf3499c2dcff13332a369c4b1f39867f6dfc83ec32d19b931b082f07acac7e70bdd537e8432245c11662d89ec3cc97e582de5d2cc6bde7"; static char ST_HASH_06241[] = "2b5da9924119fde5270f712ba3c3e4974460416e8465f222149499908c2fca0a4753b581f26625d11c4d3f49bdeb1c95bc3e17629d7e19ffb66175e5feab90a4fd670194f95d578266f3f54e61b82dc00efc2bb4438e19c3f6d7a92825a7625d88ec6286ab4e1761749edc83dad4340fd167544f09913fd6b03775013ff232fc4dad6f726ef82ad4bd1c5227a7796d7db35a912beeda5b0cdd798bc34d3ac24403c87dc672a983687dd64f920c991840a56105a6311797eed9976014909700366420673f6455242c71151ac75903a353538ec24b4feb967e2b46886395cf3e934e83a6a58ef2c0180273a0c33ba2bd870b1d84afb03d5558dc17bc7fb586404ad9a7e506ed859540110c6ad73f0f1d2be47829bc666e1838ec3f1dc1f610206241ce07fbf2542ecef9348b37aa460815794ca582709697cbf0c90c3dae4cb9dd97b29d3c7d82bd8d0c81d708e74c7007468c6c55a40fd4f803a4f5a75818d7da0d1ef333b8622e7de516fa62a6fa2b8d6d5d23653dfcedffec771456ee204e5c85ee88defbe195462fbe8ce0e2a5a455dab66478b877ec37dfa66f19ab5201c56cd707ba7bee1b10360965d3868c1fdf91dda124b1b0994fee75848083d19369735905bd2864b496c6e35ecf96f6dd4728570a45746bcf8d7d0ec0b9b0b112b28fdc53efcfa7d0558c132cd683a742d62b34304d9f991029c8aedc3d8767da8c"; static char ST_HASH_06242[] = "debcc3e74a7b2acb4c7eaa4ac86fd6431da1d9579f4f76f0b31f07b3d36e65099daca9e4ae569114b3cb6e64d707b6206a2ab6b31ab0c17b356da3719d0e2fa4058f0349763970855d4c83b02a967bb2969f1b6f3e4fdbce37c6df203efbe87bfdb5ffd8fe376e9ad61862a8f659ef0db39e06ed34c4f80aa856df2219ac6a37ebb0244445db7e412b773f4e28846c5e65129cd4f4ce76979c083f08a7c4e2be30469b8363eaf8579baa870cdcb2bdca6b60e64559cb0def242576b80722bf36eb6d94640d2937b49edf9c9af67f0172f27319448425f86831c35ae35e764b9e69fcc47a42ba7a565d682366023291b1b4cbcd1b7ba6fba75c214e5849a9ba26197f7f010f01301dcbffaa7311f2ab32c2810470d3fe873334ca578adbfd04c5a39cbd53b09755e4d868dbf8a44d76cc91031f4710b8a985c70738b443572b4745ed10e6120852870b0fdb258f0a804d679eec85b5290235c9c526165b961f17ff0fe32d9f597c8f2ab9b84f3d22fef71fec67987e687590de6ab11b33f1b06f23c38ead94c3de419061b6568612c27517b0a3395e401a2c6058fc5f41f0e084e8f2157b6486624314b1f341f74cfdec9deaed7abf89ccf97b47441493e5086f1351f42a5c0929f6431753baadcd2fb347b8835d08250743bb45aaf1c6bb30eed98e911a273074b7e8ebad2174b527b1b84e1961967bf358711346482d9db1c7"; static char ST_HASH_06243[] = "5e6628907291b0b74a4f43a23fb0693acb71c4379c3a3cc0eafbab40036bbdadfede179e04484aca0f5b6ecf7c7e8abe61d6836be6590838b8f9027da93ba77d076b9a557c958159c5dcddfb70823b7e324bd99b40a8f39410f6afd279df3493b58b9ffce41b65f3afd2fc467f4553a946b85e6ffc74b91c9c38c689d98419339a84d3c6d116274e34482d546407006ee04af03b594998127b2a9716ca4278b1f3050d015af10a9bb11db0465373f3a786c148bb20473377d8e97264b1c4d7ec4179829ce929573b26e5987b59da8591e2dc8e3934830dd0b5ac521c8637e9bb31e4bc084d53bc6a8dc6875e857a4c8c32a577eed3c6cea5beef514160982be2c7d7e2f4d65efa3f4a0e11ac1860ff3160e7cd968e18019abfd0395080a9f8e860c627fc32c63c8b7ef46b203c63cf0f12c05ea65b1f83a5f1fc6ad6cc200a9527151c2b8016a38f1e87be9c960088eaaa98a01d9db8cdacaae26c446a846042a6c0248b666eea7a1be44dc3fc35ce100c3a3eb377e898deb097cfba9246685d7ec8527cdc5e1983c154169178e3d86cd4017606ccc42d25cbdea0aca2b1ac422372cfbb1ad2b7d465449a2c1fbbae35c8e7fdaadd683a7dc991b76aaba08b8706916924407392a2aef458c2e833290dc1ff116f3f49f918e6a133b60728ac7c464e4f3521784cf32866be32877534bb014312c4301d1740781221a5e8758ea4"; static char ST_HASH_06300[] = "{smd5}17800721$WkGka7tXcrfpUQS6WOQyw/"; static char ST_HASH_06400[] = "{ssha256}06$2715084824104660$1s/s4RZWEcvZ5VuWPXWGUfwSoG07eVSVce8F6ANJ.g4"; static char ST_HASH_06500[] = "{ssha512}06$4653718755856803$O04nVHL7iU9Jguy/B3Yow.veBM52irn.038Y/Ln6AMy/BG8wbU6ozSP8/W9KDZPUbhdsbl1lf8px.vKJS1S/.."; static char ST_HASH_06600[] = "1000:d61a54f1efdfcf57:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000afdb51c887d14df6200bbde872aabfd9e12a1f163eed40e6b3ec33ba394c47e9"; static char ST_HASH_06700[] = "{ssha1}06$5586485655847243$V5f1Ff1y4dr7AWeVSSdv6N52..Y"; static char ST_HASH_06800[] = "82dbb8ccc9c7ead8c38a92a6b5740f94:500:pmix@trash-mail.com"; static char ST_HASH_06900[] = "df226c2c6dcb1d995c0299a33a084b201544293c31fc3d279530121d36bbcea9"; static char ST_HASH_07000[] = "AK1FCIhM0IUIQVFJgcDFwLCMi7GppdwtRzMyDpFOFxdpH8="; static char ST_HASH_07100[] = "$ml$1024$2484380731132131624506271467162123576077004878124365203837706482$89a3a979ee186c0c837ca4551f32e951e6564c7ac6798aa35baf4427fbf6bd1d630642c12cfd5c236c7b0104782237db95e895f7c0e372cd81d58f0448daf958"; static char ST_HASH_07200[] = "grub.pbkdf2.sha512.1024.03510507805003756325721848020561235456073188241051876082416068104377357018503082587026352628170170411053726157658716047762755750.aac26b18c2b0c44bcf56514d46aabd52eea097d9c95122722087829982e9dd957b2b641cb1e015d4df16a84d0571e96cf6d3de6361431bdeed4ddb0940f2425b"; static char ST_HASH_07300[] = "3437343735333336383831353232323433383333303236303337333338363232303135383237333638363532373231343030313131333838323734373138363632343133333335353030353633373533333133313530363533303738343334313330303630343633333237373037383537333630303233303830303437323838333237313438363238343434383831363634323431333430383735323038:f4b376e25868751fc0264f573ff1fe50b65ce5a2"; static char ST_HASH_07400[] = "$5$7777657035274252$XftMj84MW.New1/ViLY5V4CM4Y7EBvfETaZsCW9vcJ8"; static char ST_HASH_07500[] = "$krb5pa$23$user$realm$salt$5cbb0c882a2b26956e81644edbdb746326f4f5f0e947144fb3095dffe4b4b03e854fc1d631323632303636373330383333353630"; static char ST_HASH_07700[] = "027642760180$77EC38630C08DF8D"; static char ST_HASH_07800[] = "604020408266$32837BA7B97672BA4E5AC74767A4E6E1AE802651"; static char ST_HASH_07900[] = "$S$C20340258nzjDWpoQthrdNTR02f0pmev0K/5/Nx80WSkOQcPEQRh"; static char ST_HASH_08000[] = "0xc0071808773188715731b69bd4e310b4129913aaf657356c5bdf3c46f249ed42477b5c74af6eaac4d15a"; static char ST_HASH_08100[] = "1130725275da09ca13254957f2314a639818d44c37ef6d558"; static char ST_HASH_08200[] = "9b6933f4a1f65baf02737545efc8c1caee4c7a5a82ce3ab637bcc19b0b51f5c5:30b952120ca9a190ac673a5e12a358e4:40000:e29b48a8cfd216701a8ced536038d0d49cf58dd25686e02d7ba3aa0463cc369062045db9e95653ac176e2192732b49073d481c26f29e1c611c84aaba93e553a6c51d1a9f7cfce0d01e099fb19f6a412bacd8034a333f7165fda1cc89df845e019c03ac9a09bc77b26c49524ade5c5a812230322f014f058b3bb790319e4a788f917aa164e56e78941f74e9c08921144e14be9b60da1a7321a0d178a1b8c1dcf83ffcadcb1599039049650577780d6913ee924e6529401e7a65b7d71c169a107e502dbd13b6b01c58e0483afb61b926313fa4273e685dd4890218bb797fab038c6a24df90883c7acd2358908edc1f7d95ef498757a3e0659aaaf6981c744ab69254267127fc806cf3cd1ced99ab455ece06479c91c892769af5db0c0f7a70dd83e4341bf86d085bbdc6a7e195ab08fc26"; static char ST_HASH_08300[] = "pi6a89u8tca930h8mvolklmesefc5gmn:.fnmlbsik.net:35537886:1"; static char ST_HASH_08400[] = "7f8d1951fe48ae3266980c2979c141f60e4415e5:5037864764153886517871426607441768004150"; static char ST_HASH_08500[] = "$racf$*8481*6095E8FCA59F8E3E"; static char ST_HASH_08600[] = "3dd2e1e5ac03e230243d58b8c5ada076"; static char ST_HASH_08700[] = "(GDJ0nDZI8l8RJzlRbemg)"; static char ST_HASH_08800[] = "$fde$16$ca56e82e7b5a9c2fc1e3b5a7d671c2f9$16$7c124af19ac913be0fc137b75a34b20d$eac806ae7277c8d48243d52a8644fa57a817317bd3457f94dca727964cbc27c88296954f289597a9de3314a4e9d9f28dce70cf9ce3e1c3c0c6fc041687a0ad3cb333d4449bc9da8fcc7d5f85948a7ac3bc6d34f505e9d0d91da4396e35840bde3465ad11c5086c89ee6db68d65e47a2e5413f272caa01e02224e5ff3dc3bed3953a702e85e964e562e62f5c97a2df6c47547bfb5aeeb329ff8f9c9666724d399043fe970c8b282b45e93d008333f3b4edd5eb147bd023ed18ac1f9f75a6cd33444b507694c64e1e98a964b48c0a77276e9930250d01801813c235169a7b1952891c63ce0d462abc688bd96c0337174695a957858b4c9fd277d04abe8a0c2c5def4b352ba29410f8dbec91bcb2ca2b8faf26d44f02340b3373bc94e7487ce014e6adfbf7edfdd2057225f8aeb324c9d1be877c6ae4211ae387e07bf2a056984d2ed2815149b3e9cf9fbfae852f7dd5906c2b86e7910c0d7755ef5bcc39f0e135bf546c839693dc4af3e50b8382c7c8c754d4ee218fa85d70ee0a5707a9f827209a7ddb6c2fb9431a61c9775112cc88aa2a34f97c2f53dfce082aa0758917269a5fc30049ceab67d3efd721fee021ffca979f839b4f052e27f5c382c0dd5c02fd39fbc9b26e04bf9e051d1923eff9a7cde3244902bb8538b1b9f11631def5aad7c21d2113bcdc989b771ff6bf220f94354034dd417510117b55a669e969fc3bc6c5dcd4741b8313bf7d999dc94d4949f27eec0cd06f906c17a80d09f583a5dd601854832673b78d125a2c5ad0352932be7b93c611fee8c6049670442d8c532674f3d21d45d3d009211d2a9e6568252ac4682982172cb43e7c6b05e85851787ad90e25b77cce3f7968d455f92653a1d3790bc50e5f6e1f743ac47275ffa8e81bbe832a8d7d78d5d5a7c73f95703aebb355849ae566492093bd9cb51070f39c69bb4e22b99cc0e60e96d048385bb69f1c44a3b79547fbc19a873a632f43f05fa2d8a6f9155e59d153e2851b739c42444018b8c4e09a93be43570834667d0b5a5d2a53b1572dab3e750b3f9e641e303559bace06612fbd451a5e822201442828e79168c567a85d8c024cd8ce32bf650105b1af98cc5428675f4f4bbede37a0ef98d1533a8a6dcb27d87a2b799f18706f4677edaa0411becac4c591ede83993aedba660d1dd67f6c4a5c141ad3e6e0c77730cb0ecbf4f4bd8ef6067e05ca3bc563d9e1554a893fea0050bdd1733c883f533f87eac39cceee0ccf817fc1f19bcfdd13e9f241b89bfb149b509e9a0747658438536b6705514cc6d6bb3c64c903e4710435d8bebc35297d1ebbdff8074b203f37d1910d8b4637e4d3dab997f4aa378a7a67c79e698a11e83d0d7e759d0e7969c4f5408168b282fe28d3279ec1d4cc6f85a0f8e5d01f21c7508a69773c44167ff8d467d0801f9ec54f9ee2496d4e7e470214abc1ca11355bb18cd23273aac6b05b47f9e301b42b137a2455758c24e2716dcd2e55bbeb780f592e664e7392bf6eccb80959f24c8800816c84f2575e82e1f3559c33a5be7a3a0c843c2989f486b113d5eeada007caf6b5a0f6d71e2f5c09a4def57c7057168051868317a9ec790d570d76a0d21a45ad951c475db5a66101475871147c5a5907ec4e6b14128ed6695bb73c1c97952e96826eeb6003aa13462093e4afc209627241f03b0247e110fbab983640423b7cdf112e01579fed68c80ac7df7449d9d2114b9ae5539c03c2037be45c5f74e7357b25c6a24b7bd503864437147e50d7ac4ccc4bbd0cabecdc6bac60a362285fe450e2c2d0a446578c8880dc957e6e8061e691b83eb8062d1aad476e0c7b25e4d5454f1288686eb525f37fe649637b235b7828366b0219a9c63d6ddbb696dc3585a2ebfbd5f5e4c170d6784ab9993e15142535e194d2bee3dc9477ef8b8e1b07605e0c04f49edf6d42be3a9dabbc592dde78ce8b7dd9684bfcf4ca2f5a44b1872abe18fb6fa67a79390f273a9d12f9269389629456d71b9e7ed3447462269a849ce83e1893f253c832537f850b1acce5b11d2ba6b7c2f99e8e7c8085f390c21f69e1ce4bbf85b4e1ad86c0d6706432766978076f4cada9ca6f28d395d9cc5e74b2a6b46eb9d1de79eeecff7dc97ec2a8d8870e3894e1e4e26ccb98dd2f88c0229bbd3152fa149f0cc132561f"; static char ST_HASH_08900[] = "SCRYPT:1024:1:1:Mzg3MjYzNzYwMzE0NDE=:uM7P3Kg2X9En9KZPv3378YablKcuUoQ1mwunXdg3o1M="; static char ST_HASH_09000[] = "0a3f352686e5eb5be173e668a4fff5cd5df420927e1da2d5d4052340160637e3e6a5a92841a188ed240e13b919f3d91694bd4c0acba79271e9c08a83ea5ad387cbb74d5884066a1cb5a8caa80d847079168f84823847c631dbe3a834f1bc496acfebac3bff1608bf1c857717f8f428e07b5e2cb12aaeddfa83d7dcb6d840234d08b84f8ca6c6e562af73eea13148f7902bcaf0220d3e36eeeff1d37283dc421483a2791182614ebb"; static char ST_HASH_09100[] = "(HC34tD3KtDp4oCZWmCJ4qC30mC30mC3KmC30mCcA5ovrMLH9M)"; static char ST_HASH_09200[] = "$8$84486783037343$pYNyVrtyMalQrZLxRi7ZLQS1Fl.jkYCgASUi5P8JNb2"; static char ST_HASH_09300[] = "$9$87023684531115$phio0TBQwaO7KZ8toQFyGFyDvyOzidaypRWN0uKX0hU"; static char ST_HASH_09400[] = "$office$*2007*20*128*16*18410007331073848057180885845227*944c70a5ee6e5ab2a6a86ff54b5f621a*e6650f1f2630c27fd8fc0f5e56e2e01f99784b9f"; static char ST_HASH_09500[] = "$office$*2010*100000*128*16*34170046140146368675746031258762*de5bc114991bb3a5679a6e24320bdb09*1b72a4ddffba3dcd5395f6a5ff75b126cb832b733c298e86162028ca47a235a9"; static char ST_HASH_09600[] = "$office$*2013*100000*256*16*67805436882475302087847656644837*0c392d3b9ca889656d1e615c54f9f3c9*612b79e33b96322c3253fc8a0f314463cd76bc4efe1352f7efffca0f374f7e4b"; static char ST_HASH_09700[] = "$oldoffice$0*55045061647456688860411218030058*e7e24d163fbd743992d4b8892bf3f2f7*493410dbc832557d3fe1870ace8397e2"; static char ST_HASH_09710[] = "$oldoffice$0*55045061647456688860411218030058*e7e24d163fbd743992d4b8892bf3f2f7*493410dbc832557d3fe1870ace8397e2"; static char ST_HASH_09720[] = "$oldoffice$0*55045061647456688860411218030058*e7e24d163fbd743992d4b8892bf3f2f7*493410dbc832557d3fe1870ace8397e2:91b2e062b9"; static char ST_HASH_09800[] = "$oldoffice$3*83328705222323020515404251156288*2855956a165ff6511bc7f4cd77b9e101*941861655e73a09c40f7b1e9dfd0c256ed285acd"; static char ST_HASH_09810[] = "$oldoffice$3*83328705222323020515404251156288*2855956a165ff6511bc7f4cd77b9e101*941861655e73a09c40f7b1e9dfd0c256ed285acd"; static char ST_HASH_09820[] = "$oldoffice$3*83328705222323020515404251156288*2855956a165ff6511bc7f4cd77b9e101*941861655e73a09c40f7b1e9dfd0c256ed285acd:b8f63619ca"; static char ST_HASH_09900[] = "22527bee5c29ce95373c4e0f359f079b"; static char ST_HASH_10000[] = "pbkdf2_sha256$10000$1135411628$bFYX62rfJobJ07VwrUMXfuffLfj2RDM2G6/BrTrUWkE="; static char ST_HASH_10100[] = "583e6f51e52ba296:2:4:47356410265714355482333327356688"; static char ST_HASH_10200[] = "$cram_md5$MTI=$dXNlciBiOGYwNjk5MTE0YjA1Nzg4OTIyM2RmMDg0ZjgyMjQ2Zg=="; static char ST_HASH_10300[] = "{x-issha, 1024}BnjXMqcNTwa3BzdnUOf1iAu6dw02NzU4MzE2MTA="; static char ST_HASH_10400[] = "$pdf$1*2*40*-1*0*16*01221086741440841668371056103222*32*27c3fecef6d46a78eb61b8b4dbc690f5f8a2912bbb9afc842c12d79481568b74*32*0000000000000000000000000000000000000000000000000000000000000000"; static char ST_HASH_10410[] = "$pdf$1*2*40*-1*0*16*01221086741440841668371056103222*32*27c3fecef6d46a78eb61b8b4dbc690f5f8a2912bbb9afc842c12d79481568b74*32*0000000000000000000000000000000000000000000000000000000000000000"; static char ST_HASH_10420[] = "$pdf$1*2*40*-1*0*16*01221086741440841668371056103222*32*27c3fecef6d46a78eb61b8b4dbc690f5f8a2912bbb9afc842c12d79481568b74*32*0000000000000000000000000000000000000000000000000000000000000000:6a8aedccb7"; static char ST_HASH_10500[] = "$pdf$2*3*128*-4*1*16*62888255846156252261477183186121*32*6879919b1afd520bd3b7dbcc0868a0a500000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000"; static char ST_HASH_10600[] = "$pdf$5*5*256*-1028*1*16*28562274676426582441147358074521*127*a3aab04cff2c536118870976d768f1fdd445754d6b2dd81fba10bb6e742acd7f2856227467642658244114735807452100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*127*00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000"; static char ST_HASH_10700[] = "$pdf$5*6*256*-1028*1*16*62137640825124540503886403748430*127*0391647179352257f7181236ba371e540c2dbb82fac1c462313eb58b772a54956213764082512454050388640374843000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*127*00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000"; static char ST_HASH_10800[] = "07371af1ca1fca7c6941d2399f3610f1e392c56c6d73fddffe38f18c430a2817028dae1ef09ac683b62148a2c8757f42"; static char ST_HASH_10900[] = "sha256:1000:NjI3MDM3:vVfavLQL9ZWjg8BUMq6/FB8FtpkIGWYk"; static char ST_HASH_11000[] = "f22cade043e7214200206dbffca49fd9:27167508161455764247627144160038845437138252877014827848"; static char ST_HASH_11100[] = "$postgres$postgres*74402844*4e7fabaaf34d780c4a5822d28ee1c83e"; static char ST_HASH_11200[] = "$mysqlna$2576670568531371763643101056213751754328*5e4be686a3149a12847caa9898247dcc05739601"; static char ST_HASH_11300[] = "$bitcoin$96$c265931309b4a59307921cf054b4ec6b6e4554369be79802e94e16477645777d948ae1d375191831efc78e5acd1f0443$16$8017214013543185$200460$96$480008005625057442352316337722323437108374245623701184230273883222762730232857701607167815448714$66$014754433300175043011633205413774877455616682000536368706315333388"; static char ST_HASH_11400[] = "$sip$*72087*1215344588738747***342210558720*737232616*1215344588738747*8867133055*65600****MD5*e9980869221f9d1182c83b0d5e56a7db"; static char ST_HASH_11500[] = "c762de4a:00000000"; static char ST_HASH_11600[] = "$7z$0$14$0$$11$33363437353138333138300000000000$2365089182$16$12$d00321533b483f54a523f624a5f63269"; static char ST_HASH_11700[] = "57e9e50caec93d72e9498c211d6dc4f4d328248b48ecf46ba7abfa874f666e36"; static char ST_HASH_11800[] = "5d5bdba48c8f89ee6c0a0e11023540424283e84902de08013aeeb626e819950bb32842903593a1d2e8f71897ff7fe72e17ac9ba8ce1d1d2f7e9c4359ea63bdc3"; static char ST_HASH_11900[] = "md5:1000:NjAxMDY4MQ==:a00DtIW9hP9voC85fmEA5uVhgdDx67nSPSm9yADHjkI="; static char ST_HASH_12000[] = "sha1:1000:MTYwNTM4MDU4Mzc4MzA=:aGghFQBtQ8+WVlMk5GEaMw=="; static char ST_HASH_12001[] = "{PKCS5S2}NTczNTY0NDY2NjQyNzU1Mx8gGiRGobaZYwumctGHbn2ZOHB8LkwzH+Z1gkWfy1zD"; static char ST_HASH_12100[] = "sha512:1000:NzY2:DNWohLbdIWIt4Npk9gpTvA=="; static char ST_HASH_12200[] = "$ecryptfs$0$1$4207883745556753$567daa975114206c"; static char ST_HASH_12300[] = "8F75FBD166AFDB6D7587DAB89C2F15672AAC031C5B0B5E65C0835FB130555F6FF4E0E5764976755558112246FFF306450C22F6B7746B9E9831ED97B373992F9157436180438417080374881414745255"; static char ST_HASH_12400[] = "_GW..8841inaTltazRsQ"; static char ST_HASH_12500[] = "$RAR3$*0*45109af8ab5f297a*adbf6c5385d7a40373e8f77d7b89d317"; static char ST_HASH_12600[] = "3f3473a071b1fb955544e80c81853ca0f1e4f9ee4ca3bf4d2a8a10b5ef5be1f6:6058321484538505215534207835727413038041028036676832416353152201"; static char ST_HASH_12700[] = "$blockchain$288$713253722114000682636604801283547365b7a53a802a7388d08eb7e6c32c1efb4a157fe19bca940a753d7f16e8bdaf491aa9cf6cda4035ac48d56bb025aced81455424272f3e0459ec7674df3e82abd7323bc09af4fd0869fd790b3f17f8fe424b8ec81a013e1476a5c5a6a53c4b85a055eecfbc13eccf855f905d3ddc3f0c54015b8cb177401d5942af833f655947bfc12fc00656302f31339187de2a69ab06bc61073933b3a48c9f144177ae4b330968eb919f8a22cec312f734475b28cdfe5c25b43c035bf132887f3241d86b71eb7e1cf517f99305b19c47997a1a1f89df6248749ac7f38ca7c88719cf16d6af2394307dce55600b8858f4789cf1ae8fd362ef565cd9332f32068b3c04c9282553e658b759c2e76ed092d67bd55961ae"; static char ST_HASH_12800[] = "v1;PPH1_MD4,54188415275183448824,100,55b530f052a9af79a7ba9c466dddcb8b116f8babf6c3873a51a3898fb008e123"; static char ST_HASH_12900[] = "15738301074686823451275227041071157383010746868234512752270410712bc4be900bf96ccf43c9852fff49b5f5874a9f6e7bf301686fa6d98286de151f15738301074686823451275227041071"; static char ST_HASH_13000[] = "$rar5$16$38466361001011015181344360681307$15$00000000000000000000000000000000$8$cc7a30583e62676a"; static char ST_HASH_13100[] = "$krb5tgs$23$*user$realm$test/spn*$b548e10f5694ae018d7ad63c257af7dc$35e8e45658860bc31a859b41a08989265f4ef8afd75652ab4d7a30ef151bf6350d879ae189a8cb769e01fa573c6315232b37e4bcad9105520640a781e5fd85c09615e78267e494f433f067cc6958200a82f70627ce0eebc2ac445729c2a8a0255dc3ede2c4973d2d93ac8c1a56b26444df300cb93045d05ff2326affaa3ae97f5cd866c14b78a459f0933a550e0b6507bf8af27c2391ef69fbdd649dd059a4b9ae2440edd96c82479645ccdb06bae0eead3b7f639178a90cf24d9a"; static char ST_HASH_13200[] = "$axcrypt$*1*10467*9a7cd609bb262c738d9f0e4977039b94*ecbe0fd05a96fd2099d88a92eebb76c59d6837dfe55b3631"; static char ST_HASH_13300[] = "$axcrypt_sha1$b89eaac7e61417341b710b727768294d"; static char ST_HASH_13400[] = "$keepass$*2*24569*0*c40432355cce7348c48053ceea0a28e7d18859c4ea47e3a799c6300861f64b95*265dafcc42e1537ff42e97e1e283c70014133be0fe2d420b4d24c6d57c9d2207*a00e20a852694c15aabb074d61b902fa*48dd553fb96f7996635f2414bfe6a1a8429ef0ffb71a1752abbef31853172c35*a44ae659958ad7fae8c8952cb83f3cf03fec2371ce22a8bf7fac1e687af2f249*1*64*5a26ea376cc5afc955104c334571d30486acbac512a94b75ca82a9e31dd97bf7"; static char ST_HASH_13500[] = "24eea51b53d02b4c5ff99bcb05a6847fdb2d9308:4f10a0de76e242040c28e9d3dd15c903343489c79765f9118c098c266b9ff505c95bd75bbe406ff3404849eea73930ad17937c0ba6fc3e7bb6d37362941318938b8af96d1292a310b3fd29a67e411ecb10d30247c99183a16951b3859054d4eba9dcd50709c7b21dee836d7ed195cc6b33317aeb557cc56392dc551faa8d5a0fb42212"; static char ST_HASH_13600[] = "$zip2$*0*3*0*74705614874758221371566185145124*1605*0**75bf9be92e8ab106ff67*$/zip2$"; static char ST_HASH_13711[] = "531aca1fa6db5118506320114cb11a9f00dade61720533fc12982b28ec71a1a3856ac6ee44b4acc207c8230352208d5f0dc37bf755bd98830279d6befcb6001cdf025f816a0aa1baf3b9b51be00fadb451ffbe9bdfc381115eeceeef778e29a8761f853b7c99e0ea9ec452ba77677f888ea40a39cf65db74d87147690684e273313dea15ff2039797e112006e5f80f2c5baf2c11eb62cb63cfb45883f8885fc7cd5bdb74ef57ec4fe3cec5c2025364582380366169d9419ac41b6f6e878429239e52538f9698e73700b920e7b58c56a4563f5aa512e334ddc56909ac2a0ad4146833f050edd78b7954e6549d0fa2e3b26ed2a769a6c029bfa4de62d49575acce078ef035e366ec13b6092cb205e481bc822f87972bfbe4a3915fad620c4b8645e96bcc468d5804208ae251a560068a09455657f4539dc7e80637fa85fbce058ffee421a98d85b2ae1118d9bd4f24e1e810627cc9893b7166e199dc91fd7f79740530a472df0948f285293478042b28cd2caef086a6ce9d5f656f97adde7d68924ef477fdf2a0c0b107671a1f94b2906d8fb58114836982e4e130e6944df8b42288512376553a1fa6526f9e46dc19b99bb568b30269d9f5d7db2d70a9aa85371b0ac71a6f6f564aaef26a0508c16bf03934973504a5188de37b18a689a020bc37a54d2863879e12902b43bc71c057fa47cbaac1e0100696af365e8226daeba346"; static char ST_HASH_13712[] = "6efa052302d814f368ebf5274e5718cdfd3c1cd5ce8949b963cf4c376a49a033348905f9f5bef7a5a097e3d2d05b09c35c3cb26836e75b45830345bc287903b1c7e2e20c056ba015769d6f5685b8c6a609acd9927afac24f80613c929c1b582553f6637f2523367df94c9c6c0d6ae6e19430313be3f8ea738da30bd910c567222b0d21a03ebc399192453f8dd64f7ae3eeef84e04b77858e678c9dfd30080fb68a8ec532ee8effa65b674c258df29de6f6f7345ffb0ab324cfea9edbc9e1c0366effe284f92a495a9d7901d1008d83fc39a31a750d5b305683e687c69a9321adbbacf09868078147be41ef5d35805ff0f3d4430042c6390b41483d26d287ee1c00fda37588794ea7223ef08be085924ec34f6de6bbc6f79f73ca4c13e7947851a9f220307f9da45c7370306cca3be0ac8a1e555f2f4b87e6bc39b37f2863061a8a62b9df70dd9c5c2ddf9022606bc38e221b9dc0d7a1c311ff7b36cbd97c2df70e1b5c860b03a1ac0cdb5a89f40b1a155be301dc5a96698743aa01527ac1b676440a3fdd68b462c4d77ccff59afb1f9b8ec8b82e7eb9147334d180243b77930ef87c3b2deb145267e5932223b5fbc76eabdc1e44cffb1b36649409565a521c3112119232f829c6ee9408f1c030eab522ae21083d851fb9df0773ba84ea8a6668044cecb82723e7720eb0fa7c0aa13871015452ad08d8b47d7e7fe0bdfde13b21"; static char ST_HASH_13713[] = "9c95d40f14ecd2a90f9d942f7869df881ff48bbe3b0fa6ae1d1bea56271844f00a8a40793eec1bc9240578269a1f40d825e6ad3351aa95b8b65b2b3089d8cfed07c2a3187735143f64cf55af972b045ac3fba3f744106ad1afa9bcfd9ae268ba8bca7168bb255507e2c10dff00c386ce442d898ff4db658645f65554b4b2d9d7a327402eadd6974d1dfbf7864680a514950be513dc5eea63d2e2297ff7c2dd256adc8dff9b7568e44c39150e3b2274badf28cecd27a6caed79675bbb66aa98f6a876a455d84b6190c598fa9198921a3e19ca7e00281a9789299db2b4317bc42375cd87461d0e690dea4a447228414d9452947a9a3cc30b727128c796ce1a2dfe8cc6d4a5984373e956ec7eac89412a49cd93ac5ebd1c0fe795413edd250fb7f4b63a04c54b194891a5ff8e05e8aeca0be9cca3b41182ae9634caac4647182f3d872753b8bf47a245eadcabe1e067c2783c15eaf8aa52ce8a27a14a647b6819bab62471e2a21caf69bccff414962308207141c28ac87ecab2e3bdb5d2501f8de8909ab0f585437e62b7bac42b5e157fcc7936c7d0142ca4a497710309074ae1774af8aff5975dc1061088614f36fe43c63f64d37bdee5da0a54955054a070f277176dd0dfdddbd6b61d028342204f9aba4088d90504d2940104bf40365db569b24b419ce261c5c4f15f509b98158490b8867ef6f629c1156919c5543b2639c7a4"; static char ST_HASH_13721[] = "2be25b279d8d2694e0ad1e5049902e717f1bdf741bbd678bf307d510741b649d78c54dca46fb2c92723afd9a40769b295e66d445ec232af5bddf91481ee41256e56b77839e8bf55265077bab405901218ac7933f74073f1208f1de72aace5da4e07d5f83ca580c0216d36c200b54570a1d58e9d8e5c98a597dec23b74a465aeac572a99af70e1a1e20fd29c7c296099e4eed5b715cb470617ea4f20140b62ec4694af67d9158deac3ce846718e10518875ce8cea0286a487a295979e67159d06e871789bf5535b75c809b340f8627e18679e3dab839a1c9823ea14a07d5cc4251b777dddb408da147c70e7cc788a01c27b0ba4f4700d3248f59fa8217874ae4958ea4518522b44f7191ec19459faef7678422adecd58777487ef54a5305ff2caaa545dcb82f7e7a3eb30bd9f7ebab542d0964a367f9c710cf26bbd704e841d591428da3486db31c57f91c6167bf99e31839363cb93bc60d755031f96f2d2c964e1d85b7eaa104985ef801a21d99352c025d7415d5b2f1aa37dc513345d0ff6a1bca92ad7b8c265f322d04f2992895de32636c9b03318cf7154632d547debc1c5e0c8f8730a045efcf3d16ff956cf803716eee22168bc5a5ab72ddb5087436722cb0f59a5b7b03bc557ffb50e8757d1a5639e2bcddd8060de4ee5535fb614b4fc159c6a39040dcbe83889b9c6fac1c9364a7bea930d916ea23fafa0fde07ef609"; static char ST_HASH_13722[] = "37e6db10454a5d74c1e75eca0bc8a70e67ac032357e4bd6a4315c0174cf9780f92210dfc0a3e977969f2890828d446aecc317dc40fb3162915998cc703e49257a950a1603342913900052011a7fa85fb0b1fd4489f17237ac1a8bbfd644e871ab95a4019f14b2b938d627646b9958b530dd0739760024ad323d36962b60ba92908e55a876fc392ac2dce6a2410bcdd30a01cba90427f02ccb96e222ab1381266a6f626aa00b0f59e743c1a77433cbb28648f04c91853bdf9b8b29917b2341bf7deb013131ad228ea0c7f9435985318431dae59faff46db3726341b97a956da4ad11766124cd06644c1ba1083b36d3f380f20c272e460b958841fc23be1820ad2e0e6db66eaf4ea171035add0ab543ce8e853e3119ceb9d7f32c0948b81604b81075bcb33efe747fec300a7c68ec383d28d560cccce713c0acf51d74c0db718ba93a9e720b657dda2409adf1ce35aa7e1c0d7ed3df98dd0b6d455a355ce02bda8bea8afc0a8341ac78214efd4372b4430270009ec65badf186e5f0d815dcf597b4703af95e3bfc03313125d2a88b9bb3788b6bbc3c7212713cd584a226b155a2e6872b33730af6fba29aa3dccdb0ec35b5d6e3d981faf39c8dd35fdcff502d14736bc6a47af6e4d7f3518f8ef5e0a4e5d521589a761757f86e2bef471d9867e9b532903c479e4966dcc99189fcdfa3d676f50ccd33fb7cc0aa3e85542ff2648c9"; static char ST_HASH_13723[] = "d44f26d1742260f88023d825729cc5a64cf8475d887632a2fb4a84af27af138cfadc4bcbb122f6ba68339ae8427d1f72c0c4aeef041291492ae0a7d8677d8da43227ae2a26d9a433076b44458b14f52766cf0e4baeb473a789180660d62e42bbea7c042379a5a74e259463e1c18381fa13aee27141264be381de71c12f8f704913f211c45fda0295e963d90fc35272e907858c0522601f6e7a73b43ff222663f149a485fc6c464e5f3b7cc0b6508f30621385365ca8a4e0bff4061f64f5fbdb11f70f19d77e56fa6ff015ad76ecaaccd759d30da05d2a6fbf00ac9673ac3c23efd339313c2a99511e928f976bf9b2664d97685498d5931af2d453edc6fb1129e324eaba64264711fbe21d0d202b3659106e8100634f09c38cd15b1b3acba79d7f31d31fe23c166392e300db09f10550c83187566dc0fdf768b872555851b34e3c15ad7e7438a72e6126c895cf1204987df4b42cb7bc2fe03c5777867d269378c6e496df2a1a3457b907f7143a139d800868ad95e2901723c6ebb991054b4e991c67fe4c17702d9829d9dc1fe8bf4a956460721c858e31dbcbe56850a4ed31558c6ee89ba2cba2ef4bde77fed11848f9f92e0add54964a683c3686dbab4695ebc42554da922a08c6fff32cac936ea447e771aa74a689eb269ffef677294ef297600dfd73bbbb734d2968e38a98b4a8a77ff0eec8246d93b542e3521a3eb636101"; static char ST_HASH_13731[] = "48f79476aa0aa8327a8a9056e61450f4e2883c9e9669142f2e2f022c2f85303b897d088dea03d64329f6c402a56fed05b3919715929090a25c8ae84c67dbdb364ebfa3e9ccc0b391c130a4c3dd6495a1d6eb5d2eab72f8009096f7475ecb736bb3225b6da144e1596d859dad159fae5a739beea88ea074771e9d0b2d7c48ae302606a60d7cff6db54f3e460c548c06a4f47dc1ac203a8c8349fbff6a652219a63f27bc76327543e22be4f8dab8e4f90a4283fbf1552119fe24114ce8869eb20ce87dd72300f7aad3f7b4a26a355f16517725449151cf0373dbd0b281f6ac753485a14a5361cc75d40928e241a6b4684658801774843238048cf8c7f2fd88950abac040e12b0c41fdcaca3702907e951ec11c061a91b3050a4855abe6f3b50b4bd0b17c4be1f5b50b873eadc2d8446cd72c4fcac576bbce3acea769f740c5322ee8c927ffd4dd11c8a9e66f06e58df2e5d4d85c13b44c412bab839c9512b7a0acdd97b37dcccc4b70854eda0f36de12d62dd10cc13bc6154103d083bf6540bc78e5d0aad5d063cc74dad4cbe6e060febda2a9fd79c238f99dcb0766ff4addcfd0c03e619c765f65b1c75d5d22c6536958bcda78077ff44b64c4da741bf50154df310d4e0724238a777b524237b9478277e400ad8146dc3ca1da83e3d2f1c5115a4b7fcdc71dd7d56ba86a2f9b721c9a4137aabb07c3c5fedcf5342c4fae4898c9"; static char ST_HASH_13732[] = "1b721942019ebe8cedddbed7744a0702c0e053281a467e0ed69bf875c7406407d72eb8f2aea21270e41898c0a2c14382f86e04c15e7bc019d1d9dd813eabee0ae5173e3cb1d927859d3e6de1006335a5184ae12b4c8dc2db2b1cd785063152a776f4dc5cacc1856a919b880d704b7450f5a0e0c9521bc9b4d67213c36a50e6664a1cbcea33f997b858e654111c7e9fca74f361528e85a28880381ec2600e3c1cd508c3833dd21cc91978185cba53caefd7b3c82d219d49f0b41e536d32e8d3ce194ad7923ca742213e19dcebdbd9687979d5a594654a5c611e8b829c4019e90a3cfb14e5fd7f8ed91e0fc79eed182399f02a3e3e202d4becaa6730e1f05f99ce06ce16dba7777ccddac72e85f2d3be5ecc9c808ac273f10ceb71cad666166abc327c4061a5f47424a5b6d9d093782f34b49924342a2e8cea663446ed4232a9a415ee2dfde988fa827b06d7438fec20ad0689543c3ee4602ce3ec3806fc7d668ef7e34330edd1e077b329a7627fa3ae5c89308258a17ecefbee114c80c2ab06f8271f14de8f2d13d1d6e5a119b71a6bae88ab151f76cdb2442284bc481d0df7e2163c3acfe763d3968195450d275af9034a00184a30cefed163e636626bffe6a35df3472508a49cb2b9b4c4a95d11c5d17e4e0539e9f13112125515778bcd1c2813c62a02673663062ad60583ec6a02c8a572865829e5b8c767b285728bea4907"; static char ST_HASH_13733[] = "5eb128daef63eff7e6db6aa10a8858f89964f47844acca68df82ebb2e73866fa75e3b7a53f9d2ff1ecdd1f4dc90e9c0fdf51f60d11b1992cd2971b4889edfc8920bbf346fd7693f675b617cb9e4e9a43e6f445021068fc13453b130f2eb1d753ee83ecc61dabec293e88b62110cf6a8fab670e171f6aba2226550b54893263f5fa086b3cc41dd3db2eae07b585e5162c7a0d9723a426d408d83266c4d6018dc1b8b456d28a224033a30bfe62b1e58c2ddf596e07f7ff31849a6f5cfcc1c977b82d8484c270d44ededb0afdb781295e92968fc8cc69766af0ce1e72f02d6b4e124ba4b1af71519dcaade857bb3f371f93a350da6e65ee46c2ac782f134c75c10fe9d653fccc08c614dc362871911af8b83bdfc479f770dfe4b3c86b5d895842c53852fe4912738f848bf7c3e10b8189d25faceab9ef30b6fa0284edaa471752ac2b65335179b8d605417709f64fded7d94383618a921660d4cdb190bbb3769a8e56d2cd1ee07078ebc3b68ebeb016893f7099018e40cb326e32b29a62806eaf1a3fd382f4f876bf721eadfc019c5545813e81fd7168995f743663b136762b07910a63b6eec5b728a4ad07a689cceecb14c2802f334401a0a4fd2ec49e2da7f3cb24d6181f01ceed93ee73dedc3378133c83c9a71155c86785ff20dd5a64323d2fd4bf076bab3c17a1bb45edf81c30a7bd7dbbb097ece0dca83fff9138d56ae668"; static char ST_HASH_13751[] = "b8a19a544414e540172595aef79e6616f504799b40a407edfb69d40534e93f0bdb3187876f0b7a21739b3a9bb02bd4752eac4d2021e65a2a9413cc389964fad46e2cd37f337eb3fe3c75909fe9911609d084fb8c09543f949e738fc2fcfa4825ca5f1e08678e711142553f95b19ba720fa6c8ae5d325be0b36b93c1b2683b0944d2ad4e858c1d83f21a302ef721b9a570233219b9fcf95919fef9ca353af32d7ceb0b3058986c4ed9580b8058325403d45048e43d9e94a1e8fbaa0658f82f81940ea821e1bd526829ee6478a32da4095ab9e7c04dac3b6cc08f99348467a5bf068ba54d0aededdf6005c18ee37e21ee8d980cabe470be49d332661761934f5c07126001c290002587ba4b49982fefaac41b62f7e74ce943bb40a2d78094f734d1bc2aa3dedff43ee2a7b8f3525743c76194637da9ebc2794bac14601e03aa98e9118023a184970b6b8f84f546af88b81e2fde836e286b57cbcbdd7d39334860571a5cc612b77f0c51c741854abeb320bf961aea99b88798199bf826970f2b1b8027499955f68e15328080289d8cf0569057e1ed887f956ce72b14dd13a1f61134e1195d13c68d9c298ae0183107e3a93dd13ee0730f1fabe3935ee70f4c6a1923abb3e0d0c8ecf45260c1444e7e73386acf29d3239d0160e097e6193099e10cc98f61bfda49df6b0635e73a9ccc7bdcc543306b40dd12b91023f61b21418af91"; static char ST_HASH_13752[] = "1c3197f32dc5b72b4d60474a7a43afefb0d2e856a8fc4957c3fb1188b62cb0ca002f585c125bb33c5a5e85a665afae9fce15cb127c2fd9b5ee074a48fd95b3a58364dfd645968187d546443ba234f5cc40e78c4bdcd1e0c6d0a1208dd892442bc1dfe2a45bc4821e843bb6d9f4adf742c48c432daf0d4a51d42cafdfca281f0fab0caabde8005405840383bbfd8dbf227384891ffa501531549e0b9562c2dd77f0e6552d253acb20cbee9a75d17ec283a46006ee89cd53e3b538e054952ae6db7aac9f2f190590e697a2a8e22d080e88c32f4d27b5afe100647da2a5c80cfcb69e5a3db67cb2fcd86d89c1c53fab1bf3a287bb9002d092e75eb1fe6269a1603545dbf97b9d7fcc9485b6400f7b0abaccc31642cefd83f037e7314c6990c51af24ae894cc1c49a09d18f3ad91b3ef37ae5414fef280ec776d9c0bf84b2eb312c8cb0046bedf6f29b4aab30cdb34333f613000a39bf650341cbf33bdd47ba7bd9be8108a1254390b045d82b208d21aa45de7ca399f8e91845b9ffb47d9e6eeb506965622a2e842ec6897277388cbb6ca2a50117e228e84bebd98f9aba40f38dc3bce3b576cb08596836e50ef276ee3a76b8ce76735fd172e9bae284aa83e2677dac56e4624e66604a90e2e3ae704c64a0f27b51ce9e472891bbc212b4a6055e4482b2e6963507f9ffb477224372289fcfee5764a5f4bc7307a509e7c37c69b4857"; static char ST_HASH_13753[] = "f421bdc1087b8319c12d84a680ceab0102e8e41c9ccffe76dbe0215dcfcb7b543f3e1bbedd099e88646823dae5bad8468b72436961ea8e0449a6b92b8bda7b9ba1fe215e997ec3be2ee5eb3b4d47c41d50998df2f883404fb66270f72b5ce666e7d5ca7847c4a8b2762723da1ad088b0ad75c4fd2ccbbfa4e3adf091b6af4f44f5484ce0c89a5b0db0cbe99b3a9d43d7ff6c4ddbc9636cacfedb26b59340c6eb3e8c587db41fc01f10da2974af96531b2bee5f0b9818c3b86a3cac4ba20e08c49be84af65eb40d51626161f4eef187bf5776a89e791f3f5cbcfaa510df201fb2bf35ff03e81d0572af9abbed3cac82681925a3d1954440a6037df78f7a1e63bea81c852571a21fb550f9fe114b82bf7b94290e362cef233186f17396488c0f259c83c50ac4f8cc27d3a134ddc98f14c2fe0dd6e7d6f5eec63848314dc5984979eeb79df326f80ee0e7f671072117903cb72bbbce4f750fca3f008dadf532241e05913704df6ca03edb9641775c3b6e3e328fd078c6d70298512118312cab8316bb6ddc0b860952c621b2bb4cec1b3c7da9b1cb4c494fec382fe85aefdc56570b54845a14651535d261db519be0e860a4e20c30c86cff6f9de6e16b68d09a0e9593d271df2740950e65f1fb16e3fee034183e540e2a3b0f76156f06946b5d1bfc62fe0cab3daa14603a8d21eb03a4d266e965b010c265c9a0e093084d262a8c03"; static char ST_HASH_13800[] = "060a4a94cb2263bcefe74705bd0efe7643d09c2bc25fc69f6a32c1b8d5a5d0d9:4647316184156410832507278642444030512402463246148636510356103432440257733102761444262383653100802140838605535187005586063548643765207865344068042278454875021452355870320020868064506248840047414683714173748364871633802572014845467035357710118327480707136422"; static char ST_HASH_13900[] = "058c1c3773340c8563421e2b17e60eb7c916787e:827500576"; static char ST_HASH_14000[] = "53b325182924b356:1412781058343178"; static char ST_HASH_14100[] = "4c29eea59d8db1e7:7428288455525516"; static char ST_HASH_14400[] = "fcdc7ec700b887e8eaebf94c2ec52aebb5521223:63038426024388230227"; static char ST_HASH_14700[] = "$itunes_backup$*9*ebd7f9b33293b2511f0a4139d5b213feff51476968863cef60ec38d720497b6ff39a0bb63fa9f84e*10000*2202015774208421818002001652122401871832**"; static char ST_HASH_14800[] = "$itunes_backup$*10*17a3b858e79bc273be43a9f113b71efe7ec8e7e401396b350180b4592ef45db67ffef7b2d64329a5*10000*2721336781705041205314422175267631184867*1000*99fafc983e732998adb9fadc162a2e382143f115"; static char ST_HASH_14900[] = "7090b6b9:04223875"; static char ST_HASH_15000[] = "bfa9fe5a404faff8b0d200385e26b783a163e475869336029d3ebaccaf02b5f16e4949279e8a33b942ab647f8f19a83dbe89a6d39dd6d8f84812de7d2e556767:6422386434050716105781561510557063652302782465168686858312232148"; static char ST_HASH_15100[] = "$sha1$20000$75552156$HhYMDdaEHiK3eMIzTldOFPnw.s2Q"; static char ST_HASH_15200[] = "$blockchain$v2$5000$288$324724252428471806184866704068819419467b2b32fd9593fd1a274e0b68bf2c72e5a1f5e748fd319056d1e47ca7b40767136a2d97d7133d14faaeca50986f66cdbc0faec0a3fabbd0ba5d08d5322b6b53da021aacfc439c45bec0e9fe02ad81db82f94e9bd36a7d4d76b505c2339fcd46565d3abab958fbeb1de8bfc53beb96cde8fe44128965477c9ef0762c62bbb1d66532b4888e174ea949db54374a2ed9686a63eb0b5b17ae293f7410bb4ae5106f108314a259c5fd097d558515d79350713412159103a8a174cd384a14f3da45efe18044e1146036000231f6042577d0add98fc959d265368e398dc1550b0bc693e9023cd9d51b40e701bd786e19c3a281a90465aa6ea3f9e756d430164ab2eb43be5b6796d7ac15b2fe99217410f2"; static char ST_HASH_15300[] = "$DPAPImk$1*1*S-15-21-466364039-425773974-453930460-1925*des3*sha1*24000*b038489dee5ad04e3e3cab4d957258b5*208*cb9b5b7d96a0d2a00305ca403d3fd9c47c561e35b4b2cf3aebfd1d3199a6481d56972be7ebd6c291b199e6f1c2ffaee91978706737e9b1209e6c7d3aa3d8c3c3e38ad1ccfa39400d62c2415961c17fd0bd6b0f7bbd49cc1de1a394e64b7237f56244238da8d37d78"; static char ST_HASH_15400[] = "$chacha20$*0400000000000003*35*0200000000000001*3961626364656667*8a152c57a7a856a8"; static char ST_HASH_15500[] = "$jksprivk$*338BD2FBEBA7B3EF198A4CBFC6E18AFF1E229367*5225850113575146134463704406336350011656*D5253EB151EB92DC73E542D8C0A4D7A848A5B0C0E370E625E6547D4E6F23416FC85A27BC295731B8021CDFBD003551C66C434FFBC87DACAD1FDF39022320034A2F86E779F2B1B3325428A666518FA89507AD63E15FD9C57B9E36EF5B642A2F448A9A3F09B79AD93D65F46B8692CD07539FD140146F8F219DC262971AF019E18EDC16C3C240569E1673F4D98BC818CCF28298D5A7BFF038A663DD10FE5E48643C3217C237D342164E2D41EF15075431FBD5B34800E5AE7EB80FAA5AE9982A55F35379AA7B31217E7F1C5F1964A15024A305AE4B3981FE1C80C163BC38ECA5581F11867E5C34C5D124D0367B3737E5E5BB14D2CAB26A698C8DAAB755C82BA6B823BCAECDD4A89C831651ACE5A6029FD0D3515C5D1D53AD8B9062CE8C445373862035CBBF60D490CA2E4975EE6E0358EC32E871FAB15347E3032E21F30F543BAAB01D779BA833CA0B8C7591B42C7C59A8FDD46D7DECEC0E91ADBF331177605E7830ABED62FAD7D5D806D8EFD01C38765940B7F97168FC72C39BF4C98F944FFC310CA8F4EB1D0F960F352CC5E2BB23A1EB221072A5471EDA2CE81C04595B8D37088CFB5C14F6A4A881AD12125DEFBB8154EB4C130AB7FD9933FD36DF1A6A26B51AB169866788678FCED988C8E017CA84354F487A5508210181AFB8B3AD0753E3E28BE674DFBD4E4FBDFD1E30D592F4EA3A77A2F0F5CF9A175DBC590EF5D42971A39918F12B92DCD8BFD56BE9A3459856B5587603C7B53062663A4C8894BBC9894FB1663BF30F32D907664328138B7A50EAC7F8E3183D74562A5C90FE1889AC4C5FE43EBEB8974563B6682F92591ECA4FA0DA72236C3851DA102DB6BA0CC07BFD32F7E962AB0EDCF4A8DEA6525174F5BB5C021E2A9A3F7F761E9CA90B6E27FB7E55CD91DA184FAC5E534E8AD25314C56CE5796506A0CA70881782F9C5147D87705065D68BD67D2B0344205BA6445D562273690004CA5A303274FB283A75F49BA968D7947943AA98F2AF9CB8253B425B86225E7395A331AC4CB1B1700C64D4F458D5D642C54148AE6DA41D9E26657D331B157D76042C2CF3057B83997C23D8BF68FB3C7337CAFB8B324AD0DF7A80B554B4D7F9AD6ED527E7932F1741A573C152A41610F6517E3F4A3BC6B66685871A7CE3795C559BD47CDB8E34CB2C1DFE980518D79E2078C258C54F312EB38609F640E7DC013E0F2A16A25BB5971882B4308D27930CA99FEC231AE927B62215A1B56098C362B7F20593953B29428681875070E84BF5B60BEA3948127151634123DA77C814AAD54CE10905763C8C19BC191C0C40458C809402E1957C4C05C4EAE27576B2D30593F7FDCC9A248DB5DB23CF2FA22A92C016090F611690BF0AB5B8B2866ED25F345EFE85DF3311C9E91C37CEE709CF16E7CB09D01BECD2961D094C02D42EC85BF47FAB1B67A13B9A1741C15F7156D57A71BFFABB03B71E69707913A5C136B3D69CE3F71ABFE376F0A21D723FFA2E60AC180689D3E8AF4348C9F555CD897387327FC8BA2B9C51A7298547E556A11A60441EF5331A1BFB847A3D23DD9F7C50E636A2C6309BC82E1A8852F5A8569B6D93*14*78D6A2424484CF5149932B7EA8BF*test"; static char ST_HASH_15600[] = "$ethereum$p*1024*38353131353831333338313138363430*a8b4dfe92687dbc0afeb5dae7863f18964241e96b264f09959903c8c924583fc*0a9252861d1e235994ce33dbca91c98231764d8ecb4950015a8ae20d6415b986"; static char ST_HASH_15700[] = "$ethereum$s*1024*1*1*3033363133373132373638333437323331383637383437333631373038323434*69eaf081695cf971ef7ee5a49997c1a3922e7efef59068109e83853755ee31c3*64a1adec1750ee4416b22b81111dd2a3c2fede820d6da8bf788dca2641d5b181"; static char ST_HASH_15900[] = "$DPAPImk$2*1*S-15-21-439882973-489230393-482956683-1522*aes256*sha512*12900*79f7ca399f2626e21aad108c3922af7c*288*c47bc8a985ca6aa708b01c97b004bff20cc52379dc2635b4acf59ce17970a2cb47ace98c7e8de977f265243c5c03d0a97e4b954b494d9e38d9158d0c1e729d16a28ba69e2e7c6c3bc0e3afc9c9b6306b83372ccb35d89b98925728fd36315b8ee95b4d4eccdcb31564769f9a4b9ee10828184e16d4af336675d5e31d987dd87233d34fbbb98880c5e1f64cbb9b043ad8"; static char ST_HASH_99999[] = "hashcat"; static const char OPTI_STR_OPTIMIZED_KERNEL[] = "Optimized-Kernel"; static const char OPTI_STR_ZERO_BYTE[] = "Zero-Byte"; static const char OPTI_STR_PRECOMPUTE_INIT[] = "Precompute-Init"; static const char OPTI_STR_PRECOMPUTE_MERKLE[] = "Precompute-Merkle-Demgard"; static const char OPTI_STR_PRECOMPUTE_PERMUT[] = "Precompute-Final-Permutation"; static const char OPTI_STR_MEET_IN_MIDDLE[] = "Meet-In-The-Middle"; static const char OPTI_STR_EARLY_SKIP[] = "Early-Skip"; static const char OPTI_STR_NOT_SALTED[] = "Not-Salted"; static const char OPTI_STR_NOT_ITERATED[] = "Not-Iterated"; static const char OPTI_STR_PREPENDED_SALT[] = "Prepended-Salt"; static const char OPTI_STR_APPENDED_SALT[] = "Appended-Salt"; static const char OPTI_STR_SINGLE_HASH[] = "Single-Hash"; static const char OPTI_STR_SINGLE_SALT[] = "Single-Salt"; static const char OPTI_STR_BRUTE_FORCE[] = "Brute-Force"; static const char OPTI_STR_RAW_HASH[] = "Raw-Hash"; static const char OPTI_STR_SLOW_HASH_SIMD_INIT[] = "Slow-Hash-SIMD-INIT"; static const char OPTI_STR_SLOW_HASH_SIMD_LOOP[] = "Slow-Hash-SIMD-LOOP"; static const char OPTI_STR_SLOW_HASH_SIMD_COMP[] = "Slow-Hash-SIMD-COMP"; static const char OPTI_STR_USES_BITS_8[] = "Uses-8-Bit"; static const char OPTI_STR_USES_BITS_16[] = "Uses-16-Bit"; static const char OPTI_STR_USES_BITS_32[] = "Uses-32-Bit"; static const char OPTI_STR_USES_BITS_64[] = "Uses-64-Bit"; static const char PA_000[] = "OK"; static const char PA_001[] = "Ignored due to comment"; static const char PA_002[] = "Ignored due to zero length"; static const char PA_003[] = "Line-length exception"; static const char PA_004[] = "Hash-length exception"; static const char PA_005[] = "Hash-value exception"; static const char PA_006[] = "Salt-length exception"; static const char PA_007[] = "Salt-value exception"; static const char PA_008[] = "Salt-iteration count exception"; static const char PA_009[] = "Separator unmatched"; static const char PA_010[] = "Signature unmatched"; static const char PA_011[] = "Invalid hccapx file size"; static const char PA_012[] = "Invalid hccapx eapol size"; static const char PA_013[] = "Invalid psafe2 filesize"; static const char PA_014[] = "Invalid psafe3 filesize"; static const char PA_015[] = "Invalid truecrypt filesize"; static const char PA_016[] = "Invalid veracrypt filesize"; static const char PA_017[] = "Invalid SIP directive, only MD5 is supported"; static const char PA_018[] = "Hash-file exception"; static const char PA_019[] = "Hash-encoding exception"; static const char PA_020[] = "Salt-encoding exception"; static const char PA_021[] = "Invalid LUKS filesize"; static const char PA_022[] = "Invalid LUKS identifier"; static const char PA_023[] = "Invalid LUKS version"; static const char PA_024[] = "Invalid or unsupported LUKS cipher type"; static const char PA_025[] = "Invalid or unsupported LUKS cipher mode"; static const char PA_026[] = "Invalid or unsupported LUKS hash type"; static const char PA_027[] = "Invalid LUKS key size"; static const char PA_028[] = "Disabled LUKS key detected"; static const char PA_029[] = "Invalid LUKS key AF stripes count"; static const char PA_030[] = "Invalid combination of LUKS hash type and cipher type"; static const char PA_031[] = "Invalid hccapx signature"; static const char PA_032[] = "Invalid hccapx version"; static const char PA_033[] = "Invalid hccapx message pair"; static const char PA_255[] = "Unknown error"; static const char HT_00000[] = "MD5"; static const char HT_00010[] = "md5($pass.$salt)"; static const char HT_00020[] = "md5($salt.$pass)"; static const char HT_00030[] = "md5(utf16le($pass).$salt)"; static const char HT_00040[] = "md5($salt.utf16le($pass))"; static const char HT_00050[] = "HMAC-MD5 (key = $pass)"; static const char HT_00060[] = "HMAC-MD5 (key = $salt)"; static const char HT_00100[] = "SHA1"; static const char HT_00110[] = "sha1($pass.$salt)"; static const char HT_00120[] = "sha1($salt.$pass)"; static const char HT_00130[] = "sha1(utf16le($pass).$salt)"; static const char HT_00140[] = "sha1($salt.utf16le($pass))"; static const char HT_00150[] = "HMAC-SHA1 (key = $pass)"; static const char HT_00160[] = "HMAC-SHA1 (key = $salt)"; static const char HT_00200[] = "MySQL323"; static const char HT_00300[] = "MySQL4.1/MySQL5"; static const char HT_00400[] = "phpass, WordPress (MD5), phpBB3 (MD5), Joomla (MD5)"; static const char HT_00500[] = "md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5)"; static const char HT_00501[] = "Juniper IVE"; static const char HT_00600[] = "BLAKE2b"; static const char HT_00900[] = "MD4"; static const char HT_01000[] = "NTLM"; static const char HT_01100[] = "Domain Cached Credentials (DCC), MS Cache"; static const char HT_01300[] = "SHA-224"; static const char HT_01400[] = "SHA-256"; static const char HT_01410[] = "sha256($pass.$salt)"; static const char HT_01420[] = "sha256($salt.$pass)"; static const char HT_01430[] = "sha256(utf16le($pass).$salt)"; static const char HT_01440[] = "sha256($salt.utf16le($pass))"; static const char HT_01450[] = "HMAC-SHA256 (key = $pass)"; static const char HT_01460[] = "HMAC-SHA256 (key = $salt)"; static const char HT_01500[] = "descrypt, DES (Unix), Traditional DES"; static const char HT_01600[] = "Apache $apr1$ MD5, md5apr1, MD5 (APR)"; static const char HT_01700[] = "SHA-512"; static const char HT_01710[] = "sha512($pass.$salt)"; static const char HT_01720[] = "sha512($salt.$pass)"; static const char HT_01730[] = "sha512(utf16le($pass).$salt)"; static const char HT_01740[] = "sha512($salt.utf16le($pass))"; static const char HT_01750[] = "HMAC-SHA512 (key = $pass)"; static const char HT_01760[] = "HMAC-SHA512 (key = $salt)"; static const char HT_01800[] = "sha512crypt $6$, SHA512 (Unix)"; static const char HT_02100[] = "Domain Cached Credentials 2 (DCC2), MS Cache 2"; static const char HT_02400[] = "Cisco-PIX MD5"; static const char HT_02410[] = "Cisco-ASA MD5"; static const char HT_02500[] = "WPA/WPA2"; static const char HT_02501[] = "WPA/WPA2 PMK"; static const char HT_02600[] = "md5(md5($pass))"; static const char HT_03000[] = "LM"; static const char HT_03100[] = "Oracle H: Type (Oracle 7+)"; static const char HT_03200[] = "bcrypt $2*$, Blowfish (Unix)"; static const char HT_03710[] = "md5($salt.md5($pass))"; static const char HT_03711[] = "MediaWiki B type"; static const char HT_03800[] = "md5($salt.$pass.$salt)"; static const char HT_03910[] = "md5(md5($pass).md5($salt))"; static const char HT_04010[] = "md5($salt.md5($salt.$pass))"; static const char HT_04110[] = "md5($salt.md5($pass.$salt))"; static const char HT_04300[] = "md5(strtoupper(md5($pass)))"; static const char HT_04400[] = "md5(sha1($pass))"; static const char HT_04500[] = "sha1(sha1($pass))"; static const char HT_04520[] = "sha1($salt.sha1($pass))"; static const char HT_04700[] = "sha1(md5($pass))"; static const char HT_04800[] = "iSCSI CHAP authentication, MD5(CHAP)"; static const char HT_04900[] = "sha1($salt.$pass.$salt)"; static const char HT_05000[] = "SHA-3 (Keccak)"; static const char HT_05100[] = "Half MD5"; static const char HT_05200[] = "Password Safe v3"; static const char HT_05300[] = "IKE-PSK MD5"; static const char HT_05400[] = "IKE-PSK SHA1"; static const char HT_05500[] = "NetNTLMv1 / NetNTLMv1+ESS"; static const char HT_05600[] = "NetNTLMv2"; static const char HT_05700[] = "Cisco-IOS type 4 (SHA256)"; static const char HT_05800[] = "Samsung Android Password/PIN"; static const char HT_06000[] = "RIPEMD-160"; static const char HT_06100[] = "Whirlpool"; static const char HT_06300[] = "AIX {smd5}"; static const char HT_06400[] = "AIX {ssha256}"; static const char HT_06500[] = "AIX {ssha512}"; static const char HT_06600[] = "1Password, agilekeychain"; static const char HT_06700[] = "AIX {ssha1}"; static const char HT_06800[] = "LastPass + LastPass sniffed"; static const char HT_06900[] = "GOST R 34.11-94"; static const char HT_07000[] = "FortiGate (FortiOS)"; static const char HT_07100[] = "macOS v10.8+ (PBKDF2-SHA512)"; static const char HT_07200[] = "GRUB 2"; static const char HT_07300[] = "IPMI2 RAKP HMAC-SHA1"; static const char HT_07400[] = "sha256crypt $5$, SHA256 (Unix)"; static const char HT_07500[] = "Kerberos 5 AS-REQ Pre-Auth etype 23"; static const char HT_07700[] = "SAP CODVN B (BCODE)"; static const char HT_07800[] = "SAP CODVN F/G (PASSCODE)"; static const char HT_07900[] = "Drupal7"; static const char HT_08000[] = "Sybase ASE"; static const char HT_08100[] = "Citrix NetScaler"; static const char HT_08200[] = "1Password, cloudkeychain"; static const char HT_08300[] = "DNSSEC (NSEC3)"; static const char HT_08400[] = "WBB3 (Woltlab Burning Board)"; static const char HT_08500[] = "RACF"; static const char HT_08600[] = "Lotus Notes/Domino 5"; static const char HT_08700[] = "Lotus Notes/Domino 6"; static const char HT_08800[] = "Android FDE <= 4.3"; static const char HT_08900[] = "scrypt"; static const char HT_09000[] = "Password Safe v2"; static const char HT_09100[] = "Lotus Notes/Domino 8"; static const char HT_09200[] = "Cisco-IOS $8$ (PBKDF2-SHA256)"; static const char HT_09300[] = "Cisco-IOS $9$ (scrypt)"; static const char HT_09400[] = "MS Office 2007"; static const char HT_09500[] = "MS Office 2010"; static const char HT_09600[] = "MS Office 2013"; static const char HT_09700[] = "MS Office <= 2003 $0/$1, MD5 + RC4"; static const char HT_09710[] = "MS Office <= 2003 $0/$1, MD5 + RC4, collider #1"; static const char HT_09720[] = "MS Office <= 2003 $0/$1, MD5 + RC4, collider #2"; static const char HT_09800[] = "MS Office <= 2003 $3/$4, SHA1 + RC4"; static const char HT_09810[] = "MS Office <= 2003 $3, SHA1 + RC4, collider #1"; static const char HT_09820[] = "MS Office <= 2003 $3, SHA1 + RC4, collider #2"; static const char HT_09900[] = "Radmin2"; static const char HT_10000[] = "Django (PBKDF2-SHA256)"; static const char HT_10100[] = "SipHash"; static const char HT_10200[] = "CRAM-MD5"; static const char HT_10300[] = "SAP CODVN H (PWDSALTEDHASH) iSSHA-1"; static const char HT_10400[] = "PDF 1.1 - 1.3 (Acrobat 2 - 4)"; static const char HT_10410[] = "PDF 1.1 - 1.3 (Acrobat 2 - 4), collider #1"; static const char HT_10420[] = "PDF 1.1 - 1.3 (Acrobat 2 - 4), collider #2"; static const char HT_10500[] = "PDF 1.4 - 1.6 (Acrobat 5 - 8)"; static const char HT_10600[] = "PDF 1.7 Level 3 (Acrobat 9)"; static const char HT_10700[] = "PDF 1.7 Level 8 (Acrobat 10 - 11)"; static const char HT_10800[] = "SHA-384"; static const char HT_10900[] = "PBKDF2-HMAC-SHA256"; static const char HT_11000[] = "PrestaShop"; static const char HT_11100[] = "PostgreSQL CRAM (MD5)"; static const char HT_11200[] = "MySQL CRAM (SHA1)"; static const char HT_11300[] = "Bitcoin/Litecoin wallet.dat"; static const char HT_11400[] = "SIP digest authentication (MD5)"; static const char HT_11500[] = "CRC32"; static const char HT_11600[] = "7-Zip"; static const char HT_11700[] = "GOST R 34.11-2012 (Streebog) 256-bit"; static const char HT_11800[] = "GOST R 34.11-2012 (Streebog) 512-bit"; static const char HT_11900[] = "PBKDF2-HMAC-MD5"; static const char HT_12000[] = "PBKDF2-HMAC-SHA1"; static const char HT_12100[] = "PBKDF2-HMAC-SHA512"; static const char HT_12200[] = "eCryptfs"; static const char HT_12300[] = "Oracle T: Type (Oracle 12+)"; static const char HT_12400[] = "BSDi Crypt, Extended DES"; static const char HT_12500[] = "RAR3-hp"; static const char HT_12600[] = "ColdFusion 10+"; static const char HT_12700[] = "Blockchain, My Wallet"; static const char HT_12800[] = "MS-AzureSync PBKDF2-HMAC-SHA256"; static const char HT_12900[] = "Android FDE (Samsung DEK)"; static const char HT_13000[] = "RAR5"; static const char HT_13100[] = "Kerberos 5 TGS-REP etype 23"; static const char HT_13200[] = "AxCrypt"; static const char HT_13300[] = "AxCrypt in-memory SHA1"; static const char HT_13400[] = "KeePass 1 (AES/Twofish) and KeePass 2 (AES)"; static const char HT_13500[] = "PeopleSoft PS_TOKEN"; static const char HT_13600[] = "WinZip"; static const char HT_13800[] = "Windows Phone 8+ PIN/password"; static const char HT_13900[] = "OpenCart"; static const char HT_14000[] = "DES (PT = $salt, key = $pass)"; static const char HT_14100[] = "3DES (PT = $salt, key = $pass)"; static const char HT_14400[] = "sha1(CX)"; static const char HT_14600[] = "LUKS"; static const char HT_14700[] = "iTunes backup < 10.0"; static const char HT_14800[] = "iTunes backup >= 10.0"; static const char HT_14900[] = "Skip32 (PT = $salt, key = $pass)"; static const char HT_15000[] = "FileZilla Server >= 0.9.55"; static const char HT_15100[] = "Juniper/NetBSD sha1crypt"; static const char HT_15200[] = "Blockchain, My Wallet, V2"; static const char HT_15300[] = "DPAPI masterkey file v1"; static const char HT_15400[] = "ChaCha20"; static const char HT_15500[] = "JKS Java Key Store Private Keys (SHA1)"; static const char HT_15600[] = "Ethereum Wallet, PBKDF2-HMAC-SHA256"; static const char HT_15700[] = "Ethereum Wallet, SCRYPT"; static const char HT_15900[] = "DPAPI masterkey file v2"; static const char HT_99999[] = "Plaintext"; static const char HT_00011[] = "Joomla < 2.5.18"; static const char HT_00012[] = "PostgreSQL"; static const char HT_00021[] = "osCommerce, xt:Commerce"; static const char HT_00022[] = "Juniper NetScreen/SSG (ScreenOS)"; static const char HT_00023[] = "Skype"; static const char HT_00101[] = "nsldap, SHA-1(Base64), Netscape LDAP SHA"; static const char HT_00111[] = "nsldaps, SSHA-1(Base64), Netscape LDAP SSHA"; static const char HT_00112[] = "Oracle S: Type (Oracle 11+)"; static const char HT_00121[] = "SMF (Simple Machines Forum) > v1.1"; static const char HT_00122[] = "macOS v10.4, macOS v10.5, MacOS v10.6"; static const char HT_00124[] = "Django (SHA-1)"; static const char HT_00125[] = "ArubaOS"; static const char HT_00131[] = "MSSQL (2000)"; static const char HT_00132[] = "MSSQL (2005)"; static const char HT_00133[] = "PeopleSoft"; static const char HT_00141[] = "Episerver 6.x < .NET 4"; static const char HT_01411[] = "SSHA-256(Base64), LDAP {SSHA256}"; static const char HT_01421[] = "hMailServer"; static const char HT_01441[] = "Episerver 6.x >= .NET 4"; static const char HT_01711[] = "SSHA-512(Base64), LDAP {SSHA512}"; static const char HT_01722[] = "macOS v10.7"; static const char HT_01731[] = "MSSQL (2012, 2014)"; static const char HT_02611[] = "vBulletin < v3.8.5"; static const char HT_02612[] = "PHPS"; static const char HT_02711[] = "vBulletin >= v3.8.5"; static const char HT_02811[] = "IPB2+ (Invision Power Board), MyBB 1.2+"; static const char HT_04521[] = "Redmine"; static const char HT_04522[] = "PunBB"; static const char HT_06211[] = "TrueCrypt PBKDF2-HMAC-RIPEMD160 + XTS 512 bit"; static const char HT_06212[] = "TrueCrypt PBKDF2-HMAC-RIPEMD160 + XTS 1024 bit"; static const char HT_06213[] = "TrueCrypt PBKDF2-HMAC-RIPEMD160 + XTS 1536 bit"; static const char HT_06221[] = "TrueCrypt PBKDF2-HMAC-SHA512 + XTS 512 bit"; static const char HT_06222[] = "TrueCrypt PBKDF2-HMAC-SHA512 + XTS 1024 bit"; static const char HT_06223[] = "TrueCrypt PBKDF2-HMAC-SHA512 + XTS 1536 bit"; static const char HT_06231[] = "TrueCrypt PBKDF2-HMAC-Whirlpool + XTS 512 bit"; static const char HT_06232[] = "TrueCrypt PBKDF2-HMAC-Whirlpool + XTS 1024 bit"; static const char HT_06233[] = "TrueCrypt PBKDF2-HMAC-Whirlpool + XTS 1536 bit"; static const char HT_06241[] = "TrueCrypt PBKDF2-HMAC-RIPEMD160 + XTS 512 bit + boot-mode"; static const char HT_06242[] = "TrueCrypt PBKDF2-HMAC-RIPEMD160 + XTS 1024 bit + boot-mode"; static const char HT_06243[] = "TrueCrypt PBKDF2-HMAC-RIPEMD160 + XTS 1536 bit + boot-mode"; static const char HT_13711[] = "VeraCrypt PBKDF2-HMAC-RIPEMD160 + XTS 512 bit"; static const char HT_13712[] = "VeraCrypt PBKDF2-HMAC-RIPEMD160 + XTS 1024 bit"; static const char HT_13713[] = "VeraCrypt PBKDF2-HMAC-RIPEMD160 + XTS 1536 bit"; static const char HT_13721[] = "VeraCrypt PBKDF2-HMAC-SHA512 + XTS 512 bit"; static const char HT_13722[] = "VeraCrypt PBKDF2-HMAC-SHA512 + XTS 1024 bit"; static const char HT_13723[] = "VeraCrypt PBKDF2-HMAC-SHA512 + XTS 1536 bit"; static const char HT_13731[] = "VeraCrypt PBKDF2-HMAC-Whirlpool + XTS 512 bit"; static const char HT_13732[] = "VeraCrypt PBKDF2-HMAC-Whirlpool + XTS 1024 bit"; static const char HT_13733[] = "VeraCrypt PBKDF2-HMAC-Whirlpool + XTS 1536 bit"; static const char HT_13741[] = "VeraCrypt PBKDF2-HMAC-RIPEMD160 + XTS 512 bit + boot-mode"; static const char HT_13742[] = "VeraCrypt PBKDF2-HMAC-RIPEMD160 + XTS 1024 bit + boot-mode"; static const char HT_13743[] = "VeraCrypt PBKDF2-HMAC-RIPEMD160 + XTS 1536 bit + boot-mode"; static const char HT_13751[] = "VeraCrypt PBKDF2-HMAC-SHA256 + XTS 512 bit"; static const char HT_13752[] = "VeraCrypt PBKDF2-HMAC-SHA256 + XTS 1024 bit"; static const char HT_13753[] = "VeraCrypt PBKDF2-HMAC-SHA256 + XTS 1536 bit"; static const char HT_13761[] = "VeraCrypt PBKDF2-HMAC-SHA256 + XTS 512 bit + boot-mode"; static const char HT_13762[] = "VeraCrypt PBKDF2-HMAC-SHA256 + XTS 1024 bit + boot-mode"; static const char HT_13763[] = "VeraCrypt PBKDF2-HMAC-SHA256 + XTS 1536 bit + boot-mode"; static const char HT_12001[] = "Atlassian (PBKDF2-HMAC-SHA1)"; static const char SIGNATURE_ANDROIDFDE[] = "$fde$"; static const char SIGNATURE_AXCRYPT[] = "$axcrypt$*1"; static const char SIGNATURE_AXCRYPT_SHA1[] = "$axcrypt_sha1"; static const char SIGNATURE_BCRYPT1[] = "$2a$"; static const char SIGNATURE_BCRYPT2[] = "$2b$"; static const char SIGNATURE_BCRYPT3[] = "$2x$"; static const char SIGNATURE_BCRYPT4[] = "$2y$"; static const char SIGNATURE_BITCOIN_WALLET[] = "$bitcoin$"; static const char SIGNATURE_BSDICRYPT[] = "_"; static const char SIGNATURE_CISCO8[] = "$8$"; static const char SIGNATURE_CISCO9[] = "$9$"; static const char SIGNATURE_CRAM_MD5[] = "$cram_md5$"; static const char SIGNATURE_DCC2[] = "$DCC2$"; static const char SIGNATURE_DJANGOPBKDF2[] = "pbkdf2_sha256$"; static const char SIGNATURE_DJANGOSHA1[] = "sha1$"; static const char SIGNATURE_DPAPIMK[] = "$DPAPImk$"; static const char SIGNATURE_DRUPAL7[] = "$S$"; static const char SIGNATURE_ECRYPTFS[] = "$ecryptfs$"; static const char SIGNATURE_EPISERVER4[] = "$episerver$*1*"; static const char SIGNATURE_EPISERVER[] = "$episerver$*0*"; static const char SIGNATURE_KEEPASS[] = "$keepass$"; static const char SIGNATURE_KRB5PA[] = "$krb5pa$23"; static const char SIGNATURE_KRB5TGS[] = "$krb5tgs$23"; static const char SIGNATURE_MD5AIX[] = "{smd5}"; static const char SIGNATURE_MD5APR1[] = "$apr1$"; static const char SIGNATURE_MD5CRYPT[] = "$1$"; static const char SIGNATURE_MEDIAWIKI_B[] = "$B$"; static const char SIGNATURE_MS_DRSR[] = "v1;PPH1_MD4"; static const char SIGNATURE_MSSQL[] = "0x0100"; static const char SIGNATURE_MSSQL2012[] = "0x0200"; static const char SIGNATURE_MYSQL_AUTH[] = "$mysqlna$"; static const char SIGNATURE_MYWALLET[] = "$blockchain$"; static const char SIGNATURE_MYWALLETV2[] = "$blockchain$v2$"; static const char SIGNATURE_NETSCALER[] = "1"; static const char SIGNATURE_OFFICE2007[] = "$office$"; static const char SIGNATURE_OFFICE2010[] = "$office$"; static const char SIGNATURE_OFFICE2013[] = "$office$"; static const char SIGNATURE_OLDOFFICE0[] = "$oldoffice$0"; static const char SIGNATURE_OLDOFFICE1[] = "$oldoffice$1"; static const char SIGNATURE_OLDOFFICE3[] = "$oldoffice$3"; static const char SIGNATURE_OLDOFFICE4[] = "$oldoffice$4"; static const char SIGNATURE_PBKDF2_MD5[] = "md5:"; static const char SIGNATURE_PBKDF2_SHA1[] = "sha1:"; static const char SIGNATURE_PBKDF2_SHA256[] = "sha256:"; static const char SIGNATURE_PBKDF2_SHA512[] = "sha512:"; static const char SIGNATURE_PDF[] = "$pdf$"; static const char SIGNATURE_PHPASS1[] = "$P$"; static const char SIGNATURE_PHPASS2[] = "$H$"; static const char SIGNATURE_PHPS[] = "$PHPS$"; static const char SIGNATURE_POSTGRESQL_AUTH[] = "$postgres$"; static const char SIGNATURE_PSAFE3[] = "PWS3"; static const char SIGNATURE_RACF[] = "$racf$"; static const char SIGNATURE_RAR3[] = "$RAR3$"; static const char SIGNATURE_RAR5[] = "$rar5$"; static const char SIGNATURE_SAPH_SHA1[] = "{x-issha, "; static const char SIGNATURE_SCRYPT[] = "SCRYPT"; static const char SIGNATURE_SEVEN_ZIP[] = "$7z$"; static const char SIGNATURE_SHA1AIX[] = "{ssha1}"; static const char SIGNATURE_SHA1B64[] = "{SHA}"; static const char SIGNATURE_SHA256AIX[] = "{ssha256}"; static const char SIGNATURE_SHA256B64S[] = "{SSHA256}"; static const char SIGNATURE_SHA256CRYPT[] = "$5$"; static const char SIGNATURE_SHA512AIX[] = "{ssha512}"; static const char SIGNATURE_SHA512B64S[] = "{SSHA512}"; static const char SIGNATURE_SHA512CRYPT[] = "$6$"; static const char SIGNATURE_SHA512GRUB[] = "grub.pbkdf2.sha512."; static const char SIGNATURE_SHA512MACOS[] = "$ml$"; static const char SIGNATURE_SIP_AUTH[] = "$sip$*"; static const char SIGNATURE_SSHA1B64_lower[] = "{ssha}"; static const char SIGNATURE_SSHA1B64_upper[] = "{SSHA}"; static const char SIGNATURE_SYBASEASE[] = "0xc007"; static const char SIGNATURE_ZIP2_START[] = "$zip2$"; static const char SIGNATURE_ZIP2_STOP[] = "$/zip2$"; static const char SIGNATURE_ITUNES_BACKUP[] = "$itunes_backup$"; static const char SIGNATURE_FORTIGATE[] = "AK1"; static const char SIGNATURE_ATLASSIAN[] = "{PKCS5S2}"; static const char SIGNATURE_NETBSD_SHA1CRYPT[] = "$sha1$"; static const char SIGNATURE_BLAKE2B[] = "$BLAKE2$"; static const char SIGNATURE_CHACHA20[] = "$chacha20$"; static const char SIGNATURE_JKS_SHA1[] = "$jksprivk$"; static const char SIGNATURE_ETHEREUM_PBKDF2[] = "$ethereum$p"; static const char SIGNATURE_ETHEREUM_SCRYPT[] = "$ethereum$s"; /** * decoder / encoder */ static void juniper_decrypt_hash (u8 *in, u8 *out) { // base64 decode u8 base64_buf[100] = { 0 }; base64_decode (base64_to_int, (const u8 *) in, DISPLAY_LEN_MIN_501, base64_buf); // iv stuff u32 juniper_iv[4] = { 0 }; memcpy (juniper_iv, base64_buf, 12); memcpy (out, juniper_iv, 12); // reversed key u32 juniper_key[4] = { 0 }; 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 u32 *in_ptr = (u32 *) (base64_buf + 12); u32 *out_ptr = (u32 *) (out + 12); AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr); } static void phpass_decode (u8 digest[16], u8 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; } static void phpass_encode (const u8 digest[16], u8 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); } static void md5crypt_decode (u8 digest[16], u8 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; } static void md5crypt_encode (const u8 digest[16], u8 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; } static void sha512crypt_decode (u8 digest[64], u8 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; } static void sha512crypt_encode (const u8 digest[64], u8 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 = (digest[63] << 0); buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6; buf[85] = int_to_itoa64 (l & 0x3f); //l >>= 6; } static void sha1aix_decode (u8 digest[20], u8 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; } static void sha1aix_encode (const u8 digest[20], u8 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); } static void sha256aix_decode (u8 digest[32], u8 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; } static void sha256aix_encode (const u8 digest[32], u8 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); //l >>= 6; } static void sha512aix_decode (u8 digest[64], u8 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; } static void sha512aix_encode (const u8 digest[64], u8 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 = (digest[63] << 16); buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6; buf[85] = int_to_itoa64 (l & 0x3f); //l >>= 6; } static void netbsd_sha1crypt_decode (u8 digest[20], u8 buf[28], u8 *additional_byte) { 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; additional_byte[0] = (l >> 0) & 0xff; digest[19] = (l >> 8) & 0xff; digest[18] = (l >> 16) & 0xff; } static void netbsd_sha1crypt_encode (const u8 digest[20], u8 additional_byte, u8 buf[30]) { 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 = (additional_byte << 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); buf[28] = 0; } static void sha256crypt_decode (u8 digest[32], u8 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; } static void sha256crypt_encode (const u8 digest[32], u8 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); //l >>= 6; } static void drupal7_decode (u8 digest[64], u8 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; } static void drupal7_encode (const u8 digest[64], u8 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); } /** * parser */ static u32 parse_and_store_salt (u8 *out, u8 *in, u32 salt_len, MAYBE_UNUSED const hashconfig_t *hashconfig) { if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) { if (salt_len < (hashconfig->salt_min * 2)) return UINT_MAX; if (salt_len > (hashconfig->salt_max * 2)) return UINT_MAX; } else { if (salt_len < hashconfig->salt_min) return UINT_MAX; if (salt_len > hashconfig->salt_max) return UINT_MAX; } u32 tmp_u32[(64 * 2) + 1] = { 0 }; u8 *tmp = (u8 *) tmp_u32; if (salt_len > sizeof (tmp_u32)) { return UINT_MAX; } memset (tmp, 0, sizeof (tmp_u32)); memcpy (tmp, in, salt_len); if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) { if ((salt_len % 2) == 0) { u32 new_salt_len = salt_len / 2; for (u32 i = 0, j = 0; i < new_salt_len; i += 1, j += 2) { u8 p0 = tmp[j + 0]; u8 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 (hashconfig->opts_type & OPTS_TYPE_ST_BASE64) { salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, tmp); } if (hashconfig->opts_type & OPTS_TYPE_ST_UTF16LE) { if (salt_len <= 128) { for (int i = 64 - 1; i >= 1; i -= 2) { const u32 v = tmp_u32[i / 2]; tmp_u32[i - 0] = ((v >> 8) & 0x00FF0000) | ((v >> 16) & 0x000000FF); tmp_u32[i - 1] = ((v << 8) & 0x00FF0000) | ((v >> 0) & 0x000000FF); } salt_len = salt_len * 2; } else { return UINT_MAX; } } if (hashconfig->opts_type & OPTS_TYPE_ST_LOWER) { lowercase (tmp, salt_len); } if (hashconfig->opts_type & OPTS_TYPE_ST_UPPER) { uppercase (tmp, salt_len); } u32 len = salt_len; if (hashconfig->opts_type & OPTS_TYPE_ST_ADD80) { if (len >= 256) return UINT_MAX; tmp[len++] = 0x80; } if (hashconfig->opts_type & OPTS_TYPE_ST_ADD01) { if (len >= 256) return UINT_MAX; tmp[len++] = 0x01; } if (hashconfig->opts_type & OPTS_TYPE_ST_GENERATE_LE) { u32 max = len / 4; if (len % 4) max++; for (u32 i = 0; i < max; i++) { tmp_u32[i] = byte_swap_32 (tmp_u32[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); } static void precompute_salt_md5 (u8 *salt, u32 salt_len, u8 *salt_pc) { u32 salt_pc_block[16] = { 0 }; u8 *salt_pc_block_ptr = (u8 *) salt_pc_block; memcpy (salt_pc_block_ptr, salt, salt_len); salt_pc_block_ptr[salt_len] = 0x80; salt_pc_block[14] = salt_len * 8; u32 salt_pc_digest[4] = { MD5M_A, MD5M_B, MD5M_C, MD5M_D }; md5_64 (salt_pc_block, salt_pc_digest); u8 *salt_buf_pc_ptr = salt_pc; u32_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0); u32_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8); u32_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16); u32_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24); } int bcrypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH); if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4) != 0) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4) != 0) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4) != 0) && (memcmp (SIGNATURE_BCRYPT4, input_buf, 4) != 0)) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; memcpy ((char *) salt->salt_sign, input_buf, 6); u8 *iter_pos = input_buf + 4; salt->salt_iter = 1u << atoll ((const char *) iter_pos); u8 *salt_pos = (u8 *) strchr ((const char *) iter_pos, '$'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); salt_pos++; u32 salt_len = 16; salt->salt_len = salt_len; u8 tmp_buf[100] = { 0 }; base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf); u8 *salt_buf_ptr = (u8 *) 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]); u8 *hash_pos = salt_pos + 22; memset (tmp_buf, 0, sizeof (tmp_buf)); base64_decode (bf64_to_int, (const u8 *) 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] &= ~0xffu; // its just 23 not 24 ! return (PARSER_OK); } int cisco4_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; u8 tmp_buf[100] = { 0 }; base64_decode (itoa64_to_int, (const u8 *) 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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; if (is_valid_hex_string (input_buf, 16) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); u32 tt; IP (digest[0], digest[1], tt); digest[2] = 0; digest[3] = 0; return (PARSER_OK); } int arubaos_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_125) || (input_len > DISPLAY_LEN_MAX_125)) return (PARSER_GLOBAL_LENGTH); if ((input_buf[8] != '0') || (input_buf[9] != '1')) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *hash_pos = input_buf + 10; if (is_valid_hex_string (hash_pos, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); digest[4] = hex_to_u32 ((const u8 *) &hash_pos[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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= SHA1M_A; digest[1] -= SHA1M_B; digest[2] -= SHA1M_C; digest[3] -= SHA1M_D; digest[4] -= SHA1M_E; } u32 salt_len = 10; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int macos1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *hash_pos = input_buf + 8; if (is_valid_hex_string (hash_pos, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); digest[4] = hex_to_u32 ((const u8 *) &hash_pos[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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= SHA1M_A; digest[1] -= SHA1M_B; digest[2] -= SHA1M_C; digest[3] -= SHA1M_D; digest[4] -= SHA1M_E; } u32 salt_len = 8; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int macos512_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH); u64 *digest = (u64 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *hash_pos = input_buf + 8; if (is_valid_hex_string (hash_pos, 128) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]); digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]); digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]); digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]); digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]); digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]); digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]); 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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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; } u32 salt_len = 8; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int osc_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= MD5M_A; digest[1] -= MD5M_B; digest[2] -= MD5M_C; digest[3] -= MD5M_D; } if (input_buf[32] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 32 - 1; u8 *salt_buf = input_buf + 32 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int netscreen_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH); // unscramble u8 clean_input_buf[32] = { 0 }; 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 u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u32 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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= MD5M_A; digest[1] -= MD5M_B; digest[2] -= MD5M_C; digest[3] -= MD5M_D; } if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 30 - 1; u8 *salt_buf = input_buf + 30 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); // max. salt length: 55 (max for MD5) - 22 (":Administration Tools:") - 1 (0x80) = 32 // 32 - 4 bytes (to fit w0lr for all attack modes) = 28 if (salt_len > 28) 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= SHA1M_A; digest[1] -= SHA1M_B; digest[2] -= SHA1M_C; digest[3] -= SHA1M_D; digest[4] -= SHA1M_E; } if (input_buf[40] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 40 - 1; u8 *salt_buf = input_buf + 40 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int dcc2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_DCC2, input_buf, 6) != 0) return (PARSER_SIGNATURE_UNMATCHED); u8 *iter_pos = input_buf + 6; salt_t *salt = hash_buf->salt; u32 iter = atoll ((const char *) iter_pos); if (iter < 1) { iter = ROUNDS_DCC2; } salt->salt_iter = iter - 1; u8 *salt_pos = (u8 *) strchr ((const char *) iter_pos, '#'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); salt_pos++; // search last '#' from the end since the username can consist of a '#' too u8 *digest_pos = (u8 *) strrchr ((const char *) salt_pos, '#'); if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); digest_pos++; u32 salt_len = digest_pos - salt_pos - 1; u32 *digest = (u32 *) hash_buf->digest; if (is_valid_hex_string (digest_pos, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &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]); u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int dpapimk_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { /* 15300 and 15900 share the same input format */ if ((input_len < DISPLAY_LEN_MIN_15300) || (input_len > DISPLAY_LEN_MAX_15300)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_DPAPIMK, input_buf, 9) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; dpapimk_t *dpapimk = (dpapimk_t *) hash_buf->esalt; /** * parse line */ u8 *version_pos; u8 *context_pos; u8 *SID_pos; u8 *cipher_algo_pos; // here just for possible forward compatibilities u8 *hash_algo_pos; // same u8 *rounds_pos; u32 iv_len = 32; u32 effective_iv_len = 0; u32 effective_contents_len = 0; u8 *iv_pos; u8 *contents_len_pos; u8 *contents_pos; version_pos = input_buf + 8 + 1; context_pos = (u8 *) strchr ((const char *) version_pos, '*'); if (context_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); context_pos++; SID_pos = (u8 *) strchr ((const char *) context_pos, '*'); if (SID_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); SID_pos++; cipher_algo_pos = (u8 *) strchr ((const char *) SID_pos, '*'); if (cipher_algo_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); cipher_algo_pos++; hash_algo_pos = (u8 *) strchr ((const char *) cipher_algo_pos, '*'); if (hash_algo_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); hash_algo_pos++; rounds_pos = (u8 *) strchr ((const char *) hash_algo_pos, '*'); if (rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); rounds_pos++; iv_pos = (u8 *) strchr ((const char *) rounds_pos, '*'); if (iv_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); iv_pos++; contents_len_pos = (u8 *) strchr ((const char *) iv_pos, '*'); if (contents_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); effective_iv_len = (u32) (contents_len_pos - iv_pos); if (effective_iv_len != iv_len) return (PARSER_SALT_LENGTH); if (is_valid_hex_string (iv_pos, 32) == false) return (PARSER_SALT_ENCODING); contents_len_pos++; contents_pos = (u8 *) strchr ((const char *) contents_len_pos, '*'); if (contents_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); contents_pos++; u32 version = atoll ((const char *) version_pos); u32 contents_len = atoll ((const char *) contents_len_pos); if (version == 1 && contents_len != 208) return (PARSER_SALT_LENGTH); if (version == 2 && contents_len != 288) return (PARSER_SALT_LENGTH); if (is_valid_hex_string (contents_pos, contents_len) == false) return (PARSER_SALT_ENCODING); u8 *end_line = (u8 *) strchr ((const char *) contents_pos, 0); effective_contents_len = (u32) (end_line - contents_pos); if (effective_contents_len != contents_len) return (PARSER_SALT_LENGTH); dpapimk->context = atoll ((const char *) context_pos); salt->salt_iter = (atoll ((const char *) rounds_pos)) - 1; dpapimk->iv[0] = hex_to_u32 ((const u8 *) &iv_pos[ 0]); dpapimk->iv[1] = hex_to_u32 ((const u8 *) &iv_pos[ 8]); dpapimk->iv[2] = hex_to_u32 ((const u8 *) &iv_pos[16]); dpapimk->iv[3] = hex_to_u32 ((const u8 *) &iv_pos[24]); dpapimk->iv[0] = byte_swap_32 (dpapimk->iv[0]); dpapimk->iv[1] = byte_swap_32 (dpapimk->iv[1]); dpapimk->iv[2] = byte_swap_32 (dpapimk->iv[2]); dpapimk->iv[3] = byte_swap_32 (dpapimk->iv[3]); dpapimk->contents_len = contents_len; for (u32 i = 0; i < dpapimk->contents_len / 4; i++) { dpapimk->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]); dpapimk->contents[i] = byte_swap_32 (dpapimk->contents[i]); } u32 SID_len = cipher_algo_pos - 1 - SID_pos; /* maximum size of SID supported */ u8 *SID_utf16le = (u8 *) hcmalloc (32 * 4); memset (SID_utf16le, 0, 32 * 4); for (u32 i = 0; i < SID_len; i += 1) { SID_utf16le[i * 2] = SID_pos[i]; } SID_utf16le[(SID_len + 1) * 2] = 0x80; /* Specific to DPAPI: needs trailing '\0' while computing hash */ dpapimk->SID_len = (SID_len + 1) * 2; memcpy ((u8 *) dpapimk->SID, SID_utf16le, 32 * 4); for (u32 i = 0; i < 32; i++) { dpapimk->SID[i] = byte_swap_32 (dpapimk->SID[i]); } digest[0] = dpapimk->iv[0]; digest[1] = dpapimk->iv[1]; digest[2] = dpapimk->iv[2]; digest[3] = dpapimk->iv[3]; salt->salt_buf[0] = dpapimk->iv[0]; salt->salt_buf[1] = dpapimk->iv[1]; salt->salt_buf[2] = dpapimk->iv[2]; salt->salt_buf[3] = dpapimk->iv[3]; salt->salt_len = 16; hcfree(SID_utf16le); return (PARSER_OK); } int wpa_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; wpa_t *wpa = (wpa_t *) hash_buf->esalt; // the *wpa was partially initialized beforehand, we can not simply memset it to zero hccapx_t in; memcpy (&in, input_buf, input_len); if (in.signature != HCCAPX_SIGNATURE) return (PARSER_HCCAPX_SIGNATURE); if (in.version != HCCAPX_VERSION) return (PARSER_HCCAPX_VERSION); if (in.eapol_len < 1 || in.eapol_len > 255) return (PARSER_HCCAPX_EAPOL_LEN); memcpy (wpa->keymic, 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) */ u32 salt_len = in.essid_len; if (salt_len > 32) return (PARSER_SALT_LENGTH); memcpy (salt->salt_buf, in.essid, in.essid_len); salt->salt_len = salt_len; salt->salt_iter = ROUNDS_WPA - 1; memcpy (wpa->essid, in.essid, in.essid_len); wpa->essid_len = in.essid_len; wpa->keyver = in.keyver; if ((wpa->keyver != 1) && (wpa->keyver != 2) && (wpa->keyver != 3)) return (PARSER_SALT_VALUE); u8 *pke_ptr = (u8 *) wpa->pke; memset (pke_ptr, 0, 128); if ((wpa->keyver == 1) || (wpa->keyver == 2)) { memcpy (pke_ptr, "Pairwise key expansion", 23); if (memcmp (in.mac_ap, in.mac_sta, 6) < 0) { memcpy (pke_ptr + 23, in.mac_ap, 6); memcpy (pke_ptr + 29, in.mac_sta, 6); } else { memcpy (pke_ptr + 23, in.mac_sta, 6); memcpy (pke_ptr + 29, in.mac_ap, 6); } wpa->nonce_compare = memcmp (in.nonce_ap, in.nonce_sta, 32); if (wpa->nonce_compare < 0) { memcpy (pke_ptr + 35, in.nonce_ap, 32); memcpy (pke_ptr + 67, in.nonce_sta, 32); } else { memcpy (pke_ptr + 35, in.nonce_sta, 32); memcpy (pke_ptr + 67, in.nonce_ap, 32); } } else if (wpa->keyver == 3) { pke_ptr[0] = 1; pke_ptr[1] = 0; memcpy (pke_ptr + 2, "Pairwise key expansion", 22); if (memcmp (in.mac_ap, in.mac_sta, 6) < 0) { memcpy (pke_ptr + 24, in.mac_ap, 6); memcpy (pke_ptr + 30, in.mac_sta, 6); } else { memcpy (pke_ptr + 24, in.mac_sta, 6); memcpy (pke_ptr + 30, in.mac_ap, 6); } wpa->nonce_compare = memcmp (in.nonce_ap, in.nonce_sta, 32); if (wpa->nonce_compare < 0) { memcpy (pke_ptr + 36, in.nonce_ap, 32); memcpy (pke_ptr + 68, in.nonce_sta, 32); } else { memcpy (pke_ptr + 36, in.nonce_sta, 32); memcpy (pke_ptr + 68, in.nonce_ap, 32); } pke_ptr[100] = 0x80; pke_ptr[101] = 1; } for (int i = 0; i < 32; i++) { wpa->pke[i] = byte_swap_32 (wpa->pke[i]); } memcpy (wpa->orig_mac_ap, in.mac_ap, 6); memcpy (wpa->orig_mac_sta, in.mac_sta, 6); memcpy (wpa->orig_nonce_ap, in.nonce_ap, 32); memcpy (wpa->orig_nonce_sta, in.nonce_sta, 32); u8 message_pair_orig = in.message_pair; in.message_pair &= 0x7f; // ignore the highest bit (it is used to indicate if the replay counters did match) if (wpa->message_pair_chgd == true) { if (wpa->message_pair != in.message_pair) return (PARSER_HCCAPX_MESSAGE_PAIR); } wpa->message_pair = message_pair_orig; wpa->eapol_len = in.eapol_len; u8 *eapol_ptr = (u8 *) wpa->eapol; memcpy (eapol_ptr, in.eapol, wpa->eapol_len); memset (eapol_ptr + wpa->eapol_len, 0, (256 + 64) - wpa->eapol_len); eapol_ptr[wpa->eapol_len] = 0x80; if (wpa->keyver == 1) { // nothing to do } else if (wpa->keyver == 2) { wpa->keymic[0] = byte_swap_32 (wpa->keymic[0]); wpa->keymic[1] = byte_swap_32 (wpa->keymic[1]); wpa->keymic[2] = byte_swap_32 (wpa->keymic[2]); wpa->keymic[3] = byte_swap_32 (wpa->keymic[3]); for (int i = 0; i < 64; i++) { wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]); } } else if (wpa->keyver == 3) { // nothing to do } // Create a hash of the nonce as ESSID is not unique enough // Not a regular MD5 but good enough // We can also ignore cases where we should bzero the work buffer u32 hash[4]; hash[0] = 0; hash[1] = 1; hash[2] = 2; hash[3] = 3; u32 block[16]; memset (block, 0, sizeof (block)); u8 *block_ptr = (u8 *) block; for (int i = 0; i < 16; i++) block[i] = salt->salt_buf[i]; md5_64 (block, hash); for (int i = 0; i < 16; i++) block[i] = wpa->pke[i + 0]; md5_64 (block, hash); for (int i = 0; i < 16; i++) block[i] = wpa->pke[i + 16]; md5_64 (block, hash); for (int i = 0; i < 16; i++) block[i] = wpa->eapol[i + 0]; md5_64 (block, hash); for (int i = 0; i < 16; i++) block[i] = wpa->eapol[i + 16]; md5_64 (block, hash); for (int i = 0; i < 16; i++) block[i] = wpa->eapol[i + 32]; md5_64 (block, hash); for (int i = 0; i < 16; i++) block[i] = wpa->eapol[i + 48]; md5_64 (block, hash); for (int i = 0; i < 6; i++) block_ptr[i + 0] = wpa->orig_mac_ap[i]; for (int i = 0; i < 6; i++) block_ptr[i + 6] = wpa->orig_mac_sta[i]; md5_64 (block, hash); for (int i = 0; i < 32; i++) block_ptr[i + 0] = wpa->orig_nonce_ap[i]; for (int i = 0; i < 32; i++) block_ptr[i + 32] = wpa->orig_nonce_sta[i]; md5_64 (block, hash); block[0] = wpa->keymic[0]; block[1] = wpa->keymic[1]; block[2] = wpa->keymic[2]; block[3] = wpa->keymic[3]; md5_64 (block, hash); wpa->hash[0] = hash[0]; wpa->hash[1] = hash[1]; wpa->hash[2] = hash[2]; wpa->hash[3] = hash[3]; // make all this stuff unique digest[0] = wpa->hash[0]; digest[1] = wpa->hash[1]; digest[2] = wpa->hash[2]; digest[3] = wpa->hash[3]; return (PARSER_OK); } int psafe2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (input_len == 0) return (PARSER_HASH_LENGTH); FILE *fp = fopen ((const char *) input_buf, "rb"); if (fp == NULL) return (PARSER_HASH_FILE); psafe2_hdr buf; memset (&buf, 0, sizeof (psafe2_hdr)); const size_t n = hc_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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (input_len == 0) return (PARSER_HASH_LENGTH); FILE *fp = fopen ((const char *) input_buf, "rb"); if (fp == NULL) return (PARSER_HASH_FILE); psafe3_t in; memset (&in, 0, sizeof (psafe3_t)); const size_t n = hc_fread (&in, sizeof (psafe3_t), 1, fp); fclose (fp); if (n != 1) return (PARSER_PSAFE3_FILE_SIZE); if (memcmp (SIGNATURE_PSAFE3, in.signature, 4) != 0) return (PARSER_SIGNATURE_UNMATCHED); 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH); if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3) != 0) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3) != 0)) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *iter_pos = input_buf + 3; u32 salt_iter = 1u << itoa64_to_int (iter_pos[0]); if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION); memcpy ((u8 *) salt->salt_sign, input_buf, 4); salt->salt_iter = salt_iter; u8 *salt_pos = iter_pos + 1; u32 salt_len = 8; memcpy ((u8 *) salt->salt_buf, salt_pos, salt_len); salt->salt_len = salt_len; u8 *hash_pos = salt_pos + salt_len; phpass_decode ((u8 *) digest, hash_pos); return (PARSER_OK); } int md5crypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if (input_len < DISPLAY_LEN_MIN_500) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *salt_pos = input_buf + 3; u32 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 = atoll ((const char *) (salt_pos - iterations_len)); salt_pos += 1; iterations_len += 8; } else { salt->salt_iter = ROUNDS_MD5CRYPT; } if (input_len > (DISPLAY_LEN_MAX_500 + iterations_len)) return (PARSER_GLOBAL_LENGTH); u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; if (salt_len > 8) return (PARSER_SALT_LENGTH); memcpy ((u8 *) salt->salt_buf, salt_pos, salt_len); salt->salt_len = salt_len; hash_pos++; u32 hash_len = input_len - 3 - iterations_len - salt_len - 1; if (hash_len != 22) return (PARSER_HASH_LENGTH); md5crypt_decode ((u8 *) digest, hash_pos); return (PARSER_OK); } int md5apr1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if (memcmp (SIGNATURE_MD5APR1, input_buf, 6) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *salt_pos = input_buf + 6; u32 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 = atoll ((const char *) (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); u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; if (salt_len > 8) return (PARSER_SALT_LENGTH); memcpy ((u8 *) salt->salt_buf, salt_pos, salt_len); salt->salt_len = salt_len; hash_pos++; md5crypt_decode ((u8 *) digest, hash_pos); return (PARSER_OK); } int episerver_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_EPISERVER, input_buf, 14) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *salt_pos = input_buf + 14; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '*'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); hash_pos++; u32 salt_len = hash_pos - salt_pos - 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; u8 tmp_buf[100] = { 0 }; base64_decode (base64_to_int, (const u8 *) 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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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); u32 *digest = (u32 *) 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; // we need to add 2 additional bytes (the salt sign) such that the salt sorting algorithm // doesn't eliminate salts that are identical but have different salt signs salt->salt_buf[0] |= input_buf[0] << 16 | input_buf[1] << 24; salt->salt_len = 4; // actually it is only 2 (but we need to add the original salt_sign to it) u8 tmp_buf[100] = { 0 }; base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf); memcpy (digest, tmp_buf, 8); u32 tt; IP (digest[0], digest[1], tt); digest[2] = 0; digest[3] = 0; return (PARSER_OK); } int md4_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= MD4M_A; digest[1] -= MD4M_B; digest[2] -= MD4M_C; digest[3] -= MD4M_D; } return (PARSER_OK); } int md5_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= MD5M_A; digest[1] -= MD5M_B; digest[2] -= MD5M_C; digest[3] -= MD5M_D; } return (PARSER_OK); } int md5half_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; if (is_valid_hex_string (input_buf, 16) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]); digest[2] = 0; digest[3] = 0; return (PARSER_OK); } int md5s_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if (hashconfig->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); } u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= MD5M_A; digest[1] -= MD5M_B; digest[2] -= MD5M_C; digest[3] -= MD5M_D; } if (input_buf[32] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 32 - 1; u8 *salt_buf = input_buf + 32 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); if (salt_len > 64) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; if (hashconfig->opts_type & OPTS_TYPE_ST_HASH_MD5) { // precompute md5 of the salt precompute_salt_md5 (salt_buf_ptr, salt_len, (u8 *) salt->salt_buf_pc); } return (PARSER_OK); } int md5pix_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) 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; if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH); int *digest = (int *) 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; if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 16 - 1; u8 *salt_buf = input_buf + 16 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } static void transform_netntlmv1_key (const u8 *nthash, u8 *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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt; /** * parse line */ u8 *user_pos = input_buf; u8 *unused_pos = (u8 *) strchr ((const char *) user_pos, ':'); if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 user_len = unused_pos - user_pos; if (user_len > 60) return (PARSER_SALT_LENGTH); unused_pos++; u8 *domain_pos = (u8 *) strchr ((const char *) unused_pos, ':'); if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 unused_len = domain_pos - unused_pos; if (unused_len != 0) return (PARSER_SALT_LENGTH); domain_pos++; u8 *srvchall_pos = (u8 *) strchr ((const char *) domain_pos, ':'); if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 domain_len = srvchall_pos - domain_pos; if (domain_len > 45) return (PARSER_SALT_LENGTH); srvchall_pos++; u8 *hash_pos = (u8 *) strchr ((const char *) srvchall_pos, ':'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 srvchall_len = hash_pos - srvchall_pos; // if (srvchall_len != 0) return (PARSER_SALT_LENGTH); hash_pos++; u8 *clichall_pos = (u8 *) strchr ((const char *) hash_pos, ':'); if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 hash_len = clichall_pos - hash_pos; if (hash_len != 48) return (PARSER_HASH_LENGTH); clichall_pos++; u32 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; u8 *userdomain_ptr = (u8 *) netntlm->userdomain_buf; u8 *chall_ptr = (u8 *) netntlm->chall_buf; /** * handle username and domainname */ for (u32 i = 0; i < user_len; i++) { *userdomain_ptr++ = user_pos[i]; *userdomain_ptr++ = 0; } for (u32 i = 0; i < domain_len; i++) { *userdomain_ptr++ = domain_pos[i]; *userdomain_ptr++ = 0; } /** * handle server challenge encoding */ for (u32 i = 0; i < srvchall_len; i += 2) { const u8 p0 = srvchall_pos[i + 0]; const u8 p1 = srvchall_pos[i + 1]; *chall_ptr++ = hex_convert (p1) << 0 | hex_convert (p0) << 4; } /** * handle client challenge encoding */ for (u32 i = 0; i < clichall_len; i += 2) { const u8 p0 = clichall_pos[i + 0]; const u8 p1 = clichall_pos[i + 1]; *chall_ptr++ = hex_convert (p1) << 0 | hex_convert (p0) << 4; } /** * store data */ u8 *salt_buf_ptr = (u8 *) salt->salt_buf; u32 salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; if (is_valid_hex_string (hash_pos, 48) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); /* special case, last 8 byte do not need to be checked since they are brute-forced next */ u32 digest_tmp[2] = { 0 }; digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]); digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]); /* 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)) { u32 w[16] = { 0 }; w[ 0] = salt->salt_buf[0]; w[ 1] = salt->salt_buf[1]; w[ 2] = netntlm->chall_buf[0]; w[ 3] = netntlm->chall_buf[1]; w[ 4] = 0x80; w[14] = 16 * 8; u32 dgst[4] = { 0 }; dgst[0] = MD5M_A; dgst[1] = MD5M_B; dgst[2] = MD5M_C; dgst[3] = MD5M_D; md5_64 (w, dgst); salt->salt_buf[0] = dgst[0]; salt->salt_buf[1] = dgst[1]; } } /* precompute netntlmv1 exploit start */ for (u32 i = 0; i < 0x10000; i++) { u32 key_md4[2] = { i, 0 }; u32 key_des[2] = { 0, 0 }; transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des); u32 Kc[16] = { 0 }; u32 Kd[16] = { 0 }; _des_keysetup (key_des, Kc, Kd); u32 data3[2] = { salt->salt_buf[0], salt->salt_buf[1] }; _des_encrypt (data3, Kc, Kd); 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 */ u32 tt; IP (digest[0], digest[1], tt); IP (digest[2], digest[3], tt); digest[0] = rotr32 (digest[0], 29); digest[1] = rotr32 (digest[1], 29); digest[2] = rotr32 (digest[2], 29); digest[3] = rotr32 (digest[3], 29); IP (salt->salt_buf[0], salt->salt_buf[1], tt); salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3); salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3); return (PARSER_OK); } int netntlmv2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt; /** * parse line */ u8 *user_pos = input_buf; u8 *unused_pos = (u8 *) strchr ((const char *) user_pos, ':'); if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 user_len = unused_pos - user_pos; if (user_len > 60) return (PARSER_SALT_LENGTH); unused_pos++; u8 *domain_pos = (u8 *) strchr ((const char *) unused_pos, ':'); if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 unused_len = domain_pos - unused_pos; if (unused_len != 0) return (PARSER_SALT_LENGTH); domain_pos++; u8 *srvchall_pos = (u8 *) strchr ((const char *) domain_pos, ':'); if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 domain_len = srvchall_pos - domain_pos; if (domain_len > 45) return (PARSER_SALT_LENGTH); srvchall_pos++; u8 *hash_pos = (u8 *) strchr ((const char *) srvchall_pos, ':'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 srvchall_len = hash_pos - srvchall_pos; if (srvchall_len != 16) return (PARSER_SALT_LENGTH); hash_pos++; u8 *clichall_pos = (u8 *) strchr ((const char *) hash_pos, ':'); if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 hash_len = clichall_pos - hash_pos; if (hash_len != 32) return (PARSER_HASH_LENGTH); clichall_pos++; u32 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; u8 *userdomain_ptr = (u8 *) netntlm->userdomain_buf; u8 *chall_ptr = (u8 *) netntlm->chall_buf; /** * handle username and domainname */ for (u32 i = 0; i < user_len; i++) { *userdomain_ptr++ = toupper (user_pos[i]); *userdomain_ptr++ = 0; } for (u32 i = 0; i < domain_len; i++) { *userdomain_ptr++ = domain_pos[i]; *userdomain_ptr++ = 0; } *userdomain_ptr++ = 0x80; /** * handle server challenge encoding */ for (u32 i = 0; i < srvchall_len; i += 2) { const u8 p0 = srvchall_pos[i + 0]; const u8 p1 = srvchall_pos[i + 1]; *chall_ptr++ = hex_convert (p1) << 0 | hex_convert (p0) << 4; } /** * handle client challenge encoding */ for (u32 i = 0; i < clichall_len; i += 2) { const u8 p0 = clichall_pos[i + 0]; const u8 p1 = clichall_pos[i + 1]; *chall_ptr++ = hex_convert (p1) << 0 | hex_convert (p0) << 4; } *chall_ptr++ = 0x80; /** * handle hash itself */ if (is_valid_hex_string (hash_pos, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); /** * 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; u32 *uptr; uptr = (u32 *) netntlm->userdomain_buf; for (u32 i = 0; i < 16; i += 16) { md5_64 (uptr, salt->salt_buf); } uptr = (u32 *) netntlm->chall_buf; for (u32 i = 0; i < 256; i += 16) { md5_64 (uptr, salt->salt_buf); } salt->salt_len = 16; return (PARSER_OK); } int joomla_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= MD5M_A; digest[1] -= MD5M_B; digest[2] -= MD5M_C; digest[3] -= MD5M_D; } if (input_buf[32] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 32 - 1; u8 *salt_buf = input_buf + 32 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int postgresql_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= MD5M_A; digest[1] -= MD5M_B; digest[2] -= MD5M_C; digest[3] -= MD5M_D; } if (input_buf[32] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 32 - 1; u8 *salt_buf = input_buf + 32 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int md5md5_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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. */ u8 *salt_buf_ptr = (u8 *) salt->salt_buf; u32 salt_len = parse_and_store_salt (salt_buf_ptr, (u8 *) "", 0, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int vb3_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= MD5M_A; digest[1] -= MD5M_B; digest[2] -= MD5M_C; digest[3] -= MD5M_D; } if (input_buf[32] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 32 - 1; u8 *salt_buf = input_buf + 32 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int vb30_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); if (input_buf[32] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 32 - 1; u8 *salt_buf = input_buf + 32 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int dcc_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= MD4M_A; digest[1] -= MD4M_B; digest[2] -= MD4M_C; digest[3] -= MD4M_D; } if (input_buf[32] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 32 - 1; u8 *salt_buf = input_buf + 32 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int ipb2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); if (input_buf[32] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 32 - 1; u8 *salt_buf = input_buf + 32 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); if (salt_len > 64) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; // precompute md5 of the salt precompute_salt_md5 (salt_buf_ptr, salt_len, (u8 *) salt->salt_buf_pc); return (PARSER_OK); } int sha1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; if (is_valid_hex_string (input_buf, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= SHA1M_A; digest[1] -= SHA1M_B; digest[2] -= SHA1M_C; digest[3] -= SHA1M_D; digest[4] -= SHA1M_E; } return (PARSER_OK); } int sha1axcrypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_13300) || (input_len > DISPLAY_LEN_MAX_13300)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_AXCRYPT_SHA1, input_buf, 13) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; input_buf += 14; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = 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[4] = 0; return (PARSER_OK); } int sha1s_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if (hashconfig->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); } u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= SHA1M_A; digest[1] -= SHA1M_B; digest[2] -= SHA1M_C; digest[3] -= SHA1M_D; digest[4] -= SHA1M_E; } if (input_buf[40] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 40 - 1; u8 *salt_buf = input_buf + 40 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int sha1sha1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) { if ((input_len < DISPLAY_LEN_MIN_4520H) || (input_len > DISPLAY_LEN_MAX_4520H)) return (PARSER_GLOBAL_LENGTH); } else { if ((input_len < DISPLAY_LEN_MIN_4520) || (input_len > DISPLAY_LEN_MAX_4520)) return (PARSER_GLOBAL_LENGTH); } u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &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]); if (input_buf[40] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 40 - 1; u8 *salt_buf = input_buf + 40 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int pstoken_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_13500) || (input_len > DISPLAY_LEN_MAX_13500)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; pstoken_t *pstoken = (pstoken_t *) hash_buf->esalt; if (is_valid_hex_string (input_buf, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &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]); if (input_buf[40] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 40 - 1; u8 *salt_buf = input_buf + 40 + 1; if (salt_len == UINT_MAX || salt_len % 2 != 0) return (PARSER_SALT_LENGTH); u8 *pstoken_ptr = (u8 *) pstoken->salt_buf; if (is_valid_hex_string (salt_buf, salt_len) == false) return (PARSER_SALT_ENCODING); for (u32 i = 0, j = 0; i < salt_len; i += 2, j += 1) { pstoken_ptr[j] = hex_to_u8 ((const u8 *) &salt_buf[i]); } pstoken->salt_len = salt_len / 2; /* some fake salt for the sorting mechanisms */ salt->salt_buf[0] = pstoken->salt_buf[0]; salt->salt_buf[1] = pstoken->salt_buf[1]; salt->salt_buf[2] = pstoken->salt_buf[2]; salt->salt_buf[3] = pstoken->salt_buf[3]; salt->salt_buf[4] = pstoken->salt_buf[4]; salt->salt_buf[5] = pstoken->salt_buf[5]; salt->salt_buf[6] = pstoken->salt_buf[6]; salt->salt_buf[7] = pstoken->salt_buf[7]; salt->salt_len = 32; /* we need to check if we can precompute some of the data -- this is possible since the scheme is badly designed */ pstoken->pc_digest[0] = SHA1M_A; pstoken->pc_digest[1] = SHA1M_B; pstoken->pc_digest[2] = SHA1M_C; pstoken->pc_digest[3] = SHA1M_D; pstoken->pc_digest[4] = SHA1M_E; pstoken->pc_offset = 0; for (int i = 0; i < (int) pstoken->salt_len - 63; i += 64) { u32 w[16]; w[ 0] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 0]); w[ 1] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 1]); w[ 2] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 2]); w[ 3] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 3]); w[ 4] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 4]); w[ 5] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 5]); w[ 6] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 6]); w[ 7] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 7]); w[ 8] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 8]); w[ 9] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 9]); w[10] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 10]); w[11] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 11]); w[12] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 12]); w[13] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 13]); w[14] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 14]); w[15] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 15]); sha1_64 (w, pstoken->pc_digest); pstoken->pc_offset += 16; } return (PARSER_OK); } int sha1b64_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_SHA1B64, input_buf, 5) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; u8 tmp_buf[100] = { 0 }; base64_decode (base64_to_int, (const u8 *) 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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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) != 0) && (memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6) != 0)) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 tmp_buf[100] = { 0 }; const int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf); if (tmp_len < 20) return (PARSER_HASH_LENGTH); memcpy (digest, tmp_buf, 20); const int salt_len = tmp_len - 20; salt->salt_len = salt_len; memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len); if (hashconfig->opts_type & OPTS_TYPE_ST_ADD80) { u8 *ptr = (u8 *) 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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_MSSQL, input_buf, 6) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *salt_buf = input_buf + 6; u32 salt_len = 8; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; u8 *hash_pos = input_buf + 6 + 8 + 40; if (is_valid_hex_string (hash_pos, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); digest[4] = hex_to_u32 ((const u8 *) &hash_pos[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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_MSSQL, input_buf, 6) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *salt_buf = input_buf + 6; u32 salt_len = 8; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; u8 *hash_pos = input_buf + 6 + 8; if (is_valid_hex_string (hash_pos, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); digest[4] = hex_to_u32 ((const u8 *) &hash_pos[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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6) != 0) return (PARSER_SIGNATURE_UNMATCHED); u64 *digest = (u64 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *salt_buf = input_buf + 6; u32 salt_len = 8; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; u8 *hash_pos = input_buf + 6 + 8; if (is_valid_hex_string (hash_pos, 128) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]); digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]); digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]); digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]); digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]); digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]); digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]); 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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 16) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = 0; digest[3] = 0; if (input_buf[16] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 16 - 1; u8 *salt_buf = input_buf + 16 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int oracles_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= SHA1M_A; digest[1] -= SHA1M_B; digest[2] -= SHA1M_C; digest[3] -= SHA1M_D; digest[4] -= SHA1M_E; } if (input_buf[40] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 40 - 1; u8 *salt_buf = input_buf + 40 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int oraclet_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *hash_pos = input_buf; if (is_valid_hex_string (hash_pos, 128) == false) return (PARSER_HASH_ENCODING); digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]); digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]); digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]); digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]); digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]); digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]); digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]); digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]); digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]); digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]); digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]); digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]); digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]); digest[15] = hex_to_u32 ((const u8 *) &hash_pos[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]); u8 *salt_pos = input_buf + 128; if (is_valid_hex_string (salt_pos, 32) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]); salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]); salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]); salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_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_iter = ROUNDS_ORACLET - 1; salt->salt_len = 16; return (PARSER_OK); } int sha224_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_1300) || (input_len > DISPLAY_LEN_MAX_1300)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; if (is_valid_hex_string (input_buf, 56) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]); digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]); digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]); 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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= SHA224M_A; digest[1] -= SHA224M_B; digest[2] -= SHA224M_C; digest[3] -= SHA224M_D; digest[4] -= SHA224M_E; digest[5] -= SHA224M_F; digest[6] -= SHA224M_G; } return (PARSER_OK); } int sha256_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; if (is_valid_hex_string (input_buf, 64) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]); digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]); digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]); digest[7] = hex_to_u32 ((const u8 *) &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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if (hashconfig->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); } u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 64) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]); digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]); digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]); digest[7] = hex_to_u32 ((const u8 *) &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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 64 - 1; u8 *salt_buf = input_buf + 64 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int sha384_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH); u64 *digest = (u64 *) hash_buf->digest; if (is_valid_hex_string (input_buf, 96) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]); digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]); digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]); digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]); digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]); digest[6] = 0; digest[7] = 0; 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] = 0; digest[7] = 0; if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH); u64 *digest = (u64 *) hash_buf->digest; if (is_valid_hex_string (input_buf, 128) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]); digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]); digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]); digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]); digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]); digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]); digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]); 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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if (hashconfig->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); } u64 *digest = (u64 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 128) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]); digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]); digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]); digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]); digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]); digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]); digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]); 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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 128 - 1; u8 *salt_buf = input_buf + 128 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int sha512crypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3) != 0) return (PARSER_SIGNATURE_UNMATCHED); u64 *digest = (u64 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *salt_pos = input_buf + 3; u32 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 = atoll ((const char *) (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); u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; if (salt_len > 16) return (PARSER_SALT_LENGTH); memcpy ((u8 *) salt->salt_buf, salt_pos, salt_len); salt->salt_len = salt_len; hash_pos++; sha512crypt_decode ((u8 *) digest, hash_pos); return (PARSER_OK); } int keccak_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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); if (is_valid_hex_string (input_buf, input_len) == false) return (PARSER_HASH_ENCODING); u64 *digest = (u64 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u32 keccak_mdlen = input_len / 2; for (u32 i = 0; i < keccak_mdlen / 8; i++) { digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]); } salt->keccak_mdlen = keccak_mdlen; return (PARSER_OK); } int blake2b_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_600) || (input_len > DISPLAY_LEN_MAX_600)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_BLAKE2B, input_buf, 8) != 0) return (PARSER_SIGNATURE_UNMATCHED); if (is_valid_hex_string (input_buf + 8, 128) == false) return (PARSER_HASH_ENCODING); u64 *digest = (u64 *) hash_buf->digest; u8 *input_hash_buf = input_buf + 8; digest[0] = hex_to_u64 ((const u8 *) &input_hash_buf[ 0]); digest[1] = hex_to_u64 ((const u8 *) &input_hash_buf[ 16]); digest[2] = hex_to_u64 ((const u8 *) &input_hash_buf[ 32]); digest[3] = hex_to_u64 ((const u8 *) &input_hash_buf[ 48]); digest[4] = hex_to_u64 ((const u8 *) &input_hash_buf[ 64]); digest[5] = hex_to_u64 ((const u8 *) &input_hash_buf[ 80]); digest[6] = hex_to_u64 ((const u8 *) &input_hash_buf[ 96]); digest[7] = hex_to_u64 ((const u8 *) &input_hash_buf[112]); // Initialize BLAKE2 Params and State blake2_t *S = (blake2_t *) hash_buf->esalt; memset(S, 0, sizeof (blake2_t)); S->h[0] = blake2b_IV[0]; S->h[1] = blake2b_IV[1]; S->h[2] = blake2b_IV[2]; S->h[3] = blake2b_IV[3]; S->h[4] = blake2b_IV[4]; S->h[5] = blake2b_IV[5]; S->h[6] = blake2b_IV[6]; S->h[7] = blake2b_IV[7]; // S->h[0] ^= 0x0000000001010040; // digest_lenght = 0x40, depth = 0x01, fanout = 0x01 S->h[0] ^= 0x40 << 0; S->h[0] ^= 0x01 << 16; S->h[0] ^= 0x01 << 24; return (PARSER_OK); } int chacha20_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_15400) || (input_len > DISPLAY_LEN_MAX_15400)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_CHACHA20, input_buf, 10) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; chacha20_t *chacha20 = (chacha20_t *) hash_buf->esalt; salt_t *salt = hash_buf->salt; u8 *position_marker = (u8 *) strchr ((const char *) input_buf, '*'); if (position_marker == NULL) return (PARSER_SEPARATOR_UNMATCHED); position_marker++; if (is_valid_hex_string (position_marker, 16) == false) return (PARSER_SALT_ENCODING); u8 *offset_marker = (u8 *) strchr ((const char *) position_marker, '*'); if (offset_marker == NULL) return (PARSER_SEPARATOR_UNMATCHED); offset_marker++; int offset = atoi ((char*) offset_marker); if (offset > 63) return (PARSER_SALT_VALUE); u8 *iv_marker = (u8 *) strchr ((const char *) offset_marker, '*'); if (iv_marker == NULL) return (PARSER_SEPARATOR_UNMATCHED); iv_marker++; if (is_valid_hex_string (iv_marker, 16) == false) return (PARSER_SALT_ENCODING); u8 *plain_marker = (u8 *) strchr ((const char *) iv_marker, '*'); if (plain_marker == NULL) return (PARSER_SEPARATOR_UNMATCHED); plain_marker++; if (is_valid_hex_string (plain_marker, 16) == false) return (PARSER_SALT_ENCODING); u8 *cipher_marker = (u8 *) strchr ((const char *) plain_marker, '*'); if (cipher_marker == NULL) return (PARSER_SEPARATOR_UNMATCHED); cipher_marker++; if (is_valid_hex_string (cipher_marker, 16) == false) return (PARSER_SALT_ENCODING); chacha20->iv[0] = hex_to_u32 ((const u8 *) iv_marker + 8); chacha20->iv[1] = hex_to_u32 ((const u8 *) iv_marker + 0); chacha20->plain[0] = hex_to_u32 ((const u8 *) plain_marker + 0); chacha20->plain[1] = hex_to_u32 ((const u8 *) plain_marker + 8); chacha20->position[0] = hex_to_u32 ((const u8 *) position_marker + 0); chacha20->position[1] = hex_to_u32 ((const u8 *) position_marker + 8); chacha20->offset = offset; /* some fake salt for the sorting mechanisms */ salt->salt_buf[0] = chacha20->iv[0]; salt->salt_buf[1] = chacha20->iv[1]; salt->salt_buf[2] = chacha20->plain[0]; salt->salt_buf[3] = chacha20->plain[1]; salt->salt_buf[4] = chacha20->position[0]; salt->salt_buf[5] = chacha20->position[1]; salt->salt_buf[6] = chacha20->offset; salt->salt_buf[7] = 0; salt->salt_len = 32; /* Store cipher for search mechanism */ digest[0] = hex_to_u32 ((const u8 *) cipher_marker + 8); digest[1] = hex_to_u32 ((const u8 *) cipher_marker + 0); return (PARSER_OK); } int ikepsk_md5_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt; /** * Parse that strange long line */ u8 *in_off[9]; size_t in_len[9] = { 0 }; if (input_buf == NULL) return (PARSER_HASH_VALUE); char *saveptr; in_off[0] = (u8 *) strtok_r ((char *) input_buf, ":", &saveptr); if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED); in_len[0] = strlen ((const char *) in_off[0]); size_t i; for (i = 1; i < 9; i++) { in_off[i] = (u8 *) strtok_r ((char *) NULL, ":", &saveptr); if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED); in_len[i] = strlen ((const char *) in_off[i]); } u8 *ptr = (u8 *) ikepsk->msg_buf; for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i); for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i); for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i); for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i); for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i); for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) 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 = (u8 *) ikepsk->nr_buf; for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i); for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i); *ptr = 0x80; ikepsk->nr_len = (in_len[6] + in_len[7]) / 2; /** * Store to database */ ptr = in_off[8]; if (is_valid_hex_string (ptr, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]); digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]); digest[2] = hex_to_u32 ((const u8 *) &ptr[16]); digest[3] = hex_to_u32 ((const u8 *) &ptr[24]); 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt; /** * Parse that strange long line */ u8 *in_off[9]; size_t in_len[9] = { 0 }; if (input_buf == NULL) return (PARSER_HASH_VALUE); char *saveptr; in_off[0] = (u8 *) strtok_r ((char *) input_buf, ":", &saveptr); if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED); in_len[0] = strlen ((const char *) in_off[0]); size_t i; for (i = 1; i < 9; i++) { in_off[i] = (u8 *) strtok_r ((char *) NULL, ":", &saveptr); if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED); in_len[i] = strlen ((const char *) in_off[i]); } u8 *ptr = (u8 *) ikepsk->msg_buf; for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i); for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i); for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i); for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i); for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i); for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) 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 = (u8 *) ikepsk->nr_buf; for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i); for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i); *ptr = 0x80; ikepsk->nr_len = (in_len[6] + in_len[7]) / 2; /** * Store to database */ ptr = in_off[8]; if (is_valid_hex_string (ptr, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]); digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]); digest[2] = hex_to_u32 ((const u8 *) &ptr[16]); digest[3] = hex_to_u32 ((const u8 *) &ptr[24]); digest[4] = hex_to_u32 ((const u8 *) &ptr[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]); 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; if (is_valid_hex_string (input_buf, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]); return (PARSER_OK); } int whirlpool_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; if (is_valid_hex_string (input_buf, 128) == false) return (PARSER_HASH_ENCODING); digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]); digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]); digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]); digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]); digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]); digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]); digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]); digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]); digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]); digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]); digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]); digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]); digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]); digest[15] = hex_to_u32 ((const u8 *) &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 androidpin_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &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]); if (input_buf[40] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 40 - 1; u8 *salt_buf = input_buf + 40 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; tc_t *tc = (tc_t *) hash_buf->esalt; if (input_len == 0) return (PARSER_HASH_LENGTH); FILE *fp = fopen ((const char *) input_buf, "rb"); if (fp == NULL) return (PARSER_HASH_FILE); char buf[512] = { 0 }; const size_t n = hc_fread (buf, 1, sizeof (buf), fp); fclose (fp); if (n != sizeof (buf)) 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 = ROUNDS_TRUECRYPT_1K - 1; tc->signature = 0x45555254; // "TRUE" digest[0] = tc->data_buf[0]; return (PARSER_OK); } int truecrypt_parse_hash_2k (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; tc_t *tc = (tc_t *) hash_buf->esalt; if (input_len == 0) return (PARSER_HASH_LENGTH); FILE *fp = fopen ((const char *) input_buf, "rb"); if (fp == NULL) return (PARSER_HASH_FILE); char buf[512] = { 0 }; const size_t n = hc_fread (buf, 1, sizeof (buf), fp); fclose (fp); if (n != sizeof (buf)) 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 = ROUNDS_TRUECRYPT_2K - 1; tc->signature = 0x45555254; // "TRUE" digest[0] = tc->data_buf[0]; return (PARSER_OK); } int veracrypt_parse_hash_200000 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; tc_t *tc = (tc_t *) hash_buf->esalt; if (input_len == 0) return (PARSER_HASH_LENGTH); FILE *fp = fopen ((const char *) input_buf, "rb"); if (fp == NULL) return (PARSER_HASH_FILE); char buf[512] = { 0 }; const size_t n = hc_fread (buf, 1, sizeof (buf), fp); fclose (fp); if (n != sizeof (buf)) return (PARSER_VC_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 = ROUNDS_VERACRYPT_200000 - 1; tc->signature = 0x41524556; // "VERA" digest[0] = tc->data_buf[0]; return (PARSER_OK); } int veracrypt_parse_hash_500000 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; tc_t *tc = (tc_t *) hash_buf->esalt; if (input_len == 0) return (PARSER_HASH_LENGTH); FILE *fp = fopen ((const char *) input_buf, "rb"); if (fp == NULL) return (PARSER_HASH_FILE); char buf[512] = { 0 }; const size_t n = hc_fread (buf, 1, sizeof (buf), fp); fclose (fp); if (n != sizeof (buf)) return (PARSER_VC_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 = ROUNDS_VERACRYPT_500000 - 1; tc->signature = 0x41524556; // "VERA" digest[0] = tc->data_buf[0]; return (PARSER_OK); } int veracrypt_parse_hash_327661 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; tc_t *tc = (tc_t *) hash_buf->esalt; if (input_len == 0) return (PARSER_HASH_LENGTH); FILE *fp = fopen ((const char *) input_buf, "rb"); if (fp == NULL) return (PARSER_HASH_FILE); char buf[512] = { 0 }; const size_t n = hc_fread (buf, 1, sizeof (buf), fp); fclose (fp); if (n != sizeof (buf)) return (PARSER_VC_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 = ROUNDS_VERACRYPT_327661 - 1; tc->signature = 0x41524556; // "VERA" digest[0] = tc->data_buf[0]; return (PARSER_OK); } int veracrypt_parse_hash_655331 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; tc_t *tc = (tc_t *) hash_buf->esalt; if (input_len == 0) return (PARSER_HASH_LENGTH); FILE *fp = fopen ((const char *) input_buf, "rb"); if (fp == NULL) return (PARSER_HASH_FILE); char buf[512] = { 0 }; const size_t n = hc_fread (buf, 1, sizeof (buf), fp); fclose (fp); if (n != sizeof (buf)) return (PARSER_VC_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 = ROUNDS_VERACRYPT_655331 - 1; tc->signature = 0x41524556; // "VERA" digest[0] = tc->data_buf[0]; return (PARSER_OK); } int md5aix_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_MD5AIX, input_buf, 6) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *salt_pos = input_buf + 6; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; if (salt_len < 8) return (PARSER_SALT_LENGTH); memcpy ((u8 *) salt->salt_buf, salt_pos, salt_len); salt->salt_len = salt_len; salt->salt_iter = 1000; hash_pos++; md5crypt_decode ((u8 *) digest, hash_pos); return (PARSER_OK); } int sha1aix_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *iter_pos = input_buf + 7; u8 *salt_pos = (u8 *) strchr ((const char *) iter_pos, '$'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); salt_pos++; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; if (salt_len < 16) return (PARSER_SALT_LENGTH); memcpy ((u8 *) salt->salt_buf, salt_pos, salt_len); salt->salt_len = salt_len; u8 salt_iter[3] = { iter_pos[0], iter_pos[1], 0 }; salt->salt_sign[0] = atoll ((const char *) salt_iter); salt->salt_iter = (1u << atoll ((const char *) salt_iter)) - 1; hash_pos++; sha1aix_decode ((u8 *) digest, 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *iter_pos = input_buf + 9; u8 *salt_pos = (u8 *) strchr ((const char *) iter_pos, '$'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); salt_pos++; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; if (salt_len < 16) return (PARSER_SALT_LENGTH); memcpy ((u8 *) 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] = atoll ((const char *) salt_iter); salt->salt_iter = (1u << atoll ((const char *) salt_iter)) - 1; hash_pos++; sha256aix_decode ((u8 *) digest, 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9) != 0) return (PARSER_SIGNATURE_UNMATCHED); u64 *digest = (u64 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *iter_pos = input_buf + 9; u8 *salt_pos = (u8 *) strchr ((const char *) iter_pos, '$'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); salt_pos++; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; if (salt_len < 16) return (PARSER_SALT_LENGTH); memcpy ((u8 *) 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] = atoll ((const char *) salt_iter); salt->salt_iter = (1u << atoll ((const char *) salt_iter)) - 1; hash_pos++; sha512aix_decode ((u8 *) digest, 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt; /** * parse line */ u8 *iterations_pos = input_buf; u8 *saltbuf_pos = (u8 *) strchr ((const char *) iterations_pos, ':'); if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 iterations_len = saltbuf_pos - iterations_pos; if (iterations_len > 6) return (PARSER_SALT_LENGTH); saltbuf_pos++; u8 *cipherbuf_pos = (u8 *) strchr ((const char *) saltbuf_pos, ':'); if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 saltbuf_len = cipherbuf_pos - saltbuf_pos; if (saltbuf_len != 16) return (PARSER_SALT_LENGTH); u32 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 = atoll ((const char *) iterations_pos) - 1; /** * handle salt encoding */ u8 *saltbuf_ptr = (u8 *) salt->salt_buf; for (u32 i = 0; i < saltbuf_len; i += 2) { const u8 p0 = saltbuf_pos[i + 0]; const u8 p1 = saltbuf_pos[i + 1]; *saltbuf_ptr++ = hex_convert (p1) << 0 | hex_convert (p0) << 4; } salt->salt_len = saltbuf_len / 2; /** * handle cipher encoding */ u32 tmp[32]; u8 *cipherbuf_ptr = (u8 *) tmp; for (u32 i = 2016; i < cipherbuf_len; i += 2) { const u8 p0 = cipherbuf_pos[i + 0]; const u8 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]); for (u32 i = 0, j = 0; i < 1040; i += 1, j += 2) { const u8 p0 = cipherbuf_pos[j + 0]; const u8 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *hashbuf_pos = input_buf; u8 *iterations_pos = (u8 *) strchr ((const char *) hashbuf_pos, ':'); if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 hash_len = iterations_pos - hashbuf_pos; if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH); iterations_pos++; u8 *saltbuf_pos = (u8 *) strchr ((const char *) iterations_pos, ':'); if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 iterations_len = saltbuf_pos - iterations_pos; saltbuf_pos++; u32 salt_len = input_len - hash_len - 1 - iterations_len - 1; if (salt_len > 32) return (PARSER_SALT_LENGTH); u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; salt->salt_iter = atoll ((const char *) iterations_pos) - 1; if (is_valid_hex_string (hashbuf_pos, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hashbuf_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 gost_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; if (is_valid_hex_string (input_buf, 64) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]); digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]); digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]); digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]); return (PARSER_OK); } int sha256crypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *salt_pos = input_buf + 3; u32 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 = atoll ((const char *) (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); u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; if (salt_len > 16) return (PARSER_SALT_LENGTH); memcpy ((u8 *) salt->salt_buf, salt_pos, salt_len); salt->salt_len = salt_len; hash_pos++; sha256crypt_decode ((u8 *) digest, hash_pos); return (PARSER_OK); } int sha512macos_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { u32 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_SHA512MACOS, input_buf, 4) != 0) return (PARSER_SIGNATURE_UNMATCHED); u64 *digest = (u64 *) hash_buf->digest; salt_t *salt = hash_buf->salt; pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt; u8 *iter_pos = input_buf + 4; u8 *salt_pos = (u8 *) strchr ((const char *) iter_pos, '$'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); salt_pos++; u8 *hash_pos = (u8 *) strchr ((const char *) 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++; if (is_valid_hex_string (hash_pos, 128) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]); digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]); digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]); digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]); digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]); digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]); digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]); 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]); u32 salt_len = hash_pos - salt_pos - 1; if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len / 2; if (is_valid_hex_string (salt_pos, 64) == false) return (PARSER_HASH_ENCODING); pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]); pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]); pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]); pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]); pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]); pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]); pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]); pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]); pbkdf2_sha512->salt_buf[8] = 0x01000000; pbkdf2_sha512->salt_buf[9] = 0x80; salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0]; salt->salt_iter = atoll ((const char *) iter_pos) - 1; return (PARSER_OK); } int episerver4_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *salt_pos = input_buf + 14; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '*'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); hash_pos++; u32 salt_len = hash_pos - salt_pos - 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; u8 tmp_buf[100] = { 0 }; base64_decode (base64_to_int, (const u8 *) 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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { u32 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) != 0) return (PARSER_SIGNATURE_UNMATCHED); u64 *digest = (u64 *) hash_buf->digest; salt_t *salt = hash_buf->salt; pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt; u8 *iter_pos = input_buf + 19; u8 *salt_pos = (u8 *) strchr ((const char *) iter_pos, '.'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); salt_pos++; u8 *hash_pos = (u8 *) strchr ((const char *) 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++; if (is_valid_hex_string (hash_pos, 128) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]); digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]); digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]); digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]); digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]); digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]); digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]); 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]); u32 salt_len = hash_pos - salt_pos - 1; salt_len /= 2; u8 *salt_buf_ptr = (u8 *) pbkdf2_sha512->salt_buf; if (is_valid_hex_string (salt_pos, salt_len) == false) return (PARSER_SALT_ENCODING); u32 i; for (i = 0; i < salt_len; i++) { salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &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 = atoll ((const char *) iter_pos) - 1; return (PARSER_OK); } int sha512b64s_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9) != 0) return (PARSER_SIGNATURE_UNMATCHED); u64 *digest = (u64 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 tmp_buf[120] = { 0 }; const int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf); if (tmp_len < 64) 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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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; } const int salt_len = tmp_len - 64; salt->salt_len = salt_len; memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len); if (hashconfig->opts_type & OPTS_TYPE_ST_ADD80) { u8 *ptr = (u8 *) salt->salt_buf; ptr[salt->salt_len] = 0x80; } return (PARSER_OK); } int hmacmd5_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if (hashconfig->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); } u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); if (input_buf[32] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 32 - 1; u8 *salt_buf = input_buf + 32 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int hmacsha1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if (hashconfig->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); } u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &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]); if (input_buf[40] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 40 - 1; u8 *salt_buf = input_buf + 40 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int hmacsha256_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if (hashconfig->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); } u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 64) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]); digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]); digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]); digest[7] = hex_to_u32 ((const u8 *) &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]); if (input_buf[64] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 64 - 1; u8 *salt_buf = input_buf + 64 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int hmacsha512_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if (hashconfig->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); } u64 *digest = (u64 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 128) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]); digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]); digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]); digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]); digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]); digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]); digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]); 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]); if (input_buf[128] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 128 - 1; u8 *salt_buf = input_buf + 128 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int krb5pa_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_KRB5PA, input_buf, 10) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt; /** * parse line */ u8 *user_pos = input_buf + 10 + 1; u8 *realm_pos = (u8 *) strchr ((const char *) user_pos, '$'); if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 user_len = realm_pos - user_pos; if (user_len >= 64) return (PARSER_SALT_LENGTH); realm_pos++; u8 *salt_pos = (u8 *) strchr ((const char *) realm_pos, '$'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 realm_len = salt_pos - realm_pos; if (realm_len >= 64) return (PARSER_SALT_LENGTH); salt_pos++; u8 *data_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = data_pos - salt_pos; if (salt_len >= 128) return (PARSER_SALT_LENGTH); data_pos++; u32 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); u8 *timestamp_ptr = (u8 *) krb5pa->timestamp; for (u32 i = 0; i < (36 * 2); i += 2) { const u8 p0 = data_pos[i + 0]; const u8 p1 = data_pos[i + 1]; *timestamp_ptr++ = hex_convert (p1) << 0 | hex_convert (p0) << 4; } u8 *checksum_ptr = (u8 *) krb5pa->checksum; for (u32 i = (36 * 2); i < ((36 + 16) * 2); i += 2) { const u8 p0 = data_pos[i + 0]; const u8 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; /** * parse line */ u8 *salt_pos = input_buf; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; if (salt_len >= 40) return (PARSER_SALT_LENGTH); hash_pos++; u32 hash_len = input_len - 1 - salt_len; if (hash_len != 16) return (PARSER_HASH_LENGTH); /** * valid some data */ u32 user_len = 0; for (u32 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 */ u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; if (is_valid_hex_string (hash_pos, 16) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]); digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]); digest[2] = 0; digest[3] = 0; return (PARSER_OK); } int sapg_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; /** * parse line */ u8 *salt_pos = input_buf; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; if (salt_len >= 40) return (PARSER_SALT_LENGTH); hash_pos++; u32 hash_len = input_len - 1 - salt_len; if (hash_len != 40) return (PARSER_HASH_LENGTH); /** * valid some data */ u32 user_len = 0; for (u32 i = 0; i < salt_len; i++) { if (salt_pos[i] == ' ') continue; user_len++; } // SAP user names cannot be longer than 12 characters // this is kinda buggy. if the username is in utf the length can be up to length 12*3 // so far nobody complained so we stay with this because it helps in optimization // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80) 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 */ u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; if (is_valid_hex_string (hash_pos, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); digest[4] = hex_to_u32 ((const u8 *) &hash_pos[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 drupal7_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3) != 0) return (PARSER_SIGNATURE_UNMATCHED); u64 *digest = (u64 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *iter_pos = input_buf + 3; u32 salt_iter = 1u << itoa64_to_int (iter_pos[0]); if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION); memcpy ((u8 *) salt->salt_sign, input_buf, 4); salt->salt_iter = salt_iter; u8 *salt_pos = iter_pos + 1; u32 salt_len = 8; memcpy ((u8 *) salt->salt_buf, salt_pos, salt_len); salt->salt_len = salt_len; u8 *hash_pos = salt_pos + salt_len; drupal7_decode ((u8 *) digest, hash_pos); // ugly hack start u8 *tmp = (u8 *) 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *salt_buf = input_buf + 6; u32 salt_len = 16; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; u8 *hash_pos = input_buf + 6 + 16; if (is_valid_hex_string (hash_pos, 64) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]); digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]); digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]); digest[7] = hex_to_u32 ((const u8 *) &hash_pos[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 mysql323_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; if (is_valid_hex_string (input_buf, 16) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = 0; digest[3] = 0; digest[0] = byte_swap_32 (digest[0]); digest[1] = byte_swap_32 (digest[1]); digest[2] = 0; digest[3] = 0; return (PARSER_OK); } int rakp_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; rakp_t *rakp = (rakp_t *) hash_buf->esalt; u8 *saltbuf_pos = input_buf; u8 *hashbuf_pos = (u8 *) strchr ((const char *) saltbuf_pos, ':'); if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 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++; u32 hashbuf_len = input_len - saltbuf_len - 1; if (hashbuf_len != 40) return (PARSER_HASH_LENGTH); u8 *salt_ptr = saltbuf_pos; u8 *rakp_ptr = (u8 *) rakp->salt_buf; if (is_valid_hex_string (salt_ptr, saltbuf_len) == false) return (PARSER_SALT_ENCODING); u32 i; u32 j; for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1) { rakp_ptr[j] = hex_to_u8 ((const u8 *) &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 if (is_valid_hex_string (hashbuf_pos, 40) == false) return (PARSER_SALT_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]); digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[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 netscaler_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (memcmp (SIGNATURE_NETSCALER, input_buf, 1) != 0) return (PARSER_SIGNATURE_UNMATCHED); u8 *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; u8 *hash_pos = salt_pos + 8; if (is_valid_hex_string (hash_pos, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); digest[4] = hex_to_u32 ((const u8 *) &hash_pos[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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= MD5M_A; digest[1] -= MD5M_B; digest[2] -= MD5M_C; digest[3] -= MD5M_D; } if (input_buf[32] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u8 *salt_buf_ptr = input_buf + 32 + 1; u32 *salt_buf = salt->salt_buf; if (is_valid_hex_string (salt_buf_ptr, 32) == false) return (PARSER_SALT_ENCODING); salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]); salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]); salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]); salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]); salt->salt_len = 16 + 1; if (input_buf[65] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u8 *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1; salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff; return (PARSER_OK); } int cloudkey_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt; /** * parse line */ u8 *hashbuf_pos = input_buf; u8 *saltbuf_pos = (u8 *) strchr ((const char *) hashbuf_pos, ':'); if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); const u32 hashbuf_len = saltbuf_pos - hashbuf_pos; if (hashbuf_len != 64) return (PARSER_HASH_LENGTH); saltbuf_pos++; u8 *iteration_pos = (u8 *) strchr ((const char *) saltbuf_pos, ':'); if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); const u32 saltbuf_len = iteration_pos - saltbuf_pos; if (saltbuf_len != 32) return (PARSER_SALT_LENGTH); iteration_pos++; u8 *databuf_pos = (u8 *) strchr ((const char *) iteration_pos, ':'); if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); const u32 iteration_len = databuf_pos - iteration_pos; if (iteration_len < 1) return (PARSER_SALT_ITERATION); if (iteration_len > 8) return (PARSER_SALT_ITERATION); const u32 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 if (is_valid_hex_string (hashbuf_pos, 64) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]); digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]); digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]); digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]); digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[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]); // salt u8 *saltbuf_ptr = (u8 *) salt->salt_buf; for (u32 i = 0; i < saltbuf_len; i += 2) { const u8 p0 = saltbuf_pos[i + 0]; const u8 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 = atoll ((const char *) iteration_pos) - 1; // data u8 *databuf_ptr = (u8 *) cloudkey->data_buf; for (u32 i = 0; i < databuf_len; i += 2) { const u8 p0 = databuf_pos[i + 0]; const u8 p1 = databuf_pos[i + 1]; *databuf_ptr++ = hex_convert (p1) << 0 | hex_convert (p0) << 4; } *databuf_ptr++ = 0x80; for (u32 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; /** * parse line */ u8 *hashbuf_pos = input_buf; u8 *domainbuf_pos = (u8 *) strchr ((const char *) hashbuf_pos, ':'); if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); const u32 hashbuf_len = domainbuf_pos - hashbuf_pos; if (hashbuf_len != 32) return (PARSER_HASH_LENGTH); domainbuf_pos++; if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE); u8 *saltbuf_pos = (u8 *) strchr ((const char *) domainbuf_pos, ':'); if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); const u32 domainbuf_len = saltbuf_pos - domainbuf_pos; if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH); saltbuf_pos++; u8 *iteration_pos = (u8 *) strchr ((const char *) saltbuf_pos, ':'); if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); const u32 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 u32 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 u8 tmp_buf[100] = { 0 }; base32_decode (itoa32_to_int, (const u8 *) 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 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc; memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len); if (salt_buf_pc_ptr[0] != '.') return (PARSER_SALT_VALUE); u8 *len_ptr = salt_buf_pc_ptr; *len_ptr = 0; for (u32 i = 1; 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_len_pc = domainbuf_len; // "real" salt u8 *salt_buf_ptr = (u8 *) salt->salt_buf; const u32 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; // iteration salt->salt_iter = atoll ((const char *) iteration_pos); return (PARSER_OK); } int wbb3_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &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]); if (input_buf[40] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 40 - 1; u8 *salt_buf = input_buf + 40 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int opencart_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_13900) || (input_len > DISPLAY_LEN_MAX_13900)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &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]); if (input_buf[40] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 40 - 1; u8 *salt_buf = input_buf + 40 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); if (salt_len != 9) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int racf_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { const u8 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) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *salt_pos = input_buf + 6 + 1; u8 *digest_pos = (u8 *) strchr ((const char *) salt_pos, '*'); if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = digest_pos - salt_pos; if (salt_len > 8) return (PARSER_SALT_LENGTH); u32 hash_len = input_len - 1 - salt_len - 1 - 6; if (hash_len != 16) return (PARSER_HASH_LENGTH); digest_pos++; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc; salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; for (u32 i = 0; i < salt_len; i++) { salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]]; } for (u32 i = salt_len; i < 8; i++) { salt_buf_pc_ptr[i] = 0x40; } u32 tt; IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt); salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u); salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u); if (is_valid_hex_string (digest_pos, 16) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]); IP (digest[0], digest[1], tt); digest[0] = rotr32 (digest[0], 29); digest[1] = rotr32 (digest[1], 29); digest[2] = 0; digest[3] = 0; return (PARSER_OK); } int des_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_14000) || (input_len > DISPLAY_LEN_MAX_14000)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *digest_pos = input_buf; u8 *salt_pos = (u8 *) strchr ((const char *) digest_pos, ':'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); if (input_buf[16] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = salt_pos - digest_pos; u32 hash_len = input_len - 1 - salt_len; if (hash_len != 16) return (PARSER_HASH_LENGTH); if (salt_len != 16) return (PARSER_SALT_LENGTH); salt_pos++; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; u32 tt; salt->salt_buf_pc[0] = byte_swap_32 (salt->salt_buf[0]); salt->salt_buf_pc[1] = byte_swap_32 (salt->salt_buf[1]); IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt); if (is_valid_hex_string (digest_pos, 16) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]); IP (digest[0], digest[1], tt); digest[2] = 0; digest[3] = 0; return (PARSER_OK); } int lotus5_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); return (PARSER_OK); } int lotus6_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 tmp_buf[120] = { 0 }; base64_decode (lotus64_to_int, (const u8 *) 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 tmp_buf[120] = { 0 }; base64_decode (lotus64_to_int, (const u8 *) 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] = { 0 }; memcpy (tmp_iter_buf, tmp_buf + 16, 10); tmp_iter_buf[10] = 0; salt->salt_iter = atoll ((const char *) 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *salt_buf_pos = input_buf; u8 *hash_buf_pos = salt_buf_pos + 6; if (is_valid_hex_string (hash_buf_pos, 64) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]); digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]); digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]); digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]); digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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; } u8 *salt_buf_ptr = (u8 *) salt->salt_buf; const u32 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int phps_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; if (memcmp (SIGNATURE_PHPS, input_buf, 6) != 0) return (PARSER_SIGNATURE_UNMATCHED); salt_t *salt = hash_buf->salt; u8 *salt_buf = input_buf + 6; u8 *digest_buf = (u8 *) strchr ((const char *) salt_buf, '$'); if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = digest_buf - salt_buf; digest_buf++; // skip the '$' symbol u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; if (is_valid_hex_string (digest_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= MD5M_A; digest[1] -= MD5M_B; digest[2] -= MD5M_C; digest[3] -= MD5M_D; } return (PARSER_OK); } int mediawiki_b_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *salt_buf = input_buf + 3; u8 *digest_buf = (u8 *) strchr ((const char *) salt_buf, '$'); if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = digest_buf - salt_buf; digest_buf++; // skip the '$' symbol u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt_buf_ptr[salt_len] = 0x2d; salt->salt_len = salt_len + 1; if (is_valid_hex_string (digest_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= MD5M_A; digest[1] -= MD5M_B; digest[2] -= MD5M_C; digest[3] -= MD5M_D; } return (PARSER_OK); } int peoplesoft_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 tmp_buf[100] = { 0 }; base64_decode (base64_to_int, (const u8 *) 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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= SHA1M_A; digest[1] -= SHA1M_B; digest[2] -= SHA1M_C; digest[3] -= SHA1M_D; digest[4] -= SHA1M_E; } salt->salt_buf[0] = 0x80; salt->salt_len = 0; return (PARSER_OK); } int skype_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= MD5M_A; digest[1] -= MD5M_B; digest[2] -= MD5M_C; digest[3] -= MD5M_D; } if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 32 - 1; u8 *salt_buf = input_buf + 32 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt; /** * parse line */ u8 *saltlen_pos = input_buf + 1 + 3 + 1; u8 *saltbuf_pos = (u8 *) strchr ((const char *) saltlen_pos, '$'); if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 saltlen_len = saltbuf_pos - saltlen_pos; if (saltlen_len != 2) return (PARSER_SALT_LENGTH); saltbuf_pos++; u8 *keylen_pos = (u8 *) strchr ((const char *) saltbuf_pos, '$'); if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 saltbuf_len = keylen_pos - saltbuf_pos; if (saltbuf_len != 32) return (PARSER_SALT_LENGTH); keylen_pos++; u8 *keybuf_pos = (u8 *) strchr ((const char *) keylen_pos, '$'); if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 keylen_len = keybuf_pos - keylen_pos; if (keylen_len != 2) return (PARSER_SALT_LENGTH); keybuf_pos++; u8 *databuf_pos = (u8 *) strchr ((const char *) keybuf_pos, '$'); if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 keybuf_len = databuf_pos - keybuf_pos; if (keybuf_len != 32) return (PARSER_SALT_LENGTH); databuf_pos++; // u32 data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1; // // the following check is not needed, since we already checked all the other lengths (sub strings) // if (data_len != 3072) return (PARSER_SALT_LENGTH); /** * copy data */ if (is_valid_hex_string (keybuf_pos, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &keybuf_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]); if (is_valid_hex_string (saltbuf_pos, 32) == false) return (PARSER_HASH_ENCODING); salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]); salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]); salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]); salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]); salt->salt_len = 16; salt->salt_iter = ROUNDS_ANDROIDFDE - 1; if (is_valid_hex_string (databuf_pos, 3072) == false) return (PARSER_SALT_ENCODING); for (u32 i = 0, j = 0; i < 3072; i += 8, j += 1) { androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]); androidfde->data[j] = byte_swap_32 (androidfde->data[j]); } return (PARSER_OK); } int scrypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_SCRYPT, input_buf, 6) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; /** * parse line */ // first is the N salt parameter u8 *N_pos = input_buf + 6; if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED); N_pos++; salt->scrypt_N = atoll ((const char *) N_pos); // r u8 *r_pos = (u8 *) strchr ((const char *) N_pos, ':'); if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); r_pos++; salt->scrypt_r = atoll ((const char *) r_pos); // p u8 *p_pos = (u8 *) strchr ((const char *) r_pos, ':'); if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); p_pos++; salt->scrypt_p = atoll ((const char *) p_pos); // salt u8 *saltbuf_pos = (u8 *) strchr ((const char *) p_pos, ':'); if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); saltbuf_pos++; u8 *hash_pos = (u8 *) strchr ((const char *) saltbuf_pos, ':'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); hash_pos++; // base64 decode int salt_len_base64 = hash_pos - saltbuf_pos; if (salt_len_base64 > 45) return (PARSER_SALT_LENGTH); u8 tmp_buf[33] = { 0 }; int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, salt_len_base64, tmp_buf); u8 *salt_buf_ptr = (u8 *) 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, (const u8 *) hash_pos, tmp_len, tmp_buf); memcpy (digest, tmp_buf, 32); return (PARSER_OK); } int juniper_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; /** * parse line */ u8 decrypted[76] = { 0 }; // iv + hash juniper_decrypt_hash (input_buf, decrypted); u8 *md5crypt_hash = decrypted + 12; if (memcmp ((const char *) md5crypt_hash, "$1$danastre$", 12) != 0) return (PARSER_SALT_VALUE); salt->salt_iter = ROUNDS_MD5CRYPT; u8 *salt_pos = md5crypt_hash + 3; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); // or simply salt_pos + 8 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); salt->salt_len = hash_pos - salt_pos; // should be 8 memcpy ((u8 *) salt->salt_buf, salt_pos, salt->salt_len); hash_pos++; md5crypt_decode ((u8 *) digest, hash_pos); return (PARSER_OK); } int cisco8_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_CISCO8, input_buf, 3) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) 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 u8 *salt_pos = input_buf + 3; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; if (salt_len != 14) return (PARSER_SALT_LENGTH); hash_pos++; u8 *salt_buf_ptr = (u8 *) 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 u8 tmp_buf[100] = { 0 }; u32 hash_len = input_len - 3 - salt_len - 1; int tmp_len = base64_decode (itoa64_to_int, (const u8 *) 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_CISCO9, input_buf, 3) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; /** * parse line */ // first is *raw* salt u8 *salt_pos = input_buf + 3; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; if (salt_len != 14) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; hash_pos++; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; memcpy (salt_buf_ptr, salt_pos, salt_len); salt_buf_ptr[salt_len] = 0; // base64 decode hash u8 tmp_buf[100] = { 0 }; u32 hash_len = input_len - 3 - salt_len - 1; int tmp_len = base64_decode (itoa64_to_int, (const u8 *) 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; office2007_t *office2007 = (office2007_t *) hash_buf->esalt; /** * parse line */ u8 *version_pos = input_buf + 8 + 1; u8 *verifierHashSize_pos = (u8 *) strchr ((const char *) version_pos, '*'); if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 version_len = verifierHashSize_pos - version_pos; verifierHashSize_pos++; u8 *keySize_pos = (u8 *) strchr ((const char *) verifierHashSize_pos, '*'); if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos; keySize_pos++; u8 *saltSize_pos = (u8 *) strchr ((const char *) keySize_pos, '*'); if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 keySize_len = saltSize_pos - keySize_pos; saltSize_pos++; u8 *osalt_pos = (u8 *) strchr ((const char *) saltSize_pos, '*'); if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 saltSize_len = osalt_pos - saltSize_pos; osalt_pos++; u8 *encryptedVerifier_pos = (u8 *) strchr ((const char *) osalt_pos, '*'); if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 osalt_len = encryptedVerifier_pos - osalt_pos; encryptedVerifier_pos++; u8 *encryptedVerifierHash_pos = (u8 *) strchr ((const char *) encryptedVerifier_pos, '*'); if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos; encryptedVerifierHash_pos++; u32 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); if (version_len != 4) return (PARSER_SALT_LENGTH); if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH); if (keySize_len != 3) return (PARSER_SALT_LENGTH); if (saltSize_len != 2) return (PARSER_SALT_LENGTH); if (osalt_len != 32) return (PARSER_SALT_LENGTH); if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH); const u32 version = atoll ((const char *) version_pos); const u32 verifierHashSize = atoll ((const char *) verifierHashSize_pos); const u32 keySize = atoll ((const char *) keySize_pos); const u32 saltSize = atoll ((const char *) saltSize_pos); if (version != 2007) return (PARSER_SALT_VALUE); if (verifierHashSize != 20) return (PARSER_SALT_VALUE); if (saltSize != 16) return (PARSER_SALT_VALUE); if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE); office2007->keySize = keySize; /** * salt */ salt->salt_len = 16; salt->salt_iter = ROUNDS_OFFICE2007; if (is_valid_hex_string (osalt_pos, 32) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]); salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]); salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]); salt->salt_buf[3] = hex_to_u32 ((const u8 *) &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]); /** * esalt */ if (is_valid_hex_string (encryptedVerifier_pos, 32) == false) return (PARSER_HASH_ENCODING); office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]); office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]); office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]); office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]); office2007->encryptedVerifier[0] = byte_swap_32 (office2007->encryptedVerifier[0]); office2007->encryptedVerifier[1] = byte_swap_32 (office2007->encryptedVerifier[1]); office2007->encryptedVerifier[2] = byte_swap_32 (office2007->encryptedVerifier[2]); office2007->encryptedVerifier[3] = byte_swap_32 (office2007->encryptedVerifier[3]); if (is_valid_hex_string (encryptedVerifierHash_pos, 40) == false) return (PARSER_HASH_ENCODING); office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]); office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]); office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]); office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]); office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]); office2007->encryptedVerifierHash[0] = byte_swap_32 (office2007->encryptedVerifierHash[0]); office2007->encryptedVerifierHash[1] = byte_swap_32 (office2007->encryptedVerifierHash[1]); office2007->encryptedVerifierHash[2] = byte_swap_32 (office2007->encryptedVerifierHash[2]); office2007->encryptedVerifierHash[3] = byte_swap_32 (office2007->encryptedVerifierHash[3]); office2007->encryptedVerifierHash[4] = byte_swap_32 (office2007->encryptedVerifierHash[4]); /** * 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; office2010_t *office2010 = (office2010_t *) hash_buf->esalt; /** * parse line */ u8 *version_pos = input_buf + 8 + 1; u8 *spinCount_pos = (u8 *) strchr ((const char *) version_pos, '*'); if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 version_len = spinCount_pos - version_pos; spinCount_pos++; u8 *keySize_pos = (u8 *) strchr ((const char *) spinCount_pos, '*'); if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 spinCount_len = keySize_pos - spinCount_pos; keySize_pos++; u8 *saltSize_pos = (u8 *) strchr ((const char *) keySize_pos, '*'); if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 keySize_len = saltSize_pos - keySize_pos; saltSize_pos++; u8 *osalt_pos = (u8 *) strchr ((const char *) saltSize_pos, '*'); if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 saltSize_len = osalt_pos - saltSize_pos; osalt_pos++; u8 *encryptedVerifier_pos = (u8 *) strchr ((const char *) osalt_pos, '*'); if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 osalt_len = encryptedVerifier_pos - osalt_pos; encryptedVerifier_pos++; u8 *encryptedVerifierHash_pos = (u8 *) strchr ((const char *) encryptedVerifier_pos, '*'); if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos; encryptedVerifierHash_pos++; u32 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); if (version_len != 4) return (PARSER_SALT_LENGTH); if (spinCount_len != 6) return (PARSER_SALT_LENGTH); if (keySize_len != 3) return (PARSER_SALT_LENGTH); if (saltSize_len != 2) return (PARSER_SALT_LENGTH); if (osalt_len != 32) return (PARSER_SALT_LENGTH); if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH); const u32 version = atoll ((const char *) version_pos); const u32 spinCount = atoll ((const char *) spinCount_pos); const u32 keySize = atoll ((const char *) keySize_pos); const u32 saltSize = atoll ((const char *) saltSize_pos); if (version != 2010) return (PARSER_SALT_VALUE); if (spinCount != 100000) return (PARSER_SALT_VALUE); if (keySize != 128) return (PARSER_SALT_VALUE); if (saltSize != 16) return (PARSER_SALT_VALUE); /** * salt */ salt->salt_len = 16; salt->salt_iter = spinCount; if (is_valid_hex_string (osalt_pos, 32) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]); salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]); salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]); salt->salt_buf[3] = hex_to_u32 ((const u8 *) &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]); /** * esalt */ if (is_valid_hex_string (encryptedVerifier_pos, 32) == false) return (PARSER_HASH_ENCODING); office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]); office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]); office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]); office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]); office2010->encryptedVerifier[0] = byte_swap_32 (office2010->encryptedVerifier[0]); office2010->encryptedVerifier[1] = byte_swap_32 (office2010->encryptedVerifier[1]); office2010->encryptedVerifier[2] = byte_swap_32 (office2010->encryptedVerifier[2]); office2010->encryptedVerifier[3] = byte_swap_32 (office2010->encryptedVerifier[3]); if (is_valid_hex_string (encryptedVerifierHash_pos, 64) == false) return (PARSER_HASH_ENCODING); office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]); office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]); office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]); office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]); office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]); office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]); office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]); office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]); office2010->encryptedVerifierHash[0] = byte_swap_32 (office2010->encryptedVerifierHash[0]); office2010->encryptedVerifierHash[1] = byte_swap_32 (office2010->encryptedVerifierHash[1]); office2010->encryptedVerifierHash[2] = byte_swap_32 (office2010->encryptedVerifierHash[2]); office2010->encryptedVerifierHash[3] = byte_swap_32 (office2010->encryptedVerifierHash[3]); office2010->encryptedVerifierHash[4] = byte_swap_32 (office2010->encryptedVerifierHash[4]); office2010->encryptedVerifierHash[5] = byte_swap_32 (office2010->encryptedVerifierHash[5]); office2010->encryptedVerifierHash[6] = byte_swap_32 (office2010->encryptedVerifierHash[6]); office2010->encryptedVerifierHash[7] = byte_swap_32 (office2010->encryptedVerifierHash[7]); /** * 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; office2013_t *office2013 = (office2013_t *) hash_buf->esalt; /** * parse line */ u8 *version_pos = input_buf + 8 + 1; u8 *spinCount_pos = (u8 *) strchr ((const char *) version_pos, '*'); if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 version_len = spinCount_pos - version_pos; spinCount_pos++; u8 *keySize_pos = (u8 *) strchr ((const char *) spinCount_pos, '*'); if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 spinCount_len = keySize_pos - spinCount_pos; keySize_pos++; u8 *saltSize_pos = (u8 *) strchr ((const char *) keySize_pos, '*'); if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 keySize_len = saltSize_pos - keySize_pos; saltSize_pos++; u8 *osalt_pos = (u8 *) strchr ((const char *) saltSize_pos, '*'); if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 saltSize_len = osalt_pos - saltSize_pos; osalt_pos++; u8 *encryptedVerifier_pos = (u8 *) strchr ((const char *) osalt_pos, '*'); if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 osalt_len = encryptedVerifier_pos - osalt_pos; encryptedVerifier_pos++; u8 *encryptedVerifierHash_pos = (u8 *) strchr ((const char *) encryptedVerifier_pos, '*'); if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos; encryptedVerifierHash_pos++; u32 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); if (version_len != 4) return (PARSER_SALT_LENGTH); if (spinCount_len != 6) return (PARSER_SALT_LENGTH); if (keySize_len != 3) return (PARSER_SALT_LENGTH); if (saltSize_len != 2) return (PARSER_SALT_LENGTH); if (osalt_len != 32) return (PARSER_SALT_LENGTH); if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH); const u32 version = atoll ((const char *) version_pos); const u32 spinCount = atoll ((const char *) spinCount_pos); const u32 keySize = atoll ((const char *) keySize_pos); const u32 saltSize = atoll ((const char *) saltSize_pos); if (version != 2013) return (PARSER_SALT_VALUE); if (spinCount != 100000) return (PARSER_SALT_VALUE); if (keySize != 256) return (PARSER_SALT_VALUE); if (saltSize != 16) return (PARSER_SALT_VALUE); /** * salt */ salt->salt_len = 16; salt->salt_iter = spinCount; if (is_valid_hex_string (osalt_pos, 32) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]); salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]); salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]); salt->salt_buf[3] = hex_to_u32 ((const u8 *) &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]); /** * esalt */ if (is_valid_hex_string (encryptedVerifier_pos, 32) == false) return (PARSER_HASH_ENCODING); office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]); office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]); office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]); office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]); office2013->encryptedVerifier[0] = byte_swap_32 (office2013->encryptedVerifier[0]); office2013->encryptedVerifier[1] = byte_swap_32 (office2013->encryptedVerifier[1]); office2013->encryptedVerifier[2] = byte_swap_32 (office2013->encryptedVerifier[2]); office2013->encryptedVerifier[3] = byte_swap_32 (office2013->encryptedVerifier[3]); if (is_valid_hex_string (encryptedVerifierHash_pos, 64) == false) return (PARSER_HASH_ENCODING); office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]); office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]); office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]); office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]); office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]); office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]); office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]); office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]); office2013->encryptedVerifierHash[0] = byte_swap_32 (office2013->encryptedVerifierHash[0]); office2013->encryptedVerifierHash[1] = byte_swap_32 (office2013->encryptedVerifierHash[1]); office2013->encryptedVerifierHash[2] = byte_swap_32 (office2013->encryptedVerifierHash[2]); office2013->encryptedVerifierHash[3] = byte_swap_32 (office2013->encryptedVerifierHash[3]); office2013->encryptedVerifierHash[4] = byte_swap_32 (office2013->encryptedVerifierHash[4]); office2013->encryptedVerifierHash[5] = byte_swap_32 (office2013->encryptedVerifierHash[5]); office2013->encryptedVerifierHash[6] = byte_swap_32 (office2013->encryptedVerifierHash[6]); office2013->encryptedVerifierHash[7] = byte_swap_32 (office2013->encryptedVerifierHash[7]); /** * 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH); if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12) != 0) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12) != 0)) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt; /** * parse line */ u8 *version_pos = input_buf + 11; u8 *osalt_pos = (u8 *) strchr ((const char *) version_pos, '*'); if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 version_len = osalt_pos - version_pos; if (version_len != 1) return (PARSER_SALT_LENGTH); osalt_pos++; u8 *encryptedVerifier_pos = (u8 *) strchr ((const char *) osalt_pos, '*'); if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 osalt_len = encryptedVerifier_pos - osalt_pos; if (osalt_len != 32) return (PARSER_SALT_LENGTH); encryptedVerifier_pos++; u8 *encryptedVerifierHash_pos = (u8 *) strchr ((const char *) encryptedVerifier_pos, '*'); if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos; if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH); encryptedVerifierHash_pos++; // The following check is implied (and therefore not needed aka dead code): // u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1; // if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH); const u32 version = *version_pos - 0x30; if (version != 0 && version != 1) return (PARSER_SALT_VALUE); /** * esalt */ oldoffice01->version = version; if (is_valid_hex_string (encryptedVerifier_pos, 32) == false) return (PARSER_HASH_ENCODING); oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]); oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]); oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]); oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]); if (is_valid_hex_string (encryptedVerifierHash_pos, 32) == false) return (PARSER_HASH_ENCODING); oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]); oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]); oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]); oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]); /** * salt */ salt->salt_len = 16; if (is_valid_hex_string (osalt_pos, 32) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]); salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]); salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]); salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]); // 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { return oldoffice01_parse_hash (input_buf, input_len, hash_buf, hashconfig); } int oldoffice01cm2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH); if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12) != 0) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12) != 0)) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt; /** * parse line */ u8 *version_pos = input_buf + 11; u8 *osalt_pos = (u8 *) strchr ((const char *) version_pos, '*'); if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 version_len = osalt_pos - version_pos; osalt_pos++; u8 *encryptedVerifier_pos = (u8 *) strchr ((const char *) osalt_pos, '*'); if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 osalt_len = encryptedVerifier_pos - osalt_pos; encryptedVerifier_pos++; u8 *encryptedVerifierHash_pos = (u8 *) strchr ((const char *) encryptedVerifier_pos, '*'); if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos; encryptedVerifierHash_pos++; u8 *rc4key_pos = (u8 *) strchr ((const char *) encryptedVerifierHash_pos, ':'); if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos; rc4key_pos++; u32 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); if (version_len != 1) return (PARSER_SALT_LENGTH); if (osalt_len != 32) return (PARSER_SALT_LENGTH); if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH); if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH); const u32 version = *version_pos - 0x30; if (version != 0 && version != 1) return (PARSER_SALT_VALUE); /** * esalt */ oldoffice01->version = version; if (is_valid_hex_string (encryptedVerifier_pos, 32) == false) return (PARSER_HASH_ENCODING); oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]); oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]); oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]); oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]); if (is_valid_hex_string (encryptedVerifierHash_pos, 32) == false) return (PARSER_HASH_ENCODING); oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]); oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]); oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]); oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]); 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; if (is_valid_hex_string (osalt_pos, 32) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]); salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]); salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]); salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]); // 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH); if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12) != 0) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12) != 0)) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt; /** * parse line */ u8 *version_pos = input_buf + 11; u8 *osalt_pos = (u8 *) strchr ((const char *) version_pos, '*'); if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 version_len = osalt_pos - version_pos; if (version_len != 1) return (PARSER_SALT_LENGTH); osalt_pos++; u8 *encryptedVerifier_pos = (u8 *) strchr ((const char *) osalt_pos, '*'); if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 osalt_len = encryptedVerifier_pos - osalt_pos; if (osalt_len != 32) return (PARSER_SALT_LENGTH); encryptedVerifier_pos++; u8 *encryptedVerifierHash_pos = (u8 *) strchr ((const char *) encryptedVerifier_pos, '*'); if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos; if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH); encryptedVerifierHash_pos++; // The following check is implied (and therefore not needed aka dead code): // u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1; // if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH); const u32 version = *version_pos - 0x30; if (version != 3 && version != 4) return (PARSER_SALT_VALUE); /** * esalt */ oldoffice34->version = version; if (is_valid_hex_string (encryptedVerifier_pos, 32) == false) return (PARSER_HASH_ENCODING); oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]); oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]); oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]); oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]); if (is_valid_hex_string (encryptedVerifierHash_pos, 40) == false) return (PARSER_HASH_ENCODING); oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]); oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]); oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]); oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]); oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]); /** * salt */ salt->salt_len = 16; if (is_valid_hex_string (osalt_pos, 32) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]); salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]); salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]); salt->salt_buf[3] = hex_to_u32 ((const u8 *) &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] = 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12) != 0) return (PARSER_SIGNATURE_UNMATCHED); return oldoffice34_parse_hash (input_buf, input_len, hash_buf, hashconfig); } int oldoffice34cm2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt; /** * parse line */ u8 *version_pos = input_buf + 11; u8 *osalt_pos = (u8 *) strchr ((const char *) version_pos, '*'); if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 version_len = osalt_pos - version_pos; osalt_pos++; u8 *encryptedVerifier_pos = (u8 *) strchr ((const char *) osalt_pos, '*'); if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 osalt_len = encryptedVerifier_pos - osalt_pos; encryptedVerifier_pos++; u8 *encryptedVerifierHash_pos = (u8 *) strchr ((const char *) encryptedVerifier_pos, '*'); if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos; encryptedVerifierHash_pos++; u8 *rc4key_pos = (u8 *) strchr ((const char *) encryptedVerifierHash_pos, ':'); if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos; rc4key_pos++; u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1; if (version_len != 1) return (PARSER_SALT_LENGTH); if (osalt_len != 32) return (PARSER_SALT_LENGTH); if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH); if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH); if (rc4key_len != 10) return (PARSER_SALT_LENGTH); const u32 version = *version_pos - 0x30; if (version != 3 && version != 4) return (PARSER_SALT_VALUE); /** * esalt */ oldoffice34->version = version; if (is_valid_hex_string (encryptedVerifier_pos, 32) == false) return (PARSER_HASH_ENCODING); oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]); oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]); oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]); oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]); if (is_valid_hex_string (encryptedVerifierHash_pos, 40) == false) return (PARSER_HASH_ENCODING); oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]); oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]); oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]); oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]); oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]); 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; if (is_valid_hex_string (osalt_pos, 32) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]); salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]); salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]); salt->salt_buf[3] = hex_to_u32 ((const u8 *) &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] = 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); return (PARSER_OK); } int djangosha1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *signature_pos = input_buf; u8 *salt_pos = (u8 *) strchr ((const char *) signature_pos, '$'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 signature_len = salt_pos - signature_pos; if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED); salt_pos++; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; if (salt_len > 32) return (PARSER_SALT_LENGTH); hash_pos++; u32 hash_len = input_len - signature_len - 1 - salt_len - 1; if (hash_len != 40) return (PARSER_SALT_LENGTH); if (is_valid_hex_string (hash_pos, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); digest[4] = hex_to_u32 ((const u8 *) &hash_pos[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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= SHA1M_A; digest[1] -= SHA1M_B; digest[2] -= SHA1M_C; digest[3] -= SHA1M_D; digest[4] -= SHA1M_E; } u8 *salt_buf_ptr = (u8 *) salt->salt_buf; memcpy (salt_buf_ptr, salt_pos, salt_len); salt->salt_len = salt_len; return (PARSER_OK); } int djangopbkdf2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt; /** * parse line */ u8 *iter_pos = input_buf + 14; const int iter = atoi ((const char *) iter_pos); if (iter < 1) return (PARSER_SALT_ITERATION); salt->salt_iter = iter - 1; u8 *salt_pos = (u8 *) strchr ((const char *) iter_pos, '$'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); salt_pos++; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); const u32 salt_len = hash_pos - salt_pos; hash_pos++; u8 *salt_buf_ptr = (u8 *) 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 u8 tmp_buf[100] = { 0 }; u32 hash_len = input_len - (hash_pos - input_buf); if (hash_len != 44) return (PARSER_HASH_LENGTH); base64_decode (base64_to_int, (const u8 *) 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 16) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = 0; digest[3] = 0; if (input_buf[16] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); if (input_buf[18] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); if (input_buf[20] != hashconfig->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); u8 *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1; if (is_valid_hex_string (salt_buf, 32) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]); salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]); salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]); salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]); salt->salt_len = 16; return (PARSER_OK); } int crammd5_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt; salt_t *salt = hash_buf->salt; u8 *salt_pos = input_buf + 10; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; hash_pos++; u32 hash_len = input_len - 10 - salt_len - 1; // base64 decode salt if (salt_len > 133) return (PARSER_SALT_LENGTH); u8 tmp_buf[100] = { 0 }; salt_len = base64_decode (base64_to_int, (const u8 *) 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 hash if (hash_len > 133) return (PARSER_HASH_LENGTH); memset (tmp_buf, 0, sizeof (tmp_buf)); hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf); if (hash_len < 32 + 1) return (PARSER_HASH_LENGTH); u32 user_len = hash_len - 32; const u8 *tmp_hash = tmp_buf + user_len; user_len--; // skip the trailing space if (is_valid_hex_string (tmp_hash, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 (&tmp_hash[ 0]); digest[1] = hex_to_u32 (&tmp_hash[ 8]); digest[2] = hex_to_u32 (&tmp_hash[16]); digest[3] = hex_to_u32 (&tmp_hash[24]); // 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *iter_pos = input_buf + 10; u32 iter = atoll ((const char *) iter_pos); if (iter < 1) { return (PARSER_SALT_ITERATION); } iter--; // first iteration is special salt->salt_iter = iter; u8 *base64_pos = (u8 *) strchr ((const char *) iter_pos, '}'); if (base64_pos == NULL) { return (PARSER_SIGNATURE_UNMATCHED); } base64_pos++; // base64 decode salt const u32 base64_len = input_len - (base64_pos - input_buf); u8 tmp_buf[100] = { 0 }; const u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf); if (decoded_len < 24) { return (PARSER_SALT_LENGTH); } // copy the salt const u32 salt_len = decoded_len - 20; if (salt_len > 16) return (PARSER_SALT_LENGTH); memcpy (&salt->salt_buf, tmp_buf + 20, salt_len); salt->salt_len = salt_len; // set digest u32 *digest_ptr = (u32*) 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_4521) || (input_len > DISPLAY_LEN_MAX_4521)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &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]); if (input_buf[40] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 40 - 1; u8 *salt_buf = input_buf + 40 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); if (salt_len != 32) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int punbb_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_4522) || (input_len > DISPLAY_LEN_MAX_4522)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &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]); if (input_buf[40] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 40 - 1; u8 *salt_buf = input_buf + 40 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); if (salt_len != 12) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int pdf11_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_PDF, input_buf, 5) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; pdf_t *pdf = (pdf_t *) hash_buf->esalt; /** * parse line */ u8 *V_pos = input_buf + 5; u8 *R_pos = (u8 *) strchr ((const char *) V_pos, '*'); if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 V_len = R_pos - V_pos; R_pos++; u8 *bits_pos = (u8 *) strchr ((const char *) R_pos, '*'); if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 R_len = bits_pos - R_pos; bits_pos++; u8 *P_pos = (u8 *) strchr ((const char *) bits_pos, '*'); if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 bits_len = P_pos - bits_pos; P_pos++; u8 *enc_md_pos = (u8 *) strchr ((const char *) P_pos, '*'); if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 P_len = enc_md_pos - P_pos; enc_md_pos++; u8 *id_len_pos = (u8 *) strchr ((const char *) enc_md_pos, '*'); if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 enc_md_len = id_len_pos - enc_md_pos; id_len_pos++; u8 *id_buf_pos = (u8 *) strchr ((const char *) id_len_pos, '*'); if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 id_len_len = id_buf_pos - id_len_pos; id_buf_pos++; u8 *u_len_pos = (u8 *) strchr ((const char *) id_buf_pos, '*'); if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 id_buf_len = u_len_pos - id_buf_pos; if (id_buf_len != 32) return (PARSER_SALT_LENGTH); u_len_pos++; u8 *u_buf_pos = (u8 *) strchr ((const char *) u_len_pos, '*'); if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 u_len_len = u_buf_pos - u_len_pos; u_buf_pos++; u8 *o_len_pos = (u8 *) strchr ((const char *) u_buf_pos, '*'); if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 u_buf_len = o_len_pos - u_buf_pos; if (u_buf_len != 64) return (PARSER_SALT_LENGTH); o_len_pos++; u8 *o_buf_pos = (u8 *) strchr ((const char *) o_len_pos, '*'); if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 o_len_len = o_buf_pos - o_len_pos; o_buf_pos++; u32 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 ((const char *) V_pos); const int R = atoi ((const char *) R_pos); const int P = atoi ((const char *) P_pos); if (V != 1) return (PARSER_SALT_VALUE); if (R != 2) return (PARSER_SALT_VALUE); const int enc_md = atoi ((const char *) enc_md_pos); if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE); const int id_len = atoi ((const char *) id_len_pos); const int u_len = atoi ((const char *) u_len_pos); const int o_len = atoi ((const char *) 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 ((const char *) 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; if (is_valid_hex_string (id_buf_pos, 32) == false) return (PARSER_SALT_ENCODING); pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]); pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]); pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]); pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]); pdf->id_len = id_len; if (is_valid_hex_string (u_buf_pos, 64) == false) return (PARSER_SALT_ENCODING); pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]); pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]); pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]); pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]); pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]); pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]); pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]); pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]); pdf->u_len = u_len; if (is_valid_hex_string (o_buf_pos, 64) == false) return (PARSER_SALT_ENCODING); pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]); pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]); pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]); pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]); pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]); pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]); pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]); pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]); pdf->o_len = o_len; // 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { return pdf11_parse_hash (input_buf, input_len, hash_buf, hashconfig); } int pdf11cm2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_PDF, input_buf, 5) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; pdf_t *pdf = (pdf_t *) hash_buf->esalt; /** * parse line */ u8 *V_pos = input_buf + 5; u8 *R_pos = (u8 *) strchr ((const char *) V_pos, '*'); if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 V_len = R_pos - V_pos; R_pos++; u8 *bits_pos = (u8 *) strchr ((const char *) R_pos, '*'); if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 R_len = bits_pos - R_pos; bits_pos++; u8 *P_pos = (u8 *) strchr ((const char *) bits_pos, '*'); if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 bits_len = P_pos - bits_pos; P_pos++; u8 *enc_md_pos = (u8 *) strchr ((const char *) P_pos, '*'); if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 P_len = enc_md_pos - P_pos; enc_md_pos++; u8 *id_len_pos = (u8 *) strchr ((const char *) enc_md_pos, '*'); if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 enc_md_len = id_len_pos - enc_md_pos; id_len_pos++; u8 *id_buf_pos = (u8 *) strchr ((const char *) id_len_pos, '*'); if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 id_len_len = id_buf_pos - id_len_pos; id_buf_pos++; u8 *u_len_pos = (u8 *) strchr ((const char *) id_buf_pos, '*'); if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 id_buf_len = u_len_pos - id_buf_pos; if (id_buf_len != 32) return (PARSER_SALT_LENGTH); u_len_pos++; u8 *u_buf_pos = (u8 *) strchr ((const char *) u_len_pos, '*'); if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 u_len_len = u_buf_pos - u_len_pos; u_buf_pos++; u8 *o_len_pos = (u8 *) strchr ((const char *) u_buf_pos, '*'); if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 u_buf_len = o_len_pos - u_buf_pos; if (u_buf_len != 64) return (PARSER_SALT_LENGTH); o_len_pos++; u8 *o_buf_pos = (u8 *) strchr ((const char *) o_len_pos, '*'); if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 o_len_len = o_buf_pos - o_len_pos; o_buf_pos++; u8 *rc4key_pos = (u8 *) strchr ((const char *) o_buf_pos, ':'); if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 o_buf_len = rc4key_pos - o_buf_pos; if (o_buf_len != 64) return (PARSER_SALT_LENGTH); rc4key_pos++; u32 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 ((const char *) V_pos); const int R = atoi ((const char *) R_pos); const int P = atoi ((const char *) P_pos); if (V != 1) return (PARSER_SALT_VALUE); if (R != 2) return (PARSER_SALT_VALUE); const int enc_md = atoi ((const char *) enc_md_pos); if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE); const int id_len = atoi ((const char *) id_len_pos); const int u_len = atoi ((const char *) u_len_pos); const int o_len = atoi ((const char *) 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 ((const char *) 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; if (is_valid_hex_string (id_buf_pos, 32) == false) return (PARSER_SALT_ENCODING); pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]); pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]); pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]); pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]); pdf->id_len = id_len; if (is_valid_hex_string (u_buf_pos, 64) == false) return (PARSER_SALT_ENCODING); pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]); pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]); pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]); pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]); pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]); pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]); pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]); pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]); pdf->u_len = u_len; if (is_valid_hex_string (o_buf_pos, 64) == false) return (PARSER_SALT_ENCODING); pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]); pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]); pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]); pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]); pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]); pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]); pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]); pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]); pdf->o_len = o_len; 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_PDF, input_buf, 5) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; pdf_t *pdf = (pdf_t *) hash_buf->esalt; /** * parse line */ u8 *V_pos = input_buf + 5; u8 *R_pos = (u8 *) strchr ((const char *) V_pos, '*'); if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 V_len = R_pos - V_pos; R_pos++; u8 *bits_pos = (u8 *) strchr ((const char *) R_pos, '*'); if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 R_len = bits_pos - R_pos; bits_pos++; u8 *P_pos = (u8 *) strchr ((const char *) bits_pos, '*'); if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 bits_len = P_pos - bits_pos; P_pos++; u8 *enc_md_pos = (u8 *) strchr ((const char *) P_pos, '*'); if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 P_len = enc_md_pos - P_pos; enc_md_pos++; u8 *id_len_pos = (u8 *) strchr ((const char *) enc_md_pos, '*'); if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 enc_md_len = id_len_pos - enc_md_pos; id_len_pos++; u8 *id_buf_pos = (u8 *) strchr ((const char *) id_len_pos, '*'); if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 id_len_len = id_buf_pos - id_len_pos; id_buf_pos++; u8 *u_len_pos = (u8 *) strchr ((const char *) id_buf_pos, '*'); if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 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++; u8 *u_buf_pos = (u8 *) strchr ((const char *) u_len_pos, '*'); if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 u_len_len = u_buf_pos - u_len_pos; u_buf_pos++; u8 *o_len_pos = (u8 *) strchr ((const char *) u_buf_pos, '*'); if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 u_buf_len = o_len_pos - u_buf_pos; if (u_buf_len != 64) return (PARSER_SALT_LENGTH); o_len_pos++; u8 *o_buf_pos = (u8 *) strchr ((const char *) o_len_pos, '*'); if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 o_len_len = o_buf_pos - o_len_pos; o_buf_pos++; u32 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 ((const char *) V_pos); const int R = atoi ((const char *) R_pos); const int P = atoi ((const char *) 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 ((const char *) id_len_pos); const int u_len = atoi ((const char *) u_len_pos); const int o_len = atoi ((const char *) 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 ((const char *) bits_pos); if (bits != 128) return (PARSER_SALT_VALUE); int enc_md = 1; if (R >= 4) { enc_md = atoi ((const char *) enc_md_pos); } // copy data to esalt pdf->V = V; pdf->R = R; pdf->P = P; pdf->enc_md = enc_md; if (is_valid_hex_string (id_buf_pos, 32) == false) return (PARSER_SALT_ENCODING); pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]); pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]); pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]); pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]); if (id_len == 32) { if (is_valid_hex_string (id_buf_pos + 32, 32) == false) return (PARSER_SALT_ENCODING); pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]); pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]); pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]); pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]); } pdf->id_len = id_len; if (is_valid_hex_string (u_buf_pos, 64) == false) return (PARSER_SALT_ENCODING); pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]); pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]); pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]); pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]); pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]); pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]); pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]); pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]); pdf->u_len = u_len; if (is_valid_hex_string (o_buf_pos, 64) == false) return (PARSER_SALT_ENCODING); pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]); pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]); pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]); pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]); pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]); pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]); pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]); pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]); pdf->o_len = o_len; // precompute rc4 data for later use u32 padding[8] = { 0x5e4ebf28, 0x418a754e, 0x564e0064, 0x0801faff, 0xb6002e2e, 0x803e68d0, 0xfea90c2f, 0x7a695364 }; // md5 u32 salt_pc_block[32] = { 0 }; u8 *salt_pc_ptr = (u8 *) salt_pc_block; memcpy (salt_pc_ptr, padding, 32); memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len); u32 salt_pc_digest[4] = { 0 }; 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf, hashconfig); if (ret != PARSER_OK) { return ret; } u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_PDF, input_buf, 5) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; pdf_t *pdf = (pdf_t *) hash_buf->esalt; /** * parse line */ u8 *V_pos = input_buf + 5; u8 *R_pos = (u8 *) strchr ((const char *) V_pos, '*'); if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 V_len = R_pos - V_pos; R_pos++; u8 *bits_pos = (u8 *) strchr ((const char *) R_pos, '*'); if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 R_len = bits_pos - R_pos; bits_pos++; u8 *P_pos = (u8 *) strchr ((const char *) bits_pos, '*'); if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 bits_len = P_pos - bits_pos; P_pos++; u8 *enc_md_pos = (u8 *) strchr ((const char *) P_pos, '*'); if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 P_len = enc_md_pos - P_pos; enc_md_pos++; u8 *id_len_pos = (u8 *) strchr ((const char *) enc_md_pos, '*'); if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 enc_md_len = id_len_pos - enc_md_pos; id_len_pos++; u8 *id_buf_pos = (u8 *) strchr ((const char *) id_len_pos, '*'); if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 id_len_len = id_buf_pos - id_len_pos; id_buf_pos++; u8 *u_len_pos = (u8 *) strchr ((const char *) id_buf_pos, '*'); if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 id_buf_len = u_len_pos - id_buf_pos; u_len_pos++; u8 *u_buf_pos = (u8 *) strchr ((const char *) u_len_pos, '*'); if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 u_len_len = u_buf_pos - u_len_pos; u_buf_pos++; u8 *o_len_pos = (u8 *) strchr ((const char *) u_buf_pos, '*'); if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 u_buf_len = o_len_pos - u_buf_pos; o_len_pos++; u8 *o_buf_pos = (u8 *) strchr ((const char *) o_len_pos, '*'); if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 o_len_len = o_buf_pos - o_len_pos; o_buf_pos++; u8 *last = (u8 *) strchr ((const char *) o_buf_pos, '*'); if (last == NULL) last = input_buf + input_len; u32 o_buf_len = last - o_buf_pos; // validate data const int V = atoi ((const char *) V_pos); const int R = atoi ((const char *) 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 ((const char *) bits_pos); if (bits != 256) return (PARSER_SALT_VALUE); int enc_md = atoi ((const char *) enc_md_pos); if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE); const u32 id_len = atoll ((const char *) id_len_pos); const u32 u_len = atoll ((const char *) u_len_pos); const u32 o_len = atoll ((const char *) 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); if (is_valid_hex_string (u_buf_pos, 80) == false) return (PARSER_SALT_ENCODING); for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8) { pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]); } salt->salt_buf[0] = pdf->u_buf[8]; salt->salt_buf[1] = pdf->u_buf[9]; salt->salt_len = 8; salt->salt_iter = ROUNDS_PDF17L8; digest[0] = byte_swap_32 (pdf->u_buf[0]); digest[1] = byte_swap_32 (pdf->u_buf[1]); digest[2] = byte_swap_32 (pdf->u_buf[2]); digest[3] = byte_swap_32 (pdf->u_buf[3]); digest[4] = byte_swap_32 (pdf->u_buf[4]); digest[5] = byte_swap_32 (pdf->u_buf[5]); digest[6] = byte_swap_32 (pdf->u_buf[6]); digest[7] = byte_swap_32 (pdf->u_buf[7]); return (PARSER_OK); } int pbkdf2_sha256_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt; /** * parse line */ // iterations u8 *iter_pos = input_buf + 7; u32 iter = atoll ((const char *) iter_pos); if (iter < 1) return (PARSER_SALT_ITERATION); if (iter > 999999) return (PARSER_SALT_ITERATION); // first is *raw* salt u8 *salt_pos = (u8 *) strchr ((const char *) iter_pos, ':'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); salt_pos++; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, ':'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; if (salt_len > 64) return (PARSER_SALT_LENGTH); hash_pos++; u32 hash_b64_len = input_len - (hash_pos - input_buf); if (hash_b64_len > 88) return (PARSER_HASH_LENGTH); // decode salt u8 *salt_buf_ptr = (u8 *) pbkdf2_sha256->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); if (salt_len > (64 - 8)) 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 u8 tmp_buf[100] = { 0 }; int hash_len = base64_decode (base64_to_int, (const u8 *) 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); if (input_buf[32] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 32 - 1; u8 *salt_buf = input_buf + 32 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int postgresql_auth_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *user_pos = input_buf + 10; u8 *salt_pos = (u8 *) strchr ((const char *) user_pos, '*'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); salt_pos++; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '*'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); hash_pos++; u32 hash_len = input_len - (hash_pos - input_buf); if (hash_len != 32) return (PARSER_HASH_LENGTH); u32 user_len = salt_pos - user_pos - 1; u32 salt_len = hash_pos - salt_pos - 1; if (salt_len != 8) return (PARSER_SALT_LENGTH); /* * store digest */ if (is_valid_hex_string (hash_pos, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= MD5M_A; digest[1] -= MD5M_B; digest[2] -= MD5M_C; digest[3] -= MD5M_D; } /* * store salt */ u8 *salt_buf_ptr = (u8 *) salt->salt_buf; // first 4 bytes are the "challenge" if (is_valid_hex_string (salt_pos, 8) == false) return (PARSER_SALT_ENCODING); salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]); salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]); salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]); salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]); // append the user name user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = 4 + user_len; return (PARSER_OK); } int mysql_auth_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *salt_pos = input_buf + 9; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '*'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); hash_pos++; u32 hash_len = input_len - (hash_pos - input_buf); if (hash_len != 40) return (PARSER_HASH_LENGTH); u32 salt_len = hash_pos - salt_pos - 1; if (salt_len != 40) return (PARSER_SALT_LENGTH); /* * store digest */ if (is_valid_hex_string (hash_pos, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); digest[4] = hex_to_u32 ((const u8 *) &hash_pos[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]); /* * store salt */ u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int bitcoin_wallet_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt; /** * parse line */ u8 *cry_master_len_pos = input_buf + 9; u8 *cry_master_buf_pos = (u8 *) strchr ((const char *) cry_master_len_pos, '$'); if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos; cry_master_buf_pos++; u8 *cry_salt_len_pos = (u8 *) strchr ((const char *) cry_master_buf_pos, '$'); if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos; cry_salt_len_pos++; u8 *cry_salt_buf_pos = (u8 *) strchr ((const char *) cry_salt_len_pos, '$'); if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos; cry_salt_buf_pos++; u8 *cry_rounds_pos = (u8 *) strchr ((const char *) cry_salt_buf_pos, '$'); if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos; cry_rounds_pos++; u8 *ckey_len_pos = (u8 *) strchr ((const char *) cry_rounds_pos, '$'); if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos; ckey_len_pos++; u8 *ckey_buf_pos = (u8 *) strchr ((const char *) ckey_len_pos, '$'); if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 ckey_len_len = ckey_buf_pos - ckey_len_pos; ckey_buf_pos++; u8 *public_key_len_pos = (u8 *) strchr ((const char *) ckey_buf_pos, '$'); if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos; public_key_len_pos++; u8 *public_key_buf_pos = (u8 *) strchr ((const char *) public_key_len_pos, '$'); if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 public_key_len_len = public_key_buf_pos - public_key_len_pos; public_key_buf_pos++; u32 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 u32 cry_master_len = atoll ((const char *) cry_master_len_pos); const u32 cry_salt_len = atoll ((const char *) cry_salt_len_pos); const u32 ckey_len = atoll ((const char *) ckey_len_pos); const u32 public_key_len = atoll ((const char *) 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); if (is_valid_hex_string (cry_master_buf_pos, cry_master_len) == false) return (PARSER_SALT_ENCODING); for (u32 i = 0, j = 0; j < cry_master_len; i += 1, j += 8) { bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]); } if (is_valid_hex_string (ckey_buf_pos, ckey_len) == false) return (PARSER_SALT_ENCODING); for (u32 i = 0, j = 0; j < ckey_len; i += 1, j += 8) { bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]); } if (is_valid_hex_string (public_key_buf_pos, public_key_len) == false) return (PARSER_SALT_ENCODING); for (u32 i = 0, j = 0; j < public_key_len; i += 1, j += 8) { bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]); } 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 u32 cry_rounds = atoll ((const char *) cry_rounds_pos); salt->salt_iter = cry_rounds - 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; const u32 salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int sip_auth_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) 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) // why? should be fine to use original buffer //u8 *temp_input_buf = (u8 *) hcmalloc (input_len + 1); //memcpy (temp_input_buf, input_buf, input_len); // URI_server: u8 *URI_server_pos = input_buf + 6; u8 *URI_client_pos = (u8 *) strchr ((const char *) URI_server_pos, '*'); if (URI_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); URI_client_pos[0] = 0; URI_client_pos++; u32 URI_server_len = strlen ((const char *) URI_server_pos); if (URI_server_len > 512) return (PARSER_SALT_LENGTH); // URI_client: u8 *user_pos = (u8 *) strchr ((const char *) URI_client_pos, '*'); if (user_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); user_pos[0] = 0; user_pos++; u32 URI_client_len = strlen ((const char *) URI_client_pos); if (URI_client_len > 512) return (PARSER_SALT_LENGTH); // user: u8 *realm_pos = (u8 *) strchr ((const char *) user_pos, '*'); if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); realm_pos[0] = 0; realm_pos++; u32 user_len = strlen ((const char *) user_pos); if (user_len > 116) return (PARSER_SALT_LENGTH); // realm: u8 *method_pos = (u8 *) strchr ((const char *) realm_pos, '*'); if (method_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); method_pos[0] = 0; method_pos++; u32 realm_len = strlen ((const char *) realm_pos); if (realm_len > 116) return (PARSER_SALT_LENGTH); // method: u8 *URI_prefix_pos = (u8 *) strchr ((const char *) method_pos, '*'); if (URI_prefix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); URI_prefix_pos[0] = 0; URI_prefix_pos++; u32 method_len = strlen ((const char *) method_pos); if (method_len > 246) return (PARSER_SALT_LENGTH); // URI_prefix: u8 *URI_resource_pos = (u8 *) strchr ((const char *) URI_prefix_pos, '*'); if (URI_resource_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); URI_resource_pos[0] = 0; URI_resource_pos++; u32 URI_prefix_len = strlen ((const char *) URI_prefix_pos); if (URI_prefix_len > 245) return (PARSER_SALT_LENGTH); // URI_resource: u8 *URI_suffix_pos = (u8 *) strchr ((const char *) URI_resource_pos, '*'); if (URI_suffix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); URI_suffix_pos[0] = 0; URI_suffix_pos++; u32 URI_resource_len = strlen ((const char *) URI_resource_pos); if (URI_resource_len < 1 || URI_resource_len > 246) return (PARSER_SALT_LENGTH); // URI_suffix: u8 *nonce_pos = (u8 *) strchr ((const char *) URI_suffix_pos, '*'); if (nonce_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); nonce_pos[0] = 0; nonce_pos++; u32 URI_suffix_len = strlen ((const char *) URI_suffix_pos); if (URI_suffix_len > 245) return (PARSER_SALT_LENGTH); // nonce: u8 *nonce_client_pos = (u8 *) strchr ((const char *) nonce_pos, '*'); if (nonce_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); nonce_client_pos[0] = 0; nonce_client_pos++; u32 nonce_len = strlen ((const char *) nonce_pos); if (nonce_len < 1 || nonce_len > 50) return (PARSER_SALT_LENGTH); // nonce_client: u8 *nonce_count_pos = (u8 *) strchr ((const char *) nonce_client_pos, '*'); if (nonce_count_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); nonce_count_pos[0] = 0; nonce_count_pos++; u32 nonce_client_len = strlen ((const char *) nonce_client_pos); if (nonce_client_len > 50) return (PARSER_SALT_LENGTH); // nonce_count: u8 *qop_pos = (u8 *) strchr ((const char *) nonce_count_pos, '*'); if (qop_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); qop_pos[0] = 0; qop_pos++; u32 nonce_count_len = strlen ((const char *) nonce_count_pos); if (nonce_count_len > 50) return (PARSER_SALT_LENGTH); // qop: u8 *directive_pos = (u8 *) strchr ((const char *) qop_pos, '*'); if (directive_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); directive_pos[0] = 0; directive_pos++; u32 qop_len = strlen ((const char *) qop_pos); if (qop_len > 50) return (PARSER_SALT_LENGTH); // directive u8 *digest_pos = (u8 *) strchr ((const char *) directive_pos, '*'); if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); digest_pos[0] = 0; digest_pos++; u32 directive_len = strlen ((const char *) directive_pos); if (directive_len != 3) return (PARSER_SALT_LENGTH); if (memcmp (directive_pos, "MD5", 3) != 0) return (PARSER_SIP_AUTH_DIRECTIVE); /* * first (pre-)compute: HA2 = md5 ($method . ":" . $uri) */ u32 md5_len = 0; u32 md5_max_len = 4 * 64; u32 total_length = method_len + 1 + URI_prefix_len + URI_resource_len + URI_suffix_len; if (URI_prefix_len) total_length++; if (URI_suffix_len) total_length++; if (total_length >= md5_max_len) return (PARSER_SALT_LENGTH); u32 md5_remaining_len = md5_max_len; u32 tmp_md5_buf[64] = { 0 }; u8 *tmp_md5_ptr = (u8 *) tmp_md5_buf; snprintf ((char *) 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 ((char *) 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 ((char *) 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 ((char *) tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos); md5_len += 1 + URI_suffix_len; } u32 tmp_digest[4] = { 0 }; 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 */ u8 *esalt_buf_ptr = (u8 *) sip->esalt_buf; u32 esalt_len = 0; u32 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: bool with_auth = false; if (strlen ((const char *) qop_pos) == 4) { if (strncmp ((const char *) qop_pos, "auth", 4) == 0) { with_auth = true; } } if (strlen ((const char *) qop_pos) == 8) { if (strncmp ((const char *) qop_pos, "auth-int", 8) == 0) { with_auth = true; } } if (with_auth == true) { 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 ((char *) 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 ((char *) 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]); } if (esalt_len >= 152) return (PARSER_SALT_LENGTH); // add 0x80 to esalt esalt_buf_ptr[esalt_len] = 0x80; sip->esalt_len = esalt_len; /* * actual salt */ u8 *sip_salt_ptr = (u8 *) sip->salt_buf; u32 salt_len = user_len + 1 + realm_len + 1; u32 max_salt_len = 119; if (salt_len > max_salt_len) return (PARSER_SALT_LENGTH); snprintf ((char *) sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos); sip->salt_len = salt_len; /* * fake salt (for sorting) */ u8 *salt_buf_ptr = (u8 *) salt->salt_buf; max_salt_len = 55; u32 fake_salt_len = salt_len; if (fake_salt_len > max_salt_len) { fake_salt_len = max_salt_len; } snprintf ((char *) salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos); salt->salt_len = fake_salt_len; /* * digest */ if (is_valid_hex_string (digest_pos, 32) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]); return (PARSER_OK); } int crc32_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH); if (input_buf[8] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; // digest u8 *digest_pos = input_buf; if (is_valid_hex_string (digest_pos, 8) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]); digest[1] = 0; digest[2] = 0; digest[3] = 0; digest[0] = byte_swap_32 (digest[0]); digest[1] = 0; digest[2] = 0; digest[3] = 0; // salt u8 *salt_buf = input_buf + 8 + 1; u32 salt_len = 8; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int seven_zip_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; seven_zip_hook_salt_t *seven_zip = (seven_zip_hook_salt_t *) hash_buf->hook_salt; /** * parse line */ u8 *data_type_pos = input_buf + 4; u8 *NumCyclesPower_pos = (u8 *) strchr ((const char *) data_type_pos, '$'); if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 data_type_len = NumCyclesPower_pos - data_type_pos; NumCyclesPower_pos++; u8 *salt_len_pos = (u8 *) strchr ((const char *) NumCyclesPower_pos, '$'); if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos; salt_len_pos++; u8 *salt_buf_pos = (u8 *) strchr ((const char *) salt_len_pos, '$'); if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len_len = salt_buf_pos - salt_len_pos; salt_buf_pos++; u8 *iv_len_pos = (u8 *) strchr ((const char *) salt_buf_pos, '$'); if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_buf_len = iv_len_pos - salt_buf_pos; iv_len_pos++; u8 *iv_buf_pos = (u8 *) strchr ((const char *) iv_len_pos, '$'); if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 iv_len_len = iv_buf_pos - iv_len_pos; iv_buf_pos++; u8 *crc_buf_pos = (u8 *) strchr ((const char *) iv_buf_pos, '$'); if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 iv_buf_len = crc_buf_pos - iv_buf_pos; crc_buf_pos++; u8 *data_len_pos = (u8 *) strchr ((const char *) crc_buf_pos, '$'); if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 crc_buf_len = data_len_pos - crc_buf_pos; data_len_pos++; u8 *unpack_size_pos = (u8 *) strchr ((const char *) data_len_pos, '$'); if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 data_len_len = unpack_size_pos - data_len_pos; unpack_size_pos++; u8 *data_buf_pos = (u8 *) strchr ((const char *) unpack_size_pos, '$'); if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 unpack_size_len = data_buf_pos - unpack_size_pos; data_buf_pos++; // fields only used when data was compressed: u8 *crc_len_pos = (u8 *) strchr ((const char *) data_buf_pos, '$'); u32 crc_len_len = 0; u8 *coder_attributes_pos = 0; u32 coder_attributes_len = 0; u32 data_buf_len = 0; if (crc_len_pos != NULL) { data_buf_len = crc_len_pos - data_buf_pos; crc_len_pos++; coder_attributes_pos = (u8 *) strchr ((const char *) crc_len_pos, '$'); if (coder_attributes_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); crc_len_len = coder_attributes_pos - crc_len_pos; coder_attributes_pos++; } else { data_buf_len = input_len - 1 - 2 - 1 - data_type_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 u32 iter = atoll ((const char *) NumCyclesPower_pos); const u32 crc = atoll ((const char *) crc_buf_pos); const u32 data_type = atoll ((const char *) data_type_pos); const u32 salt_len = atoll ((const char *) salt_len_pos); const u32 iv_len = atoll ((const char *) iv_len_pos); const u32 unpack_size = atoll ((const char *) unpack_size_pos); const u32 data_len = atoll ((const char *) data_len_pos); // if neither uncompressed nor truncated, then we need the length for crc and coder attributes u32 crc_len = 0; bool is_compressed = ((data_type != 0) && (data_type != 0x80)); if (is_compressed == true) { if (crc_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); coder_attributes_len = input_len - 1 - 2 - 1 - data_type_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 - data_buf_len - 1 - crc_len_len - 1; crc_len = atoll ((const char *) crc_len_pos); } /** * verify some data */ if (data_type > 2) // this includes also 0x80 (special case that means "truncated") { 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 > 327528) return (PARSER_SALT_VALUE); if (unpack_size > data_len) return (PARSER_SALT_VALUE); if (is_compressed == true) { if (crc_len_len > 5) return (PARSER_SALT_VALUE); if (coder_attributes_len > 10) return (PARSER_SALT_VALUE); if ((coder_attributes_len % 2) != 0) return (PARSER_SALT_VALUE); // we should be more strict about the needed attribute_len: if (data_type == 1) // LZMA1 { if ((coder_attributes_len / 2) != 5) return (PARSER_SALT_VALUE); } else if (data_type == 2) // LZMA2 { if ((coder_attributes_len / 2) != 1) return (PARSER_SALT_VALUE); } } /** * store data */ seven_zip->data_type = data_type; if (is_valid_hex_string (iv_buf_pos, 32) == false) return (PARSER_SALT_ENCODING); seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]); seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]); seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]); seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &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; if (is_valid_hex_string (data_buf_pos, data_buf_len) == false) return (PARSER_SALT_ENCODING); for (u32 i = 0, j = 0; j < data_buf_len; i += 1, j += 8) { seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]); } seven_zip->data_len = data_len; seven_zip->unpack_size = unpack_size; seven_zip->crc_len = crc_len; memset (seven_zip->coder_attributes, 0, sizeof (seven_zip->coder_attributes)); seven_zip->coder_attributes_len = 0; if (is_compressed == 1) { if (is_valid_hex_string (coder_attributes_pos, coder_attributes_len) == false) return (PARSER_SALT_ENCODING); for (u32 i = 0, j = 0; j < coder_attributes_len; i += 1, j += 2) { seven_zip->coder_attributes[i] = hex_to_u8 ((const u8 *) &coder_attributes_pos[j]); seven_zip->coder_attributes_len++; } } // normally: crc_len <= unpacksize <= packsize (== data_len) u32 aes_len = data_len; if (crc_len != 0) // it is 0 only in case of uncompressed data or truncated data { // in theory we could just use crc_len, but sometimes (very rare) the compressed data // is larger than the original data! (because of some additional bytes from lzma/headers) // the +0.5 is used to round up (just to be sure we don't truncate) if (data_type == 1) // LZMA1 uses more bytes { aes_len = 32.5f + (float) crc_len * 1.05f; // +5% max (only for small random inputs) } else if (data_type == 2) // LZMA2 is more clever (e.g. uncompressed chunks) { aes_len = 4.5f + (float) crc_len * 1.01f; // +1% max (only for small random inputs) } // just make sure we never go beyond the data_len limit itself aes_len = MIN (aes_len, data_len); } seven_zip->aes_len = aes_len; // 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] = data_type; salt->salt_iter = 1u << iter; /** * digest */ digest[0] = crc; digest[1] = 0; digest[2] = 0; digest[3] = 0; return (PARSER_OK); } int gost2012sbog_256_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; if (is_valid_hex_string (input_buf, 64) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]); digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]); digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]); digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]); return (PARSER_OK); } int gost2012sbog_512_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; if (is_valid_hex_string (input_buf, 128) == false) return (PARSER_HASH_ENCODING); digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]); digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]); digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]); digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]); digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]); digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]); digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]); digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]); digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]); digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]); digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]); digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]); digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]); digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]); return (PARSER_OK); } int pbkdf2_md5_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt; /** * parse line */ // iterations u8 *iter_pos = input_buf + 4; u32 iter = atoll ((const char *) iter_pos); if (iter < 1) return (PARSER_SALT_ITERATION); if (iter > 999999) return (PARSER_SALT_ITERATION); // first is *raw* salt u8 *salt_pos = (u8 *) strchr ((const char *) iter_pos, ':'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); salt_pos++; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, ':'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; if (salt_len > 64) return (PARSER_SALT_LENGTH); hash_pos++; u32 hash_b64_len = input_len - (hash_pos - input_buf); if (hash_b64_len > 88) return (PARSER_HASH_LENGTH); // decode salt u8 *salt_buf_ptr = (u8 *) pbkdf2_md5->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); if (salt_len > (64 - 8)) 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 u8 tmp_buf[100] = { 0 }; int hash_len = base64_decode (base64_to_int, (const u8 *) 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt; /** * parse line */ // iterations u8 *iter_pos = input_buf + 5; u32 iter = atoll ((const char *) iter_pos); if (iter < 1) return (PARSER_SALT_ITERATION); if (iter > 999999) return (PARSER_SALT_ITERATION); // first is *raw* salt u8 *salt_pos = (u8 *) strchr ((const char *) iter_pos, ':'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); salt_pos++; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, ':'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; if (salt_len > 64) return (PARSER_SALT_LENGTH); hash_pos++; u32 hash_b64_len = input_len - (hash_pos - input_buf); if (hash_b64_len > 88) return (PARSER_HASH_LENGTH); // decode salt u8 *salt_buf_ptr = (u8 *) pbkdf2_sha1->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); if (salt_len > (64 - 8)) 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 u8 tmp_buf[100] = { 0 }; int hash_len = base64_decode (base64_to_int, (const u8 *) 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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) != 0) return (PARSER_SIGNATURE_UNMATCHED); u64 *digest = (u64 *) hash_buf->digest; salt_t *salt = hash_buf->salt; pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt; /** * parse line */ // iterations u8 *iter_pos = input_buf + 7; u32 iter = atoll ((const char *) iter_pos); if (iter < 1) return (PARSER_SALT_ITERATION); if (iter > 999999) return (PARSER_SALT_ITERATION); // first is *raw* salt u8 *salt_pos = (u8 *) strchr ((const char *) iter_pos, ':'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); salt_pos++; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, ':'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; if (salt_len > 64) return (PARSER_SALT_LENGTH); hash_pos++; u32 hash_b64_len = input_len - (hash_pos - input_buf); if (hash_b64_len > 88) return (PARSER_HASH_LENGTH); // decode salt u8 *salt_buf_ptr = (u8 *) pbkdf2_sha512->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); if (salt_len > (128 - 16)) 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 u8 tmp_buf[100] = { 0 }; int hash_len = base64_decode (base64_to_int, (const u8 *) 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; /** * parse line */ u8 *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$" u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; hash_pos++; u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1; if (hash_len != 16) return (PARSER_HASH_LENGTH); if (salt_len != 16) return (PARSER_SALT_LENGTH); // decode hash if (is_valid_hex_string (hash_pos, 16) == false) return (PARSER_HASH_ENCODING); digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]); digest[ 1] = hex_to_u32 ((const u8 *) &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; digest[0] = byte_swap_32 (digest[0]); digest[1] = byte_swap_32 (digest[1]); // decode salt if (is_valid_hex_string (salt_pos, 16) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]); salt->salt_buf[1] = hex_to_u32 ((const u8 *) &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_iter = ROUNDS_ECRYPTFS; salt->salt_len = 8; return (PARSER_OK); } int bsdicrypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1) != 0) 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; u32 *digest = (u32 *) 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; u8 tmp_buf[100] = { 0 }; base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf); memcpy (digest, tmp_buf, 8); u32 tt; IP (digest[0], digest[1], tt); digest[0] = rotr32 (digest[0], 31); digest[1] = rotr32 (digest[1], 31); digest[2] = 0; digest[3] = 0; return (PARSER_OK); } int rar3hp_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_RAR3, input_buf, 6) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; /** * parse line */ u8 *type_pos = input_buf + 6 + 1; u8 *salt_pos = (u8 *) strchr ((const char *) type_pos, '*'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 type_len = salt_pos - type_pos; salt_pos++; u8 *crypted_pos = (u8 *) strchr ((const char *) salt_pos, '*'); if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = crypted_pos - salt_pos; crypted_pos++; u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1; if (crypted_len != 32) return (PARSER_SALT_LENGTH); if (type_len != 1) return (PARSER_SALT_LENGTH); if (salt_len != 16) return (PARSER_SALT_LENGTH); /** * copy data */ if (is_valid_hex_string (salt_pos, 16) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]); salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]); if (is_valid_hex_string (crypted_pos, 32) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]); salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]); salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]); salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]); salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]); salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]); salt->salt_buf[4] = byte_swap_32 (salt->salt_buf[4]); salt->salt_buf[5] = byte_swap_32 (salt->salt_buf[5]); 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 rar5_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; rar5_t *rar5 = (rar5_t *) hash_buf->esalt; /** * parse line */ u8 *param0_pos = input_buf + 1 + 4 + 1; u8 *param1_pos = (u8 *) strchr ((const char *) param0_pos, '$'); if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 param0_len = param1_pos - param0_pos; param1_pos++; u8 *param2_pos = (u8 *) strchr ((const char *) param1_pos, '$'); if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 param1_len = param2_pos - param1_pos; param2_pos++; u8 *param3_pos = (u8 *) strchr ((const char *) param2_pos, '$'); if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 param2_len = param3_pos - param2_pos; param3_pos++; u8 *param4_pos = (u8 *) strchr ((const char *) param3_pos, '$'); if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 param3_len = param4_pos - param3_pos; param4_pos++; u8 *param5_pos = (u8 *) strchr ((const char *) param4_pos, '$'); if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 param4_len = param5_pos - param4_pos; param5_pos++; u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1; u8 *salt_buf = param1_pos; u8 *iv = param3_pos; u8 *pswcheck = param5_pos; const u32 salt_len = atoll ((const char *) param0_pos); const u32 iterations = atoll ((const char *) param2_pos); const u32 pswcheck_len = atoll ((const char *) param4_pos); /** * verify some data */ if (param1_len != 32) return (PARSER_SALT_VALUE); if (param3_len != 32) return (PARSER_SALT_VALUE); if (param5_len != 16) return (PARSER_SALT_VALUE); if (salt_len != 16) return (PARSER_SALT_VALUE); if (iterations == 0) return (PARSER_SALT_VALUE); if (pswcheck_len != 8) return (PARSER_SALT_VALUE); /** * store data */ if (is_valid_hex_string (salt_buf, 32) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]); salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]); salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]); salt->salt_buf[3] = hex_to_u32 ((const u8 *) &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]); if (is_valid_hex_string (iv, 32) == false) return (PARSER_SALT_ENCODING); rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]); rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]); rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]); rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]); rar5->iv[0] = byte_swap_32 (rar5->iv[0]); rar5->iv[1] = byte_swap_32 (rar5->iv[1]); rar5->iv[2] = byte_swap_32 (rar5->iv[2]); rar5->iv[3] = byte_swap_32 (rar5->iv[3]); salt->salt_len = 16; salt->salt_sign[0] = iterations; salt->salt_iter = ((1u << iterations) + 32) - 1; /** * digest buf */ if (is_valid_hex_string (pswcheck, 16) == false) return (PARSER_SALT_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]); digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]); digest[2] = 0; digest[3] = 0; digest[0] = byte_swap_32 (digest[0]); digest[1] = byte_swap_32 (digest[1]); digest[2] = 0; digest[3] = 0; return (PARSER_OK); } int krb5tgs_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt; /** * parse line */ /* Skip '$' */ u8 *account_pos = input_buf + 11 + 1; u8 *data_pos; u32 data_len; if (account_pos[0] == '*') { account_pos++; data_pos = (u8 *) strchr ((const char *) account_pos, '*'); if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); /* Skip '*' */ data_pos++; u32 account_len = data_pos - account_pos + 1; if (account_len >= 512) return (PARSER_SALT_LENGTH); /* Skip '$' */ data_pos++; data_len = input_len - 11 - 1 - account_len - 2; memcpy (krb5tgs->account_info, account_pos - 1, account_len); } else { /* assume $krb5tgs$23$checksum$edata2 */ data_pos = account_pos; memcpy (krb5tgs->account_info, "**", 3); data_len = input_len - 11 - 1 - 1; } if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH); u8 *checksum_ptr = (u8 *) krb5tgs->checksum; for (u32 i = 0; i < 16 * 2; i += 2) { const u8 p0 = data_pos[i + 0]; const u8 p1 = data_pos[i + 1]; *checksum_ptr++ = hex_convert (p1) << 0 | hex_convert (p0) << 4; } u8 *edata_ptr = (u8 *) krb5tgs->edata2; krb5tgs->edata2_len = (data_len - 32) / 2; /* skip '$' */ for (u32 i = 16 * 2 + 1; i < (krb5tgs->edata2_len * 2) + (16 * 2 + 1); i += 2) { const u8 p0 = data_pos[i + 0]; const u8 p1 = data_pos[i + 1]; *edata_ptr++ = hex_convert (p1) << 0 | hex_convert (p0) << 4; } /* this is needed for hmac_md5 */ *edata_ptr++ = 0x80; salt->salt_buf[0] = krb5tgs->checksum[0]; salt->salt_buf[1] = krb5tgs->checksum[1]; salt->salt_buf[2] = krb5tgs->checksum[2]; salt->salt_buf[3] = krb5tgs->checksum[3]; salt->salt_len = 32; digest[0] = krb5tgs->checksum[0]; digest[1] = krb5tgs->checksum[1]; digest[2] = krb5tgs->checksum[2]; digest[3] = krb5tgs->checksum[3]; return (PARSER_OK); } int axcrypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_13200) || (input_len > DISPLAY_LEN_MAX_13200)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_AXCRYPT, input_buf, 11) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; /** * parse line */ /* Skip '*' */ u8 *wrapping_rounds_pos = input_buf + 11 + 1; u8 *salt_pos; u8 *wrapped_key_pos; u8 *data_pos; salt->salt_iter = atoll ((const char *) wrapping_rounds_pos); salt_pos = (u8 *) strchr ((const char *) wrapping_rounds_pos, '*'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 wrapping_rounds_len = salt_pos - wrapping_rounds_pos; /* Skip '*' */ salt_pos++; data_pos = salt_pos; wrapped_key_pos = (u8 *) strchr ((const char *) salt_pos, '*'); if (wrapped_key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = wrapped_key_pos - salt_pos; if (salt_len != 32) return (PARSER_SALT_LENGTH); u32 wrapped_key_len = input_len - 11 - 1 - wrapping_rounds_len - 1 - salt_len - 1; if (wrapped_key_len != 48) return (PARSER_SALT_LENGTH); if (is_valid_hex_string (data_pos, 32) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[0] = hex_to_u32 ((const u8 *) &data_pos[ 0]); salt->salt_buf[1] = hex_to_u32 ((const u8 *) &data_pos[ 8]); salt->salt_buf[2] = hex_to_u32 ((const u8 *) &data_pos[16]); salt->salt_buf[3] = hex_to_u32 ((const u8 *) &data_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]); data_pos += 33; if (is_valid_hex_string (data_pos, 48) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[4] = hex_to_u32 ((const u8 *) &data_pos[ 0]); salt->salt_buf[5] = hex_to_u32 ((const u8 *) &data_pos[ 8]); salt->salt_buf[6] = hex_to_u32 ((const u8 *) &data_pos[16]); salt->salt_buf[7] = hex_to_u32 ((const u8 *) &data_pos[24]); salt->salt_buf[8] = hex_to_u32 ((const u8 *) &data_pos[32]); salt->salt_buf[9] = hex_to_u32 ((const u8 *) &data_pos[40]); salt->salt_buf[4] = byte_swap_32 (salt->salt_buf[4]); salt->salt_buf[5] = byte_swap_32 (salt->salt_buf[5]); salt->salt_buf[6] = byte_swap_32 (salt->salt_buf[6]); salt->salt_buf[7] = byte_swap_32 (salt->salt_buf[7]); salt->salt_buf[8] = byte_swap_32 (salt->salt_buf[8]); salt->salt_buf[9] = byte_swap_32 (salt->salt_buf[9]); salt->salt_len = 40; digest[0] = salt->salt_buf[0]; digest[1] = salt->salt_buf[1]; digest[2] = salt->salt_buf[2]; digest[3] = salt->salt_buf[3]; return (PARSER_OK); } int keepass_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_13400) || (input_len > DISPLAY_LEN_MAX_13400)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_KEEPASS, input_buf, 9) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; keepass_t *keepass = (keepass_t *) hash_buf->esalt; /** * parse line */ u8 *version_pos; u8 *rounds_pos; u8 *algorithm_pos; u8 *final_random_seed_pos; u32 final_random_seed_len; u8 *transf_random_seed_pos; u32 transf_random_seed_len; u8 *enc_iv_pos; u32 enc_iv_len; /* default is no keyfile provided */ bool is_keyfile_present = false; u8 *keyfile_inline_pos; u8 *keyfile_pos; /* specific to version 1 */ u8 *contents_pos; /* specific to version 2 */ u8 *expected_bytes_pos; u32 expected_bytes_len; u8 *contents_hash_pos; u32 contents_hash_len; version_pos = input_buf + 8 + 1 + 1; keepass->version = atoll ((const char *) version_pos); rounds_pos = (u8 *) strchr ((const char *) version_pos, '*'); if (rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); rounds_pos++; salt->salt_iter = (atoll ((const char *) rounds_pos)); algorithm_pos = (u8 *) strchr ((const char *) rounds_pos, '*'); if (algorithm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); algorithm_pos++; keepass->algorithm = atoll ((const char *) algorithm_pos); final_random_seed_pos = (u8 *) strchr ((const char *) algorithm_pos, '*'); if (final_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); final_random_seed_pos++; if (is_valid_hex_string (final_random_seed_pos, 32) == false) return (PARSER_SALT_ENCODING); keepass->final_random_seed[0] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 0]); keepass->final_random_seed[1] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 8]); keepass->final_random_seed[2] = hex_to_u32 ((const u8 *) &final_random_seed_pos[16]); keepass->final_random_seed[3] = hex_to_u32 ((const u8 *) &final_random_seed_pos[24]); keepass->final_random_seed[0] = byte_swap_32 (keepass->final_random_seed[0]); keepass->final_random_seed[1] = byte_swap_32 (keepass->final_random_seed[1]); keepass->final_random_seed[2] = byte_swap_32 (keepass->final_random_seed[2]); keepass->final_random_seed[3] = byte_swap_32 (keepass->final_random_seed[3]); if (keepass->version == 2) { if (is_valid_hex_string (final_random_seed_pos + 32, 32) == false) return (PARSER_SALT_ENCODING); keepass->final_random_seed[4] = hex_to_u32 ((const u8 *) &final_random_seed_pos[32]); keepass->final_random_seed[5] = hex_to_u32 ((const u8 *) &final_random_seed_pos[40]); keepass->final_random_seed[6] = hex_to_u32 ((const u8 *) &final_random_seed_pos[48]); keepass->final_random_seed[7] = hex_to_u32 ((const u8 *) &final_random_seed_pos[56]); keepass->final_random_seed[4] = byte_swap_32 (keepass->final_random_seed[4]); keepass->final_random_seed[5] = byte_swap_32 (keepass->final_random_seed[5]); keepass->final_random_seed[6] = byte_swap_32 (keepass->final_random_seed[6]); keepass->final_random_seed[7] = byte_swap_32 (keepass->final_random_seed[7]); } transf_random_seed_pos = (u8 *) strchr ((const char *) final_random_seed_pos, '*'); if (transf_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); final_random_seed_len = transf_random_seed_pos - final_random_seed_pos; if (keepass->version == 1 && final_random_seed_len != 32) return (PARSER_SALT_LENGTH); if (keepass->version == 2 && final_random_seed_len != 64) return (PARSER_SALT_LENGTH); transf_random_seed_pos++; if (is_valid_hex_string (transf_random_seed_pos, 64) == false) return (PARSER_SALT_ENCODING); keepass->transf_random_seed[0] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 0]); keepass->transf_random_seed[1] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 8]); keepass->transf_random_seed[2] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[16]); keepass->transf_random_seed[3] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[24]); keepass->transf_random_seed[4] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[32]); keepass->transf_random_seed[5] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[40]); keepass->transf_random_seed[6] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[48]); keepass->transf_random_seed[7] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[56]); keepass->transf_random_seed[0] = byte_swap_32 (keepass->transf_random_seed[0]); keepass->transf_random_seed[1] = byte_swap_32 (keepass->transf_random_seed[1]); keepass->transf_random_seed[2] = byte_swap_32 (keepass->transf_random_seed[2]); keepass->transf_random_seed[3] = byte_swap_32 (keepass->transf_random_seed[3]); keepass->transf_random_seed[4] = byte_swap_32 (keepass->transf_random_seed[4]); keepass->transf_random_seed[5] = byte_swap_32 (keepass->transf_random_seed[5]); keepass->transf_random_seed[6] = byte_swap_32 (keepass->transf_random_seed[6]); keepass->transf_random_seed[7] = byte_swap_32 (keepass->transf_random_seed[7]); enc_iv_pos = (u8 *) strchr ((const char *) transf_random_seed_pos, '*'); if (enc_iv_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); transf_random_seed_len = enc_iv_pos - transf_random_seed_pos; if (transf_random_seed_len != 64) return (PARSER_SALT_LENGTH); enc_iv_pos++; if (is_valid_hex_string (enc_iv_pos, 32) == false) return (PARSER_SALT_ENCODING); keepass->enc_iv[0] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 0]); keepass->enc_iv[1] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 8]); keepass->enc_iv[2] = hex_to_u32 ((const u8 *) &enc_iv_pos[16]); keepass->enc_iv[3] = hex_to_u32 ((const u8 *) &enc_iv_pos[24]); keepass->enc_iv[0] = byte_swap_32 (keepass->enc_iv[0]); keepass->enc_iv[1] = byte_swap_32 (keepass->enc_iv[1]); keepass->enc_iv[2] = byte_swap_32 (keepass->enc_iv[2]); keepass->enc_iv[3] = byte_swap_32 (keepass->enc_iv[3]); if (keepass->version == 1) { contents_hash_pos = (u8 *) strchr ((const char *) enc_iv_pos, '*'); if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); enc_iv_len = contents_hash_pos - enc_iv_pos; if (enc_iv_len != 32) return (PARSER_SALT_LENGTH); contents_hash_pos++; if (is_valid_hex_string (contents_hash_pos, 64) == false) return (PARSER_SALT_ENCODING); keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]); keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]); keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]); keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]); keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]); keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]); keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]); keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]); keepass->contents_hash[0] = byte_swap_32 (keepass->contents_hash[0]); keepass->contents_hash[1] = byte_swap_32 (keepass->contents_hash[1]); keepass->contents_hash[2] = byte_swap_32 (keepass->contents_hash[2]); keepass->contents_hash[3] = byte_swap_32 (keepass->contents_hash[3]); keepass->contents_hash[4] = byte_swap_32 (keepass->contents_hash[4]); keepass->contents_hash[5] = byte_swap_32 (keepass->contents_hash[5]); keepass->contents_hash[6] = byte_swap_32 (keepass->contents_hash[6]); keepass->contents_hash[7] = byte_swap_32 (keepass->contents_hash[7]); /* get length of contents following */ u8 *inline_flag_pos = (u8 *) strchr ((const char *) contents_hash_pos, '*'); if (inline_flag_pos == NULL) return (PARSER_SALT_LENGTH); contents_hash_len = inline_flag_pos - contents_hash_pos; if (contents_hash_len != 64) return (PARSER_SALT_LENGTH); inline_flag_pos++; u32 inline_flag = atoll ((const char *) inline_flag_pos); if (inline_flag != 1) return (PARSER_SALT_LENGTH); u8 *contents_len_pos = (u8 *) strchr ((const char *) inline_flag_pos, '*'); if (contents_len_pos == NULL) return (PARSER_SALT_LENGTH); contents_len_pos++; int contents_len = atoi ((const char *) contents_len_pos); if (contents_len > 50000) return (PARSER_SALT_LENGTH); contents_pos = (u8 *) strchr ((const char *) contents_len_pos, '*'); if (contents_pos == NULL) return (PARSER_SALT_LENGTH); contents_pos++; keepass->contents_len = contents_len; contents_len = contents_len / 4; keyfile_inline_pos = (u8 *) strchr ((const char *) contents_pos, '*'); u32 real_contents_len; if (keyfile_inline_pos == NULL) { real_contents_len = input_len - (contents_pos - input_buf); } else { real_contents_len = keyfile_inline_pos - contents_pos; keyfile_inline_pos++; is_keyfile_present = true; } if (real_contents_len != keepass->contents_len * 2) return (PARSER_SALT_LENGTH); if (is_valid_hex_string (contents_pos, contents_len) == false) return (PARSER_SALT_ENCODING); for (int i = 0; i < contents_len; i++) { keepass->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]); keepass->contents[i] = byte_swap_32 (keepass->contents[i]); } } else if (keepass->version == 2) { expected_bytes_pos = (u8 *) strchr ((const char *) enc_iv_pos, '*'); if (expected_bytes_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); enc_iv_len = expected_bytes_pos - enc_iv_pos; if (enc_iv_len != 32) return (PARSER_SALT_LENGTH); expected_bytes_pos++; if (is_valid_hex_string (expected_bytes_pos, 64) == false) return (PARSER_SALT_ENCODING); keepass->expected_bytes[0] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 0]); keepass->expected_bytes[1] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 8]); keepass->expected_bytes[2] = hex_to_u32 ((const u8 *) &expected_bytes_pos[16]); keepass->expected_bytes[3] = hex_to_u32 ((const u8 *) &expected_bytes_pos[24]); keepass->expected_bytes[4] = hex_to_u32 ((const u8 *) &expected_bytes_pos[32]); keepass->expected_bytes[5] = hex_to_u32 ((const u8 *) &expected_bytes_pos[40]); keepass->expected_bytes[6] = hex_to_u32 ((const u8 *) &expected_bytes_pos[48]); keepass->expected_bytes[7] = hex_to_u32 ((const u8 *) &expected_bytes_pos[56]); keepass->expected_bytes[0] = byte_swap_32 (keepass->expected_bytes[0]); keepass->expected_bytes[1] = byte_swap_32 (keepass->expected_bytes[1]); keepass->expected_bytes[2] = byte_swap_32 (keepass->expected_bytes[2]); keepass->expected_bytes[3] = byte_swap_32 (keepass->expected_bytes[3]); keepass->expected_bytes[4] = byte_swap_32 (keepass->expected_bytes[4]); keepass->expected_bytes[5] = byte_swap_32 (keepass->expected_bytes[5]); keepass->expected_bytes[6] = byte_swap_32 (keepass->expected_bytes[6]); keepass->expected_bytes[7] = byte_swap_32 (keepass->expected_bytes[7]); contents_hash_pos = (u8 *) strchr ((const char *) expected_bytes_pos, '*'); if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); expected_bytes_len = contents_hash_pos - expected_bytes_pos; if (expected_bytes_len != 64) return (PARSER_SALT_LENGTH); contents_hash_pos++; if (is_valid_hex_string (contents_hash_pos, 64) == false) return (PARSER_SALT_ENCODING); keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]); keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]); keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]); keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]); keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]); keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]); keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]); keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]); keepass->contents_hash[0] = byte_swap_32 (keepass->contents_hash[0]); keepass->contents_hash[1] = byte_swap_32 (keepass->contents_hash[1]); keepass->contents_hash[2] = byte_swap_32 (keepass->contents_hash[2]); keepass->contents_hash[3] = byte_swap_32 (keepass->contents_hash[3]); keepass->contents_hash[4] = byte_swap_32 (keepass->contents_hash[4]); keepass->contents_hash[5] = byte_swap_32 (keepass->contents_hash[5]); keepass->contents_hash[6] = byte_swap_32 (keepass->contents_hash[6]); keepass->contents_hash[7] = byte_swap_32 (keepass->contents_hash[7]); keyfile_inline_pos = (u8 *) strchr ((const char *) contents_hash_pos, '*'); if (keyfile_inline_pos == NULL) { contents_hash_len = input_len - (int) (contents_hash_pos - input_buf); } else { contents_hash_len = keyfile_inline_pos - contents_hash_pos; keyfile_inline_pos++; is_keyfile_present = true; } if (contents_hash_len != 64) return (PARSER_SALT_LENGTH); } if (is_keyfile_present == true) { u8 *keyfile_len_pos = (u8 *) strchr ((const char *) keyfile_inline_pos, '*'); if (keyfile_len_pos == NULL) return (PARSER_SALT_LENGTH); keyfile_len_pos++; int keyfile_len = atoi ((const char *) keyfile_len_pos); keepass->keyfile_len = keyfile_len; if (keyfile_len != 64) return (PARSER_SALT_LENGTH); keyfile_pos = (u8 *) strchr ((const char *) keyfile_len_pos, '*'); if (keyfile_pos == NULL) return (PARSER_SALT_LENGTH); keyfile_pos++; u32 real_keyfile_len = input_len - (keyfile_pos - input_buf); if (real_keyfile_len != 64) return (PARSER_SALT_LENGTH); if (is_valid_hex_string (keyfile_pos, 64) == false) return (PARSER_SALT_ENCODING); keepass->keyfile[0] = hex_to_u32 ((const u8 *) &keyfile_pos[ 0]); keepass->keyfile[1] = hex_to_u32 ((const u8 *) &keyfile_pos[ 8]); keepass->keyfile[2] = hex_to_u32 ((const u8 *) &keyfile_pos[16]); keepass->keyfile[3] = hex_to_u32 ((const u8 *) &keyfile_pos[24]); keepass->keyfile[4] = hex_to_u32 ((const u8 *) &keyfile_pos[32]); keepass->keyfile[5] = hex_to_u32 ((const u8 *) &keyfile_pos[40]); keepass->keyfile[6] = hex_to_u32 ((const u8 *) &keyfile_pos[48]); keepass->keyfile[7] = hex_to_u32 ((const u8 *) &keyfile_pos[56]); keepass->keyfile[0] = byte_swap_32 (keepass->keyfile[0]); keepass->keyfile[1] = byte_swap_32 (keepass->keyfile[1]); keepass->keyfile[2] = byte_swap_32 (keepass->keyfile[2]); keepass->keyfile[3] = byte_swap_32 (keepass->keyfile[3]); keepass->keyfile[4] = byte_swap_32 (keepass->keyfile[4]); keepass->keyfile[5] = byte_swap_32 (keepass->keyfile[5]); keepass->keyfile[6] = byte_swap_32 (keepass->keyfile[6]); keepass->keyfile[7] = byte_swap_32 (keepass->keyfile[7]); } if (keepass->version == 1) { digest[0] = keepass->contents_hash[0]; digest[1] = keepass->contents_hash[1]; digest[2] = keepass->contents_hash[2]; digest[3] = keepass->contents_hash[3]; } else { digest[0] = keepass->expected_bytes[0]; digest[1] = keepass->expected_bytes[1]; digest[2] = keepass->expected_bytes[2]; digest[3] = keepass->expected_bytes[3]; } salt->salt_buf[0] = keepass->transf_random_seed[0]; salt->salt_buf[1] = keepass->transf_random_seed[1]; salt->salt_buf[2] = keepass->transf_random_seed[2]; salt->salt_buf[3] = keepass->transf_random_seed[3]; salt->salt_buf[4] = keepass->transf_random_seed[4]; salt->salt_buf[5] = keepass->transf_random_seed[5]; salt->salt_buf[6] = keepass->transf_random_seed[6]; salt->salt_buf[7] = keepass->transf_random_seed[7]; salt->salt_len = 32; return (PARSER_OK); } int cf10_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 64) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]); digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]); digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]); digest[7] = hex_to_u32 ((const u8 *) &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]); if (input_buf[64] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 64 - 1; u8 *salt_buf = input_buf + 64 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; /** * we can precompute the first sha256 transform */ u32 w[16] = { 0 }; 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]); u32 pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_MYWALLET, input_buf, 12) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; /** * parse line */ u8 *data_len_pos = input_buf + 1 + 10 + 1; u8 *data_buf_pos = (u8 *) strchr ((const char *) data_len_pos, '$'); if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 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++; u32 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); u32 data_len = atoll ((const char *) data_len_pos); if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH); /** * salt */ u8 *salt_pos = data_buf_pos; if (is_valid_hex_string (salt_pos, 64) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]); salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]); salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]); salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_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 actually the CT, which is also the hash later (if matched) salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]); salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]); salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]); salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]); salt->salt_buf[4] = byte_swap_32 (salt->salt_buf[4]); salt->salt_buf[5] = byte_swap_32 (salt->salt_buf[5]); salt->salt_buf[6] = byte_swap_32 (salt->salt_buf[6]); salt->salt_buf[7] = byte_swap_32 (salt->salt_buf[7]); salt->salt_len = 32; // note we need to fix this to 16 in kernel salt->salt_iter = ROUNDS_MYWALLET - 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 mywalletv2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_15200) || (input_len > DISPLAY_LEN_MAX_15200)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_MYWALLETV2, input_buf, 15) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; /** * parse line */ u8 *iter_pos = input_buf + 1 + 10 + 1 + 2 + 1; u8 *data_len_pos = (u8 *) strchr ((const char *) iter_pos, '$'); if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 iter_pos_len = data_len_pos - iter_pos; if (iter_pos_len < 1) return (PARSER_SALT_LENGTH); if (iter_pos_len > 8) return (PARSER_SALT_LENGTH); data_len_pos++; u8 *data_buf_pos = (u8 *) strchr ((const char *) data_len_pos, '$'); if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 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++; u32 data_buf_len = input_len - 1 - 10 - 1 - 2 - 1 - iter_pos_len - 1 - data_len_len - 1; if (data_buf_len < 64) return (PARSER_HASH_LENGTH); if (data_buf_len % 16) return (PARSER_HASH_LENGTH); u32 data_len = atoll ((const char *) data_len_pos); if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH); u32 iter = atoll ((const char *) iter_pos); /** * salt */ u8 *salt_pos = data_buf_pos; if (is_valid_hex_string (salt_pos, 64) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]); salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]); salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]); salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_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 actually the CT, which is also the hash later (if matched) salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]); salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]); salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]); salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]); salt->salt_buf[4] = byte_swap_32 (salt->salt_buf[4]); salt->salt_buf[5] = byte_swap_32 (salt->salt_buf[5]); salt->salt_buf[6] = byte_swap_32 (salt->salt_buf[6]); salt->salt_buf[7] = byte_swap_32 (salt->salt_buf[7]); salt->salt_len = 32; // note we need to fix this to 16 in kernel salt->salt_iter = iter - 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 (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { 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) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; /** * parse line */ u8 *salt_pos = input_buf + 11 + 1; u8 *iter_pos = (u8 *) strchr ((const char *) salt_pos, ','); if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = iter_pos - salt_pos; if (salt_len != 20) return (PARSER_SALT_LENGTH); iter_pos++; u8 *hash_pos = (u8 *) strchr ((const char *) iter_pos, ','); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 iter_len = hash_pos - iter_pos; if (iter_len > 5) return (PARSER_SALT_LENGTH); hash_pos++; u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1; if (hash_len != 64) return (PARSER_HASH_LENGTH); /** * salt */ if (is_valid_hex_string (salt_pos, 20) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]); salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]); salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0x0000ffff; salt->salt_buf[3] = 0; salt->salt_len = salt_len / 2; salt->salt_iter = atoll ((const char *) iter_pos) - 1u; /** * digest buf */ if (is_valid_hex_string (hash_pos, 64) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]); digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]); digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]); digest[7] = hex_to_u32 ((const u8 *) &hash_pos[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 androidfde_samsung_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; /** * parse line */ u8 *hash_pos = input_buf + 64; u8 *salt1_pos = input_buf + 128; u8 *salt2_pos = input_buf; /** * salt */ if (is_valid_hex_string (salt1_pos, 32) == false) return (PARSER_SALT_ENCODING); if (is_valid_hex_string (salt2_pos, 64) == false) return (PARSER_SALT_ENCODING); salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]); salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]); salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]); salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]); salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]); salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]); salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]); salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]); salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]); salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]); salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]); salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]); 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_buf[ 4] = byte_swap_32 (salt->salt_buf[ 4]); salt->salt_buf[ 5] = byte_swap_32 (salt->salt_buf[ 5]); salt->salt_buf[ 6] = byte_swap_32 (salt->salt_buf[ 6]); salt->salt_buf[ 7] = byte_swap_32 (salt->salt_buf[ 7]); salt->salt_buf[ 8] = byte_swap_32 (salt->salt_buf[ 8]); salt->salt_buf[ 9] = byte_swap_32 (salt->salt_buf[ 9]); salt->salt_buf[10] = byte_swap_32 (salt->salt_buf[10]); salt->salt_buf[11] = byte_swap_32 (salt->salt_buf[11]); salt->salt_len = 48; salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1; /** * digest buf */ if (is_valid_hex_string (hash_pos, 64) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]); digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]); digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]); digest[7] = hex_to_u32 ((const u8 *) &hash_pos[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 zip2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_13600) || (input_len > DISPLAY_LEN_MAX_13600)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_ZIP2_START, input_buf , 6) != 0) return (PARSER_SIGNATURE_UNMATCHED); if (memcmp (SIGNATURE_ZIP2_STOP , input_buf + input_len - 7, 7) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; zip2_t *zip2 = (zip2_t *) hash_buf->esalt; /** * parse line */ u8 *param0_pos = input_buf + 6 + 1; u8 *param1_pos = (u8 *) strchr ((const char *) param0_pos, '*'); if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 param0_len = param1_pos - param0_pos; param1_pos++; u8 *param2_pos = (u8 *) strchr ((const char *) param1_pos, '*'); if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 param1_len = param2_pos - param1_pos; param2_pos++; u8 *param3_pos = (u8 *) strchr ((const char *) param2_pos, '*'); if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 param2_len = param3_pos - param2_pos; param3_pos++; u8 *param4_pos = (u8 *) strchr ((const char *) param3_pos, '*'); if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 param3_len = param4_pos - param3_pos; param4_pos++; u8 *param5_pos = (u8 *) strchr ((const char *) param4_pos, '*'); if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 param4_len = param5_pos - param4_pos; param5_pos++; u8 *param6_pos = (u8 *) strchr ((const char *) param5_pos, '*'); if (param6_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 param5_len = param6_pos - param5_pos; param6_pos++; u8 *param7_pos = (u8 *) strchr ((const char *) param6_pos, '*'); if (param7_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 param6_len = param7_pos - param6_pos; param7_pos++; u8 *param8_pos = (u8 *) strchr ((const char *) param7_pos, '*'); if (param8_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 param7_len = param8_pos - param7_pos; const u32 type = atoll ((const char *) param0_pos); const u32 mode = atoll ((const char *) param1_pos); const u32 magic = atoll ((const char *) param2_pos); u8 *salt_buf = param3_pos; u32 verify_bytes; if (sscanf ((const char *) param4_pos, "%4x*", &verify_bytes) == EOF) { return (PARSER_SALT_VALUE); } const u32 compress_length = atoll ((const char *) param5_pos); u8 *data_buf = param6_pos; u8 *auth = param7_pos; /** * verify some data */ if (param0_len != 1) return (PARSER_SALT_VALUE); if (param1_len != 1) return (PARSER_SALT_VALUE); if (param2_len != 1) return (PARSER_SALT_VALUE); if ((param3_len != 16) && (param3_len != 24) && (param3_len != 32)) return (PARSER_SALT_VALUE); if (param4_len >= 5) return (PARSER_SALT_VALUE); if (param5_len >= 5) return (PARSER_SALT_VALUE); if (param6_len >= 8192) return (PARSER_SALT_VALUE); if (param6_len & 1) return (PARSER_SALT_VALUE); if (param7_len != 20) return (PARSER_SALT_VALUE); if (type != 0) return (PARSER_SALT_VALUE); if ((mode != 1) && (mode != 2) && (mode != 3)) return (PARSER_SALT_VALUE); if (magic != 0) return (PARSER_SALT_VALUE); if (verify_bytes >= 0x10000) return (PARSER_SALT_VALUE); /** * store data */ zip2->type = type; zip2->mode = mode; zip2->magic = magic; if (mode == 1) { if (is_valid_hex_string (salt_buf, 16) == false) return (PARSER_SALT_ENCODING); zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]); zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]); zip2->salt_buf[2] = 0; zip2->salt_buf[3] = 0; zip2->salt_len = 8; } else if (mode == 2) { if (is_valid_hex_string (salt_buf, 24) == false) return (PARSER_SALT_ENCODING); zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]); zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]); zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]); zip2->salt_buf[3] = 0; zip2->salt_len = 12; } else if (mode == 3) { if (is_valid_hex_string (salt_buf, 32) == false) return (PARSER_SALT_ENCODING); zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]); zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]); zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]); zip2->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]); zip2->salt_len = 16; } zip2->verify_bytes = verify_bytes; zip2->compress_length = compress_length; u8 *data_buf_ptr = (u8 *) zip2->data_buf; for (u32 i = 0; i < param6_len; i += 2) { const u8 p0 = data_buf[i + 0]; const u8 p1 = data_buf[i + 1]; *data_buf_ptr++ = hex_convert (p1) << 0 | hex_convert (p0) << 4; zip2->data_len++; } *data_buf_ptr = 0x80; u8 *auth_ptr = (u8 *) zip2->auth_buf; for (u32 i = 0; i < param7_len; i += 2) { const u8 p0 = auth[i + 0]; const u8 p1 = auth[i + 1]; *auth_ptr++ = hex_convert (p1) << 0 | hex_convert (p0) << 4; zip2->auth_len++; } /** * salt buf (fake) */ salt->salt_buf[0] = zip2->salt_buf[0]; salt->salt_buf[1] = zip2->salt_buf[1]; salt->salt_buf[2] = zip2->salt_buf[2]; salt->salt_buf[3] = zip2->salt_buf[3]; salt->salt_buf[4] = zip2->data_buf[0]; salt->salt_buf[5] = zip2->data_buf[1]; salt->salt_buf[6] = zip2->data_buf[2]; salt->salt_buf[7] = zip2->data_buf[3]; salt->salt_len = 32; salt->salt_iter = ROUNDS_ZIP2 - 1; /** * digest buf (fake) */ digest[0] = zip2->auth_buf[0]; digest[1] = zip2->auth_buf[1]; digest[2] = zip2->auth_buf[2]; digest[3] = zip2->auth_buf[3]; return (PARSER_OK); } int win8phone_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_13800) || (input_len > DISPLAY_LEN_MAX_13800)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; win8phone_t *esalt = (win8phone_t *) hash_buf->esalt; if (is_valid_hex_string (input_buf, 64) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]); digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]); digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]); digest[7] = hex_to_u32 ((const u8 *) &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]); if (input_buf[64] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u8 *salt_buf_ptr = input_buf + 64 + 1; u32 *salt_buf = esalt->salt_buf; if (is_valid_hex_string (salt_buf_ptr, 256) == false) return (PARSER_SALT_ENCODING); for (int i = 0, j = 0; i < 32; i += 1, j += 8) { salt_buf[i] = hex_to_u32 ((const u8 *) &salt_buf_ptr[j]); salt_buf[i] = byte_swap_32 (salt_buf[i]); } salt->salt_buf[0] = salt_buf[0]; salt->salt_buf[1] = salt_buf[1]; salt->salt_buf[2] = salt_buf[2]; salt->salt_buf[3] = salt_buf[3]; salt->salt_buf[4] = salt_buf[4]; salt->salt_buf[5] = salt_buf[5]; salt->salt_buf[6] = salt_buf[6]; salt->salt_buf[7] = salt_buf[7]; salt->salt_len = 64; return (PARSER_OK); } int plaintext_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_99999) || (input_len > DISPLAY_LEN_MAX_99999)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; memset (digest, 0, hashconfig->dgst_size); memcpy ((char *) digest + 64, input_buf, input_len); //strncpy ((char *) digest + 64, (char *) input_buf, 64); u32 w[16] = { 0 }; //strncpy ((char *) w, (char *) input_buf, 64); memcpy (w, input_buf, input_len); u8 *w_ptr = (u8 *) w; w_ptr[input_len] = 0x80; w[14] = input_len * 8; u32 dgst[4]; dgst[0] = MD4M_A; dgst[1] = MD4M_B; dgst[2] = MD4M_C; dgst[3] = MD4M_D; md4_64 (w, dgst); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { dgst[0] -= MD4M_A; dgst[1] -= MD4M_B; dgst[2] -= MD4M_C; dgst[3] -= MD4M_D; } digest[0] = dgst[0]; digest[1] = dgst[1]; digest[2] = dgst[2]; digest[3] = dgst[3]; return (PARSER_OK); } int sha1cx_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_14400) || (input_len > DISPLAY_LEN_MAX_14400)) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 40) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]); digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]); digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]); digest[4] = hex_to_u32 ((const u8 *) &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]); if (input_buf[40] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 40 - 1; u8 *salt_buf = input_buf + 40 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int luks_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED hashconfig_t *hashconfig, const int keyslot_idx) { u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; luks_t *luks = (luks_t *) hash_buf->esalt; if (input_len == 0) return (PARSER_HASH_LENGTH); FILE *fp = fopen ((const char *) input_buf, "rb"); if (fp == NULL) return (PARSER_HASH_FILE); struct luks_phdr hdr; const size_t nread = hc_fread (&hdr, sizeof (hdr), 1, fp); if (nread != 1) { fclose (fp); return (PARSER_LUKS_FILE_SIZE); } // copy digest which we're not using ;) u32 *mkDigest_ptr = (u32 *) hdr.mkDigest; digest[0] = mkDigest_ptr[0]; digest[1] = mkDigest_ptr[1]; digest[2] = mkDigest_ptr[2]; digest[3] = mkDigest_ptr[3]; digest[4] = mkDigest_ptr[4]; digest[5] = 0; digest[6] = 0; digest[7] = 0; // verify the content char luks_magic[6] = LUKS_MAGIC; if (memcmp (hdr.magic, luks_magic, LUKS_MAGIC_L) != 0) { fclose (fp); return (PARSER_LUKS_MAGIC); } if (byte_swap_16 (hdr.version) != 1) { fclose (fp); return (PARSER_LUKS_VERSION); } if (strcmp (hdr.cipherName, "aes") == 0) { luks->cipher_type = HC_LUKS_CIPHER_TYPE_AES; } else if (strcmp (hdr.cipherName, "serpent") == 0) { luks->cipher_type = HC_LUKS_CIPHER_TYPE_SERPENT; } else if (strcmp (hdr.cipherName, "twofish") == 0) { luks->cipher_type = HC_LUKS_CIPHER_TYPE_TWOFISH; } else { fclose (fp); return (PARSER_LUKS_CIPHER_TYPE); } if (strcmp (hdr.cipherMode, "cbc-essiv:sha256") == 0) { luks->cipher_mode = HC_LUKS_CIPHER_MODE_CBC_ESSIV; } else if (strcmp (hdr.cipherMode, "cbc-plain") == 0) { luks->cipher_mode = HC_LUKS_CIPHER_MODE_CBC_PLAIN; } else if (strcmp (hdr.cipherMode, "cbc-plain64") == 0) { luks->cipher_mode = HC_LUKS_CIPHER_MODE_CBC_PLAIN; } else if (strcmp (hdr.cipherMode, "xts-plain") == 0) { luks->cipher_mode = HC_LUKS_CIPHER_MODE_XTS_PLAIN; } else if (strcmp (hdr.cipherMode, "xts-plain64") == 0) { luks->cipher_mode = HC_LUKS_CIPHER_MODE_XTS_PLAIN; } else { fclose (fp); return (PARSER_LUKS_CIPHER_MODE); } if (strcmp (hdr.hashSpec, "sha1") == 0) { luks->hash_type = HC_LUKS_HASH_TYPE_SHA1; } else if (strcmp (hdr.hashSpec, "sha256") == 0) { luks->hash_type = HC_LUKS_HASH_TYPE_SHA256; } else if (strcmp (hdr.hashSpec, "sha512") == 0) { luks->hash_type = HC_LUKS_HASH_TYPE_SHA512; } else if (strcmp (hdr.hashSpec, "ripemd160") == 0) { luks->hash_type = HC_LUKS_HASH_TYPE_RIPEMD160; } else if (strcmp (hdr.hashSpec, "whirlpool") == 0) { luks->hash_type = HC_LUKS_HASH_TYPE_WHIRLPOOL; } else { fclose (fp); return (PARSER_LUKS_HASH_TYPE); } const u32 keyBytes = byte_swap_32 (hdr.keyBytes); if (keyBytes == 16) { luks->key_size = HC_LUKS_KEY_SIZE_128; } else if (keyBytes == 32) { luks->key_size = HC_LUKS_KEY_SIZE_256; } else if (keyBytes == 64) { luks->key_size = HC_LUKS_KEY_SIZE_512; } else { fclose (fp); return (PARSER_LUKS_KEY_SIZE); } // find the correct kernel based on hash and cipher if ((luks->hash_type == HC_LUKS_HASH_TYPE_SHA1) && (luks->cipher_type == HC_LUKS_CIPHER_TYPE_AES)) { hashconfig->kern_type = KERN_TYPE_LUKS_SHA1_AES; } else if ((luks->hash_type == HC_LUKS_HASH_TYPE_SHA1) && (luks->cipher_type == HC_LUKS_CIPHER_TYPE_SERPENT)) { hashconfig->kern_type = KERN_TYPE_LUKS_SHA1_SERPENT; } else if ((luks->hash_type == HC_LUKS_HASH_TYPE_SHA1) && (luks->cipher_type == HC_LUKS_CIPHER_TYPE_TWOFISH)) { hashconfig->kern_type = KERN_TYPE_LUKS_SHA1_TWOFISH; } else if ((luks->hash_type == HC_LUKS_HASH_TYPE_SHA256) && (luks->cipher_type == HC_LUKS_CIPHER_TYPE_AES)) { hashconfig->kern_type = KERN_TYPE_LUKS_SHA256_AES; } else if ((luks->hash_type == HC_LUKS_HASH_TYPE_SHA256) && (luks->cipher_type == HC_LUKS_CIPHER_TYPE_SERPENT)) { hashconfig->kern_type = KERN_TYPE_LUKS_SHA256_SERPENT; } else if ((luks->hash_type == HC_LUKS_HASH_TYPE_SHA256) && (luks->cipher_type == HC_LUKS_CIPHER_TYPE_TWOFISH)) { hashconfig->kern_type = KERN_TYPE_LUKS_SHA256_TWOFISH; } else if ((luks->hash_type == HC_LUKS_HASH_TYPE_SHA512) && (luks->cipher_type == HC_LUKS_CIPHER_TYPE_AES)) { hashconfig->kern_type = KERN_TYPE_LUKS_SHA512_AES; } else if ((luks->hash_type == HC_LUKS_HASH_TYPE_SHA512) && (luks->cipher_type == HC_LUKS_CIPHER_TYPE_SERPENT)) { hashconfig->kern_type = KERN_TYPE_LUKS_SHA512_SERPENT; } else if ((luks->hash_type == HC_LUKS_HASH_TYPE_SHA512) && (luks->cipher_type == HC_LUKS_CIPHER_TYPE_TWOFISH)) { hashconfig->kern_type = KERN_TYPE_LUKS_SHA512_TWOFISH; } else if ((luks->hash_type == HC_LUKS_HASH_TYPE_RIPEMD160) && (luks->cipher_type == HC_LUKS_CIPHER_TYPE_AES)) { hashconfig->kern_type = KERN_TYPE_LUKS_RIPEMD160_AES; } else if ((luks->hash_type == HC_LUKS_HASH_TYPE_RIPEMD160) && (luks->cipher_type == HC_LUKS_CIPHER_TYPE_SERPENT)) { hashconfig->kern_type = KERN_TYPE_LUKS_RIPEMD160_SERPENT; } else if ((luks->hash_type == HC_LUKS_HASH_TYPE_RIPEMD160) && (luks->cipher_type == HC_LUKS_CIPHER_TYPE_TWOFISH)) { hashconfig->kern_type = KERN_TYPE_LUKS_RIPEMD160_TWOFISH; } else if ((luks->hash_type == HC_LUKS_HASH_TYPE_WHIRLPOOL) && (luks->cipher_type == HC_LUKS_CIPHER_TYPE_AES)) { hashconfig->kern_type = KERN_TYPE_LUKS_WHIRLPOOL_AES; } else if ((luks->hash_type == HC_LUKS_HASH_TYPE_WHIRLPOOL) && (luks->cipher_type == HC_LUKS_CIPHER_TYPE_SERPENT)) { hashconfig->kern_type = KERN_TYPE_LUKS_WHIRLPOOL_SERPENT; } else if ((luks->hash_type == HC_LUKS_HASH_TYPE_WHIRLPOOL) && (luks->cipher_type == HC_LUKS_CIPHER_TYPE_TWOFISH)) { hashconfig->kern_type = KERN_TYPE_LUKS_WHIRLPOOL_TWOFISH; } else { fclose (fp); return (PARSER_LUKS_HASH_CIPHER); } // verify the selected keyslot informations const u32 active = byte_swap_32 (hdr.keyblock[keyslot_idx].active); const u32 stripes = byte_swap_32 (hdr.keyblock[keyslot_idx].stripes); if (active != LUKS_KEY_ENABLED) { fclose (fp); return (PARSER_LUKS_KEY_DISABLED); } if (stripes != LUKS_STRIPES) { fclose (fp); return (PARSER_LUKS_KEY_STRIPES); } // configure the salt (not esalt) u32 *passwordSalt_ptr = (u32 *) hdr.keyblock[keyslot_idx].passwordSalt; salt->salt_buf[0] = passwordSalt_ptr[0]; salt->salt_buf[1] = passwordSalt_ptr[1]; salt->salt_buf[2] = passwordSalt_ptr[2]; salt->salt_buf[3] = passwordSalt_ptr[3]; salt->salt_buf[4] = passwordSalt_ptr[4]; salt->salt_buf[5] = passwordSalt_ptr[5]; salt->salt_buf[6] = passwordSalt_ptr[6]; salt->salt_buf[7] = passwordSalt_ptr[7]; salt->salt_len = LUKS_SALTSIZE; const u32 passwordIterations = byte_swap_32 (hdr.keyblock[keyslot_idx].passwordIterations); salt->salt_iter = passwordIterations - 1; // Load AF data for this keyslot into esalt const u32 keyMaterialOffset = byte_swap_32 (hdr.keyblock[keyslot_idx].keyMaterialOffset); const int rc_seek1 = fseeko (fp, keyMaterialOffset * 512, SEEK_SET); if (rc_seek1 == -1) { fclose (fp); return (PARSER_LUKS_FILE_SIZE); } const size_t nread2 = hc_fread (luks->af_src_buf, keyBytes, stripes, fp); if (nread2 != stripes) { fclose (fp); return (PARSER_LUKS_FILE_SIZE); } // finally, copy some encrypted payload data for entropy check const u32 payloadOffset = byte_swap_32 (hdr.payloadOffset); const int rc_seek2 = fseeko (fp, payloadOffset * 512, SEEK_SET); if (rc_seek2 == -1) { fclose (fp); return (PARSER_LUKS_FILE_SIZE); } const size_t nread3 = hc_fread (luks->ct_buf, sizeof (u32), 128, fp); if (nread3 != 128) { fclose (fp); return (PARSER_LUKS_FILE_SIZE); } // that should be it, close the fp fclose (fp); return (PARSER_OK); } int itunes_backup_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_14700) || (input_len > DISPLAY_LEN_MAX_14700)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_ITUNES_BACKUP, input_buf, 15) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 hash_mode = hashconfig->hash_mode; salt_t *salt = hash_buf->salt; itunes_backup_t *itunes_backup = (itunes_backup_t *) hash_buf->esalt; /** * parse line */ if (input_buf[15] != '*') return (PARSER_SEPARATOR_UNMATCHED); // version (9 or 10) u8 *version_pos = input_buf + 15 + 1; // WPKY u8 *wpky_pos = (u8 *) strchr ((const char *) version_pos, '*'); if (wpky_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 version_len = wpky_pos - version_pos; wpky_pos++; // iterations u8 *iter_pos = (u8 *) strchr ((const char *) wpky_pos, '*'); if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 wpky_len = iter_pos - wpky_pos; iter_pos++; // salt u8 *salt_pos = (u8 *) strchr ((const char *) iter_pos, '*'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 iter_len = salt_pos - iter_pos; salt_pos++; // DPIC u8 *dpic_pos = (u8 *) strchr ((const char *) salt_pos, '*'); if (dpic_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = dpic_pos - salt_pos; dpic_pos++; // DPSL u8 *dpsl_pos = (u8 *) strchr ((const char *) dpic_pos, '*'); if (dpsl_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 dpic_len = dpsl_pos - dpic_pos; dpsl_pos++; u32 dpsl_len = input_len - 15 - 1 - version_len - 1 - wpky_len - 1 - iter_len - 1 - salt_len - 1 - dpic_len - 1; /** * verify some data */ if ((version_len != 1) && (version_len != 2)) return (PARSER_SEPARATOR_UNMATCHED); u32 version = atoi ((const char *) version_pos); if (hash_mode == 14700) { if (version != 9) return (PARSER_SEPARATOR_UNMATCHED); } else if (hash_mode == 14800) { if (version != 10) return (PARSER_SEPARATOR_UNMATCHED); } if (wpky_len != 80) return (PARSER_HASH_LENGTH); if (iter_len < 1) return (PARSER_SALT_ITERATION); if (iter_len > 6) return (PARSER_SALT_ITERATION); u32 iter = atoi ((const char *) iter_pos); if (iter < 1) return (PARSER_SALT_ITERATION); if (salt_len != 40) return (PARSER_SALT_LENGTH); if (is_valid_hex_string (salt_pos, 20) == false) return (PARSER_SALT_ENCODING); if (is_valid_hex_string (wpky_pos, 40) == false) return (PARSER_HASH_ENCODING); u32 dpic = 0; if (hash_mode == 14700) { if (dpic_len > 0) return (PARSER_SEPARATOR_UNMATCHED); if (dpsl_len > 0) return (PARSER_SEPARATOR_UNMATCHED); } else if (hash_mode == 14800) { if (dpic_len < 1) return (PARSER_SALT_ITERATION); if (dpic_len > 9) return (PARSER_SALT_ITERATION); dpic = atoi ((const char *) dpic_pos); if (dpic < 1) return (PARSER_SALT_ITERATION); if (dpsl_len != 40) return (PARSER_SEPARATOR_UNMATCHED); if (is_valid_hex_string (dpsl_pos, 40) == false) return (PARSER_SALT_ENCODING); } /** * store data */ // version salt->salt_sign[0] = (char) version; // wpky u32 *wpky_buf_ptr = (u32 *) itunes_backup->wpky; wpky_buf_ptr[0] = hex_to_u32 ((const u8 *) &wpky_pos[ 0]); wpky_buf_ptr[1] = hex_to_u32 ((const u8 *) &wpky_pos[ 8]); wpky_buf_ptr[2] = hex_to_u32 ((const u8 *) &wpky_pos[16]); wpky_buf_ptr[3] = hex_to_u32 ((const u8 *) &wpky_pos[24]); wpky_buf_ptr[4] = hex_to_u32 ((const u8 *) &wpky_pos[32]); wpky_buf_ptr[5] = hex_to_u32 ((const u8 *) &wpky_pos[40]); wpky_buf_ptr[6] = hex_to_u32 ((const u8 *) &wpky_pos[48]); wpky_buf_ptr[7] = hex_to_u32 ((const u8 *) &wpky_pos[56]); wpky_buf_ptr[8] = hex_to_u32 ((const u8 *) &wpky_pos[64]); wpky_buf_ptr[9] = hex_to_u32 ((const u8 *) &wpky_pos[72]); wpky_buf_ptr[0] = byte_swap_32 (wpky_buf_ptr[0]); wpky_buf_ptr[1] = byte_swap_32 (wpky_buf_ptr[1]); wpky_buf_ptr[2] = byte_swap_32 (wpky_buf_ptr[2]); wpky_buf_ptr[3] = byte_swap_32 (wpky_buf_ptr[3]); wpky_buf_ptr[4] = byte_swap_32 (wpky_buf_ptr[4]); wpky_buf_ptr[5] = byte_swap_32 (wpky_buf_ptr[5]); wpky_buf_ptr[6] = byte_swap_32 (wpky_buf_ptr[6]); wpky_buf_ptr[7] = byte_swap_32 (wpky_buf_ptr[7]); wpky_buf_ptr[8] = byte_swap_32 (wpky_buf_ptr[8]); wpky_buf_ptr[9] = byte_swap_32 (wpky_buf_ptr[9]); // iter if (hash_mode == 14700) { salt->salt_iter = iter - 1; } else if (hash_mode == 14800) { salt->salt_iter = dpic - 1; salt->salt_iter2 = iter - 1; } // salt u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; // dpsl if (hash_mode == 14800) { u32 *dpsl_buf_ptr = (u32 *) itunes_backup->dpsl; dpsl_buf_ptr[0] = hex_to_u32 ((const u8 *) &dpsl_pos[ 0]); dpsl_buf_ptr[1] = hex_to_u32 ((const u8 *) &dpsl_pos[ 8]); dpsl_buf_ptr[2] = hex_to_u32 ((const u8 *) &dpsl_pos[16]); dpsl_buf_ptr[3] = hex_to_u32 ((const u8 *) &dpsl_pos[24]); dpsl_buf_ptr[4] = hex_to_u32 ((const u8 *) &dpsl_pos[32]); dpsl_buf_ptr[0] = byte_swap_32 (dpsl_buf_ptr[ 0]); dpsl_buf_ptr[1] = byte_swap_32 (dpsl_buf_ptr[ 1]); dpsl_buf_ptr[2] = byte_swap_32 (dpsl_buf_ptr[ 2]); dpsl_buf_ptr[3] = byte_swap_32 (dpsl_buf_ptr[ 3]); dpsl_buf_ptr[4] = byte_swap_32 (dpsl_buf_ptr[ 4]); } return (PARSER_OK); } int skip32_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if (input_len != DISPLAY_LEN_MIN_14900) return (PARSER_GLOBAL_LENGTH); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; /** * parse line */ u8 *hash_pos = input_buf; u8 *salt_pos = (u8 *) strchr ((const char *) hash_pos, ':'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = salt_pos - hash_pos; salt_pos++; /** * verify data */ if (is_valid_hex_string (hash_pos, 8) == false) return (PARSER_HASH_ENCODING); if (is_valid_hex_string (salt_pos, 8) == false) return (PARSER_SALT_ENCODING); /** * store data */ // digest digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]); digest[1] = 0; digest[2] = 0; digest[3] = 0; // salt salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]); salt->salt_len = salt_len / 2; // 4 return (PARSER_OK); } int fortigate_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if (input_len != DISPLAY_LEN_MIN_7000) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_FORTIGATE, input_buf, 3) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; /** * parse line */ u8 *hash_pos = input_buf + 3; /** * verify data */ // decode salt + SHA1 hash (12 + 20 = 32) u8 tmp_buf[100] = { 0 }; int decoded_len = base64_decode (base64_to_int, (const u8 *) hash_pos, DISPLAY_LEN_MAX_7000 - 3, tmp_buf); if (decoded_len != 32) return (PARSER_HASH_LENGTH); /** * store data */ // salt u32 salt_len = 12; memcpy (salt->salt_buf, tmp_buf, salt_len); salt->salt_len = salt_len; // digest memcpy (digest, tmp_buf + salt_len, 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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { digest[0] -= SHA1M_A; digest[1] -= SHA1M_B; digest[2] -= SHA1M_C; digest[3] -= SHA1M_D; digest[4] -= SHA1M_E; } return (PARSER_OK); } int sha256b64s_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_1411) || (input_len > DISPLAY_LEN_MAX_1411)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_SHA256B64S, input_buf, 9) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 tmp_buf[120] = { 0 }; const int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, 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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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; } const int salt_len = tmp_len - 32; salt->salt_len = salt_len; memcpy (salt->salt_buf, tmp_buf + 32, salt->salt_len); if (hashconfig->opts_type & OPTS_TYPE_ST_ADD80) { u8 *ptr = (u8 *) salt->salt_buf; ptr[salt->salt_len] = 0x80; } return (PARSER_OK); } int filezilla_server_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_15000) || (input_len > DISPLAY_LEN_MAX_15000)) return (PARSER_GLOBAL_LENGTH); u64 *digest = (u64 *) hash_buf->digest; salt_t *salt = hash_buf->salt; if (is_valid_hex_string (input_buf, 128) == false) return (PARSER_HASH_ENCODING); digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]); digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]); digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]); digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]); digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]); digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]); digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]); digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]); 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]); if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) { 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] != hashconfig->separator) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = input_len - 128 - 1; u8 *salt_buf = input_buf + 128 + 1; u8 *salt_buf_ptr = (u8 *) salt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); salt->salt_len = salt_len; return (PARSER_OK); } int netbsd_sha1crypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_15100) || (input_len > DISPLAY_LEN_MAX_15100)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_NETBSD_SHA1CRYPT, input_buf, 6) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; u8 *iter_pos = input_buf + 6; /** * parse line */ u8 *salt_pos = (u8 *) strchr ((const char *) iter_pos, '$'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); salt_pos++; u8 *hash_pos = (u8 *) strchr ((const char *) salt_pos, '$'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = hash_pos - salt_pos; hash_pos++; u32 hash_len = input_len - (hash_pos - input_buf); /** * verify data */ u32 iter = atoi ((const char *) iter_pos); if (iter < 99) return (PARSER_SALT_ITERATION); // (actually: CRYPT_SHA1_ITERATIONS should be 24680 or more) if (salt_len != 8) return (PARSER_SALT_LENGTH); if (hash_len != 28) return (PARSER_HASH_LENGTH); /** * store data */ // iterations: salt->salt_iter = iter - 1; // salt: memcpy ((u8 *) salt->salt_buf, salt_pos, salt_len); // salt length: salt->salt_len = salt_len; // digest: netbsd_sha1crypt_decode ((u8 *) digest, hash_pos, (u8 *) salt->salt_sign); 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]); // precompute salt char *ptr = (char *) salt->salt_buf_pc; const int salt_len_pc = snprintf (ptr, 64, "%s$sha1$%u", (char *) salt->salt_buf, iter); ptr[salt_len_pc] = 0x80; salt->salt_len_pc = salt_len_pc; return (PARSER_OK); } int atlassian_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_12001) || (input_len > DISPLAY_LEN_MAX_12001)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_ATLASSIAN, input_buf, 9) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt; /** * parse line */ u8 *base64_pos = input_buf + 9; // base64 ($salt . $digest) u8 tmp_buf[100] = { 0 }; int base64_decode_len = base64_decode (base64_to_int, (const u8 *) base64_pos, input_len - 9, tmp_buf); if (base64_decode_len != (16 + 32)) return (PARSER_HASH_LENGTH); /** * store data */ // store salt u8 *salt_buf_ptr = (u8 *) pbkdf2_sha1->salt_buf; u32 salt_len = parse_and_store_salt (salt_buf_ptr, tmp_buf, 16, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); if (salt_len != 16) 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 = ROUNDS_ATLASSIAN - 1; // store hash memcpy (digest, tmp_buf + 16, 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 jks_sha1_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_15500) || (input_len > DISPLAY_LEN_MAX_15500)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_JKS_SHA1, input_buf, 10) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; jks_sha1_t *jks_sha1 = (jks_sha1_t *) hash_buf->esalt; /** * parse line */ // checksum u8 *checksum_pos = input_buf + 10 + 1; // iv u8 *iv_pos = (u8 *) strchr ((const char *) checksum_pos, '*'); if (iv_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 checksum_len = iv_pos - checksum_pos; iv_pos++; // iterations u8 *enc_key_pos = (u8 *) strchr ((const char *) iv_pos, '*'); if (enc_key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 iv_len = enc_key_pos - iv_pos; enc_key_pos++; // der1 u8 *der1_pos = (u8 *) strchr ((const char *) enc_key_pos, '*'); if (der1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 enc_key_len = der1_pos - enc_key_pos; der1_pos++; // der2 u8 *der2_pos = (u8 *) strchr ((const char *) der1_pos, '*'); if (der2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 der1_len = der2_pos - der1_pos; der2_pos++; // alias u8 *alias_pos = (u8 *) strchr ((const char *) der2_pos, '*'); if (alias_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 der2_len = alias_pos - der2_pos; alias_pos++; u32 alias_len = input_len - 10 - 1 - checksum_len - 1 - iv_len - 1 - enc_key_len - 1 - der1_len - 1 - der2_len - 1; /** * verify data */ if (checksum_len != 40) return (PARSER_HASH_LENGTH); if (iv_len != 40) return (PARSER_SALT_LENGTH); if (enc_key_len >= 16384) return (PARSER_SALT_LENGTH); if (der1_len != 2) return (PARSER_SALT_LENGTH); if (der2_len != 28) return (PARSER_SALT_LENGTH); if (alias_len >= 64) return (PARSER_SALT_LENGTH); if (is_valid_hex_string (checksum_pos, 40) == false) return (PARSER_SALT_ENCODING); if (is_valid_hex_string (iv_pos, 40) == false) return (PARSER_SALT_ENCODING); if (is_valid_hex_string (der1_pos, 2) == false) return (PARSER_SALT_ENCODING); if (is_valid_hex_string (der2_pos, 28) == false) return (PARSER_SALT_ENCODING); /** * store data */ // checksum jks_sha1->checksum[0] = hex_to_u32 ((const u8 *) &checksum_pos[ 0]); jks_sha1->checksum[1] = hex_to_u32 ((const u8 *) &checksum_pos[ 8]); jks_sha1->checksum[2] = hex_to_u32 ((const u8 *) &checksum_pos[16]); jks_sha1->checksum[3] = hex_to_u32 ((const u8 *) &checksum_pos[24]); jks_sha1->checksum[4] = hex_to_u32 ((const u8 *) &checksum_pos[32]); // iv jks_sha1->iv[0] = hex_to_u32 ((const u8 *) &iv_pos[ 0]); jks_sha1->iv[1] = hex_to_u32 ((const u8 *) &iv_pos[ 8]); jks_sha1->iv[2] = hex_to_u32 ((const u8 *) &iv_pos[16]); jks_sha1->iv[3] = hex_to_u32 ((const u8 *) &iv_pos[24]); jks_sha1->iv[4] = hex_to_u32 ((const u8 *) &iv_pos[32]); // enc_key u8 *enc_key_buf = (u8 *) jks_sha1->enc_key_buf; for (u32 i = 0, j = 0; j < enc_key_len; i += 1, j += 2) { enc_key_buf[i] = hex_to_u8 ((const u8 *) &enc_key_pos[j]); jks_sha1->enc_key_len++; } // der1 u8 *der = (u8 *) jks_sha1->der; der[0] = hex_to_u8 ((const u8 *) &der1_pos[0]); // der2 for (u32 i = 6, j = 0; j < 28; i += 1, j += 2) { der[i] = hex_to_u8 ((const u8 *) &der2_pos[j]); } der[1] = 0; der[2] = 0; der[3] = 0; der[4] = 0; der[5] = 0; // alias strncpy ((char *) jks_sha1->alias, (const char *) alias_pos, (size_t) 64); // fake salt salt->salt_buf[0] = jks_sha1->iv[0]; salt->salt_buf[1] = jks_sha1->iv[1]; salt->salt_buf[2] = jks_sha1->iv[2]; salt->salt_buf[3] = jks_sha1->iv[3]; salt->salt_buf[4] = jks_sha1->iv[4]; salt->salt_len = 20; // fake digest digest[0] = byte_swap_32 (jks_sha1->der[0]); digest[1] = byte_swap_32 (jks_sha1->der[1]); digest[2] = byte_swap_32 (jks_sha1->der[2]); digest[3] = byte_swap_32 (jks_sha1->der[3]); digest[4] = byte_swap_32 (jks_sha1->der[4]); return (PARSER_OK); } int ethereum_pbkdf2_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_15600) || (input_len > DISPLAY_LEN_MAX_15600)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_ETHEREUM_PBKDF2, input_buf, 11) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; ethereum_pbkdf2_t *ethereum_pbkdf2 = (ethereum_pbkdf2_t *) hash_buf->esalt; /** * parse line */ // iter u8 *iter_pos = input_buf + 11 + 1; // salt u8 *salt_pos = (u8 *) strchr ((const char *) iter_pos, '*'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 iter_len = salt_pos - iter_pos; salt_pos++; // ciphertext u8 *ciphertext_pos = (u8 *) strchr ((const char *) salt_pos, '*'); if (ciphertext_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = ciphertext_pos - salt_pos; ciphertext_pos++; // hash u8 *hash_pos = (u8 *) strchr ((const char *) ciphertext_pos, '*'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 ciphertext_len = hash_pos - ciphertext_pos; hash_pos++; u32 hash_len = input_len - 11 - 1 - iter_len - 1 - salt_len - 1 - ciphertext_len - 1; /** * verify some data */ const u32 iter = atoi ((const char *) iter_pos); if (iter < 1) return (PARSER_SALT_ITERATION); if ((salt_len != 32) && (salt_len != 64)) return (PARSER_SALT_LENGTH); if (ciphertext_len != 64) return (PARSER_SALT_LENGTH); if (hash_len != 64) return (PARSER_SALT_LENGTH); if (is_valid_hex_string (salt_pos, salt_len) == false) return (PARSER_SALT_ENCODING); if (is_valid_hex_string (ciphertext_pos, ciphertext_len) == false) return (PARSER_HASH_ENCODING); if (is_valid_hex_string (hash_pos, hash_len) == false) return (PARSER_HASH_ENCODING); /** * store data */ u8 *salt_buf_ptr = (u8 *) ethereum_pbkdf2->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len, hashconfig); 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->salt_buf[0] = ethereum_pbkdf2->salt_buf[0]; salt->salt_buf[1] = ethereum_pbkdf2->salt_buf[1]; salt->salt_buf[2] = ethereum_pbkdf2->salt_buf[2]; salt->salt_buf[3] = ethereum_pbkdf2->salt_buf[3]; salt->salt_buf[4] = ethereum_pbkdf2->salt_buf[4]; salt->salt_buf[5] = ethereum_pbkdf2->salt_buf[5]; salt->salt_buf[6] = ethereum_pbkdf2->salt_buf[6]; salt->salt_buf[7] = ethereum_pbkdf2->salt_buf[7]; salt->salt_len = salt_len; salt->salt_iter = iter - 1; // ciphtertext ethereum_pbkdf2->ciphertext[0] = hex_to_u32 ((const u8 *) &ciphertext_pos[ 0]); ethereum_pbkdf2->ciphertext[1] = hex_to_u32 ((const u8 *) &ciphertext_pos[ 8]); ethereum_pbkdf2->ciphertext[2] = hex_to_u32 ((const u8 *) &ciphertext_pos[16]); ethereum_pbkdf2->ciphertext[3] = hex_to_u32 ((const u8 *) &ciphertext_pos[24]); ethereum_pbkdf2->ciphertext[4] = hex_to_u32 ((const u8 *) &ciphertext_pos[32]); ethereum_pbkdf2->ciphertext[5] = hex_to_u32 ((const u8 *) &ciphertext_pos[40]); ethereum_pbkdf2->ciphertext[6] = hex_to_u32 ((const u8 *) &ciphertext_pos[48]); ethereum_pbkdf2->ciphertext[7] = hex_to_u32 ((const u8 *) &ciphertext_pos[56]); // hash digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]); digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]); digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]); digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]); return (PARSER_OK); } int ethereum_scrypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED const hashconfig_t *hashconfig) { if ((input_len < DISPLAY_LEN_MIN_15700) || (input_len > DISPLAY_LEN_MAX_15700)) return (PARSER_GLOBAL_LENGTH); if (memcmp (SIGNATURE_ETHEREUM_SCRYPT, input_buf, 11) != 0) return (PARSER_SIGNATURE_UNMATCHED); u32 *digest = (u32 *) hash_buf->digest; salt_t *salt = hash_buf->salt; ethereum_scrypt_t *ethereum_scrypt = (ethereum_scrypt_t *) hash_buf->esalt; /** * parse line */ // scryptN u8 *scryptN_pos = input_buf + 11 + 1; // scryptr u8 *scryptr_pos = (u8 *) strchr ((const char *) scryptN_pos, '*'); if (scryptr_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 scryptN_len = scryptr_pos - scryptN_pos; scryptr_pos++; // scryptp u8 *scryptp_pos = (u8 *) strchr ((const char *) scryptr_pos, '*'); if (scryptp_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 scryptr_len = scryptp_pos - scryptr_pos; scryptp_pos++; // salt u8 *salt_pos = (u8 *) strchr ((const char *) scryptp_pos, '*'); if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 scryptp_len = salt_pos - scryptp_pos; salt_pos++; // ciphertext u8 *ciphertext_pos = (u8 *) strchr ((const char *) salt_pos, '*'); if (ciphertext_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 salt_len = ciphertext_pos - salt_pos; ciphertext_pos++; // hash u8 *hash_pos = (u8 *) strchr ((const char *) ciphertext_pos, '*'); if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); u32 ciphertext_len = hash_pos - ciphertext_pos; hash_pos++; u32 hash_len = input_len - 11 - 1 - scryptN_len - 1 - scryptr_len - 1 - scryptp_len - 1 - salt_len - 1 - ciphertext_len - 1; /** * verify some data */ const u32 scrypt_N = atoi ((const char *) scryptN_pos); const u32 scrypt_r = atoi ((const char *) scryptr_pos); const u32 scrypt_p = atoi ((const char *) scryptp_pos); if (salt_len != 64) return (PARSER_SALT_LENGTH); if (ciphertext_len != 64) return (PARSER_SALT_LENGTH); if (hash_len != 64) return (PARSER_SALT_LENGTH); if (is_valid_hex_string (salt_pos, salt_len) == false) return (PARSER_SALT_ENCODING); if (is_valid_hex_string (ciphertext_pos, ciphertext_len) == false) return (PARSER_HASH_ENCODING); if (is_valid_hex_string (hash_pos, hash_len) == false) return (PARSER_HASH_ENCODING); /** * store data */ u8 *salt_buf_ptr = (u8 *) ethereum_scrypt->salt_buf; salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len, hashconfig); if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); // salt salt->salt_buf[0] = ethereum_scrypt->salt_buf[0]; salt->salt_buf[1] = ethereum_scrypt->salt_buf[1]; salt->salt_buf[2] = ethereum_scrypt->salt_buf[2]; salt->salt_buf[3] = ethereum_scrypt->salt_buf[3]; salt->salt_buf[4] = ethereum_scrypt->salt_buf[4]; salt->salt_buf[5] = ethereum_scrypt->salt_buf[5]; salt->salt_buf[6] = ethereum_scrypt->salt_buf[6]; salt->salt_buf[7] = ethereum_scrypt->salt_buf[7]; salt->salt_len = salt_len; salt->salt_iter = 1; salt->scrypt_N = scrypt_N; salt->scrypt_r = scrypt_r; salt->scrypt_p = scrypt_p; // ciphtertext ethereum_scrypt->ciphertext[0] = hex_to_u32 ((const u8 *) &ciphertext_pos[ 0]); ethereum_scrypt->ciphertext[1] = hex_to_u32 ((const u8 *) &ciphertext_pos[ 8]); ethereum_scrypt->ciphertext[2] = hex_to_u32 ((const u8 *) &ciphertext_pos[16]); ethereum_scrypt->ciphertext[3] = hex_to_u32 ((const u8 *) &ciphertext_pos[24]); ethereum_scrypt->ciphertext[4] = hex_to_u32 ((const u8 *) &ciphertext_pos[32]); ethereum_scrypt->ciphertext[5] = hex_to_u32 ((const u8 *) &ciphertext_pos[40]); ethereum_scrypt->ciphertext[6] = hex_to_u32 ((const u8 *) &ciphertext_pos[48]); ethereum_scrypt->ciphertext[7] = hex_to_u32 ((const u8 *) &ciphertext_pos[56]); // hash digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]); digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]); digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]); digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]); return (PARSER_OK); } /** * hook functions */ void seven_zip_hook_func (hc_device_param_t *device_param, void *hook_salts_buf, const u32 salt_pos, const u32 pws_cnt) { seven_zip_hook_t *hook_items = (seven_zip_hook_t *) device_param->hooks_buf; seven_zip_hook_salt_t *seven_zips = (seven_zip_hook_salt_t *) hook_salts_buf; seven_zip_hook_salt_t *seven_zip = &seven_zips[salt_pos]; u8 data_type = seven_zip->data_type; u32 *data_buf = seven_zip->data_buf; u32 unpack_size = seven_zip->unpack_size; for (u32 pw_pos = 0; pw_pos < pws_cnt; pw_pos++) { // this hook data needs to be updated (the "hook_success" variable): seven_zip_hook_t *hook_item = &hook_items[pw_pos]; const u8 *ukey = (const u8 *) hook_item->ukey; // init AES AES_KEY aes_key; memset (&aes_key, 0, sizeof (aes_key)); AES_set_decrypt_key (ukey, 256, &aes_key); int aes_len = seven_zip->aes_len; u32 data[4]; u32 out [4]; u32 iv [4]; iv[0] = seven_zip->iv_buf[0]; iv[1] = seven_zip->iv_buf[1]; iv[2] = seven_zip->iv_buf[2]; iv[3] = seven_zip->iv_buf[3]; u32 out_full[81882]; // if aes_len > 16 we need to loop int i = 0; int j = 0; for (i = 0, j = 0; i < aes_len - 16; i += 16, j += 4) { data[0] = data_buf[j + 0]; data[1] = data_buf[j + 1]; data[2] = data_buf[j + 2]; data[3] = data_buf[j + 3]; AES_decrypt (&aes_key, (u8*) data, (u8*) out); 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_full[j + 0] = out[0]; out_full[j + 1] = out[1]; out_full[j + 2] = out[2]; out_full[j + 3] = out[3]; } // we need to run it at least once: data[0] = data_buf[j + 0]; data[1] = data_buf[j + 1]; data[2] = data_buf[j + 2]; data[3] = data_buf[j + 3]; AES_decrypt (&aes_key, (u8*) data, (u8*) out); out[0] ^= iv[0]; out[1] ^= iv[1]; out[2] ^= iv[2]; out[3] ^= iv[3]; out_full[j + 0] = out[0]; out_full[j + 1] = out[1]; out_full[j + 2] = out[2]; out_full[j + 3] = out[3]; /* * check the CRC32 "hash" */ u32 seven_zip_crc = seven_zip->crc; u32 crc; if (data_type == 0) // uncompressed { crc = cpu_crc32_buffer ((u8 *) out_full, unpack_size); } else { u32 crc_len = seven_zip->crc_len; char *coder_attributes = seven_zip->coder_attributes; // input buffers and length u8 *compressed_data = (u8 *) out_full; SizeT compressed_data_len = aes_len; // output buffers and length unsigned char *decompressed_data; decompressed_data = (unsigned char *) hcmalloc (crc_len); SizeT decompressed_data_len = crc_len; int ret; if (data_type == 1) // LZMA1 { ret = hc_lzma1_decompress (compressed_data, &compressed_data_len, decompressed_data, &decompressed_data_len, coder_attributes); } else // we only support LZMA2 in addition to LZMA1 { ret = hc_lzma2_decompress (compressed_data, &compressed_data_len, decompressed_data, &decompressed_data_len, coder_attributes); } if (ret != SZ_OK) { hook_item->hook_success = 0; hcfree (decompressed_data); continue; } crc = cpu_crc32_buffer (decompressed_data, crc_len); hcfree (decompressed_data); } if (crc == seven_zip_crc) { hook_item->hook_success = 1; } else { hook_item->hook_success = 0; } } } /** * output */ char *stroptitype (const u32 opti_type) { switch (opti_type) { case OPTI_TYPE_OPTIMIZED_KERNEL: return ((char *) OPTI_STR_OPTIMIZED_KERNEL); case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); case OPTI_TYPE_SLOW_HASH_SIMD_INIT: return ((char *) OPTI_STR_SLOW_HASH_SIMD_INIT); case OPTI_TYPE_SLOW_HASH_SIMD_LOOP: return ((char *) OPTI_STR_SLOW_HASH_SIMD_LOOP); case OPTI_TYPE_SLOW_HASH_SIMD_COMP: return ((char *) OPTI_STR_SLOW_HASH_SIMD_COMP); case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); } return (NULL); } char *strhashtype (const u32 hash_mode) { switch (hash_mode) { case 0: return ((char *) HT_00000); case 10: return ((char *) HT_00010); case 11: return ((char *) HT_00011); case 12: return ((char *) HT_00012); case 20: return ((char *) HT_00020); case 21: return ((char *) HT_00021); case 22: return ((char *) HT_00022); case 23: return ((char *) HT_00023); case 30: return ((char *) HT_00030); case 40: return ((char *) HT_00040); case 50: return ((char *) HT_00050); case 60: return ((char *) HT_00060); case 100: return ((char *) HT_00100); case 101: return ((char *) HT_00101); case 110: return ((char *) HT_00110); case 111: return ((char *) HT_00111); case 112: return ((char *) HT_00112); case 120: return ((char *) HT_00120); case 121: return ((char *) HT_00121); case 122: return ((char *) HT_00122); case 124: return ((char *) HT_00124); case 125: return ((char *) HT_00125); case 130: return ((char *) HT_00130); case 131: return ((char *) HT_00131); case 132: return ((char *) HT_00132); case 133: return ((char *) HT_00133); case 140: return ((char *) HT_00140); case 141: return ((char *) HT_00141); case 150: return ((char *) HT_00150); case 160: return ((char *) HT_00160); case 200: return ((char *) HT_00200); case 300: return ((char *) HT_00300); case 400: return ((char *) HT_00400); case 500: return ((char *) HT_00500); case 501: return ((char *) HT_00501); case 600: return ((char *) HT_00600); case 900: return ((char *) HT_00900); case 1000: return ((char *) HT_01000); case 1100: return ((char *) HT_01100); case 1300: return ((char *) HT_01300); case 1400: return ((char *) HT_01400); case 1410: return ((char *) HT_01410); case 1411: return ((char *) HT_01411); case 1420: return ((char *) HT_01420); case 1421: return ((char *) HT_01421); case 1430: return ((char *) HT_01430); case 1440: return ((char *) HT_01440); case 1441: return ((char *) HT_01441); case 1450: return ((char *) HT_01450); case 1460: return ((char *) HT_01460); case 1500: return ((char *) HT_01500); case 1600: return ((char *) HT_01600); case 1700: return ((char *) HT_01700); case 1710: return ((char *) HT_01710); case 1711: return ((char *) HT_01711); case 1720: return ((char *) HT_01720); case 1722: return ((char *) HT_01722); case 1730: return ((char *) HT_01730); case 1731: return ((char *) HT_01731); case 1740: return ((char *) HT_01740); case 1750: return ((char *) HT_01750); case 1760: return ((char *) HT_01760); case 1800: return ((char *) HT_01800); case 2100: return ((char *) HT_02100); case 2400: return ((char *) HT_02400); case 2410: return ((char *) HT_02410); case 2500: return ((char *) HT_02500); case 2501: return ((char *) HT_02501); case 2600: return ((char *) HT_02600); case 2611: return ((char *) HT_02611); case 2612: return ((char *) HT_02612); case 2711: return ((char *) HT_02711); case 2811: return ((char *) HT_02811); case 3000: return ((char *) HT_03000); case 3100: return ((char *) HT_03100); case 3200: return ((char *) HT_03200); case 3710: return ((char *) HT_03710); case 3711: return ((char *) HT_03711); case 3800: return ((char *) HT_03800); case 3910: return ((char *) HT_03910); case 4010: return ((char *) HT_04010); case 4110: return ((char *) HT_04110); case 4300: return ((char *) HT_04300); case 4400: return ((char *) HT_04400); case 4500: return ((char *) HT_04500); case 4520: return ((char *) HT_04520); case 4521: return ((char *) HT_04521); case 4522: return ((char *) HT_04522); case 4700: return ((char *) HT_04700); case 4800: return ((char *) HT_04800); case 4900: return ((char *) HT_04900); case 5000: return ((char *) HT_05000); case 5100: return ((char *) HT_05100); case 5200: return ((char *) HT_05200); case 5300: return ((char *) HT_05300); case 5400: return ((char *) HT_05400); case 5500: return ((char *) HT_05500); case 5600: return ((char *) HT_05600); case 5700: return ((char *) HT_05700); case 5800: return ((char *) HT_05800); case 6000: return ((char *) HT_06000); case 6100: return ((char *) HT_06100); case 6211: return ((char *) HT_06211); case 6212: return ((char *) HT_06212); case 6213: return ((char *) HT_06213); case 6221: return ((char *) HT_06221); case 6222: return ((char *) HT_06222); case 6223: return ((char *) HT_06223); case 6231: return ((char *) HT_06231); case 6232: return ((char *) HT_06232); case 6233: return ((char *) HT_06233); case 6241: return ((char *) HT_06241); case 6242: return ((char *) HT_06242); case 6243: return ((char *) HT_06243); case 6300: return ((char *) HT_06300); case 6400: return ((char *) HT_06400); case 6500: return ((char *) HT_06500); case 6600: return ((char *) HT_06600); case 6700: return ((char *) HT_06700); case 6800: return ((char *) HT_06800); case 6900: return ((char *) HT_06900); case 7000: return ((char *) HT_07000); case 7100: return ((char *) HT_07100); case 7200: return ((char *) HT_07200); case 7300: return ((char *) HT_07300); case 7400: return ((char *) HT_07400); case 7500: return ((char *) HT_07500); case 7700: return ((char *) HT_07700); case 7800: return ((char *) HT_07800); case 7900: return ((char *) HT_07900); case 8000: return ((char *) HT_08000); case 8100: return ((char *) HT_08100); case 8200: return ((char *) HT_08200); case 8300: return ((char *) HT_08300); case 8400: return ((char *) HT_08400); case 8500: return ((char *) HT_08500); case 8600: return ((char *) HT_08600); case 8700: return ((char *) HT_08700); case 8800: return ((char *) HT_08800); case 8900: return ((char *) HT_08900); case 9000: return ((char *) HT_09000); case 9100: return ((char *) HT_09100); case 9200: return ((char *) HT_09200); case 9300: return ((char *) HT_09300); case 9400: return ((char *) HT_09400); case 9500: return ((char *) HT_09500); case 9600: return ((char *) HT_09600); case 9700: return ((char *) HT_09700); case 9710: return ((char *) HT_09710); case 9720: return ((char *) HT_09720); case 9800: return ((char *) HT_09800); case 9810: return ((char *) HT_09810); case 9820: return ((char *) HT_09820); case 9900: return ((char *) HT_09900); case 10000: return ((char *) HT_10000); case 10100: return ((char *) HT_10100); case 10200: return ((char *) HT_10200); case 10300: return ((char *) HT_10300); case 10400: return ((char *) HT_10400); case 10410: return ((char *) HT_10410); case 10420: return ((char *) HT_10420); case 10500: return ((char *) HT_10500); case 10600: return ((char *) HT_10600); case 10700: return ((char *) HT_10700); case 10800: return ((char *) HT_10800); case 10900: return ((char *) HT_10900); case 11000: return ((char *) HT_11000); case 11100: return ((char *) HT_11100); case 11200: return ((char *) HT_11200); case 11300: return ((char *) HT_11300); case 11400: return ((char *) HT_11400); case 11500: return ((char *) HT_11500); case 11600: return ((char *) HT_11600); case 11700: return ((char *) HT_11700); case 11800: return ((char *) HT_11800); case 11900: return ((char *) HT_11900); case 12000: return ((char *) HT_12000); case 12001: return ((char *) HT_12001); case 12100: return ((char *) HT_12100); case 12200: return ((char *) HT_12200); case 12300: return ((char *) HT_12300); case 12400: return ((char *) HT_12400); case 12500: return ((char *) HT_12500); case 12600: return ((char *) HT_12600); case 12700: return ((char *) HT_12700); case 12800: return ((char *) HT_12800); case 12900: return ((char *) HT_12900); case 13000: return ((char *) HT_13000); case 13100: return ((char *) HT_13100); case 13200: return ((char *) HT_13200); case 13300: return ((char *) HT_13300); case 13400: return ((char *) HT_13400); case 13500: return ((char *) HT_13500); case 13600: return ((char *) HT_13600); case 13711: return ((char *) HT_13711); case 13712: return ((char *) HT_13712); case 13713: return ((char *) HT_13713); case 13721: return ((char *) HT_13721); case 13722: return ((char *) HT_13722); case 13723: return ((char *) HT_13723); case 13731: return ((char *) HT_13731); case 13732: return ((char *) HT_13732); case 13733: return ((char *) HT_13733); case 13741: return ((char *) HT_13741); case 13742: return ((char *) HT_13742); case 13743: return ((char *) HT_13743); case 13751: return ((char *) HT_13751); case 13752: return ((char *) HT_13752); case 13753: return ((char *) HT_13753); case 13761: return ((char *) HT_13761); case 13762: return ((char *) HT_13762); case 13763: return ((char *) HT_13763); case 13800: return ((char *) HT_13800); case 13900: return ((char *) HT_13900); case 14000: return ((char *) HT_14000); case 14100: return ((char *) HT_14100); case 14400: return ((char *) HT_14400); case 14600: return ((char *) HT_14600); case 14700: return ((char *) HT_14700); case 14800: return ((char *) HT_14800); case 14900: return ((char *) HT_14900); case 15000: return ((char *) HT_15000); case 15100: return ((char *) HT_15100); case 15200: return ((char *) HT_15200); case 15300: return ((char *) HT_15300); case 15400: return ((char *) HT_15400); case 15500: return ((char *) HT_15500); case 15600: return ((char *) HT_15600); case 15700: return ((char *) HT_15700); case 15900: return ((char *) HT_15900); case 99999: return ((char *) HT_99999); } return ((char *) "Unknown"); } char *strparser (const u32 parser_status) { switch (parser_status) { case PARSER_OK: return ((char *) PA_000); case PARSER_COMMENT: return ((char *) PA_001); case PARSER_GLOBAL_ZERO: return ((char *) PA_002); case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); case PARSER_HASH_LENGTH: return ((char *) PA_004); case PARSER_HASH_VALUE: return ((char *) PA_005); case PARSER_SALT_LENGTH: return ((char *) PA_006); case PARSER_SALT_VALUE: return ((char *) PA_007); case PARSER_SALT_ITERATION: return ((char *) PA_008); case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); case PARSER_HCCAPX_FILE_SIZE: return ((char *) PA_011); case PARSER_HCCAPX_EAPOL_LEN: return ((char *) PA_012); case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); case PARSER_TC_FILE_SIZE: return ((char *) PA_015); case PARSER_VC_FILE_SIZE: return ((char *) PA_016); case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_017); case PARSER_HASH_FILE: return ((char *) PA_018); case PARSER_HASH_ENCODING: return ((char *) PA_019); case PARSER_SALT_ENCODING: return ((char *) PA_020); case PARSER_LUKS_FILE_SIZE: return ((char *) PA_021); case PARSER_LUKS_MAGIC: return ((char *) PA_022); case PARSER_LUKS_VERSION: return ((char *) PA_023); case PARSER_LUKS_CIPHER_TYPE: return ((char *) PA_024); case PARSER_LUKS_CIPHER_MODE: return ((char *) PA_025); case PARSER_LUKS_HASH_TYPE: return ((char *) PA_026); case PARSER_LUKS_KEY_SIZE: return ((char *) PA_027); case PARSER_LUKS_KEY_DISABLED: return ((char *) PA_028); case PARSER_LUKS_KEY_STRIPES: return ((char *) PA_029); case PARSER_LUKS_HASH_CIPHER: return ((char *) PA_030); case PARSER_HCCAPX_SIGNATURE: return ((char *) PA_031); case PARSER_HCCAPX_VERSION: return ((char *) PA_032); case PARSER_HCCAPX_MESSAGE_PAIR: return ((char *) PA_033); } return ((char *) PA_255); } int check_old_hccap (const char *hashfile) { FILE *fp = fopen (hashfile, "rb"); if (fp == NULL) return -1; u32 signature; const size_t nread = hc_fread (&signature, sizeof (u32), 1, fp); fclose (fp); if (nread != 1) return -1; if (signature == HCCAPX_SIGNATURE) return 0; return 1; } void to_hccapx_t (hashcat_ctx_t *hashcat_ctx, hccapx_t *hccapx, const u32 salt_pos, const u32 digest_pos) { const hashes_t *hashes = hashcat_ctx->hashes; const salt_t *salts_buf = hashes->salts_buf; const void *esalts_buf = hashes->esalts_buf; memset (hccapx, 0, sizeof (hccapx_t)); hccapx->signature = HCCAPX_SIGNATURE; hccapx->version = HCCAPX_VERSION; const salt_t *salt = &salts_buf[salt_pos]; const u32 digest_cur = salt->digests_offset + digest_pos; hccapx->essid_len = salt->salt_len; memcpy (hccapx->essid, salt->salt_buf, hccapx->essid_len); wpa_t *wpas = (wpa_t *) esalts_buf; wpa_t *wpa = &wpas[digest_cur]; hccapx->message_pair = wpa->message_pair; hccapx->keyver = wpa->keyver; hccapx->eapol_len = wpa->eapol_len; if (wpa->keyver != 1) { u32 eapol_tmp[64] = { 0 }; for (u32 i = 0; i < 64; i++) { eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]); } memcpy (hccapx->eapol, eapol_tmp, wpa->eapol_len); } else { memcpy (hccapx->eapol, wpa->eapol, wpa->eapol_len); } memcpy (hccapx->mac_ap, wpa->orig_mac_ap, 6); memcpy (hccapx->mac_sta, wpa->orig_mac_sta, 6); memcpy (hccapx->nonce_ap, wpa->orig_nonce_ap, 32); memcpy (hccapx->nonce_sta, wpa->orig_nonce_sta, 32); if (wpa->keyver != 1) { u32 digest_tmp[4]; digest_tmp[0] = byte_swap_32 (wpa->keymic[0]); digest_tmp[1] = byte_swap_32 (wpa->keymic[1]); digest_tmp[2] = byte_swap_32 (wpa->keymic[2]); digest_tmp[3] = byte_swap_32 (wpa->keymic[3]); memcpy (hccapx->keymic, digest_tmp, 16); } else { memcpy (hccapx->keymic, wpa->keymic, 16); } } int ascii_digest (hashcat_ctx_t *hashcat_ctx, char *out_buf, const size_t out_len, const u32 salt_pos, const u32 digest_pos) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const hashes_t *hashes = hashcat_ctx->hashes; void *digests_buf = hashes->digests_buf; salt_t *salts_buf = hashes->salts_buf; void *esalts_buf = hashes->esalts_buf; hashinfo_t **hash_info = hashes->hash_info; const char *hashfile = hashes->hashfile; const u32 hash_type = hashconfig->hash_type; const u32 hash_mode = hashconfig->hash_mode; const u32 salt_type = hashconfig->salt_type; const u64 opts_type = hashconfig->opts_type; const u32 opti_type = hashconfig->opti_type; const u32 dgst_size = hashconfig->dgst_size; const u32 digest_cur = salts_buf[salt_pos].digests_offset + digest_pos; u8 datax[256] = { 0 }; u64 *digest_buf64 = (u64 *) datax; u32 *digest_buf = (u32 *) datax; char *digests_buf_ptr = (char *) digests_buf; memcpy (digest_buf, digests_buf_ptr + (salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size); if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT) { u32 tt; switch (hash_type) { case HASH_TYPE_DES: FP (digest_buf[1], digest_buf[0], tt); break; case HASH_TYPE_DESCRYPT: FP (digest_buf[1], digest_buf[0], tt); break; case HASH_TYPE_DESRACF: digest_buf[0] = rotl32 (digest_buf[0], 29); digest_buf[1] = rotl32 (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] = rotl32 (digest_buf[0], 29); digest_buf[1] = rotl32 (digest_buf[1], 29); digest_buf[2] = rotl32 (digest_buf[2], 29); digest_buf[3] = rotl32 (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] = rotl32 (digest_buf[0], 31); digest_buf[1] = rotl32 (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_SHA224: digest_buf[0] += SHA224M_A; digest_buf[1] += SHA224M_B; digest_buf[2] += SHA224M_C; digest_buf[3] += SHA224M_D; digest_buf[4] += SHA224M_E; digest_buf[5] += SHA224M_F; digest_buf[6] += SHA224M_G; 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_7) { for (int i = 0; i < 7; 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]); } } salt_t salt; const bool isSalted = ((hashconfig->salt_type == SALT_TYPE_GENERIC) | (hashconfig->salt_type == SALT_TYPE_EMBEDDED)); if (isSalted == true) { memcpy (&salt, &salts_buf[salt_pos], sizeof (salt_t)); char *ptr = (char *) salt.salt_buf; if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT) { switch (hash_type) { case HASH_TYPE_NETNTLM: salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3); salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3); u32 tt; FP (salt.salt_buf[1], salt.salt_buf[0], tt); break; } } u32 salt_len = salt.salt_len; if (opts_type & OPTS_TYPE_ST_UTF16LE) { for (u32 i = 0, j = 0; i < salt_len; i += 1, j += 2) { ptr[i] = ptr[j]; } salt_len = salt_len / 2; } if (opts_type & OPTS_TYPE_ST_GENERATE_LE) { u32 max = salt.salt_len / 4; if (salt_len % 4) max++; for (u32 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] = { 0 }; for (u32 i = 0, j = 0; i < salt_len; i += 1, j += 2) { sprintf (tmp + j, "%02x", (unsigned char) ptr[i]); } salt_len = salt_len * 2; memcpy (ptr, tmp, salt_len); } u32 memset_size = ((SALT_MAX - (int) salt_len) > 0) ? (SALT_MAX - salt_len) : 0; memset (ptr + salt_len, 0, memset_size); salt.salt_len = salt_len; } else { memset (&salt, 0, sizeof (salt_t)); } // // some modes require special encoding // u32 out_buf_plain[256] = { 0 }; u32 out_buf_salt[256] = { 0 }; char tmp_buf[1024] = { 0 }; char *ptr_plain = (char *) out_buf_plain; u8 *ptr_salt = (u8 *) out_buf_salt; if (hash_mode == 22) { char username[30] = { 0 }; memcpy (username, salt.salt_buf, salt.salt_len - 22); char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' }; u16 *ptr = (u16 *) 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, out_len - 1, "%s:%s", tmp_buf, username); } else if (hash_mode == 23) { // do not show the skyper part in output char *salt_buf_ptr = (char *) salt.salt_buf; salt_buf_ptr[salt.salt_len - 8] = 0; snprintf (out_buf, out_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 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]); memcpy (tmp_buf, digest_buf, 20); base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain); snprintf (out_buf, out_len - 1, "{SHA}%s", ptr_plain); } else if (hash_mode == 111) { // 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]); memcpy (tmp_buf, digest_buf, 20); memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len); base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain); snprintf (out_buf, out_len - 1, "{SSHA}%s", ptr_plain); } else if (hash_mode == 112) { snprintf (out_buf, out_len - 1, "%08x%08x%08x%08x%08x:%s", digest_buf[0], digest_buf[1], digest_buf[2], digest_buf[3], digest_buf[4], (char *) salt.salt_buf); } else if ((hash_mode == 122) || (hash_mode == 125)) { snprintf (out_buf, out_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 == 124) { snprintf (out_buf, out_len - 1, "sha1$%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 == 131) { snprintf (out_buf, out_len - 1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x", (char *) salt.salt_buf, 0u, 0u, 0u, 0u, 0u, digest_buf[0], digest_buf[1], digest_buf[2], digest_buf[3], digest_buf[4]); } else if (hash_mode == 132) { snprintf (out_buf, out_len - 1, "0x0100%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 == 133) { // 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]); memcpy (tmp_buf, digest_buf, 20); base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain); snprintf (out_buf, out_len - 1, "%s", ptr_plain); } else if (hash_mode == 141) { memcpy (tmp_buf, salt.salt_buf, salt.salt_len); base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, ptr_salt); // 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]); memcpy (tmp_buf, digest_buf, 20); memset (tmp_buf + 20, 0, sizeof (tmp_buf) - 20); base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain); ptr_plain[27] = 0; snprintf (out_buf, out_len - 1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain); } else if (hash_mode == 400) { // 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]); phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain); snprintf (out_buf, out_len - 1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, ptr_plain); } else if (hash_mode == 500) { // 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]); md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain); if (salt.salt_iter == ROUNDS_MD5CRYPT) { snprintf (out_buf, out_len - 1, "$1$%s$%s", (char *) salt.salt_buf, ptr_plain); } else { snprintf (out_buf, out_len - 1, "$1$rounds=%u$%s$%s", salt.salt_iter, (char *) salt.salt_buf, ptr_plain); } } else if (hash_mode == 501) { hashinfo_t **hashinfo_ptr = hash_info; char *hash_buf = hashinfo_ptr[digest_cur]->orighash; snprintf (out_buf, out_len - 1, "%s", hash_buf); } else if (hash_mode == 1411) { // 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); memcpy (tmp_buf + 32, salt.salt_buf, salt.salt_len); base64_encode (int_to_base64, (const u8 *) tmp_buf, 32 + salt.salt_len, (u8 *) ptr_plain); snprintf (out_buf, out_len - 1, "%s%s", SIGNATURE_SHA256B64S, ptr_plain); } else if (hash_mode == 1421) { u8 *salt_ptr = (u8 *) salt.salt_buf; snprintf (out_buf, out_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, (const u8 *) tmp_buf, salt.salt_len, ptr_salt); // 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); memset (tmp_buf + 32, 0, sizeof (tmp_buf) - 32); base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain); ptr_plain[43] = 0; snprintf (out_buf, out_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 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]); memcpy (tmp_buf, digest_buf, 8); base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain); snprintf (out_buf + 2, out_len - 1 - 2, "%s", ptr_plain); out_buf[13] = 0; } else if (hash_mode == 1600) { // 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]); md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain); if (salt.salt_iter == ROUNDS_MD5CRYPT) { snprintf (out_buf, out_len - 1, "$apr1$%s$%s", (char *) salt.salt_buf, ptr_plain); } else { snprintf (out_buf, out_len - 1, "$apr1$rounds=%u$%s$%s", salt.salt_iter, (char *) salt.salt_buf, 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, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain); snprintf (out_buf, out_len - 1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain); } else if (hash_mode == 1722) { u32 *ptr = digest_buf; snprintf (out_buf, out_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) { u32 *ptr = digest_buf; snprintf (out_buf, out_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, out_len - 1, "$6$%s$%s", (char *) salt.salt_buf, ptr_plain); } else { snprintf (out_buf, out_len - 1, "$6$rounds=%u$%s$%s", salt.salt_iter, (char *) salt.salt_buf, ptr_plain); } } else if (hash_mode == 2100) { u32 pos = 0; snprintf (out_buf + pos, out_len - 1 - pos, "%s%u#", SIGNATURE_DCC2, salt.salt_iter + 1); u32 signature_len = strlen (out_buf); pos += signature_len; char *salt_ptr = (char *) salt.salt_buf; for (u32 i = 0; i < salt.salt_len; i++, pos++) snprintf (out_buf + pos, out_len - 1 - pos, "%c", salt_ptr[i]); snprintf (out_buf + pos, out_len - 1 - pos, "#%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) || (hash_mode == 2501)) { wpa_t *wpas = (wpa_t *) esalts_buf; wpa_t *wpa = &wpas[digest_cur]; char *essid = (char *) wpa->essid; int tmp_len = 0; if (need_hexify (wpa->essid, wpa->essid_len, hashconfig->separator, 0) == true) { tmp_buf[tmp_len++] = '$'; tmp_buf[tmp_len++] = 'H'; tmp_buf[tmp_len++] = 'E'; tmp_buf[tmp_len++] = 'X'; tmp_buf[tmp_len++] = '['; exec_hexify (wpa->essid, wpa->essid_len, (u8 *) tmp_buf + tmp_len); tmp_len += wpa->essid_len * 2; tmp_buf[tmp_len++] = ']'; essid = tmp_buf; } snprintf (out_buf, out_len - 1, "%08x%08x%08x%08x:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x:%s", wpa->hash[0], wpa->hash[1], wpa->hash[2], wpa->hash[3], wpa->orig_mac_ap[0], wpa->orig_mac_ap[1], wpa->orig_mac_ap[2], wpa->orig_mac_ap[3], wpa->orig_mac_ap[4], wpa->orig_mac_ap[5], wpa->orig_mac_sta[0], wpa->orig_mac_sta[1], wpa->orig_mac_sta[2], wpa->orig_mac_sta[3], wpa->orig_mac_sta[4], wpa->orig_mac_sta[5], essid); } else if (hash_mode == 4400) { snprintf (out_buf, out_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, out_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) { u8 chap_id_byte = (u8) salt.salt_buf[4]; snprintf (out_buf, out_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, out_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, out_len - 1, "%08x%08x", digest_buf[0], digest_buf[1]); } else if (hash_mode == 5200) { snprintf (out_buf, out_len - 1, "%s", hashfile); } else if (hash_mode == 5300) { ikepsk_t *ikepsks = (ikepsk_t *) esalts_buf; ikepsk_t *ikepsk = &ikepsks[digest_cur]; size_t buf_len = out_len - 1; // msg_buf u32 ikepsk_msg_len = ikepsk->msg_len / 4; for (u32 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 u32 ikepsk_nr_len = ikepsk->nr_len / 4; for (u32 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 (u32 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 *) esalts_buf; ikepsk_t *ikepsk = &ikepsks[digest_cur]; size_t buf_len = out_len - 1; // msg_buf u32 ikepsk_msg_len = ikepsk->msg_len / 4; for (u32 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 u32 ikepsk_nr_len = ikepsk->nr_len / 4; for (u32 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 (u32 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 *) esalts_buf; netntlm_t *netntlm = &netntlms[digest_cur]; char user_buf[64] = { 0 }; char domain_buf[64] = { 0 }; char srvchall_buf[1024] = { 0 }; char clichall_buf[1024] = { 0 }; for (u32 i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2) { char *ptr = (char *) netntlm->userdomain_buf; user_buf[i] = ptr[j]; } for (u32 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 (u32 i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2) { u8 *ptr = (u8 *) netntlm->chall_buf; sprintf (srvchall_buf + j, "%02x", ptr[i]); } for (u32 i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2) { u8 *ptr = (u8 *) netntlm->chall_buf; sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]); } snprintf (out_buf, out_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 *) esalts_buf; netntlm_t *netntlm = &netntlms[digest_cur]; char user_buf[64] = { 0 }; char domain_buf[64] = { 0 }; char srvchall_buf[1024] = { 0 }; char clichall_buf[1024] = { 0 }; for (u32 i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2) { char *ptr = (char *) netntlm->userdomain_buf; user_buf[i] = ptr[j]; } for (u32 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 (u32 i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2) { u8 *ptr = (u8 *) netntlm->chall_buf; sprintf (srvchall_buf + j, "%02x", ptr[i]); } for (u32 i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2) { u8 *ptr = (u8 *) netntlm->chall_buf; sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]); } snprintf (out_buf, out_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, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain); ptr_plain[43] = 0; snprintf (out_buf, out_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, out_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, out_len - 1, "%s", hashfile); } else if (hash_mode == 6300) { // 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]); md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain); snprintf (out_buf, out_len - 1, "{smd5}%s$%s", (char *) salt.salt_buf, ptr_plain); } else if (hash_mode == 6400) { sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain); snprintf (out_buf, out_len - 1, "{ssha256}%02u$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, ptr_plain); } else if (hash_mode == 6500) { sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain); snprintf (out_buf, out_len - 1, "{ssha512}%02u$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, ptr_plain); } else if (hash_mode == 6600) { agilekey_t *agilekeys = (agilekey_t *) esalts_buf; agilekey_t *agilekey = &agilekeys[digest_cur]; salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]); salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]); u32 off = snprintf (out_buf, out_len - 1, "%u:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]); for (u32 i = 0, j = off; i < 1040; i++, j += 2) { snprintf (out_buf + j, out_len - 1 - j, "%02x", agilekey->cipher[i]); } } else if (hash_mode == 6700) { sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain); snprintf (out_buf, out_len - 1, "{ssha1}%02u$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, ptr_plain); } else if (hash_mode == 6800) { snprintf (out_buf, out_len - 1, "%s", (char *) salt.salt_buf); } else if (hash_mode == 7000) { // salt memcpy (tmp_buf, salt.salt_buf, 12); // digest memcpy (tmp_buf + 12, digest_buf, 20); // base64 encode (salt + SHA1) base64_encode (int_to_base64, (const u8 *) tmp_buf, 12 + 20, (u8 *) ptr_plain); ptr_plain[44] = 0; snprintf (out_buf, out_len - 1, "%s%s", SIGNATURE_FORTIGATE, ptr_plain); } else if (hash_mode == 7100) { u32 *ptr = digest_buf; pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) esalts_buf; pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[digest_cur]; u32 esalt[8] = { 0 }; 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, out_len - 1, "%s%u$%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_SHA512MACOS, 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) { u32 *ptr = digest_buf; pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) esalts_buf; pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[digest_cur]; u32 len_used = 0; snprintf (out_buf + len_used, out_len - 1 - len_used, "%s%u.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1); len_used = strlen (out_buf); unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf; for (u32 i = 0; i < salt.salt_len; i++, len_used += 2) { snprintf (out_buf + len_used, out_len - 1 - len_used, "%02x", salt_buf_ptr[i]); } snprintf (out_buf + len_used, out_len - 1 - len_used, ".%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 *) esalts_buf; rakp_t *rakp = &rakps[digest_cur]; u32 i; u32 j; u8 *ptr = (u8 *) rakp->salt_buf; for (i = 0, j = 0; i < rakp->salt_len; i += 1, j += 2) { snprintf (out_buf + j, out_len - 1 - j, "%02x", ptr[i ^ 3]); // the ^ 3 index converts LE -> BE } snprintf (out_buf + j, out_len - 1 - j, ":%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, out_len - 1, "$5$%s$%s", (char *) salt.salt_buf, ptr_plain); } else { snprintf (out_buf, out_len - 1, "$5$rounds=%u$%s$%s", salt.salt_iter, (char *) salt.salt_buf, ptr_plain); } } else if (hash_mode == 7500) { krb5pa_t *krb5pas = (krb5pa_t *) esalts_buf; krb5pa_t *krb5pa = &krb5pas[digest_cur]; u8 *ptr_timestamp = (u8 *) krb5pa->timestamp; u8 *ptr_checksum = (u8 *) krb5pa->checksum; char data[128] = { 0 }; char *ptr_data = data; for (u32 i = 0; i < 36; i++, ptr_data += 2) { sprintf (ptr_data, "%02x", ptr_timestamp[i]); } for (u32 i = 0; i < 16; i++, ptr_data += 2) { sprintf (ptr_data, "%02x", ptr_checksum[i]); } *ptr_data = 0; snprintf (out_buf, out_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, out_len - 1, "%s$%08X%08X", (char *) salt.salt_buf, digest_buf[0], digest_buf[1]); } else if (hash_mode == 7800) { snprintf (out_buf, out_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, out_len - 1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, ptr_plain); } else if (hash_mode == 8000) { snprintf (out_buf, out_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, out_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 *) esalts_buf; cloudkey_t *cloudkey = &cloudkeys[digest_cur]; char data_buf[4096] = { 0 }; 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, out_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) { char digest_buf_c[34] = { 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]); base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c); digest_buf_c[32] = 0; // domain const u32 salt_pc_len = salt.salt_len_pc; char domain_buf_c[33] = { 0 }; memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len); for (u32 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, out_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, out_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, out_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, out_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 *) esalts_buf; androidfde_t *androidfde = &androidfdes[digest_cur]; char tmp[3073] = { 0 }; for (u32 i = 0, j = 0; i < 384; i += 1, j += 8) { sprintf (tmp + j, "%08x", androidfde->data[i]); } tmp[3072] = 0; snprintf (out_buf, out_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) { u32 N = salt.scrypt_N; u32 r = salt.scrypt_r; u32 p = salt.scrypt_p; char base64_salt[32] = { 0 }; base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt); 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, (const u8 *) digest_buf, 32, (u8 *) tmp_buf); snprintf (out_buf, out_len - 1, "%s:%u:%u:%u:%s:%s", SIGNATURE_SCRYPT, N, r, p, base64_salt, tmp_buf); } else if (hash_mode == 9000) { snprintf (out_buf, out_len - 1, "%s", hashfile); } else if (hash_mode == 9200) { // salt pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) esalts_buf; pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[digest_cur]; 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 () base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf); tmp_buf[43] = 0; // cut it here // output snprintf (out_buf, out_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 () base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf); tmp_buf[43] = 0; // cut it here unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf; snprintf (out_buf, out_len - 1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf); } else if (hash_mode == 9400) { office2007_t *office2007s = (office2007_t *) esalts_buf; office2007_t *office2007 = &office2007s[digest_cur]; snprintf (out_buf, out_len - 1, "%s*%d*%d*%u*%d*%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 *) esalts_buf; office2010_t *office2010 = &office2010s[digest_cur]; snprintf (out_buf, out_len - 1, "%s*%d*%d*%d*%d*%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 *) esalts_buf; office2013_t *office2013 = &office2013s[digest_cur]; snprintf (out_buf, out_len - 1, "%s*%d*%d*%d*%d*%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 *) esalts_buf; oldoffice01_t *oldoffice01 = &oldoffice01s[digest_cur]; snprintf (out_buf, out_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 *) esalts_buf; oldoffice01_t *oldoffice01 = &oldoffice01s[digest_cur]; snprintf (out_buf, out_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 *) esalts_buf; oldoffice01_t *oldoffice01 = &oldoffice01s[digest_cur]; u8 *rc4key = (u8 *) oldoffice01->rc4key; snprintf (out_buf, out_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 *) esalts_buf; oldoffice34_t *oldoffice34 = &oldoffice34s[digest_cur]; snprintf (out_buf, out_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 *) esalts_buf; oldoffice34_t *oldoffice34 = &oldoffice34s[digest_cur]; snprintf (out_buf, out_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 *) esalts_buf; oldoffice34_t *oldoffice34 = &oldoffice34s[digest_cur]; u8 *rc4key = (u8 *) oldoffice34->rc4key; snprintf (out_buf, out_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 *) esalts_buf; pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[digest_cur]; 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 () base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf); // output snprintf (out_buf, out_len - 1, "%s%u$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf); } else if (hash_mode == 10100) { snprintf (out_buf, out_len - 1, "%08x%08x:%d:%d:%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 *) esalts_buf; cram_md5_t *cram_md5 = &cram_md5s[digest_cur]; // challenge char challenge[100] = { 0 }; base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge); // response int tmp_len = snprintf (tmp_buf, sizeof (tmp_buf) - 1, "%s %08x%08x%08x%08x", (char *) cram_md5->user, digest_buf[0], digest_buf[1], digest_buf[2], digest_buf[3]); char response[100] = { 0 }; base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response); snprintf (out_buf, out_len - 1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response); } else if (hash_mode == 10300) { memcpy (tmp_buf + 0, digest_buf, 20); memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len); u32 tmp_len = 20 + salt.salt_len; // base64 encode it char base64_encoded[100] = { 0 }; base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded); snprintf (out_buf, out_len - 1, "%s%u}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded); } else if (hash_mode == 10400) { pdf_t *pdfs = (pdf_t *) esalts_buf; pdf_t *pdf = &pdfs[digest_cur]; snprintf (out_buf, out_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 *) esalts_buf; pdf_t *pdf = &pdfs[digest_cur]; snprintf (out_buf, out_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 *) esalts_buf; pdf_t *pdf = &pdfs[digest_cur]; u8 *rc4key = (u8 *) pdf->rc4key; snprintf (out_buf, out_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 *) esalts_buf; pdf_t *pdf = &pdfs[digest_cur]; if (pdf->id_len == 32) { snprintf (out_buf, out_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, out_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) { hashinfo_t **hashinfo_ptr = hash_info; char *hash_buf = hashinfo_ptr[digest_cur]->orighash; snprintf (out_buf, out_len - 1, "%s", hash_buf); } else if (hash_mode == 10700) { hashinfo_t **hashinfo_ptr = hash_info; char *hash_buf = hashinfo_ptr[digest_cur]->orighash; snprintf (out_buf, out_len - 1, "%s", hash_buf); } else if (hash_mode == 10900) { hashinfo_t **hashinfo_ptr = hash_info; char *hash_buf = hashinfo_ptr[digest_cur]->orighash; snprintf (out_buf, out_len - 1, "%s", hash_buf); } else if (hash_mode == 11100) { u32 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, out_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, out_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 *) esalts_buf; bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[digest_cur]; const u32 cry_master_len = bitcoin_wallet->cry_master_len; const u32 ckey_len = bitcoin_wallet->ckey_len; const u32 public_key_len = bitcoin_wallet->public_key_len; char *cry_master_buf = (char *) hcmalloc ((cry_master_len * 2) + 1); char *ckey_buf = (char *) hcmalloc ((ckey_len * 2) + 1); char *public_key_buf = (char *) hcmalloc ((public_key_len * 2) + 1); for (u32 i = 0, j = 0; i < cry_master_len; i += 1, j += 2) { const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf; sprintf (cry_master_buf + j, "%02x", ptr[i]); } for (u32 i = 0, j = 0; i < ckey_len; i += 1, j += 2) { const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf; sprintf (ckey_buf + j, "%02x", ptr[i]); } for (u32 i = 0, j = 0; i < public_key_len; i += 1, j += 2) { const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf; sprintf (public_key_buf + j, "%02x", ptr[i]); } snprintf (out_buf, out_len - 1, "%s%u$%s$%u$%s$%u$%u$%s$%u$%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 ); hcfree (cry_master_buf); hcfree (ckey_buf); hcfree (public_key_buf); } else if (hash_mode == 11400) { hashinfo_t **hashinfo_ptr = hash_info; char *hash_buf = hashinfo_ptr[digest_cur]->orighash; snprintf (out_buf, out_len - 1, "%s", hash_buf); } else if (hash_mode == 11500) { snprintf (out_buf, out_len - 1, "%08x:%s", byte_swap_32 (digest_buf[0]), (char *) salt.salt_buf); } else if (hash_mode == 11600) { seven_zip_hook_salt_t *seven_zips = (seven_zip_hook_salt_t *) hashes->hook_salts_buf; seven_zip_hook_salt_t *seven_zip = &seven_zips[digest_cur]; const u32 data_len = seven_zip->data_len; char *data_buf = (char *) hcmalloc ((data_len * 2) + 1); for (u32 i = 0, j = 0; i < data_len; i += 1, j += 2) { const u8 *ptr = (const u8 *) seven_zip->data_buf; snprintf (data_buf + j, (data_len * 2) + 1 - j, "%02x", ptr[i]); } u32 salt_iter = salt.salt_iter; u32 iv[4]; iv[0] = byte_swap_32 (seven_zip->iv_buf[0]); iv[1] = byte_swap_32 (seven_zip->iv_buf[1]); iv[2] = byte_swap_32 (seven_zip->iv_buf[2]); iv[3] = byte_swap_32 (seven_zip->iv_buf[3]); u32 iv_len = seven_zip->iv_len; u32 cost = 0; // the log2 () of salt_iter while (salt_iter >>= 1) { cost++; } snprintf (out_buf, out_len - 1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s", SIGNATURE_SEVEN_ZIP, salt.salt_sign[0], cost, seven_zip->salt_len, (char *) seven_zip->salt_buf, iv_len, iv[0], iv[1], iv[2], iv[3], seven_zip->crc, seven_zip->data_len, seven_zip->unpack_size, data_buf); if (seven_zip->data_type > 0) { u32 bytes_written = strlen (out_buf); snprintf (out_buf + bytes_written, out_len - bytes_written - 1, "$%u$", seven_zip->crc_len); bytes_written = strlen (out_buf); const u8 *ptr = (const u8 *) seven_zip->coder_attributes; for (u32 i = 0, j = 0; i < seven_zip->coder_attributes_len; i += 1, j += 2) { snprintf (out_buf + bytes_written, out_len - bytes_written - 1, "%02x", ptr[i]); bytes_written += 2; } } hcfree (data_buf); } else if (hash_mode == 11700) { snprintf (out_buf, out_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, out_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) { hashinfo_t **hashinfo_ptr = hash_info; char *hash_buf = hashinfo_ptr[digest_cur]->orighash; snprintf (out_buf, out_len - 1, "%s", hash_buf); } else if (hash_mode == 12000) { hashinfo_t **hashinfo_ptr = hash_info; char *hash_buf = hashinfo_ptr[digest_cur]->orighash; snprintf (out_buf, out_len - 1, "%s", hash_buf); } else if (hash_mode == 12001) { hashinfo_t **hashinfo_ptr = hash_info; char *hash_buf = hashinfo_ptr[digest_cur]->orighash; snprintf (out_buf, out_len - 1, "%s", hash_buf); } else if (hash_mode == 12100) { hashinfo_t **hashinfo_ptr = hash_info; char *hash_buf = hashinfo_ptr[digest_cur]->orighash; snprintf (out_buf, out_len - 1, "%s", hash_buf); } else if (hash_mode == 12200) { u32 *ptr_digest = digest_buf; snprintf (out_buf, out_len - 1, "%s0$1$%08x%08x$%08x%08x", SIGNATURE_ECRYPTFS, salt.salt_buf[0], salt.salt_buf[1], ptr_digest[0], ptr_digest[1]); } else if (hash_mode == 12300) { u32 *ptr_digest = digest_buf; snprintf (out_buf, out_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], salt.salt_buf[0], salt.salt_buf[1], salt.salt_buf[2], salt.salt_buf[3]); } else if (hash_mode == 12400) { // encode iteration count u8 salt_iter[5] = { 0 }; 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, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain); ptr_plain[11] = 0; // fill the resulting buffer snprintf (out_buf, out_len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain); } else if (hash_mode == 12500) { snprintf (out_buf, out_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, out_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) { hashinfo_t **hashinfo_ptr = hash_info; char *hash_buf = hashinfo_ptr[digest_cur]->orighash; snprintf (out_buf, out_len - 1, "%s", hash_buf); } else if (hash_mode == 12800) { const u8 *ptr = (const u8 *) salt.salt_buf; snprintf (out_buf, out_len - 1, "%s,%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x,%u,%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_mode == 12900) { snprintf (out_buf, out_len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x", salt.salt_buf[ 4], salt.salt_buf[ 5], salt.salt_buf[ 6], salt.salt_buf[ 7], salt.salt_buf[ 8], salt.salt_buf[ 9], salt.salt_buf[10], salt.salt_buf[11], 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]), salt.salt_buf[ 0], salt.salt_buf[ 1], salt.salt_buf[ 2], salt.salt_buf[ 3] ); } else if (hash_mode == 13000) { rar5_t *rar5s = (rar5_t *) esalts_buf; rar5_t *rar5 = &rar5s[digest_cur]; snprintf (out_buf, out_len - 1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x", salt.salt_buf[0], salt.salt_buf[1], salt.salt_buf[2], salt.salt_buf[3], salt.salt_sign[0], rar5->iv[0], rar5->iv[1], rar5->iv[2], rar5->iv[3], byte_swap_32 (digest_buf[0]), byte_swap_32 (digest_buf[1]) ); } else if (hash_mode == 13100) { krb5tgs_t *krb5tgss = (krb5tgs_t *) esalts_buf; krb5tgs_t *krb5tgs = &krb5tgss[digest_cur]; u8 *ptr_checksum = (u8 *) krb5tgs->checksum; u8 *ptr_edata2 = (u8 *) krb5tgs->edata2; char data[2560 * 4 * 2] = { 0 }; char *ptr_data = data; for (u32 i = 0; i < 16; i++, ptr_data += 2) sprintf (ptr_data, "%02x", ptr_checksum[i]); /* skip '$' */ ptr_data++; for (u32 i = 0; i < krb5tgs->edata2_len; i++, ptr_data += 2) sprintf (ptr_data, "%02x", ptr_edata2[i]); snprintf (out_buf, out_len - 1, "%s$%s$%s$%s", SIGNATURE_KRB5TGS, (char *) krb5tgs->account_info, data, data + 33); } else if (hash_mode == 13200) { snprintf (out_buf, out_len - 1, "%s*%u*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x", SIGNATURE_AXCRYPT, salt.salt_iter, salt.salt_buf[0], salt.salt_buf[1], salt.salt_buf[2], salt.salt_buf[3], salt.salt_buf[4], salt.salt_buf[5], salt.salt_buf[6], salt.salt_buf[7], salt.salt_buf[8], salt.salt_buf[9]); } else if (hash_mode == 13300) { snprintf (out_buf, out_len - 1, "%s$%08x%08x%08x%08x", SIGNATURE_AXCRYPT_SHA1, digest_buf[0], digest_buf[1], digest_buf[2], digest_buf[3]); } else if (hash_mode == 13400) { keepass_t *keepasss = (keepass_t *) esalts_buf; keepass_t *keepass = &keepasss[digest_cur]; u32 version = keepass->version; u32 rounds = salt.salt_iter; u32 algorithm = keepass->algorithm; u32 keyfile_len = keepass->keyfile_len; u32 *ptr_final_random_seed = (u32 *) keepass->final_random_seed; u32 *ptr_transf_random_seed = (u32 *) keepass->transf_random_seed; u32 *ptr_enc_iv = (u32 *) keepass->enc_iv; u32 *ptr_contents_hash = (u32 *) keepass->contents_hash; u32 *ptr_keyfile = (u32 *) keepass->keyfile; /* specific to version 2 */ u32 expected_bytes_len; u32 *ptr_expected_bytes; u32 final_random_seed_len; u32 transf_random_seed_len; u32 enc_iv_len; u32 contents_hash_len; transf_random_seed_len = 8; enc_iv_len = 4; contents_hash_len = 8; final_random_seed_len = 8; if (version == 1) final_random_seed_len = 4; snprintf (out_buf, out_len - 1, "%s*%u*%u*%u", SIGNATURE_KEEPASS, version, rounds, algorithm); char *ptr_data = out_buf; ptr_data += strlen(out_buf); *ptr_data = '*'; ptr_data++; for (u32 i = 0; i < final_random_seed_len; i++, ptr_data += 8) sprintf (ptr_data, "%08x", ptr_final_random_seed[i]); *ptr_data = '*'; ptr_data++; for (u32 i = 0; i < transf_random_seed_len; i++, ptr_data += 8) sprintf (ptr_data, "%08x", ptr_transf_random_seed[i]); *ptr_data = '*'; ptr_data++; for (u32 i = 0; i < enc_iv_len; i++, ptr_data += 8) sprintf (ptr_data, "%08x", ptr_enc_iv[i]); *ptr_data = '*'; ptr_data++; if (version == 1) { u32 contents_len = keepass->contents_len; u32 *ptr_contents = (u32 *) keepass->contents; for (u32 i = 0; i < contents_hash_len; i++, ptr_data += 8) sprintf (ptr_data, "%08x", ptr_contents_hash[i]); *ptr_data = '*'; ptr_data++; /* inline flag */ *ptr_data = '1'; ptr_data++; *ptr_data = '*'; ptr_data++; char ptr_contents_len[10] = { 0 }; sprintf ((char*) ptr_contents_len, "%u", contents_len); sprintf (ptr_data, "%u", contents_len); ptr_data += strlen(ptr_contents_len); *ptr_data = '*'; ptr_data++; for (u32 i = 0; i < contents_len / 4; i++, ptr_data += 8) sprintf (ptr_data, "%08x", ptr_contents[i]); } else if (version == 2) { expected_bytes_len = 8; ptr_expected_bytes = (u32 *) keepass->expected_bytes; for (u32 i = 0; i < expected_bytes_len; i++, ptr_data += 8) sprintf (ptr_data, "%08x", ptr_expected_bytes[i]); *ptr_data = '*'; ptr_data++; for (u32 i = 0; i < contents_hash_len; i++, ptr_data += 8) sprintf (ptr_data, "%08x", ptr_contents_hash[i]); } if (keyfile_len) { *ptr_data = '*'; ptr_data++; /* inline flag */ *ptr_data = '1'; ptr_data++; *ptr_data = '*'; ptr_data++; sprintf (ptr_data, "%u", keyfile_len); ptr_data += 2; *ptr_data = '*'; ptr_data++; for (u32 i = 0; i < 8; i++, ptr_data += 8) sprintf (ptr_data, "%08x", ptr_keyfile[i]); } } else if (hash_mode == 13500) { pstoken_t *pstokens = (pstoken_t *) esalts_buf; pstoken_t *pstoken = &pstokens[digest_cur]; const u32 salt_len = (pstoken->salt_len > 512) ? 512 : pstoken->salt_len; char pstoken_tmp[1024 + 1] = { 0 }; for (u32 i = 0, j = 0; i < salt_len; i += 1, j += 2) { const u8 *ptr = (const u8 *) pstoken->salt_buf; sprintf (pstoken_tmp + j, "%02x", ptr[i]); } snprintf (out_buf, out_len - 1, "%08x%08x%08x%08x%08x:%s", digest_buf[0], digest_buf[1], digest_buf[2], digest_buf[3], digest_buf[4], pstoken_tmp); } else if (hash_mode == 13600) { zip2_t *zip2s = (zip2_t *) esalts_buf; zip2_t *zip2 = &zip2s[digest_cur]; const u32 salt_len = zip2->salt_len; char salt_tmp[32 + 1] = { 0 }; for (u32 i = 0, j = 0; i < salt_len; i += 1, j += 2) { const u8 *ptr = (const u8 *) zip2->salt_buf; sprintf (salt_tmp + j, "%02x", ptr[i]); } const u32 data_len = zip2->data_len; char data_tmp[8192 + 1] = { 0 }; for (u32 i = 0, j = 0; i < data_len; i += 1, j += 2) { const u8 *ptr = (const u8 *) zip2->data_buf; sprintf (data_tmp + j, "%02x", ptr[i]); } const u32 auth_len = zip2->auth_len; char auth_tmp[20 + 1] = { 0 }; for (u32 i = 0, j = 0; i < auth_len; i += 1, j += 2) { const u8 *ptr = (const u8 *) zip2->auth_buf; sprintf (auth_tmp + j, "%02x", ptr[i]); } snprintf (out_buf, out_len - 1, "%s*%u*%u*%u*%s*%x*%u*%s*%s*%s", SIGNATURE_ZIP2_START, zip2->type, zip2->mode, zip2->magic, salt_tmp, zip2->verify_bytes, zip2->compress_length, data_tmp, auth_tmp, SIGNATURE_ZIP2_STOP); } else if ((hash_mode >= 13700) && (hash_mode <= 13799)) { snprintf (out_buf, out_len - 1, "%s", hashfile); } else if (hash_mode == 13800) { win8phone_t *esalts = (win8phone_t *) esalts_buf; win8phone_t *esalt = &esalts[digest_cur]; char buf[256 + 1] = { 0 }; for (int i = 0, j = 0; i < 32; i += 1, j += 8) { sprintf (buf + j, "%08x", esalt->salt_buf[i]); } snprintf (out_buf, out_len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x:%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], buf); } else if (hash_mode == 14000) { snprintf (out_buf, out_len - 1, "%08x%08x:%s", digest_buf[0], digest_buf[1], (char *) salt.salt_buf); } else if (hash_mode == 14100) { snprintf (out_buf, out_len - 1, "%08x%08x:%s", digest_buf[0], digest_buf[1], (char *) salt.salt_buf); } else if (hash_mode == 14400) { snprintf (out_buf, out_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 == 14600) { snprintf (out_buf, out_len - 1, "%s", hashfile); } else if (hash_mode == 14700) { // WPKY itunes_backup_t *itunes_backups = (itunes_backup_t *) esalts_buf; itunes_backup_t *itunes_backup = &itunes_backups[digest_cur]; u32 wkpy_u32[10]; wkpy_u32[0] = byte_swap_32 (itunes_backup->wpky[0]); wkpy_u32[1] = byte_swap_32 (itunes_backup->wpky[1]); wkpy_u32[2] = byte_swap_32 (itunes_backup->wpky[2]); wkpy_u32[3] = byte_swap_32 (itunes_backup->wpky[3]); wkpy_u32[4] = byte_swap_32 (itunes_backup->wpky[4]); wkpy_u32[5] = byte_swap_32 (itunes_backup->wpky[5]); wkpy_u32[6] = byte_swap_32 (itunes_backup->wpky[6]); wkpy_u32[7] = byte_swap_32 (itunes_backup->wpky[7]); wkpy_u32[8] = byte_swap_32 (itunes_backup->wpky[8]); wkpy_u32[9] = byte_swap_32 (itunes_backup->wpky[9]); u8 wpky[80 + 1]; u32_to_hex_lower (wkpy_u32[0], wpky + 0); u32_to_hex_lower (wkpy_u32[1], wpky + 8); u32_to_hex_lower (wkpy_u32[2], wpky + 16); u32_to_hex_lower (wkpy_u32[3], wpky + 24); u32_to_hex_lower (wkpy_u32[4], wpky + 32); u32_to_hex_lower (wkpy_u32[5], wpky + 40); u32_to_hex_lower (wkpy_u32[6], wpky + 48); u32_to_hex_lower (wkpy_u32[7], wpky + 56); u32_to_hex_lower (wkpy_u32[8], wpky + 64); u32_to_hex_lower (wkpy_u32[9], wpky + 72); wpky[80] = 0; snprintf (out_buf, out_len - 1, "%s*%u*%s*%u*%s**", SIGNATURE_ITUNES_BACKUP, salt.salt_sign[0], wpky, salt.salt_iter + 1, (char *) salt.salt_buf); } else if (hash_mode == 14800) { // WPKY itunes_backup_t *itunes_backups = (itunes_backup_t *) esalts_buf; itunes_backup_t *itunes_backup = &itunes_backups[digest_cur]; u32 wkpy_u32[10]; wkpy_u32[0] = byte_swap_32 (itunes_backup->wpky[0]); wkpy_u32[1] = byte_swap_32 (itunes_backup->wpky[1]); wkpy_u32[2] = byte_swap_32 (itunes_backup->wpky[2]); wkpy_u32[3] = byte_swap_32 (itunes_backup->wpky[3]); wkpy_u32[4] = byte_swap_32 (itunes_backup->wpky[4]); wkpy_u32[5] = byte_swap_32 (itunes_backup->wpky[5]); wkpy_u32[6] = byte_swap_32 (itunes_backup->wpky[6]); wkpy_u32[7] = byte_swap_32 (itunes_backup->wpky[7]); wkpy_u32[8] = byte_swap_32 (itunes_backup->wpky[8]); wkpy_u32[9] = byte_swap_32 (itunes_backup->wpky[9]); u8 wpky[80 + 1]; u32_to_hex_lower (wkpy_u32[0], wpky + 0); u32_to_hex_lower (wkpy_u32[1], wpky + 8); u32_to_hex_lower (wkpy_u32[2], wpky + 16); u32_to_hex_lower (wkpy_u32[3], wpky + 24); u32_to_hex_lower (wkpy_u32[4], wpky + 32); u32_to_hex_lower (wkpy_u32[5], wpky + 40); u32_to_hex_lower (wkpy_u32[6], wpky + 48); u32_to_hex_lower (wkpy_u32[7], wpky + 56); u32_to_hex_lower (wkpy_u32[8], wpky + 64); u32_to_hex_lower (wkpy_u32[9], wpky + 72); wpky[80] = 0; // DPSL u32 dpsl_u32[5]; dpsl_u32[0] = byte_swap_32 (itunes_backup->dpsl[0]); dpsl_u32[1] = byte_swap_32 (itunes_backup->dpsl[1]); dpsl_u32[2] = byte_swap_32 (itunes_backup->dpsl[2]); dpsl_u32[3] = byte_swap_32 (itunes_backup->dpsl[3]); dpsl_u32[4] = byte_swap_32 (itunes_backup->dpsl[4]); u8 dpsl[80 + 1]; u32_to_hex_lower (dpsl_u32[0], dpsl + 0); u32_to_hex_lower (dpsl_u32[1], dpsl + 8); u32_to_hex_lower (dpsl_u32[2], dpsl + 16); u32_to_hex_lower (dpsl_u32[3], dpsl + 24); u32_to_hex_lower (dpsl_u32[4], dpsl + 32); dpsl[40] = 0; snprintf (out_buf, out_len - 1, "%s*%u*%s*%u*%s*%u*%s", SIGNATURE_ITUNES_BACKUP, salt.salt_sign[0], wpky, salt.salt_iter2 + 1, (char *) salt.salt_buf, salt.salt_iter + 1, dpsl); } else if (hash_mode == 14900) { snprintf (out_buf, out_len - 1, "%08x:%08x", digest_buf[0], salt.salt_buf[0]); } else if (hash_mode == 15100) { // encode the digest: netbsd_sha1crypt_encode ((unsigned char *) digest_buf, salt.salt_sign[0], (unsigned char *) ptr_plain); // output: snprintf (out_buf, out_len - 1, "$sha1$%u$%s$%s", salt.salt_iter + 1, (char *) salt.salt_buf, ptr_plain); } else if (hash_mode == 15200) { hashinfo_t **hashinfo_ptr = hash_info; char *hash_buf = hashinfo_ptr[digest_cur]->orighash; snprintf (out_buf, out_len - 1, "%s", hash_buf); } else if (hash_mode == 15300) { dpapimk_t *dpapimks = (dpapimk_t *) esalts_buf; dpapimk_t *dpapimk = &dpapimks[digest_cur]; u32 version = 1; u32 context = dpapimk->context; u32 rounds = salt.salt_iter + 1; u32 contents_len = dpapimk->contents_len; u32 SID_len = dpapimk->SID_len; u32 iv_len = 32; u8 cipher_algorithm[8] = { 0 }; u8 hash_algorithm[8] = { 0 }; u8 SID[512] = { 0 }; u8* SID_tmp; u32 *ptr_SID = (u32 *) dpapimk->SID; u32 *ptr_iv = (u32 *) dpapimk->iv; u32 *ptr_contents = (u32 *) dpapimk->contents; u32 u32_iv[4]; u8 iv[32 + 1]; /* convert back SID */ SID_tmp = (u8 *) hcmalloc ((SID_len + 1) * sizeof(u8)); for (u32 i = 0; i < (SID_len / 4) + 1; i++) { u8 hex[8] = { 0 }; u32_to_hex_lower (byte_swap_32 (ptr_SID[i]), hex); for (u32 j = 0, k = 0; j < 8; j += 2, k++) { SID_tmp[i * 4 + k] = hex_to_u8 (&hex[j]); } } /* overwrite trailing 0x80 */ SID_tmp[SID_len] = 0; for (u32 i = 0, j = 0 ; j < SID_len ; i++, j += 2) { SID[i] = SID_tmp[j]; } hcfree(SID_tmp); for (u32 i = 0; i < iv_len / 8; i++) { u32_iv[i] = byte_swap_32 (ptr_iv[i]); u32_to_hex_lower (u32_iv[i], iv + i * 8); } iv[32] = 0; u32 u32_contents[36]; u8 contents[288 + 1]; for (u32 i = 0; i < contents_len / 8; i++) { u32_contents[i] = byte_swap_32 (ptr_contents[i]); u32_to_hex_lower (u32_contents[i], contents + i * 8); } contents[208] = 0; if (contents_len == 208) { memcpy(cipher_algorithm, "des3", strlen("des3")); memcpy(hash_algorithm, "sha1", strlen("sha1")); } snprintf (out_buf, out_len - 1, "%s%u*%u*%s*%s*%s*%u*%s*%u*%s", SIGNATURE_DPAPIMK, version, context, SID, cipher_algorithm, hash_algorithm, rounds, iv, contents_len, contents); } else if (hash_mode == 15500) { jks_sha1_t *jks_sha1s = (jks_sha1_t *) esalts_buf; jks_sha1_t *jks_sha1 = &jks_sha1s[digest_cur]; char enc_key[16384 + 1] = { 0 }; u8 *ptr = (u8 *) jks_sha1->enc_key_buf; for (u32 i = 0, j = 0; i < jks_sha1->enc_key_len; i += 1, j += 2) { sprintf (enc_key + j, "%02X", ptr[i]); } u8 *der = (u8 *) jks_sha1->der; snprintf (out_buf, out_len - 1, "%s*%08X%08X%08X%08X%08X*%08X%08X%08X%08X%08X*%s*%02X*%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X*%s", SIGNATURE_JKS_SHA1, byte_swap_32 (jks_sha1->checksum[0]), byte_swap_32 (jks_sha1->checksum[1]), byte_swap_32 (jks_sha1->checksum[2]), byte_swap_32 (jks_sha1->checksum[3]), byte_swap_32 (jks_sha1->checksum[4]), byte_swap_32 (jks_sha1->iv[0]), byte_swap_32 (jks_sha1->iv[1]), byte_swap_32 (jks_sha1->iv[2]), byte_swap_32 (jks_sha1->iv[3]), byte_swap_32 (jks_sha1->iv[4]), enc_key, der[ 0], der[ 6], der[ 7], der[ 8], der[ 9], der[10], der[11], der[12], der[13], der[14], der[15], der[16], der[17], der[18], der[19], (char *) jks_sha1->alias ); } else if (hash_mode == 15600) { ethereum_pbkdf2_t *ethereum_pbkdf2s = (ethereum_pbkdf2_t *) esalts_buf; ethereum_pbkdf2_t *ethereum_pbkdf2 = ðereum_pbkdf2s[digest_cur]; snprintf (out_buf, out_len - 1, "%s*%u*%s*%08x%08x%08x%08x%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x%08x%08x", SIGNATURE_ETHEREUM_PBKDF2, salt.salt_iter + 1, (char *) salt.salt_buf, byte_swap_32 (ethereum_pbkdf2->ciphertext[0]), byte_swap_32 (ethereum_pbkdf2->ciphertext[1]), byte_swap_32 (ethereum_pbkdf2->ciphertext[2]), byte_swap_32 (ethereum_pbkdf2->ciphertext[3]), byte_swap_32 (ethereum_pbkdf2->ciphertext[4]), byte_swap_32 (ethereum_pbkdf2->ciphertext[5]), byte_swap_32 (ethereum_pbkdf2->ciphertext[6]), byte_swap_32 (ethereum_pbkdf2->ciphertext[7]), 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 == 15700) { ethereum_scrypt_t *ethereum_scrypts = (ethereum_scrypt_t *) esalts_buf; ethereum_scrypt_t *ethereum_scrypt = ðereum_scrypts[digest_cur]; snprintf (out_buf, out_len - 1, "%s*%u*%u*%u*%s*%08x%08x%08x%08x%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x%08x%08x", SIGNATURE_ETHEREUM_SCRYPT, salt.scrypt_N, salt.scrypt_r, salt.scrypt_p, (char *) salt.salt_buf, byte_swap_32 (ethereum_scrypt->ciphertext[0]), byte_swap_32 (ethereum_scrypt->ciphertext[1]), byte_swap_32 (ethereum_scrypt->ciphertext[2]), byte_swap_32 (ethereum_scrypt->ciphertext[3]), byte_swap_32 (ethereum_scrypt->ciphertext[4]), byte_swap_32 (ethereum_scrypt->ciphertext[5]), byte_swap_32 (ethereum_scrypt->ciphertext[6]), byte_swap_32 (ethereum_scrypt->ciphertext[7]), 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 == 15900) { dpapimk_t *dpapimks = (dpapimk_t *) esalts_buf; dpapimk_t *dpapimk = &dpapimks[digest_cur]; u32 version = 2; u32 context = dpapimk->context; u32 rounds = salt.salt_iter + 1; u32 contents_len = dpapimk->contents_len; u32 SID_len = dpapimk->SID_len; u32 iv_len = 32; u8 cipher_algorithm[8] = { 0 }; u8 hash_algorithm[8] = { 0 }; u8 SID[512] = { 0 }; u8* SID_tmp; u32 *ptr_SID = (u32 *) dpapimk->SID; u32 *ptr_iv = (u32 *) dpapimk->iv; u32 *ptr_contents = (u32 *) dpapimk->contents; u32 u32_iv[4]; u8 iv[32 + 1]; /* convert back SID */ SID_tmp = (u8 *) hcmalloc ((SID_len + 1) * sizeof(u8)); for (u32 i = 0; i < (SID_len / 4) + 1; i++) { u8 hex[8] = { 0 }; u32_to_hex_lower (byte_swap_32 (ptr_SID[i]), hex); for (u32 j = 0, k = 0; j < 8; j += 2, k++) { SID_tmp[i * 4 + k] = hex_to_u8 (&hex[j]); } } /* overwrite trailing 0x80 */ SID_tmp[SID_len] = 0; for (u32 i = 0, j = 0 ; j < SID_len ; i++, j += 2) { SID[i] = SID_tmp[j]; } hcfree(SID_tmp); for (u32 i = 0; i < iv_len / 8; i++) { u32_iv[i] = byte_swap_32 (ptr_iv[i]); u32_to_hex_lower (u32_iv[i], iv + i * 8); } iv[32] = 0; u32 u32_contents[36]; u8 contents[288 + 1]; for (u32 i = 0; i < contents_len / 8; i++) { u32_contents[i] = byte_swap_32 (ptr_contents[i]); u32_to_hex_lower (u32_contents[i], contents + i * 8); } contents[288] = 0; if (contents_len == 288) { memcpy(cipher_algorithm, "aes256", strlen("aes256")); memcpy(hash_algorithm, "sha512", strlen("sha512")); } snprintf (out_buf, out_len - 1, "%s%d*%d*%s*%s*%s*%d*%s*%d*%s", SIGNATURE_DPAPIMK, version, context, SID, cipher_algorithm, hash_algorithm, rounds, iv, contents_len, contents); } else if (hash_mode == 99999) { char *ptr = (char *) digest_buf; snprintf (out_buf, out_len - 1, "%s", ptr + 64); } else { if (hash_type == HASH_TYPE_MD4) { snprintf (out_buf, out_len - 1, "%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, out_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, out_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_SHA224) { snprintf (out_buf, out_len - 1, "%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]); } else if (hash_type == HASH_TYPE_SHA256) { snprintf (out_buf, out_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) { u32 *ptr = digest_buf; snprintf (out_buf, out_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) { u32 *ptr = digest_buf; snprintf (out_buf, out_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, out_len - 1, "%08x%08x", digest_buf[0], digest_buf[1]); } else if (hash_type == HASH_TYPE_ORACLEH) { snprintf (out_buf, out_len - 1, "%08X%08X", digest_buf[0], digest_buf[1]); } else if (hash_type == HASH_TYPE_BCRYPT) { base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0); base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22); tmp_buf[22 + 31] = 0; // base64_encode wants to pad snprintf (out_buf, out_len - 1, "%s$%s", (char *) salt.salt_sign, tmp_buf); } else if (hash_type == HASH_TYPE_KECCAK) { u32 *ptr = digest_buf; snprintf (out_buf, out_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_BLAKE2B) { u32 *ptr = digest_buf; snprintf (out_buf, out_len - 1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x", SIGNATURE_BLAKE2B, byte_swap_32(ptr[ 0]), byte_swap_32(ptr[ 1]), byte_swap_32(ptr[ 2]), byte_swap_32(ptr[ 3]), byte_swap_32(ptr[ 4]), byte_swap_32(ptr[ 5]), byte_swap_32(ptr[ 6]), byte_swap_32(ptr[ 7]), byte_swap_32(ptr[ 8]), byte_swap_32(ptr[ 9]), byte_swap_32(ptr[10]), byte_swap_32(ptr[11]), byte_swap_32(ptr[12]), byte_swap_32(ptr[13]), byte_swap_32(ptr[14]), byte_swap_32(ptr[15])); } else if (hash_type == HASH_TYPE_CHACHA20) { u32 *ptr = digest_buf; const chacha20_t *chacha20_tmp = (const chacha20_t *) esalts_buf; const chacha20_t *chacha20 = &chacha20_tmp[digest_cur]; snprintf (out_buf, out_len - 1, "%s*%08x%08x*%u*%08x%08x*%08x%08x*%08x%08x", SIGNATURE_CHACHA20, byte_swap_32(chacha20->position[0]), byte_swap_32(chacha20->position[1]), chacha20->offset, byte_swap_32(chacha20->iv[1]), byte_swap_32(chacha20->iv[0]), byte_swap_32(chacha20->plain[0]), byte_swap_32(chacha20->plain[1]), ptr[1], ptr[0]); } else if (hash_type == HASH_TYPE_RIPEMD160) { snprintf (out_buf, out_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_WHIRLPOOL) { snprintf (out_buf, out_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, out_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, out_len - 1, "%08x%08x", digest_buf[0], digest_buf[1]); } else if (hash_type == HASH_TYPE_LOTUS5) { snprintf (out_buf, out_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] = { 0 }; memcpy (buf + 0, salt.salt_buf, 5); memcpy (buf + 5, digest_buf, 9); buf[3] -= -4; base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf); tmp_buf[18] = salt.salt_buf_pc[7]; tmp_buf[19] = 0; snprintf (out_buf, out_len - 1, "(G%s)", tmp_buf); } else if (hash_type == HASH_TYPE_LOTUS8) { char buf[52] = { 0 }; // salt memcpy (buf + 0, salt.salt_buf, 16); buf[3] -= -4; // iteration snprintf (buf + 16, 11, "%010u", 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, (const u8 *) buf, 36, (u8 *) tmp_buf); tmp_buf[49] = 0; snprintf (out_buf, out_len - 1, "(H%s)", tmp_buf); } } if (salt_type == SALT_TYPE_GENERIC) { size_t pos = strlen (out_buf); out_buf[pos] = hashconfig->separator; char *ptr = (char *) salt.salt_buf; memcpy (out_buf + pos + 1, ptr, salt.salt_len); out_buf[pos + 1 + salt.salt_len] = 0; } return 0; } int hashconfig_init (hashcat_ctx_t *hashcat_ctx) { folder_config_t *folder_config = hashcat_ctx->folder_config; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; user_options_t *user_options = hashcat_ctx->user_options; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; hashconfig->hash_mode = user_options->hash_mode; hashconfig->hash_type = 0; hashconfig->salt_type = 0; hashconfig->attack_exec = 0; hashconfig->opts_type = 0; hashconfig->kern_type = 0; hashconfig->dgst_size = 0; hashconfig->esalt_size = 0; hashconfig->hook_salt_size = 0; hashconfig->tmp_size = 0; hashconfig->hook_size = 0; hashconfig->opti_type = 0; hashconfig->is_salted = false; hashconfig->has_pure_kernel = false; hashconfig->has_optimized_kernel = false; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 0; hashconfig->dgst_pos2 = 0; hashconfig->dgst_pos3 = 0; hashconfig->parse_func = NULL; hashconfig->separator = user_options->separator; hashconfig->st_hash = NULL; hashconfig->st_pass = NULL; switch (hashconfig->hash_mode) { case 0: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD5; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5_parse_hash; hashconfig->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_NOT_SALTED | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00000; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 10: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD5_PWSLT; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5s_parse_hash; hashconfig->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_APPENDED_SALT | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00010; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 11: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD5_PWSLT; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = joomla_parse_hash; hashconfig->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_APPENDED_SALT | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00011; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 12: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD5_PWSLT; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = postgresql_parse_hash; hashconfig->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_APPENDED_SALT | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00012; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 20: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD5_SLTPW; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5s_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00020; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 21: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD5_SLTPW; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = osc_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00021; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 22: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD5_SLTPW; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = netscreen_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00022; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 23: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD5_SLTPW; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = skype_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00023; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 30: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD5_PWUSLT; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5s_parse_hash; hashconfig->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_APPENDED_SALT | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00030; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 40: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14 | OPTS_TYPE_PT_UTF16LE; hashconfig->kern_type = KERN_TYPE_MD5_SLTPWU; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5s_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00040; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 50: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS14; hashconfig->kern_type = KERN_TYPE_HMACMD5_PW; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = hmacmd5_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00050; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 60: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14; hashconfig->kern_type = KERN_TYPE_HMACMD5_SLT; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = hmacmd5_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00060; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 100: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA1; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = sha1_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00100; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 101: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA1; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = sha1b64_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00101; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 110: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA1_PWSLT; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = sha1s_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_APPENDED_SALT | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00110; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 111: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA1_PWSLT; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = sha1b64s_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_APPENDED_SALT | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00111; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 112: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15 | OPTS_TYPE_ST_HEX; hashconfig->kern_type = KERN_TYPE_SHA1_PWSLT; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = oracles_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_APPENDED_SALT | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00112; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 120: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA1_SLTPW; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = sha1s_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00120; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 121: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15 | OPTS_TYPE_ST_LOWER; hashconfig->kern_type = KERN_TYPE_SHA1_SLTPW; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = smf_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00121; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 122: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15 | OPTS_TYPE_ST_HEX; hashconfig->kern_type = KERN_TYPE_SHA1_SLTPW; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = macos1_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00122; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 124: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA1_SLTPW; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = djangosha1_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00124; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 125: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15 | OPTS_TYPE_ST_HEX; hashconfig->kern_type = KERN_TYPE_SHA1_SLTPW; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = arubaos_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00125; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 130: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA1_PWUSLT; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = sha1s_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_APPENDED_SALT | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00130; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 131: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_PT_UPPER | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15 | OPTS_TYPE_ST_HEX; hashconfig->kern_type = KERN_TYPE_SHA1_PWUSLT; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = mssql2000_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_APPENDED_SALT | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00131; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 132: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15 | OPTS_TYPE_ST_HEX; hashconfig->kern_type = KERN_TYPE_SHA1_PWUSLT; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = mssql2005_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_APPENDED_SALT | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00132; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 133: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA1_PWUSLT; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = peoplesoft_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_APPENDED_SALT | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00133; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 140: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15 | OPTS_TYPE_PT_UTF16LE; hashconfig->kern_type = KERN_TYPE_SHA1_SLTPWU; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = sha1s_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00140; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 141: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15 | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_ST_BASE64; hashconfig->kern_type = KERN_TYPE_SHA1_SLTPWU; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = episerver_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00141; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 150: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15; hashconfig->kern_type = KERN_TYPE_HMACSHA1_PW; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = hmacsha1_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00150; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 160: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_HMACSHA1_SLT; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = hmacsha1_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00160; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 200: hashconfig->hash_type = HASH_TYPE_MYSQL; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = 0; hashconfig->kern_type = KERN_TYPE_MYSQL; hashconfig->dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 hashconfig->parse_func = mysql323_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_00200; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 300: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_MYSQL41; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = sha1_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00300; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 400: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_PHPASS; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = phpass_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_00400; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 500: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_MD5CRYPT; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5crypt_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_00500; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 501: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_HASH_COPY; hashconfig->kern_type = KERN_TYPE_MD5CRYPT; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = juniper_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_00501; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 600: hashconfig->hash_type = HASH_TYPE_BLAKE2B; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_BLAKE2B; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = blake2b_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64 | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 1; hashconfig->dgst_pos1 = 0; hashconfig->dgst_pos2 = 3; hashconfig->dgst_pos3 = 2; hashconfig->st_hash = ST_HASH_00600; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 900: hashconfig->hash_type = HASH_TYPE_MD4; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD4; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md4_parse_hash; hashconfig->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_NOT_SALTED | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_00900; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1000: hashconfig->hash_type = HASH_TYPE_MD4; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14 | OPTS_TYPE_PT_UTF16LE; hashconfig->kern_type = KERN_TYPE_MD4_PWU; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md4_parse_hash; hashconfig->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_NOT_SALTED | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_01000; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1100: hashconfig->hash_type = HASH_TYPE_MD4; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14 | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_UTF16LE | OPTS_TYPE_ST_LOWER; hashconfig->kern_type = KERN_TYPE_MD44_PWUSLT; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = dcc_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_01100; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1300: hashconfig->hash_type = HASH_TYPE_SHA224; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA224; hashconfig->dgst_size = DGST_SIZE_4_7; hashconfig->parse_func = sha224_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 5; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 6; hashconfig->st_hash = ST_HASH_01300; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1400: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA256; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = sha256_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 7; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 6; hashconfig->st_hash = ST_HASH_01400; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1410: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA256_PWSLT; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = sha256s_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_APPENDED_SALT | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 7; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 6; hashconfig->st_hash = ST_HASH_01410; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1411: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA256_PWSLT; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = sha256b64s_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_APPENDED_SALT | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 7; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 6; hashconfig->st_hash = ST_HASH_01411; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1420: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA256_SLTPW; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = sha256s_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 7; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 6; hashconfig->st_hash = ST_HASH_01420; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1421: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA256_SLTPW; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = hmailserver_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 7; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 6; hashconfig->st_hash = ST_HASH_01421; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1430: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA256_PWUSLT; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = sha256s_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_APPENDED_SALT | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 7; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 6; hashconfig->st_hash = ST_HASH_01430; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1440: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15 | OPTS_TYPE_PT_UTF16LE; hashconfig->kern_type = KERN_TYPE_SHA256_SLTPWU; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = sha256s_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 7; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 6; hashconfig->st_hash = ST_HASH_01440; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1441: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15 | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_ST_BASE64; hashconfig->kern_type = KERN_TYPE_SHA256_SLTPWU; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = episerver4_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 7; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 6; hashconfig->st_hash = ST_HASH_01441; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1450: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_ST_ADD80; hashconfig->kern_type = KERN_TYPE_HMACSHA256_PW; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = hmacsha256_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 7; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 6; hashconfig->st_hash = ST_HASH_01450; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1460: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_HMACSHA256_SLT; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = hmacsha256_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 7; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 6; hashconfig->st_hash = ST_HASH_01460; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1500: hashconfig->hash_type = HASH_TYPE_DESCRYPT; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_BITSLICE; hashconfig->kern_type = KERN_TYPE_DESCRYPT; hashconfig->dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 hashconfig->parse_func = descrypt_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_PERMUT; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = NULL; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1600: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_APR1CRYPT; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5apr1_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_01600; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1700: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA512; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = sha512_parse_hash; hashconfig->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_USES_BITS_64 | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 14; hashconfig->dgst_pos1 = 15; hashconfig->dgst_pos2 = 6; hashconfig->dgst_pos3 = 7; hashconfig->st_hash = ST_HASH_01700; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1710: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA512_PWSLT; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = sha512s_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_APPENDED_SALT | OPTI_TYPE_USES_BITS_64 | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 14; hashconfig->dgst_pos1 = 15; hashconfig->dgst_pos2 = 6; hashconfig->dgst_pos3 = 7; hashconfig->st_hash = ST_HASH_01710; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1711: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA512_PWSLT; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = sha512b64s_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_APPENDED_SALT | OPTI_TYPE_USES_BITS_64 | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 14; hashconfig->dgst_pos1 = 15; hashconfig->dgst_pos2 = 6; hashconfig->dgst_pos3 = 7; hashconfig->st_hash = ST_HASH_01711; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1720: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA512_SLTPW; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = sha512s_parse_hash; hashconfig->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_USES_BITS_64 | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 14; hashconfig->dgst_pos1 = 15; hashconfig->dgst_pos2 = 6; hashconfig->dgst_pos3 = 7; hashconfig->st_hash = ST_HASH_01720; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1722: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15 | OPTS_TYPE_ST_HEX; hashconfig->kern_type = KERN_TYPE_SHA512_SLTPW; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = macos512_parse_hash; hashconfig->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_USES_BITS_64 | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 14; hashconfig->dgst_pos1 = 15; hashconfig->dgst_pos2 = 6; hashconfig->dgst_pos3 = 7; hashconfig->st_hash = ST_HASH_01722; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1730: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA512_PWSLTU; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = sha512s_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_APPENDED_SALT | OPTI_TYPE_USES_BITS_64 | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 14; hashconfig->dgst_pos1 = 15; hashconfig->dgst_pos2 = 6; hashconfig->dgst_pos3 = 7; hashconfig->st_hash = ST_HASH_01730; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1731: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15 | OPTS_TYPE_ST_HEX; hashconfig->kern_type = KERN_TYPE_SHA512_PWSLTU; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = mssql2012_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_APPENDED_SALT | OPTI_TYPE_USES_BITS_64 | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 14; hashconfig->dgst_pos1 = 15; hashconfig->dgst_pos2 = 6; hashconfig->dgst_pos3 = 7; hashconfig->st_hash = ST_HASH_01731; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1740: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15 | OPTS_TYPE_PT_UTF16LE; hashconfig->kern_type = KERN_TYPE_SHA512_SLTPWU; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = sha512s_parse_hash; hashconfig->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_USES_BITS_64 | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 14; hashconfig->dgst_pos1 = 15; hashconfig->dgst_pos2 = 6; hashconfig->dgst_pos3 = 7; hashconfig->st_hash = ST_HASH_01740; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1750: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_ST_ADD80; hashconfig->kern_type = KERN_TYPE_HMACSHA512_PW; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = hmacsha512_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64 | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 14; hashconfig->dgst_pos1 = 15; hashconfig->dgst_pos2 = 6; hashconfig->dgst_pos3 = 7; hashconfig->st_hash = ST_HASH_01750; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1760: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_HMACSHA512_SLT; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = hmacsha512_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64 | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 14; hashconfig->dgst_pos1 = 15; hashconfig->dgst_pos2 = 6; hashconfig->dgst_pos3 = 7; hashconfig->st_hash = ST_HASH_01760; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 1800: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_SHA512CRYPT; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = sha512crypt_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_01800; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 2000: hashconfig->hash_type = HASH_TYPE_STDOUT; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_STDOUT; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = NULL; hashconfig->opti_type = 0; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 0; hashconfig->dgst_pos2 = 0; hashconfig->dgst_pos3 = 0; hashconfig->st_hash = NULL; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 2100: hashconfig->hash_type = HASH_TYPE_DCC2; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_LOWER; hashconfig->kern_type = KERN_TYPE_DCC2; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = dcc2_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_02100; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 2400: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_MD5PIX; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5pix_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_02400; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 2410: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_MD5ASA; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5asa_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_02410; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 2500: hashconfig->hash_type = HASH_TYPE_WPA; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_WPA; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = wpa_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_02500; hashconfig->st_pass = ST_PASS_HASHCAT_EXCL; break; case 2501: hashconfig->hash_type = HASH_TYPE_WPA; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_WPAPMK; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = wpa_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_02501; hashconfig->st_pass = ST_PASS_HEX_02501; break; case 2600: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_VIRTUAL; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14 | OPTS_TYPE_ST_ADD80; hashconfig->kern_type = KERN_TYPE_MD55_PWSLT1; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5md5_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_02600; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 2611: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14 | OPTS_TYPE_ST_ADD80; hashconfig->kern_type = KERN_TYPE_MD55_PWSLT1; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = vb3_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_02611; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 2612: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14 | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_HEX; hashconfig->kern_type = KERN_TYPE_MD55_PWSLT1; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = phps_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_02612; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 2711: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14 | OPTS_TYPE_ST_ADD80; hashconfig->kern_type = KERN_TYPE_MD55_PWSLT2; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = vb30_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_EARLY_SKIP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_02711; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 2811: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_HASH_MD5 | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD55_SLTPW; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = ipb2_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_EARLY_SKIP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_02811; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 3000: hashconfig->hash_type = HASH_TYPE_LM; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_UPPER | OPTS_TYPE_PT_BITSLICE | OPTS_TYPE_PT_ALWAYS_ASCII | OPTS_TYPE_HASH_SPLIT; hashconfig->kern_type = KERN_TYPE_LM; hashconfig->dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 hashconfig->parse_func = lm_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_PERMUT; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_03000; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 3100: hashconfig->hash_type = HASH_TYPE_ORACLEH; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_UPPER | OPTS_TYPE_ST_UPPER; hashconfig->kern_type = KERN_TYPE_ORACLEH; hashconfig->dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 hashconfig->parse_func = oracleh_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_03100; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 3200: hashconfig->hash_type = HASH_TYPE_BCRYPT; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_BCRYPT; hashconfig->dgst_size = DGST_SIZE_4_6; hashconfig->parse_func = bcrypt_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_03200; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 3710: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD5_SLT_MD5_PW; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5s_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_03710; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 3711: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD5_SLT_MD5_PW; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = mediawiki_b_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_03711; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 3800: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD5_SLT_PW_SLT; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5s_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_03800; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 3910: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14 | OPTS_TYPE_ST_HASH_MD5 | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD55_PWSLT; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5s_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_EARLY_SKIP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_03910; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 4010: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD5_SLT_MD5_SLT_PW; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5s_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_04010; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 4110: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_MD5_SLT_MD5_PW_SLT; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5s_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_04110; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 4300: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_VIRTUAL; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14 | OPTS_TYPE_ST_ADD80; hashconfig->kern_type = KERN_TYPE_MD5U5_PWSLT1; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5md5_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_04300; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 4400: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_MD5_SHA1; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_04400; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 4500: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA11; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = sha1_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_SALTED; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_04500; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 4520: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA1_SLT_SHA1_PW; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = sha1sha1_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_PREPENDED_SALT; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_04520; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 4521: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA1_SLT_SHA1_PW; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = redmine_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_PREPENDED_SALT; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_04521; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 4522: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA1_SLT_SHA1_PW; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = punbb_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_PREPENDED_SALT; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_04522; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 4700: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14; hashconfig->kern_type = KERN_TYPE_SHA1_MD5; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = sha1_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_04700; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 4800: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD5_CHAP; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = chap_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_04800; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 4900: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_SHA1_SLT_PW_SLT; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = sha1s_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_04900; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 5000: hashconfig->hash_type = HASH_TYPE_KECCAK; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD01; hashconfig->kern_type = KERN_TYPE_KECCAK; hashconfig->dgst_size = DGST_SIZE_8_25; hashconfig->parse_func = keccak_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64 | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 6; hashconfig->dgst_pos1 = 7; hashconfig->dgst_pos2 = 4; hashconfig->dgst_pos3 = 5; hashconfig->st_hash = ST_HASH_05000; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 5100: hashconfig->hash_type = HASH_TYPE_MD5H; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD5H; hashconfig->dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 hashconfig->parse_func = md5half_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_05100; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 5200: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_PSAFE3; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = psafe3_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_05200; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 5300: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_ADD80; hashconfig->kern_type = KERN_TYPE_IKEPSK_MD5; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = ikepsk_md5_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_05300; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 5400: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_ST_ADD80; hashconfig->kern_type = KERN_TYPE_IKEPSK_SHA1; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = ikepsk_sha1_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_05400; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 5500: hashconfig->hash_type = HASH_TYPE_NETNTLM; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14 | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_ST_HEX; hashconfig->kern_type = KERN_TYPE_NETNTLMv1; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = netntlmv1_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_PERMUT; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_05500; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 5600: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14 | OPTS_TYPE_PT_UTF16LE; hashconfig->kern_type = KERN_TYPE_NETNTLMv2; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = netntlmv2_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_05600; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 5700: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA256; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = cisco4_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 7; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 6; hashconfig->st_hash = ST_HASH_05700; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 5800: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_ADD80; hashconfig->kern_type = KERN_TYPE_ANDROIDPIN; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = androidpin_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_05800; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6000: hashconfig->hash_type = HASH_TYPE_RIPEMD160; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80; hashconfig->kern_type = KERN_TYPE_RIPEMD160; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = ripemd160_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06000; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6100: hashconfig->hash_type = HASH_TYPE_WHIRLPOOL; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80; hashconfig->kern_type = KERN_TYPE_WHIRLPOOL; hashconfig->dgst_size = DGST_SIZE_4_16; hashconfig->parse_func = whirlpool_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06100; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6211: hashconfig->hash_type = HASH_TYPE_RIPEMD160; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCRIPEMD160_XTS512; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = truecrypt_parse_hash_2k; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06211; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6212: hashconfig->hash_type = HASH_TYPE_RIPEMD160; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCRIPEMD160_XTS1024; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = truecrypt_parse_hash_2k; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06212; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6213: hashconfig->hash_type = HASH_TYPE_RIPEMD160; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCRIPEMD160_XTS1536; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = truecrypt_parse_hash_2k; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06213; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6221: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCSHA512_XTS512; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = truecrypt_parse_hash_1k; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP | OPTI_TYPE_USES_BITS_64; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06221; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6222: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCSHA512_XTS1024; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = truecrypt_parse_hash_1k; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP | OPTI_TYPE_USES_BITS_64; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06222; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6223: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCSHA512_XTS1536; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = truecrypt_parse_hash_1k; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP | OPTI_TYPE_USES_BITS_64; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06223; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6231: hashconfig->hash_type = HASH_TYPE_WHIRLPOOL; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCWHIRLPOOL_XTS512; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = truecrypt_parse_hash_1k; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06231; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6232: hashconfig->hash_type = HASH_TYPE_WHIRLPOOL; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCWHIRLPOOL_XTS1024; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = truecrypt_parse_hash_1k; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06232; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6233: hashconfig->hash_type = HASH_TYPE_WHIRLPOOL; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCWHIRLPOOL_XTS1536; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = truecrypt_parse_hash_1k; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06233; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6241: hashconfig->hash_type = HASH_TYPE_RIPEMD160; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCRIPEMD160_XTS512; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = truecrypt_parse_hash_1k; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06241; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6242: hashconfig->hash_type = HASH_TYPE_RIPEMD160; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCRIPEMD160_XTS1024; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = truecrypt_parse_hash_1k; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06242; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6243: hashconfig->hash_type = HASH_TYPE_RIPEMD160; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCRIPEMD160_XTS1536; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = truecrypt_parse_hash_1k; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06243; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6300: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_MD5AIX; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = md5aix_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06300; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6400: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_SHA256AIX; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = sha256aix_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06400; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6500: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_SHA512AIX; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = sha512aix_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP | OPTI_TYPE_USES_BITS_64; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06500; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6600: hashconfig->hash_type = HASH_TYPE_AES; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_AGILEKEY; hashconfig->dgst_size = DGST_SIZE_4_5; // because kernel uses _SHA1_ hashconfig->parse_func = agilekey_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06600; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6700: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_SHA1AIX; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = sha1aix_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06700; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6800: hashconfig->hash_type = HASH_TYPE_AES; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_LASTPASS; hashconfig->dgst_size = DGST_SIZE_4_8; // because kernel uses _SHA256_ hashconfig->parse_func = lastpass_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06800; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 6900: hashconfig->hash_type = HASH_TYPE_GOST; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_GOST; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = gost_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_06900; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 7000: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_FORTIGATE; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = fortigate_parse_hash; hashconfig->opti_type = OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_07000; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 7100: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_PBKDF2_SHA512; hashconfig->dgst_size = DGST_SIZE_8_16; hashconfig->parse_func = sha512macos_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64 | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_07100; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 7200: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_PBKDF2_SHA512; hashconfig->dgst_size = DGST_SIZE_8_16; hashconfig->parse_func = sha512grub_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64 | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_07200; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 7300: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15; hashconfig->kern_type = KERN_TYPE_RAKP; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = rakp_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_07300; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 7400: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_SHA256CRYPT; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = sha256crypt_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_07400; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 7500: hashconfig->hash_type = HASH_TYPE_KRB5PA; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_KRB5PA; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = krb5pa_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_07500; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 7700: hashconfig->hash_type = HASH_TYPE_SAPB; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_UPPER | OPTS_TYPE_ST_UPPER; hashconfig->kern_type = KERN_TYPE_SAPB; hashconfig->dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 hashconfig->parse_func = sapb_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_07700; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 7800: hashconfig->hash_type = HASH_TYPE_SAPG; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_UPPER; hashconfig->kern_type = KERN_TYPE_SAPG; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = sapg_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_07800; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 7900: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_DRUPAL7; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = drupal7_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_07900; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 8000: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_HEX; hashconfig->kern_type = KERN_TYPE_SYBASEASE; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = sybasease_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 7; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 6; hashconfig->st_hash = ST_HASH_08000; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 8100: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE; hashconfig->kern_type = KERN_TYPE_NETSCALER; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = netscaler_parse_hash; hashconfig->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; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_08100; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 8200: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_CLOUDKEY; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = cloudkey_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_08200; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 8300: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_ST_HEX | OPTS_TYPE_ST_ADD80; hashconfig->kern_type = KERN_TYPE_NSEC3; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = nsec3_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_08300; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 8400: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_WBB3; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = wbb3_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_08400; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 8500: hashconfig->hash_type = HASH_TYPE_DESRACF; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_UPPER; hashconfig->kern_type = KERN_TYPE_RACF; hashconfig->dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 hashconfig->parse_func = racf_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_PERMUT; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_08500; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 8600: hashconfig->hash_type = HASH_TYPE_LOTUS5; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_LOTUS5; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = lotus5_parse_hash; hashconfig->opti_type = OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_NOT_SALTED | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_08600; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 8700: hashconfig->hash_type = HASH_TYPE_LOTUS6; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_LOTUS6; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = lotus6_parse_hash; hashconfig->opti_type = OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_08700; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 8800: hashconfig->hash_type = HASH_TYPE_ANDROIDFDE; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_ANDROIDFDE; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = androidfde_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_08800; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 8900: hashconfig->hash_type = HASH_TYPE_SCRYPT; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_SCRYPT; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = scrypt_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_08900; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 9000: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_PSAFE2; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = psafe2_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_09000; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 9100: hashconfig->hash_type = HASH_TYPE_LOTUS8; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_LOTUS8; hashconfig->dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 hashconfig->parse_func = lotus8_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_09100; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 9200: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_PBKDF2_SHA256; hashconfig->dgst_size = DGST_SIZE_4_32; hashconfig->parse_func = cisco8_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_09200; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 9300: hashconfig->hash_type = HASH_TYPE_SCRYPT; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_SCRYPT; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = cisco9_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_09300; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 9400: hashconfig->hash_type = HASH_TYPE_OFFICE2007; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_OFFICE2007; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = office2007_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_09400; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 9500: hashconfig->hash_type = HASH_TYPE_OFFICE2010; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_OFFICE2010; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = office2010_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_09500; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 9600: hashconfig->hash_type = HASH_TYPE_OFFICE2013; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_OFFICE2013; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = office2013_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_09600; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 9700: hashconfig->hash_type = HASH_TYPE_OLDOFFICE01; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_UTF16LE; hashconfig->kern_type = KERN_TYPE_OLDOFFICE01; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = oldoffice01_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_09700; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 9710: hashconfig->hash_type = HASH_TYPE_OLDOFFICE01; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80; hashconfig->kern_type = KERN_TYPE_OLDOFFICE01CM1; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = oldoffice01cm1_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_09710; hashconfig->st_pass = ST_PASS_BIN_09710; break; case 9720: hashconfig->hash_type = HASH_TYPE_OLDOFFICE01; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_PT_NEVERCRACK; hashconfig->kern_type = KERN_TYPE_OLDOFFICE01CM2; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = oldoffice01cm2_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_09720; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 9800: hashconfig->hash_type = HASH_TYPE_OLDOFFICE34; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_UTF16LE; hashconfig->kern_type = KERN_TYPE_OLDOFFICE34; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = oldoffice34_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_09800; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 9810: hashconfig->hash_type = HASH_TYPE_OLDOFFICE34; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_OLDOFFICE34CM1; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = oldoffice34cm1_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_09810; hashconfig->st_pass = ST_PASS_BIN_09810; break; case 9820: hashconfig->hash_type = HASH_TYPE_OLDOFFICE34; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_PT_NEVERCRACK; hashconfig->kern_type = KERN_TYPE_OLDOFFICE34CM2; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = oldoffice34cm2_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_09820; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 9900: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_RADMIN2; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = radmin2_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_NOT_SALTED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_09900; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 10000: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_PBKDF2_SHA256; hashconfig->dgst_size = DGST_SIZE_4_32; hashconfig->parse_func = djangopbkdf2_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_10000; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 10100: hashconfig->hash_type = HASH_TYPE_SIPHASH; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_SIPHASH; hashconfig->dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 hashconfig->parse_func = siphash_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_10100; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 10200: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS14; hashconfig->kern_type = KERN_TYPE_HMACMD5_PW; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = crammd5_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_10200; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 10300: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_SAPH_SHA1; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = saph_sha1_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_10300; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 10400: hashconfig->hash_type = HASH_TYPE_PDFU16; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_PDF11; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = pdf11_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_10400; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 10410: hashconfig->hash_type = HASH_TYPE_PDFU16; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_PDF11CM1; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = pdf11cm1_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_10410; hashconfig->st_pass = ST_PASS_BIN_10410; break; case 10420: hashconfig->hash_type = HASH_TYPE_PDFU16; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_PDF11CM2; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = pdf11cm2_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_10420; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 10500: hashconfig->hash_type = HASH_TYPE_PDFU16; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_PDF14; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = pdf14_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_10500; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 10600: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15 | OPTS_TYPE_HASH_COPY; hashconfig->kern_type = KERN_TYPE_SHA256_PWSLT; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = pdf17l3_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_APPENDED_SALT | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 7; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 6; hashconfig->st_hash = ST_HASH_10600; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 10700: hashconfig->hash_type = HASH_TYPE_PDFU32; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_HASH_COPY; hashconfig->kern_type = KERN_TYPE_PDF17L8; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = pdf17l8_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_10700; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 10800: hashconfig->hash_type = HASH_TYPE_SHA384; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA384; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = sha384_parse_hash; hashconfig->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_USES_BITS_64 | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 6; hashconfig->dgst_pos1 = 7; hashconfig->dgst_pos2 = 4; hashconfig->dgst_pos3 = 5; hashconfig->st_hash = ST_HASH_10800; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 10900: hashconfig->hash_type = HASH_TYPE_PBKDF2_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_BASE64 | OPTS_TYPE_HASH_COPY; hashconfig->kern_type = KERN_TYPE_PBKDF2_SHA256; hashconfig->dgst_size = DGST_SIZE_4_32; hashconfig->parse_func = pbkdf2_sha256_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_10900; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 11000: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80; hashconfig->kern_type = KERN_TYPE_PRESTASHOP; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = prestashop_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_PREPENDED_SALT; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_11000; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 11100: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_ADD80; hashconfig->kern_type = KERN_TYPE_POSTGRESQL_AUTH; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = postgresql_auth_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_11100; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 11200: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_ST_HEX; hashconfig->kern_type = KERN_TYPE_MYSQL_AUTH; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = mysql_auth_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_EARLY_SKIP; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_11200; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 11300: hashconfig->hash_type = HASH_TYPE_BITCOIN_WALLET; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_HEX | OPTS_TYPE_ST_ADD80; hashconfig->kern_type = KERN_TYPE_BITCOIN_WALLET; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = bitcoin_wallet_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_11300; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 11400: hashconfig->hash_type = HASH_TYPE_MD5; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_HASH_COPY; hashconfig->kern_type = KERN_TYPE_SIP_AUTH; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = sip_auth_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_11400; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 11500: hashconfig->hash_type = HASH_TYPE_CRC32; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_GENERATE_LE | OPTS_TYPE_ST_HEX; hashconfig->kern_type = KERN_TYPE_CRC32; hashconfig->dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 hashconfig->parse_func = crc32_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_11500; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 11600: hashconfig->hash_type = HASH_TYPE_AES; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_HOOK23; hashconfig->kern_type = KERN_TYPE_SEVEN_ZIP; hashconfig->dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 hashconfig->parse_func = seven_zip_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_11600; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 11700: hashconfig->hash_type = HASH_TYPE_GOST_2012SBOG_256; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD01; hashconfig->kern_type = KERN_TYPE_GOST_2012SBOG_256; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = gost2012sbog_256_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_11700; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 11800: hashconfig->hash_type = HASH_TYPE_GOST_2012SBOG_512; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD01; hashconfig->kern_type = KERN_TYPE_GOST_2012SBOG_512; hashconfig->dgst_size = DGST_SIZE_4_16; hashconfig->parse_func = gost2012sbog_512_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_11800; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 11900: hashconfig->hash_type = HASH_TYPE_PBKDF2_MD5; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_BASE64 | OPTS_TYPE_HASH_COPY; hashconfig->kern_type = KERN_TYPE_PBKDF2_MD5; hashconfig->dgst_size = DGST_SIZE_4_32; hashconfig->parse_func = pbkdf2_md5_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_11900; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 12000: hashconfig->hash_type = HASH_TYPE_PBKDF2_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_BASE64 | OPTS_TYPE_HASH_COPY; hashconfig->kern_type = KERN_TYPE_PBKDF2_SHA1; hashconfig->dgst_size = DGST_SIZE_4_32; hashconfig->parse_func = pbkdf2_sha1_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_12000; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 12001: hashconfig->hash_type = HASH_TYPE_PBKDF2_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_HASH_COPY; hashconfig->kern_type = KERN_TYPE_PBKDF2_SHA1; hashconfig->dgst_size = DGST_SIZE_4_32; hashconfig->parse_func = atlassian_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_12001; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 12100: hashconfig->hash_type = HASH_TYPE_PBKDF2_SHA512; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_BASE64 | OPTS_TYPE_HASH_COPY; hashconfig->kern_type = KERN_TYPE_PBKDF2_SHA512; hashconfig->dgst_size = DGST_SIZE_8_16; hashconfig->parse_func = pbkdf2_sha512_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64 | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_12100; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 12200: hashconfig->hash_type = HASH_TYPE_ECRYPTFS; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_ECRYPTFS; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = ecryptfs_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64 | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_12200; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 12300: hashconfig->hash_type = HASH_TYPE_ORACLET; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_ORACLET; hashconfig->dgst_size = DGST_SIZE_8_16; hashconfig->parse_func = oraclet_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64 | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_12300; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 12400: hashconfig->hash_type = HASH_TYPE_BSDICRYPT; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_BSDICRYPT; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = bsdicrypt_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_PERMUT; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_12400; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 12500: hashconfig->hash_type = HASH_TYPE_RAR3HP; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_RAR3; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = rar3hp_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_12500; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 12600: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80; hashconfig->kern_type = KERN_TYPE_CF10; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = cf10_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 7; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 6; hashconfig->st_hash = ST_HASH_12600; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 12700: hashconfig->hash_type = HASH_TYPE_AES; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_HASH_COPY; hashconfig->kern_type = KERN_TYPE_MYWALLET; hashconfig->dgst_size = DGST_SIZE_4_5; // because kernel uses _SHA1_ hashconfig->parse_func = mywallet_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_12700; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 12800: hashconfig->hash_type = HASH_TYPE_PBKDF2_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_MS_DRSR; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = ms_drsr_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_12800; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 12900: hashconfig->hash_type = HASH_TYPE_PBKDF2_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_ANDROIDFDE_SAMSUNG; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = androidfde_samsung_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_12900; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13000: hashconfig->hash_type = HASH_TYPE_PBKDF2_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_RAR5; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = rar5_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_13000; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13100: hashconfig->hash_type = HASH_TYPE_KRB5TGS; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_KRB5TGS; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = krb5tgs_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_13100; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13200: hashconfig->hash_type = HASH_TYPE_AES; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_AXCRYPT; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = axcrypt_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_13200; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13300: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_SHA1_AXCRYPT; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = sha1axcrypt_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_NOT_SALTED; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 3; hashconfig->dgst_pos3 = 2; hashconfig->st_hash = ST_HASH_13300; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13400: hashconfig->hash_type = HASH_TYPE_AES; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_KEEPASS; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = keepass_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_13400; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13500: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_PT_ADD80; hashconfig->kern_type = KERN_TYPE_PSTOKEN; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = pstoken_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_PREPENDED_SALT | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_13500; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13600: hashconfig->hash_type = HASH_TYPE_PBKDF2_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_ZIP2; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = zip2_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_13600; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13711: hashconfig->hash_type = HASH_TYPE_RIPEMD160; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCRIPEMD160_XTS512; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = veracrypt_parse_hash_655331; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_13711; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13712: hashconfig->hash_type = HASH_TYPE_RIPEMD160; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCRIPEMD160_XTS1024; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = veracrypt_parse_hash_655331; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_13712; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13713: hashconfig->hash_type = HASH_TYPE_RIPEMD160; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCRIPEMD160_XTS1536; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = veracrypt_parse_hash_655331; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_13713; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13721: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCSHA512_XTS512; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = veracrypt_parse_hash_500000; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP | OPTI_TYPE_USES_BITS_64; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_13721; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13722: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCSHA512_XTS1024; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = veracrypt_parse_hash_500000; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP | OPTI_TYPE_USES_BITS_64; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_13722; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13723: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCSHA512_XTS1536; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = veracrypt_parse_hash_500000; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP | OPTI_TYPE_USES_BITS_64; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_13723; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13731: hashconfig->hash_type = HASH_TYPE_WHIRLPOOL; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCWHIRLPOOL_XTS512; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = veracrypt_parse_hash_500000; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_13731; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13732: hashconfig->hash_type = HASH_TYPE_WHIRLPOOL; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCWHIRLPOOL_XTS1024; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = veracrypt_parse_hash_500000; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_13732; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13733: hashconfig->hash_type = HASH_TYPE_WHIRLPOOL; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCWHIRLPOOL_XTS1536; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = veracrypt_parse_hash_500000; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_13733; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13741: hashconfig->hash_type = HASH_TYPE_RIPEMD160; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCRIPEMD160_XTS512; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = veracrypt_parse_hash_327661; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = NULL; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13742: hashconfig->hash_type = HASH_TYPE_RIPEMD160; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCRIPEMD160_XTS1024; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = veracrypt_parse_hash_327661; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = NULL; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13743: hashconfig->hash_type = HASH_TYPE_RIPEMD160; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_TCRIPEMD160_XTS1536; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = veracrypt_parse_hash_327661; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = NULL; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13751: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_VCSHA256_XTS512; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = veracrypt_parse_hash_500000; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_13751; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13752: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_VCSHA256_XTS1024; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = veracrypt_parse_hash_500000; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_13752; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13753: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_VCSHA256_XTS1536; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = veracrypt_parse_hash_500000; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_13753; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13761: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_VCSHA256_XTS512; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = veracrypt_parse_hash_200000; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = NULL; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13762: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_VCSHA256_XTS1024; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = veracrypt_parse_hash_200000; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = NULL; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13763: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_VCSHA256_XTS1536; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = veracrypt_parse_hash_200000; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = NULL; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13800: hashconfig->hash_type = HASH_TYPE_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_UTF16LE; hashconfig->kern_type = KERN_TYPE_WIN8PHONE; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = win8phone_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 7; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 6; hashconfig->st_hash = ST_HASH_13800; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 13900: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS15; hashconfig->kern_type = KERN_TYPE_OPENCART; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = opencart_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_NOT_ITERATED; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_13900; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 14000: hashconfig->hash_type = HASH_TYPE_DES; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_BITSLICE | OPTS_TYPE_ST_GENERATE_LE | OPTS_TYPE_ST_HEX; hashconfig->kern_type = KERN_TYPE_DES; hashconfig->dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 hashconfig->parse_func = des_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_PERMUT; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_14000; hashconfig->st_pass = ST_PASS_HASHCAT_ONE; break; case 14100: hashconfig->hash_type = HASH_TYPE_DES; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_GENERATE_LE | OPTS_TYPE_ST_HEX; hashconfig->kern_type = KERN_TYPE_3DES; hashconfig->dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 hashconfig->parse_func = des_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_PERMUT; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_14100; hashconfig->st_pass = ST_PASS_HASHCAT_ONET3; break; case 14400: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_SHA1CX; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = sha1cx_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_EARLY_SKIP; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_14400; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 14600: hashconfig->hash_type = HASH_TYPE_LUKS; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_BINARY_HASHFILE; hashconfig->kern_type = KERN_TYPE_LUKS_SHA1_AES; // this gets overwritten from within parser hashconfig->dgst_size = DGST_SIZE_4_16; hashconfig->parse_func = NULL; // luks_parse_hash is kind of unconvetional hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = NULL; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 14700: hashconfig->hash_type = HASH_TYPE_ITUNES_BACKUP_9; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_GENERATE_LE | OPTS_TYPE_ST_HEX; hashconfig->kern_type = KERN_TYPE_ITUNES_BACKUP_9; hashconfig->dgst_size = DGST_SIZE_4_4; // we actually do not have a digest hashconfig->parse_func = itunes_backup_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_14700; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 14800: hashconfig->hash_type = HASH_TYPE_ITUNES_BACKUP_10; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_GENERATE_LE | OPTS_TYPE_ST_HEX | OPTS_TYPE_INIT2 | OPTS_TYPE_LOOP2; hashconfig->kern_type = KERN_TYPE_ITUNES_BACKUP_10; hashconfig->dgst_size = DGST_SIZE_4_4; // we actually do not have a digest hashconfig->parse_func = itunes_backup_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_14800; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 14900: hashconfig->hash_type = HASH_TYPE_SKIP32; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_GENERATE_LE | OPTS_TYPE_PT_NEVERCRACK; hashconfig->kern_type = KERN_TYPE_SKIP32; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = skip32_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_14900; hashconfig->st_pass = ST_PASS_HASHCAT_EXCL3; break; case 15000: hashconfig->hash_type = HASH_TYPE_SHA512; hashconfig->salt_type = SALT_TYPE_GENERIC; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE; // OPTS_TYPE_ST_ADD80 added within kernel hashconfig->kern_type = KERN_TYPE_FILEZILLA_SERVER; hashconfig->dgst_size = DGST_SIZE_8_8; hashconfig->parse_func = filezilla_server_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_PRECOMPUTE_MERKLE | OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_USES_BITS_64 | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 14; hashconfig->dgst_pos1 = 15; hashconfig->dgst_pos2 = 6; hashconfig->dgst_pos3 = 7; hashconfig->st_hash = ST_HASH_15000; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 15100: hashconfig->hash_type = HASH_TYPE_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_NETBSD_SHA1CRYPT; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = netbsd_sha1crypt_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_15100; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 15200: hashconfig->hash_type = HASH_TYPE_AES; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_HASH_COPY; hashconfig->kern_type = KERN_TYPE_MYWALLET; hashconfig->dgst_size = DGST_SIZE_4_5; // because kernel uses _SHA1_ hashconfig->parse_func = mywalletv2_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_15200; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 15300: hashconfig->hash_type = HASH_TYPE_DPAPIMK; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_DPAPIMK_V1; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = dpapimk_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_15300; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 15400: hashconfig->hash_type = HASH_TYPE_CHACHA20; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_CHACHA20; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = chacha20_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_32 | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_15400; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 15500: hashconfig->hash_type = HASH_TYPE_JKS_SHA1; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_UTF16BE | OPTS_TYPE_ST_ADD80 | OPTS_TYPE_ST_ADDBITS15; hashconfig->kern_type = KERN_TYPE_JKS_SHA1; hashconfig->dgst_size = DGST_SIZE_4_5; hashconfig->parse_func = jks_sha1_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_PRECOMPUTE_INIT | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_APPENDED_SALT; hashconfig->dgst_pos0 = 3; hashconfig->dgst_pos1 = 4; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_15500; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 15600: hashconfig->hash_type = HASH_TYPE_PBKDF2_SHA256; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_HEX; hashconfig->kern_type = KERN_TYPE_ETHEREUM_PBKDF2; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = ethereum_pbkdf2_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_15600; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 15700: hashconfig->hash_type = HASH_TYPE_SCRYPT; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_ST_HEX; hashconfig->kern_type = KERN_TYPE_ETHEREUM_SCRYPT; hashconfig->dgst_size = DGST_SIZE_4_8; hashconfig->parse_func = ethereum_scrypt_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_15700; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 15900: hashconfig->hash_type = HASH_TYPE_DPAPIMK; hashconfig->salt_type = SALT_TYPE_EMBEDDED; hashconfig->attack_exec = ATTACK_EXEC_OUTSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE; hashconfig->kern_type = KERN_TYPE_DPAPIMK_V2; hashconfig->dgst_size = DGST_SIZE_4_4; hashconfig->parse_func = dpapimk_parse_hash; hashconfig->opti_type = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; hashconfig->st_hash = ST_HASH_15900; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; case 99999: hashconfig->hash_type = HASH_TYPE_PLAINTEXT; hashconfig->salt_type = SALT_TYPE_NONE; hashconfig->attack_exec = ATTACK_EXEC_INSIDE_KERNEL; hashconfig->opts_type = OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_PT_ADD80 | OPTS_TYPE_PT_ADDBITS14; hashconfig->kern_type = KERN_TYPE_MD4; hashconfig->dgst_size = DGST_SIZE_4_32; // originally DGST_SIZE_4_2 hashconfig->parse_func = plaintext_parse_hash; hashconfig->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_NOT_SALTED | OPTI_TYPE_RAW_HASH; hashconfig->dgst_pos0 = 0; hashconfig->dgst_pos1 = 3; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 1; hashconfig->st_hash = ST_HASH_99999; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; default: return -1; } if (user_options->hex_salt) { if (hashconfig->salt_type == SALT_TYPE_GENERIC) { hashconfig->opts_type |= OPTS_TYPE_ST_HEX; } else { event_log_error (hashcat_ctx, "Parameter hex-salt not valid for hash-type %u", hashconfig->hash_mode); return -1; } } if (user_options->keep_guessing) { hashconfig->opts_type |= OPTS_TYPE_PT_NEVERCRACK; } // some kernels do not have an optimized kernel, simply because they do not need them // or because they are not yet converted, for them we should switch off optimized mode char source_file[256] = { 0 }; generate_source_kernel_filename (hashconfig->attack_exec, user_options_extra->attack_kern, hashconfig->kern_type, false, folder_config->shared_dir, source_file); hashconfig->has_pure_kernel = hc_path_read (source_file); generate_source_kernel_filename (hashconfig->attack_exec, user_options_extra->attack_kern, hashconfig->kern_type, true, folder_config->shared_dir, source_file); hashconfig->has_optimized_kernel = hc_path_read (source_file); if (user_options->example_hashes == false) { if (user_options->optimized_kernel_enable == true) { if (hashconfig->has_optimized_kernel == false) { if (user_options->quiet == false) event_log_warning (hashcat_ctx, "%s: Optimized OpenCL kernel requested but not needed - falling back to pure OpenCL kernel", source_file); } else { hashconfig->opti_type |= OPTI_TYPE_OPTIMIZED_KERNEL; } } else { if (hashconfig->has_pure_kernel == false) { if (user_options->quiet == false) event_log_warning (hashcat_ctx, "%s: Pure OpenCL kernel not found, falling back to optimized OpenCL kernel", source_file); hashconfig->opti_type |= OPTI_TYPE_OPTIMIZED_KERNEL; } else { // nothing to do } } } if ((hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) == 0) { hashconfig->opts_type &= ~OPTS_TYPE_PT_UTF16LE; hashconfig->opts_type &= ~OPTS_TYPE_PT_UTF16BE; hashconfig->opts_type &= ~OPTS_TYPE_PT_ADD01; hashconfig->opts_type &= ~OPTS_TYPE_PT_ADD02; hashconfig->opts_type &= ~OPTS_TYPE_PT_ADD80; hashconfig->opts_type &= ~OPTS_TYPE_PT_ADDBITS14; hashconfig->opts_type &= ~OPTS_TYPE_PT_ADDBITS15; hashconfig->opts_type &= ~OPTS_TYPE_ST_UTF16LE; hashconfig->opts_type &= ~OPTS_TYPE_ST_UTF16BE; hashconfig->opts_type &= ~OPTS_TYPE_ST_ADD01; hashconfig->opts_type &= ~OPTS_TYPE_ST_ADD02; hashconfig->opts_type &= ~OPTS_TYPE_ST_ADD80; hashconfig->opts_type &= ~OPTS_TYPE_ST_ADDBITS14; hashconfig->opts_type &= ~OPTS_TYPE_ST_ADDBITS15; hashconfig->opti_type &= ~OPTI_TYPE_PRECOMPUTE_INIT; hashconfig->opti_type &= ~OPTI_TYPE_PRECOMPUTE_MERKLE; hashconfig->opti_type &= ~OPTI_TYPE_MEET_IN_MIDDLE; hashconfig->opti_type &= ~OPTI_TYPE_PREPENDED_SALT; hashconfig->opti_type &= ~OPTI_TYPE_APPENDED_SALT; } const bool is_salted = ((hashconfig->salt_type == SALT_TYPE_GENERIC) | (hashconfig->salt_type == SALT_TYPE_EMBEDDED) | (hashconfig->salt_type == SALT_TYPE_VIRTUAL)); hashconfig->is_salted = is_salted; // esalt_size hashconfig->esalt_size = 0; switch (hashconfig->hash_mode) { case 600: hashconfig->esalt_size = sizeof (blake2_t); break; case 2500: hashconfig->esalt_size = sizeof (wpa_t); break; case 2501: hashconfig->esalt_size = sizeof (wpa_t); break; case 5300: hashconfig->esalt_size = sizeof (ikepsk_t); break; case 5400: hashconfig->esalt_size = sizeof (ikepsk_t); break; case 5500: hashconfig->esalt_size = sizeof (netntlm_t); break; case 5600: hashconfig->esalt_size = sizeof (netntlm_t); break; case 6211: hashconfig->esalt_size = sizeof (tc_t); break; case 6212: hashconfig->esalt_size = sizeof (tc_t); break; case 6213: hashconfig->esalt_size = sizeof (tc_t); break; case 6221: hashconfig->esalt_size = sizeof (tc_t); break; case 6222: hashconfig->esalt_size = sizeof (tc_t); break; case 6223: hashconfig->esalt_size = sizeof (tc_t); break; case 6231: hashconfig->esalt_size = sizeof (tc_t); break; case 6232: hashconfig->esalt_size = sizeof (tc_t); break; case 6233: hashconfig->esalt_size = sizeof (tc_t); break; case 6241: hashconfig->esalt_size = sizeof (tc_t); break; case 6242: hashconfig->esalt_size = sizeof (tc_t); break; case 6243: hashconfig->esalt_size = sizeof (tc_t); break; case 6600: hashconfig->esalt_size = sizeof (agilekey_t); break; case 7100: hashconfig->esalt_size = sizeof (pbkdf2_sha512_t); break; case 7200: hashconfig->esalt_size = sizeof (pbkdf2_sha512_t); break; case 7300: hashconfig->esalt_size = sizeof (rakp_t); break; case 7500: hashconfig->esalt_size = sizeof (krb5pa_t); break; case 8200: hashconfig->esalt_size = sizeof (cloudkey_t); break; case 8800: hashconfig->esalt_size = sizeof (androidfde_t); break; case 9200: hashconfig->esalt_size = sizeof (pbkdf2_sha256_t); break; case 9400: hashconfig->esalt_size = sizeof (office2007_t); break; case 9500: hashconfig->esalt_size = sizeof (office2010_t); break; case 9600: hashconfig->esalt_size = sizeof (office2013_t); break; case 9700: hashconfig->esalt_size = sizeof (oldoffice01_t); break; case 9710: hashconfig->esalt_size = sizeof (oldoffice01_t); break; case 9720: hashconfig->esalt_size = sizeof (oldoffice01_t); break; case 9800: hashconfig->esalt_size = sizeof (oldoffice34_t); break; case 9810: hashconfig->esalt_size = sizeof (oldoffice34_t); break; case 9820: hashconfig->esalt_size = sizeof (oldoffice34_t); break; case 10000: hashconfig->esalt_size = sizeof (pbkdf2_sha256_t); break; case 10200: hashconfig->esalt_size = sizeof (cram_md5_t); break; case 10400: hashconfig->esalt_size = sizeof (pdf_t); break; case 10410: hashconfig->esalt_size = sizeof (pdf_t); break; case 10420: hashconfig->esalt_size = sizeof (pdf_t); break; case 10500: hashconfig->esalt_size = sizeof (pdf_t); break; case 10600: hashconfig->esalt_size = sizeof (pdf_t); break; case 10700: hashconfig->esalt_size = sizeof (pdf_t); break; case 10900: hashconfig->esalt_size = sizeof (pbkdf2_sha256_t); break; case 11300: hashconfig->esalt_size = sizeof (bitcoin_wallet_t); break; case 11400: hashconfig->esalt_size = sizeof (sip_t); break; case 11900: hashconfig->esalt_size = sizeof (pbkdf2_md5_t); break; case 12000: hashconfig->esalt_size = sizeof (pbkdf2_sha1_t); break; case 12001: hashconfig->esalt_size = sizeof (pbkdf2_sha1_t); break; case 12100: hashconfig->esalt_size = sizeof (pbkdf2_sha512_t); break; case 13000: hashconfig->esalt_size = sizeof (rar5_t); break; case 13100: hashconfig->esalt_size = sizeof (krb5tgs_t); break; case 13400: hashconfig->esalt_size = sizeof (keepass_t); break; case 13500: hashconfig->esalt_size = sizeof (pstoken_t); break; case 13600: hashconfig->esalt_size = sizeof (zip2_t); break; case 13711: hashconfig->esalt_size = sizeof (tc_t); break; case 13712: hashconfig->esalt_size = sizeof (tc_t); break; case 13713: hashconfig->esalt_size = sizeof (tc_t); break; case 13721: hashconfig->esalt_size = sizeof (tc_t); break; case 13722: hashconfig->esalt_size = sizeof (tc_t); break; case 13723: hashconfig->esalt_size = sizeof (tc_t); break; case 13731: hashconfig->esalt_size = sizeof (tc_t); break; case 13732: hashconfig->esalt_size = sizeof (tc_t); break; case 13733: hashconfig->esalt_size = sizeof (tc_t); break; case 13741: hashconfig->esalt_size = sizeof (tc_t); break; case 13742: hashconfig->esalt_size = sizeof (tc_t); break; case 13743: hashconfig->esalt_size = sizeof (tc_t); break; case 13751: hashconfig->esalt_size = sizeof (tc_t); break; case 13752: hashconfig->esalt_size = sizeof (tc_t); break; case 13753: hashconfig->esalt_size = sizeof (tc_t); break; case 13761: hashconfig->esalt_size = sizeof (tc_t); break; case 13762: hashconfig->esalt_size = sizeof (tc_t); break; case 13763: hashconfig->esalt_size = sizeof (tc_t); break; case 13800: hashconfig->esalt_size = sizeof (win8phone_t); break; case 14600: hashconfig->esalt_size = sizeof (luks_t); break; case 14700: hashconfig->esalt_size = sizeof (itunes_backup_t); break; case 14800: hashconfig->esalt_size = sizeof (itunes_backup_t); break; case 15300: hashconfig->esalt_size = sizeof (dpapimk_t); break; case 15400: hashconfig->esalt_size = sizeof (chacha20_t); break; case 15500: hashconfig->esalt_size = sizeof (jks_sha1_t); break; case 15600: hashconfig->esalt_size = sizeof (ethereum_pbkdf2_t); break; case 15700: hashconfig->esalt_size = sizeof (ethereum_scrypt_t); break; case 15900: hashconfig->esalt_size = sizeof (dpapimk_t); break; } // hook_salt_size hashconfig->hook_salt_size = 0; switch (hashconfig->hash_mode) { case 11600: hashconfig->hook_salt_size = sizeof (seven_zip_hook_salt_t); break; } // tmp_size hashconfig->tmp_size = 4; switch (hashconfig->hash_mode) { case 400: hashconfig->tmp_size = sizeof (phpass_tmp_t); break; case 500: hashconfig->tmp_size = sizeof (md5crypt_tmp_t); break; case 501: hashconfig->tmp_size = sizeof (md5crypt_tmp_t); break; case 1600: hashconfig->tmp_size = sizeof (md5crypt_tmp_t); break; case 1800: hashconfig->tmp_size = sizeof (sha512crypt_tmp_t); break; case 2100: hashconfig->tmp_size = sizeof (dcc2_tmp_t); break; case 2500: hashconfig->tmp_size = sizeof (wpa_tmp_t); break; case 2501: hashconfig->tmp_size = sizeof (wpapmk_tmp_t); break; case 3200: hashconfig->tmp_size = sizeof (bcrypt_tmp_t); break; case 5200: hashconfig->tmp_size = sizeof (pwsafe3_tmp_t); break; case 5800: hashconfig->tmp_size = sizeof (androidpin_tmp_t); break; case 6211: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 6212: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 6213: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 6221: hashconfig->tmp_size = sizeof (tc64_tmp_t); break; case 6222: hashconfig->tmp_size = sizeof (tc64_tmp_t); break; case 6223: hashconfig->tmp_size = sizeof (tc64_tmp_t); break; case 6231: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 6232: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 6233: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 6241: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 6242: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 6243: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 6300: hashconfig->tmp_size = sizeof (md5crypt_tmp_t); break; case 6400: hashconfig->tmp_size = sizeof (sha256aix_tmp_t); break; case 6500: hashconfig->tmp_size = sizeof (sha512aix_tmp_t); break; case 6600: hashconfig->tmp_size = sizeof (agilekey_tmp_t); break; case 6700: hashconfig->tmp_size = sizeof (sha1aix_tmp_t); break; case 6800: hashconfig->tmp_size = sizeof (lastpass_tmp_t); break; case 7100: hashconfig->tmp_size = sizeof (pbkdf2_sha512_tmp_t); break; case 7200: hashconfig->tmp_size = sizeof (pbkdf2_sha512_tmp_t); break; case 7400: hashconfig->tmp_size = sizeof (sha256crypt_tmp_t); break; case 7900: hashconfig->tmp_size = sizeof (drupal7_tmp_t); break; case 8200: hashconfig->tmp_size = sizeof (pbkdf2_sha512_tmp_t); break; case 8800: hashconfig->tmp_size = sizeof (androidfde_tmp_t); break; case 9000: hashconfig->tmp_size = sizeof (pwsafe2_tmp_t); break; case 9100: hashconfig->tmp_size = sizeof (lotus8_tmp_t); break; case 9200: hashconfig->tmp_size = sizeof (pbkdf2_sha256_tmp_t); break; case 9400: hashconfig->tmp_size = sizeof (office2007_tmp_t); break; case 9500: hashconfig->tmp_size = sizeof (office2010_tmp_t); break; case 9600: hashconfig->tmp_size = sizeof (office2013_tmp_t); break; case 10000: hashconfig->tmp_size = sizeof (pbkdf2_sha256_tmp_t); break; case 10200: hashconfig->tmp_size = sizeof (cram_md5_t); break; case 10300: hashconfig->tmp_size = sizeof (saph_sha1_tmp_t); break; case 10500: hashconfig->tmp_size = sizeof (pdf14_tmp_t); break; case 10700: hashconfig->tmp_size = sizeof (pdf17l8_tmp_t); break; case 10900: hashconfig->tmp_size = sizeof (pbkdf2_sha256_tmp_t); break; case 11300: hashconfig->tmp_size = sizeof (bitcoin_wallet_tmp_t); break; case 11600: hashconfig->tmp_size = sizeof (seven_zip_tmp_t); break; case 11900: hashconfig->tmp_size = sizeof (pbkdf2_md5_tmp_t); break; case 12000: hashconfig->tmp_size = sizeof (pbkdf2_sha1_tmp_t); break; case 12001: hashconfig->tmp_size = sizeof (pbkdf2_sha1_tmp_t); break; case 12100: hashconfig->tmp_size = sizeof (pbkdf2_sha512_tmp_t); break; case 12200: hashconfig->tmp_size = sizeof (ecryptfs_tmp_t); break; case 12300: hashconfig->tmp_size = sizeof (oraclet_tmp_t); break; case 12400: hashconfig->tmp_size = sizeof (bsdicrypt_tmp_t); break; case 12500: hashconfig->tmp_size = sizeof (rar3_tmp_t); break; case 12700: hashconfig->tmp_size = sizeof (mywallet_tmp_t); break; case 12800: hashconfig->tmp_size = sizeof (pbkdf2_sha256_tmp_t); break; case 12900: hashconfig->tmp_size = sizeof (pbkdf2_sha256_tmp_t); break; case 13000: hashconfig->tmp_size = sizeof (pbkdf2_sha256_tmp_t); break; case 13200: hashconfig->tmp_size = sizeof (axcrypt_tmp_t); break; case 13400: hashconfig->tmp_size = sizeof (keepass_tmp_t); break; case 13600: hashconfig->tmp_size = sizeof (pbkdf2_sha1_tmp_t); break; case 13711: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 13712: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 13713: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 13721: hashconfig->tmp_size = sizeof (tc64_tmp_t); break; case 13722: hashconfig->tmp_size = sizeof (tc64_tmp_t); break; case 13723: hashconfig->tmp_size = sizeof (tc64_tmp_t); break; case 13731: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 13732: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 13733: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 13741: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 13742: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 13743: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 13751: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 13752: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 13753: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 13761: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 13762: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 13763: hashconfig->tmp_size = sizeof (tc_tmp_t); break; case 14600: hashconfig->tmp_size = sizeof (luks_tmp_t); break; case 14700: hashconfig->tmp_size = sizeof (pbkdf2_sha1_tmp_t); break; case 14800: hashconfig->tmp_size = sizeof (pbkdf2_sha256_tmp_t); break; case 15100: hashconfig->tmp_size = sizeof (pbkdf1_sha1_tmp_t); break; case 15200: hashconfig->tmp_size = sizeof (mywallet_tmp_t); break; case 15300: hashconfig->tmp_size = sizeof (dpapimk_tmp_v1_t); break; case 15600: hashconfig->tmp_size = sizeof (pbkdf2_sha256_tmp_t); break; case 15900: hashconfig->tmp_size = sizeof (dpapimk_tmp_v2_t); break; }; // hook_size hashconfig->hook_size = 4; switch (hashconfig->hash_mode) { case 11600: hashconfig->hook_size = sizeof (seven_zip_hook_t); break; }; /** * pw_min and pw_max */ hashconfig->pw_min = PW_MIN; hashconfig->pw_max = PW_MAX; // pw_min : algo specific hard min length switch (hashconfig->hash_mode) { case 2500: hashconfig->pw_min = 8; break; // WPA min RFC case 2501: hashconfig->pw_min = 64; break; // WPA PMK fixed case 9710: hashconfig->pw_min = 5; break; // RC4-40 fixed case 9810: hashconfig->pw_min = 5; break; // RC4-40 fixed case 10410: hashconfig->pw_min = 5; break; // RC4-40 fixed case 14000: hashconfig->pw_min = 8; break; // DES fixed case 14100: hashconfig->pw_min = 24; break; // 3DES fixed case 14900: hashconfig->pw_min = 10; break; // Skip32 fixed case 15400: hashconfig->pw_min = 32; break; // ChaCha20 fixed } // pw_max : some algo suffer from support for long passwords, // the user need to add -L to enable support for them if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { hashconfig->pw_max = PW_MAX_OLD; if ((hashconfig->opts_type & OPTS_TYPE_PT_UTF16LE) || (hashconfig->opts_type & OPTS_TYPE_PT_UTF16BE)) { hashconfig->pw_max /= 2; } #define PW_DICTMAX 31 if ((user_options->rp_files_cnt > 0) || (user_options->rp_gen > 0)) { switch (user_options_extra->attack_kern) { case ATTACK_KERN_STRAIGHT: hashconfig->pw_max = MIN (hashconfig->pw_max, PW_DICTMAX); break; case ATTACK_KERN_COMBI: hashconfig->pw_max = MIN (hashconfig->pw_max, PW_DICTMAX); break; } } else { if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { switch (user_options_extra->attack_kern) { case ATTACK_KERN_STRAIGHT: hashconfig->pw_max = MIN (hashconfig->pw_max, PW_DICTMAX); break; case ATTACK_KERN_COMBI: hashconfig->pw_max = MIN (hashconfig->pw_max, PW_DICTMAX); break; } } else { // If we have a NOOP rule then we can process words from wordlists > PW_DICTMAX for slow hashes } } switch (hashconfig->hash_mode) { case 500: hashconfig->pw_max = MIN (hashconfig->pw_max, 15); // pure kernel available break; case 1600: hashconfig->pw_max = MIN (hashconfig->pw_max, 15); // pure kernel available break; case 1800: hashconfig->pw_max = MIN (hashconfig->pw_max, 16); // pure kernel available break; case 5800: hashconfig->pw_max = MIN (hashconfig->pw_max, 16); // pure kernel available break; case 6300: hashconfig->pw_max = MIN (hashconfig->pw_max, 15); // pure kernel available break; case 6900: hashconfig->pw_max = MIN (hashconfig->pw_max, 32); // todo break; case 7000: hashconfig->pw_max = MIN (hashconfig->pw_max, 19); // pure kernel available break; case 7400: hashconfig->pw_max = MIN (hashconfig->pw_max, 15); // pure kernel available break; case 10700: hashconfig->pw_max = MIN (hashconfig->pw_max, 16); // pure kernel available break; case 12500: hashconfig->pw_max = MIN (hashconfig->pw_max, 20); // todo break; case 14400: hashconfig->pw_max = MIN (hashconfig->pw_max, 24); // todo break; case 15500: hashconfig->pw_max = MIN (hashconfig->pw_max, 16); // todo break; } } else { switch (hashconfig->hash_mode) { case 10700: hashconfig->pw_max = 127; // https://www.pdflib.com/knowledge-base/pdf-password-security/encryption/ break; } } // pw_max : all modes listed in the following switch cases are // the maximum possible password length of the related system // plus the opencl kernels which eventually allows cracking of passwords of up length PW_MAX for free (no speed drop). // some modes have a self-set and some have // underlaying algorithms specific hard maximum password length // these limits override all previous restrictions, always switch (hashconfig->hash_mode) { case 112: hashconfig->pw_max = 30; break; // https://www.toadworld.com/platforms/oracle/b/weblog/archive/2013/11/12/oracle-12c-passwords case 1500: hashconfig->pw_max = 8; break; // Underlaying DES max case 2100: hashconfig->pw_max = PW_MAX; break; case 2400: hashconfig->pw_max = 16; break; // Cisco-PIX MD5 sets w[4] = 0x80 case 2410: hashconfig->pw_max = 12; break; // Cisco-ASA MD5 sets w[4] = 0x80 plus has a 4 byte fixed salt case 2500: hashconfig->pw_max = 63; break; // WPA/WPA2 limits itself to 63 by RFC case 2501: hashconfig->pw_max = 64; break; // WPA/WPA2 PMK fixed length case 3000: hashconfig->pw_max = 7; break; // LM max case 3100: hashconfig->pw_max = 30; break; // http://www.red-database-security.de/whitepaper/oracle_passwords.html case 3200: hashconfig->pw_max = 72; break; // Underlaying Blowfish max case 5200: hashconfig->pw_max = PW_MAX; break; case 6211: hashconfig->pw_max = 64; break; // TC limits itself to 64 case 6212: hashconfig->pw_max = 64; break; // TC limits itself to 64 case 6213: hashconfig->pw_max = 64; break; // TC limits itself to 64 case 6221: hashconfig->pw_max = 64; break; // TC limits itself to 64 case 6222: hashconfig->pw_max = 64; break; // TC limits itself to 64 case 6223: hashconfig->pw_max = 64; break; // TC limits itself to 64 case 6231: hashconfig->pw_max = 64; break; // TC limits itself to 64 case 6232: hashconfig->pw_max = 64; break; // TC limits itself to 64 case 6233: hashconfig->pw_max = 64; break; // TC limits itself to 64 case 6241: hashconfig->pw_max = 64; break; // TC limits itself to 64 case 6242: hashconfig->pw_max = 64; break; // TC limits itself to 64 case 6243: hashconfig->pw_max = 64; break; // TC limits itself to 64 case 6400: hashconfig->pw_max = PW_MAX; break; case 6500: hashconfig->pw_max = PW_MAX; break; case 6600: hashconfig->pw_max = PW_MAX; break; case 6700: hashconfig->pw_max = PW_MAX; break; case 6800: hashconfig->pw_max = PW_MAX; break; case 7100: hashconfig->pw_max = PW_MAX; break; case 7200: hashconfig->pw_max = PW_MAX; break; case 7700: hashconfig->pw_max = 8; break; // https://www.daniel-berlin.de/security/sap-sec/password-hash-algorithms/ case 7800: hashconfig->pw_max = 40; break; // https://www.daniel-berlin.de/security/sap-sec/password-hash-algorithms/ case 7900: hashconfig->pw_max = PW_MAX; break; case 8000: hashconfig->pw_max = 30; break; // http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc31654.1570/html/sag1/CIHIBDBA.htm case 8200: hashconfig->pw_max = PW_MAX; break; case 8500: hashconfig->pw_max = 8; break; // Underlaying DES max case 8600: hashconfig->pw_max = 16; break; // Lotus Notes/Domino 5 limits itself to 16 case 8700: hashconfig->pw_max = 64; break; // https://www.ibm.com/support/knowledgecenter/en/SSKTWP_8.5.3/com.ibm.notes85.client.doc/fram_limits_of_notes_r.html case 8800: hashconfig->pw_max = PW_MAX; break; case 8900: hashconfig->pw_max = PW_MAX; break; case 9100: hashconfig->pw_max = 64; break; // https://www.ibm.com/support/knowledgecenter/en/SSKTWP_8.5.3/com.ibm.notes85.client.doc/fram_limits_of_notes_r.html case 9200: hashconfig->pw_max = PW_MAX; break; case 9300: hashconfig->pw_max = PW_MAX; break; case 9400: hashconfig->pw_max = PW_MAX; break; case 9500: hashconfig->pw_max = PW_MAX; break; case 9600: hashconfig->pw_max = PW_MAX; break; case 9700: hashconfig->pw_max = 15; break; // https://msdn.microsoft.com/en-us/library/dd772916(v=office.12).aspx case 9710: hashconfig->pw_max = 5; break; // Underlaying RC4-40 max case 9720: hashconfig->pw_max = 15; break; // https://msdn.microsoft.com/en-us/library/dd772916(v=office.12).aspx case 9800: hashconfig->pw_max = 15; break; // https://msdn.microsoft.com/en-us/library/dd772916(v=office.12).aspx case 9810: hashconfig->pw_max = 5; break; // Underlaying RC4-40 max case 9820: hashconfig->pw_max = 15; break; // https://msdn.microsoft.com/en-us/library/dd772916(v=office.12).aspx case 9900: hashconfig->pw_max = 100; break; // RAdmin2 sets w[25] = 0x80 case 10000: hashconfig->pw_max = PW_MAX; break; case 10300: hashconfig->pw_max = 40; break; // https://www.daniel-berlin.de/security/sap-sec/password-hash-algorithms/ case 10400: hashconfig->pw_max = 32; break; // https://www.pdflib.com/knowledge-base/pdf-password-security/encryption/ case 10410: hashconfig->pw_max = 5; break; // Underlaying RC4-40 max case 10420: hashconfig->pw_max = 32; break; // https://www.pdflib.com/knowledge-base/pdf-password-security/encryption/ case 10500: hashconfig->pw_max = 32; break; // https://www.pdflib.com/knowledge-base/pdf-password-security/encryption/ case 10600: hashconfig->pw_max = 127; break; // https://www.pdflib.com/knowledge-base/pdf-password-security/encryption/ case 10900: hashconfig->pw_max = PW_MAX; break; case 11300: hashconfig->pw_max = PW_MAX; break; case 11600: hashconfig->pw_max = PW_MAX; break; case 11900: hashconfig->pw_max = PW_MAX; break; case 12000: hashconfig->pw_max = PW_MAX; break; case 12001: hashconfig->pw_max = PW_MAX; break; case 12200: hashconfig->pw_max = PW_MAX; break; case 12300: hashconfig->pw_max = PW_MAX; break; case 12400: hashconfig->pw_max = PW_MAX; break; case 12700: hashconfig->pw_max = PW_MAX; break; case 12800: hashconfig->pw_max = PW_MAX; break; case 12900: hashconfig->pw_max = PW_MAX; break; case 13000: hashconfig->pw_max = PW_MAX; break; case 13200: hashconfig->pw_max = PW_MAX; break; case 13400: hashconfig->pw_max = PW_MAX; break; case 13600: hashconfig->pw_max = PW_MAX; break; case 13711: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 13712: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 13713: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 13721: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 13722: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 13723: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 13731: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 13732: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 13733: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 13741: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 13742: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 13743: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 13751: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 13752: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 13753: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 13761: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 13762: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 13763: hashconfig->pw_max = 64; break; // VC limits itself to 64 case 14000: hashconfig->pw_max = 8; break; // Underlaying DES fixed case 14100: hashconfig->pw_max = 24; break; // Underlaying 3DES fixed case 14611: hashconfig->pw_max = PW_MAX; break; case 14612: hashconfig->pw_max = PW_MAX; break; case 14613: hashconfig->pw_max = PW_MAX; break; case 14621: hashconfig->pw_max = PW_MAX; break; case 14622: hashconfig->pw_max = PW_MAX; break; case 14623: hashconfig->pw_max = PW_MAX; break; case 14631: hashconfig->pw_max = PW_MAX; break; case 14632: hashconfig->pw_max = PW_MAX; break; case 14633: hashconfig->pw_max = PW_MAX; break; case 14641: hashconfig->pw_max = PW_MAX; break; case 14642: hashconfig->pw_max = PW_MAX; break; case 14643: hashconfig->pw_max = PW_MAX; break; case 14700: hashconfig->pw_max = PW_MAX; break; case 14800: hashconfig->pw_max = PW_MAX; break; case 14900: hashconfig->pw_max = 10; break; // Underlaying Skip32 fixed case 15100: hashconfig->pw_max = PW_MAX; break; case 15300: hashconfig->pw_max = PW_MAX; break; case 15400: hashconfig->pw_max = 32; break; // Underlaying ChaCha20 fixed case 15600: hashconfig->pw_max = PW_MAX; break; case 15700: hashconfig->pw_max = PW_MAX; break; case 15900: hashconfig->pw_max = PW_MAX; break; } // salt_min and salt_max : this limit is only interessting for generic hash types that support a salt hashconfig->salt_min = SALT_MIN; hashconfig->salt_max = SALT_MAX; if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { hashconfig->salt_max = SALT_MAX_OLD; if ((hashconfig->opts_type & OPTS_TYPE_ST_UTF16LE) || (hashconfig->opts_type & OPTS_TYPE_ST_UTF16BE)) { hashconfig->salt_max /= 2; } } if (hashconfig->salt_type == SALT_TYPE_GENERIC) { if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) { hashconfig->salt_min *= 2; hashconfig->salt_max *= 2; } switch (hashconfig->hash_mode) { case 11000: hashconfig->salt_min = 56; hashconfig->salt_max = 56; break; case 12600: hashconfig->salt_min = 64; hashconfig->salt_max = 64; break; case 15000: hashconfig->salt_min = 64; hashconfig->salt_max = 64; break; } } return 0; } void hashconfig_destroy (hashcat_ctx_t *hashcat_ctx) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; memset (hashconfig, 0, sizeof (hashconfig_t)); } u32 hashconfig_forced_kernel_threads (hashcat_ctx_t *hashcat_ctx) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; u32 kernel_threads = 0; // DES kernels needs to have a minimum thread count only // because of the bitsliced kernel and the workgroup division done on it if (hashconfig->hash_mode == 1500) kernel_threads = 64; // DES if (hashconfig->hash_mode == 3000) kernel_threads = 64; // DES if (hashconfig->hash_mode == 3100) kernel_threads = 64; // DES if (hashconfig->hash_mode == 3200) kernel_threads = 8; // Blowfish if (hashconfig->hash_mode == 7500) kernel_threads = 64; // RC4 if (hashconfig->hash_mode == 8500) kernel_threads = 64; // DES if (hashconfig->hash_mode == 8900) kernel_threads = 16; // SCRYPT if (hashconfig->hash_mode == 9000) kernel_threads = 8; // Blowfish if (hashconfig->hash_mode == 9300) kernel_threads = 8; // SCRYPT if (hashconfig->hash_mode == 9700) kernel_threads = 64; // RC4 if (hashconfig->hash_mode == 9710) kernel_threads = 64; // RC4 if (hashconfig->hash_mode == 9800) kernel_threads = 64; // RC4 if (hashconfig->hash_mode == 9810) kernel_threads = 64; // RC4 if (hashconfig->hash_mode == 10400) kernel_threads = 64; // RC4 if (hashconfig->hash_mode == 10410) kernel_threads = 64; // RC4 if (hashconfig->hash_mode == 10500) kernel_threads = 64; // RC4 if (hashconfig->hash_mode == 13100) kernel_threads = 64; // RC4 if (hashconfig->hash_mode == 14000) kernel_threads = 64; // DES if (hashconfig->hash_mode == 14100) kernel_threads = 64; // DES if (hashconfig->hash_mode == 15700) kernel_threads = 1; // SCRYPT return kernel_threads; } u32 hashconfig_get_kernel_threads (hashcat_ctx_t *hashcat_ctx, const hc_device_param_t *device_param) { const user_options_t *user_options = hashcat_ctx->user_options; // a kernel can force a fixed value const u32 forced_kernel_threads = hashconfig_forced_kernel_threads (hashcat_ctx); if (forced_kernel_threads) return forced_kernel_threads; // otherwise it depends on (1) the opencl device type u32 kernel_threads = 0; if (device_param->device_type & CL_DEVICE_TYPE_CPU) { kernel_threads = KERNEL_THREADS_MAX_CPU; } else if (device_param->device_type & CL_DEVICE_TYPE_GPU) { if (device_param->device_vendor_id == VENDOR_ID_NV) { kernel_threads = KERNEL_THREADS_MAX_GPU_NV; } else if (device_param->device_vendor_id == VENDOR_ID_AMD) { kernel_threads = KERNEL_THREADS_MAX_GPU_AMD; } else { kernel_threads = KERNEL_THREADS_MAX_GPU; } } else { kernel_threads = KERNEL_THREADS_MAX_OTHER; } if (user_options->workload_profile == 4) { kernel_threads = device_param->device_maxworkgroup_size; } // and (2) an opencl device can force an lower value (limited resources on device) kernel_threads = MIN (kernel_threads, device_param->device_maxworkgroup_size); return kernel_threads; } u32 hashconfig_get_kernel_loops (hashcat_ctx_t *hashcat_ctx) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const user_options_t *user_options = hashcat_ctx->user_options; u32 kernel_loops_fixed = 0; if (hashconfig->hash_mode == 1500 && user_options->attack_mode == ATTACK_MODE_BF) { kernel_loops_fixed = 1024; } if (hashconfig->hash_mode == 3000 && user_options->attack_mode == ATTACK_MODE_BF) { kernel_loops_fixed = 1024; } if (hashconfig->hash_mode == 8900) { kernel_loops_fixed = 1; } if (hashconfig->hash_mode == 9300) { kernel_loops_fixed = 1; } if (hashconfig->hash_mode == 12500) { kernel_loops_fixed = ROUNDS_RAR3 / 16; } if (hashconfig->hash_mode == 14000 && user_options->attack_mode == ATTACK_MODE_BF) { kernel_loops_fixed = 1024; } if (hashconfig->hash_mode == 14100 && user_options->attack_mode == ATTACK_MODE_BF) { kernel_loops_fixed = 1024; } if (hashconfig->hash_mode == 15700) { kernel_loops_fixed = 1; } return kernel_loops_fixed; } int hashconfig_general_defaults (hashcat_ctx_t *hashcat_ctx) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const user_options_t *user_options = hashcat_ctx->user_options; char *optional_param1 = NULL; if (user_options->truecrypt_keyfiles) optional_param1 = user_options->truecrypt_keyfiles; if (user_options->veracrypt_keyfiles) optional_param1 = user_options->veracrypt_keyfiles; if (optional_param1) { const hashes_t *hashes = hashcat_ctx->hashes; void *esalts_buf = hashes->esalts_buf; char *tcvc_keyfiles = optional_param1; u32 *keyfile_buf = ((tc_t *) esalts_buf)->keyfile_buf; char *keyfiles = hcstrdup (tcvc_keyfiles); if (keyfiles == NULL) return -1; char *saveptr; char *keyfile = strtok_r (keyfiles, ",", &saveptr); if (keyfile == NULL) { free (keyfiles); return -1; } do { const int rc_crc32 = cpu_crc32 (hashcat_ctx, keyfile, (u8 *) keyfile_buf); if (rc_crc32 == -1) { free (keyfiles); return -1; } } while ((keyfile = strtok_r (NULL, ",", &saveptr)) != NULL); free (keyfiles); } if (user_options->veracrypt_pim) { // we can access salt directly here because in VC it's always just one salt not many const hashes_t *hashes = hashcat_ctx->hashes; salt_t *salts_buf = hashes->salts_buf; salt_t *salt = &salts_buf[0]; switch (hashconfig->hash_mode) { case 13711: salt->salt_iter = 15000 + (user_options->veracrypt_pim * 1000); break; case 13712: salt->salt_iter = 15000 + (user_options->veracrypt_pim * 1000); break; case 13713: salt->salt_iter = 15000 + (user_options->veracrypt_pim * 1000); break; case 13721: salt->salt_iter = 15000 + (user_options->veracrypt_pim * 1000); break; case 13722: salt->salt_iter = 15000 + (user_options->veracrypt_pim * 1000); break; case 13723: salt->salt_iter = 15000 + (user_options->veracrypt_pim * 1000); break; case 13731: salt->salt_iter = 15000 + (user_options->veracrypt_pim * 1000); break; case 13732: salt->salt_iter = 15000 + (user_options->veracrypt_pim * 1000); break; case 13733: salt->salt_iter = 15000 + (user_options->veracrypt_pim * 1000); break; case 13741: salt->salt_iter = user_options->veracrypt_pim * 2048; break; case 13742: salt->salt_iter = user_options->veracrypt_pim * 2048; break; case 13743: salt->salt_iter = user_options->veracrypt_pim * 2048; break; case 13751: salt->salt_iter = 15000 + (user_options->veracrypt_pim * 1000); break; case 13752: salt->salt_iter = 15000 + (user_options->veracrypt_pim * 1000); break; case 13753: salt->salt_iter = 15000 + (user_options->veracrypt_pim * 1000); break; case 13761: salt->salt_iter = user_options->veracrypt_pim * 2048; break; case 13762: salt->salt_iter = user_options->veracrypt_pim * 2048; break; case 13763: salt->salt_iter = user_options->veracrypt_pim * 2048; break; } salt->salt_iter -= 1; } return 0; } void hashconfig_benchmark_defaults (hashcat_ctx_t *hashcat_ctx, salt_t *salt, void *esalt, void *hook_salt) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; if (hashconfig->is_salted == true) { salt->salt_len = 8; // special salt handling switch (hashconfig->hash_mode) { case 22: salt->salt_len = 30; break; case 1500: salt->salt_len = 2; salt->salt_buf[0] = 388; // pure magic break; case 1731: salt->salt_len = 4; break; case 2410: salt->salt_len = 4; break; case 2500: memcpy (salt->salt_buf, "hashcat.net", 11); break; case 2501: memcpy (salt->salt_buf, "hashcat.net", 11); break; case 3100: salt->salt_len = 1; break; case 5000: salt->keccak_mdlen = 32; break; case 5800: salt->salt_len = 16; break; case 6800: salt->salt_len = 32; break; case 8400: salt->salt_len = 40; break; case 8800: salt->salt_len = 16; break; case 8900: salt->salt_len = 16; salt->scrypt_N = 1024; salt->scrypt_r = 1; salt->scrypt_p = 1; break; case 9100: salt->salt_len = 16; break; case 9300: salt->salt_len = 14; salt->scrypt_N = 16384; salt->scrypt_r = 1; salt->scrypt_p = 1; break; case 9400: salt->salt_len = 16; break; case 9500: salt->salt_len = 16; break; case 9600: salt->salt_len = 16; break; case 9700: salt->salt_len = 16; break; case 9710: salt->salt_len = 16; break; case 9720: salt->salt_len = 16; break; case 9800: salt->salt_len = 16; break; case 9810: salt->salt_len = 16; break; case 9820: salt->salt_len = 16; break; case 10300: salt->salt_len = 12; break; case 11000: salt->salt_len = 56; break; case 11500: salt->salt_len = 4; break; case 11600: salt->salt_len = 4; break; case 12400: salt->salt_len = 4; break; case 12500: salt->salt_len = 8; break; case 12600: salt->salt_len = 64; break; case 14000: salt->salt_len = 8; break; case 14100: salt->salt_len = 8; break; case 14600: salt->salt_len = LUKS_SALTSIZE; break; case 14700: salt->salt_len = 20; break; case 14800: salt->salt_len = 20; break; case 14900: salt->salt_len = 4; break; case 15100: salt->salt_len = 8; break; case 15600: salt->salt_len = 32; break; case 15700: salt->salt_len = 32; salt->scrypt_N = 262144; salt->scrypt_r = 1; salt->scrypt_p = 8; break; } // special esalt handling switch (hashconfig->hash_mode) { case 2500: ((wpa_t *) esalt)->eapol_len = 128; break; case 2501: ((wpa_t *) esalt)->eapol_len = 128; break; case 5300: ((ikepsk_t *) esalt)->nr_len = 1; ((ikepsk_t *) esalt)->msg_len = 1; break; case 5400: ((ikepsk_t *) esalt)->nr_len = 1; ((ikepsk_t *) esalt)->msg_len = 1; break; case 5500: ((netntlm_t *) esalt)->user_len = 1; ((netntlm_t *) esalt)->domain_len = 1; ((netntlm_t *) esalt)->srvchall_len = 1; ((netntlm_t *) esalt)->clichall_len = 1; break; case 5600: ((netntlm_t *) esalt)->user_len = 1; ((netntlm_t *) esalt)->domain_len = 1; ((netntlm_t *) esalt)->srvchall_len = 1; ((netntlm_t *) esalt)->clichall_len = 1; break; case 7300: ((rakp_t *) esalt)->salt_len = 32; break; case 10400: ((pdf_t *) esalt)->id_len = 16; ((pdf_t *) esalt)->o_len = 32; ((pdf_t *) esalt)->u_len = 32; break; case 10410: ((pdf_t *) esalt)->id_len = 16; ((pdf_t *) esalt)->o_len = 32; ((pdf_t *) esalt)->u_len = 32; break; case 10420: ((pdf_t *) esalt)->id_len = 16; ((pdf_t *) esalt)->o_len = 32; ((pdf_t *) esalt)->u_len = 32; break; case 10500: ((pdf_t *) esalt)->id_len = 16; ((pdf_t *) esalt)->o_len = 32; ((pdf_t *) esalt)->u_len = 32; break; case 10600: ((pdf_t *) esalt)->id_len = 16; ((pdf_t *) esalt)->o_len = 127; ((pdf_t *) esalt)->u_len = 127; break; case 10700: ((pdf_t *) esalt)->id_len = 16; ((pdf_t *) esalt)->o_len = 127; ((pdf_t *) esalt)->u_len = 127; break; case 11400: ((sip_t *) esalt)->salt_len = 2; ((sip_t *) esalt)->esalt_len = 39; break; case 13400: ((keepass_t *) esalt)->version = 2; break; case 13500: ((pstoken_t *) esalt)->salt_len = 113; break; case 13600: ((zip2_t *) esalt)->salt_len = 16; ((zip2_t *) esalt)->data_len = 32; ((zip2_t *) esalt)->mode = 3; break; case 14600: ((luks_t *) esalt)->key_size = HC_LUKS_KEY_SIZE_256; ((luks_t *) esalt)->cipher_type = HC_LUKS_CIPHER_TYPE_AES; ((luks_t *) esalt)->cipher_mode = HC_LUKS_CIPHER_MODE_XTS_PLAIN; break; } // special hook salt handling switch (hashconfig->hash_mode) { case 11600: ((seven_zip_hook_salt_t *) hook_salt)->iv_len = 16; ((seven_zip_hook_salt_t *) hook_salt)->data_len = 112; ((seven_zip_hook_salt_t *) hook_salt)->unpack_size = 112; break; } } // set default iterations switch (hashconfig->hash_mode) { case 400: salt->salt_iter = ROUNDS_PHPASS; break; case 500: salt->salt_iter = ROUNDS_MD5CRYPT; break; case 501: salt->salt_iter = ROUNDS_MD5CRYPT; break; case 1600: salt->salt_iter = ROUNDS_MD5CRYPT; break; case 1800: salt->salt_iter = ROUNDS_SHA512CRYPT; break; case 2100: salt->salt_iter = ROUNDS_DCC2; break; case 2500: salt->salt_iter = ROUNDS_WPA; break; case 2501: salt->salt_iter = ROUNDS_WPAPMK; break; case 3200: salt->salt_iter = ROUNDS_BCRYPT; break; case 5200: salt->salt_iter = ROUNDS_PSAFE3; break; case 5800: salt->salt_iter = ROUNDS_ANDROIDPIN - 1; break; case 6211: salt->salt_iter = ROUNDS_TRUECRYPT_2K; break; case 6212: salt->salt_iter = ROUNDS_TRUECRYPT_2K; break; case 6213: salt->salt_iter = ROUNDS_TRUECRYPT_2K; break; case 6221: salt->salt_iter = ROUNDS_TRUECRYPT_1K; break; case 6222: salt->salt_iter = ROUNDS_TRUECRYPT_1K; break; case 6223: salt->salt_iter = ROUNDS_TRUECRYPT_1K; break; case 6231: salt->salt_iter = ROUNDS_TRUECRYPT_1K; break; case 6232: salt->salt_iter = ROUNDS_TRUECRYPT_1K; break; case 6233: salt->salt_iter = ROUNDS_TRUECRYPT_1K; break; case 6241: salt->salt_iter = ROUNDS_TRUECRYPT_1K; break; case 6242: salt->salt_iter = ROUNDS_TRUECRYPT_1K; break; case 6243: salt->salt_iter = ROUNDS_TRUECRYPT_1K; break; case 6300: salt->salt_iter = ROUNDS_MD5CRYPT; break; case 6400: salt->salt_iter = ROUNDS_SHA256AIX; break; case 6500: salt->salt_iter = ROUNDS_SHA512AIX; break; case 6700: salt->salt_iter = ROUNDS_SHA1AIX; break; case 6600: salt->salt_iter = ROUNDS_AGILEKEY; break; case 6800: salt->salt_iter = ROUNDS_LASTPASS; break; case 7100: salt->salt_iter = ROUNDS_SHA512MACOS; break; case 7200: salt->salt_iter = ROUNDS_GRUB; break; case 7400: salt->salt_iter = ROUNDS_SHA256CRYPT; break; case 7900: salt->salt_iter = ROUNDS_DRUPAL7; break; case 8200: salt->salt_iter = ROUNDS_CLOUDKEY; break; case 8300: salt->salt_iter = ROUNDS_NSEC3; break; case 8800: salt->salt_iter = ROUNDS_ANDROIDFDE; break; case 8900: salt->salt_iter = 1; break; case 9000: salt->salt_iter = ROUNDS_PSAFE2; break; case 9100: salt->salt_iter = ROUNDS_LOTUS8; break; case 9200: salt->salt_iter = ROUNDS_CISCO8; break; case 9300: salt->salt_iter = 1; break; case 9400: salt->salt_iter = ROUNDS_OFFICE2007; break; case 9500: salt->salt_iter = ROUNDS_OFFICE2010; break; case 9600: salt->salt_iter = ROUNDS_OFFICE2013; break; case 10000: salt->salt_iter = ROUNDS_DJANGOPBKDF2; break; case 10300: salt->salt_iter = ROUNDS_SAPH_SHA1 - 1; break; case 10500: salt->salt_iter = ROUNDS_PDF14; break; case 10700: salt->salt_iter = ROUNDS_PDF17L8; break; case 10900: salt->salt_iter = ROUNDS_PBKDF2_SHA256 - 1; break; case 11300: salt->salt_iter = ROUNDS_BITCOIN_WALLET - 1; break; case 11600: salt->salt_iter = ROUNDS_SEVEN_ZIP; break; case 11900: salt->salt_iter = ROUNDS_PBKDF2_MD5 - 1; break; case 12000: salt->salt_iter = ROUNDS_PBKDF2_SHA1 - 1; break; case 12001: salt->salt_iter = ROUNDS_ATLASSIAN - 1; break; case 12100: salt->salt_iter = ROUNDS_PBKDF2_SHA512 - 1; break; case 12200: salt->salt_iter = ROUNDS_ECRYPTFS - 1; break; case 12300: salt->salt_iter = ROUNDS_ORACLET - 1; break; case 12400: salt->salt_iter = ROUNDS_BSDICRYPT - 1; break; case 12500: salt->salt_iter = ROUNDS_RAR3; break; case 12700: salt->salt_iter = ROUNDS_MYWALLET; break; case 12800: salt->salt_iter = ROUNDS_MS_DRSR - 1; break; case 12900: salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1; break; case 13000: salt->salt_iter = ROUNDS_RAR5 - 1; break; case 13200: salt->salt_iter = ROUNDS_AXCRYPT; break; case 13400: salt->salt_iter = ROUNDS_KEEPASS; break; case 13600: salt->salt_iter = ROUNDS_ZIP2; break; case 13711: salt->salt_iter = ROUNDS_VERACRYPT_655331; break; case 13712: salt->salt_iter = ROUNDS_VERACRYPT_655331; break; case 13713: salt->salt_iter = ROUNDS_VERACRYPT_655331; break; case 13721: salt->salt_iter = ROUNDS_VERACRYPT_500000; break; case 13722: salt->salt_iter = ROUNDS_VERACRYPT_500000; break; case 13723: salt->salt_iter = ROUNDS_VERACRYPT_500000; break; case 13731: salt->salt_iter = ROUNDS_VERACRYPT_500000; break; case 13732: salt->salt_iter = ROUNDS_VERACRYPT_500000; break; case 13733: salt->salt_iter = ROUNDS_VERACRYPT_500000; break; case 13741: salt->salt_iter = ROUNDS_VERACRYPT_327661; break; case 13742: salt->salt_iter = ROUNDS_VERACRYPT_327661; break; case 13743: salt->salt_iter = ROUNDS_VERACRYPT_327661; break; case 13751: salt->salt_iter = ROUNDS_VERACRYPT_500000; break; case 13752: salt->salt_iter = ROUNDS_VERACRYPT_500000; break; case 13753: salt->salt_iter = ROUNDS_VERACRYPT_500000; break; case 13761: salt->salt_iter = ROUNDS_VERACRYPT_200000; break; case 13762: salt->salt_iter = ROUNDS_VERACRYPT_200000; break; case 13763: salt->salt_iter = ROUNDS_VERACRYPT_200000; break; case 14600: salt->salt_iter = ROUNDS_LUKS; break; case 14700: salt->salt_iter = ROUNDS_ITUNES9_BACKUP - 1; break; case 14800: salt->salt_iter = ROUNDS_ITUNES101_BACKUP - 1; salt->salt_iter2 = ROUNDS_ITUNES102_BACKUP - 1; break; case 15100: salt->salt_iter = ROUNDS_NETBSD_SHA1CRYPT - 1; break; case 15200: salt->salt_iter = ROUNDS_MYWALLETV2; break; case 15300: salt->salt_iter = ROUNDS_DPAPIMK_V1; break; case 15600: salt->salt_iter = ROUNDS_ETHEREUM_PBKDF2; break; case 15700: salt->salt_iter = 1; break; case 15900: salt->salt_iter = ROUNDS_DPAPIMK_V2; break; } } const char *hashconfig_benchmark_mask (hashcat_ctx_t *hashcat_ctx) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const char *mask = NULL; switch (hashconfig->hash_mode) { case 2500: mask = "?a?a?a?a?a?a?a?a"; break; case 2501: mask = "?a?a?a?a?a?a?a?axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; break; case 9710: mask = "?b?b?b?b?b"; break; case 9810: mask = "?b?b?b?b?b"; break; case 10410: mask = "?b?b?b?b?b"; break; case 12500: mask = "?b?b?b?b?b"; break; case 14000: mask = "?b?b?b?b?b?b?bx"; break; case 14100: mask = "?b?b?b?b?b?b?bxxxxxxxxxxxxxxxxx"; break; case 14900: mask = "?b?b?b?b?bxxxxx"; break; default: mask = "?b?b?b?b?b?b?b"; break; } return mask; } hashcat-4.0.1/src/locking.c000066400000000000000000000016111320027462700155120ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "event.h" #include "locking.h" #if defined (F_SETLKW) int lock_file (FILE *fp) { struct flock lock; memset (&lock, 0, sizeof (struct flock)); lock.l_type = F_WRLCK; /* Needs this loop because a signal may interrupt a wait for lock */ while (fcntl (fileno (fp), F_SETLKW, &lock)) { if (errno != EINTR) return -1; } return 0; } int unlock_file (FILE *fp) { struct flock lock; memset (&lock, 0, sizeof (struct flock)); lock.l_type = F_UNLCK; if (fcntl (fileno (fp), F_SETLK, &lock)) { return -1; } return 0; } #else int lock_file (MAYBE_UNUSED FILE *fp) { // we should put windows specific code here return 0; } int unlock_file (MAYBE_UNUSED FILE *fp) { // we should put windows specific code here return 0; } #endif // F_SETLKW hashcat-4.0.1/src/logfile.c000066400000000000000000000042341320027462700155110ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "logfile.h" #include "locking.h" #include "shared.h" void logfile_generate_topid (hashcat_ctx_t *hashcat_ctx) { logfile_ctx_t *logfile_ctx = hashcat_ctx->logfile_ctx; if (logfile_ctx->enabled == false) return; struct timeval v; gettimeofday (&v, NULL); snprintf (logfile_ctx->topid, 40, "TOP.%08x.%08x", (u32) v.tv_sec, (u32) v.tv_usec); } void logfile_generate_subid (hashcat_ctx_t *hashcat_ctx) { logfile_ctx_t *logfile_ctx = hashcat_ctx->logfile_ctx; if (logfile_ctx->enabled == false) return; struct timeval v; gettimeofday (&v, NULL); snprintf (logfile_ctx->subid, 40, "SUB.%08x.%08x", (u32) v.tv_sec, (u32) v.tv_usec); } void logfile_append (hashcat_ctx_t *hashcat_ctx, const char *fmt, ...) { logfile_ctx_t *logfile_ctx = hashcat_ctx->logfile_ctx; if (logfile_ctx->enabled == false) return; FILE *fp = fopen (logfile_ctx->logfile, "ab"); if (fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", logfile_ctx->logfile, strerror (errno)); return; } lock_file (fp); va_list ap; va_start (ap, fmt); vfprintf (fp, fmt, ap); va_end (ap); hc_fwrite (EOL, strlen (EOL), 1, fp); fflush (fp); fclose (fp); } int logfile_init (hashcat_ctx_t *hashcat_ctx) { folder_config_t *folder_config = hashcat_ctx->folder_config; logfile_ctx_t *logfile_ctx = hashcat_ctx->logfile_ctx; user_options_t *user_options = hashcat_ctx->user_options; if (user_options->logfile_disable == true) return 0; hc_asprintf (&logfile_ctx->logfile, "%s/%s.log", folder_config->session_dir, user_options->session); logfile_ctx->subid = (char *) hcmalloc (HCBUFSIZ_TINY); logfile_ctx->topid = (char *) hcmalloc (HCBUFSIZ_TINY); logfile_ctx->enabled = true; return 0; } void logfile_destroy (hashcat_ctx_t *hashcat_ctx) { logfile_ctx_t *logfile_ctx = hashcat_ctx->logfile_ctx; if (logfile_ctx->enabled == false) return; hcfree (logfile_ctx->logfile); hcfree (logfile_ctx->topid); hcfree (logfile_ctx->subid); memset (logfile_ctx, 0, sizeof (logfile_ctx_t)); } hashcat-4.0.1/src/loopback.c000066400000000000000000000076111320027462700156640ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "shared.h" #include "loopback.h" #include "locking.h" static void loopback_format_plain (hashcat_ctx_t *hashcat_ctx, const u8 *plain_ptr, const unsigned int plain_len) { loopback_ctx_t *loopback_ctx = hashcat_ctx->loopback_ctx; if (loopback_ctx->enabled == false) return; int needs_hexify = 0; for (u32 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 (loopback_ctx->fp, "$HEX["); for (u32 i = 0; i < plain_len; i++) { fprintf (loopback_ctx->fp, "%02x", plain_ptr[i]); } fprintf (loopback_ctx->fp, "]"); } else { hc_fwrite (plain_ptr, plain_len, 1, loopback_ctx->fp); } } int loopback_init (hashcat_ctx_t *hashcat_ctx) { loopback_ctx_t *loopback_ctx = hashcat_ctx->loopback_ctx; user_options_t *user_options = hashcat_ctx->user_options; loopback_ctx->enabled = false; if (user_options->benchmark == true) return 0; if (user_options->example_hashes == true) return 0; if (user_options->keyspace == true) return 0; if (user_options->left == true) return 0; if (user_options->opencl_info == true) return 0; if (user_options->show == true) return 0; if (user_options->stdout_flag == true) return 0; if (user_options->speed_only == true) return 0; if (user_options->progress_only == true) return 0; if (user_options->usage == true) return 0; if (user_options->version == true) return 0; loopback_ctx->enabled = true; loopback_ctx->fp = NULL; loopback_ctx->filename = (char *) hcmalloc (HCBUFSIZ_TINY); return 0; } void loopback_destroy (hashcat_ctx_t *hashcat_ctx) { loopback_ctx_t *loopback_ctx = hashcat_ctx->loopback_ctx; if (loopback_ctx->enabled == false) return; memset (loopback_ctx, 0, sizeof (loopback_ctx_t)); } int loopback_write_open (hashcat_ctx_t *hashcat_ctx) { induct_ctx_t *induct_ctx = hashcat_ctx->induct_ctx; loopback_ctx_t *loopback_ctx = hashcat_ctx->loopback_ctx; if (loopback_ctx->enabled == false) return 0; if (induct_ctx->enabled == false) return 0; hc_time_t now; hc_time (&now); const u32 random_num = get_random_num (0, 9999); hc_asprintf (&loopback_ctx->filename, "%s/%s.%d_%u", induct_ctx->root_directory, LOOPBACK_FILE, (int) now, random_num); FILE *fp = fopen (loopback_ctx->filename, "ab"); if (fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", loopback_ctx->filename, strerror (errno)); return -1; } loopback_ctx->fp = fp; loopback_ctx->unused = true; return 0; } void loopback_write_unlink (hashcat_ctx_t *hashcat_ctx) { loopback_ctx_t *loopback_ctx = hashcat_ctx->loopback_ctx; if (loopback_ctx->enabled == false) return; if (loopback_ctx->filename == NULL) return; unlink (loopback_ctx->filename); } void loopback_write_close (hashcat_ctx_t *hashcat_ctx) { loopback_ctx_t *loopback_ctx = hashcat_ctx->loopback_ctx; if (loopback_ctx->enabled == false) return; if (loopback_ctx->fp == NULL) return; fclose (loopback_ctx->fp); if (loopback_ctx->unused == true) { loopback_write_unlink (hashcat_ctx); } } void loopback_write_append (hashcat_ctx_t *hashcat_ctx, const u8 *plain_ptr, const unsigned int plain_len) { loopback_ctx_t *loopback_ctx = hashcat_ctx->loopback_ctx; if (loopback_ctx->enabled == false) return; FILE *fp = loopback_ctx->fp; loopback_format_plain (hashcat_ctx, plain_ptr, plain_len); lock_file (fp); hc_fwrite (EOL, strlen (EOL), 1, fp); fflush (fp); if (unlock_file (fp)) { event_log_error (hashcat_ctx, "%s: Failed to unlock file", loopback_ctx->filename); } loopback_ctx->unused = false; } hashcat-4.0.1/src/lzma_sdk/000077500000000000000000000000001320027462700155255ustar00rootroot00000000000000hashcat-4.0.1/src/lzma_sdk/Alloc.c000066400000000000000000000060761320027462700167340ustar00rootroot00000000000000/* Alloc.c -- Memory allocation functions 2015-02-21 : Igor Pavlov : Public domain */ #include "Precomp.h" #ifdef _WIN32 #include #endif #include #include "Alloc.h" /* #define _SZ_ALLOC_DEBUG */ /* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ #ifdef _SZ_ALLOC_DEBUG #include int g_allocCount = 0; int g_allocCountMid = 0; int g_allocCountBig = 0; #endif void *MyAlloc(size_t size) { if (size == 0) return 0; #ifdef _SZ_ALLOC_DEBUG { void *p = malloc(size); fprintf(stderr, "\nAlloc %10d bytes, count = %10d, addr = %8X", size, g_allocCount++, (unsigned)p); return p; } #else return malloc(size); #endif } void MyFree(void *address) { #ifdef _SZ_ALLOC_DEBUG if (address != 0) fprintf(stderr, "\nFree; count = %10d, addr = %8X", --g_allocCount, (unsigned)address); #endif free(address); } #ifdef _WIN32 void *MidAlloc(size_t size) { if (size == 0) return 0; #ifdef _SZ_ALLOC_DEBUG fprintf(stderr, "\nAlloc_Mid %10d bytes; count = %10d", size, g_allocCountMid++); #endif return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); } void MidFree(void *address) { #ifdef _SZ_ALLOC_DEBUG if (address != 0) fprintf(stderr, "\nFree_Mid; count = %10d", --g_allocCountMid); #endif if (address == 0) return; VirtualFree(address, 0, MEM_RELEASE); } #ifndef MEM_LARGE_PAGES #undef _7ZIP_LARGE_PAGES #endif #ifdef _7ZIP_LARGE_PAGES SIZE_T g_LargePageSize = 0; typedef SIZE_T (WINAPI *GetLargePageMinimumP)(); #endif void SetLargePageSize() { #ifdef _7ZIP_LARGE_PAGES SIZE_T size = 0; GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum"); if (largePageMinimum == 0) return; size = largePageMinimum(); if (size == 0 || (size & (size - 1)) != 0) return; g_LargePageSize = size; #endif } void *BigAlloc(size_t size) { if (size == 0) return 0; #ifdef _SZ_ALLOC_DEBUG fprintf(stderr, "\nAlloc_Big %10d bytes; count = %10d", size, g_allocCountBig++); #endif #ifdef _7ZIP_LARGE_PAGES if (g_LargePageSize != 0 && g_LargePageSize <= (1 << 30) && size >= (1 << 18)) { void *res = VirtualAlloc(0, (size + g_LargePageSize - 1) & (~(g_LargePageSize - 1)), MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE); if (res != 0) return res; } #endif return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); } void BigFree(void *address) { #ifdef _SZ_ALLOC_DEBUG if (address != 0) fprintf(stderr, "\nFree_Big; count = %10d", --g_allocCountBig); #endif if (address == 0) return; VirtualFree(address, 0, MEM_RELEASE); } #endif static void *SzAlloc(void *p, size_t size) { UNUSED_VAR(p); return MyAlloc(size); } static void SzFree(void *p, void *address) { UNUSED_VAR(p); MyFree(address); } ISzAlloc g_Alloc = { SzAlloc, SzFree }; static void *SzBigAlloc(void *p, size_t size) { UNUSED_VAR(p); return BigAlloc(size); } static void SzBigFree(void *p, void *address) { UNUSED_VAR(p); BigFree(address); } ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree }; hashcat-4.0.1/src/lzma_sdk/Lzma2Dec.c000066400000000000000000000241371320027462700173010ustar00rootroot00000000000000/* Lzma2Dec.c -- LZMA2 Decoder 2015-11-09 : Igor Pavlov : Public domain */ /* #define SHOW_DEBUG_INFO */ #include "Precomp.h" #ifdef SHOW_DEBUG_INFO #include #endif #include #include "Lzma2Dec.h" /* 00000000 - EOS 00000001 U U - Uncompressed Reset Dic 00000010 U U - Uncompressed No Reset 100uuuuu U U P P - LZMA no reset 101uuuuu U U P P - LZMA reset state 110uuuuu U U P P S - LZMA reset state + new prop 111uuuuu U U P P S - LZMA reset state + new prop + reset dic u, U - Unpack Size P - Pack Size S - Props */ #define LZMA2_CONTROL_LZMA (1 << 7) #define LZMA2_CONTROL_COPY_NO_RESET 2 #define LZMA2_CONTROL_COPY_RESET_DIC 1 #define LZMA2_CONTROL_EOF 0 #define LZMA2_IS_UNCOMPRESSED_STATE(p) (((p)->control & LZMA2_CONTROL_LZMA) == 0) #define LZMA2_GET_LZMA_MODE(p) (((p)->control >> 5) & 3) #define LZMA2_IS_THERE_PROP(mode) ((mode) >= 2) #define LZMA2_LCLP_MAX 4 #define LZMA2_DIC_SIZE_FROM_PROP(p) (((UInt32)2 | ((p) & 1)) << ((p) / 2 + 11)) #ifdef SHOW_DEBUG_INFO #define PRF(x) x #else #define PRF(x) #endif typedef enum { LZMA2_STATE_CONTROL, LZMA2_STATE_UNPACK0, LZMA2_STATE_UNPACK1, LZMA2_STATE_PACK0, LZMA2_STATE_PACK1, LZMA2_STATE_PROP, LZMA2_STATE_DATA, LZMA2_STATE_DATA_CONT, LZMA2_STATE_FINISHED, LZMA2_STATE_ERROR } ELzma2State; static SRes Lzma2Dec_GetOldProps(Byte prop, Byte *props) { UInt32 dicSize; if (prop > 40) return SZ_ERROR_UNSUPPORTED; dicSize = (prop == 40) ? 0xFFFFFFFF : LZMA2_DIC_SIZE_FROM_PROP(prop); props[0] = (Byte)LZMA2_LCLP_MAX; props[1] = (Byte)(dicSize); props[2] = (Byte)(dicSize >> 8); props[3] = (Byte)(dicSize >> 16); props[4] = (Byte)(dicSize >> 24); return SZ_OK; } SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAlloc *alloc) { Byte props[LZMA_PROPS_SIZE]; RINOK(Lzma2Dec_GetOldProps(prop, props)); return LzmaDec_AllocateProbs(&p->decoder, props, LZMA_PROPS_SIZE, alloc); } SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAlloc *alloc) { Byte props[LZMA_PROPS_SIZE]; RINOK(Lzma2Dec_GetOldProps(prop, props)); return LzmaDec_Allocate(&p->decoder, props, LZMA_PROPS_SIZE, alloc); } void Lzma2Dec_Init(CLzma2Dec *p) { p->state = LZMA2_STATE_CONTROL; p->needInitDic = True; p->needInitState = True; p->needInitProp = True; LzmaDec_Init(&p->decoder); } static ELzma2State Lzma2Dec_UpdateState(CLzma2Dec *p, Byte b) { switch (p->state) { case LZMA2_STATE_CONTROL: p->control = b; PRF(printf("\n %4X ", (unsigned)p->decoder.dicPos)); PRF(printf(" %2X", (unsigned)b)); if (p->control == 0) return LZMA2_STATE_FINISHED; if (LZMA2_IS_UNCOMPRESSED_STATE(p)) { if ((p->control & 0x7F) > 2) return LZMA2_STATE_ERROR; p->unpackSize = 0; } else p->unpackSize = (UInt32)(p->control & 0x1F) << 16; return LZMA2_STATE_UNPACK0; case LZMA2_STATE_UNPACK0: p->unpackSize |= (UInt32)b << 8; return LZMA2_STATE_UNPACK1; case LZMA2_STATE_UNPACK1: p->unpackSize |= (UInt32)b; p->unpackSize++; PRF(printf(" %8u", (unsigned)p->unpackSize)); return (LZMA2_IS_UNCOMPRESSED_STATE(p)) ? LZMA2_STATE_DATA : LZMA2_STATE_PACK0; case LZMA2_STATE_PACK0: p->packSize = (UInt32)b << 8; return LZMA2_STATE_PACK1; case LZMA2_STATE_PACK1: p->packSize |= (UInt32)b; p->packSize++; PRF(printf(" %8u", (unsigned)p->packSize)); return LZMA2_IS_THERE_PROP(LZMA2_GET_LZMA_MODE(p)) ? LZMA2_STATE_PROP: (p->needInitProp ? LZMA2_STATE_ERROR : LZMA2_STATE_DATA); case LZMA2_STATE_PROP: { unsigned lc, lp; if (b >= (9 * 5 * 5)) return LZMA2_STATE_ERROR; lc = b % 9; b /= 9; p->decoder.prop.pb = b / 5; lp = b % 5; if (lc + lp > LZMA2_LCLP_MAX) return LZMA2_STATE_ERROR; p->decoder.prop.lc = lc; p->decoder.prop.lp = lp; p->needInitProp = False; return LZMA2_STATE_DATA; } } return LZMA2_STATE_ERROR; } static void LzmaDec_UpdateWithUncompressed(CLzmaDec *p, const Byte *src, SizeT size) { memcpy(p->dic + p->dicPos, src, size); p->dicPos += size; if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= size) p->checkDicSize = p->prop.dicSize; p->processedPos += (UInt32)size; } void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState); SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) { SizeT inSize = *srcLen; *srcLen = 0; *status = LZMA_STATUS_NOT_SPECIFIED; while (p->state != LZMA2_STATE_FINISHED) { SizeT dicPos = p->decoder.dicPos; if (p->state == LZMA2_STATE_ERROR) return SZ_ERROR_DATA; if (dicPos == dicLimit && finishMode == LZMA_FINISH_ANY) { *status = LZMA_STATUS_NOT_FINISHED; return SZ_OK; } if (p->state != LZMA2_STATE_DATA && p->state != LZMA2_STATE_DATA_CONT) { if (*srcLen == inSize) { *status = LZMA_STATUS_NEEDS_MORE_INPUT; return SZ_OK; } (*srcLen)++; p->state = Lzma2Dec_UpdateState(p, *src++); if (dicPos == dicLimit && p->state != LZMA2_STATE_FINISHED) { p->state = LZMA2_STATE_ERROR; return SZ_ERROR_DATA; } continue; } { SizeT destSizeCur = dicLimit - dicPos; SizeT srcSizeCur = inSize - *srcLen; ELzmaFinishMode curFinishMode = LZMA_FINISH_ANY; if (p->unpackSize <= destSizeCur) { destSizeCur = (SizeT)p->unpackSize; curFinishMode = LZMA_FINISH_END; } if (LZMA2_IS_UNCOMPRESSED_STATE(p)) { if (*srcLen == inSize) { *status = LZMA_STATUS_NEEDS_MORE_INPUT; return SZ_OK; } if (p->state == LZMA2_STATE_DATA) { Bool initDic = (p->control == LZMA2_CONTROL_COPY_RESET_DIC); if (initDic) p->needInitProp = p->needInitState = True; else if (p->needInitDic) { p->state = LZMA2_STATE_ERROR; return SZ_ERROR_DATA; } p->needInitDic = False; LzmaDec_InitDicAndState(&p->decoder, initDic, False); } if (srcSizeCur > destSizeCur) srcSizeCur = destSizeCur; if (srcSizeCur == 0) { p->state = LZMA2_STATE_ERROR; return SZ_ERROR_DATA; } LzmaDec_UpdateWithUncompressed(&p->decoder, src, srcSizeCur); src += srcSizeCur; *srcLen += srcSizeCur; p->unpackSize -= (UInt32)srcSizeCur; p->state = (p->unpackSize == 0) ? LZMA2_STATE_CONTROL : LZMA2_STATE_DATA_CONT; } else { SizeT outSizeProcessed; SRes res; if (p->state == LZMA2_STATE_DATA) { unsigned mode = LZMA2_GET_LZMA_MODE(p); Bool initDic = (mode == 3); Bool initState = (mode != 0); if ((!initDic && p->needInitDic) || (!initState && p->needInitState)) { p->state = LZMA2_STATE_ERROR; return SZ_ERROR_DATA; } LzmaDec_InitDicAndState(&p->decoder, initDic, initState); p->needInitDic = False; p->needInitState = False; p->state = LZMA2_STATE_DATA_CONT; } if (srcSizeCur > p->packSize) srcSizeCur = (SizeT)p->packSize; res = LzmaDec_DecodeToDic(&p->decoder, dicPos + destSizeCur, src, &srcSizeCur, curFinishMode, status); src += srcSizeCur; *srcLen += srcSizeCur; p->packSize -= (UInt32)srcSizeCur; outSizeProcessed = p->decoder.dicPos - dicPos; p->unpackSize -= (UInt32)outSizeProcessed; RINOK(res); if (*status == LZMA_STATUS_NEEDS_MORE_INPUT) return res; if (srcSizeCur == 0 && outSizeProcessed == 0) { if (*status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK || p->unpackSize != 0 || p->packSize != 0) { p->state = LZMA2_STATE_ERROR; return SZ_ERROR_DATA; } p->state = LZMA2_STATE_CONTROL; } if (*status == LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK) *status = LZMA_STATUS_NOT_FINISHED; } } } *status = LZMA_STATUS_FINISHED_WITH_MARK; return SZ_OK; } SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) { SizeT outSize = *destLen, inSize = *srcLen; *srcLen = *destLen = 0; for (;;) { SizeT srcSizeCur = inSize, outSizeCur, dicPos; ELzmaFinishMode curFinishMode; SRes res; if (p->decoder.dicPos == p->decoder.dicBufSize) p->decoder.dicPos = 0; dicPos = p->decoder.dicPos; if (outSize > p->decoder.dicBufSize - dicPos) { outSizeCur = p->decoder.dicBufSize; curFinishMode = LZMA_FINISH_ANY; } else { outSizeCur = dicPos + outSize; curFinishMode = finishMode; } res = Lzma2Dec_DecodeToDic(p, outSizeCur, src, &srcSizeCur, curFinishMode, status); src += srcSizeCur; inSize -= srcSizeCur; *srcLen += srcSizeCur; outSizeCur = p->decoder.dicPos - dicPos; memcpy(dest, p->decoder.dic + dicPos, outSizeCur); dest += outSizeCur; outSize -= outSizeCur; *destLen += outSizeCur; if (res != 0) return res; if (outSizeCur == 0 || outSize == 0) return SZ_OK; } } SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAlloc *alloc) { CLzma2Dec p; SRes res; SizeT outSize = *destLen, inSize = *srcLen; *destLen = *srcLen = 0; *status = LZMA_STATUS_NOT_SPECIFIED; Lzma2Dec_Construct(&p); RINOK(Lzma2Dec_AllocateProbs(&p, prop, alloc)); p.decoder.dic = dest; p.decoder.dicBufSize = outSize; Lzma2Dec_Init(&p); *srcLen = inSize; res = Lzma2Dec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); *destLen = p.decoder.dicPos; if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) res = SZ_ERROR_INPUT_EOF; Lzma2Dec_FreeProbs(&p, alloc); return res; } hashcat-4.0.1/src/lzma_sdk/LzmaDec.c000066400000000000000000000721271320027462700172210ustar00rootroot00000000000000/* LzmaDec.c -- LZMA Decoder 2016-05-16 : Igor Pavlov : Public domain */ #include "Precomp.h" #include "LzmaDec.h" #include #define kNumTopBits 24 #define kTopValue ((UInt32)1 << kNumTopBits) #define kNumBitModelTotalBits 11 #define kBitModelTotal (1 << kNumBitModelTotalBits) #define kNumMoveBits 5 #define RC_INIT_SIZE 5 #define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); } #define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) #define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); #define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); #define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \ { UPDATE_0(p); i = (i + i); A0; } else \ { UPDATE_1(p); i = (i + i) + 1; A1; } #define GET_BIT(p, i) GET_BIT2(p, i, ; , ;) #define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); } #define TREE_DECODE(probs, limit, i) \ { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; } /* #define _LZMA_SIZE_OPT */ #ifdef _LZMA_SIZE_OPT #define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i) #else #define TREE_6_DECODE(probs, i) \ { i = 1; \ TREE_GET_BIT(probs, i); \ TREE_GET_BIT(probs, i); \ TREE_GET_BIT(probs, i); \ TREE_GET_BIT(probs, i); \ TREE_GET_BIT(probs, i); \ TREE_GET_BIT(probs, i); \ i -= 0x40; } #endif #define NORMAL_LITER_DEC GET_BIT(prob + symbol, symbol) #define MATCHED_LITER_DEC \ matchByte <<= 1; \ bit = (matchByte & offs); \ probLit = prob + offs + bit + symbol; \ GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit) #define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); } #define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) #define UPDATE_0_CHECK range = bound; #define UPDATE_1_CHECK range -= bound; code -= bound; #define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \ { UPDATE_0_CHECK; i = (i + i); A0; } else \ { UPDATE_1_CHECK; i = (i + i) + 1; A1; } #define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;) #define TREE_DECODE_CHECK(probs, limit, i) \ { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; } #define kNumPosBitsMax 4 #define kNumPosStatesMax (1 << kNumPosBitsMax) #define kLenNumLowBits 3 #define kLenNumLowSymbols (1 << kLenNumLowBits) #define kLenNumMidBits 3 #define kLenNumMidSymbols (1 << kLenNumMidBits) #define kLenNumHighBits 8 #define kLenNumHighSymbols (1 << kLenNumHighBits) #define LenChoice 0 #define LenChoice2 (LenChoice + 1) #define LenLow (LenChoice2 + 1) #define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) #define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) #define kNumLenProbs (LenHigh + kLenNumHighSymbols) #define kNumStates 12 #define kNumLitStates 7 #define kStartPosModelIndex 4 #define kEndPosModelIndex 14 #define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) #define kNumPosSlotBits 6 #define kNumLenToPosStates 4 #define kNumAlignBits 4 #define kAlignTableSize (1 << kNumAlignBits) #define kMatchMinLen 2 #define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) #define IsMatch 0 #define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) #define IsRepG0 (IsRep + kNumStates) #define IsRepG1 (IsRepG0 + kNumStates) #define IsRepG2 (IsRepG1 + kNumStates) #define IsRep0Long (IsRepG2 + kNumStates) #define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) #define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) #define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) #define LenCoder (Align + kAlignTableSize) #define RepLenCoder (LenCoder + kNumLenProbs) #define Literal (RepLenCoder + kNumLenProbs) #define LZMA_BASE_SIZE 1846 #define LZMA_LIT_SIZE 0x300 #if Literal != LZMA_BASE_SIZE StopCompilingDueBUG #endif #define LzmaProps_GetNumProbs(p) (Literal + ((UInt32)LZMA_LIT_SIZE << ((p)->lc + (p)->lp))) #define LZMA_DIC_MIN (1 << 12) /* First LZMA-symbol is always decoded. And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization Out: Result: SZ_OK - OK SZ_ERROR_DATA - Error p->remainLen: < kMatchSpecLenStart : normal remain = kMatchSpecLenStart : finished = kMatchSpecLenStart + 1 : Flush marker (unused now) = kMatchSpecLenStart + 2 : State Init Marker (unused now) */ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit) { CLzmaProb *probs = p->probs; unsigned state = p->state; UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3]; unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1; unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1; unsigned lc = p->prop.lc; Byte *dic = p->dic; SizeT dicBufSize = p->dicBufSize; SizeT dicPos = p->dicPos; UInt32 processedPos = p->processedPos; UInt32 checkDicSize = p->checkDicSize; unsigned len = 0; const Byte *buf = p->buf; UInt32 range = p->range; UInt32 code = p->code; do { CLzmaProb *prob; UInt32 bound; unsigned ttt; unsigned posState = processedPos & pbMask; prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; IF_BIT_0(prob) { unsigned symbol; UPDATE_0(prob); prob = probs + Literal; if (processedPos != 0 || checkDicSize != 0) prob += ((UInt32)LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) + (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc)))); processedPos++; if (state < kNumLitStates) { state -= (state < 4) ? state : 3; symbol = 1; #ifdef _LZMA_SIZE_OPT do { NORMAL_LITER_DEC } while (symbol < 0x100); #else NORMAL_LITER_DEC NORMAL_LITER_DEC NORMAL_LITER_DEC NORMAL_LITER_DEC NORMAL_LITER_DEC NORMAL_LITER_DEC NORMAL_LITER_DEC NORMAL_LITER_DEC #endif } else { unsigned matchByte = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; unsigned offs = 0x100; state -= (state < 10) ? 3 : 6; symbol = 1; #ifdef _LZMA_SIZE_OPT do { unsigned bit; CLzmaProb *probLit; MATCHED_LITER_DEC } while (symbol < 0x100); #else { unsigned bit; CLzmaProb *probLit; MATCHED_LITER_DEC MATCHED_LITER_DEC MATCHED_LITER_DEC MATCHED_LITER_DEC MATCHED_LITER_DEC MATCHED_LITER_DEC MATCHED_LITER_DEC MATCHED_LITER_DEC } #endif } dic[dicPos++] = (Byte)symbol; continue; } { UPDATE_1(prob); prob = probs + IsRep + state; IF_BIT_0(prob) { UPDATE_0(prob); state += kNumStates; prob = probs + LenCoder; } else { UPDATE_1(prob); if (checkDicSize == 0 && processedPos == 0) return SZ_ERROR_DATA; prob = probs + IsRepG0 + state; IF_BIT_0(prob) { UPDATE_0(prob); prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; IF_BIT_0(prob) { UPDATE_0(prob); dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; dicPos++; processedPos++; state = state < kNumLitStates ? 9 : 11; continue; } UPDATE_1(prob); } else { UInt32 distance; UPDATE_1(prob); prob = probs + IsRepG1 + state; IF_BIT_0(prob) { UPDATE_0(prob); distance = rep1; } else { UPDATE_1(prob); prob = probs + IsRepG2 + state; IF_BIT_0(prob) { UPDATE_0(prob); distance = rep2; } else { UPDATE_1(prob); distance = rep3; rep3 = rep2; } rep2 = rep1; } rep1 = rep0; rep0 = distance; } state = state < kNumLitStates ? 8 : 11; prob = probs + RepLenCoder; } #ifdef _LZMA_SIZE_OPT { unsigned lim, offset; CLzmaProb *probLen = prob + LenChoice; IF_BIT_0(probLen) { UPDATE_0(probLen); probLen = prob + LenLow + (posState << kLenNumLowBits); offset = 0; lim = (1 << kLenNumLowBits); } else { UPDATE_1(probLen); probLen = prob + LenChoice2; IF_BIT_0(probLen) { UPDATE_0(probLen); probLen = prob + LenMid + (posState << kLenNumMidBits); offset = kLenNumLowSymbols; lim = (1 << kLenNumMidBits); } else { UPDATE_1(probLen); probLen = prob + LenHigh; offset = kLenNumLowSymbols + kLenNumMidSymbols; lim = (1 << kLenNumHighBits); } } TREE_DECODE(probLen, lim, len); len += offset; } #else { CLzmaProb *probLen = prob + LenChoice; IF_BIT_0(probLen) { UPDATE_0(probLen); probLen = prob + LenLow + (posState << kLenNumLowBits); len = 1; TREE_GET_BIT(probLen, len); TREE_GET_BIT(probLen, len); TREE_GET_BIT(probLen, len); len -= 8; } else { UPDATE_1(probLen); probLen = prob + LenChoice2; IF_BIT_0(probLen) { UPDATE_0(probLen); probLen = prob + LenMid + (posState << kLenNumMidBits); len = 1; TREE_GET_BIT(probLen, len); TREE_GET_BIT(probLen, len); TREE_GET_BIT(probLen, len); } else { UPDATE_1(probLen); probLen = prob + LenHigh; TREE_DECODE(probLen, (1 << kLenNumHighBits), len); len += kLenNumLowSymbols + kLenNumMidSymbols; } } } #endif if (state >= kNumStates) { UInt32 distance; prob = probs + PosSlot + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); TREE_6_DECODE(prob, distance); if (distance >= kStartPosModelIndex) { unsigned posSlot = (unsigned)distance; unsigned numDirectBits = (unsigned)(((distance >> 1) - 1)); distance = (2 | (distance & 1)); if (posSlot < kEndPosModelIndex) { distance <<= numDirectBits; prob = probs + SpecPos + distance - posSlot - 1; { UInt32 mask = 1; unsigned i = 1; do { GET_BIT2(prob + i, i, ; , distance |= mask); mask <<= 1; } while (--numDirectBits != 0); } } else { numDirectBits -= kNumAlignBits; do { NORMALIZE range >>= 1; { UInt32 t; code -= range; t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */ distance = (distance << 1) + (t + 1); code += range & t; } /* distance <<= 1; if (code >= range) { code -= range; distance |= 1; } */ } while (--numDirectBits != 0); prob = probs + Align; distance <<= kNumAlignBits; { unsigned i = 1; GET_BIT2(prob + i, i, ; , distance |= 1); GET_BIT2(prob + i, i, ; , distance |= 2); GET_BIT2(prob + i, i, ; , distance |= 4); GET_BIT2(prob + i, i, ; , distance |= 8); } if (distance == (UInt32)0xFFFFFFFF) { len += kMatchSpecLenStart; state -= kNumStates; break; } } } rep3 = rep2; rep2 = rep1; rep1 = rep0; rep0 = distance + 1; if (checkDicSize == 0) { if (distance >= processedPos) { p->dicPos = dicPos; return SZ_ERROR_DATA; } } else if (distance >= checkDicSize) { p->dicPos = dicPos; return SZ_ERROR_DATA; } state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3; } len += kMatchMinLen; { SizeT rem; unsigned curLen; SizeT pos; if ((rem = limit - dicPos) == 0) { p->dicPos = dicPos; return SZ_ERROR_DATA; } curLen = ((rem < len) ? (unsigned)rem : len); pos = dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0); processedPos += curLen; len -= curLen; if (curLen <= dicBufSize - pos) { Byte *dest = dic + dicPos; ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos; const Byte *lim = dest + curLen; dicPos += curLen; do *(dest) = (Byte)*(dest + src); while (++dest != lim); } else { do { dic[dicPos++] = dic[pos]; if (++pos == dicBufSize) pos = 0; } while (--curLen != 0); } } } } while (dicPos < limit && buf < bufLimit); NORMALIZE; p->buf = buf; p->range = range; p->code = code; p->remainLen = len; p->dicPos = dicPos; p->processedPos = processedPos; p->reps[0] = rep0; p->reps[1] = rep1; p->reps[2] = rep2; p->reps[3] = rep3; p->state = state; return SZ_OK; } static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) { if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart) { Byte *dic = p->dic; SizeT dicPos = p->dicPos; SizeT dicBufSize = p->dicBufSize; unsigned len = p->remainLen; SizeT rep0 = p->reps[0]; /* we use SizeT to avoid the BUG of VC14 for AMD64 */ SizeT rem = limit - dicPos; if (rem < len) len = (unsigned)(rem); if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len) p->checkDicSize = p->prop.dicSize; p->processedPos += len; p->remainLen -= len; while (len != 0) { len--; dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; dicPos++; } p->dicPos = dicPos; } } static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit) { do { SizeT limit2 = limit; if (p->checkDicSize == 0) { UInt32 rem = p->prop.dicSize - p->processedPos; if (limit - p->dicPos > rem) limit2 = p->dicPos + rem; } RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit)); if (p->checkDicSize == 0 && p->processedPos >= p->prop.dicSize) p->checkDicSize = p->prop.dicSize; LzmaDec_WriteRem(p, limit); } while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart); if (p->remainLen > kMatchSpecLenStart) p->remainLen = kMatchSpecLenStart; return 0; } typedef enum { DUMMY_ERROR, /* unexpected end of input stream */ DUMMY_LIT, DUMMY_MATCH, DUMMY_REP } ELzmaDummy; static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize) { UInt32 range = p->range; UInt32 code = p->code; const Byte *bufLimit = buf + inSize; const CLzmaProb *probs = p->probs; unsigned state = p->state; ELzmaDummy res; { const CLzmaProb *prob; UInt32 bound; unsigned ttt; unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1); prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; IF_BIT_0_CHECK(prob) { UPDATE_0_CHECK /* if (bufLimit - buf >= 7) return DUMMY_LIT; */ prob = probs + Literal; if (p->checkDicSize != 0 || p->processedPos != 0) prob += ((UInt32)LZMA_LIT_SIZE * ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) + (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc)))); if (state < kNumLitStates) { unsigned symbol = 1; do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100); } else { unsigned matchByte = p->dic[p->dicPos - p->reps[0] + (p->dicPos < p->reps[0] ? p->dicBufSize : 0)]; unsigned offs = 0x100; unsigned symbol = 1; do { unsigned bit; const CLzmaProb *probLit; matchByte <<= 1; bit = (matchByte & offs); probLit = prob + offs + bit + symbol; GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit) } while (symbol < 0x100); } res = DUMMY_LIT; } else { unsigned len; UPDATE_1_CHECK; prob = probs + IsRep + state; IF_BIT_0_CHECK(prob) { UPDATE_0_CHECK; state = 0; prob = probs + LenCoder; res = DUMMY_MATCH; } else { UPDATE_1_CHECK; res = DUMMY_REP; prob = probs + IsRepG0 + state; IF_BIT_0_CHECK(prob) { UPDATE_0_CHECK; prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; IF_BIT_0_CHECK(prob) { UPDATE_0_CHECK; NORMALIZE_CHECK; return DUMMY_REP; } else { UPDATE_1_CHECK; } } else { UPDATE_1_CHECK; prob = probs + IsRepG1 + state; IF_BIT_0_CHECK(prob) { UPDATE_0_CHECK; } else { UPDATE_1_CHECK; prob = probs + IsRepG2 + state; IF_BIT_0_CHECK(prob) { UPDATE_0_CHECK; } else { UPDATE_1_CHECK; } } } state = kNumStates; prob = probs + RepLenCoder; } { unsigned limit, offset; const CLzmaProb *probLen = prob + LenChoice; IF_BIT_0_CHECK(probLen) { UPDATE_0_CHECK; probLen = prob + LenLow + (posState << kLenNumLowBits); offset = 0; limit = 1 << kLenNumLowBits; } else { UPDATE_1_CHECK; probLen = prob + LenChoice2; IF_BIT_0_CHECK(probLen) { UPDATE_0_CHECK; probLen = prob + LenMid + (posState << kLenNumMidBits); offset = kLenNumLowSymbols; limit = 1 << kLenNumMidBits; } else { UPDATE_1_CHECK; probLen = prob + LenHigh; offset = kLenNumLowSymbols + kLenNumMidSymbols; limit = 1 << kLenNumHighBits; } } TREE_DECODE_CHECK(probLen, limit, len); len += offset; } if (state < 4) { unsigned posSlot; prob = probs + PosSlot + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot); if (posSlot >= kStartPosModelIndex) { unsigned numDirectBits = ((posSlot >> 1) - 1); /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */ if (posSlot < kEndPosModelIndex) { prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1; } else { numDirectBits -= kNumAlignBits; do { NORMALIZE_CHECK range >>= 1; code -= range & (((code - range) >> 31) - 1); /* if (code >= range) code -= range; */ } while (--numDirectBits != 0); prob = probs + Align; numDirectBits = kNumAlignBits; } { unsigned i = 1; do { GET_BIT_CHECK(prob + i, i); } while (--numDirectBits != 0); } } } } } NORMALIZE_CHECK; return res; } void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState) { p->needFlush = 1; p->remainLen = 0; p->tempBufSize = 0; if (initDic) { p->processedPos = 0; p->checkDicSize = 0; p->needInitState = 1; } if (initState) p->needInitState = 1; } void LzmaDec_Init(CLzmaDec *p) { p->dicPos = 0; LzmaDec_InitDicAndState(p, True, True); } static void LzmaDec_InitStateReal(CLzmaDec *p) { SizeT numProbs = LzmaProps_GetNumProbs(&p->prop); SizeT i; CLzmaProb *probs = p->probs; for (i = 0; i < numProbs; i++) probs[i] = kBitModelTotal >> 1; p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1; p->state = 0; p->needInitState = 0; } SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) { SizeT inSize = *srcLen; (*srcLen) = 0; LzmaDec_WriteRem(p, dicLimit); *status = LZMA_STATUS_NOT_SPECIFIED; while (p->remainLen != kMatchSpecLenStart) { int checkEndMarkNow; if (p->needFlush) { for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) p->tempBuf[p->tempBufSize++] = *src++; if (p->tempBufSize < RC_INIT_SIZE) { *status = LZMA_STATUS_NEEDS_MORE_INPUT; return SZ_OK; } if (p->tempBuf[0] != 0) return SZ_ERROR_DATA; p->code = ((UInt32)p->tempBuf[1] << 24) | ((UInt32)p->tempBuf[2] << 16) | ((UInt32)p->tempBuf[3] << 8) | ((UInt32)p->tempBuf[4]); p->range = 0xFFFFFFFF; p->needFlush = 0; p->tempBufSize = 0; } checkEndMarkNow = 0; if (p->dicPos >= dicLimit) { if (p->remainLen == 0 && p->code == 0) { *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK; return SZ_OK; } if (finishMode == LZMA_FINISH_ANY) { *status = LZMA_STATUS_NOT_FINISHED; return SZ_OK; } if (p->remainLen != 0) { *status = LZMA_STATUS_NOT_FINISHED; return SZ_ERROR_DATA; } checkEndMarkNow = 1; } if (p->needInitState) LzmaDec_InitStateReal(p); if (p->tempBufSize == 0) { SizeT processed; const Byte *bufLimit; if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) { int dummyRes = LzmaDec_TryDummy(p, src, inSize); if (dummyRes == DUMMY_ERROR) { memcpy(p->tempBuf, src, inSize); p->tempBufSize = (unsigned)inSize; (*srcLen) += inSize; *status = LZMA_STATUS_NEEDS_MORE_INPUT; return SZ_OK; } if (checkEndMarkNow && dummyRes != DUMMY_MATCH) { *status = LZMA_STATUS_NOT_FINISHED; return SZ_ERROR_DATA; } bufLimit = src; } else bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX; p->buf = src; if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0) return SZ_ERROR_DATA; processed = (SizeT)(p->buf - src); (*srcLen) += processed; src += processed; inSize -= processed; } else { unsigned rem = p->tempBufSize, lookAhead = 0; while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize) p->tempBuf[rem++] = src[lookAhead++]; p->tempBufSize = rem; if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) { int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem); if (dummyRes == DUMMY_ERROR) { (*srcLen) += lookAhead; *status = LZMA_STATUS_NEEDS_MORE_INPUT; return SZ_OK; } if (checkEndMarkNow && dummyRes != DUMMY_MATCH) { *status = LZMA_STATUS_NOT_FINISHED; return SZ_ERROR_DATA; } } p->buf = p->tempBuf; if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0) return SZ_ERROR_DATA; { unsigned kkk = (unsigned)(p->buf - p->tempBuf); if (rem < kkk) return SZ_ERROR_FAIL; /* some internal error */ rem -= kkk; if (lookAhead < rem) return SZ_ERROR_FAIL; /* some internal error */ lookAhead -= rem; } (*srcLen) += lookAhead; src += lookAhead; inSize -= lookAhead; p->tempBufSize = 0; } } if (p->code == 0) *status = LZMA_STATUS_FINISHED_WITH_MARK; return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA; } SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) { SizeT outSize = *destLen; SizeT inSize = *srcLen; *srcLen = *destLen = 0; for (;;) { SizeT inSizeCur = inSize, outSizeCur, dicPos; ELzmaFinishMode curFinishMode; SRes res; if (p->dicPos == p->dicBufSize) p->dicPos = 0; dicPos = p->dicPos; if (outSize > p->dicBufSize - dicPos) { outSizeCur = p->dicBufSize; curFinishMode = LZMA_FINISH_ANY; } else { outSizeCur = dicPos + outSize; curFinishMode = finishMode; } res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status); src += inSizeCur; inSize -= inSizeCur; *srcLen += inSizeCur; outSizeCur = p->dicPos - dicPos; memcpy(dest, p->dic + dicPos, outSizeCur); dest += outSizeCur; outSize -= outSizeCur; *destLen += outSizeCur; if (res != 0) return res; if (outSizeCur == 0 || outSize == 0) return SZ_OK; } } void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc) { alloc->Free(alloc, p->probs); p->probs = NULL; } static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc) { alloc->Free(alloc, p->dic); p->dic = NULL; } void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc) { LzmaDec_FreeProbs(p, alloc); LzmaDec_FreeDict(p, alloc); } SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size) { UInt32 dicSize; Byte d; if (size < LZMA_PROPS_SIZE) return SZ_ERROR_UNSUPPORTED; else dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24); if (dicSize < LZMA_DIC_MIN) dicSize = LZMA_DIC_MIN; p->dicSize = dicSize; d = data[0]; if (d >= (9 * 5 * 5)) return SZ_ERROR_UNSUPPORTED; p->lc = d % 9; d /= 9; p->pb = d / 5; p->lp = d % 5; return SZ_OK; } static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc) { UInt32 numProbs = LzmaProps_GetNumProbs(propNew); if (!p->probs || numProbs != p->numProbs) { LzmaDec_FreeProbs(p, alloc); p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb)); p->numProbs = numProbs; if (!p->probs) return SZ_ERROR_MEM; } return SZ_OK; } SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) { CLzmaProps propNew; RINOK(LzmaProps_Decode(&propNew, props, propsSize)); RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); p->prop = propNew; return SZ_OK; } SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) { CLzmaProps propNew; SizeT dicBufSize; RINOK(LzmaProps_Decode(&propNew, props, propsSize)); RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); { UInt32 dictSize = propNew.dicSize; SizeT mask = ((UInt32)1 << 12) - 1; if (dictSize >= ((UInt32)1 << 30)) mask = ((UInt32)1 << 22) - 1; else if (dictSize >= ((UInt32)1 << 22)) mask = ((UInt32)1 << 20) - 1;; dicBufSize = ((SizeT)dictSize + mask) & ~mask; if (dicBufSize < dictSize) dicBufSize = dictSize; } if (!p->dic || dicBufSize != p->dicBufSize) { LzmaDec_FreeDict(p, alloc); p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize); if (!p->dic) { LzmaDec_FreeProbs(p, alloc); return SZ_ERROR_MEM; } } p->dicBufSize = dicBufSize; p->prop = propNew; return SZ_OK; } SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAlloc *alloc) { CLzmaDec p; SRes res; SizeT outSize = *destLen, inSize = *srcLen; *destLen = *srcLen = 0; *status = LZMA_STATUS_NOT_SPECIFIED; if (inSize < RC_INIT_SIZE) return SZ_ERROR_INPUT_EOF; LzmaDec_Construct(&p); RINOK(LzmaDec_AllocateProbs(&p, propData, propSize, alloc)); p.dic = dest; p.dicBufSize = outSize; LzmaDec_Init(&p); *srcLen = inSize; res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); *destLen = p.dicPos; if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) res = SZ_ERROR_INPUT_EOF; LzmaDec_FreeProbs(&p, alloc); return res; } hashcat-4.0.1/src/main.c000066400000000000000000001103221320027462700150100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include #include #include #include "types.h" #include "user_options.h" #include "usage.h" #include "memory.h" #include "hashcat.h" #include "terminal.h" #include "thread.h" #include "status.h" #include "interface.h" #include "shared.h" #include "event.h" #if defined (__MINGW64__) || defined (__MINGW32__) int _dowildcard = -1; #endif static void main_log_clear_line (MAYBE_UNUSED const int prev_len, MAYBE_UNUSED FILE *fp) { #if defined (_WIN) fputc ('\r', fp); for (int i = 0; i < prev_len; i++) { fputc (' ', fp); } fputc ('\r', fp); #else printf ("\033[2K\r"); #endif } static void main_log (hashcat_ctx_t *hashcat_ctx, FILE *fp, const int loglevel) { event_ctx_t *event_ctx = hashcat_ctx->event_ctx; const char *msg_buf = event_ctx->msg_buf; const int msg_len = event_ctx->msg_len; const bool msg_newline = event_ctx->msg_newline; // handle last_len const int prev_len = event_ctx->prev_len; if (prev_len) { main_log_clear_line (prev_len, fp); } if (msg_newline == true) { event_ctx->prev_len = 0; } else { event_ctx->prev_len = msg_len; } // color stuff pre #if defined (_WIN) HANDLE hConsole = GetStdHandle (STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO con_info; GetConsoleScreenBufferInfo (hConsole, &con_info); const int orig = con_info.wAttributes; switch (loglevel) { case LOGLEVEL_INFO: break; case LOGLEVEL_WARNING: SetConsoleTextAttribute (hConsole, 6); break; case LOGLEVEL_ERROR: SetConsoleTextAttribute (hConsole, FOREGROUND_RED | FOREGROUND_INTENSITY); break; case LOGLEVEL_ADVICE: SetConsoleTextAttribute (hConsole, 6); break; } #else switch (loglevel) { case LOGLEVEL_INFO: break; case LOGLEVEL_WARNING: hc_fwrite ("\033[33m", 5, 1, fp); break; case LOGLEVEL_ERROR: hc_fwrite ("\033[31m", 5, 1, fp); break; case LOGLEVEL_ADVICE: hc_fwrite ("\033[33m", 5, 1, fp); break; } #endif // finally, print hc_fwrite (msg_buf, msg_len, 1, fp); // color stuff post #if defined (_WIN) switch (loglevel) { case LOGLEVEL_INFO: break; case LOGLEVEL_WARNING: SetConsoleTextAttribute (hConsole, orig); break; case LOGLEVEL_ERROR: SetConsoleTextAttribute (hConsole, orig); break; case LOGLEVEL_ADVICE: SetConsoleTextAttribute (hConsole, orig); break; } #else switch (loglevel) { case LOGLEVEL_INFO: break; case LOGLEVEL_WARNING: hc_fwrite ("\033[0m", 4, 1, fp); break; case LOGLEVEL_ERROR: hc_fwrite ("\033[0m", 4, 1, fp); break; case LOGLEVEL_ADVICE: hc_fwrite ("\033[0m", 4, 1, fp); break; } #endif // eventual newline if (msg_newline == true) { hc_fwrite (EOL, strlen (EOL), 1, fp); // on error, add another newline if (loglevel == LOGLEVEL_ERROR) { hc_fwrite (EOL, strlen (EOL), 1, fp); } } fflush (fp); } static void main_log_advice (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->advice_disable == true) return; main_log (hashcat_ctx, stdout, LOGLEVEL_ADVICE); } static void main_log_info (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { main_log (hashcat_ctx, stdout, LOGLEVEL_INFO); } static void main_log_warning (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { main_log (hashcat_ctx, stdout, LOGLEVEL_WARNING); } static void main_log_error (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { main_log (hashcat_ctx, stderr, LOGLEVEL_ERROR); } static void main_outerloop_starting (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; hashcat_user_t *hashcat_user = hashcat_ctx->hashcat_user; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; /** * keypress thread */ hashcat_user->outer_threads_cnt = 0; hashcat_user->outer_threads = (hc_thread_t *) hccalloc (2, sizeof (hc_thread_t)); if (hashcat_user->outer_threads == NULL) return; status_ctx->shutdown_outer = false; if ((user_options->example_hashes == false) && (user_options->keyspace == false) && (user_options->stdout_flag == false) && (user_options->opencl_info == false) && (user_options->speed_only == false)) { if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { // see thread_keypress() how to access status information hc_thread_create (hashcat_user->outer_threads[hashcat_user->outer_threads_cnt], thread_keypress, hashcat_ctx); hashcat_user->outer_threads_cnt++; } } } static void main_outerloop_finished (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { hashcat_user_t *hashcat_user = hashcat_ctx->hashcat_user; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; // wait for outer threads status_ctx->shutdown_outer = true; for (int thread_idx = 0; thread_idx < hashcat_user->outer_threads_cnt; thread_idx++) { hc_thread_wait (1, &hashcat_user->outer_threads[thread_idx]); } hcfree (hashcat_user->outer_threads); hashcat_user->outer_threads_cnt = 0; } static void main_cracker_starting (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; if (user_options->quiet == true) return; // Tell the user we're about to start if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { if ((user_options->quiet == false) && (user_options->speed_only == false)) { event_log_info_nn (hashcat_ctx, NULL); send_prompt (); } } else if (user_options_extra->wordlist_mode == WL_MODE_STDIN) { event_log_info (hashcat_ctx, "Starting attack in stdin mode..."); event_log_info (hashcat_ctx, NULL); } } static void main_cracker_finished (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const hashes_t *hashes = hashcat_ctx->hashes; const user_options_t *user_options = hashcat_ctx->user_options; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; if (user_options->example_hashes == true) return; if (user_options->keyspace == true) return; if (user_options->opencl_info == true) return; if (user_options->stdout_flag == true) return; // if we had a prompt, clear it if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { if ((user_options->speed_only == false) && (user_options->quiet == false)) { clear_prompt (); } } // print final status if (user_options->benchmark == true) { status_benchmark (hashcat_ctx); if (user_options->machine_readable == false) { event_log_info (hashcat_ctx, NULL); } } else if (user_options->progress_only == true) { status_progress (hashcat_ctx); if (user_options->machine_readable == false) { event_log_info (hashcat_ctx, NULL); } } else if (user_options->speed_only == true) { status_speed (hashcat_ctx); if (user_options->machine_readable == false) { event_log_info (hashcat_ctx, NULL); } } else if (user_options->machine_readable == true) { status_display (hashcat_ctx); } else { if (user_options->quiet == false) { if (hashes->digests_saved != hashes->digests_done) event_log_info (hashcat_ctx, NULL); status_display (hashcat_ctx); event_log_info (hashcat_ctx, NULL); } } } static void main_cracker_hash_cracked (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { outfile_ctx_t *outfile_ctx = hashcat_ctx->outfile_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; user_options_t *user_options = hashcat_ctx->user_options; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; if (outfile_ctx->fp != NULL) return; // cracked hash was not written to an outfile if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { if (outfile_ctx->filename == NULL) if (user_options->quiet == false) clear_prompt (); } hc_fwrite (buf, len, 1, stdout); hc_fwrite (EOL, strlen (EOL), 1, stdout); if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { if (status_ctx->devices_status != STATUS_CRACKED) { if (outfile_ctx->filename == NULL) if (user_options->quiet == false) send_prompt (); } } } static void main_calculated_words_base (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->keyspace == false) return; event_log_info (hashcat_ctx, "%" PRIu64 "", status_ctx->words_base); } static void main_potfile_remove_parse_pre (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; event_log_info_nn (hashcat_ctx, "Comparing hashes with potfile entries..."); } static void main_potfile_remove_parse_post (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; event_log_info_nn (hashcat_ctx, "Compared hashes with potfile entries..."); } static void main_potfile_hash_show (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { outfile_ctx_t *outfile_ctx = hashcat_ctx->outfile_ctx; if (outfile_ctx->fp != NULL) return; // cracked hash was not written to an outfile hc_fwrite (buf, len, 1, stdout); hc_fwrite (EOL, strlen (EOL), 1, stdout); } static void main_potfile_hash_left (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { outfile_ctx_t *outfile_ctx = hashcat_ctx->outfile_ctx; if (outfile_ctx->fp != NULL) return; // cracked hash was not written to an outfile hc_fwrite (buf, len, 1, stdout); hc_fwrite (EOL, strlen (EOL), 1, stdout); } static void main_potfile_num_cracked (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; const hashes_t *hashes = hashcat_ctx->hashes; if (user_options->quiet == true) return; const int potfile_remove_cracks = hashes->digests_done; if (potfile_remove_cracks > 0) { if (potfile_remove_cracks == 1) { event_log_info (hashcat_ctx, "INFO: Removed 1 hash found in potfile."); event_log_info (hashcat_ctx, NULL); } else { event_log_info (hashcat_ctx, "INFO: Removed %d hashes found in potfile.", potfile_remove_cracks); event_log_info (hashcat_ctx, NULL); } } } static void main_potfile_all_cracked (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; event_log_info (hashcat_ctx, "INFO: All hashes found in potfile! Use --show to display them."); event_log_info (hashcat_ctx, NULL); } static void main_outerloop_mainscreen (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const bitmap_ctx_t *bitmap_ctx = hashcat_ctx->bitmap_ctx; const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const hashes_t *hashes = hashcat_ctx->hashes; const hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; const user_options_t *user_options = hashcat_ctx->user_options; /** * In benchmark-mode, inform user which algorithm is checked */ if (user_options->benchmark == true) { if (user_options->machine_readable == false) { char *hash_type = strhashtype (hashconfig->hash_mode); // not a bug event_log_info (hashcat_ctx, "Hashmode: %d - %s", hashconfig->hash_mode, hash_type); event_log_info (hashcat_ctx, NULL); } } if (user_options->quiet == true) return; event_log_info (hashcat_ctx, "Hashes: %u digests; %u unique digests, %u unique salts", hashes->hashes_cnt_orig, hashes->digests_cnt, hashes->salts_cnt); event_log_info (hashcat_ctx, "Bitmaps: %u bits, %u entries, 0x%08x mask, %u bytes, %u/%u rotates", bitmap_ctx->bitmap_bits, bitmap_ctx->bitmap_nums, bitmap_ctx->bitmap_mask, bitmap_ctx->bitmap_size, bitmap_ctx->bitmap_shift1, bitmap_ctx->bitmap_shift2); if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { event_log_info (hashcat_ctx, "Rules: %u", straight_ctx->kernel_rules_cnt); } if (user_options->quiet == false) event_log_info (hashcat_ctx, NULL); if (hashconfig->opti_type) { event_log_info (hashcat_ctx, "Applicable optimizers:"); for (u32 i = 0; i < 32; i++) { const u32 opti_bit = 1u << i; if (hashconfig->opti_type & opti_bit) event_log_info (hashcat_ctx, "* %s", stroptitype (opti_bit)); } } event_log_info (hashcat_ctx, NULL); /** * Optimizer constraints */ event_log_info (hashcat_ctx, "Password length minimum: %u", hashconfig->pw_min); event_log_info (hashcat_ctx, "Password length maximum: %u", hashconfig->pw_max); if (hashconfig->is_salted == true) { if (hashconfig->opti_type & OPTI_TYPE_RAW_HASH) { event_log_info (hashcat_ctx, "Salt length minimum: %u", hashconfig->salt_min); event_log_info (hashcat_ctx, "Salt length maximum: %u", hashconfig->salt_max); } } event_log_info (hashcat_ctx, NULL); if ((hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) == 0) { if (hashconfig->has_optimized_kernel == true) { event_log_advice (hashcat_ctx, "ATTENTION! Pure (unoptimized) OpenCL kernels selected."); event_log_advice (hashcat_ctx, "This enables cracking passwords and salts > length 32 but for the price of drastical reduced performance."); event_log_advice (hashcat_ctx, "If you want to switch to optimized OpenCL kernels, append -O to your commandline."); event_log_advice (hashcat_ctx, NULL); } } /** * Watchdog and Temperature balance */ if (hwmon_ctx->enabled == false && user_options->gpu_temp_disable == false) { event_log_info (hashcat_ctx, "Watchdog: Hardware monitoring interface not found on your system."); } if (hwmon_ctx->enabled == true && user_options->gpu_temp_abort > 0) { event_log_info (hashcat_ctx, "Watchdog: Temperature abort trigger set to %uc", user_options->gpu_temp_abort); } else { event_log_info (hashcat_ctx, "Watchdog: Temperature abort trigger disabled."); } if (hwmon_ctx->enabled == true && user_options->gpu_temp_retain > 0) { event_log_info (hashcat_ctx, "Watchdog: Temperature retain trigger set to %uc", user_options->gpu_temp_retain); } else { event_log_info (hashcat_ctx, "Watchdog: Temperature retain trigger disabled."); } event_log_info (hashcat_ctx, NULL); } static void main_opencl_session_pre (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; event_log_info_nn (hashcat_ctx, "Initializing device kernels and memory..."); } static void main_opencl_session_post (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; event_log_info_nn (hashcat_ctx, "Initialized device kernels and memory..."); } static void main_bitmap_init_pre (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; event_log_info_nn (hashcat_ctx, "Generating bitmap tables..."); } static void main_bitmap_init_post (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; event_log_info_nn (hashcat_ctx, "Generated bitmap tables..."); } static void main_set_kernel_power_final (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; clear_prompt (); event_log_advice (hashcat_ctx, "Approaching final keyspace - workload adjusted."); event_log_advice (hashcat_ctx, NULL); send_prompt (); } static void main_monitor_throttle1 (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; if (user_options->quiet == true) return; if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { clear_prompt (); } u32 *device_id = (u32 *) buf; event_log_warning (hashcat_ctx, "Driver temperature threshold met on GPU #%u. Expect reduced performance.", *device_id + 1); if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { send_prompt (); } } static void main_monitor_throttle2 (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; if (user_options->quiet == true) return; if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { clear_prompt (); } u32 *device_id = (u32 *) buf; event_log_warning (hashcat_ctx, "Driver temperature threshold met on GPU #%u. Expect reduced performance.", *device_id + 1); if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { send_prompt (); } } static void main_monitor_throttle3 (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; if (user_options->quiet == true) return; if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { clear_prompt (); } u32 *device_id = (u32 *) buf; event_log_warning (hashcat_ctx, "Driver temperature threshold met on GPU #%u. Expect reduced performance.", *device_id + 1); event_log_warning (hashcat_ctx, NULL); if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { send_prompt (); } } static void main_monitor_performance_hint (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const user_options_t *user_options = hashcat_ctx->user_options; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; if (user_options->quiet == true) return; if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { clear_prompt (); } event_log_advice (hashcat_ctx, "Cracking performance lower than expected?"); event_log_advice (hashcat_ctx, NULL); if ((hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) == 0) { if (hashconfig->has_optimized_kernel == true) { event_log_advice (hashcat_ctx, "* Append -O to the commandline."); event_log_advice (hashcat_ctx, " This lowers the maximum supported password- and salt-length (typically down to 32)."); event_log_advice (hashcat_ctx, NULL); } } if (user_options->workload_profile < 3) { event_log_advice (hashcat_ctx, "* Append -w 3 to the commandline."); event_log_advice (hashcat_ctx, " This can cause your screen to lag."); event_log_advice (hashcat_ctx, NULL); } event_log_advice (hashcat_ctx, "* Update your OpenCL runtime / driver the right way:"); event_log_advice (hashcat_ctx, " https://hashcat.net/faq/wrongdriver"); event_log_advice (hashcat_ctx, NULL); event_log_advice (hashcat_ctx, "* Create more work items to make use of your parallelization power:"); event_log_advice (hashcat_ctx, " https://hashcat.net/faq/morework"); event_log_advice (hashcat_ctx, NULL); if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { send_prompt (); } } static void main_monitor_temp_abort (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; if (user_options->quiet == true) return; if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { clear_prompt (); } u32 *device_id = (u32 *) buf; event_log_error (hashcat_ctx, "Temperature limit on GPU #%u reached, aborting...", *device_id + 1); } static void main_monitor_runtime_limit (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; if (user_options->quiet == true) return; if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { clear_prompt (); } event_log_warning (hashcat_ctx, "Runtime limit reached, aborting..."); } static void main_monitor_status_refresh (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; if (status_ctx->accessible == false) return; if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { if (user_options->quiet == false) { //clear_prompt (); event_log_info (hashcat_ctx, NULL); event_log_info (hashcat_ctx, NULL); } } status_display (hashcat_ctx); if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { if (user_options->quiet == false) { event_log_info (hashcat_ctx, NULL); send_prompt (); } } if (user_options_extra->wordlist_mode == WL_MODE_STDIN) { if (user_options->quiet == false) { event_log_info (hashcat_ctx, NULL); } } } static void main_wordlist_cache_hit (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; cache_hit_t *cache_hit = (cache_hit_t *) buf; event_log_info (hashcat_ctx, "Dictionary cache hit:"); event_log_info (hashcat_ctx, "* Filename..: %s", cache_hit->dictfile); event_log_info (hashcat_ctx, "* Passwords.: %" PRIu64, cache_hit->cached_cnt); event_log_info (hashcat_ctx, "* Bytes.....: %" PRId64, cache_hit->stat.st_size); event_log_info (hashcat_ctx, "* Keyspace..: %" PRIu64, cache_hit->keyspace); event_log_info (hashcat_ctx, NULL); } static void main_wordlist_cache_generate (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; cache_generate_t *cache_generate = (cache_generate_t *) buf; if (cache_generate->percent < 100) { event_log_info_nn (hashcat_ctx, "Dictionary cache building %s: %" PRIu64 " bytes (%.2f%%)", cache_generate->dictfile, cache_generate->comp, cache_generate->percent); } else { char *runtime = (char *) malloc (HCBUFSIZ_TINY); const hc_time_t runtime_sec = cache_generate->runtime; struct tm *tmp; struct tm tm; tmp = hc_gmtime (&runtime_sec, &tm); format_timer_display (tmp, runtime, HCBUFSIZ_TINY); event_log_info (hashcat_ctx, "Dictionary cache built:"); event_log_info (hashcat_ctx, "* Filename..: %s", cache_generate->dictfile); event_log_info (hashcat_ctx, "* Passwords.: %" PRIu64, cache_generate->cnt2); event_log_info (hashcat_ctx, "* Bytes.....: %" PRId64, cache_generate->comp); event_log_info (hashcat_ctx, "* Keyspace..: %" PRIu64, cache_generate->cnt); event_log_info (hashcat_ctx, "* Runtime...: %s", runtime); event_log_info (hashcat_ctx, NULL); hcfree (runtime); } } static void main_hashlist_count_lines_pre (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; char *hashfile = (char *) buf; event_log_info_nn (hashcat_ctx, "Counting lines in %s...", hashfile); } static void main_hashlist_count_lines_post (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; char *hashfile = (char *) buf; event_log_info_nn (hashcat_ctx, "Counted lines in %s...", hashfile); } static void main_hashlist_parse_hash (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; hashlist_parse_t *hashlist_parse = (hashlist_parse_t *) buf; const u32 hashes_cnt = hashlist_parse->hashes_cnt; const u32 hashes_avail = hashlist_parse->hashes_avail; if (hashes_cnt < hashes_avail) { event_log_info_nn (hashcat_ctx, "Parsing Hashes: %u/%u (%0.2f%%)...", hashes_cnt, hashes_avail, ((double) hashes_cnt / hashes_avail) * 100.0); } else { event_log_info_nn (hashcat_ctx, "Parsed Hashes: %u/%u (%0.2f%%)", hashes_cnt, hashes_avail, 100.0); } } static void main_hashlist_sort_hash_pre (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; event_log_info_nn (hashcat_ctx, "Sorting hashes..."); } static void main_hashlist_sort_hash_post (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; event_log_info_nn (hashcat_ctx, "Sorted hashes..."); } static void main_hashlist_unique_hash_pre (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; event_log_info_nn (hashcat_ctx, "Removing duplicate hashes..."); } static void main_hashlist_unique_hash_post (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; event_log_info_nn (hashcat_ctx, "Removed duplicate hashes..."); } static void main_hashlist_sort_salt_pre (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; event_log_info_nn (hashcat_ctx, "Sorting salts..."); } static void main_hashlist_sort_salt_post (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; event_log_info_nn (hashcat_ctx, "Sorted salts..."); } static void event (const u32 id, hashcat_ctx_t *hashcat_ctx, const void *buf, const size_t len) { switch (id) { case EVENT_BITMAP_INIT_POST: main_bitmap_init_post (hashcat_ctx, buf, len); break; case EVENT_BITMAP_INIT_PRE: main_bitmap_init_pre (hashcat_ctx, buf, len); break; case EVENT_CALCULATED_WORDS_BASE: main_calculated_words_base (hashcat_ctx, buf, len); break; case EVENT_CRACKER_FINISHED: main_cracker_finished (hashcat_ctx, buf, len); break; case EVENT_CRACKER_HASH_CRACKED: main_cracker_hash_cracked (hashcat_ctx, buf, len); break; case EVENT_CRACKER_STARTING: main_cracker_starting (hashcat_ctx, buf, len); break; case EVENT_HASHLIST_COUNT_LINES_POST: main_hashlist_count_lines_post (hashcat_ctx, buf, len); break; case EVENT_HASHLIST_COUNT_LINES_PRE: main_hashlist_count_lines_pre (hashcat_ctx, buf, len); break; case EVENT_HASHLIST_PARSE_HASH: main_hashlist_parse_hash (hashcat_ctx, buf, len); break; case EVENT_HASHLIST_SORT_HASH_POST: main_hashlist_sort_hash_post (hashcat_ctx, buf, len); break; case EVENT_HASHLIST_SORT_HASH_PRE: main_hashlist_sort_hash_pre (hashcat_ctx, buf, len); break; case EVENT_HASHLIST_SORT_SALT_POST: main_hashlist_sort_salt_post (hashcat_ctx, buf, len); break; case EVENT_HASHLIST_SORT_SALT_PRE: main_hashlist_sort_salt_pre (hashcat_ctx, buf, len); break; case EVENT_HASHLIST_UNIQUE_HASH_POST: main_hashlist_unique_hash_post (hashcat_ctx, buf, len); break; case EVENT_HASHLIST_UNIQUE_HASH_PRE: main_hashlist_unique_hash_pre (hashcat_ctx, buf, len); break; case EVENT_LOG_ERROR: main_log_error (hashcat_ctx, buf, len); break; case EVENT_LOG_INFO: main_log_info (hashcat_ctx, buf, len); break; case EVENT_LOG_WARNING: main_log_warning (hashcat_ctx, buf, len); break; case EVENT_LOG_ADVICE: main_log_advice (hashcat_ctx, buf, len); break; case EVENT_MONITOR_RUNTIME_LIMIT: main_monitor_runtime_limit (hashcat_ctx, buf, len); break; case EVENT_MONITOR_STATUS_REFRESH: main_monitor_status_refresh (hashcat_ctx, buf, len); break; case EVENT_MONITOR_TEMP_ABORT: main_monitor_temp_abort (hashcat_ctx, buf, len); break; case EVENT_MONITOR_THROTTLE1: main_monitor_throttle1 (hashcat_ctx, buf, len); break; case EVENT_MONITOR_THROTTLE2: main_monitor_throttle2 (hashcat_ctx, buf, len); break; case EVENT_MONITOR_THROTTLE3: main_monitor_throttle3 (hashcat_ctx, buf, len); break; case EVENT_MONITOR_PERFORMANCE_HINT: main_monitor_performance_hint (hashcat_ctx, buf, len); break; case EVENT_OPENCL_SESSION_POST: main_opencl_session_post (hashcat_ctx, buf, len); break; case EVENT_OPENCL_SESSION_PRE: main_opencl_session_pre (hashcat_ctx, buf, len); break; case EVENT_OUTERLOOP_FINISHED: main_outerloop_finished (hashcat_ctx, buf, len); break; case EVENT_OUTERLOOP_MAINSCREEN: main_outerloop_mainscreen (hashcat_ctx, buf, len); break; case EVENT_OUTERLOOP_STARTING: main_outerloop_starting (hashcat_ctx, buf, len); break; case EVENT_POTFILE_ALL_CRACKED: main_potfile_all_cracked (hashcat_ctx, buf, len); break; case EVENT_POTFILE_HASH_LEFT: main_potfile_hash_left (hashcat_ctx, buf, len); break; case EVENT_POTFILE_HASH_SHOW: main_potfile_hash_show (hashcat_ctx, buf, len); break; case EVENT_POTFILE_NUM_CRACKED: main_potfile_num_cracked (hashcat_ctx, buf, len); break; case EVENT_POTFILE_REMOVE_PARSE_POST: main_potfile_remove_parse_post (hashcat_ctx, buf, len); break; case EVENT_POTFILE_REMOVE_PARSE_PRE: main_potfile_remove_parse_pre (hashcat_ctx, buf, len); break; case EVENT_SET_KERNEL_POWER_FINAL: main_set_kernel_power_final (hashcat_ctx, buf, len); break; case EVENT_WORDLIST_CACHE_GENERATE: main_wordlist_cache_generate (hashcat_ctx, buf, len); break; case EVENT_WORDLIST_CACHE_HIT: main_wordlist_cache_hit (hashcat_ctx, buf, len); break; } } int main (int argc, char **argv) { // this increases the size on windows dox boxes setup_console (); const hc_time_t proc_start = hc_time (NULL); // hashcat main context hashcat_ctx_t *hashcat_ctx = (hashcat_ctx_t *) malloc (sizeof (hashcat_ctx_t)); const int rc_hashcat_init = hashcat_init (hashcat_ctx, event); if (rc_hashcat_init == -1) return -1; // install and shared folder need to be set to recognize "make install" use const char *install_folder = NULL; const char *shared_folder = NULL; #if defined (INSTALL_FOLDER) install_folder = INSTALL_FOLDER; #endif #if defined (SHARED_FOLDER) shared_folder = SHARED_FOLDER; #endif // initialize the user options with some defaults (you can override them later) const int rc_options_init = user_options_init (hashcat_ctx); if (rc_options_init == -1) return -1; // parse commandline parameters and check them const int rc_options_getopt = user_options_getopt (hashcat_ctx, argc, argv); if (rc_options_getopt == -1) return -1; const int rc_options_sanity = user_options_sanity (hashcat_ctx); if (rc_options_sanity == -1) return -1; // some early exits user_options_t *user_options = hashcat_ctx->user_options; if (user_options->version == true) { printf ("%s\n", VERSION_TAG); return 0; } if (user_options->usage == true) { usage_big_print (PROGNAME); return 0; } if (user_options->example_hashes == true) { example_hashes (hashcat_ctx); return 0; } // init a hashcat session; this initializes opencl devices, hwmon, etc welcome_screen (hashcat_ctx, VERSION_TAG); const int rc_session_init = hashcat_session_init (hashcat_ctx, install_folder, shared_folder, argc, argv, COMPTIME); int rc_final = -1; if (rc_session_init == 0) { if (user_options->opencl_info == true) { // if this is just opencl_info, no need to execute some real cracking session opencl_info (hashcat_ctx); rc_final = 0; } else { // now execute hashcat opencl_info_compact (hashcat_ctx); user_options_info (hashcat_ctx); rc_final = hashcat_session_execute (hashcat_ctx); } } // finish the hashcat session, this shuts down opencl devices, hwmon, etc hashcat_session_destroy (hashcat_ctx); // finished with hashcat, clean up const hc_time_t proc_stop = hc_time (NULL); goodbye_screen (hashcat_ctx, proc_start, proc_stop); hashcat_destroy (hashcat_ctx); free (hashcat_ctx); return rc_final; } hashcat-4.0.1/src/memory.c000066400000000000000000000017541320027462700154040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" void *hccalloc (const size_t nmemb, const size_t sz) { void *p = calloc (nmemb, sz); if (p == NULL) { fprintf (stderr, "%s\n", MSG_ENOMEM); return (NULL); } return (p); } void *hcmalloc (const size_t sz) { //calloc is faster than malloc with big allocations, so just use that. void *p = hccalloc (sz, 1); return (p); } void *hcrealloc (void *ptr, const size_t oldsz, const size_t addsz) { void *p = realloc (ptr, oldsz + addsz); if (p == NULL) { fprintf (stderr, "%s\n", MSG_ENOMEM); return (NULL); } memset ((char *) p + oldsz, 0, addsz); return (p); } char *hcstrdup (const char *s) { const size_t len = strlen (s); char *b = (char *) hcmalloc (len + 1); if (b == NULL) return (NULL); memcpy (b, s, len); b[len] = 0; return (b); } void hcfree (void *ptr) { if (ptr == NULL) return; free (ptr); } hashcat-4.0.1/src/monitor.c000066400000000000000000000263271320027462700155660ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "event.h" #include "memory.h" #include "hwmon.h" #include "timer.h" #include "hashes.h" #include "thread.h" #include "restore.h" #include "shared.h" #include "status.h" #include "monitor.h" int get_runtime_left (const hashcat_ctx_t *hashcat_ctx) { const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; const user_options_t *user_options = hashcat_ctx->user_options; double msec_paused = status_ctx->msec_paused; if (status_ctx->devices_status == STATUS_PAUSED) { double msec_paused_tmp = hc_timer_get (status_ctx->timer_paused); msec_paused += msec_paused_tmp; } hc_time_t runtime_cur; hc_time (&runtime_cur); const int runtime_left = (int) (status_ctx->runtime_start + user_options->runtime + (msec_paused / 1000) - runtime_cur); return runtime_left; } static int monitor (hashcat_ctx_t *hashcat_ctx) { hashes_t *hashes = hashcat_ctx->hashes; hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; restore_ctx_t *restore_ctx = hashcat_ctx->restore_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; user_options_t *user_options = hashcat_ctx->user_options; bool runtime_check = false; bool remove_check = false; bool status_check = false; bool restore_check = false; bool hwmon_check = false; bool performance_check = false; const int sleep_time = 1; const int temp_threshold = 1; // degrees celcius const int fan_speed_min = 33; // in percentage const int fan_speed_max = 100; const double exec_low = 50.0; // in ms const double util_low = 90.0; // in percent if (user_options->runtime) { runtime_check = true; } if (restore_ctx->enabled == true) { restore_check = true; } if ((user_options->remove == true) && (hashes->hashlist_mode == HL_MODE_FILE)) { remove_check = true; } if (user_options->status == true) { status_check = true; } if (hwmon_ctx->enabled == true) { hwmon_check = true; } if (hwmon_ctx->enabled == true) { performance_check = true; // this check simply requires hwmon to work } if ((runtime_check == false) && (remove_check == false) && (status_check == false) && (restore_check == false) && (hwmon_check == false) && (performance_check == false)) { return 0; } // these variables are mainly used for fan control int fan_speed_chgd[DEVICES_MAX]; memset (fan_speed_chgd, 0, sizeof (fan_speed_chgd)); // temperature controller "loopback" values int temp_diff_old[DEVICES_MAX]; int temp_diff_sum[DEVICES_MAX]; memset (temp_diff_old, 0, sizeof (temp_diff_old)); memset (temp_diff_sum, 0, sizeof (temp_diff_sum)); // timer hc_time_t last_temp_check_time; hc_time (&last_temp_check_time); u32 slowdown_warnings = 0; u32 performance_warnings = 0; u32 restore_left = user_options->restore_timer; u32 remove_left = user_options->remove_timer; u32 status_left = user_options->status_timer; while (status_ctx->shutdown_inner == false) { sleep (sleep_time); if (status_ctx->devices_status == STATUS_INIT) continue; if (hwmon_check == true) { hc_thread_mutex_lock (status_ctx->mux_hwmon); for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; const int rc_throttle = hm_get_throttle_with_device_id (hashcat_ctx, device_id); if (rc_throttle == -1) continue; if (rc_throttle > 0) { slowdown_warnings++; if (slowdown_warnings == 1) EVENT_DATA (EVENT_MONITOR_THROTTLE1, &device_id, sizeof (u32)); if (slowdown_warnings == 2) EVENT_DATA (EVENT_MONITOR_THROTTLE2, &device_id, sizeof (u32)); if (slowdown_warnings == 3) EVENT_DATA (EVENT_MONITOR_THROTTLE3, &device_id, sizeof (u32)); } else { slowdown_warnings = 0; } } hc_thread_mutex_unlock (status_ctx->mux_hwmon); } if (hwmon_check == true) { hc_thread_mutex_lock (status_ctx->mux_hwmon); hc_time_t temp_check_time; hc_time (&temp_check_time); u32 Ta = temp_check_time - last_temp_check_time; // set Ta = sleep_time; is not good enough (see --remove etc) if (Ta == 0) Ta = 1; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; if ((opencl_ctx->devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) continue; const int temperature = hm_get_temperature_with_device_id (hashcat_ctx, device_id); if (temperature > (int) user_options->gpu_temp_abort) { EVENT_DATA (EVENT_MONITOR_TEMP_ABORT, &device_id, sizeof (u32)); myabort (hashcat_ctx); } if (hwmon_ctx->hm_device[device_id].fanspeed_get_supported == false) continue; if (hwmon_ctx->hm_device[device_id].fanspeed_set_supported == false) continue; const u32 gpu_temp_retain = user_options->gpu_temp_retain; if (gpu_temp_retain > 0) { int temp_cur = temperature; int temp_diff_new = (int) gpu_temp_retain - temp_cur; temp_diff_sum[device_id] = temp_diff_sum[device_id] + 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.6f; float Ki = 0.001f; float Kd = 10.0f; // 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[device_id] + Kd * ((float)(temp_diff_new - temp_diff_old[device_id])) / Ta); if (abs (fan_diff_required) >= temp_threshold) { const int fan_speed_cur = hm_get_fanspeed_with_device_id (hashcat_ctx, device_id); int fan_speed_level = fan_speed_cur; if (fan_speed_chgd[device_id] == 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[device_id] == 1); int fan_speed_must_change = (fan_speed_new > fan_speed_cur); if ((freely_change_fan_speed == 1) || (fan_speed_must_change == 1)) { if (device_param->device_vendor_id == VENDOR_ID_AMD) { if (hwmon_ctx->hm_adl) { hm_set_fanspeed_with_device_id_adl (hashcat_ctx, device_id, fan_speed_new, 1); } if (hwmon_ctx->hm_sysfs) { hm_set_fanspeed_with_device_id_sysfs (hashcat_ctx, device_id, fan_speed_new); } } else if (device_param->device_vendor_id == VENDOR_ID_NV) { if (hwmon_ctx->hm_nvapi) { hm_set_fanspeed_with_device_id_nvapi (hashcat_ctx, device_id, fan_speed_new, 1); } if (hwmon_ctx->hm_xnvctrl) { hm_set_fanspeed_with_device_id_xnvctrl (hashcat_ctx, device_id, fan_speed_new); } } fan_speed_chgd[device_id] = 1; } temp_diff_old[device_id] = temp_diff_new; } } } } hc_thread_mutex_unlock (status_ctx->mux_hwmon); } if (restore_check == true) { restore_left--; if (restore_left == 0) { const int rc = cycle_restore (hashcat_ctx); if (rc == -1) return -1; restore_left = user_options->restore_timer; } } if ((runtime_check == true) && (status_ctx->runtime_start > 0)) { const int runtime_left = get_runtime_left (hashcat_ctx); if (runtime_left <= 0) { EVENT_DATA (EVENT_MONITOR_RUNTIME_LIMIT, NULL, 0); myabort_runtime (hashcat_ctx); } } if (remove_check == true) { remove_left--; if (remove_left == 0) { if (hashes->digests_saved != hashes->digests_done) { hashes->digests_saved = hashes->digests_done; const int rc = save_hash (hashcat_ctx); if (rc == -1) return -1; } remove_left = user_options->remove_timer; } } if (status_check == true) { status_left--; if (status_left == 0) { hc_thread_mutex_lock (status_ctx->mux_display); EVENT_DATA (EVENT_MONITOR_STATUS_REFRESH, NULL, 0); hc_thread_mutex_unlock (status_ctx->mux_display); status_left = user_options->status_timer; } } if (performance_check == true) { int exec_cnt = 0; int util_cnt = 0; double exec_total = 0; double util_total = 0; hc_thread_mutex_lock (status_ctx->mux_hwmon); for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; exec_cnt++; const double exec = status_get_exec_msec_dev (hashcat_ctx, device_id); exec_total += exec; const int util = hm_get_utilization_with_device_id (hashcat_ctx, device_id); if (util == -1) continue; util_total += (double) util; util_cnt++; } hc_thread_mutex_unlock (status_ctx->mux_hwmon); double exec_avg = 0; double util_avg = 0; if (exec_cnt > 0) exec_avg = exec_total / exec_cnt; if (util_cnt > 0) util_avg = util_total / util_cnt; if ((exec_avg > 0) && (exec_avg < exec_low)) { performance_warnings++; if (performance_warnings == 10) EVENT_DATA (EVENT_MONITOR_PERFORMANCE_HINT, NULL, 0); } if ((util_avg > 0) && (util_avg < util_low)) { performance_warnings++; if (performance_warnings == 10) EVENT_DATA (EVENT_MONITOR_PERFORMANCE_HINT, NULL, 0); } } } // final round of save_hash if (remove_check == true) { if (hashes->digests_saved != hashes->digests_done) { const int rc = save_hash (hashcat_ctx); if (rc == -1) return -1; } } // final round of cycle_restore if (restore_check == true) { const int rc = cycle_restore (hashcat_ctx); if (rc == -1) return -1; } return 0; } void *thread_monitor (void *p) { hashcat_ctx_t *hashcat_ctx = (hashcat_ctx_t *) p; monitor (hashcat_ctx); // we should give back some useful returncode return NULL; } hashcat-4.0.1/src/mpsp.c000066400000000000000000001332121320027462700150460ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "bitops.h" #include "logfile.h" #include "convert.h" #include "filehandling.h" #include "interface.h" #include "opencl.h" #include "shared.h" #include "ext_lzma.h" #include "mpsp.h" static const char DEF_MASK[] = "?1?2?2?2?2?2?2?3?3?3?3?d?d?d?d"; #define MAX_MFS 5 // 4*charset, 1*mask static 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; } static void mp_css_split_cnt (hashcat_ctx_t *hashcat_ctx, const u32 css_cnt_orig, u32 css_cnt_lr[2]) { const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; u32 css_cnt_l = mask_ctx->css_cnt; u32 css_cnt_r; if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { if (css_cnt_orig < 6) { css_cnt_r = 1; } else if (css_cnt_orig == 6) { css_cnt_r = 2; } else { if ((hashconfig->opts_type & OPTS_TYPE_PT_UTF16LE) || (hashconfig->opts_type & OPTS_TYPE_PT_UTF16BE)) { if (css_cnt_orig == 8 || css_cnt_orig == 10) { css_cnt_r = 2; } else { css_cnt_r = 4; } } else { if ((mask_ctx->css_buf[0].cs_len * mask_ctx->css_buf[1].cs_len * mask_ctx->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 (u32 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; css_cnt_lr[0] = css_cnt_l; css_cnt_lr[1] = css_cnt_r; } static int mp_css_append_salt (hashcat_ctx_t *hashcat_ctx, salt_t *salt_buf) { mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; u32 salt_len = salt_buf->salt_len; u8 *salt_buf_ptr = (u8 *) salt_buf->salt_buf; u32 css_cnt_salt = mask_ctx->css_cnt + salt_len; cs_t *css_buf_salt = (cs_t *) hccalloc (css_cnt_salt, sizeof (cs_t)); memcpy (css_buf_salt, mask_ctx->css_buf, mask_ctx->css_cnt * sizeof (cs_t)); for (u32 i = 0, j = mask_ctx->css_cnt; i < salt_len; i++, j++) { css_buf_salt[j].cs_buf[0] = salt_buf_ptr[i]; css_buf_salt[j].cs_len = 1; } hcfree (mask_ctx->css_buf); mask_ctx->css_buf = css_buf_salt; mask_ctx->css_cnt = css_cnt_salt; return 0; } static int mp_css_utf16le_expand (hashcat_ctx_t *hashcat_ctx) { mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; u32 css_cnt_utf16le = mask_ctx->css_cnt * 2; cs_t *css_buf_utf16le = (cs_t *) hccalloc (css_cnt_utf16le, sizeof (cs_t)); for (u32 i = 0, j = 0; i < mask_ctx->css_cnt; i += 1, j += 2) { memcpy (&css_buf_utf16le[j + 0], &mask_ctx->css_buf[i], sizeof (cs_t)); css_buf_utf16le[j + 1].cs_buf[0] = 0; css_buf_utf16le[j + 1].cs_len = 1; } hcfree (mask_ctx->css_buf); mask_ctx->css_buf = css_buf_utf16le; mask_ctx->css_cnt = css_cnt_utf16le; return 0; } static int mp_css_utf16be_expand (hashcat_ctx_t *hashcat_ctx) { mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; u32 css_cnt_utf16be = mask_ctx->css_cnt * 2; cs_t *css_buf_utf16be = (cs_t *) hccalloc (css_cnt_utf16be, sizeof (cs_t)); for (u32 i = 0, j = 0; i < mask_ctx->css_cnt; i += 1, j += 2) { css_buf_utf16be[j + 0].cs_buf[0] = 0; css_buf_utf16be[j + 0].cs_len = 1; memcpy (&css_buf_utf16be[j + 1], &mask_ctx->css_buf[i], sizeof (cs_t)); } hcfree (mask_ctx->css_buf); mask_ctx->css_buf = css_buf_utf16be; mask_ctx->css_cnt = css_cnt_utf16be; return 0; } static int mp_css_to_uniq_tbl (hashcat_ctx_t *hashcat_ctx, u32 css_cnt, cs_t *css, u32 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) { event_log_error (hashcat_ctx, "Mask length is too long."); return -1; } for (u32 css_pos = 0; css_pos < css_cnt; css_pos++) { u32 *uniq_tbl = uniq_tbls[css_pos]; u32 *cs_buf = css[css_pos].cs_buf; u32 cs_len = css[css_pos].cs_len; for (u32 cs_pos = 0; cs_pos < cs_len; cs_pos++) { u32 c = cs_buf[cs_pos] & 0xff; uniq_tbl[c] = 1; } } return 0; } static int mp_add_cs_buf (hashcat_ctx_t *hashcat_ctx, const u32 *in_buf, size_t in_len, cs_t *css, u32 css_cnt) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; cs_t *cs = &css[css_cnt]; size_t css_uniq_sz = CHARSIZ * sizeof (u32); u32 *css_uniq = (u32 *) hcmalloc (css_uniq_sz); size_t i; for (i = 0; i < cs->cs_len; i++) { const u32 u = cs->cs_buf[i]; css_uniq[u] = 1; } for (i = 0; i < in_len; i++) { u32 u = in_buf[i] & 0xff; if (hashconfig->opts_type & OPTS_TYPE_PT_UPPER) u = (u32) toupper (u); if (css_uniq[u] == 1) continue; css_uniq[u] = 1; cs->cs_buf[cs->cs_len] = u; cs->cs_len++; } hcfree (css_uniq); return 0; } static int mp_expand (hashcat_ctx_t *hashcat_ctx, char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, u32 mp_usr_offset, int interpret) { const user_options_t *user_options = hashcat_ctx->user_options; size_t in_pos; for (in_pos = 0; in_pos < in_len; in_pos++) { u32 p0 = in_buf[in_pos] & 0xff; if (interpret == 1 && p0 == '?') { in_pos++; if (in_pos == in_len) break; u32 p1 = in_buf[in_pos] & 0xff; int rc = 0; switch (p1) { case 'l': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset); break; case 'u': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset); break; case 'd': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset); break; case 's': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset); break; case 'a': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset); break; case 'b': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset); break; case 'h': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[6].cs_buf, mp_sys[6].cs_len, mp_usr, mp_usr_offset); break; case 'H': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[7].cs_buf, mp_sys[7].cs_len, mp_usr, mp_usr_offset); break; case '1': if (mp_usr[0].cs_len == 0) { event_log_error (hashcat_ctx, "Custom-charset 1 is undefined."); return -1; } rc = mp_add_cs_buf (hashcat_ctx, 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) { event_log_error (hashcat_ctx, "Custom-charset 2 is undefined."); return -1; } rc = mp_add_cs_buf (hashcat_ctx, 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) { event_log_error (hashcat_ctx, "Custom-charset 3 is undefined."); return -1; } rc = mp_add_cs_buf (hashcat_ctx, 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) { event_log_error (hashcat_ctx, "Custom-charset 4 is undefined."); return -1; } rc = mp_add_cs_buf (hashcat_ctx, mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset); break; case '?': rc = mp_add_cs_buf (hashcat_ctx, &p0, 1, mp_usr, mp_usr_offset); break; default: event_log_error (hashcat_ctx, "Syntax error: %s", in_buf); return -1; } if (rc == -1) return -1; } else { if (user_options->hex_charset == true) { in_pos++; if (in_pos == in_len) { event_log_error (hashcat_ctx, "The hex-charset option expects exactly 2 hexadecimal chars. Failed mask: %s", in_buf); return -1; } u32 p1 = in_buf[in_pos] & 0xff; if ((is_valid_hex_char ((u8) p0) == false) || (is_valid_hex_char ((u8) p1) == false)) { event_log_error (hashcat_ctx, "Invalid hex character detected in mask %s", in_buf); return -1; } u32 chr = 0; chr = (u32) hex_convert ((u8) p1) << 0; chr |= (u32) hex_convert ((u8) p0) << 4; const int rc = mp_add_cs_buf (hashcat_ctx, &chr, 1, mp_usr, mp_usr_offset); if (rc == -1) return -1; } else { u32 chr = p0; const int rc = mp_add_cs_buf (hashcat_ctx, &chr, 1, mp_usr, mp_usr_offset); if (rc == -1) return -1; } } } return 0; } static int mp_gen_css (hashcat_ctx_t *hashcat_ctx, char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, cs_t *css_buf, u32 *css_cnt) { const user_options_t *user_options = hashcat_ctx->user_options; u32 mask_pos; u32 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]; u32 chr = (u32) p1; int rc = 0; switch (p1) { case 'l': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[0].cs_buf, mp_sys[0].cs_len, css_buf, css_pos); break; case 'u': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[1].cs_buf, mp_sys[1].cs_len, css_buf, css_pos); break; case 'd': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[2].cs_buf, mp_sys[2].cs_len, css_buf, css_pos); break; case 's': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[3].cs_buf, mp_sys[3].cs_len, css_buf, css_pos); break; case 'a': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[4].cs_buf, mp_sys[4].cs_len, css_buf, css_pos); break; case 'b': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[5].cs_buf, mp_sys[5].cs_len, css_buf, css_pos); break; case 'h': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[6].cs_buf, mp_sys[6].cs_len, css_buf, css_pos); break; case 'H': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[7].cs_buf, mp_sys[7].cs_len, css_buf, css_pos); break; case '1': if (mp_usr[0].cs_len == 0) { event_log_error (hashcat_ctx, "Custom-charset 1 is undefined."); return -1; } rc = mp_add_cs_buf (hashcat_ctx, mp_usr[0].cs_buf, mp_usr[0].cs_len, css_buf, css_pos); break; case '2': if (mp_usr[1].cs_len == 0) { event_log_error (hashcat_ctx, "Custom-charset 2 is undefined."); return -1; } rc = mp_add_cs_buf (hashcat_ctx, mp_usr[1].cs_buf, mp_usr[1].cs_len, css_buf, css_pos); break; case '3': if (mp_usr[2].cs_len == 0) { event_log_error (hashcat_ctx, "Custom-charset 3 is undefined."); return -1; } rc = mp_add_cs_buf (hashcat_ctx, mp_usr[2].cs_buf, mp_usr[2].cs_len, css_buf, css_pos); break; case '4': if (mp_usr[3].cs_len == 0) { event_log_error (hashcat_ctx, "Custom-charset 4 is undefined."); return -1; } rc = mp_add_cs_buf (hashcat_ctx, mp_usr[3].cs_buf, mp_usr[3].cs_len, css_buf, css_pos); break; case '?': rc = mp_add_cs_buf (hashcat_ctx, &chr, 1, css_buf, css_pos); break; default: event_log_error (hashcat_ctx, "Syntax error: %s", mask_buf); return -1; } if (rc == -1) return -1; } else { if (user_options->hex_charset == true) { mask_pos++; // if there is no 2nd hex character, show an error: if (mask_pos == mask_len) { event_log_error (hashcat_ctx, "The hex-charset option expects exactly 2 hexadecimal chars. Failed mask: %s", mask_buf); return -1; } char p1 = mask_buf[mask_pos]; // if they are not valid hex character, show an error: if ((is_valid_hex_char ((u8) p0) == false) || (is_valid_hex_char ((u8) p1) == false)) { event_log_error (hashcat_ctx, "Invalid hex character detected in mask %s", mask_buf); return -1; } u32 chr = 0; chr |= (u32) hex_convert ((u8) p1) << 0; chr |= (u32) hex_convert ((u8) p0) << 4; const int rc = mp_add_cs_buf (hashcat_ctx, &chr, 1, css_buf, css_pos); if (rc == -1) return -1; } else { u32 chr = (u32) p0; const int rc = mp_add_cs_buf (hashcat_ctx, &chr, 1, css_buf, css_pos); if (rc == -1) return -1; } } } if (css_pos == 0) { event_log_error (hashcat_ctx, "Invalid mask length (0)."); return -1; } *css_cnt = css_pos; return 0; } static int mp_get_truncated_mask (hashcat_ctx_t *hashcat_ctx, const char *mask_buf, const size_t mask_len, const u32 len, char *new_mask_buf) { const user_options_t *user_options = hashcat_ctx->user_options; u32 mask_pos; u32 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 (user_options->hex_charset == true) { mask_pos++; if (mask_pos == mask_len) { event_log_error (hashcat_ctx, "The hex-charset option expects exactly 2 hexadecimal chars. Failed mask: %s", mask_buf); return -1; } char p1 = mask_buf[mask_pos]; // if they are not valid hex character, show an error: if ((is_valid_hex_char ((u8) p0) == false) || (is_valid_hex_char ((u8) p1) == false)) { event_log_error (hashcat_ctx, "Invalid hex character detected in mask: %s", mask_buf); return -1; } new_mask_buf[mask_pos] = p1; } } } return 0; } static void mp_setup_sys (cs_t *mp_sys) { u32 pos; u32 chr; u32 donec[CHARSIZ] = { 0 }; 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; } for (pos = 0, chr = 0x30; chr <= 0x39; chr++) { mp_sys[6].cs_buf[pos++] = chr; mp_sys[6].cs_len = pos; } for (pos = 10, chr = 0x61; chr <= 0x66; chr++) { mp_sys[6].cs_buf[pos++] = chr; mp_sys[6].cs_len = pos; } for (pos = 0, chr = 0x30; chr <= 0x39; chr++) { mp_sys[7].cs_buf[pos++] = chr; mp_sys[7].cs_len = pos; } for (pos = 10, chr = 0x41; chr <= 0x46; chr++) { mp_sys[7].cs_buf[pos++] = chr; mp_sys[7].cs_len = pos; } } static int mp_setup_usr (hashcat_ctx_t *hashcat_ctx, cs_t *mp_sys, cs_t *mp_usr, char *buf, const u32 userindex) { FILE *fp = fopen (buf, "rb"); if (fp == NULL) // feof() in case if file is empty { const int rc = mp_expand (hashcat_ctx, buf, strlen (buf), mp_sys, mp_usr, userindex, 1); if (rc == -1) return -1; } else { char mp_file[1024]; const size_t nread = hc_fread (mp_file, 1, sizeof (mp_file) - 1, fp); if (!feof (fp)) { event_log_error (hashcat_ctx, "%s: Custom charset file is too large.", buf); fclose (fp); return -1; } fclose (fp); if (nread == 0) { event_log_error (hashcat_ctx, "%s: Custom charset file is empty.", buf); return -1; } mp_file[nread] = 0; const size_t len = superchop_with_length (mp_file, nread); if (len == 0) { event_log_error (hashcat_ctx, "%s: Custom charset file is corrupted.", buf); return -1; } const int rc = mp_expand (hashcat_ctx, mp_file, len, mp_sys, mp_usr, userindex, 0); if (rc == -1) return -1; } return 0; } static void mp_reset_usr (cs_t *mp_usr, const u32 userindex) { mp_usr[userindex].cs_len = 0; memset (mp_usr[userindex].cs_buf, 0, sizeof (mp_usr[userindex].cs_buf)); } static int sp_setup_tbl (hashcat_ctx_t *hashcat_ctx) { folder_config_t *folder_config = hashcat_ctx->folder_config; mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; user_options_t *user_options = hashcat_ctx->user_options; char *shared_dir = folder_config->shared_dir; char *hcstat = user_options->markov_hcstat; u32 disable = user_options->markov_disable; u32 classic = user_options->markov_classic; hcstat_table_t *root_table_buf = mask_ctx->root_table_buf; hcstat_table_t *markov_table_buf = mask_ctx->markov_table_buf; /** * Initialize hcstats */ u64 *root_stats_buf = (u64 *) hccalloc (SP_ROOT_CNT, sizeof (u64)); u64 *root_stats_ptr = root_stats_buf; u64 *root_stats_buf_by_pos[SP_PW_MAX]; for (int i = 0; i < SP_PW_MAX; i++) { root_stats_buf_by_pos[i] = root_stats_ptr; root_stats_ptr += CHARSIZ; } u64 *markov_stats_buf = (u64 *) hccalloc (SP_MARKOV_CNT, sizeof (u64)); u64 *markov_stats_ptr = markov_stats_buf; u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ]; for (int i = 0; i < SP_PW_MAX; i++) { for (int j = 0; j < CHARSIZ; j++) { markov_stats_buf_by_key[i][j] = markov_stats_ptr; markov_stats_ptr += CHARSIZ; } } /** * Load hcstats File */ char hcstat_tmp[256]; if (hcstat == NULL) { snprintf (hcstat_tmp, sizeof (hcstat_tmp), "%s/%s", shared_dir, SP_HCSTAT); hcstat = hcstat_tmp; } hc_stat_t s; if (hc_stat (hcstat, &s) == -1) { event_log_error (hashcat_ctx, "%s: %s", hcstat, strerror (errno)); return -1; } FILE *fd = fopen (hcstat, "rb"); if (fd == NULL) { event_log_error (hashcat_ctx, "%s: %s", hcstat, strerror (errno)); return -1; } u8 *inbuf = (u8 *) hcmalloc (s.st_size); SizeT inlen = (SizeT) hc_fread (inbuf, 1, s.st_size, fd); if (inlen != (SizeT) s.st_size) { event_log_error (hashcat_ctx, "%s: Could not read data.", hcstat); fclose (fd); hcfree (inbuf); return -1; } fclose (fd); u8 *outbuf = (u8 *) hcmalloc (SP_FILESZ); SizeT outlen = SP_FILESZ; const char props = 0x1c; // lzma properties constant, retrieved with 7z2hashcat const SRes res = hc_lzma2_decompress (inbuf, &inlen, outbuf, &outlen, &props); if (res != SZ_OK) { event_log_error (hashcat_ctx, "%s: Could not uncompress data.", hcstat); hcfree (inbuf); hcfree (outbuf); return -1; } if (outlen != SP_FILESZ) { event_log_error (hashcat_ctx, "%s: Could not uncompress data.", hcstat); hcfree (inbuf); hcfree (outbuf); return -1; } u64 *ptr = (u64 *) outbuf; u64 v = *ptr++; u64 z = *ptr++; memcpy (root_stats_buf, ptr, sizeof (u64) * SP_ROOT_CNT); ptr += SP_ROOT_CNT; memcpy (markov_stats_buf, ptr, sizeof (u64) * SP_MARKOV_CNT); // ptr += SP_MARKOV_CNT; hcfree (inbuf); hcfree (outbuf); /** * switch endianess */ v = byte_swap_64 (v); z = byte_swap_64 (z); for (int i = 0; i < SP_ROOT_CNT; i++) root_stats_buf[i] = byte_swap_64 (root_stats_buf[i]); for (int i = 0; i < SP_MARKOV_CNT; i++) markov_stats_buf[i] = byte_swap_64 (markov_stats_buf[i]); /** * verify header */ if (v != SP_VERSION) { event_log_error (hashcat_ctx, "%s: Invalid header", hcstat); return -1; } if (z != 0) { event_log_error (hashcat_ctx, "%s: Invalid header", hcstat); return -1; } /** * Markov modifier of hcstat_table on user request */ if (disable) { memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64)); memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64)); } if (classic) { /* Add all stats to first position */ for (int i = 1; i < SP_PW_MAX; i++) { u64 *out = root_stats_buf_by_pos[0]; u64 *in = root_stats_buf_by_pos[i]; for (int j = 0; j < CHARSIZ; j++) { *out++ += *in++; } } for (int i = 1; i < SP_PW_MAX; i++) { u64 *out = markov_stats_buf_by_key[0][0]; u64 *in = markov_stats_buf_by_key[i][0]; for (int j = 0; j < CHARSIZ; j++) { for (int k = 0; k < CHARSIZ; k++) { *out++ += *in++; } } } /* copy them to all pw_positions */ for (int i = 1; i < SP_PW_MAX; i++) { memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64)); } for (int 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 (u64)); } } /** * Initialize tables */ hcstat_table_t *root_table_ptr = root_table_buf; hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX]; for (int 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 (int i = 0; i < SP_PW_MAX; i++) { for (int j = 0; j < CHARSIZ; j++) { markov_table_buf_by_key[i][j] = markov_table_ptr; markov_table_ptr += CHARSIZ; } } /** * Convert hcstat to tables */ for (int i = 0; i < SP_ROOT_CNT; i++) { u32 key = i % CHARSIZ; root_table_buf[i].key = key; root_table_buf[i].val = root_stats_buf[i]; } for (int i = 0; i < SP_MARKOV_CNT; i++) { u32 key = i % CHARSIZ; markov_table_buf[i].key = key; markov_table_buf[i].val = markov_stats_buf[i]; } hcfree (root_stats_buf); hcfree (markov_stats_buf); /** * Finally sort them */ for (int i = 0; i < SP_PW_MAX; i++) { qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val); } for (int i = 0; i < SP_PW_MAX; i++) { for (int j = 0; j < CHARSIZ; j++) { qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val); } } return 0; } static int sp_get_sum (u32 start, u32 stop, cs_t *root_css_buf, u64 *result) { u64 sum = 1; u32 i; for (i = start; i < stop; i++) { if (overflow_check_u64_mul (sum, root_css_buf[i].cs_len) == false) return -1; sum *= root_css_buf[i].cs_len; } *result = sum; return 0; } static 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, u32 threshold, u32 uniq_tbls[SP_PW_MAX][CHARSIZ]) { memset (root_css_buf, 0, SP_PW_MAX * sizeof (cs_t)); memset (markov_css_buf, 0, SP_PW_MAX * CHARSIZ * sizeof (cs_t)); /** * Convert tables to css */ for (u32 i = 0; i < SP_ROOT_CNT; i++) { u32 pw_pos = i / CHARSIZ; cs_t *cs = &root_css_buf[pw_pos]; if (cs->cs_len == threshold) continue; u32 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 (u32 i = 0; i < SP_MARKOV_CNT; i++) { u32 c = i / CHARSIZ; cs_t *cs = &markov_css_buf[c]; if (cs->cs_len == threshold) continue; u32 pw_pos = c / CHARSIZ; u32 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 (u32 i = 0; i < 8; i++) { for (u32 j = 0x20; j < 0x80; j++) { cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j]; printf ("pos:%u key:%u len:%u" EOL, i, j, ptr->cs_len); for (u32 k = 0; k < 10; k++) { printf (" %u" EOL, ptr->cs_buf[k]); } } } */ } void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, u32 start, u32 stop) { u64 v = ctx; cs_t *cs = &root_css_buf[start]; u32 i; for (i = start; i < stop; i++) { const u64 m = v % cs->cs_len; const u64 d = v / cs->cs_len; v = d; const u32 k = cs->cs_buf[m]; pw_buf[i - start] = (char) k; cs = &markov_css_buf[(i * CHARSIZ) + k]; } } static int mask_append_final (hashcat_ctx_t *hashcat_ctx, const char *mask) { mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; if (mask_ctx->masks_avail == mask_ctx->masks_cnt) { mask_ctx->masks = (char **) hcrealloc (mask_ctx->masks, mask_ctx->masks_avail * sizeof (char *), INCR_MASKS * sizeof (char *)); mask_ctx->masks_avail += INCR_MASKS; } mask_ctx->masks[mask_ctx->masks_cnt] = hcstrdup (mask); mask_ctx->masks_cnt++; return 0; } static int mask_append (hashcat_ctx_t *hashcat_ctx, const char *mask, const char *prepend) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; user_options_t *user_options = hashcat_ctx->user_options; if (user_options->increment == true) { const u32 mask_length = mp_get_length (mask); u32 increment_min = user_options->increment_min; u32 increment_max = user_options->increment_max; increment_max = MIN (increment_max, mask_length); if (user_options->attack_mode == ATTACK_MODE_BF) { const u32 pw_min = hashconfig->pw_min; const u32 pw_max = hashconfig->pw_max; increment_min = MAX (increment_min, pw_min); increment_max = MIN (increment_max, pw_max); } for (u32 increment_len = increment_min; increment_len <= increment_max; increment_len++) { char *mask_truncated = (char *) hcmalloc (256); char *mask_truncated_next = mask_truncated; if (prepend) { // this happens with maskfiles only mask_truncated_next += snprintf (mask_truncated, 256, "%s,", prepend); } const int rc_truncated_mask = mp_get_truncated_mask (hashcat_ctx, mask, strlen (mask), increment_len, mask_truncated_next); if (rc_truncated_mask == -1) { hcfree (mask_truncated); break; } const int rc = mask_append_final (hashcat_ctx, mask_truncated); hcfree (mask_truncated); if (rc == -1) return -1; } } else { if (prepend) { // this happens with maskfiles only char *prepend_mask; hc_asprintf (&prepend_mask, "%s,%s", prepend, mask); const int rc = mask_append_final (hashcat_ctx, prepend_mask); hcfree (prepend_mask); if (rc == -1) return -1; } else { const int rc = mask_append_final (hashcat_ctx, mask); if (rc == -1) return -1; } } return 0; } u32 mp_get_length (const char *mask) { u32 len = 0; u32 mask_len = strlen (mask); for (u32 i = 0; i < mask_len; i++) { if (mask[i] == '?') i++; len++; } return len; } static char *mask_ctx_parse_maskfile_find_mask (char *line_buf, int line_len) { char *mask_buf = line_buf; bool escaped = false; for (int i = 0; i < line_len; i++) { if (escaped == true) { escaped = false; } else { if (line_buf[i] == '\\') { escaped = true; } else if (line_buf[i] == ',') { mask_buf = line_buf + i + 1; } } } return mask_buf; } int mask_ctx_update_loop (hashcat_ctx_t *hashcat_ctx) { combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; logfile_ctx_t *logfile_ctx = hashcat_ctx->logfile_ctx; mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; user_options_t *user_options = hashcat_ctx->user_options; if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { if (user_options->attack_mode == ATTACK_MODE_COMBI) { } else if ((user_options->attack_mode == ATTACK_MODE_HYBRID1) || (user_options->attack_mode == ATTACK_MODE_HYBRID2)) { if (((hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) == 0) && (user_options->attack_mode == ATTACK_MODE_HYBRID2)) { mask_ctx->mask = mask_ctx->masks[mask_ctx->masks_pos]; const int rc_mask_file = mask_ctx_parse_maskfile (hashcat_ctx); if (rc_mask_file == -1) return -1; mask_ctx->css_buf = (cs_t *) hccalloc (256, sizeof (cs_t)); const int rc_gen_css = mp_gen_css (hashcat_ctx, mask_ctx->mask, strlen (mask_ctx->mask), mask_ctx->mp_sys, mask_ctx->mp_usr, mask_ctx->css_buf, &mask_ctx->css_cnt); if (rc_gen_css == -1) return -1; u32 uniq_tbls[SP_PW_MAX][CHARSIZ] = { { 0 } }; mp_css_to_uniq_tbl (hashcat_ctx, mask_ctx->css_cnt, mask_ctx->css_buf, uniq_tbls); sp_tbl_to_css (mask_ctx->root_table_buf, mask_ctx->markov_table_buf, mask_ctx->root_css_buf, mask_ctx->markov_css_buf, user_options->markov_threshold, uniq_tbls); const int rc_get_sum = sp_get_sum (0, mask_ctx->css_cnt, mask_ctx->root_css_buf, &mask_ctx->bfs_cnt); if (rc_get_sum == -1) { event_log_error (hashcat_ctx, "Integer overflow detected in keyspace of mask: %s", mask_ctx->mask); return -1; } const int rc_update_mp = opencl_session_update_mp (hashcat_ctx); if (rc_update_mp == -1) return -1; } else { mask_ctx->mask = mask_ctx->masks[mask_ctx->masks_pos]; const int rc_mask_file = mask_ctx_parse_maskfile (hashcat_ctx); if (rc_mask_file == -1) return -1; mask_ctx->css_buf = (cs_t *) hccalloc (256, sizeof (cs_t)); const int rc_gen_css = mp_gen_css (hashcat_ctx, mask_ctx->mask, strlen (mask_ctx->mask), mask_ctx->mp_sys, mask_ctx->mp_usr, mask_ctx->css_buf, &mask_ctx->css_cnt); if (rc_gen_css == -1) return -1; u32 uniq_tbls[SP_PW_MAX][CHARSIZ] = { { 0 } }; mp_css_to_uniq_tbl (hashcat_ctx, mask_ctx->css_cnt, mask_ctx->css_buf, uniq_tbls); sp_tbl_to_css (mask_ctx->root_table_buf, mask_ctx->markov_table_buf, mask_ctx->root_css_buf, mask_ctx->markov_css_buf, user_options->markov_threshold, uniq_tbls); const int rc_get_sum = sp_get_sum (0, mask_ctx->css_cnt, mask_ctx->root_css_buf, &combinator_ctx->combs_cnt); if (rc_get_sum == -1) { event_log_error (hashcat_ctx, "Integer overflow detected in keyspace of mask: %s", mask_ctx->mask); return -1; } const int rc_update_mp = opencl_session_update_mp (hashcat_ctx); if (rc_update_mp == -1) return -1; } } const int rc_update_combinator = opencl_session_update_combinator (hashcat_ctx); if (rc_update_combinator == -1) return -1; } else if (user_options_extra->attack_kern == ATTACK_KERN_BF) { mask_ctx->mask = mask_ctx->masks[mask_ctx->masks_pos]; const int rc_mask_file = mask_ctx_parse_maskfile (hashcat_ctx); if (rc_mask_file == -1) return -1; if (user_options->attack_mode == ATTACK_MODE_BF) // always true { mask_ctx->css_buf = (cs_t *) hccalloc (256, sizeof (cs_t)); const int rc_gen_css = mp_gen_css (hashcat_ctx, mask_ctx->mask, strlen (mask_ctx->mask), mask_ctx->mp_sys, mask_ctx->mp_usr, mask_ctx->css_buf, &mask_ctx->css_cnt); if (rc_gen_css == -1) return -1; // special case for benchmark u32 pw_min = hashconfig->pw_min; u32 pw_max = hashconfig->pw_max; if (user_options->benchmark == true) { pw_min = mp_get_length (mask_ctx->mask); pw_max = pw_min; } hashconfig->pw_min = pw_min; hashconfig->pw_max = pw_max; // check if mask is not too large or too small for pw_min/pw_max u32 mask_min = hashconfig->pw_min; u32 mask_max = hashconfig->pw_max; if ((mask_ctx->css_cnt < mask_min) || (mask_ctx->css_cnt > mask_max)) { if (mask_ctx->css_cnt < mask_min) { event_log_warning (hashcat_ctx, "Skipping mask '%s' because it is smaller than the minimum password length.", mask_ctx->mask); } if (mask_ctx->css_cnt > mask_max) { event_log_warning (hashcat_ctx, "Skipping mask '%s' because it is larger than the maximum password length.", mask_ctx->mask); } // skip to next mask logfile_sub_msg ("STOP"); return 0; } if (hashconfig->opts_type & OPTS_TYPE_PT_UTF16LE) { const int rc = mp_css_utf16le_expand (hashcat_ctx); if (rc == -1) return -1; } else if (hashconfig->opts_type & OPTS_TYPE_PT_UTF16BE) { const int rc = mp_css_utf16be_expand (hashcat_ctx); if (rc == -1) return -1; } u32 css_cnt_orig = mask_ctx->css_cnt; if (hashconfig->opti_type & OPTI_TYPE_SINGLE_HASH) { if (hashconfig->opti_type & OPTI_TYPE_APPENDED_SALT) { const int rc = mp_css_append_salt (hashcat_ctx, &hashes->salts_buf[0]); if (rc == -1) return -1; } } u32 uniq_tbls[SP_PW_MAX][CHARSIZ] = { { 0 } }; mp_css_to_uniq_tbl (hashcat_ctx, mask_ctx->css_cnt, mask_ctx->css_buf, uniq_tbls); sp_tbl_to_css (mask_ctx->root_table_buf, mask_ctx->markov_table_buf, mask_ctx->root_css_buf, mask_ctx->markov_css_buf, user_options->markov_threshold, uniq_tbls); const int rc_get_sum1 = sp_get_sum (0, mask_ctx->css_cnt, mask_ctx->root_css_buf, &status_ctx->words_cnt); if (rc_get_sum1 == -1) { event_log_error (hashcat_ctx, "Integer overflow detected in keyspace of mask: %s", mask_ctx->mask); return -1; } // copy + args u32 css_cnt_lr[2]; mp_css_split_cnt (hashcat_ctx, css_cnt_orig, css_cnt_lr); const int rc_get_sum2 = sp_get_sum (0, css_cnt_lr[1], mask_ctx->root_css_buf, &mask_ctx->bfs_cnt); if (rc_get_sum2 == -1) { event_log_error (hashcat_ctx, "Integer overflow detected in keyspace of mask: %s", mask_ctx->mask); return -1; } const int rc_update_mp_rl = opencl_session_update_mp_rl (hashcat_ctx, css_cnt_lr[0], css_cnt_lr[1]); if (rc_update_mp_rl == -1) return -1; } } return 0; } int mask_ctx_init (hashcat_ctx_t *hashcat_ctx) { mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; user_options_t *user_options = hashcat_ctx->user_options; mask_ctx->enabled = false; if (user_options->example_hashes == true) return 0; if (user_options->left == true) return 0; if (user_options->opencl_info == true) return 0; if (user_options->show == true) return 0; if (user_options->usage == true) return 0; if (user_options->version == true) return 0; if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) return 0; if (user_options->attack_mode == ATTACK_MODE_COMBI) return 0; mask_ctx->enabled = true; mask_ctx->root_table_buf = (hcstat_table_t *) hccalloc (SP_ROOT_CNT, sizeof (hcstat_table_t)); mask_ctx->markov_table_buf = (hcstat_table_t *) hccalloc (SP_MARKOV_CNT, sizeof (hcstat_table_t)); sp_setup_tbl (hashcat_ctx); mask_ctx->root_css_buf = (cs_t *) hccalloc (SP_PW_MAX, sizeof (cs_t)); mask_ctx->markov_css_buf = (cs_t *) hccalloc (SP_PW_MAX * CHARSIZ, sizeof (cs_t)); mask_ctx->css_cnt = 0; mask_ctx->css_buf = NULL; mask_ctx->mask_from_file = false; mask_ctx->masks = NULL; mask_ctx->masks_pos = 0; mask_ctx->masks_cnt = 0; mask_ctx->mfs = (mf_t *) hccalloc (MAX_MFS, sizeof (mf_t)); mp_setup_sys (mask_ctx->mp_sys); if (user_options->custom_charset_1) { const int rc = mp_setup_usr (hashcat_ctx, mask_ctx->mp_sys, mask_ctx->mp_usr, user_options->custom_charset_1, 0); if (rc == -1) return -1; } if (user_options->custom_charset_2) { const int rc = mp_setup_usr (hashcat_ctx, mask_ctx->mp_sys, mask_ctx->mp_usr, user_options->custom_charset_2, 1); if (rc == -1) return -1; } if (user_options->custom_charset_3) { const int rc = mp_setup_usr (hashcat_ctx, mask_ctx->mp_sys, mask_ctx->mp_usr, user_options->custom_charset_3, 2); if (rc == -1) return -1; } if (user_options->custom_charset_4) { const int rc = mp_setup_usr (hashcat_ctx, mask_ctx->mp_sys, mask_ctx->mp_usr, user_options->custom_charset_4, 3); if (rc == -1) return -1; } if (user_options->attack_mode == ATTACK_MODE_BF) { if (user_options->benchmark == false) { if (user_options_extra->hc_workc) { char *arg = user_options_extra->hc_workv[0]; if (hc_path_exist (arg) == false) { const int rc = mask_append (hashcat_ctx, arg, NULL); if (rc == -1) return -1; } else { mask_ctx->mask_from_file = true; for (int i = 0; i < user_options_extra->hc_workc; i++) { arg = user_options_extra->hc_workv[i]; if (hc_path_is_file (arg) == true) { FILE *mask_fp = fopen (arg, "r"); if (mask_fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", arg, strerror (errno)); return -1; } char *line_buf = (char *) hcmalloc (HCBUFSIZ_LARGE); while (!feof (mask_fp)) { const int line_len = fgetl (mask_fp, line_buf); if (line_len == 0) continue; if (line_buf[0] == '#') continue; char *mask_buf = mask_ctx_parse_maskfile_find_mask (line_buf, line_len); char *prepend_buf = NULL; if (line_buf != mask_buf) { // if we have custom charsets prepend_buf = line_buf; mask_buf[-1] = 0; } const int rc = mask_append (hashcat_ctx, mask_buf, prepend_buf); if (rc == -1) { fclose (mask_fp); return -1; } } hcfree (line_buf); fclose (mask_fp); } else { event_log_error (hashcat_ctx, "%s: unsupported file type.", arg); return -1; } } } } else { const char *mask = DEF_MASK; const int rc = mask_append (hashcat_ctx, mask, NULL); if (rc == -1) return -1; } } else { const char *mask = hashconfig_benchmark_mask (hashcat_ctx); const int rc = mask_append (hashcat_ctx, mask, NULL); if (rc == -1) return -1; } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { // display char *arg = user_options_extra->hc_workv[user_options_extra->hc_workc - 1]; // mod if (hc_path_exist (arg) == false) { const int rc = mask_append (hashcat_ctx, arg, NULL); if (rc == -1) return -1; } else { if (hc_path_is_file (arg) == true) { mask_ctx->mask_from_file = true; FILE *mask_fp = fopen (arg, "r"); if (mask_fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", arg, strerror (errno)); return -1; } char *line_buf = (char *) hcmalloc (HCBUFSIZ_LARGE); while (!feof (mask_fp)) { const int line_len = fgetl (mask_fp, line_buf); if (line_len == 0) continue; if (line_buf[0] == '#') continue; char *mask_buf = mask_ctx_parse_maskfile_find_mask (line_buf, line_len); char *prepend_buf = NULL; if (line_buf != mask_buf) { // if we have custom charsets prepend_buf = line_buf; mask_buf[-1] = 0; } const int rc = mask_append (hashcat_ctx, mask_buf, prepend_buf); if (rc == -1) { fclose (mask_fp); return -1; } } hcfree (line_buf); fclose (mask_fp); } else { event_log_error (hashcat_ctx, "%s: unsupported file type.", arg); return -1; } } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { // display char *arg = user_options_extra->hc_workv[0]; // mod if (hc_path_exist (arg) == false) { const int rc = mask_append (hashcat_ctx, arg, NULL); if (rc == -1) return -1; } else { if (hc_path_is_file (arg) == true) { mask_ctx->mask_from_file = true; FILE *mask_fp = fopen (arg, "r"); if (mask_fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", arg, strerror (errno)); return -1; } char *line_buf = (char *) hcmalloc (HCBUFSIZ_LARGE); while (!feof (mask_fp)) { const int line_len = fgetl (mask_fp, line_buf); if (line_len == 0) continue; if (line_buf[0] == '#') continue; char *mask_buf = mask_ctx_parse_maskfile_find_mask (line_buf, line_len); char *prepend_buf = NULL; if (line_buf != mask_buf) { // if we have custom charsets prepend_buf = line_buf; mask_buf[-1] = 0; } const int rc = mask_append (hashcat_ctx, mask_buf, prepend_buf); if (rc == -1) { fclose (mask_fp); return -1; } } hcfree (line_buf); fclose (mask_fp); } else { event_log_error (hashcat_ctx, "%s: unsupported file type.", arg); return -1; } } } if (mask_ctx->masks_cnt == 0) { event_log_error (hashcat_ctx, "Invalid mask."); return -1; } mask_ctx->mask = mask_ctx->masks[0]; return 0; } void mask_ctx_destroy (hashcat_ctx_t *hashcat_ctx) { mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; if (mask_ctx->enabled == false) return; hcfree (mask_ctx->css_buf); hcfree (mask_ctx->root_css_buf); hcfree (mask_ctx->markov_css_buf); hcfree (mask_ctx->root_table_buf); hcfree (mask_ctx->markov_table_buf); for (u32 mask_pos = 0; mask_pos < mask_ctx->masks_cnt; mask_pos++) { hcfree (mask_ctx->masks[mask_pos]); } hcfree (mask_ctx->masks); hcfree (mask_ctx->mfs); memset (mask_ctx, 0, sizeof (mask_ctx_t)); } int mask_ctx_parse_maskfile (hashcat_ctx_t *hashcat_ctx) { mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; user_options_t *user_options = hashcat_ctx->user_options; if (mask_ctx->enabled == false) return 0; if (mask_ctx->mask_from_file == false) return 0; mf_t *mfs_buf = mask_ctx->mfs; mfs_buf[0].mf_len = 0; mfs_buf[1].mf_len = 0; mfs_buf[2].mf_len = 0; mfs_buf[3].mf_len = 0; mfs_buf[4].mf_len = 0; int mfs_cnt = 0; char *mask_buf = mask_ctx->mask; const int mask_len = strlen (mask_buf); bool escaped = false; for (int i = 0; i < mask_len; i++) { mf_t *mf = mfs_buf + mfs_cnt; if (escaped == true) { escaped = false; mf->mf_buf[mf->mf_len] = mask_buf[i]; mf->mf_len++; } else { if (mask_buf[i] == '\\') { escaped = true; } else if (mask_buf[i] == ',') { mf->mf_buf[mf->mf_len] = 0; mfs_cnt++; if (mfs_cnt == MAX_MFS) { event_log_error (hashcat_ctx, "Invalid line '%s' in maskfile.", mask_buf); return -1; } } else { mf->mf_buf[mf->mf_len] = mask_buf[i]; mf->mf_len++; } } } mf_t *mf = mfs_buf + mfs_cnt; mf->mf_buf[mf->mf_len] = 0; user_options->custom_charset_1 = NULL; user_options->custom_charset_2 = NULL; user_options->custom_charset_3 = NULL; user_options->custom_charset_4 = NULL; mp_reset_usr (mask_ctx->mp_usr, 0); mp_reset_usr (mask_ctx->mp_usr, 1); mp_reset_usr (mask_ctx->mp_usr, 2); mp_reset_usr (mask_ctx->mp_usr, 3); for (int i = 0; i < mfs_cnt; i++) { switch (i) { case 0: user_options->custom_charset_1 = mfs_buf[0].mf_buf; mp_setup_usr (hashcat_ctx, mask_ctx->mp_sys, mask_ctx->mp_usr, user_options->custom_charset_1, 0); break; case 1: user_options->custom_charset_2 = mfs_buf[1].mf_buf; mp_setup_usr (hashcat_ctx, mask_ctx->mp_sys, mask_ctx->mp_usr, user_options->custom_charset_2, 1); break; case 2: user_options->custom_charset_3 = mfs_buf[2].mf_buf; mp_setup_usr (hashcat_ctx, mask_ctx->mp_sys, mask_ctx->mp_usr, user_options->custom_charset_3, 2); break; case 3: user_options->custom_charset_4 = mfs_buf[3].mf_buf; mp_setup_usr (hashcat_ctx, mask_ctx->mp_sys, mask_ctx->mp_usr, user_options->custom_charset_4, 3); break; } } mask_ctx->mask = mfs_buf[mfs_cnt].mf_buf; return 0; } hashcat-4.0.1/src/opencl.c000066400000000000000000006303471320027462700153620ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "locking.h" #include "thread.h" #include "timer.h" #include "tuningdb.h" #include "rp.h" #include "rp_cpu.h" #include "mpsp.h" #include "straight.h" #include "combinator.h" #include "convert.h" #include "stdout.h" #include "filehandling.h" #include "interface.h" #include "wordlist.h" #include "shared.h" #include "hashes.h" #include "cpu_md5.h" #include "event.h" #include "dynloader.h" #include "opencl.h" #if defined (__linux__) static const char dri_card0_path[] = "/dev/dri/card0"; static const char drm_card0_vendor_path[] = "/sys/class/drm/card0/device/vendor"; static const char drm_card0_driver_path[] = "/sys/class/drm/card0/device/driver"; #endif static const u32 full01 = 0x01010101; static const u32 full80 = 0x80808080; static double TARGET_MSEC_PROFILE[4] = { 2, 12, 96, 480 }; static int ocl_check_dri (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx) { #if defined (__linux__) // This check makes sense only if we're not root const uid_t uid = getuid (); if (uid == 0) return 0; // No GPU available! That's fine, so we don't need to check if we have access to it. if (hc_path_exist (dri_card0_path) == false) return 0; // Now we need to check if this an AMD vendor, because this is when the problems start FILE *fd_drm = fopen (drm_card0_vendor_path, "rb"); if (fd_drm == NULL) return 0; u32 vendor = 0; if (fscanf (fd_drm, "0x%x", &vendor) != 1) { fclose (fd_drm); return 0; } fclose (fd_drm); if (vendor != 4098) return 0; // Now the problem is only with AMDGPU-PRO, not with oldschool AMD driver char buf[HCBUFSIZ_TINY]; const ssize_t len = readlink (drm_card0_driver_path, buf, HCBUFSIZ_TINY - 1); if (len == -1) return 0; buf[len] = 0; if (strstr (buf, "amdgpu") == NULL) return 0; // Now do the real check FILE *fd_dri = fopen (dri_card0_path, "rb"); if (fd_dri == NULL) { event_log_error (hashcat_ctx, "Cannot access %s: %m.", dri_card0_path); event_log_warning (hashcat_ctx, "This causes some drivers to crash when OpenCL is used!"); event_log_warning (hashcat_ctx, "Adding your user to the \"video\" group usually fixes this problem:"); event_log_warning (hashcat_ctx, "$ sudo usermod -a -G video $LOGNAME"); event_log_warning (hashcat_ctx, NULL); return -1; } fclose (fd_dri); #endif // __linux__ return 0; } static int setup_opencl_platforms_filter (hashcat_ctx_t *hashcat_ctx, const char *opencl_platforms, u32 *out) { u32 opencl_platforms_filter = 0; if (opencl_platforms) { char *platforms = hcstrdup (opencl_platforms); if (platforms == NULL) return -1; char *saveptr; char *next = strtok_r (platforms, ",", &saveptr); do { int platform = atoi (next); if (platform < 1 || platform > 32) { event_log_error (hashcat_ctx, "Invalid OpenCL platform %d specified.", platform); hcfree (platforms); return -1; } opencl_platforms_filter |= 1u << (platform - 1); } while ((next = strtok_r (NULL, ",", &saveptr)) != NULL); hcfree (platforms); } else { opencl_platforms_filter = -1u; } *out = opencl_platforms_filter; return 0; } static int setup_devices_filter (hashcat_ctx_t *hashcat_ctx, const char *opencl_devices, u32 *out) { u32 devices_filter = 0; if (opencl_devices) { char *devices = hcstrdup (opencl_devices); if (devices == NULL) return -1; char *saveptr; char *next = strtok_r (devices, ",", &saveptr); do { int device_id = atoi (next); if (device_id < 1 || device_id > 32) { event_log_error (hashcat_ctx, "Invalid device_id %d specified.", device_id); hcfree (devices); return -1; } devices_filter |= 1u << (device_id - 1); } while ((next = strtok_r (NULL, ",", &saveptr)) != NULL); hcfree (devices); } else { devices_filter = -1u; } *out = devices_filter; return 0; } static int setup_device_types_filter (hashcat_ctx_t *hashcat_ctx, const char *opencl_device_types, cl_device_type *out) { cl_device_type device_types_filter = 0; if (opencl_device_types) { char *device_types = hcstrdup (opencl_device_types); if (device_types == NULL) return -1; char *saveptr; char *next = strtok_r (device_types, ",", &saveptr); do { int device_type = atoi (next); if (device_type < 1 || device_type > 3) { event_log_error (hashcat_ctx, "Invalid device_type %d specified.", device_type); hcfree (device_types); return -1; } device_types_filter |= 1u << device_type; } while ((next = strtok_r (NULL, ",", &saveptr)) != NULL); hcfree (device_types); } else { // Do not use CPU by default, this often reduces GPU performance because // the CPU is too busy to handle GPU synchronization device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU; } *out = device_types_filter; return 0; } static int read_kernel_binary (hashcat_ctx_t *hashcat_ctx, const char *kernel_file, size_t *kernel_lengths, char **kernel_sources) { FILE *fp = fopen (kernel_file, "rb"); if (fp != NULL) { hc_stat_t st; if (hc_stat (kernel_file, &st)) { fclose (fp); return -1; } char *buf = (char *) hcmalloc (st.st_size + 1); size_t num_read = hc_fread (buf, sizeof (char), st.st_size, fp); fclose (fp); if (num_read != (size_t) st.st_size) { event_log_error (hashcat_ctx, "%s: %s", kernel_file, strerror (errno)); hcfree (buf); return -1; } buf[st.st_size] = 0; kernel_lengths[0] = (size_t) st.st_size; kernel_sources[0] = buf; } else { event_log_error (hashcat_ctx, "%s: %s", kernel_file, strerror (errno)); return -1; } return 0; } static int write_kernel_binary (hashcat_ctx_t *hashcat_ctx, char *kernel_file, char *binary, size_t binary_size) { if (binary_size > 0) { FILE *fp = fopen (kernel_file, "wb"); if (fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", kernel_file, strerror (errno)); return -1; } if (lock_file (fp) == -1) { fclose (fp); event_log_error (hashcat_ctx, "%s: %s", kernel_file, strerror (errno)); return -1; } hc_fwrite (binary, sizeof (char), binary_size, fp); fflush (fp); fclose (fp); } return 0; } void generate_source_kernel_filename (const u32 attack_exec, const u32 attack_kern, const u32 kern_type, const u32 opti_type, char *shared_dir, char *source_file) { if (opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { if (attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { if (attack_kern == ATTACK_KERN_STRAIGHT) snprintf (source_file, 255, "%s/OpenCL/m%05d_a0-optimized.cl", shared_dir, (int) kern_type); else if (attack_kern == ATTACK_KERN_COMBI) snprintf (source_file, 255, "%s/OpenCL/m%05d_a1-optimized.cl", shared_dir, (int) kern_type); else if (attack_kern == ATTACK_KERN_BF) snprintf (source_file, 255, "%s/OpenCL/m%05d_a3-optimized.cl", shared_dir, (int) kern_type); } else { snprintf (source_file, 255, "%s/OpenCL/m%05d-optimized.cl", shared_dir, (int) kern_type); } } else { if (attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { if (attack_kern == ATTACK_KERN_STRAIGHT) snprintf (source_file, 255, "%s/OpenCL/m%05d_a0.cl", shared_dir, (int) kern_type); else if (attack_kern == ATTACK_KERN_COMBI) snprintf (source_file, 255, "%s/OpenCL/m%05d_a1.cl", shared_dir, (int) kern_type); else if (attack_kern == ATTACK_KERN_BF) snprintf (source_file, 255, "%s/OpenCL/m%05d_a3.cl", shared_dir, (int) kern_type); } else { snprintf (source_file, 255, "%s/OpenCL/m%05d.cl", shared_dir, (int) kern_type); } } } void generate_cached_kernel_filename (const u32 attack_exec, const u32 attack_kern, const u32 kern_type, const u32 opti_type, char *profile_dir, const char *device_name_chksum, char *cached_file) { if (opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { if (attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { if (attack_kern == ATTACK_KERN_STRAIGHT) snprintf (cached_file, 255, "%s/kernels/m%05d_a0-optimized.%s.kernel", profile_dir, (int) kern_type, device_name_chksum); else if (attack_kern == ATTACK_KERN_COMBI) snprintf (cached_file, 255, "%s/kernels/m%05d_a1-optimized.%s.kernel", profile_dir, (int) kern_type, device_name_chksum); else if (attack_kern == ATTACK_KERN_BF) snprintf (cached_file, 255, "%s/kernels/m%05d_a3-optimized.%s.kernel", profile_dir, (int) kern_type, device_name_chksum); } else { snprintf (cached_file, 255, "%s/kernels/m%05d-optimized.%s.kernel", profile_dir, (int) kern_type, device_name_chksum); } } else { if (attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { if (attack_kern == ATTACK_KERN_STRAIGHT) snprintf (cached_file, 255, "%s/kernels/m%05d_a0.%s.kernel", profile_dir, (int) kern_type, device_name_chksum); else if (attack_kern == ATTACK_KERN_COMBI) snprintf (cached_file, 255, "%s/kernels/m%05d_a1.%s.kernel", profile_dir, (int) kern_type, device_name_chksum); else if (attack_kern == ATTACK_KERN_BF) snprintf (cached_file, 255, "%s/kernels/m%05d_a3.%s.kernel", profile_dir, (int) kern_type, device_name_chksum); } else { snprintf (cached_file, 255, "%s/kernels/m%05d.%s.kernel", profile_dir, (int) kern_type, device_name_chksum); } } } void generate_source_kernel_mp_filename (const u32 opti_type, const u64 opts_type, char *shared_dir, char *source_file) { if ((opti_type & OPTI_TYPE_BRUTE_FORCE) && (opts_type & OPTS_TYPE_PT_GENERATE_BE)) { snprintf (source_file, 255, "%s/OpenCL/markov_be.cl", shared_dir); } else { snprintf (source_file, 255, "%s/OpenCL/markov_le.cl", shared_dir); } } void generate_cached_kernel_mp_filename (const u32 opti_type, const u64 opts_type, char *profile_dir, const char *device_name_chksum_amp_mp, char *cached_file) { if ((opti_type & OPTI_TYPE_BRUTE_FORCE) && (opts_type & OPTS_TYPE_PT_GENERATE_BE)) { snprintf (cached_file, 255, "%s/kernels/markov_be.%s.kernel", profile_dir, device_name_chksum_amp_mp); } else { snprintf (cached_file, 255, "%s/kernels/markov_le.%s.kernel", profile_dir, device_name_chksum_amp_mp); } } void generate_source_kernel_amp_filename (const u32 attack_kern, char *shared_dir, char *source_file) { snprintf (source_file, 255, "%s/OpenCL/amp_a%u.cl", shared_dir, attack_kern); } void generate_cached_kernel_amp_filename (const u32 attack_kern, char *profile_dir, const char *device_name_chksum_amp_mp, char *cached_file) { snprintf (cached_file, 255, "%s/kernels/amp_a%u.%s.kernel", profile_dir, attack_kern, device_name_chksum_amp_mp); } int ocl_init (hashcat_ctx_t *hashcat_ctx) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; memset (ocl, 0, sizeof (OCL_PTR)); #if defined (_WIN) ocl->lib = hc_dlopen ("OpenCL"); #elif defined (__APPLE__) ocl->lib = hc_dlopen ("/System/Library/Frameworks/OpenCL.framework/OpenCL", RTLD_NOW); #elif defined (__CYGWIN__) ocl->lib = hc_dlopen ("opencl.dll", RTLD_NOW); if (ocl->lib == NULL) ocl->lib = hc_dlopen ("cygOpenCL-1.dll", RTLD_NOW); #else ocl->lib = hc_dlopen ("libOpenCL.so", RTLD_NOW); if (ocl->lib == NULL) ocl->lib = hc_dlopen ("libOpenCL.so.1", RTLD_NOW); #endif if (ocl->lib == NULL) { event_log_error (hashcat_ctx, "Cannot find an OpenCL ICD loader library."); event_log_warning (hashcat_ctx, "You are probably missing the native OpenCL runtime or driver for your platform."); event_log_warning (hashcat_ctx, NULL); #if defined (__linux__) event_log_warning (hashcat_ctx, "* AMD GPUs on Linux require this runtime and/or driver:"); event_log_warning (hashcat_ctx, " \"RadeonOpenCompute (ROCm)\" Software Platform (1.6.180 or later)"); #elif defined (_WIN) event_log_warning (hashcat_ctx, "* AMD GPUs on Windows require this runtime and/or driver:"); event_log_warning (hashcat_ctx, " \"AMD Radeon Software Crimson Edition\" (15.12 or later)"); #endif event_log_warning (hashcat_ctx, "* Intel CPUs require this runtime and/or driver:"); event_log_warning (hashcat_ctx, " \"OpenCL Runtime for Intel Core and Intel Xeon Processors\" (16.1.1 or later)"); #if defined (__linux__) event_log_warning (hashcat_ctx, "* Intel GPUs on Linux require this runtime and/or driver:"); event_log_warning (hashcat_ctx, " \"OpenCL 2.0 GPU Driver Package for Linux\" (2.0 or later)"); #elif defined (_WIN) event_log_warning (hashcat_ctx, "* Intel GPUs on Windows require this runtime and/or driver:"); event_log_warning (hashcat_ctx, " \"OpenCL Driver for Intel Iris and Intel HD Graphics\""); #endif event_log_warning (hashcat_ctx, "* NVIDIA GPUs require this runtime and/or driver:"); event_log_warning (hashcat_ctx, " \"NVIDIA Driver\" (367.x or later)"); event_log_warning (hashcat_ctx, NULL); return -1; } HC_LOAD_FUNC(ocl, clBuildProgram, OCL_CLBUILDPROGRAM, OpenCL, 1) HC_LOAD_FUNC(ocl, clCreateBuffer, OCL_CLCREATEBUFFER, OpenCL, 1) HC_LOAD_FUNC(ocl, clCreateCommandQueue, OCL_CLCREATECOMMANDQUEUE, OpenCL, 1) HC_LOAD_FUNC(ocl, clCreateContext, OCL_CLCREATECONTEXT, OpenCL, 1) HC_LOAD_FUNC(ocl, clCreateKernel, OCL_CLCREATEKERNEL, OpenCL, 1) HC_LOAD_FUNC(ocl, clCreateProgramWithBinary, OCL_CLCREATEPROGRAMWITHBINARY, OpenCL, 1) HC_LOAD_FUNC(ocl, clCreateProgramWithSource, OCL_CLCREATEPROGRAMWITHSOURCE, OpenCL, 1) HC_LOAD_FUNC(ocl, clEnqueueCopyBuffer, OCL_CLENQUEUECOPYBUFFER, OpenCL, 1) HC_LOAD_FUNC(ocl, clEnqueueMapBuffer, OCL_CLENQUEUEMAPBUFFER, OpenCL, 1) HC_LOAD_FUNC(ocl, clEnqueueNDRangeKernel, OCL_CLENQUEUENDRANGEKERNEL, OpenCL, 1) HC_LOAD_FUNC(ocl, clEnqueueReadBuffer, OCL_CLENQUEUEREADBUFFER, OpenCL, 1) HC_LOAD_FUNC(ocl, clEnqueueUnmapMemObject, OCL_CLENQUEUEUNMAPMEMOBJECT, OpenCL, 1) HC_LOAD_FUNC(ocl, clEnqueueWriteBuffer, OCL_CLENQUEUEWRITEBUFFER, OpenCL, 1) HC_LOAD_FUNC(ocl, clFinish, OCL_CLFINISH, OpenCL, 1) HC_LOAD_FUNC(ocl, clFlush, OCL_CLFLUSH, OpenCL, 1) HC_LOAD_FUNC(ocl, clGetDeviceIDs, OCL_CLGETDEVICEIDS, OpenCL, 1) HC_LOAD_FUNC(ocl, clGetDeviceInfo, OCL_CLGETDEVICEINFO, OpenCL, 1) HC_LOAD_FUNC(ocl, clGetEventInfo, OCL_CLGETEVENTINFO, OpenCL, 1) HC_LOAD_FUNC(ocl, clGetKernelWorkGroupInfo, OCL_CLGETKERNELWORKGROUPINFO, OpenCL, 1) HC_LOAD_FUNC(ocl, clGetPlatformIDs, OCL_CLGETPLATFORMIDS, OpenCL, 1) HC_LOAD_FUNC(ocl, clGetPlatformInfo, OCL_CLGETPLATFORMINFO, OpenCL, 1) HC_LOAD_FUNC(ocl, clGetProgramBuildInfo, OCL_CLGETPROGRAMBUILDINFO, OpenCL, 1) HC_LOAD_FUNC(ocl, clGetProgramInfo, OCL_CLGETPROGRAMINFO, OpenCL, 1) HC_LOAD_FUNC(ocl, clReleaseCommandQueue, OCL_CLRELEASECOMMANDQUEUE, OpenCL, 1) HC_LOAD_FUNC(ocl, clReleaseContext, OCL_CLRELEASECONTEXT, OpenCL, 1) HC_LOAD_FUNC(ocl, clReleaseKernel, OCL_CLRELEASEKERNEL, OpenCL, 1) HC_LOAD_FUNC(ocl, clReleaseMemObject, OCL_CLRELEASEMEMOBJECT, OpenCL, 1) HC_LOAD_FUNC(ocl, clReleaseProgram, OCL_CLRELEASEPROGRAM, OpenCL, 1) HC_LOAD_FUNC(ocl, clSetKernelArg, OCL_CLSETKERNELARG, OpenCL, 1) HC_LOAD_FUNC(ocl, clWaitForEvents, OCL_CLWAITFOREVENTS, OpenCL, 1) HC_LOAD_FUNC(ocl, clGetEventProfilingInfo, OCL_CLGETEVENTPROFILINGINFO, OpenCL, 1) HC_LOAD_FUNC(ocl, clReleaseEvent, OCL_CLRELEASEEVENT, OpenCL, 1) return 0; } void ocl_close (hashcat_ctx_t *hashcat_ctx) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; if (ocl) { if (ocl->lib) { hc_dlclose (ocl->lib); } } } int hc_clEnqueueNDRangeKernel (hashcat_ctx_t *hashcat_ctx, 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) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->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) { event_log_error (hashcat_ctx, "clEnqueueNDRangeKernel(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clGetEventInfo (hashcat_ctx_t *hashcat_ctx, cl_event event, cl_event_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clGetEventInfo (event, param_name, param_value_size, param_value, param_value_size_ret); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clGetEventInfo(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clFlush (hashcat_ctx_t *hashcat_ctx, cl_command_queue command_queue) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clFlush (command_queue); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clFlush(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clFinish (hashcat_ctx_t *hashcat_ctx, cl_command_queue command_queue) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clFinish (command_queue); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clFinish(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clSetKernelArg (hashcat_ctx_t *hashcat_ctx, cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clSetKernelArg (kernel, arg_index, arg_size, arg_value); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clSetKernelArg(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clEnqueueWriteBuffer (hashcat_ctx_t *hashcat_ctx, 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) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clEnqueueWriteBuffer (command_queue, buffer, blocking_write, offset, cb, ptr, num_events_in_wait_list, event_wait_list, event); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clEnqueueWriteBuffer(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clEnqueueCopyBuffer (hashcat_ctx_t *hashcat_ctx, 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) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->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) { event_log_error (hashcat_ctx, "clEnqueueCopyBuffer(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clEnqueueReadBuffer (hashcat_ctx_t *hashcat_ctx, 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) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clEnqueueReadBuffer (command_queue, buffer, blocking_read, offset, cb, ptr, num_events_in_wait_list, event_wait_list, event); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clEnqueueReadBuffer(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clGetPlatformIDs (hashcat_ctx_t *hashcat_ctx, cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clGetPlatformIDs (num_entries, platforms, num_platforms); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clGetPlatformIDs(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clGetPlatformInfo (hashcat_ctx_t *hashcat_ctx, cl_platform_id platform, cl_platform_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clGetPlatformInfo (platform, param_name, param_value_size, param_value, param_value_size_ret); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clGetPlatformInfo(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clGetDeviceIDs (hashcat_ctx_t *hashcat_ctx, cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, cl_device_id *devices, cl_uint *num_devices) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clGetDeviceIDs (platform, device_type, num_entries, devices, num_devices); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clGetDeviceIDs(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clGetDeviceInfo (hashcat_ctx_t *hashcat_ctx, cl_device_id device, cl_device_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clGetDeviceInfo (device, param_name, param_value_size, param_value, param_value_size_ret); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clGetDeviceInfo(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clCreateContext (hashcat_ctx_t *hashcat_ctx, 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_context *context) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; cl_int CL_err; *context = ocl->clCreateContext (properties, num_devices, devices, pfn_notify, user_data, &CL_err); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clCreateContext(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clCreateCommandQueue (hashcat_ctx_t *hashcat_ctx, cl_context context, cl_device_id device, cl_command_queue_properties properties, cl_command_queue *command_queue) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; cl_int CL_err; *command_queue = ocl->clCreateCommandQueue (context, device, properties, &CL_err); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clCreateCommandQueue(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clCreateBuffer (hashcat_ctx_t *hashcat_ctx, cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_mem *mem) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; cl_int CL_err; *mem = ocl->clCreateBuffer (context, flags, size, host_ptr, &CL_err); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clCreateBuffer(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clCreateProgramWithSource (hashcat_ctx_t *hashcat_ctx, cl_context context, cl_uint count, const char **strings, const size_t *lengths, cl_program *program) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; cl_int CL_err; *program = ocl->clCreateProgramWithSource (context, count, strings, lengths, &CL_err); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clCreateProgramWithSource(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clCreateProgramWithBinary (hashcat_ctx_t *hashcat_ctx, 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_program *program) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; cl_int CL_err; *program = ocl->clCreateProgramWithBinary (context, num_devices, device_list, lengths, binaries, binary_status, &CL_err); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clCreateProgramWithBinary(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clBuildProgram (hashcat_ctx_t *hashcat_ctx, 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) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clBuildProgram (program, num_devices, device_list, options, pfn_notify, user_data); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clBuildProgram(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clCreateKernel (hashcat_ctx_t *hashcat_ctx, cl_program program, const char *kernel_name, cl_kernel *kernel) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; cl_int CL_err; *kernel = ocl->clCreateKernel (program, kernel_name, &CL_err); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clCreateKernel(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clReleaseMemObject (hashcat_ctx_t *hashcat_ctx, cl_mem mem) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clReleaseMemObject (mem); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clReleaseMemObject(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clReleaseKernel (hashcat_ctx_t *hashcat_ctx, cl_kernel kernel) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clReleaseKernel (kernel); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clReleaseKernel(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clReleaseProgram (hashcat_ctx_t *hashcat_ctx, cl_program program) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clReleaseProgram (program); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clReleaseProgram(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clReleaseCommandQueue (hashcat_ctx_t *hashcat_ctx, cl_command_queue command_queue) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clReleaseCommandQueue (command_queue); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clReleaseCommandQueue(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clReleaseContext (hashcat_ctx_t *hashcat_ctx, cl_context context) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clReleaseContext (context); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clReleaseContext(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clEnqueueMapBuffer (hashcat_ctx_t *hashcat_ctx, cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_map, cl_map_flags map_flags, size_t offset, size_t size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event, void **buf) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; cl_int CL_err; *buf = ocl->clEnqueueMapBuffer (command_queue, buffer, blocking_map, map_flags, offset, size, num_events_in_wait_list, event_wait_list, event, &CL_err); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clEnqueueMapBuffer(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clEnqueueUnmapMemObject (hashcat_ctx_t *hashcat_ctx, 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) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clEnqueueUnmapMemObject (command_queue, memobj, mapped_ptr, num_events_in_wait_list, event_wait_list, event); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clEnqueueUnmapMemObject(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clGetKernelWorkGroupInfo (hashcat_ctx_t *hashcat_ctx, cl_kernel kernel, cl_device_id device, cl_kernel_work_group_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clGetKernelWorkGroupInfo (kernel, device, param_name, param_value_size, param_value, param_value_size_ret); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clGetKernelWorkGroupInfo(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clGetProgramBuildInfo (hashcat_ctx_t *hashcat_ctx, cl_program program, cl_device_id device, cl_program_build_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clGetProgramBuildInfo (program, device, param_name, param_value_size, param_value, param_value_size_ret); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clGetProgramBuildInfo(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clGetProgramInfo (hashcat_ctx_t *hashcat_ctx, cl_program program, cl_program_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clGetProgramInfo (program, param_name, param_value_size, param_value, param_value_size_ret); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clGetProgramInfo(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clWaitForEvents (hashcat_ctx_t *hashcat_ctx, cl_uint num_events, const cl_event *event_list) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clWaitForEvents (num_events, event_list); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clWaitForEvents(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clGetEventProfilingInfo (hashcat_ctx_t *hashcat_ctx, cl_event event, cl_profiling_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clGetEventProfilingInfo (event, param_name, param_value_size, param_value, param_value_size_ret); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clGetEventProfilingInfo(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int hc_clReleaseEvent (hashcat_ctx_t *hashcat_ctx, cl_event event) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; OCL_PTR *ocl = opencl_ctx->ocl; const cl_int CL_err = ocl->clReleaseEvent (event); if (CL_err != CL_SUCCESS) { event_log_error (hashcat_ctx, "clReleaseEvent(): %s", val2cstr_cl (CL_err)); return -1; } return 0; } int gidd_to_pw_t (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u64 gidd, pw_t *pw) { int CL_rc = hc_clEnqueueReadBuffer (hashcat_ctx, device_param->command_queue, device_param->d_pws_buf, CL_TRUE, gidd * sizeof (pw_t), sizeof (pw_t), pw, 0, NULL, NULL); if (CL_rc == -1) return -1; return 0; } int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 highest_pw_len, const u32 pws_cnt, const u32 fast_iteration, const u32 salt_pos) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; user_options_t *user_options = hashcat_ctx->user_options; if (hashconfig->hash_mode == 2000) { return process_stdout (hashcat_ctx, device_param, pws_cnt); } int CL_rc; if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { if (user_options->attack_mode == ATTACK_MODE_BF) { if (hashconfig->opts_type & OPTS_TYPE_PT_BITSLICE) { const u32 size_tm = 32 * sizeof (bs_word_t); CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_tm_c, size_tm); if (CL_rc == -1) return -1; CL_rc = run_kernel_tm (hashcat_ctx, device_param); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueCopyBuffer (hashcat_ctx, device_param->command_queue, device_param->d_tm_c, device_param->d_bfs_c, 0, 0, size_tm, 0, NULL, NULL); if (CL_rc == -1) return -1; } } if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { if (highest_pw_len < 16) { CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_1, pws_cnt, true, fast_iteration); if (CL_rc == -1) return -1; } else if (highest_pw_len < 32) { CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_2, pws_cnt, true, fast_iteration); if (CL_rc == -1) return -1; } else { CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_3, pws_cnt, true, fast_iteration); if (CL_rc == -1) return -1; } } else { CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_4, pws_cnt, true, fast_iteration); if (CL_rc == -1) return -1; } } else { bool run_init = true; bool run_loop = true; bool run_comp = true; if (run_init == true) { CL_rc = hc_clEnqueueCopyBuffer (hashcat_ctx, device_param->command_queue, device_param->d_pws_buf, device_param->d_pws_amp_buf, 0, 0, pws_cnt * sizeof (pw_t), 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = run_kernel_amp (hashcat_ctx, device_param, pws_cnt); if (CL_rc == -1) return -1; CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_1, pws_cnt, false, 0); if (CL_rc == -1) return -1; if (hashconfig->opts_type & OPTS_TYPE_HOOK12) { CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_12, pws_cnt, false, 0); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueReadBuffer (hashcat_ctx, device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; // do something with data CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; } } if (run_loop == true) { u32 iter = hashes->salts_buf[salt_pos].salt_iter; u32 loop_step = device_param->kernel_loops; for (u32 loop_pos = 0, slow_iteration = 0; loop_pos < iter; loop_pos += loop_step, slow_iteration++) { u32 loop_left = iter - loop_pos; loop_left = MIN (loop_left, loop_step); device_param->kernel_params_buf32[28] = loop_pos; device_param->kernel_params_buf32[29] = loop_left; CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_2, pws_cnt, true, slow_iteration); if (CL_rc == -1) return -1; //bug? //while (status_ctx->run_thread_level2 == false) break; if (status_ctx->run_thread_level2 == false) break; /** * speed */ const float iter_part = (float) (loop_pos + loop_left) / iter; const u64 perf_sum_all = (u64) (pws_cnt * iter_part); double speed_msec = hc_timer_get (device_param->timer_speed); const u32 speed_pos = device_param->speed_pos; device_param->speed_cnt[speed_pos] = perf_sum_all; device_param->speed_msec[speed_pos] = speed_msec; if (user_options->speed_only == true) { if (speed_msec > 4096) return -2; // special RC } } if (hashconfig->opts_type & OPTS_TYPE_HOOK23) { CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_23, pws_cnt, false, 0); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueReadBuffer (hashcat_ctx, device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; /* * The following section depends on the hash mode */ switch (hashconfig->hash_mode) { // for 7z we only need device_param->hooks_buf, but other hooks could use any info from device_param. All of them should/must update hooks_buf case 11600: seven_zip_hook_func (device_param, hashes->hook_salts_buf, salt_pos, pws_cnt); break; } /* * END of hash mode specific hook operations */ CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; } } // init2 and loop2 are kind of special, we use run_loop for them, too if (run_loop == true) { // note: they also do not influence the performance screen // in case you want to use this, this cane make sense only if your input data comes out of tmps[] if (hashconfig->opts_type & OPTS_TYPE_INIT2) { CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_INIT2, pws_cnt, false, 0); if (CL_rc == -1) return -1; } if (hashconfig->opts_type & OPTS_TYPE_LOOP2) { u32 iter = hashes->salts_buf[salt_pos].salt_iter2; u32 loop_step = device_param->kernel_loops; for (u32 loop_pos = 0, slow_iteration = 0; loop_pos < iter; loop_pos += loop_step, slow_iteration++) { u32 loop_left = iter - loop_pos; loop_left = MIN (loop_left, loop_step); device_param->kernel_params_buf32[28] = loop_pos; device_param->kernel_params_buf32[29] = loop_left; CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_LOOP2, pws_cnt, true, slow_iteration); if (CL_rc == -1) return -1; //bug? //while (status_ctx->run_thread_level2 == false) break; if (status_ctx->run_thread_level2 == false) break; } } } if (run_comp == true) { u32 loops_cnt = 1; if ((hashconfig->hash_mode == 2500) || (hashconfig->hash_mode == 2501)) { loops_cnt = hashes->salts_buf[salt_pos].digests_cnt; } for (u32 loops_pos = 0; loops_pos < loops_cnt; loops_pos++) { device_param->kernel_params_buf32[28] = loops_pos; device_param->kernel_params_buf32[29] = loops_cnt; CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_3, pws_cnt, false, 0); if (CL_rc == -1) return -1; if (status_ctx->run_thread_level2 == false) break; } } } return 0; } int run_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 kern_run, const u64 num, const u32 event_update, const u32 iteration) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; const user_options_t *user_options = hashcat_ctx->user_options; u64 num_elements = num; device_param->kernel_params_buf64[34] = num; cl_kernel kernel = NULL; u64 kernel_threads = 0; switch (kern_run) { case KERN_RUN_1: kernel = device_param->kernel1; kernel_threads = device_param->kernel_threads_by_wgs_kernel1; break; case KERN_RUN_12: kernel = device_param->kernel12; kernel_threads = device_param->kernel_threads_by_wgs_kernel12; break; case KERN_RUN_2: kernel = device_param->kernel2; kernel_threads = device_param->kernel_threads_by_wgs_kernel2; break; case KERN_RUN_23: kernel = device_param->kernel23; kernel_threads = device_param->kernel_threads_by_wgs_kernel23; break; case KERN_RUN_3: kernel = device_param->kernel3; kernel_threads = device_param->kernel_threads_by_wgs_kernel3; break; case KERN_RUN_4: kernel = device_param->kernel4; kernel_threads = device_param->kernel_threads_by_wgs_kernel4; break; case KERN_RUN_INIT2: kernel = device_param->kernel_init2; kernel_threads = device_param->kernel_threads_by_wgs_kernel_init2; break; case KERN_RUN_LOOP2: kernel = device_param->kernel_loop2; kernel_threads = device_param->kernel_threads_by_wgs_kernel_loop2; break; default: event_log_error (hashcat_ctx, "Invalid kernel specified."); return -1; } while (num_elements % kernel_threads) num_elements++; int CL_rc; for (u32 i = 0; i <= 23; i++) { CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, i, sizeof (cl_mem), device_param->kernel_params[i]); if (CL_rc == -1) return -1; } for (u32 i = 24; i <= 33; i++) { CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, i, sizeof (cl_uint), device_param->kernel_params[i]); if (CL_rc == -1) return -1; } for (u32 i = 34; i <= 34; i++) { CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, i, sizeof (cl_ulong), device_param->kernel_params[i]); if (CL_rc == -1) return -1; } cl_event event; if ((hashconfig->opts_type & OPTS_TYPE_PT_BITSLICE) && (user_options->attack_mode == ATTACK_MODE_BF)) { const size_t global_work_size[3] = { num_elements, 32, 1 }; const size_t local_work_size[3] = { kernel_threads / 32, 32, 1 }; CL_rc = hc_clEnqueueNDRangeKernel (hashcat_ctx, device_param->command_queue, kernel, 2, NULL, global_work_size, local_work_size, 0, NULL, &event); if (CL_rc == -1) return -1; } else { if (kern_run == KERN_RUN_1) { if (hashconfig->opti_type & OPTI_TYPE_SLOW_HASH_SIMD_INIT) { num_elements = CEILDIV (num_elements, device_param->vector_width); } } else if (kern_run == KERN_RUN_2) { if (hashconfig->opti_type & OPTI_TYPE_SLOW_HASH_SIMD_LOOP) { num_elements = CEILDIV (num_elements, device_param->vector_width); } } else if (kern_run == KERN_RUN_3) { if (hashconfig->opti_type & OPTI_TYPE_SLOW_HASH_SIMD_COMP) { num_elements = CEILDIV (num_elements, device_param->vector_width); } } while (num_elements % kernel_threads) num_elements++; const size_t global_work_size[3] = { num_elements, 1, 1 }; const size_t local_work_size[3] = { kernel_threads, 1, 1 }; CL_rc = hc_clEnqueueNDRangeKernel (hashcat_ctx, device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, &event); if (CL_rc == -1) return -1; } CL_rc = hc_clFlush (hashcat_ctx, device_param->command_queue); if (CL_rc == -1) return -1; if (device_param->nvidia_spin_damp > 0) { if (status_ctx->devices_status == STATUS_RUNNING) { if (iteration < EXPECTED_ITERATIONS) { switch (kern_run) { case KERN_RUN_1: if (device_param->exec_us_prev1[iteration] > 0) usleep ((useconds_t)(device_param->exec_us_prev1[iteration] * device_param->nvidia_spin_damp)); break; case KERN_RUN_2: if (device_param->exec_us_prev2[iteration] > 0) usleep ((useconds_t)(device_param->exec_us_prev2[iteration] * device_param->nvidia_spin_damp)); break; case KERN_RUN_3: if (device_param->exec_us_prev3[iteration] > 0) usleep ((useconds_t)(device_param->exec_us_prev3[iteration] * device_param->nvidia_spin_damp)); break; case KERN_RUN_4: if (device_param->exec_us_prev4[iteration] > 0) usleep ((useconds_t)(device_param->exec_us_prev4[iteration] * device_param->nvidia_spin_damp)); break; case KERN_RUN_INIT2: if (device_param->exec_us_prev_init2[iteration] > 0) usleep ((useconds_t)(device_param->exec_us_prev_init2[iteration] * device_param->nvidia_spin_damp)); break; case KERN_RUN_LOOP2: if (device_param->exec_us_prev_loop2[iteration] > 0) usleep ((useconds_t)(device_param->exec_us_prev_loop2[iteration] * device_param->nvidia_spin_damp)); break; } } } } CL_rc = hc_clWaitForEvents (hashcat_ctx, 1, &event); if (CL_rc == -1) return -1; cl_ulong time_start; cl_ulong time_end; CL_rc = hc_clGetEventProfilingInfo (hashcat_ctx, event, CL_PROFILING_COMMAND_START, sizeof (time_start), &time_start, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clGetEventProfilingInfo (hashcat_ctx, event, CL_PROFILING_COMMAND_END, sizeof (time_end), &time_end, NULL); if (CL_rc == -1) return -1; const double exec_us = (double) (time_end - time_start) / 1000; if (status_ctx->devices_status == STATUS_RUNNING) { if (iteration < EXPECTED_ITERATIONS) { switch (kern_run) { case KERN_RUN_1: device_param->exec_us_prev1[iteration] = exec_us; break; case KERN_RUN_2: device_param->exec_us_prev2[iteration] = exec_us; break; case KERN_RUN_3: device_param->exec_us_prev3[iteration] = exec_us; break; case KERN_RUN_4: device_param->exec_us_prev4[iteration] = exec_us; break; case KERN_RUN_INIT2: device_param->exec_us_prev_init2[iteration] = exec_us; break; case KERN_RUN_LOOP2: device_param->exec_us_prev_loop2[iteration] = exec_us; break; } } } if (event_update) { u32 exec_pos = device_param->exec_pos; device_param->exec_msec[exec_pos] = exec_us / 1000; exec_pos++; if (exec_pos == EXEC_CACHE) { exec_pos = 0; } device_param->exec_pos = exec_pos; } CL_rc = hc_clReleaseEvent (hashcat_ctx, event); if (CL_rc == -1) return -1; CL_rc = hc_clFinish (hashcat_ctx, device_param->command_queue); if (CL_rc == -1) return -1; return 0; } int run_kernel_mp (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 kern_run, const u64 num) { u64 num_elements = num; switch (kern_run) { case KERN_RUN_MP: device_param->kernel_params_mp_buf64[8] = num; break; case KERN_RUN_MP_R: device_param->kernel_params_mp_r_buf64[8] = num; break; case KERN_RUN_MP_L: device_param->kernel_params_mp_l_buf64[9] = num; break; } cl_kernel kernel = NULL; u64 kernel_threads = 0; switch (kern_run) { case KERN_RUN_MP: kernel = device_param->kernel_mp; kernel_threads = device_param->kernel_threads_by_wgs_kernel_mp; break; case KERN_RUN_MP_R: kernel = device_param->kernel_mp_r; kernel_threads = device_param->kernel_threads_by_wgs_kernel_mp_r; break; case KERN_RUN_MP_L: kernel = device_param->kernel_mp_l; kernel_threads = device_param->kernel_threads_by_wgs_kernel_mp_l; break; default: event_log_error (hashcat_ctx, "Invalid kernel specified."); return -1; } while (num_elements % kernel_threads) num_elements++; int CL_rc; switch (kern_run) { case KERN_RUN_MP: CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 3, sizeof (cl_ulong), device_param->kernel_params_mp[3]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 4, sizeof (cl_uint), device_param->kernel_params_mp[4]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 5, sizeof (cl_uint), device_param->kernel_params_mp[5]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 6, sizeof (cl_uint), device_param->kernel_params_mp[6]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 7, sizeof (cl_uint), device_param->kernel_params_mp[7]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 8, sizeof (cl_ulong), device_param->kernel_params_mp[8]); if (CL_rc == -1) return -1; break; case KERN_RUN_MP_R: CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 3, sizeof (cl_ulong), device_param->kernel_params_mp_r[3]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 4, sizeof (cl_uint), device_param->kernel_params_mp_r[4]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 5, sizeof (cl_uint), device_param->kernel_params_mp_r[5]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 6, sizeof (cl_uint), device_param->kernel_params_mp_r[6]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 7, sizeof (cl_uint), device_param->kernel_params_mp_r[7]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 8, sizeof (cl_ulong), device_param->kernel_params_mp_r[8]); if (CL_rc == -1) return -1; break; case KERN_RUN_MP_L: CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 3, sizeof (cl_ulong), device_param->kernel_params_mp_l[3]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 4, sizeof (cl_uint), device_param->kernel_params_mp_l[4]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 5, sizeof (cl_uint), device_param->kernel_params_mp_l[5]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 6, sizeof (cl_uint), device_param->kernel_params_mp_l[6]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 7, sizeof (cl_uint), device_param->kernel_params_mp_l[7]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 8, sizeof (cl_uint), device_param->kernel_params_mp_l[8]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 9, sizeof (cl_ulong), device_param->kernel_params_mp_l[9]); if (CL_rc == -1) return -1; break; } const size_t global_work_size[3] = { num_elements, 1, 1 }; const size_t local_work_size[3] = { kernel_threads, 1, 1 }; CL_rc = hc_clEnqueueNDRangeKernel (hashcat_ctx, device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clFlush (hashcat_ctx, device_param->command_queue); if (CL_rc == -1) return -1; CL_rc = hc_clFinish (hashcat_ctx, device_param->command_queue); if (CL_rc == -1) return -1; return 0; } int run_kernel_tm (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param) { const u64 num_elements = 1024; // fixed const u64 kernel_threads = device_param->kernel_threads_by_wgs_kernel_tm; 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] = { kernel_threads, 1, 1 }; int CL_rc; CL_rc = hc_clEnqueueNDRangeKernel (hashcat_ctx, device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clFlush (hashcat_ctx, device_param->command_queue); if (CL_rc == -1) return -1; CL_rc = hc_clFinish (hashcat_ctx, device_param->command_queue); if (CL_rc == -1) return -1; return 0; } int run_kernel_amp (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u64 num) { u64 num_elements = num; device_param->kernel_params_amp_buf64[6] = num_elements; // causes problems with special threads like in bcrypt // const u32 kernel_threads = device_param->kernel_threads; const u64 kernel_threads = device_param->kernel_threads_by_wgs_kernel_amp; while (num_elements % kernel_threads) num_elements++; cl_kernel kernel = device_param->kernel_amp; int CL_rc; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 6, sizeof (cl_ulong), device_param->kernel_params_amp[6]); if (CL_rc == -1) return -1; const size_t global_work_size[3] = { num_elements, 1, 1 }; const size_t local_work_size[3] = { kernel_threads, 1, 1 }; CL_rc = hc_clEnqueueNDRangeKernel (hashcat_ctx, device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clFlush (hashcat_ctx, device_param->command_queue); if (CL_rc == -1) return -1; CL_rc = hc_clFinish (hashcat_ctx, device_param->command_queue); if (CL_rc == -1) return -1; return 0; } int run_kernel_memset (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, cl_mem buf, const u32 value, const u64 size) { const u64 num16d = size / 16; const u64 num16m = size % 16; if (num16d) { device_param->kernel_params_memset_buf32[1] = value; device_param->kernel_params_memset_buf64[2] = num16d; const u64 kernel_threads = device_param->kernel_threads_by_wgs_kernel_memset; u64 num_elements = num16d; while (num_elements % kernel_threads) num_elements++; cl_kernel kernel = device_param->kernel_memset; int CL_rc; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 0, sizeof (cl_mem), (void *) &buf); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 1, sizeof (cl_uint), device_param->kernel_params_memset[1]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, kernel, 2, sizeof (cl_ulong), device_param->kernel_params_memset[2]); if (CL_rc == -1) return -1; const size_t global_work_size[3] = { num_elements, 1, 1 }; const size_t local_work_size[3] = { kernel_threads, 1, 1 }; CL_rc = hc_clEnqueueNDRangeKernel (hashcat_ctx, device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clFlush (hashcat_ctx, device_param->command_queue); if (CL_rc == -1) return -1; CL_rc = hc_clFinish (hashcat_ctx, device_param->command_queue); if (CL_rc == -1) return -1; } if (num16m) { u32 tmp[4]; tmp[0] = value; tmp[1] = value; tmp[2] = value; tmp[3] = value; int CL_rc; CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, buf, CL_TRUE, num16d * 16, num16m, tmp, 0, NULL, NULL); if (CL_rc == -1) return -1; } return 0; } int run_kernel_bzero (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, cl_mem buf, const u64 size) { return run_kernel_memset (hashcat_ctx, device_param, buf, 0, size); } int run_copy (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 pws_cnt) { combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; user_options_t *user_options = hashcat_ctx->user_options; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) { const int CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_pws_buf, CL_TRUE, 0, pws_cnt * sizeof (pw_t), device_param->pws_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { if (user_options->attack_mode == ATTACK_MODE_COMBI) { if (combinator_ctx->combs_mode == COMBINATOR_MODE_BASE_RIGHT) { if (hashconfig->opts_type & OPTS_TYPE_PT_ADD01) { for (u32 i = 0; i < pws_cnt; i++) { const u32 pw_len = device_param->pws_buf[i].pw_len; u8 *ptr = (u8 *) device_param->pws_buf[i].i; ptr[pw_len] = 0x01; } } else if (hashconfig->opts_type & OPTS_TYPE_PT_ADD80) { for (u32 i = 0; i < pws_cnt; i++) { const u32 pw_len = device_param->pws_buf[i].pw_len; u8 *ptr = (u8 *) device_param->pws_buf[i].i; ptr[pw_len] = 0x80; } } } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { if (hashconfig->opts_type & OPTS_TYPE_PT_ADD01) { for (u32 i = 0; i < pws_cnt; i++) { const u32 pw_len = device_param->pws_buf[i].pw_len; u8 *ptr = (u8 *) device_param->pws_buf[i].i; ptr[pw_len] = 0x01; } } else if (hashconfig->opts_type & OPTS_TYPE_PT_ADD80) { for (u32 i = 0; i < pws_cnt; i++) { const u32 pw_len = device_param->pws_buf[i].pw_len; u8 *ptr = (u8 *) device_param->pws_buf[i].i; ptr[pw_len] = 0x80; } } } const int CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_pws_buf, CL_TRUE, 0, pws_cnt * sizeof (pw_t), device_param->pws_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; } else { if (user_options->attack_mode == ATTACK_MODE_COMBI) { const int CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_pws_buf, CL_TRUE, 0, pws_cnt * sizeof (pw_t), device_param->pws_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { const int CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_pws_buf, CL_TRUE, 0, pws_cnt * sizeof (pw_t), device_param->pws_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { const u64 off = device_param->words_off; device_param->kernel_params_mp_buf64[3] = off; const int CL_rc = run_kernel_mp (hashcat_ctx, device_param, KERN_RUN_MP, pws_cnt); if (CL_rc == -1) return -1; } } } else if (user_options_extra->attack_kern == ATTACK_KERN_BF) { const u64 off = device_param->words_off; device_param->kernel_params_mp_l_buf64[3] = off; const int CL_rc = run_kernel_mp (hashcat_ctx, device_param, KERN_RUN_MP_L, pws_cnt); if (CL_rc == -1) return -1; } return 0; } int run_cracker (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 pws_cnt) { combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; user_options_t *user_options = hashcat_ctx->user_options; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; // init speed timer u32 speed_pos = device_param->speed_pos; #if defined (_WIN) if (device_param->timer_speed.QuadPart == 0) { hc_timer_set (&device_param->timer_speed); } #else if (device_param->timer_speed.tv_sec == 0) { hc_timer_set (&device_param->timer_speed); } #endif // find higest password length, this is for optimization stuff u32 highest_pw_len = 0; if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) { } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { } else if (user_options_extra->attack_kern == ATTACK_KERN_BF) { highest_pw_len = device_param->kernel_params_mp_l_buf32[4] + device_param->kernel_params_mp_l_buf32[5]; } // we make use of this in status view device_param->outerloop_pos = 0; device_param->outerloop_left = pws_cnt; // loop start: most outer loop = salt iteration, then innerloops (if multi) for (u32 salt_pos = 0; salt_pos < hashes->salts_cnt; salt_pos++) { while (status_ctx->devices_status == STATUS_PAUSED) sleep (1); salt_t *salt_buf = &hashes->salts_buf[salt_pos]; device_param->kernel_params_buf32[27] = salt_pos; device_param->kernel_params_buf32[31] = salt_buf->digests_cnt; device_param->kernel_params_buf32[32] = salt_buf->digests_offset; FILE *combs_fp = device_param->combs_fp; if ((user_options->attack_mode == ATTACK_MODE_COMBI) || (((hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) == 0) && (user_options->attack_mode == ATTACK_MODE_HYBRID2))) { rewind (combs_fp); } // iteration type u64 innerloop_step = 0; u64 innerloop_cnt = 0; if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) innerloop_step = device_param->kernel_loops; else innerloop_step = 1; if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) innerloop_cnt = straight_ctx->kernel_rules_cnt; else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) innerloop_cnt = combinator_ctx->combs_cnt; else if (user_options_extra->attack_kern == ATTACK_KERN_BF) innerloop_cnt = mask_ctx->bfs_cnt; // innerloops for (u64 innerloop_pos = 0; innerloop_pos < innerloop_cnt; innerloop_pos += innerloop_step) { while (status_ctx->devices_status == STATUS_PAUSED) sleep (1); u32 fast_iteration = 0; u64 innerloop_left = innerloop_cnt - innerloop_pos; if (innerloop_left > innerloop_step) { innerloop_left = innerloop_step; fast_iteration = 1; } device_param->innerloop_pos = innerloop_pos; device_param->innerloop_left = innerloop_left; device_param->kernel_params_buf32[30] = (u32) innerloop_left; // i think we can get rid of this if (innerloop_left == false) { puts ("bug, how should this happen????\n"); continue; } if (hashes->salts_shown[salt_pos] == 1) { status_ctx->words_progress_done[salt_pos] += (u64) pws_cnt * innerloop_left; continue; } // initialize and copy amplifiers if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) { const int CL_rc = hc_clEnqueueCopyBuffer (hashcat_ctx, device_param->command_queue, device_param->d_rules, device_param->d_rules_c, innerloop_pos * sizeof (kernel_rule_t), 0, innerloop_left * sizeof (kernel_rule_t), 0, NULL, NULL); if (CL_rc == -1) return -1; } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { if (user_options->attack_mode == ATTACK_MODE_COMBI) { char *line_buf = combinator_ctx->scratch_buf; u64 i = 0; while (i < innerloop_left) { if (feof (combs_fp)) break; int line_len = fgetl (combs_fp, line_buf); line_len = convert_from_hex (hashcat_ctx, line_buf, line_len); if (line_len >= PW_MAX) continue; char *line_buf_new = line_buf; char rule_buf_out[RP_PASSWORD_SIZE]; if (run_rule_engine (user_options_extra->rule_len_r, user_options->rule_buf_r)) { if (line_len >= RP_PASSWORD_SIZE) continue; memset (rule_buf_out, 0, sizeof (rule_buf_out)); const int rule_len_out = _old_apply_rule (user_options->rule_buf_r, user_options_extra->rule_len_r, line_buf, line_len, rule_buf_out); if (rule_len_out < 0) { status_ctx->words_progress_rejected[salt_pos] += pws_cnt; continue; } line_len = rule_len_out; line_buf_new = rule_buf_out; } line_len = MIN (line_len, PW_MAX - 1); u8 *ptr = (u8 *) device_param->combs_buf[i].i; memcpy (ptr, line_buf_new, line_len); memset (ptr + line_len, 0, PW_MAX - line_len); if (hashconfig->opts_type & OPTS_TYPE_PT_UPPER) { uppercase (ptr, line_len); } if (combinator_ctx->combs_mode == COMBINATOR_MODE_BASE_LEFT) { if (hashconfig->opts_type & OPTS_TYPE_PT_ADD80) { ptr[line_len] = 0x80; } if (hashconfig->opts_type & OPTS_TYPE_PT_ADD01) { ptr[line_len] = 0x01; } } device_param->combs_buf[i].pw_len = line_len; i++; } for (u64 j = i; j < innerloop_left; j++) { memset (&device_param->combs_buf[j], 0, sizeof (pw_t)); } innerloop_left = i; const int CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_combs_c, CL_TRUE, 0, innerloop_left * sizeof (pw_t), device_param->combs_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { u64 off = innerloop_pos; device_param->kernel_params_mp_buf64[3] = off; int CL_rc; CL_rc = run_kernel_mp (hashcat_ctx, device_param, KERN_RUN_MP, innerloop_left); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueCopyBuffer (hashcat_ctx, device_param->command_queue, device_param->d_combs, device_param->d_combs_c, 0, 0, innerloop_left * sizeof (pw_t), 0, NULL, NULL); if (CL_rc == -1) return -1; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { u64 off = innerloop_pos; device_param->kernel_params_mp_buf64[3] = off; int CL_rc; CL_rc = run_kernel_mp (hashcat_ctx, device_param, KERN_RUN_MP, innerloop_left); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueCopyBuffer (hashcat_ctx, device_param->command_queue, device_param->d_combs, device_param->d_combs_c, 0, 0, innerloop_left * sizeof (pw_t), 0, NULL, NULL); if (CL_rc == -1) return -1; } } else { if ((user_options->attack_mode == ATTACK_MODE_COMBI) || (user_options->attack_mode == ATTACK_MODE_HYBRID2)) { char *line_buf = combinator_ctx->scratch_buf; u64 i = 0; while (i < innerloop_left) { if (feof (combs_fp)) break; int line_len = fgetl (combs_fp, line_buf); line_len = convert_from_hex (hashcat_ctx, line_buf, line_len); if (line_len >= PW_MAX) continue; char *line_buf_new = line_buf; char rule_buf_out[RP_PASSWORD_SIZE]; if (run_rule_engine (user_options_extra->rule_len_r, user_options->rule_buf_r)) { if (line_len >= RP_PASSWORD_SIZE) continue; memset (rule_buf_out, 0, sizeof (rule_buf_out)); const int rule_len_out = _old_apply_rule (user_options->rule_buf_r, user_options_extra->rule_len_r, line_buf, line_len, rule_buf_out); if (rule_len_out < 0) { status_ctx->words_progress_rejected[salt_pos] += pws_cnt; continue; } line_len = rule_len_out; line_buf_new = rule_buf_out; } line_len = MIN (line_len, PW_MAX - 1); u8 *ptr = (u8 *) device_param->combs_buf[i].i; memcpy (ptr, line_buf_new, line_len); memset (ptr + line_len, 0, PW_MAX - line_len); if (hashconfig->opts_type & OPTS_TYPE_PT_UPPER) { uppercase (ptr, line_len); } /* if (combinator_ctx->combs_mode == COMBINATOR_MODE_BASE_LEFT) { if (hashconfig->opts_type & OPTS_TYPE_PT_ADD80) { ptr[line_len] = 0x80; } if (hashconfig->opts_type & OPTS_TYPE_PT_ADD01) { ptr[line_len] = 0x01; } } */ device_param->combs_buf[i].pw_len = line_len; i++; } for (u64 j = i; j < innerloop_left; j++) { memset (&device_param->combs_buf[j], 0, sizeof (pw_t)); } innerloop_left = i; const int CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_combs_c, CL_TRUE, 0, innerloop_left * sizeof (pw_t), device_param->combs_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { u64 off = innerloop_pos; device_param->kernel_params_mp_buf64[3] = off; int CL_rc; CL_rc = run_kernel_mp (hashcat_ctx, device_param, KERN_RUN_MP, innerloop_left); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueCopyBuffer (hashcat_ctx, device_param->command_queue, device_param->d_combs, device_param->d_combs_c, 0, 0, innerloop_left * sizeof (pw_t), 0, NULL, NULL); if (CL_rc == -1) return -1; } } } else if (user_options_extra->attack_kern == ATTACK_KERN_BF) { u64 off = innerloop_pos; device_param->kernel_params_mp_r_buf64[3] = off; int CL_rc; CL_rc = run_kernel_mp (hashcat_ctx, device_param, KERN_RUN_MP_R, innerloop_left); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueCopyBuffer (hashcat_ctx, device_param->command_queue, device_param->d_bfs, device_param->d_bfs_c, 0, 0, innerloop_left * sizeof (bf_t), 0, NULL, NULL); if (CL_rc == -1) return -1; } if (user_options->speed_only == true) { for (int i = 0; i < 16; i++) { const int rc = choose_kernel (hashcat_ctx, device_param, highest_pw_len, pws_cnt, fast_iteration, salt_pos); if (rc == -1) return -1; } hc_timer_set (&device_param->timer_speed); } const int rc = choose_kernel (hashcat_ctx, device_param, highest_pw_len, pws_cnt, fast_iteration, salt_pos); if (rc == -1) return -1; /** * benchmark, part1 */ if (user_options->speed_only == true) { if (rc == -2) break; } /** * speed */ const u64 perf_sum_all = (u64) pws_cnt * innerloop_left; const double speed_msec = hc_timer_get (device_param->timer_speed); hc_timer_set (&device_param->timer_speed); device_param->speed_cnt[speed_pos] = perf_sum_all; device_param->speed_msec[speed_pos] = speed_msec; speed_pos++; if (speed_pos == SPEED_CACHE) { speed_pos = 0; } /** * progress */ hc_thread_mutex_lock (status_ctx->mux_counter); status_ctx->words_progress_done[salt_pos] += perf_sum_all; hc_thread_mutex_unlock (status_ctx->mux_counter); /** * benchmark, part2 */ if (user_options->speed_only == true) break; /** * result */ check_cracked (hashcat_ctx, device_param, salt_pos); if (status_ctx->run_thread_level2 == false) break; } if (user_options->progress_only == true) { const double m = (double) innerloop_cnt / innerloop_step; device_param->outerloop_msec += device_param->speed_msec[0] * m * hashes->salts_cnt; } if (user_options->speed_only == true) break; //status screen makes use of this, can't reset here //device_param->innerloop_pos = 0; //device_param->innerloop_left = 0; if (status_ctx->run_thread_level2 == false) break; } //status screen makes use of this, can't reset here //device_param->outerloop_pos = 0; //device_param->outerloop_left = 0; device_param->speed_pos = speed_pos; return 0; } int opencl_ctx_init (hashcat_ctx_t *hashcat_ctx) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; user_options_t *user_options = hashcat_ctx->user_options; opencl_ctx->enabled = false; if (user_options->example_hashes == true) return 0; if (user_options->keyspace == true) return 0; if (user_options->left == true) return 0; if (user_options->show == true) return 0; if (user_options->usage == true) return 0; if (user_options->version == true) return 0; hc_device_param_t *devices_param = (hc_device_param_t *) hccalloc (DEVICES_MAX, sizeof (hc_device_param_t)); opencl_ctx->devices_param = devices_param; /** * Load and map OpenCL library calls */ OCL_PTR *ocl = (OCL_PTR *) hcmalloc (sizeof (OCL_PTR)); opencl_ctx->ocl = ocl; const int rc_ocl_init = ocl_init (hashcat_ctx); if (rc_ocl_init == -1) return -1; /** * Some permission pre-check, because AMDGPU-PRO Driver crashes if the user has no permission to do this */ const int rc_ocl_check = ocl_check_dri (hashcat_ctx); if (rc_ocl_check == -1) return -1; /** * OpenCL platform selection */ u32 opencl_platforms_filter; const int rc_platforms_filter = setup_opencl_platforms_filter (hashcat_ctx, user_options->opencl_platforms, &opencl_platforms_filter); if (rc_platforms_filter == -1) return -1; opencl_ctx->opencl_platforms_filter = opencl_platforms_filter; /** * OpenCL device selection */ u32 devices_filter; const int rc_devices_filter = setup_devices_filter (hashcat_ctx, user_options->opencl_devices, &devices_filter); if (rc_devices_filter == -1) return -1; opencl_ctx->devices_filter = devices_filter; /** * OpenCL device type selection */ cl_device_type device_types_filter; const int rc_device_types_filter = setup_device_types_filter (hashcat_ctx, user_options->opencl_device_types, &device_types_filter); if (rc_device_types_filter == -1) return -1; opencl_ctx->device_types_filter = device_types_filter; /** * OpenCL platforms: detect */ char **platforms_vendor = (char **) hccalloc (CL_PLATFORMS_MAX, sizeof (char *)); char **platforms_name = (char **) hccalloc (CL_PLATFORMS_MAX, sizeof (char *)); char **platforms_version = (char **) hccalloc (CL_PLATFORMS_MAX, sizeof (char *)); bool *platforms_skipped = (bool *) hccalloc (CL_PLATFORMS_MAX, sizeof (bool)); cl_uint platforms_cnt = 0; cl_platform_id *platforms = (cl_platform_id *) hccalloc (CL_PLATFORMS_MAX, sizeof (cl_platform_id)); cl_uint platform_devices_cnt = 0; cl_device_id *platform_devices = (cl_device_id *) hccalloc (DEVICES_MAX, sizeof (cl_device_id)); int CL_rc = hc_clGetPlatformIDs (hashcat_ctx, CL_PLATFORMS_MAX, platforms, &platforms_cnt); #define FREE_OPENCL_CTX_ON_ERROR \ { \ hcfree (platforms_vendor); \ hcfree (platforms_name); \ hcfree (platforms_version); \ hcfree (platforms_skipped); \ hcfree (platforms); \ hcfree (platform_devices); \ } if (CL_rc == -1) { FREE_OPENCL_CTX_ON_ERROR; return -1; } if (platforms_cnt == 0) { event_log_error (hashcat_ctx, "ATTENTION! No OpenCL-compatible platform found."); event_log_warning (hashcat_ctx, "You are probably missing the OpenCL runtime installation."); event_log_warning (hashcat_ctx, NULL); #if defined (__linux__) event_log_warning (hashcat_ctx, "* AMD GPUs on Linux require this runtime and/or driver:"); event_log_warning (hashcat_ctx, " \"AMDGPU-PRO Driver\" (16.40 or later)"); #elif defined (_WIN) event_log_warning (hashcat_ctx, "* AMD GPUs on Windows require this runtime and/or driver:"); event_log_warning (hashcat_ctx, " \"AMD Radeon Software Crimson Edition\" (15.12 or later)"); #endif event_log_warning (hashcat_ctx, "* Intel CPUs require this runtime and/or driver:"); event_log_warning (hashcat_ctx, " \"OpenCL Runtime for Intel Core and Intel Xeon Processors\" (16.1.1 or later)"); #if defined (__linux__) event_log_warning (hashcat_ctx, "* Intel GPUs on Linux require this runtime and/or driver:"); event_log_warning (hashcat_ctx, " \"OpenCL 2.0 GPU Driver Package for Linux\" (2.0 or later)"); #elif defined (_WIN) event_log_warning (hashcat_ctx, "* Intel GPUs on Windows require this runtime and/or driver:"); event_log_warning (hashcat_ctx, " \"OpenCL Driver for Intel Iris and Intel HD Graphics\""); #endif event_log_warning (hashcat_ctx, "* NVIDIA GPUs require this runtime and/or driver:"); event_log_warning (hashcat_ctx, " \"NVIDIA Driver\" (367.x or later)"); event_log_warning (hashcat_ctx, NULL); FREE_OPENCL_CTX_ON_ERROR; return -1; } if (opencl_platforms_filter != (u32) -1) { u32 platform_cnt_mask = ~(((u32) -1 >> platforms_cnt) << platforms_cnt); if (opencl_platforms_filter > platform_cnt_mask) { event_log_error (hashcat_ctx, "An invalid platform was specified using the --opencl-platforms parameter."); event_log_error (hashcat_ctx, "The specified platform was higher than the number of available platforms (%u).", platforms_cnt); FREE_OPENCL_CTX_ON_ERROR; return -1; } } if (user_options->opencl_device_types == NULL) { /** * OpenCL device types: * In case the user did not specify --opencl-device-types and the user runs hashcat in a system with only a CPU only he probably want to use that CPU. */ cl_device_type device_types_all = 0; for (u32 platform_id = 0; platform_id < platforms_cnt; platform_id++) { if ((opencl_platforms_filter & (1u << platform_id)) == 0) continue; cl_platform_id platform = platforms[platform_id]; CL_rc = hc_clGetDeviceIDs (hashcat_ctx, platform, CL_DEVICE_TYPE_ALL, DEVICES_MAX, platform_devices, &platform_devices_cnt); if (CL_rc == -1) continue; for (u32 platform_devices_id = 0; platform_devices_id < platform_devices_cnt; platform_devices_id++) { cl_device_id device = platform_devices[platform_devices_id]; cl_device_type device_type; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device, CL_DEVICE_TYPE, sizeof (device_type), &device_type, NULL); if (CL_rc == -1) { FREE_OPENCL_CTX_ON_ERROR; return -1; } device_types_all |= device_type; } } // In such a case, automatically enable cpu_md5CPU device type support, since it's disabled by default. if ((device_types_all & (CL_DEVICE_TYPE_GPU | CL_DEVICE_TYPE_ACCELERATOR)) == 0) { device_types_filter |= CL_DEVICE_TYPE_CPU; } // In another case, when the user uses --stdout, using CPU devices is much faster to setup // If we have a CPU device, force it to be used if (user_options->stdout_flag == true) { if (device_types_all & CL_DEVICE_TYPE_CPU) { device_types_filter = CL_DEVICE_TYPE_CPU; } } opencl_ctx->device_types_filter = device_types_filter; } opencl_ctx->enabled = true; opencl_ctx->platforms_vendor = platforms_vendor; opencl_ctx->platforms_name = platforms_name; opencl_ctx->platforms_version = platforms_version; opencl_ctx->platforms_skipped = platforms_skipped; opencl_ctx->platforms_cnt = platforms_cnt; opencl_ctx->platforms = platforms; opencl_ctx->platform_devices_cnt = platform_devices_cnt; opencl_ctx->platform_devices = platform_devices; return 0; } void opencl_ctx_destroy (hashcat_ctx_t *hashcat_ctx) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (opencl_ctx->enabled == false) return; ocl_close (hashcat_ctx); hcfree (opencl_ctx->devices_param); hcfree (opencl_ctx->platforms); hcfree (opencl_ctx->platform_devices); memset (opencl_ctx, 0, sizeof (opencl_ctx_t)); } int opencl_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; user_options_t *user_options = hashcat_ctx->user_options; if (opencl_ctx->enabled == false) return 0; /** * OpenCL devices: simply push all devices from all platforms into the same device array */ cl_uint platforms_cnt = opencl_ctx->platforms_cnt; cl_platform_id *platforms = opencl_ctx->platforms; cl_uint platform_devices_cnt = opencl_ctx->platform_devices_cnt; cl_device_id *platform_devices = opencl_ctx->platform_devices; bool need_adl = false; bool need_nvml = false; bool need_nvapi = false; bool need_xnvctrl = false; bool need_sysfs = false; u32 devices_cnt = 0; u32 devices_active = 0; for (u32 platform_id = 0; platform_id < platforms_cnt; platform_id++) { size_t param_value_size = 0; cl_platform_id platform = platforms[platform_id]; // platform vendor int CL_rc; CL_rc = hc_clGetPlatformInfo (hashcat_ctx, platform, CL_PLATFORM_VENDOR, 0, NULL, ¶m_value_size); if (CL_rc == -1) return -1; char *platform_vendor = (char *) hcmalloc (param_value_size); CL_rc = hc_clGetPlatformInfo (hashcat_ctx, platform, CL_PLATFORM_VENDOR, param_value_size, platform_vendor, NULL); if (CL_rc == -1) return -1; opencl_ctx->platforms_vendor[platform_id] = platform_vendor; // platform name CL_rc = hc_clGetPlatformInfo (hashcat_ctx, platform, CL_PLATFORM_NAME, 0, NULL, ¶m_value_size); if (CL_rc == -1) return -1; char *platform_name = (char *) hcmalloc (param_value_size); CL_rc = hc_clGetPlatformInfo (hashcat_ctx, platform, CL_PLATFORM_NAME, param_value_size, platform_name, NULL); if (CL_rc == -1) return -1; opencl_ctx->platforms_name[platform_id] = platform_name; // platform version CL_rc = hc_clGetPlatformInfo (hashcat_ctx, platform, CL_PLATFORM_VERSION, 0, NULL, ¶m_value_size); if (CL_rc == -1) return -1; char *platform_version = (char *) hcmalloc (param_value_size); CL_rc = hc_clGetPlatformInfo (hashcat_ctx, platform, CL_PLATFORM_VERSION, param_value_size, platform_version, NULL); if (CL_rc == -1) return -1; opencl_ctx->platforms_version[platform_id] = platform_version; // find our own platform vendor because pocl and mesa are pushing original vendor_id through opencl // this causes trouble with vendor id based macros // we'll assign generic to those without special optimization available cl_uint platform_vendor_id = 0; if (strcmp (platform_vendor, CL_VENDOR_AMD1) == 0) { platform_vendor_id = VENDOR_ID_AMD; } else if (strcmp (platform_vendor, CL_VENDOR_AMD2) == 0) { platform_vendor_id = VENDOR_ID_AMD; } else if (strcmp (platform_vendor, CL_VENDOR_AMD_USE_INTEL) == 0) { platform_vendor_id = VENDOR_ID_AMD_USE_INTEL; } else if (strcmp (platform_vendor, CL_VENDOR_APPLE) == 0) { platform_vendor_id = VENDOR_ID_APPLE; } else if (strcmp (platform_vendor, CL_VENDOR_INTEL_BEIGNET) == 0) { platform_vendor_id = VENDOR_ID_INTEL_BEIGNET; } else if (strcmp (platform_vendor, CL_VENDOR_INTEL_SDK) == 0) { platform_vendor_id = VENDOR_ID_INTEL_SDK; } else if (strcmp (platform_vendor, CL_VENDOR_MESA) == 0) { platform_vendor_id = VENDOR_ID_MESA; } else if (strcmp (platform_vendor, CL_VENDOR_NV) == 0) { platform_vendor_id = VENDOR_ID_NV; } else if (strcmp (platform_vendor, CL_VENDOR_POCL) == 0) { platform_vendor_id = VENDOR_ID_POCL; } else { platform_vendor_id = VENDOR_ID_GENERIC; } bool platform_skipped = ((opencl_ctx->opencl_platforms_filter & (1u << platform_id)) == 0); CL_rc = hc_clGetDeviceIDs (hashcat_ctx, platform, CL_DEVICE_TYPE_ALL, DEVICES_MAX, platform_devices, &platform_devices_cnt); if (CL_rc == -1) { //event_log_error (hashcat_ctx, "clGetDeviceIDs(): %s", val2cstr_cl (CL_rc)); //return -1; platform_skipped = true; } opencl_ctx->platforms_skipped[platform_id] = platform_skipped; if (platform_skipped == true) continue; if (user_options->force == false) { if (platform_vendor_id == VENDOR_ID_MESA) { event_log_error (hashcat_ctx, "Mesa (Gallium) OpenCL platform detected!"); event_log_warning (hashcat_ctx, "The Mesa platform can cause errors that are often mistaken for bugs in hashcat."); event_log_warning (hashcat_ctx, "You are STRONGLY encouraged to use the drivers listed in docs/readme.txt."); event_log_warning (hashcat_ctx, "You can use --force to override this, but do not report related errors."); event_log_warning (hashcat_ctx, "You can also use --opencl-platforms to skip the Mesa platform(s)."); event_log_warning (hashcat_ctx, NULL); return -1; } } hc_device_param_t *devices_param = opencl_ctx->devices_param; for (u32 platform_devices_id = 0; platform_devices_id < platform_devices_cnt; platform_devices_id++) { const u32 device_id = devices_cnt; hc_device_param_t *device_param = &devices_param[device_id]; device_param->platform_vendor_id = platform_vendor_id; device_param->device = platform_devices[platform_devices_id]; device_param->device_id = device_id; device_param->platform_devices_id = platform_devices_id; device_param->platform = platform; // device_type cl_device_type device_type; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_TYPE, sizeof (device_type), &device_type, NULL); if (CL_rc == -1) return -1; device_type &= ~CL_DEVICE_TYPE_DEFAULT; device_param->device_type = device_type; // device_name CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_NAME, 0, NULL, ¶m_value_size); if (CL_rc == -1) return -1; char *device_name = (char *) hcmalloc (param_value_size); CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_NAME, param_value_size, device_name, NULL); if (CL_rc == -1) return -1; device_param->device_name = device_name; hc_string_trim_leading (device_param->device_name); hc_string_trim_trailing (device_param->device_name); // device_vendor CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_VENDOR, 0, NULL, ¶m_value_size); if (CL_rc == -1) return -1; char *device_vendor = (char *) hcmalloc (param_value_size); CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_VENDOR, param_value_size, device_vendor, NULL); if (CL_rc == -1) return -1; device_param->device_vendor = device_vendor; cl_uint device_vendor_id = 0; if (strcmp (device_vendor, CL_VENDOR_AMD1) == 0) { device_vendor_id = VENDOR_ID_AMD; } else if (strcmp (device_vendor, CL_VENDOR_AMD2) == 0) { device_vendor_id = VENDOR_ID_AMD; } else if (strcmp (device_vendor, CL_VENDOR_AMD_USE_INTEL) == 0) { device_vendor_id = VENDOR_ID_AMD_USE_INTEL; } else if (strcmp (device_vendor, CL_VENDOR_APPLE) == 0) { device_vendor_id = VENDOR_ID_APPLE; } else if (strcmp (device_vendor, CL_VENDOR_APPLE_USE_AMD) == 0) { device_vendor_id = VENDOR_ID_AMD; } else if (strcmp (device_vendor, CL_VENDOR_APPLE_USE_NV) == 0) { device_vendor_id = VENDOR_ID_NV; } else if (strcmp (device_vendor, CL_VENDOR_INTEL_BEIGNET) == 0) { device_vendor_id = VENDOR_ID_INTEL_BEIGNET; } else if (strcmp (device_vendor, CL_VENDOR_INTEL_SDK) == 0) { device_vendor_id = VENDOR_ID_INTEL_SDK; } else if (strcmp (device_vendor, CL_VENDOR_MESA) == 0) { device_vendor_id = VENDOR_ID_MESA; } else if (strcmp (device_vendor, CL_VENDOR_NV) == 0) { device_vendor_id = VENDOR_ID_NV; } else if (strcmp (device_vendor, CL_VENDOR_POCL) == 0) { device_vendor_id = VENDOR_ID_POCL; } else { device_vendor_id = VENDOR_ID_GENERIC; } device_param->device_vendor_id = device_vendor_id; // device_version CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_VERSION, 0, NULL, ¶m_value_size); if (CL_rc == -1) return -1; char *device_version = (char *) hcmalloc (param_value_size); CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_VERSION, param_value_size, device_version, NULL); if (CL_rc == -1) return -1; device_param->device_version = device_version; // device_opencl_version CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_OPENCL_C_VERSION, 0, NULL, ¶m_value_size); if (CL_rc == -1) return -1; char *device_opencl_version = (char *) hcmalloc (param_value_size); CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_OPENCL_C_VERSION, param_value_size, device_opencl_version, NULL); if (CL_rc == -1) return -1; device_param->device_opencl_version = device_opencl_version; // max_compute_units cl_uint device_processors; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_MAX_COMPUTE_UNITS, sizeof (device_processors), &device_processors, NULL); if (CL_rc == -1) return -1; device_param->device_processors = device_processors; // device_global_mem cl_ulong device_global_mem; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_GLOBAL_MEM_SIZE, sizeof (device_global_mem), &device_global_mem, NULL); if (CL_rc == -1) return -1; device_param->device_global_mem = device_global_mem; // device_maxmem_alloc cl_ulong device_maxmem_alloc; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof (device_maxmem_alloc), &device_maxmem_alloc, NULL); if (CL_rc == -1) return -1; device_param->device_maxmem_alloc = device_maxmem_alloc; // note we'll limit to 2gb, otherwise this causes all kinds of weird errors because of possible integer overflows in opencl runtimes // testwise disabling that //device_param->device_maxmem_alloc = MIN (device_maxmem_alloc, 0x7fffffff); // max_work_group_size size_t device_maxworkgroup_size; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof (device_maxworkgroup_size), &device_maxworkgroup_size, NULL); if (CL_rc == -1) return -1; device_param->device_maxworkgroup_size = device_maxworkgroup_size; // max_clock_frequency cl_uint device_maxclock_frequency; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof (device_maxclock_frequency), &device_maxclock_frequency, NULL); if (CL_rc == -1) return -1; device_param->device_maxclock_frequency = device_maxclock_frequency; // device_endian_little cl_bool device_endian_little; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_ENDIAN_LITTLE, sizeof (device_endian_little), &device_endian_little, NULL); if (CL_rc == -1) return -1; if (device_endian_little == CL_FALSE) { event_log_error (hashcat_ctx, "* Device #%u: This device is not little-endian.", device_id + 1); device_param->skipped = true; } // device_available cl_bool device_available; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_AVAILABLE, sizeof (device_available), &device_available, NULL); if (CL_rc == -1) return -1; if (device_available == CL_FALSE) { event_log_error (hashcat_ctx, "* Device #%u: This device is not available.", device_id + 1); device_param->skipped = true; } // device_compiler_available cl_bool device_compiler_available; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_COMPILER_AVAILABLE, sizeof (device_compiler_available), &device_compiler_available, NULL); if (CL_rc == -1) return -1; if (device_compiler_available == CL_FALSE) { event_log_error (hashcat_ctx, "* Device #%u: No compiler is available for this device.", device_id + 1); device_param->skipped = true; } // device_execution_capabilities cl_device_exec_capabilities device_execution_capabilities; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_EXECUTION_CAPABILITIES, sizeof (device_execution_capabilities), &device_execution_capabilities, NULL); if (CL_rc == -1) return -1; if ((device_execution_capabilities & CL_EXEC_KERNEL) == 0) { event_log_error (hashcat_ctx, "* Device #%u: This device does not support executing kernels.", device_id + 1); device_param->skipped = true; } // device_extensions size_t device_extensions_size; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_EXTENSIONS, 0, NULL, &device_extensions_size); if (CL_rc == -1) return -1; char *device_extensions = hcmalloc (device_extensions_size + 1); CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_EXTENSIONS, device_extensions_size, device_extensions, NULL); if (CL_rc == -1) return -1; if (strstr (device_extensions, "base_atomics") == 0) { event_log_error (hashcat_ctx, "* Device #%u: This device does not support base atomics.", device_id + 1); device_param->skipped = true; } if (strstr (device_extensions, "byte_addressable_store") == 0) { event_log_error (hashcat_ctx, "* Device #%u: This device does not support byte-addressable store.", device_id + 1); device_param->skipped = true; } hcfree (device_extensions); // device_max_constant_buffer_size cl_ulong device_max_constant_buffer_size; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, sizeof (device_max_constant_buffer_size), &device_max_constant_buffer_size, NULL); if (CL_rc == -1) return -1; if (device_max_constant_buffer_size < 65536) { event_log_error (hashcat_ctx, "* Device #%u: This device's constant buffer size is too small.", device_id + 1); device_param->skipped = true; } // device_local_mem_size cl_ulong device_local_mem_size; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_LOCAL_MEM_SIZE, sizeof (device_local_mem_size), &device_local_mem_size, NULL); if (CL_rc == -1) return -1; if (device_local_mem_size < 32768) { event_log_error (hashcat_ctx, "* Device #%u: This device's local mem size is too small.", device_id + 1); device_param->skipped = true; } // If there's both an Intel CPU and an AMD OpenCL runtime it's a tricky situation // Both platforms support CPU device types and therefore both will try to use 100% of the physical resources // This results in both utilizing it for 50% // However, Intel has much better SIMD control over their own hardware // It makes sense to give them full control over their own hardware if (device_type & CL_DEVICE_TYPE_CPU) { if (device_param->device_vendor_id == VENDOR_ID_AMD_USE_INTEL) { if (user_options->force == false) { if (user_options->quiet == false) event_log_warning (hashcat_ctx, "* Device #%u: Not a native Intel OpenCL runtime. Expect massive speed loss.", device_id + 1); if (user_options->quiet == false) event_log_warning (hashcat_ctx, " You can use --force to override, but do not report related errors."); device_param->skipped = true; } } } // Since some times we get reports from users about not working hashcat, dropping error messages like: // CL_INVALID_COMMAND_QUEUE and CL_OUT_OF_RESOURCES // Turns out that this is caused by Intel OpenCL runtime handling their GPU devices // Disable such devices unless the user forces to use it #if !defined (__APPLE__) if (device_type & CL_DEVICE_TYPE_GPU) { if ((device_param->device_vendor_id == VENDOR_ID_INTEL_SDK) || (device_param->device_vendor_id == VENDOR_ID_INTEL_BEIGNET)) { if (user_options->force == false) { if (user_options->quiet == false) event_log_warning (hashcat_ctx, "* Device #%u: Intel's OpenCL runtime (GPU only) is currently broken.", device_id + 1); if (user_options->quiet == false) event_log_warning (hashcat_ctx, " We are waiting for updated OpenCL drivers from Intel."); if (user_options->quiet == false) event_log_warning (hashcat_ctx, " You can use --force to override, but do not report related errors."); device_param->skipped = true; } } } #endif // __APPLE__ // skipped if ((opencl_ctx->devices_filter & (1u << device_id)) == 0) { device_param->skipped = true; } if ((opencl_ctx->device_types_filter & (device_type)) == 0) { device_param->skipped = true; } // driver_version CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DRIVER_VERSION, 0, NULL, ¶m_value_size); if (CL_rc == -1) return -1; char *driver_version = (char *) hcmalloc (param_value_size); CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DRIVER_VERSION, param_value_size, driver_version, NULL); if (CL_rc == -1) return -1; device_param->driver_version = driver_version; // vendor specific if (device_param->device_type & CL_DEVICE_TYPE_GPU) { if ((device_param->platform_vendor_id == VENDOR_ID_AMD) && (device_param->device_vendor_id == VENDOR_ID_AMD)) { need_adl = true; #if defined (__linux__) need_sysfs = true; #endif } if ((device_param->platform_vendor_id == VENDOR_ID_NV) && (device_param->device_vendor_id == VENDOR_ID_NV)) { need_nvml = true; #if defined (__linux__) need_xnvctrl = true; #endif #if defined (_WIN) need_nvapi = true; #endif #if defined (__CYGWIN__) need_nvapi = true; #endif } } if (device_param->device_type & CL_DEVICE_TYPE_GPU) { if ((device_param->platform_vendor_id == VENDOR_ID_AMD) && (device_param->device_vendor_id == VENDOR_ID_AMD)) { cl_device_topology_amd amdtopo; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_TOPOLOGY_AMD, sizeof (amdtopo), &amdtopo, NULL); if (CL_rc == -1) return -1; device_param->pcie_bus = amdtopo.pcie.bus; device_param->pcie_device = amdtopo.pcie.device; device_param->pcie_function = amdtopo.pcie.function; #if defined (__linux__) // check for AMD ROCm driver (only available on linux) const char *t1 = strstr (device_param->driver_version, "(HSA,LC)"); const char *t2 = strstr (device_param->driver_version, "(PAL,LC)"); const char *t3 = strstr (device_param->driver_version, "(PAL,HSAIL)"); const char *t4 = strstr (device_param->driver_version, "(HSA, LC)"); const char *t5 = strstr (device_param->driver_version, "(PAL, LC)"); const char *t6 = strstr (device_param->driver_version, "(PAL, HSAIL)"); if ((t1 == NULL) && (t2 == NULL) && (t3 == NULL) && (t4 == NULL) && (t5 == NULL) && (t6 == NULL)) { device_param->is_rocm = false; } else { device_param->is_rocm = true; } #else device_param->is_rocm = false; #endif } if ((device_param->platform_vendor_id == VENDOR_ID_NV) && (device_param->device_vendor_id == VENDOR_ID_NV)) { cl_uint pci_bus_id_nv; // is cl_uint the right type for them?? cl_uint pci_slot_id_nv; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_PCI_BUS_ID_NV, sizeof (pci_bus_id_nv), &pci_bus_id_nv, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_PCI_SLOT_ID_NV, sizeof (pci_slot_id_nv), &pci_slot_id_nv, NULL); if (CL_rc == -1) return -1; device_param->pcie_bus = (u8) (pci_bus_id_nv); device_param->pcie_device = (u8) (pci_slot_id_nv >> 3); device_param->pcie_function = (u8) (pci_slot_id_nv & 7); cl_uint sm_minor = 0; cl_uint sm_major = 0; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV, sizeof (sm_minor), &sm_minor, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV, sizeof (sm_major), &sm_major, NULL); if (CL_rc == -1) return -1; device_param->sm_minor = sm_minor; device_param->sm_major = sm_major; cl_uint kernel_exec_timeout = 0; CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV, sizeof (kernel_exec_timeout), &kernel_exec_timeout, NULL); if (CL_rc == -1) return -1; device_param->kernel_exec_timeout = kernel_exec_timeout; // CPU burning loop damper // Value is given as number between 0-100 // By default 100% device_param->nvidia_spin_damp = (double) user_options->nvidia_spin_damp; if (user_options->nvidia_spin_damp_chgd == false) { if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { /** * the workaround is not a friend of rule based attacks * the words from the wordlist combined with fast and slow rules cause * fluctuations which cause inaccurate wait time estimations * using a reduced damping percentage almost compensates this */ device_param->nvidia_spin_damp = 64; } } device_param->nvidia_spin_damp /= 100; } } // common driver check if (device_param->skipped == false) { if ((user_options->force == false) && (user_options->opencl_info == false)) { if (device_type & CL_DEVICE_TYPE_CPU) { if (device_param->platform_vendor_id == VENDOR_ID_INTEL_SDK) { bool intel_warn = false; float opencl_version = 0; int opencl_build = 0; int res = sscanf (device_param->device_version, "OpenCL %f (Build %d)", &opencl_version, &opencl_build); if (res == 2) { // Intel OpenCL runtime 16.1.1 if (opencl_build < 25) intel_warn = true; } if (intel_warn == true) { event_log_error (hashcat_ctx, "* Device #%u: Outdated or broken Intel OpenCL runtime detected!", device_id + 1); event_log_warning (hashcat_ctx, "You are STRONGLY encouraged to use the officially supported NVIDIA driver."); event_log_warning (hashcat_ctx, "See hashcat.net for officially supported NVIDIA drivers."); event_log_warning (hashcat_ctx, "See also: https://hashcat.net/faq/wrongdriver"); event_log_warning (hashcat_ctx, "You can use --force to override this, but do not report related errors."); event_log_warning (hashcat_ctx, NULL); return -1; } } } else if (device_type & CL_DEVICE_TYPE_GPU) { if (device_param->platform_vendor_id == VENDOR_ID_AMD) { bool amd_warn = true; #if defined (__linux__) if (device_param->is_rocm == false) { // ROCm is so much better, we should give the user some hint and remove this block // AMDGPU-PRO Driver 16.40 and higher if (atoi (device_param->driver_version) >= 2117) amd_warn = false; // AMDGPU-PRO Driver 16.50 is known to be broken if (atoi (device_param->driver_version) == 2236) amd_warn = true; // AMDGPU-PRO Driver 16.60 is known to be broken if (atoi (device_param->driver_version) == 2264) amd_warn = true; // AMDGPU-PRO Driver 17.10 is known to be broken if (atoi (device_param->driver_version) == 2348) amd_warn = true; // AMDGPU-PRO Driver 17.20 (2416) is fine, doesn't need check will match >= 2117 } else { // Support for ROCm platform if (atof (device_param->driver_version) >= 1.1) amd_warn = false; } #elif defined (_WIN) // AMD Radeon Software 14.9 and higher, should be updated to 15.12 if (atoi (device_param->driver_version) >= 1573) amd_warn = false; #else // we have no information about other os if (amd_warn == true) amd_warn = false; #endif if (amd_warn == true) { event_log_error (hashcat_ctx, "* Device #%u: Outdated or broken AMD driver detected!", device_id + 1); event_log_warning (hashcat_ctx, "You are STRONGLY encouraged to use the officially supported AMD driver."); event_log_warning (hashcat_ctx, "See hashcat.net for officially supported AMD drivers."); event_log_warning (hashcat_ctx, "See also: https://hashcat.net/faq/wrongdriver"); event_log_warning (hashcat_ctx, "You can use --force to override this, but do not report related errors."); event_log_warning (hashcat_ctx, NULL); return -1; } } if (device_param->platform_vendor_id == VENDOR_ID_NV) { int nv_warn = true; // nvidia driver 367.x and higher if (atoi (device_param->driver_version) >= 367) nv_warn = false; if (nv_warn == true) { event_log_error (hashcat_ctx, "* Device #%u: Outdated or broken NVIDIA driver detected!", device_id + 1); event_log_warning (hashcat_ctx, "You are STRONGLY encouraged to use the officially supported NVIDIA driver."); event_log_warning (hashcat_ctx, "See hashcat's homepage for officially supported NVIDIA drivers."); event_log_warning (hashcat_ctx, "See also: https://hashcat.net/faq/wrongdriver"); event_log_warning (hashcat_ctx, "You can use --force to override this, but do not report related errors."); event_log_warning (hashcat_ctx, NULL); return -1; } if (device_param->sm_major < 5) { if (user_options->quiet == false) event_log_warning (hashcat_ctx, "* Device #%u: This hardware has outdated CUDA compute capability (%u.%u).", device_id + 1, device_param->sm_major, device_param->sm_minor); if (user_options->quiet == false) event_log_warning (hashcat_ctx, " For modern OpenCL performance, upgrade to hardware that supports"); if (user_options->quiet == false) event_log_warning (hashcat_ctx, " CUDA compute capability version 5.0 (Maxwell) or higher."); } if (device_param->kernel_exec_timeout != 0) { if (user_options->quiet == false) event_log_warning (hashcat_ctx, "* Device #%u: WARNING! Kernel exec timeout is not disabled.", device_id + 1); if (user_options->quiet == false) event_log_warning (hashcat_ctx, " This may cause \"CL_OUT_OF_RESOURCES\" or related errors."); if (user_options->quiet == false) event_log_warning (hashcat_ctx, " To disable the timeout, see: https://hashcat.net/q/timeoutpatch"); } } if ((strstr (device_param->device_opencl_version, "beignet")) || (strstr (device_param->device_version, "beignet"))) { event_log_error (hashcat_ctx, "* Device #%u: Intel beignet driver detected!", device_id + 1); event_log_warning (hashcat_ctx, "The beignet driver has been marked as likely to fail kernel compilation."); event_log_warning (hashcat_ctx, "You can use --force to override this, but do not report related errors."); event_log_warning (hashcat_ctx, NULL); return -1; } } } /** * activate device */ devices_active++; } // next please devices_cnt++; } } if (devices_active == 0) { event_log_error (hashcat_ctx, "No devices found/left."); return -1; } // additional check to see if the user has chosen a device that is not within the range of available devices (i.e. larger than devices_cnt) if (opencl_ctx->devices_filter != (u32) -1) { const u32 devices_cnt_mask = ~(((u32) -1 >> devices_cnt) << devices_cnt); if (opencl_ctx->devices_filter > devices_cnt_mask) { event_log_error (hashcat_ctx, "An invalid device was specified using the --opencl-devices parameter."); event_log_error (hashcat_ctx, "The specified device was higher than the number of available devices (%u).", devices_cnt); return -1; } } opencl_ctx->target_msec = TARGET_MSEC_PROFILE[user_options->workload_profile - 1]; opencl_ctx->devices_cnt = devices_cnt; opencl_ctx->devices_active = devices_active; opencl_ctx->need_adl = need_adl; opencl_ctx->need_nvml = need_nvml; opencl_ctx->need_nvapi = need_nvapi; opencl_ctx->need_xnvctrl = need_xnvctrl; opencl_ctx->need_sysfs = need_sysfs; opencl_ctx->comptime = comptime; return 0; } void opencl_ctx_devices_destroy (hashcat_ctx_t *hashcat_ctx) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (opencl_ctx->enabled == false) return; for (u32 platform_id = 0; platform_id < opencl_ctx->platforms_cnt; platform_id++) { hcfree (opencl_ctx->platforms_vendor[platform_id]); hcfree (opencl_ctx->platforms_name[platform_id]); hcfree (opencl_ctx->platforms_version[platform_id]); } for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; hcfree (device_param->device_name); hcfree (device_param->device_version); hcfree (device_param->driver_version); hcfree (device_param->device_opencl_version); } opencl_ctx->devices_cnt = 0; opencl_ctx->devices_active = 0; opencl_ctx->need_adl = false; opencl_ctx->need_nvml = false; opencl_ctx->need_nvapi = false; opencl_ctx->need_xnvctrl = false; opencl_ctx->need_sysfs = false; } void opencl_ctx_devices_update_power (hashcat_ctx_t *hashcat_ctx) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; user_options_t *user_options = hashcat_ctx->user_options; if (opencl_ctx->enabled == false) return; u32 kernel_power_all = 0; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; kernel_power_all += device_param->kernel_power; } opencl_ctx->kernel_power_all = kernel_power_all; /* * Inform user about possible slow speeds */ if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { if (status_ctx->words_base < kernel_power_all) { if (user_options->quiet == false) { event_log_advice (hashcat_ctx, "The wordlist or mask that you are using is too small."); event_log_advice (hashcat_ctx, "This means that hashcat cannot use the full parallel power of your device(s)."); event_log_advice (hashcat_ctx, "Unless you supply more work, your cracking speed will drop."); event_log_advice (hashcat_ctx, "For tips on supplying more work, see: https://hashcat.net/faq/morework"); event_log_advice (hashcat_ctx, NULL); } } } } void opencl_ctx_devices_kernel_loops (hashcat_ctx_t *hashcat_ctx) { combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; if (opencl_ctx->enabled == false) return; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; device_param->kernel_loops_min = device_param->kernel_loops_min_sav; device_param->kernel_loops_max = device_param->kernel_loops_max_sav; if (device_param->kernel_loops_min < device_param->kernel_loops_max) { u64 innerloop_cnt = 0; if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) innerloop_cnt = MIN (KERNEL_RULES, straight_ctx->kernel_rules_cnt); else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) innerloop_cnt = MIN (KERNEL_COMBS, combinator_ctx->combs_cnt); else if (user_options_extra->attack_kern == ATTACK_KERN_BF) innerloop_cnt = MIN (KERNEL_BFS, mask_ctx->bfs_cnt); } else { innerloop_cnt = hashes->salts_buf[0].salt_iter; } if ((innerloop_cnt >= device_param->kernel_loops_min) && (innerloop_cnt <= device_param->kernel_loops_max)) { device_param->kernel_loops_max = innerloop_cnt; } } } } static int get_kernel_threads (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, cl_kernel kernel, u32 *result) { int CL_rc; size_t work_group_size; CL_rc = hc_clGetKernelWorkGroupInfo (hashcat_ctx, kernel, device_param->device, CL_KERNEL_WORK_GROUP_SIZE, sizeof (work_group_size), &work_group_size, NULL); if (CL_rc == -1) return -1; size_t compile_work_group_size[3]; CL_rc = hc_clGetKernelWorkGroupInfo (hashcat_ctx, kernel, device_param->device, CL_KERNEL_COMPILE_WORK_GROUP_SIZE, sizeof (compile_work_group_size), &compile_work_group_size, NULL); if (CL_rc == -1) return -1; u32 kernel_threads = device_param->kernel_threads_by_user; if (work_group_size > 0) { kernel_threads = MIN (kernel_threads, work_group_size); } if (compile_work_group_size[0] > 0) { kernel_threads = MIN (kernel_threads, compile_work_group_size[0]); } *result = kernel_threads; return 0; } int opencl_session_begin (hashcat_ctx_t *hashcat_ctx) { bitmap_ctx_t *bitmap_ctx = hashcat_ctx->bitmap_ctx; folder_config_t *folder_config = hashcat_ctx->folder_config; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; user_options_t *user_options = hashcat_ctx->user_options; if (opencl_ctx->enabled == false) return 0; /** * Some algorithm, like descrypt, can benefit from JIT compilation */ opencl_ctx->force_jit_compilation = -1; if (hashconfig->hash_mode == 8900) { opencl_ctx->force_jit_compilation = 8900; } else if (hashconfig->hash_mode == 9300) { opencl_ctx->force_jit_compilation = 8900; } else if (hashconfig->hash_mode == 15700) { opencl_ctx->force_jit_compilation = 15700; } else if (hashconfig->hash_mode == 1500 && user_options->attack_mode == ATTACK_MODE_BF && hashes->salts_cnt == 1) { opencl_ctx->force_jit_compilation = 1500; } u32 hardware_power_all = 0; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { int CL_rc = CL_SUCCESS; /** * host buffer */ hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; bool skipped_temp = false; #if defined (__APPLE__) /** * If '--force' is not set, we proceed to excluding unstable hash-modes, * too high kernel runtime, even on -u1 -n1, therefore likely to run into trap 6 */ if ((user_options->hash_mode == 1500) || (user_options->hash_mode == 3000) || (user_options->hash_mode == 3200) || (user_options->hash_mode == 8900) || (user_options->hash_mode == 9300) || (user_options->hash_mode == 9800) || (user_options->hash_mode == 12500) || (user_options->hash_mode == 14000) || (user_options->hash_mode == 14100) || (user_options->hash_mode == 15700)) { skipped_temp = true; } #endif // __APPLE__ if (device_param->platform_vendor_id == VENDOR_ID_AMD) { if (device_param->is_rocm == false) { if ((user_options->hash_mode == 7900) || (user_options->hash_mode == 10700) || (user_options->hash_mode == 13731)) { skipped_temp = true; } } } if ((skipped_temp == true) && (user_options->force == false)) { event_log_warning (hashcat_ctx, "* Device #%u: Skipping unstable hash-mode %u for this device.", device_id + 1, user_options->hash_mode); event_log_warning (hashcat_ctx, " You can use --force to override, but do not report related errors."); device_param->skipped = true; device_param->skipped_temp = true; continue; } // vector_width cl_uint vector_width; if (user_options->opencl_vector_width_chgd == false) { // tuning db tuning_db_entry_t *tuningdb_entry = tuning_db_search (hashcat_ctx, device_param->device_name, device_param->device_type, user_options->attack_mode, hashconfig->hash_mode); if (tuningdb_entry == NULL || tuningdb_entry->vector_width == -1) { if (hashconfig->opti_type & OPTI_TYPE_USES_BITS_64) { CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG, sizeof (vector_width), &vector_width, NULL); if (CL_rc == -1) return -1; } else { CL_rc = hc_clGetDeviceInfo (hashcat_ctx, device_param->device, CL_DEVICE_NATIVE_VECTOR_WIDTH_INT, sizeof (vector_width), &vector_width, NULL); if (CL_rc == -1) return -1; } } else { vector_width = (cl_uint) tuningdb_entry->vector_width; } } else { vector_width = user_options->opencl_vector_width; } // We can't have SIMD in kernels where we have an unknown final password length if ((hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) == 0) { if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) { vector_width = 1; } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { vector_width = 1; } } else { // there's currently no slow kernel that supports NEW_SIMD_CODE which // has unknown final password length in _loop kernel // vector_width = 1; } } if (vector_width > 16) vector_width = 16; device_param->vector_width = vector_width; /** * kernel accel and loops tuning db adjustment */ device_param->kernel_accel_min = 1; device_param->kernel_accel_max = 1024; device_param->kernel_loops_min = 1; device_param->kernel_loops_max = 1024; tuning_db_entry_t *tuningdb_entry = tuning_db_search (hashcat_ctx, device_param->device_name, device_param->device_type, user_options->attack_mode, hashconfig->hash_mode); if (tuningdb_entry != NULL) { u32 _kernel_accel = tuningdb_entry->kernel_accel; u32 _kernel_loops = tuningdb_entry->kernel_loops; if (_kernel_accel) { device_param->kernel_accel_min = _kernel_accel; device_param->kernel_accel_max = _kernel_accel; } if (_kernel_loops) { if (user_options->workload_profile == 1) { _kernel_loops = (_kernel_loops > 8) ? _kernel_loops / 8 : 1; } else if (user_options->workload_profile == 2) { _kernel_loops = (_kernel_loops > 4) ? _kernel_loops / 4 : 1; } device_param->kernel_loops_min = _kernel_loops; device_param->kernel_loops_max = _kernel_loops; } } // commandline parameters overwrite tuningdb entries if (user_options->kernel_accel_chgd == true) { device_param->kernel_accel_min = user_options->kernel_accel; device_param->kernel_accel_max = user_options->kernel_accel; } if (user_options->kernel_loops_chgd == true) { device_param->kernel_loops_min = user_options->kernel_loops; device_param->kernel_loops_max = user_options->kernel_loops; } // we have some absolute limits for fast hashes (because of limit constant memory), make sure not to overstep if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) { device_param->kernel_loops_min = MIN (device_param->kernel_loops_min, KERNEL_RULES); device_param->kernel_loops_max = MIN (device_param->kernel_loops_max, KERNEL_RULES); } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { device_param->kernel_loops_min = MIN (device_param->kernel_loops_min, KERNEL_COMBS); device_param->kernel_loops_max = MIN (device_param->kernel_loops_max, KERNEL_COMBS); } else if (user_options_extra->attack_kern == ATTACK_KERN_BF) { device_param->kernel_loops_min = MIN (device_param->kernel_loops_min, KERNEL_BFS); device_param->kernel_loops_max = MIN (device_param->kernel_loops_max, KERNEL_BFS); } } /** * device properties */ const u32 device_processors = device_param->device_processors; /** * create context for each device */ cl_context_properties properties[3]; properties[0] = CL_CONTEXT_PLATFORM; properties[1] = (cl_context_properties) device_param->platform; properties[2] = 0; CL_rc = hc_clCreateContext (hashcat_ctx, properties, 1, &device_param->device, NULL, NULL, &device_param->context); if (CL_rc == -1) return -1; /** * create command-queue */ // not supported with NV // device_param->command_queue = hc_clCreateCommandQueueWithProperties (hashcat_ctx, device_param->device, NULL); CL_rc = hc_clCreateCommandQueue (hashcat_ctx, device_param->context, device_param->device, CL_QUEUE_PROFILING_ENABLE, &device_param->command_queue); if (CL_rc == -1) return -1; /** * kernel threads: some algorithms need a fixed kernel-threads count * because of shared memory usage or bitslice * there needs to be some upper limit, otherwise there's too much overhead */ const u32 kernel_threads = hashconfig_get_kernel_threads (hashcat_ctx, device_param); device_param->kernel_threads_by_user = kernel_threads; device_param->hardware_power = device_processors * kernel_threads; /** * create input buffers on device : calculate size of fixed memory buffers */ size_t size_root_css = SP_PW_MAX * sizeof (cs_t); size_t 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; size_t size_results = sizeof (u32); device_param->size_results = size_results; size_t size_rules = (size_t) straight_ctx->kernel_rules_cnt * sizeof (kernel_rule_t); size_t size_rules_c = (size_t) KERNEL_RULES * sizeof (kernel_rule_t); size_t size_plains = (size_t) hashes->digests_cnt * sizeof (plain_t); size_t size_salts = (size_t) hashes->salts_cnt * sizeof (salt_t); size_t size_esalts = (size_t) hashes->digests_cnt * (size_t) hashconfig->esalt_size; size_t size_shown = (size_t) hashes->digests_cnt * sizeof (u32); size_t size_digests = (size_t) hashes->digests_cnt * (size_t) hashconfig->dgst_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; size_t size_combs = KERNEL_COMBS * sizeof (pw_t); size_t size_bfs = KERNEL_BFS * sizeof (bf_t); size_t size_tm = 32 * sizeof (bs_word_t); size_t size_st_digests = 1 * hashconfig->dgst_size; size_t size_st_salts = 1 * sizeof (salt_t); size_t size_st_esalts = 1 * hashconfig->esalt_size; device_param->size_st_digests = size_st_digests; device_param->size_st_salts = size_st_salts; device_param->size_st_esalts = size_st_esalts; // scryptV stuff size_t scrypt_tmp_size = 0; size_t scrypt_tmto_final = 0; size_t size_scrypt = 4; if ((hashconfig->hash_mode == 8900) || (hashconfig->hash_mode == 9300) || (hashconfig->hash_mode == 15700)) { // we need to check that all hashes have the same scrypt settings const u32 scrypt_N = hashes->salts_buf[0].scrypt_N; const u32 scrypt_r = hashes->salts_buf[0].scrypt_r; const u32 scrypt_p = hashes->salts_buf[0].scrypt_p; for (u32 i = 1; i < hashes->salts_cnt; i++) { if ((hashes->salts_buf[i].scrypt_N != scrypt_N) || (hashes->salts_buf[i].scrypt_r != scrypt_r) || (hashes->salts_buf[i].scrypt_p != scrypt_p)) { event_log_error (hashcat_ctx, "Mixed scrypt settings are not supported."); return -1; } } scrypt_tmp_size = (128 * scrypt_r * scrypt_p); hashconfig->tmp_size = scrypt_tmp_size; u32 tmto_start = 1; u32 tmto_stop = 6; if (user_options->scrypt_tmto) { tmto_start = user_options->scrypt_tmto; tmto_stop = user_options->scrypt_tmto; } const u32 kernel_power_max = device_param->hardware_power * device_param->kernel_accel_max; // size_pws const size_t size_pws = (size_t) kernel_power_max * sizeof (pw_t); const size_t size_pws_amp = size_pws; // size_tmps const size_t size_tmps = (size_t) kernel_power_max * hashconfig->tmp_size; // size_hooks const size_t size_hooks = (size_t) kernel_power_max * hashconfig->hook_size; const u64 scrypt_extra_space = bitmap_ctx->bitmap_size + bitmap_ctx->bitmap_size + bitmap_ctx->bitmap_size + bitmap_ctx->bitmap_size + bitmap_ctx->bitmap_size + bitmap_ctx->bitmap_size + bitmap_ctx->bitmap_size + bitmap_ctx->bitmap_size + size_bfs + size_combs + size_digests + size_esalts + size_hooks + size_markov_css + size_plains + size_pws + size_pws_amp + size_results + size_root_css + size_rules + size_rules_c + size_salts + size_shown + size_tm + size_tmps + size_st_digests + size_st_salts + size_st_esalts; bool not_enough_memory = true; u32 tmto; for (tmto = tmto_start; tmto <= tmto_stop; tmto++) { size_scrypt = (128 * scrypt_r) * scrypt_N; size_scrypt /= 1u << tmto; size_scrypt *= (size_t) device_param->hardware_power * device_param->kernel_accel_max; if ((size_scrypt / 4) > device_param->device_maxmem_alloc) { if (user_options->quiet == false) event_log_warning (hashcat_ctx, "Increasing single-block device memory allocatable for --scrypt-tmto %u.", tmto); continue; } if ((size_scrypt + scrypt_extra_space) > device_param->device_global_mem) { if (user_options->quiet == false) event_log_warning (hashcat_ctx, "Increasing total device memory allocatable for --scrypt-tmto %u.", tmto); continue; } for (u32 salts_pos = 0; salts_pos < hashes->salts_cnt; salts_pos++) { scrypt_tmto_final = tmto; } not_enough_memory = false; break; } if (not_enough_memory == true) { event_log_error (hashcat_ctx, "Cannot allocate enough device memory. Perhaps retry with -n 1."); return -1; } #if defined (DEBUG) if (user_options->quiet == false) event_log_warning (hashcat_ctx, "SCRYPT tmto optimizer value set to: %lu, mem: %lu", scrypt_tmto_final, size_scrypt); if (user_options->quiet == false) event_log_warning (hashcat_ctx, NULL); #endif } size_t size_scrypt4 = size_scrypt / 4; /** * some algorithms need a fixed kernel-loops count */ const u32 kernel_loops_fixed = hashconfig_get_kernel_loops (hashcat_ctx); if (kernel_loops_fixed != 0) { device_param->kernel_loops_min = kernel_loops_fixed; device_param->kernel_loops_max = kernel_loops_fixed; } device_param->kernel_loops_min_sav = device_param->kernel_loops_min; device_param->kernel_loops_max_sav = device_param->kernel_loops_max; u32 kernel_accel_min = device_param->kernel_accel_min; u32 kernel_accel_max = device_param->kernel_accel_max; // find out if we would request too much memory on memory blocks which are based on kernel_accel size_t size_pws = 4; size_t size_pws_amp = 4; size_t size_tmps = 4; size_t size_hooks = 4; while (kernel_accel_max >= kernel_accel_min) { const u32 kernel_power_max = device_param->hardware_power * kernel_accel_max; // size_pws size_pws = (size_t) kernel_power_max * sizeof (pw_t); size_pws_amp = (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) ? 1 : size_pws; // size_tmps size_tmps = (size_t) kernel_power_max * hashconfig->tmp_size; // size_hooks size_hooks = (size_t) kernel_power_max * hashconfig->hook_size; // now check if all device-memory sizes which depend on the kernel_accel_max amplifier are within its boundaries // if not, decrease amplifier and try again int memory_limit_hit = 0; if (size_pws > device_param->device_maxmem_alloc) memory_limit_hit = 1; if (size_tmps > device_param->device_maxmem_alloc) memory_limit_hit = 1; if (size_hooks > device_param->device_maxmem_alloc) memory_limit_hit = 1; const size_t size_total = bitmap_ctx->bitmap_size + bitmap_ctx->bitmap_size + bitmap_ctx->bitmap_size + bitmap_ctx->bitmap_size + bitmap_ctx->bitmap_size + bitmap_ctx->bitmap_size + bitmap_ctx->bitmap_size + bitmap_ctx->bitmap_size + size_bfs + size_combs + size_digests + size_esalts + size_hooks + size_markov_css + size_plains + size_pws + size_pws_amp + size_results + size_root_css + size_rules + size_rules_c + size_salts + size_scrypt4 + size_scrypt4 + size_scrypt4 + size_scrypt4 + size_shown + size_tm + size_tmps + size_st_digests + size_st_salts + size_st_esalts; if (size_total > device_param->device_global_mem) memory_limit_hit = 1; if (memory_limit_hit == 1) { kernel_accel_max--; continue; } break; } if (kernel_accel_max < kernel_accel_min) { event_log_error (hashcat_ctx, "* Device #%u: Not enough allocatable device memory for this attack.", device_id + 1); return -1; } device_param->kernel_accel_min = kernel_accel_min; device_param->kernel_accel_max = kernel_accel_max; /* if (kernel_accel_max < kernel_accel) { if (user_options->quiet == false) event_log_warning (hashcat_ctx, "* Device #%u: Reduced maximum kernel-accel to %u.", device_id + 1, kernel_accel_max); device_param->kernel_accel = kernel_accel_max; } */ device_param->size_bfs = size_bfs; device_param->size_combs = size_combs; device_param->size_rules = size_rules; device_param->size_rules_c = size_rules_c; device_param->size_pws = size_pws; device_param->size_pws_amp = size_pws_amp; device_param->size_tmps = size_tmps; device_param->size_hooks = size_hooks; /** * default building options */ if (chdir (folder_config->cpath_real) == -1) { event_log_error (hashcat_ctx, "%s: %s", folder_config->cpath_real, strerror (errno)); return -1; } char build_opts[1024] = { 0 }; #if defined (_WIN) snprintf (build_opts, sizeof (build_opts) - 1, "-I \"%s\"", folder_config->cpath_real); #else snprintf (build_opts, sizeof (build_opts) - 1, "-I %s", folder_config->cpath_real); #endif // include check // this test needs to be done manually because of macOS opencl runtime // if there's a problem with permission, its not reporting back and erroring out silently #define files_cnt 16 const char *files_names[files_cnt] = { "inc_cipher_aes.cl", "inc_cipher_serpent.cl", "inc_cipher_twofish.cl", "inc_common.cl", "inc_comp_multi_bs.cl", "inc_comp_multi.cl", "inc_comp_single_bs.cl", "inc_comp_single.cl", "inc_hash_constants.h", "inc_hash_functions.cl", "inc_rp_optimized.cl", "inc_rp_optimized.h", "inc_simd.cl", "inc_scalar.cl", "inc_types.cl", "inc_vendor.cl", }; for (int i = 0; i < files_cnt; i++) { if (hc_path_read (files_names[i]) == false) { event_log_error (hashcat_ctx, "%s: %s", files_names[i], strerror (errno)); return -1; } } // we don't have sm_* on vendors not NV but it doesn't matter char build_opts_new[1024] = { 0 }; #if defined (DEBUG) snprintf (build_opts_new, sizeof (build_opts_new) - 1, "%s -D VENDOR_ID=%u -D CUDA_ARCH=%u -D AMD_ROCM=%u -D VECT_SIZE=%u -D DEVICE_TYPE=%u -D DGST_R0=%u -D DGST_R1=%u -D DGST_R2=%u -D DGST_R3=%u -D DGST_ELEM=%u -D KERN_TYPE=%u -D _unroll", build_opts, device_param->platform_vendor_id, (device_param->sm_major * 100) + device_param->sm_minor, device_param->is_rocm, device_param->vector_width, (u32) device_param->device_type, hashconfig->dgst_pos0, hashconfig->dgst_pos1, hashconfig->dgst_pos2, hashconfig->dgst_pos3, hashconfig->dgst_size / 4, hashconfig->kern_type); #else snprintf (build_opts_new, sizeof (build_opts_new) - 1, "%s -D VENDOR_ID=%u -D CUDA_ARCH=%u -D AMD_ROCM=%u -D VECT_SIZE=%u -D DEVICE_TYPE=%u -D DGST_R0=%u -D DGST_R1=%u -D DGST_R2=%u -D DGST_R3=%u -D DGST_ELEM=%u -D KERN_TYPE=%u -D _unroll -w", build_opts, device_param->platform_vendor_id, (device_param->sm_major * 100) + device_param->sm_minor, device_param->is_rocm, device_param->vector_width, (u32) device_param->device_type, hashconfig->dgst_pos0, hashconfig->dgst_pos1, hashconfig->dgst_pos2, hashconfig->dgst_pos3, hashconfig->dgst_size / 4, hashconfig->kern_type); #endif if (device_param->device_type & CL_DEVICE_TYPE_CPU) { if (device_param->platform_vendor_id == VENDOR_ID_INTEL_SDK) { strncat (build_opts_new, " -cl-opt-disable", sizeof (build_opts_new) - 1); } } strncpy (build_opts, build_opts_new, sizeof (build_opts) - 1); #if defined (DEBUG) if (user_options->quiet == false) event_log_warning (hashcat_ctx, "* Device #%u: build_opts '%s'", device_id + 1, build_opts); #endif /** * device_name_chksum */ char *device_name_chksum = (char *) hcmalloc (HCBUFSIZ_TINY); char *device_name_chksum_amp_mp = (char *) hcmalloc (HCBUFSIZ_TINY); #if defined (__x86_64__) const size_t dnclen = snprintf (device_name_chksum, HCBUFSIZ_TINY - 1, "%d-%u-%u-%s-%s-%s-%d-%u-%u", 64, device_param->platform_vendor_id, device_param->vector_width, device_param->device_name, device_param->device_version, device_param->driver_version, opencl_ctx->comptime, user_options->opencl_vector_width, user_options->hash_mode); const size_t dnclen_amp_mp = snprintf (device_name_chksum_amp_mp, HCBUFSIZ_TINY - 1, "%d-%u-%s-%s-%s-%d", 64, device_param->platform_vendor_id, device_param->device_name, device_param->device_version, device_param->driver_version, opencl_ctx->comptime); #else const size_t dnclen = snprintf (device_name_chksum, HCBUFSIZ_TINY - 1, "%d-%u-%u-%s-%s-%s-%d-%u-%u", 32, device_param->platform_vendor_id, device_param->vector_width, device_param->device_name, device_param->device_version, device_param->driver_version, opencl_ctx->comptime, user_options->opencl_vector_width, user_options->hash_mode); const size_t dnclen_amp_mp = snprintf (device_name_chksum_amp_mp, HCBUFSIZ_TINY - 1, "%d-%u-%s-%s-%s-%d", 32, device_param->platform_vendor_id, device_param->device_name, device_param->device_version, device_param->driver_version, opencl_ctx->comptime); #endif u32 device_name_digest[4] = { 0 }; for (size_t i = 0; i < dnclen; i += 64) { md5_64 ((u32 *) (device_name_chksum + i), device_name_digest); } snprintf (device_name_chksum, HCBUFSIZ_TINY - 1, "%08x", device_name_digest[0]); u32 device_name_digest_amp_mp[4] = { 0 }; for (size_t i = 0; i < dnclen_amp_mp; i += 64) { md5_64 ((u32 *) (device_name_chksum_amp_mp + i), device_name_digest_amp_mp); } snprintf (device_name_chksum_amp_mp, HCBUFSIZ_TINY - 1, "%08x", device_name_digest_amp_mp[0]); /** * main kernel */ { /** * kernel source filename */ char source_file[256] = { 0 }; generate_source_kernel_filename (hashconfig->attack_exec, user_options_extra->attack_kern, hashconfig->kern_type, hashconfig->opti_type, folder_config->shared_dir, source_file); if (hc_path_read (source_file) == false) { event_log_error (hashcat_ctx, "%s: %s", source_file, strerror (errno)); return -1; } /** * kernel cached filename */ char cached_file[256] = { 0 }; generate_cached_kernel_filename (hashconfig->attack_exec, user_options_extra->attack_kern, hashconfig->kern_type, hashconfig->opti_type, folder_config->profile_dir, device_name_chksum, cached_file); bool cached = true; if (hc_path_read (cached_file) == false) { cached = false; } if (hc_path_is_empty (cached_file) == true) { cached = false; } /** * kernel compile or load */ size_t kernel_lengths_buf = 0; size_t *kernel_lengths = &kernel_lengths_buf; char *kernel_sources_buf = NULL; char **kernel_sources = &kernel_sources_buf; if (opencl_ctx->force_jit_compilation == -1) { if (cached == false) { #if defined (DEBUG) if (user_options->quiet == false) event_log_warning (hashcat_ctx, "* Device #%u: Kernel %s not found in cache! Building may take a while...", device_id + 1, filename_from_filepath (cached_file)); #endif const int rc_read_kernel = read_kernel_binary (hashcat_ctx, source_file, kernel_lengths, kernel_sources); if (rc_read_kernel == -1) return -1; CL_rc = hc_clCreateProgramWithSource (hashcat_ctx, device_param->context, 1, (const char **) kernel_sources, NULL, &device_param->program); if (CL_rc == -1) return -1; CL_rc = hc_clBuildProgram (hashcat_ctx, device_param->program, 1, &device_param->device, build_opts, NULL, NULL); //if (CL_rc == -1) return -1; size_t build_log_size = 0; hc_clGetProgramBuildInfo (hashcat_ctx, device_param->program, device_param->device, CL_PROGRAM_BUILD_LOG, 0, NULL, &build_log_size); //if (CL_rc == -1) return -1; #if defined (DEBUG) if ((build_log_size > 1) || (CL_rc == -1)) #else if (CL_rc == -1) #endif { char *build_log = (char *) hcmalloc (build_log_size + 1); int CL_rc_build = hc_clGetProgramBuildInfo (hashcat_ctx, device_param->program, device_param->device, CL_PROGRAM_BUILD_LOG, build_log_size, build_log, NULL); if (CL_rc_build == -1) return -1; puts (build_log); hcfree (build_log); } if (CL_rc == -1) { device_param->skipped = true; event_log_error (hashcat_ctx, "* Device #%u: Kernel %s build failed - proceeding without this device.", device_id + 1, source_file); continue; } size_t binary_size; CL_rc = hc_clGetProgramInfo (hashcat_ctx, device_param->program, CL_PROGRAM_BINARY_SIZES, sizeof (size_t), &binary_size, NULL); if (CL_rc == -1) return -1; char *binary = (char *) hcmalloc (binary_size); CL_rc = hc_clGetProgramInfo (hashcat_ctx, device_param->program, CL_PROGRAM_BINARIES, sizeof (char *), &binary, NULL); if (CL_rc == -1) return -1; const int rc_write = write_kernel_binary (hashcat_ctx, cached_file, binary, binary_size); if (rc_write == -1) return -1; hcfree (binary); } else { const int rc_read_kernel = read_kernel_binary (hashcat_ctx, cached_file, kernel_lengths, kernel_sources); if (rc_read_kernel == -1) return -1; CL_rc = hc_clCreateProgramWithBinary (hashcat_ctx, device_param->context, 1, &device_param->device, kernel_lengths, (const unsigned char **) kernel_sources, NULL, &device_param->program); if (CL_rc == -1) return -1; CL_rc = hc_clBuildProgram (hashcat_ctx, device_param->program, 1, &device_param->device, build_opts, NULL, NULL); if (CL_rc == -1) return -1; } } else { const int rc_read_kernel = read_kernel_binary (hashcat_ctx, source_file, kernel_lengths, kernel_sources); if (rc_read_kernel == -1) return -1; CL_rc = hc_clCreateProgramWithSource (hashcat_ctx, device_param->context, 1, (const char **) kernel_sources, NULL, &device_param->program); if (CL_rc == -1) return -1; char *build_opts_update; if (opencl_ctx->force_jit_compilation == 1500) { hc_asprintf (&build_opts_update, "%s -DDESCRYPT_SALT=%u", build_opts, hashes->salts_buf[0].salt_buf[0]); } else if ((opencl_ctx->force_jit_compilation == 8900) || (opencl_ctx->force_jit_compilation == 15700)) { hc_asprintf (&build_opts_update,"%s -DSCRYPT_N=%u -DSCRYPT_R=%u -DSCRYPT_P=%u -DSCRYPT_TMTO=%u -DSCRYPT_TMP_ELEM=%" PRIu64, build_opts, hashes->salts_buf[0].scrypt_N, hashes->salts_buf[0].scrypt_r, hashes->salts_buf[0].scrypt_p, 1u << scrypt_tmto_final, (u64) scrypt_tmp_size / 16); } else { hc_asprintf (&build_opts_update, "%s", build_opts); } CL_rc = hc_clBuildProgram (hashcat_ctx, device_param->program, 1, &device_param->device, build_opts_update, NULL, NULL); free (build_opts_update); //if (CL_rc == -1) return -1; size_t build_log_size = 0; hc_clGetProgramBuildInfo (hashcat_ctx, device_param->program, device_param->device, CL_PROGRAM_BUILD_LOG, 0, NULL, &build_log_size); //if (CL_rc == -1) return -1; #if defined (DEBUG) if ((build_log_size > 1) || (CL_rc == -1)) #else if (CL_rc == -1) #endif { char *build_log = (char *) hcmalloc (build_log_size + 1); int CL_rc_build = hc_clGetProgramBuildInfo (hashcat_ctx, device_param->program, device_param->device, CL_PROGRAM_BUILD_LOG, build_log_size, build_log, NULL); if (CL_rc_build == -1) return -1; puts (build_log); hcfree (build_log); } if (CL_rc == -1) { device_param->skipped = true; event_log_error (hashcat_ctx, "* Device #%u: Kernel %s build failed - proceeding without this device.", device_id + 1, source_file); continue; } } hcfree (kernel_sources[0]); } /** * word generator kernel */ if (user_options->attack_mode != ATTACK_MODE_STRAIGHT) { /** * kernel mp source filename */ char source_file[256] = { 0 }; generate_source_kernel_mp_filename (hashconfig->opti_type, hashconfig->opts_type, folder_config->shared_dir, source_file); if (hc_path_read (source_file) == false) { event_log_error (hashcat_ctx, "%s: %s", source_file, strerror (errno)); return -1; } /** * kernel mp cached filename */ char cached_file[256] = { 0 }; generate_cached_kernel_mp_filename (hashconfig->opti_type, hashconfig->opts_type, folder_config->profile_dir, device_name_chksum_amp_mp, cached_file); bool cached = true; if (hc_path_read (cached_file) == false) { cached = false; } if (hc_path_is_empty (cached_file) == true) { cached = false; } /** * kernel compile or load */ size_t kernel_lengths_buf = 0; size_t *kernel_lengths = &kernel_lengths_buf; char *kernel_sources_buf = NULL; char **kernel_sources = &kernel_sources_buf; if (cached == false) { #if defined (DEBUG) if (user_options->quiet == false) event_log_warning (hashcat_ctx, "* Device #%u: Kernel %s not found in cache! Building may take a while...", device_id + 1, filename_from_filepath (cached_file)); #endif const int rc_read_kernel = read_kernel_binary (hashcat_ctx, source_file, kernel_lengths, kernel_sources); if (rc_read_kernel == -1) return -1; CL_rc = hc_clCreateProgramWithSource (hashcat_ctx, device_param->context, 1, (const char **) kernel_sources, NULL, &device_param->program_mp); if (CL_rc == -1) return -1; CL_rc = hc_clBuildProgram (hashcat_ctx, device_param->program_mp, 1, &device_param->device, build_opts, NULL, NULL); //if (CL_rc == -1) return -1; size_t build_log_size = 0; hc_clGetProgramBuildInfo (hashcat_ctx, device_param->program_mp, device_param->device, CL_PROGRAM_BUILD_LOG, 0, NULL, &build_log_size); //if (CL_rc == -1) return -1; #if defined (DEBUG) if ((build_log_size > 1) || (CL_rc == -1)) #else if (CL_rc == -1) #endif { char *build_log = (char *) hcmalloc (build_log_size + 1); int CL_rc_build = hc_clGetProgramBuildInfo (hashcat_ctx, device_param->program_mp, device_param->device, CL_PROGRAM_BUILD_LOG, build_log_size, build_log, NULL); if (CL_rc_build == -1) return -1; puts (build_log); hcfree (build_log); } if (CL_rc == -1) { device_param->skipped = true; event_log_error (hashcat_ctx, "* Device #%u: Kernel %s build failed - proceeding without this device.", device_id + 1, source_file); continue; } size_t binary_size; CL_rc = hc_clGetProgramInfo (hashcat_ctx, device_param->program_mp, CL_PROGRAM_BINARY_SIZES, sizeof (size_t), &binary_size, NULL); if (CL_rc == -1) return -1; char *binary = (char *) hcmalloc (binary_size); CL_rc = hc_clGetProgramInfo (hashcat_ctx, device_param->program_mp, CL_PROGRAM_BINARIES, sizeof (char *), &binary, NULL); if (CL_rc == -1) return -1; write_kernel_binary (hashcat_ctx, cached_file, binary, binary_size); hcfree (binary); } else { const int rc_read_kernel = read_kernel_binary (hashcat_ctx, cached_file, kernel_lengths, kernel_sources); if (rc_read_kernel == -1) return -1; CL_rc = hc_clCreateProgramWithBinary (hashcat_ctx, device_param->context, 1, &device_param->device, kernel_lengths, (const unsigned char **) kernel_sources, NULL, &device_param->program_mp); if (CL_rc == -1) return -1; CL_rc = hc_clBuildProgram (hashcat_ctx, device_param->program_mp, 1, &device_param->device, build_opts, NULL, NULL); if (CL_rc == -1) return -1; } hcfree (kernel_sources[0]); } /** * amplifier kernel */ if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { } else { /** * kernel amp source filename */ char source_file[256] = { 0 }; generate_source_kernel_amp_filename (user_options_extra->attack_kern, folder_config->shared_dir, source_file); if (hc_path_read (source_file) == false) { event_log_error (hashcat_ctx, "%s: %s", source_file, strerror (errno)); return -1; } /** * kernel amp cached filename */ char cached_file[256] = { 0 }; generate_cached_kernel_amp_filename (user_options_extra->attack_kern, folder_config->profile_dir, device_name_chksum_amp_mp, cached_file); bool cached = true; if (hc_path_read (cached_file) == false) { cached = false; } if (hc_path_is_empty (cached_file) == true) { cached = false; } /** * kernel compile or load */ size_t kernel_lengths_buf = 0; size_t *kernel_lengths = &kernel_lengths_buf; char *kernel_sources_buf = NULL; char **kernel_sources = &kernel_sources_buf; if (cached == false) { #if defined (DEBUG) if (user_options->quiet == false) event_log_warning (hashcat_ctx, "* Device #%u: Kernel %s not found in cache! Building may take a while...", device_id + 1, filename_from_filepath (cached_file)); #endif const int rc_read_kernel = read_kernel_binary (hashcat_ctx, source_file, kernel_lengths, kernel_sources); if (rc_read_kernel == -1) return -1; CL_rc = hc_clCreateProgramWithSource (hashcat_ctx, device_param->context, 1, (const char **) kernel_sources, NULL, &device_param->program_amp); if (CL_rc == -1) return -1; CL_rc = hc_clBuildProgram (hashcat_ctx, device_param->program_amp, 1, &device_param->device, build_opts, NULL, NULL); //if (CL_rc == -1) return -1; size_t build_log_size = 0; hc_clGetProgramBuildInfo (hashcat_ctx, device_param->program_amp, device_param->device, CL_PROGRAM_BUILD_LOG, 0, NULL, &build_log_size); //if (CL_rc == -1) return -1; #if defined (DEBUG) if ((build_log_size > 1) || (CL_rc == -1)) #else if (CL_rc == -1) #endif { char *build_log = (char *) hcmalloc (build_log_size + 1); int CL_rc_build_info = hc_clGetProgramBuildInfo (hashcat_ctx, device_param->program_amp, device_param->device, CL_PROGRAM_BUILD_LOG, build_log_size, build_log, NULL); if (CL_rc_build_info == -1) return -1; puts (build_log); hcfree (build_log); } if (CL_rc == -1) { device_param->skipped = true; event_log_error (hashcat_ctx, "* Device #%u: Kernel %s build failed - proceeding without this device.", device_id + 1, source_file); continue; } size_t binary_size; CL_rc = hc_clGetProgramInfo (hashcat_ctx, device_param->program_amp, CL_PROGRAM_BINARY_SIZES, sizeof (size_t), &binary_size, NULL); if (CL_rc == -1) return -1; char *binary = (char *) hcmalloc (binary_size); CL_rc = hc_clGetProgramInfo (hashcat_ctx, device_param->program_amp, CL_PROGRAM_BINARIES, sizeof (char *), &binary, NULL); if (CL_rc == -1) return -1; write_kernel_binary (hashcat_ctx, cached_file, binary, binary_size); hcfree (binary); } else { const int rc_read_kernel = read_kernel_binary (hashcat_ctx, cached_file, kernel_lengths, kernel_sources); if (rc_read_kernel == -1) return -1; CL_rc = hc_clCreateProgramWithBinary (hashcat_ctx, device_param->context, 1, &device_param->device, kernel_lengths, (const unsigned char **) kernel_sources, NULL, &device_param->program_amp); if (CL_rc == -1) return -1; CL_rc = hc_clBuildProgram (hashcat_ctx, device_param->program_amp, 1, &device_param->device, build_opts, NULL, NULL); if (CL_rc == -1) return -1; } hcfree (kernel_sources[0]); } hcfree (device_name_chksum); hcfree (device_name_chksum_amp_mp); // return back to the folder we came from initially (workaround) if (chdir (folder_config->cwd) == -1) { event_log_error (hashcat_ctx, "%s: %s", folder_config->cwd, strerror (errno)); return -1; } // some algorithm collide too fast, make that impossible if (user_options->benchmark == true) { ((u32 *) hashes->digests_buf)[0] = -1u; ((u32 *) hashes->digests_buf)[1] = -1u; ((u32 *) hashes->digests_buf)[2] = -1u; ((u32 *) hashes->digests_buf)[3] = -1u; } /** * global buffers */ CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_pws, NULL, &device_param->d_pws_buf); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_pws_amp, NULL, &device_param->d_pws_amp_buf); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_WRITE, size_tmps, NULL, &device_param->d_tmps); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_WRITE, size_hooks, NULL, &device_param->d_hooks); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, bitmap_ctx->bitmap_size, NULL, &device_param->d_bitmap_s1_a); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, bitmap_ctx->bitmap_size, NULL, &device_param->d_bitmap_s1_b); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, bitmap_ctx->bitmap_size, NULL, &device_param->d_bitmap_s1_c); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, bitmap_ctx->bitmap_size, NULL, &device_param->d_bitmap_s1_d); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, bitmap_ctx->bitmap_size, NULL, &device_param->d_bitmap_s2_a); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, bitmap_ctx->bitmap_size, NULL, &device_param->d_bitmap_s2_b); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, bitmap_ctx->bitmap_size, NULL, &device_param->d_bitmap_s2_c); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, bitmap_ctx->bitmap_size, NULL, &device_param->d_bitmap_s2_d); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_WRITE, size_plains, NULL, &device_param->d_plain_bufs); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_digests, NULL, &device_param->d_digests_buf); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_WRITE, size_shown, NULL, &device_param->d_digests_shown); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_salts, NULL, &device_param->d_salt_bufs); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_WRITE, size_results, NULL, &device_param->d_result); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_WRITE, size_scrypt4, NULL, &device_param->d_scryptV0_buf); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_WRITE, size_scrypt4, NULL, &device_param->d_scryptV1_buf); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_WRITE, size_scrypt4, NULL, &device_param->d_scryptV2_buf); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_WRITE, size_scrypt4, NULL, &device_param->d_scryptV3_buf); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_st_digests, NULL, &device_param->d_st_digests_buf); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_st_salts, NULL, &device_param->d_st_salts_buf); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_bitmap_s1_a, CL_TRUE, 0, bitmap_ctx->bitmap_size, bitmap_ctx->bitmap_s1_a, 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_bitmap_s1_b, CL_TRUE, 0, bitmap_ctx->bitmap_size, bitmap_ctx->bitmap_s1_b, 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_bitmap_s1_c, CL_TRUE, 0, bitmap_ctx->bitmap_size, bitmap_ctx->bitmap_s1_c, 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_bitmap_s1_d, CL_TRUE, 0, bitmap_ctx->bitmap_size, bitmap_ctx->bitmap_s1_d, 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_bitmap_s2_a, CL_TRUE, 0, bitmap_ctx->bitmap_size, bitmap_ctx->bitmap_s2_a, 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_bitmap_s2_b, CL_TRUE, 0, bitmap_ctx->bitmap_size, bitmap_ctx->bitmap_s2_b, 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_bitmap_s2_c, CL_TRUE, 0, bitmap_ctx->bitmap_size, bitmap_ctx->bitmap_s2_c, 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_bitmap_s2_d, CL_TRUE, 0, bitmap_ctx->bitmap_size, bitmap_ctx->bitmap_s2_d, 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_digests_buf, CL_TRUE, 0, size_digests, hashes->digests_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_salt_bufs, CL_TRUE, 0, size_salts, hashes->salts_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; /** * special buffers */ if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) { CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_rules, NULL, &device_param->d_rules); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_rules_c, NULL, &device_param->d_rules_c); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_rules, CL_TRUE, 0, size_rules, straight_ctx->kernel_rules_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_combs, NULL, &device_param->d_combs); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_combs, NULL, &device_param->d_combs_c); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_root_css, NULL, &device_param->d_root_css_buf); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_markov_css, NULL, &device_param->d_markov_css_buf); if (CL_rc == -1) return -1; } else if (user_options_extra->attack_kern == ATTACK_KERN_BF) { CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_bfs, NULL, &device_param->d_bfs); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_bfs, NULL, &device_param->d_bfs_c); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_tm, NULL, &device_param->d_tm_c); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_root_css, NULL, &device_param->d_root_css_buf); if (CL_rc == -1) return -1; CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_markov_css, NULL, &device_param->d_markov_css_buf); if (CL_rc == -1) return -1; } if (size_esalts) { CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_esalts, NULL, &device_param->d_esalt_bufs); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_esalt_bufs, CL_TRUE, 0, size_esalts, hashes->esalts_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; } if (hashconfig->st_hash != NULL) { CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_st_digests_buf, CL_TRUE, 0, size_st_digests, hashes->st_digests_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_st_salts_buf, CL_TRUE, 0, size_st_salts, hashes->st_salts_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; if (size_esalts) { CL_rc = hc_clCreateBuffer (hashcat_ctx, device_param->context, CL_MEM_READ_ONLY, size_st_esalts, NULL, &device_param->d_st_esalts_buf); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_st_esalts_buf, CL_TRUE, 0, size_st_esalts, hashes->st_esalts_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; } } /** * main host data */ pw_t *pws_buf = (pw_t *) hcmalloc (size_pws); device_param->pws_buf = pws_buf; pw_t *combs_buf = (pw_t *) hccalloc (KERNEL_COMBS, sizeof (pw_t)); device_param->combs_buf = combs_buf; void *hooks_buf = hcmalloc (size_hooks); device_param->hooks_buf = hooks_buf; /** * kernel args */ device_param->kernel_params_buf32[24] = bitmap_ctx->bitmap_mask; device_param->kernel_params_buf32[25] = bitmap_ctx->bitmap_shift1; device_param->kernel_params_buf32[26] = bitmap_ctx->bitmap_shift2; device_param->kernel_params_buf32[27] = 0; // salt_pos device_param->kernel_params_buf32[28] = 0; // loop_pos device_param->kernel_params_buf32[29] = 0; // loop_cnt device_param->kernel_params_buf32[30] = 0; // kernel_rules_cnt device_param->kernel_params_buf32[31] = 0; // digests_cnt device_param->kernel_params_buf32[32] = 0; // digests_offset device_param->kernel_params_buf32[33] = 0; // combs_mode device_param->kernel_params_buf64[34] = 0; // gid_max device_param->kernel_params[ 0] = (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) ? &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_scryptV0_buf; device_param->kernel_params[21] = &device_param->d_scryptV1_buf; device_param->kernel_params[22] = &device_param->d_scryptV2_buf; device_param->kernel_params[23] = &device_param->d_scryptV3_buf; 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[32] = &device_param->kernel_params_buf32[32]; device_param->kernel_params[33] = &device_param->kernel_params_buf32[33]; device_param->kernel_params[34] = &device_param->kernel_params_buf64[34]; 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_buf64[8] = 0; if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { device_param->kernel_params_mp[0] = &device_param->d_combs; } else { if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { device_param->kernel_params_mp[0] = &device_param->d_combs; } else { device_param->kernel_params_mp[0] = &device_param->d_pws_buf; } } 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[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_buf64[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_buf64[9] = 0; 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[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_buf64[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_buf64[8] = 0; 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[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_buf64[8]; device_param->kernel_params_amp_buf32[5] = 0; // combs_mode device_param->kernel_params_amp_buf64[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_buf64[6]; device_param->kernel_params_tm[0] = &device_param->d_bfs_c; device_param->kernel_params_tm[1] = &device_param->d_tm_c; device_param->kernel_params_memset_buf32[1] = 0; // value device_param->kernel_params_memset_buf64[2] = 0; // gid_max device_param->kernel_params_memset[0] = NULL; device_param->kernel_params_memset[1] = &device_param->kernel_params_memset_buf32[1]; device_param->kernel_params_memset[2] = &device_param->kernel_params_memset_buf64[2]; /** * kernel name */ char kernel_name[64] = { 0 }; if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { if (hashconfig->opti_type & OPTI_TYPE_SINGLE_HASH) { if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { // kernel1 snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05u_s%02d", hashconfig->kern_type, 4); CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program, kernel_name, &device_param->kernel1); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel1, &device_param->kernel_threads_by_wgs_kernel1); if (CL_rc == -1) return -1; // kernel2 snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05u_s%02d", hashconfig->kern_type, 8); CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program, kernel_name, &device_param->kernel2); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel2, &device_param->kernel_threads_by_wgs_kernel2); if (CL_rc == -1) return -1; // kernel3 snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05u_s%02d", hashconfig->kern_type, 16); CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program, kernel_name, &device_param->kernel3); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel3, &device_param->kernel_threads_by_wgs_kernel3); if (CL_rc == -1) return -1; } else { snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05u_sxx", hashconfig->kern_type); CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program, kernel_name, &device_param->kernel4); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel4, &device_param->kernel_threads_by_wgs_kernel4); if (CL_rc == -1) return -1; } } else { if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { // kernel1 snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05u_m%02d", hashconfig->kern_type, 4); CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program, kernel_name, &device_param->kernel1); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel1, &device_param->kernel_threads_by_wgs_kernel1); if (CL_rc == -1) return -1; // kernel2 snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05u_m%02d", hashconfig->kern_type, 8); CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program, kernel_name, &device_param->kernel2); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel2, &device_param->kernel_threads_by_wgs_kernel2); if (CL_rc == -1) return -1; // kernel3 snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05u_m%02d", hashconfig->kern_type, 16); CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program, kernel_name, &device_param->kernel3); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel3, &device_param->kernel_threads_by_wgs_kernel3); if (CL_rc == -1) return -1; } else { snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05u_mxx", hashconfig->kern_type); CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program, kernel_name, &device_param->kernel4); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel4, &device_param->kernel_threads_by_wgs_kernel4); if (CL_rc == -1) return -1; } } if (user_options->attack_mode == ATTACK_MODE_BF) { if (hashconfig->opts_type & OPTS_TYPE_PT_BITSLICE) { snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05u_tm", hashconfig->kern_type); CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program, kernel_name, &device_param->kernel_tm); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel_tm, &device_param->kernel_threads_by_wgs_kernel_tm); if (CL_rc == -1) return -1; } } } else { // kernel1 snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05u_init", hashconfig->kern_type); CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program, kernel_name, &device_param->kernel1); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel1, &device_param->kernel_threads_by_wgs_kernel1); if (CL_rc == -1) return -1; // kernel2 snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05u_loop", hashconfig->kern_type); CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program, kernel_name, &device_param->kernel2); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel2, &device_param->kernel_threads_by_wgs_kernel2); if (CL_rc == -1) return -1; // kernel3 snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05u_comp", hashconfig->kern_type); CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program, kernel_name, &device_param->kernel3); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel3, &device_param->kernel_threads_by_wgs_kernel3); if (CL_rc == -1) return -1; // kernel12 if (hashconfig->opts_type & OPTS_TYPE_HOOK12) { snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05u_hook12", hashconfig->kern_type); CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program, kernel_name, &device_param->kernel12); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel12, &device_param->kernel_threads_by_wgs_kernel12); if (CL_rc == -1) return -1; } // kernel23 if (hashconfig->opts_type & OPTS_TYPE_HOOK23) { snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05u_hook23", hashconfig->kern_type); CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program, kernel_name, &device_param->kernel23); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel23, &device_param->kernel_threads_by_wgs_kernel23); if (CL_rc == -1) return -1; } // init2 if (hashconfig->opts_type & OPTS_TYPE_INIT2) { snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05u_init2", hashconfig->kern_type); CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program, kernel_name, &device_param->kernel_init2); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel_init2, &device_param->kernel_threads_by_wgs_kernel_init2); if (CL_rc == -1) return -1; } // loop2 if (hashconfig->opts_type & OPTS_TYPE_LOOP2) { snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05u_loop2", hashconfig->kern_type); CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program, kernel_name, &device_param->kernel_loop2); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel_loop2, &device_param->kernel_threads_by_wgs_kernel_loop2); if (CL_rc == -1) return -1; } } // GPU memset CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program, "gpu_memset", &device_param->kernel_memset); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel_memset, &device_param->kernel_threads_by_wgs_kernel_memset); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_memset, 0, sizeof (cl_mem), device_param->kernel_params_memset[0]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_memset, 1, sizeof (cl_uint), device_param->kernel_params_memset[1]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_memset, 2, sizeof (cl_ulong), device_param->kernel_params_memset[2]); if (CL_rc == -1) return -1; // MP start if (user_options->attack_mode == ATTACK_MODE_BF) { // mp_l CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program_mp, "l_markov", &device_param->kernel_mp_l); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel_mp_l, &device_param->kernel_threads_by_wgs_kernel_mp_l); if (CL_rc == -1) return -1; // mp_r CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program_mp, "r_markov", &device_param->kernel_mp_r); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel_mp_r, &device_param->kernel_threads_by_wgs_kernel_mp_r); if (CL_rc == -1) return -1; if (hashconfig->opts_type & OPTS_TYPE_PT_BITSLICE) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_tm, 0, sizeof (cl_mem), device_param->kernel_params_tm[0]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_tm, 1, sizeof (cl_mem), device_param->kernel_params_tm[1]); if (CL_rc == -1) return -1; } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program_mp, "C_markov", &device_param->kernel_mp); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel_mp, &device_param->kernel_threads_by_wgs_kernel_mp); if (CL_rc == -1) return -1; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program_mp, "C_markov", &device_param->kernel_mp); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel_mp, &device_param->kernel_threads_by_wgs_kernel_mp); if (CL_rc == -1) return -1; } if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { // nothing to do } else { CL_rc = hc_clCreateKernel (hashcat_ctx, device_param->program_amp, "amp", &device_param->kernel_amp); if (CL_rc == -1) return -1; CL_rc = get_kernel_threads (hashcat_ctx, device_param, device_param->kernel_amp, &device_param->kernel_threads_by_wgs_kernel_amp); if (CL_rc == -1) return -1; } if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { // nothing to do } else { for (u32 i = 0; i < 5; i++) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_amp, i, sizeof (cl_mem), device_param->kernel_params_amp[i]); if (CL_rc == -1) return -1; } for (u32 i = 5; i < 6; i++) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_amp, i, sizeof (cl_uint), device_param->kernel_params_amp[i]); if (CL_rc == -1) return -1; } for (u32 i = 7; i < 7; i++) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_amp, i, sizeof (cl_ulong), device_param->kernel_params_amp[i]); if (CL_rc == -1) return -1; } } // zero some data buffers CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_pws_buf, device_param->size_pws); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_pws_amp_buf, device_param->size_pws_amp); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_tmps, device_param->size_tmps); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_hooks, device_param->size_hooks); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_plain_bufs, device_param->size_plains); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_digests_shown, device_param->size_shown); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_result, device_param->size_results); if (CL_rc == -1) return -1; /** * special buffers */ if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) { CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_rules_c, size_rules_c); if (CL_rc == -1) return -1; } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_combs, size_combs); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_combs_c, size_combs); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_root_css_buf, size_root_css); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_markov_css_buf, size_markov_css); if (CL_rc == -1) return -1; } else if (user_options_extra->attack_kern == ATTACK_KERN_BF) { CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_bfs, size_bfs); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_bfs_c, size_bfs); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_tm_c, size_tm); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_root_css_buf, size_root_css); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_markov_css_buf, size_markov_css); if (CL_rc == -1) return -1; } if ((user_options->attack_mode == ATTACK_MODE_HYBRID1) || (user_options->attack_mode == ATTACK_MODE_HYBRID2)) { /** * prepare mp */ if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { 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 (hashconfig->opts_type & OPTS_TYPE_PT_ADD01) device_param->kernel_params_mp_buf32[5] = full01; if (hashconfig->opts_type & OPTS_TYPE_PT_ADD80) device_param->kernel_params_mp_buf32[5] = full80; if (hashconfig->opts_type & OPTS_TYPE_PT_ADDBITS14) device_param->kernel_params_mp_buf32[6] = 1; if (hashconfig->opts_type & OPTS_TYPE_PT_ADDBITS15) device_param->kernel_params_mp_buf32[7] = 1; } else if (user_options->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; } for (u32 i = 0; i < 3; i++) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_mp, i, sizeof (cl_mem), device_param->kernel_params_mp[i]); if (CL_rc == -1) return -1; } } else if (user_options->attack_mode == ATTACK_MODE_BF) { /** * prepare mp_r and mp_l */ 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 (hashconfig->opts_type & OPTS_TYPE_PT_ADD01) device_param->kernel_params_mp_l_buf32[6] = full01; if (hashconfig->opts_type & OPTS_TYPE_PT_ADD80) device_param->kernel_params_mp_l_buf32[6] = full80; if (hashconfig->opts_type & OPTS_TYPE_PT_ADDBITS14) device_param->kernel_params_mp_l_buf32[7] = 1; if (hashconfig->opts_type & OPTS_TYPE_PT_ADDBITS15) device_param->kernel_params_mp_l_buf32[8] = 1; for (u32 i = 0; i < 3; i++) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_mp_l, i, sizeof (cl_mem), device_param->kernel_params_mp_l[i]); if (CL_rc == -1) return -1; } for (u32 i = 0; i < 3; i++) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_mp_r, i, sizeof (cl_mem), device_param->kernel_params_mp_r[i]); if (CL_rc == -1) return -1; } } hardware_power_all += device_param->hardware_power; } // Prevent exit from benchmark mode if all devices are skipped due to unstable hash-modes (macOS) bool has_skipped_temp = false; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped_temp == true) has_skipped_temp = true; } if ((hardware_power_all == 0) && (has_skipped_temp == false)) return -1; opencl_ctx->hardware_power_all = hardware_power_all; return 0; } void opencl_session_destroy (hashcat_ctx_t *hashcat_ctx) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (opencl_ctx->enabled == false) return; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped_temp == true) { device_param->skipped_temp = false; device_param->skipped = false; continue; } if (device_param->skipped == true) continue; hcfree (device_param->pws_buf); hcfree (device_param->combs_buf); hcfree (device_param->hooks_buf); if (device_param->d_pws_buf) hc_clReleaseMemObject (hashcat_ctx, device_param->d_pws_buf); if (device_param->d_pws_amp_buf) hc_clReleaseMemObject (hashcat_ctx, device_param->d_pws_amp_buf); if (device_param->d_rules) hc_clReleaseMemObject (hashcat_ctx, device_param->d_rules); if (device_param->d_rules_c) hc_clReleaseMemObject (hashcat_ctx, device_param->d_rules_c); if (device_param->d_combs) hc_clReleaseMemObject (hashcat_ctx, device_param->d_combs); if (device_param->d_combs_c) hc_clReleaseMemObject (hashcat_ctx, device_param->d_combs_c); if (device_param->d_bfs) hc_clReleaseMemObject (hashcat_ctx, device_param->d_bfs); if (device_param->d_bfs_c) hc_clReleaseMemObject (hashcat_ctx, device_param->d_bfs_c); if (device_param->d_bitmap_s1_a) hc_clReleaseMemObject (hashcat_ctx, device_param->d_bitmap_s1_a); if (device_param->d_bitmap_s1_b) hc_clReleaseMemObject (hashcat_ctx, device_param->d_bitmap_s1_b); if (device_param->d_bitmap_s1_c) hc_clReleaseMemObject (hashcat_ctx, device_param->d_bitmap_s1_c); if (device_param->d_bitmap_s1_d) hc_clReleaseMemObject (hashcat_ctx, device_param->d_bitmap_s1_d); if (device_param->d_bitmap_s2_a) hc_clReleaseMemObject (hashcat_ctx, device_param->d_bitmap_s2_a); if (device_param->d_bitmap_s2_b) hc_clReleaseMemObject (hashcat_ctx, device_param->d_bitmap_s2_b); if (device_param->d_bitmap_s2_c) hc_clReleaseMemObject (hashcat_ctx, device_param->d_bitmap_s2_c); if (device_param->d_bitmap_s2_d) hc_clReleaseMemObject (hashcat_ctx, device_param->d_bitmap_s2_d); if (device_param->d_plain_bufs) hc_clReleaseMemObject (hashcat_ctx, device_param->d_plain_bufs); if (device_param->d_digests_buf) hc_clReleaseMemObject (hashcat_ctx, device_param->d_digests_buf); if (device_param->d_digests_shown) hc_clReleaseMemObject (hashcat_ctx, device_param->d_digests_shown); if (device_param->d_salt_bufs) hc_clReleaseMemObject (hashcat_ctx, device_param->d_salt_bufs); if (device_param->d_esalt_bufs) hc_clReleaseMemObject (hashcat_ctx, device_param->d_esalt_bufs); if (device_param->d_tmps) hc_clReleaseMemObject (hashcat_ctx, device_param->d_tmps); if (device_param->d_hooks) hc_clReleaseMemObject (hashcat_ctx, device_param->d_hooks); if (device_param->d_result) hc_clReleaseMemObject (hashcat_ctx, device_param->d_result); if (device_param->d_scryptV0_buf) hc_clReleaseMemObject (hashcat_ctx, device_param->d_scryptV0_buf); if (device_param->d_scryptV1_buf) hc_clReleaseMemObject (hashcat_ctx, device_param->d_scryptV1_buf); if (device_param->d_scryptV2_buf) hc_clReleaseMemObject (hashcat_ctx, device_param->d_scryptV2_buf); if (device_param->d_scryptV3_buf) hc_clReleaseMemObject (hashcat_ctx, device_param->d_scryptV3_buf); if (device_param->d_root_css_buf) hc_clReleaseMemObject (hashcat_ctx, device_param->d_root_css_buf); if (device_param->d_markov_css_buf) hc_clReleaseMemObject (hashcat_ctx, device_param->d_markov_css_buf); if (device_param->d_tm_c) hc_clReleaseMemObject (hashcat_ctx, device_param->d_tm_c); if (device_param->d_st_digests_buf) hc_clReleaseMemObject (hashcat_ctx, device_param->d_st_digests_buf); if (device_param->d_st_salts_buf) hc_clReleaseMemObject (hashcat_ctx, device_param->d_st_salts_buf); if (device_param->d_st_esalts_buf) hc_clReleaseMemObject (hashcat_ctx, device_param->d_st_esalts_buf); if (device_param->kernel1) hc_clReleaseKernel (hashcat_ctx, device_param->kernel1); if (device_param->kernel12) hc_clReleaseKernel (hashcat_ctx, device_param->kernel12); if (device_param->kernel2) hc_clReleaseKernel (hashcat_ctx, device_param->kernel2); if (device_param->kernel23) hc_clReleaseKernel (hashcat_ctx, device_param->kernel23); if (device_param->kernel3) hc_clReleaseKernel (hashcat_ctx, device_param->kernel3); if (device_param->kernel4) hc_clReleaseKernel (hashcat_ctx, device_param->kernel4); if (device_param->kernel_init2) hc_clReleaseKernel (hashcat_ctx, device_param->kernel_init2); if (device_param->kernel_loop2) hc_clReleaseKernel (hashcat_ctx, device_param->kernel_loop2); if (device_param->kernel_mp) hc_clReleaseKernel (hashcat_ctx, device_param->kernel_mp); if (device_param->kernel_mp_l) hc_clReleaseKernel (hashcat_ctx, device_param->kernel_mp_l); if (device_param->kernel_mp_r) hc_clReleaseKernel (hashcat_ctx, device_param->kernel_mp_r); if (device_param->kernel_tm) hc_clReleaseKernel (hashcat_ctx, device_param->kernel_tm); if (device_param->kernel_amp) hc_clReleaseKernel (hashcat_ctx, device_param->kernel_amp); if (device_param->kernel_memset) hc_clReleaseKernel (hashcat_ctx, device_param->kernel_memset); if (device_param->program) hc_clReleaseProgram (hashcat_ctx, device_param->program); if (device_param->program_mp) hc_clReleaseProgram (hashcat_ctx, device_param->program_mp); if (device_param->program_amp) hc_clReleaseProgram (hashcat_ctx, device_param->program_amp); if (device_param->command_queue) hc_clReleaseCommandQueue (hashcat_ctx, device_param->command_queue); if (device_param->context) hc_clReleaseContext (hashcat_ctx, device_param->context); device_param->pws_buf = NULL; device_param->combs_buf = NULL; device_param->hooks_buf = NULL; device_param->d_pws_buf = NULL; device_param->d_pws_amp_buf = NULL; device_param->d_rules = NULL; device_param->d_rules_c = NULL; device_param->d_combs = NULL; device_param->d_combs_c = NULL; device_param->d_bfs = NULL; device_param->d_bfs_c = NULL; device_param->d_bitmap_s1_a = NULL; device_param->d_bitmap_s1_b = NULL; device_param->d_bitmap_s1_c = NULL; device_param->d_bitmap_s1_d = NULL; device_param->d_bitmap_s2_a = NULL; device_param->d_bitmap_s2_b = NULL; device_param->d_bitmap_s2_c = NULL; device_param->d_bitmap_s2_d = NULL; device_param->d_plain_bufs = NULL; device_param->d_digests_buf = NULL; device_param->d_digests_shown = NULL; device_param->d_salt_bufs = NULL; device_param->d_esalt_bufs = NULL; device_param->d_tmps = NULL; device_param->d_hooks = NULL; device_param->d_result = NULL; device_param->d_scryptV0_buf = NULL; device_param->d_scryptV1_buf = NULL; device_param->d_scryptV2_buf = NULL; device_param->d_scryptV3_buf = NULL; device_param->d_root_css_buf = NULL; device_param->d_markov_css_buf = NULL; device_param->d_tm_c = NULL; device_param->d_st_digests_buf = NULL; device_param->d_st_salts_buf = NULL; device_param->d_st_esalts_buf = NULL; device_param->kernel1 = NULL; device_param->kernel12 = NULL; device_param->kernel2 = NULL; device_param->kernel23 = NULL; device_param->kernel3 = NULL; device_param->kernel4 = NULL; device_param->kernel_init2 = NULL; device_param->kernel_loop2 = NULL; device_param->kernel_mp = NULL; device_param->kernel_mp_l = NULL; device_param->kernel_mp_r = NULL; device_param->kernel_tm = NULL; device_param->kernel_amp = NULL; device_param->kernel_memset = NULL; device_param->program = NULL; device_param->program_mp = NULL; device_param->program_amp = NULL; device_param->command_queue = NULL; device_param->context = NULL; } } void opencl_session_reset (hashcat_ctx_t *hashcat_ctx) { opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (opencl_ctx->enabled == false) return; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; device_param->speed_pos = 0; memset (device_param->speed_cnt, 0, SPEED_CACHE * sizeof (u64)); memset (device_param->speed_msec, 0, SPEED_CACHE * sizeof (double)); device_param->exec_pos = 0; memset (device_param->exec_msec, 0, EXEC_CACHE * sizeof (double)); device_param->outerloop_pos = 0; device_param->outerloop_left = 0; device_param->innerloop_pos = 0; device_param->innerloop_left = 0; // some more resets: if (device_param->pws_buf) memset (device_param->pws_buf, 0, device_param->size_pws); device_param->pws_cnt = 0; device_param->words_off = 0; device_param->words_done = 0; } opencl_ctx->kernel_power_all = 0; opencl_ctx->kernel_power_final = 0; } int opencl_session_update_combinator (hashcat_ctx_t *hashcat_ctx) { combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (opencl_ctx->enabled == false) return 0; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; // kernel_params device_param->kernel_params_buf32[33] = combinator_ctx->combs_mode; /* int CL_rc; CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel1, 33, sizeof (cl_uint), device_param->kernel_params[33]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel2, 33, sizeof (cl_uint), device_param->kernel_params[33]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel3, 33, sizeof (cl_uint), device_param->kernel_params[33]); if (CL_rc == -1) return -1; CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel4, 33, sizeof (cl_uint), device_param->kernel_params[33]); if (CL_rc == -1) return -1; if (hashconfig->opts_type & OPTS_TYPE_HOOK12) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel12, 33, sizeof (cl_uint), device_param->kernel_params[33]); if (CL_rc == -1) return -1; } if (hashconfig->opts_type & OPTS_TYPE_HOOK23) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel23, 33, sizeof (cl_uint), device_param->kernel_params[33]); if (CL_rc == -1) return -1; } if (hashconfig->opts_type & OPTS_TYPE_INIT2) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_init2, 33, sizeof (cl_uint), device_param->kernel_params[33]); if (CL_rc == -1) return -1; } if (hashconfig->opts_type & OPTS_TYPE_LOOP2) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_loop2, 33, sizeof (cl_uint), device_param->kernel_params[33]); if (CL_rc == -1) return -1; } */ // kernel_params_amp device_param->kernel_params_amp_buf32[5] = combinator_ctx->combs_mode; if (hashconfig->attack_exec == ATTACK_EXEC_OUTSIDE_KERNEL) { int CL_rc; CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_amp, 5, sizeof (cl_uint), device_param->kernel_params_amp[5]); if (CL_rc == -1) return -1; } } return 0; } int opencl_session_update_mp (hashcat_ctx_t *hashcat_ctx) { mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (opencl_ctx->enabled == false) return 0; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; device_param->kernel_params_mp_buf64[3] = 0; device_param->kernel_params_mp_buf32[4] = mask_ctx->css_cnt; int CL_rc = CL_SUCCESS; for (u32 i = 3; i < 4; i++) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_mp, i, sizeof (cl_ulong), device_param->kernel_params_mp[i]); if (CL_rc == -1) return -1; } for (u32 i = 4; i < 8; i++) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_mp, i, sizeof (cl_uint), device_param->kernel_params_mp[i]); if (CL_rc == -1) return -1; } CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_root_css_buf, CL_TRUE, 0, device_param->size_root_css, mask_ctx->root_css_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_markov_css_buf, CL_TRUE, 0, device_param->size_markov_css, mask_ctx->markov_css_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; } return 0; } int opencl_session_update_mp_rl (hashcat_ctx_t *hashcat_ctx, const u32 css_cnt_l, const u32 css_cnt_r) { mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (opencl_ctx->enabled == false) return 0; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) continue; 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_r_buf64[3] = 0; device_param->kernel_params_mp_r_buf32[4] = css_cnt_r; int CL_rc = CL_SUCCESS; for (u32 i = 3; i < 4; i++) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_mp_l, i, sizeof (cl_ulong), device_param->kernel_params_mp_l[i]); if (CL_rc == -1) return -1; } for (u32 i = 4; i < 8; i++) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_mp_l, i, sizeof (cl_uint), device_param->kernel_params_mp_l[i]); if (CL_rc == -1) return -1; } for (u32 i = 9; i < 9; i++) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_mp_l, i, sizeof (cl_ulong), device_param->kernel_params_mp_l[i]); if (CL_rc == -1) return -1; } for (u32 i = 3; i < 4; i++) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_mp_r, i, sizeof (cl_ulong), device_param->kernel_params_mp_r[i]); if (CL_rc == -1) return -1; } for (u32 i = 4; i < 7; i++) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_mp_r, i, sizeof (cl_uint), device_param->kernel_params_mp_r[i]); if (CL_rc == -1) return -1; } for (u32 i = 8; i < 8; i++) { CL_rc = hc_clSetKernelArg (hashcat_ctx, device_param->kernel_mp_r, i, sizeof (cl_ulong), device_param->kernel_params_mp_r[i]); if (CL_rc == -1) return -1; } CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_root_css_buf, CL_TRUE, 0, device_param->size_root_css, mask_ctx->root_css_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_markov_css_buf, CL_TRUE, 0, device_param->size_markov_css, mask_ctx->markov_css_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; } return 0; } hashcat-4.0.1/src/outfile.c000066400000000000000000000322751320027462700155450ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "convert.h" #include "interface.h" #include "hashes.h" #include "mpsp.h" #include "rp.h" #include "rp_kernel_on_cpu.h" #include "rp_kernel_on_cpu_optimized.h" #include "opencl.h" #include "shared.h" #include "outfile.h" #include "locking.h" int build_plain (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, plain_t *plain, u32 *plain_buf, int *out_len) { const combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const hashes_t *hashes = hashcat_ctx->hashes; const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; const user_options_t *user_options = hashcat_ctx->user_options; const u32 gidvid = plain->gidvid; const u32 il_pos = plain->il_pos; int plain_len = 0; u8 *plain_ptr = (u8 *) plain_buf; if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { pw_t pw; const int rc = gidd_to_pw_t (hashcat_ctx, device_param, gidvid, &pw); if (rc == -1) return -1; const u32 off = device_param->innerloop_pos + il_pos; if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { for (int i = 0; i < 8; i++) { plain_buf[i] = pw.i[i]; } plain_len = apply_rules_optimized (straight_ctx->kernel_rules_buf[off].cmds, &plain_buf[0], &plain_buf[4], pw.pw_len); } else { for (int i = 0; i < 64; i++) { plain_buf[i] = pw.i[i]; } plain_len = apply_rules (straight_ctx->kernel_rules_buf[off].cmds, plain_buf, pw.pw_len); } if (plain_len > (int) hashconfig->pw_max) plain_len = (int) hashconfig->pw_max; } else if (user_options->attack_mode == ATTACK_MODE_COMBI) { pw_t pw; const int rc = gidd_to_pw_t (hashcat_ctx, device_param, gidvid, &pw); if (rc == -1) return -1; for (int i = 0; i < 64; i++) { plain_buf[i] = pw.i[i]; } plain_len = (int) pw.pw_len; char *comb_buf = (char *) device_param->combs_buf[il_pos].i; u32 comb_len = device_param->combs_buf[il_pos].pw_len; if (combinator_ctx->combs_mode == COMBINATOR_MODE_BASE_LEFT) { memcpy (plain_ptr + plain_len, comb_buf, (size_t) comb_len); } else { memmove (plain_ptr + comb_len, plain_ptr, (size_t) plain_len); memcpy (plain_ptr, comb_buf, comb_len); } plain_len += comb_len; if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { int pw_max_combi; #define PW_DICTMAX 32 if (hashconfig->pw_max < PW_DICTMAX) { pw_max_combi = hashconfig->pw_max; } else { pw_max_combi = PW_MAX_OLD; } plain_len = MIN ((int) plain_len, (int) pw_max_combi); } else { plain_len = MIN ((int) plain_len, (int) hashconfig->pw_max); } } else if (user_options->attack_mode == ATTACK_MODE_BF) { u64 l_off = device_param->kernel_params_mp_l_buf64[3] + gidvid; u64 r_off = device_param->kernel_params_mp_r_buf64[3] + il_pos; u32 l_start = device_param->kernel_params_mp_l_buf32[5]; u32 r_start = device_param->kernel_params_mp_r_buf32[5]; u32 l_stop = device_param->kernel_params_mp_l_buf32[4]; u32 r_stop = device_param->kernel_params_mp_r_buf32[4]; sp_exec (l_off, (char *) plain_ptr + l_start, mask_ctx->root_css_buf, mask_ctx->markov_css_buf, l_start, l_start + l_stop); sp_exec (r_off, (char *) plain_ptr + r_start, mask_ctx->root_css_buf, mask_ctx->markov_css_buf, r_start, r_start + r_stop); plain_len = (int) mask_ctx->css_cnt; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { pw_t pw; const int rc = gidd_to_pw_t (hashcat_ctx, device_param, gidvid, &pw); if (rc == -1) return -1; for (int i = 0; i < 64; i++) { plain_buf[i] = pw.i[i]; } plain_len = (int) pw.pw_len; u64 off = device_param->kernel_params_mp_buf64[3] + il_pos; u32 start = 0; u32 stop = device_param->kernel_params_mp_buf32[4]; sp_exec (off, (char *) plain_ptr + plain_len, mask_ctx->root_css_buf, mask_ctx->markov_css_buf, start, start + stop); plain_len += start + stop; if (plain_len > (int) hashconfig->pw_max) plain_len = (int) hashconfig->pw_max; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { pw_t pw; const int rc = gidd_to_pw_t (hashcat_ctx, device_param, gidvid, &pw); if (rc == -1) return -1; for (int i = 0; i < 64; i++) { plain_buf[i] = pw.i[i]; } plain_len = (int) pw.pw_len; u64 off = device_param->kernel_params_mp_buf64[3] + il_pos; u32 start = 0; u32 stop = device_param->kernel_params_mp_buf32[4]; memmove (plain_ptr + stop, plain_ptr, plain_len); sp_exec (off, (char *) plain_ptr, mask_ctx->root_css_buf, mask_ctx->markov_css_buf, start, start + stop); plain_len += start + stop; if (plain_len > (int) hashconfig->pw_max) plain_len = (int) hashconfig->pw_max; } else { pw_t pw; const int rc = gidd_to_pw_t (hashcat_ctx, device_param, gidvid, &pw); if (rc == -1) return -1; u64 off = device_param->kernel_params_mp_buf64[3] + gidvid; u32 start = 0; u32 stop = device_param->kernel_params_mp_buf32[4]; sp_exec (off, (char *) plain_ptr, mask_ctx->root_css_buf, mask_ctx->markov_css_buf, start, start + stop); plain_len = stop; char *comb_buf = (char *) device_param->combs_buf[il_pos].i; u32 comb_len = device_param->combs_buf[il_pos].pw_len; memcpy (plain_ptr + plain_len, comb_buf, comb_len); plain_len += comb_len; if (plain_len > (int) hashconfig->pw_max) plain_len = (int) hashconfig->pw_max; } } if (user_options->attack_mode == ATTACK_MODE_BF) { if (hashconfig->opti_type & OPTI_TYPE_BRUTE_FORCE) // lots of optimizations can happen here { if (hashconfig->opti_type & OPTI_TYPE_SINGLE_HASH) { if (hashconfig->opti_type & OPTI_TYPE_APPENDED_SALT) { plain_len = plain_len - hashes->salts_buf[0].salt_len; } } if (hashconfig->opts_type & OPTS_TYPE_PT_UTF16LE) { for (int i = 0, j = 0; i < plain_len; i += 2, j += 1) { plain_ptr[j] = plain_ptr[i]; } plain_len = plain_len / 2; } else if (hashconfig->opts_type & OPTS_TYPE_PT_UTF16BE) { for (int i = 1, j = 0; i < plain_len; i += 2, j += 1) { plain_ptr[j] = plain_ptr[i]; } plain_len = plain_len / 2; } } } plain_ptr[plain_len] = 0; *out_len = plain_len; return 0; } int build_crackpos (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, plain_t *plain, u64 *out_pos) { const combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; const u32 gidvid = plain->gidvid; const u32 il_pos = plain->il_pos; u64 crackpos = device_param->words_off; if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) { crackpos += gidvid; crackpos *= straight_ctx->kernel_rules_cnt; crackpos += device_param->innerloop_pos + il_pos; } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { crackpos += gidvid; crackpos *= combinator_ctx->combs_cnt; crackpos += device_param->innerloop_pos + il_pos; } else if (user_options_extra->attack_kern == ATTACK_MODE_BF) { crackpos += gidvid; crackpos *= mask_ctx->bfs_cnt; crackpos += device_param->innerloop_pos + il_pos; } *out_pos = crackpos; return 0; } int build_debugdata (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, plain_t *plain, u8 *debug_rule_buf, int *debug_rule_len, u8 *debug_plain_ptr, int *debug_plain_len) { const debugfile_ctx_t *debugfile_ctx = hashcat_ctx->debugfile_ctx; const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; const user_options_t *user_options = hashcat_ctx->user_options; const u32 gidvid = plain->gidvid; const u32 il_pos = plain->il_pos; if (user_options->attack_mode != ATTACK_MODE_STRAIGHT) return 0; const u32 debug_mode = debugfile_ctx->mode; if (debug_mode == 0) return 0; pw_t pw; const int rc = gidd_to_pw_t (hashcat_ctx, device_param, gidvid, &pw); if (rc == -1) return -1; int plain_len = (int) pw.pw_len; const u32 off = device_param->innerloop_pos + il_pos; // save rule if ((debug_mode == 1) || (debug_mode == 3) || (debug_mode == 4)) { const int len = kernel_rule_to_cpu_rule ((char *) debug_rule_buf, &straight_ctx->kernel_rules_buf[off]); debug_rule_buf[len] = 0; *debug_rule_len = len; } // save plain if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4)) { memcpy (debug_plain_ptr, (char *) pw.i, (size_t) plain_len); debug_plain_ptr[plain_len] = 0; *debug_plain_len = plain_len; } return 0; } int outfile_init (hashcat_ctx_t *hashcat_ctx) { outfile_ctx_t *outfile_ctx = hashcat_ctx->outfile_ctx; user_options_t *user_options = hashcat_ctx->user_options; outfile_ctx->fp = NULL; outfile_ctx->filename = user_options->outfile; outfile_ctx->outfile_format = user_options->outfile_format; outfile_ctx->outfile_autohex = user_options->outfile_autohex; return 0; } void outfile_destroy (hashcat_ctx_t *hashcat_ctx) { outfile_ctx_t *outfile_ctx = hashcat_ctx->outfile_ctx; memset (outfile_ctx, 0, sizeof (outfile_ctx_t)); } int outfile_write_open (hashcat_ctx_t *hashcat_ctx) { outfile_ctx_t *outfile_ctx = hashcat_ctx->outfile_ctx; if (outfile_ctx->filename == NULL) return 0; FILE *fp = fopen (outfile_ctx->filename, "ab"); if (fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", outfile_ctx->filename, strerror (errno)); return -1; } if (lock_file (fp) == -1) { fclose (fp); event_log_error (hashcat_ctx, "%s: %s", outfile_ctx->filename, strerror (errno)); return -1; } outfile_ctx->fp = fp; return 0; } void outfile_write_close (hashcat_ctx_t *hashcat_ctx) { outfile_ctx_t *outfile_ctx = hashcat_ctx->outfile_ctx; if (outfile_ctx->fp == NULL) return; fclose (outfile_ctx->fp); } int outfile_write (hashcat_ctx_t *hashcat_ctx, const char *out_buf, const unsigned char *plain_ptr, const u32 plain_len, const u64 crackpos, const unsigned char *username, const u32 user_len, char tmp_buf[HCBUFSIZ_LARGE]) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const outfile_ctx_t *outfile_ctx = hashcat_ctx->outfile_ctx; const user_options_t *user_options = hashcat_ctx->user_options; int tmp_len = 0; if (user_len > 0) { if (username != NULL) { memcpy (tmp_buf + tmp_len, username, user_len); tmp_len += user_len; if (outfile_ctx->outfile_format & (OUTFILE_FMT_HASH | OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS)) { tmp_buf[tmp_len] = hashconfig->separator; tmp_len += 1; } } } if (outfile_ctx->outfile_format & OUTFILE_FMT_HASH) { const size_t out_len = strlen (out_buf); memcpy (tmp_buf + tmp_len, out_buf, out_len); tmp_len += out_len; if (outfile_ctx->outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS)) { tmp_buf[tmp_len] = hashconfig->separator; tmp_len += 1; } } if (outfile_ctx->outfile_format & OUTFILE_FMT_PLAIN) { const bool always_ascii = (hashconfig->hash_type & OPTS_TYPE_PT_ALWAYS_ASCII) ? true : false; if ((user_options->outfile_autohex == true) && (need_hexify (plain_ptr, plain_len, hashconfig->separator, always_ascii) == true)) { tmp_buf[tmp_len++] = '$'; tmp_buf[tmp_len++] = 'H'; tmp_buf[tmp_len++] = 'E'; tmp_buf[tmp_len++] = 'X'; tmp_buf[tmp_len++] = '['; exec_hexify ((const u8 *) plain_ptr, plain_len, (u8 *) tmp_buf + tmp_len); tmp_len += plain_len * 2; tmp_buf[tmp_len++] = ']'; } else { memcpy (tmp_buf + tmp_len, plain_ptr, plain_len); tmp_len += plain_len; } if (outfile_ctx->outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS)) { tmp_buf[tmp_len] = hashconfig->separator; tmp_len += 1; } } if (outfile_ctx->outfile_format & OUTFILE_FMT_HEXPLAIN) { exec_hexify ((const u8 *) plain_ptr, plain_len, (u8 *) tmp_buf + tmp_len); tmp_len += plain_len * 2; if (outfile_ctx->outfile_format & (OUTFILE_FMT_CRACKPOS)) { tmp_buf[tmp_len] = hashconfig->separator; tmp_len += 1; } } if (outfile_ctx->outfile_format & OUTFILE_FMT_CRACKPOS) { tmp_len += snprintf (tmp_buf + tmp_len, HCBUFSIZ_LARGE - tmp_len, "%" PRIu64, crackpos); } tmp_buf[tmp_len] = 0; if (outfile_ctx->fp != NULL) { hc_fwrite (tmp_buf, tmp_len, 1, outfile_ctx->fp); hc_fwrite (EOL, strlen (EOL), 1, outfile_ctx->fp); } return tmp_len; } hashcat-4.0.1/src/outfile_check.c000066400000000000000000000260301320027462700166720ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "outfile_check.h" #include "convert.h" #include "folder.h" #include "hashes.h" #include "interface.h" #include "shared.h" #include "thread.h" static int outfile_remove (hashcat_ctx_t *hashcat_ctx) { // some hash-dependent constants hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; outcheck_ctx_t *outcheck_ctx = hashcat_ctx->outcheck_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; user_options_t *user_options = hashcat_ctx->user_options; u32 dgst_size = hashconfig->dgst_size; bool is_salted = hashconfig->is_salted; u32 esalt_size = hashconfig->esalt_size; u32 hook_salt_size = hashconfig->hook_salt_size; u32 hash_mode = hashconfig->hash_mode; char separator = hashconfig->separator; char *root_directory = outcheck_ctx->root_directory; u32 outfile_check_timer = user_options->outfile_check_timer; // buffers hash_t hash_buf = { 0, 0, 0, 0, 0, 0, NULL, 0 }; hash_buf.digest = hcmalloc (dgst_size); if (is_salted == true) hash_buf.salt = (salt_t *) hcmalloc (sizeof (salt_t)); if (esalt_size > 0) hash_buf.esalt = hcmalloc (esalt_size); if (hook_salt_size > 0) hash_buf.hook_salt = hcmalloc (hook_salt_size); u32 digest_buf[64] = { 0 }; outfile_data_t *out_info = NULL; char **out_files = NULL; hc_time_t folder_mtime = 0; int out_cnt = 0; u32 check_left = outfile_check_timer; // or 1 if we want to check it at startup while (status_ctx->shutdown_inner == false) { sleep (1); if (status_ctx->devices_status != STATUS_RUNNING) continue; check_left--; if (check_left == 0) { if (hc_path_exist (root_directory) == true) { const bool is_dir = hc_path_is_directory (root_directory); if (is_dir == true) { hc_stat_t outfile_check_stat; if (hc_stat (root_directory, &outfile_check_stat) == -1) { event_log_error (hashcat_ctx, "%s: %s", root_directory, strerror (errno)); hcfree (out_files); hcfree (out_info); return -1; } if (outfile_check_stat.st_mtime > folder_mtime) { char **out_files_new = scan_directory (root_directory); 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 *) hccalloc (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) { hc_stat_t outfile_stat; if (hc_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; } } } } } } hcfree (out_info); hcfree (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 (status_ctx->mux_display); hc_stat_t outfile_stat; if (hc_fstat (fileno (fp), &outfile_stat)) { fclose (fp); continue; } if (outfile_stat.st_ctime > out_info[j].ctime) { out_info[j].ctime = outfile_stat.st_ctime; out_info[j].seek = 0; } fseeko (fp, out_info[j].seek, SEEK_SET); char *line_buf = (char *) hcmalloc (HCBUFSIZ_LARGE); while (!feof (fp)) { char *ptr = fgets (line_buf, HCBUFSIZ_LARGE - 1, fp); if (ptr == NULL) break; size_t line_len = strlen (line_buf); if (line_len == 0) continue; size_t iter = 1; for (size_t i = line_len - 1; i && iter; i--, line_len--) { if (line_buf[i] != separator) continue; iter--; int parser_status = PARSER_OK; if ((hash_mode != 2500) && (hash_mode != 2501) && (hash_mode != 6800)) { parser_status = hashconfig->parse_func ((u8 *) line_buf, line_len - 1, &hash_buf, hashconfig); } u32 found = 0; if (parser_status == PARSER_OK) { for (u32 salt_pos = 0; (found == 0) && (salt_pos < hashes->salts_cnt); salt_pos++) { if (hashes->salts_shown[salt_pos] == 1) continue; salt_t *salt_buf = &hashes->salts_buf[salt_pos]; for (u32 digest_pos = 0; (found == 0) && (digest_pos < salt_buf->digests_cnt); digest_pos++) { u32 idx = salt_buf->digests_offset + digest_pos; if (hashes->digests_shown[idx] == 1) continue; u32 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) || (hash_mode == 2501)) { // this comparison is a bit inaccurate as we compare only ESSID // call it a bug, but it's good enough for a special case used in a special case // in this case all essid will be marked as cracked that match the essid if (i == salt_buf->salt_len) { cracked = (memcmp (line_buf, salt_buf->salt_buf, salt_buf->salt_len) == 0); } } else { char *digests_buf_ptr = (char *) hashes->digests_buf; memcpy (digest_buf, digests_buf_ptr + (hashes->salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size); cracked = (sort_by_digest_p0p1 (digest_buf, hash_buf.digest, hashconfig) == 0); } if (cracked == 1) { found = 1; hashes->digests_shown[idx] = 1; hashes->digests_done++; salt_buf->digests_done++; if (salt_buf->digests_done == salt_buf->digests_cnt) { hashes->salts_shown[salt_pos] = 1; hashes->salts_done++; if (hashes->salts_done == hashes->salts_cnt) mycracked (hashcat_ctx); } } } if (status_ctx->devices_status == STATUS_CRACKED) break; } } if (found) break; if (status_ctx->devices_status == STATUS_CRACKED) break; } if (status_ctx->devices_status == STATUS_CRACKED) break; } hcfree (line_buf); out_info[j].seek = ftello (fp); //hc_thread_mutex_unlock (status_ctx->mux_display); fclose (fp); } } } } check_left = outfile_check_timer; } } hcfree (hash_buf.esalt); hcfree (hash_buf.hook_salt); hcfree (hash_buf.salt); hcfree (hash_buf.digest); hcfree (out_info); hcfree (out_files); return 0; } void *thread_outfile_remove (void *p) { hashcat_ctx_t *hashcat_ctx = (hashcat_ctx_t *) p; const int rc = outfile_remove (hashcat_ctx); if (rc == -1) return NULL; return NULL; } int outcheck_ctx_init (hashcat_ctx_t *hashcat_ctx) { folder_config_t *folder_config = hashcat_ctx->folder_config; outcheck_ctx_t *outcheck_ctx = hashcat_ctx->outcheck_ctx; user_options_t *user_options = hashcat_ctx->user_options; outcheck_ctx->enabled = false; if (user_options->keyspace == true) return 0; if (user_options->benchmark == true) return 0; if (user_options->example_hashes == true) return 0; if (user_options->speed_only == true) return 0; if (user_options->progress_only == true) return 0; if (user_options->opencl_info == true) return 0; if (user_options->outfile_check_timer == 0) return 0; if ((user_options->hash_mode == 5200) || ((user_options->hash_mode >= 6200) && (user_options->hash_mode <= 6299)) || ((user_options->hash_mode >= 13700) && (user_options->hash_mode <= 13799)) || (user_options->hash_mode == 9000)) return 0; if (user_options->outfile_check_dir == NULL) { hc_asprintf (&outcheck_ctx->root_directory, "%s/%s.%s", folder_config->session_dir, user_options->session, OUTFILES_DIR); } else { outcheck_ctx->root_directory = user_options->outfile_check_dir; } outcheck_ctx->enabled = true; if (hc_path_exist (outcheck_ctx->root_directory) == false) { if (hc_mkdir (outcheck_ctx->root_directory, 0700) == -1) { event_log_error (hashcat_ctx, "%s: %s", outcheck_ctx->root_directory, strerror (errno)); return -1; } } return 0; } void outcheck_ctx_destroy (hashcat_ctx_t *hashcat_ctx) { outcheck_ctx_t *outcheck_ctx = hashcat_ctx->outcheck_ctx; user_options_t *user_options = hashcat_ctx->user_options; if (outcheck_ctx->enabled == false) return; if (rmdir (outcheck_ctx->root_directory) == -1) { if (errno == ENOENT) { // good, we can ignore } else if (errno == ENOTEMPTY) { // good, we can ignore } else { event_log_error (hashcat_ctx, "%s: %s", outcheck_ctx->root_directory, strerror (errno)); //return -1; } } if (user_options->outfile_check_dir == NULL) { hcfree (outcheck_ctx->root_directory); } memset (outcheck_ctx, 0, sizeof (outcheck_ctx_t)); } hashcat-4.0.1/src/pidfile.c000066400000000000000000000071751320027462700155130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "user_options.h" #include "shared.h" #include "pidfile.h" static int check_running_process (hashcat_ctx_t *hashcat_ctx) { pidfile_ctx_t *pidfile_ctx = hashcat_ctx->pidfile_ctx; char *pidfile_filename = pidfile_ctx->filename; FILE *fp = fopen (pidfile_filename, "rb"); if (fp == NULL) return 0; pidfile_data_t *pd = (pidfile_data_t *) hcmalloc (sizeof (pidfile_data_t)); const size_t nread = hc_fread (pd, sizeof (pidfile_data_t), 1, fp); fclose (fp); if (nread != 1) { event_log_error (hashcat_ctx, "Cannot read %s", pidfile_filename); hcfree (pd); return -1; } if (pd->pid) { #if defined (_WIN) HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pd->pid); char *pidbin = (char *) hcmalloc (HCBUFSIZ_LARGE); char *pidbin2 = (char *) hcmalloc (HCBUFSIZ_LARGE); int pidbin_len = GetModuleFileName (NULL, pidbin, HCBUFSIZ_LARGE); int pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, HCBUFSIZ_LARGE); pidbin[pidbin_len] = 0; pidbin2[pidbin2_len] = 0; if (pidbin2_len) { if (strcmp (pidbin, pidbin2) == 0) { event_log_error (hashcat_ctx, "Already an instance %s running on pid %d", pidbin2, pd->pid); hcfree (pd); hcfree (pidbin); hcfree (pidbin2); return -1; } } hcfree (pidbin); hcfree (pidbin2); #else char *pidbin; hc_asprintf (&pidbin, "/proc/%u/cmdline", pd->pid); if (hc_path_exist (pidbin) == true) { event_log_error (hashcat_ctx, "Already an instance running on pid %u", pd->pid); hcfree (pd); hcfree (pidbin); return -1; } hcfree (pidbin); #endif } hcfree (pd); return 0; } static int init_pidfile (hashcat_ctx_t *hashcat_ctx) { pidfile_ctx_t *pidfile_ctx = hashcat_ctx->pidfile_ctx; pidfile_data_t *pd = (pidfile_data_t *) hcmalloc (sizeof (pidfile_data_t)); pidfile_ctx->pd = pd; const int rc = check_running_process (hashcat_ctx); if (rc == -1) return -1; #if defined (_WIN) pd->pid = GetCurrentProcessId (); #else pd->pid = getpid (); #endif return 0; } static int write_pidfile (hashcat_ctx_t *hashcat_ctx) { const pidfile_ctx_t *pidfile_ctx = hashcat_ctx->pidfile_ctx; pidfile_data_t *pd = pidfile_ctx->pd; char *pidfile_filename = pidfile_ctx->filename; FILE *fp = fopen (pidfile_filename, "wb"); if (fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", pidfile_filename, strerror (errno)); return -1; } hc_fwrite (pd, sizeof (pidfile_data_t), 1, fp); fflush (fp); fclose (fp); return 0; } int pidfile_ctx_init (hashcat_ctx_t *hashcat_ctx) { folder_config_t *folder_config = hashcat_ctx->folder_config; pidfile_ctx_t *pidfile_ctx = hashcat_ctx->pidfile_ctx; user_options_t *user_options = hashcat_ctx->user_options; hc_asprintf (&pidfile_ctx->filename, "%s/%s.pid", folder_config->session_dir, user_options->session); pidfile_ctx->pidfile_written = false; const int rc_init_pidfile = init_pidfile (hashcat_ctx); if (rc_init_pidfile == -1) return -1; const int rc = write_pidfile (hashcat_ctx); if (rc == 0) pidfile_ctx->pidfile_written = true; return 0; } void pidfile_ctx_destroy (hashcat_ctx_t *hashcat_ctx) { pidfile_ctx_t *pidfile_ctx = hashcat_ctx->pidfile_ctx; if (pidfile_ctx->pidfile_written == true) { unlink (pidfile_ctx->filename); } hcfree (pidfile_ctx->filename); hcfree (pidfile_ctx->pd); memset (pidfile_ctx, 0, sizeof (pidfile_ctx_t)); } hashcat-4.0.1/src/potfile.c000066400000000000000000000670141320027462700155370ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "bitops.h" #include "convert.h" #include "memory.h" #include "event.h" #include "interface.h" #include "filehandling.h" #include "loopback.h" #include "outfile.h" #include "potfile.h" #include "locking.h" #include "shared.h" // get rid of this later int sort_by_hash (const void *v1, const void *v2, void *v3); int sort_by_hash_no_salt (const void *v1, const void *v2, void *v3); // get rid of this later // this function is for potfile comparison where the potfile does not contain all the // information requires to do a true sort_by_hash() bsearch static 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; const int res1 = (int) s1->salt_len - (int) s2->salt_len; if (res1 != 0) return (res1); //const int res2 = (int) s1->salt_iter - (int) s2->salt_iter; // //if (res2 != 0) return (res2); for (int n = 0; n < 16; n++) { if (s1->salt_buf[n] > s2->salt_buf[n]) return 1; if (s1->salt_buf[n] < s2->salt_buf[n]) return -1; } for (int n = 0; n < 8; 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; } // this function is special and only used whenever --username and --show are used together: // it will sort all tree entries according to the settings stored in hashconfig int sort_pot_tree_by_hash (const void *v1, const void *v2) { const pot_tree_entry_t *t1 = (const pot_tree_entry_t *) v1; const pot_tree_entry_t *t2 = (const pot_tree_entry_t *) v2; const hash_t *h1 = (const hash_t *) t1->nodes->hash_buf; const hash_t *h2 = (const hash_t *) t2->nodes->hash_buf; hashconfig_t *hc = (hashconfig_t *) t1->hashconfig; // is same as t2->hashconfig return sort_by_hash (h1, h2, hc); } // the problem with the GNU tdestroy () function is that it doesn't work with mingw etc // there are 2 alternatives: // 1. recursively delete the entries with entry->left and entry->right // 2. use tdelete () <- this is what we currently use, but this could be slower! void pot_tree_destroy (pot_tree_entry_t *tree) { pot_tree_entry_t *entry = tree; while (tree != NULL) { entry = *(pot_tree_entry_t **) tree; tdelete (entry, (void **) &tree, sort_pot_tree_by_hash); } } int potfile_init (hashcat_ctx_t *hashcat_ctx) { folder_config_t *folder_config = hashcat_ctx->folder_config; potfile_ctx_t *potfile_ctx = hashcat_ctx->potfile_ctx; user_options_t *user_options = hashcat_ctx->user_options; potfile_ctx->enabled = false; if (user_options->benchmark == true) return 0; if (user_options->example_hashes == true) return 0; if (user_options->keyspace == true) return 0; if (user_options->opencl_info == true) return 0; if (user_options->stdout_flag == true) return 0; if (user_options->speed_only == true) return 0; if (user_options->progress_only == true) return 0; if (user_options->usage == true) return 0; if (user_options->version == true) return 0; if (user_options->potfile_disable == true) return 0; potfile_ctx->enabled = true; if (user_options->potfile_path == NULL) { potfile_ctx->fp = NULL; hc_asprintf (&potfile_ctx->filename, "%s/hashcat.potfile", folder_config->profile_dir); } else { potfile_ctx->filename = hcstrdup (user_options->potfile_path); potfile_ctx->fp = NULL; } // keep all hashes if --username was combined with --left or --show potfile_ctx->keep_all_hashes = false; if (user_options->username == true) { if ((user_options->show == true) || (user_options->left == true)) { potfile_ctx->keep_all_hashes = true; } } // keep all hashes if -m 3000 was combined with --left or --show if (user_options->hash_mode == 3000) { if ((user_options->show == true) || (user_options->left == true)) { potfile_ctx->keep_all_hashes = true; } } // starting from here, we should allocate some scratch buffer for later use u8 *out_buf = (u8 *) hcmalloc (HCBUFSIZ_LARGE); potfile_ctx->out_buf = out_buf; // we need two buffers in parallel u8 *tmp_buf = (u8 *) hcmalloc (HCBUFSIZ_LARGE); potfile_ctx->tmp_buf = tmp_buf; // old potfile detection if (user_options->potfile_path == NULL) { char *potfile_old; hc_asprintf (&potfile_old, "%s/hashcat.pot", folder_config->profile_dir); if (hc_path_exist (potfile_old) == true) { event_log_warning (hashcat_ctx, "Old potfile detected: %s", potfile_old); event_log_warning (hashcat_ctx, "New potfile is: %s ", potfile_ctx->filename); event_log_warning (hashcat_ctx, NULL); } hcfree (potfile_old); } return 0; } void potfile_destroy (hashcat_ctx_t *hashcat_ctx) { potfile_ctx_t *potfile_ctx = hashcat_ctx->potfile_ctx; if (potfile_ctx->enabled == false) return; hcfree (potfile_ctx->out_buf); hcfree (potfile_ctx->tmp_buf); memset (potfile_ctx, 0, sizeof (potfile_ctx_t)); } int potfile_read_open (hashcat_ctx_t *hashcat_ctx) { potfile_ctx_t *potfile_ctx = hashcat_ctx->potfile_ctx; if (potfile_ctx->enabled == false) return 0; potfile_ctx->fp = fopen (potfile_ctx->filename, "rb"); if (potfile_ctx->fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", potfile_ctx->filename, strerror (errno)); return -1; } return 0; } void potfile_read_close (hashcat_ctx_t *hashcat_ctx) { potfile_ctx_t *potfile_ctx = hashcat_ctx->potfile_ctx; if (potfile_ctx->enabled == false) return; if (potfile_ctx->fp == NULL) return; fclose (potfile_ctx->fp); } int potfile_write_open (hashcat_ctx_t *hashcat_ctx) { potfile_ctx_t *potfile_ctx = hashcat_ctx->potfile_ctx; if (potfile_ctx->enabled == false) return 0; FILE *fp = fopen (potfile_ctx->filename, "ab"); if (fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", potfile_ctx->filename, strerror (errno)); return -1; } potfile_ctx->fp = fp; return 0; } void potfile_write_close (hashcat_ctx_t *hashcat_ctx) { potfile_ctx_t *potfile_ctx = hashcat_ctx->potfile_ctx; if (potfile_ctx->enabled == false) return; fclose (potfile_ctx->fp); } void potfile_write_append (hashcat_ctx_t *hashcat_ctx, const char *out_buf, u8 *plain_ptr, unsigned int plain_len) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const potfile_ctx_t *potfile_ctx = hashcat_ctx->potfile_ctx; const user_options_t *user_options = hashcat_ctx->user_options; if (potfile_ctx->enabled == false) return; u8 *tmp_buf = potfile_ctx->tmp_buf; int tmp_len = 0; if (1) { const size_t out_len = strlen (out_buf); memcpy (tmp_buf + tmp_len, out_buf, out_len); tmp_len += out_len; tmp_buf[tmp_len] = hashconfig->separator; tmp_len += 1; } if (1) { const bool always_ascii = (hashconfig->hash_type & OPTS_TYPE_PT_ALWAYS_ASCII) ? true : false; if ((user_options->outfile_autohex == true) && (need_hexify (plain_ptr, plain_len, hashconfig->separator, always_ascii) == true)) { tmp_buf[tmp_len++] = '$'; tmp_buf[tmp_len++] = 'H'; tmp_buf[tmp_len++] = 'E'; tmp_buf[tmp_len++] = 'X'; tmp_buf[tmp_len++] = '['; exec_hexify ((const u8 *) plain_ptr, plain_len, tmp_buf + tmp_len); tmp_len += plain_len * 2; tmp_buf[tmp_len++] = ']'; } else { memcpy (tmp_buf + tmp_len, plain_ptr, plain_len); tmp_len += plain_len; } } tmp_buf[tmp_len] = 0; lock_file (potfile_ctx->fp); fprintf (potfile_ctx->fp, "%s" EOL, tmp_buf); fflush (potfile_ctx->fp); if (unlock_file (potfile_ctx->fp)) { event_log_error (hashcat_ctx, "%s: Failed to unlock file.", potfile_ctx->filename); } } void potfile_update_hash (hashcat_ctx_t *hashcat_ctx, hash_t *found, char *line_pw_buf, int line_pw_len) { const loopback_ctx_t *loopback_ctx = hashcat_ctx->loopback_ctx; if (found == NULL) return; char *pw_buf = line_pw_buf; int pw_len = line_pw_len; found->pw_buf = (char *) hcmalloc (pw_len + 1); found->pw_len = pw_len; memcpy (found->pw_buf, pw_buf, pw_len); found->pw_buf[found->pw_len] = 0; found->cracked = 1; // if enabled, update also the loopback file if (loopback_ctx->fp != NULL) { loopback_write_append (hashcat_ctx, (u8 *) pw_buf, (unsigned int) pw_len); } } void potfile_update_hashes (hashcat_ctx_t *hashcat_ctx, hash_t *hash_buf, char *line_pw_buf, int line_pw_len, pot_tree_entry_t *tree) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; // the linked list node: pot_hash_node_t search_node; search_node.hash_buf = hash_buf; search_node.next = NULL; // the search entry: pot_tree_entry_t search_entry; search_entry.nodes = &search_node; search_entry.hashconfig = hashconfig; // the main search function is this: void **found = tfind (&search_entry, (void **) &tree, sort_pot_tree_by_hash); if (found) { pot_tree_entry_t *found_entry = (pot_tree_entry_t *) *found; pot_hash_node_t *node = found_entry->nodes; while (node) { potfile_update_hash (hashcat_ctx, node->hash_buf, line_pw_buf, line_pw_len); node = node->next; } } } int potfile_remove_parse (hashcat_ctx_t *hashcat_ctx) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const hashes_t *hashes = hashcat_ctx->hashes; const potfile_ctx_t *potfile_ctx = hashcat_ctx->potfile_ctx; if (potfile_ctx->enabled == false) return 0; // if no potfile exists yet we don't need to do anything here if (hc_path_exist (potfile_ctx->filename) == false) return 0; hash_t *hashes_buf = hashes->hashes_buf; u32 hashes_cnt = hashes->hashes_cnt; // no solution for these special hash types (for instane because they use hashfile in output etc) if (hashconfig->hash_mode == 5200) return 0; if ((hashconfig->hash_mode >= 6200) && (hashconfig->hash_mode <= 6299)) return 0; if (hashconfig->hash_mode == 9000) return 0; if ((hashconfig->hash_mode >= 13700) && (hashconfig->hash_mode <= 13799)) return 0; if (hashconfig->hash_mode == 14600) return 0; hash_t hash_buf; hash_buf.digest = hcmalloc (hashconfig->dgst_size); hash_buf.salt = NULL; hash_buf.esalt = NULL; hash_buf.hook_salt = NULL; hash_buf.hash_info = NULL; hash_buf.cracked = 0; if (hashconfig->is_salted == true) { hash_buf.salt = (salt_t *) hcmalloc (sizeof (salt_t)); } if (hashconfig->esalt_size > 0) { hash_buf.esalt = hcmalloc (hashconfig->esalt_size); } if (hashconfig->hook_salt_size > 0) { hash_buf.hook_salt = hcmalloc (hashconfig->hook_salt_size); } // we only need this variable in a very specific situation: // whenever we use --username and --show together we want to keep all hashes sorted within a nice structure pot_tree_entry_t *all_hashes_tree = NULL; pot_tree_entry_t *tree_entry_cache = NULL; pot_hash_node_t *tree_nodes_cache = NULL; if (potfile_ctx->keep_all_hashes == true) { // we need *at most* one entry for every hash // (if there are no hashes with the same keys (hash + salt), a counter example would be: same hash but different user name) tree_entry_cache = (pot_tree_entry_t *) hccalloc (hashes_cnt, sizeof (pot_tree_entry_t)); // we need *always exactly* one linked list for every hash tree_nodes_cache = (pot_hash_node_t *) hccalloc (hashes_cnt, sizeof (pot_hash_node_t)); for (u32 hash_pos = 0; hash_pos < hashes_cnt; hash_pos++) { // initialize the linked list node: // we always need to create a new one and add it, because we want to keep and later update all hashes: pot_hash_node_t *new_node = &tree_nodes_cache[hash_pos]; new_node->hash_buf = &hashes_buf[hash_pos]; new_node->next = NULL; // initialize the entry: pot_tree_entry_t *new_entry = &tree_entry_cache[hash_pos]; // note: the "key" (hash + salt) is indirectly accessible via the first nodes "hash_buf" new_entry->nodes = new_node; // the hashconfig is needed here because we need to be able to check within the sort function if we also need // to sort by salt and we also need to have the correct order of dgst_pos0...dgst_pos3: new_entry->hashconfig = (hashconfig_t *) hashconfig; // "const hashconfig_t" gives a warning // the following function searches if the "key" is already present and if not inserts the new entry: void **found = tsearch (new_entry, (void **) &all_hashes_tree, sort_pot_tree_by_hash); pot_tree_entry_t *found_entry = (pot_tree_entry_t *) *found; // we now need to check these cases; tsearch () could return: // 1. NULL : if we have a memory allocation problem (not enough memory for the tree structure) // 2. found_entry == new_entry: if we successfully insert a new key (which was not present yet) // 3. found_entry != new_entry: if the key was already present // case 1: memory allocation error if (found_entry == NULL) { fprintf (stderr, "Error while allocating memory for the potfile search: %s\n", MSG_ENOMEM); return -1; } // case 2: this means it was a new insert (and the insert was successful) if (found_entry == new_entry) { // no updates to the linked list required (since it is the first one!) } // case 3: if we have found an already existing entry else { new_node->next = found_entry->nodes; } // we always insert the new node at the very beginning // (or in other words: the head of the linked list always points to *this* new inserted node) found_entry->nodes = new_node; } } // special case for a split hash if (hashconfig->hash_mode == 3000) { int parser_status = hashconfig->parse_func ((u8 *) LM_ZERO_HASH, 16, &hash_buf, hashconfig); if (parser_status == PARSER_OK) { if (potfile_ctx->keep_all_hashes == true) { potfile_update_hashes (hashcat_ctx, &hash_buf, NULL, 0, all_hashes_tree); } else { hash_t *found = (hash_t *) hc_bsearch_r (&hash_buf, hashes_buf, hashes_cnt, sizeof (hash_t), sort_by_hash_no_salt, (void *) hashconfig); potfile_update_hash (hashcat_ctx, found, NULL, 0); } } } const int rc = potfile_read_open (hashcat_ctx); if (rc == -1) return -1; char *line_buf = (char *) hcmalloc (HCBUFSIZ_LARGE); while (!feof (potfile_ctx->fp)) { int line_len = fgetl (potfile_ctx->fp, line_buf); if (line_len == 0) continue; char *last_separator = strrchr (line_buf, hashconfig->separator); if (last_separator == NULL) continue; // ?? char *line_pw_buf = last_separator + 1; int line_pw_len = line_buf + line_len - line_pw_buf; char *line_hash_buf = line_buf; int line_hash_len = last_separator - line_buf; line_hash_buf[line_hash_len] = 0; if (line_hash_len == 0) continue; if (hashconfig->is_salted == true) { memset (hash_buf.salt, 0, sizeof (salt_t)); } if (hashconfig->esalt_size > 0) { memset (hash_buf.esalt, 0, hashconfig->esalt_size); } if (hashconfig->hook_salt_size > 0) { memset (hash_buf.hook_salt, 0, hashconfig->hook_salt_size); } hash_t *found = NULL; if (hashconfig->hash_mode == 6800) { if (line_hash_len < 256) // 64 = 64 * u32 in salt_buf[] { // manipulate salt_buf memcpy (hash_buf.salt->salt_buf, line_hash_buf, line_hash_len); hash_buf.salt->salt_len = line_hash_len; found = (hash_t *) bsearch (&hash_buf, hashes_buf, hashes_cnt, sizeof (hash_t), sort_by_hash_t_salt); } } else if ((hashconfig->hash_mode == 2500) || (hashconfig->hash_mode == 2501)) { // here we have in line_hash_buf: hash:macap:macsta:essid:password char *sep_pos = strrchr (line_hash_buf, ':'); if (sep_pos == NULL) continue; sep_pos[0] = 0; char *hash_pos = line_hash_buf; const size_t hash_len = strlen (hash_pos); if (hash_len != 32 + 1 + 12 + 1 + 12) continue; char *essid_pos = sep_pos + 1; int essid_len = (int) strlen (essid_pos); if (is_hexify ((const u8 *) essid_pos, (const int) essid_len) == true) { essid_len = exec_unhexify ((const u8 *) essid_pos, essid_len, (u8 *) essid_pos, essid_len); } if (essid_len > 32) continue; if (hashconfig->is_salted == true) { // this should be always true, but we need it to make scan-build happy memcpy (hash_buf.salt->salt_buf, essid_pos, essid_len); hash_buf.salt->salt_len = essid_len; hash_buf.salt->salt_iter = ROUNDS_WPA - 1; u32 hash[4]; hash[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); hash[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); hash[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); hash[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); hash[0] = byte_swap_32 (hash[0]); hash[1] = byte_swap_32 (hash[1]); hash[2] = byte_swap_32 (hash[2]); hash[3] = byte_swap_32 (hash[3]); u32 *digest = (u32 *) hash_buf.digest; digest[0] = hash[0]; digest[1] = hash[1]; digest[2] = hash[2]; digest[3] = hash[3]; } found = (hash_t *) hc_bsearch_r (&hash_buf, hashes_buf, hashes_cnt, sizeof (hash_t), sort_by_hash, (void *) hashconfig); } else { int parser_status = hashconfig->parse_func ((u8 *) line_hash_buf, line_hash_len, &hash_buf, hashconfig); if (parser_status != PARSER_OK) continue; if (potfile_ctx->keep_all_hashes == true) { potfile_update_hashes (hashcat_ctx, &hash_buf, line_pw_buf, line_pw_len, all_hashes_tree); continue; } found = (hash_t *) hc_bsearch_r (&hash_buf, hashes_buf, hashes_cnt, sizeof (hash_t), sort_by_hash, (void *) hashconfig); } potfile_update_hash (hashcat_ctx, found, line_pw_buf, line_pw_len); } hcfree (line_buf); potfile_read_close (hashcat_ctx); if (potfile_ctx->keep_all_hashes == true) { pot_tree_destroy (all_hashes_tree); // this could be slow (should we just skip it?) hcfree (tree_nodes_cache); hcfree (tree_entry_cache); } if (hashconfig->esalt_size > 0) { hcfree (hash_buf.esalt); } if (hashconfig->hook_salt_size > 0) { hcfree (hash_buf.hook_salt); } if (hashconfig->is_salted == true) { hcfree (hash_buf.salt); } hcfree (hash_buf.digest); return 0; } int potfile_handle_show (hashcat_ctx_t *hashcat_ctx) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; potfile_ctx_t *potfile_ctx = hashcat_ctx->potfile_ctx; hash_t *hashes_buf = hashes->hashes_buf; u32 salts_cnt = hashes->salts_cnt; salt_t *salts_buf = hashes->salts_buf; if (hashconfig->hash_mode == 3000) { for (u32 salt_idx = 0; salt_idx < salts_cnt; salt_idx++) { salt_t *salt_buf = salts_buf + salt_idx; u32 digests_cnt = salt_buf->digests_cnt; for (u32 digest_idx = 0; digest_idx < digests_cnt; digest_idx++) { const u32 hashes_idx = salt_buf->digests_offset + digest_idx; u32 *digests_shown = hashes->digests_shown; hash_t *hash1 = &hashes_buf[hashes_idx]; hash_t *hash2 = NULL; int split_neighbor = -1; // find out if at least one of the parts has been cracked if (hash1->hash_info->split->split_origin == SPLIT_ORIGIN_LEFT) { split_neighbor = hash1->hash_info->split->split_neighbor; hash2 = &hashes_buf[split_neighbor]; if ((digests_shown[hashes_idx] == 0) && (digests_shown[split_neighbor] == 0)) continue; } else if (hash1->hash_info->split->split_origin == SPLIT_ORIGIN_NONE) { if (digests_shown[hashes_idx] == 0) continue; } else { // SPLIT_ORIGIN_RIGHT are not handled this way continue; } u8 *out_buf = potfile_ctx->out_buf; out_buf[0] = 0; ascii_digest (hashcat_ctx, (char *) out_buf + 0, HCBUFSIZ_LARGE - 0, salt_idx, digest_idx); if (hash2) { ascii_digest (hashcat_ctx, (char *) out_buf + 16, HCBUFSIZ_LARGE - 16, salt_idx, split_neighbor); } // user unsigned char *username = NULL; u32 user_len = 0; user_t *user = hash1->hash_info->user; if (user) { username = (unsigned char *) (user->user_name); user_len = user->user_len; username[user_len] = 0; } u8 *tmp_buf = potfile_ctx->tmp_buf; tmp_buf[0] = 0; u8 mixed_buf[20] = { 0 }; u8 mixed_len = 0; if (digests_shown[hashes_idx] == 1) { memcpy (mixed_buf + mixed_len, hash1->pw_buf, hash1->pw_len); mixed_len += hash1->pw_len; } else { memcpy (mixed_buf + mixed_len, LM_MASKED_PLAIN, strlen (LM_MASKED_PLAIN)); mixed_len += strlen (LM_MASKED_PLAIN); } if (hash2) { if (digests_shown[split_neighbor] == 1) { memcpy (mixed_buf + mixed_len, hash2->pw_buf, hash2->pw_len); mixed_len += hash2->pw_len; } else { memcpy (mixed_buf + mixed_len, LM_MASKED_PLAIN, strlen (LM_MASKED_PLAIN)); mixed_len += strlen (LM_MASKED_PLAIN); } } const int tmp_len = outfile_write (hashcat_ctx, (char *) out_buf, (u8 *) mixed_buf, mixed_len, 0, username, user_len, (char *) tmp_buf); EVENT_DATA (EVENT_POTFILE_HASH_SHOW, tmp_buf, tmp_len); } } } else { for (u32 salt_idx = 0; salt_idx < salts_cnt; salt_idx++) { salt_t *salt_buf = salts_buf + salt_idx; u32 digests_cnt = salt_buf->digests_cnt; for (u32 digest_idx = 0; digest_idx < digests_cnt; digest_idx++) { const u32 hashes_idx = salt_buf->digests_offset + digest_idx; u32 *digests_shown = hashes->digests_shown; if (digests_shown[hashes_idx] == 0) continue; hash_t *hash = &hashes_buf[hashes_idx]; u8 *out_buf = potfile_ctx->out_buf; out_buf[0] = 0; ascii_digest (hashcat_ctx, (char *) out_buf, HCBUFSIZ_LARGE, salt_idx, digest_idx); // user unsigned char *username = NULL; u32 user_len = 0; if (hash->hash_info != NULL) { user_t *user = hash->hash_info->user; if (user) { username = (unsigned char *) (user->user_name); user_len = user->user_len; username[user_len] = 0; } } u8 *tmp_buf = potfile_ctx->tmp_buf; tmp_buf[0] = 0; // special case for collider modes: we do not use the $HEX[] format within the hash itself // therefore we need to convert the $HEX[] password into hexadecimal (without "$HEX[" and "]") bool is_collider_hex_password = false; if ((hashconfig->hash_mode == 9710) || (hashconfig->hash_mode == 9810) || (hashconfig->hash_mode == 10410)) { if (is_hexify ((u8 *) hash->pw_buf, hash->pw_len) == true) { is_collider_hex_password = true; } } int tmp_len = 0; if (is_collider_hex_password == true) { u8 pass_unhexified[HCBUFSIZ_TINY] = { 0 }; u32 pass_unhexified_len = 0; pass_unhexified_len = exec_unhexify ((u8 *) hash->pw_buf, hash->pw_len, pass_unhexified, sizeof (pass_unhexified)); tmp_len = outfile_write (hashcat_ctx, (char *) out_buf, pass_unhexified, pass_unhexified_len, 0, username, user_len, (char *) tmp_buf); } else { tmp_len = outfile_write (hashcat_ctx, (char *) out_buf, (u8 *) hash->pw_buf, hash->pw_len, 0, username, user_len, (char *) tmp_buf); } EVENT_DATA (EVENT_POTFILE_HASH_SHOW, tmp_buf, tmp_len); } } } return 0; } int potfile_handle_left (hashcat_ctx_t *hashcat_ctx) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; potfile_ctx_t *potfile_ctx = hashcat_ctx->potfile_ctx; hash_t *hashes_buf = hashes->hashes_buf; u32 salts_cnt = hashes->salts_cnt; salt_t *salts_buf = hashes->salts_buf; if (hashconfig->hash_mode == 3000) { for (u32 salt_idx = 0; salt_idx < salts_cnt; salt_idx++) { salt_t *salt_buf = salts_buf + salt_idx; u32 digests_cnt = salt_buf->digests_cnt; for (u32 digest_idx = 0; digest_idx < digests_cnt; digest_idx++) { const u32 hashes_idx = salt_buf->digests_offset + digest_idx; u32 *digests_shown = hashes->digests_shown; hash_t *hash1 = &hashes_buf[hashes_idx]; hash_t *hash2 = NULL; int split_neighbor = -1; // find out if at least one of the parts has been cracked if (hash1->hash_info->split->split_origin == SPLIT_ORIGIN_LEFT) { split_neighbor = hash1->hash_info->split->split_neighbor; hash2 = &hashes_buf[split_neighbor]; if ((digests_shown[hashes_idx] == 1) && (digests_shown[split_neighbor] == 1)) continue; } else if (hash1->hash_info->split->split_origin == SPLIT_ORIGIN_NONE) { if (digests_shown[hashes_idx] == 1) continue; } else { // SPLIT_ORIGIN_RIGHT are not handled this way continue; } u8 *out_buf = potfile_ctx->out_buf; out_buf[0] = 0; ascii_digest (hashcat_ctx, (char *) out_buf + 0, HCBUFSIZ_LARGE - 0, salt_idx, digest_idx); if (hash2) { ascii_digest (hashcat_ctx, (char *) out_buf + 16, HCBUFSIZ_LARGE - 16, salt_idx, split_neighbor); } // user unsigned char *username = NULL; u32 user_len = 0; user_t *user = hash1->hash_info->user; if (user) { username = (unsigned char *) (user->user_name); user_len = user->user_len; username[user_len] = 0; } u8 *tmp_buf = potfile_ctx->tmp_buf; tmp_buf[0] = 0; const int tmp_len = outfile_write (hashcat_ctx, (char *) out_buf, NULL, 0, 0, username, user_len, (char *) tmp_buf); EVENT_DATA (EVENT_POTFILE_HASH_LEFT, tmp_buf, tmp_len); } } } else { for (u32 salt_idx = 0; salt_idx < salts_cnt; salt_idx++) { salt_t *salt_buf = salts_buf + salt_idx; u32 digests_cnt = salt_buf->digests_cnt; for (u32 digest_idx = 0; digest_idx < digests_cnt; digest_idx++) { const u32 hashes_idx = salt_buf->digests_offset + digest_idx; u32 *digests_shown = hashes->digests_shown; if (digests_shown[hashes_idx] == 1) continue; u8 *out_buf = potfile_ctx->out_buf; out_buf[0] = 0; ascii_digest (hashcat_ctx, (char *) out_buf, HCBUFSIZ_LARGE, salt_idx, digest_idx); hash_t *hash = &hashes_buf[hashes_idx]; // user unsigned char *username = NULL; u32 user_len = 0; if (hash->hash_info != NULL) { user_t *user = hash->hash_info->user; if (user) { username = (unsigned char *) (user->user_name); user_len = user->user_len; username[user_len] = 0; } } u8 *tmp_buf = potfile_ctx->tmp_buf; tmp_buf[0] = 0; const int tmp_len = outfile_write (hashcat_ctx, (char *) out_buf, NULL, 0, 0, username, user_len, (char *) tmp_buf); EVENT_DATA (EVENT_POTFILE_HASH_LEFT, tmp_buf, tmp_len); } } } return 0; } hashcat-4.0.1/src/restore.c000066400000000000000000000227351320027462700155610ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "user_options.h" #include "shared.h" #include "pidfile.h" #include "folder.h" #include "restore.h" #if defined (_WIN) static void fsync (int fd) { HANDLE h = (HANDLE) _get_osfhandle (fd); FlushFileBuffers (h); } #endif static int init_restore (hashcat_ctx_t *hashcat_ctx) { restore_ctx_t *restore_ctx = hashcat_ctx->restore_ctx; restore_data_t *rd = (restore_data_t *) hcmalloc (sizeof (restore_data_t)); restore_ctx->rd = rd; rd->version = RESTORE_VERSION_CUR; rd->argc = restore_ctx->argc; rd->argv = restore_ctx->argv; if (getcwd (rd->cwd, 255) == NULL) { event_log_error (hashcat_ctx, "getcwd(): %s", strerror (errno)); return -1; } return 0; } static int read_restore (hashcat_ctx_t *hashcat_ctx) { restore_ctx_t *restore_ctx = hashcat_ctx->restore_ctx; folder_config_t *folder_config = hashcat_ctx->folder_config; if (restore_ctx->enabled == false) return 0; char *eff_restore_file = restore_ctx->eff_restore_file; FILE *fp = fopen (eff_restore_file, "rb"); if (fp == NULL) { event_log_error (hashcat_ctx, "Restore file '%s': %s", eff_restore_file, strerror (errno)); return -1; } restore_data_t *rd = restore_ctx->rd; if (fread (rd, sizeof (restore_data_t), 1, fp) != 1) { event_log_error (hashcat_ctx, "Cannot read %s", eff_restore_file); fclose (fp); return -1; } // we only use these 2 checks to avoid "tainted string" warnings if (rd->argc < 1) { event_log_error (hashcat_ctx, "Unusually low number of arguments (argc) within restore file %s", eff_restore_file); fclose (fp); return -1; } if (rd->argc > 250) // some upper bound check is always good (with some dirs/dicts it could be a large string) { event_log_error (hashcat_ctx, "Unusually high number of arguments (argc) within restore file %s", eff_restore_file); fclose (fp); return -1; } rd->argv = (char **) hccalloc (rd->argc, sizeof (char *)); char *buf = (char *) hcmalloc (HCBUFSIZ_LARGE); for (u32 i = 0; i < rd->argc; i++) { if (fgets (buf, HCBUFSIZ_LARGE - 1, fp) == NULL) { event_log_error (hashcat_ctx, "Cannot read %s", eff_restore_file); fclose (fp); return -1; } size_t len = strlen (buf); if (len) buf[len - 1] = 0; rd->argv[i] = hcstrdup (buf); } hcfree (buf); fclose (fp); if (hc_path_exist (rd->cwd) == false) { event_log_error (hashcat_ctx, "%s: %s", rd->cwd, strerror (errno)); return -1; } if (hc_path_is_directory (rd->cwd) == false) { event_log_error (hashcat_ctx, "%s: %s", rd->cwd, strerror (errno)); return -1; } if (strncmp (rd->cwd, folder_config->cwd, sizeof (rd->cwd)) != 0) // check if we need to change the current working directory { event_log_warning (hashcat_ctx, "Changing current working directory to '%s'", rd->cwd); event_log_warning (hashcat_ctx, NULL); if (chdir (rd->cwd)) { event_log_error (hashcat_ctx, "Directory '%s' needed to restore the session was not found.", rd->cwd); event_log_warning (hashcat_ctx, "Either create the directory, or update the directory within the .restore file."); event_log_warning (hashcat_ctx, "Restore files can be analyzed and modified with analyze_hc_restore.pl:"); event_log_warning (hashcat_ctx, " https://github.com/philsmd/analyze_hc_restore"); event_log_warning (hashcat_ctx, "Directory must contain all files and folders from the original command line."); event_log_warning (hashcat_ctx, NULL); return -1; } // if we are here, we also need to update the folder_config and .pid file: /** * updated folders */ // copy the paths of INSTALL_FOLDER and SHARED_FOLDER from the folder config: char *install_folder = hcstrdup (folder_config->install_dir); char *shared_folder = hcstrdup (folder_config->shared_dir); folder_config_destroy (hashcat_ctx); const int rc_folder_config_init = folder_config_init (hashcat_ctx, install_folder, shared_folder); hcfree (install_folder); hcfree (shared_folder); if (rc_folder_config_init == -1) return -1; /** * updated pidfile */ pidfile_ctx_destroy (hashcat_ctx); const int rc_pidfile_init = pidfile_ctx_init (hashcat_ctx); if (rc_pidfile_init == -1) return -1; } return 0; } static int write_restore (hashcat_ctx_t *hashcat_ctx) { const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; const restore_ctx_t *restore_ctx = hashcat_ctx->restore_ctx; const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; if (restore_ctx->enabled == false) return 0; restore_data_t *rd = restore_ctx->rd; rd->masks_pos = mask_ctx->masks_pos; rd->dicts_pos = straight_ctx->dicts_pos; rd->words_cur = status_ctx->words_cur; char *new_restore_file = restore_ctx->new_restore_file; FILE *fp = fopen (new_restore_file, "wb"); if (fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", new_restore_file, strerror (errno)); return -1; } if (setvbuf (fp, NULL, _IONBF, 0)) { event_log_error (hashcat_ctx, "setvbuf file '%s': %s", new_restore_file, strerror (errno)); fclose (fp); return -1; } hc_fwrite (rd, sizeof (restore_data_t), 1, fp); for (u32 i = 0; i < rd->argc; i++) { fprintf (fp, "%s", rd->argv[i]); fputc ('\n', fp); } fflush (fp); fsync (fileno (fp)); fclose (fp); rd->masks_pos = 0; rd->dicts_pos = 0; rd->words_cur = 0; return 0; } int cycle_restore (hashcat_ctx_t *hashcat_ctx) { restore_ctx_t *restore_ctx = hashcat_ctx->restore_ctx; if (restore_ctx->enabled == false) return 0; const char *eff_restore_file = restore_ctx->eff_restore_file; const char *new_restore_file = restore_ctx->new_restore_file; const int rc_write_restore = write_restore (hashcat_ctx); if (rc_write_restore == -1) return -1; if (hc_path_exist (eff_restore_file) == true) { if (unlink (eff_restore_file) == -1) { event_log_warning (hashcat_ctx, "Unlink file '%s': %s", eff_restore_file, strerror (errno)); } } if (rename (new_restore_file, eff_restore_file) == -1) { event_log_warning (hashcat_ctx, "Rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno)); } return 0; } void unlink_restore (hashcat_ctx_t *hashcat_ctx) { restore_ctx_t *restore_ctx = hashcat_ctx->restore_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; if (restore_ctx->enabled == false) return; if ((status_ctx->devices_status == STATUS_EXHAUSTED) && (status_ctx->run_thread_level1 == true)) // this is to check for [c]heckpoint { unlink (restore_ctx->eff_restore_file); unlink (restore_ctx->new_restore_file); } if (status_ctx->devices_status == STATUS_CRACKED) { unlink (restore_ctx->eff_restore_file); unlink (restore_ctx->new_restore_file); } } int restore_ctx_init (hashcat_ctx_t *hashcat_ctx, int argc, char **argv) { folder_config_t *folder_config = hashcat_ctx->folder_config; restore_ctx_t *restore_ctx = hashcat_ctx->restore_ctx; user_options_t *user_options = hashcat_ctx->user_options; restore_ctx->enabled = false; if (user_options->benchmark == true) return 0; if (user_options->example_hashes == true) return 0; if (user_options->keyspace == true) return 0; if (user_options->left == true) return 0; if (user_options->opencl_info == true) return 0; if (user_options->show == true) return 0; if (user_options->stdout_flag == true) return 0; if (user_options->speed_only == true) return 0; if (user_options->progress_only == true) return 0; if (user_options->usage == true) return 0; if (user_options->version == true) return 0; if (user_options->restore_disable == true) return 0; if (argc == 0) return 0; if (argv == NULL) return 0; if (user_options->restore_file_path == NULL) { hc_asprintf (&restore_ctx->eff_restore_file, "%s/%s.restore", folder_config->session_dir, user_options->session); hc_asprintf (&restore_ctx->new_restore_file, "%s/%s.restore.new", folder_config->session_dir, user_options->session); } else { restore_ctx->eff_restore_file = hcstrdup (user_options->restore_file_path); hc_asprintf (&restore_ctx->new_restore_file, "%s.new", user_options->restore_file_path); } restore_ctx->argc = argc; restore_ctx->argv = argv; const int rc_init_restore = init_restore (hashcat_ctx); if (rc_init_restore == -1) return -1; restore_ctx->enabled = true; if (user_options->restore == true) { const int rc_read_restore = read_restore (hashcat_ctx); if (rc_read_restore == -1) return -1; restore_data_t *rd = restore_ctx->rd; if (rd->version < RESTORE_VERSION_MIN) { event_log_error (hashcat_ctx, "Incompatible restore-file version."); return -1; } user_options_init (hashcat_ctx); const int rc_options_getopt = user_options_getopt (hashcat_ctx, rd->argc, rd->argv); if (rc_options_getopt == -1) return -1; } return 0; } void restore_ctx_destroy (hashcat_ctx_t *hashcat_ctx) { restore_ctx_t *restore_ctx = hashcat_ctx->restore_ctx; if (restore_ctx->enabled == false) return; hcfree (restore_ctx->eff_restore_file); hcfree (restore_ctx->new_restore_file); hcfree (restore_ctx->rd); memset (restore_ctx, 0, sizeof (restore_ctx_t)); } hashcat-4.0.1/src/rp.c000066400000000000000000000535571320027462700145250ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "shared.h" #include "filehandling.h" #include "rp.h" #include "rp_cpu.h" 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, }; 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, RULE_OP_MANGLE_TITLE_SEP }; 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_pos[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B' }; bool class_num (const u8 c) { return ((c >= '0') && (c <= '9')); } bool class_lower (const u8 c) { return ((c >= 'a') && (c <= 'z')); } bool class_upper (const u8 c) { return ((c >= 'A') && (c <= 'Z')); } bool class_alpha (const u8 c) { return (class_lower (c) || class_upper (c)); } int conv_ctoi (const u8 c) { if (class_num (c)) return c - '0'; if (class_upper (c)) return c - 'A' + 10; return -1; } int conv_itoc (const u8 c) { if (c < 10) return c + '0'; if (c < 37) return c + 'A' - 10; return -1; } int generate_random_rule (char rule_buf[RP_RULE_SIZE], const u32 rp_gen_func_min, const u32 rp_gen_func_max) { u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max); u32 j; u32 rule_pos = 0; for (j = 0; j < rp_gen_num; j++) { u32 r = 0; u32 p1 = 0; u32 p2 = 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; } } return (rule_pos); } #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 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_kernel_rule (char *rule_buf, u32 rule_len, kernel_rule_t *rule) { u32 rule_pos; u32 rule_cnt; for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_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: SET_NAME (rule, rule_buf[rule_pos]); SET_P0 (rule, rule_buf[rule_pos]); break; case RULE_OP_MANGLE_TOGGLECASE_REC: return -1; 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; case RULE_OP_MANGLE_TITLE_SEP: SET_NAME (rule, rule_buf[rule_pos]); SET_P0 (rule, rule_buf[rule_pos]); break; default: return -1; } } if (rule_pos < rule_len) return -1; return 0; } int kernel_rule_to_cpu_rule (char *rule_buf, kernel_rule_t *rule) { u32 rule_cnt; u32 rule_pos; u32 rule_len = HCBUFSIZ_LARGE - 1; // maximum possible len for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++) { char rule_cmd; 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: rule_buf[rule_pos] = rule_cmd; GET_P0 (rule); break; case RULE_OP_MANGLE_TOGGLECASE_REC: return -1; 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 RULE_OP_MANGLE_TITLE_SEP: rule_buf[rule_pos] = rule_cmd; GET_P0 (rule); break; case 0: if (rule_pos == 0) return -1; return rule_pos - 1; default: return -1; } } return rule_pos; } bool kernel_rules_has_noop (const kernel_rule_t *kernel_rules_buf, const u32 kernel_rules_cnt) { for (u32 kernel_rules_pos = 0; kernel_rules_pos < kernel_rules_cnt; kernel_rules_pos++) { if (kernel_rules_buf[kernel_rules_pos].cmds[0] != RULE_OP_MANGLE_NOOP) continue; if (kernel_rules_buf[kernel_rules_pos].cmds[1] != 0) continue; return true; } return false; } int kernel_rules_load (hashcat_ctx_t *hashcat_ctx, kernel_rule_t **out_buf, u32 *out_cnt) { const user_options_t *user_options = hashcat_ctx->user_options; /** * load rules */ u32 *all_kernel_rules_cnt = NULL; kernel_rule_t **all_kernel_rules_buf = NULL; if (user_options->rp_files_cnt) { all_kernel_rules_cnt = (u32 *) hccalloc (user_options->rp_files_cnt, sizeof (u32)); all_kernel_rules_buf = (kernel_rule_t **) hccalloc (user_options->rp_files_cnt, sizeof (kernel_rule_t *)); } char *rule_buf = (char *) hcmalloc (HCBUFSIZ_LARGE); int rule_len = 0; for (u32 i = 0; i < user_options->rp_files_cnt; i++) { u32 kernel_rules_avail = 0; u32 kernel_rules_cnt = 0; kernel_rule_t *kernel_rules_buf = NULL; char *rp_file = user_options->rp_files[i]; FILE *fp = NULL; u32 rule_line = 0; if ((fp = fopen (rp_file, "rb")) == NULL) { event_log_error (hashcat_ctx, "%s: %s", rp_file, strerror (errno)); hcfree (all_kernel_rules_cnt); hcfree (all_kernel_rules_buf); hcfree (rule_buf); return -1; } while (!feof (fp)) { rule_len = fgetl (fp, rule_buf); rule_line++; if (rule_len == 0) continue; if (rule_buf[0] == '#') continue; if (kernel_rules_avail == kernel_rules_cnt) { kernel_rules_buf = (kernel_rule_t *) hcrealloc (kernel_rules_buf, kernel_rules_avail * sizeof (kernel_rule_t), INCR_RULES * sizeof (kernel_rule_t)); kernel_rules_avail += INCR_RULES; } char in[RP_PASSWORD_SIZE]; char out[RP_PASSWORD_SIZE]; memset (in, 0, sizeof (in)); memset (out, 0, sizeof (out)); int result = _old_apply_rule (rule_buf, rule_len, in, 1, out); if (result == -1) { event_log_warning (hashcat_ctx, "Skipping invalid or unsupported rule in file %s on line %u: %s", rp_file, rule_line, rule_buf); continue; } if (cpu_rule_to_kernel_rule (rule_buf, rule_len, &kernel_rules_buf[kernel_rules_cnt]) == -1) { event_log_warning (hashcat_ctx, "Cannot convert rule for use on OpenCL device in file %s on line %u: %s", rp_file, rule_line, rule_buf); memset (&kernel_rules_buf[kernel_rules_cnt], 0, sizeof (kernel_rule_t)); // needs to be cleared otherwise we could have some remaining data continue; } kernel_rules_cnt++; } fclose (fp); all_kernel_rules_cnt[i] = kernel_rules_cnt; all_kernel_rules_buf[i] = kernel_rules_buf; } hcfree (rule_buf); /** * merge rules */ u32 kernel_rules_cnt = 1; u32 *repeats = (u32 *) hccalloc (user_options->rp_files_cnt + 1, sizeof (u32)); repeats[0] = kernel_rules_cnt; for (u32 i = 0; i < user_options->rp_files_cnt; i++) { kernel_rules_cnt *= all_kernel_rules_cnt[i]; repeats[i + 1] = kernel_rules_cnt; } kernel_rule_t *kernel_rules_buf = (kernel_rule_t *) hccalloc (kernel_rules_cnt, sizeof (kernel_rule_t)); for (u32 i = 0; i < kernel_rules_cnt; i++) { u32 out_pos = 0; kernel_rule_t *out = &kernel_rules_buf[i]; for (u32 j = 0; j < user_options->rp_files_cnt; j++) { u32 in_off = (i / repeats[j]) % all_kernel_rules_cnt[j]; u32 in_pos; kernel_rule_t *in = &all_kernel_rules_buf[j][in_off]; for (in_pos = 0; in->cmds[in_pos]; in_pos++, out_pos++) { if (out_pos == RULES_MAX - 1) { // event_log_warning (hashcat_ctx, "Truncated chaining of rule %d and rule %d - maximum functions per rule exceeded.", i, in_off); break; } out->cmds[out_pos] = in->cmds[in_pos]; } } } hcfree (repeats); hcfree (all_kernel_rules_cnt); hcfree (all_kernel_rules_buf); if (kernel_rules_cnt == 0) { event_log_error (hashcat_ctx, "No valid rules left."); hcfree (kernel_rules_buf); return -1; } *out_cnt = kernel_rules_cnt; *out_buf = kernel_rules_buf; return 0; } int kernel_rules_generate (hashcat_ctx_t *hashcat_ctx, kernel_rule_t **out_buf, u32 *out_cnt) { const user_options_t *user_options = hashcat_ctx->user_options; u32 kernel_rules_cnt = 0; kernel_rule_t *kernel_rules_buf = hccalloc (user_options->rp_gen, sizeof (kernel_rule_t)); char *rule_buf = (char *) hcmalloc (RP_RULE_SIZE); for (kernel_rules_cnt = 0; kernel_rules_cnt < user_options->rp_gen; kernel_rules_cnt++) { memset (rule_buf, 0, RP_RULE_SIZE); int rule_len = generate_random_rule (rule_buf, user_options->rp_gen_func_min, user_options->rp_gen_func_max); if (cpu_rule_to_kernel_rule (rule_buf, rule_len, &kernel_rules_buf[kernel_rules_cnt]) == -1) continue; } hcfree (rule_buf); *out_cnt = kernel_rules_cnt; *out_buf = kernel_rules_buf; return 0; } hashcat-4.0.1/src/rp_cpu.c000066400000000000000000000475771320027462700154010ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "rp.h" #include "rp_cpu.h" #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR) #define NEXT_RPTOI(r,rp,up) if (((up) = conv_pos ((r)[(rp)], pos_mem)) == -1) return (RULE_RC_SYNTAX_ERROR) static int conv_pos (const u8 c, const int pos_mem) { if (c == RULE_LAST_REJECTED_SAVED_POS) { return pos_mem; } return conv_ctoi (c); } static void MANGLE_TOGGLE_AT (char *arr, const int pos) { if (class_alpha (arr[pos])) arr[pos] ^= 0x20; } static void MANGLE_LOWER_AT (char *arr, const int pos) { if (class_upper (arr[pos])) arr[pos] ^= 0x20; } static void MANGLE_UPPER_AT (char *arr, const int pos) { if (class_lower (arr[pos])) arr[pos] ^= 0x20; } static void MANGLE_SWITCH (char *arr, const int l, const int r) { char c = arr[r]; arr[r] = arr[l]; arr[l] = c; } static int mangle_lrest (char arr[RP_PASSWORD_SIZE], int arr_len) { int pos; for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos); return (arr_len); } static int mangle_urest (char arr[RP_PASSWORD_SIZE], int arr_len) { int pos; for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos); return (arr_len); } static int mangle_trest (char arr[RP_PASSWORD_SIZE], int arr_len) { int pos; for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos); return (arr_len); } static int mangle_reverse (char arr[RP_PASSWORD_SIZE], int arr_len) { int l; for (l = 0; l < arr_len; l++) { int r = arr_len - 1 - l; if (l >= r) break; MANGLE_SWITCH (arr, l, r); } return (arr_len); } static int mangle_double (char arr[RP_PASSWORD_SIZE], int arr_len) { if ((arr_len * 2) >= RP_PASSWORD_SIZE) return (arr_len); memcpy (&arr[arr_len], arr, (size_t) arr_len); return (arr_len * 2); } static int mangle_double_times (char arr[RP_PASSWORD_SIZE], int arr_len, int times) { if (((arr_len * times) + arr_len) >= RP_PASSWORD_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); } static int mangle_reflect (char arr[RP_PASSWORD_SIZE], int arr_len) { if ((arr_len * 2) >= RP_PASSWORD_SIZE) return (arr_len); mangle_double (arr, arr_len); mangle_reverse (arr + arr_len, arr_len); return (arr_len * 2); } static int mangle_rotate_left (char arr[RP_PASSWORD_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); } static int mangle_rotate_right (char arr[RP_PASSWORD_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); } static int mangle_append (char arr[RP_PASSWORD_SIZE], int arr_len, char c) { if ((arr_len + 1) >= RP_PASSWORD_SIZE) return (arr_len); arr[arr_len] = c; return (arr_len + 1); } static int mangle_prepend (char arr[RP_PASSWORD_SIZE], int arr_len, char c) { if ((arr_len + 1) >= RP_PASSWORD_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); } static int mangle_delete_at (char arr[RP_PASSWORD_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); } static int mangle_extract (char arr[RP_PASSWORD_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); } static int mangle_omit (char arr[RP_PASSWORD_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); } static int mangle_insert (char arr[RP_PASSWORD_SIZE], int arr_len, int upos, char c) { if (upos > arr_len) return (arr_len); if ((arr_len + 1) >= RP_PASSWORD_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); } static int mangle_insert_multi (char arr[RP_PASSWORD_SIZE], int arr_len, int arr_pos, char arr2[RP_PASSWORD_SIZE], int arr2_len, int arr2_pos, int arr2_cpy) { if ((arr_len + arr2_cpy) > RP_PASSWORD_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); memmove (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); } static int mangle_overstrike (char arr[RP_PASSWORD_SIZE], int arr_len, int upos, char c) { if (upos >= arr_len) return (arr_len); arr[upos] = c; return (arr_len); } static int mangle_truncate_at (char arr[RP_PASSWORD_SIZE], int arr_len, int upos) { if (upos >= arr_len) return (arr_len); memset (arr + upos, 0, arr_len - upos); return (upos); } static int mangle_replace (char arr[RP_PASSWORD_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); } static int mangle_purgechar (char arr[RP_PASSWORD_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); } static int mangle_dupeblock_prepend (char arr[RP_PASSWORD_SIZE], int arr_len, int ulen) { if (ulen > arr_len) return (arr_len); if ((arr_len + ulen) >= RP_PASSWORD_SIZE) return (arr_len); char cs[100] = { 0 }; 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); } static int mangle_dupeblock_append (char arr[RP_PASSWORD_SIZE], int arr_len, int ulen) { if (ulen > arr_len) return (arr_len); if ((arr_len + ulen) >= RP_PASSWORD_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); } static int mangle_dupechar_at (char arr[RP_PASSWORD_SIZE], int arr_len, int upos, int ulen) { if ( arr_len == 0) return (arr_len); if ((arr_len + ulen) >= RP_PASSWORD_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); } static int mangle_dupechar (char arr[RP_PASSWORD_SIZE], int arr_len) { if ( arr_len == 0) return (arr_len); if ((arr_len + arr_len) >= RP_PASSWORD_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); } static int mangle_switch_at_check (char arr[RP_PASSWORD_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); } static int mangle_switch_at (char arr[RP_PASSWORD_SIZE], int arr_len, int upos, int upos2) { MANGLE_SWITCH (arr, upos, upos2); return (arr_len); } static int mangle_chr_shiftl (char arr[RP_PASSWORD_SIZE], int arr_len, int upos) { if (upos >= arr_len) return (arr_len); arr[upos] <<= 1; return (arr_len); } static int mangle_chr_shiftr (char arr[RP_PASSWORD_SIZE], int arr_len, int upos) { if (upos >= arr_len) return (arr_len); arr[upos] >>= 1; return (arr_len); } static int mangle_chr_incr (char arr[RP_PASSWORD_SIZE], int arr_len, int upos) { if (upos >= arr_len) return (arr_len); arr[upos] += 1; return (arr_len); } static int mangle_chr_decr (char arr[RP_PASSWORD_SIZE], int arr_len, int upos) { if (upos >= arr_len) return (arr_len); arr[upos] -= 1; return (arr_len); } static int mangle_title_sep (char arr[RP_PASSWORD_SIZE], int arr_len, char c) { int upper_next = 1; int pos; for (pos = 0; pos < arr_len; pos++) { if (arr[pos] == c) { 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 _old_apply_rule (char *rule, int rule_len, char in[RP_PASSWORD_SIZE], int in_len, char out[RP_PASSWORD_SIZE]) { char mem[RP_PASSWORD_SIZE] = { 0 }; int pos_mem = -1; if (in == NULL) return (RULE_RC_REJECT_ERROR); if (out == NULL) return (RULE_RC_REJECT_ERROR); if (in_len < 0 || in_len > RP_PASSWORD_SIZE) 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, 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 (out, out_len, upos); break; case RULE_OP_MANGLE_CHR_SHIFTR: NEXT_RULEPOS (rule_pos); NEXT_RPTOI (rule, rule_pos, upos); mangle_chr_shiftr (out, out_len, upos); break; case RULE_OP_MANGLE_CHR_INCR: NEXT_RULEPOS (rule_pos); NEXT_RPTOI (rule, rule_pos, upos); mangle_chr_incr (out, out_len, upos); break; case RULE_OP_MANGLE_CHR_DECR: NEXT_RULEPOS (rule_pos); NEXT_RPTOI (rule, rule_pos, upos); mangle_chr_decr (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_SEP: NEXT_RULEPOS (rule_pos); out_len = mangle_title_sep (out, out_len, rule[rule_pos]); break; case RULE_OP_MANGLE_TITLE: out_len = mangle_title_sep (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) >= RP_PASSWORD_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) >= RP_PASSWORD_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_EQUAL: 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); char *match = strchr (out, rule[rule_pos]); if (match != NULL) { pos_mem = (int)(match - out); } else { 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 && cnt < upos; c++) { if (out[c] == rule[rule_pos]) { cnt++; pos_mem = c; } } 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); } } memset (out + out_len, 0, RP_PASSWORD_SIZE - out_len); return (out_len); } int run_rule_engine (const int rule_len, const char *rule_buf) { if (rule_len == 0) return 0; if (rule_len == 1) if (rule_buf[0] == RULE_OP_MANGLE_NOOP) return 0; return 1; } hashcat-4.0.1/src/rp_kernel_on_cpu.c000066400000000000000000000465261320027462700174260ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "bitops.h" #include "rp.h" #include "rp_kernel_on_cpu.h" static u64 hl32_to_64 (const u32 a, const u32 b) { return (((u64) a) << 32) | b; } static u32 l32_from_64_S (u64 a) { const u32 r = (u32) (a); return r; } static u32 h32_from_64_S (u64 a) { a >>= 32; const u32 r = (u32) (a); return r; } static u32 generate_cmask (const u32 value) { const u32 rmask = ((value & 0x40404040u) >> 1u) & ~((value & 0x80808080u) >> 2u); const u32 hmask = (value & 0x1f1f1f1fu) + 0x05050505u; const u32 lmask = (value & 0x1f1f1f1fu) + 0x1f1f1f1fu; return rmask & ~hmask & lmask; } static void append_four_byte (const u32 *buf_src, const int off_src, u32 *buf_dst, const int off_dst) { const int sd = off_src / 4; const int sm = off_src & 3; const int sm8 = sm * 8; const int dd = off_dst / 4; const int dm = off_dst & 3; const int dm8 = dm * 8; u64 t64 = hl32_to_64 (buf_src[sd + 1], buf_src[sd + 0]); t64 >>= sm8; t64 <<= dm8; const u32 t0 = l32_from_64_S (t64); const u32 t1 = h32_from_64_S (t64); buf_dst[dd + 0] |= t0; buf_dst[dd + 1] |= t1; } static void append_three_byte (const u32 *buf_src, const int off_src, u32 *buf_dst, const int off_dst) { const int sd = off_src / 4; const int sm = off_src & 3; const int sm8 = sm * 8; const int dd = off_dst / 4; const int dm = off_dst & 3; const int dm8 = dm * 8; u64 t64 = hl32_to_64 (buf_src[sd + 1], buf_src[sd + 0]); t64 >>= sm8; t64 &= 0x00ffffff; t64 <<= dm8; const u32 t0 = l32_from_64_S (t64); const u32 t1 = h32_from_64_S (t64); buf_dst[dd + 0] |= t0; buf_dst[dd + 1] |= t1; } static void append_two_byte (const u32 *buf_src, const int off_src, u32 *buf_dst, const int off_dst) { const int sd = off_src / 4; const int sm = off_src & 3; const int sm8 = sm * 8; const int dd = off_dst / 4; const int dm = off_dst & 3; const int dm8 = dm * 8; u64 t64 = hl32_to_64 (buf_src[sd + 1], buf_src[sd + 0]); t64 >>= sm8; t64 &= 0x0000ffff; t64 <<= dm8; const u32 t0 = l32_from_64_S (t64); const u32 t1 = h32_from_64_S (t64); buf_dst[dd + 0] |= t0; buf_dst[dd + 1] |= t1; } static void append_one_byte (const u32 *buf_src, const int off_src, u32 *buf_dst, const int off_dst) { const int sd = off_src / 4; const int sm = off_src & 3; const int sm8 = sm * 8; const int dd = off_dst / 4; const int dm = off_dst & 3; const int dm8 = dm * 8; u32 t = buf_src[sd]; t >>= sm8; t &= 0xff; t <<= dm8; buf_dst[dd] |= t; } static void append_block (const u32 *buf_src, const int off_src, u32 *buf_dst, const int off_dst, const int len) { int i; for (i = 0; i < len - 4; i += 4) { append_four_byte (buf_src, off_src + i, buf_dst, off_dst + i); } const int left = len - i; switch (left) { case 4: append_four_byte (buf_src, off_src + i, buf_dst, off_dst + i); break; case 3: append_three_byte (buf_src, off_src + i, buf_dst, off_dst + i); break; case 2: append_two_byte (buf_src, off_src + i, buf_dst, off_dst + i); break; case 1: append_one_byte (buf_src, off_src + i, buf_dst, off_dst + i); break; } } static void exchange_byte (u32 *buf, const int off_src, const int off_dst) { u8 *ptr = (u8 *) buf; const u8 tmp = ptr[off_src]; ptr[off_src] = ptr[off_dst]; ptr[off_dst] = tmp; /* something tells me we do this faster const int sd = off_src / 4; const int sm = off_src & 3; const int sm8 = sm * 8; const int dd = off_dst / 4; const int dm = off_dst & 3; const int dm8 = dm * 8; u32 ts = buf[sd]; u32 td = buf[dd]; ts >>= sm8; td >>= dm8; ts &= 0xff; td &= 0xff; const u32 x = ts ^ td; const u32 xs = x << sm8; const u32 xd = x << dm8; buf[sd] ^= xs; buf[dd] ^= xd; */ } static int mangle_lrest (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { for (int i = 0, idx = 0; i < len; i += 4, idx += 1) { const u32 t = buf[idx]; buf[idx] = t | generate_cmask (t); } return (len); } static int mangle_lrest_ufirst (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { for (int i = 0, idx = 0; i < len; i += 4, idx += 1) { const u32 t = buf[idx]; buf[idx] = t | generate_cmask (t); } const u32 t = buf[0]; buf[0] = t & ~(0x00000020 & generate_cmask (t)); return (len); } static int mangle_urest (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { for (int i = 0, idx = 0; i < len; i += 4, idx += 1) { const u32 t = buf[idx]; buf[idx] = t & ~(generate_cmask (t)); } return (len); } static int mangle_urest_lfirst (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { for (int i = 0, idx = 0; i < len; i += 4, idx += 1) { const u32 t = buf[idx]; buf[idx] = t & ~(generate_cmask (t)); } const u32 t = buf[0]; buf[0] = t | (0x00000020 & generate_cmask (t)); return (len); } static int mangle_trest (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { for (int i = 0, idx = 0; i < len; i += 4, idx += 1) { const u32 t = buf[idx]; buf[idx] = t ^ generate_cmask (t); } return (len); } static int mangle_toggle_at (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { if (p0 >= len) return (len); const u8 p0d = p0 / 4; const u8 p0m = p0 & 3; const u32 tmp = 0x20u << (p0m * 8); const u32 t = buf[p0d]; buf[p0d] = t ^ (generate_cmask (t) & tmp); return (len); } static int mangle_reverse (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { for (int l = 0; l < len / 2; l++) { const int r = len - 1 - l; exchange_byte (buf, l, r); } return (len); } static int mangle_dupeword (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { const int out_len = len * 2; if (out_len >= RP_PASSWORD_SIZE) return (len); append_block (buf, 0, buf, len, len); return (out_len); } static int mangle_dupeword_times (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { const int out_len = (len * p0) + len; if (out_len >= RP_PASSWORD_SIZE) return (len); u8 *out = buf + len; for (int t = 0; t < p0; t++) for (int i = 0; i < len; i++) *out++ = *buf++; return (out_len); } static int mangle_reflect (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { const int out_len = len * 2; if (out_len >= RP_PASSWORD_SIZE) return (len); append_block (buf, 0, buf, len, len); for (int l = 0; l < len / 2; l++) { const int r = len - 1 - l; exchange_byte (buf, len + l, len + r); } return out_len; } static int mangle_append (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { const int out_len = len + 1; if (out_len >= RP_PASSWORD_SIZE) return (len); buf[len] = p0; return (out_len); } static int mangle_prepend (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { const int out_len = len + 1; if (out_len >= RP_PASSWORD_SIZE) return (len); for (int pos = len - 1; pos >= 0; pos--) { buf[pos + 1] = buf[pos]; } buf[0] = p0; return (out_len); } static int mangle_rotate_left (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { for (int l = 0, r = len - 1; r > l; r--) { exchange_byte (buf, l, r); } return (len); } static int mangle_rotate_right (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { for (int l = 0, r = len - 1; l < r; l++) { exchange_byte (buf, l, r); } return (len); } static int mangle_delete_at (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); for (int pos = p0; pos < len - 1; pos++) { buf[pos] = buf[pos + 1]; } buf[len - 1] = 0; return (len - 1); } static int mangle_delete_first (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { return mangle_delete_at (0, p1, buf, len); } static int mangle_delete_last (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (len == 0) return 0; return mangle_delete_at (len - 1, p1, buf, len); } static int mangle_extract (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); if ((p0 + p1) > len) return (len); for (int pos = 0; pos < p1; pos++) { buf[pos] = buf[p0 + pos]; } for (int pos = p1; pos < len; pos++) { buf[pos] = 0; } return (p1); } static int mangle_omit (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); if ((p0 + p1) > len) return (len); for (int pos = p0; pos < len - p1; pos++) { buf[pos] = buf[pos + p1]; } for (int pos = len - p1; pos < len; pos++) { buf[pos] = 0; } return (len - p1); } static int mangle_insert (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len + 1) return (len); const int out_len = len + 1; if (out_len >= RP_PASSWORD_SIZE) return (len); for (int pos = len - 1; pos > p0 - 1; pos--) { buf[pos + 1] = buf[pos]; } buf[p0] = p1; return (out_len); } static int mangle_overstrike (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); buf[p0] = p1; return (len); } static int mangle_truncate_at (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); for (int pos = p0; pos < len; pos++) { buf[pos] = 0; } return (p0); } static int mangle_replace (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { for (int pos = 0; pos < len; pos++) { if (buf[pos] != p0) continue; buf[pos] = p1; } return (len); } static int mangle_purgechar (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { int out_len = 0; for (int pos = 0; pos < len; pos++) { if (buf[pos] == p0) continue; buf[out_len] = buf[pos]; out_len++; } for (int pos = out_len; pos < len; pos++) { buf[pos] = 0; } return (out_len); } static int mangle_dupechar_first (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { const int out_len = len + p0; if (out_len >= RP_PASSWORD_SIZE) return (len); const u8 c = buf[0]; for (int i = 0; i < p0; i++) { mangle_prepend (c, 0, buf, len + i); } return (out_len); } static int mangle_dupechar_last (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { const int out_len = len + p0; if (len == 0) return (len); if (out_len >= RP_PASSWORD_SIZE) return (len); const u8 c = buf[len - 1]; for (int i = 0; i < p0; i++) { mangle_append (c, 0, buf, len + i); } return (out_len); } static int mangle_dupechar_all (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { const int out_len = len + len; if (out_len >= RP_PASSWORD_SIZE) return (len); for (int pos = len - 1; pos >= 0; pos--) { int new_pos = pos * 2; buf[new_pos] = buf[pos]; buf[new_pos + 1] = buf[pos]; } return (out_len); } static int mangle_switch_first (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { if (len < 2) return (len); exchange_byte (buf, 0, 1); return (len); } static int mangle_switch_last (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { if (len < 2) return (len); exchange_byte (buf, len - 2, len - 1); return (len); } static int mangle_switch_at (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { if (p0 >= len) return (len); if (p1 >= len) return (len); exchange_byte (buf, p0, p1); return (len); } static int mangle_chr_shiftl (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); buf[p0] <<= 1; return (len); } static int mangle_chr_shiftr (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); buf[p0] >>= 1; return (len); } static int mangle_chr_incr (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); buf[p0]++; return (len); } static int mangle_chr_decr (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); buf[p0]--; return (len); } static int mangle_replace_np1 (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if ((p0 + 1) >= len) return (len); buf[p0] = buf[p0 + 1]; return (len); } static int mangle_replace_nm1 (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 == 0) return (len); if (p0 >= len) return (len); buf[p0] = buf[p0 - 1]; return (len); } static int mangle_dupeblock_first (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); const int out_len = len + p0; if (out_len >= RP_PASSWORD_SIZE) return (len); for (int i = 0; i < p0; i++) { const u8 c = buf[i * 2]; mangle_insert (i, c, buf, len + i); } return (out_len); } static int mangle_dupeblock_last (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u8 *buf, const int len) { if (p0 >= len) return (len); const int out_len = len + p0; if (out_len >= RP_PASSWORD_SIZE) return (len); for (int i = 0; i < p0; i++) { const u8 c = buf[len - p0 + i]; mangle_append (c, 0, buf, len + i); } return (out_len); } static int mangle_title_sep (MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int len) { if ((len + 4) >= RP_PASSWORD_SIZE) return (len); // cheap way to not need to check for overflow of i + 1 mangle_lrest_ufirst (0, 0, buf, len); for (int i = 0, idx = 0; i < len; i += 4, idx += 1) { const u32 v = buf[idx]; u32 out0 = 0; u32 out1 = 0; if (((v >> 0) & 0xff) == p0) out0 |= 0x0000ff00; if (((v >> 8) & 0xff) == p0) out0 |= 0x00ff0000; if (((v >> 16) & 0xff) == p0) out0 |= 0xff000000; if (((v >> 24) & 0xff) == p0) out1 |= 0x000000ff; buf[idx + 0] &= ~(generate_cmask (buf[idx + 0]) & out0); buf[idx + 1] &= ~(generate_cmask (buf[idx + 1]) & out1); } return (len); } static int apply_rule (const u32 name, MAYBE_UNUSED const u8 p0, MAYBE_UNUSED const u8 p1, u32 *buf, const int in_len) { int out_len = in_len; switch (name) { case RULE_OP_MANGLE_LREST: out_len = mangle_lrest (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_LREST_UFIRST: out_len = mangle_lrest_ufirst (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_UREST: out_len = mangle_urest (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_UREST_LFIRST: out_len = mangle_urest_lfirst (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_TREST: out_len = mangle_trest (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_TOGGLE_AT: out_len = mangle_toggle_at (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_REVERSE: out_len = mangle_reverse (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_DUPEWORD: out_len = mangle_dupeword (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_DUPEWORD_TIMES: out_len = mangle_dupeword_times (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_REFLECT: out_len = mangle_reflect (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_APPEND: out_len = mangle_append (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_PREPEND: out_len = mangle_prepend (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_ROTATE_LEFT: out_len = mangle_rotate_left (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_ROTATE_RIGHT: out_len = mangle_rotate_right (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_DELETE_FIRST: out_len = mangle_delete_first (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_DELETE_LAST: out_len = mangle_delete_last (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_DELETE_AT: out_len = mangle_delete_at (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_EXTRACT: out_len = mangle_extract (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_OMIT: out_len = mangle_omit (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_INSERT: out_len = mangle_insert (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_OVERSTRIKE: out_len = mangle_overstrike (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_TRUNCATE_AT: out_len = mangle_truncate_at (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_REPLACE: out_len = mangle_replace (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_PURGECHAR: out_len = mangle_purgechar (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_DUPECHAR_FIRST: out_len = mangle_dupechar_first (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_DUPECHAR_LAST: out_len = mangle_dupechar_last (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_DUPECHAR_ALL: out_len = mangle_dupechar_all (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_SWITCH_FIRST: out_len = mangle_switch_first (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_SWITCH_LAST: out_len = mangle_switch_last (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_SWITCH_AT: out_len = mangle_switch_at (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_CHR_SHIFTL: out_len = mangle_chr_shiftl (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_CHR_SHIFTR: out_len = mangle_chr_shiftr (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_CHR_INCR: out_len = mangle_chr_incr (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_CHR_DECR: out_len = mangle_chr_decr (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_REPLACE_NP1: out_len = mangle_replace_np1 (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_REPLACE_NM1: out_len = mangle_replace_nm1 (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_DUPEBLOCK_FIRST: out_len = mangle_dupeblock_first (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_DUPEBLOCK_LAST: out_len = mangle_dupeblock_last (p0, p1, (u8 *) buf, out_len); break; case RULE_OP_MANGLE_TITLE_SEP: out_len = mangle_title_sep (p0, p1, buf, out_len); break; case RULE_OP_MANGLE_TITLE: out_len = mangle_title_sep (' ', p1, buf, out_len); break; } return out_len; } int apply_rules (const u32 *cmds, u32 *buf, const int in_len) { int out_len = in_len; for (u32 i = 0; cmds[i] != 0; i++) { const u32 cmd = cmds[i]; const u8 name = (cmd >> 0) & 0xff; const u8 p0 = (cmd >> 8) & 0xff; const u8 p1 = (cmd >> 16) & 0xff; out_len = apply_rule (name, p0, p1, buf, out_len); } return out_len; } hashcat-4.0.1/src/rp_kernel_on_cpu_optimized.c000066400000000000000000002763671320027462700215220ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "bitops.h" #include "rp.h" #include "rp_kernel_on_cpu_optimized.h" static u32 amd_bytealign_S (const u32 a, const u32 b, const u32 c) { const u64 tmp = ((((u64) (a)) << 32) | ((u64) (b))) >> ((c & 3) * 8); return (u32) tmp; } static u32 swap32_S (const u32 value) { return byte_swap_32 (value); } static u32 generate_cmask (const u32 value) { const u32 rmask = ((value & 0x40404040u) >> 1u) & ~((value & 0x80808080u) >> 2u); const u32 hmask = (value & 0x1f1f1f1fu) + 0x05050505u; const u32 lmask = (value & 0x1f1f1f1fu) + 0x1f1f1f1fu; return rmask & ~hmask & lmask; } static void truncate_right (u32 buf0[4], u32 buf1[4], const u32 offset) { const u32 tmp = (1u << ((offset & 3u) * 8u)) - 1u; switch (offset / 4) { case 0: buf0[0] &= tmp; buf0[1] = 0; buf0[2] = 0; buf0[3] = 0; buf1[0] = 0; buf1[1] = 0; buf1[2] = 0; buf1[3] = 0; break; case 1: buf0[1] &= tmp; buf0[2] = 0; buf0[3] = 0; buf1[0] = 0; buf1[1] = 0; buf1[2] = 0; buf1[3] = 0; break; case 2: buf0[2] &= tmp; buf0[3] = 0; buf1[0] = 0; buf1[1] = 0; buf1[2] = 0; buf1[3] = 0; break; case 3: buf0[3] &= tmp; buf1[0] = 0; buf1[1] = 0; buf1[2] = 0; buf1[3] = 0; break; case 4: buf1[0] &= tmp; buf1[1] = 0; buf1[2] = 0; buf1[3] = 0; break; case 5: buf1[1] &= tmp; buf1[2] = 0; buf1[3] = 0; break; case 6: buf1[2] &= tmp; buf1[3] = 0; break; case 7: buf1[3] &= tmp; break; } } static void truncate_left (u32 buf0[4], u32 buf1[4], const u32 offset) { const u32 tmp = ~((1u << ((offset & 3u) * 8u)) - 1u); switch (offset / 4) { case 0: buf0[0] &= tmp; break; case 1: buf0[0] = 0; buf0[1] &= tmp; break; case 2: buf0[0] = 0; buf0[1] = 0; buf0[2] &= tmp; break; case 3: buf0[0] = 0; buf0[1] = 0; buf0[2] = 0; buf0[3] &= tmp; break; case 4: buf0[0] = 0; buf0[1] = 0; buf0[2] = 0; buf0[3] = 0; buf1[0] &= tmp; break; case 5: buf0[0] = 0; buf0[1] = 0; buf0[2] = 0; buf0[3] = 0; buf1[0] = 0; buf1[1] &= tmp; break; case 6: buf0[0] = 0; buf0[1] = 0; buf0[2] = 0; buf0[3] = 0; buf1[0] = 0; buf1[1] = 0; buf1[2] &= tmp; break; case 7: buf0[0] = 0; buf0[1] = 0; buf0[2] = 0; buf0[3] = 0; buf1[0] = 0; buf1[1] = 0; buf1[2] = 0; buf1[3] &= tmp; break; } } static void lshift_block (const u32 in0[4], const u32 in1[4], u32 out0[4], u32 out1[4]) { out0[0] = amd_bytealign_S (in0[1], in0[0], 1); out0[1] = amd_bytealign_S (in0[2], in0[1], 1); out0[2] = amd_bytealign_S (in0[3], in0[2], 1); out0[3] = amd_bytealign_S (in1[0], in0[3], 1); out1[0] = amd_bytealign_S (in1[1], in1[0], 1); out1[1] = amd_bytealign_S (in1[2], in1[1], 1); out1[2] = amd_bytealign_S (in1[3], in1[2], 1); out1[3] = amd_bytealign_S ( 0, in1[3], 1); } static void rshift_block (const u32 in0[4], const u32 in1[4], u32 out0[4], u32 out1[4]) { out1[3] = amd_bytealign_S (in1[3], in1[2], 3); out1[2] = amd_bytealign_S (in1[2], in1[1], 3); out1[1] = amd_bytealign_S (in1[1], in1[0], 3); out1[0] = amd_bytealign_S (in1[0], in0[3], 3); out0[3] = amd_bytealign_S (in0[3], in0[2], 3); out0[2] = amd_bytealign_S (in0[2], in0[1], 3); out0[1] = amd_bytealign_S (in0[1], in0[0], 3); out0[0] = amd_bytealign_S (in0[0], 0, 3); } static void lshift_block_N (const u32 in0[4], const u32 in1[4], u32 out0[4], u32 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_S (in0[1], in0[0], 1); out0[1] = amd_bytealign_S (in0[2], in0[1], 1); out0[2] = amd_bytealign_S (in0[3], in0[2], 1); out0[3] = amd_bytealign_S (in1[0], in0[3], 1); out1[0] = amd_bytealign_S (in1[1], in1[0], 1); out1[1] = amd_bytealign_S (in1[2], in1[1], 1); out1[2] = amd_bytealign_S (in1[3], in1[2], 1); out1[3] = amd_bytealign_S ( 0, in1[3], 1); break; case 2: out0[0] = amd_bytealign_S (in0[1], in0[0], 2); out0[1] = amd_bytealign_S (in0[2], in0[1], 2); out0[2] = amd_bytealign_S (in0[3], in0[2], 2); out0[3] = amd_bytealign_S (in1[0], in0[3], 2); out1[0] = amd_bytealign_S (in1[1], in1[0], 2); out1[1] = amd_bytealign_S (in1[2], in1[1], 2); out1[2] = amd_bytealign_S (in1[3], in1[2], 2); out1[3] = amd_bytealign_S ( 0, in1[3], 2); break; case 3: out0[0] = amd_bytealign_S (in0[1], in0[0], 3); out0[1] = amd_bytealign_S (in0[2], in0[1], 3); out0[2] = amd_bytealign_S (in0[3], in0[2], 3); out0[3] = amd_bytealign_S (in1[0], in0[3], 3); out1[0] = amd_bytealign_S (in1[1], in1[0], 3); out1[1] = amd_bytealign_S (in1[2], in1[1], 3); out1[2] = amd_bytealign_S (in1[3], in1[2], 3); out1[3] = amd_bytealign_S ( 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_S (in0[2], in0[1], 1); out0[1] = amd_bytealign_S (in0[3], in0[2], 1); out0[2] = amd_bytealign_S (in1[0], in0[3], 1); out0[3] = amd_bytealign_S (in1[1], in1[0], 1); out1[0] = amd_bytealign_S (in1[2], in1[1], 1); out1[1] = amd_bytealign_S (in1[3], in1[2], 1); out1[2] = amd_bytealign_S ( 0, in1[3], 1); out1[3] = 0; break; case 6: out0[0] = amd_bytealign_S (in0[2], in0[1], 2); out0[1] = amd_bytealign_S (in0[3], in0[2], 2); out0[2] = amd_bytealign_S (in1[0], in0[3], 2); out0[3] = amd_bytealign_S (in1[1], in1[0], 2); out1[0] = amd_bytealign_S (in1[2], in1[1], 2); out1[1] = amd_bytealign_S (in1[3], in1[2], 2); out1[2] = amd_bytealign_S ( 0, in1[3], 2); out1[3] = 0; break; case 7: out0[0] = amd_bytealign_S (in0[2], in0[1], 3); out0[1] = amd_bytealign_S (in0[3], in0[2], 3); out0[2] = amd_bytealign_S (in1[0], in0[3], 3); out0[3] = amd_bytealign_S (in1[1], in1[0], 3); out1[0] = amd_bytealign_S (in1[2], in1[1], 3); out1[1] = amd_bytealign_S (in1[3], in1[2], 3); out1[2] = amd_bytealign_S ( 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_S (in0[3], in0[2], 1); out0[1] = amd_bytealign_S (in1[0], in0[3], 1); out0[2] = amd_bytealign_S (in1[1], in1[0], 1); out0[3] = amd_bytealign_S (in1[2], in1[1], 1); out1[0] = amd_bytealign_S (in1[3], in1[2], 1); out1[1] = amd_bytealign_S ( 0, in1[3], 1); out1[2] = 0; out1[3] = 0; break; case 10: out0[0] = amd_bytealign_S (in0[3], in0[2], 2); out0[1] = amd_bytealign_S (in1[0], in0[3], 2); out0[2] = amd_bytealign_S (in1[1], in1[0], 2); out0[3] = amd_bytealign_S (in1[2], in1[1], 2); out1[0] = amd_bytealign_S (in1[3], in1[2], 2); out1[1] = amd_bytealign_S ( 0, in1[3], 2); out1[2] = 0; out1[3] = 0; break; case 11: out0[0] = amd_bytealign_S (in0[3], in0[2], 3); out0[1] = amd_bytealign_S (in1[0], in0[3], 3); out0[2] = amd_bytealign_S (in1[1], in1[0], 3); out0[3] = amd_bytealign_S (in1[2], in1[1], 3); out1[0] = amd_bytealign_S (in1[3], in1[2], 3); out1[1] = amd_bytealign_S ( 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_S (in1[0], in0[3], 1); out0[1] = amd_bytealign_S (in1[1], in1[0], 1); out0[2] = amd_bytealign_S (in1[2], in1[1], 1); out0[3] = amd_bytealign_S (in1[3], in1[2], 1); out1[0] = amd_bytealign_S ( 0, in1[3], 1); out1[1] = 0; out1[2] = 0; out1[3] = 0; break; case 14: out0[0] = amd_bytealign_S (in1[0], in0[3], 2); out0[1] = amd_bytealign_S (in1[1], in1[0], 2); out0[2] = amd_bytealign_S (in1[2], in1[1], 2); out0[3] = amd_bytealign_S (in1[3], in1[2], 2); out1[0] = amd_bytealign_S ( 0, in1[3], 2); out1[1] = 0; out1[2] = 0; out1[3] = 0; break; case 15: out0[0] = amd_bytealign_S (in1[0], in0[3], 3); out0[1] = amd_bytealign_S (in1[1], in1[0], 3); out0[2] = amd_bytealign_S (in1[2], in1[1], 3); out0[3] = amd_bytealign_S (in1[3], in1[2], 3); out1[0] = amd_bytealign_S ( 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_S (in1[1], in1[0], 1); out0[1] = amd_bytealign_S (in1[2], in1[1], 1); out0[2] = amd_bytealign_S (in1[3], in1[2], 1); out0[3] = amd_bytealign_S ( 0, in1[3], 1); out1[0] = 0; out1[1] = 0; out1[2] = 0; out1[3] = 0; break; case 18: out0[0] = amd_bytealign_S (in1[1], in1[0], 2); out0[1] = amd_bytealign_S (in1[2], in1[1], 2); out0[2] = amd_bytealign_S (in1[3], in1[2], 2); out0[3] = amd_bytealign_S ( 0, in1[3], 2); out1[0] = 0; out1[1] = 0; out1[2] = 0; out1[3] = 0; break; case 19: out0[0] = amd_bytealign_S (in1[1], in1[0], 3); out0[1] = amd_bytealign_S (in1[2], in1[1], 3); out0[2] = amd_bytealign_S (in1[3], in1[2], 3); out0[3] = amd_bytealign_S ( 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_S (in1[2], in1[1], 1); out0[1] = amd_bytealign_S (in1[3], in1[2], 1); out0[2] = amd_bytealign_S ( 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_S (in1[2], in1[1], 2); out0[1] = amd_bytealign_S (in1[3], in1[2], 2); out0[2] = amd_bytealign_S ( 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_S (in1[2], in1[1], 3); out0[1] = amd_bytealign_S (in1[3], in1[2], 3); out0[2] = amd_bytealign_S ( 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_S (in1[3], in1[2], 1); out0[1] = amd_bytealign_S ( 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_S (in1[3], in1[2], 2); out0[1] = amd_bytealign_S ( 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_S (in1[3], in1[2], 3); out0[1] = amd_bytealign_S ( 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_S ( 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_S ( 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_S ( 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 u32 in0[4], const u32 in1[4], u32 out0[4], u32 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_S (in1[3], in1[2], 3); out1[2] = amd_bytealign_S (in1[2], in1[1], 3); out1[1] = amd_bytealign_S (in1[1], in1[0], 3); out1[0] = amd_bytealign_S (in1[0], in0[3], 3); out0[3] = amd_bytealign_S (in0[3], in0[2], 3); out0[2] = amd_bytealign_S (in0[2], in0[1], 3); out0[1] = amd_bytealign_S (in0[1], in0[0], 3); out0[0] = amd_bytealign_S (in0[0], 0, 3); break; case 2: out1[3] = amd_bytealign_S (in1[3], in1[2], 2); out1[2] = amd_bytealign_S (in1[2], in1[1], 2); out1[1] = amd_bytealign_S (in1[1], in1[0], 2); out1[0] = amd_bytealign_S (in1[0], in0[3], 2); out0[3] = amd_bytealign_S (in0[3], in0[2], 2); out0[2] = amd_bytealign_S (in0[2], in0[1], 2); out0[1] = amd_bytealign_S (in0[1], in0[0], 2); out0[0] = amd_bytealign_S (in0[0], 0, 2); break; case 3: out1[3] = amd_bytealign_S (in1[3], in1[2], 1); out1[2] = amd_bytealign_S (in1[2], in1[1], 1); out1[1] = amd_bytealign_S (in1[1], in1[0], 1); out1[0] = amd_bytealign_S (in1[0], in0[3], 1); out0[3] = amd_bytealign_S (in0[3], in0[2], 1); out0[2] = amd_bytealign_S (in0[2], in0[1], 1); out0[1] = amd_bytealign_S (in0[1], in0[0], 1); out0[0] = amd_bytealign_S (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_S (in1[2], in1[1], 3); out1[2] = amd_bytealign_S (in1[1], in1[0], 3); out1[1] = amd_bytealign_S (in1[0], in0[3], 3); out1[0] = amd_bytealign_S (in0[3], in0[2], 3); out0[3] = amd_bytealign_S (in0[2], in0[1], 3); out0[2] = amd_bytealign_S (in0[1], in0[0], 3); out0[1] = amd_bytealign_S (in0[0], 0, 3); out0[0] = 0; break; case 6: out1[3] = amd_bytealign_S (in1[2], in1[1], 2); out1[2] = amd_bytealign_S (in1[1], in1[0], 2); out1[1] = amd_bytealign_S (in1[0], in0[3], 2); out1[0] = amd_bytealign_S (in0[3], in0[2], 2); out0[3] = amd_bytealign_S (in0[2], in0[1], 2); out0[2] = amd_bytealign_S (in0[1], in0[0], 2); out0[1] = amd_bytealign_S (in0[0], 0, 2); out0[0] = 0; break; case 7: out1[3] = amd_bytealign_S (in1[2], in1[1], 1); out1[2] = amd_bytealign_S (in1[1], in1[0], 1); out1[1] = amd_bytealign_S (in1[0], in0[3], 1); out1[0] = amd_bytealign_S (in0[3], in0[2], 1); out0[3] = amd_bytealign_S (in0[2], in0[1], 1); out0[2] = amd_bytealign_S (in0[1], in0[0], 1); out0[1] = amd_bytealign_S (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_S (in1[1], in1[0], 3); out1[2] = amd_bytealign_S (in1[0], in0[3], 3); out1[1] = amd_bytealign_S (in0[3], in0[2], 3); out1[0] = amd_bytealign_S (in0[2], in0[1], 3); out0[3] = amd_bytealign_S (in0[1], in0[0], 3); out0[2] = amd_bytealign_S (in0[0], 0, 3); out0[1] = 0; out0[0] = 0; break; case 10: out1[3] = amd_bytealign_S (in1[1], in1[0], 2); out1[2] = amd_bytealign_S (in1[0], in0[3], 2); out1[1] = amd_bytealign_S (in0[3], in0[2], 2); out1[0] = amd_bytealign_S (in0[2], in0[1], 2); out0[3] = amd_bytealign_S (in0[1], in0[0], 2); out0[2] = amd_bytealign_S (in0[0], 0, 2); out0[1] = 0; out0[0] = 0; break; case 11: out1[3] = amd_bytealign_S (in1[1], in1[0], 1); out1[2] = amd_bytealign_S (in1[0], in0[3], 1); out1[1] = amd_bytealign_S (in0[3], in0[2], 1); out1[0] = amd_bytealign_S (in0[2], in0[1], 1); out0[3] = amd_bytealign_S (in0[1], in0[0], 1); out0[2] = amd_bytealign_S (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_S (in1[0], in0[3], 3); out1[2] = amd_bytealign_S (in0[3], in0[2], 3); out1[1] = amd_bytealign_S (in0[2], in0[1], 3); out1[0] = amd_bytealign_S (in0[1], in0[0], 3); out0[3] = amd_bytealign_S (in0[0], 0, 3); out0[2] = 0; out0[1] = 0; out0[0] = 0; break; case 14: out1[3] = amd_bytealign_S (in1[0], in0[3], 2); out1[2] = amd_bytealign_S (in0[3], in0[2], 2); out1[1] = amd_bytealign_S (in0[2], in0[1], 2); out1[0] = amd_bytealign_S (in0[1], in0[0], 2); out0[3] = amd_bytealign_S (in0[0], 0, 2); out0[2] = 0; out0[1] = 0; out0[0] = 0; break; case 15: out1[3] = amd_bytealign_S (in1[0], in0[3], 1); out1[2] = amd_bytealign_S (in0[3], in0[2], 1); out1[1] = amd_bytealign_S (in0[2], in0[1], 1); out1[0] = amd_bytealign_S (in0[1], in0[0], 1); out0[3] = amd_bytealign_S (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_S (in0[3], in0[2], 3); out1[2] = amd_bytealign_S (in0[2], in0[1], 3); out1[1] = amd_bytealign_S (in0[1], in0[0], 3); out1[0] = amd_bytealign_S (in0[0], 0, 3); out0[3] = 0; out0[2] = 0; out0[1] = 0; out0[0] = 0; break; case 18: out1[3] = amd_bytealign_S (in0[3], in0[2], 2); out1[2] = amd_bytealign_S (in0[2], in0[1], 2); out1[1] = amd_bytealign_S (in0[1], in0[0], 2); out1[0] = amd_bytealign_S (in0[0], 0, 2); out0[3] = 0; out0[2] = 0; out0[1] = 0; out0[0] = 0; break; case 19: out1[3] = amd_bytealign_S (in0[3], in0[2], 1); out1[2] = amd_bytealign_S (in0[2], in0[1], 1); out1[1] = amd_bytealign_S (in0[1], in0[0], 1); out1[0] = amd_bytealign_S (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_S (in0[2], in0[1], 3); out1[2] = amd_bytealign_S (in0[1], in0[0], 3); out1[1] = amd_bytealign_S (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_S (in0[2], in0[1], 2); out1[2] = amd_bytealign_S (in0[1], in0[0], 2); out1[1] = amd_bytealign_S (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_S (in0[2], in0[1], 1); out1[2] = amd_bytealign_S (in0[1], in0[0], 1); out1[1] = amd_bytealign_S (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_S (in0[1], in0[0], 3); out1[2] = amd_bytealign_S (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_S (in0[1], in0[0], 2); out1[2] = amd_bytealign_S (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_S (in0[1], in0[0], 1); out1[2] = amd_bytealign_S (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_S (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_S (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_S (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, u32 buf0[4], u32 buf1[4], const u32 src_r0) { // this version works with 1 byte append only const u32 value = src_r0 & 0xff; const u32 shift = (offset & 3) * 8; const u32 tmp = value << shift; buf0[0] |= (offset < 4) ? tmp : 0; buf0[1] |= ((offset >= 4) && (offset < 8)) ? tmp : 0; buf0[2] |= ((offset >= 8) && (offset < 12)) ? tmp : 0; buf0[3] |= ((offset >= 12) && (offset < 16)) ? tmp : 0; buf1[0] |= ((offset >= 16) && (offset < 20)) ? tmp : 0; buf1[1] |= ((offset >= 20) && (offset < 24)) ? tmp : 0; buf1[2] |= ((offset >= 24) && (offset < 28)) ? tmp : 0; buf1[3] |= (offset >= 28) ? tmp : 0; } static void append_block8 (const u32 offset, u32 buf0[4], u32 buf1[4], const u32 src_l0[4], const u32 src_l1[4], const u32 src_r0[4], const u32 src_r1[4]) { u32 s0 = 0; u32 s1 = 0; u32 s2 = 0; u32 s3 = 0; u32 s4 = 0; u32 s5 = 0; u32 s6 = 0; u32 s7 = 0; const u32 src_r00 = swap32_S (src_r0[0]); const u32 src_r01 = swap32_S (src_r0[1]); const u32 src_r02 = swap32_S (src_r0[2]); const u32 src_r03 = swap32_S (src_r0[3]); const u32 src_r10 = swap32_S (src_r1[0]); const u32 src_r11 = swap32_S (src_r1[1]); const u32 src_r12 = swap32_S (src_r1[2]); const u32 src_r13 = swap32_S (src_r1[3]); switch (offset / 4) { case 0: s7 = amd_bytealign_S (src_r12, src_r13, offset); s6 = amd_bytealign_S (src_r11, src_r12, offset); s5 = amd_bytealign_S (src_r10, src_r11, offset); s4 = amd_bytealign_S (src_r03, src_r10, offset); s3 = amd_bytealign_S (src_r02, src_r03, offset); s2 = amd_bytealign_S (src_r01, src_r02, offset); s1 = amd_bytealign_S (src_r00, src_r01, offset); s0 = amd_bytealign_S ( 0, src_r00, offset); break; case 1: s7 = amd_bytealign_S (src_r11, src_r12, offset); s6 = amd_bytealign_S (src_r10, src_r11, offset); s5 = amd_bytealign_S (src_r03, src_r10, offset); s4 = amd_bytealign_S (src_r02, src_r03, offset); s3 = amd_bytealign_S (src_r01, src_r02, offset); s2 = amd_bytealign_S (src_r00, src_r01, offset); s1 = amd_bytealign_S ( 0, src_r00, offset); s0 = 0; break; case 2: s7 = amd_bytealign_S (src_r10, src_r11, offset); s6 = amd_bytealign_S (src_r03, src_r10, offset); s5 = amd_bytealign_S (src_r02, src_r03, offset); s4 = amd_bytealign_S (src_r01, src_r02, offset); s3 = amd_bytealign_S (src_r00, src_r01, offset); s2 = amd_bytealign_S ( 0, src_r00, offset); s1 = 0; s0 = 0; break; case 3: s7 = amd_bytealign_S (src_r03, src_r10, offset); s6 = amd_bytealign_S (src_r02, src_r03, offset); s5 = amd_bytealign_S (src_r01, src_r02, offset); s4 = amd_bytealign_S (src_r00, src_r01, offset); s3 = amd_bytealign_S ( 0, src_r00, offset); s2 = 0; s1 = 0; s0 = 0; break; case 4: s7 = amd_bytealign_S (src_r02, src_r03, offset); s6 = amd_bytealign_S (src_r01, src_r02, offset); s5 = amd_bytealign_S (src_r00, src_r01, offset); s4 = amd_bytealign_S ( 0, src_r00, offset); s3 = 0; s2 = 0; s1 = 0; s0 = 0; break; case 5: s7 = amd_bytealign_S (src_r01, src_r02, offset); s6 = amd_bytealign_S (src_r00, src_r01, offset); s5 = amd_bytealign_S ( 0, src_r00, offset); s4 = 0; s3 = 0; s2 = 0; s1 = 0; s0 = 0; break; case 6: s7 = amd_bytealign_S (src_r00, src_r01, offset); s6 = amd_bytealign_S ( 0, src_r00, offset); s5 = 0; s4 = 0; s3 = 0; s2 = 0; s1 = 0; s0 = 0; break; case 7: s7 = amd_bytealign_S ( 0, src_r00, offset); s6 = 0; s5 = 0; s4 = 0; s3 = 0; s2 = 0; s1 = 0; s0 = 0; break; } s0 = swap32_S (s0); s1 = swap32_S (s1); s2 = swap32_S (s2); s3 = swap32_S (s3); s4 = swap32_S (s4); s5 = swap32_S (s5); s6 = swap32_S (s6); s7 = swap32_S (s7); buf0[0] = src_l0[0] | s0; buf0[1] = src_l0[1] | s1; buf0[2] = src_l0[2] | s2; buf0[3] = src_l0[3] | s3; buf1[0] = src_l1[0] | s4; buf1[1] = src_l1[1] | s5; buf1[2] = src_l1[2] | s6; buf1[3] = src_l1[3] | s7; } static void reverse_block (u32 in0[4], u32 in1[4], u32 out0[4], u32 out1[4], const u32 len) { rshift_block_N (in0, in1, out0, out1, 32 - len); u32 tib40[4]; u32 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] = swap32_S (tib40[0]); out0[1] = swap32_S (tib40[1]); out0[2] = swap32_S (tib40[2]); out0[3] = swap32_S (tib40[3]); out1[0] = swap32_S (tib41[0]); out1[1] = swap32_S (tib41[1]); out1[2] = swap32_S (tib41[2]); out1[3] = swap32_S (tib41[3]); } static u32 rule_op_mangle_lrest (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 >= in_len) return (in_len); const u32 tmp = 0x20u << ((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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { reverse_block (buf0, buf1, buf0, buf1, in_len); return in_len; } static u32 rule_op_mangle_dupeword (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if ((in_len + in_len) >= 32) return (in_len); u32 out_len = in_len; append_block8 (out_len, buf0, buf1, buf0, buf1, buf0, buf1); out_len += in_len; return out_len; } static u32 rule_op_mangle_dupeword_times (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (((in_len * p0) + in_len) >= 32) return (in_len); u32 out_len = in_len; u32 tib40[4]; u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if ((in_len + in_len) >= 32) return (in_len); u32 out_len = in_len; u32 tib40[4] = { 0 }; u32 tib41[4] = { 0 }; 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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 u32 tmp = (buf0[0] & 0xff) << sh; lshift_block (buf0, buf1, buf0, buf1); buf0[0] |= (in_len1 < 4) ? tmp : 0; buf0[1] |= ((in_len1 >= 4) && (in_len1 < 8)) ? tmp : 0; buf0[2] |= ((in_len1 >= 8) && (in_len1 < 12)) ? tmp : 0; buf0[3] |= ((in_len1 >= 12) && (in_len1 < 16)) ? tmp : 0; buf1[0] |= ((in_len1 >= 16) && (in_len1 < 20)) ? tmp : 0; buf1[1] |= ((in_len1 >= 20) && (in_len1 < 24)) ? tmp : 0; buf1[2] |= ((in_len1 >= 24) && (in_len1 < 28)) ? tmp : 0; buf1[3] |= (in_len1 >= 28) ? tmp : 0; return in_len; } static u32 rule_op_mangle_rotate_right (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; u32 tmp = 0; tmp |= (in_len1 < 4) ? buf0[0] : 0; tmp |= ((in_len1 >= 4) && (in_len1 < 8)) ? buf0[1] : 0; tmp |= ((in_len1 >= 8) && (in_len1 < 12)) ? buf0[2] : 0; tmp |= ((in_len1 >= 12) && (in_len1 < 16)) ? buf0[3] : 0; tmp |= ((in_len1 >= 16) && (in_len1 < 20)) ? buf1[0] : 0; tmp |= ((in_len1 >= 20) && (in_len1 < 24)) ? buf1[1] : 0; tmp |= ((in_len1 >= 24) && (in_len1 < 28)) ? buf1[2] : 0; tmp |= (in_len1 >= 28) ? buf1[3] : 0; tmp = (tmp >> sh) & 0xff; 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (in_len == 0) return (in_len); const u32 in_len1 = in_len - 1; const u32 mask = (1 << ((in_len1 & 3) * 8)) - 1; buf0[0] &= (in_len1 < 4) ? mask : 0xffffffff; buf0[1] &= ((in_len1 >= 4) && (in_len1 < 8)) ? mask : 0xffffffff; buf0[2] &= ((in_len1 >= 8) && (in_len1 < 12)) ? mask : 0xffffffff; buf0[3] &= ((in_len1 >= 12) && (in_len1 < 16)) ? mask : 0xffffffff; buf1[0] &= ((in_len1 >= 16) && (in_len1 < 20)) ? mask : 0xffffffff; buf1[1] &= ((in_len1 >= 20) && (in_len1 < 24)) ? mask : 0xffffffff; buf1[2] &= ((in_len1 >= 24) && (in_len1 < 28)) ? mask : 0xffffffff; buf1[3] &= (in_len1 >= 28) ? mask : 0xffffffff; return in_len1; } static u32 rule_op_mangle_delete_at (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 >= in_len) return (in_len); u32 out_len = in_len; u32 tib40[4]; u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; u32 tib40[4]; u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; u32 tib40[4]; u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 >= in_len) return (in_len); const u32 p1n = p1 << ((p0 & 3) * 8); const u32 m = ~(0xffu << ((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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { for (u32 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 u32 rule_op_mangle_purgechar (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { u32 out_len = 0; u32 buf_in[8]; buf_in[0] = buf0[0]; buf_in[1] = buf0[1]; buf_in[2] = buf0[2]; buf_in[3] = buf0[3]; buf_in[4] = buf1[0]; buf_in[5] = buf1[1]; buf_in[6] = buf1[2]; buf_in[7] = buf1[3]; u32 buf_out[8] = { 0 }; u8 *in = (u8 *) buf_in; u8 *out = (u8 *) buf_out; for (u32 pos = 0; pos < in_len; pos++) { if (in[pos] == (u8) p0) continue; out[out_len] = in[pos]; out_len++; } buf0[0] = buf_out[0]; buf0[1] = buf_out[1]; buf0[2] = buf_out[2]; buf0[3] = buf_out[3]; buf1[0] = buf_out[4]; buf1[1] = buf_out[5]; buf1[2] = buf_out[6]; buf1[3] = buf_out[7]; return out_len; } static u32 rule_op_mangle_dupechar_first (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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 u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; u32 tmp = 0; tmp |= (in_len1 < 4) ? buf0[0] : 0; tmp |= ((in_len1 >= 4) && (in_len1 < 8)) ? buf0[1] : 0; tmp |= ((in_len1 >= 8) && (in_len1 < 12)) ? buf0[2] : 0; tmp |= ((in_len1 >= 12) && (in_len1 < 16)) ? buf0[3] : 0; tmp |= ((in_len1 >= 16) && (in_len1 < 20)) ? buf1[0] : 0; tmp |= ((in_len1 >= 20) && (in_len1 < 24)) ? buf1[1] : 0; tmp |= ((in_len1 >= 24) && (in_len1 < 28)) ? buf1[2] : 0; tmp |= (in_len1 >= 28) ? buf1[3] : 0; tmp = (tmp >> sh) & 0xff; 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; u32 tib40[4]; u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 >= in_len) return (in_len); if (p1 >= in_len) return (in_len); u32 tmp0 = 0; u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 >= in_len) return (in_len); const u32 mr = 0xffu << ((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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 >= in_len) return (in_len); const u32 mr = 0xffu << ((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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 >= in_len) return (in_len); const u32 mr = 0xffu << ((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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 >= in_len) return (in_len); const u32 mr = 0xffu << ((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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if ((p0 + 1) >= in_len) return (in_len); u32 tib40[4]; u32 tib41[4]; lshift_block (buf0, buf1, tib40, tib41); const u32 mr = 0xffu << ((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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 buf1[4], const u32 in_len) { if (p0 == 0) return (in_len); if (p0 >= in_len) return (in_len); u32 tib40[4]; u32 tib41[4]; rshift_block (buf0, buf1, tib40, tib41); const u32 mr = 0xffu << ((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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; u32 tib40[4]; u32 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 (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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; u32 tib40[4] = { 0 }; u32 tib41[4] = { 0 }; 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_sep (MAYBE_UNUSED const u32 p0, MAYBE_UNUSED const u32 p1, MAYBE_UNUSED u32 buf0[4], MAYBE_UNUSED u32 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])); const u8 tmp2 = (u8) p0; for (u32 i = 0; i < in_len; i++) { u32 tmp0 = 0; u32 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 == tmp2) buf0[0] &= tmp1 ; } else if (i < 7) { if (tmp0 == tmp2) buf0[1] &= tmp1 ; } else if (i < 11) { if (tmp0 == tmp2) buf0[2] &= tmp1 ; } else if (i < 15) { if (tmp0 == tmp2) buf0[3] &= tmp1 ; } else if (i < 19) { if (tmp0 == tmp2) buf1[0] &= tmp1 ; } else if (i < 23) { if (tmp0 == tmp2) buf1[1] &= tmp1 ; } else if (i < 27) { if (tmp0 == tmp2) buf1[2] &= tmp1 ; } else if (i < 31) { if (tmp0 == tmp2) buf1[3] &= tmp1 ; } } return in_len; } u32 apply_rule_optimized (const u32 name, const u32 p0, const u32 p1, u32 buf0[4], u32 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_SEP: out_len = rule_op_mangle_title_sep (p0, p1, buf0, buf1, out_len); break; case RULE_OP_MANGLE_TITLE: out_len = rule_op_mangle_title_sep (' ', p1, buf0, buf1, out_len); break; } return out_len; } u32 apply_rules_optimized (const u32 *cmds, u32 buf0[4], u32 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_optimized (name, p0, p1, buf0, buf1, out_len); } return out_len; } hashcat-4.0.1/src/selftest.c000066400000000000000000000446701320027462700157310ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "event.h" #include "bitops.h" #include "convert.h" #include "opencl.h" #include "interface.h" #include "thread.h" #include "selftest.h" static int selftest (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; cl_int CL_err; int CL_rc; if (hashconfig->st_hash == NULL) return 0; // init : replace hashes with selftest hash device_param->kernel_params[15] = &device_param->d_st_digests_buf; device_param->kernel_params[17] = &device_param->d_st_salts_buf; device_param->kernel_params[18] = &device_param->d_st_esalts_buf; device_param->kernel_params_buf32[31] = 1; device_param->kernel_params_buf32[32] = 0; const u32 kernel_threads_by_wgs_kernel1_sav = device_param->kernel_threads_by_wgs_kernel1; const u32 kernel_threads_by_wgs_kernel12_sav = device_param->kernel_threads_by_wgs_kernel12; const u32 kernel_threads_by_wgs_kernel2_sav = device_param->kernel_threads_by_wgs_kernel2; const u32 kernel_threads_by_wgs_kernel23_sav = device_param->kernel_threads_by_wgs_kernel23; const u32 kernel_threads_by_wgs_kernel3_sav = device_param->kernel_threads_by_wgs_kernel3; const u32 kernel_threads_by_wgs_kernel4_sav = device_param->kernel_threads_by_wgs_kernel4; const u32 kernel_threads_by_wgs_kernel_init2_sav = device_param->kernel_threads_by_wgs_kernel_init2; const u32 kernel_threads_by_wgs_kernel_loop2_sav = device_param->kernel_threads_by_wgs_kernel_loop2; if ((hashconfig->opts_type & OPTS_TYPE_PT_BITSLICE) && (user_options_extra->attack_kern == ATTACK_KERN_BF)) { // do nothing } else { // there's a few algorithm that force a fixed thread size but are not listed in hashconfig_forced_kernel_threads() // because it's not a global fixed thread, just a single one on a single kernel // if it wants to run at 8 and we set it to 1 it will return CL_INVALID_WORK_GROUP_SIZE if (device_param->kernel_threads_by_user == device_param->kernel_threads_by_wgs_kernel1) device_param->kernel_threads_by_wgs_kernel1 = 1; if (device_param->kernel_threads_by_user == device_param->kernel_threads_by_wgs_kernel12) device_param->kernel_threads_by_wgs_kernel12 = 1; if (device_param->kernel_threads_by_user == device_param->kernel_threads_by_wgs_kernel2) device_param->kernel_threads_by_wgs_kernel2 = 1; if (device_param->kernel_threads_by_user == device_param->kernel_threads_by_wgs_kernel23) device_param->kernel_threads_by_wgs_kernel23 = 1; if (device_param->kernel_threads_by_user == device_param->kernel_threads_by_wgs_kernel3) device_param->kernel_threads_by_wgs_kernel3 = 1; if (device_param->kernel_threads_by_user == device_param->kernel_threads_by_wgs_kernel4) device_param->kernel_threads_by_wgs_kernel4 = 1; if (device_param->kernel_threads_by_user == device_param->kernel_threads_by_wgs_kernel_init2) device_param->kernel_threads_by_wgs_kernel_init2 = 1; if (device_param->kernel_threads_by_user == device_param->kernel_threads_by_wgs_kernel_loop2) device_param->kernel_threads_by_wgs_kernel_loop2 = 1; } // password : move the known password into a fake buffer u32 highest_pw_len = 0; if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) { device_param->kernel_params_buf32[30] = 1; pw_t pw; memset (&pw, 0, sizeof (pw)); char *pw_ptr = (char *) &pw.i; int pw_len = strlen (hashconfig->st_pass); memcpy (pw_ptr, hashconfig->st_pass, pw_len); pw.pw_len = pw_len; CL_err = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_pws_buf, CL_TRUE, 0, 1 * sizeof (pw_t), &pw, 0, NULL, NULL); if (CL_err != CL_SUCCESS) return -1; } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { device_param->kernel_params_buf32[30] = 1; device_param->kernel_params_buf32[33] = COMBINATOR_MODE_BASE_LEFT; pw_t pw; memset (&pw, 0, sizeof (pw)); char *pw_ptr = (char *) &pw.i; int pw_len = strlen (hashconfig->st_pass); memcpy (pw_ptr, hashconfig->st_pass, pw_len - 1); pw.pw_len = pw_len - 1; pw_t comb; memset (&comb, 0, sizeof (comb)); char *comb_ptr = (char *) &comb.i; memcpy (comb_ptr, hashconfig->st_pass + pw_len - 1, 1); comb.pw_len = 1; if (hashconfig->opts_type & OPTS_TYPE_PT_ADD01) { comb_ptr[comb.pw_len] = 0x01; } if (hashconfig->opts_type & OPTS_TYPE_PT_ADD80) { comb_ptr[comb.pw_len] = 0x80; } CL_err = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_combs_c, CL_TRUE, 0, 1 * sizeof (pw_t), &comb, 0, NULL, NULL); if (CL_err != CL_SUCCESS) return -1; CL_err = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_pws_buf, CL_TRUE, 0, 1 * sizeof (pw_t), &pw, 0, NULL, NULL); if (CL_err != CL_SUCCESS) return -1; } else if (user_options_extra->attack_kern == ATTACK_KERN_BF) { device_param->kernel_params_buf32[30] = 1; if (hashconfig->opts_type & OPTS_TYPE_PT_BITSLICE) { pw_t pw; memset (&pw, 0, sizeof (pw)); char *pw_ptr = (char *) &pw.i; int pw_len = strlen (hashconfig->st_pass); memcpy (pw_ptr, hashconfig->st_pass, pw_len); if (hashconfig->opts_type & OPTS_TYPE_PT_UPPER) { uppercase ((u8 *) pw_ptr, pw_len); } pw.pw_len = pw_len; CL_err = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_pws_buf, CL_TRUE, 0, 1 * sizeof (pw_t), &pw, 0, NULL, NULL); if (CL_err != CL_SUCCESS) return -1; } else { bf_t bf; memset (&bf, 0, sizeof (bf)); char *bf_ptr = (char *) &bf.i; memcpy (bf_ptr, hashconfig->st_pass, 1); if (hashconfig->opts_type & OPTS_TYPE_PT_UTF16LE) { memset (bf_ptr, 0, 4); for (int i = 0, j = 0; i < 1; i += 1, j += 2) { bf_ptr[j + 0] = hashconfig->st_pass[i]; bf_ptr[j + 1] = 0; } } else if (hashconfig->opts_type & OPTS_TYPE_PT_UTF16BE) { memset (bf_ptr, 0, 4); for (int i = 0, j = 0; i < 1; i += 1, j += 2) { bf_ptr[j + 0] = 0; bf_ptr[j + 1] = hashconfig->st_pass[i]; } } if (hashconfig->opts_type & OPTS_TYPE_PT_UPPER) { uppercase ((u8 *) bf_ptr, 4); } if (hashconfig->opts_type & OPTS_TYPE_PT_GENERATE_BE) { bf.i = byte_swap_32 (bf.i); } CL_err = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_bfs_c, CL_TRUE, 0, 1 * sizeof (bf_t), &bf, 0, NULL, NULL); if (CL_err != CL_SUCCESS) return -1; pw_t pw; memset (&pw, 0, sizeof (pw)); char *pw_ptr = (char *) &pw.i; int pw_len = strlen (hashconfig->st_pass); memcpy (pw_ptr + 1, hashconfig->st_pass + 1, pw_len - 1); int new_pass_len = pw_len; if (hashconfig->opts_type & OPTS_TYPE_PT_UTF16LE) { memset (pw_ptr, 0, pw_len); for (int i = 1, j = 2; i < new_pass_len; i += 1, j += 2) { pw_ptr[j + 0] = hashconfig->st_pass[i]; pw_ptr[j + 1] = 0; } new_pass_len *= 2; } else if (hashconfig->opts_type & OPTS_TYPE_PT_UTF16BE) { memset (pw_ptr, 0, pw_len); for (int i = 1, j = 2; i < new_pass_len; i += 1, j += 2) { pw_ptr[j + 0] = 0; pw_ptr[j + 1] = hashconfig->st_pass[i]; } new_pass_len *= 2; } if (hashconfig->opts_type & OPTS_TYPE_PT_UPPER) { uppercase ((u8 *) pw_ptr, new_pass_len); } if (hashconfig->opti_type & OPTI_TYPE_SINGLE_HASH) { if (hashconfig->opti_type & OPTI_TYPE_APPENDED_SALT) { memcpy (pw_ptr + new_pass_len, (char *) hashes->st_salts_buf[0].salt_buf, 64 - new_pass_len); new_pass_len += hashes->st_salts_buf[0].salt_len; } } pw.pw_len = new_pass_len; if (hashconfig->opts_type & OPTS_TYPE_PT_ADD01) { pw_ptr[new_pass_len] = 0x01; } if (hashconfig->opts_type & OPTS_TYPE_PT_ADD80) { pw_ptr[new_pass_len] = 0x80; } if (hashconfig->opts_type & OPTS_TYPE_PT_ADDBITS14) { pw.i[14] = new_pass_len * 8; pw.i[15] = 0; } if (hashconfig->opts_type & OPTS_TYPE_PT_ADDBITS15) { pw.i[14] = 0; pw.i[15] = new_pass_len * 8; } if (hashconfig->opts_type & OPTS_TYPE_PT_GENERATE_BE) { for (int i = 0; i < 14; i++) pw.i[i] = byte_swap_32 (pw.i[i]); } CL_err = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_pws_buf, CL_TRUE, 0, 1 * sizeof (pw_t), &pw, 0, NULL, NULL); if (CL_err != CL_SUCCESS) return -1; highest_pw_len = pw.pw_len; } } } else { pw_t pw; memset (&pw, 0, sizeof (pw)); char *pw_ptr = (char *) &pw.i; int pw_len = strlen (hashconfig->st_pass); memcpy (pw_ptr, hashconfig->st_pass, pw_len); pw.pw_len = pw_len; CL_err = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_pws_amp_buf, CL_TRUE, 0, 1 * sizeof (pw_t), &pw, 0, NULL, NULL); if (CL_err != CL_SUCCESS) return -1; } // main : run the kernel if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { if (highest_pw_len < 16) { CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_1, 1, false, 0); if (CL_rc == -1) return -1; } else if (highest_pw_len < 32) { CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_2, 1, false, 0); if (CL_rc == -1) return -1; } else { CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_3, 1, false, 0); if (CL_rc == -1) return -1; } } else { CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_4, 1, false, 0); if (CL_rc == -1) return -1; } } else { // missing handling hooks CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_1, 1, false, 0); if (CL_rc == -1) return -1; if (hashconfig->opts_type & OPTS_TYPE_HOOK12) { CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_12, 1, false, 0); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueReadBuffer (hashcat_ctx, device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; // do something with data CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; } const u32 salt_pos = 0; salt_t *salt_buf = &hashes->st_salts_buf[salt_pos]; const u32 kernel_loops_fixed = hashconfig_get_kernel_loops (hashcat_ctx); const u32 loop_step = (kernel_loops_fixed) ? kernel_loops_fixed : 1; const u32 iter = salt_buf->salt_iter; for (u32 loop_pos = 0; loop_pos < iter; loop_pos += loop_step) { u32 loop_left = iter - loop_pos; loop_left = MIN (loop_left, loop_step); device_param->kernel_params_buf32[28] = loop_pos; device_param->kernel_params_buf32[29] = loop_left; CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_2, 1, false, 0); if (CL_rc == -1) return -1; } if (hashconfig->opts_type & OPTS_TYPE_HOOK23) { CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_23, 1, false, 0); if (CL_rc == -1) return -1; CL_rc = hc_clEnqueueReadBuffer (hashcat_ctx, device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; /* * The following section depends on the hash mode */ switch (hashconfig->hash_mode) { // for 7z we only need device_param->hooks_buf, but other hooks could use any info from device_param. All of them should/must update hooks_buf case 11600: seven_zip_hook_func (device_param, hashes->st_hook_salts_buf, 0, 1); break; } /* * END of hash mode specific hook operations */ CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL); if (CL_rc == -1) return -1; } if (hashconfig->opts_type & OPTS_TYPE_INIT2) { CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_INIT2, 1, false, 0); if (CL_rc == -1) return -1; } if (hashconfig->opts_type & OPTS_TYPE_LOOP2) { const u32 iter2 = salt_buf->salt_iter2; for (u32 loop_pos = 0; loop_pos < iter2; loop_pos += loop_step) { u32 loop_left = iter2 - loop_pos; loop_left = MIN (loop_left, loop_step); device_param->kernel_params_buf32[28] = loop_pos; device_param->kernel_params_buf32[29] = loop_left; CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_LOOP2, 1, false, 0); if (CL_rc == -1) return -1; } } if ((hashconfig->hash_mode == 2500) || (hashconfig->hash_mode == 2501)) { device_param->kernel_params_buf32[28] = 0; device_param->kernel_params_buf32[29] = 1; } CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_3, 1, false, 0); if (CL_rc == -1) return -1; } // check : check if cracked u32 num_cracked; CL_err = hc_clEnqueueReadBuffer (hashcat_ctx, device_param->command_queue, device_param->d_result, CL_TRUE, 0, sizeof (u32), &num_cracked, 0, NULL, NULL); if (CL_err != CL_SUCCESS) return -1; // finish : cleanup and restore device_param->kernel_threads_by_wgs_kernel1 = kernel_threads_by_wgs_kernel1_sav; device_param->kernel_threads_by_wgs_kernel12 = kernel_threads_by_wgs_kernel12_sav; device_param->kernel_threads_by_wgs_kernel2 = kernel_threads_by_wgs_kernel2_sav; device_param->kernel_threads_by_wgs_kernel23 = kernel_threads_by_wgs_kernel23_sav; device_param->kernel_threads_by_wgs_kernel3 = kernel_threads_by_wgs_kernel3_sav; device_param->kernel_threads_by_wgs_kernel4 = kernel_threads_by_wgs_kernel4_sav; device_param->kernel_threads_by_wgs_kernel_init2 = kernel_threads_by_wgs_kernel_init2_sav; device_param->kernel_threads_by_wgs_kernel_loop2 = kernel_threads_by_wgs_kernel_loop2_sav; 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; device_param->kernel_params_buf32[32] = 0; device_param->kernel_params_buf32[33] = 0; device_param->kernel_params_buf64[34] = 0; device_param->kernel_params[15] = &device_param->d_digests_buf; device_param->kernel_params[17] = &device_param->d_salt_bufs; device_param->kernel_params[18] = &device_param->d_esalt_bufs; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_pws_buf, device_param->size_pws); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_pws_amp_buf, device_param->size_pws_amp); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_tmps, device_param->size_tmps); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_hooks, device_param->size_hooks); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_plain_bufs, device_param->size_plains); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_digests_shown, device_param->size_shown); if (CL_rc == -1) return -1; CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_result, device_param->size_results); if (CL_rc == -1) return -1; if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) { CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_rules_c, device_param->size_rules_c); if (CL_rc == -1) return -1; } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_combs_c, device_param->size_combs); if (CL_rc == -1) return -1; } else if (user_options_extra->attack_kern == ATTACK_KERN_BF) { CL_rc = run_kernel_bzero (hashcat_ctx, device_param, device_param->d_bfs_c, device_param->size_bfs); if (CL_rc == -1) return -1; } // check return if (num_cracked == 0) { hc_thread_mutex_lock (status_ctx->mux_display); event_log_error (hashcat_ctx, "* Device #%u: ATTENTION! OpenCL kernel self-test failed.", device_param->device_id + 1); event_log_warning (hashcat_ctx, "Your device driver installation is probably broken."); event_log_warning (hashcat_ctx, "See also: https://hashcat.net/faq/wrongdriver"); event_log_warning (hashcat_ctx, NULL); hc_thread_mutex_unlock (status_ctx->mux_display); return -1; } return 0; } void *thread_selftest (void *p) { thread_param_t *thread_param = (thread_param_t *) p; hashcat_ctx_t *hashcat_ctx = thread_param->hashcat_ctx; opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; if (opencl_ctx->enabled == false) return NULL; user_options_t *user_options = hashcat_ctx->user_options; if (user_options->self_test_disable == true) return NULL; hc_device_param_t *device_param = opencl_ctx->devices_param + thread_param->tid; if (device_param->skipped == true) return NULL; const int rc_selftest = selftest (hashcat_ctx, device_param); if (rc_selftest == -1) { // we should do something here, tell hashcat main that selftest failed to abort } return NULL; } hashcat-4.0.1/src/shared.c000066400000000000000000000222331320027462700153350ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "shared.h" static inline int get_msb32 (const u32 v) { int i; for (i = 32; i > 0; i--) if ((v >> (i - 1)) & 1) break; return i; } static inline int get_msb64 (const u64 v) { int i; for (i = 64; i > 0; i--) if ((v >> (i - 1)) & 1) break; return i; } bool overflow_check_u32_add (const u32 a, const u32 b) { const int a_msb = get_msb32 (a); const int b_msb = get_msb32 (b); return ((a_msb < 32) && (b_msb < 32)); } bool overflow_check_u32_mul (const u32 a, const u32 b) { const int a_msb = get_msb32 (a); const int b_msb = get_msb32 (b); return ((a_msb + b_msb) < 32); } bool overflow_check_u64_add (const u64 a, const u64 b) { const int a_msb = get_msb64 (a); const int b_msb = get_msb64 (b); return ((a_msb < 64) && (b_msb < 64)); } bool overflow_check_u64_mul (const u64 a, const u64 b) { const int a_msb = get_msb64 (a); const int b_msb = get_msb64 (b); return ((a_msb + b_msb) < 64); } bool is_power_of_2 (const u32 v) { return (v && !(v & (v - 1))); } u32 mydivc32 (const u32 dividend, const u32 divisor) { u32 quotient = dividend / divisor; if (dividend % divisor) quotient++; return quotient; } u64 mydivc64 (const u64 dividend, const u64 divisor) { u64 quotient = dividend / divisor; if (dividend % divisor) quotient++; return quotient; } char *filename_from_filepath (char *filepath) { char *ptr = NULL; if ((ptr = strrchr (filepath, '/')) != NULL) { ptr++; } else if ((ptr = strrchr (filepath, '\\')) != NULL) { ptr++; } else { ptr = filepath; } return ptr; } void naive_replace (char *s, const char key_char, const char replace_char) { const size_t len = strlen (s); for (size_t in = 0; in < len; in++) { const char c = s[in]; if (c == key_char) { s[in] = replace_char; } } } void naive_escape (char *s, size_t s_max, const char key_char, const char escape_char) { char s_escaped[1024] = { 0 }; size_t s_escaped_max = sizeof (s_escaped); const size_t len = strlen (s); for (size_t in = 0, out = 0; in < len; in++, out++) { const char c = s[in]; if (c == key_char) { s_escaped[out] = escape_char; out++; } if (out == s_escaped_max - 2) break; s_escaped[out] = c; } strncpy (s, s_escaped, s_max - 1); } void hc_asprintf (char **strp, const char *fmt, ...) { va_list args; va_start (args, fmt); int rc __attribute__((unused)); rc = vasprintf (strp, fmt, args); va_end (args); } #if defined (_WIN) int hc_stat (const char *pathname, hc_stat_t *buf) { return stat64 (pathname, buf); } int hc_fstat (int fd, hc_stat_t *buf) { return fstat64 (fd, buf); } #else int hc_stat (const char *pathname, hc_stat_t *buf) { return stat (pathname, buf); } int hc_fstat (int fd, hc_stat_t *buf) { return fstat (fd, buf); } #endif #if defined (_WIN) #define __WINDOWS__ #endif #include "sort_r.h" #if defined (_WIN) #undef __WINDOWS__ #endif void hc_qsort_r (void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *, void *), void *arg) { sort_r (base, nmemb, size, compar, arg); } void *hc_bsearch_r (const void *key, const void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *, void *), void *arg) { for (size_t l = 0, r = nmemb; r; r >>= 1) { const size_t m = r >> 1; const size_t c = l + m; const char *next = (char *) base + (c * size); const int cmp = (*compar) (key, next, arg); if (cmp > 0) { l += m + 1; r--; } if (cmp == 0) return ((void *) next); } return (NULL); } bool hc_path_is_file (const char *path) { hc_stat_t s; if (hc_stat (path, &s) == -1) return false; if (S_ISREG (s.st_mode)) return true; return false; } bool hc_path_is_directory (const char *path) { hc_stat_t s; if (hc_stat (path, &s) == -1) return false; if (S_ISDIR (s.st_mode)) return true; return false; } bool hc_path_is_empty (const char *path) { hc_stat_t s; if (hc_stat (path, &s) == -1) return false; if (s.st_size == 0) return true; return false; } bool hc_path_exist (const char *path) { if (access (path, F_OK) == -1) return false; return true; } bool hc_path_read (const char *path) { if (access (path, R_OK) == -1) return false; return true; } bool hc_path_write (const char *path) { if (access (path, W_OK) == -1) return false; return true; } bool hc_path_create (const char *path) { if (hc_path_exist (path) == true) return false; const int fd = creat (path, S_IRUSR | S_IWUSR); if (fd == -1) return false; close (fd); unlink (path); return true; } bool hc_string_is_digit (const char *s) { if (s == NULL) return false; const size_t len = strlen (s); if (len == 0) return false; for (size_t i = 0; i < len; i++) { const int c = (const int) s[i]; if (isdigit (c) == 0) return false; } return true; } void setup_environment_variables () { char *compute = getenv ("COMPUTE"); if (compute) { char *display; hc_asprintf (&display, "DISPLAY=%s", compute); putenv (display); free (display); } else { if (getenv ("DISPLAY") == NULL) putenv ((char *) "DISPLAY=:0"); } if (getenv ("OCL_CODE_CACHE_ENABLE") == NULL) putenv ((char *) "OCL_CODE_CACHE_ENABLE=0"); if (getenv ("CUDA_CACHE_DISABLE") == NULL) putenv ((char *) "CUDA_CACHE_DISABLE=1"); if (getenv ("POCL_KERNEL_CACHE") == NULL) putenv ((char *) "POCL_KERNEL_CACHE=0"); } void setup_umask () { umask (077); } void setup_seeding (const bool rp_gen_seed_chgd, const u32 rp_gen_seed) { if (rp_gen_seed_chgd == true) { srand (rp_gen_seed); } else { hc_time_t ts; hc_time (&ts); srand (ts); } } u32 get_random_num (const u32 min, const u32 max) { if (min == max) return (min); const u32 low = max - min; if (low == 0) return (0); #if defined (_WIN) return (((u32) rand () % (max - min)) + min); #else return (((u32) random () % (max - min)) + min); #endif } void hc_string_trim_leading (char *s) { int skip = 0; const int len = (int) strlen (s); for (int i = 0; i < len; i++) { const int c = (const int) s[i]; if (isspace (c) == 0) break; skip++; } if (skip == 0) return; const int new_len = len - skip; memmove (s, s + skip, new_len); s[new_len] = 0; } void hc_string_trim_trailing (char *s) { int skip = 0; const int len = (int) strlen (s); for (int i = len - 1; i >= 0; i--) { const int c = (const int) s[i]; if (isspace (c) == 0) break; skip++; } if (skip == 0) return; const size_t new_len = len - skip; s[new_len] = 0; } size_t hc_fread (void *ptr, size_t size, size_t nmemb, FILE *stream) { return fread (ptr, size, nmemb, stream); } void hc_fwrite (const void *ptr, size_t size, size_t nmemb, FILE *stream) { size_t rc = fwrite (ptr, size, nmemb, stream); if (rc == 0) rc = 0; } hc_time_t hc_time (hc_time_t *t) { #if defined (_WIN) return _time64 (t); #else return time (t); #endif } struct tm *hc_gmtime (const hc_time_t *t, MAYBE_UNUSED struct tm *result) { #if defined (_WIN) return _gmtime64 (t); #else return gmtime_r (t, result); #endif } char *hc_ctime (const hc_time_t *t, char *buf, MAYBE_UNUSED const size_t buf_size) { char *etc = NULL; #if defined (_WIN) etc = _ctime64 (t); if (etc != NULL) { snprintf (buf, buf_size, "%s", etc); } #else etc = ctime_r (t, buf); // buf should have room for at least 26 bytes #endif return etc; } bool hc_same_files (char *file1, char *file2) { if ((file1 != NULL) && (file2 != NULL)) { hc_stat_t tmpstat_file1; hc_stat_t tmpstat_file2; int do_check = 0; FILE *fp; fp = fopen (file1, "r"); if (fp) { if (hc_fstat (fileno (fp), &tmpstat_file1)) { fclose (fp); return false; } fclose (fp); do_check++; } fp = fopen (file2, "r"); if (fp) { if (hc_fstat (fileno (fp), &tmpstat_file2)) { fclose (fp); return false; } fclose (fp); do_check++; } if (do_check == 2) { tmpstat_file1.st_mode = 0; tmpstat_file1.st_nlink = 0; tmpstat_file1.st_uid = 0; tmpstat_file1.st_gid = 0; tmpstat_file1.st_rdev = 0; tmpstat_file1.st_atime = 0; #if defined (STAT_NANOSECONDS_ACCESS_TIME) tmpstat_file1.STAT_NANOSECONDS_ACCESS_TIME = 0; #endif #if defined (_POSIX) tmpstat_file1.st_blksize = 0; tmpstat_file1.st_blocks = 0; #endif tmpstat_file2.st_mode = 0; tmpstat_file2.st_nlink = 0; tmpstat_file2.st_uid = 0; tmpstat_file2.st_gid = 0; tmpstat_file2.st_rdev = 0; tmpstat_file2.st_atime = 0; #if defined (STAT_NANOSECONDS_ACCESS_TIME) tmpstat_file2.STAT_NANOSECONDS_ACCESS_TIME = 0; #endif #if defined (_POSIX) tmpstat_file2.st_blksize = 0; tmpstat_file2.st_blocks = 0; #endif if (memcmp (&tmpstat_file1, &tmpstat_file2, sizeof (hc_stat_t)) == 0) { return true; } } } return false; } hashcat-4.0.1/src/status.c000066400000000000000000001445551320027462700154260ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "convert.h" #include "restore.h" #include "thread.h" #include "timer.h" #include "interface.h" #include "hwmon.h" #include "outfile.h" #include "monitor.h" #include "mpsp.h" #include "terminal.h" #include "status.h" #include "shared.h" static const char ST_0000[] = "Initializing"; static const char ST_0001[] = "Autotuning"; static const char ST_0002[] = "Selftest"; static const char ST_0003[] = "Running"; static const char ST_0004[] = "Paused"; static const char ST_0005[] = "Exhausted"; static const char ST_0006[] = "Cracked"; static const char ST_0007[] = "Aborted"; static const char ST_0008[] = "Quit"; static const char ST_0009[] = "Bypass"; static const char ST_0010[] = "Aborted (Checkpoint)"; static const char ST_0011[] = "Aborted (Runtime)"; static const char ST_0012[] = "Running (Checkpoint Quit requested)"; static const char ST_9999[] = "Unknown! Bug!"; static const char UNITS[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' }; static const char ETA_ABSOLUTE_MAX_EXCEEDED[] = "Next Big Bang"; // in honor of ighashgpu static const char ETA_RELATIVE_MAX_EXCEEDED[] = "> 10 years"; static char *status_get_rules_file (const hashcat_ctx_t *hashcat_ctx) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->rp_files_cnt > 0) { char *tmp_buf = (char *) malloc (HCBUFSIZ_TINY); int tmp_len = 0; u32 i; for (i = 0; i < user_options->rp_files_cnt - 1; i++) { tmp_len += snprintf (tmp_buf + tmp_len, HCBUFSIZ_TINY - tmp_len - 1, "%s, ", user_options->rp_files[i]); } tmp_len += snprintf (tmp_buf + tmp_len, HCBUFSIZ_TINY - tmp_len - 1, "%s", user_options->rp_files[i]); tmp_buf[tmp_len] = 0; return tmp_buf; // yes, user need to free() } return NULL; } 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 (double val, char *buf, size_t len) { if (val <= 0) { buf[0] = '0'; buf[1] = ' '; buf[2] = 0; return; } u32 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]); } } double get_avg_exec_time (hc_device_param_t *device_param, const int last_num_entries) { int exec_pos = (int) device_param->exec_pos - last_num_entries; if (exec_pos < 0) exec_pos += EXEC_CACHE; double exec_msec_sum = 0; int exec_msec_cnt = 0; for (int i = 0; i < last_num_entries; i++) { double exec_msec = device_param->exec_msec[(exec_pos + i) % EXEC_CACHE]; if (exec_msec > 0) { exec_msec_sum += exec_msec; exec_msec_cnt++; } } if (exec_msec_cnt == 0) return 0; return exec_msec_sum / exec_msec_cnt; } int status_get_device_info_cnt (const hashcat_ctx_t *hashcat_ctx) { const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; return opencl_ctx->devices_cnt; } int status_get_device_info_active (const hashcat_ctx_t *hashcat_ctx) { const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; return opencl_ctx->devices_active; } bool status_get_skipped_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id) { const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; return device_param->skipped; } char *status_get_session (const hashcat_ctx_t *hashcat_ctx) { const user_options_t *user_options = hashcat_ctx->user_options; return strdup (user_options->session); } char *status_get_status_string (const hashcat_ctx_t *hashcat_ctx) { const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; const int devices_status = status_ctx->devices_status; // special case: running but checkpoint quit requested if (devices_status == STATUS_RUNNING) { if (status_ctx->checkpoint_shutdown == true) { return ((char *) ST_0012); } } switch (devices_status) { case STATUS_INIT: return ((char *) ST_0000); case STATUS_AUTOTUNE: return ((char *) ST_0001); case STATUS_SELFTEST: return ((char *) ST_0002); case STATUS_RUNNING: return ((char *) ST_0003); case STATUS_PAUSED: return ((char *) ST_0004); case STATUS_EXHAUSTED: return ((char *) ST_0005); case STATUS_CRACKED: return ((char *) ST_0006); case STATUS_ABORTED: return ((char *) ST_0007); case STATUS_QUIT: return ((char *) ST_0008); case STATUS_BYPASS: return ((char *) ST_0009); case STATUS_ABORTED_CHECKPOINT: return ((char *) ST_0010); case STATUS_ABORTED_RUNTIME: return ((char *) ST_0011); } return ((char *) ST_9999); } int status_get_status_number (const hashcat_ctx_t *hashcat_ctx) { const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; return status_ctx->devices_status; } char *status_get_hash_type (const hashcat_ctx_t *hashcat_ctx) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; return strhashtype (hashconfig->hash_mode); } const char *status_get_hash_target (const hashcat_ctx_t *hashcat_ctx) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const hashes_t *hashes = hashcat_ctx->hashes; if (hashes->digests_cnt == 1) { if ((hashconfig->hash_mode == 2500) || (hashconfig->hash_mode == 2501)) { char *tmp_buf; wpa_t *wpa = (wpa_t *) hashes->esalts_buf; hc_asprintf (&tmp_buf, "%s (AP:%02x:%02x:%02x:%02x:%02x:%02x STA:%02x:%02x:%02x:%02x:%02x:%02x)", (char *) hashes->salts_buf[0].salt_buf, wpa->orig_mac_ap[0], wpa->orig_mac_ap[1], wpa->orig_mac_ap[2], wpa->orig_mac_ap[3], wpa->orig_mac_ap[4], wpa->orig_mac_ap[5], wpa->orig_mac_sta[0], wpa->orig_mac_sta[1], wpa->orig_mac_sta[2], wpa->orig_mac_sta[3], wpa->orig_mac_sta[4], wpa->orig_mac_sta[5]); return tmp_buf; } else if (hashconfig->hash_mode == 5200) { return hashes->hashfile; } else if (hashconfig->hash_mode == 9000) { return hashes->hashfile; } else if ((hashconfig->hash_mode >= 6200) && (hashconfig->hash_mode <= 6299)) { return hashes->hashfile; } else if ((hashconfig->hash_mode >= 13700) && (hashconfig->hash_mode <= 13799)) { return hashes->hashfile; } else { char *tmp_buf = (char *) malloc (HCBUFSIZ_LARGE); tmp_buf[0] = 0; ascii_digest ((hashcat_ctx_t *) hashcat_ctx, tmp_buf, HCBUFSIZ_LARGE, 0, 0); compress_terminal_line_length (tmp_buf, 19, 6); // 19 = strlen ("Hash.Target......: ") char *tmp_buf2 = strdup (tmp_buf); free (tmp_buf); return tmp_buf2; } } else { if (hashconfig->hash_mode == 3000) { char *tmp_buf; char out_buf1[64] = { 0 }; char out_buf2[64] = { 0 }; ascii_digest ((hashcat_ctx_t *) hashcat_ctx, out_buf1, sizeof (out_buf1), 0, 0); ascii_digest ((hashcat_ctx_t *) hashcat_ctx, out_buf2, sizeof (out_buf2), 0, 1); hc_asprintf (&tmp_buf, "%s, %s", out_buf1, out_buf2); return tmp_buf; } else { return hashes->hashfile; } } } int status_get_guess_mode (const hashcat_ctx_t *hashcat_ctx) { const combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; const user_options_t *user_options = hashcat_ctx->user_options; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; bool has_wordlist = false; bool has_rule_file = false; bool has_rule_gen = false; bool has_base_left = false; bool has_mask_cs = false; if (user_options_extra->wordlist_mode == WL_MODE_FILE) has_wordlist = true; if (user_options->rp_files_cnt > 0) has_rule_file = true; if (user_options->rp_gen > 0) has_rule_gen = true; if (combinator_ctx->combs_mode == COMBINATOR_MODE_BASE_LEFT) has_base_left = true; if (user_options->custom_charset_1) has_mask_cs = true; if (user_options->custom_charset_2) has_mask_cs = true; if (user_options->custom_charset_3) has_mask_cs = true; if (user_options->custom_charset_4) has_mask_cs = true; if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { if (has_wordlist == true) { if (has_rule_file == true) { return GUESS_MODE_STRAIGHT_FILE_RULES_FILE; } else if (has_rule_gen == true) { return GUESS_MODE_STRAIGHT_FILE_RULES_GEN; } else { return GUESS_MODE_STRAIGHT_FILE; } } else { if (has_rule_file == true) { return GUESS_MODE_STRAIGHT_STDIN_RULES_FILE; } else if (has_rule_gen == true) { return GUESS_MODE_STRAIGHT_STDIN_RULES_GEN; } else { return GUESS_MODE_STRAIGHT_STDIN; } } } else if (user_options->attack_mode == ATTACK_MODE_COMBI) { if (has_base_left == true) { return GUESS_MODE_COMBINATOR_BASE_LEFT; } else { return GUESS_MODE_COMBINATOR_BASE_RIGHT; } } else if (user_options->attack_mode == ATTACK_MODE_BF) { if (has_mask_cs == true) { return GUESS_MODE_MASK_CS; } else { return GUESS_MODE_MASK; } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { if (has_mask_cs == true) { return GUESS_MODE_HYBRID1_CS; } else { return GUESS_MODE_HYBRID1; } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { if (has_mask_cs == true) { return GUESS_MODE_HYBRID2_CS; } else { return GUESS_MODE_HYBRID2; } } return GUESS_MODE_NONE; } char *status_get_guess_base (const hashcat_ctx_t *hashcat_ctx) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const user_options_t *user_options = hashcat_ctx->user_options; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { if (user_options_extra->wordlist_mode == WL_MODE_FILE) { const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; return strdup (straight_ctx->dict); } } else if (user_options->attack_mode == ATTACK_MODE_COMBI) { const combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; if (combinator_ctx->combs_mode == COMBINATOR_MODE_BASE_LEFT) { return strdup (combinator_ctx->dict1); } else { return strdup (combinator_ctx->dict2); } } else if (user_options->attack_mode == ATTACK_MODE_BF) { const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; return strdup (mask_ctx->mask); } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; return strdup (straight_ctx->dict); } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; return strdup (mask_ctx->mask); } else { const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; return strdup (straight_ctx->dict); } } return NULL; } int status_get_guess_base_offset (const hashcat_ctx_t *hashcat_ctx) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; return straight_ctx->dicts_pos + 1; } else if (user_options->attack_mode == ATTACK_MODE_COMBI) { return 1; } else if (user_options->attack_mode == ATTACK_MODE_BF) { const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; return mask_ctx->masks_pos + 1; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; return straight_ctx->dicts_pos + 1; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; return mask_ctx->masks_pos + 1; } else { const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; return straight_ctx->dicts_pos + 1; } } return 0; } int status_get_guess_base_count (const hashcat_ctx_t *hashcat_ctx) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; return straight_ctx->dicts_cnt; } else if (user_options->attack_mode == ATTACK_MODE_COMBI) { return 1; } else if (user_options->attack_mode == ATTACK_MODE_BF) { const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; return mask_ctx->masks_cnt; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; return straight_ctx->dicts_cnt; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; return mask_ctx->masks_cnt; } else { const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; return straight_ctx->dicts_cnt; } } return 0; } double status_get_guess_base_percent (const hashcat_ctx_t *hashcat_ctx) { const int guess_base_offset = status_get_guess_base_offset (hashcat_ctx); const int guess_base_count = status_get_guess_base_count (hashcat_ctx); if (guess_base_count == 0) return 0; return ((double) guess_base_offset / (double) guess_base_count) * 100; } char *status_get_guess_mod (const hashcat_ctx_t *hashcat_ctx) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { return status_get_rules_file (hashcat_ctx); } if (user_options->attack_mode == ATTACK_MODE_COMBI) { const combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; if (combinator_ctx->combs_mode == COMBINATOR_MODE_BASE_LEFT) { return strdup (combinator_ctx->dict2); } else { return strdup (combinator_ctx->dict1); } } if (user_options->attack_mode == ATTACK_MODE_BF) { } if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; return strdup (mask_ctx->mask); } if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; return strdup (straight_ctx->dict); } else { const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; return strdup (mask_ctx->mask); } } return NULL; } int status_get_guess_mod_offset (const hashcat_ctx_t *hashcat_ctx) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { return 1; } else if (user_options->attack_mode == ATTACK_MODE_COMBI) { return 1; } else if (user_options->attack_mode == ATTACK_MODE_BF) { return 1; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; return mask_ctx->masks_pos + 1; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; return straight_ctx->dicts_pos + 1; } else { const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; return mask_ctx->masks_pos + 1; } } return 0; } int status_get_guess_mod_count (const hashcat_ctx_t *hashcat_ctx) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { return 1; } else if (user_options->attack_mode == ATTACK_MODE_COMBI) { return 1; } else if (user_options->attack_mode == ATTACK_MODE_BF) { return 1; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; return mask_ctx->masks_cnt; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; return straight_ctx->dicts_cnt; } else { const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; return mask_ctx->masks_cnt; } } return 0; } double status_get_guess_mod_percent (const hashcat_ctx_t *hashcat_ctx) { const int guess_mod_offset = status_get_guess_mod_offset (hashcat_ctx); const int guess_mod_count = status_get_guess_mod_count (hashcat_ctx); if (guess_mod_count == 0) return 0; return ((double) guess_mod_offset / (double) guess_mod_count) * 100; } char *status_get_guess_charset (const hashcat_ctx_t *hashcat_ctx) { const user_options_t *user_options = hashcat_ctx->user_options; const char *custom_charset_1 = user_options->custom_charset_1; const char *custom_charset_2 = user_options->custom_charset_2; const char *custom_charset_3 = user_options->custom_charset_3; const char *custom_charset_4 = user_options->custom_charset_4; if ((custom_charset_1 != NULL) || (custom_charset_2 != NULL) || (custom_charset_3 != NULL) || (custom_charset_4 != NULL)) { char *tmp_buf; if (custom_charset_1 == NULL) custom_charset_1 = "Undefined"; if (custom_charset_2 == NULL) custom_charset_2 = "Undefined"; if (custom_charset_3 == NULL) custom_charset_3 = "Undefined"; if (custom_charset_4 == NULL) custom_charset_4 = "Undefined"; hc_asprintf (&tmp_buf, "-1 %s, -2 %s, -3 %s, -4 %s", custom_charset_1, custom_charset_2, custom_charset_3, custom_charset_4); return tmp_buf; } return NULL; } int status_get_guess_mask_length (const hashcat_ctx_t *hashcat_ctx) { const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; if (mask_ctx == NULL) return -1; if (mask_ctx->mask == NULL) return -1; return mp_get_length (mask_ctx->mask); } char *status_get_guess_candidates_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; if (status_ctx->accessible == false) return NULL; hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; char *display = (char *) malloc (HCBUFSIZ_TINY); if (user_options_extra->attack_kern == ATTACK_KERN_BF) { snprintf (display, HCBUFSIZ_TINY - 1, "[Generating]"); } else { snprintf (display, HCBUFSIZ_TINY - 1, "[Copying]"); } if (device_param->skipped == true) return display; if ((device_param->outerloop_left == 0) || (device_param->innerloop_left == 0)) return display; const u32 outerloop_first = 0; const u32 outerloop_last = device_param->outerloop_left - 1; const u32 innerloop_first = 0; const u32 innerloop_last = device_param->innerloop_left - 1; plain_t plain1 = { 0, 0, 0, outerloop_first, innerloop_first }; plain_t plain2 = { 0, 0, 0, outerloop_last, innerloop_last }; u32 plain_buf1[(64 * 2) + 2] = { 0 }; u32 plain_buf2[(64 * 2) + 2] = { 0 }; u8 *plain_ptr1 = (u8 *) plain_buf1; u8 *plain_ptr2 = (u8 *) plain_buf2; int plain_len1 = 0; int plain_len2 = 0; build_plain ((hashcat_ctx_t *) hashcat_ctx, device_param, &plain1, plain_buf1, &plain_len1); build_plain ((hashcat_ctx_t *) hashcat_ctx, device_param, &plain2, plain_buf2, &plain_len2); const bool always_ascii = (hashconfig->hash_type & OPTS_TYPE_PT_ALWAYS_ASCII) ? true : false; const bool need_hex1 = need_hexify (plain_ptr1, plain_len1, 0, always_ascii); const bool need_hex2 = need_hexify (plain_ptr2, plain_len2, 0, always_ascii); if ((need_hex1 == true) || (need_hex2 == true)) { exec_hexify (plain_ptr1, plain_len1, plain_ptr1); exec_hexify (plain_ptr2, plain_len2, plain_ptr2); plain_ptr1[plain_len1 * 2] = 0; plain_ptr2[plain_len2 * 2] = 0; snprintf (display, HCBUFSIZ_TINY - 1, "$HEX[%s] -> $HEX[%s]", plain_ptr1, plain_ptr2); } else { plain_ptr1[plain_len1] = 0; plain_ptr2[plain_len2] = 0; snprintf (display, HCBUFSIZ_TINY - 1, "%s -> %s", plain_ptr1, plain_ptr2); } return display; } int status_get_digests_done (const hashcat_ctx_t *hashcat_ctx) { const hashes_t *hashes = hashcat_ctx->hashes; return hashes->digests_done; } int status_get_digests_cnt (const hashcat_ctx_t *hashcat_ctx) { const hashes_t *hashes = hashcat_ctx->hashes; return hashes->digests_cnt; } double status_get_digests_percent (const hashcat_ctx_t *hashcat_ctx) { const hashes_t *hashes = hashcat_ctx->hashes; if (hashes->digests_cnt == 0) return 0; return ((double) hashes->digests_done / (double) hashes->digests_cnt) * 100; } int status_get_salts_done (const hashcat_ctx_t *hashcat_ctx) { const hashes_t *hashes = hashcat_ctx->hashes; return hashes->salts_done; } int status_get_salts_cnt (const hashcat_ctx_t *hashcat_ctx) { const hashes_t *hashes = hashcat_ctx->hashes; return hashes->salts_cnt; } double status_get_salts_percent (const hashcat_ctx_t *hashcat_ctx) { const hashes_t *hashes = hashcat_ctx->hashes; if (hashes->salts_cnt == 0) return 0; return ((double) hashes->salts_done / (double) hashes->salts_cnt) * 100; } double status_get_msec_running (const hashcat_ctx_t *hashcat_ctx) { const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; double msec_running = hc_timer_get (status_ctx->timer_running); return msec_running; } double status_get_msec_paused (const hashcat_ctx_t *hashcat_ctx) { const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; double msec_paused = status_ctx->msec_paused; if (status_ctx->devices_status == STATUS_PAUSED) { double msec_paused_tmp = hc_timer_get (status_ctx->timer_paused); msec_paused += msec_paused_tmp; } return msec_paused; } double status_get_msec_real (const hashcat_ctx_t *hashcat_ctx) { const double msec_running = status_get_msec_running (hashcat_ctx); const double msec_paused = status_get_msec_paused (hashcat_ctx); const double msec_real = msec_running - msec_paused; return msec_real; } char *status_get_time_started_absolute (const hashcat_ctx_t *hashcat_ctx) { const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; const hc_time_t time_start = status_ctx->runtime_start; char buf[32] = { 0 }; char *start = hc_ctime (&time_start, buf, 32); const 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; return strdup (start); } char *status_get_time_started_relative (const hashcat_ctx_t *hashcat_ctx) { const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; hc_time_t time_now; hc_time (&time_now); const hc_time_t time_start = status_ctx->runtime_start; hc_time_t sec_run = time_now - time_start; struct tm *tmp; struct tm tm; tmp = hc_gmtime (&sec_run, &tm); char *display_run = (char *) malloc (HCBUFSIZ_TINY); format_timer_display (tmp, display_run, HCBUFSIZ_TINY); return display_run; } hc_time_t status_get_sec_etc (const hashcat_ctx_t *hashcat_ctx) { const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; hc_time_t sec_etc = 0; if ((user_options_extra->wordlist_mode == WL_MODE_FILE) || (user_options_extra->wordlist_mode == WL_MODE_MASK)) { if (status_ctx->devices_status != STATUS_CRACKED) { const u64 progress_cur_relative_skip = status_get_progress_cur_relative_skip (hashcat_ctx); const u64 progress_end_relative_skip = status_get_progress_end_relative_skip (hashcat_ctx); const u64 progress_ignore = status_get_progress_ignore (hashcat_ctx); const double hashes_msec_all = status_get_hashes_msec_all (hashcat_ctx); if (hashes_msec_all > 0) { const u64 progress_left_relative_skip = progress_end_relative_skip - progress_cur_relative_skip; u64 msec_left = (u64) ((progress_left_relative_skip - progress_ignore) / hashes_msec_all); sec_etc = msec_left / 1000; } } } return sec_etc; } char *status_get_time_estimated_absolute (const hashcat_ctx_t *hashcat_ctx) { hc_time_t sec_etc = status_get_sec_etc (hashcat_ctx); hc_time_t now; hc_time (&now); char buf[32] = { 0 }; char *etc; if (overflow_check_u64_add (now, sec_etc) == false) { etc = (char *) ETA_ABSOLUTE_MAX_EXCEEDED; } else { hc_time_t end = now + sec_etc; etc = hc_ctime (&end, buf, sizeof (buf)); if (etc == NULL) etc = (char *) ETA_ABSOLUTE_MAX_EXCEEDED; } const 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; return strdup (etc); } char *status_get_time_estimated_relative (const hashcat_ctx_t *hashcat_ctx) { const user_options_t *user_options = hashcat_ctx->user_options; char *display = (char *) malloc (HCBUFSIZ_TINY); hc_time_t sec_etc = status_get_sec_etc (hashcat_ctx); struct tm *tmp; struct tm tm; tmp = hc_gmtime (&sec_etc, &tm); if (tmp == NULL) { snprintf (display, HCBUFSIZ_TINY, "%s", ETA_RELATIVE_MAX_EXCEEDED); } else { format_timer_display (tmp, display, HCBUFSIZ_TINY); } if (user_options->runtime > 0) { const int runtime_left = get_runtime_left (hashcat_ctx); char *tmp_display = strdup (display); if (runtime_left > 0) { hc_time_t sec_left = runtime_left; struct tm *tmp_left; struct tm tm_left; tmp_left = hc_gmtime (&sec_left, &tm_left); char *display_left = (char *) malloc (HCBUFSIZ_TINY); format_timer_display (tmp_left, display_left, HCBUFSIZ_TINY); snprintf (display, HCBUFSIZ_TINY - 1, "%s; Runtime limited: %s", tmp_display, display_left); free (display_left); } else { snprintf (display, HCBUFSIZ_TINY - 1, "%s; Runtime limit exceeded", tmp_display); } free (tmp_display); } return display; } u64 status_get_restore_point (const hashcat_ctx_t *hashcat_ctx) { const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; const u64 restore_point = status_ctx->words_cur; return restore_point; } u64 status_get_restore_total (const hashcat_ctx_t *hashcat_ctx) { const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; const u64 restore_total = status_ctx->words_base; return restore_total; } double status_get_restore_percent (const hashcat_ctx_t *hashcat_ctx) { double restore_percent = 0; const u64 restore_point = status_get_restore_point (hashcat_ctx); const u64 restore_total = status_get_restore_total (hashcat_ctx); if (restore_total > 0) { restore_percent = ((double) restore_point / (double) restore_total) * 100; } return restore_percent; } int status_get_progress_mode (const hashcat_ctx_t *hashcat_ctx) { const u64 progress_end_relative_skip = status_get_progress_end_relative_skip (hashcat_ctx); if (progress_end_relative_skip > 0) { return PROGRESS_MODE_KEYSPACE_KNOWN; } else { return PROGRESS_MODE_KEYSPACE_UNKNOWN; } } double status_get_progress_finished_percent (const hashcat_ctx_t *hashcat_ctx) { const u64 progress_cur_relative_skip = status_get_progress_cur_relative_skip (hashcat_ctx); const u64 progress_end_relative_skip = status_get_progress_end_relative_skip (hashcat_ctx); double progress_finished_percent = 0; if (progress_end_relative_skip > 0) { progress_finished_percent = ((double) progress_cur_relative_skip / (double) progress_end_relative_skip) * 100; } return progress_finished_percent; } u64 status_get_progress_done (const hashcat_ctx_t *hashcat_ctx) { const hashes_t *hashes = hashcat_ctx->hashes; const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; u64 progress_done = 0; for (u32 salt_pos = 0; salt_pos < hashes->salts_cnt; salt_pos++) { progress_done += status_ctx->words_progress_done[salt_pos]; } return progress_done; } u64 status_get_progress_rejected (const hashcat_ctx_t *hashcat_ctx) { const hashes_t *hashes = hashcat_ctx->hashes; const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; u64 progress_rejected = 0; for (u32 salt_pos = 0; salt_pos < hashes->salts_cnt; salt_pos++) { progress_rejected += status_ctx->words_progress_rejected[salt_pos]; } return progress_rejected; } double status_get_progress_rejected_percent (const hashcat_ctx_t *hashcat_ctx) { const u64 progress_cur = status_get_progress_cur (hashcat_ctx); const u64 progress_rejected = status_get_progress_rejected (hashcat_ctx); double percent_rejected = 0; if (progress_cur) { percent_rejected = ((double) (progress_rejected) / (double) progress_cur) * 100; } return percent_rejected; } u64 status_get_progress_restored (const hashcat_ctx_t *hashcat_ctx) { const hashes_t *hashes = hashcat_ctx->hashes; const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; u64 progress_restored = 0; for (u32 salt_pos = 0; salt_pos < hashes->salts_cnt; salt_pos++) { progress_restored += status_ctx->words_progress_restored[salt_pos]; } return progress_restored; } u64 status_get_progress_cur (const hashcat_ctx_t *hashcat_ctx) { const u64 progress_done = status_get_progress_done (hashcat_ctx); const u64 progress_rejected = status_get_progress_rejected (hashcat_ctx); const u64 progress_restored = status_get_progress_restored (hashcat_ctx); const u64 progress_cur = progress_done + progress_rejected + progress_restored; return progress_cur; } u64 status_get_progress_ignore (const hashcat_ctx_t *hashcat_ctx) { const hashes_t *hashes = hashcat_ctx->hashes; const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; // Important for ETA only u64 progress_ignore = 0; for (u32 salt_pos = 0; salt_pos < hashes->salts_cnt; salt_pos++) { if (hashes->salts_shown[salt_pos] == 1) { const u64 all = status_ctx->words_progress_done[salt_pos] + status_ctx->words_progress_rejected[salt_pos] + status_ctx->words_progress_restored[salt_pos]; const u64 left = status_ctx->words_cnt - all; progress_ignore += left; } } return progress_ignore; } u64 status_get_progress_end (const hashcat_ctx_t *hashcat_ctx) { const hashes_t *hashes = hashcat_ctx->hashes; const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; const user_options_t *user_options = hashcat_ctx->user_options; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; u64 progress_end = status_ctx->words_cnt * hashes->salts_cnt; if (user_options->limit) { const combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; progress_end = MIN (user_options->limit, status_ctx->words_base) * hashes->salts_cnt; if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) progress_end *= straight_ctx->kernel_rules_cnt; else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) progress_end *= combinator_ctx->combs_cnt; else if (user_options_extra->attack_kern == ATTACK_KERN_BF) progress_end *= mask_ctx->bfs_cnt; } return progress_end; } u64 status_get_progress_skip (const hashcat_ctx_t *hashcat_ctx) { const hashes_t *hashes = hashcat_ctx->hashes; const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; const user_options_t *user_options = hashcat_ctx->user_options; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; u64 progress_skip = 0; if (user_options->skip) { const combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; progress_skip = MIN (user_options->skip, status_ctx->words_base) * hashes->salts_cnt; if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) progress_skip *= straight_ctx->kernel_rules_cnt; else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) progress_skip *= combinator_ctx->combs_cnt; else if (user_options_extra->attack_kern == ATTACK_KERN_BF) progress_skip *= mask_ctx->bfs_cnt; } return progress_skip; } u64 status_get_progress_cur_relative_skip (const hashcat_ctx_t *hashcat_ctx) { const u64 progress_skip = status_get_progress_skip (hashcat_ctx); const u64 progress_cur = status_get_progress_cur (hashcat_ctx); u64 progress_cur_relative_skip = 0; if (progress_cur > 0) { progress_cur_relative_skip = progress_cur - progress_skip; } return progress_cur_relative_skip; } u64 status_get_progress_end_relative_skip (const hashcat_ctx_t *hashcat_ctx) { const u64 progress_skip = status_get_progress_skip (hashcat_ctx); const u64 progress_end = status_get_progress_end (hashcat_ctx); u64 progress_end_relative_skip = 0; if (progress_end > 0) { progress_end_relative_skip = progress_end - progress_skip; } return progress_end_relative_skip; } double status_get_hashes_msec_all (const hashcat_ctx_t *hashcat_ctx) { const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; double hashes_all_msec = 0; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { hashes_all_msec += status_get_hashes_msec_dev (hashcat_ctx, device_id); } return hashes_all_msec; } double status_get_hashes_msec_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id) { const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; u64 speed_cnt = 0; double speed_msec = 0; hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == false) { for (int i = 0; i < SPEED_CACHE; i++) { speed_cnt += device_param->speed_cnt[i]; speed_msec += device_param->speed_msec[i]; } } speed_cnt /= SPEED_CACHE; speed_msec /= SPEED_CACHE; double hashes_dev_msec = 0; if (speed_msec > 0) { hashes_dev_msec = (double) speed_cnt / speed_msec; } return hashes_dev_msec; } double status_get_hashes_msec_dev_benchmark (const hashcat_ctx_t *hashcat_ctx, const int device_id) { // this function increases accuracy for benchmark modes const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; u64 speed_cnt = 0; double speed_msec = 0; hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == false) { speed_cnt += device_param->speed_cnt[0]; speed_msec += device_param->speed_msec[0]; } double hashes_dev_msec = 0; if (speed_msec > 0) { hashes_dev_msec = (double) speed_cnt / speed_msec; } return hashes_dev_msec; } double status_get_exec_msec_all (const hashcat_ctx_t *hashcat_ctx) { const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; double exec_all_msec = 0; for (u32 device_id = 0; device_id < opencl_ctx->devices_cnt; device_id++) { exec_all_msec += status_get_exec_msec_dev (hashcat_ctx, device_id); } return exec_all_msec; } double status_get_exec_msec_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id) { const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; double exec_dev_msec = 0; if (device_param->skipped == false) { exec_dev_msec = get_avg_exec_time (device_param, EXEC_CACHE); } return exec_dev_msec; } char *status_get_speed_sec_all (const hashcat_ctx_t *hashcat_ctx) { const double hashes_msec_all = status_get_hashes_msec_all (hashcat_ctx); char *display = (char *) malloc (HCBUFSIZ_TINY); format_speed_display (hashes_msec_all * 1000, display, HCBUFSIZ_TINY); return display; } char *status_get_speed_sec_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id) { const double hashes_msec_dev = status_get_hashes_msec_dev (hashcat_ctx, device_id); char *display = (char *) malloc (HCBUFSIZ_TINY); format_speed_display (hashes_msec_dev * 1000, display, HCBUFSIZ_TINY); return display; } int status_get_cpt_cur_min (const hashcat_ctx_t *hashcat_ctx) { const cpt_ctx_t *cpt_ctx = hashcat_ctx->cpt_ctx; const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; if (status_ctx->accessible == false) return 0; const hc_time_t now = hc_time (NULL); int cpt_cur_min = 0; for (int i = 0; i < CPT_CACHE; i++) { const u32 cracked = cpt_ctx->cpt_buf[i].cracked; const hc_time_t timestamp = cpt_ctx->cpt_buf[i].timestamp; if ((timestamp + 60) > now) { cpt_cur_min += cracked; } } return cpt_cur_min; } int status_get_cpt_cur_hour (const hashcat_ctx_t *hashcat_ctx) { const cpt_ctx_t *cpt_ctx = hashcat_ctx->cpt_ctx; const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; if (status_ctx->accessible == false) return 0; const hc_time_t now = hc_time (NULL); int cpt_cur_hour = 0; for (int i = 0; i < CPT_CACHE; i++) { const u32 cracked = cpt_ctx->cpt_buf[i].cracked; const hc_time_t timestamp = cpt_ctx->cpt_buf[i].timestamp; if ((timestamp + 3600) > now) { cpt_cur_hour += cracked; } } return cpt_cur_hour; } int status_get_cpt_cur_day (const hashcat_ctx_t *hashcat_ctx) { const cpt_ctx_t *cpt_ctx = hashcat_ctx->cpt_ctx; const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; if (status_ctx->accessible == false) return 0; const hc_time_t now = hc_time (NULL); int cpt_cur_day = 0; for (int i = 0; i < CPT_CACHE; i++) { const u32 cracked = cpt_ctx->cpt_buf[i].cracked; const hc_time_t timestamp = cpt_ctx->cpt_buf[i].timestamp; if ((timestamp + 86400) > now) { cpt_cur_day += cracked; } } return cpt_cur_day; } int status_get_cpt_avg_min (const hashcat_ctx_t *hashcat_ctx) { const cpt_ctx_t *cpt_ctx = hashcat_ctx->cpt_ctx; const double msec_real = status_get_msec_real (hashcat_ctx); const double cpt_avg_min = (double) cpt_ctx->cpt_total / ((msec_real / 1000) / 60); return (int) cpt_avg_min; } int status_get_cpt_avg_hour (const hashcat_ctx_t *hashcat_ctx) { const cpt_ctx_t *cpt_ctx = hashcat_ctx->cpt_ctx; const double msec_real = status_get_msec_real (hashcat_ctx); const double cpt_avg_hour = (double) cpt_ctx->cpt_total / ((msec_real / 1000) / 3600); return (int) cpt_avg_hour; } int status_get_cpt_avg_day (const hashcat_ctx_t *hashcat_ctx) { const cpt_ctx_t *cpt_ctx = hashcat_ctx->cpt_ctx; const double msec_real = status_get_msec_real (hashcat_ctx); const double cpt_avg_day = (double) cpt_ctx->cpt_total / ((msec_real / 1000) / 86400); return (int) cpt_avg_day; } char *status_get_cpt (const hashcat_ctx_t *hashcat_ctx) { const cpt_ctx_t *cpt_ctx = hashcat_ctx->cpt_ctx; const hc_time_t now = hc_time (NULL); char *cpt; const int cpt_cur_min = status_get_cpt_cur_min (hashcat_ctx); const int cpt_cur_hour = status_get_cpt_cur_hour (hashcat_ctx); const int cpt_cur_day = status_get_cpt_cur_day (hashcat_ctx); const int cpt_avg_min = status_get_cpt_avg_min (hashcat_ctx); const int cpt_avg_hour = status_get_cpt_avg_hour (hashcat_ctx); const int cpt_avg_day = status_get_cpt_avg_day (hashcat_ctx); if ((cpt_ctx->cpt_start + 86400) < now) { hc_asprintf (&cpt, "CUR:%d,%d,%d AVG:%d,%d,%d (Min,Hour,Day)", cpt_cur_min, cpt_cur_hour, cpt_cur_day, cpt_avg_min, cpt_avg_hour, cpt_avg_day); } else if ((cpt_ctx->cpt_start + 3600) < now) { hc_asprintf (&cpt, "CUR:%d,%d,N/A AVG:%d,%d,%d (Min,Hour,Day)", cpt_cur_min, cpt_cur_hour, cpt_avg_min, cpt_avg_hour, cpt_avg_day); } else if ((cpt_ctx->cpt_start + 60) < now) { hc_asprintf (&cpt, "CUR:%d,N/A,N/A AVG:%d,%d,%d (Min,Hour,Day)", cpt_cur_min, cpt_avg_min, cpt_avg_hour, cpt_avg_day); } else { hc_asprintf (&cpt, "CUR:N/A,N/A,N/A AVG:%d,%d,%d (Min,Hour,Day)", cpt_avg_min, cpt_avg_hour, cpt_avg_day); } return cpt; } char *status_get_hwmon_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id) { const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; char *output_buf = (char *) malloc (HCBUFSIZ_TINY); snprintf (output_buf, HCBUFSIZ_TINY - 1, "N/A"); if (device_param->skipped == true) return output_buf; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; hc_thread_mutex_lock (status_ctx->mux_hwmon); const int num_temperature = hm_get_temperature_with_device_id ((hashcat_ctx_t *) hashcat_ctx, device_id); const int num_fanspeed = hm_get_fanspeed_with_device_id ((hashcat_ctx_t *) hashcat_ctx, device_id); const int num_utilization = hm_get_utilization_with_device_id ((hashcat_ctx_t *) hashcat_ctx, device_id); const int num_corespeed = hm_get_corespeed_with_device_id ((hashcat_ctx_t *) hashcat_ctx, device_id); const int num_memoryspeed = hm_get_memoryspeed_with_device_id ((hashcat_ctx_t *) hashcat_ctx, device_id); const int num_buslanes = hm_get_buslanes_with_device_id ((hashcat_ctx_t *) hashcat_ctx, device_id); int output_len = 0; if (num_temperature >= 0) { output_len += snprintf (output_buf + output_len, HCBUFSIZ_TINY - output_len, "Temp:%3dc ", num_temperature); } if (num_fanspeed >= 0) { output_len += snprintf (output_buf + output_len, HCBUFSIZ_TINY - output_len, "Fan:%3d%% ", num_fanspeed); } if (num_utilization >= 0) { output_len += snprintf (output_buf + output_len, HCBUFSIZ_TINY - output_len, "Util:%3d%% ", num_utilization); } if (num_corespeed >= 0) { output_len += snprintf (output_buf + output_len, HCBUFSIZ_TINY - output_len, "Core:%4dMHz ", num_corespeed); } if (num_memoryspeed >= 0) { output_len += snprintf (output_buf + output_len, HCBUFSIZ_TINY - output_len, "Mem:%4dMHz ", num_memoryspeed); } if (num_buslanes >= 0) { output_len += snprintf (output_buf + output_len, HCBUFSIZ_TINY - output_len, "Bus:%d ", num_buslanes); } if (output_len > 0) { // trims the trailing space output_buf[output_len - 1] = 0; } else { snprintf (output_buf, HCBUFSIZ_TINY - 1, "N/A"); } hc_thread_mutex_unlock (status_ctx->mux_hwmon); return output_buf; } int status_get_corespeed_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id) { const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) return -1; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; hc_thread_mutex_lock (status_ctx->mux_hwmon); const int num_corespeed = hm_get_corespeed_with_device_id ((hashcat_ctx_t *) hashcat_ctx, device_id); hc_thread_mutex_unlock (status_ctx->mux_hwmon); return num_corespeed; } int status_get_memoryspeed_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id) { const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) return -1; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; hc_thread_mutex_lock (status_ctx->mux_hwmon); const int num_memoryspeed = hm_get_memoryspeed_with_device_id ((hashcat_ctx_t *) hashcat_ctx, device_id); hc_thread_mutex_unlock (status_ctx->mux_hwmon); return num_memoryspeed; } int status_get_progress_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id) { const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) return 0; return device_param->outerloop_left; } double status_get_runtime_msec_dev (const hashcat_ctx_t *hashcat_ctx, const int device_id) { const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; hc_device_param_t *device_param = &opencl_ctx->devices_param[device_id]; if (device_param->skipped == true) return 0; return device_param->outerloop_msec; } int status_progress_init (hashcat_ctx_t *hashcat_ctx) { status_ctx_t *status_ctx = hashcat_ctx->status_ctx; hashes_t *hashes = hashcat_ctx->hashes; status_ctx->words_progress_done = (u64 *) hccalloc (hashes->salts_cnt, sizeof (u64)); status_ctx->words_progress_rejected = (u64 *) hccalloc (hashes->salts_cnt, sizeof (u64)); status_ctx->words_progress_restored = (u64 *) hccalloc (hashes->salts_cnt, sizeof (u64)); return 0; } void status_progress_destroy (hashcat_ctx_t *hashcat_ctx) { status_ctx_t *status_ctx = hashcat_ctx->status_ctx; hcfree (status_ctx->words_progress_done); hcfree (status_ctx->words_progress_rejected); hcfree (status_ctx->words_progress_restored); status_ctx->words_progress_done = NULL; status_ctx->words_progress_rejected = NULL; status_ctx->words_progress_restored = NULL; } void status_progress_reset (hashcat_ctx_t *hashcat_ctx) { status_ctx_t *status_ctx = hashcat_ctx->status_ctx; hashes_t *hashes = hashcat_ctx->hashes; memset (status_ctx->words_progress_done, 0, hashes->salts_cnt * sizeof (u64)); memset (status_ctx->words_progress_rejected, 0, hashes->salts_cnt * sizeof (u64)); memset (status_ctx->words_progress_restored, 0, hashes->salts_cnt * sizeof (u64)); } int status_ctx_init (hashcat_ctx_t *hashcat_ctx) { status_ctx_t *status_ctx = hashcat_ctx->status_ctx; status_ctx->devices_status = STATUS_INIT; status_ctx->run_main_level1 = true; status_ctx->run_main_level2 = true; status_ctx->run_main_level3 = true; status_ctx->run_thread_level1 = true; status_ctx->run_thread_level2 = true; status_ctx->shutdown_inner = false; status_ctx->shutdown_outer = false; status_ctx->checkpoint_shutdown = false; status_ctx->hashcat_status_final = (hashcat_status_t *) hcmalloc (sizeof (hashcat_status_t)); hc_thread_mutex_init (status_ctx->mux_dispatcher); hc_thread_mutex_init (status_ctx->mux_counter); hc_thread_mutex_init (status_ctx->mux_display); hc_thread_mutex_init (status_ctx->mux_hwmon); return 0; } void status_ctx_destroy (hashcat_ctx_t *hashcat_ctx) { status_ctx_t *status_ctx = hashcat_ctx->status_ctx; hc_thread_mutex_delete (status_ctx->mux_dispatcher); hc_thread_mutex_delete (status_ctx->mux_counter); hc_thread_mutex_delete (status_ctx->mux_display); hc_thread_mutex_delete (status_ctx->mux_hwmon); hcfree (status_ctx->hashcat_status_final); memset (status_ctx, 0, sizeof (status_ctx_t)); } void status_status_destroy (hashcat_ctx_t *hashcat_ctx, hashcat_status_t *hashcat_status) { const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; if (status_ctx == NULL) return; if (status_ctx->accessible == false) return; hcfree (hashcat_status->session); hcfree (hashcat_status->time_estimated_absolute); hcfree (hashcat_status->time_estimated_relative); hcfree (hashcat_status->time_started_absolute); hcfree (hashcat_status->time_started_relative); hcfree (hashcat_status->speed_sec_all); hcfree (hashcat_status->guess_base); hcfree (hashcat_status->guess_mod); hcfree (hashcat_status->guess_charset); hcfree (hashcat_status->cpt); hashcat_status->session = NULL; hashcat_status->time_estimated_absolute = NULL; hashcat_status->time_estimated_relative = NULL; hashcat_status->time_started_absolute = NULL; hashcat_status->time_started_relative = NULL; hashcat_status->speed_sec_all = NULL; hashcat_status->guess_base = NULL; hashcat_status->guess_mod = NULL; hashcat_status->guess_charset = NULL; hashcat_status->cpt = NULL; for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) { device_info_t *device_info = hashcat_status->device_info_buf + device_id; hcfree (device_info->speed_sec_dev); hcfree (device_info->guess_candidates_dev); hcfree (device_info->hwmon_dev); device_info->speed_sec_dev = NULL; device_info->guess_candidates_dev = NULL; device_info->hwmon_dev = NULL; } } hashcat-4.0.1/src/stdout.c000066400000000000000000000154231320027462700154140ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "event.h" #include "locking.h" #include "rp_kernel_on_cpu.h" #include "rp_kernel_on_cpu_optimized.h" #include "mpsp.h" #include "opencl.h" #include "shared.h" #include "stdout.h" static void out_flush (out_t *out) { if (out->len == 0) return; hc_fwrite (out->buf, 1, out->len, out->fp); out->len = 0; } static void out_push (out_t *out, const u8 *pw_buf, const int pw_len) { char *ptr = out->buf + out->len; memcpy (ptr, pw_buf, pw_len); #if defined (_WIN) ptr[pw_len + 0] = '\r'; ptr[pw_len + 1] = '\n'; out->len += pw_len + 2; #else ptr[pw_len] = '\n'; out->len += pw_len + 1; #endif if (out->len >= HCBUFSIZ_TINY - 300) { out_flush (out); } } int process_stdout (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 pws_cnt) { combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; outfile_ctx_t *outfile_ctx = hashcat_ctx->outfile_ctx; straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; user_options_t *user_options = hashcat_ctx->user_options; out_t out; out.fp = stdout; char *filename = outfile_ctx->filename; if (filename) { FILE *fp = fopen (filename, "ab"); if (fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", filename, strerror (errno)); return -1; } if (lock_file (fp) == -1) { fclose (fp); event_log_error (hashcat_ctx, "%s: %s", filename, strerror (errno)); return -1; } out.fp = fp; } out.len = 0; u32 plain_buf[64] = { 0 }; u8 *plain_ptr = (u8 *) plain_buf; u32 plain_len = 0; const u32 il_cnt = device_param->kernel_params_buf32[30]; // ugly, i know if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { pw_t pw; for (u32 gidvid = 0; gidvid < pws_cnt; gidvid++) { const int rc = gidd_to_pw_t (hashcat_ctx, device_param, gidvid, &pw); if (rc == -1) { if (filename) fclose (out.fp); return -1; } for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { const u32 off = device_param->innerloop_pos + il_pos; if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { for (int i = 0; i < 8; i++) { plain_buf[i] = pw.i[i]; } plain_len = apply_rules_optimized (straight_ctx->kernel_rules_buf[off].cmds, &plain_buf[0], &plain_buf[4], pw.pw_len); } else { for (int i = 0; i < 64; i++) { plain_buf[i] = pw.i[i]; } plain_len = apply_rules (straight_ctx->kernel_rules_buf[off].cmds, plain_buf, pw.pw_len); } if (plain_len > hashconfig->pw_max) plain_len = hashconfig->pw_max; out_push (&out, plain_ptr, plain_len); } } } else if (user_options->attack_mode == ATTACK_MODE_COMBI) { pw_t pw; for (u32 gidvid = 0; gidvid < pws_cnt; gidvid++) { const int rc = gidd_to_pw_t (hashcat_ctx, device_param, gidvid, &pw); if (rc == -1) { if (filename) fclose (out.fp); return -1; } for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { for (int i = 0; i < 64; i++) { plain_buf[i] = pw.i[i]; } plain_len = pw.pw_len; char *comb_buf = (char *) device_param->combs_buf[il_pos].i; u32 comb_len = device_param->combs_buf[il_pos].pw_len; if (combinator_ctx->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; if (plain_len > hashconfig->pw_max) plain_len = hashconfig->pw_max; out_push (&out, plain_ptr, plain_len); } } } else if (user_options->attack_mode == ATTACK_MODE_BF) { for (u32 gidvid = 0; gidvid < pws_cnt; gidvid++) { for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { u64 l_off = device_param->kernel_params_mp_l_buf64[3] + gidvid; u64 r_off = device_param->kernel_params_mp_r_buf64[3] + il_pos; u32 l_start = device_param->kernel_params_mp_l_buf32[5]; u32 r_start = device_param->kernel_params_mp_r_buf32[5]; u32 l_stop = device_param->kernel_params_mp_l_buf32[4]; u32 r_stop = device_param->kernel_params_mp_r_buf32[4]; sp_exec (l_off, (char *) plain_ptr + l_start, mask_ctx->root_css_buf, mask_ctx->markov_css_buf, l_start, l_start + l_stop); sp_exec (r_off, (char *) plain_ptr + r_start, mask_ctx->root_css_buf, mask_ctx->markov_css_buf, r_start, r_start + r_stop); plain_len = mask_ctx->css_cnt; out_push (&out, plain_ptr, plain_len); } } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { pw_t pw; for (u32 gidvid = 0; gidvid < pws_cnt; gidvid++) { const int rc = gidd_to_pw_t (hashcat_ctx, device_param, gidvid, &pw); if (rc == -1) { if (filename) fclose (out.fp); return -1; } for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { for (int i = 0; i < 64; i++) { plain_buf[i] = pw.i[i]; } plain_len = pw.pw_len; u64 off = device_param->kernel_params_mp_buf64[3] + il_pos; u32 start = 0; u32 stop = device_param->kernel_params_mp_buf32[4]; sp_exec (off, (char *) plain_ptr + plain_len, mask_ctx->root_css_buf, mask_ctx->markov_css_buf, start, start + stop); plain_len += start + stop; out_push (&out, plain_ptr, plain_len); } } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { pw_t pw; for (u32 gidvid = 0; gidvid < pws_cnt; gidvid++) { const int rc = gidd_to_pw_t (hashcat_ctx, device_param, gidvid, &pw); if (rc == -1) { if (filename) fclose (out.fp); return -1; } for (u32 il_pos = 0; il_pos < il_cnt; il_pos++) { for (int i = 0; i < 64; i++) { plain_buf[i] = pw.i[i]; } plain_len = pw.pw_len; char *comb_buf = (char *) device_param->combs_buf[il_pos].i; u32 comb_len = device_param->combs_buf[il_pos].pw_len; memcpy (plain_ptr + plain_len, comb_buf, comb_len); plain_len += comb_len; if (plain_len > hashconfig->pw_max) plain_len = hashconfig->pw_max; out_push (&out, plain_ptr, plain_len); } } } out_flush (&out); if (filename) fclose (out.fp); return 0; } hashcat-4.0.1/src/straight.c000066400000000000000000000300531320027462700157130ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "logfile.h" #include "shared.h" #include "filehandling.h" #include "folder.h" #include "rp.h" #include "rp_cpu.h" #include "straight.h" #include "wordlist.h" static int straight_ctx_add_wl (hashcat_ctx_t *hashcat_ctx, const char *dict) { straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; if (straight_ctx->dicts_avail == straight_ctx->dicts_cnt) { straight_ctx->dicts = (char **) hcrealloc (straight_ctx->dicts, straight_ctx->dicts_avail * sizeof (char *), INCR_DICTS * sizeof (char *)); straight_ctx->dicts_avail += INCR_DICTS; } straight_ctx->dicts[straight_ctx->dicts_cnt] = hcstrdup (dict); straight_ctx->dicts_cnt++; return 0; } int straight_ctx_update_loop (hashcat_ctx_t *hashcat_ctx) { combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; induct_ctx_t *induct_ctx = hashcat_ctx->induct_ctx; logfile_ctx_t *logfile_ctx = hashcat_ctx->logfile_ctx; mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; user_options_t *user_options = hashcat_ctx->user_options; if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { if (user_options_extra->wordlist_mode == WL_MODE_FILE) { if (induct_ctx->induction_dictionaries_cnt) { straight_ctx->dict = induct_ctx->induction_dictionaries[induct_ctx->induction_dictionaries_pos]; } else { straight_ctx->dict = straight_ctx->dicts[straight_ctx->dicts_pos]; } logfile_sub_string (straight_ctx->dict); for (u32 i = 0; i < user_options->rp_files_cnt; i++) { logfile_sub_var_string ("rulefile", user_options->rp_files[i]); } FILE *fd = fopen (straight_ctx->dict, "rb"); if (fd == NULL) { event_log_error (hashcat_ctx, "%s: %s", straight_ctx->dict, strerror (errno)); return -1; } const int rc = count_words (hashcat_ctx, fd, straight_ctx->dict, &status_ctx->words_cnt); fclose (fd); if (rc == -1) { event_log_error (hashcat_ctx, "Integer overflow detected in keyspace of wordlist: %s", straight_ctx->dict); return -1; } if (status_ctx->words_cnt == 0) { logfile_sub_msg ("STOP"); return 0; } } } else if (user_options->attack_mode == ATTACK_MODE_COMBI) { logfile_sub_string (combinator_ctx->dict1); logfile_sub_string (combinator_ctx->dict2); if (combinator_ctx->combs_mode == COMBINATOR_MODE_BASE_LEFT) { FILE *fd = fopen (combinator_ctx->dict1, "rb"); if (fd == NULL) { event_log_error (hashcat_ctx, "%s: %s", combinator_ctx->dict1, strerror (errno)); return -1; } const int rc = count_words (hashcat_ctx, fd, combinator_ctx->dict1, &status_ctx->words_cnt); fclose (fd); if (rc == -1) { event_log_error (hashcat_ctx, "Integer overflow detected in keyspace of wordlist: %s", combinator_ctx->dict1); return -1; } } else if (combinator_ctx->combs_mode == COMBINATOR_MODE_BASE_RIGHT) { FILE *fd = fopen (combinator_ctx->dict2, "rb"); if (fd == NULL) { event_log_error (hashcat_ctx, "%s: %s", combinator_ctx->dict2, strerror (errno)); return -1; } const int rc = count_words (hashcat_ctx, fd, combinator_ctx->dict2, &status_ctx->words_cnt); fclose (fd); if (rc == -1) { event_log_error (hashcat_ctx, "Integer overflow detected in keyspace of wordlist: %s", combinator_ctx->dict2); return -1; } } if (status_ctx->words_cnt == 0) { logfile_sub_msg ("STOP"); return 0; } } else if (user_options->attack_mode == ATTACK_MODE_BF) { logfile_sub_string (mask_ctx->mask); } else if ((user_options->attack_mode == ATTACK_MODE_HYBRID1) || (user_options->attack_mode == ATTACK_MODE_HYBRID2)) { if (induct_ctx->induction_dictionaries_cnt) { straight_ctx->dict = induct_ctx->induction_dictionaries[induct_ctx->induction_dictionaries_pos]; } else { straight_ctx->dict = straight_ctx->dicts[straight_ctx->dicts_pos]; } logfile_sub_string (straight_ctx->dict); logfile_sub_string (mask_ctx->mask); FILE *fd = fopen (straight_ctx->dict, "rb"); if (fd == NULL) { event_log_error (hashcat_ctx, "%s: %s", straight_ctx->dict, strerror (errno)); return -1; } const int rc = count_words (hashcat_ctx, fd, straight_ctx->dict, &status_ctx->words_cnt); fclose (fd); if (rc == -1) { event_log_error (hashcat_ctx, "Integer overflow detected in keyspace of wordlist: %s", straight_ctx->dict); return -1; } if (status_ctx->words_cnt == 0) { logfile_sub_msg ("STOP"); return 0; } } return 0; } int straight_ctx_init (hashcat_ctx_t *hashcat_ctx) { straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; user_options_t *user_options = hashcat_ctx->user_options; straight_ctx->enabled = false; if (user_options->example_hashes == true) return 0; if (user_options->left == true) return 0; if (user_options->opencl_info == true) return 0; if (user_options->show == true) return 0; if (user_options->usage == true) return 0; if (user_options->version == true) return 0; if (user_options->attack_mode == ATTACK_MODE_BF) return 0; straight_ctx->enabled = true; /** * generate NOP rules */ if ((user_options->rp_files_cnt == 0) && (user_options->rp_gen == 0)) { straight_ctx->kernel_rules_buf = (kernel_rule_t *) hcmalloc (sizeof (kernel_rule_t)); straight_ctx->kernel_rules_buf[0].cmds[0] = RULE_OP_MANGLE_NOOP; straight_ctx->kernel_rules_cnt = 1; } else { if (user_options->rp_files_cnt) { const int rc_kernel_load = kernel_rules_load (hashcat_ctx, &straight_ctx->kernel_rules_buf, &straight_ctx->kernel_rules_cnt); if (rc_kernel_load == -1) return -1; } else if (user_options->rp_gen) { const int rc_kernel_generate = kernel_rules_generate (hashcat_ctx, &straight_ctx->kernel_rules_buf, &straight_ctx->kernel_rules_cnt); if (rc_kernel_generate == -1) return -1; } } /** * wordlist based work */ if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { if (user_options_extra->wordlist_mode == WL_MODE_FILE) { for (int i = 0; i < user_options_extra->hc_workc; i++) { char *l0_filename = user_options_extra->hc_workv[i]; // at this point we already verified the path actually exist and is readable if (hc_path_is_directory (l0_filename) == true) { char **dictionary_files; dictionary_files = scan_directory (l0_filename); if (dictionary_files != NULL) { qsort (dictionary_files, (size_t) count_dictionaries (dictionary_files), sizeof (char *), sort_by_stringptr); for (int d = 0; dictionary_files[d] != NULL; d++) { char *l1_filename = dictionary_files[d]; if (hc_path_read (l1_filename) == false) { event_log_error (hashcat_ctx, "%s: %s", l1_filename, strerror (errno)); hcfree (dictionary_files); return -1; } if (hc_path_is_file (l1_filename) == true) { const int rc = straight_ctx_add_wl (hashcat_ctx, l1_filename); if (rc == -1) { hcfree (dictionary_files); return -1; } } } } hcfree (dictionary_files); } else { const int rc = straight_ctx_add_wl (hashcat_ctx, l0_filename); if (rc == -1) return -1; } } if (straight_ctx->dicts_cnt == 0) { event_log_error (hashcat_ctx, "No usable dictionary file found."); return -1; } } } else if (user_options->attack_mode == ATTACK_MODE_COMBI) { } else if (user_options->attack_mode == ATTACK_MODE_BF) { } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { for (int i = 0; i < user_options_extra->hc_workc - 1; i++) { char *l0_filename = user_options_extra->hc_workv[i]; // at this point we already verified the path actually exist and is readable if (hc_path_is_directory (l0_filename) == true) { char **dictionary_files; dictionary_files = scan_directory (l0_filename); if (dictionary_files != NULL) { qsort (dictionary_files, (size_t) count_dictionaries (dictionary_files), sizeof (char *), sort_by_stringptr); for (int d = 0; dictionary_files[d] != NULL; d++) { char *l1_filename = dictionary_files[d]; if (hc_path_read (l1_filename) == false) { event_log_error (hashcat_ctx, "%s: %s", l1_filename, strerror (errno)); hcfree (dictionary_files); return -1; } if (hc_path_is_file (l1_filename) == true) { const int rc = straight_ctx_add_wl (hashcat_ctx, l1_filename); if (rc == -1) { hcfree (dictionary_files); return -1; } } } } hcfree (dictionary_files); } else { const int rc = straight_ctx_add_wl (hashcat_ctx, l0_filename); if (rc == -1) return -1; } } if (straight_ctx->dicts_cnt == 0) { event_log_error (hashcat_ctx, "No usable dictionary file found."); return -1; } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { for (int i = 1; i < user_options_extra->hc_workc; i++) { char *l0_filename = user_options_extra->hc_workv[i]; // at this point we already verified the path actually exist and is readable if (hc_path_is_directory (l0_filename) == true) { char **dictionary_files; dictionary_files = scan_directory (l0_filename); if (dictionary_files != NULL) { qsort (dictionary_files, (size_t) count_dictionaries (dictionary_files), sizeof (char *), sort_by_stringptr); for (int d = 0; dictionary_files[d] != NULL; d++) { char *l1_filename = dictionary_files[d]; if (hc_path_read (l1_filename) == false) { event_log_error (hashcat_ctx, "%s: %s", l1_filename, strerror (errno)); hcfree (dictionary_files); return -1; } if (hc_path_is_file (l1_filename) == true) { const int rc = straight_ctx_add_wl (hashcat_ctx, l1_filename); if (rc == -1) { hcfree (dictionary_files); return -1; } } } } hcfree (dictionary_files); } else { const int rc = straight_ctx_add_wl (hashcat_ctx, l0_filename); if (rc == -1) return -1; } } if (straight_ctx->dicts_cnt == 0) { event_log_error (hashcat_ctx, "No usable dictionary file found."); return -1; } } return 0; } void straight_ctx_destroy (hashcat_ctx_t *hashcat_ctx) { straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; if (straight_ctx->enabled == false) return; for (u32 dict_pos = 0; dict_pos < straight_ctx->dicts_cnt; dict_pos++) { hcfree (straight_ctx->dicts[dict_pos]); } hcfree (straight_ctx->dicts); hcfree (straight_ctx->kernel_rules_buf); memset (straight_ctx, 0, sizeof (straight_ctx_t)); } hashcat-4.0.1/src/terminal.c000066400000000000000000001165141320027462700157100ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "convert.h" #include "thread.h" #include "timer.h" #include "status.h" #include "restore.h" #include "shared.h" #include "hwmon.h" #include "interface.h" #include "outfile.h" #include "terminal.h" #include "hashcat.h" static const size_t TERMINAL_LINE_LENGTH = 79; static const char *PROMPT = "[s]tatus [p]ause [r]esume [b]ypass [c]heckpoint [q]uit => "; void welcome_screen (hashcat_ctx_t *hashcat_ctx, const char *version_tag) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; if (user_options->keyspace == true) return; if (user_options->stdout_flag == true) return; if (user_options->show == true) return; if (user_options->left == true) return; if (user_options->benchmark == true) { if (user_options->machine_readable == false) { event_log_info (hashcat_ctx, "%s (%s) starting in benchmark mode...", PROGNAME, version_tag); event_log_info (hashcat_ctx, NULL); if (user_options->workload_profile_chgd == false) { event_log_advice (hashcat_ctx, "Benchmarking uses hand-optimized kernel code by default."); event_log_advice (hashcat_ctx, "You can use it in your cracking session by setting the -O option."); event_log_advice (hashcat_ctx, "Note: Using optimized kernel code limits the maximum supported password length."); event_log_advice (hashcat_ctx, "To disable the optimized kernel code in benchmark mode, use the -w option."); event_log_advice (hashcat_ctx, NULL); } } else { event_log_info (hashcat_ctx, "# version: %s", version_tag); } } else if (user_options->restore == true) { event_log_info (hashcat_ctx, "%s (%s) starting in restore mode...", PROGNAME, version_tag); event_log_info (hashcat_ctx, NULL); } else if (user_options->speed_only == true) { event_log_info (hashcat_ctx, "%s (%s) starting in speed-only mode...", PROGNAME, version_tag); event_log_info (hashcat_ctx, NULL); } else if (user_options->progress_only == true) { event_log_info (hashcat_ctx, "%s (%s) starting in progress-only mode...", PROGNAME, version_tag); event_log_info (hashcat_ctx, NULL); } else { event_log_info (hashcat_ctx, "%s (%s) starting...", PROGNAME, version_tag); event_log_info (hashcat_ctx, NULL); } } void goodbye_screen (hashcat_ctx_t *hashcat_ctx, const hc_time_t proc_start, const hc_time_t proc_stop) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; if (user_options->keyspace == true) return; if (user_options->stdout_flag == true) return; if (user_options->show == true) return; if (user_options->left == true) return; char start_buf[32]; memset (start_buf, 0, sizeof (start_buf)); char stop_buf[32]; memset (start_buf, 0, sizeof (stop_buf)); event_log_info_nn (hashcat_ctx, "Started: %s", hc_ctime (&proc_start, start_buf, 32)); event_log_info_nn (hashcat_ctx, "Stopped: %s", hc_ctime (&proc_stop, stop_buf, 32)); } int setup_console () { #if defined (_WIN) SetConsoleWindowSize (132); if (_setmode (_fileno (stdin), _O_BINARY) == -1) { __mingw_fprintf (stderr, "%s: %m", "stdin"); return -1; } if (_setmode (_fileno (stdout), _O_BINARY) == -1) { __mingw_fprintf (stderr, "%s: %m", "stdin"); return -1; } if (_setmode (_fileno (stderr), _O_BINARY) == -1) { __mingw_fprintf (stderr, "%s: %m", "stdin"); return -1; } #endif return 0; } void send_prompt () { fprintf (stdout, "%s", PROMPT); fflush (stdout); } void clear_prompt () { fputc ('\r', stdout); for (size_t i = 0; i < strlen (PROMPT); i++) { fputc (' ', stdout); } fputc ('\r', stdout); fflush (stdout); } static void keypress (hashcat_ctx_t *hashcat_ctx) { status_ctx_t *status_ctx = hashcat_ctx->status_ctx; user_options_t *user_options = hashcat_ctx->user_options; // this is required, because some of the variables down there are not initialized at that point while (status_ctx->devices_status == STATUS_INIT) usleep (100000); const bool quiet = user_options->quiet; tty_break (); while (status_ctx->shutdown_outer == false) { int ch = tty_getchar (); if (ch == -1) break; if (ch == 0) continue; //https://github.com/hashcat/hashcat/issues/302 //#if defined (_POSIX) //if (ch != '\n') //#endif hc_thread_mutex_lock (status_ctx->mux_display); event_log_info (hashcat_ctx, NULL); switch (ch) { case 's': case '\r': case '\n': event_log_info (hashcat_ctx, NULL); status_display (hashcat_ctx); event_log_info (hashcat_ctx, NULL); if (quiet == false) send_prompt (); break; case 'b': event_log_info (hashcat_ctx, NULL); bypass (hashcat_ctx); event_log_info (hashcat_ctx, "Next dictionary / mask in queue selected. Bypassing current one."); event_log_info (hashcat_ctx, NULL); if (quiet == false) send_prompt (); break; case 'p': event_log_info (hashcat_ctx, NULL); SuspendThreads (hashcat_ctx); if (status_ctx->devices_status == STATUS_PAUSED) { event_log_info (hashcat_ctx, "Paused"); } event_log_info (hashcat_ctx, NULL); if (quiet == false) send_prompt (); break; case 'r': event_log_info (hashcat_ctx, NULL); ResumeThreads (hashcat_ctx); if (status_ctx->devices_status == STATUS_RUNNING) { event_log_info (hashcat_ctx, "Resumed"); } event_log_info (hashcat_ctx, NULL); if (quiet == false) send_prompt (); break; case 'c': event_log_info (hashcat_ctx, NULL); stop_at_checkpoint (hashcat_ctx); if (status_ctx->checkpoint_shutdown == true) { event_log_info (hashcat_ctx, "Checkpoint enabled. Will quit at next restore-point update."); } else { event_log_info (hashcat_ctx, "Checkpoint disabled. Restore-point updates will no longer be monitored."); } event_log_info (hashcat_ctx, NULL); if (quiet == false) send_prompt (); break; case 'q': event_log_info (hashcat_ctx, NULL); myquit (hashcat_ctx); break; } //https://github.com/hashcat/hashcat/issues/302 //#if defined (_POSIX) //if (ch != '\n') //#endif hc_thread_mutex_unlock (status_ctx->mux_display); } tty_fix (); } void *thread_keypress (void *p) { hashcat_ctx_t *hashcat_ctx = (hashcat_ctx_t *) p; keypress (hashcat_ctx); return NULL; } #if defined (_WIN) void SetConsoleWindowSize (const int x) { HANDLE h = GetStdHandle (STD_OUTPUT_HANDLE); if (h == INVALID_HANDLE_VALUE) return; CONSOLE_SCREEN_BUFFER_INFO bufferInfo; if (!GetConsoleScreenBufferInfo (h, &bufferInfo)) return; SMALL_RECT *sr = &bufferInfo.srWindow; sr->Right = MAX (sr->Right, x - 1); COORD co; co.X = sr->Right + 1; co.Y = 9999; if (!SetConsoleScreenBufferSize (h, co)) return; if (!SetConsoleWindowInfo (h, TRUE, sr)) return; } #endif #if defined (__linux__) || defined (__CYGWIN__) static struct termios savemodes; static int havemodes = 0; int tty_break() { struct termios modmodes; if (tcgetattr (fileno (stdin), &savemodes) < 0) return -1; havemodes = 1; modmodes = savemodes; modmodes.c_lflag &= ~ICANON; modmodes.c_cc[VMIN] = 1; modmodes.c_cc[VTIME] = 0; return tcsetattr (fileno (stdin), TCSANOW, &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 tcsetattr (fileno (stdin), TCSADRAIN, &savemodes); } #endif #if defined (__APPLE__) || defined (__FreeBSD__) 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 #if defined (_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; memset (buf, 0, sizeof (buf)); ReadConsoleInput (stdinHandle, buf, 100, &num); FlushConsoleInputBuffer (stdinHandle); for (DWORD 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 void compress_terminal_line_length (char *out_buf, const size_t keep_from_beginning, const size_t keep_from_end) { const size_t target_len = TERMINAL_LINE_LENGTH - keep_from_beginning; const size_t out_len = strlen (out_buf); if (out_len < target_len) return; char *ptr1 = out_buf + target_len - 3 - keep_from_end; char *ptr2 = out_buf + out_len - keep_from_end; *ptr1++ = '.'; *ptr1++ = '.'; *ptr1++ = '.'; for (size_t i = 0; i < keep_from_end; i++) { *ptr1++ = *ptr2++; } *ptr1 = 0; } void example_hashes (hashcat_ctx_t *hashcat_ctx) { user_options_t *user_options = hashcat_ctx->user_options; if (user_options->hash_mode_chgd == true) { const int rc = hashconfig_init (hashcat_ctx); if (rc == 0) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; event_log_info (hashcat_ctx, "MODE: %u", hashconfig->hash_mode); event_log_info (hashcat_ctx, "TYPE: %s", strhashtype (hashconfig->hash_mode)); if ((hashconfig->st_hash != NULL) && (hashconfig->st_pass != NULL)) { event_log_info (hashcat_ctx, "HASH: %s", hashconfig->st_hash); if (need_hexify ((const u8 *) hashconfig->st_pass, strlen (hashconfig->st_pass), user_options->separator, 0)) { char tmp_buf[HCBUFSIZ_LARGE]; int tmp_len = 0; tmp_buf[tmp_len++] = '$'; tmp_buf[tmp_len++] = 'H'; tmp_buf[tmp_len++] = 'E'; tmp_buf[tmp_len++] = 'X'; tmp_buf[tmp_len++] = '['; exec_hexify ((const u8 *) hashconfig->st_pass, strlen (hashconfig->st_pass), (u8 *) tmp_buf + tmp_len); tmp_len += strlen (hashconfig->st_pass) * 2; tmp_buf[tmp_len++] = ']'; tmp_buf[tmp_len++] = 0; event_log_info (hashcat_ctx, "PASS: %s", tmp_buf); } else { event_log_info (hashcat_ctx, "PASS: %s", hashconfig->st_pass); } } else { event_log_info (hashcat_ctx, "HASH: not stored"); event_log_info (hashcat_ctx, "PASS: not stored"); } event_log_info (hashcat_ctx, NULL); } hashconfig_destroy (hashcat_ctx); } else { for (int i = 0; i < 100000; i++) { user_options->hash_mode = i; const int rc = hashconfig_init (hashcat_ctx); if (rc == 0) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; event_log_info (hashcat_ctx, "MODE: %u", hashconfig->hash_mode); event_log_info (hashcat_ctx, "TYPE: %s", strhashtype (hashconfig->hash_mode)); if ((hashconfig->st_hash != NULL) && (hashconfig->st_pass != NULL)) { event_log_info (hashcat_ctx, "HASH: %s", hashconfig->st_hash); if (need_hexify ((const u8 *) hashconfig->st_pass, strlen (hashconfig->st_pass), user_options->separator, 0)) { char tmp_buf[HCBUFSIZ_LARGE]; int tmp_len = 0; tmp_buf[tmp_len++] = '$'; tmp_buf[tmp_len++] = 'H'; tmp_buf[tmp_len++] = 'E'; tmp_buf[tmp_len++] = 'X'; tmp_buf[tmp_len++] = '['; exec_hexify ((const u8 *) hashconfig->st_pass, strlen (hashconfig->st_pass), (u8 *) tmp_buf + tmp_len); tmp_len += strlen (hashconfig->st_pass) * 2; tmp_buf[tmp_len++] = ']'; tmp_buf[tmp_len++] = 0; event_log_info (hashcat_ctx, "PASS: %s", tmp_buf); } else { event_log_info (hashcat_ctx, "PASS: %s", hashconfig->st_pass); } } else { event_log_info (hashcat_ctx, "HASH: not stored"); event_log_info (hashcat_ctx, "PASS: not stored"); } event_log_info (hashcat_ctx, NULL); } hashconfig_destroy (hashcat_ctx); } } } void opencl_info (hashcat_ctx_t *hashcat_ctx) { const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; event_log_info (hashcat_ctx, "OpenCL Info:"); event_log_info (hashcat_ctx, NULL); cl_uint platforms_cnt = opencl_ctx->platforms_cnt; cl_platform_id *platforms = opencl_ctx->platforms; char **platforms_vendor = opencl_ctx->platforms_vendor; char **platforms_name = opencl_ctx->platforms_name; char **platforms_version = opencl_ctx->platforms_version; cl_uint devices_cnt = opencl_ctx->devices_cnt; for (cl_uint platforms_idx = 0; platforms_idx < platforms_cnt; platforms_idx++) { cl_platform_id platform_id = platforms[platforms_idx]; char *platform_vendor = platforms_vendor[platforms_idx]; char *platform_name = platforms_name[platforms_idx]; char *platform_version = platforms_version[platforms_idx]; event_log_info (hashcat_ctx, "Platform ID #%u", platforms_idx + 1); event_log_info (hashcat_ctx, " Vendor : %s", platform_vendor); event_log_info (hashcat_ctx, " Name : %s", platform_name); event_log_info (hashcat_ctx, " Version : %s", platform_version); event_log_info (hashcat_ctx, NULL); for (cl_uint devices_idx = 0; devices_idx < devices_cnt; devices_idx++) { const hc_device_param_t *device_param = opencl_ctx->devices_param + devices_idx; if (device_param->platform != platform_id) continue; cl_device_type device_type = device_param->device_type; cl_uint device_vendor_id = device_param->device_vendor_id; char *device_vendor = device_param->device_vendor; char *device_name = device_param->device_name; u32 device_processors = device_param->device_processors; u32 device_maxclock_frequency = device_param->device_maxclock_frequency; u64 device_maxmem_alloc = device_param->device_maxmem_alloc; u64 device_global_mem = device_param->device_global_mem; char *device_opencl_version = device_param->device_opencl_version; char *device_version = device_param->device_version; char *driver_version = device_param->driver_version; event_log_info (hashcat_ctx, " Device ID #%u", devices_idx + 1); event_log_info (hashcat_ctx, " Type : %s", ((device_type & CL_DEVICE_TYPE_CPU) ? "CPU" : ((device_type & CL_DEVICE_TYPE_GPU) ? "GPU" : "Accelerator"))); event_log_info (hashcat_ctx, " Vendor ID : %u", device_vendor_id); event_log_info (hashcat_ctx, " Vendor : %s", device_vendor); event_log_info (hashcat_ctx, " Name : %s", device_name); event_log_info (hashcat_ctx, " Version : %s", device_version); event_log_info (hashcat_ctx, " Processor(s) : %u", device_processors); event_log_info (hashcat_ctx, " Clock : %u", device_maxclock_frequency); event_log_info (hashcat_ctx, " Memory : %" PRIu64 "/%" PRIu64 " MB allocatable", device_maxmem_alloc / 1024 / 1024, device_global_mem / 1024 / 1024); event_log_info (hashcat_ctx, " OpenCL Version : %s", device_opencl_version); event_log_info (hashcat_ctx, " Driver Version : %s", driver_version); event_log_info (hashcat_ctx, NULL); } } } void opencl_info_compact (hashcat_ctx_t *hashcat_ctx) { const opencl_ctx_t *opencl_ctx = hashcat_ctx->opencl_ctx; const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; if (user_options->machine_readable == true) return; cl_uint platforms_cnt = opencl_ctx->platforms_cnt; cl_platform_id *platforms = opencl_ctx->platforms; char **platforms_vendor = opencl_ctx->platforms_vendor; bool *platforms_skipped = opencl_ctx->platforms_skipped; cl_uint devices_cnt = opencl_ctx->devices_cnt; for (cl_uint platforms_idx = 0; platforms_idx < platforms_cnt; platforms_idx++) { cl_platform_id platform_id = platforms[platforms_idx]; char *platform_vendor = platforms_vendor[platforms_idx]; bool platform_skipped = platforms_skipped[platforms_idx]; if (platform_skipped == false) { const int len = event_log_info (hashcat_ctx, "OpenCL Platform #%u: %s", platforms_idx + 1, platform_vendor); char line[HCBUFSIZ_TINY]; memset (line, '=', len); line[len] = 0; event_log_info (hashcat_ctx, "%s", line); } else { event_log_info (hashcat_ctx, "OpenCL Platform #%u: %s, skipped or no OpenCL compatible devices found.", platforms_idx + 1, platform_vendor); } for (cl_uint devices_idx = 0; devices_idx < devices_cnt; devices_idx++) { const hc_device_param_t *device_param = opencl_ctx->devices_param + devices_idx; if (device_param->platform != platform_id) continue; char *device_name = device_param->device_name; u32 device_processors = device_param->device_processors; u64 device_maxmem_alloc = device_param->device_maxmem_alloc; u64 device_global_mem = device_param->device_global_mem; if (device_param->skipped == false) { event_log_info (hashcat_ctx, "* Device #%u: %s, %" PRIu64 "/%" PRIu64 " MB allocatable, %uMCU", devices_idx + 1, device_name, device_maxmem_alloc / 1024 / 1024, device_global_mem / 1024 / 1024, device_processors); } else { event_log_info (hashcat_ctx, "* Device #%u: %s, skipped.", devices_idx + 1, device_name); } } event_log_info (hashcat_ctx, NULL); } } void status_display_machine_readable (hashcat_ctx_t *hashcat_ctx) { const user_options_t *user_options = hashcat_ctx->user_options; hashcat_status_t *hashcat_status = (hashcat_status_t *) hcmalloc (sizeof (hashcat_status_t)); const int rc_status = hashcat_get_status (hashcat_ctx, hashcat_status); if (rc_status == -1) { hcfree (hashcat_status); return; } printf ("STATUS\t%d\t", hashcat_status->status_number); printf ("SPEED\t"); for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) { const device_info_t *device_info = hashcat_status->device_info_buf + device_id; if (device_info->skipped_dev == true) continue; printf ("%" PRIu64 "\t", (u64) (device_info->hashes_msec_dev * 1000)); // that 1\t is for backward compatibility printf ("1000\t"); } printf ("EXEC_RUNTIME\t"); for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) { const device_info_t *device_info = hashcat_status->device_info_buf + device_id; if (device_info->skipped_dev == true) continue; printf ("%f\t", device_info->exec_msec_dev); } printf ("CURKU\t%" PRIu64 "\t", hashcat_status->restore_point); printf ("PROGRESS\t%" PRIu64 "\t%" PRIu64 "\t", hashcat_status->progress_cur_relative_skip, hashcat_status->progress_end_relative_skip); printf ("RECHASH\t%d\t%d\t", hashcat_status->digests_done, hashcat_status->digests_cnt); printf ("RECSALT\t%d\t%d\t", hashcat_status->salts_done, hashcat_status->salts_cnt); if (user_options->gpu_temp_disable == false) { printf ("TEMP\t"); for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) { const device_info_t *device_info = hashcat_status->device_info_buf + device_id; if (device_info->skipped_dev == true) continue; // ok, little cheat here... const int temp = hm_get_temperature_with_device_id (hashcat_ctx, device_id); printf ("%d\t", temp); } } printf ("REJECTED\t%" PRIu64 "\t", hashcat_status->progress_rejected); hc_fwrite (EOL, strlen (EOL), 1, stdout); fflush (stdout); status_status_destroy (hashcat_ctx, hashcat_status); hcfree (hashcat_status); } void status_display (hashcat_ctx_t *hashcat_ctx) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->machine_readable == true) { status_display_machine_readable (hashcat_ctx); return; } hashcat_status_t *hashcat_status = (hashcat_status_t *) hcmalloc (sizeof (hashcat_status_t)); const int rc_status = hashcat_get_status (hashcat_ctx, hashcat_status); if (rc_status == -1) { hcfree (hashcat_status); return; } /** * show something */ event_log_info (hashcat_ctx, "Session..........: %s", hashcat_status->session); event_log_info (hashcat_ctx, "Status...........: %s", hashcat_status->status_string); event_log_info (hashcat_ctx, "Hash.Type........: %s", hashcat_status->hash_type); event_log_info (hashcat_ctx, "Hash.Target......: %s", hashcat_status->hash_target); event_log_info (hashcat_ctx, "Time.Started.....: %s (%s)", hashcat_status->time_started_absolute, hashcat_status->time_started_relative); event_log_info (hashcat_ctx, "Time.Estimated...: %s (%s)", hashcat_status->time_estimated_absolute, hashcat_status->time_estimated_relative); switch (hashcat_status->guess_mode) { case GUESS_MODE_STRAIGHT_FILE: event_log_info (hashcat_ctx, "Guess.Base.......: File (%s)", hashcat_status->guess_base); break; case GUESS_MODE_STRAIGHT_FILE_RULES_FILE: event_log_info (hashcat_ctx, "Guess.Base.......: File (%s)", hashcat_status->guess_base); event_log_info (hashcat_ctx, "Guess.Mod........: Rules (%s)", hashcat_status->guess_mod); break; case GUESS_MODE_STRAIGHT_FILE_RULES_GEN: event_log_info (hashcat_ctx, "Guess.Base.......: File (%s)", hashcat_status->guess_base); event_log_info (hashcat_ctx, "Guess.Mod........: Rules (Generated)"); break; case GUESS_MODE_STRAIGHT_STDIN: event_log_info (hashcat_ctx, "Guess.Base.......: Pipe"); break; case GUESS_MODE_STRAIGHT_STDIN_RULES_FILE: event_log_info (hashcat_ctx, "Guess.Base.......: Pipe"); event_log_info (hashcat_ctx, "Guess.Mod........: Rules (%s)", hashcat_status->guess_mod); break; case GUESS_MODE_STRAIGHT_STDIN_RULES_GEN: event_log_info (hashcat_ctx, "Guess.Base.......: Pipe"); event_log_info (hashcat_ctx, "Guess.Mod........: Rules (Generated)"); break; case GUESS_MODE_COMBINATOR_BASE_LEFT: event_log_info (hashcat_ctx, "Guess.Base.......: File (%s), Left Side", hashcat_status->guess_base); event_log_info (hashcat_ctx, "Guess.Mod........: File (%s), Right Side", hashcat_status->guess_mod); break; case GUESS_MODE_COMBINATOR_BASE_RIGHT: event_log_info (hashcat_ctx, "Guess.Base.......: File (%s), Right Side", hashcat_status->guess_base); event_log_info (hashcat_ctx, "Guess.Mod........: File (%s), Left Side", hashcat_status->guess_mod); break; case GUESS_MODE_MASK: event_log_info (hashcat_ctx, "Guess.Mask.......: %s [%d]", hashcat_status->guess_base, hashcat_status->guess_mask_length); break; case GUESS_MODE_MASK_CS: event_log_info (hashcat_ctx, "Guess.Mask.......: %s [%d]", hashcat_status->guess_base, hashcat_status->guess_mask_length); event_log_info (hashcat_ctx, "Guess.Charset....: %s ", hashcat_status->guess_charset); break; case GUESS_MODE_HYBRID1: event_log_info (hashcat_ctx, "Guess.Base.......: File (%s), Left Side", hashcat_status->guess_base); event_log_info (hashcat_ctx, "Guess.Mod........: Mask (%s) [%d], Right Side", hashcat_status->guess_mod, hashcat_status->guess_mask_length); break; case GUESS_MODE_HYBRID1_CS: event_log_info (hashcat_ctx, "Guess.Base.......: File (%s), Left Side", hashcat_status->guess_base); event_log_info (hashcat_ctx, "Guess.Mod........: Mask (%s) [%d], Right Side", hashcat_status->guess_mod, hashcat_status->guess_mask_length); event_log_info (hashcat_ctx, "Guess.Charset....: %s", hashcat_status->guess_charset); break; case GUESS_MODE_HYBRID2: if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { event_log_info (hashcat_ctx, "Guess.Base.......: Mask (%s) [%d], Left Side", hashcat_status->guess_base, hashcat_status->guess_mask_length); event_log_info (hashcat_ctx, "Guess.Mod........: File (%s), Right Side", hashcat_status->guess_mod); } else { event_log_info (hashcat_ctx, "Guess.Base.......: File (%s), Right Side", hashcat_status->guess_base); event_log_info (hashcat_ctx, "Guess.Mod........: Mask (%s) [%d], Left Side", hashcat_status->guess_mod, hashcat_status->guess_mask_length); } break; case GUESS_MODE_HYBRID2_CS: if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { event_log_info (hashcat_ctx, "Guess.Base.......: Mask (%s) [%d], Left Side", hashcat_status->guess_base, hashcat_status->guess_mask_length); event_log_info (hashcat_ctx, "Guess.Mod........: File (%s), Right Side", hashcat_status->guess_mod); event_log_info (hashcat_ctx, "Guess.Charset....: %s", hashcat_status->guess_charset); } else { event_log_info (hashcat_ctx, "Guess.Base.......: File (%s), Right Side", hashcat_status->guess_base); event_log_info (hashcat_ctx, "Guess.Mod........: Mask (%s) [%d], Left Side", hashcat_status->guess_mod, hashcat_status->guess_mask_length); event_log_info (hashcat_ctx, "Guess.Charset....: %s", hashcat_status->guess_charset); } break; } switch (hashcat_status->guess_mode) { case GUESS_MODE_STRAIGHT_FILE: event_log_info (hashcat_ctx, "Guess.Queue......: %d/%d (%.02f%%)", hashcat_status->guess_base_offset, hashcat_status->guess_base_count, hashcat_status->guess_base_percent); break; case GUESS_MODE_STRAIGHT_FILE_RULES_FILE: event_log_info (hashcat_ctx, "Guess.Queue......: %d/%d (%.02f%%)", hashcat_status->guess_base_offset, hashcat_status->guess_base_count, hashcat_status->guess_base_percent); break; case GUESS_MODE_STRAIGHT_FILE_RULES_GEN: event_log_info (hashcat_ctx, "Guess.Queue......: %d/%d (%.02f%%)", hashcat_status->guess_base_offset, hashcat_status->guess_base_count, hashcat_status->guess_base_percent); break; case GUESS_MODE_MASK: event_log_info (hashcat_ctx, "Guess.Queue......: %d/%d (%.02f%%)", hashcat_status->guess_base_offset, hashcat_status->guess_base_count, hashcat_status->guess_base_percent); break; case GUESS_MODE_MASK_CS: event_log_info (hashcat_ctx, "Guess.Queue......: %d/%d (%.02f%%)", hashcat_status->guess_base_offset, hashcat_status->guess_base_count, hashcat_status->guess_base_percent); break; case GUESS_MODE_HYBRID1: event_log_info (hashcat_ctx, "Guess.Queue.Base.: %d/%d (%.02f%%)", hashcat_status->guess_base_offset, hashcat_status->guess_base_count, hashcat_status->guess_base_percent); event_log_info (hashcat_ctx, "Guess.Queue.Mod..: %d/%d (%.02f%%)", hashcat_status->guess_mod_offset, hashcat_status->guess_mod_count, hashcat_status->guess_mod_percent); break; case GUESS_MODE_HYBRID2: event_log_info (hashcat_ctx, "Guess.Queue.Base.: %d/%d (%.02f%%)", hashcat_status->guess_base_offset, hashcat_status->guess_base_count, hashcat_status->guess_base_percent); event_log_info (hashcat_ctx, "Guess.Queue.Mod..: %d/%d (%.02f%%)", hashcat_status->guess_mod_offset, hashcat_status->guess_mod_count, hashcat_status->guess_mod_percent); break; } for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) { const device_info_t *device_info = hashcat_status->device_info_buf + device_id; if (device_info->skipped_dev == true) continue; event_log_info (hashcat_ctx, "Speed.Dev.#%d.....: %9sH/s (%0.2fms)", device_id + 1, device_info->speed_sec_dev, device_info->exec_msec_dev); } if (hashcat_status->device_info_active > 1) { event_log_info (hashcat_ctx, "Speed.Dev.#*.....: %9sH/s", hashcat_status->speed_sec_all); } event_log_info (hashcat_ctx, "Recovered........: %d/%d (%.2f%%) Digests, %d/%d (%.2f%%) Salts", hashcat_status->digests_done, hashcat_status->digests_cnt, hashcat_status->digests_percent, hashcat_status->salts_done, hashcat_status->salts_cnt, hashcat_status->salts_percent); if (hashcat_status->digests_cnt > 1000) { event_log_info (hashcat_ctx, "Recovered/Time...: %s", hashcat_status->cpt); } switch (hashcat_status->progress_mode) { case PROGRESS_MODE_KEYSPACE_KNOWN: event_log_info (hashcat_ctx, "Progress.........: %" PRIu64 "/%" PRIu64 " (%.02f%%)", hashcat_status->progress_cur_relative_skip, hashcat_status->progress_end_relative_skip, hashcat_status->progress_finished_percent); event_log_info (hashcat_ctx, "Rejected.........: %" PRIu64 "/%" PRIu64 " (%.02f%%)", hashcat_status->progress_rejected, hashcat_status->progress_cur_relative_skip, hashcat_status->progress_rejected_percent); event_log_info (hashcat_ctx, "Restore.Point....: %" PRIu64 "/%" PRIu64 " (%.02f%%)", hashcat_status->restore_point, hashcat_status->restore_total, hashcat_status->restore_percent); break; case PROGRESS_MODE_KEYSPACE_UNKNOWN: event_log_info (hashcat_ctx, "Progress.........: %" PRIu64, hashcat_status->progress_cur_relative_skip); event_log_info (hashcat_ctx, "Rejected.........: %" PRIu64, hashcat_status->progress_rejected); event_log_info (hashcat_ctx, "Restore.Point....: %" PRIu64, hashcat_status->restore_point); break; } for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) { const device_info_t *device_info = hashcat_status->device_info_buf + device_id; if (device_info->skipped_dev == true) continue; if (device_info->guess_candidates_dev == NULL) continue; event_log_info (hashcat_ctx, "Candidates.#%d....: %s", device_id + 1, device_info->guess_candidates_dev); } if (user_options->gpu_temp_disable == false) { for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) { const device_info_t *device_info = hashcat_status->device_info_buf + device_id; if (device_info->skipped_dev == true) continue; if (device_info->hwmon_dev == NULL) continue; event_log_info (hashcat_ctx, "HWMon.Dev.#%d.....: %s", device_id + 1, device_info->hwmon_dev); } } status_status_destroy (hashcat_ctx, hashcat_status); hcfree (hashcat_status); } void status_benchmark_machine_readable (hashcat_ctx_t *hashcat_ctx) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const u32 hash_mode = hashconfig->hash_mode; hashcat_status_t *hashcat_status = (hashcat_status_t *) hcmalloc (sizeof (hashcat_status_t)); const int rc_status = hashcat_get_status (hashcat_ctx, hashcat_status); if (rc_status == -1) { hcfree (hashcat_status); return; } for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) { const device_info_t *device_info = hashcat_status->device_info_buf + device_id; if (device_info->skipped_dev == true) continue; event_log_info (hashcat_ctx, "%d:%u:%d:%d:%.2f:%" PRIu64, device_id + 1, hash_mode, device_info->corespeed_dev, device_info->memoryspeed_dev, device_info->exec_msec_dev, (u64) (device_info->hashes_msec_dev_benchmark * 1000)); } status_status_destroy (hashcat_ctx, hashcat_status); hcfree (hashcat_status); } void status_benchmark (hashcat_ctx_t *hashcat_ctx) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->machine_readable == true) { status_benchmark_machine_readable (hashcat_ctx); return; } hashcat_status_t *hashcat_status = (hashcat_status_t *) hcmalloc (sizeof (hashcat_status_t)); const int rc_status = hashcat_get_status (hashcat_ctx, hashcat_status); if (rc_status == -1) { hcfree (hashcat_status); return; } for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) { const device_info_t *device_info = hashcat_status->device_info_buf + device_id; if (device_info->skipped_dev == true) continue; event_log_info (hashcat_ctx, "Speed.Dev.#%d.....: %9sH/s (%0.2fms)", device_id + 1, device_info->speed_sec_dev, device_info->exec_msec_dev); } if (hashcat_status->device_info_active > 1) { event_log_info (hashcat_ctx, "Speed.Dev.#*.....: %9sH/s", hashcat_status->speed_sec_all); } status_status_destroy (hashcat_ctx, hashcat_status); hcfree (hashcat_status); } void status_speed_machine_readable (hashcat_ctx_t *hashcat_ctx) { hashcat_status_t *hashcat_status = (hashcat_status_t *) hcmalloc (sizeof (hashcat_status_t)); const int rc_status = hashcat_get_status (hashcat_ctx, hashcat_status); if (rc_status == -1) { hcfree (hashcat_status); return; } for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) { const device_info_t *device_info = hashcat_status->device_info_buf + device_id; if (device_info->skipped_dev == true) continue; event_log_info (hashcat_ctx, "%d:%" PRIu64, device_id + 1, (u64) (device_info->hashes_msec_dev_benchmark * 1000)); } status_status_destroy (hashcat_ctx, hashcat_status); hcfree (hashcat_status); } void status_speed (hashcat_ctx_t *hashcat_ctx) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->machine_readable == true) { status_speed_machine_readable (hashcat_ctx); return; } hashcat_status_t *hashcat_status = (hashcat_status_t *) hcmalloc (sizeof (hashcat_status_t)); const int rc_status = hashcat_get_status (hashcat_ctx, hashcat_status); if (rc_status == -1) { hcfree (hashcat_status); return; } for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) { const device_info_t *device_info = hashcat_status->device_info_buf + device_id; if (device_info->skipped_dev == true) continue; event_log_info (hashcat_ctx, "Speed.Dev.#%d.....: %9sH/s (%0.2fms)", device_id + 1, device_info->speed_sec_dev, device_info->exec_msec_dev); } if (hashcat_status->device_info_active > 1) { event_log_info (hashcat_ctx, "Speed.Dev.#*.....: %9sH/s", hashcat_status->speed_sec_all); } status_status_destroy (hashcat_ctx, hashcat_status); hcfree (hashcat_status); } void status_progress_machine_readable (hashcat_ctx_t *hashcat_ctx) { hashcat_status_t *hashcat_status = (hashcat_status_t *) hcmalloc (sizeof (hashcat_status_t)); const int rc_status = hashcat_get_status (hashcat_ctx, hashcat_status); if (rc_status == -1) { hcfree (hashcat_status); return; } for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) { const device_info_t *device_info = hashcat_status->device_info_buf + device_id; if (device_info->skipped_dev == true) continue; event_log_info (hashcat_ctx, "%d:%d:%0.2f", device_id + 1, device_info->progress_dev, device_info->runtime_msec_dev); } status_status_destroy (hashcat_ctx, hashcat_status); hcfree (hashcat_status); } void status_progress (hashcat_ctx_t *hashcat_ctx) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->machine_readable == true) { status_progress_machine_readable (hashcat_ctx); return; } hashcat_status_t *hashcat_status = (hashcat_status_t *) hcmalloc (sizeof (hashcat_status_t)); const int rc_status = hashcat_get_status (hashcat_ctx, hashcat_status); if (rc_status == -1) { hcfree (hashcat_status); return; } for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) { const device_info_t *device_info = hashcat_status->device_info_buf + device_id; if (device_info->skipped_dev == true) continue; event_log_info (hashcat_ctx, "Progress.Dev.#%d..: %d", device_id + 1, device_info->progress_dev); } for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) { const device_info_t *device_info = hashcat_status->device_info_buf + device_id; if (device_info->skipped_dev == true) continue; event_log_info (hashcat_ctx, "Runtime.Dev.#%d...: %0.2fms", device_id + 1, device_info->runtime_msec_dev); } status_status_destroy (hashcat_ctx, hashcat_status); hcfree (hashcat_status); } hashcat-4.0.1/src/thread.c000066400000000000000000000144701320027462700153420ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "timer.h" #include "shared.h" #include "thread.h" /* #if defined (_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 too late (e.g. after returning from this function) * myabort (hashcat_ctx->status_ctx); SetConsoleCtrlHandler (NULL, TRUE); sleep (10); return TRUE; case CTRL_C_EVENT: case CTRL_LOGOFF_EVENT: case CTRL_SHUTDOWN_EVENT: myabort (hashcat_ctx->status_ctx); SetConsoleCtrlHandler (NULL, TRUE); return TRUE; } return FALSE; } BOOL WINAPI sigHandler_benchmark (DWORD sig) { switch (sig) { case CTRL_CLOSE_EVENT: myquit (hashcat_ctx->status_ctx); SetConsoleCtrlHandler (NULL, TRUE); sleep (10); return TRUE; case CTRL_C_EVENT: case CTRL_LOGOFF_EVENT: case CTRL_SHUTDOWN_EVENT: myquit (hashcat_ctx->status_ctx); 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 (hashcat_ctx->status_ctx); signal (sig, NULL); } void sigHandler_benchmark (int sig) { myquit (hashcat_ctx->status_ctx); 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 */ int mycracked (hashcat_ctx_t *hashcat_ctx) { status_ctx_t *status_ctx = hashcat_ctx->status_ctx; status_ctx->devices_status = STATUS_CRACKED; status_ctx->run_main_level1 = false; status_ctx->run_main_level2 = false; status_ctx->run_main_level3 = false; status_ctx->run_thread_level1 = false; status_ctx->run_thread_level2 = false; return 0; } int myabort_checkpoint (hashcat_ctx_t *hashcat_ctx) { status_ctx_t *status_ctx = hashcat_ctx->status_ctx; status_ctx->devices_status = STATUS_ABORTED_CHECKPOINT; status_ctx->run_main_level1 = false; status_ctx->run_main_level2 = false; status_ctx->run_main_level3 = false; status_ctx->run_thread_level1 = false; status_ctx->run_thread_level2 = false; return 0; } int myabort_runtime (hashcat_ctx_t *hashcat_ctx) { status_ctx_t *status_ctx = hashcat_ctx->status_ctx; status_ctx->devices_status = STATUS_ABORTED_RUNTIME; status_ctx->run_main_level1 = false; status_ctx->run_main_level2 = false; status_ctx->run_main_level3 = false; status_ctx->run_thread_level1 = false; status_ctx->run_thread_level2 = false; return 0; } int myabort (hashcat_ctx_t *hashcat_ctx) { status_ctx_t *status_ctx = hashcat_ctx->status_ctx; //those checks create problems in benchmark mode, it's simply too short of a timeframe where it's running as STATUS_RUNNING // not sure if this is still valid, but abort is also called by gpu temp monitor //if (status_ctx->devices_status != STATUS_RUNNING) return; status_ctx->devices_status = STATUS_ABORTED; status_ctx->run_main_level1 = false; status_ctx->run_main_level2 = false; status_ctx->run_main_level3 = false; status_ctx->run_thread_level1 = false; status_ctx->run_thread_level2 = false; return 0; } int myquit (hashcat_ctx_t *hashcat_ctx) { status_ctx_t *status_ctx = hashcat_ctx->status_ctx; if (status_ctx->devices_status != STATUS_RUNNING && status_ctx->devices_status != STATUS_PAUSED) return -1; status_ctx->devices_status = STATUS_QUIT; status_ctx->run_main_level1 = false; status_ctx->run_main_level2 = false; status_ctx->run_main_level3 = false; status_ctx->run_thread_level1 = false; status_ctx->run_thread_level2 = false; return 0; } int bypass (hashcat_ctx_t *hashcat_ctx) { status_ctx_t *status_ctx = hashcat_ctx->status_ctx; if (status_ctx->devices_status != STATUS_RUNNING) return -1; status_ctx->devices_status = STATUS_BYPASS; status_ctx->run_main_level1 = true; status_ctx->run_main_level2 = true; status_ctx->run_main_level3 = true; status_ctx->run_thread_level1 = false; status_ctx->run_thread_level2 = false; return 0; } int SuspendThreads (hashcat_ctx_t *hashcat_ctx) { status_ctx_t *status_ctx = hashcat_ctx->status_ctx; if (status_ctx->devices_status != STATUS_RUNNING) return -1; hc_timer_set (&status_ctx->timer_paused); status_ctx->devices_status = STATUS_PAUSED; return 0; } int ResumeThreads (hashcat_ctx_t *hashcat_ctx) { status_ctx_t *status_ctx = hashcat_ctx->status_ctx; if (status_ctx->devices_status != STATUS_PAUSED) return -1; const double msec_paused = hc_timer_get (status_ctx->timer_paused); status_ctx->msec_paused += msec_paused; status_ctx->devices_status = STATUS_RUNNING; return 0; } int stop_at_checkpoint (hashcat_ctx_t *hashcat_ctx) { status_ctx_t *status_ctx = hashcat_ctx->status_ctx; if (status_ctx->devices_status != STATUS_RUNNING) return -1; // this feature only makes sense if --restore-disable was not specified restore_ctx_t *restore_ctx = hashcat_ctx->restore_ctx; if (restore_ctx->enabled == false) { event_log_warning (hashcat_ctx, "This feature is disabled when --restore-disable is specified."); return -1; } // Enable or Disable if (status_ctx->checkpoint_shutdown == false) { status_ctx->checkpoint_shutdown = true; status_ctx->run_main_level1 = false; status_ctx->run_main_level2 = false; status_ctx->run_main_level3 = false; status_ctx->run_thread_level1 = false; status_ctx->run_thread_level2 = true; } else { status_ctx->checkpoint_shutdown = false; status_ctx->run_main_level1 = true; status_ctx->run_main_level2 = true; status_ctx->run_main_level3 = true; status_ctx->run_thread_level1 = true; status_ctx->run_thread_level2 = true; } return 0; } hashcat-4.0.1/src/timer.c000066400000000000000000000014061320027462700152060ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "timer.h" #if defined (_WIN) inline void hc_timer_set (hc_timer_t *a) { QueryPerformanceCounter (a); } inline double hc_timer_get (hc_timer_t a) { hc_timer_t hr_freq; QueryPerformanceFrequency (&hr_freq); hc_timer_t hr_tmp; hc_timer_set (&hr_tmp); return (double) ((double) (hr_tmp.QuadPart - a.QuadPart) / (double) (hr_freq.QuadPart / 1000)); } #else inline void hc_timer_set (hc_timer_t* a) { gettimeofday (a, NULL); } inline double hc_timer_get (hc_timer_t a) { hc_timer_t hr_tmp; hc_timer_set (&hr_tmp); return (double) (((hr_tmp.tv_sec - (a).tv_sec) * 1000) + ((double) (hr_tmp.tv_usec - (a).tv_usec) / 1000)); } #endif hashcat-4.0.1/src/tuningdb.c000066400000000000000000000252161320027462700157050ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "interface.h" #include "timer.h" #include "event.h" #include "memory.h" #include "filehandling.h" #include "ext_OpenCL.h" #include "tuningdb.h" #include "thread.h" #include "opencl.h" #include "hashes.h" #include "shared.h" static int sort_by_tuning_db_alias (const void *v1, const void *v2) { const tuning_db_alias_t *t1 = (const tuning_db_alias_t *) v1; const tuning_db_alias_t *t2 = (const tuning_db_alias_t *) v2; const int res1 = strcmp (t1->device_name, t2->device_name); if (res1 != 0) return (res1); return 0; } static int sort_by_tuning_db_entry (const void *v1, const void *v2) { const tuning_db_entry_t *t1 = (const tuning_db_entry_t *) v1; const tuning_db_entry_t *t2 = (const tuning_db_entry_t *) v2; const int res1 = strcmp (t1->device_name, t2->device_name); if (res1 != 0) return (res1); const int res2 = t1->attack_mode - t2->attack_mode; if (res2 != 0) return (res2); const int res3 = t1->hash_type - t2->hash_type; if (res3 != 0) return (res3); return 0; } int tuning_db_init (hashcat_ctx_t *hashcat_ctx) { folder_config_t *folder_config = hashcat_ctx->folder_config; tuning_db_t *tuning_db = hashcat_ctx->tuning_db; user_options_t *user_options = hashcat_ctx->user_options; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; tuning_db->enabled = false; if (user_options->example_hashes == true) return 0; if (user_options->keyspace == true) return 0; if (user_options->left == true) return 0; if (user_options->opencl_info == true) return 0; if (user_options->show == true) return 0; if (user_options->usage == true) return 0; if (user_options->version == true) return 0; tuning_db->enabled = true; char *tuning_db_file; hc_asprintf (&tuning_db_file, "%s/%s", folder_config->shared_dir, TUNING_DB_FILE); FILE *fp = fopen (tuning_db_file, "rb"); if (fp == NULL) { event_log_error (hashcat_ctx, "%s: %s", tuning_db_file, strerror (errno)); return -1; } hcfree (tuning_db_file); int num_lines = count_lines (fp); // a bit over-allocated tuning_db->alias_buf = (tuning_db_alias_t *) hccalloc (num_lines + 1, sizeof (tuning_db_alias_t)); tuning_db->alias_cnt = 0; tuning_db->entry_buf = (tuning_db_entry_t *) hccalloc (num_lines + 1, sizeof (tuning_db_entry_t)); tuning_db->entry_cnt = 0; rewind (fp); int line_num = 0; char *buf = (char *) hcmalloc (HCBUFSIZ_LARGE); while (!feof (fp)) { char *line_buf = fgets (buf, HCBUFSIZ_LARGE - 1, fp); if (line_buf == NULL) break; line_num++; const int line_len = in_superchop (line_buf); if (line_len == 0) continue; if (line_buf[0] == '#') continue; // start processing char *token_ptr[7] = { NULL }; int token_cnt = 0; char *saveptr; char *next = strtok_r (line_buf, "\t ", &saveptr); token_ptr[token_cnt] = next; token_cnt++; while ((next = strtok_r (NULL, "\t ", &saveptr)) != NULL) { token_ptr[token_cnt] = next; token_cnt++; } if (token_cnt == 2) { char *device_name = token_ptr[0]; char *alias_name = token_ptr[1]; tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt]; alias->device_name = hcstrdup (device_name); alias->alias_name = hcstrdup (alias_name); tuning_db->alias_cnt++; } else if (token_cnt == 6) { if ((token_ptr[1][0] != '0') && (token_ptr[1][0] != '1') && (token_ptr[1][0] != '3') && (token_ptr[1][0] != '*')) { event_log_warning (hashcat_ctx, "Tuning-db: Invalid attack_mode '%c' in Line '%d'", token_ptr[1][0], line_num); continue; } if ((token_ptr[3][0] != '1') && (token_ptr[3][0] != '2') && (token_ptr[3][0] != '4') && (token_ptr[3][0] != '8') && (token_ptr[3][0] != 'N')) { event_log_warning (hashcat_ctx, "Tuning-db: Invalid vector_width '%c' in Line '%d'", token_ptr[3][0], line_num); continue; } char *device_name = token_ptr[0]; int attack_mode = -1; int hash_type = -1; int vector_width = -1; int kernel_accel = -1; int kernel_loops = -1; if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]); if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]); if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]); if (token_ptr[4][0] == 'A') { kernel_accel = 0; } else if (token_ptr[4][0] == 'M') { kernel_accel = 1024; } else { kernel_accel = atoi (token_ptr[4]); if ((kernel_accel < 1) || (kernel_accel > 1024)) { event_log_warning (hashcat_ctx, "Tuning-db: Invalid kernel_accel '%d' in Line '%d'", kernel_accel, line_num); continue; } } if (token_ptr[5][0] == 'A') { kernel_loops = 0; } else if (token_ptr[5][0] == 'M') { if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) { kernel_loops = KERNEL_RULES; } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { kernel_loops = KERNEL_COMBS; } else if (user_options_extra->attack_kern == ATTACK_KERN_BF) { kernel_loops = KERNEL_BFS; } } else { kernel_loops = atoi (token_ptr[5]); if (kernel_loops < 1) { event_log_warning (hashcat_ctx, "Tuning-db: Invalid kernel_loops '%d' in Line '%d'", kernel_loops, line_num); continue; } if ((user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) && (kernel_loops > KERNEL_RULES)) { event_log_warning (hashcat_ctx, "Tuning-db: Invalid kernel_loops '%d' in Line '%d'", kernel_loops, line_num); continue; } if ((user_options_extra->attack_kern == ATTACK_KERN_COMBI) && (kernel_loops > KERNEL_COMBS)) { event_log_warning (hashcat_ctx, "Tuning-db: Invalid kernel_loops '%d' in Line '%d'", kernel_loops, line_num); continue; } if ((user_options_extra->attack_kern == ATTACK_KERN_BF) && (kernel_loops > KERNEL_BFS)) { event_log_warning (hashcat_ctx, "Tuning-db: Invalid kernel_loops '%d' in Line '%d'", kernel_loops, line_num); continue; } } tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt]; entry->device_name = hcstrdup (device_name); entry->attack_mode = attack_mode; entry->hash_type = hash_type; entry->vector_width = vector_width; entry->kernel_accel = kernel_accel; entry->kernel_loops = kernel_loops; tuning_db->entry_cnt++; } else { event_log_warning (hashcat_ctx, "Tuning-db: Invalid number of token in Line '%d'", line_num); continue; } } hcfree (buf); fclose (fp); // todo: print loaded 'cnt' message // sort the database qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias); qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry); return 0; } void tuning_db_destroy (hashcat_ctx_t *hashcat_ctx) { tuning_db_t *tuning_db = hashcat_ctx->tuning_db; if (tuning_db->enabled == false) return; int i; for (i = 0; i < tuning_db->alias_cnt; i++) { tuning_db_alias_t *alias = &tuning_db->alias_buf[i]; hcfree (alias->device_name); hcfree (alias->alias_name); } for (i = 0; i < tuning_db->entry_cnt; i++) { tuning_db_entry_t *entry = &tuning_db->entry_buf[i]; hcfree ((void *)entry->device_name); } hcfree (tuning_db->alias_buf); hcfree (tuning_db->entry_buf); memset (tuning_db, 0, sizeof (tuning_db_t)); } tuning_db_entry_t *tuning_db_search (hashcat_ctx_t *hashcat_ctx, const char *device_name, const cl_device_type device_type, int attack_mode, const int hash_type) { tuning_db_t *tuning_db = hashcat_ctx->tuning_db; static tuning_db_entry_t s; // first we need to convert all spaces in the device_name to underscore char *device_name_nospace = hcstrdup (device_name); int device_name_length = strlen (device_name_nospace); int i; for (i = 0; i < device_name_length; i++) { if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_'; } // find out if there's an alias configured tuning_db_alias_t a; a.device_name = device_name_nospace; char *alias_name = NULL; for (i = device_name_length; i >= 1; i--) { device_name_nospace[i] = 0; tuning_db_alias_t *alias = bsearch (&a, tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias); if (alias == NULL) continue; alias_name = alias->alias_name; break; } // attack-mode 6 and 7 are attack-mode 1 basically if (attack_mode == 6) attack_mode = 1; if (attack_mode == 7) attack_mode = 1; // bsearch is not ideal but fast enough s.device_name = device_name_nospace; s.attack_mode = attack_mode; s.hash_type = hash_type; tuning_db_entry_t *entry = NULL; // this will produce all 2^3 combinations required for (i = 0; i < 8; i++) { s.device_name = (i & 1) ? "*" : device_name_nospace; s.attack_mode = (i & 2) ? -1 : attack_mode; s.hash_type = (i & 4) ? -1 : hash_type; entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry); if (entry != NULL) break; // in non-wildcard mode do some additional checks: if ((i & 1) == 0) { // in case we have an alias-name if (alias_name != NULL) { s.device_name = alias_name; entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry); if (entry != NULL) break; } // or by device type if (device_type & CL_DEVICE_TYPE_CPU) { s.device_name = "DEVICE_TYPE_CPU"; } else if (device_type & CL_DEVICE_TYPE_GPU) { s.device_name = "DEVICE_TYPE_GPU"; } else if (device_type & CL_DEVICE_TYPE_ACCELERATOR) { s.device_name = "DEVICE_TYPE_ACCELERATOR"; } entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry); if (entry != NULL) break; } } // free converted device_name hcfree (device_name_nospace); return entry; } hashcat-4.0.1/src/usage.c000066400000000000000000001044571320027462700152040ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "shared.h" #include "usage.h" static const char *USAGE_MINI[] = { "Usage: %s [options]... hash|hashfile|hccapxfile [dictionary|mask|directory]...", "", "Try --help for more help.", NULL }; static const char *USAGE_BIG[] = { "%s - advanced password recovery", "", "Usage: %s [options]... hash|hashfile|hccapxfile [dictionary|mask|directory]...", "", "- [ Options ] -", "", " Options Short / Long | Type | Description | Example", "================================+======+======================================================+=======================", " -m, --hash-type | Num | Hash-type, see references below | -m 1000", " -a, --attack-mode | Num | Attack-mode, see references below | -a 3", " -V, --version | | Print version |", " -h, --help | | Print help |", " --quiet | | Suppress output |", " --hex-charset | | Assume charset is given in hex |", " --hex-salt | | Assume salt is given in hex |", " --hex-wordlist | | Assume words in wordlist are given in hex |", " --force | | Ignore warnings |", " --status | | Enable automatic update of the status screen |", " --status-timer | Num | Sets seconds between status screen updates to X | --status-timer=1", " --machine-readable | | Display the status view in a machine-readable format |", " --keep-guessing | | Keep guessing the hash after it has been cracked |", " --self-test-disable | | Disable self-test functionality on startup |", " --loopback | | Add new plains to induct directory |", " --markov-hcstat | File | Specify hcstat file to use | --markov-hc=my.hcstat", " --markov-disable | | Disables markov-chains, emulates classic brute-force |", " --markov-classic | | Enables classic markov-chains, no per-position |", " -t, --markov-threshold | Num | Threshold X when to stop accepting new markov-chains | -t 50", " --runtime | Num | Abort session after X seconds of runtime | --runtime=10", " --session | Str | Define specific session name | --session=mysession", " --restore | | Restore session from --session |", " --restore-disable | | Do not write restore file |", " --restore-file-path | File | Specific path to restore file | --restore-file-path=x.restore", " -o, --outfile | File | Define outfile for recovered hash | -o outfile.txt", " --outfile-format | Num | Define outfile-format X for recovered hash | --outfile-format=7", " --outfile-autohex-disable | | Disable the use of $HEX[] in output plains |", " --outfile-check-timer | Num | Sets seconds between outfile checks to X | --outfile-check=30", " --wordlist-autohex-disable | | Disable the conversion of $HEX[] from the wordlist |", " -p, --separator | Char | Separator char for hashlists and outfile | -p :", " --stdout | | Do not crack a hash, instead print candidates only |", " --show | | Compare hashlist with potfile; show cracked hashes |", " --left | | Compare hashlist with potfile; show uncracked hashes |", " --username | | Enable ignoring of usernames in hashfile |", " --remove | | Enable removal of hashes once they are cracked |", " --remove-timer | Num | Update input hash file each X seconds | --remove-timer=30", " --potfile-disable | | Do not write potfile |", " --potfile-path | Dir | Specific path to potfile | --potfile-path=my.pot", " --encoding-from | Code | Force internal wordlist encoding from X | --encoding-from=iso-8859-15", " --encoding-to | Code | Force internal wordlist encoding to X | --encoding-to=utf-32le", " --debug-mode | Num | Defines the debug mode (hybrid only by using rules) | --debug-mode=4", " --debug-file | File | Output file for debugging rules | --debug-file=good.log", " --induction-dir | Dir | Specify the induction directory to use for loopback | --induction=inducts", " --outfile-check-dir | Dir | Specify the outfile directory to monitor for plains | --outfile-check-dir=x", " --logfile-disable | | Disable the logfile |", " --hccapx-message-pair | Num | Load only message pairs from hccapx matching X | --hccapx-message-pair=2", " --nonce-error-corrections | Num | The BF size range to replace AP's nonce last bytes | --nonce-error-corrections=16", " --truecrypt-keyfiles | File | Keyfiles to use, separated with commas | --truecrypt-key=x.png", " --veracrypt-keyfiles | File | Keyfiles to use, separated with commas | --veracrypt-key=x.txt", " --veracrypt-pim | Num | VeraCrypt personal iterations multiplier | --veracrypt-pim=1000", " -b, --benchmark | | Run benchmark |", " --speed-only | | Return expected speed of the attack, then quit |", " --progress-only | | Return ideal progress step size and time to process |", " -c, --segment-size | Num | Sets size in MB to cache from the wordfile to X | -c 32", " --bitmap-min | Num | Sets minimum bits allowed for bitmaps to X | --bitmap-min=24", " --bitmap-max | Num | Sets maximum bits allowed for bitmaps to X | --bitmap-max=24", " --cpu-affinity | Str | Locks to CPU devices, separated with commas | --cpu-affinity=1,2,3", " --example-hashes | | Show an example hash for each hash-mode |", " -I, --opencl-info | | Show info about detected OpenCL platforms/devices | -I", " --opencl-platforms | Str | OpenCL platforms to use, separated with commas | --opencl-platforms=2", " -d, --opencl-devices | Str | OpenCL devices to use, separated with commas | -d 1", " -D, --opencl-device-types | Str | OpenCL device-types to use, separated with commas | -D 1", " --opencl-vector-width | Num | Manually override OpenCL vector-width to X | --opencl-vector=4", " -O, --optimized-kernel-enable | | Enable optimized kernels (limits password length) |", " -w, --workload-profile | Num | Enable a specific workload profile, see pool below | -w 3", " -n, --kernel-accel | Num | Manual workload tuning, set outerloop step size to X | -n 64", " -u, --kernel-loops | Num | Manual workload tuning, set innerloop step size to X | -u 256", " --nvidia-spin-damp | Num | Workaround NVIDIAs CPU burning loop bug, in percent | --nvidia-spin-damp=50", " --gpu-temp-disable | | Disable temperature and fanspeed reads and triggers |", " --gpu-temp-abort | Num | Abort if GPU temperature reaches X degrees Celsius | --gpu-temp-abort=100", " --gpu-temp-retain | Num | Try to retain GPU temperature at X degrees Celsius | --gpu-temp-retain=95", " --powertune-enable | | Enable power tuning. Restores settings when finished |", " --scrypt-tmto | Num | Manually override TMTO value for scrypt to X | --scrypt-tmto=3", " -s, --skip | Num | Skip X words from the start | -s 1000000", " -l, --limit | Num | Limit X words from the start + skipped words | -l 1000000", " --keyspace | | Show keyspace base:mod values and quit |", " -j, --rule-left | Rule | Single rule applied to each word from left wordlist | -j 'c'", " -k, --rule-right | Rule | Single rule applied to each word from right wordlist | -k '^-'", " -r, --rules-file | File | Multiple rules applied to each word from wordlists | -r rules/best64.rule", " -g, --generate-rules | Num | Generate X random rules | -g 10000", " --generate-rules-func-min | Num | Force min X functions per rule |", " --generate-rules-func-max | Num | Force max X functions per rule |", " --generate-rules-seed | Num | Force RNG seed set to X |", " -1, --custom-charset1 | CS | User-defined charset ?1 | -1 ?l?d?u", " -2, --custom-charset2 | CS | User-defined charset ?2 | -2 ?l?d?s", " -3, --custom-charset3 | CS | User-defined charset ?3 |", " -4, --custom-charset4 | CS | User-defined charset ?4 |", " -i, --increment | | Enable mask increment mode |", " --increment-min | Num | Start mask incrementing at X | --increment-min=4", " --increment-max | Num | Stop mask incrementing at X | --increment-max=8", "", "- [ Hash modes ] -", "", " # | Name | Category", " ======+==================================================+======================================", " 900 | MD4 | Raw Hash", " 0 | MD5 | Raw Hash", " 5100 | Half MD5 | Raw Hash", " 100 | SHA1 | Raw Hash", " 1300 | SHA-224 | Raw Hash", " 1400 | SHA-256 | Raw Hash", " 10800 | SHA-384 | Raw Hash", " 1700 | SHA-512 | Raw Hash", " 5000 | SHA-3 (Keccak) | Raw Hash", " 600 | BLAKE2b-512 | Raw Hash", " 10100 | SipHash | Raw Hash", " 6000 | RIPEMD-160 | Raw Hash", " 6100 | Whirlpool | Raw Hash", " 6900 | GOST R 34.11-94 | Raw Hash", " 11700 | GOST R 34.11-2012 (Streebog) 256-bit | Raw Hash", " 11800 | GOST R 34.11-2012 (Streebog) 512-bit | Raw Hash", " 10 | md5($pass.$salt) | Raw Hash, Salted and/or Iterated", " 20 | md5($salt.$pass) | Raw Hash, Salted and/or Iterated", " 30 | md5(utf16le($pass).$salt) | Raw Hash, Salted and/or Iterated", " 40 | md5($salt.utf16le($pass)) | Raw Hash, Salted and/or Iterated", " 3800 | md5($salt.$pass.$salt) | Raw Hash, Salted and/or Iterated", " 3710 | md5($salt.md5($pass)) | Raw Hash, Salted and/or Iterated", " 4010 | md5($salt.md5($salt.$pass)) | Raw Hash, Salted and/or Iterated", " 4110 | md5($salt.md5($pass.$salt)) | Raw Hash, Salted and/or Iterated", " 2600 | md5(md5($pass)) | Raw Hash, Salted and/or Iterated", " 3910 | md5(md5($pass).md5($salt)) | Raw Hash, Salted and/or Iterated", " 4300 | md5(strtoupper(md5($pass))) | Raw Hash, Salted and/or Iterated", " 4400 | md5(sha1($pass)) | Raw Hash, Salted and/or Iterated", " 110 | sha1($pass.$salt) | Raw Hash, Salted and/or Iterated", " 120 | sha1($salt.$pass) | Raw Hash, Salted and/or Iterated", " 130 | sha1(utf16le($pass).$salt) | Raw Hash, Salted and/or Iterated", " 140 | sha1($salt.utf16le($pass)) | Raw Hash, Salted and/or Iterated", " 4500 | sha1(sha1($pass)) | Raw Hash, Salted and/or Iterated", " 4520 | sha1($salt.sha1($pass)) | Raw Hash, Salted and/or Iterated", " 4700 | sha1(md5($pass)) | Raw Hash, Salted and/or Iterated", " 4900 | sha1($salt.$pass.$salt) | Raw Hash, Salted and/or Iterated", " 14400 | sha1(CX) | Raw Hash, Salted and/or Iterated", " 1410 | sha256($pass.$salt) | Raw Hash, Salted and/or Iterated", " 1420 | sha256($salt.$pass) | Raw Hash, Salted and/or Iterated", " 1430 | sha256(utf16le($pass).$salt) | Raw Hash, Salted and/or Iterated", " 1440 | sha256($salt.utf16le($pass)) | Raw Hash, Salted and/or Iterated", " 1710 | sha512($pass.$salt) | Raw Hash, Salted and/or Iterated", " 1720 | sha512($salt.$pass) | Raw Hash, Salted and/or Iterated", " 1730 | sha512(utf16le($pass).$salt) | Raw Hash, Salted and/or Iterated", " 1740 | sha512($salt.utf16le($pass)) | Raw Hash, Salted and/or Iterated", " 50 | HMAC-MD5 (key = $pass) | Raw Hash, Authenticated", " 60 | HMAC-MD5 (key = $salt) | Raw Hash, Authenticated", " 150 | HMAC-SHA1 (key = $pass) | Raw Hash, Authenticated", " 160 | HMAC-SHA1 (key = $salt) | Raw Hash, Authenticated", " 1450 | HMAC-SHA256 (key = $pass) | Raw Hash, Authenticated", " 1460 | HMAC-SHA256 (key = $salt) | Raw Hash, Authenticated", " 1750 | HMAC-SHA512 (key = $pass) | Raw Hash, Authenticated", " 1760 | HMAC-SHA512 (key = $salt) | Raw Hash, Authenticated", " 14000 | DES (PT = $salt, key = $pass) | Raw Cipher, Known-Plaintext attack", " 14100 | 3DES (PT = $salt, key = $pass) | Raw Cipher, Known-Plaintext attack", " 14900 | Skip32 (PT = $salt, key = $pass) | Raw Cipher, Known-Plaintext attack", " 15400 | ChaCha20 | Raw Cipher, Known-Plaintext attack", " 400 | phpass | Generic KDF", " 8900 | scrypt | Generic KDF", " 11900 | PBKDF2-HMAC-MD5 | Generic KDF", " 12000 | PBKDF2-HMAC-SHA1 | Generic KDF", " 10900 | PBKDF2-HMAC-SHA256 | Generic KDF", " 12100 | PBKDF2-HMAC-SHA512 | Generic KDF", " 23 | Skype | Network Protocols", " 2500 | WPA/WPA2 | Network Protocols", " 2501 | WPA/WPA2 PMK | Network Protocols", " 4800 | iSCSI CHAP authentication, MD5(CHAP) | Network Protocols", " 5300 | IKE-PSK MD5 | Network Protocols", " 5400 | IKE-PSK SHA1 | Network Protocols", " 5500 | NetNTLMv1 | Network Protocols", " 5500 | NetNTLMv1+ESS | Network Protocols", " 5600 | NetNTLMv2 | Network Protocols", " 7300 | IPMI2 RAKP HMAC-SHA1 | Network Protocols", " 7500 | Kerberos 5 AS-REQ Pre-Auth etype 23 | Network Protocols", " 8300 | DNSSEC (NSEC3) | Network Protocols", " 10200 | CRAM-MD5 | Network Protocols", " 11100 | PostgreSQL CRAM (MD5) | Network Protocols", " 11200 | MySQL CRAM (SHA1) | Network Protocols", " 11400 | SIP digest authentication (MD5) | Network Protocols", " 13100 | Kerberos 5 TGS-REP etype 23 | Network Protocols", " 121 | SMF (Simple Machines Forum) > v1.1 | Forums, CMS, E-Commerce, Frameworks", " 400 | phpBB3 (MD5) | Forums, CMS, E-Commerce, Frameworks", " 2611 | vBulletin < v3.8.5 | Forums, CMS, E-Commerce, Frameworks", " 2711 | vBulletin >= v3.8.5 | Forums, CMS, E-Commerce, Frameworks", " 2811 | MyBB 1.2+ | Forums, CMS, E-Commerce, Frameworks", " 2811 | IPB2+ (Invision Power Board) | Forums, CMS, E-Commerce, Frameworks", " 8400 | WBB3 (Woltlab Burning Board) | Forums, CMS, E-Commerce, Frameworks", " 11 | Joomla < 2.5.18 | Forums, CMS, E-Commerce, Frameworks", " 400 | Joomla >= 2.5.18 (MD5) | Forums, CMS, E-Commerce, Frameworks", " 400 | WordPress (MD5) | Forums, CMS, E-Commerce, Frameworks", " 2612 | PHPS | Forums, CMS, E-Commerce, Frameworks", " 7900 | Drupal7 | Forums, CMS, E-Commerce, Frameworks", " 21 | osCommerce | Forums, CMS, E-Commerce, Frameworks", " 21 | xt:Commerce | Forums, CMS, E-Commerce, Frameworks", " 11000 | PrestaShop | Forums, CMS, E-Commerce, Frameworks", " 124 | Django (SHA-1) | Forums, CMS, E-Commerce, Frameworks", " 10000 | Django (PBKDF2-SHA256) | Forums, CMS, E-Commerce, Frameworks", " 3711 | MediaWiki B type | Forums, CMS, E-Commerce, Frameworks", " 13900 | OpenCart | Forums, CMS, E-Commerce, Frameworks", " 4521 | Redmine | Forums, CMS, E-Commerce, Frameworks", " 4522 | PunBB | Forums, CMS, E-Commerce, Frameworks", " 12001 | Atlassian (PBKDF2-HMAC-SHA1) | Forums, CMS, E-Commerce, Frameworks", " 12 | PostgreSQL | Database Server", " 131 | MSSQL (2000) | Database Server", " 132 | MSSQL (2005) | Database Server", " 1731 | MSSQL (2012, 2014) | Database Server", " 200 | MySQL323 | Database Server", " 300 | MySQL4.1/MySQL5 | Database Server", " 3100 | Oracle H: Type (Oracle 7+) | Database Server", " 112 | Oracle S: Type (Oracle 11+) | Database Server", " 12300 | Oracle T: Type (Oracle 12+) | Database Server", " 8000 | Sybase ASE | Database Server", " 141 | Episerver 6.x < .NET 4 | HTTP, SMTP, LDAP Server", " 1441 | Episerver 6.x >= .NET 4 | HTTP, SMTP, LDAP Server", " 1600 | Apache $apr1$ MD5, md5apr1, MD5 (APR) | HTTP, SMTP, LDAP Server", " 12600 | ColdFusion 10+ | HTTP, SMTP, LDAP Server", " 1421 | hMailServer | HTTP, SMTP, LDAP Server", " 101 | nsldap, SHA-1(Base64), Netscape LDAP SHA | HTTP, SMTP, LDAP Server", " 111 | nsldaps, SSHA-1(Base64), Netscape LDAP SSHA | HTTP, SMTP, LDAP Server", " 1411 | SSHA-256(Base64), LDAP {SSHA256} | HTTP, SMTP, LDAP Server", " 1711 | SSHA-512(Base64), LDAP {SSHA512} | HTTP, SMTP, LDAP Server", " 15000 | FileZilla Server >= 0.9.55 | FTP Server", " 11500 | CRC32 | Checksums", " 3000 | LM | Operating Systems", " 1000 | NTLM | Operating Systems", " 1100 | Domain Cached Credentials (DCC), MS Cache | Operating Systems", " 2100 | Domain Cached Credentials 2 (DCC2), MS Cache 2 | Operating Systems", " 15300 | DPAPI masterkey file v1 | Operating Systems", " 15900 | DPAPI masterkey file v2 | Operating Systems", " 12800 | MS-AzureSync PBKDF2-HMAC-SHA256 | Operating Systems", " 1500 | descrypt, DES (Unix), Traditional DES | Operating Systems", " 12400 | BSDi Crypt, Extended DES | Operating Systems", " 500 | md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5) | Operating Systems", " 3200 | bcrypt $2*$, Blowfish (Unix) | Operating Systems", " 7400 | sha256crypt $5$, SHA256 (Unix) | Operating Systems", " 1800 | sha512crypt $6$, SHA512 (Unix) | Operating Systems", " 122 | macOS v10.4, MacOS v10.5, MacOS v10.6 | Operating Systems", " 1722 | macOS v10.7 | Operating Systems", " 7100 | macOS v10.8+ (PBKDF2-SHA512) | Operating Systems", " 6300 | AIX {smd5} | Operating Systems", " 6700 | AIX {ssha1} | Operating Systems", " 6400 | AIX {ssha256} | Operating Systems", " 6500 | AIX {ssha512} | Operating Systems", " 2400 | Cisco-PIX MD5 | Operating Systems", " 2410 | Cisco-ASA MD5 | Operating Systems", " 500 | Cisco-IOS $1$ (MD5) | Operating Systems", " 5700 | Cisco-IOS type 4 (SHA256) | Operating Systems", " 9200 | Cisco-IOS $8$ (PBKDF2-SHA256) | Operating Systems", " 9300 | Cisco-IOS $9$ (scrypt) | Operating Systems", " 22 | Juniper NetScreen/SSG (ScreenOS) | Operating Systems", " 501 | Juniper IVE | Operating Systems", " 15100 | Juniper/NetBSD sha1crypt | Operating Systems", " 7000 | FortiGate (FortiOS) | Operating Systems", " 5800 | Samsung Android Password/PIN | Operating Systems", " 13800 | Windows Phone 8+ PIN/password | Operating Systems", " 8100 | Citrix NetScaler | Operating Systems", " 8500 | RACF | Operating Systems", " 7200 | GRUB 2 | Operating Systems", " 9900 | Radmin2 | Operating Systems", " 125 | ArubaOS | Operating Systems", " 7700 | SAP CODVN B (BCODE) | Enterprise Application Software (EAS)", " 7800 | SAP CODVN F/G (PASSCODE) | Enterprise Application Software (EAS)", " 10300 | SAP CODVN H (PWDSALTEDHASH) iSSHA-1 | Enterprise Application Software (EAS)", " 8600 | Lotus Notes/Domino 5 | Enterprise Application Software (EAS)", " 8700 | Lotus Notes/Domino 6 | Enterprise Application Software (EAS)", " 9100 | Lotus Notes/Domino 8 | Enterprise Application Software (EAS)", " 133 | PeopleSoft | Enterprise Application Software (EAS)", " 13500 | PeopleSoft PS_TOKEN | Enterprise Application Software (EAS)", " 11600 | 7-Zip | Archives", " 12500 | RAR3-hp | Archives", " 13000 | RAR5 | Archives", " 13200 | AxCrypt | Archives", " 13300 | AxCrypt in-memory SHA1 | Archives", " 13600 | WinZip | Archives", " 14700 | iTunes backup < 10.0 | Backup", " 14800 | iTunes backup >= 10.0 | Backup", " 62XY | TrueCrypt | Full-Disk Encryption (FDE)", " X | 1 = PBKDF2-HMAC-RIPEMD160 | Full-Disk Encryption (FDE)", " X | 2 = PBKDF2-HMAC-SHA512 | Full-Disk Encryption (FDE)", " X | 3 = PBKDF2-HMAC-Whirlpool | Full-Disk Encryption (FDE)", " X | 4 = PBKDF2-HMAC-RIPEMD160 + boot-mode | Full-Disk Encryption (FDE)", " Y | 1 = XTS 512 bit pure AES | Full-Disk Encryption (FDE)", " Y | 1 = XTS 512 bit pure Serpent | Full-Disk Encryption (FDE)", " Y | 1 = XTS 512 bit pure Twofish | Full-Disk Encryption (FDE)", " Y | 2 = XTS 1024 bit pure AES | Full-Disk Encryption (FDE)", " Y | 2 = XTS 1024 bit pure Serpent | Full-Disk Encryption (FDE)", " Y | 2 = XTS 1024 bit pure Twofish | Full-Disk Encryption (FDE)", " Y | 2 = XTS 1024 bit cascaded AES-Twofish | Full-Disk Encryption (FDE)", " Y | 2 = XTS 1024 bit cascaded Serpent-AES | Full-Disk Encryption (FDE)", " Y | 2 = XTS 1024 bit cascaded Twofish-Serpent | Full-Disk Encryption (FDE)", " Y | 3 = XTS 1536 bit all | Full-Disk Encryption (FDE)", " 8800 | Android FDE <= 4.3 | Full-Disk Encryption (FDE)", " 12900 | Android FDE (Samsung DEK) | Full-Disk Encryption (FDE)", " 12200 | eCryptfs | Full-Disk Encryption (FDE)", " 137XY | VeraCrypt | Full-Disk Encryption (FDE)", " X | 1 = PBKDF2-HMAC-RIPEMD160 | Full-Disk Encryption (FDE)", " X | 2 = PBKDF2-HMAC-SHA512 | Full-Disk Encryption (FDE)", " X | 3 = PBKDF2-HMAC-Whirlpool | Full-Disk Encryption (FDE)", " X | 4 = PBKDF2-HMAC-RIPEMD160 + boot-mode | Full-Disk Encryption (FDE)", " X | 5 = PBKDF2-HMAC-SHA256 | Full-Disk Encryption (FDE)", " X | 6 = PBKDF2-HMAC-SHA256 + boot-mode | Full-Disk Encryption (FDE)", " Y | 1 = XTS 512 bit pure AES | Full-Disk Encryption (FDE)", " Y | 1 = XTS 512 bit pure Serpent | Full-Disk Encryption (FDE)", " Y | 1 = XTS 512 bit pure Twofish | Full-Disk Encryption (FDE)", " Y | 2 = XTS 1024 bit pure AES | Full-Disk Encryption (FDE)", " Y | 2 = XTS 1024 bit pure Serpent | Full-Disk Encryption (FDE)", " Y | 2 = XTS 1024 bit pure Twofish | Full-Disk Encryption (FDE)", " Y | 2 = XTS 1024 bit cascaded AES-Twofish | Full-Disk Encryption (FDE)", " Y | 2 = XTS 1024 bit cascaded Serpent-AES | Full-Disk Encryption (FDE)", " Y | 2 = XTS 1024 bit cascaded Twofish-Serpent | Full-Disk Encryption (FDE)", " Y | 3 = XTS 1536 bit all | Full-Disk Encryption (FDE)", " 14600 | LUKS | Full-Disk Encryption (FDE)", " 9700 | MS Office <= 2003 $0/$1, MD5 + RC4 | Documents", " 9710 | MS Office <= 2003 $0/$1, MD5 + RC4, collider #1 | Documents", " 9720 | MS Office <= 2003 $0/$1, MD5 + RC4, collider #2 | Documents", " 9800 | MS Office <= 2003 $3/$4, SHA1 + RC4 | Documents", " 9810 | MS Office <= 2003 $3, SHA1 + RC4, collider #1 | Documents", " 9820 | MS Office <= 2003 $3, SHA1 + RC4, collider #2 | Documents", " 9400 | MS Office 2007 | Documents", " 9500 | MS Office 2010 | Documents", " 9600 | MS Office 2013 | Documents", " 10400 | PDF 1.1 - 1.3 (Acrobat 2 - 4) | Documents", " 10410 | PDF 1.1 - 1.3 (Acrobat 2 - 4), collider #1 | Documents", " 10420 | PDF 1.1 - 1.3 (Acrobat 2 - 4), collider #2 | Documents", " 10500 | PDF 1.4 - 1.6 (Acrobat 5 - 8) | Documents", " 10600 | PDF 1.7 Level 3 (Acrobat 9) | Documents", " 10700 | PDF 1.7 Level 8 (Acrobat 10 - 11) | Documents", " 9000 | Password Safe v2 | Password Managers", " 5200 | Password Safe v3 | Password Managers", " 6800 | LastPass + LastPass sniffed | Password Managers", " 6600 | 1Password, agilekeychain | Password Managers", " 8200 | 1Password, cloudkeychain | Password Managers", " 11300 | Bitcoin/Litecoin wallet.dat | Password Managers", " 12700 | Blockchain, My Wallet | Password Managers", " 15200 | Blockchain, My Wallet, V2 | Password Managers", " 13400 | KeePass 1 (AES/Twofish) and KeePass 2 (AES) | Password Managers", " 15500 | JKS Java Key Store Private Keys (SHA1) | Password Managers", " 15600 | Ethereum Wallet, PBKDF2-HMAC-SHA256 | Password Managers", " 15700 | Ethereum Wallet, SCRYPT | Password Managers", " 99999 | Plaintext | Plaintext", "", "- [ Outfile Formats ] -", "", " # | Format", " ===+========", " 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]:crack_pos", " 10 | plain:crack_pos", " 11 | hash[:salt]:plain:crack_pos", " 12 | hex_plain:crack_pos", " 13 | hash[:salt]:hex_plain:crack_pos", " 14 | plain:hex_plain:crack_pos", " 15 | hash[:salt]:plain:hex_plain:crack_pos", "", "- [ Rule Debugging Modes ] -", "", " # | Format", " ===+========", " 1 | Finding-Rule", " 2 | Original-Word", " 3 | Original-Word:Finding-Rule", " 4 | Original-Word:Finding-Rule:Processed-Word", "", "- [ Attack Modes ] -", "", " # | Mode", " ===+======", " 0 | Straight", " 1 | Combination", " 3 | Brute-force", " 6 | Hybrid Wordlist + Mask", " 7 | Hybrid Mask + Wordlist", "", "- [ Built-in Charsets ] -", "", " ? | Charset", " ===+=========", " l | abcdefghijklmnopqrstuvwxyz", " u | ABCDEFGHIJKLMNOPQRSTUVWXYZ", " d | 0123456789", " h | 0123456789abcdef", " H | 0123456789ABCDEF", " s | !\"#$%%&'()*+,-./:;<=>?@[\\]^_`{|}~", " a | ?l?u?d?s", " b | 0x00 - 0xff", "", "- [ OpenCL Device Types ] -", "", " # | Device Type", " ===+=============", " 1 | CPU", " 2 | GPU", " 3 | FPGA, DSP, Co-Processor", "", "- [ Workload Profiles ] -", "", " # | Performance | Runtime | Power Consumption | Desktop Impact", " ===+=============+=========+===================+=================", " 1 | Low | 2 ms | Low | Minimal", " 2 | Default | 12 ms | Economic | Noticeable", " 3 | High | 96 ms | High | Unresponsive", " 4 | Nightmare | 480 ms | Insane | Headless", "", "- [ Basic Examples ] -", "", " Attack- | Hash- |", " Mode | Type | Example command", " ==================+=======+==================================================================", " Wordlist | $P$ | %s -a 0 -m 400 example400.hash example.dict", " Wordlist + Rules | MD5 | %s -a 0 -m 0 example0.hash example.dict -r rules/best64.rule", " Brute-Force | MD5 | %s -a 3 -m 0 example0.hash ?a?a?a?a?a?a", " Combinator | MD5 | %s -a 1 -m 0 example0.hash example.dict example.dict", "", "If you still have no idea what just happened, try the following pages:", "", "* https://hashcat.net/wiki/#howtos_videos_papers_articles_etc_in_the_wild", "* https://hashcat.net/faq/", NULL }; void usage_mini_print (const char *progname) { for (int i = 0; USAGE_MINI[i] != NULL; i++) { printf (USAGE_MINI[i], progname); hc_fwrite (EOL, strlen (EOL), 1, stdout); } } void usage_big_print (const char *progname) { for (int i = 0; USAGE_BIG[i] != NULL; i++) { printf (USAGE_BIG[i], progname); hc_fwrite (EOL, strlen (EOL), 1, stdout); } } hashcat-4.0.1/src/user_options.c000066400000000000000000002262221320027462700166240ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "logfile.h" #include "interface.h" #include "shared.h" #include "usage.h" #include "outfile.h" #include "user_options.h" static const char short_options[] = "hVvm:a:r:j:k:g:o:t:d:D:n:u:c:p:s:l:1:2:3:4:iIbw:O"; static const struct option long_options[] = { {"advice-disable", no_argument, 0, IDX_ADVICE_DISABLE}, {"attack-mode", required_argument, 0, IDX_ATTACK_MODE}, {"benchmark", no_argument, 0, IDX_BENCHMARK}, {"bitmap-max", required_argument, 0, IDX_BITMAP_MAX}, {"bitmap-min", required_argument, 0, IDX_BITMAP_MIN}, {"cpu-affinity", required_argument, 0, IDX_CPU_AFFINITY}, {"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}, {"debug-file", required_argument, 0, IDX_DEBUG_FILE}, {"debug-mode", required_argument, 0, IDX_DEBUG_MODE}, {"encoding-from", required_argument, 0, IDX_ENCODING_FROM}, {"encoding-to", required_argument, 0, IDX_ENCODING_TO}, {"example-hashes", no_argument, 0, IDX_EXAMPLE_HASHES}, {"force", no_argument, 0, IDX_FORCE}, {"generate-rules-func-max", required_argument, 0, IDX_RP_GEN_FUNC_MAX}, {"generate-rules-func-min", required_argument, 0, IDX_RP_GEN_FUNC_MIN}, {"generate-rules", required_argument, 0, IDX_RP_GEN}, {"generate-rules-seed", required_argument, 0, IDX_RP_GEN_SEED}, {"gpu-temp-abort", required_argument, 0, IDX_GPU_TEMP_ABORT}, {"gpu-temp-disable", no_argument, 0, IDX_GPU_TEMP_DISABLE}, {"gpu-temp-retain", required_argument, 0, IDX_GPU_TEMP_RETAIN}, {"hash-type", required_argument, 0, IDX_HASH_MODE}, {"hccapx-message-pair", required_argument, 0, IDX_HCCAPX_MESSAGE_PAIR}, {"help", no_argument, 0, IDX_HELP}, {"hex-charset", no_argument, 0, IDX_HEX_CHARSET}, {"hex-salt", no_argument, 0, IDX_HEX_SALT}, {"hex-wordlist", no_argument, 0, IDX_HEX_WORDLIST}, {"increment-max", required_argument, 0, IDX_INCREMENT_MAX}, {"increment-min", required_argument, 0, IDX_INCREMENT_MIN}, {"increment", no_argument, 0, IDX_INCREMENT}, {"induction-dir", required_argument, 0, IDX_INDUCTION_DIR}, {"keep-guessing", no_argument, 0, IDX_KEEP_GUESSING}, {"kernel-accel", required_argument, 0, IDX_KERNEL_ACCEL}, {"kernel-loops", required_argument, 0, IDX_KERNEL_LOOPS}, {"keyspace", no_argument, 0, IDX_KEYSPACE}, {"left", no_argument, 0, IDX_LEFT}, {"limit", required_argument, 0, IDX_LIMIT}, {"logfile-disable", no_argument, 0, IDX_LOGFILE_DISABLE}, {"loopback", no_argument, 0, IDX_LOOPBACK}, {"machine-readable", no_argument, 0, IDX_MACHINE_READABLE}, {"markov-classic", no_argument, 0, IDX_MARKOV_CLASSIC}, {"markov-disable", no_argument, 0, IDX_MARKOV_DISABLE}, {"markov-hcstat", required_argument, 0, IDX_MARKOV_HCSTAT}, {"markov-threshold", required_argument, 0, IDX_MARKOV_THRESHOLD}, {"nonce-error-corrections", required_argument, 0, IDX_NONCE_ERROR_CORRECTIONS}, {"nvidia-spin-damp", required_argument, 0, IDX_NVIDIA_SPIN_DAMP}, {"opencl-devices", required_argument, 0, IDX_OPENCL_DEVICES}, {"opencl-device-types", required_argument, 0, IDX_OPENCL_DEVICE_TYPES}, {"opencl-info", no_argument, 0, IDX_OPENCL_INFO}, {"opencl-platforms", required_argument, 0, IDX_OPENCL_PLATFORMS}, {"opencl-vector-width", required_argument, 0, IDX_OPENCL_VECTOR_WIDTH}, {"optimized-kernel-enable", no_argument, 0, IDX_OPTIMIZED_KERNEL_ENABLE}, {"outfile-autohex-disable", no_argument, 0, IDX_OUTFILE_AUTOHEX_DISABLE}, {"outfile-check-dir", required_argument, 0, IDX_OUTFILE_CHECK_DIR}, {"outfile-check-timer", required_argument, 0, IDX_OUTFILE_CHECK_TIMER}, {"outfile-format", required_argument, 0, IDX_OUTFILE_FORMAT}, {"outfile", required_argument, 0, IDX_OUTFILE}, {"wordlist-autohex-disable", no_argument, 0, IDX_WORDLIST_AUTOHEX_DISABLE}, {"potfile-disable", no_argument, 0, IDX_POTFILE_DISABLE}, {"potfile-path", required_argument, 0, IDX_POTFILE_PATH}, {"powertune-enable", no_argument, 0, IDX_POWERTUNE_ENABLE}, {"quiet", no_argument, 0, IDX_QUIET}, {"remove", no_argument, 0, IDX_REMOVE}, {"remove-timer", required_argument, 0, IDX_REMOVE_TIMER}, {"restore-disable", no_argument, 0, IDX_RESTORE_DISABLE}, {"restore-file-path", required_argument, 0, IDX_RESTORE_FILE_PATH}, {"restore", no_argument, 0, IDX_RESTORE}, {"rule-left", required_argument, 0, IDX_RULE_BUF_L}, {"rule-right", required_argument, 0, IDX_RULE_BUF_R}, {"rules-file", required_argument, 0, IDX_RP_FILE}, {"runtime", required_argument, 0, IDX_RUNTIME}, {"scrypt-tmto", required_argument, 0, IDX_SCRYPT_TMTO}, {"self-test-disable", no_argument, 0, IDX_SELF_TEST_DISABLE}, {"segment-size", required_argument, 0, IDX_SEGMENT_SIZE}, {"separator", required_argument, 0, IDX_SEPARATOR}, {"seperator", required_argument, 0, IDX_SEPARATOR}, {"session", required_argument, 0, IDX_SESSION}, {"show", no_argument, 0, IDX_SHOW}, {"skip", required_argument, 0, IDX_SKIP}, {"status", no_argument, 0, IDX_STATUS}, {"status-timer", required_argument, 0, IDX_STATUS_TIMER}, {"stdout", no_argument, 0, IDX_STDOUT_FLAG}, {"speed-only", no_argument, 0, IDX_SPEED_ONLY}, {"progress-only", no_argument, 0, IDX_PROGRESS_ONLY}, {"truecrypt-keyfiles", required_argument, 0, IDX_TRUECRYPT_KEYFILES}, {"username", no_argument, 0, IDX_USERNAME}, {"veracrypt-keyfiles", required_argument, 0, IDX_VERACRYPT_KEYFILES}, {"veracrypt-pim", required_argument, 0, IDX_VERACRYPT_PIM}, {"version", no_argument, 0, IDX_VERSION}, {"workload-profile", required_argument, 0, IDX_WORKLOAD_PROFILE}, {} }; static char ENCODING_FROM[] = "utf-8"; static char ENCODING_TO[] = "utf-8"; static char RULE_BUF_R[] = ":"; static char RULE_BUF_L[] = ":"; static char DEF_MASK_CS_1[] = "?l?d?u"; static char DEF_MASK_CS_2[] = "?l?d"; static char DEF_MASK_CS_3[] = "?l?d*!$@_"; int user_options_init (hashcat_ctx_t *hashcat_ctx) { user_options_t *user_options = hashcat_ctx->user_options; user_options->advice_disable = ADVICE_DISABLE; user_options->attack_mode = ATTACK_MODE; user_options->benchmark = BENCHMARK; user_options->bitmap_max = BITMAP_MAX; user_options->bitmap_min = BITMAP_MIN; user_options->cpu_affinity = NULL; user_options->custom_charset_1 = NULL; user_options->custom_charset_2 = NULL; user_options->custom_charset_3 = NULL; user_options->custom_charset_4 = NULL; user_options->debug_file = NULL; user_options->debug_mode = DEBUG_MODE; user_options->example_hashes = EXAMPLE_HASHES; user_options->encoding_from = ENCODING_FROM; user_options->encoding_to = ENCODING_TO; user_options->force = FORCE; user_options->gpu_temp_abort = GPU_TEMP_ABORT; user_options->gpu_temp_disable = GPU_TEMP_DISABLE; user_options->gpu_temp_retain = GPU_TEMP_RETAIN; user_options->hash_mode = HASH_MODE; user_options->hccapx_message_pair = HCCAPX_MESSAGE_PAIR; user_options->hex_charset = HEX_CHARSET; user_options->hex_salt = HEX_SALT; user_options->hex_wordlist = HEX_WORDLIST; user_options->increment = INCREMENT; user_options->increment_max = INCREMENT_MAX; user_options->increment_min = INCREMENT_MIN; user_options->induction_dir = NULL; user_options->kernel_accel = KERNEL_ACCEL; user_options->kernel_loops = KERNEL_LOOPS; user_options->keep_guessing = KEEP_GUESSING; user_options->keyspace = KEYSPACE; user_options->left = LEFT; user_options->limit = LIMIT; user_options->logfile_disable = LOGFILE_DISABLE; user_options->loopback = LOOPBACK; user_options->machine_readable = MACHINE_READABLE; user_options->markov_classic = MARKOV_CLASSIC; user_options->markov_disable = MARKOV_DISABLE; user_options->markov_hcstat = NULL; user_options->markov_threshold = MARKOV_THRESHOLD; user_options->nonce_error_corrections = NONCE_ERROR_CORRECTIONS; user_options->nvidia_spin_damp = NVIDIA_SPIN_DAMP; user_options->opencl_devices = NULL; user_options->opencl_device_types = NULL; user_options->opencl_info = OPENCL_INFO; user_options->opencl_platforms = NULL; user_options->opencl_vector_width = OPENCL_VECTOR_WIDTH; user_options->optimized_kernel_enable = OPTIMIZED_KERNEL_ENABLE; user_options->wordlist_autohex_disable = WORDLIST_AUTOHEX_DISABLE; user_options->outfile_autohex = OUTFILE_AUTOHEX; user_options->outfile_check_dir = NULL; user_options->outfile_check_timer = OUTFILE_CHECK_TIMER; user_options->outfile_format = OUTFILE_FORMAT; user_options->outfile = NULL; user_options->potfile_disable = POTFILE_DISABLE; user_options->potfile_path = NULL; user_options->powertune_enable = POWERTUNE_ENABLE; user_options->quiet = QUIET; user_options->remove = REMOVE; user_options->remove_timer = REMOVE_TIMER; user_options->restore_disable = RESTORE_DISABLE; user_options->restore_file_path = NULL; user_options->restore = RESTORE; user_options->restore_timer = RESTORE_TIMER; user_options->rp_gen_func_max = RP_GEN_FUNC_MAX; user_options->rp_gen_func_min = RP_GEN_FUNC_MIN; user_options->rp_gen = RP_GEN; user_options->rp_gen_seed = RP_GEN_SEED; user_options->rule_buf_l = RULE_BUF_L; user_options->rule_buf_r = RULE_BUF_R; user_options->runtime = RUNTIME; user_options->scrypt_tmto = SCRYPT_TMTO; user_options->self_test_disable = SELF_TEST_DISABLE; user_options->segment_size = SEGMENT_SIZE; user_options->separator = SEPARATOR; user_options->session = PROGNAME; user_options->show = SHOW; user_options->skip = SKIP; user_options->status = STATUS; user_options->status_timer = STATUS_TIMER; user_options->stdout_flag = STDOUT_FLAG; user_options->speed_only = SPEED_ONLY; user_options->progress_only = PROGRESS_ONLY; user_options->truecrypt_keyfiles = NULL; user_options->usage = USAGE; user_options->username = USERNAME; user_options->veracrypt_keyfiles = NULL; user_options->veracrypt_pim = 0; user_options->version = VERSION; user_options->workload_profile = WORKLOAD_PROFILE; user_options->rp_files_cnt = 0; user_options->rp_files = (char **) hccalloc (256, sizeof (char *)); user_options->hc_bin = PROGNAME; user_options->hc_argc = 0; user_options->hc_argv = NULL; return 0; } void user_options_destroy (hashcat_ctx_t *hashcat_ctx) { user_options_t *user_options = hashcat_ctx->user_options; hcfree (user_options->rp_files); //do not reset this, it might be used from main.c //memset (user_options, 0, sizeof (user_options_t)); } int user_options_getopt (hashcat_ctx_t *hashcat_ctx, int argc, char **argv) { user_options_t *user_options = hashcat_ctx->user_options; int c = -1; int option_index; optind = 1; optopt = 0; option_index = 0; while ((c = getopt_long (argc, argv, short_options, long_options, &option_index)) != -1) { switch (c) { case IDX_REMOVE_TIMER: case IDX_DEBUG_MODE: case IDX_SKIP: case IDX_LIMIT: case IDX_STATUS_TIMER: case IDX_HASH_MODE: case IDX_RUNTIME: case IDX_ATTACK_MODE: case IDX_RP_GEN: case IDX_RP_GEN_FUNC_MIN: case IDX_RP_GEN_FUNC_MAX: case IDX_RP_GEN_SEED: case IDX_MARKOV_THRESHOLD: case IDX_OUTFILE_FORMAT: case IDX_OUTFILE_CHECK_TIMER: case IDX_OPENCL_VECTOR_WIDTH: case IDX_WORKLOAD_PROFILE: case IDX_KERNEL_ACCEL: case IDX_KERNEL_LOOPS: case IDX_NVIDIA_SPIN_DAMP: case IDX_GPU_TEMP_ABORT: case IDX_GPU_TEMP_RETAIN: case IDX_HCCAPX_MESSAGE_PAIR: case IDX_NONCE_ERROR_CORRECTIONS: case IDX_VERACRYPT_PIM: case IDX_SEGMENT_SIZE: case IDX_SCRYPT_TMTO: case IDX_BITMAP_MIN: case IDX_BITMAP_MAX: case IDX_INCREMENT_MIN: case IDX_INCREMENT_MAX: if (hc_string_is_digit (optarg) == false) { event_log_error (hashcat_ctx, "The specified parameter cannot use '%s' as a value - must be a number.", optarg); return -1; } break; case '?': { event_log_error (hashcat_ctx, "Invalid argument specified."); return -1; } } } optind = 1; optopt = 0; option_index = 0; while ((c = getopt_long (argc, argv, short_options, long_options, &option_index)) != -1) { switch (c) { case IDX_HELP: user_options->usage = true; break; case IDX_VERSION: user_options->version = true; break; case IDX_RESTORE: user_options->restore = true; break; case IDX_QUIET: user_options->quiet = true; break; case IDX_SHOW: user_options->show = true; break; case IDX_LEFT: user_options->left = true; break; case IDX_ADVICE_DISABLE: user_options->advice_disable = true; break; case IDX_USERNAME: user_options->username = true; break; case IDX_REMOVE: user_options->remove = true; break; case IDX_REMOVE_TIMER: user_options->remove_timer = atoi (optarg); user_options->remove_timer_chgd = true; break; case IDX_POTFILE_DISABLE: user_options->potfile_disable = true; break; case IDX_POTFILE_PATH: user_options->potfile_path = optarg; break; case IDX_DEBUG_MODE: user_options->debug_mode = atoi (optarg); break; case IDX_DEBUG_FILE: user_options->debug_file = optarg; break; case IDX_ENCODING_FROM: user_options->encoding_from = optarg; break; case IDX_ENCODING_TO: user_options->encoding_to = optarg; break; case IDX_INDUCTION_DIR: user_options->induction_dir = optarg; break; case IDX_OUTFILE_CHECK_DIR: user_options->outfile_check_dir = optarg; break; case IDX_EXAMPLE_HASHES: user_options->example_hashes = true; break; case IDX_FORCE: user_options->force = true; break; case IDX_SELF_TEST_DISABLE: user_options->self_test_disable = true; break; case IDX_SKIP: user_options->skip = atoll (optarg); break; case IDX_LIMIT: user_options->limit = atoll (optarg); break; case IDX_KEEP_GUESSING: user_options->keep_guessing = true; break; case IDX_KEYSPACE: user_options->keyspace = true; break; case IDX_BENCHMARK: user_options->benchmark = true; break; case IDX_STDOUT_FLAG: user_options->stdout_flag = true; break; case IDX_SPEED_ONLY: user_options->speed_only = true; break; case IDX_PROGRESS_ONLY: user_options->progress_only = true; break; case IDX_RESTORE_DISABLE: user_options->restore_disable = true; break; case IDX_RESTORE_FILE_PATH: user_options->restore_file_path = optarg; break; case IDX_STATUS: user_options->status = true; break; case IDX_STATUS_TIMER: user_options->status_timer = atoi (optarg); break; case IDX_MACHINE_READABLE: user_options->machine_readable = true; break; case IDX_LOOPBACK: user_options->loopback = true; break; case IDX_SESSION: user_options->session = optarg; break; case IDX_HASH_MODE: user_options->hash_mode = atoi (optarg); user_options->hash_mode_chgd = true; break; case IDX_RUNTIME: user_options->runtime = atoi (optarg); user_options->runtime_chgd = true; break; case IDX_ATTACK_MODE: user_options->attack_mode = atoi (optarg); user_options->attack_mode_chgd = true; break; case IDX_RP_FILE: user_options->rp_files[user_options->rp_files_cnt++] = optarg; break; case IDX_RP_GEN: user_options->rp_gen = atoi (optarg); break; case IDX_RP_GEN_FUNC_MIN: user_options->rp_gen_func_min = atoi (optarg); break; case IDX_RP_GEN_FUNC_MAX: user_options->rp_gen_func_max = atoi (optarg); break; case IDX_RP_GEN_SEED: user_options->rp_gen_seed = atoi (optarg); user_options->rp_gen_seed_chgd = true; break; case IDX_RULE_BUF_L: user_options->rule_buf_l = optarg; break; case IDX_RULE_BUF_R: user_options->rule_buf_r = optarg; break; case IDX_MARKOV_DISABLE: user_options->markov_disable = true; break; case IDX_MARKOV_CLASSIC: user_options->markov_classic = true; break; case IDX_MARKOV_THRESHOLD: user_options->markov_threshold = atoi (optarg); break; case IDX_MARKOV_HCSTAT: user_options->markov_hcstat = optarg; break; case IDX_OUTFILE: user_options->outfile = optarg; break; case IDX_OUTFILE_FORMAT: user_options->outfile_format = atoi (optarg); user_options->outfile_format_chgd = true; break; case IDX_OUTFILE_AUTOHEX_DISABLE: user_options->outfile_autohex = false; break; case IDX_OUTFILE_CHECK_TIMER: user_options->outfile_check_timer = atoi (optarg); break; case IDX_WORDLIST_AUTOHEX_DISABLE: user_options->wordlist_autohex_disable = true; break; case IDX_HEX_CHARSET: user_options->hex_charset = true; break; case IDX_HEX_SALT: user_options->hex_salt = true; break; case IDX_HEX_WORDLIST: user_options->hex_wordlist = true; break; case IDX_CPU_AFFINITY: user_options->cpu_affinity = optarg; break; case IDX_OPENCL_INFO: user_options->opencl_info = true; break; case IDX_OPENCL_DEVICES: user_options->opencl_devices = optarg; break; case IDX_OPENCL_PLATFORMS: user_options->opencl_platforms = optarg; break; case IDX_OPENCL_DEVICE_TYPES: user_options->opencl_device_types = optarg; break; case IDX_OPENCL_VECTOR_WIDTH: user_options->opencl_vector_width = atoi (optarg); user_options->opencl_vector_width_chgd = true; break; case IDX_OPTIMIZED_KERNEL_ENABLE: user_options->optimized_kernel_enable = true; break; case IDX_WORKLOAD_PROFILE: user_options->workload_profile = atoi (optarg); user_options->workload_profile_chgd = true; break; case IDX_KERNEL_ACCEL: user_options->kernel_accel = atoi (optarg); user_options->kernel_accel_chgd = true; break; case IDX_KERNEL_LOOPS: user_options->kernel_loops = atoi (optarg); user_options->kernel_loops_chgd = true; break; case IDX_NVIDIA_SPIN_DAMP: user_options->nvidia_spin_damp = atoi (optarg); user_options->nvidia_spin_damp_chgd = true; break; case IDX_GPU_TEMP_DISABLE: user_options->gpu_temp_disable = true; break; case IDX_GPU_TEMP_ABORT: user_options->gpu_temp_abort = atoi (optarg); break; case IDX_GPU_TEMP_RETAIN: user_options->gpu_temp_retain = atoi (optarg); break; case IDX_POWERTUNE_ENABLE: user_options->powertune_enable = true; break; case IDX_LOGFILE_DISABLE: user_options->logfile_disable = true; break; case IDX_HCCAPX_MESSAGE_PAIR: user_options->hccapx_message_pair = atoi (optarg); user_options->hccapx_message_pair_chgd = true; break; case IDX_NONCE_ERROR_CORRECTIONS: user_options->nonce_error_corrections = atoi (optarg); break; case IDX_TRUECRYPT_KEYFILES: user_options->truecrypt_keyfiles = optarg; break; case IDX_VERACRYPT_KEYFILES: user_options->veracrypt_keyfiles = optarg; break; case IDX_VERACRYPT_PIM: user_options->veracrypt_pim = atoi (optarg); break; case IDX_SEGMENT_SIZE: user_options->segment_size = atoi (optarg); user_options->segment_size_chgd = true; break; case IDX_SCRYPT_TMTO: user_options->scrypt_tmto = atoi (optarg); break; case IDX_SEPARATOR: user_options->separator = optarg[0]; break; case IDX_BITMAP_MIN: user_options->bitmap_min = atoi (optarg); break; case IDX_BITMAP_MAX: user_options->bitmap_max = atoi (optarg); break; case IDX_INCREMENT: user_options->increment = true; break; case IDX_INCREMENT_MIN: user_options->increment_min = atoi (optarg); user_options->increment_min_chgd = true; break; case IDX_INCREMENT_MAX: user_options->increment_max = atoi (optarg); user_options->increment_max_chgd = true; break; case IDX_CUSTOM_CHARSET_1: user_options->custom_charset_1 = optarg; break; case IDX_CUSTOM_CHARSET_2: user_options->custom_charset_2 = optarg; break; case IDX_CUSTOM_CHARSET_3: user_options->custom_charset_3 = optarg; break; case IDX_CUSTOM_CHARSET_4: user_options->custom_charset_4 = optarg; break; } } user_options->hc_bin = argv[0]; user_options->hc_argc = argc - optind; user_options->hc_argv = argv + optind; return 0; } int user_options_sanity (hashcat_ctx_t *hashcat_ctx) { user_options_t *user_options = hashcat_ctx->user_options; if (user_options->hc_argc < 0) { event_log_error (hashcat_ctx, "hc_argc %d is invalid.", user_options->hc_argc); return -1; } if (user_options->hc_argv == NULL) { event_log_error (hashcat_ctx, "hc_argv is NULL."); return -1; } if ((user_options->attack_mode != ATTACK_MODE_STRAIGHT) && (user_options->attack_mode != ATTACK_MODE_COMBI) && (user_options->attack_mode != ATTACK_MODE_BF) && (user_options->attack_mode != ATTACK_MODE_HYBRID1) && (user_options->attack_mode != ATTACK_MODE_HYBRID2) && (user_options->attack_mode != ATTACK_MODE_NONE)) { event_log_error (hashcat_ctx, "Invalid attack mode (-a) value specified."); return -1; } if (user_options->hccapx_message_pair_chgd == true) { if (user_options->remove == true) { event_log_error (hashcat_ctx, "Combining --remove with --hccapx-message-pair is not allowed."); return -1; } if (user_options->hccapx_message_pair >= 6) { event_log_error (hashcat_ctx, "Invalid --hccapx-message-pair value specified."); return -1; } } if (user_options->runtime_chgd == true && user_options->runtime == 0) { event_log_error (hashcat_ctx, "Invalid --runtime value specified."); return -1; } if (user_options->runtime_chgd == true && user_options->loopback == true) { event_log_error (hashcat_ctx, "Combining --limit with --loopback is not allowed."); return -1; } if (user_options->hash_mode > 99999) { event_log_error (hashcat_ctx, "Invalid -m (hash type) value specified."); return -1; } if (user_options->username == true) { if ((user_options->hash_mode == 2500) || (user_options->hash_mode == 2501) || (user_options->hash_mode == 5200) || ((user_options->hash_mode >= 6200) && (user_options->hash_mode <= 6299)) || ((user_options->hash_mode >= 13700) && (user_options->hash_mode <= 13799)) || (user_options->hash_mode == 9000)) { event_log_error (hashcat_ctx, "Combining --username with hashes of type %s is not supported.", strhashtype (user_options->hash_mode)); return -1; } } if (user_options->outfile_format > 16) { event_log_error (hashcat_ctx, "Invalid --outfile-format value specified."); return -1; } if (user_options->left == true) { if (user_options->outfile_format_chgd == true) { if (user_options->outfile_format > 1) { event_log_error (hashcat_ctx, "Combining --outfile-format > 1 with --left is not allowed."); return -1; } } } if (user_options->show == true) { if (user_options->outfile_format_chgd == true) { if (user_options->outfile_format > 7) { event_log_error (hashcat_ctx, "Combining --outfile-format > 7 with --show is not allowed."); return -1; } } } if (user_options->increment_min < INCREMENT_MIN) { event_log_error (hashcat_ctx, "Invalid --increment-min value specified."); return -1; } if (user_options->increment_max > INCREMENT_MAX) { event_log_error (hashcat_ctx, "Invalid --increment-max value specified."); return -1; } if (user_options->increment_min > user_options->increment_max) { event_log_error (hashcat_ctx, "Invalid --increment-min value specified - must be >= --increment-max."); return -1; } if ((user_options->increment == true) && (user_options->progress_only == true)) { event_log_error (hashcat_ctx, "Increment is not allowed in combination with --progress-only."); return -1; } if ((user_options->increment == true) && (user_options->speed_only == true)) { event_log_error (hashcat_ctx, "Increment is not allowed in combination with --speed-only."); return -1; } if ((user_options->increment == true) && (user_options->attack_mode == ATTACK_MODE_STRAIGHT)) { event_log_error (hashcat_ctx, "Increment is not allowed in attack mode 0 (straight)."); return -1; } if ((user_options->increment == false) && (user_options->increment_min_chgd == true)) { event_log_error (hashcat_ctx, "Increment-min is only supported when combined with -i/--increment."); return -1; } if ((user_options->increment == false) && (user_options->increment_max_chgd == true)) { event_log_error (hashcat_ctx, "Increment-max is only supported combined with -i/--increment."); return -1; } if ((user_options->rp_files_cnt > 0) && (user_options->rp_gen > 0)) { event_log_error (hashcat_ctx, "Combining -r/--rules-file and -g/--rules-generate is not supported."); return -1; } if ((user_options->rp_files_cnt > 0) || (user_options->rp_gen > 0)) { if (user_options->attack_mode != ATTACK_MODE_STRAIGHT) { event_log_error (hashcat_ctx, "Use of -r/--rules-file and -g/--rules-generate only allowed in attack mode 0."); return -1; } } if (user_options->bitmap_min > user_options->bitmap_max) { event_log_error (hashcat_ctx, "Invalid --bitmap-min value specified."); return -1; } if (user_options->rp_gen_func_min > user_options->rp_gen_func_max) { event_log_error (hashcat_ctx, "Invalid --rp-gen-func-min value specified."); return -1; } if (user_options->kernel_accel_chgd == true) { if (user_options->force == false) { event_log_error (hashcat_ctx, "The manual use of the -n option (or --kernel-accel) is outdated."); event_log_warning (hashcat_ctx, "Please consider using the -w option instead."); event_log_warning (hashcat_ctx, "You can use --force to override this, but do not report related errors."); event_log_warning (hashcat_ctx, NULL); return -1; } if (user_options->kernel_accel < 1) { event_log_error (hashcat_ctx, "Invalid --kernel-accel value specified - must be greater than 0."); return -1; } if (user_options->kernel_accel > 1024) { event_log_error (hashcat_ctx, "Invalid --kernel-accel value specified - must be <= 1024."); return -1; } } if (user_options->kernel_loops_chgd == true) { if (user_options->force == false) { event_log_error (hashcat_ctx, "The manual use of the -u option (or --kernel-loops) is outdated."); event_log_warning (hashcat_ctx, "Please consider using the -w option instead."); event_log_warning (hashcat_ctx, "You can use --force to override this, but do not report related errors."); event_log_warning (hashcat_ctx, NULL); return -1; } if (user_options->kernel_loops < 1) { event_log_error (hashcat_ctx, "Invalid kernel-loops specified."); return -1; } if (user_options->kernel_loops > 1024) { event_log_error (hashcat_ctx, "Invalid kernel-loops specified."); return -1; } } if ((user_options->workload_profile < 1) || (user_options->workload_profile > 4)) { event_log_error (hashcat_ctx, "workload-profile %u is not available.", user_options->workload_profile); return -1; } if (user_options->opencl_vector_width_chgd == true) { if (is_power_of_2 (user_options->opencl_vector_width) == false || user_options->opencl_vector_width > 16) { event_log_error (hashcat_ctx, "opencl-vector-width %u is not allowed.", user_options->opencl_vector_width); return -1; } } if (user_options->show == true || user_options->left == true) { if (user_options->remove == true) { event_log_error (hashcat_ctx, "Mixing --remove not allowed with --show or --left."); return -1; } if (user_options->potfile_disable == true) { event_log_error (hashcat_ctx, "Mixing --potfile-disable is not allowed with --show or --left."); return -1; } } if (user_options->show == true) { if (user_options->outfile_autohex == false) { event_log_error (hashcat_ctx, "Mixing --outfile-autohex-disable is not allowed with --show."); return -1; } } if (user_options->keyspace == true) { if (user_options->show == true) { event_log_error (hashcat_ctx, "Combining --show with --keyspace is not allowed."); return -1; } if (user_options->left == true) { event_log_error (hashcat_ctx, "Combining --left with --keyspace is not allowed."); return -1; } } if (user_options->remove_timer_chgd == true) { if (user_options->remove == false) { event_log_error (hashcat_ctx, "The --remove-timer requires --remove."); return -1; } if (user_options->remove_timer < 1) { event_log_error (hashcat_ctx, "The --remove-timer parameter must have a value greater than or equal to 1."); return -1; } } if (user_options->loopback == true) { if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { if ((user_options->rp_files_cnt == 0) && (user_options->rp_gen == 0)) { event_log_error (hashcat_ctx, "Parameter --loopback not allowed without -r/--rules-file or -g/--rules-generate."); return -1; } } else { event_log_error (hashcat_ctx, "Parameter --loopback is only allowed in attack mode 0 (straight)."); return -1; } } if (user_options->debug_mode > 0) { if (user_options->attack_mode != ATTACK_MODE_STRAIGHT) { event_log_error (hashcat_ctx, "Parameter --debug-mode option is only allowed in attack mode 0 (straight)."); return -1; } if ((user_options->rp_files_cnt == 0) && (user_options->rp_gen == 0)) { event_log_error (hashcat_ctx, "Use of --debug-mode requires -r/--rules-file or -g/--rules-generate."); return -1; } } if (user_options->debug_mode > 4) { event_log_error (hashcat_ctx, "Invalid --debug-mode value specified."); return -1; } if (user_options->debug_file != NULL) { if (user_options->debug_mode < 1) { event_log_error (hashcat_ctx, "Parameter --debug-file requires --debug-mode."); return -1; } } if (user_options->induction_dir != NULL) { if (user_options->attack_mode == ATTACK_MODE_BF) { event_log_error (hashcat_ctx, "Use of --induction-dir is not allowed in attack mode 3 (brute-force)."); return -1; } } if (user_options->nvidia_spin_damp > 100) { event_log_error (hashcat_ctx, "Values of --nvidia-spin-damp must be between 0 and 100 (inclusive)."); return -1; } if ((user_options->nvidia_spin_damp_chgd == true) && (user_options->benchmark == true)) { event_log_error (hashcat_ctx, "Values of --nvidia-spin-damp cannot be used in combination with --benchmark."); return -1; } if ((user_options->gpu_temp_abort != 0) && (user_options->gpu_temp_retain != 0)) { if (user_options->gpu_temp_abort < user_options->gpu_temp_retain) { event_log_error (hashcat_ctx, "Value for --gpu-temp-abort must not be less than --gpu-temp-retain value."); return -1; } } if (user_options->benchmark == true) { if (user_options->attack_mode_chgd == true) { if (user_options->attack_mode != ATTACK_MODE_BF) { event_log_error (hashcat_ctx, "Benchmark mode is only allowed in attack mode 3 (brute-force)."); return -1; } } } if (user_options->markov_hcstat != NULL) { if (strlen (user_options->markov_hcstat) == 0) { event_log_error (hashcat_ctx, "Invalid --markov-hcstat value - must not be empty."); return -1; } } if (user_options->restore_file_path != NULL) { if (strlen (user_options->restore_file_path) == 0) { event_log_error (hashcat_ctx, "Invalid --restore-file-path value - must not be empty."); return -1; } } if (user_options->outfile != NULL) { if (strlen (user_options->outfile) == 0) { event_log_error (hashcat_ctx, "Invalid --outfile value - must not be empty."); return -1; } } if (user_options->debug_file != NULL) { if (strlen (user_options->debug_file) == 0) { event_log_error (hashcat_ctx, "Invalid --debug-file value - must not be empty."); return -1; } } if (user_options->session != NULL) { if (strlen (user_options->session) == 0) { event_log_error (hashcat_ctx, "Invalid --session value - must not be empty."); return -1; } } if (user_options->cpu_affinity != NULL) { if (strlen (user_options->cpu_affinity) == 0) { event_log_error (hashcat_ctx, "Invalid --cpu-affinity value - must not be empty."); return -1; } } if (user_options->opencl_platforms != NULL) { if (strlen (user_options->opencl_platforms) == 0) { event_log_error (hashcat_ctx, "Invalid --opencl-platforms value - must not be empty."); return -1; } } if (user_options->opencl_devices != NULL) { if (strlen (user_options->opencl_devices) == 0) { event_log_error (hashcat_ctx, "Invalid --opencl-devices value - must not be empty."); return -1; } } if (user_options->opencl_device_types != NULL) { if (strlen (user_options->opencl_device_types) == 0) { event_log_error (hashcat_ctx, "Invalid --opencl-device-types value - must not be empty."); return -1; } } // custom charset checks if ((user_options->custom_charset_1 != NULL) || (user_options->custom_charset_2 != NULL) || (user_options->custom_charset_3 != NULL) || (user_options->custom_charset_4 != NULL)) { if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { event_log_error (hashcat_ctx, "Custom charsets are not supported in attack mode 0 (straight)."); return -1; } if (user_options->attack_mode == ATTACK_MODE_COMBI) { event_log_error (hashcat_ctx, "Custom charsets re not supported in attack mode 1 (combination)."); return -1; } // detect if mask was specified: bool mask_is_missing = true; if (user_options->keyspace == true) // special case if --keyspace was used: we need the mask but no hash file { if (user_options->hc_argc > 0) mask_is_missing = false; } else if (user_options->stdout_flag == true) // special case if --stdout was used: we need the mask but no hash file { if (user_options->hc_argc > 0) mask_is_missing = false; } else { if (user_options->hc_argc > 1) mask_is_missing = false; } if (mask_is_missing == true) { event_log_error (hashcat_ctx, "If you specify a custom charset, you must also specify a mask."); return -1; } } // argc / argv checks bool show_error = true; if (user_options->version == true) { show_error = false; } else if (user_options->usage == true) { show_error = false; } else if (user_options->benchmark == true) { if (user_options->hc_argc == 0) { show_error = false; } } else if (user_options->example_hashes == true) { if (user_options->hc_argc == 0) { show_error = false; } } else if (user_options->opencl_info == true) { if (user_options->hc_argc == 0) { show_error = false; } } else if (user_options->restore == true) { if (user_options->hc_argc == 0) { show_error = false; } } else if (user_options->keyspace == true) { if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { if (user_options->hc_argc == 1) { show_error = false; } } else if (user_options->attack_mode == ATTACK_MODE_COMBI) { if (user_options->hc_argc == 2) { show_error = false; } } else if (user_options->attack_mode == ATTACK_MODE_BF) { if (user_options->hc_argc == 1) { show_error = false; } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { if (user_options->hc_argc == 2) { show_error = false; } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { if (user_options->hc_argc == 2) { show_error = false; } } } else if (user_options->stdout_flag == true) { if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { // all argc possible because of stdin mode show_error = false; } else if (user_options->attack_mode == ATTACK_MODE_COMBI) { if (user_options->hc_argc == 2) { show_error = false; } } else if (user_options->attack_mode == ATTACK_MODE_BF) { if (user_options->hc_argc >= 1) { show_error = false; } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { if (user_options->hc_argc >= 1) { show_error = false; } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { if (user_options->hc_argc >= 1) { show_error = false; } } } else { if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { if (user_options->hc_argc >= 1) { show_error = false; } } else if (user_options->attack_mode == ATTACK_MODE_COMBI) { if (user_options->hc_argc == 3) { show_error = false; } } else if (user_options->attack_mode == ATTACK_MODE_BF) { if (user_options->hc_argc >= 1) { show_error = false; } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { if (user_options->hc_argc >= 2) { show_error = false; } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { if (user_options->hc_argc >= 2) { show_error = false; } } } if (show_error == true) { usage_mini_print (user_options->hc_bin); return -1; } return 0; } void user_options_session_auto (hashcat_ctx_t *hashcat_ctx) { user_options_t *user_options = hashcat_ctx->user_options; if (strcmp (user_options->session, PROGNAME) == 0) { if (user_options->benchmark == true) { user_options->session = "benchmark"; } if (user_options->example_hashes == true) { user_options->session = "example_hashes"; } if (user_options->speed_only == true) { user_options->session = "speed_only"; } if (user_options->progress_only == true) { user_options->session = "progress_only"; } if (user_options->keyspace == true) { user_options->session = "keyspace"; } if (user_options->stdout_flag == true) { user_options->session = "stdout"; } if (user_options->opencl_info == true) { user_options->session = "opencl_info"; } if (user_options->show == true) { user_options->session = "show"; } if (user_options->left == true) { user_options->session = "left"; } } } void user_options_preprocess (hashcat_ctx_t *hashcat_ctx) { user_options_t *user_options = hashcat_ctx->user_options; #if !defined (WITH_HWMON) user_options->powertune_enable = false; user_options->gpu_temp_disable = true; user_options->gpu_temp_abort = 0; user_options->gpu_temp_retain = 0; #endif // WITH_HWMON // some options can influence or overwrite other options if (user_options->example_hashes == true || user_options->opencl_info == true || user_options->keyspace == true || user_options->stdout_flag == true || user_options->speed_only == true || user_options->progress_only == true) { user_options->gpu_temp_disable = true; user_options->left = false; user_options->logfile_disable = true; user_options->nvidia_spin_damp = 0; user_options->outfile_check_timer = 0; user_options->potfile_disable = true; user_options->powertune_enable = false; user_options->restore_disable = true; user_options->restore = false; user_options->restore_timer = 0; user_options->show = false; user_options->status = false; user_options->status_timer = 0; } if (user_options->benchmark == true) { user_options->attack_mode = ATTACK_MODE_BF; user_options->gpu_temp_disable = false; user_options->gpu_temp_retain = 0; user_options->increment = false; user_options->left = false; user_options->logfile_disable = true; user_options->nvidia_spin_damp = 0; user_options->potfile_disable = true; user_options->powertune_enable = true; user_options->progress_only = false; user_options->restore_disable = true; user_options->restore = false; user_options->restore_timer = 0; user_options->show = false; user_options->speed_only = true; user_options->status = false; user_options->status_timer = 0; if (user_options->workload_profile_chgd == false) { user_options->optimized_kernel_enable = true; user_options->workload_profile = 3; } } if (user_options->example_hashes == true) { user_options->quiet = true; } if (user_options->progress_only == true) { user_options->speed_only = true; } if (user_options->keyspace == true) { user_options->quiet = true; } if (user_options->stdout_flag == true) { user_options->force = true; user_options->hash_mode = 2000; user_options->kernel_accel = 1024; user_options->opencl_vector_width = 1; user_options->outfile_format = OUTFILE_FMT_PLAIN; user_options->quiet = true; if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { user_options->kernel_loops = KERNEL_RULES; } else if (user_options->attack_mode == ATTACK_MODE_COMBI) { user_options->kernel_loops = KERNEL_COMBS; } else if (user_options->attack_mode == ATTACK_MODE_BF) { user_options->kernel_loops = KERNEL_BFS; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { user_options->kernel_loops = KERNEL_COMBS; } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { user_options->kernel_loops = KERNEL_COMBS; } } if (user_options->opencl_info == true) { user_options->opencl_devices = NULL; user_options->opencl_device_types = hcstrdup ("1,2,3"); user_options->opencl_platforms = NULL; user_options->quiet = true; } if (user_options->left == true) { user_options->outfile_format = OUTFILE_FMT_HASH; } if (user_options->show == true || user_options->left == true) { user_options->attack_mode = ATTACK_MODE_NONE; user_options->quiet = true; } // this allows the user to use --show and --left while cracking (i.e. while another instance of hashcat is running) if (user_options->show == true || user_options->left == true) { user_options->restore_disable = true; user_options->restore = false; } if (user_options->skip != 0 && user_options->limit != 0) { user_options->limit += user_options->skip; } if (user_options->hash_mode == 9710) { user_options->outfile_format = 5; user_options->outfile_format_chgd = 1; } if (user_options->hash_mode == 9810) { user_options->outfile_format = 5; user_options->outfile_format_chgd = 1; } if (user_options->hash_mode == 10410) { user_options->outfile_format = 5; user_options->outfile_format_chgd = 1; } if (user_options->markov_threshold == 0) { user_options->markov_threshold = 0x100; } if (user_options->segment_size_chgd == true) { user_options->segment_size *= (1024 * 1024); } if (user_options->gpu_temp_disable == true) { user_options->gpu_temp_abort = 0; user_options->gpu_temp_retain = 0; } // default mask if (user_options->attack_mode == ATTACK_MODE_BF) { if (user_options->example_hashes == true) { } else if (user_options->opencl_info == true) { } else if (user_options->speed_only == true) { } else if (user_options->keyspace == true) { if (user_options->hc_argc == 0) { user_options->custom_charset_1 = DEF_MASK_CS_1; user_options->custom_charset_2 = DEF_MASK_CS_2; user_options->custom_charset_3 = DEF_MASK_CS_3; user_options->increment = true; } } else if (user_options->stdout_flag == true) { if (user_options->hc_argc == 0) { user_options->custom_charset_1 = DEF_MASK_CS_1; user_options->custom_charset_2 = DEF_MASK_CS_2; user_options->custom_charset_3 = DEF_MASK_CS_3; user_options->increment = true; } } else { if (user_options->hc_argc == 1) { user_options->custom_charset_1 = DEF_MASK_CS_1; user_options->custom_charset_2 = DEF_MASK_CS_2; user_options->custom_charset_3 = DEF_MASK_CS_3; user_options->increment = true; } } } } void user_options_postprocess (hashcat_ctx_t *hashcat_ctx) { user_options_t *user_options = hashcat_ctx->user_options; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; // automatic status if (user_options_extra->wordlist_mode == WL_MODE_STDIN) { user_options->status = true; } } void user_options_info (hashcat_ctx_t *hashcat_ctx) { const user_options_t *user_options = hashcat_ctx->user_options; if (user_options->quiet == true) return; if (user_options->benchmark == false) return; if (user_options->machine_readable == false) { event_log_info (hashcat_ctx, "Benchmark relevant options:"); event_log_info (hashcat_ctx, "==========================="); if (user_options->force == true) { event_log_info (hashcat_ctx, "* --force"); } if (user_options->opencl_devices) { event_log_info (hashcat_ctx, "* --opencl-devices=%s", user_options->opencl_devices); } if (user_options->opencl_device_types) { event_log_info (hashcat_ctx, "* --opencl-device-types=%s", user_options->opencl_device_types); } if (user_options->opencl_platforms) { event_log_info (hashcat_ctx, "* --opencl-platforms=%s", user_options->opencl_platforms); } if (user_options->optimized_kernel_enable == true) { event_log_info (hashcat_ctx, "* --optimized-kernel-enable"); } if (user_options->opencl_vector_width_chgd == true) { event_log_info (hashcat_ctx, "* --opencl-vector-width=%u", user_options->opencl_vector_width); } if ((user_options->kernel_accel_chgd == true) || (user_options->kernel_loops_chgd == true)) { event_log_info (hashcat_ctx, "* --kernel-accel=%u", user_options->kernel_accel); event_log_info (hashcat_ctx, "* --kernel-loops=%u", user_options->kernel_loops); } else { if (user_options->workload_profile_chgd == true) { event_log_info (hashcat_ctx, "* --workload-profile=%u", user_options->workload_profile); } } event_log_info (hashcat_ctx, NULL); } else { if (user_options->force == true) { event_log_info (hashcat_ctx, "# option: --force"); } if (user_options->opencl_devices) { event_log_info (hashcat_ctx, "# option: --opencl-devices=%s", user_options->opencl_devices); } if (user_options->opencl_device_types) { event_log_info (hashcat_ctx, "# option: --opencl-device-types=%s", user_options->opencl_device_types); } if (user_options->opencl_platforms) { event_log_info (hashcat_ctx, "* option: --opencl-platforms=%s", user_options->opencl_platforms); } if (user_options->optimized_kernel_enable == true) { event_log_info (hashcat_ctx, "# option: --optimized-kernel-enable"); } if (user_options->opencl_vector_width_chgd == true) { event_log_info (hashcat_ctx, "# option: --opencl-vector-width=%u", user_options->opencl_vector_width); } if ((user_options->kernel_accel_chgd == true) || (user_options->kernel_loops_chgd == true)) { event_log_info (hashcat_ctx, "# option: --kernel-accel=%u", user_options->kernel_accel); event_log_info (hashcat_ctx, "# option: --kernel-loops=%u", user_options->kernel_loops); } else { if (user_options->workload_profile_chgd == true) { event_log_info (hashcat_ctx, "# option: --workload-profile=%u", user_options->workload_profile); } } } } void user_options_extra_init (hashcat_ctx_t *hashcat_ctx) { user_options_t *user_options = hashcat_ctx->user_options; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; // attack-kern user_options_extra->attack_kern = ATTACK_KERN_NONE; switch (user_options->attack_mode) { case ATTACK_MODE_STRAIGHT: user_options_extra->attack_kern = ATTACK_KERN_STRAIGHT; break; case ATTACK_MODE_COMBI: user_options_extra->attack_kern = ATTACK_KERN_COMBI; break; case ATTACK_MODE_BF: user_options_extra->attack_kern = ATTACK_KERN_BF; break; case ATTACK_MODE_HYBRID1: user_options_extra->attack_kern = ATTACK_KERN_COMBI; break; case ATTACK_MODE_HYBRID2: user_options_extra->attack_kern = ATTACK_KERN_COMBI; break; } // rules user_options_extra->rule_len_l = (int) strlen (user_options->rule_buf_l); user_options_extra->rule_len_r = (int) strlen (user_options->rule_buf_r); // hc_hash and hc_work* user_options_extra->hc_hash = NULL; user_options_extra->hc_workv = NULL; user_options_extra->hc_workc = 0; if (user_options->benchmark == true) { } else if (user_options->example_hashes == true) { } else if (user_options->opencl_info == true) { } else if (user_options->keyspace == true) { user_options_extra->hc_workc = user_options->hc_argc; user_options_extra->hc_workv = user_options->hc_argv; } else if (user_options->stdout_flag == true) { user_options_extra->hc_workc = user_options->hc_argc; user_options_extra->hc_workv = user_options->hc_argv; } else { user_options_extra->hc_hash = user_options->hc_argv[0]; user_options_extra->hc_workc = user_options->hc_argc - 1; user_options_extra->hc_workv = user_options->hc_argv + 1; } // wordlist_mode user_options_extra->wordlist_mode = WL_MODE_NONE; if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) { user_options_extra->wordlist_mode = (user_options_extra->hc_workc >= 1) ? WL_MODE_FILE : WL_MODE_STDIN; } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { user_options_extra->wordlist_mode = WL_MODE_FILE; } else if (user_options_extra->attack_kern == ATTACK_KERN_BF) { user_options_extra->wordlist_mode = WL_MODE_MASK; } } void user_options_extra_destroy (hashcat_ctx_t *hashcat_ctx) { user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; memset (user_options_extra, 0, sizeof (user_options_extra_t)); } u64 user_options_extra_amplifier (hashcat_ctx_t *hashcat_ctx) { const combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; const mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; const straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; const user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) { if (straight_ctx->kernel_rules_cnt) { return straight_ctx->kernel_rules_cnt; } } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { if (combinator_ctx->combs_cnt) { return combinator_ctx->combs_cnt; } } else if (user_options_extra->attack_kern == ATTACK_KERN_BF) { if (mask_ctx->bfs_cnt) { return mask_ctx->bfs_cnt; } } return 1; } int user_options_check_files (hashcat_ctx_t *hashcat_ctx) { dictstat_ctx_t *dictstat_ctx = hashcat_ctx->dictstat_ctx; folder_config_t *folder_config = hashcat_ctx->folder_config; logfile_ctx_t *logfile_ctx = hashcat_ctx->logfile_ctx; outcheck_ctx_t *outcheck_ctx = hashcat_ctx->outcheck_ctx; outfile_ctx_t *outfile_ctx = hashcat_ctx->outfile_ctx; pidfile_ctx_t *pidfile_ctx = hashcat_ctx->pidfile_ctx; potfile_ctx_t *potfile_ctx = hashcat_ctx->potfile_ctx; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; user_options_t *user_options = hashcat_ctx->user_options; // common folders if (hc_path_read (folder_config->cwd) == false) { event_log_error (hashcat_ctx, "%s: %s", folder_config->cwd, strerror (errno)); return -1; } if (hc_path_read (folder_config->install_dir) == false) { event_log_error (hashcat_ctx, "%s: %s", folder_config->install_dir, strerror (errno)); return -1; } if (hc_path_read (folder_config->profile_dir) == false) { event_log_error (hashcat_ctx, "%s: %s", folder_config->profile_dir, strerror (errno)); return -1; } if (hc_path_write (folder_config->session_dir) == false) { event_log_error (hashcat_ctx, "%s: %s", folder_config->session_dir, strerror (errno)); return -1; } if (hc_path_read (folder_config->shared_dir) == false) { event_log_error (hashcat_ctx, "%s: %s", folder_config->shared_dir, strerror (errno)); return -1; } if (hc_path_read (folder_config->cpath_real) == false) { event_log_error (hashcat_ctx, "%s: %s", folder_config->cpath_real, strerror (errno)); return -1; } // hashfile - can be NULL if (user_options_extra->hc_hash != NULL) { if (hc_path_exist (user_options_extra->hc_hash) == true) { if (hc_path_is_directory (user_options_extra->hc_hash) == true) { event_log_error (hashcat_ctx, "%s: A directory cannot be used as a hashfile argument.", user_options_extra->hc_hash); return -1; } if (hc_path_read (user_options_extra->hc_hash) == false) { event_log_error (hashcat_ctx, "%s: %s", user_options_extra->hc_hash, strerror (errno)); return -1; } } } // arguments - checks must depend on attack_mode if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { for (int i = 0; i < user_options_extra->hc_workc; i++) { char *wlfile = user_options_extra->hc_workv[i]; if (hc_path_exist (wlfile) == false) { event_log_error (hashcat_ctx, "%s: %s", wlfile, strerror (errno)); return -1; } } for (int i = 0; i < (int) user_options->rp_files_cnt; i++) { char *rp_file = user_options->rp_files[i]; if (hc_path_exist (rp_file) == false) { event_log_error (hashcat_ctx, "%s: %s", rp_file, strerror (errno)); return -1; } if (hc_path_is_directory (rp_file) == true) { event_log_error (hashcat_ctx, "%s: A directory cannot be used as a rulefile argument.", rp_file); return -1; } if (hc_path_read (rp_file) == false) { event_log_error (hashcat_ctx, "%s: %s", rp_file, strerror (errno)); return -1; } } } else if (user_options->attack_mode == ATTACK_MODE_COMBI) { // mode easy mode here because both files must exist and readable if (user_options_extra->hc_workc == 2) { char *dictfile1 = user_options_extra->hc_workv[0]; char *dictfile2 = user_options_extra->hc_workv[1]; if (hc_path_exist (dictfile1) == false) { event_log_error (hashcat_ctx, "%s: %s", dictfile1, strerror (errno)); return -1; } if (hc_path_is_directory (dictfile1) == true) { event_log_error (hashcat_ctx, "%s: A directory cannot be used as a wordlist argument.", dictfile1); return -1; } if (hc_path_read (dictfile1) == false) { event_log_error (hashcat_ctx, "%s: %s", dictfile1, strerror (errno)); return -1; } if (hc_path_exist (dictfile2) == false) { event_log_error (hashcat_ctx, "%s: %s", dictfile2, strerror (errno)); return -1; } if (hc_path_is_directory (dictfile2) == true) { event_log_error (hashcat_ctx, "%s: A directory cannot be used as a wordlist argument.", dictfile2); return -1; } if (hc_path_read (dictfile2) == false) { event_log_error (hashcat_ctx, "%s: %s", dictfile2, strerror (errno)); return -1; } } } else if (user_options->attack_mode == ATTACK_MODE_BF) { // if the file exist it's a maskfile and then it must be readable if (user_options_extra->hc_workc == 1) { char *maskfile = user_options_extra->hc_workv[0]; if (hc_path_exist (maskfile) == true) { if (hc_path_is_directory (maskfile) == true) { event_log_error (hashcat_ctx, "%s: A directory cannot be used as a maskfile argument.", maskfile); return -1; } if (hc_path_read (maskfile) == false) { event_log_error (hashcat_ctx, "%s: %s", maskfile, strerror (errno)); return -1; } } } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { if (user_options_extra->hc_workc == 2) { char *wlfile = user_options_extra->hc_workv[0]; char *maskfile = user_options_extra->hc_workv[1]; // for wordlist: can be folder if (hc_path_exist (wlfile) == false) { event_log_error (hashcat_ctx, "%s: %s", wlfile, strerror (errno)); return -1; } // for mask: if the file exist it's a maskfile and then it must be readable if (hc_path_exist (maskfile) == true) { if (hc_path_is_directory (maskfile) == true) { event_log_error (hashcat_ctx, "%s: A directory cannot be used as a maskfile argument.", maskfile); return -1; } if (hc_path_read (maskfile) == false) { event_log_error (hashcat_ctx, "%s: %s", maskfile, strerror (errno)); return -1; } } } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { if (user_options_extra->hc_workc == 2) { char *wlfile = user_options_extra->hc_workv[1]; char *maskfile = user_options_extra->hc_workv[0]; // for wordlist: can be folder if (hc_path_exist (wlfile) == false) { event_log_error (hashcat_ctx, "%s: %s", wlfile, strerror (errno)); return -1; } // for mask: if the file exist it's a maskfile and then it must be readable if (hc_path_exist (maskfile) == true) { if (hc_path_is_directory (maskfile) == true) { event_log_error (hashcat_ctx, "%s: A directory cannot be used as a maskfile argument.", maskfile); return -1; } if (hc_path_read (maskfile) == false) { event_log_error (hashcat_ctx, "%s: %s", maskfile, strerror (errno)); return -1; } } } } // logfile if (logfile_ctx->enabled == true) { if (hc_path_exist (logfile_ctx->logfile) == true) { if (hc_path_is_directory (logfile_ctx->logfile) == true) { event_log_error (hashcat_ctx, "%s: A directory cannot be used as a logfile argument.", logfile_ctx->logfile); return -1; } if (hc_path_write (logfile_ctx->logfile) == false) { event_log_error (hashcat_ctx, "%s: %s", logfile_ctx->logfile, strerror (errno)); return -1; } } else { if (hc_path_create (logfile_ctx->logfile) == false) { event_log_error (hashcat_ctx, "%s: %s", logfile_ctx->logfile, strerror (errno)); return -1; } } } // outfile_check if (outcheck_ctx->enabled == true) { if (hc_path_exist (outcheck_ctx->root_directory) == true) { if (hc_path_is_directory (outcheck_ctx->root_directory) == false) { event_log_error (hashcat_ctx, "Directory specified in outfile-check '%s' is not a directory.", outcheck_ctx->root_directory); return -1; } } } // outfile - can be NULL if (outfile_ctx->filename != NULL) { if (hc_path_exist (outfile_ctx->filename) == true) { if (hc_path_is_directory (outfile_ctx->filename) == true) { event_log_error (hashcat_ctx, "%s: A directory cannot be used as an outfile.", outfile_ctx->filename); return -1; } if (hc_path_write (outfile_ctx->filename) == false) { event_log_error (hashcat_ctx, "%s: %s", outfile_ctx->filename, strerror (errno)); return -1; } } else { if (hc_path_create (outfile_ctx->filename) == false) { event_log_error (hashcat_ctx, "%s: %s", outfile_ctx->filename, strerror (errno)); return -1; } } } // check for outfile vs. hashfile if (hc_same_files (outfile_ctx->filename, user_options_extra->hc_hash) == true) { event_log_error (hashcat_ctx, "Outfile and hashfile cannot point to the same file."); return -1; } // check for outfile vs. cached wordlists if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) { for (int i = 0; i < user_options_extra->hc_workc; i++) { char *wlfile = user_options_extra->hc_workv[i]; if (hc_same_files (outfile_ctx->filename, wlfile) == true) { event_log_error (hashcat_ctx, "Outfile and wordlist cannot point to the same file."); return -1; } } } else if (user_options->attack_mode == ATTACK_MODE_COMBI) { if (user_options_extra->hc_workc == 2) { char *dictfile1 = user_options_extra->hc_workv[0]; char *dictfile2 = user_options_extra->hc_workv[1]; if (hc_same_files (outfile_ctx->filename, dictfile1) == true) { event_log_error (hashcat_ctx, "Outfile and wordlist cannot point to the same file."); return -1; } if (hc_same_files (outfile_ctx->filename, dictfile2) == true) { event_log_error (hashcat_ctx, "Outfile and wordlist cannot point to the same file."); return -1; } } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) { if (user_options_extra->hc_workc == 2) { char *wlfile = user_options_extra->hc_workv[0]; if (hc_same_files (outfile_ctx->filename, wlfile) == true) { event_log_error (hashcat_ctx, "Outfile and wordlist cannot point to the same file."); return -1; } } } else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) { if (user_options_extra->hc_workc == 2) { char *wlfile = user_options_extra->hc_workv[1]; if (hc_same_files (outfile_ctx->filename, wlfile) == true) { event_log_error (hashcat_ctx, "Outfile and wordlist cannot point to the same file."); return -1; } } } // pidfile if (hc_path_exist (pidfile_ctx->filename) == true) { if (hc_path_is_directory (pidfile_ctx->filename) == true) { event_log_error (hashcat_ctx, "%s: A directory cannot be used as a pidfile argument.", pidfile_ctx->filename); return -1; } if (hc_path_write (pidfile_ctx->filename) == false) { event_log_error (hashcat_ctx, "%s: %s", pidfile_ctx->filename, strerror (errno)); return -1; } } else { if (hc_path_create (pidfile_ctx->filename) == false) { event_log_error (hashcat_ctx, "%s: %s", pidfile_ctx->filename, strerror (errno)); return -1; } } // potfile if (potfile_ctx->enabled == true) { if (hc_path_exist (potfile_ctx->filename) == true) { if (hc_path_is_directory (potfile_ctx->filename) == true) { event_log_error (hashcat_ctx, "%s: A directory cannot be used as a potfile argument.", potfile_ctx->filename); return -1; } if (hc_path_write (potfile_ctx->filename) == false) { event_log_error (hashcat_ctx, "%s: %s", potfile_ctx->filename, strerror (errno)); return -1; } } else { if (hc_path_create (potfile_ctx->filename) == false) { event_log_error (hashcat_ctx, "%s: %s", potfile_ctx->filename, strerror (errno)); return -1; } } } // dictstat if (dictstat_ctx->enabled == true) { if (hc_path_exist (dictstat_ctx->filename) == true) { if (hc_path_is_directory (dictstat_ctx->filename) == true) { event_log_error (hashcat_ctx, "%s: A directory cannot be used as a dictstat argument.", dictstat_ctx->filename); return -1; } if (hc_path_write (dictstat_ctx->filename) == false) { event_log_error (hashcat_ctx, "%s: %s", dictstat_ctx->filename, strerror (errno)); return -1; } } else { if (hc_path_create (dictstat_ctx->filename) == false) { event_log_error (hashcat_ctx, "%s: %s", dictstat_ctx->filename, strerror (errno)); return -1; } } } // loopback - can't check at this point // tuning file check already done // debugfile check already done return 0; } void user_options_logger (hashcat_ctx_t *hashcat_ctx) { user_options_t *user_options = hashcat_ctx->user_options; logfile_ctx_t *logfile_ctx = hashcat_ctx->logfile_ctx; logfile_top_char (user_options->separator); logfile_top_string (user_options->cpu_affinity); logfile_top_string (user_options->custom_charset_1); logfile_top_string (user_options->custom_charset_2); logfile_top_string (user_options->custom_charset_3); logfile_top_string (user_options->custom_charset_4); logfile_top_string (user_options->debug_file); logfile_top_string (user_options->encoding_from); logfile_top_string (user_options->encoding_to); logfile_top_string (user_options->induction_dir); logfile_top_string (user_options->markov_hcstat); logfile_top_string (user_options->opencl_devices); logfile_top_string (user_options->opencl_device_types); logfile_top_string (user_options->opencl_platforms); logfile_top_string (user_options->outfile); logfile_top_string (user_options->outfile_check_dir); logfile_top_string (user_options->potfile_path); logfile_top_string (user_options->restore_file_path); logfile_top_string (user_options->rp_files[0]); logfile_top_string (user_options->rule_buf_l); logfile_top_string (user_options->rule_buf_r); logfile_top_string (user_options->session); logfile_top_string (user_options->truecrypt_keyfiles); logfile_top_string (user_options->veracrypt_keyfiles); logfile_top_uint64 (user_options->limit); logfile_top_uint64 (user_options->skip); logfile_top_uint (user_options->attack_mode); logfile_top_uint (user_options->benchmark); logfile_top_uint (user_options->bitmap_max); logfile_top_uint (user_options->bitmap_min); logfile_top_uint (user_options->debug_mode); logfile_top_uint (user_options->example_hashes); logfile_top_uint (user_options->force); logfile_top_uint (user_options->gpu_temp_abort); logfile_top_uint (user_options->gpu_temp_disable); logfile_top_uint (user_options->gpu_temp_retain); logfile_top_uint (user_options->hash_mode); logfile_top_uint (user_options->hex_charset); logfile_top_uint (user_options->hex_salt); logfile_top_uint (user_options->hex_wordlist); logfile_top_uint (user_options->increment); logfile_top_uint (user_options->increment_max); logfile_top_uint (user_options->increment_min); logfile_top_uint (user_options->keep_guessing); logfile_top_uint (user_options->kernel_accel); logfile_top_uint (user_options->kernel_loops); logfile_top_uint (user_options->keyspace); logfile_top_uint (user_options->left); logfile_top_uint (user_options->logfile_disable); logfile_top_uint (user_options->loopback); logfile_top_uint (user_options->machine_readable); logfile_top_uint (user_options->markov_classic); logfile_top_uint (user_options->markov_disable); logfile_top_uint (user_options->markov_threshold); logfile_top_uint (user_options->nvidia_spin_damp); logfile_top_uint (user_options->opencl_info); logfile_top_uint (user_options->opencl_vector_width); logfile_top_uint (user_options->optimized_kernel_enable); logfile_top_uint (user_options->outfile_autohex); logfile_top_uint (user_options->outfile_check_timer); logfile_top_uint (user_options->outfile_format); logfile_top_uint (user_options->wordlist_autohex_disable); logfile_top_uint (user_options->potfile_disable); logfile_top_uint (user_options->powertune_enable); logfile_top_uint (user_options->progress_only); logfile_top_uint (user_options->quiet); logfile_top_uint (user_options->remove); logfile_top_uint (user_options->remove_timer); logfile_top_uint (user_options->restore); logfile_top_uint (user_options->restore_disable); logfile_top_uint (user_options->restore_timer); logfile_top_uint (user_options->rp_files_cnt); logfile_top_uint (user_options->rp_gen); logfile_top_uint (user_options->rp_gen_func_max); logfile_top_uint (user_options->rp_gen_func_min); logfile_top_uint (user_options->rp_gen_seed); logfile_top_uint (user_options->runtime); logfile_top_uint (user_options->scrypt_tmto); logfile_top_uint (user_options->segment_size); logfile_top_uint (user_options->self_test_disable); logfile_top_uint (user_options->show); logfile_top_uint (user_options->speed_only); logfile_top_uint (user_options->status); logfile_top_uint (user_options->status_timer); logfile_top_uint (user_options->stdout_flag); logfile_top_uint (user_options->usage); logfile_top_uint (user_options->username); logfile_top_uint (user_options->veracrypt_pim); logfile_top_uint (user_options->version); logfile_top_uint (user_options->workload_profile); } hashcat-4.0.1/src/wordlist.c000066400000000000000000000312531320027462700157400ustar00rootroot00000000000000/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "event.h" #include "convert.h" #include "dictstat.h" #include "thread.h" #include "rp.h" #include "rp_cpu.h" #include "shared.h" #include "wordlist.h" u32 convert_from_hex (hashcat_ctx_t *hashcat_ctx, char *line_buf, const u32 line_len) { const user_options_t *user_options = hashcat_ctx->user_options; if (line_len & 1) return (line_len); // not in hex if (user_options->hex_wordlist == true) { size_t i, j; for (i = 0, j = 0; j < line_len; i += 1, j += 2) { line_buf[i] = hex_to_u8 ((const u8 *) &line_buf[j]); } memset (line_buf + i, 0, line_len - i); return (i); } if (user_options->wordlist_autohex_disable == false) { if (is_hexify ((const u8 *) line_buf, (const int) line_len) == true) { const int new_len = exec_unhexify ((const u8 *) line_buf, (const int) line_len, (u8 *) line_buf, (const int) line_len); return (u32) new_len; } } return (line_len); } int load_segment (hashcat_ctx_t *hashcat_ctx, FILE *fd) { wl_data_t *wl_data = hashcat_ctx->wl_data; // NOTE: use (never changing) ->incr here instead of ->avail otherwise the buffer gets bigger and bigger wl_data->pos = 0; wl_data->cnt = hc_fread (wl_data->buf, 1, wl_data->incr - 1000, fd); wl_data->buf[wl_data->cnt] = 0; if (wl_data->cnt == 0) return 0; if (wl_data->buf[wl_data->cnt - 1] == '\n') return 0; while (!feof (fd)) { if (wl_data->cnt == wl_data->avail) { wl_data->buf = (char *) hcrealloc (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 0; } void get_next_word_lm (char *buf, u64 sz, u64 *len, u64 *off) { char *ptr = buf; for (u64 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; } void get_next_word_uc (char *buf, u64 sz, u64 *len, u64 *off) { char *ptr = buf; for (u64 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; } void get_next_word_std (char *buf, u64 sz, u64 *len, u64 *off) { char *ptr = buf; for (u64 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; } void get_next_word (hashcat_ctx_t *hashcat_ctx, FILE *fd, char **out_buf, u32 *out_len) { user_options_t *user_options = hashcat_ctx->user_options; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; wl_data_t *wl_data = hashcat_ctx->wl_data; while (wl_data->pos < wl_data->cnt) { u64 off; u64 len; char *ptr = wl_data->buf + wl_data->pos; wl_data->func (ptr, wl_data->cnt - wl_data->pos, &len, &off); wl_data->pos += off; // do the on-the-fly encoding if (wl_data->iconv_enabled == true) { char *iconv_ptr = wl_data->iconv_tmp; size_t iconv_sz = HCBUFSIZ_TINY; size_t ptr_len = len; const size_t iconv_rc = iconv (wl_data->iconv_ctx, &ptr, &ptr_len, &iconv_ptr, &iconv_sz); if (iconv_rc == (size_t) -1) continue; ptr = wl_data->iconv_tmp; len = HCBUFSIZ_TINY - iconv_sz; } if (run_rule_engine (user_options_extra->rule_len_l, user_options->rule_buf_l)) { if (len >= RP_PASSWORD_SIZE) continue; char rule_buf_out[RP_PASSWORD_SIZE]; memset (rule_buf_out, 0, sizeof (rule_buf_out)); const int rule_len_out = _old_apply_rule (user_options->rule_buf_l, user_options_extra->rule_len_l, ptr, len, rule_buf_out); if (rule_len_out < 0) continue; } if (len >= PW_MAX) continue; *out_buf = ptr; *out_len = len; return; } if (feof (fd)) { fprintf (stderr, "BUG feof()!!\n"); return; } load_segment (hashcat_ctx, fd); get_next_word (hashcat_ctx, fd, out_buf, out_len); } void pw_add (hc_device_param_t *device_param, const u8 *pw_buf, const int pw_len) { if (device_param->pws_cnt < device_param->kernel_power) { pw_t *pw = device_param->pws_buf + device_param->pws_cnt; u8 *ptr = (u8 *) pw->i; memcpy (ptr, pw_buf, pw_len); //memset zero to entire buffer done in outer loop //memset (ptr + pw_len, 0, sizeof (pw->i) - pw_len); pw->pw_len = pw_len; device_param->pws_cnt++; } else { fprintf (stderr, "BUG pw_add()!!\n"); return; } } int count_words (hashcat_ctx_t *hashcat_ctx, FILE *fd, const char *dictfile, u64 *result) { combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; straight_ctx_t *straight_ctx = hashcat_ctx->straight_ctx; mask_ctx_t *mask_ctx = hashcat_ctx->mask_ctx; user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; user_options_t *user_options = hashcat_ctx->user_options; wl_data_t *wl_data = hashcat_ctx->wl_data; //hc_signal (NULL); dictstat_t d; d.cnt = 0; if (hc_fstat (fileno (fd), &d.stat)) { *result = 0; return 0; } 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; #if defined (STAT_NANOSECONDS_ACCESS_TIME) d.stat.STAT_NANOSECONDS_ACCESS_TIME = 0; #endif #if defined (_POSIX) d.stat.st_blksize = 0; d.stat.st_blocks = 0; #endif memset (d.encoding_from, 0, sizeof (d.encoding_from)); memset (d.encoding_to, 0, sizeof (d.encoding_to)); strncpy (d.encoding_from, user_options->encoding_from, sizeof (d.encoding_from)); strncpy (d.encoding_to, user_options->encoding_to, sizeof (d.encoding_to)); if (d.stat.st_size == 0) { *result = 0; return 0; } const u64 cached_cnt = dictstat_find (hashcat_ctx, &d); if (run_rule_engine (user_options_extra->rule_len_l, user_options->rule_buf_l) == 0) { if (cached_cnt) { u64 keyspace = cached_cnt; if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) { if (overflow_check_u64_mul (keyspace, straight_ctx->kernel_rules_cnt) == false) return -1; keyspace *= straight_ctx->kernel_rules_cnt; } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { if (((hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) == 0) && (user_options->attack_mode == ATTACK_MODE_HYBRID2)) { if (overflow_check_u64_mul (keyspace, mask_ctx->bfs_cnt) == false) return -1; keyspace *= mask_ctx->bfs_cnt; } else { if (overflow_check_u64_mul (keyspace, combinator_ctx->combs_cnt) == false) return -1; keyspace *= combinator_ctx->combs_cnt; } } cache_hit_t cache_hit; cache_hit.dictfile = (char *) dictfile; cache_hit.stat.st_size = d.stat.st_size; cache_hit.cached_cnt = cached_cnt; cache_hit.keyspace = keyspace; EVENT_DATA (EVENT_WORDLIST_CACHE_HIT, &cache_hit, sizeof (cache_hit)); *result = keyspace; return 0; } } hc_time_t rt_start; hc_time (&rt_start); hc_time_t now = 0; hc_time_t prev = 0; u64 comp = 0; u64 cnt = 0; u64 cnt2 = 0; while (!feof (fd)) { load_segment (hashcat_ctx, fd); comp += wl_data->cnt; u64 i = 0; while (i < wl_data->cnt) { u64 len; u64 off; char *ptr = wl_data->buf + i; wl_data->func (ptr, wl_data->cnt - i, &len, &off); i += off; // do the on-the-fly encoding if (wl_data->iconv_enabled == true) { char *iconv_ptr = wl_data->iconv_tmp; size_t iconv_sz = HCBUFSIZ_TINY; size_t ptr_len = len; const size_t iconv_rc = iconv (wl_data->iconv_ctx, &ptr, &ptr_len, &iconv_ptr, &iconv_sz); if (iconv_rc == (size_t) -1) continue; ptr = wl_data->iconv_tmp; len = HCBUFSIZ_TINY - iconv_sz; } if (run_rule_engine (user_options_extra->rule_len_l, user_options->rule_buf_l)) { if (len >= RP_PASSWORD_SIZE) continue; char rule_buf_out[RP_PASSWORD_SIZE]; memset (rule_buf_out, 0, sizeof (rule_buf_out)); const int rule_len_out = _old_apply_rule (user_options->rule_buf_l, user_options_extra->rule_len_l, ptr, len, rule_buf_out); if (rule_len_out < 0) continue; } cnt2++; if (len >= PW_MAX) continue; d.cnt++; if (user_options_extra->attack_kern == ATTACK_KERN_STRAIGHT) { if (overflow_check_u64_add (cnt, straight_ctx->kernel_rules_cnt) == false) return -1; cnt += straight_ctx->kernel_rules_cnt; } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { if (((hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) == 0) && (user_options->attack_mode == ATTACK_MODE_HYBRID2)) { if (overflow_check_u64_add (cnt, mask_ctx->bfs_cnt) == false) return -1; cnt += mask_ctx->bfs_cnt; } else { if (overflow_check_u64_add (cnt, combinator_ctx->combs_cnt) == false) return -1; cnt += combinator_ctx->combs_cnt; } } } hc_time (&now); if ((now - prev) == 0) continue; hc_time (&prev); double percent = ((double) comp / (double) d.stat.st_size) * 100; if (percent < 100) { cache_generate_t cache_generate; cache_generate.dictfile = (char *) dictfile; cache_generate.comp = comp; cache_generate.percent = percent; cache_generate.cnt = cnt; cache_generate.cnt2 = cnt2; EVENT_DATA (EVENT_WORDLIST_CACHE_GENERATE, &cache_generate, sizeof (cache_generate)); } } hc_time_t rt_stop; hc_time (&rt_stop); cache_generate_t cache_generate; cache_generate.dictfile = (char *) dictfile; cache_generate.comp = comp; cache_generate.percent = 100; cache_generate.cnt = cnt; cache_generate.cnt2 = cnt2; cache_generate.runtime = rt_stop - rt_start; EVENT_DATA (EVENT_WORDLIST_CACHE_GENERATE, &cache_generate, sizeof (cache_generate)); dictstat_append (hashcat_ctx, &d); //hc_signal (sigHandler_default); *result = cnt; return 0; } int wl_data_init (hashcat_ctx_t *hashcat_ctx) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; user_options_t *user_options = hashcat_ctx->user_options; wl_data_t *wl_data = hashcat_ctx->wl_data; wl_data->enabled = false; if (user_options->benchmark == true) return 0; if (user_options->example_hashes == true) return 0; if (user_options->left == true) return 0; if (user_options->opencl_info == true) return 0; if (user_options->usage == true) return 0; if (user_options->version == true) return 0; wl_data->enabled = true; wl_data->buf = (char *) hcmalloc (user_options->segment_size); wl_data->avail = user_options->segment_size; wl_data->incr = user_options->segment_size; wl_data->cnt = 0; wl_data->pos = 0; /** * choose dictionary parser */ wl_data->func = get_next_word_std; if (hashconfig->opts_type & OPTS_TYPE_PT_UPPER) { wl_data->func = get_next_word_uc; } if (hashconfig->hash_mode == 3000) // yes that's fine that way { wl_data->func = get_next_word_lm; } /** * iconv */ if (strcmp (user_options->encoding_from, user_options->encoding_to) != 0) { wl_data->iconv_enabled = true; wl_data->iconv_ctx = iconv_open (user_options->encoding_to, user_options->encoding_from); if (wl_data->iconv_ctx == (iconv_t) -1) return -1; wl_data->iconv_tmp = (char *) hcmalloc (HCBUFSIZ_TINY); } return 0; } void wl_data_destroy (hashcat_ctx_t *hashcat_ctx) { wl_data_t *wl_data = hashcat_ctx->wl_data; if (wl_data->enabled == false) return; hcfree (wl_data->buf); if (wl_data->iconv_enabled == true) { iconv_close (wl_data->iconv_ctx); wl_data->iconv_enabled = false; hcfree (wl_data->iconv_tmp); } memset (wl_data, 0, sizeof (wl_data_t)); } hashcat-4.0.1/tools/000077500000000000000000000000001320027462700142725ustar00rootroot00000000000000hashcat-4.0.1/tools/code_generators/000077500000000000000000000000001320027462700174355ustar00rootroot00000000000000hashcat-4.0.1/tools/code_generators/GEN_AMD_switch_buffer_by_offset_1x64_be_S.pl000066400000000000000000000011441320027462700275500ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0, my $s = 0; $i < 64; $i++, $s++) { printf (" case %2d:\n", $i); for (my $j = 64 - 1; $j >= 0; $j--) { if ((($j - $s - 1) >= 0) && (($j - $s - 0) >= 0)) { printf (" w[%2d] = amd_bytealign_S (w[%2d], w[%2d], offset);\n", $j, $j - $s - 1, $j - $s - 0); } elsif (($j - $s - 0) >= 0) { printf (" w[%2d] = amd_bytealign_S ( 0, w[%2d], offset);\n", $j, $j - $s - 0); } else { printf (" w[%2d] = 0;\n", $j); } } printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/code_generators/GEN_AMD_switch_buffer_by_offset_1x64_le_S.pl000066400000000000000000000015531320027462700275660ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0, my $s = 0; $i < 64; $i++, $s++) { printf (" case %2d:\n", $i); for (my $j = 64 - 1; $j >= 0; $j--) { if ((($j - $s - 1) >= 0) && (($j - $s - 0) >= 0)) { printf (" w[%2d] = amd_bytealign_S (w[%2d], w[%2d], offset_minus_4);\n", $j, $j - $s - 0, $j - $s - 1); } elsif (($j - $s - 0) >= 0) { printf (" w[%2d] = amd_bytealign_S (w[%2d], 0, offset_minus_4);\n", $j, $j - $s - 0); } else { printf (" w[%2d] = 0;\n", $j); } } printf ("\n"); printf (" if (offset_mod_4 == 0)\n"); printf (" {\n"); for (my $j = $i; $j < 64 - 1; $j++) { printf (" w[%2d] = w[%2d];\n", $j, $j + 1); } printf (" w[63] = 0;\n"); printf (" }\n"); printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/code_generators/GEN_AMD_switch_buffer_by_offset_4x4_be_S.pl000066400000000000000000000015121320027462700274640ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0, my $s = 0; $i < 16; $i++, $s++) { printf (" case %2d:\n", $i); for (my $j = 16 - 1; $j >= 0; $j--) { my $jd4 = $j / 4; my $jm4 = $j % 4; my $js1d4 = ($j - $s - 1) / 4; my $js1m4 = ($j - $s - 1) % 4; my $js0d4 = ($j - $s - 0) / 4; my $js0m4 = ($j - $s - 0) % 4; if ((($j - $s - 1) >= 0) && (($j - $s - 0) >= 0)) { printf (" w%d[%d] = amd_bytealign_S (w%d[%d], w%d[%d], offset);\n", $jd4, $jm4, $js1d4, $js1m4, $js0d4, $js0m4); } elsif (($j - $s - 0) >= 0) { printf (" w%d[%d] = amd_bytealign_S ( 0, w%d[%d], offset);\n", $jd4, $jm4, $js0d4, $js0m4); } else { printf (" w%d[%d] = 0;\n", $jd4, $jm4); } } printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/code_generators/GEN_AMD_switch_buffer_by_offset_4x4_carry_be_S.pl000066400000000000000000000022411320027462700306640ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0, my $s = 0; $i < 16; $i++, $s++) { printf (" case %2d:\n", $i); for (my $j = 32 - 1; $j >= 0; $j--) { my $jd4 = $j / 4; my $jm4 = $j % 4; my $js1d4 = ($j - $s - 1) / 4; my $js1m4 = ($j - $s - 1) % 4; my $js0d4 = ($j - $s - 0) / 4; my $js0m4 = ($j - $s - 0) % 4; next if (($j - $s) > 16); my $c1 = "w"; my $c2 = "w"; my $c3 = "w"; if ($jd4 >= 4) { $jd4 -= 4; $c1 = "c"; } if ($js0d4 >= 4) { printf (" %s%d[%d] = amd_bytealign_S (%s%d[%d], 0, offset);\n", $c1, $jd4, $jm4, $c2, $js1d4, $js1m4); } elsif ((($j - $s - 1) >= 0) && (($j - $s - 0) >= 0)) { printf (" %s%d[%d] = amd_bytealign_S (%s%d[%d], %s%d[%d], offset);\n", $c1, $jd4, $jm4, $c2, $js1d4, $js1m4, $c3, $js0d4, $js0m4); } elsif (($j - $s - 0) >= 0) { printf (" %s%d[%d] = amd_bytealign_S ( 0, %s%d[%d], offset);\n", $c1, $jd4, $jm4, $c2, $js0d4, $js0m4); } else { printf (" %s%d[%d] = 0;\n", $c1, $jd4, $jm4); } } printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/code_generators/GEN_AMD_switch_buffer_by_offset_4x4_le_S.pl000066400000000000000000000023211320027462700274750ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0, my $s = 0; $i < 16; $i++, $s++) { printf (" case %2d:\n", $i); for (my $j = 16 - 1; $j >= 0; $j--) { my $jd4 = $j / 4; my $jm4 = $j % 4; my $js1d4 = ($j - $s - 1) / 4; my $js1m4 = ($j - $s - 1) % 4; my $js0d4 = ($j - $s - 0) / 4; my $js0m4 = ($j - $s - 0) % 4; if ((($j - $s - 1) >= 0) && (($j - $s - 0) >= 0)) { printf (" w%d[%d] = amd_bytealign_S (w%d[%d], w%d[%d], offset_minus_4);\n", $jd4, $jm4, $js0d4, $js0m4, $js1d4, $js1m4); } elsif (($j - $s - 0) >= 0) { printf (" w%d[%d] = amd_bytealign_S (w%d[%d], 0, offset_minus_4);\n", $jd4, $jm4, $js0d4, $js0m4); } else { printf (" w%d[%d] = 0;\n", $jd4, $jm4); } } printf ("\n"); printf (" if (offset_mod_4 == 0)\n"); printf (" {\n"); for (my $j = $i; $j < 16 - 1; $j++) { my $jd4 = $j / 4; my $jm4 = $j % 4; my $ja1d4 = ($j + 1) / 4; my $ja1m4 = ($j + 1) % 4; printf (" w%d[%d] = w%d[%d];\n", $jd4, $jm4, $ja1d4, $ja1m4); } printf (" w3[3] = 0;\n"); printf (" }\n"); printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/code_generators/GEN_AMD_switch_buffer_by_offset_8x4_be_S.pl000066400000000000000000000015121320027462700274700ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0, my $s = 0; $i < 32; $i++, $s++) { printf (" case %2d:\n", $i); for (my $j = 32 - 1; $j >= 0; $j--) { my $jd4 = $j / 4; my $jm4 = $j % 4; my $js1d4 = ($j - $s - 1) / 4; my $js1m4 = ($j - $s - 1) % 4; my $js0d4 = ($j - $s - 0) / 4; my $js0m4 = ($j - $s - 0) % 4; if ((($j - $s - 1) >= 0) && (($j - $s - 0) >= 0)) { printf (" w%d[%d] = amd_bytealign_S (w%d[%d], w%d[%d], offset);\n", $jd4, $jm4, $js1d4, $js1m4, $js0d4, $js0m4); } elsif (($j - $s - 0) >= 0) { printf (" w%d[%d] = amd_bytealign_S ( 0, w%d[%d], offset);\n", $jd4, $jm4, $js0d4, $js0m4); } else { printf (" w%d[%d] = 0;\n", $jd4, $jm4); } } printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/code_generators/GEN_AMD_switch_buffer_by_offset_8x4_carry_be_S.pl000066400000000000000000000022411320027462700306700ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0, my $s = 0; $i < 32; $i++, $s++) { printf (" case %2d:\n", $i); for (my $j = 64 - 1; $j >= 0; $j--) { my $jd4 = $j / 4; my $jm4 = $j % 4; my $js1d4 = ($j - $s - 1) / 4; my $js1m4 = ($j - $s - 1) % 4; my $js0d4 = ($j - $s - 0) / 4; my $js0m4 = ($j - $s - 0) % 4; next if (($j - $s) > 32); my $c1 = "w"; my $c2 = "w"; my $c3 = "w"; if ($jd4 >= 8) { $jd4 -= 8; $c1 = "c"; } if ($js0d4 >= 8) { printf (" %s%d[%d] = amd_bytealign_S (%s%d[%d], 0, offset);\n", $c1, $jd4, $jm4, $c2, $js1d4, $js1m4); } elsif ((($j - $s - 1) >= 0) && (($j - $s - 0) >= 0)) { printf (" %s%d[%d] = amd_bytealign_S (%s%d[%d], %s%d[%d], offset);\n", $c1, $jd4, $jm4, $c2, $js1d4, $js1m4, $c3, $js0d4, $js0m4); } elsif (($j - $s - 0) >= 0) { printf (" %s%d[%d] = amd_bytealign_S ( 0, %s%d[%d], offset);\n", $c1, $jd4, $jm4, $c2, $js0d4, $js0m4); } else { printf (" %s%d[%d] = 0;\n", $c1, $jd4, $jm4); } } printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/code_generators/GEN_NV_switch_buffer_by_offset_1x64_be_S.pl000066400000000000000000000011451320027462700274730ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0, my $s = 0; $i < 64; $i++, $s++) { printf (" case %2d:\n", $i); for (my $j = 64 - 1; $j >= 0; $j--) { if ((($j - $s - 1) >= 0) && (($j - $s - 0) >= 0)) { printf (" w[%2d] = __byte_perm_S (w[%2d], w[%2d], selector);\n", $j, $j - $s - 0, $j - $s - 1); } elsif (($j - $s - 0) >= 0) { printf (" w[%2d] = __byte_perm_S (w[%2d], 0, selector);\n", $j, $j - $s - 0); } else { printf (" w[%2d] = 0;\n", $j); } } printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/code_generators/GEN_NV_switch_buffer_by_offset_1x64_le_S.pl000066400000000000000000000011451320027462700275050ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0, my $s = 0; $i < 64; $i++, $s++) { printf (" case %2d:\n", $i); for (my $j = 64 - 1; $j >= 0; $j--) { if ((($j - $s - 1) >= 0) && (($j - $s - 0) >= 0)) { printf (" w[%2d] = __byte_perm_S (w[%2d], w[%2d], selector);\n", $j, $j - $s - 1, $j - $s - 0); } elsif (($j - $s - 0) >= 0) { printf (" w[%2d] = __byte_perm_S ( 0, w[%2d], selector);\n", $j, $j - $s - 0); } else { printf (" w[%2d] = 0;\n", $j); } } printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/code_generators/GEN_NV_switch_buffer_by_offset_4x4_be_S.pl000066400000000000000000000015151320027462700274110ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0, my $s = 0; $i < 16; $i++, $s++) { printf (" case %2d:\n", $i); for (my $j = 16 - 1; $j >= 0; $j--) { my $jd4 = $j / 4; my $jm4 = $j % 4; my $js1d4 = ($j - $s - 1) / 4; my $js1m4 = ($j - $s - 1) % 4; my $js0d4 = ($j - $s - 0) / 4; my $js0m4 = ($j - $s - 0) % 4; if ((($j - $s - 1) >= 0) && (($j - $s - 0) >= 0)) { printf (" w%d[%d] = __byte_perm_S (w%d[%d], w%d[%d], selector);\n", $jd4, $jm4, $js0d4, $js0m4, $js1d4, $js1m4); } elsif (($j - $s - 0) >= 0) { printf (" w%d[%d] = __byte_perm_S (w%d[%d], 0, selector);\n", $jd4, $jm4, $js0d4, $js0m4); } else { printf (" w%d[%d] = 0;\n", $jd4, $jm4, ); } } printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/code_generators/GEN_NV_switch_buffer_by_offset_4x4_carry_be_S.pl000066400000000000000000000022411320027462700306060ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0, my $s = 0; $i < 16; $i++, $s++) { printf (" case %2d:\n", $i); for (my $j = 32 - 1; $j >= 0; $j--) { my $jd4 = $j / 4; my $jm4 = $j % 4; my $js1d4 = ($j - $s - 1) / 4; my $js1m4 = ($j - $s - 1) % 4; my $js0d4 = ($j - $s - 0) / 4; my $js0m4 = ($j - $s - 0) % 4; next if (($j - $s) > 16); my $c1 = "w"; my $c2 = "w"; my $c3 = "w"; if ($jd4 >= 4) { $jd4 -= 4; $c1 = "c"; } if ($js0d4 >= 4) { printf (" %s%d[%d] = __byte_perm_S ( 0, %s%d[%d], selector);\n", $c1, $jd4, $jm4, $c2, $js1d4, $js1m4); } elsif ((($j - $s - 1) >= 0) && (($j - $s - 0) >= 0)) { printf (" %s%d[%d] = __byte_perm_S (%s%d[%d], %s%d[%d], selector);\n", $c1, $jd4, $jm4, $c2, $js0d4, $js0m4, $c3, $js1d4, $js1m4); } elsif (($j - $s - 0) >= 0) { printf (" %s%d[%d] = __byte_perm_S (%s%d[%d], 0, selector);\n", $c1, $jd4, $jm4, $c2, $js0d4, $js0m4); } else { printf (" %s%d[%d] = 0;\n", $c1, $jd4, $jm4); } } printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/code_generators/GEN_NV_switch_buffer_by_offset_4x4_le_S.pl000066400000000000000000000015151320027462700274230ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0, my $s = 0; $i < 16; $i++, $s++) { printf (" case %2d:\n", $i); for (my $j = 16 - 1; $j >= 0; $j--) { my $jd4 = $j / 4; my $jm4 = $j % 4; my $js1d4 = ($j - $s - 1) / 4; my $js1m4 = ($j - $s - 1) % 4; my $js0d4 = ($j - $s - 0) / 4; my $js0m4 = ($j - $s - 0) % 4; if ((($j - $s - 1) >= 0) && (($j - $s - 0) >= 0)) { printf (" w%d[%d] = __byte_perm_S (w%d[%d], w%d[%d], selector);\n", $jd4, $jm4, $js1d4, $js1m4, $js0d4, $js0m4); } elsif (($j - $s - 0) >= 0) { printf (" w%d[%d] = __byte_perm_S ( 0, w%d[%d], selector);\n", $jd4, $jm4, $js0d4, $js0m4); } else { printf (" w%d[%d] = 0;\n", $jd4, $jm4, ); } } printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/code_generators/GEN_NV_switch_buffer_by_offset_8x4_be_S.pl000066400000000000000000000015141320027462700274140ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0, my $s = 0; $i < 32; $i++, $s++) { printf (" case %2d:\n", $i); for (my $j = 32 - 1; $j >= 0; $j--) { my $jd4 = $j / 4; my $jm4 = $j % 4; my $js1d4 = ($j - $s - 1) / 4; my $js1m4 = ($j - $s - 1) % 4; my $js0d4 = ($j - $s - 0) / 4; my $js0m4 = ($j - $s - 0) % 4; if ((($j - $s - 1) >= 0) && (($j - $s - 0) >= 0)) { printf (" w%d[%d] = __byte_perm_S (w%d[%d], w%d[%d], selector);\n", $jd4, $jm4, $js0d4, $js0m4, $js1d4, $js1m4); } elsif (($j - $s - 0) >= 0) { printf (" w%d[%d] = __byte_perm_S (w%d[%d], 0, selector);\n", $jd4, $jm4, $js0d4, $js0m4); } else { printf (" w%d[%d] = 0;\n", $jd4, $jm4, ); } } printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/code_generators/GEN_NV_switch_buffer_by_offset_8x4_carry_be_S.pl000066400000000000000000000022411320027462700306120ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0, my $s = 0; $i < 32; $i++, $s++) { printf (" case %2d:\n", $i); for (my $j = 64 - 1; $j >= 0; $j--) { my $jd4 = $j / 4; my $jm4 = $j % 4; my $js1d4 = ($j - $s - 1) / 4; my $js1m4 = ($j - $s - 1) % 4; my $js0d4 = ($j - $s - 0) / 4; my $js0m4 = ($j - $s - 0) % 4; next if (($j - $s) > 32); my $c1 = "w"; my $c2 = "w"; my $c3 = "w"; if ($jd4 >= 8) { $jd4 -= 8; $c1 = "c"; } if ($js0d4 >= 8) { printf (" %s%d[%d] = __byte_perm_S ( 0, %s%d[%d], selector);\n", $c1, $jd4, $jm4, $c2, $js1d4, $js1m4); } elsif ((($j - $s - 1) >= 0) && (($j - $s - 0) >= 0)) { printf (" %s%d[%d] = __byte_perm_S (%s%d[%d], %s%d[%d], selector);\n", $c1, $jd4, $jm4, $c2, $js0d4, $js0m4, $c3, $js1d4, $js1m4); } elsif (($j - $s - 0) >= 0) { printf (" %s%d[%d] = __byte_perm_S (%s%d[%d], 0, selector);\n", $c1, $jd4, $jm4, $c2, $js0d4, $js0m4); } else { printf (" %s%d[%d] = 0;\n", $c1, $jd4, $jm4); } } printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/code_generators/GEN_truncate_block_16x4_be.pl000066400000000000000000000013641320027462700247160ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0; $i < 64; $i++) { printf (" case %2d:\n", $i); my $id4 = int ($i / 4); my $im4 = int ($i % 4); if ($im4 == 0) { printf (" w%d[%d] = 0;\n", $id4 / 4, $id4 % 4); } elsif ($im4 == 1) { printf (" w%d[%d] &= 0xff000000;\n", $id4 / 4, $id4 % 4); } elsif ($im4 == 2) { printf (" w%d[%d] &= 0xffff0000;\n", $id4 / 4, $id4 % 4); } elsif ($im4 == 3) { printf (" w%d[%d] &= 0xffffff00;\n", $id4 / 4, $id4 % 4); } for (my $j = $id4 + 1; $j < 16; $j++) { my $jd4 = int ($j / 4); my $jm4 = int ($j % 4); printf (" w%d[%d] = 0;\n", $jd4, $jm4); } printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/code_generators/GEN_truncate_block_16x4_le.pl000066400000000000000000000013641320027462700247300ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0; $i < 64; $i++) { printf (" case %2d:\n", $i); my $id4 = int ($i / 4); my $im4 = int ($i % 4); if ($im4 == 0) { printf (" w%d[%d] = 0;\n", $id4 / 4, $id4 % 4); } elsif ($im4 == 1) { printf (" w%d[%d] &= 0x000000ff;\n", $id4 / 4, $id4 % 4); } elsif ($im4 == 2) { printf (" w%d[%d] &= 0x0000ffff;\n", $id4 / 4, $id4 % 4); } elsif ($im4 == 3) { printf (" w%d[%d] &= 0x00ffffff;\n", $id4 / 4, $id4 % 4); } for (my $j = $id4 + 1; $j < 16; $j++) { my $jd4 = int ($j / 4); my $jm4 = int ($j % 4); printf (" w%d[%d] = 0;\n", $jd4, $jm4); } printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/code_generators/GEN_truncate_block_4x4_be.pl000066400000000000000000000013631320027462700246320ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0; $i < 16; $i++) { printf (" case %2d:\n", $i); my $id4 = int ($i / 4); my $im4 = int ($i % 4); if ($im4 == 0) { printf (" w%d[%d] = 0;\n", $id4 / 4, $id4 % 4); } elsif ($im4 == 1) { printf (" w%d[%d] &= 0xff000000;\n", $id4 / 4, $id4 % 4); } elsif ($im4 == 2) { printf (" w%d[%d] &= 0xffff0000;\n", $id4 / 4, $id4 % 4); } elsif ($im4 == 3) { printf (" w%d[%d] &= 0xffffff00;\n", $id4 / 4, $id4 % 4); } for (my $j = $id4 + 1; $j < 4; $j++) { my $jd4 = int ($j / 4); my $jm4 = int ($j % 4); printf (" w%d[%d] = 0;\n", $jd4, $jm4); } printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/code_generators/GEN_truncate_block_4x4_le.pl000066400000000000000000000013631320027462700246440ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; for (my $i = 0; $i < 16; $i++) { printf (" case %2d:\n", $i); my $id4 = int ($i / 4); my $im4 = int ($i % 4); if ($im4 == 0) { printf (" w%d[%d] = 0;\n", $id4 / 4, $id4 % 4); } elsif ($im4 == 1) { printf (" w%d[%d] &= 0x000000ff;\n", $id4 / 4, $id4 % 4); } elsif ($im4 == 2) { printf (" w%d[%d] &= 0x0000ffff;\n", $id4 / 4, $id4 % 4); } elsif ($im4 == 3) { printf (" w%d[%d] &= 0x00ffffff;\n", $id4 / 4, $id4 % 4); } for (my $j = $id4 + 1; $j < 4; $j++) { my $jd4 = int ($j / 4); my $jm4 = int ($j % 4); printf (" w%d[%d] = 0;\n", $jd4, $jm4); } printf ("\n"); printf (" break;\n"); printf ("\n"); } hashcat-4.0.1/tools/package_bin.sh000077500000000000000000000035711320027462700170620ustar00rootroot00000000000000#!/bin/bash ## ## Author......: See docs/credits.txt ## License.....: MIT ## export IN=$HOME/hashcat export OUT=$HOME/xy/hashcat-4.0.1 rm -rf $OUT rm -rf $OUT.7z mkdir -p $OUT cp $IN/hashcat??.exe $OUT/ cp $IN/hashcat??.bin $OUT/ cp $IN/hashcat.hctune $OUT/ cp $IN/hashcat.hcstat2 $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/example[0123456789]*.cmd $OUT/ cp -r $IN/OpenCL $OUT/ # since for the binary distribution we still use .bin, we need to rewrite the commands # within the example*.sh files for example in example[0123456789]*.sh; do sed 's!./hashcat !./hashcat64.bin !' $IN/${example} > $OUT/${example} done dos2unix $OUT/masks/*.hcmask dos2unix $OUT/rules/*.rule dos2unix $OUT/rules/hybrid/*.rule dos2unix $OUT/docs/* dos2unix $OUT/example* unix2dos $OUT/masks/*.hcmask unix2dos $OUT/rules/*.rule unix2dos $OUT/rules/hybrid/*.rule unix2dos $OUT/docs/* unix2dos $OUT/example*.cmd unix2dos $OUT/OpenCL/* unix2dos $OUT/hashcat.hctune chmod 755 $OUT chmod 755 $OUT/rules chmod 644 $OUT/rules/* chmod 755 $OUT/docs chmod 644 $OUT/docs/* chmod 755 $OUT/charsets chmod 755 $OUT/charsets/* chmod 755 $OUT/masks chmod 644 $OUT/masks/* chmod 644 $OUT/example* chmod 755 $OUT/example*.sh chmod 755 $OUT/extra chmod 755 $OUT/extra/tab_completion/*.sh chmod 755 $OUT/extra/tab_completion/install chmod 755 $OUT/OpenCL chmod 644 $OUT/OpenCL/* chmod 644 $OUT/*.exe chmod 755 $OUT/*.bin chmod 644 $OUT/hashcat.hctune chmod 644 $OUT/hashcat.hcstat2 time 7z a -t7z -m0=lzma2:d31 -mx=9 -mmt=8 -ms=on $OUT.7z $OUT hashcat-4.0.1/tools/rules-test-cases.yaml000066400000000000000000000173261320027462700203720ustar00rootroot00000000000000--- :: input: | AbCd abcd ABCD expected_cpu: | AbCd abcd ABCD expected_opencl: | AbCd abcd ABCD l: input: | AbCd abcd ABCD expected_cpu: | abcd abcd abcd expected_opencl: | abcd abcd abcd u: input: | AbCd abcd ABCD expected_cpu: | ABCD ABCD ABCD expected_opencl: | ABCD ABCD ABCD c: input: | AbCd abcd ABCD expected_cpu: | Abcd Abcd Abcd expected_opencl: | Abcd Abcd Abcd C: input: | AbCd abcd ABCD expected_cpu: | aBCD aBCD aBCD expected_opencl: | aBCD aBCD aBCD t: input: | AbCd abcd ABCD expected_cpu: | aBcD ABCD abcd expected_opencl: | aBcD ABCD abcd T5: input: | AbCde abcdef ABCDEFg expected_cpu: | AbCde abcdeF ABCDEfg expected_opencl: | AbCde abcdeF ABCDEfg r: input: | AbCd abcd expected_cpu: | dCbA dcba expected_opencl: | dCbA dcba d: input: | 3abc expected_cpu: | 3abc3abc expected_opencl: | 3abc3abc ddd: input: | 3ab expected_cpu: | 3ab3ab3ab3ab3ab3ab3ab3ab expected_opencl: | 3ab3ab3ab3ab3ab3ab3ab3ab p0: input: | 3abc expected_cpu: | 3abc expected_opencl: | 3abc p3: input: | 3abc expected_cpu: | 3abc3abc3abc3abc expected_opencl: | 3abc3abc3abc3abc f: input: | 3abc expected_cpu: | 3abccba3 expected_opencl: | 3abccba3 '{': input: | 3abc a expected_cpu: | abc3 a expected_opencl: | abc3 a '}': input: | 3abc a expected_cpu: | c3ab a expected_opencl: | c3ab a $1$2: input: | abc expected_cpu: | abc12 expected_opencl: | abc12 ^1^2: input: | abc expected_cpu: | 21abc expected_opencl: | 21abc '[': input: | a abc 123456790abcdefghijklmnopqrstuvw expected_cpu: | bc 23456790abcdefghijklmnopqrstuvw expected_opencl: | bc ']': input: | a abc 123456790abcdefghijklmnopqrstuvw expected_cpu: | ab 123456790abcdefghijklmnopqrstuv expected_opencl: | ab D3: input: | abc abcd abcde 123456790abcdefghijklmnopqrstuvw expected_cpu: | abc abc abce 12356790abcdefghijklmnopqrstuvw expected_opencl: | abc abc abce x14: input: | a abc abcde abcdef 123456790abcdefghijklmnopqrstuvw expected_cpu: | a abc bcde bcde 2345 expected_opencl: | a abc bcde bcde O22: input: | a ab abc abcd abcde 123456790abcdefghijklmnopqrstuvw expected_cpu: | a ab abc ab abe 1256790abcdefghijklmnopqrstuvw expected_opencl: | a ab abc ab abe O04: input: | a abc abcd abcde abcdef 123456790abcdefghijklmnopqrstuvw expected_cpu: | a abc e ef 56790abcdefghijklmnopqrstuvw expected_opencl: | a abc e ef i3!: input: | a abc abcd abcde expected_cpu: | a abc! abc!d abc!de expected_cpu: | a abc! abc!d abc!de o3!: input: | a abc abcd abcde expected_cpu: | a abc abc! abc!e expected_cpu: | a abc abc! abc!e '''4': input: | a abc abcd abcde abcdef expected_cpu: | a abc abcd abcd abcd expected_opencl: | a abc abcd abcd abcd sab: input: | 123b a123ba expected_cpu: | 123b b123bb expected_opencl: | 123b b123bb saa: input: | 123b a123ba expected_cpu: | 123b a123ba expected_opencl: | 123b a123ba '@a': input: | 123b aaa a123ba 123456790abcdefghijklmnopqrstuvw expected_cpu: | 123b 123b 123456790bcdefghijklmnopqrstuvw expected_opencl: | 123b 123b z0: input: | abc expected_cpu: | abc expected_opencl: | abc z3: input: | abc expected_cpu: | aaaabc expected_opencl: | aaaabc Z0: input: | abc expected_cpu: | abc expected_opencl: | abc Z3: input: | abc expected_cpu: | abcccc expected_opencl: | abcccc q: input: | a abc expected_cpu: | aa aabbcc expected_opencl: | aa aabbcc qqq: input: | a abc expected_cpu: | aaaaaaaa aaaaaaaabbbbbbbbcccccccc expected_opencl: | aaaaaaaa aaaaaaaabbbbbbbbcccccccc uMlX134: input: | a abc abcd abcdef expected_cpu: | abcdBCD abcdBCDef uMl4: input: | a abc expected_cpu: | aA abcABC uMl6: input: | a abc expected_cpu: | Aa ABCabc <0: input: | a abc expected_cpu: | <1: input: | a abc expected_cpu: | a '>0': input: | a abc expected_cpu: | a abc '>2': input: | a ab abc expected_cpu: | ab abc _2: input: | a ab abc expected_cpu: | ab '!a': input: | 1 ab abc bcde expected_cpu: | 1 bcde /a: input: | 1 ab abc bcde expected_cpu: | ab abc (a: input: | 1 ab bac abc bcde expected_cpu: | ab abc )c: input: | 1 ab bac abc bcde expected_cpu: | bac abc =2c: input: | 1 ab bac abc bcde expected_cpu: | bac abc '%2a': input: | a aa aaa aaaa bcde expected_cpu: | aaa aaaa '/a op4 %3a op4': input: | a aa aaa aaaa aaaaa expected_cpu: | 4aa4 4aa4a Q: input: | a abc expected_cpu: | a abc rMrQ: input: | ab abcba expected_cpu: | ab k: input: | a ab abc expected_cpu: | a ba bac expected_opencl: | a ba bac K: input: | a ab abc expected_cpu: | a ba acb expected_opencl: | a ba acb '*24': input: | a ab abc abcd abcde abcdef expected_cpu: | a ab abc abcd abedc abedcf expected_opencl: | a ab abc abcd abedc abedcf L2: input: | a ab ab! expected_cpu: | a ab abB expected_opencl: | a ab abB R2: input: | a ab abB expected_cpu: | a ab ab! expected_cpu: | a ab ab! +2: input: | a ab abc expected_cpu: | a ab abd expected_opencl: | a ab abd -2: input: | a ab abc expected_cpu: | a ab abb expected_opencl: | a ab abb .2: input: | a ab abc abcd expected_cpu: | a ab abc abdd expected_opencl: | a ab abc abdd ',2': input: | a ab abc abcd expected_cpu: | a ab abb abbd expected_opencl: | a ab abb abbd y2: input: | a ab abc 123456790abcdefghijklmnopqrstuv expected_cpu: | a abab ababc expected_opencl: | a abab ababc 123456790abcdefghijklmnopqrstuv Y2: input: | a ab abc 123456790abcdefghijklmnopqrstuv expected_cpu: | a abab abcbc expected_opencl: | a abab abcbc 123456790abcdefghijklmnopqrstuv E: input: | a bc ab c abc expected_cpu: | A Bc Ab C Abc expected_opencl: | A Bc Ab C Abc e-: input: | a-bc ab-c abc expected_cpu: | A-Bc Ab-C Abc expected_opencl: | A-Bc Ab-C Abc hashcat-4.0.1/tools/tc_tests/000077500000000000000000000000001320027462700161225ustar00rootroot00000000000000hashcat-4.0.1/tools/tc_tests/hashcat_ripemd160_aes-twofish-serpent.tc000066400000000000000000000010001320027462700256320ustar00rootroot00000000000000×mA †Ö†Ò‹wø‡Ää:<¡âRv×B3·oÙTÎ!ؤÖ[HGPŽûß©å‰ItER΢ä_Q„+ψÙÞTw:‚€UÃ+«e5*YÖ»MÞG°JÐI[8çýL 9±Ÿ4PÙïI#:ØÚÝsH”U#ÜR{(³B«}ô¬S³XjïÏ3’Ѫ?‚U=¶6ygú&NÕ·¼j õIˆ ~ë7Šh9^µ±ÞÆ6PŠàë’.äѼ|4~ŠÛýMä3ÿ«‰)1t 9ëGP„M|‹˜Þã -yìܹa澜M0ì¼s.ÊÂ`Üíyü“Œ„ jUÉÃÝ,}¼¯+ ¿¡ƒßž³·•£ÅV¬ŒÛè¡Ë"Ê`<#CtÏ6Õ)G ¤Ì¿)‘¨@ ±ãfë õõg,¬a+b§à=ÕÈ|þçEµOI+sX4Ö𳓌tÜ=Z,]mGH(H)ßeï¨ðP@m¿ dWø'& Â “2¥âÑØšV´„ŠöqÕ^$í+¡ƒ‘~<('sÕÎ6YQÂ4¬ƒŽ«ÀnIüF :9~ÿ~Á´ÕÌ®«†ê­/>?{ 'Šw UNczºUoè@ÎåIŽªktØ]RàbÜàY õímŽœ3C†ævïHß…¦¿9êb°•µ/ühashcat-4.0.1/tools/tc_tests/hashcat_ripemd160_aes-twofish-serpent_boot.tc000066400000000000000000000010001320027462700266550ustar00rootroot00000000000000¹®h¸7º'Ø‹aqΞ béHI²Ó2Sýîíbp8I»æ,ü»†[Ü?[ãýZa@z擈ÿi+  @¶/h} |è7£mÑÊ¿pg®QNf wRƒX ØÔTè¿0Y.û÷Å»Ç!Õìøø:¥b(:PÎü±oiÛ­D¾~`àÿ@ÿ¶üw` æ›T8DÕ%K êÄ6¡·=V3½ÄF"Oj´-†D%“äìF2½ž…&‚ke`\2š›Ä™Ñï²ÑÈ´!Jzܾþñ½|D_&嶺·Â‡å.5šH4¸euÃúpÓÍá¹QZÔ`¸ONoê h.@Ëþà ' Óêü¿°3ô«W¨ÜHÆ5+òƒ¼]|Þyï¼vTç[LÀRÎŽ¢V‘÷Ç*Ô·âeÜ ´0¾f‘í‰ÕmF˜¢?İ¡Gw<þ7£5ÕËeÏ[ N÷éK-wÐ)*!ß­8µð—Ù<°Zi]†sXdEÔ¬ Xdº2«ý¨€$—9ÑèùfFZ™cÞL¹½UzŠÿm$£©d6­‘Çþ£,}ñ6búï/Ôþaêv¼µ'yåëö-Üd Œ×(56üZuÄ|/ñ‡r (á¾áêvŽ÷Ʊ·>ð‚©(¦ÉñQ†RÒ„û™[L·å6ø Œ¸­pí ¿¶¼4ç>phashcat-4.0.1/tools/tc_tests/hashcat_ripemd160_aes-twofish.tc000066400000000000000000000010001320027462700241540ustar00rootroot00000000000000ÖádJÍ7>oیʮ« @ "ê °.*fIàe­Pù/ü^ÑÍó´îr§2jš(Ó6ìe­òÕFaᦠݙA'ŸÖJœQ=û’sOÁáLÝ 9ž‰ † @wF<`ŸR%NÝ™ŠÛ "qr= ”U ó…ÝŽ ´.Ñ4ŸiÀ¦ºÔ³~m«ÿ¾•GdyB/áS:!ñ ¶Ñ^^èÍçŽgzÏ= Ðéûõ ÁÅåõF1àâ­Âî(2B\ÇÙjß~U¬ïû{#¡‡/2y]D‘Ç9âáš}ü²' ÉÙ0!TF&d¦hêcVdße€Kö€ÿmo["Wb£¢p߃-Gçþ¶'z"„T£º›[ºÞ#ì®ÀêóÑÛ¬1uL— !+ÔL’x¼`vð–¢îÖàJpÆ÷ú”ïNu)–’åÜÆñ§æ+›v^žaúîÓùï¬À¡[çMHì¡=~,Móm5 A1Ð/OÁ[Ây]ÇÉ€¶¡š"YdF—‡ßHh¨÷"ò½1Û¼³È¬×B÷0c]ê)ß±ÛƒèŸÈZ0°7ŸÈªi¤ê”ÉRh]8ÉUšF(LÜ2ŸÆtRÍBàžc‰Ôv\Xª„Õgφû¦)êÁͬ/6`=/²¯l]L+í´öÆÐó‡ð¨Ö5ã3„ß`øÒA[hashcat-4.0.1/tools/tc_tests/hashcat_ripemd160_aes-twofish_boot.tc000066400000000000000000000010001320027462700251770ustar00rootroot00000000000000Þ¼ÃçJ{*ËL~ªJÈoÖC¡ÙWŸOvð³³Óne ¬©ä®V‘³Ënd×¶ j*¶³°Á{5m£q/¤Iv9p…]Lƒ°*–{²–Ÿo>OÛÎ7Æß >ûè{ýµÿØþ7nšÖb¨öYï ³ží4Äø ¨Vß"¬j7ë°$DEÛ~A+w?N(„l^eœÔôÎv—œ?§Äâ¾0F›ƒcêøW›ª‡ ܲ½Êk`æEYË ï$%v¸"¿6ëm”d )7´žßœšöròsD„%øh1ÃZã^vKžiüÄzBºzV]h#f2‘±´ËÍ{¦û§\!NXI©º&0Ëÿªsò«2ÂpÓþ‡34ÊWŠÛýÅ£œ½S°—UäØhÛø¤MvÌ‘G¸©…Ç8´CW+GEíæR‡ Û% €Mgžì…µ)5ÉÅ&[–ÿã-ŸY|*¹¸O="þ÷ìg˜~huÞj±3ñ°o#ÃŽ­”ÃÞAa¶V†Âu°£9^@,`Xü_Aðà„èò{d†bC±óA÷Lýìêíz¿‰Ìù{GD“åoQô*\ )öCSº­Í/³G¸ƒ]%C»EªñÆ»0îÙŽ‘'0t·èë­!tµ'±¸Na–{óXqFH-±Çhashcat-4.0.1/tools/tc_tests/hashcat_ripemd160_aes.tc000066400000000000000000000010001320027462700224730ustar00rootroot00000000000000‡‘IgñG7¦´`ò{ŠëÞ+A¿'@³ÝxxNv9QÚ¤||¢5ç\"ì•kg÷îÞúÖj €yÓrŽrägŒ{=¾ÖE:Nm¸šR¾šœ˜©Æ˜ñã€×¯¯û¨+n_]ó+Ò‰¹SCÆw^,^ñØ¿®„*’Tn¶5µúÞ:ïnå*zZ°Ó>©‹Á߯*öº¸ËÚn„@,r,¨Â°~l¦£;ùK,⨩øÏªZ÷:öå5 :0ooÿ[©}W(ÕöA;H,tõ(!ç{l’ÅH}Z<â76±i–¸lq±- òŽó"õ=š% 窨Á“¦Üµ¿ãÅ{TtÒK„?Ôè:t“–Ý´ðÅ 6W§ê̈(VŽQ -äŒÒß嬾=ˆ@­áÎD·ÕÀ+!¹˜S˸¯%’¥«tJè6#4ŸUÏ7øm¨B&T˜Ÿy²8n*¨7XS¡€,ؼ]AÎEy_x¸iüú=Ï‘'ã?¢Üv­s–·¼á]Ô‰à¶ì§¾í73ˆ|Õæó“š]MD‘… /;ºÔnFÔ¸ðƒ‘íÕëÁ|Õ©“y*6¯Ø?¡íÅ]¢UÈçÿaâ—o¢Åü™ià\¾àÜç ï‡ks@»è“|œ‚Hðàêçþ~-¤‰ôóâ},õ2·hashcat-4.0.1/tools/tc_tests/hashcat_ripemd160_aes_boot.tc000066400000000000000000000010001320027462700235160ustar00rootroot00000000000000+]©’Aýå'q+£Ãä—D`An„eò"”™Œ/Ê GSµòf%ÑM?I½ë•¼>b~ÿ¶auåþ«¤ýg”ù]W‚fóõNa¸-Àü+´CŽÃöש(%§b]ˆìb†«NatžÜƒÚÔ4ÑgTO ‘?Ö°7u?ò2üM­ornø*Ô½R'§ym}³Z‘+îÚ[ Ýy‹ÃM:ÂDÈ}Ær©ƒh}ÖO’ ™@¥a¦1—îÙ—`—6d g?dU$,qÇY£SSŽÂKOë–~+Fˆc•Ï>“Nƒ¦¥ŽòÀs Ã;¢½‡ „¯°=UXܼµ†@JÙ§åí…•@ j×?+äx)¼fn8ì?Áö bAÎûòT.Îù4‹7ªFyL¥‚p–—ËðÉ =®L¹Ý—²<}‚½ ×çLpFŒlU¤Ôø¤õ§X×Ú ó3¸b.}åúb¦ú+m]#e=üíÿìwVî N\…îˆÞûá•F/¾Œà⥤UÚ¶dx¸wì7ߦo«RÅl׺{î6 eÓ†Œߑݡ$±°™Oîu„€ƒÑ“isY½(d´–Æã^Ï–öÝG(W EtkÏ}À¹°±²ÜSïϧÐUŒ,Öƒ§BÖ+40MŸ™)È®Ü=‡gÚŒhashcat-4.0.1/tools/tc_tests/hashcat_ripemd160_serpent-aes.tc000066400000000000000000000010001320027462700241510ustar00rootroot00000000000000 %çlG“Vç”üM<Ú ÕʯRdC^b7ʦkéUÊù•¶¨:ÞÀM,²P’Ù¯ñ¥#T€2€ŒìvÒ!˜÷Jôó»2Ö´ž’çHsç\ý<é1\þÍÔu˜ûú^/rwFæTVôD¤gþ1JY99Ò7›Hu¦V÷¶iaDy%ô¯Ê»^‹ÙûH+}1¸:1,!ަ‹î$tnÈ®€¸û­þÖ(“ùÿ'ò˜´ Jg#¹Â0`—Ã^‡LwüzË’• ÚéϬ¯¾ßÃVÍnø·Oq‹œr͹ü>r¢ê׈æg[“$ü$£Nò¢õ:1fB`Öâ«9‘Ì^{ùAË€ý_†‡þ’Ä~goŸ, CÒþ•™Òn ßþÌ$·g‡óXDzZ‘gyY…-Ž‘ ª:¨WY2d>†ÜÁÍœR0hli̵ÑÀ‚ˆô»VßUÈ‹ã×_Ï!Ä7ßôQ[ñÀ}Àz7Œ-‹j¾"q¹ ÜÌ0áló̉"îF–+þlOÞÀ۹ä*ÓˆäÕ¿Ù#ŸºŽñÇÌëº2ã«]Wbý ÙÔÈ fs& ÈQqc¹8b#ŠÉ|Cµ½³M¨¢€*jóŠ,(ïw Dsi¡ŸØÍÿâZßÑ7¸K}´ÞŽÁ!tþºT^Hhashcat-4.0.1/tools/tc_tests/hashcat_ripemd160_serpent-aes_boot.tc000066400000000000000000000010001320027462700251740ustar00rootroot00000000000000WxO:iD+е¶CåcZ&^¢üp´Éwƒt½ú„^\!Å1ÍêÇøNbÇmÙრ»}¡Xºz*C¿ráÙ3w‚IqSç››xu‰—¥SeõËă2|ø€¿†[ Ù¯Pmú§å +‚ÒÝJ Aiøf9b¸±ãËÈ_¼¯Š×Å !8{†Cl“XŽo¦qfÏ} Ytò6¹+û5:„à¤M䇠`»ÍHëåýçØ]/M_„›wŒ´XòÉ€uf¼¹5tV !½™‘á@Ê‚yÙ%0v÷éëÎÖæ ðï"™M€gs¼Lö‡gñœ%®RèñïKQ`é È-póÞ¦zÉ`—r‰ÕT@b¦Æ{Èf;Ç3¡j¹`“Ë,MŽËæ¢tòµÓŽ|à_œbï(!RWjIÏã´ Å2ÊàH-ísÊ À’°¿: #w‡•% †Í5¶DHF ÑݮƻÂÄK¯`×Fv×û¯Hã¿c§2#-ŠüÉÔ-‹pOïU<fÞ~žªìÍgêþ¥³xMž½_VÑd–H}pÏê5.‹òNÜ]ì¾õ‰OÜIõˆCy›àSÏ `ðbe²U{Fq]Q^dàsš4ã-r{°®•iZtþÍÂFAUDî´Œljéƒòi†U£hashcat-4.0.1/tools/tc_tests/hashcat_ripemd160_serpent-twofish-aes.tc000066400000000000000000000010001320027462700256320ustar00rootroot000000000000009é$ÒFåα{ÿõ{g =îSúGRaÔe°î>Vî‚k£•„Æð(²¡éXwxNÞÝÏ1 ºq b3yVÒ Èý¨O“»þAP›“A{‚ÖŽÙ°¼–A·š[ø÷Í»©yß·Vj[ŒÌ"€r,çì¾JŒˆ ~huê¿Nê2÷¸ƒÞýFaŠ™…-x¦RƒÈóVNmχAP `¹¤GHÙ•²#°‰¬„~1ûZ-³em{WÞÏö^,\šõ½ìç¡„\ªøü~V¿T]…KîÂz–@¿—Á•åù[‚ vÅ¥oô(2Ê¥¦èʬéÐüÞ öîn<ËÇÐj`,Æ8÷®Fu;„àúž5S¿ý o£•િ?ÃÎë(L€Ü3_âç…€ÖÝú€Qº·É88ÊàÛ@¹ÛìËùÑ`-3Jœ5g!ÇFµ1ºö…_ßÁíî0™¸ä«ÆáÆ<æ†áëB½3€F÷ÈT¦ ïã•àׇ†£\—5ÍBC=ÐÄmÏ‹\²Â‰߀Geaå]c²_t׋eÍ4„3,Y¦­I)ê&}µÎJGÉÜÞ9ô ºUê~Uƒ£¥b’ZÊ¡%Õg•¹5‚R2ªT:F7Ì„#[…ÝDÖ^æëÞ—?þ+—bõ§òa~hashcat-4.0.1/tools/tc_tests/hashcat_ripemd160_serpent-twofish-aes_boot.tc000066400000000000000000000010001320027462700266550ustar00rootroot00000000000000^f(r‘°·JOC¢?°i:ËqÄ7œ:<Àêû«@k½­þÞžHJÊ[nÏ|~оaÖƒkæY8¸ù}©;§}kšU|•YÅÜÝûp‚;~2KÙ›@¨ó”ö¯Òyß4“µ‹Ÿüäeó¯ÒüFES©F¸^oüt¹œ8Ɖل3š„ÓÆÑ'N4H-TdnàJð;YI˜{*—ÊBx±ó Zñ ›±°FSsó§†ÁH» G3wØérd±Ä×ìAy‚œé)W;&å˜{YÚ…‘âÜŽ94ƒ е¬R†7é»1ä¼MS¼jƇ^…zLŒ2¥wîÓÆÎ¥¾ïQA`˜+âÇ×âôÖ^ú?J¬`ÿ1`çÍ–Žš¿Ð9P€©øè`Æ'ü2Æ<‹~ôk ³wè˜Þ°—Ϻ’Fh]~ÈR|Ü^ƒÁT‘xãØlÔvÌÄ-%ËÞ ¬¢±¬B#rϻҷÔeDš,»®5ÈçýªÝh:}É‘·j« ‹‡‘i$@s’¢®ôXÂè3) Áÿo?Iùæ¡3¶(¬|FNO5!xLó(f¾2‡u4»CÄ0@x!¥èuޤhashcat-4.0.1/tools/tc_tests/hashcat_ripemd160_serpent.tc000066400000000000000000000010001320027462700234030ustar00rootroot00000000000000”P­änÒôyÈDÛâȘÍý‘lnDêÄû‘‘˜Îöì¼p»oÝÜäܸ4¶5kYú—M^0ã.JSåRÞù&ŠùºÑÍ-~­S©Ûð‹²k‹³Í©Yv÷7!°±ždùúÂÉãq ˆà Nñ«k!WˆsßÚÝÒñFî¸7…·õ¬Œ”ˆ¸Ï/yC0¦k?7aKp/?äq¾Ù#Ë¥ŸÓ„]ÞÌáÚ…Wðf6óé«^‡×+úa½›ÂžéÓê'þ„ªŒ×ð·i¨ªöKfïlšìc€ ß§˜+™U%‚†½&ë²cŒ£õ”'r3³ÁÇSaùÂßD$}Æ,PËêt'¤KÏÇ"|ÃŒK;ÝaÇSél rŽŠô.²Ù*{ èFœË/­»`ÜM#¶pt‚É[KOhÇ×R¹¡o€þd5A±ulŒ=š?#˜×2dUãq˜c§íRdêqÆ";Xîëû+¡È1U~žþKÖ„iJNyõeû&·ºÖ’1J”:q‹%;ù E=68.°OZßLóèôq“KÙ£™—Ø¢AŽs ¬2¦G7ò+f¹ç.=CòlÕ:Æû€Ò yÌ{¡–Yµ†DßA0Þt=óÉg ¸n7ñuŒÒžÚ`Âe2“·ÓùHÁ=FÕØœ‡7ÕAÃ…þ¨#¡GÉjGá'hashcat-4.0.1/tools/tc_tests/hashcat_ripemd160_serpent_boot.tc000066400000000000000000000010001320027462700244260ustar00rootroot00000000000000äÊÓ¼}í}(¸igaz’ Ä#Ò);o”=i.—¹´«Ÿußpͽ Ï—u¸Z­a¬,¤™ÇÕ’ÎŒGûÀFÖTE{Ù§ƒq47gØÊ ƒPX-4õs{YÊø¶?bDË•×HΣX‘Ò sÒu ÑŠyØZ©jleÕ8ÈsX$ƒ3ʘ¬]RàUû+¬f4W²H®Ã7sû°·5†Ö-.D™¿h¯O«8•C…٭݈à?œÏ•P(ˆ§ÜЩ$ùWý?°7ðÆPh«FÌÐ Á-öIÉs^ ½=TÐ(Y’j#¦Ù¸ßóÒE¶oäžõëÌ5¹ŒCVŒßE…éÙm›>%-òóE(©¼—9ÊLk¼ê4öpLôI0gƒ‘ƒÈ\eS«˵R¸T4È’OãA÷·ò@Ra›wÛ+ãEÝÐnÌrëBJxü7—…û£b¢¨o–`ü µ@…W9ƒê]C÷úåhŠYïÉÉ`Æm»gøj¯ø/å-Ĭ;¤Çs~ûúèMâ‹ÄP»búA#/^zQó s#M¾,þダ*®-3†S¿ðý—ø=—‘“‡4¢°ñjÅ*ªLO)ü~fÊË÷/íyó­=²°ã*VÅ(8eïŒ÷n`ƒ «&j½Jº×- ÉnLdS¤c>èj©hashcat-4.0.1/tools/tc_tests/hashcat_ripemd160_twofish-serpent.tc000066400000000000000000000010001320027462700250640ustar00rootroot00000000000000^qÓÅXq`Í]:Ÿ!VÖ‚YѬ©‹[q×È ‡†Ãë/7ø$Zy‹$Zî‡§ÉІ<ÈŒ—J ‰]M‡3/}zAŠ(jKè’”<Ï„U½NX¨­wÞ]i–q‰¸Óqf+÷Ÿw<ËL×o9c¸¥L·4Ýe¥oÕ)lýã~‚ž/(¼ ꜷÁ_4¸,b#Ú¿„ÝË7¦ApŽÓ? ,h¯ƒôqEM6a+WˆÀDT‹ÐÑßÂQ0ãæ0›gî!ÐUÓÁ'ê=)U«„h`B`¶ÅEז繑h‚µ´iÀU²g(Ö<°AÅ=àŽÙ*Òa ü[¶èëõ>ol=ä´sßä ‚Q¯¿…ãû@{.  ̓ˬϬ!iûò:ÖIÊïãôÛòWðûÈAP‚¿v–䟇ݙs•±'úêt?¢hqÜôD¹Çph7 ^ÃÕR‚ª¹TsŠ‹q`qr‡öˆ}!:,8à¾6T~z°â¡îq<¡‡PeŽLÞѧ»¿ùHeÚ aNÖJŽ…Þ"jÞÇh–ê!ÔbéÏE‘¤É£FŒ¾øs™ë6ZI˜ÓUæ[Æ£3j~™^ʶ<¼øœ¢"ä»ñ©m³²¥2cø‘]#‡¸ÕÙ&ŽNÜY›:´Û:€Â¢0Ù'öˆ!08Uhashcat-4.0.1/tools/tc_tests/hashcat_ripemd160_twofish-serpent_boot.tc000066400000000000000000000010001320027462700261070ustar00rootroot00000000000000(U мªÛ„.Äì~®—$ƒ‘á“2Ø_øv‚ŒÌjÎ.Dí™çϥΉñ§ù‹àÒ}f‹YتR¬ÙYÆõ5=cDìŠL ½×;§ã=³Š¸">¶vÚïŸp<4 =‘r~ØÕËýFJí¯ä¶þ[tô²OG<𠧘cíɺ%²vøD ‡ß¿n±0„ÛæhuÌÔ™ Áíy«$ÒÂÍœ䯭•[êÞrñ¦ôû‡º p¢öbÉeúàﻜj ÛU™<ŠÛtÃá­¦VØäd[h@è>i¡•;Ü1Ä:Þ–C­áLQ³`‚>>4¼¶Ì̱m)¶~Úo 7uPd‹¨ð2ÕêLó/²… |} ±zösbë« 1HŒµG)i©Ov‘¿Ñf†GIý^W¤,ÊCàÜà ‡µëY­JÕ¿ÍBQˆ1wîôŸ@.?F”\²ÏƒÝ^¨·¯šÎ¢ã*rU¯qڲ̻LYÿ˜¨ïÀ¹I„A¢òu)™_N(…H d TáE]fUáDIÀ×XžNÃ8Qµê{ •p*úŠÄ*$G©jˆ4&ã­‰ŠµoŨ›Z´Ùfihµs¢hô®ºàu´òI{W'>á—Ç®Niá åµ¥æXõÎF‘f|²lÖ‘„e>8oàhashcat-4.0.1/tools/tc_tests/hashcat_ripemd160_twofish.tc000066400000000000000000000010001320027462700234060ustar00rootroot00000000000000vp|,®¿P½Á v0"™üÐsX Œ}܆½1¸¹WÆŸŠ®t"£á¸ßô…=¨ª%€–¬XL³q×Õãv¦/І)æAk~âAPøç¹c¨çõé°·UèIwÏÀ!\HS‚)æD›¦÷ÝÜ ±I9fîKÔŒóe$YYS¶…3]ÞyÅçp#»¢üZìCoâ9fù{ š[˜_··-Òb<:-ö”µR˜¶ôÄQ}7‚ØîdLrgŽìLn°Ü\‰ö3Ïw1^_¸<öÊr )®Á½"«ëšðû° íuy&žt{´ök“ã— ®Au€Þµ•hI1N ±£@÷ŽjZV»v;˜ÛÊPH%Ò¾"2y/öYæ,¡?(9¡[ëÄ0ZC -Ð=,»>šÌh½ñ9|Høg]á’0@é|婽|Nÿ>_º|ãnLç†iûm>빯pŽ(¹ŠƒÔÃýÅØúi?bþu2M^ÞEžåõ=«qMöæÚlIðKxÂõÜr­Êñ¥ø]© ZŠý¾Î·ˆåG‰:L(M™©ôŒ†o­Œ4~ÏÁ£|õæýËü9ø)2 TzR½°gL™Óa¶sW:%pñÍóV CBRØgÈitéEúp>t¼¿$1¢µ[¶´éW¯:jÍq¸å^òžVTå Åñ7hashcat-4.0.1/tools/tc_tests/hashcat_ripemd160_twofish_boot.tc000066400000000000000000000010001320027462700244310ustar00rootroot00000000000000?nqqèÇÐöºÞüûÞõÞC˜K!ÃB+¼â5~43Jȯ’sk¤`”­Be$δ‘$Š8¡TÃx‰©ô H#´Æ‹Ï¿…H¹80A‹'tlmÙœ*Ð’ GšTüö1Yes…ù¸ÎÖšC6Æ:5êW{Š\ªk†Í¬„e4ºbsQp5 Øœ5Qei9ÄÐØöƲÐï_h•Ší¬KU='ãB‘…äP*á'!¨çË‹±è¸¿Õ~J’«SdÔ»4ϱÑ& ì¦Þ ñ"À2·#ÿüG|M[e1š&šéܽ/¥]+À #³‚MÛúyAýîJ™¯Ú“»4½{a:Ÿ-·ì_)Gß­øþÀ!éËmZÍ-#¿†ùûiž·úíU_ó+ãð¬5!RˆñÀ •±KyöxÜ#J3šÀÇÁȮϫÒwŽ&P:–zY+_6>v;-}·ø&£chç莸ÇÕ‡¶¡êåD€IŸð´“|ú†1æ™&^aa,uÿ•÷~©¾sª(P$TŒPm.‰¬Ð9%8âôã·‰Ê}AcH"ƒ—‡ÉÍÓœzE%ÔâãZÿ²í]|óÞž¡LPõ/0rHuŽnÊyËŽ-s—ö±Šœ%¬\ïÅéRèàJùû42Tƒx´¢qúÙ4Í|™ƒ¯x0âö¢hashcat-4.0.1/tools/tc_tests/hashcat_sha512_aes-twofish-serpent.tc000066400000000000000000000010001320027462700251260ustar00rootroot00000000000000r@Ò¸èá ;ÿ©zVqbN#Çʺ(!¤Ë¸ó+%‘Oô.|LŒÝEAÇÆ½ä;­½Ë‚ùlw´ %Ñ?§³'8¥ŽäGlÎf÷Ž‰ÅšÂ,ôThN§èÃtf/#ÉI‘¶×΂1§¬W?{ÙVj`Ün~pAó yw1K2”4™ òÊEŠ—hQØTêë“LòµàcÔÓ×Ädâs »ºˆìuÏæ!w9²G;Øýq áäÓ®”Q³tíÏØãÍa;#®®'. #t‚ÚÂju2« ¯Š­WÍEÂ`Ì‘-X0Ë S2÷’QžžÕEqCN_+©àgi3¨mƒÇfAŸ¬˜§î#.ëY=†R«Wm_9=‚ù`+Íe—QSß [mÅ ¬­.¥»F–ùxïÒ±Áekø~¢ŠSlH2 C @öÂün}Jç±çŸÐ¨ðŽÊGCŒ|!o5U–© éÁsÇÐã×l3¨üáõ¹³vt½é?·É˺ghÁµÛÑ7DSð ÌǶi ¨Ø{ˆó æa”3WFÔßzÔz†|÷¸Í)j ^¡!Á§¦ Ov‹êIy/hashcat-4.0.1/tools/tc_tests/hashcat_sha512_aes-twofish.tc000066400000000000000000000010001320027462700234500ustar00rootroot00000000000000Ÿ {ìÞÑŠ.2MOÒó? Ñ®´=¶]3$/¤ŠÉ`úÔÁMÅSàjÔ~~9Mà¦TM5û $½ Åõ7ä*X±h™.Àµw?nŽWfåüÇ3[Ý &…ìÚŽº6oñR—ÅeF0ï ºB‡=Æj Ý^ºŠ;Ç#˜§­w•Øl¿h~vÍÅ iâ"‚ /\P™Zœ‡%»l‹5Œ–Z·r!ýý‚žWÎTÊÆâúbÛ=r rú‰bÝqŠ BÃEw¯œ´¥íÁ®·¯G ‹w˜}ÉâÒY:REŒJ˃¶(±HƒqÞ…÷Š.%®®¼Ò Œ0ЉIé;€w¯ÑþN ¯îBDå'vŽ#K†…*¡UlSÿÀÖöa6šHMUÐcžqç ñìwYFl¬{¼"á©R\+úŸƒ÷Ž V8~öP@·Pek uy8µ·äSòAgêål|”áäÏ ‰B%ñE¼1‚|­þbáHT“…•:¡jÛ¢1ªÎ:{ŸÙ±Â¹0ð“7{YsmЉYÊ[D–U÷šM¾ÀÚV`ƒù ª$°À¨mÔª§½Áä#=±rð5 Ì Ú·$g0ãùd”Ii mÌ„“nÔ‡½LîþX¨8 HŒÉ;…J.¦hÒô ‘^dŽåÏ_Ü<äËú·Ê©hashcat-4.0.1/tools/tc_tests/hashcat_sha512_aes.tc000066400000000000000000000010001320027462700217670ustar00rootroot00000000000000u‚»ƒJK²7üëVšñÄ<(Ž¥}ÄráúÎì cæm+zòa\@ÃC¯¨¥1w¥ÀmEþý†SS i×i3¯DŒh¸ë}ZYzùú " ‚Øâ¶ÝS W|´-‹~_­i Pñ]o-çÕ2[Îv©X?ð‡Vä]_ñb6”RZŒŠýrÉ3Ý Ìû*V ¡6Ù‹›ÏŽ ÀßjO €Ê¸”{ÿ¼ï«‰tvÏÍ`*IÏbÀ_(m6ºÆ@Š¡¾Ö?FÒß@»]µøþÛŒ_¤ƒL/ŦôÿÙi*E@þ¬Ñ~jÃØL_È…ó€;r€¼öŽf©`xß0!æ„êÉ'ÔæíK>¬ÖôµøäĵÉ`vŠ5“€½É7X2ÂLñ ’Ce P{‚ΈS!®>ºƒ,ƒè<êúM›BéœæM(¡.´z>5™É–oHùc&Ž1÷RTF· zqàà¢ÿ»ú‚OjÌmPŽºÊY‰\G,Žíö¾¥Ô¬iÅÕ縫ÎÊ7¤,t¤©Í ”"¾Õÿ5[îH·Ãñ£Èºö)ÃÛs€½ñ)“olUÐ¥ûÊMŽ‚u›ß <;Ù}iÕv·ë»~«¦$Æ…íxiQ­ÐÚ—Dw¥×(N'ldV.Ø‚D‰1J¹§ “ª CæÕhashcat-4.0.1/tools/tc_tests/hashcat_sha512_serpent-aes.tc000066400000000000000000000010001320027462700234450ustar00rootroot00000000000000ÍyvÕèswU¼ö#á`oÄb·Õš „Ös‹DÄ`êdOŸcØœ3¯“S\©É*eƒÃ²(4 ·\ENŸÜÏæòðƒ™"û|((‚oM‰åÎY[¾$AäõQᮟ­ï“ÿ™ ‡FŸ`ˆÏ@ë ¯º?—¨È¥Z°æ>··CyñÜÖx©—[ÛÓêÜÍ/64s2Ñÿ•¾¦ ˜aéþfˆ2_Wp¨DÃ[úRt± Ó¾HAPº{‘=ìJHºœw#­õ /_ÐÎoÁî)$ôsÁÒß­q£’·ˆÆï À9Î nàíáTYøëæÂÉÂ*×ïèü°ØåÄ©â˜}Fü<t“o¸·LÍ(¡—£7¨¢gqŒ9qˆ%æ=A›OfF üž<x+ÄÜc¢¸â Ø×8ª·i€Ï85‹_'» C«¦­ýÿ'}Gš@cP±÷0ïäð`@^óI¬°ñm¢UŒ§;KÕM{×X…^¹ˆDI@i½‚P£SÔ@—p},cüÜ—?aK.¦0žÁÔ·iWð|ÍSº°{ŽtþÖo>¦FLJý@iÞ¸ aïHÂcØŠo¸IdÑ`‚ÁlsZ ?>^hÀ³g½òp(ÁwIvúQ_%L8‰èEÜE³ÇF&/¦&?oz…PS+¹Â²ö’úu`·e̼ƒá©“tèÕj¶¥[Ó9𫊖..LäÁ»â#•ªbŽ+ØpF4R[Ó>ÿ£È·»7ݺƒ7â§BUìŒèKònÁ)éäƒçÑL¢Ð‹ÃP ¹è ¬ž$¨&Š™ûÒ¨˜H J¼ ä=yÔ™îÿuÿµ·qcáú¸í‘cÇÂûæðß–ÖO‡I|Ï7Cͬù–‡ ×Ñ€v@‘ç&Ïe¹f~³qƒèSB¤ÃC§ä)‘ÏzbM§Ð#’È@çs ÃÅ{Ë'c$Ø$£&M=€—féÕ'¦&¸Shashcat-4.0.1/tools/tc_tests/hashcat_sha512_serpent.tc000066400000000000000000000010001320027462700226770ustar00rootroot00000000000000^¿ö´ ª3tù”af©ÄMÓì ñm¢û9 Ò‹<›•˽mzÐT¡D:Ö%Nž’Mxº¶ F>qÏ|1 ·ïNƒ{ö×¥H݃3ÄQµ2 DÆÿÆË’ã½ ¦uàGŠùÔj]oõ˜¿¤p¬‡•’Šm.Gin<ú2—8åB˜˜„ô cÑ£8ÅÛbg“8èIJ(§šŽP[¸šFsðE{'7  1µ²ëfÆý¥Y‘–³Õòb3]q\ö±(EJVga›ÜÎŽT¬´}IŒAaaJ;ÿT—¤£Ù›ÿÎ*7'¯/é®uFο:O1Ö#]Œà›sB”ÐÎÜêüb•ò±°€ç¹tU€ÐÝéœý•¯ï˜'bÕª¾ª-:’Ï62,Àkýqœˆà¹¢bZ”§uÔ½@¨[¡8ËÐÏ•aª9]ÅR€hÌánT„¦rª[xf]Å1«>r…’ÄC·ôÈ¥Ëh|e‰»?MÜ*†9ÙY¸9°=Pçqv"Ãi:’å@äù2ÆÈ›ôá¿ñÖ‘Q„Œ=²ö«¥+X峓öÍXÿ . °Bµ¢[Ë É_£/ÍëÔÈ-ˆš]‡Ä]ÏÓN€±›÷¾5in ËÙ3‹1MâLç»À£¶‚O†¯*¥Ñ'ÒD˜_õfé!C8öhashcat-4.0.1/tools/tc_tests/hashcat_sha512_twofish-serpent.tc000066400000000000000000000010001320027462700243600ustar00rootroot00000000000000 ‡ÝdÞ .áN8¼é ¬—”B Zm¼UR|T’wô8V¯Ì{UžÒ»G›fü*hš=˜fs6J€1t.ñX=ïiß®H9îpúÝ ™xë°ÓC–‚?Â>E×ýý¦<©–…Ÿb+öm󸻢0è|œÏ2Ýãm3‹u`ÔÑâ9¬F—ÔŒ„è~N þ+IâôàiÛ9I‘»ñîW÷D Úw¾6ÜEðéKÔ&åI[ ƒêé{}M;U‚µ±ÁµœýPÿÿÛÔ±¡~]/ü\ðÌ,!°zô¾/ËÓ¿>0¬Ìó݂т#ѽlj(8q`5LKEüüß4ra¥í^³|\&‚Ts[Ig7ç]‹€õÏ•\‘DÍœ¤ö¬M3¹¨Ãißu¦&‰?W%“£ìlÇý/„¬(IM`¢"ÕÝ1Nc 99‘ñ¨òyaÐ…l_ƒMájá[Í<’8ÖãΗæ¥+D–Eµw”ÎëˆÕ 1è‡òô¸wåÒøLz›úcÑ0ç²(:ìëÅ™qºŽ²Ú+ýRJq¯ÈÛ@Ò'pbŸ™Èê˜–Š WïÆ·WXèô¢IJæ…°Ø[jç¡ÈÊ¡HÅ$ÛÔ¤ wÁþN—öRáÃû…Å˼Ðy ã)fÒÅÇ.e™#?ña‡hashcat-4.0.1/tools/tc_tests/hashcat_sha512_twofish.tc000066400000000000000000000010001320027462700227020ustar00rootroot00000000000000¤® Zâj ø‘Ù~ý‹áótF• ˆDçïÏP*ñ)ŒHÃBÓ$ˆøz”0¾vLåAå)ó±áÈj«ž q‚бGð¡‚ì¼ÀAÏûZ¹ýgd%H¡ôy)ƒgx,ˆ©&F¿·»'5ْ⦽©ŸS m´"—¼”s˜„ûïtÈmIb¥ÑÓˆ¶O½iée§8ý—¿cã ˆÈOg¼«eÎ|¦5ˆ¥sø ÇæÌh– £ÃN™$5>gqk×`ü±ÔYâçFàpÏCZ»û`]ݰž^ä°”žhNCÛ’¸ðTõêɨÐeÚü–kb|é Ø‡ßwú~†=(« mDý!!©ð¨æ|(:Ÿé°l!+¿}ý‰ÑõÚû»>ƒyÓjGR"í(=ƒßœ·dŠY\4Åâ'`§ø+tüÁAàóžkËßM¬-¹éR×8 ıX4£—½˜â‘ÞuÉ´ÖžMŠ<ŰSö•×IÄw©ŽAþÙ¯dY9ï—3bOˆSd;_1{dð˜`¤iÐ)ˆ±2Nû CEJÚDˆŽ°ûµîňf~V¨AÎãu34"€©|”9¡Jíþñ÷°Ù!bº©š@¸ÝùŽÁVþNߘ±àᛄ5WåÜ Pp¹qgXü¯>Ÿø,#ðʇ›¿b}hashcat-4.0.1/tools/tc_tests/hashcat_whirlpool_aes-twofish-serpent.tc000066400000000000000000000010001320027462700261420ustar00rootroot00000000000000Þ}g%ÌL‘ ~–0}öA3^dÑ{D%Ê[ñs'‚’ߟ óèUØVnµ%Y'?˜sHx–fÈåcãf žh¨kÂZȲpmÞ\ì9FæC2²A¹(˜\cuYêÕ´þÊÇOðÖ%ïm‹é=ê>¬ S”ò>éàyÓPJw´À²-<ü¯©Æp–kú:_0S’PÙrg©åkZ7±ý,åJ·‹RºaÐ(צ·&Ù,ˆqpø i ò¹»ïuñ–º‡û_r¢ž!0–¨¾;nmóÜ"V=ÉçÙ[æŠÑiÂ3(ŸÌýÂõRŒeŒ±x´çTél´R…›Ýul $[ÝXo´PèIˆ(È ð¦Ü_Þ¨ M£¬µÅÒ§ABV²B>3XD7êše ½$¤xÑ7é¢t§ŠÓÊÁLž_ÂwÒ1Û´G÷ ù+ ãê×|ÿ¬¢_w!‚pZuåÙª³™ký Bô½þ5£¤wãUÇjqÐöHHÖ@sÎnÄ,‡—?Ãæ–&R4c aÅQüH~ŠMºáÊyeÁ",`vˆ³8L\)Ôþ‘ÑM,É@¦©ÙD†Ñ‚2a’ˆõoà mz1sMà!zý8¯£ÒÏ4™ÂÜÿ3*6œK9†müƒì2Ñ›“/¬¬~p½Õ7èC"EÁbØžÃÌ—å‚Þ],ƽçhashcat-4.0.1/tools/tc_tests/hashcat_whirlpool_aes-twofish.tc000066400000000000000000000010001320027462700244640ustar00rootroot00000000000000éå—+rÞé–°¿ÎÒß:T´#™ãXe ÏiG[£*ÿVN@楯•Î"UŠèéLä•8‚¨)žãÿûé½b¿Ž,AÀ¨3|â EqT@̃㔠5[¾[pú¸Fs  ‘¡×ȌDzoÑy\©s³&k©UÔ´äw±´¦ª¼Wà? çȧ}ü=7Žû¤P1çÖ;µrn/-ÆÚŒÎzãk2Ã&¥¼ª,KD_náø™©­Ì*i‡iù·ŸzìRü˜b×R†ÿÚg“?œRåÆÕ­)¸_°ö»mª;-U¶,eÚ7ãçü¹™Tà«â 9rN²Çø9ìgÓ_ýŒMÔ¼Ä9?«)úÌ™'}!𠤯'*óhM€Cí?P+˜á–Üz )'a1y™vòŽÿdšÏpª ʼnnÑ>±Ž¢ÝlF œ|þÞ«ZÈ <R&ÏÊ Juú*åí!3º µFk I¶)Ï4^W¤Àï?œŽÐåÝÝE+S?¿$>ðcûm&ušç%ØÊCŒñ{†f]#½ÿ½þ`ˆè|·ÈŸ#«Ä¨» suÌ)±Ø•þ’án €áÖ' »;§S2-+b<®ØråRÃ>i@ðöò·ô`×Í‚ç qˆñÀµ‘Ô$%=è³b¯bÆÅ·dë}1hashcat-4.0.1/tools/tc_tests/hashcat_whirlpool_aes.tc000066400000000000000000000010001320027462700230030ustar00rootroot00000000000000á!¥Gc€½Q&h§Å­v=.ä'à£q}*ÒÀÅ<ÇŽcÈ› @ÈV¯êñßÀ#8ï– ÊRÄ[=À†ŒHö¦5>)b¥• «þÚ™Ó¦r¢ˆ;Td!ó–©áó¾Îþ¯›ô„>ÒºÛZ¶Ç›g@ w¦¾zÌ™öYz¨*R½2Ð!ÁõÍ.Ë3RÒQ&ZpÄ“ûOœj$Ð"ÊaÃlná†ÉDa‚m£`?szó1»ŒR4BD iX¾íñÊL®Zè#m r*þ[é}Ê­*%Q¬þÐU&ÀŸ/~º†Æ8¾|·±ßú”ÑZy_&×1 ,Sø§Æƒª)t¸Å„<å-!‘*\Á‡Ä4ѵËdÅê«MÈ©+.GöZ¡¢­oùcðQÿ¯ˆÆ*:Á¥÷mB"taW_}Õ§ÙWâdŸ§ß‡ŽXâÌ£ŸGŸN|h7m lÙäXïb¿‘DD½Q~HÓ°™[OÔ¾»HËJyÂÿÉiîõ†IfϾeë÷¢vh8Æ6*«”l˜9Gå ÄB«¾ÿ0Ë–‘û¢5$OÈA±£‘MoQŒUèïȰ°’§cÂAÞ²c‹6Èä4°Shashcat-4.0.1/tools/tc_tests/hashcat_whirlpool_serpent-aes.tc000066400000000000000000000010001320027462700244610ustar00rootroot00000000000000Œh‘wª:òõJŒŸé¦—žUþë“ßO7ÜØØD@ €«µŠyÄíÓ0 U9¨Õ:<'tk'V{6îÎð¼2OfÌ_‡(F±Õ ҥ̪]”åî¡wŽ;ñ±e&ÍÖfAf“‘wÆ‚¤K~i2T²K4èåV®;â(þ(ʱ.Óï寡v¸äUÖÁà!)«¼ñ*ÊÃUYPÇ£Ô3E£f†õlÐfW}×¥äÞ2ú£¤ÓòØÆ'¼³R˜Liæ{Ô<3(åÜ'ê¬ÕÖ3«$Þ®6ÔJ2/öðÆ ÷…ˆýÑe ­NUTYŒÅYÉ ù½žæûH ¶7ð¡HOåo@(Røü[‰ú-ŠV ̽z€dz–hÞªSÒ®\Š¥ÒéB1M‰ÿß–ƒ£°Æ__5a ý´þÙ û˜5íb†…+(1{xXxÇžQÕÃ0^ž-yµö!½bÆ G`è§êc‰’Û Dž1Óç']3=ÕiþÐíïT?õñ (}ÏMÇÕRŽa?›¢J«éßû¨A9à¾A¬–¤÷¿3§·–\Ùâç·Í7m!ËÁ)jÀ¤i…¯]¾W7¾0øÑd…ÚádíÌ@¯hashcat-4.0.1/tools/tc_tests/hashcat_whirlpool_serpent-twofish-aes.tc000066400000000000000000000010001320027462700261420ustar00rootroot00000000000000é]ÄbUç²C¨ÛqìL[.§UÔ"@×Î$5°Ók«“çžÄúiq øÖr˜ j€ÄC>–uiö0 ¼k­@ c«¸|ý!Yäw2̓À$V”Úù&%ßJ3Ç5 ßšŸ º…×Ú…—݉!Õ[;_ mØdØ©­¶+;®o,ÌØñè“ë¹}ÀÐg’óT|×Ò…o}~¶ôrÅ€}Ä8BõÛ«µQÈ ›@GÞ•ù*1p¸¾¾Á ãóHÈÂX^œ/ÞacLOØš›ãê– 9¤9.LZÑ"‘Ú,n„òé{’1úL×vµ¥´Zú"Zár´øÁ㾇cJcQ•&ø¦ÉºýýÒíþ¼¶ü)•‰'g¨VÚR{ÏŸ¦6Œª~W“X|GHoá—€ #ŧ"GââSAŠ>;Šª?ó¶XnáŠd6vbþàŒ—Ô¡÷±XIò%Pâ|YÃMXûöüw{뜕:qÙ¥¾àP¹÷MYãP}vëxÐÓ®C®Ó„­J{öh¸™ÎMq—1yÄi`5ãÈëͧ#IíªrD.¸i¹<çlÐß*oèþ´¢@}?m‘•>—êÔŸ¯J%J飩uéƒ0ë‘ËÁHõl*ž³_[]#gö \ßÛôM°ÈžífèÔ\sè)y Îÿ‘’’žÍZ»Œhashcat-4.0.1/tools/tc_tests/hashcat_whirlpool_serpent.tc000066400000000000000000000010001320027462700237130ustar00rootroot00000000000000,h3.Ÿà ªŒ&å6€îªdyˆ/#vm–~“MSÓåMeÀ—ÞµËl¿ôè4ü._[®¼Êù3‡J›˜ð·Ìʵ2cþ šïQÚÞ,¤ÿ¶%ײŸ¶Ý¶eÔÚôgà“=¹³¢-ŒÐÇSEU2Zj»‹ë7æWL¦&º wsrÒÍ»­mÏ ÅB !ÀúÌŒ :ˆ9´¥ro\¨ÊLQ<½çì ¼/ž;Ië H+Úúßœ½} ¹0uPAüd¶ÌñæŸ*€{ÇQ¥Û`IB¬C«Ù3Ömì„™¿îum”ißÕ  BðòPç߃ [wçQÊ›õd£Ø¯/D¹£[] Õ'>¹Å€®æ,F ÇöñÚ£}¼4FÊñØ’†/nÛÆßâ¹/Å»vj:ãÎZ(ž'„˜épÓ,býgb~†·x†ªÇŒ:_½!u'JÛl)^lŽé˳Fºšf†FäÉìŠæ[Û—?f80Š·>êa°NPT‰8ñþªStÔà[‚hashcat-4.0.1/tools/tc_tests/hashcat_whirlpool_twofish.tc000066400000000000000000000010001320027462700237160ustar00rootroot00000000000000ÏSÔ4¶2…çå,-™áHÆÌÄP2ø,´bР¬ž¡bt(ZÂaÃ9ÁPŽìŸêTÃ>8$Xf)g*ˆ¨IY¦xâ8—9…ìg P%&wC‡î(·+ú^ß²÷œ@·4ºŠT£f&B¦«~uôThŠÔ­µÖÞ͉bÝSqˆZQào¥ºò+iÐôrÏî®w«š 1†:ñص³€ÚŸ§Õ"~ð1s+ànãL (·¦N¬4å Ž ×”³¯È¬i¿œÝ-8?éjr|h6(ÚŽR„½ªh×W=~òouѽ\‘兀³;œk‡˜Uí;€c«phøé›‹Ån£èƒï¥]o4 &åÙ_mv;¬@IDM2>àÞ ÆTsñ&µ¤Àéût‚_‘úï¦ zÈ(EDÁ‡/õaÕÏ 5Sô'5‹!cv׸vá¼ÏtÕÒQ·É"»\pÇ]ŽÊsç­ì£9mwöå—¡ ÔÅ7ý»Ü͈ºLP%wjˆ£I»’ZÝ;ìñÊþ2Sm°À°j÷™ûi.0K7ÊZŠ€…œ@Ê>pFµ£/MⅠͯl$àÙ9çóå%ɵª(ñû»#b„phOË>&~ 1 } qw (30 40 130 131 132 133 140 141 1000 1100 1430 1440 1441 1730 1740 1731 5500 5600 8000 9400 9500 9600 9700 9800 11600 13500 13800); my %less_fifteen = map { $_ => 1 } qw (500 1600 1800 3200 6300 7400 10500 10700); my %allow_long_salt = map { $_ => 1 } qw (2500 4520 4521 5500 5600 7100 7200 7300 9400 9500 9600 9700 9800 10400 10500 10600 10700 1100 11000 11200 11300 11400 11600 12600 13500 13800 15000); 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 == 133 || $mode == 200 || $mode == 300 || $mode == 600 || $mode == 900 || $mode == 1000 || $mode == 1300 || $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 || $mode == 99999) { 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 == 4520 || $mode == 4521 || $mode == 4522 || $mode == 4900 || $mode == 5800 || $mode == 8400 || $mode == 11000 || $mode == 12600 || $mode == 13500 || $mode == 13800 || $mode == 13900 || $mode == 14000 || $mode == 14100 || $mode == 14400 || $mode == 14900 || $mode == 15000) { # 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); } # macOS (first 8 hex chars is salt) # ArubaOS (the signature gets added in gen_hash) elsif ($mode == 122 || $mode == 1722 || $mode == 125) { 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); } # Fortigate elsif ($mode == 7000) { my $index1 = index ($line, ":"); next if $index1 != 47; $hash_in = substr ($line, 0, $index1); $word = substr ($line, $index1 + 1); next unless (substr ($hash_in, 0, 3) eq "AK1"); my $decoded = decode_base64 (substr ($hash_in, 3)); $salt = substr ($decoded, 0, 12); $salt = unpack ("H*", $salt); } # macOS 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 $index1 = index ($line, ":"); next if $index1 < 1; my @split1 = split (":", $line); my @split2 = split ('\$', $split1[0]); next unless scalar @split2 == 2; $hash_in = $split1[0]; if (scalar @split1 > 1) { $word = $split1[1]; } else { $word = ""; } 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 hashcat'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}))); } # BSDi Crypt, 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}))); } elsif ($mode == 12900) { ($hash_in, $word) = split ":", $line; next unless defined $hash_in; next unless defined $word; next unless length $hash_in == 160; $param = substr ($hash_in, 0, 64); $salt = substr ($hash_in, 128, 32); $iter = 4096; next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); } elsif ($mode == 13000) { my $hash_line; ($hash_line, $word) = split ":", $line; next unless defined $hash_line; next unless defined $word; my @data = split ('\$', $hash_line); next unless scalar @data == 8; shift @data; my $signature = shift @data; my $salt_len = shift @data; my $salt_buf = shift @data; my $iterations = shift @data; my $iv = shift @data; my $pswcheck_len = shift @data; my $pswcheck = shift @data; next unless ($signature eq "rar5"); next unless ($salt_len == 16); next unless ($pswcheck_len == 8); $salt = $salt_buf; $iter = $iterations; $hash_in = $pswcheck; $param = $iv; next unless (exists ($db->{$hash_line}) and (! defined ($db->{$hash_line}))); } elsif ($mode == 13100) { ($hash_in, $word) = split ":", $line; next unless defined $hash_in; next unless defined $word; my @data = split ('\$', $hash_in); next unless scalar @data == 8; shift @data; my $signature = shift @data; my $algorithm = shift @data; my $user = shift @data; $user = substr ($user, 1); my $realm = shift @data; my $spn = shift @data; $spn = substr ($spn, 0, length ($spn) - 1); my $checksum = shift @data; my $edata2 = shift @data; next unless ($signature eq "krb5tgs"); next unless (length ($checksum) == 32); next unless (length ($edata2) >= 64); $salt = $user . '$' . $realm . '$' . $spn . '$'; $param = $checksum; $param2 = $edata2; next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); } elsif ($mode == 13200) { ($hash_in, $word) = split ":", $line; next unless defined $hash_in; next unless defined $word; my @data = split ('\*', $hash_in); next unless scalar @data == 5; my $signature = shift @data; my $version = shift @data; my $iteration = shift @data; my $mysalt = shift @data; my $digest = shift @data; next unless ($signature eq '$axcrypt$'); next unless (length ($mysalt) == 32); next unless (length ($digest) == 48); $salt = $iteration . '*' . $mysalt; $param = $digest; next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); } elsif ($mode == 13300) { ($hash_in, $word) = split ":", $line; next unless defined $hash_in; next unless defined $word; my @data = split ('\$', $hash_in); next unless scalar @data == 3; shift @data; my $signature = shift @data; my $digest = shift @data; $param = length ($digest); next unless ($signature eq 'axcrypt_sha1'); next unless (($param == 32) || ($param == 40)); next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); } elsif ($mode == 13400) { ($hash_in, $word) = split ":", $line; next unless defined $hash_in; next unless defined $word; my @data = split ('\*', $hash_in); next unless (scalar @data == 9 || scalar @data == 11 || scalar @data == 12 || scalar @data == 14); my $signature = shift @data; next unless ($signature eq '$keepass$'); my $version = shift @data; next unless ($version == 1 || $version == 2); my $iteration = shift @data; my $algorithm = shift @data; my $final_random_seed = shift @data; if ($version == 1) { next unless (length ($final_random_seed) == 32); } elsif ($version == 2) { next unless (length ($final_random_seed) == 64); } my $transf_random_seed = shift @data; next unless (length ($transf_random_seed) == 64); my $enc_iv = shift @data; next unless (length ($enc_iv) == 32); if ($version == 1) { my $contents_hash = shift @data; next unless (length ($contents_hash) == 64); my $inline_flags = shift @data; next unless ($inline_flags == 1); my $contents_len = shift @data; my $contents = shift @data; next unless (length ($contents) == $contents_len * 2); } elsif ($version == 2) { my $expected_bytes = shift @data; next unless (length ($expected_bytes) == 64); my $contents_hash = shift @data; next unless (length ($contents_hash) == 64); } if (scalar @data == 12 || scalar @data == 14) { my $inline_flags = shift @data; next unless ($inline_flags == 1); my $keyfile_len = shift @data; next unless ($keyfile_len == 64); my $keyfile = shift @data; next unless (length ($keyfile) == $keyfile_len); } $salt = substr ($hash_in, length ("*keepass*") + 1); $param = 1; # distinguish between encrypting vs decrypting next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); } elsif ($mode == 13600) { ($hash_in, $word) = split ":", $line; next unless defined $hash_in; next unless defined $word; my @data = split ('\*', $hash_in); next unless scalar @data == 10; my $tag_start = shift @data; my $type = shift @data; my $mode = shift @data; my $magic = shift @data; my $salt = shift @data; my $verify_bytes = shift @data; my $length = shift @data; my $data = shift @data; my $auth = shift @data; my $tag_end = shift @data; next unless ($tag_start eq '$zip2$'); next unless ($tag_end eq '$/zip2$'); $param = $type; $param2 = $mode; $param3 = $magic; $param4 = $salt; $param5 = $length; $param6 = $data; next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); } # itunes backup 9/10 elsif (($mode == 14700) || ($mode == 14800)) { ($hash_in, $word) = split ":", $line; next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); my $index1 = index ($hash_in, '*'); next unless ($index1 == 15); # signature my $signature = substr ($hash_in, 0, $index1); next unless ($signature eq '$itunes_backup$'); my $index2 = index ($hash_in, '*', $index1 + 1); next unless ($index2 >= 0); # version my $version = substr ($hash_in, $index1 + 1, $index2 - $index1 - 1); if ($mode == 14700) { next unless ($version eq "9"); } else { next unless ($version eq "10"); } $index1 = index ($hash_in, '*', $index2 + 1); next unless ($index1 >= 0); # wpky my $wpky = substr ($hash_in, $index2 + 1, $index1 - $index2 - 1); next unless (length ($wpky) == 80); $wpky = pack ("H*", $wpky); $param = $wpky; $index2 = index ($hash_in, '*', $index1 + 1); next unless ($index2 >= 0); # iterations $iter = substr ($hash_in, $index1 + 1, $index2 - $index1 - 1); $iter = int ($iter); next unless ($iter > 0); $index1 = index ($hash_in, '*', $index2 + 1); next unless ($index1 >= 0); # salt $salt = substr ($hash_in, $index2 + 1, $index1 - $index2 - 1); next unless (length ($salt) == 40); # dpic and dpsl if ($mode == 14700) { $index2 = index ($hash_in, '**', $index1 + 1); next unless ($index2 != $index1 + 1); } else { $index2 = index ($hash_in, '*', $index1 + 1); next unless ($index2 >= 0); # dpic my $dpic = substr ($hash_in, $index1 + 1, $index2 - $index1 - 1); $dpic = int ($dpic); next unless ($dpic > 0); $param2 = $dpic; # dpsl my $dpsl = substr ($hash_in, $index2 + 1); next unless (length ($dpsl) == 40); $dpsl = pack ("H*", $dpsl); $param3 = $dpsl; } } # base64 and salt embedded SSHA256, salt length = total length - 32 elsif ($mode == 1411) { # 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, 32); } # Atlassian (PBKDF2-HMAC-SHA1) elsif ($mode == 12001) { my $index = index ($line, ":"); next if $index < 1; $hash_in = substr ($line, 0, $index); $word = substr ($line, $index + 1); next unless (substr ($hash_in, 0, 9) eq '{PKCS5S2}'); # base64 buf my $base64_buf = substr ($hash_in, 9); my $base64_buf_decoded = decode_base64 ($base64_buf); next if (length ($base64_buf_decoded) != (16 + 32)); $salt = substr ($base64_buf_decoded, 0, 16); next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); } elsif ($mode == 15100) { ($hash_in, $word) = split ":", $line; next unless defined $hash_in; next unless defined $word; my @data = split ('\$', $hash_in); next unless scalar @data == 5; shift @data; my $signature = shift @data; next unless ($signature eq 'sha1'); $iter = shift @data; $salt = shift @data; $param = shift @data; next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); } elsif ($mode == 15200) { my $index1 = index ($line, ':'); next if ($index1 < 0); $hash_in = substr ($line, 0, $index1); $word = substr ($line, $index1 + 1); my (undef, $signature, $version, $iter_count, $data_len, $data_buf) = split '\$', $hash_in; next unless ($signature eq "blockchain"); next unless ($version eq "v2"); next unless (($data_len * 2) == length $data_buf); $iter = $iter_count; $salt = substr ($data_buf, 0, 32); $param = substr ($data_buf, 32); next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); } elsif ($mode == 15300 || $mode == 15900) { ($hash_in, $word) = split ":", $line; next unless defined $hash_in; next unless defined $word; my @tmp_data = split ('\$', $hash_in); my $signature = $tmp_data[1]; next unless ($signature eq 'DPAPImk'); my @data = split ('\*', $tmp_data[2]); next unless (scalar @data == 9); my $version = shift @data; next unless ($version == 1 || $version == 2); my $context = shift @data; my $SID = shift @data; my $cipher_algorithm = shift @data; my $hash_algorithm = shift @data; my $iteration = shift @data; my $iv = shift @data; my $cipher_len = shift @data; my $cipher = shift @data; next unless (length ($cipher) == $cipher_len); if ($version == 1) { next unless ($cipher_len == 208); } elsif ($version == 2) { next unless ($cipher_len == 288); } $salt = substr ($hash_in, length ('$DPAPImk$')); $param = $cipher; next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); } # chacha elsif ($mode == 15400) { my $index1 = index ($line, ':'); next if ($index1 < 0); $hash_in = substr ($line, 0, $index1); $word = substr ($line, $index1 + 1); next if (length ($hash_in) < 11); next unless (substr ($hash_in, 0, 11) eq "\$chacha20\$\*"); my @data = split ('\*', $hash_in); next unless (scalar (@data) == 6); $param = $data[1]; # counter $param2 = $data[2]; # offset $param3 = $data[3]; # iv next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); } # jksprivk elsif ($mode == 15500) { ($hash_in, $word) = split ":", $line; next unless defined $hash_in; next unless defined $word; my @data = split ('\*', $hash_in); next unless scalar @data == 7; my $signature = shift @data; next unless ($signature eq '$jksprivk$'); my $checksum = shift @data; my $iv = shift @data; my $enc_key = shift @data; my $DER1 = shift @data; my $DER2 = shift @data; my $alias = shift @data; $param = $iv; $param2 = $enc_key; $param3 = $alias; next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); } # Ethereum - PBKDF2 elsif ($mode == 15600) { my $index1 = index ($line, ':'); next if ($index1 < 0); $hash_in = substr ($line, 0, $index1); $word = substr ($line, $index1 + 1); next if (length ($hash_in) < 12); next unless (substr ($hash_in, 0, 12) eq "\$ethereum\$p\*"); my @data = split ('\*', $hash_in); next unless (scalar (@data) == 5); $iter = $data[1]; $salt = pack ("H*", $data[2]); $param = pack ("H*", $data[3]); # ciphertext next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); } # Ethereum - Scrypt elsif ($mode == 15700) { my $index1 = index ($line, ':'); next if ($index1 < 0); $hash_in = substr ($line, 0, $index1); $word = substr ($line, $index1 + 1); next if (length ($hash_in) < 12); next unless (substr ($hash_in, 0, 12) eq "\$ethereum\$s\*"); my @data = split ('\*', $hash_in); next unless (scalar (@data) == 7); $param = $data[1]; # scrypt_N $param2 = $data[2]; # scrypt_r $param3 = $data[3]; # scrypt_p $salt = pack ("H*", $data[4]); $param4 = pack ("H*", $data[5]); # ciphertext 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 == 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 == 10200) { $hash_out = gen_hash ($mode, $word, $salt, $param); $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; } elsif ($mode == 12900) { $hash_out = gen_hash ($mode, $word, $salt, $iter, $param); $len = length $hash_out; return unless (substr ($line, 0, $len) eq $hash_out); } elsif ($mode == 13000) { $hash_out = gen_hash ($mode, $word, $salt, $iter, $param); $len = length $hash_out; return unless (substr ($line, 0, $len) eq $hash_out); } elsif ($mode == 13100) { $hash_out = gen_hash ($mode, $word, $salt, $iter, $param, $param2); $len = length $hash_out; return unless (substr ($line, 0, $len) eq $hash_out); } elsif ($mode == 13200) { $hash_out = gen_hash ($mode, $word, $salt, $iter, $param); $len = length $hash_out; return unless (substr ($line, 0, $len) eq $hash_out); } elsif ($mode == 13300) { $hash_out = gen_hash ($mode, $word, $salt, $iter, $param); $len = length $hash_out; return unless (substr ($line, 0, $len) eq $hash_out); } elsif ($mode == 13400) { $hash_out = gen_hash ($mode, $word, $salt, $iter, $param); $len = length $hash_out; return unless (substr ($line, 0, $len) eq $hash_out); } elsif ($mode == 13600) { $hash_out = gen_hash ($mode, $word, undef, undef, $param, $param2, $param3, $param4, $param5, $param6); $len = length $hash_out; return unless (substr ($line, 0, $len) eq $hash_out); } elsif ($mode == 14700) { $hash_out = gen_hash ($mode, $word, $salt, $iter, $param); $len = length $hash_out; return unless (substr ($line, 0, $len) eq $hash_out); } elsif ($mode == 14800) { $hash_out = gen_hash ($mode, $word, $salt, $iter, $param, $param2, $param3); $len = length $hash_out; return unless (substr ($line, 0, $len) eq $hash_out); } elsif ($mode == 15100) { $hash_out = gen_hash ($mode, $word, $salt, $iter, $param); $len = length $hash_out; return unless (substr ($line, 0, $len) eq $hash_out); } elsif ($mode == 15200) { # 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 => 5000, 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; } elsif ($mode == 15300 || $mode == 15900) { $hash_out = gen_hash ($mode, $word, $salt, $iter, $param); $len = length $hash_out; return unless (substr ($line, 0, $len) eq $hash_out); } elsif ($mode == 15400) { $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 == 15500) { $hash_out = gen_hash ($mode, $word, undef, undef, $param, $param2, $param3); $len = length $hash_out; return unless (substr ($line, 0, $len) eq $hash_out); } elsif ($mode == 15600) { $hash_out = gen_hash ($mode, $word, $salt, $iter, $param); $len = length $hash_out; return unless (substr ($line, 0, $len) eq $hash_out); } elsif ($mode == 15700) { $hash_out = gen_hash ($mode, $word, $salt, 0, $param, $param2, $param3, $param4); $len = length $hash_out; return unless (substr ($line, 0, $len) eq $hash_out); } 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) { # hashcat 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) > 256; ## ## 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 == 133 || $mode == 200 || $mode == 300 || $mode == 600 || $mode == 900 || $mode == 1000 || $mode == 1300 || $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 || $mode == 13300 || $mode == 99999) { $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 == 1411 || $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) { $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, 11); $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) { next if length ($word_buf) > 30; $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 == 125) { $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 8)); } 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) > 12; my $salt_len = get_random_num (1, 4); $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) { next if length ($word_buf) > 30; $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 == 12001 || $mode == 12200 || $mode == 15600) { $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 == 4520) { my $salt_len = get_random_num (1, 50); $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); } elsif ($mode == 4521 || $mode == 15700) { $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 32)); } elsif ($mode == 4522) { $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 12)); } 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 == 7000) { next if length ($word_buf) > 19; $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 24)); } 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) { 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 == 9700 || $mode == 9800) { 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 == 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 == 12300) { $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 32)); } elsif ($mode == 12400) { $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 4)); } elsif ($mode == 12600 || $mode == 15000) { $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)); } elsif ($mode == 12900) { $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 32)); } elsif ($mode == 13000) { $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 32)); } elsif ($mode == 13100) { $salt_buf = get_random_kerberos5_tgs_salt (); $tmp_hash = gen_hash ($mode, $word_buf, $salt_buf); } elsif ($mode == 13200) { $salt_buf = get_random_axcrypt_salt (); $tmp_hash = gen_hash ($mode, $word_buf, $salt_buf); } elsif ($mode == 13400) { $salt_buf = get_random_keepass_salt (); $tmp_hash = gen_hash ($mode, $word_buf, $salt_buf); } elsif ($mode == 13500) { $salt_buf = get_pstoken_salt (); $tmp_hash = gen_hash ($mode, $word_buf, $salt_buf); } elsif ($mode == 13600) { $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 32)); } elsif ($mode == 13800) { $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 256)); } elsif ($mode == 13900) { $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 9)); } elsif ($mode == 14000) { next if length ($word_buf) != 8; $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 16)); } elsif ($mode == 14100) { next if length ($word_buf) != 24; $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 16)); } elsif ($mode == 14400) { $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 20)); } elsif (($mode == 14700) || ($mode == 14800)) { $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 40)); } elsif ($mode == 14900) { next if length ($word_buf) != 10; $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 8)); } elsif ($mode == 15100) { $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 8)); } elsif ($mode == 15200) { $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 32)); } elsif ($mode == 15300 || $mode == 15900) { my $version = 2; if ($mode == 15300) { $version = 1; } $salt_buf = get_random_dpapimk_salt ($version); $tmp_hash = gen_hash ($mode, $word_buf, $salt_buf); } elsif ($mode == 15400) { next if length ($word_buf) != 32; $tmp_hash = gen_hash ($mode, $word_buf, ""); } elsif ($mode == 15500) { $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 40)); } 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 == 133 || $mode == 200 || $mode == 300 || $mode == 600 || $mode == 900 || $mode == 1000 || $mode == 1300 || $mode == 1400 || $mode == 1700 || $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 || $mode == 13300 || $mode == 99999) { 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 == 1411 || $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 == 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) { 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 == 125 || $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 < 31; $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 == 12001 || $mode == 12200 || $mode == 15600) { 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 == 2400) { for (my $i = 1; $i < 16; $i++) { if ($len != 0) { rnd ($mode, $len, 0); } else { rnd ($mode, $i, 0); } } } elsif ($mode == 2410) { my $salt_len = get_random_num (1, 4); 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++) { 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 < 31; $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 == 4520) { my $salt_len = get_random_num (1, 50); for (my $i = 1; $i < 32; $i++) { if ($len != 0) { rnd ($mode, $len, $salt_len); } else { rnd ($mode, $i, $salt_len); } } } elsif ($mode == 4521 || $mode == 15700) { for (my $i = 1; $i < 32; $i++) { if ($len != 0) { rnd ($mode, $len, 32); } else { rnd ($mode, $i, 32); } } } elsif ($mode == 4522) { for (my $i = 1; $i < 32; $i++) { if ($len != 0) { rnd ($mode, $len, 12); } else { rnd ($mode, $i, 12); } } } 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 == 7000) { for (my $i = 1; $i < 19; $i++) { if ($len != 0) { rnd ($mode, $len, 24); } else { rnd ($mode, $i, 24); } } } 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 || $mode == 14700 || $mode == 14800) { 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) { 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 == 9700 || $mode == 9800) { 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 == 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 == 12300) { for (my $i = 1; $i < 32; $i++) { if ($len != 0) { rnd ($mode, $len, 32); } else { rnd ($mode, $i, 32); } } } 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 || $mode == 15000) { 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); } } } elsif ($mode == 12900) { for (my $i = 1; $i < 32; $i++) { if ($len != 0) { rnd ($mode, $len, 32); } else { rnd ($mode, $i, 32); } } } elsif ($mode == 13000) { for (my $i = 1; $i < 32; $i++) { if ($len != 0) { rnd ($mode, $len, 32); } else { rnd ($mode, $i, 32); } } } elsif ($mode == 13100) { for (my $i = 1; $i < 27; $i++) { if ($len != 0) { rnd ($mode, $len, 16); } else { rnd ($mode, $i, 16); } } } elsif ($mode == 13200) { for (my $i = 1; $i < 32; $i++) { if ($len != 0) { rnd ($mode, $len, 32); } else { rnd ($mode, $i, 32); } } } elsif ($mode == 13400) { for (my $i = 1; $i < 16; $i++) { if ($len != 0) { rnd ($mode, $len, 16); } else { rnd ($mode, $i, 16); } } } elsif ($mode == 13500) { for (my $i = 1; $i < 16; $i++) { if ($len != 0) { rnd ($mode, $len, 16); } else { rnd ($mode, $i, 16); } } } elsif ($mode == 13600) { for (my $i = 1; $i < 16; $i++) { if ($len != 0) { rnd ($mode, $len, 32); } else { rnd ($mode, $i, 32); } } } elsif ($mode == 13800) { for (my $i = 1; $i < 32; $i++) { if ($len != 0) { rnd ($mode, $len, 256); } else { rnd ($mode, $i, 256); } } } elsif ($mode == 13900) { for (my $i = 1; $i < 32; $i++) { if ($len != 0) { rnd ($mode, $len, 9); } else { rnd ($mode, $i, 9); } } } elsif ($mode == 14000) { rnd ($mode, 8, 16); } elsif ($mode == 14100) { rnd ($mode, 24, 16); } elsif ($mode == 14400) { for (my $i = 1; $i < 24; $i++) { if ($len != 0) { rnd ($mode, $len, 20); } else { rnd ($mode, $i, 20); } } } elsif ($mode == 14900) { rnd ($mode, 10, 8); } elsif ($mode == 15100) { for (my $i = 1; $i < 32; $i++) { if ($len != 0) { rnd ($mode, $len, 8); } else { rnd ($mode, $i, 8); } } } elsif ($mode == 15200) { for (my $i = 1; $i < 32; $i++) { if ($len != 0) { rnd ($mode, $len, 32); } else { rnd ($mode, $i, 32); } } } elsif ($mode == 15300 || $mode == 15900) { for (my $i = 1; $i < 16; $i++) { if ($len != 0) { rnd ($mode, $len, 16); } else { rnd ($mode, $i, 16); } } } elsif ($mode == 15400) { rnd ($mode, 32, 0); } elsif ($mode == 15500) { for (my $i = 1; $i < 16; $i++) { if ($len != 0) { rnd ($mode, $len, 40); } else { rnd ($mode, $i, 40); } } } } } 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, ""); $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, ""); $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 == 125) { my $signature = "01"; my $salt_buf_bin = pack ("H*", $salt_buf . $signature); $hash_buf = sha1_hex ($salt_buf_bin . $word_buf); $tmp_hash = sprintf ("%s%s%s", $salt_buf, $signature, $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 == 133) { $hash_buf = sha1 (encode ("UTF-16LE", $word_buf)); $hash_buf = encode_base64 ($hash_buf, ""); $tmp_hash = sprintf ("%s", $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, ""); 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 == 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 == 600) { $hash_buf = lc blake2b_hex ($word_buf); $tmp_hash = sprintf ("\$BLAKE2\$" . $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 == 1300) { $hash_buf = sha224_hex ($word_buf); $tmp_hash = sprintf ("%s", $hash_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 == 1411) { $hash_buf = sha256_hex ($word_buf . $salt_buf); my $base64_buf = encode_base64 (pack ("H*", $hash_buf) . $salt_buf, ""); $tmp_hash = sprintf ("{SSHA256}%s", $base64_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, ""); my $base64_hash_buf = encode_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 || $mode == 15000) { $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, ""); $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) { my $hash_buf = Digest::MD5::md5 ($word_buf . "\0" x (16 - length ($word_buf))); $tmp_hash = sprintf ("%s", pseudo_base64 ($hash_buf)); } elsif ($mode == 2410) { my $hash_buf = Digest::MD5::md5 ($word_buf . $salt_buf . "\0" x (16 - length ($word_buf) - length ($salt_buf))); $tmp_hash = sprintf ("%s:%s", pseudo_base64 ($hash_buf), $salt_buf); } elsif ($mode == 2500) { my ($bssid, $stmac, $snonce, $anonce, $eapol, $keyver, $eapol_len, $essid_len); if (! defined ($additional_param)) { # random stuff $bssid = randbytes (6); $stmac = randbytes (6); $snonce = randbytes (32); $anonce = randbytes (32); $keyver = get_random_num (1, 4); # 1, 2 or 3 # 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_len = 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 ($keyver, $pmk, $stmac, $bssid, $snonce, $anonce); # generate the Message Integrity Code (MIC) my $mic = ""; if ($keyver == 1) # WPA1 => MD5 { $mic = hmac ($eapol, $ptk, \&md5); } elsif ($keyver == 2) # WPA2 => SHA1 { $mic = hmac ($eapol, $ptk, \&sha1); } elsif ($keyver == 3) # WPA2 => SHA256 + AES-CMAC { my $omac1 = Digest::CMAC->new ($ptk, 'Crypt::Rijndael'); $omac1->add ($eapol); $mic = $omac1->digest; } $mic = substr ($mic, 0, 16); # # format the binary output # my $HCCAPX_VERSION = 4; # signature $hash_buf = "HCPX"; # format version $hash_buf .= pack ("L<", $HCCAPX_VERSION); # authenticated $hash_buf .= pack ("C", 0); # essid length $essid_len = length ($salt_buf); $hash_buf .= pack ("C", $essid_len); # essid (NULL-padded up to the first 32 bytes) $hash_buf .= $salt_buf; $hash_buf .= "\x00" x (32 - $essid_len); # key version $hash_buf .= pack ("C", $keyver); # key mic $hash_buf .= $mic; # access point MAC $hash_buf .= $bssid; # access point nonce $hash_buf .= $snonce; # client MAC $hash_buf .= $stmac; # client nonce $hash_buf .= $anonce; # eapol length $hash_buf .= pack ("S<", $eapol_len); # eapol $hash_buf .= $eapol; $hash_buf .= "\x00" x (256 - $eapol_len); # 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 == 4520) || ($mode == 4521) || ($mode == 4522)) { $hash_buf = sha1_hex ($salt_buf . sha1_hex ($word_buf)); $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_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, "none"); $ntresp .= Crypt::ECB::encrypt (setup_des_key (substr ($nthash, 7, 7)), "DES", $challenge, "none"); $ntresp .= Crypt::ECB::encrypt (setup_des_key (substr ($nthash, 14, 7)), "DES", $challenge, "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 == 7000) { my $FORTIGATE_SIGNATURE = "AK1"; my $FORTIGATE_MAGIC = pack ("H*", "a388ba2e424cb04a537930c13107cc3fa1329029a9815b70"); my $salt_bin = pack ("H*", $salt_buf); my $hash = sha1 ($salt_bin . $word_buf . $FORTIGATE_MAGIC); $hash = encode_base64 ($salt_bin . $hash, ""); $tmp_hash = sprintf ("%s%s", $FORTIGATE_SIGNATURE, $hash); } 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; 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 == 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 || $mode == 13900) { $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); 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), ""); $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, ""); 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, ""); $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, ""); $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), ""); my $base64_salt_buf = encode_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, ""); my $salt_buf_base64 = encode_base64 ($salt_buf, ""); # 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, ""); my $base64_salt_buf = encode_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), ""); my $base64_salt_buf = encode_base64 ($salt_buf, ""); $tmp_hash = sprintf ("sha1:%i:%s:%s", $iterations, $base64_salt_buf, $hash_buf); } elsif ($mode == 12001) { my $pbkdf2 = Crypt::PBKDF2->new ( hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA1'), iterations => 10000, output_len => 32 ); my $base64_buf = encode_base64 ($salt_buf . $pbkdf2->PBKDF2 ($salt_buf, $word_buf), ""); $tmp_hash = sprintf ("{PKCS5S2}%s", $base64_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), ""); my $base64_salt_buf = encode_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)); } elsif ($mode == 12900) { my $iterations = 4096; if (length ($iter)) { $iterations = int ($iter); } my $salt2 = $salt_buf . $salt_buf; if (defined $additional_param) { $salt2 = $additional_param; } 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, $word_buf); my $salt2_bin = pack ("H*", $salt2); my $hash_hmac = hmac_hex ($salt2_bin, $hash, \&sha256, 64); $tmp_hash = sprintf ("%s%s%s", $salt2, $hash_hmac, $salt_buf); } elsif ($mode == 13000) { my $iterations = 15; if (length ($iter)) { $iterations = int ($iter); } my $iv = "0" x 32; if (defined $additional_param) { $iv = $additional_param; } my $pbkdf2 = Crypt::PBKDF2->new ( hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256), iterations => (1 << $iterations) + 32, output_len => 32 ); my $salt_buf_bin = pack ("H*", $salt_buf); my $hash = $pbkdf2->PBKDF2 ($salt_buf_bin, $word_buf); my $hash_final = substr ($hash, 0, 8) ^ substr ($hash, 8, 8) ^ substr ($hash, 16, 8) ^ substr ($hash, 24, 8); $tmp_hash = sprintf ('$rar5$16$%s$%d$%s$8$%s', $salt_buf, $iterations, $iv, unpack ("H*", $hash_final)); } elsif ($mode == 13100) { my @salt_arr = split ('\$', $salt_buf); my $user = $salt_arr[0]; my $realm = $salt_arr[1]; my $spn = $salt_arr[2]; my $k = md4 (encode ("UTF-16LE", $word_buf)); my $k1 = hmac_md5 ("\x02\x00\x00\x00", $k); my $cleartext_ticket = '6381b03081ada00703050050a00000a11b3019a003020117a1'. '12041058e0d77776e8b8e03991f2966939222aa2171b154d594b5242544553542e434f4e5'. '44f534f2e434f4da3133011a003020102a10a30081b067472616e6365a40b3009a0030201'. '01a1020400a511180f32303136303231353134343735305aa611180f32303136303231353'. '134343735305aa711180f32303136303231363030343735305aa811180f32303136303232'. '323134343735305a'; my $checksum = ""; if (defined $additional_param) { $checksum = pack ("H*", $additional_param); } else { my $nonce = $salt_arr[3]; $cleartext_ticket = $nonce . $cleartext_ticket; $checksum = hmac_md5 (pack ("H*", $cleartext_ticket), $k1); } my $k3 = hmac_md5 ($checksum, $k1); my $edata2 = ""; if (defined $additional_param2) { $edata2 = $additional_param2; my $cipher_decrypt = Crypt::RC4->new ($k3); my $ticket_decrypt = unpack ("H*", $cipher_decrypt->RC4 (pack ("H*", $edata2))); my $check_correct = ((substr ($ticket_decrypt, 16, 4) eq "6381" && substr ($ticket_decrypt, 22, 2) eq "30") || (substr ($ticket_decrypt, 16, 4) eq "6382")) && ((substr ($ticket_decrypt, 32, 6) eq "030500") || (substr ($ticket_decrypt, 32, 8) eq "050307A0")); if ($check_correct == 1) { $cleartext_ticket = $ticket_decrypt; } else # validation failed { # fake/wrong ticket (otherwise if we just decrypt/encrypt we end up with false positives all the time) $cleartext_ticket = "0" x (length ($cleartext_ticket) + 16); } } my $cipher = Crypt::RC4->new ($k3); $edata2 = $cipher->RC4 (pack ("H*", $cleartext_ticket)); $tmp_hash = sprintf ('$krb5tgs$23$*%s$%s$%s*$%s$%s', $user, $realm, $spn, unpack ("H*", $checksum), unpack ("H*", $edata2)); } elsif ($mode == 13200) { my @salt_arr = split ('\*', $salt_buf); my $iteration = $salt_arr[0]; my $mysalt = $salt_arr[1]; $mysalt = pack ("H*", $mysalt); my $iv = "a6a6a6a6a6a6a6a6"; my $KEK = sha1 ($word_buf); $KEK = substr ($KEK ^ $mysalt, 0, 16); my $aes = Crypt::Mode::ECB->new ('AES'); my $B; my $A; my @R = (); if (defined $additional_param) { $additional_param = pack ("H*", $additional_param); $A = substr ($additional_param, 0, 8); $B = 0x00 x 8; $R[1] = substr ($additional_param, 8, 8); $R[2] = substr ($additional_param, 16, 8); for (my $j = $iteration - 1; $j >= 0; $j--) { $A = substr ($A, 0, 8) ^ pack ("l", (2 * $j + 2)); $B = $R[2]; $A = $aes->decrypt ($A . $B . "\x00" x 16, $KEK); $R[2] = substr ($A, 8, 16); $A = substr ($A, 0, 8) ^ pack ("l", (2 * $j + 1)); $B = $R[1]; $A = $aes->decrypt ($A . $B . "\x00" x 16, $KEK); $R[1] = substr ($A, 8, 16); } # check if valid if (index ($A, "\xa6\xa6\xa6\xa6\xa6\xa6\xa6\xa6") != 0) { # fake wrong @R and $A values @R = ('', "\x00" x 8, "\x00" x 8); $A = "\x00" x 16; } } else { my $DEK = randbytes (16); @R = ('', substr (pack ("H*", $DEK), 0, 8), substr (pack ("H*", $DEK), 8, 16)); $A = pack ("H*", $iv); } for (my $j = 0; $j < $iteration; $j++) { $B = $aes->encrypt ($A . $R[1], $KEK); $A = substr ($B, 0, 8) ^ pack ("q", (2 * $j + 1)); $R[1] = substr ($B, 8, 16); $B = $aes->encrypt ($A . $R[2], $KEK); $A = substr ($B, 0, 8) ^ pack ("q", (2 * $j + 2)); $R[2] = substr ($B, 8, 16); } my $wrapped_key = unpack ("H*", $A . substr ($R[1], 0 ,8) . substr ($R[2], 0 ,8)); $mysalt = unpack ("H*", $mysalt); $tmp_hash = sprintf ('$axcrypt$*1*%s*%s*%s', $iteration, $mysalt, $wrapped_key); } elsif ($mode == 13300) { my $length = 32; if ($additional_param) { $length = $additional_param; } $hash_buf = sha1_hex ($word_buf); $tmp_hash = sprintf ('$axcrypt_sha1$%s', substr ($hash_buf, 0, $length)); } elsif ($mode == 13400) { my @salt_arr = split ('\*', $salt_buf); my $version = $salt_arr[0]; my $iteration = $salt_arr[1]; my $algorithm = $salt_arr[2]; my $final_random_seed = $salt_arr[3]; my $transf_random_seed = $salt_arr[4]; my $enc_iv = $salt_arr[5]; my $contents_hash; # specific to version 1 my $inline_flag; my $contents_len; my $contents; # specific to version 2 my $expected_bytes; # specific to keyfile handling my $inline_keyfile_flag; my $keyfile_len; my $keyfile_content; my $keyfile_attributes = ""; $final_random_seed = pack ("H*", $final_random_seed); $transf_random_seed = pack ("H*", $transf_random_seed); $enc_iv = pack ("H*", $enc_iv); my $intermediate_hash = sha256 ($word_buf); if ($version == 1) { $contents_hash = $salt_arr[6]; $contents_hash = pack ("H*", $contents_hash); $inline_flag = $salt_arr[7]; $contents_len = $salt_arr[8]; $contents = $salt_arr[9]; $contents = pack ("H*", $contents); # keyfile handling if (scalar @salt_arr == 13) { $inline_keyfile_flag = $salt_arr[10]; $keyfile_len = $salt_arr[11]; $keyfile_content = $salt_arr[12]; $keyfile_attributes = $keyfile_attributes . "*" . $inline_keyfile_flag . "*" . $keyfile_len . "*" . $keyfile_content; $intermediate_hash = $intermediate_hash . pack ("H*", $keyfile_content); $intermediate_hash = sha256 ($intermediate_hash); } } elsif ($version == 2) { # keyfile handling if (scalar @salt_arr == 11) { $inline_keyfile_flag = $salt_arr[8]; $keyfile_len = $salt_arr[9]; $keyfile_content = $salt_arr[10]; $intermediate_hash = $intermediate_hash . pack ("H*", $keyfile_content); $keyfile_attributes = $keyfile_attributes . "*" . $inline_keyfile_flag . "*" . $keyfile_len . "*" . $keyfile_content; } $intermediate_hash = sha256 ($intermediate_hash); } my $aes = Crypt::Mode::ECB->new ('AES', 1); for (my $j = 0; $j < $iteration; $j++) { $intermediate_hash = $aes->encrypt ($intermediate_hash, $transf_random_seed); $intermediate_hash = substr ($intermediate_hash, 0, 32); } $intermediate_hash = sha256 ($intermediate_hash); my $final_key = sha256 ($final_random_seed . $intermediate_hash); my $final_algorithm; if ($version == 1 && $algorithm == 1) { $final_algorithm = "Crypt::Twofish"; } else { $final_algorithm = "Crypt::Rijndael"; } my $cipher = Crypt::CBC->new ({ key => $final_key, cipher => $final_algorithm, iv => $enc_iv, literal_key => 1, header => "none", keysize => 32 }); if ($version == 1) { if (defined $additional_param) { # if we try to verify the crack, we need to decrypt the contents instead of only encrypting it: $contents = $cipher->decrypt ($contents); # and check the output my $contents_hash_old = $contents_hash; $contents_hash = sha256 ($contents); if ($contents_hash_old ne $contents_hash) { # fake content $contents = "\x00" x length ($contents); } } else { $contents_hash = sha256 ($contents); } $contents = $cipher->encrypt ($contents); $tmp_hash = sprintf ('$keepass$*%d*%d*%d*%s*%s*%s*%s*%d*%d*%s%s', $version, $iteration, $algorithm, unpack ("H*", $final_random_seed), unpack ("H*", $transf_random_seed), unpack ("H*", $enc_iv), unpack ("H*", $contents_hash), $inline_flag, $contents_len, unpack ("H*", $contents), $keyfile_attributes); } if ($version == 2) { $expected_bytes = $salt_arr[6]; $contents_hash = $salt_arr[7]; $contents_hash = pack ("H*", $contents_hash); $expected_bytes = $cipher->decrypt ($contents_hash); $tmp_hash = sprintf ('$keepass$*%d*%d*%d*%s*%s*%s*%s*%s%s', $version, $iteration, $algorithm, unpack ("H*", $final_random_seed), unpack ("H*", $transf_random_seed), unpack ("H*", $enc_iv), unpack ("H*", $expected_bytes), unpack ("H*", $contents_hash), $keyfile_attributes); } } elsif ($mode == 13500) { $hash_buf = sha1_hex (pack ("H*", $salt_buf) . encode ("UTF-16LE", $word_buf)); $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); } elsif ($mode == 13600) { my $iterations = 1000; my $type = 0; if (defined $additional_param) { $type = $additional_param; } my $mode = 1 + int rand (3); if (defined $additional_param2) { $mode = $additional_param2; } my $magic = 0; if (defined $additional_param3) { $magic = $additional_param3; } if (defined $additional_param4) { $salt_buf = $additional_param4; } $salt_buf = substr ($salt_buf, 0, 8 + ($mode * 8)); my $compress_length = 0; if (defined $additional_param5) { $compress_length = $additional_param5; } my $data = ""; if (defined $additional_param6) { $data = $additional_param6; } my $key_len = (8 * ($mode & 3) + 8) * 2; my $out_len = $key_len + 2; 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 => $out_len ); my $key = $pbkdf2->PBKDF2_hex ($salt_buf_bin, $word_buf); my $verify_bytes = substr ($key, -4); $verify_bytes =~ s/^0+//; #lol $key = substr ($key, $key_len, $key_len); my $key_bin = pack ("H*", $key); my $auth = hmac_hex ($data, $key_bin, \&sha1, 64); $tmp_hash = sprintf ('$zip2$*%u*%u*%u*%s*%s*%u*%s*%s*$/zip2$', $type, $mode, $magic, $salt_buf, $verify_bytes, $compress_length, $data, substr ($auth, 0, 20)); } elsif ($mode == 13800) { my $word_buf_utf16le = encode ("UTF-16LE", $word_buf); my $salt_buf_bin = pack ("H*", $salt_buf); $hash_buf = sha256_hex ($word_buf_utf16le . $salt_buf_bin); $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); } elsif ($mode == 14000) { my $salt_buf_bin = pack ("H*", $salt_buf); my $cipher = new Crypt::DES $word_buf; my $hash_buf = $cipher->encrypt ($salt_buf_bin); $tmp_hash = sprintf ("%s:%s", unpack ("H*", $hash_buf), $salt_buf); } elsif ($mode == 14100) { my $word_buf1 = substr ($word_buf, 0, 8); my $word_buf2 = substr ($word_buf, 8, 8); my $word_buf3 = substr ($word_buf, 16, 8); my $salt_buf_bin = pack ("H*", $salt_buf); my $cipher1 = new Crypt::DES $word_buf1; my $hash_buf1 = $cipher1->encrypt ($salt_buf_bin); my $cipher2 = new Crypt::DES $word_buf2; my $hash_buf2 = $cipher2->decrypt ($hash_buf1); my $cipher3 = new Crypt::DES $word_buf3; my $hash_buf3 = $cipher3->encrypt ($hash_buf2); $tmp_hash = sprintf ("%s:%s", unpack ("H*", $hash_buf3), $salt_buf); } elsif ($mode == 14400) { my $begin = "--" . $salt_buf . "--"; my $end = "--" . $word_buf . "----"; my $hash_buf = sha1_hex ($begin . $end); for (my $round = 1; $round < 10; $round++) { $hash_buf = sha1_hex ($begin . $hash_buf . $end); } $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); } elsif ($mode == 14700) { my $iterations = 10000; if (length ($iter)) { $iterations = int ($iter); } my $pbkdf2 = Crypt::PBKDF2->new ( hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA1'), iterations => $iterations, output_len => 32 ); $salt_buf = pack ("H*", $salt_buf); my $key = $pbkdf2->PBKDF2 ($salt_buf, $word_buf); my $ITUNES_BACKUP_KEY = 12008468691120727718; my $WPKY = "\x00" x 40; if (defined $additional_param) { my ($A, $R) = itunes_aes_unwrap ($key, $additional_param); if ($A == $ITUNES_BACKUP_KEY) { $WPKY = itunes_aes_wrap ($key, $A, $R); } } else { my $max_number = 18446744073709551615; # 0xffffffffffffffff my @R; for (my $i = 0; $i < 4; $i++) { $R[$i] = get_random_num (0, $max_number); } $WPKY = itunes_aes_wrap ($key, $ITUNES_BACKUP_KEY, \@R); } $tmp_hash = sprintf ("\$itunes_backup\$*9*%s*%i*%s**", unpack ("H*", $WPKY), $iterations, unpack ("H*", $salt_buf)); } elsif ($mode == 14800) { my $iterations = 10000; if (length ($iter)) { $iterations = int ($iter); } my $pbkdf2 = Crypt::PBKDF2->new ( hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA1'), iterations => $iterations, output_len => 32 ); $salt_buf = pack ("H*", $salt_buf); my $ITUNES_BACKUP_KEY = 12008468691120727718; my $DPIC; my $DPSL; if (defined $additional_param) { $DPIC = $additional_param2; $DPSL = $additional_param3; } else { #$DPIC = 10000000; it's too much for the tests $DPIC = 1000; $DPSL = randbytes (20); } my $WPKY = "\x00" x 40; my $pbkdf2x = Crypt::PBKDF2->new ( hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2'), iterations => $DPIC, output_len => 32 ); my $key_dpsl = $pbkdf2x->PBKDF2 ($DPSL, $word_buf); my $key = $pbkdf2->PBKDF2 ($salt_buf, $key_dpsl); if (defined $additional_param) { my ($A, $R) = itunes_aes_unwrap ($key, $additional_param); if ($A == $ITUNES_BACKUP_KEY) { $WPKY = itunes_aes_wrap ($key, $A, $R); } } else { my $max_number = 18446744073709551615; # 0xffffffffffffffff my @R; for (my $i = 0; $i < 4; $i++) { $R[$i] = get_random_num (0, $max_number); } $WPKY = itunes_aes_wrap ($key, $ITUNES_BACKUP_KEY, \@R); } $tmp_hash = sprintf ("\$itunes_backup\$*10*%s*%i*%s*%i*%s", unpack ("H*", $WPKY), $iterations, unpack ("H*", $salt_buf), $DPIC, unpack ("H*", $DPSL)); } elsif ($mode == 14900) { my $salt_bin = pack ("H*", $salt_buf); my $skip32 = Crypt::Skip32->new ($word_buf); my $hash = $skip32->encrypt ($salt_bin); $tmp_hash = sprintf ("%08x:%s", unpack ("N*", $hash), $salt_buf); } elsif ($mode == 15100) { my $iterations = 20000; if (defined ($iter)) { $iterations = $iter; } my $pbkdf1_salt_buf = sprintf ('%s$sha1$%u', $salt_buf, $iterations); my $tmp = hmac ($pbkdf1_salt_buf, $word_buf, \&sha1, 64); for (my $r = 1; $r < $iterations; $r++) { $tmp = hmac ($tmp, $word_buf, \&sha1, 64); } my $hash_buf = ""; $hash_buf .= to64 ((int (ord (substr ($tmp, 0, 1))) << 16) | (int (ord (substr ($tmp, 1, 1))) << 8) | (int (ord (substr ($tmp, 2, 1)))), 4); $hash_buf .= to64 ((int (ord (substr ($tmp, 3, 1))) << 16) | (int (ord (substr ($tmp, 4, 1))) << 8) | (int (ord (substr ($tmp, 5, 1)))), 4); $hash_buf .= to64 ((int (ord (substr ($tmp, 6, 1))) << 16) | (int (ord (substr ($tmp, 7, 1))) << 8) | (int (ord (substr ($tmp, 8, 1)))), 4); $hash_buf .= to64 ((int (ord (substr ($tmp, 9, 1))) << 16) | (int (ord (substr ($tmp, 10, 1))) << 8) | (int (ord (substr ($tmp, 11, 1)))), 4); $hash_buf .= to64 ((int (ord (substr ($tmp, 12, 1))) << 16) | (int (ord (substr ($tmp, 13, 1))) << 8) | (int (ord (substr ($tmp, 14, 1)))), 4); $hash_buf .= to64 ((int (ord (substr ($tmp, 15, 1))) << 16) | (int (ord (substr ($tmp, 16, 1))) << 8) | (int (ord (substr ($tmp, 17, 1)))), 4); $hash_buf .= to64 ((int (ord (substr ($tmp, 18, 1))) << 16) | (int (ord (substr ($tmp, 19, 1))) << 8) | 0 , 4); ## super hackish, but we have no other choice, as this byte is kind of a random byte added to the digest when the hash was created if (defined $additional_param) { $hash_buf = substr ($hash_buf, 0, 24) . substr ($additional_param, 24, 4); } $tmp_hash = sprintf ("\$sha1\$%d\$%s\$%s", $iterations, $salt_buf, $hash_buf); } elsif ($mode == 15200) { my $iterations = 5000; if (defined ($iter)) { $iterations = $iter; } my $data = qq|{ "guid" : "00000000-0000-0000-0000-000000000000", "sharedKey" : "00000000-0000-0000-0000-000000000000", "options" : {"pbkdf2_iterations":$iterations,"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\$v2\$%d\$%s\$%s", $iterations, length ($salt_buf . $encrypted) / 2, $salt_buf . $encrypted); } elsif ($mode == 15300 || $mode == 15900) { my @salt_arr = split ('\*', $salt_buf); my $version = $salt_arr[0]; my $context = $salt_arr[1]; my $SID = $salt_arr[2]; my $cipher_algorithm = $salt_arr[3]; my $hash_algorithm = $salt_arr[4]; my $iterations = $salt_arr[5]; my $salt = pack ("H*", $salt_arr[6]); my $cipher_len = $salt_arr[7]; my $cipher; # intermediate values my $user_hash; my $user_derivationKey; my $encKey; my $expected_hmac; my $cleartext; if ($context == 1) { $user_hash = sha1 (encode ("UTF-16LE", $word_buf)); } elsif ($context == 2) { $user_hash = md4 (encode ("UTF-16LE", $word_buf)); } $user_derivationKey = hmac_sha1 (encode ("UTF-16LE", $SID . "\x00"), $user_hash); my $hmacSalt = randbytes (16); my $last_key = randbytes (64); if ($version == 1) { $encKey = hmac_sha1 ($hmacSalt, $user_derivationKey); $expected_hmac = hmac_sha1 ($last_key, $encKey); # need padding because keyLen is 24 and hashLen 20 $expected_hmac = $expected_hmac . randbytes (4); } elsif ($version == 2) { $encKey = hmac_sha512 ($hmacSalt, $user_derivationKey); $expected_hmac = hmac_sha512 ($last_key, $encKey); } $cleartext = $hmacSalt . $expected_hmac . $last_key; my $derived_key; my $key; my $iv; my $pbkdf2; if ($version == 1) { $derived_key = dpapi_pbkdf2 ($user_derivationKey, $salt, $iterations, 32, \&hmac_sha1); } elsif ($version == 2) { $derived_key = dpapi_pbkdf2 ($user_derivationKey, $salt, $iterations, 48, \&hmac_sha512); } if (defined $additional_param) { $cipher = pack ("H*", $additional_param); my $computed_hmac = ""; if ($version == 1) { $key = substr ($derived_key, 0, 24); $iv = substr ($derived_key, 24, 8); my $p1 = Crypt::ECB->new ({ key => substr ($key, 0, 8), cipher => "DES", literal_key => 1, header => "none", keysize => 8, padding => "null", }); my $p2 = Crypt::ECB->new ({ key => substr ($key, 8, 8), cipher => "DES", literal_key => 1, header => "none", keysize => 8, padding => "null", }); my $p3 = Crypt::ECB->new ({ key => substr ($key, 16, 8), cipher => "DES", literal_key => 1, header => "none", keysize => 8, padding => "null", }); # let's compute a 3DES-EDE-CBC decryption my $out1; my $out2; my $out3; my $expected_cleartext = ""; # size of cipherlen is 104 bytes for (my $k = 0; $k < 13; $k++) { $out1 = $p3->decrypt (substr ($cipher, $k * 8, 8)); $out2 = $p2->encrypt ($out1); $out3 = $p1->decrypt ($out2); $expected_cleartext .= substr ($out3, 0, 8) ^ $iv; $iv = substr ($cipher, $k * 8, 8); } $last_key = substr ($expected_cleartext, length ($expected_cleartext) - 64, 64); $hmacSalt = substr ($expected_cleartext, 0, 16); $expected_hmac = substr ($expected_cleartext, 16, 20); $encKey = hmac_sha1 ($hmacSalt, $user_derivationKey); $computed_hmac = hmac_sha1 ($last_key, $encKey); $cleartext = $expected_cleartext; if (unpack ("H*", $expected_hmac) ne unpack ("H*", $computed_hmac)) { $cleartext = "0" x 104; } } elsif ($version == 2) { $key = substr ($derived_key, 0, 32); $iv = substr ($derived_key, 32, 16); my $aes = Crypt::CBC->new ({ key => $key, cipher => "Crypt::Rijndael", iv => $iv, literal_key => 1, header => "none", keysize => 32, padding => "null", }); my $expected_cleartext = $aes->decrypt ($cipher); $last_key = substr ($expected_cleartext, length ($expected_cleartext) - 64, 64); $hmacSalt = substr ($expected_cleartext, 0, 16); $expected_hmac = substr ($expected_cleartext, 16, 64); $encKey = hmac_sha512 ($hmacSalt, $user_derivationKey); $computed_hmac = hmac_sha512 ($last_key, $encKey); $cleartext = $expected_cleartext; if (unpack ("H*", $expected_hmac) ne unpack ("H*", $computed_hmac)) { $cleartext = "0" x 144; } } } if ($version == 1) { $key = substr ($derived_key, 0, 24); $iv = substr ($derived_key, 24, 8); my $p1 = Crypt::ECB->new ({ key => substr ($key, 0, 8), cipher => "DES", literal_key => 1, header => "none", keysize => 8, padding => "null", }); my $p2 = Crypt::ECB->new ({ key => substr ($key, 8, 8), cipher => "DES", literal_key => 1, header => "none", keysize => 8, padding => "null", }); my $p3 = Crypt::ECB->new ({ key => substr ($key, 16, 8), cipher => "DES", literal_key => 1, header => "none", keysize => 8, padding => "null", }); # let's compute a 3DES-EDE-CBC encryption # compute first block my $out1 = $p1->encrypt (substr ($cleartext, 0, 8) ^ $iv); my $out2 = $p2->decrypt ($out1); my $out3 = $p3->encrypt ($out2); $cipher = substr ($out3, 0, 8); # size of cipherlen is 104 bytes for (my $k = 1; $k < 13; $k++) { $iv = $out3; $out1 = $p1->encrypt (substr ($cleartext, $k * 8, 8) ^ $iv); $out2 = $p2->decrypt ($out1); $out3 = $p3->encrypt ($out2); $cipher .= substr ($out3, 0, 8); } } else { $key = substr ($derived_key, 0, 32); $iv = substr ($derived_key, 32, 16); my $aes = Crypt::CBC->new ({ key => $key, cipher => "Crypt::Rijndael", iv => $iv, literal_key => 1, header => "none", keysize => 32, padding => "null", }); $cipher = $aes->encrypt ($cleartext); } $tmp_hash = sprintf ('$DPAPImk$%d*%d*%s*%s*%s*%d*%s*%d*%s', $version, $context, $SID, $cipher_algorithm, $hash_algorithm, $iterations, unpack ("H*", $salt), $cipher_len, unpack ("H*", $cipher)); } elsif ($mode == 15400) { my $counter; my $offset; my $iv; if (defined $additional_param) { $counter = $additional_param; $offset = $additional_param2; $iv = $additional_param3; } else { $counter = "0400000000000003"; $offset = int (rand (63)); $iv = "0200000000000001"; } my $plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz0a2b4c6d8e"; my $eight_byte_iv = pack ("H*", $iv); my $eight_byte_counter = pack ("H*", $counter); my $pad_len = 32 - length ($word_buf); my $key = $word_buf . "\0" x $pad_len; my $cipher = Crypt::OpenSSH::ChachaPoly->new ($key); $cipher->ivsetup ($eight_byte_iv, $eight_byte_counter); my $enc = $cipher->encrypt ($plaintext); my $enc_offset = substr ($enc, $offset, 8); $hash_buf = $enc_offset; $tmp_hash = sprintf ("\$chacha20\$\*%s\*%d\*%s\*%s\*%s", $counter, $offset, $iv, unpack ("H*", substr ($plaintext, $offset, 8)), unpack ("H*", $enc_offset)); } elsif ($mode == 15500) { my $iv = pack ("H*", $salt_buf); if (length $additional_param) { $iv = pack ("H*", $additional_param); } my $enc_key = randbytes (get_random_num (1, 1500)); if (length $additional_param2) { $enc_key = pack ("H*", $additional_param2); } my $alias = "test"; if (length $additional_param3) { $alias = $additional_param3; } my $word_buf_utf16be = encode ("UTF-16BE", $word_buf); my $hash_buf = sha1 ($word_buf_utf16be . $iv); my $DER1 = substr ($hash_buf, 0, 1); my $DER2 = substr ($hash_buf, 6, 14); my @enc_key_data = split "", $enc_key; my $enc_key_data_length = scalar @enc_key_data; my @key_data = (); for (my $i = 0; $i < scalar $enc_key_data_length; $i += 20) { my @hash_buf_data = split "", $hash_buf; for (my $j = 0; $j < 20; $j++) { last if (($i + $j) >= $enc_key_data_length); $key_data[$i + $j] = $enc_key_data[$i + $j] ^ $hash_buf_data[$j]; } $hash_buf = sha1 ($word_buf_utf16be . $hash_buf); } my $key = join "", @key_data; $hash_buf = sha1 ($word_buf_utf16be . $key); $tmp_hash = sprintf ("\$jksprivk\$*%s*%s*%s*%s*%s*%s", uc unpack ("H*", $hash_buf), uc unpack ("H*", $iv), uc unpack ("H*", $enc_key), uc unpack ("H*", $DER1), uc unpack ("H*", $DER2), $alias); } elsif ($mode == 15600) { my $iterations; my $ciphertext; if (defined $additional_param) { $iterations = $iter; $ciphertext = $additional_param; } else { $iterations = 1024; # 262144 originally $ciphertext = randbytes (32); } my $pbkdf2 = Crypt::PBKDF2->new ( hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256), iterations => $iterations, out_len => 32 ); my $derived_key = $pbkdf2->PBKDF2 ($salt_buf, $word_buf); my $derived_key_cropped = substr ($derived_key, 16, 16); $hash_buf = keccak_256_hex ($derived_key_cropped . $ciphertext); $tmp_hash = sprintf ("\$ethereum\$p*%i*%s*%s*%s", $iterations, unpack ("H*", $salt_buf), unpack ("H*", $ciphertext), $hash_buf); } elsif ($mode == 15700) { my $scrypt_N; my $scrypt_r; my $scrypt_p; my $ciphertext; if (defined $additional_param) { $scrypt_N = $additional_param; $scrypt_r = $additional_param2; $scrypt_p = $additional_param3; $ciphertext = $additional_param4; } else { $scrypt_N = 1024; # 262144 originally $scrypt_r = 1; # 8 originally $scrypt_p = 1; $ciphertext = randbytes (32); } my $derived_key = scrypt_raw ($word_buf, $salt_buf, $scrypt_N, $scrypt_r, $scrypt_p, 32); my $derived_key_cropped = substr ($derived_key, 16, 16); $hash_buf = keccak_256_hex ($derived_key_cropped . $ciphertext); $tmp_hash = sprintf ("\$ethereum\$s*%i*%i*%i*%s*%s*%s", $scrypt_N, $scrypt_r, $scrypt_p, unpack ("H*", $salt_buf), unpack ("H*", $ciphertext), $hash_buf); } elsif ($mode == 99999) { $tmp_hash = sprintf ("%s", $word_buf); } return ($tmp_hash); } #Thanks to Jochen Hoenicke # (one of the authors of Palm Keyring) # for these next two subs. sub dpapi_pbkdf2 { my ($password, $salt, $iter, $keylen, $prf) = @_; my ($k, $t, $u, $ui, $i); $t = ""; for ($k = 1; length ($t) < $keylen; $k++) { $u = $ui = &$prf ($salt.pack ('N', $k), $password); for ($i = 1; $i < $iter; $i++) { # modification to fit Microsoft # weird pbkdf2 implementation... $ui = &$prf ($u, $password); $u ^= $ui; } $t .= $u; } return substr ($t, 0, $keylen); } sub rnd { my $mode = shift; my $word_len = shift; my $salt_len = shift; my $max = $MAX_LEN; if ($mode == 2400) { $word_len = min ($word_len, 16); } elsif ($mode == 2410) { $word_len = min ($word_len, 12); $salt_len = min ($salt_len, 4); } if ($is_utf16le{$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); } 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 (); } elsif ($mode == 13100) { $salt_buf = get_random_kerberos5_tgs_salt (); } elsif ($mode == 13200) { $salt_buf = get_random_axcrypt_salt (); } elsif ($mode == 13400) { $salt_buf = get_random_keepass_salt (); } elsif ($mode == 13500) { $salt_buf = get_pstoken_salt (); } elsif ($mode == 15300 || $mode == 15900) { my $version = 2; if ($mode == 15300) { $version = 1; } $salt_buf = get_random_dpapimk_salt ($version); } 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); if (($mode == 14000) || ($mode == 14100)) { $c &= 0xfe; } 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_kerberos5_tgs_salt { my $nonce = randbytes (8); my $user = "user"; my $realm = "realm"; my $spn = "test/spn"; my $salt_buf = $user . "\$" . $realm . "\$" . $spn . "\$" . unpack ("H*", $nonce); return $salt_buf; } sub get_random_axcrypt_salt { my $mysalt = randbytes (16); $mysalt = unpack ("H*", $mysalt); my $iteration = get_random_num (6, 100000); my $salt_buf = $iteration . '*' . $mysalt; return $salt_buf; } sub get_random_keepass_salt { my $version = get_random_num (1, 3); my $algorithm; my $iteration; my $final_random_seed; if ($version == 1) { $algorithm = get_random_num (0, 2); $iteration = get_random_num (50000, 100000); $final_random_seed = randbytes (16); $final_random_seed = unpack ("H*", $final_random_seed); } elsif ($version == 2) { $algorithm = 0; $iteration = get_random_num (6000, 100000); $final_random_seed = randbytes (32); $final_random_seed = unpack ("H*", $final_random_seed); } my $transf_random_seed = randbytes (32); $transf_random_seed = unpack ("H*", $transf_random_seed); my $enc_iv = randbytes (16); $enc_iv = unpack ("H*", $enc_iv); my $contents_hash = randbytes (32); $contents_hash = unpack ("H*", $contents_hash); my $inline_flag = 1; my $contents_len = get_random_num (128, 500); my $contents = randbytes ($contents_len); $contents_len += 16 - $contents_len % 16; $contents = unpack ("H*", $contents); my $salt_buf; my $is_keyfile = get_random_num (0, 2); my $keyfile_attributes = ""; if ($is_keyfile == 1) { $keyfile_attributes = $keyfile_attributes . "1*64*" . unpack ("H*", randbytes (32)); } if ($version == 1) { $salt_buf = $version . '*' . $iteration . '*' . $algorithm . '*' . $final_random_seed . '*' . $transf_random_seed . '*' . $enc_iv . '*' . $contents_hash . '*' . $inline_flag . '*' . $contents_len . '*' . $contents . '*' . $keyfile_attributes; } elsif ($version == 2) { $contents = randbytes (32); $contents = unpack ("H*", $contents); $salt_buf = $version . '*' . $iteration . '*' . $algorithm . '*' . $final_random_seed . '*' . $transf_random_seed . '*' . $enc_iv . '*' . $contents_hash . '*' . $contents . '*' . $keyfile_attributes; } return $salt_buf; } sub get_pstoken_salt { my $pstoken_length = get_random_num (16, 256); ## not a valid pstoken but a better test ## because of random length my $pstoken_const = randbytes ($pstoken_length); return unpack ("H*", $pstoken_const); } 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 get_random_dpapimk_salt { my $salt_buf = ""; my $version = shift; my $context = get_random_num (1, 3); my $cipher_algo = ""; my $hash_algo = ""; my $iterations; my $SID = sprintf ('S-15-21-%d-%d-%d-%d', get_random_num (400000000,490000000), get_random_num (400000000,490000000), get_random_num (400000000,490000000), get_random_num (1000,1999)); my $cipher_len = 0; if ($version == 1) { $iterations = get_random_num (4000, 24000); $cipher_algo = "des3"; $hash_algo = "sha1"; $cipher_len = 208; } elsif ($version == 2) { $iterations = get_random_num (8000, 17000); $cipher_algo = "aes256"; $hash_algo = "sha512"; $cipher_len = 288; } my $iv = randbytes (16); $iv = unpack ("H*", $iv); $salt_buf = $version . '*' . $context . '*' . $SID . '*' . $cipher_algo . '*' . $hash_algo . '*' . $iterations . '*' . $iv . '*' . $cipher_len . '*'; 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 @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_unicast_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 $keyver = shift; my $pmk = shift; my $stmac = shift; my $bssid = shift; my $snonce = shift; my $anonce = shift; my $data = "Pairwise key expansion"; if (($keyver == 1) || ($keyver == 2)) { $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; } my $prf_buf; if (($keyver == 1) || ($keyver == 2)) { $data .= "\x00"; $prf_buf = hmac ($data, $pmk, \&sha1); } else { my $data3 = "\x01\x00" . $data . "\x80\x01"; $prf_buf = hmac ($data3, $pmk, \&sha256); } $prf_buf = substr ($prf_buf, 0, 16); return $prf_buf; } sub itunes_aes_wrap { my $key = shift; my $A = shift; my $R_l = shift; my $k = scalar (@$R_l); my $n = $k + 1; my @R; for (my $i = 0; $i < $n; $i++) { $R[$i] = @$R_l[$i]; } # AES mode ECB my $m = Crypt::Mode::ECB->new ('AES', 0); # main wrap loop my ($i, $j, $a); for ($j = 0; $j <= 5; $j++) { for ($i = 1, $a = 0; $i <= $k; $i++, $a++) { my $input; $input = pack ("Q>", $A); $input .= pack ("Q>", $R[$a]); my $t = $m->encrypt ($input, $key); $A = unpack ("Q>", substr ($t, 0, 8)); $A ^= $k * $j + $i; $R[$a] = unpack ("Q>", substr ($t, 8, 8)); } } my $WPKY = pack ("Q>", $A); for (my $i = 0; $i < $k; $i++) { $WPKY .= pack ("Q>", $R[$i]); } return $WPKY; } sub itunes_aes_unwrap { my $key = shift; my $WPKY = shift; my @B; for (my $i = 0; $i < length ($WPKY) / 8; $i++) { $B[$i] = unpack ("Q>", substr ($WPKY, $i * 8, 8)); } my $n = scalar (@B); my $k = $n - 1; my @R; for (my $i = 0; $i < $k; $i++) { $R[$i] = $B[$i + 1]; } # AES mode ECB my $m = Crypt::Mode::ECB->new ('AES', 0); # main unwrap loop my $A = $B[0]; my ($i, $j, $a); for ($j = 5; $j >= 0; $j--) { for ($i = $k, $a = $k - 1; $i > 0; $i--, $a--) { my $input; $input = pack ("Q>", $A ^ ($k * $j + $i)); $input .= pack ("Q>", $R[$a]); my $t = $m->decrypt ($input, $key); $A = unpack ("Q>", substr ($t, 0, 8)); $R[$a] = unpack ("Q>", substr ($t, 8, 8)); } } return ($A, \@R); } 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; } hashcat-4.0.1/tools/test.sh000077500000000000000000001743641320027462700156270ustar00rootroot00000000000000#!/usr/bin/env bash ## ## Author......: See docs/credits.txt ## License.....: MIT ## TDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # missing hash types: 5200,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 125 130 131 132 133 140 141 150 160 200 300 400 500 600 900 1000 1100 1300 1400 1410 1411 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 3910 4010 4110 4300 4400 4500 4520 4521 4522 4700 4800 4900 5000 5100 5300 5400 5500 5600 5700 5800 6000 6100 6211 6212 6213 6221 6222 6223 6231 6232 6233 6241 6242 6243 6300 6400 6500 6600 6700 6800 6900 7000 7100 7200 7300 7400 7500 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 12001 12100 12200 12300 12400 12600 12700 12800 12900 13000 13100 13200 13300 13400 13500 13600 13800 13900 14000 14100 14400 14600 14700 14800 14900 15000 15100 15200 15300 15400 15500 15600 15700 15900 99999" #ATTACK_MODES="0 1 3 6 7" ATTACK_MODES="0 1 3 7" VECTOR_WIDTHS="1 2 4 8 16" MATCH_PASS_ONLY="2500 5300 5400 6600 6800 8200" HASHFILE_ONLY="2500" NEVER_CRACK="11600 14900" SLOW_ALGOS="400 500 501 1600 1800 2100 2500 3200 5200 5800 6211 6212 6213 6221 6222 6223 6231 6232 6233 6241 6242 6243 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 12001 12100 12200 12300 12400 12500 12700 12800 12900 13000 13200 13400 13600 14600 14700 14800 15100 15200 15300 15600 15700 15900" OPTS="--quiet --force --potfile-disable --runtime 400 --gpu-temp-disable" OUTD="test_$(date +%s)" PACKAGE_CMD="7z a" PACKAGE_FOLDER="" EXTRACT_CMD="7z x" 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 if [[ ${hash_type} -ge 6211 ]] && [[ ${hash_type} -le 6243 ]]; then return 0 fi if [[ ${hash_type} -eq 14600 ]]; then luks_tests_folder="${TDIR}/luks_tests/" if [ ! -d "${luks_tests_folder}" ]; then mkdir -p "${luks_tests_folder}" fi luks_first_test_file="${luks_tests_folder}/hashcat_ripemd160_aes_cbc-essiv_128.luks" if [ ! -f "${luks_first_test_file}" ]; then luks_tests="hashcat_luks_testfiles.7z" luks_tests_url="https://hashcat.net/misc/example_hashes/${luks_tests}" cd ${TDIR} # if the file already exists, but was not successfully extracted, we assume it's a broken # downloaded file and therefore it should be deleted if [ -f "${luks_tests}" ]; then rm -f "${luks_tests}" fi echo "" echo "ATTENTION: the luks test files (for -m ${hash_type}) are currently missing on your system." echo "They will be fetched from ${luks_tests_url}" echo "Note: this needs to be done only once and could take a little bit to download/extract." echo "These luks test files are not shipped directly with hashcat because the file sizes are" echo "particularily large and therefore a bandwidth burner for users who do not run these tests." echo "" # download: if ! wget -q "${luks_tests_url}" &> /dev/null; then cd - >/dev/null echo "ERROR: Could not fetch the luks test files from this url: ${luks_tests_url}" exit 1 fi # extract: ${EXTRACT_CMD} "${luks_tests}" &> /dev/null # cleanup: rm -f "${luks_tests}" cd - >/dev/null # just to be very sure, check again that (one of) the files now exist: if [ ! -f "${luks_first_test_file}" ]; then echo "ERROR: downloading and extracting ${luks_tests} into ${luks_tests_folder} did not complete successfully" exit 1 fi fi return 0 fi # create list of password and hashes of same type grep " ${hash_type} '" ${OUTD}/all.sh > ${OUTD}/${hash_type}.sh 2>/dev/null # 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 # minimum password length min=1 # minimum line number from start of the file min_offset=0 # minimum offset starting from ${min} lines if [ "${hash_type}" -eq 2500 ]; then min_offset=7 # means length 8, since we start with 0 elif [ "${hash_type}" -eq 14000 ]; then min=0 min_offset=4 elif [ "${hash_type}" -eq 14100 ]; then min=0 min_offset=3 elif [ "${hash_type}" -eq 14900 ]; then min=0 min_offset=5 elif [ "${hash_type}" -eq 15400 ]; then min=0 min_offset=3 fi # foreach password entry split password in 2 (skip first entry, is len 1) i=1 while read -u 9 pass; do if [ ${i} -gt ${min} ]; 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_offset})) p0=$((p0 + ${min_offset})) 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 elif [ "${hash_type}" -eq 14000 ]; then min_len=7 elif [ "${hash_type}" -eq 14100 ]; then min_len=23 elif [ "${hash_type}" -eq 14900 ]; then min_len=9 elif [ "${hash_type}" -eq 15400 ]; then min_len=31 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 ;; 4) 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, device-type ${TYPE}, vector-width ${VECTOR}." &>> ${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, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $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, Device-Type ${TYPE}, vector-width ${VECTOR}." &>> ${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, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $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 min=1 if [ "${hash_type}" -eq 14000 ]; then min=0 elif [ "${hash_type}" -eq 14100 ]; then min=0 elif [ "${hash_type}" -eq 14900 ]; then min=0 elif [ "${hash_type}" -eq 15400 ]; then min=0 fi echo "> Testing hash type $hash_type with attack mode 1, markov ${MARKOV}, single hash, Device-Type ${TYPE}, vector-width ${VECTOR}." &>> ${OUTD}/logfull.txt i=1 while read -u 9 hash; do if [ $i -gt ${min} ]; 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=1 if [ "${i}" -gt 1 ]; then line_nr=$((${i} - 1)) fi 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, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout" fi # multihash if [ ${MODE} -ne 0 ]; then # no multi hash checks for these modes (because we only have 1 hash for each of them) if [ "${hash_type}" -eq 14000 ]; then return elif [ "${hash_type}" -eq 14100 ]; then return elif [ "${hash_type}" -eq 14900 ]; then return elif [ "${hash_type}" -eq 15400 ]; then return fi e_to=0 e_nf=0 e_nm=0 cnt=0 offset=14 if [ ${hash_type} -eq 2410 ]; then offset=11 elif [ ${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, Device-Type ${TYPE}, vector-width ${VECTOR}." &>> ${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=1 if [ "${offset}" -gt ${i} ]; then line_nr=$((${offset} - ${i})) fi 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, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $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, Device-Type ${TYPE}, vector-width ${VECTOR}." &>> ${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 elif [ "${hash_type}" -eq 14000 ]; then mask_offset=4 max=1 elif [ "${hash_type}" -eq 14100 ]; then mask_offset=3 max=1 elif [ "${hash_type}" -eq 14900 ]; then mask_offset=5 max=1 elif [ "${hash_type}" -eq 15400 ]; then mask_offset=3 max=1 fi # special case: we need to split the first line if [ "${mask_offset}" -ne 0 ]; then pass=$(sed -n 1p ${OUTD}/${hash_type}_passwords.txt) pass_part_2=$(echo -n ${pass} | cut -b $((${mask_offset} + 1))-) mask_custom="" if [ "${hash_type}" -eq 14000 ]; then mask_custom="${pass}" elif [ "${hash_type}" -eq 14100 ]; then mask_custom="${pass}" else for i in $(seq 1 ${mask_offset}); do mask_custom="${mask_custom}?d" done mask_custom="${mask_custom}${pass_part_2}" fi 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}))]} dict="${OUTD}/${hash_type}_passwords.txt" # modify "default" mask if needed (and set custom charset to reduce keyspace) if [ "${hash_type}" -eq 2500 ]; then pass=$(sed -n ${i}p ${dict}) 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 if [ "${mask_offset}" -ne 0 ]; then mask=${mask_custom} 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 ${dict}) 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, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout" fi # multihash if [ ${MODE} -ne 0 ]; then # no multi hash checks for these modes (because we only have 1 hash for each of them) if [ "${hash_type}" -eq 14000 ]; then return elif [ "${hash_type}" -eq 14100 ]; then return elif [ "${hash_type}" -eq 14900 ]; then return elif [ "${hash_type}" -eq 15400 ]; then return fi 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_pos=8 if [ "${increment_min}" -gt ${mask_pos} ]; then mask_pos=${increment_min} fi mask=${mask_3[${mask_pos}]} 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, Device-Type ${TYPE}, vector-width ${VECTOR}." &>> ${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, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $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, Device-Type ${TYPE}, vector-width ${VECTOR}." &>> ${OUTD}/logfull.txt min=1 max=8 mask_offset=0 if [ "${hash_type}" -eq 2500 ]; then max=6 elif [ "${hash_type}" -eq 14000 ]; then min=0 max=1 mask_offset=4 elif [ "${hash_type}" -eq 14100 ]; then min=0 max=1 mask_offset=21 elif [ "${hash_type}" -eq 14900 ]; then min=0 max=1 mask_offset=5 elif [ "${hash_type}" -eq 15400 ]; then min=0 max=1 mask_offset=29 fi # special case: we need to split the first line if [ "${min}" -eq 0 ]; then pass_part_1=$(sed -n 1p ${OUTD}/${hash_type}_dict1) pass_part_2=$(sed -n 1p ${OUTD}/${hash_type}_dict2) pass="${pass_part_1}${pass_part_2}" echo -n ${pass} | cut -b -$((${mask_offset} + 0)) > ${OUTD}/${hash_type}_dict1_custom echo -n ${pass} | cut -b $((${mask_offset} + 1))- > ${OUTD}/${hash_type}_dict2_custom mask_custom="" for i in $(seq 1 $((${#pass} - ${mask_offset}))); do if [ "${hash_type}" -eq 14000 ]; then char=$(echo -n ${pass} | cut -b $((${i} + ${mask_offset}))) mask_custom="${mask_custom}${char}" elif [ "${hash_type}" -eq 14100 ]; then char=$(echo -n ${pass} | cut -b $((${i} + ${mask_offset}))) mask_custom="${mask_custom}${char}" else mask_custom="${mask_custom}?d" fi done 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 [ ${i} -gt ${min} ]; 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_6[${i}]} dict1=${OUTD}/${hash_type}_dict1 dict2=${OUTD}/${hash_type}_dict2 if [ "${min}" -eq 0 ]; then mask=${mask_custom} dict1=${OUTD}/${hash_type}_dict1_custom dict2=${OUTD}/${hash_type}_dict2_custom fi CMD="./${BIN} ${OPTS} -a 6 -m ${hash_type} '${hash}' ${dict1} ${mask}" echo -n "[ len $i ] " &>> ${OUTD}/logfull.txt output=$(./${BIN} ${OPTS} -a 6 -m ${hash_type} "${hash}" ${dict1} ${mask} 2>&1) ret=${?} echo "${output}" >> ${OUTD}/logfull.txt if [ "${ret}" -eq 0 ]; then line_nr=1 if [ "${i}" -gt 1 ]; then line_nr=$((${i} - 1)) fi line_dict1=$(sed -n ${line_nr}p ${dict1}) line_dict2=$(sed -n ${line_nr}p ${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, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout" rm -f ${OUTD}/${hash_type}_dict1_custom rm -f ${OUTD}/${hash_type}_dict2_custom fi # multihash if [ ${MODE} -ne 0 ]; then # no multi hash checks for these modes (because we only have 1 hash for each of them) if [ "${hash_type}" -eq 14000 ]; then return elif [ "${hash_type}" -eq 14100 ]; then return elif [ "${hash_type}" -eq 14900 ]; then return elif [ "${hash_type}" -eq 15400 ]; then return fi 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 mask=${mask_6[$i]} CMD="./${BIN} ${OPTS} -a 6 -m ${hash_type} ${hash_file} ${OUTD}/${hash_type}_dict1_multi_${i} ${mask}" 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} 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, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $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, Device-Type ${TYPE}, vector-width ${VECTOR}." &>> ${OUTD}/logfull.txt min=1 max=8 mask_offset=0 if [ "${hash_type}" -eq 2500 ]; then max=5 elif [ "${hash_type}" -eq 14000 ]; then mask_offset=4 min=0 max=1 elif [ "${hash_type}" -eq 14100 ]; then mask_offset=3 min=0 max=1 elif [ "${hash_type}" -eq 14900 ]; then mask_offset=5 min=0 max=1 elif [ "${hash_type}" -eq 15400 ]; then mask_offset=3 min=0 max=1 fi # special case: we need to split the first line if [ "${min}" -eq 0 ]; then pass_part_1=$(sed -n 1p ${OUTD}/${hash_type}_dict1) pass_part_2=$(sed -n 1p ${OUTD}/${hash_type}_dict2) pass="${pass_part_1}${pass_part_2}" echo -n ${pass} | cut -b -$((${mask_offset} + 0)) > ${OUTD}/${hash_type}_dict1_custom echo -n ${pass} | cut -b $((${mask_offset} + 1))- > ${OUTD}/${hash_type}_dict2_custom mask_custom="" for i in $(seq 1 ${mask_offset}); do if [ "${hash_type}" -eq 14000 ]; then char=$(echo -n ${pass} | cut -b ${i}) mask_custom="${mask_custom}${char}" elif [ "${hash_type}" -eq 14100 ]; then char=$(echo -n ${pass} | cut -b ${i}) mask_custom="${mask_custom}${char}" else mask_custom="${mask_custom}?d" fi done fi i=1 while read -u 9 hash; do if [ ${i} -gt ${min} ]; 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=1 if [ "${i}" -gt 1 ]; then line_nr=$((${i} - 1)) fi 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 dict1=${OUTD}/${hash_type}_dict1 dict2=${OUTD}/${hash_type}_dict2 if [ "${min}" -eq 0 ]; then mask=${mask_custom} dict1=${OUTD}/${hash_type}_dict1_custom dict2=${OUTD}/${hash_type}_dict2_custom fi CMD="./${BIN} ${OPTS} -a 7 -m ${hash_type} '${hash}' ${mask} ${dict2}" echo -n "[ len $i ] " &>> ${OUTD}/logfull.txt output=$(./${BIN} ${OPTS} -a 7 -m ${hash_type} "${hash}" ${mask} ${dict2} 2>&1) ret=${?} echo "${output}" >> ${OUTD}/logfull.txt if [ "${ret}" -eq 0 ]; then line_nr=1 if [ "${i}" -gt 1 ]; then line_nr=$((${i} - 1)) fi line_dict1=$(sed -n ${line_nr}p ${dict1}) line_dict2=$(sed -n ${line_nr}p ${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, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout" rm -f ${OUTD}/${hash_type}_dict1_custom rm -f ${OUTD}/${hash_type}_dict2_custom fi # multihash if [ ${MODE} -ne 0 ]; then # no multi hash checks for these modes (because we only have 1 hash for each of them) if [ "${hash_type}" -eq 14000 ]; then return elif [ "${hash_type}" -eq 14100 ]; then return elif [ "${hash_type}" -eq 14900 ]; then return elif [ "${hash_type}" -eq 15400 ]; then return fi 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 elif [ ${hash_type} -eq 14000 ]; then max=5 elif [ ${hash_type} -eq 14100 ]; then max=5 elif [ ${hash_type} -eq 14900 ]; then max=5 elif [ ${hash_type} -eq 15400 ]; then max=5 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, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout" fi } function truecrypt_test() { hashType=$1 tcMode=$2 CMD="unset" case $hashType in 6211) case $tcMode in 0) CMD="./${BIN} ${OPTS} -a 3 -m 6211 ${TDIR}/tc_tests/hashcat_ripemd160_aes.tc hashca?l" ;; 1) CMD="./${BIN} ${OPTS} -a 3 -m 6211 ${TDIR}/tc_tests/hashcat_ripemd160_serpent.tc hashca?l" ;; 2) CMD="./${BIN} ${OPTS} -a 3 -m 6211 ${TDIR}/tc_tests/hashcat_ripemd160_twofish.tc hashca?l" ;; esac ;; 6212) case $tcMode in 0) CMD="./${BIN} ${OPTS} -a 3 -m 6212 ${TDIR}/tc_tests/hashcat_ripemd160_aes-twofish.tc hashca?l" ;; 1) CMD="./${BIN} ${OPTS} -a 3 -m 6212 ${TDIR}/tc_tests/hashcat_ripemd160_serpent-aes.tc hashca?l" ;; 2) CMD="./${BIN} ${OPTS} -a 3 -m 6212 ${TDIR}/tc_tests/hashcat_ripemd160_twofish-serpent.tc hashca?l" ;; esac ;; 6213) case $tcMode in 0) CMD="./${BIN} ${OPTS} -a 3 -m 6213 ${TDIR}/tc_tests/hashcat_ripemd160_aes-twofish-serpent.tc hashca?l" ;; 1) CMD="./${BIN} ${OPTS} -a 3 -m 6213 ${TDIR}/tc_tests/hashcat_ripemd160_serpent-twofish-aes.tc hashca?l" ;; esac ;; 6221) case $tcMode in 0) CMD="./${BIN} ${OPTS} -a 3 -m 6221 ${TDIR}/tc_tests/hashcat_sha512_aes.tc hashca?l" ;; 1) CMD="./${BIN} ${OPTS} -a 3 -m 6221 ${TDIR}/tc_tests/hashcat_sha512_serpent.tc hashca?l" ;; 2) CMD="./${BIN} ${OPTS} -a 3 -m 6221 ${TDIR}/tc_tests/hashcat_sha512_twofish.tc hashca?l" ;; esac ;; 6222) case $tcMode in 0) CMD="./${BIN} ${OPTS} -a 3 -m 6222 ${TDIR}/tc_tests/hashcat_sha512_aes-twofish.tc hashca?l" ;; 1) CMD="./${BIN} ${OPTS} -a 3 -m 6222 ${TDIR}/tc_tests/hashcat_sha512_serpent-aes.tc hashca?l" ;; 2) CMD="./${BIN} ${OPTS} -a 3 -m 6222 ${TDIR}/tc_tests/hashcat_sha512_twofish-serpent.tc hashca?l" ;; esac ;; 6223) case $tcMode in 0) CMD="./${BIN} ${OPTS} -a 3 -m 6223 ${TDIR}/tc_tests/hashcat_sha512_aes-twofish-serpent.tc hashca?l" ;; 1) CMD="./${BIN} ${OPTS} -a 3 -m 6223 ${TDIR}/tc_tests/hashcat_sha512_serpent-twofish-aes.tc hashca?l" ;; esac ;; 6231) case $tcMode in 0) CMD="./${BIN} ${OPTS} -a 3 -m 6231 ${TDIR}/tc_tests/hashcat_whirlpool_aes.tc hashca?l" ;; 1) CMD="./${BIN} ${OPTS} -a 3 -m 6231 ${TDIR}/tc_tests/hashcat_whirlpool_serpent.tc hashca?l" ;; 2) CMD="./${BIN} ${OPTS} -a 3 -m 6231 ${TDIR}/tc_tests/hashcat_whirlpool_twofish.tc hashca?l" ;; esac ;; 6232) case $tcMode in 0) CMD="./${BIN} ${OPTS} -a 3 -m 6232 ${TDIR}/tc_tests/hashcat_whirlpool_aes-twofish.tc hashca?l" ;; 1) CMD="./${BIN} ${OPTS} -a 3 -m 6232 ${TDIR}/tc_tests/hashcat_whirlpool_serpent-aes.tc hashca?l" ;; 2) CMD="./${BIN} ${OPTS} -a 3 -m 6232 ${TDIR}/tc_tests/hashcat_whirlpool_twofish-serpent.tc hashca?l" ;; esac ;; 6233) case $tcMode in 0) CMD="./${BIN} ${OPTS} -a 3 -m 6233 ${TDIR}/tc_tests/hashcat_whirlpool_aes-twofish-serpent.tc hashca?l" ;; 1) CMD="./${BIN} ${OPTS} -a 3 -m 6233 ${TDIR}/tc_tests/hashcat_whirlpool_serpent-twofish-aes.tc hashca?l" ;; esac ;; 6241) case $tcMode in 0) CMD="./${BIN} ${OPTS} -a 3 -m 6241 ${TDIR}/tc_tests/hashcat_ripemd160_aes_boot.tc hashca?l" ;; 1) CMD="./${BIN} ${OPTS} -a 3 -m 6241 ${TDIR}/tc_tests/hashcat_ripemd160_serpent_boot.tc hashca?l" ;; 2) CMD="./${BIN} ${OPTS} -a 3 -m 6241 ${TDIR}/tc_tests/hashcat_ripemd160_twofish_boot.tc hashca?l" ;; esac ;; 6242) case $tcMode in 0) CMD="./${BIN} ${OPTS} -a 3 -m 6242 ${TDIR}/tc_tests/hashcat_ripemd160_aes-twofish_boot.tc hashca?l" ;; 1) CMD="./${BIN} ${OPTS} -a 3 -m 6242 ${TDIR}/tc_tests/hashcat_ripemd160_serpent-aes_boot.tc hashca?l" ;; esac ;; 6243) case $tcMode in 0) CMD="./${BIN} ${OPTS} -a 3 -m 6243 ${TDIR}/tc_tests/hashcat_ripemd160_aes-twofish-serpent_boot.tc hashca?l" ;; esac ;; esac if [ ${#CMD} -gt 5 ]; then echo "> Testing hash type $hashType with attack mode 3, markov ${MARKOV}, single hash, Device-Type ${TYPE}, vector-width ${VECTOR}, tcMode ${tcMode}" &>> ${OUTD}/logfull.txt output=$(${CMD} 2>&1) ret=${?} echo "${output}" >> ${OUTD}/logfull.txt cnt=1 e_nf=0 msg="OK" if [ ${ret} -ne 0 ]; then e_nf=1 msg="Error" fi echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 3, Mode single, Device-Type ${TYPE}, Vector-Width ${VECTOR}, tcMode ${tcMode} ] > $msg : ${e_nf}/${cnt} not found" status ${ret} fi } function luks_test() { hashType=$1 attackType=$2 # if -m all was set let us default to -a 3 only. You could specify the attack type directly, e.g. -m 0 # the problem with defaulting to all=0,1,3,6,7 is that it could take way too long if [ "${attackType}" -eq 65535 ]; then attackType=3 fi #LUKS_HASHES="sha1 sha256 sha512 ripemd160 whirlpool" LUKS_HASHES="sha1 sha256 sha512 ripemd160" LUKS_CIPHERS="aes serpent twofish" LUKS_MODES="cbc-essiv cbc-plain64 xts-plain64" LUKS_KEYSIZES="128 256 512" LUKS_PASSWORD=$(cat "${TDIR}/luks_tests/pw") for luks_h in ${LUKS_HASHES}; do for luks_c in ${LUKS_CIPHERS}; do for luks_m in ${LUKS_MODES}; do for luks_k in ${LUKS_KEYSIZES}; do CMD="" # filter out not supported combinations: case "${luks_k}" in 128) case "${luks_m}" in cbc-essiv|cbc-plain64) ;; *) continue ;; esac ;; 256) case "${luks_m}" in cbc-essiv|cbc-plain64|xts-plain64) ;; *) continue ;; esac ;; 512) case "${luks_m}" in xts-plain64) ;; *) continue ;; esac ;; esac luks_mode="${luks_h}-${luks_c}-${luks_m}-${luks_k}" luks_file="${TDIR}/luks_tests/hashcat_${luks_h}_${luks_c}_${luks_m}_${luks_k}.luks" luks_main_mask="?l" luks_mask="${luks_main_mask}" # for combination or hybrid attacks luks_pass_part_file1="${OUTD}/${hashType}_dict1" luks_pass_part_file2="${OUTD}/${hashType}_dict2" case $attackType in 0) CMD="./${BIN} ${OPTS} -a 0 -m ${hashType} ${luks_file} ${TDIR}/luks_tests/pw" ;; 1) luks_pass_part1_len=$((${#LUKS_PASSWORD} / 2)) luks_pass_part2_start=$((${luks_pass_part1_len} + 1)) echo "${LUKS_PASSWORD}" | cut -c-${luks_pass_part1_len} > "${luks_pass_part_file1}" echo "${LUKS_PASSWORD}" | cut -c${luks_pass_part2_start}- > "${luks_pass_part_file2}" CMD="./${BIN} ${OPTS} -a 6 -m ${hashType} ${luks_file} ${luks_pass_part_file1} ${luks_pass_part_file2}" ;; 3) luks_mask_fixed_len=$((${#LUKS_PASSWORD} - 1)) luks_mask="$(echo "${LUKS_PASSWORD}" | cut -c-${luks_mask_fixed_len})" luks_mask="${luks_mask}${luks_main_mask}" CMD="./${BIN} ${OPTS} -a 3 -m ${hashType} ${luks_file} ${luks_mask}" ;; 6) luks_pass_part1_len=$((${#LUKS_PASSWORD} - 1)) echo "${LUKS_PASSWORD}" | cut -c-${luks_pass_part1_len} > "${luks_pass_part_file1}" CMD="./${BIN} ${OPTS} -a 6 -m ${hashType} ${luks_file} ${luks_pass_part_file1} ${luks_mask}" ;; 7) echo "${LUKS_PASSWORD}" | cut -c2- > "${luks_pass_part_file1}" CMD="./${BIN} ${OPTS} -a 7 -m ${hashType} ${luks_file} ${luks_mask} ${luks_pass_part_file1}" ;; esac if [ -n "${CMD}" ]; then echo "> Testing hash type ${hashType} with attack mode ${attackType}, markov ${MARKOV}, single hash, Device-Type ${TYPE}, vector-width ${VECTOR}, luksMode ${luks_mode}" &>> ${OUTD}/logfull.txt output=$(${CMD} 2>&1) ret=${?} echo "${output}" >> ${OUTD}/logfull.txt cnt=1 e_nf=0 msg="OK" if [ ${ret} -ne 0 ]; then e_nf=1 msg="Error" fi echo "[ ${OUTD} ] [ Type ${hash_type}, Attack ${attackType}, Mode single, Device-Type ${TYPE}, Vector-Width ${VECTOR}, luksMode ${luks_mode} ] > $msg : ${e_nf}/${cnt} not found" status ${ret} fi done done done done } function usage() { cat << EOF > Usage : ${0} OPTIONS: -V OpenCL vector-width (either 1, 2, 4 or 8), overrides value from device query : '1' => vector-width 1 '2' => vector-width 2 (default) '4' => vector-width 4 '8' => vector-width 8 'all' => test sequentially vector-width ${VECTOR_WIDTHS} -T OpenCL device-types to use : 'gpu' => gpu devices (default) 'cpu' => cpu devices 'all' => gpu and cpu devices -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) -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) 'linux' => Linux operating system (use .bin file extension) 'macos' => macOS operating system (use .app file extension) -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 } BIN="hashcat" MARKOV="enabled" ATTACK=0 MODE=0 TYPE="null" VECTOR="default" HT=0 PACKAGE=0 while getopts "V:T:t:m:a:b:hcpd:x:o:" opt; do case ${opt} in "V") if [ ${OPTARG} == "1" ]; then VECTOR=1 elif [ ${OPTARG} == "2" ]; then VECTOR=2 elif [ ${OPTARG} == "4" ]; then VECTOR=4 elif [ ${OPTARG} == "8" ]; then VECTOR=8 elif [ ${OPTARG} == "16" ]; then VECTOR=16 elif [ ${OPTARG} == "all" ]; then VECTOR="all" else usage fi ;; "T") if [ ${OPTARG} == "gpu" ]; then OPTS="${OPTS} --opencl-device-types 2" TYPE="Gpu" elif [ ${OPTARG} == "cpu" ]; then OPTS="${OPTS} --opencl-device-types 1" TYPE="Cpu" elif [ ${OPTARG} == "all" ]; then OPTS="${OPTS} --opencl-device-types 1,2" TYPE="Cpu + Gpu" else usage fi ;; "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 ;; "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" elif [ ${OPTARG} == "macos" ]; then EXTENSION="app" else usage fi ;; \?) usage ;; "h") usage ;; esac done if [ "${TYPE}" == "null" ]; then TYPE="Gpu" OPTS="${OPTS} --opencl-device-types 2" fi if [ -n "${ARCHITECTURE}" ]; then BIN="${BIN}${ARCHITECTURE}" fi if [ -n "${EXTENSION}" ]; then BIN="${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 elif [[ ${HT} -ne 14600 ]]; then if [[ ${HT} -lt 6211 ]] || [[ ${HT} -gt 6243 ]]; then perl tools/test.pl single ${HT} > ${OUTD}/all.sh fi 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 OPTS_OLD=${OPTS} VECTOR_OLD=${VECTOR} for CUR_WIDTH in $(echo $VECTOR_WIDTHS); do if [ "${VECTOR_OLD}" == "all" ] || [ "${VECTOR_OLD}" == "default" ] || [ "${VECTOR_OLD}" == "${CUR_WIDTH}" ]; then if [ "${VECTOR_OLD}" == "default" ] && \ [ "${CUR_WIDTH}" != "1" ] && \ [ "${CUR_WIDTH}" != "4" ]; then continue fi VECTOR=${CUR_WIDTH} OPTS="${OPTS_OLD} --opencl-vector-width ${VECTOR}" if [[ ${IS_SLOW} -eq 1 ]]; then if [[ ${hash_type} -ge 6211 ]] && [[ ${hash_type} -le 6243 ]]; then # run truecrypt tests truecrypt_test ${hash_type} 0 truecrypt_test ${hash_type} 1 truecrypt_test ${hash_type} 2 elif [[ ${hash_type} -eq 14600 ]]; then # run luks tests luks_test ${hash_type} ${ATTACK} else # run attack mode 0 (stdin) if [[ ${ATTACK} -eq 65535 ]] || [[ ${ATTACK} -eq 0 ]]; then attack_0; fi 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 OPTS="${OPTS_OLD}" VECTOR="${VECTOR_OLD}" 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.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_IN_PLACE='-i' UNAME=$(uname -s) # of course macOS requires us to implement a special case (sed -i "" for the backup file) if [ "${UNAME}" == "Darwin" ] ; then SED_IN_PLACE='-i ""' fi sed "${SED_IN_PLACE}" -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 hashcat-4.0.1/tools/test_rules.pl000077500000000000000000000077641320027462700170410ustar00rootroot00000000000000#!/usr/bin/env perl ## ## Author......: See docs/credits.txt ## License.....: MIT ## use strict; use warnings; use Digest::MD5 qw (md5_hex); use File::Basename qw (dirname); use YAML::XS "LoadFile"; use Test::More; # Use `eq_or_diff` from Test::Differences if it's available for an easier to read comparison # between expected and actual output. # Fall back to `is` from Test::More if it isn't available. BEGIN { if (!eval q{ use Test::Differences; 1 }) { *eq_or_diff = \&is; } } my $hashcat = "./hashcat"; my $OPTS = "--stdout --force"; my $CURRENT_DIR = dirname (__FILE__); my $OUT_DIR = $CURRENT_DIR . "/". "rules-test"; mkdir $OUT_DIR || die $! unless -d $OUT_DIR; # Make sure to cleanup on forced exit $SIG{INT} = \&cleanup_and_exit; my %cases = load_cases (); if (scalar @ARGV > 2 || defined $ARGV[0] && $ARGV[0] eq '--help') { usage_die (); } elsif (scalar @ARGV == 1) { my $rule = $ARGV[0]; die ("No test case was found for rule: $rule") unless exists $cases{$rule}; run_case_all_mods ($rule); } elsif (scalar @ARGV == 2) { my $rule = $ARGV[0]; my $mode = $ARGV[1]; die ("No test case was found for rule: $rule") unless exists $cases{$rule}; if ($mode == 1) { run_case_mode1 ($rule); } elsif ($mode == 2) { run_case_mode2 ($rule); } else { die ("Invalid mode: $mode. Mode can be either 1 or 2."); } } else { run_case_all_mods ($_) for (sort keys %cases); } cleanup (); done_testing (); # Mode 1: host mode, using -j sub run_case_mode1 { my $rule = shift; my $case = $cases{$rule}; die("Expected output for mode 1 (expected_cpu) isn't defined for rule: $rule") unless defined $case->{expected_cpu}; my $input_file = input_to_file ($case, $rule); my $quoted_rule = quotemeta ($rule); my $actual_output = qx($hashcat $OPTS -j $quoted_rule $input_file); eq_or_diff ($actual_output, $case->{expected_cpu}, $rule . " - mode 1"); } # Mode 2: GPU mode, using -r sub run_case_mode2 { my $rule = shift; my $case = $cases{$rule}; die("Expected output for mode 2 (expected_opencl) isn't defined for rule: $rule") unless defined $case->{expected_opencl}; my $input_file = input_to_file ($case, $rule); my $rule_file = rule_to_file ($rule); my $quoted_rule = quotemeta ($rule); my $actual_output = qx($hashcat $OPTS -r $rule_file $input_file); eq_or_diff ($actual_output, $case->{expected_opencl}, $rule . " - mode 2"); } sub run_case_all_mods { my $rule = shift; my $case = $cases{$rule}; run_case_mode1 ($rule) if defined $case->{expected_cpu}; run_case_mode2 ($rule) if defined $case->{expected_opencl}; } sub input_to_file { my $case = shift; my $rule = shift; my $file_name = $OUT_DIR . "/" . rule_file_name ($rule); open my $fh, ">", $file_name || die $!; print $fh $case->{input}; close $fh; return $file_name; } sub rule_to_file { my $rule = shift; my $file_name = $OUT_DIR . "/" . rule_file_name ($rule, "rule"); open my $fh, ">", $file_name || die $!; print $fh $rule; close $fh; return $file_name; } sub rule_file_name { my $rule = shift; my $ext = shift || "in"; return sprintf ("rule-%s.%s", md5_hex ($rule), $ext); } sub usage_die { die ("usage: $0 [rule] [mode] \n" . " [mode]: 1 for host/cpu mode, 2 for GPU/opencl mode \n" . " run all test cases if [rule] was not specified \n" . " run test for both modes if [mode] was not specified \n" . " --help will show this help message \n" . "\n" . "examples: \n" . "run all available cases : perl $0 \n" . "run i3! case on modes 1 & 2 : perl $0 i3! \n" . "run O04 case on mode 1 : perl $0 O04 1 \n" . "run sab case on mode 2 : perl $0 sab 2 \n"); } sub load_cases { my $file_path = $CURRENT_DIR . "/" . "rules-test-cases.yaml"; return %{ LoadFile($file_path) }; } sub cleanup { unlink <$OUT_DIR/*.in $OUT_DIR/*.rule>; rmdir $OUT_DIR; } sub cleanup_and_exit { cleanup (); done_testing (); exit 0; } hashcat-4.0.1/tools/win-iconv-32.diff000066400000000000000000000014071320027462700172610ustar00rootroot00000000000000diff --git a/Makefile b/Makefile index 5937584..8777fad 100644 --- a/Makefile +++ b/Makefile @@ -6,10 +6,10 @@ # MKDIR_P, INSTALL, RM # prefix, BINARY_PATH, INCLUDE_PATH, LIBRARY_PATH -CC ?= gcc -AR ?= ar -RANLIB ?= ranlib -DLLTOOL ?= dlltool +CC := i686-w64-mingw32-gcc +AR := i686-w64-mingw32-ar +RANLIB := i686-w64-mingw32-ranlib +DLLTOOL := i686-w64-mingw32-dlltool MKDIR_P = mkdir -p INSTALL = install -c @@ -19,10 +19,10 @@ RM = rm -f DEFAULT_LIBICONV_DLL ?= \"\" CFLAGS += -pedantic -Wall -CFLAGS += -DUSE_LIBICONV_DLL +#CFLAGS += -DUSE_LIBICONV_DLL CFLAGS += -DDEFAULT_LIBICONV_DLL=$(DEFAULT_LIBICONV_DLL) -prefix ?= /usr/local +prefix ?= /opt/win-iconv-32 BINARY_PATH = $(prefix)/bin INCLUDE_PATH = $(prefix)/include LIBRARY_PATH = $(prefix)/lib hashcat-4.0.1/tools/win-iconv-64.diff000066400000000000000000000014171320027462700172670ustar00rootroot00000000000000diff --git a/Makefile b/Makefile index 5937584..c4742a3 100644 --- a/Makefile +++ b/Makefile @@ -6,10 +6,10 @@ # MKDIR_P, INSTALL, RM # prefix, BINARY_PATH, INCLUDE_PATH, LIBRARY_PATH -CC ?= gcc -AR ?= ar -RANLIB ?= ranlib -DLLTOOL ?= dlltool +CC := x86_64-w64-mingw32-gcc +AR := x86_64-w64-mingw32-ar +RANLIB := x86_64-w64-mingw32-ranlib +DLLTOOL := x86_64-w64-mingw32-dlltool MKDIR_P = mkdir -p INSTALL = install -c @@ -19,10 +19,10 @@ RM = rm -f DEFAULT_LIBICONV_DLL ?= \"\" CFLAGS += -pedantic -Wall -CFLAGS += -DUSE_LIBICONV_DLL +#CFLAGS += -DUSE_LIBICONV_DLL CFLAGS += -DDEFAULT_LIBICONV_DLL=$(DEFAULT_LIBICONV_DLL) -prefix ?= /usr/local +prefix ?= /opt/win-iconv-64 BINARY_PATH = $(prefix)/bin INCLUDE_PATH = $(prefix)/include LIBRARY_PATH = $(prefix)/lib